From 1535b668ae808e996088824c0a8ff4fa0ac987b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 04:22:15 +0000 Subject: [PATCH 001/837] Bump org.apache.commons:commons-text from 1.11.0 to 1.12.0 Bumps org.apache.commons:commons-text from 1.11.0 to 1.12.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-text dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cd9e63f3be6f..2f1a0eb02166 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ ksp = "1.9.23-1.0.20" agp = "8.3.2" appcompat = "1.6.1" colorpicker = "1.1.0" -commonsText = "1.11.0" +commonsText = "1.12.0" constraintlayout = "2.1.4" core = "1.12.0" firebaseBom = "32.8.1" From d68404c6a403d1366e6f1a5418bf15c7676f0239 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 16 Aug 2024 14:31:33 +0800 Subject: [PATCH 002/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/BaseReadAloudService.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 00655a2775a0..3cffab70311b 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -500,6 +500,7 @@ abstract class BaseReadAloudService : BaseService(), .Builder(this@BaseReadAloudService, AppConst.channelIdReadAloud) .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE) + .setCategory(NotificationCompat.CATEGORY_TRANSPORT) .setSmallIcon(R.drawable.ic_volume_up) .setSubText(getString(R.string.read_aloud)) .setOngoing(true) From deef0a69beb77a5219ba80e171a915bebb24a3ff Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 16 Aug 2024 17:31:29 +0800 Subject: [PATCH 003/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/App.kt | 2 +- .../java/io/legado/app/constant/AppLog.kt | 16 +++++++ .../main/java/io/legado/app/utils/LogUtils.kt | 45 +++++++++++-------- 3 files changed, 43 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/io/legado/app/App.kt b/app/src/main/java/io/legado/app/App.kt index 8c91434b33cc..fcf1cbe84552 100644 --- a/app/src/main/java/io/legado/app/App.kt +++ b/app/src/main/java/io/legado/app/App.kt @@ -52,13 +52,13 @@ class App : Application() { override fun onCreate() { super.onCreate() + CrashHandler(this) LogUtils.d("App", "onCreate") LogUtils.logDeviceInfo() if (isDebuggable) { ThreadUtils.setThreadAssertsDisabledForTesting(true) } oldConfig = Configuration(resources.configuration) - CrashHandler(this) //预下载Cronet so Cronet.preDownload() createNotificationChannels() diff --git a/app/src/main/java/io/legado/app/constant/AppLog.kt b/app/src/main/java/io/legado/app/constant/AppLog.kt index 1990ac71b73a..845e1a414a0c 100644 --- a/app/src/main/java/io/legado/app/constant/AppLog.kt +++ b/app/src/main/java/io/legado/app/constant/AppLog.kt @@ -34,6 +34,22 @@ object AppLog { } } + @Synchronized + fun putNotSave(message: String?, throwable: Throwable? = null, toast: Boolean = false) { + message ?: return + if (toast) { + appCtx.toastOnUi(message) + } + if (mLogs.size > 100) { + mLogs.removeLastOrNull() + } + mLogs.add(0, Triple(System.currentTimeMillis(), message, throwable)) + if (BuildConfig.DEBUG) { + val stackTrace = Thread.currentThread().stackTrace + Log.e(stackTrace[3].className, message, throwable) + } + } + @Synchronized fun clear() { mLogs.clear() diff --git a/app/src/main/java/io/legado/app/utils/LogUtils.kt b/app/src/main/java/io/legado/app/utils/LogUtils.kt index 0a2b108de8c6..dce7c829a880 100644 --- a/app/src/main/java/io/legado/app/utils/LogUtils.kt +++ b/app/src/main/java/io/legado/app/utils/LogUtils.kt @@ -7,6 +7,7 @@ import android.os.Build import android.webkit.WebSettings import io.legado.app.BuildConfig import io.legado.app.constant.AppConst +import io.legado.app.constant.AppLog import io.legado.app.help.config.AppConfig import splitties.init.appCtx import java.text.SimpleDateFormat @@ -47,28 +48,34 @@ object LogUtils { } private val fileHandler by lazy { - val root = appCtx.externalCacheDir ?: return@lazy null - val logFolder = FileUtils.createFolderIfNotExist(root, "logs") - val expiredTime = System.currentTimeMillis() - 7.days.inWholeMilliseconds - logFolder.listFiles()?.forEach { - if (it.lastModified() < expiredTime) { - it.delete() - } - } - val date = getCurrentDateStr(TIME_PATTERN) - val logPath = FileUtils.getPath(root = logFolder, "appLog-$date.txt") - AsyncFileHandler(logPath).apply { - formatter = object : java.util.logging.Formatter() { - override fun format(record: LogRecord): String { - // 设置文件输出格式 - return (getCurrentDateStr(TIME_PATTERN) + ": " + record.message + "\n") + try { + val root = appCtx.externalCacheDir ?: return@lazy null + val logFolder = FileUtils.createFolderIfNotExist(root, "logs") + val expiredTime = System.currentTimeMillis() - 7.days.inWholeMilliseconds + logFolder.listFiles()?.forEach { + if (it.lastModified() < expiredTime) { + it.delete() } } - level = if (AppConfig.recordLog) { - Level.INFO - } else { - Level.OFF + val date = getCurrentDateStr(TIME_PATTERN) + val logPath = FileUtils.getPath(root = logFolder, "appLog-$date.txt") + AsyncFileHandler(logPath).apply { + formatter = object : java.util.logging.Formatter() { + override fun format(record: LogRecord): String { + // 设置文件输出格式 + return (getCurrentDateStr(TIME_PATTERN) + ": " + record.message + "\n") + } + } + level = if (AppConfig.recordLog) { + Level.INFO + } else { + Level.OFF + } } + } catch (e: Exception) { + e.printStackTrace() + AppLog.putNotSave("创建fileHandler出错\n$e", e) + return@lazy null } } From 3685431b407252c683a3582a572d559d56694a4f Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 16 Aug 2024 20:25:20 +0800 Subject: [PATCH 004/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/App.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/App.kt b/app/src/main/java/io/legado/app/App.kt index fcf1cbe84552..7ed711575859 100644 --- a/app/src/main/java/io/legado/app/App.kt +++ b/app/src/main/java/io/legado/app/App.kt @@ -161,7 +161,7 @@ class App : Application() { val readAloudChannel = NotificationChannel( channelIdReadAloud, getString(R.string.read_aloud), - NotificationManager.IMPORTANCE_DEFAULT + NotificationManager.IMPORTANCE_HIGH ).apply { enableLights(false) enableVibration(false) From d5b6cc30222970bae69578efc82f627884ce2e27 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 16 Aug 2024 21:05:48 +0800 Subject: [PATCH 005/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/read/page/entities/TextPage.kt | 2 +- .../app/ui/book/read/page/provider/TextChapterLayout.kt | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt index ef26ab11a341..ebccb46ec612 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt @@ -326,7 +326,7 @@ data class TextPage( fun render(view: ContentTextView): Boolean { if (!isCompleted) return false - return canvasRecorder.recordIfNeeded(view.width, view.height) { + return canvasRecorder.recordIfNeeded(view.width, height.toInt() + paddingTop) { drawPage(view, this) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt index f4b9d1ee44ea..e3d505147bb8 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt @@ -446,9 +446,7 @@ class TextChapterLayout( val textLine = TextLine(isTitle = isTitle) if (durY + textHeight > visibleHeight) { val textPage = pendingTextPage - if (textPage.height < durY) { - textPage.height = durY - } + textPage.height = textPage.lines.lastOrNull()?.lineBottom ?: 0f if (doublePage && absStartX < viewWidth / 2) { //当前页面左列结束 textPage.leftLineSize = textPage.lineSize From 51cf3185318246ed88beacbd569a7b9026e5c171 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 16 Aug 2024 21:07:56 +0800 Subject: [PATCH 006/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/BaseReadAloudService.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 3cffab70311b..4c3205d93959 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -501,6 +501,7 @@ abstract class BaseReadAloudService : BaseService(), .setVisibility(NotificationCompat.VISIBILITY_PUBLIC) .setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE) .setCategory(NotificationCompat.CATEGORY_TRANSPORT) + .setPriority(NotificationCompat.PRIORITY_HIGH) .setSmallIcon(R.drawable.ic_volume_up) .setSubText(getString(R.string.read_aloud)) .setOngoing(true) From c47c00054b737aa760b8d934d9d47d5a6f544d51 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 17 Aug 2024 10:04:39 +0800 Subject: [PATCH 007/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/read/page/provider/TextChapterLayout.kt | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt index e3d505147bb8..a45aed841bd8 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt @@ -446,7 +446,10 @@ class TextChapterLayout( val textLine = TextLine(isTitle = isTitle) if (durY + textHeight > visibleHeight) { val textPage = pendingTextPage - textPage.height = textPage.lines.lastOrNull()?.lineBottom ?: 0f + val height = textPage.lines.lastOrNull()?.lineBottom ?: 0f + if (textPage.height < height) { + textPage.height = height + } if (doublePage && absStartX < viewWidth / 2) { //当前页面左列结束 textPage.leftLineSize = textPage.lineSize @@ -528,8 +531,9 @@ class TextChapterLayout( val textPage = pendingTextPage textPage.addLine(textLine) durY += textHeight * lineSpacingExtra - if (textPage.height < durY) { - textPage.height = durY + val height = textPage.lines.lastOrNull()?.lineBottom ?: 0f + if (textPage.height < height) { + textPage.height = height } } durY += textHeight * paragraphSpacing / 10f From 7afe82679008b3ad90f32a32a8de24669716fbd3 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 17 Aug 2024 12:20:19 +0800 Subject: [PATCH 008/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/storage/Backup.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/io/legado/app/help/storage/Backup.kt b/app/src/main/java/io/legado/app/help/storage/Backup.kt index 87924fcd2b1a..0fc6e0a115c3 100644 --- a/app/src/main/java/io/legado/app/help/storage/Backup.kt +++ b/app/src/main/java/io/legado/app/help/storage/Backup.kt @@ -216,10 +216,14 @@ object Backup { coroutineContext.ensureActive() withContext(IO) { if (list.isNotEmpty()) { + AppLog.put("阅读备份 $fileName 列表大小 ${list.size}") val file = FileUtils.createFileIfNotExist(path + File.separator + fileName) file.outputStream().buffered().use { GSON.writeToOutputStream(it, list) } + AppLog.put("阅读备份 $fileName 写入大小 ${file.length()}") + } else { + AppLog.put("阅读备份 $fileName 列表为空") } } } From e43eabac6b9198354d313868cb2f419bf76fd51b Mon Sep 17 00:00:00 2001 From: tick <895866818@qq.com> Date: Sat, 17 Aug 2024 15:44:18 +0800 Subject: [PATCH 009/837] fix #4090 android 14 can not show play control in lock screen --- app/src/main/java/io/legado/app/service/BaseReadAloudService.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 4c3205d93959..ff3279b343c3 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -540,6 +540,8 @@ abstract class BaseReadAloudService : BaseService(), builder.setStyle( androidx.media.app.NotificationCompat.MediaStyle() .setShowActionsInCompactView(0, 1, 2) + //fix #4090 android 14 can not show play control in lock screen + .setMediaSession(mediaSessionCompat.sessionToken) ) return builder } From 22057939db94bc4b8d3fe21836b694496556f6ea Mon Sep 17 00:00:00 2001 From: tick <895866818@qq.com> Date: Sat, 17 Aug 2024 17:24:01 +0800 Subject: [PATCH 010/837] fix #4090 just do fix flow in vivo --- .../app/service/BaseReadAloudService.kt | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index ff3279b343c3..1684cc97b8c7 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -14,6 +14,7 @@ import android.os.Bundle import android.os.PowerManager import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat +import android.util.Log import androidx.annotation.CallSuper import androidx.core.app.NotificationCompat import androidx.lifecycle.lifecycleScope @@ -482,6 +483,24 @@ abstract class BaseReadAloudService : BaseService(), } } + val isVivoDevice: Boolean by lazy { + android.os.Build.MANUFACTURER.equals( + "vivo", + ignoreCase = true + ) + } + + private fun ChoiceMediaStyle(): androidx.media.app.NotificationCompat.MediaStyle { + //Log.d(TAG, "isVivoDevice=$isVivoDevice") + val type = androidx.media.app.NotificationCompat.MediaStyle() + .setShowActionsInCompactView(0, 1, 2) + if (isVivoDevice) { + //fix #4090 android 14 can not show play control in lock screen + type.setMediaSession(mediaSessionCompat.sessionToken) + } + return type + } + private fun createNotification(): NotificationCompat.Builder { var nTitle: String = when { pause -> getString(R.string.read_aloud_pause) @@ -537,12 +556,7 @@ abstract class BaseReadAloudService : BaseService(), getString(R.string.set_timer), aloudServicePendingIntent(IntentAction.addTimer) ) - builder.setStyle( - androidx.media.app.NotificationCompat.MediaStyle() - .setShowActionsInCompactView(0, 1, 2) - //fix #4090 android 14 can not show play control in lock screen - .setMediaSession(mediaSessionCompat.sessionToken) - ) + builder.setStyle(ChoiceMediaStyle()) return builder } From ebda59cab471b35ec3e0e9a0664c395e7c47b3ce Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 17 Aug 2024 17:46:16 +0800 Subject: [PATCH 011/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/BaseReadAloudService.kt | 20 ++++++------------- .../java/io/legado/app/utils/RomExtensions.kt | 7 +++++++ 2 files changed, 13 insertions(+), 14 deletions(-) create mode 100644 app/src/main/java/io/legado/app/utils/RomExtensions.kt diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 1684cc97b8c7..5c68a3dd29f3 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -14,7 +14,6 @@ import android.os.Bundle import android.os.PowerManager import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat -import android.util.Log import androidx.annotation.CallSuper import androidx.core.app.NotificationCompat import androidx.lifecycle.lifecycleScope @@ -40,6 +39,7 @@ import io.legado.app.ui.book.read.page.entities.TextChapter import io.legado.app.utils.activityPendingIntent import io.legado.app.utils.broadcastPendingIntent import io.legado.app.utils.getPrefBoolean +import io.legado.app.utils.isVivoDevice import io.legado.app.utils.observeEvent import io.legado.app.utils.postEvent import io.legado.app.utils.toastOnUi @@ -483,22 +483,14 @@ abstract class BaseReadAloudService : BaseService(), } } - val isVivoDevice: Boolean by lazy { - android.os.Build.MANUFACTURER.equals( - "vivo", - ignoreCase = true - ) - } - - private fun ChoiceMediaStyle(): androidx.media.app.NotificationCompat.MediaStyle { - //Log.d(TAG, "isVivoDevice=$isVivoDevice") - val type = androidx.media.app.NotificationCompat.MediaStyle() + private fun choiceMediaStyle(): androidx.media.app.NotificationCompat.MediaStyle { + val mediaStyle = androidx.media.app.NotificationCompat.MediaStyle() .setShowActionsInCompactView(0, 1, 2) if (isVivoDevice) { //fix #4090 android 14 can not show play control in lock screen - type.setMediaSession(mediaSessionCompat.sessionToken) + mediaStyle.setMediaSession(mediaSessionCompat.sessionToken) } - return type + return mediaStyle } private fun createNotification(): NotificationCompat.Builder { @@ -556,7 +548,7 @@ abstract class BaseReadAloudService : BaseService(), getString(R.string.set_timer), aloudServicePendingIntent(IntentAction.addTimer) ) - builder.setStyle(ChoiceMediaStyle()) + builder.setStyle(choiceMediaStyle()) return builder } diff --git a/app/src/main/java/io/legado/app/utils/RomExtensions.kt b/app/src/main/java/io/legado/app/utils/RomExtensions.kt new file mode 100644 index 000000000000..e83940c951e5 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/RomExtensions.kt @@ -0,0 +1,7 @@ +package io.legado.app.utils + +import android.os.Build + +val isVivoDevice by lazy { + Build.MANUFACTURER.equals("vivo", ignoreCase = true) +} From 7d006aa1c789051dd69ecedd6ebba18b10f4c57b Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 17 Aug 2024 19:21:45 +0800 Subject: [PATCH 012/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/about/AboutFragment.kt | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt index 5b2921236547..03ffcbc75c59 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt @@ -11,10 +11,10 @@ import androidx.preference.PreferenceFragmentCompat import io.legado.app.R import io.legado.app.constant.AppConst.appInfo import io.legado.app.constant.AppLog -import io.legado.app.help.update.AppUpdate import io.legado.app.help.CrashHandler import io.legado.app.help.config.AppConfig import io.legado.app.help.coroutine.Coroutine +import io.legado.app.help.update.AppUpdate import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.ui.widget.dialog.WaitDialog import io.legado.app.utils.FileDoc @@ -31,7 +31,7 @@ import io.legado.app.utils.sendMail import io.legado.app.utils.sendToClip import io.legado.app.utils.showDialogFragment import io.legado.app.utils.toastOnUi -import kotlinx.coroutines.coroutineScope +import kotlinx.coroutines.delay import splitties.init.appCtx import java.io.File @@ -126,6 +126,10 @@ class AboutFragment : PreferenceFragmentCompat() { appCtx.toastOnUi("未设置备份目录") return@async } + if (!AppConfig.recordLog) { + appCtx.toastOnUi("未开启日志记录,请去其他设置里打开记录日志") + delay(3000) + } val doc = FileDoc.fromUri(Uri.parse(backupPath), true) copyLogs(doc) copyHeapDump(doc) @@ -141,6 +145,10 @@ class AboutFragment : PreferenceFragmentCompat() { appCtx.toastOnUi("未设置备份目录") return@async } + if (!AppConfig.recordHeapDump) { + appCtx.toastOnUi("未开启堆转储记录,请去其他设置里打开记录堆转储") + delay(3000) + } appCtx.toastOnUi("开始创建堆转储") System.gc() CrashHandler.doHeapDump() @@ -155,10 +163,10 @@ class AboutFragment : PreferenceFragmentCompat() { } } - private suspend fun copyLogs(doc: FileDoc) = coroutineScope { + private fun copyLogs(doc: FileDoc) { val files = File(appCtx.externalCacheDir, "logs").listFiles()?.toList() if (files.isNullOrEmpty()) { - return@coroutineScope + return } val zipFile = File(appCtx.externalCacheDir, "logs.zip") ZipUtils.zipFiles(files.filter { it.name.endsWith(".txt") }, zipFile) From 9b93baa122499e1cbe0663f5d9b12b6cb9cabb4f Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 17 Aug 2024 20:59:31 +0800 Subject: [PATCH 013/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/help/storage/Backup.kt | 19 +++- .../app/ui/config/BackupConfigFragment.kt | 87 +++++++------------ 2 files changed, 48 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/storage/Backup.kt b/app/src/main/java/io/legado/app/help/storage/Backup.kt index 0fc6e0a115c3..0c741f258c7a 100644 --- a/app/src/main/java/io/legado/app/help/storage/Backup.kt +++ b/app/src/main/java/io/legado/app/help/storage/Backup.kt @@ -40,6 +40,8 @@ object Backup { } val zipFilePath = "${appCtx.externalFiles.absolutePath}${File.separator}tmp_backup.zip" + private const val TAG = "Backup" + private val mutex = Mutex() private val backupFileNames by lazy { @@ -102,7 +104,16 @@ object Backup { } } - suspend fun backup(context: Context, path: String?) { + suspend fun backupLocked(context: Context, path: String?) { + mutex.withLock { + withContext(IO) { + backup(context, path) + } + } + } + + private suspend fun backup(context: Context, path: String?) { + LogUtils.d(TAG, "开始备份 path:$path") LocalConfig.lastBackup = System.currentTimeMillis() val aes = BackupAES() FileUtils.delete(backupPath) @@ -216,14 +227,14 @@ object Backup { coroutineContext.ensureActive() withContext(IO) { if (list.isNotEmpty()) { - AppLog.put("阅读备份 $fileName 列表大小 ${list.size}") + LogUtils.d(TAG, "阅读备份 $fileName 列表大小 ${list.size}") val file = FileUtils.createFileIfNotExist(path + File.separator + fileName) file.outputStream().buffered().use { GSON.writeToOutputStream(it, list) } - AppLog.put("阅读备份 $fileName 写入大小 ${file.length()}") + LogUtils.d(TAG, "阅读备份 $fileName 写入大小 ${file.length()}") } else { - AppLog.put("阅读备份 $fileName 列表为空") + LogUtils.d(TAG, "阅读备份 $fileName 列表为空") } } } diff --git a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt index 28e69624e530..703bdf8f5567 100644 --- a/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/BackupConfigFragment.kt @@ -12,6 +12,7 @@ import android.view.View import androidx.core.view.MenuProvider import androidx.documentfile.provider.DocumentFile import androidx.fragment.app.activityViewModels +import androidx.lifecycle.lifecycleScope import androidx.preference.EditTextPreference import androidx.preference.ListPreference import androidx.preference.Preference @@ -50,6 +51,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Job import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import splitties.init.appCtx import kotlin.collections.set @@ -77,25 +79,11 @@ class BackupConfigFragment : PreferenceFragment(), result.uri?.let { uri -> if (uri.isContentScheme()) { AppConfig.backupPath = uri.toString() - Coroutine.async { - Backup.backup(appCtx, uri.toString()) - }.onSuccess { - appCtx.toastOnUi(R.string.backup_success) - }.onError { - AppLog.put("备份出错\n${it.localizedMessage}", it) - appCtx.toastOnUi(getString(R.string.backup_fail, it.localizedMessage)) - } + backup(uri.toString()) } else { uri.path?.let { path -> AppConfig.backupPath = path - Coroutine.async { - Backup.backup(appCtx, path) - }.onSuccess { - appCtx.toastOnUi(R.string.backup_success) - }.onError { - AppLog.put("备份出错\n${it.localizedMessage}", it) - appCtx.toastOnUi(getString(R.string.backup_fail, it.localizedMessage)) - } + backup(path) } } } @@ -278,27 +266,7 @@ class BackupConfigFragment : PreferenceFragment(), val uri = Uri.parse(backupPath) val doc = DocumentFile.fromTreeUri(requireContext(), uri) if (doc?.checkWrite() == true) { - waitDialog.setText("备份中…") - waitDialog.setOnCancelListener { - backupJob?.cancel() - } - waitDialog.show() - Coroutine.async { - backupJob = coroutineContext[Job] - Backup.backup(requireContext(), backupPath) - }.onSuccess { - appCtx.toastOnUi(R.string.backup_success) - }.onError { - AppLog.put("备份出错\n${it.localizedMessage}", it) - appCtx.toastOnUi( - appCtx.getString( - R.string.backup_fail, - it.localizedMessage - ) - ) - }.onFinally(Main) { - waitDialog.dismiss() - } + backup(backupPath) } else { backupDir.launch() } @@ -308,28 +276,39 @@ class BackupConfigFragment : PreferenceFragment(), } } + private fun backup(backupPath: String) { + waitDialog.setText("备份中…") + waitDialog.setOnCancelListener { + backupJob?.cancel() + } + waitDialog.show() + backupJob?.cancel() + backupJob = lifecycleScope.launch { + try { + Backup.backupLocked(requireContext(), backupPath) + appCtx.toastOnUi(R.string.backup_success) + } catch (e: Throwable) { + ensureActive() + AppLog.put("备份出错\n${e.localizedMessage}", e) + appCtx.toastOnUi( + appCtx.getString( + R.string.backup_fail, + e.localizedMessage + ) + ) + } finally { + ensureActive() + waitDialog.dismiss() + } + } + } + private fun backupUsePermission(path: String) { PermissionsCompat.Builder() .addPermissions(*Permissions.Group.STORAGE) .rationale(R.string.tip_perm_request_storage) .onGranted { - waitDialog.setText("备份中…") - waitDialog.setOnCancelListener { - backupJob?.cancel() - } - waitDialog.show() - Coroutine.async { - backupJob = coroutineContext[Job] - AppConfig.backupPath = path - Backup.backup(requireContext(), path) - }.onSuccess { - appCtx.toastOnUi(R.string.backup_success) - }.onError { - AppLog.put("备份出错\n${it.localizedMessage}", it) - appCtx.toastOnUi(appCtx.getString(R.string.backup_fail, it.localizedMessage)) - }.onFinally { - waitDialog.dismiss() - } + backup(path) } .request() } From 589a54da7d82816fe853663ad80a674745970bdb Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 18 Aug 2024 16:02:27 +0800 Subject: [PATCH 014/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/help/storage/Restore.kt | 14 +++- .../app/lib/permission/PermissionActivity.kt | 66 ++++++++++++++----- .../io/legado/app/utils/ActivityResult.kt | 45 +++++++++++++ 3 files changed, 104 insertions(+), 21 deletions(-) create mode 100644 app/src/main/java/io/legado/app/utils/ActivityResult.kt diff --git a/app/src/main/java/io/legado/app/help/storage/Restore.kt b/app/src/main/java/io/legado/app/help/storage/Restore.kt index ab5eeba1cf38..34a51271cf56 100644 --- a/app/src/main/java/io/legado/app/help/storage/Restore.kt +++ b/app/src/main/java/io/legado/app/help/storage/Restore.kt @@ -24,7 +24,6 @@ import io.legado.app.data.entities.RuleSub import io.legado.app.data.entities.SearchKeyword import io.legado.app.data.entities.Server import io.legado.app.data.entities.TxtTocRule -import io.legado.app.help.AppWebDav import io.legado.app.help.DirectLinkUpload import io.legado.app.help.LauncherIconHelp import io.legado.app.help.book.isLocal @@ -36,6 +35,7 @@ import io.legado.app.model.localBook.LocalBook import io.legado.app.utils.ACache import io.legado.app.utils.FileUtils import io.legado.app.utils.GSON +import io.legado.app.utils.LogUtils import io.legado.app.utils.compress.ZipUtils import io.legado.app.utils.defaultSharedPreferences import io.legado.app.utils.fromJsonArray @@ -59,7 +59,10 @@ import java.io.FileInputStream */ object Restore { + private const val TAG = "Restore" + suspend fun restore(context: Context, uri: Uri) { + LogUtils.d(TAG, "开始恢复备份 uri:$uri") kotlin.runCatching { FileUtils.delete(Backup.backupPath) if (uri.isContentScheme()) { @@ -212,7 +215,7 @@ object Restore { AppLog.put("恢复阅读界面出错\n${it.localizedMessage}", it) } } - AppWebDav.downBgs() + //AppWebDav.downBgs() appCtx.getSharedPreferences(path, "config")?.all?.let { map -> val edit = appCtx.defaultSharedPreferences.edit() @@ -266,9 +269,14 @@ object Restore { try { val file = File(path, fileName) if (file.exists()) { + LogUtils.d(TAG, "阅读恢复备份 $fileName 文件大小 ${file.length()}") FileInputStream(file).use { - return GSON.fromJsonArray(it).getOrThrow() + return GSON.fromJsonArray(it).getOrThrow().also { list -> + LogUtils.d(TAG, "阅读恢复备份 $fileName 列表大小 ${list.size}") + } } + } else { + LogUtils.d(TAG, "阅读恢复备份 $fileName 文件不存在") } } catch (e: Exception) { AppLog.put("$fileName\n读取解析出错\n${e.localizedMessage}", e) diff --git a/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt b/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt index e49d473ee79c..1c08584e8ab8 100644 --- a/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt +++ b/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt @@ -2,6 +2,7 @@ package io.legado.app.lib.permission import android.annotation.SuppressLint import android.content.Intent +import android.content.pm.PackageManager import android.net.Uri import android.os.Build import android.os.Bundle @@ -11,9 +12,12 @@ import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat +import androidx.lifecycle.lifecycleScope import io.legado.app.R import io.legado.app.exception.NoStackTraceException +import io.legado.app.utils.registerForActivityResult import io.legado.app.utils.toastOnUi +import kotlinx.coroutines.launch class PermissionActivity : AppCompatActivity() { @@ -24,6 +28,10 @@ class PermissionActivity : AppCompatActivity() { RequestPlugins.sRequestCallback?.onSettingActivityResult() finish() } + private val settingActivityResultAwait = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) + private val requestPermissionResult = + registerForActivityResult(ActivityResultContracts.RequestPermission()) @SuppressLint("BatteryLife") override fun onCreate(savedInstanceState: Bundle?) { @@ -61,16 +69,23 @@ class PermissionActivity : AppCompatActivity() { } Request.TYPE_REQUEST_NOTIFICATIONS -> showSettingDialog(permissions, rationale) { - kotlin.runCatching { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - //这种方案适用于 API 26, 即8.0(含8.0)以上可以用 - val intent = Intent() - intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS - intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName) - intent.putExtra(Settings.EXTRA_CHANNEL_ID, applicationInfo.uid) - settingActivityResult.launch(intent) - } else { - openSettingsActivity() + lifecycleScope.launch { + kotlin.runCatching { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU + && requestPermissionResult.launch(Permissions.POST_NOTIFICATIONS) + ) { + RequestPlugins.sRequestCallback?.onSettingActivityResult() + finish() + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + //这种方案适用于 API 26, 即8.0(含8.0)以上可以用 + val intent = Intent() + intent.action = Settings.ACTION_APP_NOTIFICATION_SETTINGS + intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName) + intent.putExtra(Settings.EXTRA_CHANNEL_ID, applicationInfo.uid) + settingActivityResult.launch(intent) + } else { + openSettingsActivity() + } } } } @@ -78,14 +93,29 @@ class PermissionActivity : AppCompatActivity() { Request.TYPE_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS -> showSettingDialog( permissions, rationale ) { - kotlin.runCatching { - val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) - intent.setData(Uri.parse("package:$packageName")) - intent.setClassName( - "com.android.settings", - "com.android.settings.fuelgauge.RequestIgnoreBatteryOptimizations" - ) - settingActivityResult.launch(intent) + lifecycleScope.launch { + kotlin.runCatching { + val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) + intent.setData(Uri.parse("package:$packageName")) + val className = + "com.android.settings.fuelgauge.RequestIgnoreBatteryOptimizations" + val activities = packageManager.queryIntentActivities( + intent, + PackageManager.MATCH_DEFAULT_ONLY + ) + if (activities.indexOfFirst { it.activityInfo.name == className } > -1) { + val component = intent.resolveActivity(packageManager) + if (component.className != className) { + intent.setClassName( + "com.android.settings", + className + ) + settingActivityResultAwait.launch(intent) + } + } + intent.component = null + settingActivityResult.launch(intent) + } } } } diff --git a/app/src/main/java/io/legado/app/utils/ActivityResult.kt b/app/src/main/java/io/legado/app/utils/ActivityResult.kt new file mode 100644 index 000000000000..6534764173f6 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/ActivityResult.kt @@ -0,0 +1,45 @@ +package io.legado.app.utils + +import androidx.activity.result.contract.ActivityResultContract +import androidx.appcompat.app.AppCompatActivity +import androidx.core.app.ActivityOptionsCompat +import kotlinx.coroutines.CancellableContinuation +import kotlinx.coroutines.suspendCancellableCoroutine +import kotlin.coroutines.resume + +fun AppCompatActivity.registerForActivityResult(contract: ActivityResultContract): ActivityResultLauncherAwait { + var cout: CancellableContinuation? = null + val launcher = registerForActivityResult(contract) { + cout?.resume(it) + } + return object : ActivityResultLauncherAwait() { + override suspend fun launch(input: I, options: ActivityOptionsCompat?): O { + return suspendCancellableCoroutine { + cout = it + launcher.launch(input, options) + } + } + + override fun unregister() { + launcher.unregister() + } + + override fun getContract(): ActivityResultContract { + return launcher.contract + } + } +} + +abstract class ActivityResultLauncherAwait { + + suspend fun launch(input: I): O { + return launch(input, null) + } + + abstract suspend fun launch(input: I, options: ActivityOptionsCompat?): O + + abstract fun unregister() + + abstract fun getContract(): ActivityResultContract + +} From 2eea32766c75a1a435b3fbf4dada898d619f9c92 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 18 Aug 2024 16:06:08 +0800 Subject: [PATCH 015/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/utils/ActivityResult.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/ActivityResult.kt b/app/src/main/java/io/legado/app/utils/ActivityResult.kt index 6534764173f6..06d6dc47a058 100644 --- a/app/src/main/java/io/legado/app/utils/ActivityResult.kt +++ b/app/src/main/java/io/legado/app/utils/ActivityResult.kt @@ -8,9 +8,11 @@ import kotlinx.coroutines.suspendCancellableCoroutine import kotlin.coroutines.resume fun AppCompatActivity.registerForActivityResult(contract: ActivityResultContract): ActivityResultLauncherAwait { - var cout: CancellableContinuation? = null + lateinit var cout: CancellableContinuation val launcher = registerForActivityResult(contract) { - cout?.resume(it) + if (cout.isActive) { + cout.resume(it) + } } return object : ActivityResultLauncherAwait() { override suspend fun launch(input: I, options: ActivityOptionsCompat?): O { From 290e4aa350b72f93e48902cd9ae03b6df96d2f62 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 18 Aug 2024 19:47:11 +0800 Subject: [PATCH 016/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/AppWebDav.kt | 2 +- .../java/io/legado/app/help/storage/Backup.kt | 6 +++- .../io/legado/app/help/storage/Restore.kt | 14 ++++++-- .../app/lib/prefs/ListPreferenceDialog.kt | 5 +++ .../prefs/MultiSelectListPreferenceDialog.kt | 5 +++ .../io/legado/app/lib/theme/TintHelper.kt | 36 ++++++++++++++++++- .../io/legado/app/utils/DialogExtensions.kt | 7 ++++ .../main/java/io/legado/app/utils/UrlUtil.kt | 5 +-- 8 files changed, 73 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/AppWebDav.kt b/app/src/main/java/io/legado/app/help/AppWebDav.kt index ac7890037558..5f02c69e4a45 100644 --- a/app/src/main/java/io/legado/app/help/AppWebDav.kt +++ b/app/src/main/java/io/legado/app/help/AppWebDav.kt @@ -114,7 +114,7 @@ object AppWebDav { webDav.downloadTo(Backup.zipFilePath, true) FileUtils.delete(Backup.backupPath) ZipUtils.unZipToPath(File(Backup.zipFilePath), Backup.backupPath) - Restore.restore(Backup.backupPath) + Restore.restoreLocked(Backup.backupPath) } } diff --git a/app/src/main/java/io/legado/app/help/storage/Backup.kt b/app/src/main/java/io/legado/app/help/storage/Backup.kt index 0c741f258c7a..a60c6a231e08 100644 --- a/app/src/main/java/io/legado/app/help/storage/Backup.kt +++ b/app/src/main/java/io/legado/app/help/storage/Backup.kt @@ -207,7 +207,11 @@ object Backup { copyBackup(File(path), backupFileName) } } - AppWebDav.backUpWebDav(zipFileName) + try { + AppWebDav.backUpWebDav(zipFileName) + } catch (e: Exception) { + AppLog.put("上传备份至webdav失败\n$e", e) + } } FileUtils.delete(backupPath) FileUtils.delete(zipFilePath) diff --git a/app/src/main/java/io/legado/app/help/storage/Restore.kt b/app/src/main/java/io/legado/app/help/storage/Restore.kt index 34a51271cf56..706d298f8634 100644 --- a/app/src/main/java/io/legado/app/help/storage/Restore.kt +++ b/app/src/main/java/io/legado/app/help/storage/Restore.kt @@ -49,6 +49,8 @@ import io.legado.app.utils.openInputStream import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.delay +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext import splitties.init.appCtx import java.io.File @@ -59,6 +61,8 @@ import java.io.FileInputStream */ object Restore { + private val mutex = Mutex() + private const val TAG = "Restore" suspend fun restore(context: Context, uri: Uri) { @@ -77,7 +81,7 @@ object Restore { return } kotlin.runCatching { - restore(Backup.backupPath) + restoreLocked(Backup.backupPath) LocalConfig.lastBackup = System.currentTimeMillis() }.onFailure { appCtx.toastOnUi("恢复备份出错\n${it.localizedMessage}") @@ -85,7 +89,13 @@ object Restore { } } - suspend fun restore(path: String) { + suspend fun restoreLocked(path: String) { + mutex.withLock { + restore(path) + } + } + + private suspend fun restore(path: String) { val aes = BackupAES() fileToListT(path, "bookshelf.json")?.let { it.forEach { book -> diff --git a/app/src/main/java/io/legado/app/lib/prefs/ListPreferenceDialog.kt b/app/src/main/java/io/legado/app/lib/prefs/ListPreferenceDialog.kt index 7165ef744d53..445adf7f10ec 100644 --- a/app/src/main/java/io/legado/app/lib/prefs/ListPreferenceDialog.kt +++ b/app/src/main/java/io/legado/app/lib/prefs/ListPreferenceDialog.kt @@ -3,10 +3,12 @@ package io.legado.app.lib.prefs import android.app.Dialog import android.os.Bundle import androidx.appcompat.app.AlertDialog +import androidx.core.view.forEach import androidx.preference.ListPreferenceDialogFragmentCompat import androidx.preference.PreferenceDialogFragmentCompat import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.filletBackground +import io.legado.app.utils.applyTint class ListPreferenceDialog : ListPreferenceDialogFragmentCompat() { @@ -30,6 +32,9 @@ class ListPreferenceDialog : ListPreferenceDialogFragmentCompat() { getButton(AlertDialog.BUTTON_NEGATIVE)?.setTextColor(accentColor) getButton(AlertDialog.BUTTON_POSITIVE)?.setTextColor(accentColor) getButton(AlertDialog.BUTTON_NEUTRAL)?.setTextColor(accentColor) + listView?.forEach { + it.applyTint(accentColor) + } } } return dialog diff --git a/app/src/main/java/io/legado/app/lib/prefs/MultiSelectListPreferenceDialog.kt b/app/src/main/java/io/legado/app/lib/prefs/MultiSelectListPreferenceDialog.kt index c1ab77708feb..e8c26ec18fa0 100644 --- a/app/src/main/java/io/legado/app/lib/prefs/MultiSelectListPreferenceDialog.kt +++ b/app/src/main/java/io/legado/app/lib/prefs/MultiSelectListPreferenceDialog.kt @@ -3,10 +3,12 @@ package io.legado.app.lib.prefs import android.app.Dialog import android.os.Bundle import androidx.appcompat.app.AlertDialog +import androidx.core.view.forEach import androidx.preference.MultiSelectListPreferenceDialogFragmentCompat import androidx.preference.PreferenceDialogFragmentCompat import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.filletBackground +import io.legado.app.utils.applyTint class MultiSelectListPreferenceDialog : MultiSelectListPreferenceDialogFragmentCompat() { @@ -32,6 +34,9 @@ class MultiSelectListPreferenceDialog : MultiSelectListPreferenceDialogFragmentC getButton(AlertDialog.BUTTON_NEGATIVE)?.setTextColor(accentColor) getButton(AlertDialog.BUTTON_POSITIVE)?.setTextColor(accentColor) getButton(AlertDialog.BUTTON_NEUTRAL)?.setTextColor(accentColor) + listView?.forEach { + it.applyTint(accentColor) + } } } return dialog diff --git a/app/src/main/java/io/legado/app/lib/theme/TintHelper.kt b/app/src/main/java/io/legado/app/lib/theme/TintHelper.kt index fe470556f013..b9f5be5c3a80 100644 --- a/app/src/main/java/io/legado/app/lib/theme/TintHelper.kt +++ b/app/src/main/java/io/legado/app/lib/theme/TintHelper.kt @@ -7,7 +7,16 @@ import android.graphics.PorterDuff import android.graphics.drawable.Drawable import android.graphics.drawable.RippleDrawable import android.view.View -import android.widget.* +import android.widget.Button +import android.widget.CheckBox +import android.widget.CheckedTextView +import android.widget.EditText +import android.widget.ImageView +import android.widget.ProgressBar +import android.widget.RadioButton +import android.widget.SeekBar +import android.widget.Switch +import android.widget.TextView import androidx.annotation.CheckResult import androidx.annotation.ColorInt import androidx.appcompat.widget.AppCompatEditText @@ -15,6 +24,7 @@ import androidx.appcompat.widget.SearchView import androidx.appcompat.widget.SwitchCompat import androidx.core.content.ContextCompat import androidx.core.graphics.drawable.DrawableCompat +import androidx.core.widget.TextViewCompat import com.google.android.material.floatingactionbutton.FloatingActionButton import io.legado.app.R import io.legado.app.utils.ColorUtils @@ -144,6 +154,7 @@ object TintHelper { is ProgressBar -> setTint(view, color) is AppCompatEditText -> setTint(view, color, isDark) is CheckBox -> setTint(view, color, isDark) + is CheckedTextView -> setTint(view, color, isDark) is ImageView -> setTint(view, color) is Switch -> setTint(view, color, isDark) is SwitchCompat -> setTint(view, color, isDark) @@ -299,6 +310,29 @@ object TintHelper { box.buttonTintList = sl } + @SuppressLint("PrivateResource") + fun setTint(checkedTextView: CheckedTextView, @ColorInt color: Int, useDarker: Boolean) { + val sl = ColorStateList( + arrayOf( + intArrayOf(-android.R.attr.state_enabled), + intArrayOf(android.R.attr.state_enabled, -android.R.attr.state_checked), + intArrayOf(android.R.attr.state_enabled, android.R.attr.state_checked) + ), intArrayOf( + ContextCompat.getColor( + checkedTextView.context, + if (useDarker) R.color.ate_control_disabled_dark else R.color.ate_control_disabled_light + ), + ContextCompat.getColor( + checkedTextView.context, + if (useDarker) R.color.ate_control_normal_dark else R.color.ate_control_normal_light + ), + color + ) + ) + checkedTextView.checkMarkTintList = sl + TextViewCompat.setCompoundDrawableTintList(checkedTextView, sl) + } + fun setTint(image: ImageView, @ColorInt color: Int) { image.setColorFilter(color, PorterDuff.Mode.SRC_ATOP) } diff --git a/app/src/main/java/io/legado/app/utils/DialogExtensions.kt b/app/src/main/java/io/legado/app/utils/DialogExtensions.kt index 941b570880e4..471feae80da8 100644 --- a/app/src/main/java/io/legado/app/utils/DialogExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/DialogExtensions.kt @@ -3,9 +3,11 @@ package io.legado.app.utils import android.app.Dialog import android.view.WindowManager import androidx.appcompat.app.AlertDialog +import androidx.core.view.forEach import androidx.fragment.app.DialogFragment import io.legado.app.lib.theme.Selector import io.legado.app.lib.theme.ThemeStore +import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.filletBackground import splitties.systemservices.windowManager @@ -24,6 +26,11 @@ fun AlertDialog.applyTint(): AlertDialog { if (getButton(AlertDialog.BUTTON_NEUTRAL) != null) { getButton(AlertDialog.BUTTON_NEUTRAL).setTextColor(colorStateList) } + window?.decorView?.post { + listView?.forEach { + it.applyTint(context.accentColor) + } + } return this } diff --git a/app/src/main/java/io/legado/app/utils/UrlUtil.kt b/app/src/main/java/io/legado/app/utils/UrlUtil.kt index 54cad3fb7040..8cad7a6e636d 100644 --- a/app/src/main/java/io/legado/app/utils/UrlUtil.kt +++ b/app/src/main/java/io/legado/app/utils/UrlUtil.kt @@ -153,9 +153,10 @@ object UrlUtil { /* 获取合法的文件后缀 */ fun getSuffix(str: String, default: String? = null): String { val suffix = CustomUrl(str).getUrl() - .substringAfterLast(".", "") + .substringAfterLast("/") .substringBefore("?") - .substringBefore("/") + .substringBefore("#") + .substringAfterLast(".", "") //检查截取的后缀字符是否合法 [a-zA-Z0-9] return if (suffix.length > 5 || !suffix.matches(fileSuffixRegex)) { AppLog.put("Cannot find legal suffix:\n target: $str\n suffix: $suffix") From b03344aaba430c849acd7f12ed019d2ee3f984c0 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 18 Aug 2024 20:27:02 +0800 Subject: [PATCH 017/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/main/explore/ExploreFragment.kt | 5 +---- app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt | 6 +----- app/src/main/res/layout/view_search.xml | 1 + 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt index b6663b73de9a..8739c13048bd 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreFragment.kt @@ -93,12 +93,9 @@ class ExploreFragment() : VMBaseFragment(R.layout.fragment_exp private fun initSearchView() { searchView.applyTint(primaryTextColor) - searchView.onActionViewExpanded() + searchView.setIconifiedByDefault(false) searchView.isSubmitButtonEnabled = true searchView.queryHint = getString(R.string.screen_find) - searchView.post { - searchView.clearFocus() - } searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String?): Boolean { return false diff --git a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt index 804bc7ff718d..3d22dae2e61c 100644 --- a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt @@ -36,7 +36,6 @@ import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Job -import kotlinx.coroutines.delay import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.flowOn @@ -110,12 +109,9 @@ class RssFragment() : VMBaseFragment(R.layout.fragment_rss), private fun initSearchView() { searchView.applyTint(primaryTextColor) - searchView.onActionViewExpanded() + searchView.setIconifiedByDefault(false) searchView.isSubmitButtonEnabled = true searchView.queryHint = getString(R.string.rss) - searchView.post { - searchView.clearFocus() - } searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String?): Boolean { return false diff --git a/app/src/main/res/layout/view_search.xml b/app/src/main/res/layout/view_search.xml index 96ff311daaf0..eb618e99e081 100644 --- a/app/src/main/res/layout/view_search.xml +++ b/app/src/main/res/layout/view_search.xml @@ -11,6 +11,7 @@ android:layout_marginBottom="10dp" android:imeOptions="actionSearch" android:focusable="false" + app:searchIcon="@null" app:queryBackground="@null" app:submitBackground="@null" app:searchHintIcon="@drawable/ic_search_hint" From 2078c4b6d340ddad7b73861601ab1f9a3e6ace59 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 18 Aug 2024 20:56:51 +0800 Subject: [PATCH 018/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/about/ReadRecordActivity.kt | 2 -- .../ui/book/import/BaseImportBookActivity.kt | 9 ++++++--- .../ui/book/manage/BookshelfManageActivity.kt | 2 -- .../app/ui/book/manage/SourcePickerDialog.kt | 2 -- .../app/ui/book/search/SearchActivity.kt | 2 -- .../searchContent/SearchContentActivity.kt | 18 +++++++++++++----- .../book/source/manage/BookSourceActivity.kt | 2 -- .../legado/app/ui/file/FileManageActivity.kt | 2 -- .../app/ui/main/explore/ExploreFragment.kt | 1 - .../io/legado/app/ui/main/rss/RssFragment.kt | 1 - .../app/ui/replace/ReplaceRuleActivity.kt | 2 -- app/src/main/res/layout/view_search.xml | 1 + 12 files changed, 20 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt b/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt index e5bd2eef5783..38f36351d6a0 100644 --- a/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt +++ b/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt @@ -109,10 +109,8 @@ class ReadRecordActivity : BaseActivity() { private fun initSearchView() { searchView.applyTint(primaryTextColor) - searchView.onActionViewExpanded() searchView.isSubmitButtonEnabled = true searchView.queryHint = getString(R.string.search) - searchView.clearFocus() searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String): Boolean { searchView.clearFocus() diff --git a/app/src/main/java/io/legado/app/ui/book/import/BaseImportBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/import/BaseImportBookActivity.kt index b21662c60591..c597e15e7771 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/BaseImportBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/BaseImportBookActivity.kt @@ -17,7 +17,12 @@ import io.legado.app.lib.theme.primaryTextColor import io.legado.app.model.localBook.LocalBook import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.file.HandleFileContract -import io.legado.app.utils.* +import io.legado.app.utils.ArchiveUtils +import io.legado.app.utils.FileDoc +import io.legado.app.utils.applyTint +import io.legado.app.utils.hideSoftInput +import io.legado.app.utils.startActivity +import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine @@ -156,9 +161,7 @@ abstract class BaseImportBookActivity : VMBaseActivity>("searchResultList") val position = intent.getIntExtra("searchResultIndex", 0) val noSearchResult = searchResultList == null - initSearchView(!noSearchResult) + initSearchView(noSearchResult) initRecyclerView() initView() val bookUrl = intent.getStringExtra("bookUrl") ?: return @@ -97,6 +105,7 @@ class SearchContentActivity : if (ev.action == MotionEvent.ACTION_DOWN) { currentFocus?.let { if (it.shouldHideSoftInput(ev)) { + searchView.clearFocus() it.hideSoftInput() } } @@ -112,12 +121,11 @@ class SearchContentActivity : binding.recyclerView.scrollToPosition(position) } - private fun initSearchView(clearFocus: Boolean) { + private fun initSearchView(requestFocus: Boolean) { searchView.applyTint(primaryTextColor) - searchView.onActionViewExpanded() searchView.isSubmitButtonEnabled = true searchView.queryHint = getString(R.string.search) - if (clearFocus) searchView.clearFocus() + if (requestFocus) searchView.isIconified = false searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { override fun onQueryTextSubmit(query: String): Boolean { startContentSearch(query.trim()) diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index 1445c6ec02bd..0741791c2a16 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -288,9 +288,7 @@ class BookSourceActivity : VMBaseActivity(R.layout.fragment_exp private fun initSearchView() { searchView.applyTint(primaryTextColor) - searchView.setIconifiedByDefault(false) searchView.isSubmitButtonEnabled = true searchView.queryHint = getString(R.string.screen_find) searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { diff --git a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt index 3d22dae2e61c..9840375c36ba 100644 --- a/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/rss/RssFragment.kt @@ -109,7 +109,6 @@ class RssFragment() : VMBaseFragment(R.layout.fragment_rss), private fun initSearchView() { searchView.applyTint(primaryTextColor) - searchView.setIconifiedByDefault(false) searchView.isSubmitButtonEnabled = true searchView.queryHint = getString(R.string.rss) searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener { diff --git a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt index 74f8eecb7c60..6e5b93f97b66 100644 --- a/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replace/ReplaceRuleActivity.kt @@ -168,9 +168,7 @@ class ReplaceRuleActivity : VMBaseActivity \ No newline at end of file From 61fc6e2e24a5d961c0ab0f6add239dba23d82681 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 18 Aug 2024 20:58:11 +0800 Subject: [PATCH 019/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/searchContent/SearchContentActivity.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentActivity.kt b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentActivity.kt index 6d98136300da..3716473fe6ab 100644 --- a/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/searchContent/SearchContentActivity.kt @@ -105,7 +105,6 @@ class SearchContentActivity : if (ev.action == MotionEvent.ACTION_DOWN) { currentFocus?.let { if (it.shouldHideSoftInput(ev)) { - searchView.clearFocus() it.hideSoftInput() } } From 177b8779634fdda35405536d65e4fb0bd0ae52d6 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 18 Aug 2024 21:51:53 +0800 Subject: [PATCH 020/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/constant/BookType.kt | 4 ++++ .../main/java/io/legado/app/help/book/BookExtensions.kt | 8 ++++---- app/src/main/java/io/legado/app/model/webBook/WebBook.kt | 7 +++---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/BookType.kt b/app/src/main/java/io/legado/app/constant/BookType.kt index 23230fd84ce5..92ee9ef37b7d 100644 --- a/app/src/main/java/io/legado/app/constant/BookType.kt +++ b/app/src/main/java/io/legado/app/constant/BookType.kt @@ -53,6 +53,10 @@ object BookType { @IntDef(text, updateError, audio, image, webFile, local, archive, notShelf) annotation class Type + /** + * 所有可以从书源转换的书籍类型 + */ + const val allBookType = text or image or audio or webFile /** * 本地书籍书源标志 diff --git a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt index c90e11de3bcb..cdacccb9f9cc 100644 --- a/app/src/main/java/io/legado/app/help/book/BookExtensions.kt +++ b/app/src/main/java/io/legado/app/help/book/BookExtensions.kt @@ -206,6 +206,10 @@ fun Book.removeType(@BookType.Type vararg types: Int) { } } +fun Book.removeAllBookType() { + removeType(BookType.allBookType) +} + fun Book.clearType() { type = 0 } @@ -235,10 +239,6 @@ fun BookSource.getBookType(): Int { } } -fun BookSource.getAllBookType(): Int { - return BookType.text or BookType.image or BookType.audio or BookType.webFile -} - fun Book.sync(oldBook: Book) { val curBook = appDb.bookDao.getBook(oldBook.bookUrl)!! durChapterTime = curBook.durChapterTime diff --git a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt index 3f42b797ad14..13946074e9cd 100644 --- a/app/src/main/java/io/legado/app/model/webBook/WebBook.kt +++ b/app/src/main/java/io/legado/app/model/webBook/WebBook.kt @@ -7,9 +7,8 @@ import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.SearchBook import io.legado.app.exception.NoStackTraceException import io.legado.app.help.book.addType -import io.legado.app.help.book.getAllBookType import io.legado.app.help.book.getBookType -import io.legado.app.help.book.removeType +import io.legado.app.help.book.removeAllBookType import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.http.StrResponse import io.legado.app.model.Debug @@ -149,7 +148,7 @@ object WebBook { book: Book, canReName: Boolean = true, ): Book { - book.removeType(bookSource.getAllBookType()) + book.removeAllBookType() book.addType(bookSource.getBookType()) if (!book.infoHtml.isNullOrEmpty()) { BookInfo.analyzeBookInfo( @@ -227,7 +226,7 @@ object WebBook { book: Book, runPerJs: Boolean = false ): Result> { - book.removeType(bookSource.getAllBookType()) + book.removeAllBookType() book.addType(bookSource.getBookType()) return kotlin.runCatching { if (runPerJs) { From ec22152e37d7f650e0e7c753400737a624a193fe Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Mon, 19 Aug 2024 17:53:04 +0800 Subject: [PATCH 021/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/main/MainActivity.kt | 14 ++++++++++++-- .../bookshelf/style1/BookshelfFragment1.kt | 14 ++++++++++++-- .../legado/app/ui/widget/dialog/TextDialog.kt | 18 +++++++++++------- .../io/legado/app/utils/FragmentExtensions.kt | 6 +++++- 4 files changed, 40 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 641c1dffd26c..57e6bfa562f5 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -43,11 +43,17 @@ import io.legado.app.ui.main.explore.ExploreFragment import io.legado.app.ui.main.my.MyFragment import io.legado.app.ui.main.rss.RssFragment import io.legado.app.ui.widget.dialog.TextDialog -import io.legado.app.utils.* +import io.legado.app.utils.hideSoftInput +import io.legado.app.utils.isCreated +import io.legado.app.utils.observeEvent +import io.legado.app.utils.setEdgeEffectColor +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import kotlin.collections.set import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine @@ -446,7 +452,11 @@ class MainActivity : VMBaseActivity(), } override fun instantiateItem(container: ViewGroup, position: Int): Any { - val fragment = super.instantiateItem(container, position) as Fragment + var fragment = super.instantiateItem(container, position) as Fragment + if (fragment.isCreated && getItemPosition(fragment) == POSITION_NONE) { + destroyItem(container, position, fragment) + fragment = super.instantiateItem(container, position) as Fragment + } fragmentMap[getId(position)] = fragment return fragment } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt index 432df984c6ff..dfc83112cf52 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt @@ -22,7 +22,10 @@ import io.legado.app.ui.book.group.GroupEditDialog import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.main.bookshelf.BaseBookshelfFragment import io.legado.app.ui.main.bookshelf.style1.books.BooksFragment -import io.legado.app.utils.* +import io.legado.app.utils.isCreated +import io.legado.app.utils.setEdgeEffectColor +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlin.collections.set @@ -168,8 +171,15 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1) } override fun instantiateItem(container: ViewGroup, position: Int): Any { - val fragment = super.instantiateItem(container, position) as BooksFragment + var fragment = super.instantiateItem(container, position) as BooksFragment val group = bookGroups[position] + /** + * Activity recreate 会复用之前的 Fragment,不正确的需要需要重新创建 + */ + if (fragment.isCreated && getItemPosition(fragment) == POSITION_NONE) { + destroyItem(container, position, fragment) + fragment = super.instantiateItem(container, position) as BooksFragment + } fragmentMap[group.groupId] = fragment return fragment } diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt index fd837b15f89d..bdd3e6f84399 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt @@ -17,8 +17,10 @@ import io.noties.markwon.Markwon import io.noties.markwon.ext.tables.TablePlugin import io.noties.markwon.html.HtmlPlugin import io.noties.markwon.image.glide.GlideImagesPlugin +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class TextDialog() : BaseDialogFragment(R.layout.dialog_text_view) { @@ -67,13 +69,15 @@ class TextDialog() : BaseDialogFragment(R.layout.dialog_text_view) { binding.toolBar.title = it.getString("title") val content = IntentData.get(it.getString("content")) ?: "" when (it.getString("mode")) { - Mode.MD.name -> binding.textView.post { - Markwon.builder(requireContext()) - .usePlugin(GlideImagesPlugin.create(requireContext())) - .usePlugin(HtmlPlugin.create()) - .usePlugin(TablePlugin.create(requireContext())) - .build() - .setMarkdown(binding.textView, content) + Mode.MD.name -> viewLifecycleOwner.lifecycleScope.launch { + binding.textView.text = withContext(IO) { + Markwon.builder(requireContext()) + .usePlugin(GlideImagesPlugin.create(requireContext())) + .usePlugin(HtmlPlugin.create()) + .usePlugin(TablePlugin.create(requireContext())) + .build() + .toMarkdown(content) + } } Mode.HTML.name -> binding.textView.setHtml(content) diff --git a/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt b/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt index ed76e3469eac..432d0690fc97 100644 --- a/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt @@ -12,6 +12,7 @@ import androidx.annotation.DrawableRes import androidx.core.content.edit import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment +import androidx.lifecycle.Lifecycle import io.legado.app.R import io.legado.app.ui.widget.dialog.TextDialog @@ -83,4 +84,7 @@ inline fun Fragment.startActivity( fun Fragment.showHelp(fileName: String) { val mdText = String(requireContext().assets.open("web/help/md/${fileName}.md").readBytes()) showDialogFragment(TextDialog(getString(R.string.help), mdText, TextDialog.Mode.MD)) -} \ No newline at end of file +} + +val Fragment.isCreated + get() = lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED) From 141ddb2f13d02876014d6ba4366a9e065f0d8067 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Mon, 19 Aug 2024 17:55:12 +0800 Subject: [PATCH 022/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt index dfc83112cf52..e99c2ff5ba86 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/BookshelfFragment1.kt @@ -174,7 +174,7 @@ class BookshelfFragment1() : BaseBookshelfFragment(R.layout.fragment_bookshelf1) var fragment = super.instantiateItem(container, position) as BooksFragment val group = bookGroups[position] /** - * Activity recreate 会复用之前的 Fragment,不正确的需要需要重新创建 + * Activity recreate 会复用之前的 Fragment,不正确的需要重新创建 */ if (fragment.isCreated && getItemPosition(fragment) == POSITION_NONE) { destroyItem(container, position, fragment) From d23df94157d6e9e2d31e6ecfcb6c95fe704fdd34 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Mon, 19 Aug 2024 19:24:36 +0800 Subject: [PATCH 023/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/data/entities/rule/ExploreKind.kt | 2 +- .../legado/app/ui/book/source/debug/BookSourceDebugActivity.kt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/rule/ExploreKind.kt b/app/src/main/java/io/legado/app/data/entities/rule/ExploreKind.kt index 658be1a0399d..d010b1a4eff0 100644 --- a/app/src/main/java/io/legado/app/data/entities/rule/ExploreKind.kt +++ b/app/src/main/java/io/legado/app/data/entities/rule/ExploreKind.kt @@ -4,7 +4,7 @@ package io.legado.app.data.entities.rule * 发现分类 */ data class ExploreKind( - val title: String, + val title: String = "", val url: String? = null, val style: Style? = null ) { diff --git a/app/src/main/java/io/legado/app/ui/book/source/debug/BookSourceDebugActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/debug/BookSourceDebugActivity.kt index f2cdf3b95d39..177a63e2c9a8 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/debug/BookSourceDebugActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/debug/BookSourceDebugActivity.kt @@ -128,7 +128,8 @@ class BookSourceDebugActivity : VMBaseActivity + @Suppress("USELESS_ELVIS") + exploreKinds?.map { it.title ?: "" }?.let { exploreKindTitles -> binding.textFx.onLongClick { selector("选择发现", exploreKindTitles) { _, index -> val explore = exploreKinds[index] From 732d7b6178c071767ee63112d41ab61d195700cd Mon Sep 17 00:00:00 2001 From: tick <895866818@qq.com> Date: Tue, 20 Aug 2024 04:47:31 +0800 Subject: [PATCH 024/837] =?UTF-8?q?feature#=20=E6=8C=89=E9=92=AE=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=20=EF=BC=9A=20=20=E5=81=9C=E6=AD=A2=EF=BC=8C=20?= =?UTF-8?q?=E4=B8=8A=E4=B8=80=E7=AB=A0=EF=BC=8C=20=E6=92=AD=E6=94=BE,=20?= =?UTF-8?q?=E4=B8=8B=E4=B8=80=E7=AB=A0=EF=BC=8C=20=E5=AE=9A=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/BaseReadAloudService.kt | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 5c68a3dd29f3..8ff3f94ba45a 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -189,6 +189,8 @@ abstract class BaseReadAloudService : BaseService(), IntentAction.upTtsSpeechRate -> upSpeechRate(true) IntentAction.prevParagraph -> prevP() IntentAction.nextParagraph -> nextP() + IntentAction.prev -> prevChapter() + IntentAction.next -> nextChapter() IntentAction.addTimer -> addTimer() IntentAction.setTimer -> setTimer(intent.getIntExtra("minute", 0)) IntentAction.stop -> stopSelf() @@ -485,7 +487,7 @@ abstract class BaseReadAloudService : BaseService(), private fun choiceMediaStyle(): androidx.media.app.NotificationCompat.MediaStyle { val mediaStyle = androidx.media.app.NotificationCompat.MediaStyle() - .setShowActionsInCompactView(0, 1, 2) + .setShowActionsInCompactView(0, 2, 4); if (isVivoDevice) { //fix #4090 android 14 can not show play control in lock screen mediaStyle.setMediaSession(mediaSessionCompat.sessionToken) @@ -525,6 +527,17 @@ abstract class BaseReadAloudService : BaseService(), .setSound(null) .setLights(0, 0, 0) builder.setLargeIcon(cover) + // 按钮定义 : 停止, 上一章, 播放, 下一章, 定时 + builder.addAction( + R.drawable.ic_stop_black_24dp, + getString(R.string.stop), + aloudServicePendingIntent(IntentAction.stop) + ) + builder.addAction( + R.drawable.ic_skip_previous, + getString(R.string.previous_chapter), + aloudServicePendingIntent(IntentAction.prev) + ) if (pause) { builder.addAction( R.drawable.ic_play_24dp, @@ -539,9 +552,9 @@ abstract class BaseReadAloudService : BaseService(), ) } builder.addAction( - R.drawable.ic_stop_black_24dp, - getString(R.string.stop), - aloudServicePendingIntent(IntentAction.stop) + R.drawable.ic_skip_next, + getString(R.string.next_chapter), + aloudServicePendingIntent(IntentAction.next) ) builder.addAction( R.drawable.ic_time_add_24dp, @@ -570,6 +583,11 @@ abstract class BaseReadAloudService : BaseService(), abstract fun aloudServicePendingIntent(actionStr: String): PendingIntent? + open fun prevChapter() { + toLast = false + ReadBook.moveToPrevChapter(true, false) + } + open fun nextChapter() { ReadBook.upReadTime() AppLog.putDebug("${ReadBook.curTextChapter?.chapter?.title} 朗读结束跳转下一章并朗读") From 61e48aba8adbb1931f74d3272c7f96f6faa4048d Mon Sep 17 00:00:00 2001 From: tick <895866818@qq.com> Date: Tue, 20 Aug 2024 20:18:33 +0800 Subject: [PATCH 025/837] =?UTF-8?q?feature#=20=E8=B0=83=E6=95=B4=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E9=A1=BA=E5=BA=8F:=E4=B8=8A=E4=B8=80=E7=AB=A0,?= =?UTF-8?q?=E6=92=AD=E6=94=BE,=E5=81=9C=E6=AD=A2,=E4=B8=8B=E4=B8=80?= =?UTF-8?q?=E7=AB=A0,=E5=AE=9A=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/service/BaseReadAloudService.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 8ff3f94ba45a..2446a65791c3 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -487,7 +487,7 @@ abstract class BaseReadAloudService : BaseService(), private fun choiceMediaStyle(): androidx.media.app.NotificationCompat.MediaStyle { val mediaStyle = androidx.media.app.NotificationCompat.MediaStyle() - .setShowActionsInCompactView(0, 2, 4); + .setShowActionsInCompactView(1, 2, 4); if (isVivoDevice) { //fix #4090 android 14 can not show play control in lock screen mediaStyle.setMediaSession(mediaSessionCompat.sessionToken) @@ -528,11 +528,6 @@ abstract class BaseReadAloudService : BaseService(), .setLights(0, 0, 0) builder.setLargeIcon(cover) // 按钮定义 : 停止, 上一章, 播放, 下一章, 定时 - builder.addAction( - R.drawable.ic_stop_black_24dp, - getString(R.string.stop), - aloudServicePendingIntent(IntentAction.stop) - ) builder.addAction( R.drawable.ic_skip_previous, getString(R.string.previous_chapter), @@ -551,6 +546,11 @@ abstract class BaseReadAloudService : BaseService(), aloudServicePendingIntent(IntentAction.pause) ) } + builder.addAction( + R.drawable.ic_stop_black_24dp, + getString(R.string.stop), + aloudServicePendingIntent(IntentAction.stop) + ) builder.addAction( R.drawable.ic_skip_next, getString(R.string.next_chapter), From cf590d21d4219a4dd77fa56abaa99960503919a4 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 20 Aug 2024 20:37:51 +0800 Subject: [PATCH 026/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/service/BaseReadAloudService.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 2446a65791c3..a56107f21291 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -487,7 +487,7 @@ abstract class BaseReadAloudService : BaseService(), private fun choiceMediaStyle(): androidx.media.app.NotificationCompat.MediaStyle { val mediaStyle = androidx.media.app.NotificationCompat.MediaStyle() - .setShowActionsInCompactView(1, 2, 4); + .setShowActionsInCompactView(1, 2, 4) if (isVivoDevice) { //fix #4090 android 14 can not show play control in lock screen mediaStyle.setMediaSession(mediaSessionCompat.sessionToken) @@ -527,7 +527,7 @@ abstract class BaseReadAloudService : BaseService(), .setSound(null) .setLights(0, 0, 0) builder.setLargeIcon(cover) - // 按钮定义 : 停止, 上一章, 播放, 下一章, 定时 + // 按钮定义:上一章、播放、停止、下一章、定时 builder.addAction( R.drawable.ic_skip_previous, getString(R.string.previous_chapter), @@ -585,7 +585,7 @@ abstract class BaseReadAloudService : BaseService(), open fun prevChapter() { toLast = false - ReadBook.moveToPrevChapter(true, false) + ReadBook.moveToPrevChapter(true, toLast = false) } open fun nextChapter() { From 268860e3ac26b13062e2dfad77956eb39bd79362 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Wed, 21 Aug 2024 10:45:57 +0800 Subject: [PATCH 027/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../epublib/util/commons/io/XmlStreamReader.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/modules/book/src/main/java/me/ag2s/epublib/util/commons/io/XmlStreamReader.java b/modules/book/src/main/java/me/ag2s/epublib/util/commons/io/XmlStreamReader.java index f1a92b976980..c1e8c056d0ad 100644 --- a/modules/book/src/main/java/me/ag2s/epublib/util/commons/io/XmlStreamReader.java +++ b/modules/book/src/main/java/me/ag2s/epublib/util/commons/io/XmlStreamReader.java @@ -29,6 +29,7 @@ import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; +import java.nio.charset.Charset; import java.text.MessageFormat; import java.util.Locale; import java.util.Objects; @@ -758,7 +759,17 @@ private static String getXmlProlog(final InputStream inputStream, final String g } } } - return encoding; + boolean isSupportedEncoding; + try { + isSupportedEncoding = Charset.isSupported(encoding); + } catch (Exception e) { + return null; + } + if (isSupportedEncoding) { + return encoding; + } else { + return null; + } } /** From 094d4d32ede67c7fe271e20d5258dbcbba158de1 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Wed, 21 Aug 2024 14:41:54 +0800 Subject: [PATCH 028/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/base/BaseService.kt | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/main/java/io/legado/app/base/BaseService.kt b/app/src/main/java/io/legado/app/base/BaseService.kt index 69dbb3749e87..5a1dcf4b1749 100644 --- a/app/src/main/java/io/legado/app/base/BaseService.kt +++ b/app/src/main/java/io/legado/app/base/BaseService.kt @@ -64,6 +64,13 @@ abstract class BaseService : LifecycleService() { LifecycleHelp.onServiceDestroy(this) } + @CallSuper + override fun onTimeout(startId: Int) { + super.onTimeout(startId) + LogUtils.d(simpleName, "onTimeout startId:$startId") + stopSelf() + } + /** * 开启前台服务并发送通知 */ From bc8052fde9314d37c55b343024ad61bc52b9e95c Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 22 Aug 2024 13:35:14 +0800 Subject: [PATCH 029/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/page/provider/TextChapterLayout.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt index a45aed841bd8..211c54269d75 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt @@ -33,6 +33,7 @@ import kotlinx.coroutines.launch import java.util.LinkedList import java.util.Locale import kotlin.coroutines.coroutineContext +import kotlin.math.max import kotlin.math.roundToInt class TextChapterLayout( @@ -446,7 +447,7 @@ class TextChapterLayout( val textLine = TextLine(isTitle = isTitle) if (durY + textHeight > visibleHeight) { val textPage = pendingTextPage - val height = textPage.lines.lastOrNull()?.lineBottom ?: 0f + val height = max(durY, textPage.lines.lastOrNull()?.lineBottom ?: 0f) if (textPage.height < height) { textPage.height = height } @@ -531,7 +532,7 @@ class TextChapterLayout( val textPage = pendingTextPage textPage.addLine(textLine) durY += textHeight * lineSpacingExtra - val height = textPage.lines.lastOrNull()?.lineBottom ?: 0f + val height = max(durY, textPage.lines.lastOrNull()?.lineBottom ?: 0f) if (textPage.height < height) { textPage.height = height } From b02e95fa073cee783a57df8736b9617ef3456687 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 22 Aug 2024 14:18:39 +0800 Subject: [PATCH 030/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/book/read/page/entities/TextPage.kt | 3 ++- .../ui/book/read/page/provider/TextChapterLayout.kt | 11 ++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt index ebccb46ec612..dd54316b7fda 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/entities/TextPage.kt @@ -326,7 +326,8 @@ data class TextPage( fun render(view: ContentTextView): Boolean { if (!isCompleted) return false - return canvasRecorder.recordIfNeeded(view.width, height.toInt() + paddingTop) { + val height = lines.lastOrNull()?.lineBottom?.toInt() ?: 0 + return canvasRecorder.recordIfNeeded(view.width, height) { drawPage(view, this) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt index 211c54269d75..f4b9d1ee44ea 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt @@ -33,7 +33,6 @@ import kotlinx.coroutines.launch import java.util.LinkedList import java.util.Locale import kotlin.coroutines.coroutineContext -import kotlin.math.max import kotlin.math.roundToInt class TextChapterLayout( @@ -447,9 +446,8 @@ class TextChapterLayout( val textLine = TextLine(isTitle = isTitle) if (durY + textHeight > visibleHeight) { val textPage = pendingTextPage - val height = max(durY, textPage.lines.lastOrNull()?.lineBottom ?: 0f) - if (textPage.height < height) { - textPage.height = height + if (textPage.height < durY) { + textPage.height = durY } if (doublePage && absStartX < viewWidth / 2) { //当前页面左列结束 @@ -532,9 +530,8 @@ class TextChapterLayout( val textPage = pendingTextPage textPage.addLine(textLine) durY += textHeight * lineSpacingExtra - val height = max(durY, textPage.lines.lastOrNull()?.lineBottom ?: 0f) - if (textPage.height < height) { - textPage.height = height + if (textPage.height < durY) { + textPage.height = durY } } durY += textHeight * paragraphSpacing / 10f From 09863d3cef8a5bdeddc1b850cb22925d77fc1abc Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 22 Aug 2024 15:52:50 +0800 Subject: [PATCH 031/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt index 7004b78a12d6..9e67598b2989 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt @@ -3,6 +3,7 @@ package io.legado.app.ui.widget.dialog import android.annotation.SuppressLint import android.os.Bundle import android.view.View +import android.view.ViewGroup import com.bumptech.glide.request.RequestOptions import io.legado.app.R import io.legado.app.base.BaseDialogFragment @@ -32,7 +33,7 @@ class PhotoDialog() : BaseDialogFragment(R.layout.dialog_photo_view) { override fun onStart() { super.onStart() - setLayout(1f, 1f) + setLayout(1f, ViewGroup.LayoutParams.MATCH_PARENT) } @SuppressLint("CheckResult") From 051d8fa13ff06a318a426c0dd679c38ab4f98135 Mon Sep 17 00:00:00 2001 From: Xwite <82232510+Xwite@users.noreply.github.com> Date: Mon, 19 Aug 2024 01:32:05 +0000 Subject: [PATCH 032/837] Bump cronet from 127.0.6533.64 to 128.0.6613.40 - Changes in the [Git log](https://chromium.googlesource.com/chromium/src/+log/127.0.6533.64..128.0.6613.40) --- app/cronetlib/cronet_api.jar | Bin 176331 -> 176441 bytes app/cronetlib/cronet_impl_common_java.jar | Bin 112479 -> 112934 bytes app/cronetlib/cronet_impl_native_java.jar | Bin 1421096 -> 1419896 bytes app/cronetlib/cronet_shared_java.jar | Bin 77193 -> 78508 bytes app/src/main/assets/cronet.json | 2 +- app/src/main/assets/updateLog.md | 1 + gradle.properties | 4 ++-- 7 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/cronetlib/cronet_api.jar b/app/cronetlib/cronet_api.jar index 6738fa5797f960b8d8d841113985eaa4bb700413..8f94ada454bc5eb35f8095d776890a9204451d6f 100644 GIT binary patch delta 2994 zcmY*b3s98T75>iMb(dX!-Va%nr{ZH_VOL-Q5e1DB6A@5+P_?-7RPN0b<2 z#LaMH+e8wrh#`@nb+tz0OlItK>?>-TPNt(tn|AutN!r?&XzBU?1&TZK|MxrJIeYGT z-Mf4JGxNpYn}=#{ge;ieKQJ^2P@fdvuJ1Q@yLMJ^7*_pQz#6D#j0Lvw?wuu*{vYh{mzQVq2V>QFB)dPq{EtZb!R zYL@$3DU0p4C}?53E3Gu0-0}~tl+9$Tf;J`-+h_{4%eif2W3p4hRwg}dWHGCy`Hq4~ z*e3s8DH8o}w$nVKVtJ>7nk~iXRUomJU~2I+uJm+zYwLq?6s3MwC-vxPsjsaj%5T_4 z4k6>W(+abx)$7^XTvzXHmz%d!yj;~q7P)sj6^58rHaEIm9i85K!g6^vfvj>UpHg&% z^9yB37ez~V7cHc9|I_Sa=>w*7T2jo_+yO4e>Yi zxXbTY?i6qaK^Q_B-bE&c;lNqkV>TH&=1lkxzS_xqy~F4TV6`0Sempyxq)tmRm3Ia%^ZN=SxF89*hS~Tz zpVJ#C!EaH9+wzys)8w=V7Vf~&ZK>sZBgTu*w` z;2|H)M`&i;!u4`ah>V?> zp>~dwuHxq$8CdPokdcvFLqUwXG-P7btsyfb;K*pJ8Bwq{l`6+aS8Li44tzu#i6f*? z2+xuM2Pu@oxT)$$sFRZ&h$@^_fv6%lD%FWvQk^y@HW)^@00twvjQGfiD)~t_B^m?O zj+7(aw4yW=dUhK_5lEs)WKjJ0XaY7ZGI;-_ z-*6tczK;}(KC(eWlNot66vC*9(NRp&4O%Vw^b9?ZT<-x&Et&1{T z#F7Kal#AKqL^kE2i1JZN1t_DrD5oNuKSyryqLffKMO(2|=(GY!p zRP8-od(Y6`vp54Fm2Ha=#u>$-iZ8FsVhd%FgR(ix9CA{=zv4wYG!SxZ9{=w0AyuF0 zG9pjJ$?&&Cm@i4O$n;#XfoAx6zL*lRsKwJ>AGpkoFcT6b6;h09YLflA;wP54#`=y$ z9=E%`wxikOo?tF(oFZ+fNt-EkDD*r(22LZGgIvn8dg&Og=^1{|y9@>2HQ;`#_eLBW zS`flW9X2-Oa}dU>io*GntFvH4B%ckTCqyHLW#a2DX4HKKud0pE$@#Tpn5lYJx8_VW zuj;L)?ilb&n5;>0{`*dGtx>Q3oAF zTe9bbSSPk04JcZBC{coB1aoQ{{hZ!rC;O20WU?#3+d4v<0q@C^|z3x_FO zja2)bp!i|cDoKvKM^VyKO+m8gq_B%w?@gdX``D-dB>Vi}N`SuiQ~r7E3uB+l2iWJ- ze%1|sGOkl(Z9h9%{YRCt%Y+4FmcL?#I(knDm)K{PDFd8ft0EF*-#hI5^eJ}maoji^ zEAR0aX`W0T5NpMkGgL*iJTxFGX}bJ$Kvap7Hu>2A|Cy;cEf$JoM?kQzC!=h2@R0rD zv|%NV1iN6V`-BgzAaXX+wJO_;OpC`mrLJa#jQ@2i1vkNm}Ot52nqDy`VKL%uj$_#GvZrt z2Zwy8mqQLc!y$jTdrW1Pub*Mn@-ysp&Hl&O`C`)xV}wb5qgo6f3=kVrLuL7pm?!SP R{D0!ikcc&`dqq80{{tk4!dL(R delta 2811 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 J7h$5q{U3Y;U#tKC delta 93642 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

qxNU=PmSjL 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

Lu(Dd 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

  • 5is7T5&TKaX zM6ZDo67k^TNAcS_eOX>$F)&4!2P5=HkB{ySdW4TWiPQOJ=sKLQp!z)&y2{?73yI?v zCxVOXi4L*57YR&s`k8(bM__}W&nTUvd z`)B{W{{chx-~n>^_AcHT`bN;$NV{GuP)g}!sU;WnbbX{cw+0~xa?n64!=+TY?9Q!E z8fX*<((FjEzygQ%tQ}!Q9cac5>PwF4Eds5|NjH){(MmUyRe5dLZQx!9+OdZUMtkV@ z(XVNx+D{95fMTiFsd=P?ULDAz)l@(eXO118ef;F3 zGqf@u6VvouQyn!202tq?fC(ueyt`HHsq{OH=`E8F7JnJFj3 z(oMfj6xH@*Ie~f{HRUi$FG zT6x11&DyUvnQjmvay?Nc;~~+c&A76L2Lp3HtNb)1Ol`@VvB`=C(V?C6DtB8mcAF6IV|<-9nNP{=ZMQFm#fai#d^jcL2Q65*7#V|4SED*FCm zhjccv{@SUmZl`x1v&vSkf}VPl|3ld^FXk^YqLezGE|g!Xh(ljw^u&r?)<$_h-u_nU wayH7_asE5`Zd8nEFa4Oo{Cz7=?r7$i^`BXf7A5*}tcusmPb?Sc*sgBEzpn}lNB{r; diff --git a/app/src/main/assets/cronet.json b/app/src/main/assets/cronet.json index e8226ce01f5e..fa4e3399d884 100644 --- a/app/src/main/assets/cronet.json +++ b/app/src/main/assets/cronet.json @@ -1 +1 @@ -{"x86_64":"550762ae8cf06387127646b0b356201d","arm64-v8a":"cb4a468bbc42a7fa86cb83f9c0c1f19c","armeabi-v7a":"b2960e2f105f9808bacf5bf0d983ffe8","x86":"33e3d97ff9139e9cce8a94e4cc9a4fc5","version":"127.0.6533.64"} \ No newline at end of file +{"x86":"2288814a4d9d4ee24154f52abf227fa0","armeabi-v7a":"ac8190c5e795d1a754b7bf2d477119c5","x86_64":"116f2d0f8e6363caacbd5c38bfc45b9f","arm64-v8a":"61a96a20241e56ac7ab107cc3e4c3fda","version":"128.0.6613.40"} \ No newline at end of file diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index f3903a039e73..baa145dcfbd3 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -13,6 +13,7 @@ * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! **2024/02/27** +* 更新cronet: 128.0.6613.40 * 更新cronet: 127.0.6533.64 * 更新cronet: 123.0.6312.80 * 更新cronet: 123.0.6312.40 diff --git a/gradle.properties b/gradle.properties index 19fcbcb0e7f7..9a6eff3e628e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -42,8 +42,8 @@ android.defaults.buildfeatures.shaders=false # and none from the library's dependencies, thereby reducing the size of the R class for that library. android.nonTransitiveRClass=true # https://chromiumdash.appspot.com/releases?platform=Android -CronetVersion=127.0.6533.64 -CronetMainVersion=127.0.0.0 +CronetVersion=128.0.6613.40 +CronetMainVersion=128.0.0.0 android.injected.testOnly=false android.nonFinalResIds=true android.injected.androidTest.leaveApksInstalledAfterRun=true From 1e9dcb000c1d69c92bf2c50bcff657958d79c8e4 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 23 Aug 2024 17:41:14 +0800 Subject: [PATCH 033/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/App.kt | 8 +- .../java/io/legado/app/constant/PreferKey.kt | 1 + .../io/legado/app/help/config/AppConfig.kt | 4 + .../app/lib/permission/PermissionActivity.kt | 44 +++++++--- .../io/legado/app/lib/permission/Request.kt | 2 +- .../app/service/BaseReadAloudService.kt | 81 +++++++++++++++++++ .../io/legado/app/ui/about/AboutFragment.kt | 9 +-- .../book/read/config/ReadAloudConfigDialog.kt | 11 +++ .../main/java/io/legado/app/utils/LogUtils.kt | 2 +- .../legado/app/utils/PreferencesExtensions.kt | 30 ++++++- app/src/main/res/values-es-rES/strings.xml | 3 + app/src/main/res/values-ja-rJP/strings.xml | 3 + app/src/main/res/values-pt-rBR/strings.xml | 3 + app/src/main/res/values-vi/strings.xml | 3 + app/src/main/res/values-zh-rHK/strings.xml | 3 + app/src/main/res/values-zh-rTW/strings.xml | 3 + app/src/main/res/values-zh/strings.xml | 3 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/xml/pref_config_aloud.xml | 6 ++ 19 files changed, 204 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/io/legado/app/App.kt b/app/src/main/java/io/legado/app/App.kt index 7ed711575859..005fca10e8ac 100644 --- a/app/src/main/java/io/legado/app/App.kt +++ b/app/src/main/java/io/legado/app/App.kt @@ -6,6 +6,7 @@ import android.app.NotificationChannel import android.app.NotificationManager import android.content.Context import android.content.pm.ActivityInfo +import android.content.pm.ApplicationInfo import android.content.res.Configuration import android.os.Build import com.github.liuyueyi.quick.transfer.constants.TransType @@ -129,8 +130,13 @@ class App : Application() { */ private fun installGmsTlsProvider(context: Context) { try { + val gmsPackageName = "com.google.android.gms" + val appInfo = packageManager.getApplicationInfo(gmsPackageName, 0) + if ((appInfo.flags and ApplicationInfo.FLAG_SYSTEM) == 0) { + return + } val gms = context.createPackageContext( - "com.google.android.gms", + gmsPackageName, CONTEXT_INCLUDE_CODE or CONTEXT_IGNORE_SECURITY ) gms.classLoader diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index 050f020a4169..013008a42fbf 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -147,6 +147,7 @@ object PreferKey { const val optimizeRender = "optimizeRender" const val updateToVariant = "updateToVariant" const val streamReadAloudAudio = "streamReadAloudAudio" + const val pauseReadAloudWhilePhoneCalls = "pauseReadAloudWhilePhoneCalls" const val cPrimary = "colorPrimary" const val cAccent = "colorAccent" diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index ff9028e30458..bfaa2620508a 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -467,6 +467,10 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { val ignoreAudioFocus get() = appCtx.getPrefBoolean(PreferKey.ignoreAudioFocus, false) + var pauseReadAloudWhilePhoneCalls + get() = appCtx.getPrefBoolean(PreferKey.pauseReadAloudWhilePhoneCalls, false) + set(value) = appCtx.putPrefBoolean(PreferKey.pauseReadAloudWhilePhoneCalls, value) + val onlyLatestBackup get() = appCtx.getPrefBoolean(PreferKey.onlyLatestBackup, true) val defaultHomePage get() = appCtx.getPrefString(PreferKey.defaultHomePage, "bookshelf") diff --git a/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt b/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt index 1c08584e8ab8..00374a2f05df 100644 --- a/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt +++ b/app/src/main/java/io/legado/app/lib/permission/PermissionActivity.kt @@ -11,9 +11,9 @@ import androidx.activity.addCallback import androidx.activity.result.contract.ActivityResultContracts import androidx.appcompat.app.AlertDialog import androidx.appcompat.app.AppCompatActivity -import androidx.core.app.ActivityCompat import androidx.lifecycle.lifecycleScope import io.legado.app.R +import io.legado.app.constant.AppLog import io.legado.app.exception.NoStackTraceException import io.legado.app.utils.registerForActivityResult import io.legado.app.utils.toastOnUi @@ -25,13 +25,14 @@ class PermissionActivity : AppCompatActivity() { private val settingActivityResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { - RequestPlugins.sRequestCallback?.onSettingActivityResult() - finish() + onRequestPermissionFinish() } private val settingActivityResultAwait = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) private val requestPermissionResult = registerForActivityResult(ActivityResultContracts.RequestPermission()) + private val requestPermissionsResult = + registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) @SuppressLint("BatteryLife") override fun onCreate(savedInstanceState: Bundle?) { @@ -42,7 +43,20 @@ class PermissionActivity : AppCompatActivity() { when (intent.getIntExtra(KEY_INPUT_REQUEST_TYPE, Request.TYPE_REQUEST_PERMISSION)) { //权限请求 Request.TYPE_REQUEST_PERMISSION -> showSettingDialog(permissions, rationale) { - ActivityCompat.requestPermissions(this, permissions, requestCode) + lifecycleScope.launch { + try { + val result = requestPermissionsResult.launch(permissions) + if (result.values.all { it }) { + onRequestPermissionFinish() + } else { + openSettingsActivity() + } + } catch (e: Exception) { + AppLog.put("请求权限出错\n$e", e, true) + RequestPlugins.sRequestCallback?.onError(e) + finish() + } + } } //跳转到设置界面 Request.TYPE_REQUEST_SETTING -> showSettingDialog(permissions, rationale) { @@ -62,7 +76,7 @@ class PermissionActivity : AppCompatActivity() { throw NoStackTraceException("no MANAGE_ALL_FILES_ACCESS_PERMISSION") } } catch (e: Exception) { - toastOnUi(e.localizedMessage) + AppLog.put("请求所有文件的管理权限出错\n$e", e, true) RequestPlugins.sRequestCallback?.onError(e) finish() } @@ -70,12 +84,11 @@ class PermissionActivity : AppCompatActivity() { Request.TYPE_REQUEST_NOTIFICATIONS -> showSettingDialog(permissions, rationale) { lifecycleScope.launch { - kotlin.runCatching { + try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU && requestPermissionResult.launch(Permissions.POST_NOTIFICATIONS) ) { - RequestPlugins.sRequestCallback?.onSettingActivityResult() - finish() + onRequestPermissionFinish() } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { //这种方案适用于 API 26, 即8.0(含8.0)以上可以用 val intent = Intent() @@ -86,6 +99,10 @@ class PermissionActivity : AppCompatActivity() { } else { openSettingsActivity() } + } catch (e: Exception) { + AppLog.put("请求通知权限出错\n$e", e, true) + RequestPlugins.sRequestCallback?.onError(e) + finish() } } } @@ -94,7 +111,7 @@ class PermissionActivity : AppCompatActivity() { permissions, rationale ) { lifecycleScope.launch { - kotlin.runCatching { + try { val intent = Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS) intent.setData(Uri.parse("package:$packageName")) val className = @@ -115,6 +132,10 @@ class PermissionActivity : AppCompatActivity() { } intent.component = null settingActivityResult.launch(intent) + } catch (e: Exception) { + AppLog.put("请求后台权限出错\n$e", e, true) + RequestPlugins.sRequestCallback?.onError(e) + finish() } } } @@ -124,6 +145,11 @@ class PermissionActivity : AppCompatActivity() { } } + private fun onRequestPermissionFinish() { + RequestPlugins.sRequestCallback?.onSettingActivityResult() + finish() + } + private fun openSettingsActivity() { try { val settingIntent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) diff --git a/app/src/main/java/io/legado/app/lib/permission/Request.kt b/app/src/main/java/io/legado/app/lib/permission/Request.kt index 036e4a7122d1..bda772e5d626 100644 --- a/app/src/main/java/io/legado/app/lib/permission/Request.kt +++ b/app/src/main/java/io/legado/app/lib/permission/Request.kt @@ -78,7 +78,7 @@ internal class Request : OnRequestPermissionsResultCallback { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { toIgnoreBatterySetting() } - } else if (deniedPermissions.size > 1) { + } else if (deniedPermissions.isNotEmpty()) { appCtx.startActivity { putExtra(PermissionActivity.KEY_RATIONALE, rationale) putExtra(PermissionActivity.KEY_INPUT_REQUEST_TYPE, TYPE_REQUEST_PERMISSION) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index a56107f21291..9178eecd690e 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -14,6 +14,8 @@ import android.os.Bundle import android.os.PowerManager import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat +import android.telephony.PhoneStateListener +import android.telephony.TelephonyManager import androidx.annotation.CallSuper import androidx.core.app.NotificationCompat import androidx.lifecycle.lifecycleScope @@ -31,6 +33,8 @@ import io.legado.app.constant.Status import io.legado.app.help.MediaHelp import io.legado.app.help.config.AppConfig import io.legado.app.help.glide.ImageLoader +import io.legado.app.lib.permission.Permissions +import io.legado.app.lib.permission.PermissionsCompat import io.legado.app.model.ReadAloud import io.legado.app.model.ReadBook import io.legado.app.receiver.MediaButtonReceiver @@ -41,6 +45,7 @@ import io.legado.app.utils.broadcastPendingIntent import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.isVivoDevice import io.legado.app.utils.observeEvent +import io.legado.app.utils.observeSharedPreferences import io.legado.app.utils.postEvent import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers.IO @@ -53,6 +58,7 @@ import splitties.init.appCtx import splitties.systemservices.audioManager import splitties.systemservices.notificationManager import splitties.systemservices.powerManager +import splitties.systemservices.telephonyManager import splitties.systemservices.wifiManager /** @@ -102,12 +108,16 @@ abstract class BaseReadAloudService : BaseService(), private val mediaSessionCompat: MediaSessionCompat by lazy { MediaSessionCompat(this, "readAloud") } + private val phoneStateListener by lazy { + ReadAloudPhoneStateListener() + } internal var contentList = emptyList() internal var nowSpeak: Int = 0 internal var readAloudNumber: Int = 0 internal var textChapter: TextChapter? = null internal var pageIndex = 0 private var needResumeOnAudioFocusGain = false + private var registeredPhoneStateListener = false private var dsJob: Job? = null private var cover: Bitmap = BitmapFactory.decodeResource(appCtx.resources, R.drawable.icon_read_book) @@ -133,6 +143,7 @@ abstract class BaseReadAloudService : BaseService(), observeLiveBus() initMediaSession() initBroadcastReceiver() + initPhoneStateListener() upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PLAYING) setTimer(AppConfig.ttsTimer) if (AppConfig.ttsTimer > 0) { @@ -157,6 +168,13 @@ abstract class BaseReadAloudService : BaseService(), val startPos = it.getInt("startPos") newReadAloud(play, pageIndex, startPos) } + observeSharedPreferences { _, key -> + when (key) { + PreferKey.pauseReadAloudWhilePhoneCalls -> { + initPhoneStateListener() + } + } + } } override fun onDestroy() { @@ -174,6 +192,7 @@ abstract class BaseReadAloudService : BaseService(), upMediaSessionPlaybackState(PlaybackStateCompat.STATE_STOPPED) mediaSessionCompat.release() ReadBook.uploadProgress() + unregisterPhoneStateListener(phoneStateListener) } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { @@ -596,4 +615,66 @@ abstract class BaseReadAloudService : BaseService(), } } + private fun initPhoneStateListener() { + val needRegister = AppConfig.ignoreAudioFocus && AppConfig.pauseReadAloudWhilePhoneCalls + if (needRegister && registeredPhoneStateListener) { + return + } + if (needRegister) { + registerPhoneStateListener(phoneStateListener) + } else { + unregisterPhoneStateListener(phoneStateListener) + } + } + + @Suppress("DEPRECATION") + private fun unregisterPhoneStateListener(l: PhoneStateListener) { + if (registeredPhoneStateListener) { + registerPhoneStateListener(l, true) + } + } + + @Suppress("DEPRECATION") + private fun registerPhoneStateListener(l: PhoneStateListener, unregister: Boolean = false) { + try { + if (unregister) { + telephonyManager.listen(l, PhoneStateListener.LISTEN_NONE) + registeredPhoneStateListener = false + } else { + telephonyManager.listen(l, PhoneStateListener.LISTEN_CALL_STATE) + registeredPhoneStateListener = true + } + } catch (e: SecurityException) { + PermissionsCompat.Builder() + .addPermissions(Permissions.READ_PHONE_STATE) + .rationale(R.string.read_aloud_read_phone_state_permission_rationale) + .onGranted { + registerPhoneStateListener(l, unregister) + } + .request() + } + } + + @Suppress("DEPRECATION", "OVERRIDE_DEPRECATION") + inner class ReadAloudPhoneStateListener : PhoneStateListener() { + override fun onCallStateChanged(state: Int, phoneNumber: String?) { + super.onCallStateChanged(state, phoneNumber) + when (state) { + TelephonyManager.CALL_STATE_IDLE -> { + AppLog.put("来电结束,继续朗读") + resumeReadAloud() + } + + TelephonyManager.CALL_STATE_RINGING -> { + AppLog.put("来电响铃,暂停朗读") + pauseReadAloud() + } + + TelephonyManager.CALL_STATE_OFFHOOK -> { + AppLog.put("来电接听,不做处理") + } + } + } + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt index 03ffcbc75c59..2fafcdc197bd 100644 --- a/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt +++ b/app/src/main/java/io/legado/app/ui/about/AboutFragment.kt @@ -164,12 +164,11 @@ class AboutFragment : PreferenceFragmentCompat() { } private fun copyLogs(doc: FileDoc) { - val files = File(appCtx.externalCacheDir, "logs").listFiles()?.toList() - if (files.isNullOrEmpty()) { - return - } + val logFiles = File(appCtx.externalCacheDir, "logs") + val crashFiles = File(appCtx.externalCacheDir, "crash") + val zipFile = File(appCtx.externalCacheDir, "logs.zip") - ZipUtils.zipFiles(files.filter { it.name.endsWith(".txt") }, zipFile) + ZipUtils.zipFiles(arrayListOf(logFiles, crashFiles), zipFile) doc.find("logs.zip")?.delete() diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt index 86f2fa5c265b..cdc21cf921e7 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt @@ -14,7 +14,9 @@ import io.legado.app.constant.EventBus import io.legado.app.constant.PreferKey import io.legado.app.data.appDb import io.legado.app.help.IntentHelp +import io.legado.app.help.config.AppConfig import io.legado.app.lib.dialogs.SelectItem +import io.legado.app.lib.prefs.SwitchPreference import io.legado.app.lib.prefs.fragment.PreferenceFragment import io.legado.app.lib.theme.backgroundColor import io.legado.app.lib.theme.primaryColor @@ -79,6 +81,9 @@ class ReadAloudConfigDialog : DialogFragment() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.pref_config_aloud) upSpeakEngineSummary() + findPreference(PreferKey.pauseReadAloudWhilePhoneCalls)?.let { + it.isEnabled = AppConfig.ignoreAudioFocus + } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -114,6 +119,12 @@ class ReadAloudConfigDialog : DialogFragment() { postEvent(EventBus.MEDIA_BUTTON, false) } } + + PreferKey.ignoreAudioFocus -> { + findPreference(PreferKey.pauseReadAloudWhilePhoneCalls)?.let { + it.isEnabled = AppConfig.ignoreAudioFocus + } + } } } diff --git a/app/src/main/java/io/legado/app/utils/LogUtils.kt b/app/src/main/java/io/legado/app/utils/LogUtils.kt index dce7c829a880..7ae782e67ea3 100644 --- a/app/src/main/java/io/legado/app/utils/LogUtils.kt +++ b/app/src/main/java/io/legado/app/utils/LogUtils.kt @@ -53,7 +53,7 @@ object LogUtils { val logFolder = FileUtils.createFolderIfNotExist(root, "logs") val expiredTime = System.currentTimeMillis() - 7.days.inWholeMilliseconds logFolder.listFiles()?.forEach { - if (it.lastModified() < expiredTime) { + if (it.lastModified() < expiredTime || it.name.endsWith(".lck")) { it.delete() } } diff --git a/app/src/main/java/io/legado/app/utils/PreferencesExtensions.kt b/app/src/main/java/io/legado/app/utils/PreferencesExtensions.kt index 8c63100d9a0f..9e128e03a111 100644 --- a/app/src/main/java/io/legado/app/utils/PreferencesExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/PreferencesExtensions.kt @@ -8,6 +8,9 @@ import android.content.Context import android.content.ContextWrapper import android.content.SharedPreferences import androidx.core.content.edit +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import splitties.init.appCtx import java.io.File /** @@ -100,4 +103,29 @@ fun SharedPreferences.remove(key: String) { edit { remove(key) } -} \ No newline at end of file +} + +fun LifecycleOwner.observeSharedPreferences( + prefs: SharedPreferences = appCtx.defaultSharedPreferences, + l: SharedPreferences.OnSharedPreferenceChangeListener +) { + val observer = object : DefaultLifecycleObserver { + override fun onCreate(owner: LifecycleOwner) { + prefs.registerOnSharedPreferenceChangeListener(l) + } + + override fun onDestroy(owner: LifecycleOwner) { + prefs.unregisterOnSharedPreferenceChangeListener(l) + lifecycle.removeObserver(this) + } + + override fun onPause(owner: LifecycleOwner) { + prefs.unregisterOnSharedPreferenceChangeListener(l) + } + + override fun onResume(owner: LifecycleOwner) { + prefs.registerOnSharedPreferenceChangeListener(l) + } + } + lifecycle.addObserver(observer) +} diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 8df0f35bf9fb..2b7e7ac72047 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1161,4 +1161,7 @@ 共存版 流式播放音频 即边下边播,网络不好时播放会断断续续,仅TTS源有效 + 来电期间暂停朗读 + 在通话期间暂停朗读,需要读取手机状态权限 + 阅读需要读取手机状态实现来电期间暂停朗读功能 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index c84baa56233b..383be6d32fe0 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1164,4 +1164,7 @@ 共存版 流式播放音频 即边下边播,网络不好时播放会断断续续,仅TTS源有效 + 来电期间暂停朗读 + 在通话期间暂停朗读,需要读取手机状态权限 + 阅读需要读取手机状态实现来电期间暂停朗读功能 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 07acc34d1c2e..db6b9c2a0608 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1164,4 +1164,7 @@ 共存版 流式播放音频 即边下边播,网络不好时播放会断断续续,仅TTS源有效 + 来电期间暂停朗读 + 在通话期间暂停朗读,需要读取手机状态权限 + 阅读需要读取手机状态实现来电期间暂停朗读功能 diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 82813ca7116d..46013746bb12 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1160,4 +1160,7 @@ Còn 共存版 流式播放音频 即边下边播,网络不好时播放会断断续续,仅TTS源有效 + 来电期间暂停朗读 + 在通话期间暂停朗读,需要读取手机状态权限 + 阅读需要读取手机状态实现来电期间暂停朗读功能 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 7649b6315b6e..5c5d6d239765 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1161,4 +1161,7 @@ 共存版 流式播放音频 即边下边播,网络不好时播放会断断续续,仅TTS源有效 + 来电期间暂停朗读 + 在通话期间暂停朗读,需要读取手机状态权限 + 阅读需要读取手机状态实现来电期间暂停朗读功能 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b0d942e2cfa0..9179b975488f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1163,4 +1163,7 @@ 共存版 流式播放音频 即边下边播,网络不好时播放会断断续续,仅TTS源有效 + 来电期间暂停朗读 + 在通话期间暂停朗读,需要读取手机状态权限 + 阅读需要读取手机状态实现来电期间暂停朗读功能 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index e72e677def6c..4dc0bfa78d88 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1163,4 +1163,7 @@ 共存版 流式播放音频 即边下边播,网络不好时播放会断断续续,仅TTS源有效 + 来电期间暂停朗读 + 在通话期间暂停朗读,需要读取手机状态权限 + 阅读需要读取手机状态实现来电期间暂停朗读功能 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2e4e8b22e18b..d8af107611c2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1164,4 +1164,7 @@ 共存版 流式播放音频 即边下边播,网络不好时播放会断断续续,仅TTS源有效 + 来电期间暂停朗读 + 在通话期间暂停朗读,需要读取手机状态权限 + 阅读需要读取手机状态实现来电期间暂停朗读功能 diff --git a/app/src/main/res/xml/pref_config_aloud.xml b/app/src/main/res/xml/pref_config_aloud.xml index 9813aba85c0b..1a636c6cc7fe 100644 --- a/app/src/main/res/xml/pref_config_aloud.xml +++ b/app/src/main/res/xml/pref_config_aloud.xml @@ -14,6 +14,12 @@ android:summary="@string/ignore_audio_focus_summary" android:title="@string/ignore_audio_focus_title" /> + + Date: Fri, 23 Aug 2024 17:44:04 +0800 Subject: [PATCH 034/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/BaseReadAloudService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 9178eecd690e..d1d807aaba54 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -677,4 +677,4 @@ abstract class BaseReadAloudService : BaseService(), } } -} \ No newline at end of file +} From 90e6a44895802490a4d94beced669b171fe88aef Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 23 Aug 2024 18:58:29 +0800 Subject: [PATCH 035/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/BaseReadAloudService.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index d1d807aaba54..f7a91cbf632d 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -170,6 +170,7 @@ abstract class BaseReadAloudService : BaseService(), } observeSharedPreferences { _, key -> when (key) { + PreferKey.ignoreAudioFocus, PreferKey.pauseReadAloudWhilePhoneCalls -> { initPhoneStateListener() } From 7a7cb28813bbdd80767a38176e8c666023028918 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 23 Aug 2024 19:12:31 +0800 Subject: [PATCH 036/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/service/BaseReadAloudService.kt | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index f7a91cbf632d..0b9037c64890 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -117,6 +117,7 @@ abstract class BaseReadAloudService : BaseService(), internal var textChapter: TextChapter? = null internal var pageIndex = 0 private var needResumeOnAudioFocusGain = false + private var needResumeOnCallStateIdle = false private var registeredPhoneStateListener = false private var dsJob: Job? = null private var cover: Bitmap = @@ -662,13 +663,22 @@ abstract class BaseReadAloudService : BaseService(), super.onCallStateChanged(state, phoneNumber) when (state) { TelephonyManager.CALL_STATE_IDLE -> { - AppLog.put("来电结束,继续朗读") - resumeReadAloud() + if (needResumeOnCallStateIdle) { + AppLog.put("来电结束,继续朗读") + resumeReadAloud() + } else { + AppLog.put("来电结束") + } } TelephonyManager.CALL_STATE_RINGING -> { - AppLog.put("来电响铃,暂停朗读") - pauseReadAloud() + if (!pause) { + AppLog.put("来电响铃,暂停朗读") + needResumeOnCallStateIdle = true + pauseReadAloud() + } else { + AppLog.put("来电响铃") + } } TelephonyManager.CALL_STATE_OFFHOOK -> { From 84bcd426445162c973a9a22376859c9b69fd40de Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 24 Aug 2024 15:05:53 +0800 Subject: [PATCH 037/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 11 +- .../java/io/legado/app/model/AudioPlay.kt | 297 +++++++++++++----- .../io/legado/app/service/AudioPlayService.kt | 104 ++---- .../app/ui/book/audio/AudioPlayActivity.kt | 44 +-- .../app/ui/book/audio/AudioPlayViewModel.kt | 64 ++-- .../main/res/layout/activity_audio_play.xml | 58 ++-- app/src/main/res/layout/dialog_wait.xml | 2 +- 7 files changed, 346 insertions(+), 234 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a345be4fd0c8..a55fcc8d01c7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ + @@ -368,12 +369,12 @@ - - + + - - - + + + diff --git a/app/src/main/java/io/legado/app/model/AudioPlay.kt b/app/src/main/java/io/legado/app/model/AudioPlay.kt index 19c03529926b..5c1dbcf17814 100644 --- a/app/src/main/java/io/legado/app/model/AudioPlay.kt +++ b/app/src/main/java/io/legado/app/model/AudioPlay.kt @@ -1,8 +1,9 @@ package io.legado.app.model +import android.annotation.SuppressLint import android.content.Context import android.content.Intent -import androidx.lifecycle.MutableLiveData +import io.legado.app.constant.AppLog import io.legado.app.constant.EventBus import io.legado.app.constant.IntentAction import io.legado.app.constant.Status @@ -12,84 +13,176 @@ import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookSource import io.legado.app.help.book.ContentProcessor import io.legado.app.help.book.getBookSource +import io.legado.app.help.book.readSimulating import io.legado.app.help.book.simulatedTotalChapterNum import io.legado.app.help.coroutine.Coroutine +import io.legado.app.model.webBook.WebBook import io.legado.app.service.AudioPlayService import io.legado.app.utils.postEvent import io.legado.app.utils.startService +import io.legado.app.utils.toastOnUi +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.cancelChildren import splitties.init.appCtx +@SuppressLint("StaticFieldLeak") @Suppress("unused") -object AudioPlay { - var titleData = MutableLiveData() - var coverData = MutableLiveData() +object AudioPlay : CoroutineScope by MainScope() { var status = Status.STOP + private var activityContext: Context? = null + private var serviceContext: Context? = null + private val context: Context get() = activityContext ?: serviceContext ?: appCtx + var callback: CallBack? = null var book: Book? = null + var chapterSize = 0 + var simulatedChapterSize = 0 + var durChapterIndex = 0 + var durChapterPos = 0 var durChapter: BookChapter? = null + var durPlayUrl = "" + var durAudioSize = 0 var inBookshelf = false var bookSource: BookSource? = null val loadingChapters = arrayListOf() - var durChapterIndex = 0 - fun upData(context: Context, book: Book) { + fun upData(book: Book) { AudioPlay.book = book - upDurChapter(book) + chapterSize = appDb.bookChapterDao.getChapterCount(book.bookUrl) + simulatedChapterSize = if (book.readSimulating()) { + book.simulatedTotalChapterNum() + } else { + chapterSize + } if (durChapterIndex != book.durChapterIndex) { durChapterIndex = book.durChapterIndex - playNew(context) + durChapterPos = book.durChapterPos + durPlayUrl = "" + durAudioSize = 0 } + upDurChapter() } - fun resetData(context: Context, book: Book) { - stop(context) + fun resetData(book: Book) { + stop() AudioPlay.book = book - titleData.postValue(book.name) - coverData.postValue(book.getDisplayCover()) + chapterSize = appDb.bookChapterDao.getChapterCount(book.bookUrl) + simulatedChapterSize = if (book.readSimulating()) { + book.simulatedTotalChapterNum() + } else { + chapterSize + } bookSource = book.getBookSource() durChapterIndex = book.durChapterIndex - upDurChapter(book) + durChapterPos = book.durChapterPos + durPlayUrl = "" + durAudioSize = 0 + upDurChapter() + } + + private fun addLoading(index: Int): Boolean { + synchronized(this) { + if (loadingChapters.contains(index)) return false + loadingChapters.add(index) + return true + } + } + + private fun removeLoading(index: Int) { + synchronized(this) { + loadingChapters.remove(index) + } + } + + fun loadOrUpPlayUrl() { + if (durPlayUrl.isEmpty()) { + loadPlayUrl() + } else { + upPlayUrl() + } } /** - * 播放当前章节 + * 加载播放URL */ - fun play(context: Context) { - book?.let { - if (durChapter == null) { - upDurChapter(it) - } - durChapter?.let { - context.startService { - action = IntentAction.play + private fun loadPlayUrl() { + val index = durChapterIndex + if (addLoading(index)) { + val book = book + val bookSource = bookSource + if (book != null && bookSource != null) { + upDurChapter() + val chapter = durChapter + if (chapter == null) { + removeLoading(index) + return } + upLoading(true) + WebBook.getContent(this, bookSource, book, chapter) + .onSuccess { content -> + if (content.isEmpty()) { + appCtx.toastOnUi("未获取到资源链接") + } else { + contentLoadFinish(chapter, content) + } + }.onError { + AppLog.put("获取资源链接出错\n$it", it, true) + }.onFinally { + removeLoading(index) + } + } else { + removeLoading(index) + appCtx.toastOnUi("book or source is null") } } } + /** + * 加载完成 + */ + private fun contentLoadFinish(chapter: BookChapter, content: String) { + if (chapter.index == book?.durChapterIndex) { + durPlayUrl = content + upPlayUrl() + } + } + + private fun upPlayUrl() { + if (isPlayToEnd()) { + playNew() + } else { + play() + } + } + + /** + * 播放当前章节 + */ + fun play() { + context.startService { + action = IntentAction.play + } + } + /** * 从头播放新章节 */ - fun playNew(context: Context) { - book?.let { - if (durChapter == null) { - upDurChapter(it) - } - durChapter?.let { - context.startService { - action = IntentAction.playNew - } - } + private fun playNew() { + context.startService { + action = IntentAction.playNew } } /** * 更新当前章节 */ - fun upDurChapter(book: Book) { - durChapter = appDb.bookChapterDao.getChapter(book.bookUrl, book.durChapterIndex) + fun upDurChapter() { + val book = book ?: return + durChapter = appDb.bookChapterDao.getChapter(book.bookUrl, durChapterIndex) + durAudioSize = durChapter?.end?.toInt() ?: 0 postEvent(EventBus.AUDIO_SUB_TITLE, durChapter?.title ?: "") - postEvent(EventBus.AUDIO_SIZE, durChapter?.end?.toInt() ?: 0) - postEvent(EventBus.AUDIO_PROGRESS, book.durChapterPos) + postEvent(EventBus.AUDIO_SIZE, durAudioSize) + postEvent(EventBus.AUDIO_PROGRESS, durChapterPos) } fun pause(context: Context) { @@ -108,7 +201,7 @@ object AudioPlay { } } - fun stop(context: Context) { + fun stop() { if (AudioPlayService.isRun) { context.startService { action = IntentAction.stop @@ -116,7 +209,7 @@ object AudioPlay { } } - fun adjustSpeed(context: Context, adjust: Float) { + fun adjustSpeed(adjust: Float) { if (AudioPlayService.isRun) { context.startService { action = IntentAction.adjustSpeed @@ -125,7 +218,9 @@ object AudioPlay { } } - fun adjustProgress(context: Context, position: Int) { + fun adjustProgress(position: Int) { + durChapterPos = position + saveRead() if (AudioPlayService.isRun) { context.startService { action = IntentAction.adjustProgress @@ -134,57 +229,47 @@ object AudioPlay { } } - fun skipTo(context: Context, index: Int) { + fun skipTo(index: Int) { Coroutine.async { - book?.let { book -> - book.durChapterIndex = index - book.durChapterPos = 0 - durChapterIndex = book.durChapterIndex - durChapter = null - saveRead() - playNew(context) - } + stop() + durChapterIndex = index + durChapterPos = 0 + durPlayUrl = "" + saveRead() + loadPlayUrl() } } - fun prev(context: Context) { + fun prev() { Coroutine.async { - book?.let { book -> - if (book.durChapterIndex > 0) { - book.durChapterIndex -= 1 - book.durChapterPos = 0 - durChapterIndex = book.durChapterIndex - durChapter = null - saveRead() - play(context) - } else { - stop(context) - } + stop() + if (durChapterIndex > 0) { + durChapterIndex -= 1 + durChapterPos = 0 + durPlayUrl = "" + saveRead() + loadPlayUrl() } } } - fun next(context: Context) { - book?.let { book -> - if (book.durChapterIndex + 1 < book.simulatedTotalChapterNum()) { - book.durChapterIndex += 1 - book.durChapterPos = 0 - durChapterIndex = book.durChapterIndex - durChapter = null - saveRead() - play(context) - } else { - stop(context) - } + fun next() { + stop() + if (durChapterIndex + 1 < simulatedChapterSize) { + durChapterIndex += 1 + durChapterPos = 0 + durPlayUrl = "" + saveRead() + loadPlayUrl() } } fun setTimer(minute: Int) { if (AudioPlayService.isRun) { - val intent = Intent(appCtx, AudioPlayService::class.java) + val intent = Intent(context, AudioPlayService::class.java) intent.action = IntentAction.setTimer intent.putExtra("minute", minute) - appCtx.startService(intent) + context.startService(intent) } else { AudioPlayService.timeMinute = minute postEvent(EventBus.AUDIO_DS, minute) @@ -192,24 +277,28 @@ object AudioPlay { } fun addTimer() { - val intent = Intent(appCtx, AudioPlayService::class.java) + val intent = Intent(context, AudioPlayService::class.java) intent.action = IntentAction.addTimer - appCtx.startService(intent) + context.startService(intent) } fun saveRead() { - book?.let { book -> + val book = book ?: return + Coroutine.async { book.lastCheckCount = 0 book.durChapterTime = System.currentTimeMillis() - Coroutine.async { + val chapterChanged = book.durChapterIndex != durChapterIndex + book.durChapterIndex = durChapterIndex + book.durChapterPos = durChapterPos + if (chapterChanged) { appDb.bookChapterDao.getChapter(book.bookUrl, book.durChapterIndex)?.let { book.durChapterTitle = it.getDisplayTitle( ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(), book.getUseReplaceRule() ) } - book.update() } + book.update() } } @@ -217,11 +306,53 @@ object AudioPlay { * 保存章节长度 */ fun saveDurChapter(audioSize: Long) { + val chapter = durChapter ?: return Coroutine.async { - durChapter?.let { - it.end = audioSize - appDb.bookChapterDao.update(it) - } + durAudioSize = audioSize.toInt() + chapter.end = audioSize + appDb.bookChapterDao.update(chapter) } } + + fun playPositionChanged(position: Int) { + durChapterPos = position + saveRead() + } + + fun upLoading(loading: Boolean) { + callback?.upLoading(loading) + } + + private fun isPlayToEnd(): Boolean { + return durChapterIndex + 1 == simulatedChapterSize + && durChapterPos == durAudioSize + } + + fun register(context: Context) { + activityContext = context + callback = context as CallBack + } + + fun unregister(context: Context) { + if (activityContext === context) { + activityContext = null + callback = null + } + coroutineContext.cancelChildren() + } + + fun registerService(context: Context) { + serviceContext = context + } + + fun unregisterService() { + serviceContext = null + } + + interface CallBack { + + fun upLoading(loading: Boolean) + + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/service/AudioPlayService.kt b/app/src/main/java/io/legado/app/service/AudioPlayService.kt index db07ad1c9e68..32a780e60af1 100644 --- a/app/src/main/java/io/legado/app/service/AudioPlayService.kt +++ b/app/src/main/java/io/legado/app/service/AudioPlayService.kt @@ -29,16 +29,12 @@ import io.legado.app.constant.EventBus import io.legado.app.constant.IntentAction import io.legado.app.constant.NotificationId import io.legado.app.constant.Status -import io.legado.app.data.appDb -import io.legado.app.data.entities.Book -import io.legado.app.data.entities.BookChapter import io.legado.app.help.MediaHelp import io.legado.app.help.config.AppConfig import io.legado.app.help.exoplayer.ExoPlayerHelper import io.legado.app.help.glide.ImageLoader import io.legado.app.model.AudioPlay import io.legado.app.model.analyzeRule.AnalyzeUrl -import io.legado.app.model.webBook.WebBook import io.legado.app.receiver.MediaButtonReceiver import io.legado.app.ui.book.audio.AudioPlayActivity import io.legado.app.utils.activityPendingIntent @@ -122,6 +118,7 @@ class AudioPlayService : BaseService(), super.onCreate() isRun = true exoPlayer.addListener(this) + AudioPlay.registerService(this) initMediaSession() initBroadcastReceiver() upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PLAYING) @@ -147,7 +144,8 @@ class AudioPlayService : BaseService(), upPlayProgressJob?.cancel() pause = false position = AudioPlay.book?.durChapterPos ?: 0 - loadContent() + url = AudioPlay.durPlayUrl + play() } IntentAction.playNew -> { @@ -155,13 +153,14 @@ class AudioPlayService : BaseService(), upPlayProgressJob?.cancel() pause = false position = 0 - loadContent() + url = AudioPlay.durPlayUrl + play() } IntentAction.pause -> pause() IntentAction.resume -> resume() - IntentAction.prev -> AudioPlay.prev(this) - IntentAction.next -> AudioPlay.next(this) + IntentAction.prev -> AudioPlay.prev() + IntentAction.next -> AudioPlay.next() IntentAction.adjustSpeed -> upSpeed(intent.getFloatExtra("adjust", 1f)) IntentAction.addTimer -> addTimer() IntentAction.setTimer -> setTimer(intent.getIntExtra("minute", 0)) @@ -189,6 +188,7 @@ class AudioPlayService : BaseService(), upMediaSessionPlaybackState(PlaybackStateCompat.STATE_STOPPED) AudioPlay.status = Status.STOP postEvent(EventBus.AUDIO_STATE, Status.STOP) + AudioPlay.unregisterService() } /** @@ -216,6 +216,7 @@ class AudioPlayService : BaseService(), ) exoPlayer.setMediaItem(analyzeUrl.getMediaItem()) exoPlayer.playWhenReady = true + exoPlayer.seekTo(position.toLong()) exoPlayer.prepare() }.onError { AppLog.put("播放出错\n${it.localizedMessage}", it) @@ -261,7 +262,7 @@ class AudioPlayService : BaseService(), try { pause = false if (url.isEmpty()) { - loadContent() + AudioPlay.loadOrUpPlayUrl() return } if (!exoPlayer.isPlaying) { @@ -317,9 +318,7 @@ class AudioPlayService : BaseService(), Player.STATE_READY -> { // 准备好 - if (exoPlayer.currentPosition != position.toLong()) { - exoPlayer.seekTo(position.toLong()) - } + AudioPlay.upLoading(false) if (exoPlayer.playWhenReady) { AudioPlay.status = Status.PLAY postEvent(EventBus.AUDIO_STATE, Status.PLAY) @@ -336,7 +335,8 @@ class AudioPlayService : BaseService(), Player.STATE_ENDED -> { // 结束 upPlayProgressJob?.cancel() - AudioPlay.next(this) + AudioPlay.playPositionChanged(exoPlayer.duration.toInt()) + AudioPlay.next() } } upAudioPlayNotification() @@ -395,7 +395,7 @@ class AudioPlayService : BaseService(), timeMinute-- } if (timeMinute == 0) { - AudioPlay.stop(this@AudioPlayService) + AudioPlay.stop() } } postEvent(EventBus.AUDIO_DS, timeMinute) @@ -411,81 +411,16 @@ class AudioPlayService : BaseService(), upPlayProgressJob?.cancel() upPlayProgressJob = lifecycleScope.launch { while (isActive) { - AudioPlay.book?.let { - //更新buffer位置 - postEvent(EventBus.AUDIO_BUFFER_PROGRESS, exoPlayer.bufferedPosition.toInt()) - it.durChapterPos = exoPlayer.currentPosition.toInt() - postEvent(EventBus.AUDIO_PROGRESS, it.durChapterPos) - upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PLAYING) - saveProgress(it) - } + //更新buffer位置 + AudioPlay.playPositionChanged(exoPlayer.currentPosition.toInt()) + postEvent(EventBus.AUDIO_BUFFER_PROGRESS, exoPlayer.bufferedPosition.toInt()) + postEvent(EventBus.AUDIO_PROGRESS, AudioPlay.durChapterPos) + upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PLAYING) delay(1000) } } } - /** - * 加载播放URL - */ - private fun loadContent() = with(AudioPlay) { - durChapter?.let { chapter -> - if (addLoading(chapter.index)) { - val book = AudioPlay.book - val bookSource = AudioPlay.bookSource - if (book != null && bookSource != null) { - WebBook.getContent(lifecycleScope, bookSource, book, chapter) - .onSuccess { content -> - if (content.isEmpty()) { - toastOnUi("未获取到资源链接") - } else { - contentLoadFinish(chapter, content) - } - }.onError { - contentLoadFinish(chapter, it.localizedMessage ?: toString()) - }.onFinally { - removeLoading(chapter.index) - } - } else { - removeLoading(chapter.index) - toastOnUi("book or source is null") - } - } - } - } - - private fun addLoading(index: Int): Boolean { - synchronized(this) { - if (AudioPlay.loadingChapters.contains(index)) return false - AudioPlay.loadingChapters.add(index) - return true - } - } - - private fun removeLoading(index: Int) { - synchronized(this) { - AudioPlay.loadingChapters.remove(index) - } - } - - /** - * 加载完成 - */ - private fun contentLoadFinish(chapter: BookChapter, content: String) { - if (chapter.index == AudioPlay.book?.durChapterIndex) { - url = content - play() - } - } - - /** - * 保存播放进度 - */ - private fun saveProgress(book: Book) { - execute { - appDb.bookDao.upProgress(book.bookUrl, book.durChapterPos) - } - } - /** * 更新媒体状态 */ @@ -584,7 +519,6 @@ class AudioPlayService : BaseService(), AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> { AppLog.put("音频焦点暂时丢失并会很快再次获得,暂停播放") - needResumeOnAudioFocusGain = true if (!pause) { needResumeOnAudioFocusGain = true pause(false) diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt index d324afcf7197..bd21808f1329 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt @@ -24,7 +24,6 @@ import io.legado.app.data.entities.BookSource import io.legado.app.databinding.ActivityAudioPlayBinding import io.legado.app.help.book.isAudio import io.legado.app.help.book.removeType -import io.legado.app.help.book.simulatedTotalChapterNum import io.legado.app.help.config.AppConfig import io.legado.app.lib.dialogs.alert import io.legado.app.model.AudioPlay @@ -59,7 +58,8 @@ import java.util.Locale @SuppressLint("ObsoleteSdkInt") class AudioPlayActivity : VMBaseActivity(toolBarTheme = Theme.Dark), - ChangeBookSourceDialog.CallBack { + ChangeBookSourceDialog.CallBack, + AudioPlay.CallBack { override val binding by viewBinding(ActivityAudioPlayBinding::inflate) override val viewModel by viewModels() @@ -78,7 +78,7 @@ class AudioPlayActivity : if (it.first != AudioPlay.book?.durChapterIndex || it.second == 0 ) { - AudioPlay.skipTo(this, it.first) + AudioPlay.skipTo(it.first) } } } @@ -91,10 +91,11 @@ class AudioPlayActivity : override fun onActivityCreated(savedInstanceState: Bundle?) { binding.titleBar.setBackgroundResource(R.color.transparent) - AudioPlay.titleData.observe(this) { + AudioPlay.register(this) + viewModel.titleData.observe(this) { binding.titleBar.title = it } - AudioPlay.coverData.observe(this) { + viewModel.coverData.observe(this) { upCover(it) } viewModel.initData(intent) @@ -143,13 +144,13 @@ class AudioPlayActivity : playButton() } binding.fabPlayStop.onLongClick { - AudioPlay.stop(this@AudioPlayActivity) + AudioPlay.stop() } binding.ivSkipNext.setOnClickListener { - AudioPlay.next(this@AudioPlayActivity) + AudioPlay.next() } binding.ivSkipPrevious.setOnClickListener { - AudioPlay.prev(this@AudioPlayActivity) + AudioPlay.prev() } binding.playerProgress.setOnSeekBarChangeListener(object : SeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { @@ -162,7 +163,7 @@ class AudioPlayActivity : override fun onStopTrackingTouch(seekBar: SeekBar) { adjustProgress = false - AudioPlay.adjustProgress(this@AudioPlayActivity, seekBar.progress) + AudioPlay.adjustProgress(seekBar.progress) } }) binding.ivChapter.setOnClickListener { @@ -175,10 +176,10 @@ class AudioPlayActivity : binding.ivFastForward.invisible() } binding.ivFastForward.setOnClickListener { - AudioPlay.adjustSpeed(this@AudioPlayActivity, 0.1f) + AudioPlay.adjustSpeed(0.1f) } binding.ivFastRewind.setOnClickListener { - AudioPlay.adjustSpeed(this@AudioPlayActivity, -0.1f) + AudioPlay.adjustSpeed(-0.1f) } binding.ivTimer.setOnClickListener { timerSliderPopup.showAsDropDown(it, 0, (-100).dpToPx(), Gravity.TOP) @@ -196,7 +197,7 @@ class AudioPlayActivity : when (AudioPlay.status) { Status.PLAY -> AudioPlay.pause(this) Status.PAUSE -> AudioPlay.resume(this) - else -> AudioPlay.play(this) + else -> AudioPlay.loadOrUpPlayUrl() } } @@ -207,7 +208,7 @@ class AudioPlayActivity : if (book.isAudio) { viewModel.changeTo(source, book, toc) } else { - AudioPlay.stop(this) + AudioPlay.stop() lifecycleScope.launch { withContext(IO) { AudioPlay.book?.migrateTo(book, toc) @@ -247,8 +248,9 @@ class AudioPlayActivity : override fun onDestroy() { super.onDestroy() if (AudioPlay.status != Status.PLAY) { - AudioPlay.stop(this) + AudioPlay.stop() } + AudioPlay.unregister(this) } @SuppressLint("SetTextI18n") @@ -268,11 +270,9 @@ class AudioPlayActivity : } observeEventSticky(EventBus.AUDIO_SUB_TITLE) { binding.tvSubTitle.text = it - AudioPlay.book?.let { book -> - binding.ivSkipPrevious.isEnabled = book.durChapterIndex > 0 - binding.ivSkipNext.isEnabled = - book.durChapterIndex < book.simulatedTotalChapterNum() - 1 - } + binding.ivSkipPrevious.isEnabled = AudioPlay.durChapterIndex > 0 + binding.ivSkipNext.isEnabled = + AudioPlay.durChapterIndex < AudioPlay.simulatedChapterSize - 1 } observeEventSticky(EventBus.AUDIO_SIZE) { binding.playerProgress.max = it @@ -296,4 +296,10 @@ class AudioPlayActivity : } } + override fun upLoading(loading: Boolean) { + runOnUiThread { + binding.progressLoading.visible(loading) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt index b2b6d60a9be0..a8543890688f 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayViewModel.kt @@ -2,9 +2,10 @@ package io.legado.app.ui.book.audio import android.app.Application import android.content.Intent -import androidx.lifecycle.viewModelScope +import androidx.lifecycle.MutableLiveData import io.legado.app.R import io.legado.app.base.BaseViewModel +import io.legado.app.constant.AppLog import io.legado.app.constant.BookType import io.legado.app.constant.EventBus import io.legado.app.data.appDb @@ -13,14 +14,15 @@ import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookSource import io.legado.app.help.book.getBookSource import io.legado.app.help.book.removeType +import io.legado.app.help.book.simulatedTotalChapterNum import io.legado.app.model.AudioPlay -import io.legado.app.model.AudioPlay.durChapter import io.legado.app.model.webBook.WebBook import io.legado.app.utils.postEvent import io.legado.app.utils.toastOnUi -import kotlinx.coroutines.Dispatchers.IO class AudioPlayViewModel(application: Application) : BaseViewModel(application) { + val titleData = MutableLiveData() + val coverData = MutableLiveData() fun initData(intent: Intent) = AudioPlay.apply { execute { @@ -33,37 +35,53 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application) } } - private fun initBook(book: Book) { + private suspend fun initBook(book: Book) { val isSameBook = AudioPlay.book?.bookUrl == book.bookUrl if (isSameBook) { - AudioPlay.upData(context, book) + AudioPlay.upData(book) } else { - AudioPlay.resetData(context, book) + AudioPlay.resetData(book) } - if (durChapter == null) { - if (book.tocUrl.isEmpty()) { - loadBookInfo(book) - } else { - loadChapterList(book) - } + titleData.postValue(book.name) + coverData.postValue(book.getDisplayCover()) + if (book.tocUrl.isEmpty() && !loadBookInfo(book)) { + return + } + if (AudioPlay.chapterSize == 0 && !loadChapterList(book)) { + return } } - private fun loadBookInfo(book: Book) { - val bookSource = AudioPlay.bookSource ?: return - WebBook.getBookInfo(viewModelScope, bookSource, book).onSuccess(IO) { - loadChapterList(book) + private suspend fun loadBookInfo(book: Book): Boolean { + val bookSource = AudioPlay.bookSource ?: return true + try { + WebBook.getBookInfoAwait(bookSource, book) + return true + } catch (e: Exception) { + AppLog.put("详情页出错: ${e.localizedMessage}", e, true) + return false } } - private fun loadChapterList(book: Book) { - val bookSource = AudioPlay.bookSource ?: return - WebBook.getChapterList(viewModelScope, bookSource, book).onSuccess(IO) { cList -> - book.save() + private suspend fun loadChapterList(book: Book): Boolean { + val bookSource = AudioPlay.bookSource ?: return true + try { + val oldBook = book.copy() + val cList = WebBook.getChapterListAwait(bookSource, book).getOrThrow() + if (oldBook.bookUrl == book.bookUrl) { + appDb.bookDao.update(book) + } else { + appDb.bookDao.insert(book) + } + appDb.bookChapterDao.delByBook(book.bookUrl) appDb.bookChapterDao.insert(*cList.toTypedArray()) - AudioPlay.upDurChapter(book) - }.onError { + AudioPlay.chapterSize = cList.size + AudioPlay.simulatedChapterSize = book.simulatedTotalChapterNum() + AudioPlay.upDurChapter() + return true + } catch (e: Exception) { context.toastOnUi(R.string.error_load_toc) + return false } } @@ -83,7 +101,7 @@ class AudioPlayViewModel(application: Application) : BaseViewModel(application) AudioPlay.book = book AudioPlay.bookSource = source appDb.bookChapterDao.insert(*toc.toTypedArray()) - AudioPlay.upDurChapter(book) + AudioPlay.upDurChapter() }.onFinally { postEvent(EventBus.SOURCE_CHANGED, book.bookUrl) } diff --git a/app/src/main/res/layout/activity_audio_play.xml b/app/src/main/res/layout/activity_audio_play.xml index 17b4822e2860..7aa5d6f6985a 100644 --- a/app/src/main/res/layout/activity_audio_play.xml +++ b/app/src/main/res/layout/activity_audio_play.xml @@ -130,9 +130,9 @@ android:id="@+id/iv_timer" android:layout_width="46dp" android:layout_height="46dp" - android:padding="5dp" android:background="@drawable/selector_circle_btn_bg" android:contentDescription="@string/set_timer" + android:padding="5dp" android:src="@drawable/ic_timer_black_24dp" app:tint="@color/md_white_1000" tools:ignore="ImageContrastCheck" /> @@ -146,9 +146,9 @@ android:id="@+id/iv_fast_rewind" android:layout_width="46dp" android:layout_height="46dp" - android:padding="5dp" android:background="@drawable/selector_circle_btn_bg" android:contentDescription="@string/skip_previous" + android:padding="5dp" android:src="@drawable/ic_fast_rewind" app:tint="@color/md_white_1000" tools:ignore="ImageContrastCheck" /> @@ -162,34 +162,56 @@ android:id="@+id/iv_skip_previous" android:layout_width="46dp" android:layout_height="46dp" - android:padding="5dp" android:background="@drawable/selector_circle_btn_bg" android:contentDescription="@string/skip_previous" + android:padding="5dp" android:src="@drawable/ic_skip_previous" app:tint="@color/md_white_1000" tools:ignore="ImageContrastCheck" /> - + android:layout_height="wrap_content"> + + + + + + @@ -203,9 +225,9 @@ android:id="@+id/iv_fast_forward" android:layout_width="46dp" android:layout_height="46dp" - android:padding="5dp" android:background="@drawable/selector_circle_btn_bg" android:contentDescription="@string/skip_next" + android:padding="5dp" android:src="@drawable/ic_fast_forward" app:tint="@color/md_white_1000" tools:ignore="ImageContrastCheck" /> @@ -219,9 +241,9 @@ android:id="@+id/iv_chapter" android:layout_width="46dp" android:layout_height="46dp" - android:padding="5dp" android:background="@drawable/selector_circle_btn_bg" android:contentDescription="@string/chapter_list" + android:padding="5dp" android:src="@drawable/ic_chapter_list" app:tint="@color/md_white_1000" tools:ignore="ImageContrastCheck" /> diff --git a/app/src/main/res/layout/dialog_wait.xml b/app/src/main/res/layout/dialog_wait.xml index bc490a506991..9b7e3009efe0 100644 --- a/app/src/main/res/layout/dialog_wait.xml +++ b/app/src/main/res/layout/dialog_wait.xml @@ -7,7 +7,7 @@ android:padding="20dp" android:orientation="horizontal"> - Date: Sat, 24 Aug 2024 15:21:58 +0800 Subject: [PATCH 038/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/model/AudioPlay.kt | 1 + app/src/main/java/io/legado/app/service/AudioPlayService.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/java/io/legado/app/model/AudioPlay.kt b/app/src/main/java/io/legado/app/model/AudioPlay.kt index 5c1dbcf17814..9ed128047ceb 100644 --- a/app/src/main/java/io/legado/app/model/AudioPlay.kt +++ b/app/src/main/java/io/legado/app/model/AudioPlay.kt @@ -127,6 +127,7 @@ object AudioPlay : CoroutineScope by MainScope() { } }.onError { AppLog.put("获取资源链接出错\n$it", it, true) + upLoading(false) }.onFinally { removeLoading(index) } diff --git a/app/src/main/java/io/legado/app/service/AudioPlayService.kt b/app/src/main/java/io/legado/app/service/AudioPlayService.kt index 32a780e60af1..17520057ddfe 100644 --- a/app/src/main/java/io/legado/app/service/AudioPlayService.kt +++ b/app/src/main/java/io/legado/app/service/AudioPlayService.kt @@ -360,6 +360,7 @@ class AudioPlayService : BaseService(), super.onPlayerError(error) AudioPlay.status = Status.STOP postEvent(EventBus.AUDIO_STATE, Status.STOP) + AudioPlay.upLoading(false) val errorMsg = "音频播放出错\n${error.errorCodeName} ${error.errorCode}" AppLog.put(errorMsg, error) toastOnUi(errorMsg) From 32490260f82bd3214f91027bf0dd2070be408da7 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 24 Aug 2024 20:24:40 +0800 Subject: [PATCH 039/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/book/BookHelp.kt | 2 +- app/src/main/java/io/legado/app/model/AudioPlay.kt | 1 + app/src/main/java/io/legado/app/model/ReadBook.kt | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/help/book/BookHelp.kt b/app/src/main/java/io/legado/app/help/book/BookHelp.kt index 0d57e1ed27dc..32c68db838e6 100644 --- a/app/src/main/java/io/legado/app/help/book/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/book/BookHelp.kt @@ -446,7 +446,7 @@ object BookHelp { newChapterList: List, oldChapterListSize: Int = 0 ): Int { - if (oldDurChapterIndex == 0) return 0 + if (oldDurChapterIndex <= 0) return 0 if (newChapterList.isEmpty()) return oldDurChapterIndex val oldChapterNum = getChapterNum(oldDurChapterName) val oldName = getPureChapterName(oldDurChapterName) diff --git a/app/src/main/java/io/legado/app/model/AudioPlay.kt b/app/src/main/java/io/legado/app/model/AudioPlay.kt index 9ed128047ceb..d28a5ecbb40e 100644 --- a/app/src/main/java/io/legado/app/model/AudioPlay.kt +++ b/app/src/main/java/io/legado/app/model/AudioPlay.kt @@ -78,6 +78,7 @@ object AudioPlay : CoroutineScope by MainScope() { durPlayUrl = "" durAudioSize = 0 upDurChapter() + postEvent(EventBus.AUDIO_BUFFER_PROGRESS, 0) } private fun addLoading(index: Int): Boolean { diff --git a/app/src/main/java/io/legado/app/model/ReadBook.kt b/app/src/main/java/io/legado/app/model/ReadBook.kt index 5433799969fb..1a17e0577b16 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -766,6 +766,7 @@ object ReadBook : CoroutineScope by MainScope() { appDb.bookChapterDao.insert(*cList.toTypedArray()) saveRead() chapterSize = cList.size + simulatedChapterSize = book.simulatedTotalChapterNum() nextTextChapter ?: loadContent(durChapterIndex + 1) } } From caa3a7c6ed825aa4608d321e89c27862a48c3f1c Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 24 Aug 2024 20:31:57 +0800 Subject: [PATCH 040/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index e3767f816ca5..61e990875564 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -265,7 +265,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { ReadBook.upMsg(null) ReadBook.loadContent(resetPageOffset = true) }.onError { - context.toastOnUi("换源失败\n${it.localizedMessage}") + AppLog.put("换源失败\n$it", it, true) ReadBook.upMsg(null) }.onFinally { postEvent(EventBus.SOURCE_CHANGED, book.bookUrl) From e06cc889013113ff2ba4a2cbe20d9ea28ee8968a Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 25 Aug 2024 16:58:51 +0800 Subject: [PATCH 041/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/main/MainViewModel.kt | 7 +++++++ .../main/bookshelf/BaseBookshelfFragment.kt | 15 +++++++++++++- .../bookshelf/style1/books/BooksFragment.kt | 20 ++++++++++++++++--- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt index 33a93e85d72d..fc8d40e0114c 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt @@ -3,6 +3,7 @@ package io.legado.app.ui.main import android.app.Application import androidx.lifecycle.MutableLiveData import androidx.lifecycle.viewModelScope +import androidx.recyclerview.widget.RecyclerView.RecycledViewPool import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppConst import io.legado.app.constant.AppLog @@ -52,6 +53,12 @@ class MainViewModel(application: Application) : BaseViewModel(application) { val onUpBooksLiveData = MutableLiveData() private var upTocJob: Job? = null private var cacheBookJob: Job? = null + val booksListRecycledViewPool = RecycledViewPool().apply { + setMaxRecycledViews(0, 30) + } + val booksGridRecycledViewPool = RecycledViewPool().apply { + setMaxRecycledViews(0, 100) + } override fun onCleared() { super.onCleared() diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt index f371a8706a10..e119eff75294 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BaseBookshelfFragment.kt @@ -28,7 +28,15 @@ import io.legado.app.ui.file.HandleFileContract import io.legado.app.ui.main.MainFragmentInterface import io.legado.app.ui.main.MainViewModel import io.legado.app.ui.widget.dialog.WaitDialog -import io.legado.app.utils.* +import io.legado.app.utils.checkByIndex +import io.legado.app.utils.getCheckedIndex +import io.legado.app.utils.isAbsUrl +import io.legado.app.utils.postEvent +import io.legado.app.utils.readText +import io.legado.app.utils.sendToClip +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.startActivity +import io.legado.app.utils.toastOnUi abstract class BaseBookshelfFragment(layoutId: Int) : VMBaseFragment(layoutId), MainFragmentInterface { @@ -198,6 +206,11 @@ abstract class BaseBookshelfFragment(layoutId: Int) : VMBaseFragment From 96be80aaaf7318725f95084f2b9789372e5bf992 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 25 Aug 2024 17:12:01 +0800 Subject: [PATCH 042/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/model/ReadBook.kt | 9 +++++++++ .../app/ui/book/read/ReadBookActivity.kt | 18 +++++++++--------- .../legado/app/ui/book/read/page/ReadView.kt | 4 ++-- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/ReadBook.kt b/app/src/main/java/io/legado/app/model/ReadBook.kt index 1a17e0577b16..8ec329eb7b48 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -193,6 +193,12 @@ object ReadBook : CoroutineScope by MainScope() { nextTextChapter = null } + fun clearSearchResult() { + curTextChapter?.clearSearchResult() + prevTextChapter?.clearSearchResult() + nextTextChapter?.clearSearchResult() + } + fun uploadProgress() { book?.let { launch(IO) { @@ -230,6 +236,7 @@ object ReadBook : CoroutineScope by MainScope() { hasNextPage = true it.getPage(durPageIndex)?.removePageAloudSpan() durChapterPos = nextPagePos + callBack?.cancelSelect() callBack?.upContent() saveRead(true) } @@ -885,6 +892,8 @@ object ReadBook : CoroutineScope by MainScope() { fun upPageAnim(upRecorder: Boolean = false) fun notifyBookChanged() + + fun cancelSelect() } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 2b9010f26167..7b01da78fbb1 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -852,8 +852,7 @@ class ReadBookActivity : BaseReadBookActivity(), */ override fun onMenuActionFinally() = binding.run { textActionMenu.dismiss() - readView.curPage.cancelSelect() - readView.isTextSelected = false + readView.cancelSelect() } private fun speak(text: String) { @@ -958,7 +957,6 @@ class ReadBookActivity : BaseReadBookActivity(), success: (() -> Unit)? ) { lifecycleScope.launch { - binding.readView.cancelSelect() binding.readView.upContent(relativePosition, resetPageOffset) if (relativePosition == 0) { upSeekBarProgress() @@ -973,7 +971,6 @@ class ReadBookActivity : BaseReadBookActivity(), resetPageOffset: Boolean, success: (() -> Unit)? ) = withContext(Main.immediate) { - binding.readView.cancelSelect() binding.readView.upContent(relativePosition, resetPageOffset) if (relativePosition == 0) { upSeekBarProgress() @@ -994,6 +991,12 @@ class ReadBookActivity : BaseReadBookActivity(), } } + override fun cancelSelect() { + runOnUiThread { + binding.readView.cancelSelect() + } + } + /** * 页面改变 */ @@ -1184,11 +1187,8 @@ class ReadBookActivity : BaseReadBookActivity(), isShowingSearchResult = false binding.searchMenu.invalidate() binding.searchMenu.invisible() - binding.readView.isTextSelected = false - ReadBook.curTextChapter?.clearSearchResult() - ReadBook.prevTextChapter?.clearSearchResult() - ReadBook.nextTextChapter?.clearSearchResult() - binding.readView.curPage.cancelSelect(true) + ReadBook.clearSearchResult() + binding.readView.cancelSelect(true) } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt index b3c5c9000447..9a1c313ee63c 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt @@ -254,9 +254,9 @@ class ReadView(context: Context, attrs: AttributeSet) : return true } - fun cancelSelect() { + fun cancelSelect(clearSearchResult: Boolean = false) { if (isTextSelected) { - curPage.cancelSelect() + curPage.cancelSelect(clearSearchResult) isTextSelected = false } } From d2ce85ad75dbb38adbe17bc928232665f7cbe7c6 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 25 Aug 2024 19:29:18 +0800 Subject: [PATCH 043/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/base/adapter/DiffRecyclerAdapter.kt | 44 ++++++++--------- .../app/base/adapter/RecyclerAdapter.kt | 48 +++++++++---------- .../style1/books/BaseBooksAdapter.kt | 7 +++ .../style1/books/BooksAdapterList.kt | 5 +- 4 files changed, 55 insertions(+), 49 deletions(-) diff --git a/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt b/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt index c66078be93aa..21bf2c6cb549 100644 --- a/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt +++ b/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt @@ -111,11 +111,32 @@ abstract class DiffRecyclerAdapter(protected val context } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemViewHolder { - val holder = ItemViewHolder(getViewBinding(parent)) + return ItemViewHolder(getViewBinding(parent)) + } + + protected abstract fun getViewBinding(parent: ViewGroup): VB + + final override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {} + open fun onCurrentListChanged() { + //可继承 + } + + @Suppress("UNCHECKED_CAST") + final override fun onBindViewHolder( + holder: ItemViewHolder, + position: Int, + payloads: MutableList + ) { @Suppress("UNCHECKED_CAST") registerListener(holder, (holder.binding as VB)) + registerItemListener(holder) + getItem(holder.layoutPosition)?.let { + convert(holder, holder.binding, it, payloads) + } + } + private fun registerItemListener(holder: ItemViewHolder) { if (itemClickListener != null) { holder.itemView.setOnClickListener { getItem(holder.layoutPosition)?.let { @@ -131,27 +152,6 @@ abstract class DiffRecyclerAdapter(protected val context } } } - - return holder - } - - protected abstract fun getViewBinding(parent: ViewGroup): VB - - final override fun onBindViewHolder(holder: ItemViewHolder, position: Int) {} - - open fun onCurrentListChanged() { - //可继承 - } - - @Suppress("UNCHECKED_CAST") - final override fun onBindViewHolder( - holder: ItemViewHolder, - position: Int, - payloads: MutableList - ) { - getItem(holder.layoutPosition)?.let { - convert(holder, (holder.binding as VB), it, payloads) - } } override fun onViewAttachedToWindow(holder: ItemViewHolder) { diff --git a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt index 84424f454d2d..e00e169d29f3 100644 --- a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt +++ b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt @@ -369,28 +369,7 @@ abstract class RecyclerAdapter(protected val context: Co } else -> { - val holder = ItemViewHolder(getViewBinding(parent)) - - @Suppress("UNCHECKED_CAST") - registerListener(holder, (holder.binding as VB)) - - if (itemClickListener != null) { - holder.itemView.setOnClickListener { - getItemByLayoutPosition(holder.layoutPosition)?.let { - itemClickListener?.invoke(holder, it) - } - } - } - - if (itemLongClickListener != null) { - holder.itemView.onLongClick { - getItemByLayoutPosition(holder.layoutPosition)?.let { - itemLongClickListener?.invoke(holder, it) - } - } - } - - holder + ItemViewHolder(getViewBinding(parent)) } } @@ -405,8 +384,29 @@ abstract class RecyclerAdapter(protected val context: Co payloads: MutableList ) { if (!isHeader(holder.layoutPosition) && !isFooter(holder.layoutPosition)) { - getItemByLayoutPosition(holder.layoutPosition)?.let { - convert(holder, (holder.binding as VB), it, payloads) + @Suppress("UNCHECKED_CAST") + registerListener(holder, (holder.binding as VB)) + registerItemListener(holder) + getItemByLayoutPosition(holder.layoutPosition)?.let { item -> + convert(holder, holder.binding, item, payloads) + } + } + } + + private fun registerItemListener(holder: ItemViewHolder) { + if (itemClickListener != null) { + holder.itemView.setOnClickListener { + getItemByLayoutPosition(holder.layoutPosition)?.let { + itemClickListener?.invoke(holder, it) + } + } + } + + if (itemLongClickListener != null) { + holder.itemView.onLongClick { + getItemByLayoutPosition(holder.layoutPosition)?.let { + itemLongClickListener?.invoke(holder, it) + } } } } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt index 92b7065e4c93..fe7ac7ded501 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BaseBooksAdapter.kt @@ -5,6 +5,7 @@ import androidx.core.os.bundleOf import androidx.recyclerview.widget.DiffUtil import androidx.viewbinding.ViewBinding import io.legado.app.base.adapter.DiffRecyclerAdapter +import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.data.entities.Book abstract class BaseBooksAdapter(context: Context) : @@ -65,6 +66,12 @@ abstract class BaseBooksAdapter(context: Context) : } + override fun onViewRecycled(holder: ItemViewHolder) { + super.onViewRecycled(holder) + holder.itemView.setOnClickListener(null) + holder.itemView.setOnLongClickListener(null) + } + fun notification(bookUrl: String) { getItems().forEachIndexed { i, it -> if (it.bookUrl == bookUrl) { diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksAdapterList.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksAdapterList.kt index d19a8f066a94..972f32bdc044 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksAdapterList.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksAdapterList.kt @@ -17,8 +17,7 @@ class BooksAdapterList( context: Context, private val callBack: CallBack, private val lifecycle: Lifecycle -) : - BaseBooksAdapter(context) { +) : BaseBooksAdapter(context) { override fun getViewBinding(parent: ViewGroup): ItemBookshelfListBinding { return ItemBookshelfListBinding.inflate(inflater, parent, false) @@ -105,4 +104,4 @@ class BooksAdapterList( } } } -} \ No newline at end of file +} From 8c989be8819906b18cfdc00872e8b9375b358ff5 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 25 Aug 2024 19:30:07 +0800 Subject: [PATCH 044/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt | 1 - app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt | 1 - 2 files changed, 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt b/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt index 21bf2c6cb549..b80c974f2bdd 100644 --- a/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt +++ b/app/src/main/java/io/legado/app/base/adapter/DiffRecyclerAdapter.kt @@ -128,7 +128,6 @@ abstract class DiffRecyclerAdapter(protected val context position: Int, payloads: MutableList ) { - @Suppress("UNCHECKED_CAST") registerListener(holder, (holder.binding as VB)) registerItemListener(holder) getItem(holder.layoutPosition)?.let { diff --git a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt index e00e169d29f3..12cc150f839c 100644 --- a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt +++ b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt @@ -384,7 +384,6 @@ abstract class RecyclerAdapter(protected val context: Co payloads: MutableList ) { if (!isHeader(holder.layoutPosition) && !isFooter(holder.layoutPosition)) { - @Suppress("UNCHECKED_CAST") registerListener(holder, (holder.binding as VB)) registerItemListener(holder) getItemByLayoutPosition(holder.layoutPosition)?.let { item -> From ed2ab8e2c1b9b4e4475fb93393679dd2e6510cdd Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 25 Aug 2024 22:35:37 +0800 Subject: [PATCH 045/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/read/ReadBookViewModel.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 61e990875564..aefd5514cebb 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -51,6 +51,7 @@ import java.io.File import java.io.FileInputStream import java.io.FileNotFoundException import java.io.FileOutputStream +import kotlin.math.max /** * 阅读界面数据处理 @@ -113,8 +114,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { return } ReadBook.upMsg(null) - if (ReadBook.durChapterIndex > ReadBook.simulatedChapterSize - 1) { - ReadBook.durChapterIndex = ReadBook.simulatedChapterSize - 1 + val maxChapterSize = max(0, ReadBook.simulatedChapterSize - 1) + if (ReadBook.durChapterIndex > maxChapterSize) { + ReadBook.durChapterIndex = maxChapterSize } if (!isSameBook) { ReadBook.loadContent(resetPageOffset = true) From ab519d652bbc86eb86d21238e4b73809c08a6701 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 25 Aug 2024 22:58:54 +0800 Subject: [PATCH 046/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/read/ReadBookViewModel.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index aefd5514cebb..8bba06ceab81 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -51,7 +51,6 @@ import java.io.File import java.io.FileInputStream import java.io.FileNotFoundException import java.io.FileOutputStream -import kotlin.math.max /** * 阅读界面数据处理 @@ -114,8 +113,9 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { return } ReadBook.upMsg(null) - val maxChapterSize = max(0, ReadBook.simulatedChapterSize - 1) - if (ReadBook.durChapterIndex > maxChapterSize) { + val simulatedChapterSize = ReadBook.simulatedChapterSize + val maxChapterSize = simulatedChapterSize - 1 + if (simulatedChapterSize > 0 && ReadBook.durChapterIndex > maxChapterSize) { ReadBook.durChapterIndex = maxChapterSize } if (!isSameBook) { From c52a78ed12bba035cb18cba201a364540d421de1 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Mon, 26 Aug 2024 09:44:13 +0800 Subject: [PATCH 047/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/read/ReadBookViewModel.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index 8bba06ceab81..d57ced82b39a 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -113,10 +113,8 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { return } ReadBook.upMsg(null) - val simulatedChapterSize = ReadBook.simulatedChapterSize - val maxChapterSize = simulatedChapterSize - 1 - if (simulatedChapterSize > 0 && ReadBook.durChapterIndex > maxChapterSize) { - ReadBook.durChapterIndex = maxChapterSize + if (ReadBook.simulatedChapterSize > 0 && ReadBook.durChapterIndex > ReadBook.simulatedChapterSize - 1) { + ReadBook.durChapterIndex = ReadBook.simulatedChapterSize - 1 } if (!isSameBook) { ReadBook.loadContent(resetPageOffset = true) From 384375d13faec8731e6ce17837d400a792221e5e Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Mon, 26 Aug 2024 11:14:15 +0800 Subject: [PATCH 048/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/base/BaseService.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/base/BaseService.kt b/app/src/main/java/io/legado/app/base/BaseService.kt index 5a1dcf4b1749..698a70505db9 100644 --- a/app/src/main/java/io/legado/app/base/BaseService.kt +++ b/app/src/main/java/io/legado/app/base/BaseService.kt @@ -21,6 +21,7 @@ import kotlin.coroutines.CoroutineContext abstract class BaseService : LifecycleService() { private val simpleName = this::class.simpleName.toString() + private var isForeground = false fun execute( scope: CoroutineScope = lifecycleScope, @@ -42,7 +43,10 @@ abstract class BaseService : LifecycleService() { LogUtils.d(simpleName) { "onStartCommand $intent ${intent?.toUri(0)}" } - startForegroundNotification() + if (!isForeground) { + startForegroundNotification() + isForeground = true + } return super.onStartCommand(intent, flags, startId) } From b09f867984ff2e8376af91621ff7293746b01bde Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:49:50 +0800 Subject: [PATCH 049/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/BaseReadBookActivity.kt | 5 +-- .../io/legado/app/ui/book/read/ReadMenu.kt | 40 ++++++++++--------- app/src/main/res/layout/activity_main.xml | 3 +- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt index 612d0981ae6c..048929fe666e 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt @@ -14,7 +14,6 @@ import android.view.WindowManager import android.widget.FrameLayout import androidx.activity.viewModels import androidx.core.view.isVisible -import androidx.lifecycle.lifecycleScope import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.AppConst.charsets @@ -51,8 +50,6 @@ import io.legado.app.utils.setNavigationBarColorAuto import io.legado.app.utils.showDialogFragment import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible -import kotlinx.coroutines.Dispatchers.IO -import kotlinx.coroutines.launch import java.time.LocalDate import java.time.format.DateTimeFormatter @@ -216,7 +213,7 @@ abstract class BaseReadBookActivity : } override fun upNavigationBarColor() { - upNavigationBar() +// upNavigationBar() when { binding.readMenu.isVisible -> super.upNavigationBarColor() bottomDialog > 0 -> super.upNavigationBarColor() diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index 12b169066071..36644c37d004 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -7,7 +7,6 @@ import android.graphics.Color import android.graphics.PorterDuff import android.graphics.drawable.GradientDrawable import android.util.AttributeSet -import android.view.Gravity import android.view.LayoutInflater import android.view.View.OnClickListener import android.view.View.OnLongClickListener @@ -16,6 +15,8 @@ import android.view.animation.Animation import android.widget.FrameLayout import android.widget.SeekBar import androidx.appcompat.widget.PopupMenu +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.isGone import androidx.core.view.isVisible import io.legado.app.R @@ -46,18 +47,13 @@ import io.legado.app.utils.gone import io.legado.app.utils.invisible import io.legado.app.utils.loadAnimation import io.legado.app.utils.modifyBegin -import io.legado.app.utils.navigationBarGravity -import io.legado.app.utils.navigationBarHeight import io.legado.app.utils.openUrl import io.legado.app.utils.putPrefBoolean import io.legado.app.utils.startActivity import io.legado.app.utils.visible import splitties.views.bottomPadding -import splitties.views.leftPadding import splitties.views.onClick import splitties.views.onLongClick -import splitties.views.padding -import splitties.views.rightPadding /** * 阅读界面菜单 @@ -132,20 +128,20 @@ class ReadMenu @JvmOverloads constructor( @SuppressLint("RtlHardcoded") override fun onAnimationEnd(animation: Animation) { - val navigationBarHeight = - if (ReadBookConfig.hideNavigationBar) { - activity?.navigationBarHeight ?: 0 - } else { - 0 - } +// val navigationBarHeight = +// if (ReadBookConfig.hideNavigationBar) { +// activity?.navigationBarHeight ?: 0 +// } else { +// 0 +// } binding.run { vwMenuBg.setOnClickListener { runMenuOut() } - root.padding = 0 - when (activity?.navigationBarGravity) { - Gravity.BOTTOM -> root.bottomPadding = navigationBarHeight - Gravity.LEFT -> root.leftPadding = navigationBarHeight - Gravity.RIGHT -> root.rightPadding = navigationBarHeight - } +// root.padding = 0 +// when (activity?.navigationBarGravity) { +// Gravity.BOTTOM -> root.bottomPadding = navigationBarHeight +// Gravity.LEFT -> root.leftPadding = navigationBarHeight +// Gravity.RIGHT -> root.rightPadding = navigationBarHeight +// } } callBack.upSystemUiVisibility() if (!LocalConfig.readMenuHelpVersionIsLast) { @@ -236,6 +232,14 @@ class ReadMenu @JvmOverloads constructor( titleBarAddition.gone() } upBrightnessVwPos() + /** + * 确保视图不被导航栏遮挡 + */ + ViewCompat.setOnApplyWindowInsetsListener(this@ReadMenu) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) + root.bottomPadding = insets.bottom + windowInsets + } } fun reset() { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 92ac73aee7d4..c73e614832c2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -16,8 +16,9 @@ From 1586c0d01d56050b3058297083e807f9826582f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 09:34:39 +0800 Subject: [PATCH 050/837] Bump androidx.webkit:webkit from 1.10.0 to 1.11.0 (#3912) Bumps androidx.webkit:webkit from 1.10.0 to 1.11.0. --- updated-dependencies: - dependency-name: androidx.webkit:webkit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cd61d548bc53..a5a1036f75d3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -43,7 +43,7 @@ activity = "1.8.2" kotlinxSerialization = "1.6.3" swiperefreshlayout = "1.1.0" viewpager2 = "1.0.0" -webkit = "1.10.0" +webkit = "1.11.0" zxingLite = "3.0.1" From b2c0d708f7bb0e848be37aa7c413f3b4a68ea295 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 09:37:16 +0800 Subject: [PATCH 051/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/dependabot.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 01b57c6da72c..7e3420990aa5 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -28,6 +28,7 @@ updates: schedule: interval: "weekly" registries: "*" + open-pull-requests-limit: 20 # Maintain dependencies for GitHub Actions - package-ecosystem: "github-actions" directory: "/" From 7e6150e4f97ce5f1e346064cd7479b3ccefe4ce4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 09:39:40 +0800 Subject: [PATCH 052/837] Bump coroutines from 1.8.0 to 1.8.1 (#4132) Bumps `coroutines` from 1.8.0 to 1.8.1. Updates `org.jetbrains.kotlinx:kotlinx-coroutines-android` from 1.8.0 to 1.8.1 - [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases) - [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md) - [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.8.0...1.8.1) Updates `org.jetbrains.kotlinx:kotlinx-coroutines-core` from 1.8.0 to 1.8.1 - [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases) - [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md) - [Commits](https://github.com/Kotlin/kotlinx.coroutines/compare/1.8.0...1.8.1) --- updated-dependencies: - dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-android dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.jetbrains.kotlinx:kotlinx-coroutines-core dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a5a1036f75d3..179738a7a342 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -24,7 +24,7 @@ jsonPath = "2.9.0" # 若要升级请确保相关代码不会受此变更影响(如AnalyzeByJSoup.kt、JsoupXpath库等) jsoup = "1.16.2" jsoupxpath = "2.5.3" -coroutines = "1.8.0" +coroutines = "1.8.1" liveeventbus = "1.8.14" markwon = "4.6.2" material = "1.11.0" From cd7c163d64cd68873a1f79a6043e46d5a9badd91 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 09:49:49 +0800 Subject: [PATCH 053/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0fba238e65c2..e0967cb9db8a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,7 +21,7 @@ on: workflow_dispatch: concurrency: - group: "test" + group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: From 6eeb10804146b4d19e84089bd5c12e8b62bc6c5c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 09:59:04 +0800 Subject: [PATCH 054/837] Bump org.aomedia.avif.android:avif from 1.0.1.262e11d to 1.1.1.14d8e3c4 (#4146) Bumps [org.aomedia.avif.android:avif](https://github.com/AOMediaCodec/libavif) from 1.0.1.262e11d to 1.1.1.14d8e3c4. - [Release notes](https://github.com/AOMediaCodec/libavif/releases) - [Changelog](https://github.com/AOMediaCodec/libavif/blob/main/CHANGELOG.md) - [Commits](https://github.com/AOMediaCodec/libavif/commits) --- updated-dependencies: - dependency-name: org.aomedia.avif.android:avif dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 179738a7a342..03ffc76be106 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -115,7 +115,7 @@ glide-compiler = { module = "com.github.bumptech.glide:compiler", version.ref = glide-compose = { module = "com.github.bumptech.glide:compose", version = "1.0.0-beta01" } glide-ksp = { module = "com.github.bumptech.glide:ksp", version.ref = "glide" } glide-avif = { module = "com.github.bumptech.glide:avif-integration", version.ref = "glide" } -avif = { module = "org.aomedia.avif.android:avif", version = "1.0.1.262e11d" } +avif = { module = "org.aomedia.avif.android:avif", version = "1.1.1.14d8e3c4" } glide-svg = { module = "com.github.qoqa:glide-svg", version = "4.0.2" } androidsvg = { module = "com.caverock:androidsvg-aar", version = "1.4" } From 003fed8009cc3425673211da65220672df9e9f16 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 10:58:51 +0800 Subject: [PATCH 055/837] Bump me.zhanghai.android.libarchive:library from 1.0.3 to 1.1.0 (#4144) Bumps [me.zhanghai.android.libarchive:library](https://github.com/zhanghai/libarchive-android) from 1.0.3 to 1.1.0. - [Release notes](https://github.com/zhanghai/libarchive-android/releases) - [Commits](https://github.com/zhanghai/libarchive-android/compare/v1.0.3...v1.1.0) --- updated-dependencies: - dependency-name: me.zhanghai.android.libarchive:library dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 03ffc76be106..988016e0a0e2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,7 +15,7 @@ fragment = "1.6.2" #不要更新版本 hutool = "5.8.22" -libarchive = "1.0.3" +libarchive = "1.1.0" lifecycle = "2.7.0" glide = "4.16.0" gson = "2.10.1" From 681983ca0c43543663d927a65cb42a63ed86f85e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:05:34 +0800 Subject: [PATCH 056/837] Bump com.google.code.gson:gson from 2.10.1 to 2.11.0 (#4151) Bumps [com.google.code.gson:gson](https://github.com/google/gson) from 2.10.1 to 2.11.0. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/main/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.10.1...gson-parent-2.11.0) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 988016e0a0e2..a86525d53d81 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,7 +18,7 @@ hutool = "5.8.22" libarchive = "1.1.0" lifecycle = "2.7.0" glide = "4.16.0" -gson = "2.10.1" +gson = "2.11.0" jsonPath = "2.9.0" # issue #3811,不要更新版本,新版引入了一个破坏性变更(详见https://github.com/jhy/jsoup/pull/2017) # 若要升级请确保相关代码不会受此变更影响(如AnalyzeByJSoup.kt、JsoupXpath库等) From 89ff562233bb2118fdfc3066950813651802f2cb Mon Sep 17 00:00:00 2001 From: Xwite <82232510+Xwite@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:16:28 +0800 Subject: [PATCH 057/837] CI(dependabot.yml): Update Kotlin and KSPtogether use options `groups` to update dependencies `com.google.devtools.ksp` `org.jetbrains.kotlin:*` in a pull request --- .github/dependabot.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 7e3420990aa5..64bd1ff5e23f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -29,6 +29,11 @@ updates: interval: "weekly" registries: "*" open-pull-requests-limit: 20 + groups: + kotlin_KSP: + patterns: + - "org.jetbrains.kotlin:*" + - "com.google.devtools.ksp" # Maintain dependencies for GitHub Actions - package-ecosystem: "github-actions" directory: "/" From a64f4a26e63595c53b6f9aaf9f02d295497e5224 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:19:43 +0800 Subject: [PATCH 058/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a86525d53d81..73d1ffdb5464 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -44,7 +44,7 @@ kotlinxSerialization = "1.6.3" swiperefreshlayout = "1.1.0" viewpager2 = "1.0.0" webkit = "1.11.0" -zxingLite = "3.0.1" +zxingLite = "3.2.0" [libraries] From ac98a619fc1b30eaeb36a1a1184873d3f63afc6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:20:47 +0800 Subject: [PATCH 059/837] Bump androidx.test:runner from 1.5.2 to 1.6.2 (#4141) Bumps androidx.test:runner from 1.5.2 to 1.6.2. --- updated-dependencies: - dependency-name: androidx.test:runner dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 73d1ffdb5464..1a5c79f3abf5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -124,7 +124,7 @@ splitties-activities = { module = "com.louiscad.splitties:splitties-activities", splitties-systemservices = { module = "com.louiscad.splitties:splitties-systemservices", version.ref = "splitties" } splitties-views = { module = "com.louiscad.splitties:splitties-views", version.ref = "splitties" } -androidx-runner = { module = "androidx.test:runner", version = "1.5.2" } +androidx-runner = { module = "androidx.test:runner", version = "1.6.2" } androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshlayout" } androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = "viewpager2" } androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } From bee2632a7f7e29c2224663aae4e2667506c20cd4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:21:06 +0800 Subject: [PATCH 060/837] Bump androidx.annotation:annotation from 1.7.1 to 1.8.2 (#4148) Bumps androidx.annotation:annotation from 1.7.1 to 1.8.2. --- updated-dependencies: - dependency-name: androidx.annotation:annotation dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1a5c79f3abf5..73c0cd608d2d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -53,7 +53,7 @@ activity-activity = { module = "androidx.activity:activity", version.ref = "acti activity-compose = { module = "androidx.activity:activity-compose", version.ref = "activity" } activity-ktx = { module = "androidx.activity:activity-ktx", version.ref = "activity" } -androidx-annotation = { group = "androidx.annotation", name = "annotation", version = "1.7.1" } +androidx-annotation = { group = "androidx.annotation", name = "annotation", version = "1.8.2" } #androidx-annotation-experimental = { group = "androidx.annotation", name = "annotation-experimental", version = "1.3.1" } appcompat-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } From aa786ab9cea0fc03279b62a912ede7dda8490ac6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:23:24 +0800 Subject: [PATCH 061/837] Bump androidx.test.espresso:espresso-core from 3.5.1 to 3.6.1 (#4145) Bumps androidx.test.espresso:espresso-core from 3.5.1 to 3.6.1. --- updated-dependencies: - dependency-name: androidx.test.espresso:espresso-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 73c0cd608d2d..67c70e40e9d1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -63,7 +63,7 @@ androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayo core-core = { module = "androidx.core:core", version.ref = "core" } core-ktx = { module = "androidx.core:core-ktx", version.ref = "core" } -androidx-espresso-core = { module = "androidx.test.espresso:espresso-core", version = "3.5.1" } +androidx-espresso-core = { module = "androidx.test.espresso:espresso-core", version = "3.6.1" } firebase-bom = { module = "com.google.firebase:firebase-bom", version.ref = "firebaseBom" } firebase-analytics = { module = "com.google.firebase:firebase-analytics" } From d7322fb957a69aa9bf94316a6edebadcf144f8aa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:24:53 +0800 Subject: [PATCH 062/837] Bump kotlinxSerialization from 1.6.3 to 1.7.1 (#4134) Bumps `kotlinxSerialization` from 1.6.3 to 1.7.1. Updates `org.jetbrains.kotlinx:kotlinx-serialization-json` from 1.6.3 to 1.7.1 - [Release notes](https://github.com/Kotlin/kotlinx.serialization/releases) - [Changelog](https://github.com/Kotlin/kotlinx.serialization/blob/master/CHANGELOG.md) - [Commits](https://github.com/Kotlin/kotlinx.serialization/compare/v1.6.3...v1.7.1) Updates `org.jetbrains.kotlinx:kotlinx-serialization-protobuf` from 1.6.3 to 1.7.1 - [Release notes](https://github.com/Kotlin/kotlinx.serialization/releases) - [Changelog](https://github.com/Kotlin/kotlinx.serialization/blob/master/CHANGELOG.md) - [Commits](https://github.com/Kotlin/kotlinx.serialization/compare/v1.6.3...v1.7.1) --- updated-dependencies: - dependency-name: org.jetbrains.kotlinx:kotlinx-serialization-json dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.jetbrains.kotlinx:kotlinx-serialization-protobuf dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 67c70e40e9d1..20e0a21e5f3b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -40,7 +40,7 @@ splitties = "3.0.0" rhino = "1.7.15" activity = "1.8.2" -kotlinxSerialization = "1.6.3" +kotlinxSerialization = "1.7.1" swiperefreshlayout = "1.1.0" viewpager2 = "1.0.0" webkit = "1.11.0" From 0906fa26c1091b7e986c076b083e682319b72390 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:26:43 +0800 Subject: [PATCH 063/837] Bump com.android.tools:desugar_jdk_libs_nio from 2.0.4 to 2.1.0 (#4139) Bumps [com.android.tools:desugar_jdk_libs_nio](https://github.com/google/desugar_jdk_libs) from 2.0.4 to 2.1.0. - [Changelog](https://github.com/google/desugar_jdk_libs/blob/master/CHANGELOG.md) - [Commits](https://github.com/google/desugar_jdk_libs/commits) --- updated-dependencies: - dependency-name: com.android.tools:desugar_jdk_libs_nio dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 20e0a21e5f3b..08bf8b311817 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -130,7 +130,7 @@ androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } colorpicker = { module = "com.jaredrummler:colorpicker", version.ref = "colorpicker" } commons-text = { module = "org.apache.commons:commons-text", version.ref = "commonsText" } -desugar = { group = "com.android.tools", name = "desugar_jdk_libs_nio", version = "2.0.4" } +desugar = { group = "com.android.tools", name = "desugar_jdk_libs_nio", version = "2.1.0" } flexbox = { module = "com.google.android.flexbox:flexbox", version.ref = "flexbox" } gson = { module = "com.google.code.gson:gson", version.ref = "gson" } From 7088dd2bdcd1dbb7c7feea6aa2cedd965345dcf8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:28:25 +0800 Subject: [PATCH 064/837] Bump media3 from 1.3.1 to 1.4.0 (#4137) Bumps `media3` from 1.3.1 to 1.4.0. Updates `androidx.media3:media3-datasource-okhttp` from 1.3.1 to 1.4.0 - [Release notes](https://github.com/androidx/media/releases) - [Changelog](https://github.com/androidx/media/blob/release/RELEASENOTES.md) - [Commits](https://github.com/androidx/media/compare/1.3.1...1.4.0) Updates `androidx.media3:media3-exoplayer` from 1.3.1 to 1.4.0 - [Release notes](https://github.com/androidx/media/releases) - [Changelog](https://github.com/androidx/media/blob/release/RELEASENOTES.md) - [Commits](https://github.com/androidx/media/compare/1.3.1...1.4.0) Updates `androidx.media3:media3-session` from 1.3.1 to 1.4.0 - [Release notes](https://github.com/androidx/media/releases) - [Changelog](https://github.com/androidx/media/blob/release/RELEASENOTES.md) - [Commits](https://github.com/androidx/media/compare/1.3.1...1.4.0) --- updated-dependencies: - dependency-name: androidx.media3:media3-datasource-okhttp dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: androidx.media3:media3-exoplayer dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: androidx.media3:media3-session dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 08bf8b311817..90cef6790000 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ liveeventbus = "1.8.14" markwon = "4.6.2" material = "1.11.0" media = "1.7.0" -media3 = "1.3.1" +media3 = "1.4.0" nanoHttpd = "2.3.1" okhttp = "4.12.0" preference = "1.2.1" From 33ad83e07f114c2dbab0bdce08d45325a36e5d62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:41:40 +0800 Subject: [PATCH 065/837] Bump androidx.viewpager2:viewpager2 from 1.0.0 to 1.1.0 (#4156) Bumps androidx.viewpager2:viewpager2 from 1.0.0 to 1.1.0. --- updated-dependencies: - dependency-name: androidx.viewpager2:viewpager2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 90cef6790000..b3ff6b1c1669 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -42,7 +42,7 @@ rhino = "1.7.15" activity = "1.8.2" kotlinxSerialization = "1.7.1" swiperefreshlayout = "1.1.0" -viewpager2 = "1.0.0" +viewpager2 = "1.1.0" webkit = "1.11.0" zxingLite = "3.2.0" From f749c6cd1b870086a2406cb17cc7565325334760 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:42:17 +0800 Subject: [PATCH 066/837] Bump androidx.test.ext:junit from 1.1.5 to 1.2.1 (#4158) Bumps androidx.test.ext:junit from 1.1.5 to 1.2.1. --- updated-dependencies: - dependency-name: androidx.test.ext:junit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b3ff6b1c1669..9252a19ae5e7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -74,7 +74,7 @@ fragment-fragment = { module = "androidx.fragment:fragment", version.ref = "frag fragment-ktx = { module = "androidx.fragment:fragment-ktx", version.ref = "fragment" } fragment-testing = { module = "androidx.fragment:fragment-testing", version.ref = "fragment" } -androidx-junit = { module = "androidx.test.ext:junit", version = "1.1.5" } +androidx-junit = { module = "androidx.test.ext:junit", version = "1.2.1" } hutool-crypto = { module = "cn.hutool:hutool-crypto", version.ref = "hutool" } From 496d7a5a37c67e3301dd264bbb9c0ef96fc233b0 Mon Sep 17 00:00:00 2001 From: Xwite <82232510+Xwite@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:46:26 +0800 Subject: [PATCH 067/837] Update test.yml --- .github/workflows/test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index e0967cb9db8a..cf07fcd856b9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -129,8 +129,7 @@ jobs: - name: Check Build production run: | - cd ${{ github.workspace }}/apk/ - if [ ! -e legado_*.apk ]; then + if [ ! -e "${{ github.workspace }}/apk/legado_*.apk" ]; then echo "Build production not found! Check gradle logs." exit 1 fi From 2d991eae6babcb982dede1a225b74a552af0d209 Mon Sep 17 00:00:00 2001 From: Xwite <82232510+Xwite@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:53:47 +0800 Subject: [PATCH 068/837] Update updateLog.md --- app/src/main/assets/updateLog.md | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index baa145dcfbd3..3c311f18ec50 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,8 @@ * 关注公众号 **[开源阅读]** 菜单•软件下载 提前享受新版本。 * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 +## cronet版本: 128.0.6613.40 + ## **必读** 【温馨提醒】 *更新前一定要做好备份,以免数据丢失!* @@ -13,18 +15,11 @@ * 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源! **2024/02/27** -* 更新cronet: 128.0.6613.40 -* 更新cronet: 127.0.6533.64 -* 更新cronet: 123.0.6312.80 -* 更新cronet: 123.0.6312.40 - * 添加备用URL导出 * 更新书源制作的帮助文档链接 **2024/02/20** * 更新cronet: 121.0.6167.180 - -* 更新cronet: 121.0.6167.164 * 更新 kotlin->1.9.22 ksp->1.0.17 * 界面绘制优化 * Bug修复和其他优化 From 49ff9e32880ae859e9224468d65bce4e596b3146 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 11:57:23 +0800 Subject: [PATCH 069/837] Bump com.google.gms.google-services from 4.4.1 to 4.4.2 (#4149) Bumps com.google.gms.google-services from 4.4.1 to 4.4.2. --- updated-dependencies: - dependency-name: com.google.gms.google-services dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9252a19ae5e7..dd51498c81bb 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -177,7 +177,7 @@ kotlin-sam = { id = "org.jetbrains.kotlin.plugin.sam.with.receiver", version.ref kotlin-lombok = { id = "org.jetbrains.kotlin.plugin.lombok", version.ref = "kotlin" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } -google-services = { id = "com.google.gms.google-services", version = "4.4.1" } +google-services = { id = "com.google.gms.google-services", version = "4.4.2" } ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } room = { id = "androidx.room", version.ref = "room" } From 5a13c3e5a25169867219403c7dccb1cf3ab0b6ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:00:34 +0800 Subject: [PATCH 070/837] Bump com.google.firebase:firebase-bom from 32.8.1 to 33.2.0 (#4153) Bumps com.google.firebase:firebase-bom from 32.8.1 to 33.2.0. --- updated-dependencies: - dependency-name: com.google.firebase:firebase-bom dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index dd51498c81bb..1afb595d9e37 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,7 @@ colorpicker = "1.1.0" commonsText = "1.12.0" constraintlayout = "2.1.4" core = "1.12.0" -firebaseBom = "32.8.1" +firebaseBom = "33.2.0" flexbox = "3.0.0" fragment = "1.6.2" From c884a13c43714cfa7a3bd4f0ad0f27071cd1ce0a Mon Sep 17 00:00:00 2001 From: Xwite <82232510+Xwite@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:05:17 +0800 Subject: [PATCH 071/837] Update cronet.sh --- .github/scripts/cronet.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/scripts/cronet.sh b/.github/scripts/cronet.sh index 35ede5f1e5a8..a9f293d74eac 100644 --- a/.github/scripts/cronet.sh +++ b/.github/scripts/cronet.sh @@ -82,11 +82,11 @@ if version_compare $current_cronet_version $lastest_cronet_version; then sed -i s/CronetMainVersion=.*/CronetMainVersion=$lastest_cronet_main_version/ $path # 更新cronet_proguard_rules.pro sync_proguard_rules - # 添加更新日志 - sed "15a* 更新cronet: $lastest_cronet_version" -i $GITHUB_WORKSPACE/app/src/main/assets/updateLog.md + # 更新cronet版本 + sed -i "s/## cronet版本: .*/## cronet版本: $lastest_cronet_version/" $GITHUB_WORKSPACE/app/src/main/assets/updateLog.md # 生成pull request信息 write_github_env_variable PR_TITLE "Bump cronet from $current_cronet_version to $lastest_cronet_version" write_github_env_variable PR_BODY "Changes in the [Git log](https://chromium.googlesource.com/chromium/src/+log/$current_cronet_version..$lastest_cronet_version)" # 生成cronet flag write_github_env_variable cronet ok -fi \ No newline at end of file +fi From 6cb469efa29379377cd13369389b575cb594c273 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Tue, 27 Aug 2024 12:15:17 +0800 Subject: [PATCH 072/837] Update test.yml --- .github/workflows/test.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cf07fcd856b9..aae1ee7fbea6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -129,7 +129,12 @@ jobs: - name: Check Build production run: | - if [ ! -e "${{ github.workspace }}/apk/legado_*.apk" ]; then + if [ ! -d ${{ github.workspace }}/apk ]; then + echo "Build production not found! Check gradle logs." + exit 1 + fi + cd ${{ github.workspace }}/apk/ + if [ ! -e legado_*.apk ]; then echo "Build production not found! Check gradle logs." exit 1 fi From ac15cd42dcbb4fe6f76ed84d325b2ff9e476322a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:19:26 +0800 Subject: [PATCH 073/837] Bump lifecycle from 2.7.0 to 2.8.4 (#4136) Bumps `lifecycle` from 2.7.0 to 2.8.4. Updates `androidx.lifecycle:lifecycle-common-java8` from 2.7.0 to 2.8.4 Updates `androidx.lifecycle:lifecycle-service` from 2.7.0 to 2.8.4 --- updated-dependencies: - dependency-name: androidx.lifecycle:lifecycle-common-java8 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: androidx.lifecycle:lifecycle-service dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1afb595d9e37..205071aa8340 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -16,7 +16,7 @@ fragment = "1.6.2" hutool = "5.8.22" libarchive = "1.1.0" -lifecycle = "2.7.0" +lifecycle = "2.8.4" glide = "4.16.0" gson = "2.11.0" jsonPath = "2.9.0" From 84ceeb4b7d0fb60bac157635e95127f14bc774d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:24:21 +0800 Subject: [PATCH 074/837] Bump fragment from 1.6.2 to 1.8.2 (#4135) Bumps `fragment` from 1.6.2 to 1.8.2. Updates `androidx.fragment:fragment` from 1.6.2 to 1.8.2 Updates `androidx.fragment:fragment-ktx` from 1.6.2 to 1.8.2 Updates `androidx.fragment:fragment-testing` from 1.6.2 to 1.8.2 --- updated-dependencies: - dependency-name: androidx.fragment:fragment dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: androidx.fragment:fragment-ktx dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: androidx.fragment:fragment-testing dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 205071aa8340..95b8dc9dccec 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,7 +10,7 @@ constraintlayout = "2.1.4" core = "1.12.0" firebaseBom = "33.2.0" flexbox = "3.0.0" -fragment = "1.6.2" +fragment = "1.8.2" #不要更新版本 hutool = "5.8.22" From d867068b05e9e8f50862945f5392f8e55e6a529a Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 12:56:45 +0800 Subject: [PATCH 075/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/read/ReadBookActivity.kt | 6 +++--- .../legado/app/ui/widget/recycler/DragSelectTouchHelper.kt | 5 ++--- .../legado/app/ui/widget/recycler/scroller/FastScroller.kt | 1 + .../java/io/legado/app/ui/widget/seekbar/VerticalSeekBar.kt | 1 + .../legado/app/ui/widget/seekbar/VerticalSeekBarWrapper.kt | 1 + .../app/ui/widget/text/ScrollMultiAutoCompleteTextView.kt | 1 + .../java/io/legado/app/ui/widget/text/ScrollTextView.kt | 1 + gradle/libs.versions.toml | 2 +- 8 files changed, 11 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 7b01da78fbb1..5b66a354a4a3 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -591,9 +591,9 @@ class ReadBookActivity : BaseReadBookActivity(), /** * 按键拦截,显示菜单 */ - override fun dispatchKeyEvent(event: KeyEvent?): Boolean { - val keyCode = event?.keyCode - val action = event?.action + override fun dispatchKeyEvent(event: KeyEvent): Boolean { + val keyCode = event.keyCode + val action = event.action val isDown = action == 0 if (keyCode == KeyEvent.KEYCODE_MENU) { diff --git a/app/src/main/java/io/legado/app/ui/widget/recycler/DragSelectTouchHelper.kt b/app/src/main/java/io/legado/app/ui/widget/recycler/DragSelectTouchHelper.kt index 0443be001f59..185148d0a0a1 100644 --- a/app/src/main/java/io/legado/app/ui/widget/recycler/DragSelectTouchHelper.kt +++ b/app/src/main/java/io/legado/app/ui/widget/recycler/DragSelectTouchHelper.kt @@ -28,8 +28,7 @@ import androidx.recyclerview.widget.RecyclerView.OnItemTouchListener import io.legado.app.BuildConfig import io.legado.app.ui.widget.recycler.DragSelectTouchHelper.AdvanceCallback.Mode import io.legado.app.utils.DebugLog - -import java.util.* +import java.util.Locale import kotlin.math.max import kotlin.math.min @@ -52,7 +51,7 @@ import kotlin.math.min * | | ----------------------------------------------> | | * +-------------------+ +-----------------------+ */ -@Suppress("unused", "MemberVisibilityCanBePrivate") +@Suppress("unused", "MemberVisibilityCanBePrivate", "DEPRECATION") class DragSelectTouchHelper( /** * Developer callback which controls the behavior of DragSelectTouchHelper. diff --git a/app/src/main/java/io/legado/app/ui/widget/recycler/scroller/FastScroller.kt b/app/src/main/java/io/legado/app/ui/widget/recycler/scroller/FastScroller.kt index b789db419b82..897a28103f0f 100644 --- a/app/src/main/java/io/legado/app/ui/widget/recycler/scroller/FastScroller.kt +++ b/app/src/main/java/io/legado/app/ui/widget/recycler/scroller/FastScroller.kt @@ -288,6 +288,7 @@ class FastScroller : LinearLayout { visibility = if (enabled) View.VISIBLE else View.INVISIBLE } + @Suppress("DEPRECATION") @SuppressLint("ClickableViewAccessibility") override fun onTouchEvent(event: MotionEvent): Boolean { when (event.action) { diff --git a/app/src/main/java/io/legado/app/ui/widget/seekbar/VerticalSeekBar.kt b/app/src/main/java/io/legado/app/ui/widget/seekbar/VerticalSeekBar.kt index 49e7b44b6ff5..c9d05cc4605c 100644 --- a/app/src/main/java/io/legado/app/ui/widget/seekbar/VerticalSeekBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/seekbar/VerticalSeekBar.kt @@ -59,6 +59,7 @@ class VerticalSeekBar @JvmOverloads constructor(context: Context, attrs: Attribu if (!isInEditMode) { applyTint(context.accentColor) } + @Suppress("DEPRECATION") ViewCompat.setLayoutDirection(this, ViewCompat.LAYOUT_DIRECTION_LTR) if (attrs != null) { diff --git a/app/src/main/java/io/legado/app/ui/widget/seekbar/VerticalSeekBarWrapper.kt b/app/src/main/java/io/legado/app/ui/widget/seekbar/VerticalSeekBarWrapper.kt index 683953f1a8fc..a22f3a568317 100644 --- a/app/src/main/java/io/legado/app/ui/widget/seekbar/VerticalSeekBarWrapper.kt +++ b/app/src/main/java/io/legado/app/ui/widget/seekbar/VerticalSeekBarWrapper.kt @@ -130,6 +130,7 @@ class VerticalSeekBarWrapper @JvmOverloads constructor( applyViewRotation(width, height) } + @Suppress("DEPRECATION") private fun applyViewRotation(w: Int, h: Int) { val seekBar = childSeekBar diff --git a/app/src/main/java/io/legado/app/ui/widget/text/ScrollMultiAutoCompleteTextView.kt b/app/src/main/java/io/legado/app/ui/widget/text/ScrollMultiAutoCompleteTextView.kt index 59f020edfec2..a9f0e6460368 100644 --- a/app/src/main/java/io/legado/app/ui/widget/text/ScrollMultiAutoCompleteTextView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/text/ScrollMultiAutoCompleteTextView.kt @@ -257,6 +257,7 @@ open class ScrollMultiAutoCompleteTextView @JvmOverloads constructor( } } + @Suppress("DEPRECATION") fun postOnAnimation() { if (mEatRunOnAnimationRequest) { mReSchedulePostAnimationCallback = true diff --git a/app/src/main/java/io/legado/app/ui/widget/text/ScrollTextView.kt b/app/src/main/java/io/legado/app/ui/widget/text/ScrollTextView.kt index cecd86e00552..94814693571f 100644 --- a/app/src/main/java/io/legado/app/ui/widget/text/ScrollTextView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/text/ScrollTextView.kt @@ -258,6 +258,7 @@ class ScrollTextView(context: Context, attrs: AttributeSet?) : } } + @Suppress("DEPRECATION") fun postOnAnimation() { if (mEatRunOnAnimationRequest) { mReSchedulePostAnimationCallback = true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 95b8dc9dccec..e44ee5214be5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -27,7 +27,7 @@ jsoupxpath = "2.5.3" coroutines = "1.8.1" liveeventbus = "1.8.14" markwon = "4.6.2" -material = "1.11.0" +material = "1.12.0" media = "1.7.0" media3 = "1.4.0" nanoHttpd = "2.3.1" From 7e2a89a95a5e07cb7680ea2bd6c1c1b0b5eef006 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 14:41:44 +0800 Subject: [PATCH 076/837] =?UTF-8?q?=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/lib/theme/ThemeStore.kt | 8 +++++++- .../app/ui/config/ThemeConfigFragment.kt | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt b/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt index 0dab3471942a..182d596ce33c 100644 --- a/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt +++ b/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt @@ -10,6 +10,7 @@ import androidx.annotation.ColorInt import androidx.annotation.ColorRes import androidx.core.content.ContextCompat import io.legado.app.utils.ColorUtils +import io.legado.app.utils.LogUtils import splitties.init.appCtx /** @@ -50,6 +51,7 @@ private constructor(private val mContext: Context) : ThemeStoreInterface { } override fun accentColor(@ColorInt color: Int): ThemeStore { + LogUtils.d("ThemeStore", "set accentColor $color") mEditor.putInt(ThemeStorePrefKeys.KEY_ACCENT_COLOR, color) return this } @@ -161,6 +163,7 @@ private constructor(private val mContext: Context) : ThemeStoreInterface { mEditor.putLong(ThemeStorePrefKeys.VALUES_CHANGED, System.currentTimeMillis()) .putBoolean(ThemeStorePrefKeys.IS_CONFIGURED_KEY, true) .apply() + LogUtils.d("ThemeStore", "sharedPreference apply") } companion object : SharedPreferences.OnSharedPreferenceChangeListener { @@ -176,7 +179,10 @@ private constructor(private val mContext: Context) : ThemeStoreInterface { key: String? ) { when (key) { - ThemeStorePrefKeys.KEY_ACCENT_COLOR -> accentColor = accentColor() + ThemeStorePrefKeys.KEY_ACCENT_COLOR -> { + accentColor = accentColor() + LogUtils.d("ThemeStore", "onSharedPreferenceChanged accentColor $accentColor") + } } } diff --git a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt index 7d6f9efa3ca8..aca0f02af592 100644 --- a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt @@ -2,6 +2,7 @@ package io.legado.app.ui.config import android.annotation.SuppressLint import android.content.SharedPreferences +import android.graphics.Color import android.net.Uri import android.os.Build import android.os.Bundle @@ -26,11 +27,15 @@ import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.selector import io.legado.app.lib.prefs.ColorPreference import io.legado.app.lib.prefs.fragment.PreferenceFragment +import io.legado.app.lib.theme.ThemeStore +import io.legado.app.lib.theme.ThemeUtils +import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.widget.number.NumberPickerDialog import io.legado.app.ui.widget.seekbar.SeekBarChangeListener import io.legado.app.utils.ColorUtils import io.legado.app.utils.FileUtils +import io.legado.app.utils.LogUtils import io.legado.app.utils.MD5Utils import io.legado.app.utils.SelectImageContract import io.legado.app.utils.applyTint @@ -100,6 +105,20 @@ class ThemeConfigFragment : PreferenceFragment(), } } } + val defaultValue = ThemeUtils.resolveColor( + requireContext(), + androidx.appcompat.R.attr.colorAccent, + Color.parseColor("#263238") + ) + LogUtils.d("ThemeStore", "-------------") + LogUtils.d("ThemeStore", "accentColor from context $context defaultValue $defaultValue") + LogUtils.d("ThemeStore", "accentColor from context $context value $accentColor") + val v = ThemeStore.accentColor() + LogUtils.d("ThemeStore", "accentColor from appCtx $appCtx value $v") + LogUtils.d("ThemeStore", "context.packageName ${context?.packageName}") + LogUtils.d("ThemeStore", "appCtx.packageName ${appCtx.packageName}") + LogUtils.d("ThemeStore", "context.packageName == appCtx.packageName ${context?.packageName == appCtx.packageName}") + LogUtils.d("ThemeStore", "-------------") } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { From 280d659b5f666c44946990f74f04732715c15646 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 14:57:52 +0800 Subject: [PATCH 077/837] Bump androidx.appcompat:appcompat from 1.6.1 to 1.7.0 (#4147) Bumps androidx.appcompat:appcompat from 1.6.1 to 1.7.0. --- updated-dependencies: - dependency-name: androidx.appcompat:appcompat dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e44ee5214be5..bd646bc998d3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,7 +3,7 @@ kotlin = "1.9.23" ksp = "1.9.23-1.0.20" agp = "8.3.2" -appcompat = "1.6.1" +appcompat = "1.7.0" colorpicker = "1.1.0" commonsText = "1.12.0" constraintlayout = "2.1.4" From 2e7f72eb781fdcc19d81a198640483d35d01d4bf Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:09:34 +0800 Subject: [PATCH 078/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/HttpReadAloudService.kt | 19 +++---------------- .../app/ui/book/read/ReadBookActivity.kt | 2 +- .../app/ui/book/search/SearchActivity.kt | 6 +++--- .../app/utils/ActivityResultContracts.kt | 2 +- gradle/libs.versions.toml | 2 +- 5 files changed, 9 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index ebf240f0f4cd..06de64bfcf4d 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -17,6 +17,7 @@ import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor import androidx.media3.datasource.cache.SimpleCache import androidx.media3.exoplayer.DefaultLoadControl import androidx.media3.exoplayer.ExoPlayer +import androidx.media3.exoplayer.LoadControl.Parameters import androidx.media3.exoplayer.offline.DefaultDownloaderFactory import androidx.media3.exoplayer.offline.DownloadRequest import androidx.media3.exoplayer.offline.Downloader @@ -596,22 +597,8 @@ class HttpReadAloudService : BaseReadAloudService(), } inner class CustomLoadControl : DefaultLoadControl() { - override fun shouldStartPlayback( - timeline: Timeline, - mediaPeriodId: MediaSource.MediaPeriodId, - bufferedDurationUs: Long, - playbackSpeed: Float, - rebuffering: Boolean, - targetLiveOffsetUs: Long - ): Boolean { - return super.shouldStartPlayback( - timeline, - mediaPeriodId, - bufferedDurationUs, - playbackSpeed, - rebuffering, - targetLiveOffsetUs - ) || bufferedPercentage == 100 + override fun shouldStartPlayback(parameters: Parameters): Boolean { + return super.shouldStartPlayback(parameters) || bufferedPercentage == 100 } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 5b66a354a4a3..1b8fb8f75e65 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -292,7 +292,7 @@ class ReadBookActivity : BaseReadBookActivity(), } } - override fun onNewIntent(intent: Intent?) { + override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) if (!ReadBook.inBookshelf) { viewModel.removeFromBookshelf(null) diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt index fa98e7f7b6f5..afa603cb1001 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt @@ -93,9 +93,9 @@ class SearchActivity : VMBaseActivity.launch() { +fun ActivityResultLauncher.launch() { launch(null) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index bd646bc998d3..95f9d56ee3ba 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -39,7 +39,7 @@ room = "2.6.1" splitties = "3.0.0" rhino = "1.7.15" -activity = "1.8.2" +activity = "1.9.1" kotlinxSerialization = "1.7.1" swiperefreshlayout = "1.1.0" viewpager2 = "1.1.0" From 9a8a582735e89dfb049c3917fcad2b8af452f1da Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:20:36 +0800 Subject: [PATCH 079/837] Bump core from 1.12.0 to 1.13.1 (#4152) Bumps `core` from 1.12.0 to 1.13.1. Updates `androidx.core:core` from 1.12.0 to 1.13.1 Updates `androidx.core:core-ktx` from 1.12.0 to 1.13.1 --- updated-dependencies: - dependency-name: androidx.core:core dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: androidx.core:core-ktx dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 95f9d56ee3ba..76a1d4456cb2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,7 +7,7 @@ appcompat = "1.7.0" colorpicker = "1.1.0" commonsText = "1.12.0" constraintlayout = "2.1.4" -core = "1.12.0" +core = "1.13.1" firebaseBom = "33.2.0" flexbox = "3.0.0" fragment = "1.8.2" From 23819c201e962d5e3e5faca285d6b602c7d0d95d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:35:13 +0800 Subject: [PATCH 080/837] Bump the kotlin_ksp group with 12 updates (#4155) Bumps the kotlin_ksp group with 12 updates: | Package | From | To | | --- | --- | --- | | [org.jetbrains.kotlin:kotlin-stdlib](https://github.com/JetBrains/kotlin) | `1.9.23` | `2.0.20` | | [org.jetbrains.kotlin:kotlin-reflect](https://github.com/JetBrains/kotlin) | `1.9.23` | `2.0.20` | | [org.jetbrains.kotlin.android](https://github.com/JetBrains/kotlin) | `1.9.23` | `2.0.20` | | [org.jetbrains.kotlin.jvm](https://github.com/JetBrains/kotlin) | `1.9.23` | `2.0.20` | | [org.jetbrains.kotlin.kapt](https://github.com/JetBrains/kotlin) | `1.9.23` | `2.0.20` | | [org.jetbrains.kotlin.plugin.serialization](https://github.com/JetBrains/kotlin) | `1.9.23` | `2.0.20` | | [org.jetbrains.kotlin.plugin.allopen](https://github.com/JetBrains/kotlin) | `1.9.23` | `2.0.20` | | [org.jetbrains.kotlin.plugin.noarg](https://github.com/JetBrains/kotlin) | `1.9.23` | `2.0.20` | | [org.jetbrains.kotlin.plugin.sam.with.receiver](https://github.com/JetBrains/kotlin) | `1.9.23` | `2.0.20` | | [org.jetbrains.kotlin.plugin.lombok](https://github.com/JetBrains/kotlin) | `1.9.23` | `2.0.20` | | [org.jetbrains.kotlin.plugin.parcelize](https://github.com/JetBrains/kotlin) | `1.9.23` | `2.0.20` | | [com.google.devtools.ksp](https://github.com/google/ksp) | `1.9.23-1.0.20` | `2.0.20-1.0.24` | Updates `org.jetbrains.kotlin:kotlin-stdlib` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `org.jetbrains.kotlin:kotlin-reflect` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `org.jetbrains.kotlin.android` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `org.jetbrains.kotlin.jvm` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `org.jetbrains.kotlin.kapt` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `org.jetbrains.kotlin.plugin.serialization` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `org.jetbrains.kotlin.plugin.allopen` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `org.jetbrains.kotlin.plugin.noarg` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `org.jetbrains.kotlin.plugin.sam.with.receiver` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `org.jetbrains.kotlin.plugin.lombok` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `org.jetbrains.kotlin.plugin.parcelize` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `org.jetbrains.kotlin:kotlin-reflect` from 1.9.23 to 2.0.20 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.9.23...v2.0.20) Updates `com.google.devtools.ksp` from 1.9.23-1.0.20 to 2.0.20-1.0.24 - [Release notes](https://github.com/google/ksp/releases) - [Commits](https://github.com/google/ksp/compare/1.9.23-1.0.20...2.0.20-1.0.24) --- updated-dependencies: - dependency-name: org.jetbrains.kotlin:kotlin-stdlib dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: org.jetbrains.kotlin:kotlin-reflect dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: org.jetbrains.kotlin.android dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: org.jetbrains.kotlin.jvm dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: org.jetbrains.kotlin.kapt dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: org.jetbrains.kotlin.plugin.serialization dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: org.jetbrains.kotlin.plugin.allopen dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: org.jetbrains.kotlin.plugin.noarg dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: org.jetbrains.kotlin.plugin.sam.with.receiver dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: org.jetbrains.kotlin.plugin.lombok dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: org.jetbrains.kotlin.plugin.parcelize dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: org.jetbrains.kotlin:kotlin-reflect dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp - dependency-name: com.google.devtools.ksp dependency-type: direct:production update-type: version-update:semver-major dependency-group: kotlin_ksp ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 76a1d4456cb2..9326268e2b4b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] -kotlin = "1.9.23" -ksp = "1.9.23-1.0.20" +kotlin = "2.0.20" +ksp = "2.0.20-1.0.24" agp = "8.3.2" appcompat = "1.7.0" colorpicker = "1.1.0" From 233a6f01b2dc4c63dd32149f7a3b27f051dd814a Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 15:36:19 +0800 Subject: [PATCH 081/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- gradle/libs.versions.toml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b7251a37d5f6..d6401dcba7fb 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,5 @@ node_modules/ /app/gradle.properties package-lock.json .idea/ - +# Kotlin 2.0 +.kotlin/ diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9326268e2b4b..9d82818b8ecc 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -165,7 +165,7 @@ android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } android-test = { id = "com.android.test", version.ref = "agp" } -androidx-benchmark = { id = "androidx.benchmark", version = "1.2.3" } +androidx-benchmark = { id = "androidx.benchmark", version = "1.3.0" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } From 85e10a72a909af77793f5a84497dedc9e35478ca Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 16:51:59 +0800 Subject: [PATCH 082/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/widget/recycler/ItemTouchCallback.kt | 6 +++--- gradle.properties | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/recycler/ItemTouchCallback.kt b/app/src/main/java/io/legado/app/ui/widget/recycler/ItemTouchCallback.kt index 8c8a0d9079ae..be45df2cf6b0 100644 --- a/app/src/main/java/io/legado/app/ui/widget/recycler/ItemTouchCallback.kt +++ b/app/src/main/java/io/legado/app/ui/widget/recycler/ItemTouchCallback.kt @@ -86,8 +86,8 @@ class ItemTouchCallback(private val callback: Callback) : ItemTouchHelper.Callba srcViewHolder: RecyclerView.ViewHolder, targetViewHolder: RecyclerView.ViewHolder ): Boolean { - val fromPosition: Int = srcViewHolder.adapterPosition - val toPosition: Int = targetViewHolder.adapterPosition + val fromPosition: Int = srcViewHolder.bindingAdapterPosition + val toPosition: Int = targetViewHolder.bindingAdapterPosition if (fromPosition < toPosition) { for (i in fromPosition until toPosition) { callback.swap(i, i + 1) @@ -101,7 +101,7 @@ class ItemTouchCallback(private val callback: Callback) : ItemTouchHelper.Callba } override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { - callback.onSwiped(viewHolder.adapterPosition) + callback.onSwiped(viewHolder.bindingAdapterPosition) } override fun onSelectedChanged(viewHolder: RecyclerView.ViewHolder?, actionState: Int) { diff --git a/gradle.properties b/gradle.properties index 9a6eff3e628e..f66c2cb84463 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,7 +22,6 @@ android.enableJetifier=false # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official kotlin.incremental.useClasspathSnapshot=true -kotlin.experimental.tryK2=true android.enableResourceOptimizations=true # android.enableNewResourceShrinker' is deprecated. # It was removed in version 8.0 of the Android Gradle plugin. From 450b7140015ccf804d8b9d5edd3973dbee2d10f4 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 18:08:47 +0800 Subject: [PATCH 083/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/lib/theme/ThemeStore.kt | 21 ++----------------- .../app/ui/config/ThemeConfigFragment.kt | 19 ----------------- 2 files changed, 2 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt b/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt index 182d596ce33c..ac5bb20efc65 100644 --- a/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt +++ b/app/src/main/java/io/legado/app/lib/theme/ThemeStore.kt @@ -51,7 +51,6 @@ private constructor(private val mContext: Context) : ThemeStoreInterface { } override fun accentColor(@ColorInt color: Int): ThemeStore { - LogUtils.d("ThemeStore", "set accentColor $color") mEditor.putInt(ThemeStorePrefKeys.KEY_ACCENT_COLOR, color) return this } @@ -163,29 +162,13 @@ private constructor(private val mContext: Context) : ThemeStoreInterface { mEditor.putLong(ThemeStorePrefKeys.VALUES_CHANGED, System.currentTimeMillis()) .putBoolean(ThemeStorePrefKeys.IS_CONFIGURED_KEY, true) .apply() - LogUtils.d("ThemeStore", "sharedPreference apply") + accentColor = accentColor() } - companion object : SharedPreferences.OnSharedPreferenceChangeListener { - - init { - prefs(appCtx).registerOnSharedPreferenceChangeListener(this) - } + companion object { var accentColor = accentColor() - override fun onSharedPreferenceChanged( - sharedPreferences: SharedPreferences?, - key: String? - ) { - when (key) { - ThemeStorePrefKeys.KEY_ACCENT_COLOR -> { - accentColor = accentColor() - LogUtils.d("ThemeStore", "onSharedPreferenceChanged accentColor $accentColor") - } - } - } - fun editTheme(context: Context): ThemeStore { return ThemeStore(context) } diff --git a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt index aca0f02af592..7d6f9efa3ca8 100644 --- a/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt +++ b/app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt @@ -2,7 +2,6 @@ package io.legado.app.ui.config import android.annotation.SuppressLint import android.content.SharedPreferences -import android.graphics.Color import android.net.Uri import android.os.Build import android.os.Bundle @@ -27,15 +26,11 @@ import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.selector import io.legado.app.lib.prefs.ColorPreference import io.legado.app.lib.prefs.fragment.PreferenceFragment -import io.legado.app.lib.theme.ThemeStore -import io.legado.app.lib.theme.ThemeUtils -import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.widget.number.NumberPickerDialog import io.legado.app.ui.widget.seekbar.SeekBarChangeListener import io.legado.app.utils.ColorUtils import io.legado.app.utils.FileUtils -import io.legado.app.utils.LogUtils import io.legado.app.utils.MD5Utils import io.legado.app.utils.SelectImageContract import io.legado.app.utils.applyTint @@ -105,20 +100,6 @@ class ThemeConfigFragment : PreferenceFragment(), } } } - val defaultValue = ThemeUtils.resolveColor( - requireContext(), - androidx.appcompat.R.attr.colorAccent, - Color.parseColor("#263238") - ) - LogUtils.d("ThemeStore", "-------------") - LogUtils.d("ThemeStore", "accentColor from context $context defaultValue $defaultValue") - LogUtils.d("ThemeStore", "accentColor from context $context value $accentColor") - val v = ThemeStore.accentColor() - LogUtils.d("ThemeStore", "accentColor from appCtx $appCtx value $v") - LogUtils.d("ThemeStore", "context.packageName ${context?.packageName}") - LogUtils.d("ThemeStore", "appCtx.packageName ${appCtx.packageName}") - LogUtils.d("ThemeStore", "context.packageName == appCtx.packageName ${context?.packageName == appCtx.packageName}") - LogUtils.d("ThemeStore", "-------------") } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { From e76723c99aca31f2d8acb7b794c62d277b1d5d80 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 18:18:31 +0800 Subject: [PATCH 084/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9d82818b8ecc..1340365eeefd 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ kotlin = "2.0.20" ksp = "2.0.20-1.0.24" -agp = "8.3.2" +agp = "8.4.2" appcompat = "1.7.0" colorpicker = "1.1.0" commonsText = "1.12.0" From b6a54509d960be541a333e3585dc0daf592191ba Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 20:09:55 +0800 Subject: [PATCH 085/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/libs.versions.toml | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1340365eeefd..00793c166234 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ kotlin = "2.0.20" ksp = "2.0.20-1.0.24" -agp = "8.4.2" +agp = "8.5.2" appcompat = "1.7.0" colorpicker = "1.1.0" commonsText = "1.12.0" @@ -130,7 +130,7 @@ androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } colorpicker = { module = "com.jaredrummler:colorpicker", version.ref = "colorpicker" } commons-text = { module = "org.apache.commons:commons-text", version.ref = "commonsText" } -desugar = { group = "com.android.tools", name = "desugar_jdk_libs_nio", version = "2.1.0" } +desugar = { group = "com.android.tools", name = "desugar_jdk_libs_nio", version = "2.0.4" } flexbox = { module = "com.google.android.flexbox:flexbox", version.ref = "flexbox" } gson = { module = "com.google.code.gson:gson", version.ref = "gson" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 25c48bceb589..81842b0aeb80 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Mar 11 11:25:37 CST 2024 +#Tue Aug 27 18:19:17 CST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From cc025e3184798e86dd1ba9a55a74d0b622d1d55c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Aug 2024 20:38:37 +0800 Subject: [PATCH 086/837] Bump media3 from 1.4.0 to 1.4.1 (#4159) Bumps `media3` from 1.4.0 to 1.4.1. Updates `androidx.media3:media3-datasource-okhttp` from 1.4.0 to 1.4.1 - [Release notes](https://github.com/androidx/media/releases) - [Changelog](https://github.com/androidx/media/blob/release/RELEASENOTES.md) - [Commits](https://github.com/androidx/media/commits) Updates `androidx.media3:media3-exoplayer` from 1.4.0 to 1.4.1 - [Release notes](https://github.com/androidx/media/releases) - [Changelog](https://github.com/androidx/media/blob/release/RELEASENOTES.md) - [Commits](https://github.com/androidx/media/commits) Updates `androidx.media3:media3-session` from 1.4.0 to 1.4.1 - [Release notes](https://github.com/androidx/media/releases) - [Changelog](https://github.com/androidx/media/blob/release/RELEASENOTES.md) - [Commits](https://github.com/androidx/media/commits) --- updated-dependencies: - dependency-name: androidx.media3:media3-datasource-okhttp dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: androidx.media3:media3-exoplayer dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: androidx.media3:media3-session dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 00793c166234..920cd91038ff 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -29,7 +29,7 @@ liveeventbus = "1.8.14" markwon = "4.6.2" material = "1.12.0" media = "1.7.0" -media3 = "1.4.0" +media3 = "1.4.1" nanoHttpd = "2.3.1" okhttp = "4.12.0" preference = "1.2.1" From 1a7a6f80b4f8ec895e6c9fe4fde2e3f2290a7b0e Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 20:41:53 +0800 Subject: [PATCH 087/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/BaseReadAloudService.kt | 2 ++ .../app/service/HttpReadAloudService.kt | 27 +------------------ gradle/libs.versions.toml | 3 ++- 3 files changed, 5 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 0b9037c64890..1a29ee1fd94a 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -1,3 +1,5 @@ +@file:Suppress("DEPRECATION") + package io.legado.app.service import android.annotation.SuppressLint diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 06de64bfcf4d..871ccef44688 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -15,9 +15,7 @@ import androidx.media3.datasource.cache.CacheDataSink import androidx.media3.datasource.cache.CacheDataSource import androidx.media3.datasource.cache.LeastRecentlyUsedCacheEvictor import androidx.media3.datasource.cache.SimpleCache -import androidx.media3.exoplayer.DefaultLoadControl import androidx.media3.exoplayer.ExoPlayer -import androidx.media3.exoplayer.LoadControl.Parameters import androidx.media3.exoplayer.offline.DefaultDownloaderFactory import androidx.media3.exoplayer.offline.DownloadRequest import androidx.media3.exoplayer.offline.Downloader @@ -49,7 +47,6 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.delay import kotlinx.coroutines.ensureActive -import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.sync.Mutex @@ -70,9 +67,7 @@ import kotlin.coroutines.coroutineContext class HttpReadAloudService : BaseReadAloudService(), Player.Listener { private val exoPlayer: ExoPlayer by lazy { - ExoPlayer.Builder(this) - .setLoadControl(CustomLoadControl()) - .build() + ExoPlayer.Builder(this).build() } private val ttsFolderPath: String by lazy { cacheDir.absolutePath + File.separator + "httpTTS" + File.separator @@ -97,24 +92,10 @@ class HttpReadAloudService : BaseReadAloudService(), private var downloadErrorNo: Int = 0 private var playErrorNo = 0 private val downloadTaskActiveLock = Mutex() - private var bufferedPercentage = 0 override fun onCreate() { super.onCreate() exoPlayer.addListener(this) - initBufferedPercentageUpdate() - } - - private fun initBufferedPercentageUpdate() { - lifecycleScope.launch { - while (isActive) { - bufferedPercentage = exoPlayer.bufferedPercentage - when (exoPlayer.playbackState) { - Player.STATE_BUFFERING -> delay(10) - else -> delay(1000) - } - } - } } override fun onDestroy() { @@ -596,10 +577,4 @@ class HttpReadAloudService : BaseReadAloudService(), } } - inner class CustomLoadControl : DefaultLoadControl() { - override fun shouldStartPlayback(parameters: Parameters): Boolean { - return super.shouldStartPlayback(parameters) || bufferedPercentage == 100 - } - } - } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 920cd91038ff..cff31bbcb74f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -38,6 +38,7 @@ quickChineseTransfer = "0.2.13" room = "2.6.1" splitties = "3.0.0" rhino = "1.7.15" +desugar = "2.0.4" activity = "1.9.1" kotlinxSerialization = "1.7.1" @@ -130,7 +131,7 @@ androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } colorpicker = { module = "com.jaredrummler:colorpicker", version.ref = "colorpicker" } commons-text = { module = "org.apache.commons:commons-text", version.ref = "commonsText" } -desugar = { group = "com.android.tools", name = "desugar_jdk_libs_nio", version = "2.0.4" } +desugar = { group = "com.android.tools", name = "desugar_jdk_libs_nio", version.ref = "desugar" } flexbox = { module = "com.google.android.flexbox:flexbox", version.ref = "flexbox" } gson = { module = "com.google.code.gson:gson", version.ref = "gson" } From 21502d39a809730f72b5f2f4b82a74f0380b9500 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 27 Aug 2024 20:42:34 +0800 Subject: [PATCH 088/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/HttpReadAloudService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 871ccef44688..0afa04853798 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -577,4 +577,4 @@ class HttpReadAloudService : BaseReadAloudService(), } } -} \ No newline at end of file +} From 83445ea071bc640368177cc9ad04188a9af2013c Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Wed, 28 Aug 2024 11:49:57 +0800 Subject: [PATCH 089/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/info/edit/BookInfoEditActivity.kt | 2 +- .../app/ui/book/read/BaseReadBookActivity.kt | 64 ++++++++++--------- .../source/edit/BookSourceEditActivity.kt | 2 +- .../ui/replace/edit/ReplaceEditActivity.kt | 2 +- .../legado/app/ui/rss/read/ReadRssActivity.kt | 2 +- .../rss/source/edit/RssSourceEditActivity.kt | 2 +- .../legado/app/ui/widget/SelectActionBar.kt | 15 ++++- .../res/layout/activity_book_source_edit.xml | 1 - .../main/res/layout/activity_replace_edit.xml | 1 - app/src/main/res/layout/activity_rss_read.xml | 1 - .../res/layout/activity_rss_source_edit.xml | 1 - 11 files changed, 53 insertions(+), 40 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt index 242522a6b5e2..bf6f5c85ad10 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt @@ -32,7 +32,7 @@ import splitties.init.appCtx import java.io.FileOutputStream class BookInfoEditActivity : - VMBaseActivity(fullScreen = false), + VMBaseActivity(), ChangeCoverDialog.CallBack { private val selectCover = registerForActivityResult(SelectImageContract()) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt index 048929fe666e..339c16e206de 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt @@ -5,14 +5,13 @@ import android.app.DatePickerDialog import android.content.pm.ActivityInfo import android.os.Build import android.os.Bundle -import android.view.Gravity import android.view.KeyEvent import android.view.View -import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.WindowInsets import android.view.WindowManager -import android.widget.FrameLayout import androidx.activity.viewModels +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.isVisible import io.legado.app.R import io.legado.app.base.VMBaseActivity @@ -43,8 +42,6 @@ import io.legado.app.utils.find import io.legado.app.utils.getPrefString import io.legado.app.utils.gone import io.legado.app.utils.isTv -import io.legado.app.utils.navigationBarGravity -import io.legado.app.utils.navigationBarHeight import io.legado.app.utils.setLightStatusBar import io.legado.app.utils.setNavigationBarColorAuto import io.legado.app.utils.showDialogFragment @@ -86,6 +83,13 @@ abstract class BaseReadBookActivity : setOrientation() upLayoutInDisplayCutoutMode() super.onCreate(savedInstanceState) + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) + binding.navigationBar.run { + layoutParams = layoutParams.apply { height = insets.bottom } + } + windowInsets + } } override fun onActivityCreated(savedInstanceState: Bundle?) { @@ -213,7 +217,7 @@ abstract class BaseReadBookActivity : } override fun upNavigationBarColor() { -// upNavigationBar() + upNavigationBar() when { binding.readMenu.isVisible -> super.upNavigationBarColor() bottomDialog > 0 -> super.upNavigationBarColor() @@ -226,30 +230,30 @@ abstract class BaseReadBookActivity : private fun upNavigationBar() { binding.navigationBar.run { if (bottomDialog > 0 || binding.readMenu.isVisible) { - val navigationBarHeight = - if (ReadBookConfig.hideNavigationBar) navigationBarHeight else 0 - when (navigationBarGravity) { - Gravity.BOTTOM -> layoutParams = - (layoutParams as FrameLayout.LayoutParams).apply { - height = navigationBarHeight - width = MATCH_PARENT - gravity = Gravity.BOTTOM - } - - Gravity.LEFT -> layoutParams = - (layoutParams as FrameLayout.LayoutParams).apply { - height = MATCH_PARENT - width = navigationBarHeight - gravity = Gravity.LEFT - } - - Gravity.RIGHT -> layoutParams = - (layoutParams as FrameLayout.LayoutParams).apply { - height = MATCH_PARENT - width = navigationBarHeight - gravity = Gravity.RIGHT - } - } +// val navigationBarHeight = +// if (ReadBookConfig.hideNavigationBar) navigationBarHeight else 0 +// when (navigationBarGravity) { +// Gravity.BOTTOM -> layoutParams = +// (layoutParams as FrameLayout.LayoutParams).apply { +// height = navigationBarHeight +// width = MATCH_PARENT +// gravity = Gravity.BOTTOM +// } +// +// Gravity.LEFT -> layoutParams = +// (layoutParams as FrameLayout.LayoutParams).apply { +// height = MATCH_PARENT +// width = navigationBarHeight +// gravity = Gravity.LEFT +// } +// +// Gravity.RIGHT -> layoutParams = +// (layoutParams as FrameLayout.LayoutParams).apply { +// height = MATCH_PARENT +// width = navigationBarHeight +// gravity = Gravity.RIGHT +// } +// } visible() } else { gone() diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt index 091c7cc55c97..415b2fa95640 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt @@ -55,7 +55,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext class BookSourceEditActivity : - VMBaseActivity(false), + VMBaseActivity(), KeyboardToolPop.CallBack, VariableDialog.Callback { diff --git a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt index 5058159e1147..52483085ca0c 100644 --- a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt @@ -23,7 +23,7 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding * 编辑替换规则 */ class ReplaceEditActivity : - VMBaseActivity(false), + VMBaseActivity(), KeyboardToolPop.CallBack { companion object { diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index 0e398b8434e1..162328d1d8a3 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -67,7 +67,7 @@ import java.util.regex.PatternSyntaxException /** * rss阅读界面 */ -class ReadRssActivity : VMBaseActivity(false) { +class ReadRssActivity : VMBaseActivity() { override val binding by viewBinding(ActivityRssReadBinding::inflate) override val viewModel by viewModels() diff --git a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt index 2f0d00e45203..e6cb28584c4a 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt @@ -44,7 +44,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext class RssSourceEditActivity : - VMBaseActivity(false), + VMBaseActivity(), KeyboardToolPop.CallBack, VariableDialog.Callback { diff --git a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt index 34786621c67f..a2b0abfa8793 100644 --- a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt @@ -9,11 +9,19 @@ import android.widget.FrameLayout import androidx.annotation.MenuRes import androidx.annotation.StringRes import androidx.appcompat.widget.PopupMenu +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import io.legado.app.R import io.legado.app.databinding.ViewSelectActionBarBinding -import io.legado.app.lib.theme.* +import io.legado.app.lib.theme.TintHelper +import io.legado.app.lib.theme.accentColor +import io.legado.app.lib.theme.bottomBackground +import io.legado.app.lib.theme.elevation +import io.legado.app.lib.theme.getPrimaryTextColor +import io.legado.app.lib.theme.getSecondaryDisabledTextColor import io.legado.app.utils.ColorUtils import io.legado.app.utils.visible +import splitties.views.bottomPadding @Suppress("unused") @@ -46,6 +54,11 @@ class SelectActionBar @JvmOverloads constructor( binding.btnRevertSelection.setOnClickListener { callBack?.revertSelection() } binding.btnSelectActionMain.setOnClickListener { callBack?.onClickSelectBarMainAction() } binding.ivMenuMore.setOnClickListener { selMenu?.show() } + ViewCompat.setOnApplyWindowInsetsListener(this) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) + binding.root.bottomPadding = insets.bottom + windowInsets + } } } diff --git a/app/src/main/res/layout/activity_book_source_edit.xml b/app/src/main/res/layout/activity_book_source_edit.xml index 3f310efafbbe..5def7e625742 100644 --- a/app/src/main/res/layout/activity_book_source_edit.xml +++ b/app/src/main/res/layout/activity_book_source_edit.xml @@ -10,7 +10,6 @@ android:id="@+id/title_bar" android:layout_width="match_parent" android:layout_height="wrap_content" - app:fitStatusBar="false" app:title="@string/edit_book_source" /> Date: Thu, 29 Aug 2024 09:41:27 +0800 Subject: [PATCH 090/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/BaseReadBookActivity.kt | 7 +++- .../ui/book/read/config/MoreConfigDialog.kt | 2 +- .../legado/app/ui/book/read/page/PageView.kt | 13 +++++-- .../java/io/legado/app/ui/widget/TitleBar.kt | 37 ++++++++++++++----- 4 files changed, 43 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt index 339c16e206de..0e1c7b603443 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/BaseReadBookActivity.kt @@ -279,10 +279,13 @@ abstract class BaseReadBookActivity : * 适配刘海 */ private fun upLayoutInDisplayCutoutMode() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && ReadBookConfig.readBodyToLh) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { window.attributes = window.attributes.apply { - layoutInDisplayCutoutMode = + layoutInDisplayCutoutMode = if (ReadBookConfig.readBodyToLh) { WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES + } else { + WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER + } } } } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt index a008328c325d..3ba1e805732d 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/MoreConfigDialog.kt @@ -112,7 +112,7 @@ class MoreConfigDialog : DialogFragment() { PreferKey.readBodyToLh -> activity?.recreate() PreferKey.hideStatusBar -> { ReadBookConfig.hideStatusBar = getPrefBoolean(PreferKey.hideStatusBar) - postEvent(EventBus.UP_CONFIG, arrayListOf(0)) + postEvent(EventBus.UP_CONFIG, arrayListOf(0, 2)) } PreferKey.hideNavigationBar -> { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt index 59ef446f7a7d..05e07bebd439 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt @@ -5,6 +5,8 @@ import android.content.Context import android.view.LayoutInflater import android.widget.FrameLayout import androidx.core.content.ContextCompat +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.isGone import androidx.core.view.isInvisible import io.legado.app.R @@ -24,8 +26,8 @@ import io.legado.app.utils.activity import io.legado.app.utils.dpToPx import io.legado.app.utils.gone import io.legado.app.utils.setTextIfNotEqual -import io.legado.app.utils.statusBarHeight import splitties.views.backgroundColor +import splitties.views.topPadding import java.util.Date /** @@ -52,7 +54,7 @@ class PageView(context: Context) : FrameLayout(context) { val headerHeight: Int get() { - val h1 = if (ReadBookConfig.hideStatusBar) 0 else context.statusBarHeight + val h1 = if (binding.vwStatusBar.isGone) 0 else binding.vwStatusBar.height val h2 = if (binding.llHeader.isGone) 0 else binding.llHeader.height return h1 + h2 } @@ -60,6 +62,11 @@ class PageView(context: Context) : FrameLayout(context) { init { if (!isInEditMode) { upStyle() + ViewCompat.setOnApplyWindowInsetsListener(this) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars()) + binding.vwStatusBar.topPadding = insets.top + windowInsets + } } } @@ -114,7 +121,7 @@ class PageView(context: Context) : FrameLayout(context) { * 显示状态栏时隐藏header */ fun upStatusBar() = with(binding.vwStatusBar) { - setPadding(paddingLeft, context.statusBarHeight, paddingRight, paddingBottom) +// setPadding(paddingLeft, context.statusBarHeight, paddingRight, paddingBottom) isGone = ReadBookConfig.hideStatusBar || readBookActivity?.isInMultiWindow == true } diff --git a/app/src/main/java/io/legado/app/ui/widget/TitleBar.kt b/app/src/main/java/io/legado/app/ui/widget/TitleBar.kt index bf5126cb217e..72c0cb1a234d 100644 --- a/app/src/main/java/io/legado/app/ui/widget/TitleBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/TitleBar.kt @@ -14,14 +14,16 @@ import androidx.annotation.ColorInt import androidx.annotation.StyleRes import androidx.appcompat.widget.Toolbar import androidx.core.graphics.alpha +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.children import com.google.android.material.appbar.AppBarLayout import io.legado.app.R import io.legado.app.lib.theme.elevation import io.legado.app.lib.theme.primaryColor import io.legado.app.utils.activity -import io.legado.app.utils.navigationBarHeight -import io.legado.app.utils.statusBarHeight +import splitties.views.bottomPadding +import splitties.views.topPadding @Suppress("unused", "MemberVisibilityCanBePrivate") class TitleBar @JvmOverloads constructor( @@ -153,12 +155,25 @@ class TitleBar @JvmOverloads constructor( } if (!isInEditMode) { - if (fitStatusBar) { - setPadding(paddingLeft, context.statusBarHeight, paddingRight, paddingBottom) - } - - if (fitNavigationBar) { - setPadding(paddingLeft, paddingTop, paddingRight, context.navigationBarHeight) +// if (fitStatusBar) { +// setPadding(paddingLeft, context.statusBarHeight, paddingRight, paddingBottom) +// } +// +// if (fitNavigationBar) { +// setPadding(paddingLeft, paddingTop, paddingRight, context.navigationBarHeight) +// } + + if (fitStatusBar || fitNavigationBar) { + ViewCompat.setOnApplyWindowInsetsListener(this) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars()) + if (fitStatusBar) { + topPadding = insets.top + } + if (fitNavigationBar) { + bottomPadding = insets.bottom + } + windowInsets + } } setBackgroundColor(context.primaryColor) @@ -236,8 +251,10 @@ class TitleBar @JvmOverloads constructor( } fun onMultiWindowModeChanged(isInMultiWindowMode: Boolean, fullScreen: Boolean) { - val topPadding = if (!isInMultiWindowMode && fullScreen) context.statusBarHeight else 0 - setPadding(paddingLeft, topPadding, paddingRight, paddingBottom) +// if (fitStatusBar) { +// val topPadding = if (!isInMultiWindowMode && fullScreen) context.statusBarHeight else 0 +// setPadding(paddingLeft, topPadding, paddingRight, paddingBottom) +// } } private fun attachToActivity() { From 65d1667690351f28d59a098c4cddbdd2a69e67ec Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 29 Aug 2024 17:59:43 +0800 Subject: [PATCH 091/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt index a2b0abfa8793..07c1990ea49a 100644 --- a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt @@ -54,9 +54,10 @@ class SelectActionBar @JvmOverloads constructor( binding.btnRevertSelection.setOnClickListener { callBack?.revertSelection() } binding.btnSelectActionMain.setOnClickListener { callBack?.onClickSelectBarMainAction() } binding.ivMenuMore.setOnClickListener { selMenu?.show() } + val initialBottomPadding = binding.root.paddingBottom ViewCompat.setOnApplyWindowInsetsListener(this) { _, windowInsets -> val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) - binding.root.bottomPadding = insets.bottom + binding.root.bottomPadding = initialBottomPadding + insets.bottom windowInsets } } From 0fd3a121b913492f5378c4b3c028356f0c5c3842 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 29 Aug 2024 18:18:29 +0800 Subject: [PATCH 092/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/info/BookInfoActivity.kt | 8 ++++++++ app/src/main/res/layout/activity_book_info.xml | 6 +++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 4420a0fd062a..b770a6048306 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -10,6 +10,8 @@ import android.widget.CheckBox import android.widget.LinearLayout import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import io.legado.app.R import io.legado.app.base.VMBaseActivity @@ -72,6 +74,7 @@ import io.legado.app.utils.visible import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import splitties.views.bottomPadding class BookInfoActivity : VMBaseActivity(toolBarTheme = Theme.Dark), @@ -161,6 +164,11 @@ class BookInfoActivity : viewModel.waitDialogData.observe(this) { upWaitDialogStatus(it) } viewModel.initData(intent) initViewEvent() + ViewCompat.setOnApplyWindowInsetsListener(binding.flAction) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) + binding.flAction.bottomPadding = insets.bottom + windowInsets + } } override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { diff --git a/app/src/main/res/layout/activity_book_info.xml b/app/src/main/res/layout/activity_book_info.xml index e983365d3955..8d6ed54a727b 100644 --- a/app/src/main/res/layout/activity_book_info.xml +++ b/app/src/main/res/layout/activity_book_info.xml @@ -374,7 +374,7 @@ @@ -382,7 +382,7 @@ Date: Thu, 29 Aug 2024 18:30:04 +0800 Subject: [PATCH 093/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/CrashHandler.kt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/CrashHandler.kt b/app/src/main/java/io/legado/app/help/CrashHandler.kt index e13fe1809735..d01b520e07e7 100644 --- a/app/src/main/java/io/legado/app/help/CrashHandler.kt +++ b/app/src/main/java/io/legado/app/help/CrashHandler.kt @@ -141,6 +141,7 @@ class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler { printWriter.close() val result = writer.toString() sb.append(result) + val crashLog = sb.toString() val timestamp = System.currentTimeMillis() val time = format.format(Date()) val fileName = "crash-$time-$timestamp.log" @@ -150,19 +151,19 @@ class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler { val uri = Uri.parse(backupPath) val fileDoc = FileDoc.fromUri(uri, true) fileDoc.createFileIfNotExist(fileName, "crash") - .writeText(sb.toString()) - } catch (e: Exception) { + .writeText(crashLog) + } catch (_: Exception) { + } + kotlin.runCatching { appCtx.externalCacheDir?.let { rootFile -> + val exceedTimeMillis = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7) rootFile.getFile("crash").listFiles()?.forEach { - if (it.lastModified() < System.currentTimeMillis() - TimeUnit.DAYS.toMillis( - 7 - ) - ) { + if (it.lastModified() < exceedTimeMillis) { it.delete() } } FileUtils.createFileIfNotExist(rootFile, "crash", fileName) - .writeText(sb.toString()) + .writeText(crashLog) } } } From 81f12cbd6307ba4846f8e19d4c6807800e581b16 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 29 Aug 2024 18:38:52 +0800 Subject: [PATCH 094/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/audio/AudioPlayActivity.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt index bd21808f1329..9bbf9818631b 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt @@ -10,6 +10,8 @@ import android.view.Menu import android.view.MenuItem import android.widget.SeekBar import androidx.activity.viewModels +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import io.legado.app.R import io.legado.app.base.VMBaseActivity @@ -49,6 +51,7 @@ import io.legado.app.utils.visible import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import splitties.views.bottomPadding import splitties.views.onLongClick import java.util.Locale @@ -184,6 +187,11 @@ class AudioPlayActivity : binding.ivTimer.setOnClickListener { timerSliderPopup.showAsDropDown(it, 0, (-100).dpToPx(), Gravity.TOP) } + ViewCompat.setOnApplyWindowInsetsListener(binding.llPlayMenu) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) + binding.llPlayMenu.bottomPadding = insets.bottom + windowInsets + } } private fun upCover(path: String?) { From 4b1abcd8ba8f6f1b68440f26f7ecc4ef89bc9ea5 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 29 Aug 2024 19:29:17 +0800 Subject: [PATCH 095/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/AudioPlayService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/AudioPlayService.kt b/app/src/main/java/io/legado/app/service/AudioPlayService.kt index 17520057ddfe..ee0f3c361e61 100644 --- a/app/src/main/java/io/legado/app/service/AudioPlayService.kt +++ b/app/src/main/java/io/legado/app/service/AudioPlayService.kt @@ -326,7 +326,7 @@ class AudioPlayService : BaseService(), AudioPlay.status = Status.PAUSE postEvent(EventBus.AUDIO_STATE, Status.PAUSE) } - postEvent(EventBus.AUDIO_SIZE, exoPlayer.duration) + postEvent(EventBus.AUDIO_SIZE, exoPlayer.duration.toInt()) upMediaMetadata() upPlayProgress() AudioPlay.saveDurChapter(exoPlayer.duration) From d627e7452a3fe7e079a558cf95bb812175e7c333 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 29 Aug 2024 22:09:49 +0800 Subject: [PATCH 096/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/help/http/BackstageWebView.kt | 7 +++++-- .../legado/app/ui/book/source/manage/BookSourceActivity.kt | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/http/BackstageWebView.kt b/app/src/main/java/io/legado/app/help/http/BackstageWebView.kt index 49271420452f..1581c7cf2438 100644 --- a/app/src/main/java/io/legado/app/help/http/BackstageWebView.kt +++ b/app/src/main/java/io/legado/app/help/http/BackstageWebView.kt @@ -16,6 +16,7 @@ import io.legado.app.exception.NoStackTraceException import io.legado.app.help.config.AppConfig import io.legado.app.help.coroutine.Coroutine import io.legado.app.utils.runOnUI +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Runnable import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withTimeout @@ -131,8 +132,10 @@ class BackstageWebView( private fun setCookie(url: String) { tag?.let { - val cookie = CookieManager.getInstance().getCookie(url) - CookieStore.setCookie(it, cookie) + Coroutine.async(executeContext = IO) { + val cookie = CookieManager.getInstance().getCookie(url) + CookieStore.setCookie(it, cookie) + } } } diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt index 0741791c2a16..717541aaf4bf 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceActivity.kt @@ -277,6 +277,7 @@ class BookSourceActivity : VMBaseActivity Date: Thu, 29 Aug 2024 22:19:51 +0800 Subject: [PATCH 097/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt index d57ced82b39a..9c863a99c917 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookViewModel.kt @@ -182,6 +182,7 @@ class ReadBookViewModel(application: Application) : BaseViewModel(application) { appDb.bookDao.update(book) ReadBook.chapterSize = it.size ReadBook.simulatedChapterSize = book.simulatedTotalChapterNum() + ReadBook.clearTextChapter() } return true }.onFailure { From 30ec23390acbdb6b7c873d5b4d7bcb5e80ce8e8c Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 30 Aug 2024 17:36:56 +0800 Subject: [PATCH 098/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- .../main/java/io/legado/app/constant/AppConst.kt | 4 ++-- .../java/io/legado/app/constant/IntentAction.kt | 1 + app/src/main/java/io/legado/app/model/AudioPlay.kt | 14 +++++++++++--- .../java/io/legado/app/service/AudioPlayService.kt | 7 +++++++ .../app/ui/association/VerificationCodeDialog.kt | 2 +- .../java/io/legado/app/utils/ActivityExtensions.kt | 13 ++++++++++--- .../app/utils/canvasrecorder/pools/BitmapPool.kt | 2 +- build.gradle | 2 +- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- modules/book/build.gradle | 2 +- modules/rhino/build.gradle | 2 +- 13 files changed, 39 insertions(+), 16 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 2756a90d831c..20e43e999852 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,7 +49,7 @@ android { defaultConfig { applicationId "io.legado.app" minSdk 21 - targetSdk 34 + targetSdk 35 versionCode 10000 + gitCommits versionName version testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/java/io/legado/app/constant/AppConst.kt b/app/src/main/java/io/legado/app/constant/AppConst.kt index 431d867a0216..2b8cbf39507d 100644 --- a/app/src/main/java/io/legado/app/constant/AppConst.kt +++ b/app/src/main/java/io/legado/app/constant/AppConst.kt @@ -64,7 +64,7 @@ object AppConst { @Suppress("DEPRECATION") appCtx.packageManager.getPackageInfo(appCtx.packageName, PackageManager.GET_ACTIVITIES) ?.let { - appInfo.versionName = it.versionName + appInfo.versionName = it.versionName!! appInfo.appVariant = when { it.packageName.contains("releaseA") -> AppVariant.BETA_RELEASEA isBeta -> AppVariant.BETA_RELEASE @@ -86,7 +86,7 @@ object AppConst { private val sha256Signature: String by lazy { val packageInfo = appCtx.packageManager.getPackageInfo(appCtx.packageName, PackageManager.GET_SIGNATURES) - DigestUtil.sha256Hex(packageInfo.signatures[0].toByteArray()).uppercase() + DigestUtil.sha256Hex(packageInfo.signatures!![0].toByteArray()).uppercase() } private val isOfficial = sha256Signature == OFFICIAL_SIGNATURE diff --git a/app/src/main/java/io/legado/app/constant/IntentAction.kt b/app/src/main/java/io/legado/app/constant/IntentAction.kt index 3659eda6bbcc..5a603fa1d521 100644 --- a/app/src/main/java/io/legado/app/constant/IntentAction.kt +++ b/app/src/main/java/io/legado/app/constant/IntentAction.kt @@ -21,4 +21,5 @@ object IntentAction { const val moveTo = "moveTo" const val init = "init" const val remove = "remove" + const val stopPlay = "stopPlay" } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/AudioPlay.kt b/app/src/main/java/io/legado/app/model/AudioPlay.kt index d28a5ecbb40e..e920dd21196b 100644 --- a/app/src/main/java/io/legado/app/model/AudioPlay.kt +++ b/app/src/main/java/io/legado/app/model/AudioPlay.kt @@ -233,7 +233,7 @@ object AudioPlay : CoroutineScope by MainScope() { fun skipTo(index: Int) { Coroutine.async { - stop() + stopPlay() durChapterIndex = index durChapterPos = 0 durPlayUrl = "" @@ -244,7 +244,7 @@ object AudioPlay : CoroutineScope by MainScope() { fun prev() { Coroutine.async { - stop() + stopPlay() if (durChapterIndex > 0) { durChapterIndex -= 1 durChapterPos = 0 @@ -256,7 +256,7 @@ object AudioPlay : CoroutineScope by MainScope() { } fun next() { - stop() + stopPlay() if (durChapterIndex + 1 < simulatedChapterSize) { durChapterIndex += 1 durChapterPos = 0 @@ -284,6 +284,14 @@ object AudioPlay : CoroutineScope by MainScope() { context.startService(intent) } + fun stopPlay() { + if (AudioPlayService.isRun) { + context.startService { + action = IntentAction.stopPlay + } + } + } + fun saveRead() { val book = book ?: return Coroutine.async { diff --git a/app/src/main/java/io/legado/app/service/AudioPlayService.kt b/app/src/main/java/io/legado/app/service/AudioPlayService.kt index ee0f3c361e61..5cbac5d2bb29 100644 --- a/app/src/main/java/io/legado/app/service/AudioPlayService.kt +++ b/app/src/main/java/io/legado/app/service/AudioPlayService.kt @@ -157,6 +157,13 @@ class AudioPlayService : BaseService(), play() } + IntentAction.stopPlay -> { + exoPlayer.stop() + upPlayProgressJob?.cancel() + AudioPlay.status = Status.STOP + postEvent(EventBus.AUDIO_STATE, Status.STOP) + } + IntentAction.pause -> pause() IntentAction.resume -> resume() IntentAction.prev -> AudioPlay.prev() diff --git a/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt b/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt index 335d18a14391..8190841e9441 100644 --- a/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt @@ -103,7 +103,7 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification transition: Transition? ) { view ?: return - val bitmap = resource.copy(resource.config, true) + val bitmap = resource.copy(resource.config ?: Bitmap.Config.ARGB_8888, true) ImageProvider.bitmapLruCache.put(url, bitmap) binding.verificationCodeImageView.setImageBitmap(bitmap) } diff --git a/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt b/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt index f5c722697424..412b9241697b 100644 --- a/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt @@ -6,7 +6,13 @@ import android.graphics.Color import android.os.Build import android.os.Bundle import android.util.DisplayMetrics -import android.view.* +import android.view.Gravity +import android.view.View +import android.view.ViewGroup +import android.view.WindowInsets +import android.view.WindowInsetsController +import android.view.WindowManager +import android.view.WindowMetrics import android.widget.FrameLayout import androidx.annotation.ColorInt import androidx.appcompat.app.AppCompatActivity @@ -54,14 +60,13 @@ val WindowManager.windowSize: DisplayMetrics return displayMetrics } +@Suppress("DEPRECATION") fun Activity.fullScreen() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { window.setDecorFitsSystemWindows(true) } - @Suppress("DEPRECATION") window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LAYOUT_STABLE - @Suppress("DEPRECATION") window.clearFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS or WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION @@ -72,6 +77,7 @@ fun Activity.fullScreen() { /** * 设置状态栏颜色 */ +@Suppress("DEPRECATION") fun Activity.setStatusBarColorAuto( @ColorInt color: Int, isTransparent: Boolean, @@ -124,6 +130,7 @@ fun Activity.setLightStatusBar(isLightBar: Boolean) { /** * 设置导航栏颜色 */ +@Suppress("DEPRECATION") fun Activity.setNavigationBarColorAuto(@ColorInt color: Int) { val isLightBor = ColorUtils.isColorLight(color) window.navigationBarColor = color diff --git a/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/BitmapPool.kt b/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/BitmapPool.kt index a9539035edfa..33d6e3be5f4c 100644 --- a/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/BitmapPool.kt +++ b/app/src/main/java/io/legado/app/utils/canvasrecorder/pools/BitmapPool.kt @@ -82,7 +82,7 @@ object BitmapPool { /** * A helper function to return the byte usage per pixel of a bitmap based on its configuration. */ - private fun getBytesPerPixel(config: Bitmap.Config): Int { + private fun getBytesPerPixel(config: Bitmap.Config?): Int { return when (config) { Bitmap.Config.ARGB_8888 -> 4 Bitmap.Config.RGB_565, Bitmap.Config.ARGB_4444 -> 2 diff --git a/build.gradle b/build.gradle index b9dd69223e25..8b2ec01bfbc3 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ buildscript { ext{ - compile_sdk_version = 34 + compile_sdk_version = 35 build_tool_version = '34.0.0' // kotlin_version = '1.9.22' // ksp_version = "1.0.17" diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index cff31bbcb74f..204a349ded28 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ kotlin = "2.0.20" ksp = "2.0.20-1.0.24" -agp = "8.5.2" +agp = "8.6.0" appcompat = "1.7.0" colorpicker = "1.1.0" commonsText = "1.12.0" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 81842b0aeb80..a8721e2ec670 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Tue Aug 27 18:19:17 CST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/modules/book/build.gradle b/modules/book/build.gradle index 6f2d95dc5042..f57f5899578d 100644 --- a/modules/book/build.gradle +++ b/modules/book/build.gradle @@ -13,7 +13,7 @@ android { } defaultConfig { minSdk 21 - targetSdk 34 + targetSdk 35 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" diff --git a/modules/rhino/build.gradle b/modules/rhino/build.gradle index 8ae10e5671aa..1b2c7998ef17 100644 --- a/modules/rhino/build.gradle +++ b/modules/rhino/build.gradle @@ -15,7 +15,7 @@ android { } defaultConfig { minSdk 21 - targetSdk 34 + targetSdk 35 consumerProguardFiles "consumer-rules.pro" } From dde4af45170a12b0013461aec02f57a353eec19f Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 1 Sep 2024 10:45:43 +0800 Subject: [PATCH 099/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/audio/AudioPlayActivity.kt | 10 +---- .../ui/book/explore/ExploreShowActivity.kt | 11 +++-- .../app/ui/book/info/BookInfoActivity.kt | 10 +---- .../io/legado/app/ui/book/read/ReadMenu.kt | 10 +---- .../legado/app/ui/book/read/page/PageView.kt | 10 +---- .../bookshelf/style1/books/BooksFragment.kt | 44 ++----------------- .../legado/app/ui/widget/SelectActionBar.kt | 11 +---- .../io/legado/app/utils/ViewExtensions.kt | 22 ++++++++++ 8 files changed, 41 insertions(+), 87 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt index 9bbf9818631b..e40b92bf2e49 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt @@ -10,8 +10,6 @@ import android.view.Menu import android.view.MenuItem import android.widget.SeekBar import androidx.activity.viewModels -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import io.legado.app.R import io.legado.app.base.VMBaseActivity @@ -39,6 +37,7 @@ import io.legado.app.ui.book.toc.TocActivityResult import io.legado.app.ui.login.SourceLoginActivity import io.legado.app.ui.widget.seekbar.SeekBarChangeListener import io.legado.app.utils.StartActivityContract +import io.legado.app.utils.applyNavigationBarPadding import io.legado.app.utils.dpToPx import io.legado.app.utils.invisible import io.legado.app.utils.observeEvent @@ -51,7 +50,6 @@ import io.legado.app.utils.visible import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import splitties.views.bottomPadding import splitties.views.onLongClick import java.util.Locale @@ -187,11 +185,7 @@ class AudioPlayActivity : binding.ivTimer.setOnClickListener { timerSliderPopup.showAsDropDown(it, 0, (-100).dpToPx(), Gravity.TOP) } - ViewCompat.setOnApplyWindowInsetsListener(binding.llPlayMenu) { _, windowInsets -> - val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) - binding.llPlayMenu.bottomPadding = insets.bottom - windowInsets - } + binding.llPlayMenu.applyNavigationBarPadding() } private fun upCover(path: String?) { diff --git a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt index 735adc355de0..62d51394437c 100644 --- a/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/explore/ExploreShowActivity.kt @@ -49,8 +49,7 @@ class ExploreShowActivity : VMBaseActivity(toolBarTheme = Theme.Dark), @@ -157,6 +155,7 @@ class BookInfoActivity : binding.arcView.setBgColor(backgroundColor) binding.llInfo.setBackgroundColor(backgroundColor) binding.flAction.setBackgroundColor(bottomBackground) + binding.flAction.applyNavigationBarPadding() binding.tvShelf.setTextColor(getPrimaryTextColor(ColorUtils.isColorLight(bottomBackground))) binding.tvToc.text = getString(R.string.toc_s, getString(R.string.loading)) viewModel.bookData.observe(this) { showBook(it) } @@ -164,11 +163,6 @@ class BookInfoActivity : viewModel.waitDialogData.observe(this) { upWaitDialogStatus(it) } viewModel.initData(intent) initViewEvent() - ViewCompat.setOnApplyWindowInsetsListener(binding.flAction) { _, windowInsets -> - val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) - binding.flAction.bottomPadding = insets.bottom - windowInsets - } } override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index 36644c37d004..75395062dd66 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -15,8 +15,6 @@ import android.view.animation.Animation import android.widget.FrameLayout import android.widget.SeekBar import androidx.appcompat.widget.PopupMenu -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat import androidx.core.view.isGone import androidx.core.view.isVisible import io.legado.app.R @@ -41,6 +39,7 @@ import io.legado.app.ui.widget.seekbar.SeekBarChangeListener import io.legado.app.utils.ColorUtils import io.legado.app.utils.ConstraintModify import io.legado.app.utils.activity +import io.legado.app.utils.applyNavigationBarPadding import io.legado.app.utils.dpToPx import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.gone @@ -51,7 +50,6 @@ import io.legado.app.utils.openUrl import io.legado.app.utils.putPrefBoolean import io.legado.app.utils.startActivity import io.legado.app.utils.visible -import splitties.views.bottomPadding import splitties.views.onClick import splitties.views.onLongClick @@ -235,11 +233,7 @@ class ReadMenu @JvmOverloads constructor( /** * 确保视图不被导航栏遮挡 */ - ViewCompat.setOnApplyWindowInsetsListener(this@ReadMenu) { _, windowInsets -> - val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) - root.bottomPadding = insets.bottom - windowInsets - } + applyNavigationBarPadding() } fun reset() { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt index 05e07bebd439..fdafca43d36b 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt @@ -5,8 +5,6 @@ import android.content.Context import android.view.LayoutInflater import android.widget.FrameLayout import androidx.core.content.ContextCompat -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat import androidx.core.view.isGone import androidx.core.view.isInvisible import io.legado.app.R @@ -23,11 +21,11 @@ import io.legado.app.ui.book.read.page.entities.TextPos import io.legado.app.ui.book.read.page.provider.ChapterProvider import io.legado.app.ui.widget.BatteryView import io.legado.app.utils.activity +import io.legado.app.utils.applyStatusBarPadding import io.legado.app.utils.dpToPx import io.legado.app.utils.gone import io.legado.app.utils.setTextIfNotEqual import splitties.views.backgroundColor -import splitties.views.topPadding import java.util.Date /** @@ -62,11 +60,7 @@ class PageView(context: Context) : FrameLayout(context) { init { if (!isInEditMode) { upStyle() - ViewCompat.setOnApplyWindowInsetsListener(this) { _, windowInsets -> - val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars()) - binding.vwStatusBar.topPadding = insets.top - windowInsets - } + binding.vwStatusBar.applyStatusBarPadding() } } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksFragment.kt index 467a08d4e842..847f6a83cbec 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksFragment.kt @@ -12,6 +12,7 @@ import androidx.lifecycle.repeatOnLifecycle import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.Adapter.StateRestorationPolicy import io.legado.app.R import io.legado.app.base.BaseFragment import io.legado.app.constant.AppLog @@ -72,7 +73,6 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books), } } private var booksFlowJob: Job? = null - private var savedInstanceState: Bundle? = null var position = 0 private set var groupId = -1L @@ -83,7 +83,6 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books), private var enableRefresh = true override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { - this.savedInstanceState = savedInstanceState arguments?.let { position = it.getInt("position", 0) groupId = it.getLong("groupId", -1) @@ -113,11 +112,12 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books), } else { binding.rvBookshelf.setRecycledViewPool(activityViewModel.booksGridRecycledViewPool) } + booksAdapter.stateRestorationPolicy = StateRestorationPolicy.PREVENT_WHEN_EMPTY binding.rvBookshelf.adapter = booksAdapter booksAdapter.registerAdapterDataObserver(object : RecyclerView.AdapterDataObserver() { override fun onItemRangeInserted(positionStart: Int, itemCount: Int) { val layoutManager = binding.rvBookshelf.layoutManager - if (positionStart == 0 && layoutManager is LinearLayoutManager) { + if (positionStart == 0 && itemCount == 1 && layoutManager is LinearLayoutManager) { val scrollTo = layoutManager.findFirstVisibleItemPosition() - itemCount binding.rvBookshelf.scrollToPosition(max(0, scrollTo)) } @@ -125,7 +125,7 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books), override fun onItemRangeMoved(fromPosition: Int, toPosition: Int, itemCount: Int) { val layoutManager = binding.rvBookshelf.layoutManager - if (toPosition == 0 && layoutManager is LinearLayoutManager) { + if (toPosition == 0 && itemCount == 1 && layoutManager is LinearLayoutManager) { val scrollTo = layoutManager.findFirstVisibleItemPosition() - itemCount binding.rvBookshelf.scrollToPosition(max(0, scrollTo)) } @@ -191,25 +191,11 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books), binding.tvEmptyMsg.isGone = list.isNotEmpty() binding.refreshLayout.isEnabled = enableRefresh && list.isNotEmpty() booksAdapter.setItems(list) - recoverPositionState() delay(100) } } } - private fun recoverPositionState() { - // 恢复书架位置状态 - if (savedInstanceState?.getBoolean("needRecoverState") == true) { - val layoutManager = binding.rvBookshelf.layoutManager - if (layoutManager is LinearLayoutManager) { - val leavePosition = savedInstanceState!!.getInt("leavePosition") - val leaveOffset = savedInstanceState!!.getInt("leaveOffset") - layoutManager.scrollToPositionWithOffset(leavePosition, leaveOffset) - } - savedInstanceState!!.putBoolean("needRecoverState", false) - } - } - private fun startLastUpdateTimeJob() { upLastUpdateTimeJob?.cancel() if (!AppConfig.showLastUpdateTime) { @@ -241,28 +227,6 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books), return booksAdapter.itemCount } - override fun onSaveInstanceState(outState: Bundle) { - super.onSaveInstanceState(outState) - // 保存书架位置状态 - val layoutManager = binding.rvBookshelf.layoutManager - if (layoutManager is LinearLayoutManager) { - val itemPosition = layoutManager.findFirstVisibleItemPosition() - val currentView = layoutManager.findViewByPosition(itemPosition) - val viewOffset = currentView?.top - if (viewOffset != null) { - outState.putInt("leavePosition", itemPosition) - outState.putInt("leaveOffset", viewOffset) - outState.putBoolean("needRecoverState", true) - } else if (savedInstanceState != null) { - val leavePosition = savedInstanceState!!.getInt("leavePosition") - val leaveOffset = savedInstanceState!!.getInt("leaveOffset") - outState.putInt("leavePosition", leavePosition) - outState.putInt("leaveOffset", leaveOffset) - outState.putBoolean("needRecoverState", true) - } - } - } - override fun onDestroyView() { super.onDestroyView() /** diff --git a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt index 07c1990ea49a..e44c662e2bfe 100644 --- a/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt +++ b/app/src/main/java/io/legado/app/ui/widget/SelectActionBar.kt @@ -9,8 +9,6 @@ import android.widget.FrameLayout import androidx.annotation.MenuRes import androidx.annotation.StringRes import androidx.appcompat.widget.PopupMenu -import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat import io.legado.app.R import io.legado.app.databinding.ViewSelectActionBarBinding import io.legado.app.lib.theme.TintHelper @@ -20,8 +18,8 @@ import io.legado.app.lib.theme.elevation import io.legado.app.lib.theme.getPrimaryTextColor import io.legado.app.lib.theme.getSecondaryDisabledTextColor import io.legado.app.utils.ColorUtils +import io.legado.app.utils.applyNavigationBarPadding import io.legado.app.utils.visible -import splitties.views.bottomPadding @Suppress("unused") @@ -54,12 +52,7 @@ class SelectActionBar @JvmOverloads constructor( binding.btnRevertSelection.setOnClickListener { callBack?.revertSelection() } binding.btnSelectActionMain.setOnClickListener { callBack?.onClickSelectBarMainAction() } binding.ivMenuMore.setOnClickListener { selMenu?.show() } - val initialBottomPadding = binding.root.paddingBottom - ViewCompat.setOnApplyWindowInsetsListener(this) { _, windowInsets -> - val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) - binding.root.bottomPadding = initialBottomPadding + insets.bottom - windowInsets - } + applyNavigationBarPadding() } } diff --git a/app/src/main/java/io/legado/app/utils/ViewExtensions.kt b/app/src/main/java/io/legado/app/utils/ViewExtensions.kt index 5c2e9d7acd8b..17984c762af0 100644 --- a/app/src/main/java/io/legado/app/utils/ViewExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ViewExtensions.kt @@ -28,6 +28,8 @@ import androidx.appcompat.view.menu.MenuPopupHelper import androidx.appcompat.widget.PopupMenu import androidx.core.graphics.record import androidx.core.graphics.withTranslation +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.get import androidx.recyclerview.widget.RecyclerView import androidx.viewpager.widget.ViewPager @@ -36,6 +38,8 @@ import io.legado.app.lib.theme.TintHelper import io.legado.app.utils.canvasrecorder.CanvasRecorder import io.legado.app.utils.canvasrecorder.record import splitties.systemservices.inputMethodManager +import splitties.views.bottomPadding +import splitties.views.topPadding import java.lang.reflect.Field @@ -255,3 +259,21 @@ fun View.shouldHideSoftInput(event: MotionEvent): Boolean { } return false } + +fun View.applyStatusBarPadding(withInitialPadding: Boolean = false) { + val initialPadding = if (withInitialPadding) topPadding else 0 + ViewCompat.setOnApplyWindowInsetsListener(this) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.statusBars()) + topPadding = initialPadding + insets.top + windowInsets + } +} + +fun View.applyNavigationBarPadding(withInitialPadding: Boolean = false) { + val initialPadding = if (withInitialPadding) bottomPadding else 0 + ViewCompat.setOnApplyWindowInsetsListener(this) { _, windowInsets -> + val insets = windowInsets.getInsets(WindowInsetsCompat.Type.navigationBars()) + bottomPadding = initialPadding + insets.bottom + windowInsets + } +} From 73588feb06d92d43c2e9bebf29fe888b5b9fdb03 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 1 Sep 2024 11:44:10 +0800 Subject: [PATCH 100/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/main/explore/ExploreAdapter.kt | 7 ++++--- .../legado/app/utils/CollectionExtensions.kt | 21 ++++++++++++++++--- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt b/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt index 9dbba95a86dd..e84b6a943cb6 100644 --- a/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/main/explore/ExploreAdapter.kt @@ -23,6 +23,7 @@ import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.utils.activity import io.legado.app.utils.dpToPx import io.legado.app.utils.gone +import io.legado.app.utils.removeLastElement import io.legado.app.utils.showDialogFragment import io.legado.app.utils.startActivity import io.legado.app.utils.visible @@ -118,9 +119,7 @@ class ExploreAdapter(context: Context, val callBack: CallBack) : return if (recycler.isEmpty()) { ItemFilletTextBinding.inflate(inflater, flexbox, false).root } else { - recycler.last().also { - recycler.removeLast() - } as TextView + recycler.removeLastElement() as TextView } } @@ -174,11 +173,13 @@ class ExploreAdapter(context: Context, val callBack: CallBack) : putExtra("type", "bookSource") putExtra("key", source.bookSourceUrl) } + R.id.menu_refresh -> Coroutine.async(callBack.scope) { source.clearExploreKindsCache() }.onSuccess { notifyItemChanged(position) } + R.id.menu_del -> callBack.deleteSource(source) } true diff --git a/app/src/main/java/io/legado/app/utils/CollectionExtensions.kt b/app/src/main/java/io/legado/app/utils/CollectionExtensions.kt index 0dfb7a8c6dde..f64df923905a 100644 --- a/app/src/main/java/io/legado/app/utils/CollectionExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/CollectionExtensions.kt @@ -14,9 +14,16 @@ inline fun List.fastBinarySearch( comparison: (T) -> Int ): Int { when { - fromIndex > toIndex -> throw IllegalArgumentException("fromIndex ($fromIndex) is greater than toIndex ($toIndex).") - fromIndex < 0 -> throw IndexOutOfBoundsException("fromIndex ($fromIndex) is less than zero.") - toIndex > size -> throw IndexOutOfBoundsException("toIndex ($toIndex) is greater than size ($size).") + fromIndex > toIndex -> + throw IllegalArgumentException( + "fromIndex ($fromIndex) is greater than toIndex ($toIndex)." + ) + + fromIndex < 0 -> + throw IndexOutOfBoundsException("fromIndex ($fromIndex) is less than zero.") + + toIndex > size -> + throw IndexOutOfBoundsException("toIndex ($toIndex) is greater than size ($size).") } var low = fromIndex @@ -43,3 +50,11 @@ inline fun > List.fastBinarySearchBy( toIndex: Int = size, crossinline selector: (T) -> K? ): Int = fastBinarySearch(fromIndex, toIndex) { compareValues(selector(it), key) } + +fun MutableList.removeLastElement(): T { + return if (isEmpty()) { + throw NoSuchElementException("List is empty.") + } else { + removeAt(lastIndex) + } +} From 9141561fc1286d5f8200cc0e0700c4e1da1b89ba Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 1 Sep 2024 22:41:30 +0800 Subject: [PATCH 101/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/utils/NetworkUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/utils/NetworkUtils.kt b/app/src/main/java/io/legado/app/utils/NetworkUtils.kt index 708559ff2c38..c1a622530dc7 100644 --- a/app/src/main/java/io/legado/app/utils/NetworkUtils.kt +++ b/app/src/main/java/io/legado/app/utils/NetworkUtils.kt @@ -66,7 +66,7 @@ object NetworkUtils { for (i in '0'.code..'9'.code) { bitSet.set(i) } - for (char in "+-_.$:()!*@&#,[]") { + for (char in "+-_.~$:()!*@&#,[]") { bitSet.set(char.code) } return@lazy bitSet From e866cc95d9df6851916b05ad2f6096c54ed5273b Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 1 Sep 2024 23:18:29 +0800 Subject: [PATCH 102/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/read/ReadBookActivity.kt | 6 ++++++ .../io/legado/app/ui/book/read/config/ReadStyleDialog.kt | 4 ++++ 2 files changed, 10 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 1b8fb8f75e65..dd75a8d5fc03 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -1356,11 +1356,17 @@ class ReadBookActivity : BaseReadBookActivity(), TEXT_COLOR -> { setCurTextColor(color) postEvent(EventBus.UP_CONFIG, arrayListOf(2, 6, 9, 11)) + if (AppConfig.readBarStyleFollowPage) { + postEvent(EventBus.UPDATE_READ_ACTION_BAR, true) + } } BG_COLOR -> { setCurBg(0, "#${color.hexString}") postEvent(EventBus.UP_CONFIG, arrayListOf(1)) + if (AppConfig.readBarStyleFollowPage) { + postEvent(EventBus.UPDATE_READ_ACTION_BAR, true) + } } TIP_COLOR -> { diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt index a8bfe064c9a9..0089967662d6 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadStyleDialog.kt @@ -15,6 +15,7 @@ import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.constant.EventBus import io.legado.app.databinding.DialogReadBookStyleBinding import io.legado.app.databinding.ItemReadStyleBinding +import io.legado.app.help.config.AppConfig import io.legado.app.help.config.ReadBookConfig import io.legado.app.lib.dialogs.selector import io.legado.app.lib.theme.accentColor @@ -169,6 +170,9 @@ class ReadStyleDialog : BaseDialogFragment(R.layout.dialog_read_book_style), styleAdapter.notifyItemChanged(oldIndex) styleAdapter.notifyItemChanged(index) postEvent(EventBus.UP_CONFIG, arrayListOf(1, 2, 5)) + if (AppConfig.readBarStyleFollowPage) { + postEvent(EventBus.UPDATE_READ_ACTION_BAR, true) + } } } From ffaf2ff33db04fe815b9c70a15d485651721942d Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Mon, 2 Sep 2024 19:35:22 +0800 Subject: [PATCH 103/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/book/info/edit/BookInfoEditActivity.kt | 13 ++++++++++++ .../source/edit/BookSourceEditActivity.kt | 10 +++++++++ .../ui/replace/edit/ReplaceEditActivity.kt | 21 ++++++++++++++++--- .../legado/app/ui/rss/read/ReadRssActivity.kt | 13 ++++++++++++ .../rss/source/edit/RssSourceEditActivity.kt | 10 +++++++++ .../app/ui/widget/keyboard/KeyboardToolPop.kt | 5 +++-- 6 files changed, 67 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt index bf6f5c85ad10..05afbfe97f62 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/edit/BookInfoEditActivity.kt @@ -6,6 +6,8 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import androidx.activity.viewModels +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.BookType @@ -29,6 +31,7 @@ import io.legado.app.utils.showDialogFragment import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding import splitties.init.appCtx +import splitties.views.bottomPadding import java.io.FileOutputStream class BookInfoEditActivity : @@ -51,6 +54,7 @@ class BookInfoEditActivity : viewModel.loadBook(it) } } + initView() initEvent() } @@ -66,6 +70,15 @@ class BookInfoEditActivity : return super.onCompatOptionsItemSelected(item) } + private fun initView() { + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> + val typeMask = WindowInsetsCompat.Type.navigationBars() or WindowInsetsCompat.Type.ime() + val insets = windowInsets.getInsets(typeMask) + binding.root.bottomPadding = insets.bottom + windowInsets + } + } + private fun initEvent() = binding.run { tvChangeCover.setOnClickListener { viewModel.bookData.value?.let { diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt index 415b2fa95640..e1c4add3e8c7 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt @@ -7,6 +7,8 @@ import android.view.Menu import android.view.MenuItem import android.widget.EditText import androidx.activity.viewModels +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.tabs.TabLayout @@ -53,6 +55,7 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import splitties.views.bottomPadding class BookSourceEditActivity : VMBaseActivity(), @@ -197,6 +200,13 @@ class BookSourceEditActivity : setEditEntities(tab?.position) } }) + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> + val typeMask = WindowInsetsCompat.Type.navigationBars() or WindowInsetsCompat.Type.ime() + val insets = windowInsets.getInsets(typeMask) + binding.root.bottomPadding = insets.bottom + softKeyboardTool.initialPadding = insets.bottom + windowInsets + } } override fun finish() { diff --git a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt index 52483085ca0c..c34c3b732220 100644 --- a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt @@ -7,6 +7,8 @@ import android.view.Menu import android.view.MenuItem import android.widget.EditText import androidx.activity.viewModels +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import io.legado.app.R import io.legado.app.base.VMBaseActivity @@ -18,6 +20,7 @@ import io.legado.app.utils.GSON import io.legado.app.utils.sendToClip import io.legado.app.utils.showHelp import io.legado.app.utils.viewbindingdelegate.viewBinding +import splitties.views.bottomPadding /** * 编辑替换规则 @@ -54,12 +57,10 @@ class ReplaceEditActivity : override fun onActivityCreated(savedInstanceState: Bundle?) { softKeyboardTool.attachToWindow(window) + initView() viewModel.initData(intent) { upReplaceView(it) } - binding.ivHelp.setOnClickListener { - showHelp("regexHelp") - } } override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { @@ -73,6 +74,7 @@ class ReplaceEditActivity : setResult(RESULT_OK) finish() } + R.id.menu_copy_rule -> sendToClip(GSON.toJson(getReplaceRule())) R.id.menu_paste_rule -> viewModel.pasteRule { upReplaceView(it) @@ -86,6 +88,19 @@ class ReplaceEditActivity : softKeyboardTool.dismiss() } + private fun initView() { + binding.ivHelp.setOnClickListener { + showHelp("regexHelp") + } + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> + val typeMask = WindowInsetsCompat.Type.navigationBars() or WindowInsetsCompat.Type.ime() + val insets = windowInsets.getInsets(typeMask) + binding.root.bottomPadding = insets.bottom + softKeyboardTool.initialPadding = insets.bottom + windowInsets + } + } + private fun upReplaceView(replaceRule: ReplaceRule) = binding.run { etName.setText(replaceRule.name) etGroup.setText(replaceRule.group) diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index 162328d1d8a3..4614d047a603 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -21,6 +21,8 @@ import android.webkit.WebView import android.webkit.WebViewClient import androidx.activity.addCallback import androidx.activity.viewModels +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.core.view.size import androidx.lifecycle.lifecycleScope import com.script.rhino.RhinoScriptEngine @@ -60,6 +62,7 @@ import io.legado.app.utils.visible import kotlinx.coroutines.launch import org.apache.commons.text.StringEscapeUtils import org.jsoup.Jsoup +import splitties.views.bottomPadding import java.io.ByteArrayInputStream import java.net.URLDecoder import java.util.regex.PatternSyntaxException @@ -91,6 +94,7 @@ class ReadRssActivity : VMBaseActivity viewModel.upStarMenuData.observe(this) { upStarMenu() } viewModel.upTtsMenuData.observe(this) { upTtsMenu(it) } binding.titleBar.title = intent.getStringExtra("title") + initView() initWebView() initLiveData() viewModel.initData(intent) @@ -175,6 +179,15 @@ class ReadRssActivity : VMBaseActivity return AppConfig.isNightTheme } + private fun initView() { + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> + val typeMask = WindowInsetsCompat.Type.navigationBars() or WindowInsetsCompat.Type.ime() + val insets = windowInsets.getInsets(typeMask) + binding.root.bottomPadding = insets.bottom + windowInsets + } + } + @SuppressLint("SetJavaScriptEnabled") private fun initWebView() { binding.progressBar.fontColor = accentColor diff --git a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt index e6cb28584c4a..dc9d78e23c90 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt @@ -6,6 +6,8 @@ import android.view.Menu import android.view.MenuItem import android.widget.EditText import androidx.activity.viewModels +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import com.google.android.material.tabs.TabLayout import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel @@ -42,6 +44,7 @@ import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext +import splitties.views.bottomPadding class RssSourceEditActivity : VMBaseActivity(), @@ -185,6 +188,13 @@ class RssSourceEditActivity : setEditEntities(tab?.position) } }) + ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> + val typeMask = WindowInsetsCompat.Type.navigationBars() or WindowInsetsCompat.Type.ime() + val insets = windowInsets.getInsets(typeMask) + binding.root.bottomPadding = insets.bottom + softKeyboardTool.initialPadding = insets.bottom + windowInsets + } } private fun setEditEntities(tabPosition: Int?) { diff --git a/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt b/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt index d5d422cf378a..aca80d60de0c 100644 --- a/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt +++ b/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt @@ -47,6 +47,7 @@ class KeyboardToolPop( private val binding = PopupKeyboardToolBinding.inflate(LayoutInflater.from(context)) private val adapter = Adapter(context) private var mIsSoftKeyBoardShowing = false + var initialPadding = 0 init { contentView = binding.root @@ -76,13 +77,13 @@ class KeyboardToolPop( val preShowing = mIsSoftKeyBoardShowing if (abs(keyboardHeight) > screenHeight / 5) { mIsSoftKeyBoardShowing = true // 超过屏幕五分之一则表示弹出了输入法 - rootView.setPadding(0, 0, 0, contentView.measuredHeight) + rootView.setPadding(0, 0, 0, initialPadding + contentView.measuredHeight) if (!isShowing) { showAtLocation(rootView, Gravity.BOTTOM, 0, 0) } } else { mIsSoftKeyBoardShowing = false - rootView.setPadding(0, 0, 0, 0) + //rootView.setPadding(0, 0, 0, 0) if (preShowing) { dismiss() } From 6534947b7e79fb27aa09f94173c8471932d6aab6 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 3 Sep 2024 09:32:02 +0800 Subject: [PATCH 104/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/activity_web_view.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/res/layout/activity_web_view.xml b/app/src/main/res/layout/activity_web_view.xml index a946c6d40747..4ac626b505e0 100644 --- a/app/src/main/res/layout/activity_web_view.xml +++ b/app/src/main/res/layout/activity_web_view.xml @@ -15,7 +15,6 @@ android:id="@+id/title_bar" android:layout_width="match_parent" android:layout_height="wrap_content" - app:fitStatusBar="false" app:layout_constraintTop_toTopOf="parent" /> Date: Wed, 4 Sep 2024 21:27:55 +0800 Subject: [PATCH 105/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/audio/AudioPlayActivity.kt | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt index e40b92bf2e49..747ccd744570 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt @@ -227,24 +227,26 @@ class AudioPlayActivity : } override fun finish() { - AudioPlay.book?.let { - if (!AudioPlay.inBookshelf) { - if (!AppConfig.showAddToShelfAlert) { - viewModel.removeFromBookshelf { super.finish() } - } else { - alert(title = getString(R.string.add_to_bookshelf)) { - setMessage(getString(R.string.check_add_bookshelf, it.name)) - okButton { - AudioPlay.inBookshelf = true - setResult(Activity.RESULT_OK) - } - noButton { viewModel.removeFromBookshelf { super.finish() } } - } + val book = AudioPlay.book ?: return super.finish() + + if (AudioPlay.inBookshelf) { + return super.finish() + } + + if (!AppConfig.showAddToShelfAlert) { + viewModel.removeFromBookshelf { super.finish() } + } else { + alert(title = getString(R.string.add_to_bookshelf)) { + setMessage(getString(R.string.check_add_bookshelf, book.name)) + okButton { + AudioPlay.book?.removeType(BookType.notShelf) + AudioPlay.book?.save() + AudioPlay.inBookshelf = true + setResult(Activity.RESULT_OK) } - } else { - super.finish() + noButton { viewModel.removeFromBookshelf { super.finish() } } } - } ?: super.finish() + } } override fun onDestroy() { From dbc4221f63cb20ff519dbaada7841da34c9a944c Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Wed, 4 Sep 2024 22:39:31 +0800 Subject: [PATCH 106/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/widget/dialog/TextDialog.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt index bdd3e6f84399..babb950d157b 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/TextDialog.kt @@ -70,14 +70,16 @@ class TextDialog() : BaseDialogFragment(R.layout.dialog_text_view) { val content = IntentData.get(it.getString("content")) ?: "" when (it.getString("mode")) { Mode.MD.name -> viewLifecycleOwner.lifecycleScope.launch { - binding.textView.text = withContext(IO) { - Markwon.builder(requireContext()) + val markwon: Markwon + val markdown = withContext(IO) { + markwon = Markwon.builder(requireContext()) .usePlugin(GlideImagesPlugin.create(requireContext())) .usePlugin(HtmlPlugin.create()) .usePlugin(TablePlugin.create(requireContext())) .build() - .toMarkdown(content) + markwon.toMarkdown(content) } + markwon.setParsedMarkdown(binding.textView, markdown) } Mode.HTML.name -> binding.textView.setHtml(content) From 58559d0844084b8fa0ee49919b628e6416cb1755 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 5 Sep 2024 12:20:36 +0800 Subject: [PATCH 107/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/info/BookInfoViewModel.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index 80c2e07956b9..148f3a4ae96a 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -29,6 +29,7 @@ import io.legado.app.help.book.removeType import io.legado.app.help.book.simulatedTotalChapterNum import io.legado.app.help.coroutine.Coroutine import io.legado.app.lib.webdav.ObjectNotFoundException +import io.legado.app.model.AudioPlay import io.legado.app.model.BookCover import io.legado.app.model.ReadBook import io.legado.app.model.analyzeRule.AnalyzeUrl @@ -404,12 +405,15 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { book.order = appDb.bookDao.minOrder - 1 } appDb.bookDao.getBook(book.name, book.author)?.let { + book.durChapterIndex = it.durChapterIndex book.durChapterPos = it.durChapterPos book.durChapterTitle = it.durChapterTitle } book.save() - if (ReadBook.book?.name == book.name && ReadBook.book?.author == book.author) { + if (ReadBook.book?.isSameNameAuthor(book) == true) { ReadBook.book = book + } else if (AudioPlay.book?.isSameNameAuthor(book) == true) { + AudioPlay.book = book } }.onSuccess { success?.invoke() @@ -434,9 +438,15 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) { book.order = appDb.bookDao.minOrder - 1 } appDb.bookDao.getBook(book.name, book.author)?.let { + book.durChapterIndex = it.durChapterIndex book.durChapterPos = it.durChapterPos book.durChapterTitle = it.durChapterTitle } + if (ReadBook.book?.isSameNameAuthor(book) == true) { + ReadBook.book = book + } else if (AudioPlay.book?.isSameNameAuthor(book) == true) { + AudioPlay.book = book + } book.save() } chapterListData.value?.let { From 6118fda3e5aa128d8922cbe37d48205d18a28715 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 5 Sep 2024 15:27:24 +0800 Subject: [PATCH 108/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/book/source/edit/BookSourceEditActivity.kt | 4 ++-- app/src/main/res/layout/activity_book_source_edit.xml | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt index e1c4add3e8c7..e47fe80766e2 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt @@ -200,10 +200,10 @@ class BookSourceEditActivity : setEditEntities(tab?.position) } }) - ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> + ViewCompat.setOnApplyWindowInsetsListener(binding.recyclerView) { _, windowInsets -> val typeMask = WindowInsetsCompat.Type.navigationBars() or WindowInsetsCompat.Type.ime() val insets = windowInsets.getInsets(typeMask) - binding.root.bottomPadding = insets.bottom + binding.recyclerView.bottomPadding = insets.bottom softKeyboardTool.initialPadding = insets.bottom windowInsets } diff --git a/app/src/main/res/layout/activity_book_source_edit.xml b/app/src/main/res/layout/activity_book_source_edit.xml index 5def7e625742..f75098dfcf79 100644 --- a/app/src/main/res/layout/activity_book_source_edit.xml +++ b/app/src/main/res/layout/activity_book_source_edit.xml @@ -86,6 +86,7 @@ android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" + android:clipToPadding="false" tools:listitem="@layout/item_source_edit" /> \ No newline at end of file From 524e9b89a45544d52ea721f620ee58d4fc601cff Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 6 Sep 2024 09:49:33 +0800 Subject: [PATCH 109/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/utils/RegexExtensions.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/utils/RegexExtensions.kt b/app/src/main/java/io/legado/app/utils/RegexExtensions.kt index c345292a484b..b379c62f7e9c 100644 --- a/app/src/main/java/io/legado/app/utils/RegexExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/RegexExtensions.kt @@ -10,6 +10,7 @@ import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.runBlocking import kotlinx.coroutines.suspendCancellableCoroutine import splitties.init.appCtx +import java.util.regex.Matcher import kotlin.coroutines.resume import kotlin.coroutines.resumeWithException @@ -36,7 +37,8 @@ fun CharSequence.replace(regex: Regex, replacement: String, timeout: Long): Stri bindings["result"] = matcher.group() eval(replacement1, bindings) }.toString() - matcher.appendReplacement(stringBuffer, jsResult) + val quotedResult = Matcher.quoteReplacement(jsResult) + matcher.appendReplacement(stringBuffer, quotedResult) } else { matcher.appendReplacement(stringBuffer, replacement1) } @@ -49,7 +51,8 @@ fun CharSequence.replace(regex: Regex, replacement: String, timeout: Long): Stri } handler.postDelayed(timeout) { if (coroutine.isActive) { - val timeoutMsg = "替换超时,3秒后还未结束将重启应用\n替换规则$regex\n替换内容:${this}" + val timeoutMsg = + "替换超时,3秒后还未结束将重启应用\n替换规则$regex\n替换内容:$charSequence" val exception = RegexTimeoutException(timeoutMsg) block.cancel(exception) appCtx.longToastOnUi(timeoutMsg) From c5b978b442cc17e224fa894f9ed3ca7922082137 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 6 Sep 2024 14:28:34 +0800 Subject: [PATCH 110/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/model/AudioPlay.kt | 3 ++- app/src/main/java/io/legado/app/service/AudioPlayService.kt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/model/AudioPlay.kt b/app/src/main/java/io/legado/app/model/AudioPlay.kt index e920dd21196b..947d31693b67 100644 --- a/app/src/main/java/io/legado/app/model/AudioPlay.kt +++ b/app/src/main/java/io/legado/app/model/AudioPlay.kt @@ -3,6 +3,7 @@ package io.legado.app.model import android.annotation.SuppressLint import android.content.Context import android.content.Intent +import io.legado.app.R import io.legado.app.constant.AppLog import io.legado.app.constant.EventBus import io.legado.app.constant.IntentAction @@ -182,7 +183,7 @@ object AudioPlay : CoroutineScope by MainScope() { val book = book ?: return durChapter = appDb.bookChapterDao.getChapter(book.bookUrl, durChapterIndex) durAudioSize = durChapter?.end?.toInt() ?: 0 - postEvent(EventBus.AUDIO_SUB_TITLE, durChapter?.title ?: "") + postEvent(EventBus.AUDIO_SUB_TITLE, durChapter?.title ?: appCtx.getString(R.string.data_loading)) postEvent(EventBus.AUDIO_SIZE, durAudioSize) postEvent(EventBus.AUDIO_PROGRESS, durChapterPos) } diff --git a/app/src/main/java/io/legado/app/service/AudioPlayService.kt b/app/src/main/java/io/legado/app/service/AudioPlayService.kt index 5cbac5d2bb29..cad78badf853 100644 --- a/app/src/main/java/io/legado/app/service/AudioPlayService.kt +++ b/app/src/main/java/io/legado/app/service/AudioPlayService.kt @@ -423,6 +423,7 @@ class AudioPlayService : BaseService(), AudioPlay.playPositionChanged(exoPlayer.currentPosition.toInt()) postEvent(EventBus.AUDIO_BUFFER_PROGRESS, exoPlayer.bufferedPosition.toInt()) postEvent(EventBus.AUDIO_PROGRESS, AudioPlay.durChapterPos) + postEvent(EventBus.AUDIO_SIZE, exoPlayer.duration.toInt()) upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PLAYING) delay(1000) } From c131f6da9dcb4a20eeed3e1c627808822e0e3127 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 6 Sep 2024 16:22:47 +0800 Subject: [PATCH 111/837] =?UTF-8?q?=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/service/HttpReadAloudService.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 0afa04853798..cbc4fd18e4b5 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -329,7 +329,8 @@ class HttpReadAloudService : BaseReadAloudService(), speakSpeed = speechRate, source = httpTts, headerMapF = httpTts.getHeaderMap(true), - readTimeout = 300 * 1000L + readTimeout = 300 * 1000L, + coroutineContext = coroutineContext ) var response = analyzeUrl.getResponseAwait() coroutineContext.ensureActive() From 46b47bec7558c9471b8b13d8301b860a6641d512 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 7 Sep 2024 12:12:23 +0800 Subject: [PATCH 112/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/source/edit/BookSourceEditActivity.kt | 11 ++++++----- .../legado/app/ui/replace/edit/ReplaceEditActivity.kt | 8 ++------ .../app/ui/rss/source/edit/RssSourceEditActivity.kt | 11 ++++++----- .../legado/app/ui/widget/keyboard/KeyboardToolPop.kt | 2 +- .../io/legado/app/utils/WindowInsetsExtensions.kt | 9 +++++++++ app/src/main/res/layout/activity_rss_source_edit.xml | 1 + 6 files changed, 25 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/io/legado/app/utils/WindowInsetsExtensions.kt diff --git a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt index e47fe80766e2..d3fa85fa53ed 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/edit/BookSourceEditActivity.kt @@ -8,7 +8,6 @@ import android.view.MenuItem import android.widget.EditText import androidx.activity.viewModels import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager import com.google.android.material.tabs.TabLayout @@ -42,8 +41,10 @@ import io.legado.app.ui.widget.dialog.VariableDialog import io.legado.app.ui.widget.keyboard.KeyboardToolPop import io.legado.app.ui.widget.text.EditEntity import io.legado.app.utils.GSON +import io.legado.app.utils.imeHeight import io.legado.app.utils.isContentScheme import io.legado.app.utils.launch +import io.legado.app.utils.navigationBarHeight import io.legado.app.utils.sendToClip import io.legado.app.utils.setEdgeEffectColor import io.legado.app.utils.share @@ -201,10 +202,10 @@ class BookSourceEditActivity : } }) ViewCompat.setOnApplyWindowInsetsListener(binding.recyclerView) { _, windowInsets -> - val typeMask = WindowInsetsCompat.Type.navigationBars() or WindowInsetsCompat.Type.ime() - val insets = windowInsets.getInsets(typeMask) - binding.recyclerView.bottomPadding = insets.bottom - softKeyboardTool.initialPadding = insets.bottom + val navigationBarHeight = windowInsets.navigationBarHeight + val imeHeight = windowInsets.imeHeight + binding.recyclerView.bottomPadding = if (imeHeight == 0) navigationBarHeight else 0 + softKeyboardTool.initialPadding = imeHeight windowInsets } } diff --git a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt index c34c3b732220..575436a523e3 100644 --- a/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replace/edit/ReplaceEditActivity.kt @@ -8,7 +8,6 @@ import android.view.MenuItem import android.widget.EditText import androidx.activity.viewModels import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import io.legado.app.R import io.legado.app.base.VMBaseActivity @@ -17,10 +16,10 @@ import io.legado.app.databinding.ActivityReplaceEditBinding import io.legado.app.lib.dialogs.SelectItem import io.legado.app.ui.widget.keyboard.KeyboardToolPop import io.legado.app.utils.GSON +import io.legado.app.utils.imeHeight import io.legado.app.utils.sendToClip import io.legado.app.utils.showHelp import io.legado.app.utils.viewbindingdelegate.viewBinding -import splitties.views.bottomPadding /** * 编辑替换规则 @@ -93,10 +92,7 @@ class ReplaceEditActivity : showHelp("regexHelp") } ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> - val typeMask = WindowInsetsCompat.Type.navigationBars() or WindowInsetsCompat.Type.ime() - val insets = windowInsets.getInsets(typeMask) - binding.root.bottomPadding = insets.bottom - softKeyboardTool.initialPadding = insets.bottom + softKeyboardTool.initialPadding = windowInsets.imeHeight windowInsets } } diff --git a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt index dc9d78e23c90..3a73bc4cb122 100644 --- a/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/source/edit/RssSourceEditActivity.kt @@ -7,7 +7,6 @@ import android.view.MenuItem import android.widget.EditText import androidx.activity.viewModels import androidx.core.view.ViewCompat -import androidx.core.view.WindowInsetsCompat import androidx.lifecycle.lifecycleScope import com.google.android.material.tabs.TabLayout import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel @@ -30,9 +29,11 @@ import io.legado.app.ui.widget.dialog.VariableDialog import io.legado.app.ui.widget.keyboard.KeyboardToolPop import io.legado.app.ui.widget.text.EditEntity import io.legado.app.utils.GSON +import io.legado.app.utils.imeHeight import io.legado.app.utils.isContentScheme import io.legado.app.utils.isTrue import io.legado.app.utils.launch +import io.legado.app.utils.navigationBarHeight import io.legado.app.utils.sendToClip import io.legado.app.utils.setEdgeEffectColor import io.legado.app.utils.share @@ -189,10 +190,10 @@ class RssSourceEditActivity : } }) ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, windowInsets -> - val typeMask = WindowInsetsCompat.Type.navigationBars() or WindowInsetsCompat.Type.ime() - val insets = windowInsets.getInsets(typeMask) - binding.root.bottomPadding = insets.bottom - softKeyboardTool.initialPadding = insets.bottom + val navigationBarHeight = windowInsets.navigationBarHeight + val imeHeight = windowInsets.imeHeight + binding.recyclerView.bottomPadding = if (imeHeight == 0) navigationBarHeight else 0 + softKeyboardTool.initialPadding = imeHeight windowInsets } } diff --git a/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt b/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt index aca80d60de0c..62739bfd0467 100644 --- a/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt +++ b/app/src/main/java/io/legado/app/ui/widget/keyboard/KeyboardToolPop.kt @@ -83,7 +83,7 @@ class KeyboardToolPop( } } else { mIsSoftKeyBoardShowing = false - //rootView.setPadding(0, 0, 0, 0) + rootView.setPadding(0, 0, 0, 0) if (preShowing) { dismiss() } diff --git a/app/src/main/java/io/legado/app/utils/WindowInsetsExtensions.kt b/app/src/main/java/io/legado/app/utils/WindowInsetsExtensions.kt new file mode 100644 index 000000000000..7edde3f013bc --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/WindowInsetsExtensions.kt @@ -0,0 +1,9 @@ +package io.legado.app.utils + +import androidx.core.view.WindowInsetsCompat + +val WindowInsetsCompat.navigationBarHeight + get() = getInsets(WindowInsetsCompat.Type.navigationBars()).bottom + +val WindowInsetsCompat.imeHeight + get() = getInsets(WindowInsetsCompat.Type.ime()).bottom diff --git a/app/src/main/res/layout/activity_rss_source_edit.xml b/app/src/main/res/layout/activity_rss_source_edit.xml index 2647926c6408..6ac49b7c9353 100644 --- a/app/src/main/res/layout/activity_rss_source_edit.xml +++ b/app/src/main/res/layout/activity_rss_source_edit.xml @@ -67,6 +67,7 @@ android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" + android:clipToPadding="false" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" tools:listitem="@layout/item_source_edit" /> From 4cb69f6c106c75d33830c76fb5c841ba5a5f8abf Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 8 Sep 2024 14:25:35 +0800 Subject: [PATCH 113/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt | 1 - .../java/io/legado/app/ui/book/toc/rule/TxtTocRuleAdapter.kt | 4 ++++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt index 188ed1f75184..bbee0e2d521f 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleActivity.kt @@ -120,7 +120,6 @@ class TxtTocRuleActivity : VMBaseActivity adapter.setItems(tocRules, adapter.diffItemCallBack) - upCountView() } } } diff --git a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleAdapter.kt index 747d9c89b07f..fe4d9bfd1faf 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/rule/TxtTocRuleAdapter.kt @@ -130,6 +130,10 @@ class TxtTocRuleAdapter(context: Context, private val callBack: CallBack) : } } + override fun onCurrentListChanged() { + callBack.upCountView() + } + private fun showMenu(view: View, position: Int) { val source = getItem(position) ?: return val popupMenu = PopupMenu(context, view) From 230b6e884c6d129bd8328827ef8d804816e8b39c Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 8 Sep 2024 17:24:43 +0800 Subject: [PATCH 114/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/base/adapter/RecyclerAdapter.kt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt index 12cc150f839c..bd4610e9309a 100644 --- a/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt +++ b/app/src/main/java/io/legado/app/base/adapter/RecyclerAdapter.kt @@ -115,19 +115,21 @@ abstract class RecyclerAdapter(protected val context: Co kotlin.runCatching { val oldItems = this.items.toList() val itemsSize = items?.size ?: 0 + val headerCount = getHeaderCount() + val footerCount = getFooterCount() val callback = object : DiffUtil.Callback() { override fun getOldListSize(): Int { return itemCount } override fun getNewListSize(): Int { - return (items?.size ?: 0) + getHeaderCount() + getFooterCount() + return itemsSize + headerCount + footerCount } override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { - val oldItem = oldItems.getOrNull(oldItemPosition - getHeaderCount()) + val oldItem = oldItems.getOrNull(oldItemPosition - headerCount) ?: return true - val newItem = items?.getOrNull(newItemPosition - getHeaderCount()) + val newItem = items?.getOrNull(newItemPosition - headerCount) ?: return true return itemCallback.areItemsTheSame(oldItem, newItem) } @@ -136,17 +138,17 @@ abstract class RecyclerAdapter(protected val context: Co oldItemPosition: Int, newItemPosition: Int ): Boolean { - val oldItem = oldItems.getOrNull(oldItemPosition - getHeaderCount()) + val oldItem = oldItems.getOrNull(oldItemPosition - headerCount) ?: return true - val newItem = items?.getOrNull(newItemPosition - getHeaderCount()) + val newItem = items?.getOrNull(newItemPosition - headerCount) ?: return true return itemCallback.areContentsTheSame(oldItem, newItem) } override fun getChangePayload(oldItemPosition: Int, newItemPosition: Int): Any? { - val oldItem = oldItems.getOrNull(oldItemPosition - getHeaderCount()) + val oldItem = oldItems.getOrNull(oldItemPosition - headerCount) ?: return null - val newItem = items?.getOrNull(newItemPosition - getHeaderCount()) + val newItem = items?.getOrNull(newItemPosition - headerCount) ?: return null return itemCallback.getChangePayload(oldItem, newItem) } From 88cabef11e876a80c840166b437d8e02a0e3515f Mon Sep 17 00:00:00 2001 From: Nihility Date: Sun, 8 Sep 2024 16:13:29 +0800 Subject: [PATCH 115/837] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=86=97=E4=BD=99?= =?UTF-8?q?=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/model/analyzeRule/AnalyzeRule.kt | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 9431fe7ef29b..24bcd37ac591 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -63,10 +63,6 @@ class AnalyzeRule( private var analyzeByJSoup: AnalyzeByJSoup? = null private var analyzeByJSonPath: AnalyzeByJSonPath? = null - private var objectChangedXP = false - private var objectChangedJS = false - private var objectChangedJP = false - private val stringRuleCache = hashMapOf>() private var coroutineContext: CoroutineContext = EmptyCoroutineContext @@ -80,9 +76,9 @@ class AnalyzeRule( else -> content.toString().isJson() } setBaseUrl(baseUrl) - objectChangedXP = true - objectChangedJS = true - objectChangedJP = true + analyzeByXPath = null + analyzeByJSoup = null + analyzeByJSonPath = null return this } @@ -114,9 +110,8 @@ class AnalyzeRule( return if (o != content) { AnalyzeByXPath(o) } else { - if (analyzeByXPath == null || objectChangedXP) { + if (analyzeByXPath == null) { analyzeByXPath = AnalyzeByXPath(content!!) - objectChangedXP = false } analyzeByXPath!! } @@ -129,9 +124,8 @@ class AnalyzeRule( return if (o != content) { AnalyzeByJSoup(o) } else { - if (analyzeByJSoup == null || objectChangedJS) { + if (analyzeByJSoup == null) { analyzeByJSoup = AnalyzeByJSoup(content!!) - objectChangedJS = false } analyzeByJSoup!! } @@ -144,9 +138,8 @@ class AnalyzeRule( return if (o != content) { AnalyzeByJSonPath(o) } else { - if (analyzeByJSonPath == null || objectChangedJP) { + if (analyzeByJSonPath == null) { analyzeByJSonPath = AnalyzeByJSonPath(content!!) - objectChangedJP = false } analyzeByJSonPath!! } From f9dc3b90253561158b867ae005a5bbb2b42c95a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 04:37:23 +0000 Subject: [PATCH 116/837] Bump peter-evans/create-pull-request from 6 to 7 Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6 to 7. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/v6...v7) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/cronet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cronet.yml b/.github/workflows/cronet.yml index 40bc3cf51ab4..80ced27beab7 100644 --- a/.github/workflows/cronet.yml +++ b/.github/workflows/cronet.yml @@ -34,7 +34,7 @@ jobs: - name: Create Pull Request if: ${{ env.cronet == 'ok' }} - uses: peter-evans/create-pull-request@v6 + uses: peter-evans/create-pull-request@v7 continue-on-error: true with: token: ${{ secrets.ACTIONS_TOKEN }} From a3fa748a7451c5e84fe0b86b23d69c2b20df04b4 Mon Sep 17 00:00:00 2001 From: Nihility Date: Mon, 9 Sep 2024 14:46:22 +0800 Subject: [PATCH 117/837] =?UTF-8?q?=E6=94=B6=E6=8B=A2=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E8=8E=B7=E5=8F=96=E4=B8=8E=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/help/source/SourceVerificationHelp.kt | 29 +++++++++++++------ .../ui/association/VerificationCodeDialog.kt | 6 ++-- .../legado/app/ui/browser/WebViewActivity.kt | 2 +- .../io/legado/app/ui/browser/WebViewModel.kt | 5 +--- 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt b/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt index c7b6432225d6..c4f53dc9a328 100644 --- a/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt +++ b/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt @@ -20,7 +20,7 @@ object SourceVerificationHelp { private val waitTime = 1.minutes.inWholeNanoseconds private fun getKey(source: BaseSource) = getKey(source.getKey()) - fun getKey(sourceKey: String) = "${sourceKey}_verificationResult" + private fun getKey(sourceKey: String) = "${sourceKey}_verificationResult" /** * 获取书源验证结果 @@ -35,22 +35,21 @@ object SourceVerificationHelp { source ?: throw NoStackTraceException("getVerificationResult parameter source cannot be null") - val key = getKey(source) - CacheManager.delete(key) + clearResult(source.getKey()) if (!useBrowser) { appCtx.startActivity { putExtra("imageUrl", url) putExtra("sourceOrigin", source.getKey()) putExtra("sourceName", source.getTag()) - IntentData.put(key, Thread.currentThread()) + IntentData.put(getKey(source), Thread.currentThread()) } } else { startBrowser(source, url, title, true) } var waitUserInput = false - while (CacheManager.get(key) == null) { + while (getResult(source.getKey()) == null) { if (!waitUserInput) { AppLog.putDebug("等待返回验证结果...") waitUserInput = true @@ -58,7 +57,7 @@ object SourceVerificationHelp { LockSupport.parkNanos(this, waitTime) } - return CacheManager.get(key)!!.let { + return getResult(source.getKey())!!.let { it.ifBlank { throw NoStackTraceException("验证结果为空") } @@ -89,9 +88,21 @@ object SourceVerificationHelp { } - fun checkResult(key: String) { - CacheManager.get(key) ?: CacheManager.putMemory(key, "") - val thread = IntentData.get(key) + fun checkResult(sourceKey: String) { + getResult(sourceKey) ?: setResult(sourceKey, "") + val thread = IntentData.get(getKey(sourceKey)) LockSupport.unpark(thread) } + + fun setResult(sourceKey: String, result: String?) { + CacheManager.putMemory(getKey(sourceKey), result ?: "") + } + + fun getResult(sourceKey: String): String? { + return CacheManager.get(getKey(sourceKey)) + } + + fun clearResult(sourceKey: String) { + CacheManager.delete(getKey(sourceKey)) + } } diff --git a/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt b/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt index 8190841e9441..14953bfd4d67 100644 --- a/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt +++ b/app/src/main/java/io/legado/app/ui/association/VerificationCodeDialog.kt @@ -57,7 +57,6 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification } private var sourceOrigin: String? = null - private var key = "" override fun onFragmentCreated(view: View, savedInstanceState: Bundle?): Unit = binding.run { initMenu() @@ -65,7 +64,6 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification toolBar.setBackgroundColor(primaryColor) toolBar.subtitle = arguments.getString("sourceName") sourceOrigin = arguments.getString("sourceOrigin") - key = SourceVerificationHelp.getKey(sourceOrigin!!) val imageUrl = arguments.getString("imageUrl") ?: return@run loadImage(imageUrl, sourceOrigin) verificationCodeImageView.setOnClickListener { @@ -119,7 +117,7 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification when (item.itemId) { R.id.menu_ok -> { val verificationCode = binding.verificationCode.text.toString() - CacheManager.putMemory(key, verificationCode) + SourceVerificationHelp.setResult(sourceOrigin!!, verificationCode) dismiss() } } @@ -127,7 +125,7 @@ class VerificationCodeDialog() : BaseDialogFragment(R.layout.dialog_verification } override fun onDestroy() { - SourceVerificationHelp.checkResult(key) + SourceVerificationHelp.checkResult(sourceOrigin!!) super.onDestroy() activity?.finish() } diff --git a/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt b/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt index 57b026fb7336..5833f0099e40 100644 --- a/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt +++ b/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt @@ -158,7 +158,7 @@ class WebViewActivity : VMBaseActivity() { } override fun finish() { - SourceVerificationHelp.checkResult(viewModel.key) + SourceVerificationHelp.checkResult(viewModel.sourceOrigin) super.finish() } diff --git a/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt b/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt index 7c8f6f77b696..99819e5dd2e2 100644 --- a/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt @@ -31,7 +31,6 @@ class WebViewModel(application: Application) : BaseViewModel(application) { val headerMap: HashMap = hashMapOf() var sourceVerificationEnable: Boolean = false var sourceOrigin: String = "" - var key = "" fun initData( intent: Intent, @@ -41,7 +40,6 @@ class WebViewModel(application: Application) : BaseViewModel(application) { val url = intent.getStringExtra("url") ?: throw NoStackTraceException("url不能为空") sourceOrigin = intent.getStringExtra("sourceOrigin") ?: "" - key = SourceVerificationHelp.getKey(sourceOrigin) sourceVerificationEnable = intent.getBooleanExtra("sourceVerificationEnable", false) val headerMapF = IntentData.get>(url) val analyzeUrl = AnalyzeUrl(url, headerMapF = headerMapF) @@ -96,13 +94,12 @@ class WebViewModel(application: Application) : BaseViewModel(application) { if (sourceVerificationEnable) { val url = intent.getStringExtra("url")!! val source = appDb.bookSourceDao.getBookSource(sourceOrigin) - val key = "${sourceOrigin}_verificationResult" html = AnalyzeUrl( url, headerMapF = headerMap, source = source ).getStrResponseAwait(useWebView = false).body - CacheManager.putMemory(key, html ?: "") + SourceVerificationHelp.setResult(sourceOrigin, html ?: "") } }.onSuccess { success.invoke() From 8bfa1d31299176cdff69a2f20b61817cbdeb33aa Mon Sep 17 00:00:00 2001 From: Nihility Date: Sun, 8 Sep 2024 17:25:59 +0800 Subject: [PATCH 118/837] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E6=B5=81=E7=A8=8B=E7=9A=84=20key=20=E4=B8=BA=20verifi?= =?UTF-8?q?cationResultKey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/help/source/SourceVerificationHelp.kt | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt b/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt index c4f53dc9a328..2bc123253a67 100644 --- a/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt +++ b/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt @@ -19,8 +19,8 @@ object SourceVerificationHelp { private val waitTime = 1.minutes.inWholeNanoseconds - private fun getKey(source: BaseSource) = getKey(source.getKey()) - private fun getKey(sourceKey: String) = "${sourceKey}_verificationResult" + private fun getVerificationResultKey(source: BaseSource) = getVerificationResultKey(source.getKey()) + private fun getVerificationResultKey(sourceKey: String) = "${sourceKey}_verificationResult" /** * 获取书源验证结果 @@ -42,7 +42,7 @@ object SourceVerificationHelp { putExtra("imageUrl", url) putExtra("sourceOrigin", source.getKey()) putExtra("sourceName", source.getTag()) - IntentData.put(getKey(source), Thread.currentThread()) + IntentData.put(getVerificationResultKey(source), Thread.currentThread()) } } else { startBrowser(source, url, title, true) @@ -75,7 +75,6 @@ object SourceVerificationHelp { saveResult: Boolean? = false ) { source ?: throw NoStackTraceException("startBrowser parameter source cannot be null") - val key = getKey(source) appCtx.startActivity { putExtra("title", title) putExtra("url", url) @@ -83,26 +82,26 @@ object SourceVerificationHelp { putExtra("sourceName", source.getTag()) putExtra("sourceVerificationEnable", saveResult) IntentData.put(url, source.getHeaderMap(true)) - IntentData.put(key, Thread.currentThread()) + IntentData.put(getVerificationResultKey(source), Thread.currentThread()) } } fun checkResult(sourceKey: String) { getResult(sourceKey) ?: setResult(sourceKey, "") - val thread = IntentData.get(getKey(sourceKey)) + val thread = IntentData.get(getVerificationResultKey(sourceKey)) LockSupport.unpark(thread) } fun setResult(sourceKey: String, result: String?) { - CacheManager.putMemory(getKey(sourceKey), result ?: "") + CacheManager.putMemory(getVerificationResultKey(sourceKey), result ?: "") } fun getResult(sourceKey: String): String? { - return CacheManager.get(getKey(sourceKey)) + return CacheManager.get(getVerificationResultKey(sourceKey)) } fun clearResult(sourceKey: String) { - CacheManager.delete(getKey(sourceKey)) + CacheManager.delete(getVerificationResultKey(sourceKey)) } } From f20ad82ae4d2d9db5c8a007025e6006c67a25ea7 Mon Sep 17 00:00:00 2001 From: Nihility Date: Sun, 8 Sep 2024 18:30:50 +0800 Subject: [PATCH 119/837] =?UTF-8?q?startBrowserAwait=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=20refetchAfterSuccess=20=E5=8F=82=E6=95=B0=EF=BC=8C=E4=B8=BA?= =?UTF-8?q?=20true=20=E6=97=B6=E8=BF=94=E5=9B=9E=E7=9A=84=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=BA=90=E7=A0=81=E4=B8=BA=E7=94=A8=E6=88=B7=E7=9C=8B?= =?UTF-8?q?=E8=A7=81=E7=9A=84=E9=A1=B5=E9=9D=A2=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/help/JsExtensions.kt | 4 +-- .../app/help/source/SourceVerificationHelp.kt | 9 ++++-- .../app/model/analyzeRule/AnalyzeUrl.kt | 4 ++- .../legado/app/ui/browser/WebViewActivity.kt | 4 +-- .../io/legado/app/ui/browser/WebViewModel.kt | 28 +++++++++++++++---- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index e71d18e8d8f8..a87e1f1c6536 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -226,10 +226,10 @@ interface JsExtensions : JsEncodeUtils { /** * 使用内置浏览器打开链接,并等待网页结果 */ - fun startBrowserAwait(url: String, title: String): StrResponse { + fun startBrowserAwait(url: String, title: String, refetchAfterSuccess: Boolean = true): StrResponse { return StrResponse( url, - SourceVerificationHelp.getVerificationResult(getSource(), url, title, true) + SourceVerificationHelp.getVerificationResult(getSource(), url, title, true, refetchAfterSuccess) ) } diff --git a/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt b/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt index 2bc123253a67..5f28d6a9bcbb 100644 --- a/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt +++ b/app/src/main/java/io/legado/app/help/source/SourceVerificationHelp.kt @@ -30,7 +30,8 @@ object SourceVerificationHelp { source: BaseSource?, url: String, title: String, - useBrowser: Boolean + useBrowser: Boolean, + refetchAfterSuccess: Boolean = true ): String { source ?: throw NoStackTraceException("getVerificationResult parameter source cannot be null") @@ -45,7 +46,7 @@ object SourceVerificationHelp { IntentData.put(getVerificationResultKey(source), Thread.currentThread()) } } else { - startBrowser(source, url, title, true) + startBrowser(source, url, title, true, refetchAfterSuccess) } var waitUserInput = false @@ -72,7 +73,8 @@ object SourceVerificationHelp { source: BaseSource?, url: String, title: String, - saveResult: Boolean? = false + saveResult: Boolean? = false, + refetchAfterSuccess: Boolean? = true ) { source ?: throw NoStackTraceException("startBrowser parameter source cannot be null") appCtx.startActivity { @@ -81,6 +83,7 @@ object SourceVerificationHelp { putExtra("sourceOrigin", source.getKey()) putExtra("sourceName", source.getTag()) putExtra("sourceVerificationEnable", saveResult) + putExtra("refetchAfterSuccess", refetchAfterSuccess) IntentData.put(url, source.getHeaderMap(true)) IntentData.put(getVerificationResultKey(source), Thread.currentThread()) } diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index 7b2f87069634..a070a69f633a 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -193,8 +193,10 @@ class AnalyzeUrl( baseUrl = it } if (urlNoOption.length != ruleUrl.length) { - GSON.fromJsonObject(ruleUrl.substring(urlMatcher.end())).getOrNull() + val optionStr = ruleUrl.substring(urlMatcher.end()) + GSON.fromJsonObject(optionStr).getOrNull() ?.let { option -> + this.optionStr = optionStr option.getMethod()?.let { if (it.equals("POST", true)) method = RequestMethod.POST } diff --git a/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt b/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt index 5833f0099e40..65d6d9ecc2d0 100644 --- a/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt +++ b/app/src/main/java/io/legado/app/ui/browser/WebViewActivity.kt @@ -82,7 +82,7 @@ class WebViewActivity : VMBaseActivity() { R.id.menu_copy_url -> sendToClip(viewModel.baseUrl) R.id.menu_ok -> { if (viewModel.sourceVerificationEnable) { - viewModel.saveVerificationResult(intent) { + viewModel.saveVerificationResult(binding.webView) { finish() } } else { @@ -224,7 +224,7 @@ class WebViewActivity : VMBaseActivity() { if (it == "true") { isCloudflareChallenge = true } else if (isCloudflareChallenge && viewModel.sourceVerificationEnable) { - viewModel.saveVerificationResult(intent) { + viewModel.saveVerificationResult(binding.webView) { finish() } } diff --git a/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt b/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt index 99819e5dd2e2..bab12ed9718a 100644 --- a/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.net.Uri import android.util.Base64 import android.webkit.URLUtil +import android.webkit.WebView import androidx.documentfile.provider.DocumentFile import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppConst @@ -22,14 +23,17 @@ import io.legado.app.utils.isContentScheme import io.legado.app.utils.printOnDebug import io.legado.app.utils.toastOnUi import io.legado.app.utils.writeBytes +import org.apache.commons.text.StringEscapeUtils import java.io.File import java.util.Date class WebViewModel(application: Application) : BaseViewModel(application) { + var intent: Intent? = null var baseUrl: String = "" var html: String? = null val headerMap: HashMap = hashMapOf() var sourceVerificationEnable: Boolean = false + var refetchAfterSuccess: Boolean = true var sourceOrigin: String = "" fun initData( @@ -37,10 +41,12 @@ class WebViewModel(application: Application) : BaseViewModel(application) { success: () -> Unit ) { execute { + this@WebViewModel.intent = intent val url = intent.getStringExtra("url") ?: throw NoStackTraceException("url不能为空") sourceOrigin = intent.getStringExtra("sourceOrigin") ?: "" sourceVerificationEnable = intent.getBooleanExtra("sourceVerificationEnable", false) + refetchAfterSuccess = intent.getBooleanExtra("refetchAfterSuccess", true) val headerMapF = IntentData.get>(url) val analyzeUrl = AnalyzeUrl(url, headerMapF = headerMapF) baseUrl = analyzeUrl.url @@ -89,10 +95,13 @@ class WebViewModel(application: Application) : BaseViewModel(application) { } } - fun saveVerificationResult(intent: Intent, success: () -> Unit) { - execute { - if (sourceVerificationEnable) { - val url = intent.getStringExtra("url")!! + fun saveVerificationResult(webView: WebView, success: () -> Unit) { + if (!sourceVerificationEnable) { + execute { success.invoke() } + } + if (refetchAfterSuccess) { + execute { + val url = intent!!.getStringExtra("url")!! val source = appDb.bookSourceDao.getBookSource(sourceOrigin) html = AnalyzeUrl( url, @@ -100,9 +109,16 @@ class WebViewModel(application: Application) : BaseViewModel(application) { source = source ).getStrResponseAwait(useWebView = false).body SourceVerificationHelp.setResult(sourceOrigin, html ?: "") + success.invoke() + } + } else { + webView.evaluateJavascript("document.documentElement.outerHTML") { + execute { + html = StringEscapeUtils.unescapeJson(it).trim('"') + SourceVerificationHelp.setResult(sourceOrigin, html ?: "") + success.invoke() + } } - }.onSuccess { - success.invoke() } } From 79c5ab8dbb1dac657208babcfadcae677f0df407 Mon Sep 17 00:00:00 2001 From: Nihility Date: Sun, 8 Sep 2024 18:33:51 +0800 Subject: [PATCH 120/837] =?UTF-8?q?js=20=E5=88=97=E8=A1=A8=E8=A7=84?= =?UTF-8?q?=E5=88=99=E5=8F=8A=E5=88=97=E8=A1=A8=E5=AD=90=E9=A1=B9=E8=A7=84?= =?UTF-8?q?=E5=88=99=E4=B8=AD=E6=94=AF=E6=8C=81=20baseUrlWithOptions=20?= =?UTF-8?q?=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/web/help/md/jsHelp.md | 3 ++- .../java/io/legado/app/model/analyzeRule/AnalyzeRule.kt | 8 ++++++++ .../java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt | 1 + app/src/main/java/io/legado/app/model/webBook/BookList.kt | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/src/main/assets/web/help/md/jsHelp.md b/app/src/main/assets/web/help/md/jsHelp.md index 5bdff919b016..efd6bc6da1c4 100644 --- a/app/src/main/assets/web/help/md/jsHelp.md +++ b/app/src/main/assets/web/help/md/jsHelp.md @@ -20,7 +20,8 @@ |变量名|调用类| |------|-----| |java|当前类| -|baseUrl|当前url,String | +|baseUrl|String,当前 url,如 `https://example.com/page/1`| +|baseUrlWithOptions|String,带参数的当前 url,如 `https://example.com/page/1,{"webView": true}`| |result|上一步的结果| |book|[书籍类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/Book.kt)| |chapter|[章节类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/BookChapter.kt)| diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 24bcd37ac591..5bf2725c4add 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -54,6 +54,8 @@ class AnalyzeRule( private set var baseUrl: String? = null private set + var optionStr: String = "{}" + private set var redirectUrl: URL? = null private set private var isJSON: Boolean = false @@ -94,6 +96,11 @@ class AnalyzeRule( return this } + fun setOption(option: String): AnalyzeRule { + optionStr = option + return this + } + fun setRedirectUrl(url: String): URL? { try { redirectUrl = URL(url) @@ -747,6 +754,7 @@ class AnalyzeRule( bindings["book"] = book bindings["result"] = result bindings["baseUrl"] = baseUrl + bindings["baseUrlWithOptions"] = "$baseUrl,$optionStr" bindings["chapter"] = chapter bindings["title"] = chapter?.title bindings["src"] = content diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index a070a69f633a..814c3ec5d1cd 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -76,6 +76,7 @@ class AnalyzeUrl( var type: String? = null private set val headerMap = HashMap() + var optionStr: String = "" private var urlNoQuery: String = "" private var queryStr: String? = null private val fieldMap = LinkedHashMap() diff --git a/app/src/main/java/io/legado/app/model/webBook/BookList.kt b/app/src/main/java/io/legado/app/model/webBook/BookList.kt index d9f233dcf30a..f15f8f048152 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookList.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookList.kt @@ -43,7 +43,7 @@ object BookList { Debug.log(bookSource.bookSourceUrl, "≡获取成功:${analyzeUrl.ruleUrl}") Debug.log(bookSource.bookSourceUrl, body, state = 10) val analyzeRule = AnalyzeRule(ruleData, bookSource) - analyzeRule.setContent(body).setBaseUrl(baseUrl) + analyzeRule.setContent(body).setBaseUrl(baseUrl).setOption(analyzeUrl.optionStr) analyzeRule.setRedirectUrl(baseUrl) analyzeRule.setCoroutineContext(coroutineContext) if (isSearch) bookSource.bookUrlPattern?.let { From 0d7690b2994fc22016183f12a2818d94eaa58d00 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Mon, 9 Sep 2024 20:05:26 +0800 Subject: [PATCH 121/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/web/help/md/jsHelp.md | 3 +-- app/src/main/java/io/legado/app/help/JsExtensions.kt | 12 ++++++++---- .../io/legado/app/model/analyzeRule/AnalyzeRule.kt | 8 -------- .../io/legado/app/model/analyzeRule/AnalyzeUrl.kt | 5 +---- .../java/io/legado/app/model/webBook/BookList.kt | 2 +- 5 files changed, 11 insertions(+), 19 deletions(-) diff --git a/app/src/main/assets/web/help/md/jsHelp.md b/app/src/main/assets/web/help/md/jsHelp.md index efd6bc6da1c4..5bdff919b016 100644 --- a/app/src/main/assets/web/help/md/jsHelp.md +++ b/app/src/main/assets/web/help/md/jsHelp.md @@ -20,8 +20,7 @@ |变量名|调用类| |------|-----| |java|当前类| -|baseUrl|String,当前 url,如 `https://example.com/page/1`| -|baseUrlWithOptions|String,带参数的当前 url,如 `https://example.com/page/1,{"webView": true}`| +|baseUrl|当前url,String | |result|上一步的结果| |book|[书籍类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/Book.kt)| |chapter|[章节类](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/data/entities/BookChapter.kt)| diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index a87e1f1c6536..20c40b5ca775 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -226,11 +226,15 @@ interface JsExtensions : JsEncodeUtils { /** * 使用内置浏览器打开链接,并等待网页结果 */ - fun startBrowserAwait(url: String, title: String, refetchAfterSuccess: Boolean = true): StrResponse { - return StrResponse( - url, - SourceVerificationHelp.getVerificationResult(getSource(), url, title, true, refetchAfterSuccess) + fun startBrowserAwait(url: String, title: String, refetchAfterSuccess: Boolean): StrResponse { + val body = SourceVerificationHelp.getVerificationResult( + getSource(), url, title, true, refetchAfterSuccess ) + return StrResponse(url, body) + } + + fun startBrowserAwait(url: String, title: String): StrResponse { + return startBrowserAwait(url, title, true) } /** diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 5bf2725c4add..24bcd37ac591 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -54,8 +54,6 @@ class AnalyzeRule( private set var baseUrl: String? = null private set - var optionStr: String = "{}" - private set var redirectUrl: URL? = null private set private var isJSON: Boolean = false @@ -96,11 +94,6 @@ class AnalyzeRule( return this } - fun setOption(option: String): AnalyzeRule { - optionStr = option - return this - } - fun setRedirectUrl(url: String): URL? { try { redirectUrl = URL(url) @@ -754,7 +747,6 @@ class AnalyzeRule( bindings["book"] = book bindings["result"] = result bindings["baseUrl"] = baseUrl - bindings["baseUrlWithOptions"] = "$baseUrl,$optionStr" bindings["chapter"] = chapter bindings["title"] = chapter?.title bindings["src"] = content diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index 814c3ec5d1cd..7b2f87069634 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -76,7 +76,6 @@ class AnalyzeUrl( var type: String? = null private set val headerMap = HashMap() - var optionStr: String = "" private var urlNoQuery: String = "" private var queryStr: String? = null private val fieldMap = LinkedHashMap() @@ -194,10 +193,8 @@ class AnalyzeUrl( baseUrl = it } if (urlNoOption.length != ruleUrl.length) { - val optionStr = ruleUrl.substring(urlMatcher.end()) - GSON.fromJsonObject(optionStr).getOrNull() + GSON.fromJsonObject(ruleUrl.substring(urlMatcher.end())).getOrNull() ?.let { option -> - this.optionStr = optionStr option.getMethod()?.let { if (it.equals("POST", true)) method = RequestMethod.POST } diff --git a/app/src/main/java/io/legado/app/model/webBook/BookList.kt b/app/src/main/java/io/legado/app/model/webBook/BookList.kt index f15f8f048152..d9f233dcf30a 100644 --- a/app/src/main/java/io/legado/app/model/webBook/BookList.kt +++ b/app/src/main/java/io/legado/app/model/webBook/BookList.kt @@ -43,7 +43,7 @@ object BookList { Debug.log(bookSource.bookSourceUrl, "≡获取成功:${analyzeUrl.ruleUrl}") Debug.log(bookSource.bookSourceUrl, body, state = 10) val analyzeRule = AnalyzeRule(ruleData, bookSource) - analyzeRule.setContent(body).setBaseUrl(baseUrl).setOption(analyzeUrl.optionStr) + analyzeRule.setContent(body).setBaseUrl(baseUrl) analyzeRule.setRedirectUrl(baseUrl) analyzeRule.setCoroutineContext(coroutineContext) if (isSearch) bookSource.bookUrlPattern?.let { From 71038abbb84ffef3bd31490effbf4e457e45b99a Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Mon, 9 Sep 2024 20:12:23 +0800 Subject: [PATCH 122/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt b/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt index bab12ed9718a..292ced78b56f 100644 --- a/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/browser/WebViewModel.kt @@ -11,7 +11,6 @@ import io.legado.app.base.BaseViewModel import io.legado.app.constant.AppConst import io.legado.app.data.appDb import io.legado.app.exception.NoStackTraceException -import io.legado.app.help.CacheManager import io.legado.app.help.IntentData import io.legado.app.help.http.newCallResponseBody import io.legado.app.help.http.okHttpClient @@ -97,7 +96,7 @@ class WebViewModel(application: Application) : BaseViewModel(application) { fun saveVerificationResult(webView: WebView, success: () -> Unit) { if (!sourceVerificationEnable) { - execute { success.invoke() } + return success.invoke() } if (refetchAfterSuccess) { execute { @@ -109,6 +108,7 @@ class WebViewModel(application: Application) : BaseViewModel(application) { source = source ).getStrResponseAwait(useWebView = false).body SourceVerificationHelp.setResult(sourceOrigin, html ?: "") + }.onSuccess { success.invoke() } } else { @@ -116,6 +116,7 @@ class WebViewModel(application: Application) : BaseViewModel(application) { execute { html = StringEscapeUtils.unescapeJson(it).trim('"') SourceVerificationHelp.setResult(sourceOrigin, html ?: "") + }.onSuccess { success.invoke() } } From caeee598490a518acf987e0a1085ff9ecbee038c Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:48:44 +0800 Subject: [PATCH 123/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/service/BaseReadAloudService.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index 1a29ee1fd94a..fc670f996e6f 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -275,6 +275,7 @@ abstract class BaseReadAloudService : BaseService(), isRun = true pause = false needResumeOnAudioFocusGain = false + needResumeOnCallStateIdle = false upReadAloudNotification() postEvent(EventBus.ALOUD_STATE, Status.PLAY) } @@ -302,6 +303,8 @@ abstract class BaseReadAloudService : BaseService(), @CallSuper open fun resumeReadAloud() { pause = false + needResumeOnAudioFocusGain = false + needResumeOnCallStateIdle = false upReadAloudNotification() upMediaSessionPlaybackState(PlaybackStateCompat.STATE_PLAYING) postEvent(EventBus.ALOUD_STATE, Status.PLAY) From f6c025d160f22a7d52adf754e1c311f20791c30b Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 10 Sep 2024 21:59:55 +0800 Subject: [PATCH 124/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/service/TTSReadAloudService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt index adac1ff50a75..c2f6a1a36652 100644 --- a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt @@ -197,7 +197,7 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener override fun onRangeStart(utteranceId: String?, start: Int, end: Int, frame: Int) { super.onRangeStart(utteranceId, start, end, frame) val msg = - "$TAG onRangeStart nowSpeak:$nowSpeak pageIndex:$pageIndex utteranceId:$utteranceId start:$start end:$end frame:$frame" + "onRangeStart nowSpeak:$nowSpeak pageIndex:$pageIndex utteranceId:$utteranceId start:$start end:$end frame:$frame" LogUtils.d(TAG, msg) textChapter?.let { if (readAloudNumber + start > it.getReadLength(pageIndex + 1)) { From 9b4c26a7b51727b1be3684028ab2ada6054fb779 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Fri, 13 Sep 2024 17:27:19 +0800 Subject: [PATCH 125/837] [skip ci] jt12.de change to jt12.eu See https://v2.jt12.eu/doc --- app/src/main/assets/defaultData/directLinkUpload.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/defaultData/directLinkUpload.json b/app/src/main/assets/defaultData/directLinkUpload.json index 15cac928d6fe..90046555b789 100644 --- a/app/src/main/assets/defaultData/directLinkUpload.json +++ b/app/src/main/assets/defaultData/directLinkUpload.json @@ -12,7 +12,7 @@ "compress": false }, { - "uploadUrl": "http://v2.jt12.de/up-v2.php,{\"method\":\"POST\",\"body\": {\"file\": \"fileRequest\"},\"type\": \"multipart/form-data\"}", + "uploadUrl": "http://v2.jt12.eu/up-v2.php,{\"method\":\"POST\",\"body\": {\"file\": \"fileRequest\"},\"type\": \"multipart/form-data\"}", "downloadUrlRule": "$.msg", "summary": "橘涂网盘·过于卡顿,如非需要永久链接。否则不建议使用(永久有效)", "compress": false From 3700b15c820a09339be447dcc96cdcb79e57cdb1 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Fri, 13 Sep 2024 17:35:34 +0800 Subject: [PATCH 126/837] [skip ci] Change app share url to github --- app/src/main/res/values-es-rES/strings.xml | 2 +- app/src/main/res/values-ja-rJP/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-vi/strings.xml | 2 +- app/src/main/res/values-zh-rHK/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values-zh/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 2b7e7ac72047..047a7afb321b 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -91,7 +91,7 @@ precarga el o los capítulos(s) seleccionado(s) en Almacenamiento en caché Cambiar origen \u3000\u3000 Este es una aplicación de lectura bajo software libre, desarrollado en Kotlin, en que podrás participar. - Legado (YueDu 3.0) disponible para descargar en:\n https://play.google.com/store/apps/details?id=io.legado.play.release + Legado (YueDu 3.0) disponible para descargar en:\n https://github.com/gedoor/legado/releases Versión %s Verificación en segundo plano podrá utilizar con libertad cuando se verifique la fuente del libro diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index 383be6d32fe0..d93a197ddb5d 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -94,7 +94,7 @@ \u3000\u3000 This is an open source reading software newly developed by Kotlin, welcome to join us. - Legado (YueDu 3.0) download link:\n https://play.google.com/store/apps/details?id=io.legado.play.release + Legado (YueDu 3.0) download link:\n https://github.com/gedoor/legado/releases Version %s Background-verification diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index db6b9c2a0608..b749ccdf4ddb 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -94,7 +94,7 @@ \u3000\u3000 Este é um App de leitura de software livre, desenvolvido em Kotlin, você é bem-vindo a participar em projeto. - Legado (YueDu 3.0) link de download:\n https://play.google.com/store/apps/details?id=io.legado.play.release + Legado (YueDu 3.0) link de download:\n https://github.com/gedoor/legado/releases Versão %s Verificação em segundo plano diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 46013746bb12..a2eb0523812f 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -90,7 +90,7 @@ cache (các) chương đã chọn vào bộ lưu trữ Thay đổi nguồn gốc Đây là phần mềm đọc mã nguồn mở mới được phát triển bởi Kotlin, chào mừng bạn tham gia cùng chúng tôi. - \n Liên kết tải xuống Legado (YueDu 3.0):\\n https://play.google.com/store/apps/details?id=io.legado.play.release\n + \n Liên kết tải xuống Legado (YueDu 3.0):\\n https://github.com/gedoor/legado/releases\n Phiên bản %s Xác minh lý lịch bạn có thể tự do thao tác khi xác thực nguồn sách diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 5c5d6d239765..05b7583eac5f 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -91,7 +91,7 @@ \u3000\u3000這是一款使用 Kotlin 全新開發的開源的閲讀應用程式,歡迎你的加入。 - 閲讀3.0下載地址:\nhttps://play.google.com/store/apps/details?id=io.legado.play.release + 閲讀3.0下載地址:\nhttps://github.com/gedoor/legado/releases Version %s 後臺校驗書源 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 9179b975488f..27971b84690f 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -93,7 +93,7 @@ \u3000\u3000這是一款使用Kotlin全新開發的開源的閱讀軟體,歡迎您的加入。 - 閱讀3.0下載網址:\nhttps://play.google.com/store/apps/details?id=io.legado.play.release + 閱讀3.0下載網址:\nhttps://github.com/gedoor/legado/releases Version %s 後臺校驗書源 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 4dc0bfa78d88..fd13a510f88b 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -93,7 +93,7 @@ \u3000\u3000这是一款使用 Kotlin 全新开发的开源的阅读软件,欢迎您的加入。 - 阅读 3.0 下载地址:\nhttps://www.coolapk.com/apk/256030 + 阅读 3.0 下载地址:\nhttps://github.com/gedoor/legado/releases 版本 %s 后台校验书源 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d8af107611c2..233aeb80b4b1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -94,7 +94,7 @@ \u3000\u3000 This is an open source reading software newly developed by Kotlin, welcome to join us. - Legado (YueDu 3.0) download link:\n https://play.google.com/store/apps/details?id=io.legado.play.release + Legado (YueDu 3.0) download link:\n https://github.com/gedoor/legado/releases Version %s Background-verification From b02b59ea37eb78de3b6327e09fa1a4b834852b56 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Fri, 13 Sep 2024 17:43:22 +0800 Subject: [PATCH 127/837] [skip ci] docs: Update jshelp.md ref: https://github.com/gedoor/legado/pull/4193 --- app/src/main/assets/web/help/md/jsHelp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/web/help/md/jsHelp.md b/app/src/main/assets/web/help/md/jsHelp.md index 5bdff919b016..42e6164541f7 100644 --- a/app/src/main/assets/web/help/md/jsHelp.md +++ b/app/src/main/assets/web/help/md/jsHelp.md @@ -140,7 +140,7 @@ java.webViewGetSource(html: String?, url: String?, js: String?, sourceRegex: Str java.startBrowser(url: String, title: String) * 使用内置浏览器打开链接,并等待网页结果 .body()获取网页内容 -java.startBrowserAwait(url: String, title: String): StrResponse +java.startBrowserAwait(url: String, title: String, refetchAfterSuccess: Boolean? = true): StrResponse ``` * 调试 ```js From d51d0f8301f4e5fd85b16d70ea401853968ed6dd Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 13 Sep 2024 22:25:15 +0800 Subject: [PATCH 128/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 1 + gradle/libs.versions.toml | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 20e43e999852..c36830debb62 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -178,6 +178,7 @@ dependencies { implementation(libs.preference.ktx) implementation(libs.androidx.constraintlayout) implementation(libs.androidx.swiperefreshlayout) + implementation(libs.androidx.recyclerview) implementation(libs.androidx.viewpager2) implementation(libs.androidx.webkit) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 204a349ded28..139ecb53c87b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -43,7 +43,8 @@ desugar = "2.0.4" activity = "1.9.1" kotlinxSerialization = "1.7.1" swiperefreshlayout = "1.1.0" -viewpager2 = "1.1.0" +recyclerview = "1.2.0" +viewpager2 = "1.0.0" webkit = "1.11.0" zxingLite = "3.2.0" @@ -127,6 +128,7 @@ splitties-views = { module = "com.louiscad.splitties:splitties-views", version.r androidx-runner = { module = "androidx.test:runner", version = "1.6.2" } androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshlayout" } +androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" } androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = "viewpager2" } androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } colorpicker = { module = "com.jaredrummler:colorpicker", version.ref = "colorpicker" } From f074e8bf2f3865ed7db9cf720d4de07d69d92ffd Mon Sep 17 00:00:00 2001 From: sheng-ri <38691071+sheng-ri@users.noreply.github.com> Date: Sat, 14 Sep 2024 11:34:55 +0800 Subject: [PATCH 129/837] fix-empty-tts-text (#4199) --- .../legado/app/service/TTSReadAloudService.kt | 48 ++++++++++--------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt index c2f6a1a36652..aa3e3962bc1b 100644 --- a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt @@ -93,37 +93,41 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener LogUtils.d(TAG, "朗读列表大小 ${contentList.size}") LogUtils.d(TAG, "朗读页数 ${textChapter?.pageSize}") val tts = textToSpeech ?: throw NoStackTraceException("tts is null") - var result = tts.runCatching { - speak("", TextToSpeech.QUEUE_FLUSH, null, null) - }.getOrElse { - AppLog.put("tts出错\n${it.localizedMessage}", it, true) - TextToSpeech.ERROR - } - if (result == TextToSpeech.ERROR) { - AppLog.put("tts出错 尝试重新初始化") - clearTTS() - initTts() - return@execute - } - val contentList = contentList for (i in nowSpeak until contentList.size) { - ensureActive() var text = contentList[i] + ensureActive() if (paragraphStartPos > 0 && i == nowSpeak) { text = text.substring(paragraphStartPos) } if (text.matches(AppPattern.notReadAloudRegex)) { continue } - result = tts.runCatching { - speak(text, TextToSpeech.QUEUE_ADD, null, AppConst.APP_TAG + i) - }.getOrElse { - AppLog.put("tts出错\n${it.localizedMessage}", it, true) - TextToSpeech.ERROR - } - if (result == TextToSpeech.ERROR) { - AppLog.put("tts朗读出错:$text") + if (i == nowSpeak) { + val result = tts.runCatching { + speak(text, TextToSpeech.QUEUE_FLUSH, null, AppConst.APP_TAG + i) + }.getOrElse { + AppLog.put("tts出错\n${it.localizedMessage}", it, true) + TextToSpeech.ERROR + } + if (result == TextToSpeech.ERROR) { + AppLog.put("tts出错 尝试重新初始化") + clearTTS() + initTts() + return@execute + } + } else { + val result = tts.runCatching { + speak(text, TextToSpeech.QUEUE_ADD, null, AppConst.APP_TAG + i) + }.getOrElse { + AppLog.put("tts出错\n${it.localizedMessage}", it, true) + TextToSpeech.ERROR + } + if (result == TextToSpeech.ERROR) { + AppLog.put("tts朗读出错:$text") + } } + + } LogUtils.d(TAG, "朗读内容添加完成") }.onError { From 8ebb22eed2de1145f31b83863ab59f6fc435ccc7 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 14 Sep 2024 11:41:44 +0800 Subject: [PATCH 130/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/service/TTSReadAloudService.kt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt index aa3e3962bc1b..49d5d4b786a7 100644 --- a/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/TTSReadAloudService.kt @@ -93,9 +93,10 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener LogUtils.d(TAG, "朗读列表大小 ${contentList.size}") LogUtils.d(TAG, "朗读页数 ${textChapter?.pageSize}") val tts = textToSpeech ?: throw NoStackTraceException("tts is null") + val contentList = contentList for (i in nowSpeak until contentList.size) { - var text = contentList[i] ensureActive() + var text = contentList[i] if (paragraphStartPos > 0 && i == nowSpeak) { text = text.substring(paragraphStartPos) } @@ -126,8 +127,6 @@ class TTSReadAloudService : BaseReadAloudService(), TextToSpeech.OnInitListener AppLog.put("tts朗读出错:$text") } } - - } LogUtils.d(TAG, "朗读内容添加完成") }.onError { From 7c414dc87326d65d770d0cbe899d2ccf860ca10f Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Sun, 15 Sep 2024 12:31:49 +0800 Subject: [PATCH 131/837] [skip ci] doc: update github/rhino link --- app/src/main/assets/web/help/md/jsHelp.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/assets/web/help/md/jsHelp.md b/app/src/main/assets/web/help/md/jsHelp.md index 42e6164541f7..ec213bf0899d 100644 --- a/app/src/main/assets/web/help/md/jsHelp.md +++ b/app/src/main/assets/web/help/md/jsHelp.md @@ -1,13 +1,13 @@ # js变量和函数 > 阅读使用[Rhino](https://github.com/mozilla/rhino)作为JavaScript引擎以便于[调用Java类和方法](https://m.jb51.net/article/92138.htm),查看[ECMAScript兼容性表格](https://mozilla.github.io/rhino/compat/engines.html) -> [Rhino运行时](https://github.com/mozilla/rhino/blob/master/src/org/mozilla/javascript/ScriptRuntime.java#L299)懒加载导入的Java类和方法 +> [Rhino运行时](https://github.com/mozilla/rhino/blob/master/rhino/src/main/java/org/mozilla/javascript/ScriptRuntime.java#L299)懒加载导入的Java类和方法 |构造函数|函数|对象|调用类|简要说明| |------|-----|------|----|------| -|JavaImporter|importClass importPackage| |[ImporterTopLevel](https://github.com/mozilla/rhino/blob/master/src/org/mozilla/javascript/ImporterTopLevel.java#L147-L190)|导入Java类到JavaScript| -||getClass|Packages java javax ...|[NativeJavaTopPackage](https://github.com/mozilla/rhino/blob/master/src/org/mozilla/javascript/NativeJavaTopPackage.java#L66-L104)|默认导入JavaScript中的Java类| -|JavaAdapter|||[JavaAdapter](https://github.com/mozilla/rhino/blob/master/src/org/mozilla/javascript/JavaAdapter.java)|继承Java类| +|JavaImporter|importClass importPackage| |[ImporterTopLevel](https://github.com/mozilla/rhino/blob/master/rhino/src/main/java/org/mozilla/javascript/ImporterTopLevel.java#L147-L190)|导入Java类到JavaScript| +||getClass|Packages java javax ...|[NativeJavaTopPackage](https://github.com/mozilla/rhino/blob/master/rhino/src/main/java/org/mozilla/javascript/NativeJavaTopPackage.java#L66-L104)|默认导入JavaScript中的Java类| +|JavaAdapter|||[JavaAdapter](https://github.com/mozilla/rhino/blob/master/rhino/src/main/java//org/mozilla/javascript/JavaAdapter.java)|继承Java类| > 注意`java`变量指向已经被阅读修改,如果想要调用`java.*`下的包,请使用`Packages.java.*` From 8ae494056da4eae728c64b7fe2242a5154f707c2 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 15 Sep 2024 15:15:54 +0800 Subject: [PATCH 132/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/BaseReadAloudService.kt | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index fc670f996e6f..da5d0f961a92 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -42,6 +42,7 @@ import io.legado.app.model.ReadBook import io.legado.app.receiver.MediaButtonReceiver import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.book.read.page.entities.TextChapter +import io.legado.app.utils.LogUtils import io.legado.app.utils.activityPendingIntent import io.legado.app.utils.broadcastPendingIntent import io.legado.app.utils.getPrefBoolean @@ -634,35 +635,41 @@ abstract class BaseReadAloudService : BaseService(), } } - @Suppress("DEPRECATION") private fun unregisterPhoneStateListener(l: PhoneStateListener) { if (registeredPhoneStateListener) { - registerPhoneStateListener(l, true) + withReadPhoneStatePermission { + telephonyManager.listen(l, PhoneStateListener.LISTEN_NONE) + registeredPhoneStateListener = false + } + } + } + + private fun registerPhoneStateListener(l: PhoneStateListener) { + withReadPhoneStatePermission { + telephonyManager.listen(l, PhoneStateListener.LISTEN_CALL_STATE) + registeredPhoneStateListener = true } } - @Suppress("DEPRECATION") - private fun registerPhoneStateListener(l: PhoneStateListener, unregister: Boolean = false) { + private fun withReadPhoneStatePermission(block: () -> Unit) { try { - if (unregister) { - telephonyManager.listen(l, PhoneStateListener.LISTEN_NONE) - registeredPhoneStateListener = false - } else { - telephonyManager.listen(l, PhoneStateListener.LISTEN_CALL_STATE) - registeredPhoneStateListener = true - } - } catch (e: SecurityException) { + block.invoke() + } catch (_: SecurityException) { PermissionsCompat.Builder() .addPermissions(Permissions.READ_PHONE_STATE) .rationale(R.string.read_aloud_read_phone_state_permission_rationale) .onGranted { - registerPhoneStateListener(l, unregister) + try { + block.invoke() + } catch (_: SecurityException) { + LogUtils.d(TAG, "Grant read phone state permission fail.") + } } .request() } } - @Suppress("DEPRECATION", "OVERRIDE_DEPRECATION") + @Suppress("OVERRIDE_DEPRECATION") inner class ReadAloudPhoneStateListener : PhoneStateListener() { override fun onCallStateChanged(state: Int, phoneNumber: String?) { super.onCallStateChanged(state, phoneNumber) From c892436c7480d13a97637feeaf3814def4edfa5e Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 15 Sep 2024 15:37:25 +0800 Subject: [PATCH 133/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/model/analyzeRule/AnalyzeRule.kt | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt index 24bcd37ac591..8bc80c3c650d 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeRule.kt @@ -2,7 +2,6 @@ package io.legado.app.model.analyzeRule import android.text.TextUtils import androidx.annotation.Keep -import com.script.ScriptBindings import com.script.buildScriptBindings import com.script.rhino.RhinoScriptEngine import io.legado.app.constant.AppPattern.JS_PATTERN @@ -31,7 +30,6 @@ import java.net.URL import java.util.regex.Pattern import kotlin.collections.component1 import kotlin.collections.component2 -import kotlin.collections.set import kotlin.coroutines.ContinuationInterceptor import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext @@ -444,15 +442,10 @@ class AnalyzeRule( /** * getString 类规则缓存 */ - fun splitSourceRuleCacheString(ruleStr: String?): List { + private fun splitSourceRuleCacheString(ruleStr: String?): List { if (ruleStr.isNullOrEmpty()) return emptyList() - val cacheRule = stringRuleCache[ruleStr] - return if (cacheRule != null) { - cacheRule - } else { - val rules = splitSourceRule(ruleStr) - stringRuleCache[ruleStr] = rules - rules + return stringRuleCache.getOrPut(ruleStr) { + splitSourceRule(ruleStr) } } From 7af57714eb05bc1de13991706267b34bf923ca36 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 15 Sep 2024 20:48:49 +0800 Subject: [PATCH 134/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/ReadBookActivity.kt | 7 +- .../io/legado/app/ui/book/read/ReadMenu.kt | 6 + .../io/legado/app/ui/book/read/SearchMenu.kt | 18 +- .../app/ui/book/read/config/AutoReadDialog.kt | 6 +- .../ui/book/read/config/ReadAloudDialog.kt | 6 +- app/src/main/res/layout/view_search_menu.xml | 388 +++++++++--------- 6 files changed, 226 insertions(+), 205 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index dd75a8d5fc03..fe0932688190 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -111,7 +111,6 @@ import io.legado.app.utils.isAbsUrl import io.legado.app.utils.isTrue import io.legado.app.utils.launch import io.legado.app.utils.navigationBarGravity -import io.legado.app.utils.navigationBarHeight import io.legado.app.utils.observeEvent import io.legado.app.utils.observeEventSticky import io.legado.app.utils.postEvent @@ -297,7 +296,7 @@ class ReadBookActivity : BaseReadBookActivity(), if (!ReadBook.inBookshelf) { viewModel.removeFromBookshelf(null) } - viewModel.initData(intent ?: return) + viewModel.initData(intent) } override fun onWindowFocusChanged(hasFocus: Boolean) { @@ -776,7 +775,7 @@ class ReadBookActivity : BaseReadBookActivity(), override fun showTextActionMenu() { val navigationBarHeight = if (!ReadBookConfig.hideNavigationBar && navigationBarGravity == Gravity.BOTTOM) - navigationBarHeight else 0 + binding.navigationBar.height else 0 textActionMenu.show( binding.textMenuPosition, binding.root.height + navigationBarHeight, @@ -1341,7 +1340,7 @@ class ReadBookActivity : BaseReadBookActivity(), } val navigationBarHeight = if (!ReadBookConfig.hideNavigationBar && navigationBarGravity == Gravity.BOTTOM) - navigationBarHeight else 0 + binding.navigationBar.height else 0 popupAction.showAtLocation( binding.readView, Gravity.BOTTOM or Gravity.LEFT, x.toInt(), binding.root.height + navigationBarHeight - y.toInt() diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index 75395062dd66..06d5a6ceb950 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -64,6 +64,7 @@ class ReadMenu @JvmOverloads constructor( private val callBack: CallBack get() = activity as CallBack private val binding = ViewReadMenuBinding.inflate(LayoutInflater.from(context), this, true) private var confirmSkipToChapter: Boolean = false + private var isMenuOutAnimating = false private val menuTopIn: Animation by lazy { loadAnimation(context, R.anim.anim_readbook_top_in) } @@ -151,6 +152,7 @@ class ReadMenu @JvmOverloads constructor( } private val menuOutListener = object : Animation.AnimationListener { override fun onAnimationStart(animation: Animation) { + isMenuOutAnimating = true binding.vwMenuBg.setOnClickListener(null) } @@ -159,6 +161,7 @@ class ReadMenu @JvmOverloads constructor( binding.titleBar.invisible() binding.bottomMenu.invisible() canShowMenu = false + isMenuOutAnimating = false onMenuOutEnd?.invoke() callBack.upSystemUiVisibility() } @@ -309,6 +312,9 @@ class ReadMenu @JvmOverloads constructor( } fun runMenuOut(anim: Boolean = !AppConfig.isEInkMode, onMenuOutEnd: (() -> Unit)? = null) { + if (isMenuOutAnimating) { + return + } callBack.onMenuHide() this.onMenuOutEnd = onMenuOutEnd if (this.isVisible) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/SearchMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/SearchMenu.kt index 6edf40f808f6..f957a2b4c7a1 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/SearchMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/SearchMenu.kt @@ -48,6 +48,7 @@ class SearchMenu @JvmOverloads constructor( Selector.colorBuild().setDefaultColor(bgColor) .setPressedColor(ColorUtils.darkenColor(bgColor)).create() private var onMenuOutEnd: (() -> Unit)? = null + private var isMenuOutAnimating = false private val searchResultList: MutableList = mutableListOf() private var currentSearchResultIndex: Int = -1 @@ -94,18 +95,18 @@ class SearchMenu @JvmOverloads constructor( fun runMenuIn() { this.visible() - binding.llSearchBaseInfo.visible() - binding.llBottomBg.visible() + binding.llBottomMenu.visible() binding.vwMenuBg.visible() - binding.llSearchBaseInfo.startAnimation(menuBottomIn) - binding.llBottomBg.startAnimation(menuBottomIn) + binding.llBottomMenu.startAnimation(menuBottomIn) } fun runMenuOut(onMenuOutEnd: (() -> Unit)? = null) { + if (isMenuOutAnimating) { + return + } this.onMenuOutEnd = onMenuOutEnd if (this.isVisible) { - binding.llSearchBaseInfo.startAnimation(menuBottomOut) - binding.llBottomBg.startAnimation(menuBottomOut) + binding.llBottomMenu.startAnimation(menuBottomOut) } } @@ -216,12 +217,13 @@ class SearchMenu @JvmOverloads constructor( //隐藏菜单 menuBottomOut.setAnimationListener(object : Animation.AnimationListener { override fun onAnimationStart(animation: Animation) { + isMenuOutAnimating = true binding.vwMenuBg.setOnClickListener(null) } override fun onAnimationEnd(animation: Animation) { - binding.llSearchBaseInfo.invisible() - binding.llBottomBg.invisible() + isMenuOutAnimating = false + binding.llBottomMenu.invisible() binding.vwMenuBg.invisible() binding.vwMenuBg.setOnClickListener { runMenuOut() } diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt index b637a9fe6744..59d02a1a1a2a 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/AutoReadDialog.kt @@ -49,7 +49,11 @@ class AutoReadDialog : BaseDialogFragment(R.layout.dialog_auto_read) { } override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) = binding.run { - (activity as ReadBookActivity).bottomDialog++ + val bottomDialog = (activity as ReadBookActivity).bottomDialog++ + if (bottomDialog > 0) { + dismiss() + return + } val bg = requireContext().bottomBackground val isLight = ColorUtils.isColorLight(bg) val textColor = requireContext().getPrimaryTextColor(isLight) diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt index 183c3c0b291d..56928ef7736b 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudDialog.kt @@ -49,7 +49,11 @@ class ReadAloudDialog : BaseDialogFragment(R.layout.dialog_read_aloud) { } override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { - (activity as ReadBookActivity).bottomDialog++ + val bottomDialog = (activity as ReadBookActivity).bottomDialog++ + if (bottomDialog > 0) { + dismiss() + return + } val bg = requireContext().bottomBackground val isLight = ColorUtils.isColorLight(bg) val textColor = requireContext().getPrimaryTextColor(isLight) diff --git a/app/src/main/res/layout/view_search_menu.xml b/app/src/main/res/layout/view_search_menu.xml index d5d311cfbc14..624551f18838 100644 --- a/app/src/main/res/layout/view_search_menu.xml +++ b/app/src/main/res/layout/view_search_menu.xml @@ -13,7 +13,7 @@ android:contentDescription="@string/content" tools:layout_editor_absoluteX="0dp" tools:layout_editor_absoluteY="0dp" - tools:visibility="invisible"/> + tools:visibility="invisible" /> - - - - - - - - - - - - + android:id="@+id/ll_search_base_info" + android:layout_width="match_parent" + android:layout_height="36dp" + android:background="@color/background_menu" + android:gravity="center_vertical" + android:orientation="horizontal" + android:paddingLeft="10dp" + android:paddingRight="10dp"> + + tools:ignore="UnusedAttribute" /> - - - + android:baselineAligned="false" + android:orientation="horizontal"> - + android:importantForAccessibility="no" /> - - + + - - - - + + + + + + + + + + + + + + + + + + android:focusable="true" + android:orientation="vertical" + android:paddingBottom="7dp"> - - + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - + + + From e4583fe2060388634dc65cc5d2753cae0d843bd3 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 19 Sep 2024 12:57:45 +0800 Subject: [PATCH 135/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/api/controller/BookController.kt | 15 +++++++++++++-- .../io/legado/app/ui/widget/dialog/PhotoDialog.kt | 7 +++++++ modules/web/src/views/BookShelf.vue | 5 ++++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/api/controller/BookController.kt b/app/src/main/java/io/legado/app/api/controller/BookController.kt index 50a93603f030..727c5d221237 100644 --- a/app/src/main/java/io/legado/app/api/controller/BookController.kt +++ b/app/src/main/java/io/legado/app/api/controller/BookController.kt @@ -1,6 +1,7 @@ package io.legado.app.api.controller import androidx.core.graphics.drawable.toBitmap +import com.bumptech.glide.Glide import io.legado.app.api.ReturnData import io.legado.app.data.appDb import io.legado.app.data.entities.Book @@ -63,11 +64,21 @@ object BookController { fun getCover(parameters: Map>): ReturnData { val returnData = ReturnData() val coverPath = parameters["path"]?.firstOrNull() - val ftBitmap = ImageLoader.loadBitmap(appCtx, coverPath).submit() + val ftBitmap = ImageLoader.loadBitmap(appCtx, coverPath) + .override(84, 112) + .centerCrop() + .submit() return try { returnData.setData(ftBitmap.get()) } catch (e: Exception) { - returnData.setData(BookCover.defaultDrawable.toBitmap()) + val defaultBitmap = Glide.with(appCtx) + .asBitmap() + .load(BookCover.defaultDrawable.toBitmap()) + .override(84, 112) + .centerCrop() + .submit() + .get() + returnData.setData(defaultBitmap) } } diff --git a/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt b/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt index 9e67598b2989..08b2c8fe4008 100644 --- a/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt +++ b/app/src/main/java/io/legado/app/ui/widget/dialog/PhotoDialog.kt @@ -4,6 +4,8 @@ import android.annotation.SuppressLint import android.os.Bundle import android.view.View import android.view.ViewGroup +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.load.resource.bitmap.DownsampleStrategy import com.bumptech.glide.request.RequestOptions import io.legado.app.R import io.legado.app.base.BaseDialogFragment @@ -50,6 +52,9 @@ class PhotoDialog() : BaseDialogFragment(R.layout.dialog_photo_view) { if (file?.exists() == true) { ImageLoader.load(requireContext(), file) .error(R.drawable.image_loading_error) + .dontTransform() + .downsample(DownsampleStrategy.NONE) + .diskCacheStrategy(DiskCacheStrategy.NONE) .into(binding.photoView) } else { ImageLoader.load(requireContext(), src).apply { @@ -62,6 +67,8 @@ class PhotoDialog() : BaseDialogFragment(R.layout.dialog_photo_view) { ) } }.error(BookCover.defaultDrawable) + .dontTransform() + .downsample(DownsampleStrategy.NONE) .into(binding.photoView) } } diff --git a/modules/web/src/views/BookShelf.vue b/modules/web/src/views/BookShelf.vue index 384c39e1d9f6..87e21ee4ccba 100644 --- a/modules/web/src/views/BookShelf.vue +++ b/modules/web/src/views/BookShelf.vue @@ -186,7 +186,10 @@ const handleBookClick = async (book) => { durChapterIndex = 0, durChapterPos = 0, } = book; - await API.saveBook(book); + // 判断是否为 searchBook + if (book.durChapterIndex === undefined) { + await API.saveBook(book); + } toDetail(bookUrl, name, author, durChapterIndex, durChapterPos); }; const toDetail = (bookUrl, bookName, bookAuthor, chapterIndex, chapterPos) => { From 8d2a37cd6b3ee8c4ff985f21c2390ecdad4310c7 Mon Sep 17 00:00:00 2001 From: 821938089 <821938089@users.noreply.github.com> Date: Thu, 19 Sep 2024 04:58:18 +0000 Subject: [PATCH 136/837] Bump web v3.24.091912 --- .../web/vue/assets/BookChapter-BDwWiA-_.js | 1 - .../web/vue/assets/BookChapter-txg2S1ZU.js | 1 + ...lf-Bs01BdYY.css => BookShelf-DZhbjTIU.css} | 2 +- .../web/vue/assets/BookShelf-DmN0EcU9.js | 1 - .../web/vue/assets/BookShelf-OCI2jMxW.js | 1 + .../web/vue/assets/bookStore-O1g6rLjj.js | 1 + .../assets/web/vue/assets/config-BsTATf_v.js | 1 + .../assets/web/vue/assets/config-MMLbq8EV.js | 1 - .../assets/web/vue/assets/index-CyZ_tLuT.js | 10 ++++ .../assets/web/vue/assets/index-DiJORxAd.js | 10 ---- .../assets/web/vue/assets/loading--qckEkbY.js | 1 + .../web/vue/assets/loading-B7pvk95E.css | 1 + .../assets/web/vue/assets/loading-BSPlXMjv.js | 1 - .../web/vue/assets/loading-CBQeIji2.css | 1 - .../assets/web/vue/assets/vendor-B4RITwN5.js | 50 ------------------- .../assets/web/vue/assets/vendor-C9cXVWQA.css | 1 - .../assets/web/vue/assets/vendor-S5atAh6y.css | 1 + .../assets/web/vue/assets/vendor-UVL3l2rb.js | 50 +++++++++++++++++++ app/src/main/assets/web/vue/index.html | 6 +-- 19 files changed, 71 insertions(+), 70 deletions(-) delete mode 100644 app/src/main/assets/web/vue/assets/BookChapter-BDwWiA-_.js create mode 100644 app/src/main/assets/web/vue/assets/BookChapter-txg2S1ZU.js rename app/src/main/assets/web/vue/assets/{BookShelf-Bs01BdYY.css => BookShelf-DZhbjTIU.css} (60%) delete mode 100644 app/src/main/assets/web/vue/assets/BookShelf-DmN0EcU9.js create mode 100644 app/src/main/assets/web/vue/assets/BookShelf-OCI2jMxW.js create mode 100644 app/src/main/assets/web/vue/assets/bookStore-O1g6rLjj.js create mode 100644 app/src/main/assets/web/vue/assets/config-BsTATf_v.js delete mode 100644 app/src/main/assets/web/vue/assets/config-MMLbq8EV.js create mode 100644 app/src/main/assets/web/vue/assets/index-CyZ_tLuT.js delete mode 100644 app/src/main/assets/web/vue/assets/index-DiJORxAd.js create mode 100644 app/src/main/assets/web/vue/assets/loading--qckEkbY.js create mode 100644 app/src/main/assets/web/vue/assets/loading-B7pvk95E.css delete mode 100644 app/src/main/assets/web/vue/assets/loading-BSPlXMjv.js delete mode 100644 app/src/main/assets/web/vue/assets/loading-CBQeIji2.css delete mode 100644 app/src/main/assets/web/vue/assets/vendor-B4RITwN5.js delete mode 100644 app/src/main/assets/web/vue/assets/vendor-C9cXVWQA.css create mode 100644 app/src/main/assets/web/vue/assets/vendor-S5atAh6y.css create mode 100644 app/src/main/assets/web/vue/assets/vendor-UVL3l2rb.js diff --git a/app/src/main/assets/web/vue/assets/BookChapter-BDwWiA-_.js b/app/src/main/assets/web/vue/assets/BookChapter-BDwWiA-_.js deleted file mode 100644 index 6335ff65ff67..000000000000 --- a/app/src/main/assets/web/vue/assets/BookChapter-BDwWiA-_.js +++ /dev/null @@ -1 +0,0 @@ -import{a2 as Je,q as r,j as S,T as Se,a7 as Le,o as p,d as f,g as e,t as z,F as oe,P as ce,u as o,a8 as Z,a9 as _e,a4 as Te,x as P,e as T,w as J,aa as qe,A as he,ab as Ge,f as Y,M as ge,ac as Ze,y as Ye,ad as Ke,p as we,i as Ee,s as Oe,ae as je,V as Xe,K as $e,a6 as et,O as Re,m as O,c as tt}from"./vendor-B4RITwN5.js";import{i as ot,g as Fe,u as nt,a as st}from"./loading-BSPlXMjv.js";import{_ as le,u as De,A as pe}from"./index-DiJORxAd.js";const at=(a,s,d,u)=>(a/=u/2,a<1?d/2*a*a+s:(a--,-d/2*(a*(a-2)-1)+s)),it=()=>{let a,s,d,u,n,U,v,w,h,I,i,y,F;function A(){let k=a.scrollTop||a.scrollY||a.pageYOffset;return k=typeof k>"u"?0:k,k}function m(k){const B=k.getBoundingClientRect().top,j=a.getBoundingClientRect?a.getBoundingClientRect().top:0;return B-j+d}function l(k){a.scrollTo?a.scrollTo(0,k):a.scrollTop=k}function x(k){I||(I=k),i=k-I,y=U(i,d,w,h),l(y),i({"5c00dbc4":u.spacing.letter,"0f47b712":u.spacing.line,a14ef5e0:u.spacing.paragraph}));const u=a,n=A=>{const m=/]*src="([^"]*(?:"[^>]+\})?)"[^>]*>/,l=A.match(m)[1];return ot(l)?Fe(l):l},U=A=>{A.target.src=Fe(A.target.src)},v=A=>{const m=/]*src="[^"]*(?:"[^>]+\})?"[^>]*>/g;return A.replaceAll(m," ").length},w=r(()=>{let A=-1;return Array.from(u.contents,m=>(A+=v(m)+1,A))}),h=S(),I=S();s({scrollToReadedLength:A=>{if(A===0)return;let m=w.value.findIndex(l=>l>=A);m!==-1&&_e(()=>{ee(I.value[m],{duration:0})})}});let y=null;const F=d;return Se(()=>{y=new IntersectionObserver(A=>{for(let{target:m,isIntersecting:l}of A)l&&F("readedLengthChange",u.chapterIndex,parseInt(m.dataset.chapterpos))},{rootMargin:`0px 0px -${window.innerHeight-24}px 0px`}),y.observe(h.value),I.value.forEach(A=>{y.observe(A)})}),Le(()=>{y==null||y.disconnect(),y=null}),(A,m)=>(p(),f(oe,null,[e("div",{class:"title","data-chapterpos":"0",ref_key:"titleRef",ref:h},z(a.title),513),(p(!0),f(oe,null,ce(a.contents,(l,x)=>(p(),f("div",{key:x,ref_for:!0,ref_key:"paragraphRef",ref:I,"data-chapterpos":o(w)[x]},[/^\s*]*src[^>]+>$/.test(l)?(p(),f("img",{key:0,class:"full",src:n(l),onErrorOnce:U,loading:"lazy"},null,40,lt)):(p(),f("p",{key:1,style:Z({fontFamily:a.fontFamily,fontSize:a.fontSize}),innerHTML:l},null,12,rt))],8,ct))),128))],64))}},dt=le(At,[["__scopeId","data-v-2297fe46"]]),ut="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXr5djn4dTp49bt59rT6LKxAAACnElEQVQozw3NUUwScRzA8d8R6MF8YMIx8uk47hDSJbj14IPzOGc7jPLvwTGg5uAYDbe2tt56cLtznvEnS6yDqCcEaWi91DvrbLJZz7b1aFtz1aO+2OZWvn+/+4CHeB6BMYaqBLfjPNRY6RFT2JJYby+uAk4WUTrtlmJ4hgPYb2q1XGDQjaK8pgJHvqNaAX+KyuIkDXpgQinb46nOulnn4b5laUHTxLfseeArAoNOeJlOIjdoal0n1FA7tKFv5roK+YaHOqP3P0XyKHPHY+MhTRe5uCZnKhtJKw2eSrSoBDPLtpZuNcFNJcFyiCMxOaaHIfXz1e8HQbWLySrBQ4x0x1qlhnHlnz2HQEC6TNb0gTHXa7IKhcaHqkE015hk9whA0YeWiLIXf7Fa2CZo3DjqjB4tTuF8jIcbfcEx5z/w4sXpQhXW+ju0cqh7icTFmRMaG+v6CIvTjcSpHcH8JEsF3EPh3fRthYdVLLgI2fWXm85/pGFE4l046s70L+yKCcirGFR+jbpy3kMmiCGHrSezVONsn1RBixncyk2PcVWk7DlgxHo8iZwDyq5uAUD854dZhdIFYzKoQig2haUKi1lVufz2RZUZPZ41n/hrOQB6h0Hhg8I367FNoEHgeM/KY7szSeQwD8q2WE3HM35ZLl0K1MJiOtHIkBclRQUwZnyOWcNsRQQgVLj1PSqkjF9DsoOSaSg3iinKzvfmgsNFFfpP/2T3GLGvL4fHEfwIX1sVvXcPqLztehWGcfn9nI2U9nTfCgJPe/jFPLZwgVEzimBgAm0VIyK2tt1cE/AzQdLK+SxLSQ4aDCZnnId94OG2S1XwvnTbNk/ZnhyRCQT+sZM6z9g6LXL1BOBe+zJySiFkHAINCtnQokbCJ/apCv0foqPiZVfhpywAAAAASUVORK5CYII=",gt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAACVBMVEX28ef48+n69esoK7jYAAAB4UlEQVQozw2OsW4bQQxEhwLXkDrysGdEqRRgVShfQQq8wOr2jD0jSpXCLvwXbtKfADlFqgSwC/9ljqweZgYzQFnb/QGepYhA9jzmTc1WaSEtQpbFgjWATI00ZZtIckXx8q2Oe5yEByBy+RHOTcM+VVTadULsvxvRC/q8WTwgcWGD+Mnaqa0oy2gw2pKFzK+PzEsus5hP9AHojKslVynLlioVTBEN8cjDNnZoR1uMGTiZAAN47HxMtEkGUE9b8HWzkqNX5Lpk0yVziAJOs46rK1pG/xNuXLjz95fSDoJE5IqG23MAYPtWoeWPvfVtIV/Ng9oH3W0gGMPIOqd4MK4QZ55dV61gOb8Zxp7I9qayaGxp6Q91cmC0ZRdBwEQVHWzSAanlZwVWc9yljeTCeaHjBVvlPSLeyeBUT2rPdJegQI103jVS3uYkyIx1il6mslMDedZuOkwzolsagvPuQAfp7cYg7k9V1NOxfq64PNSvMdwONV4VYEmqlbpZy5OAakRKkjPnL4CBv5/OZRgoWHBmNbxB0LgB1I4vXFj93UoF2/0TPEsWwV9EhbIiTPqYoTHYoMn3enTDjmrFeDTIzaL1bUC/PBIMuF+vSSYSaxoVt90EO3Gu1zrMuMRGUk7Ffv3L+A931Gsb/yBoIgAAAABJRU5ErkJggg==",pt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEX6+fP8+/X+/ff///kbczPAAAACeElEQVQozxXHQUgUUQAG4P8936yzs6VvZNZmN9QxVxiF9OLBoOjtOC6rQq6ygXjI2fCQBdXBg4egtzFGdqkoI+zgBFbqkm3hQSxhFYLotOcubeKhOnVYoqQy+m4f5g5TvpX0xHLbLY9j8SMhJp+Jk4LfAUS2kVRIjILmnwGBTX42PhCVlDJQkIiy2nWAvaJ1h+oFIpJ0hMSYVbyyrgDWshcMpMyL1brPDQKWmduO+KTJ6XeXAMK9Yc3FpD7atyNwg6kt5XgFpLPhjUTFSYVn2abDiugGShwD8JTVRJVo/2ecuKtRb/qc4BK+9TboFfokog4T2Fn6Oqdnsjk90NMS76Rji6E0NmwkPBAZ4Xbkw8KoDAkAbEhkc78e9omxxgxg6qa5HvMv+UZbCV0qmHnSHKl5TxeA2XTCGWekR581mwC5crBH81PznASqB9va3TbkYAjJPLfg5uBfXaJgIgIBv9eessRIhxe7PA7kj6uUMeMaQ/OEQOYRaaHlqH2Gxwsl6E/pwVY5FH7uCypBZPKvDQyVziYBrAkMURe2MOOOxG/eQpp5PF+bFzUV5HtPj9GeiVSNZDELleifYTp9NAjsoiXg4cW+4ZORkdSMB/B74aAdjhsVakhgkugsbmqcDSLEoWp8zRjrux3tli6Q5uM3E+maT99Wy0RiP7tboiuRZle2c6CYeL2kcUc1KvPtQKucogMadKVTQOJYCeyCYlhQQ/Q7Etfd/vBygy9iqy+LyHeF46saCYvW6ingsbA9RBWtdi8GgUXW+oQx9/wP6bAAX1TWeV+CbShZDlQ9xT6SoSxZmKRAkmXb60kzEzkRF+Ccb94BGspGJoN/UzmyR4wjXHAAAAAASUVORK5CYII=",ht="data:image/png;base64,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",ft="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAALVBMVEXx58b168ny6Mjz6sn06sf27Mvw5sTz6cbw5cLy58T37svv47/168v37s7t4Ltrv0//AAAEjUlEQVQ4yw2Ty2sTURxGf3dmOqmPxb0zmaStCnfmZpL6gpmbxIpUSMZGrSJkxsZiVZimNVaqMklrUnWTRq2KIDFWWx+IFrIRFxXEB4KIgqu6EBdu7M6FIPg32PW3+DhwDmBaYrK56KP4HGIsvg/uvOV0wK+qgBMlO9BujuH4DSJlOseqV5a/BEF97gt0ChyIPqBhXI9BtqtIB8vJB/LdCQ3OVjaLNX0g7+OmoI4e7nkemAqX6o8vg0yyQAyQS7IfgvFbI+6QyI3R4KELxw7kwM2ooQfyQigYnwY5MZbMlHI1DvnQVCoVcrt+R+bO7vPDif3ybNajwqAAe443dpfDsPt379VMWZzGRuqM79mQF+DUz9nt74bQ8J/O80MtVR51U02JKKmTCvTzLVf+vuxP/aHnPo9+2bW+zVsJ0Y630/CrfzX+b+UL+7O68Rczv+7lrMh5etfKXvhc2rk6KforxuoO2xB2tcxKfeXHt18rHOiHI/0RRjW/YGRDkHiwo3nzqL60o58C/bgRuaj7vk+QOwOhpnFNdjuWpKMCGP8Yapu9Ty5FTHKQLGSEFikjd9ADwP9ciaNNjc5qMH6w50AF/LKOsOYqsOG9GjKgc7ZXolqntm6fysJ6Ma6ll2CiqmOgE6O7x1wXExklbeqMYcwsmJmOoigt8SBg2WfilDSsAZJcBxDcrqtBXzFQJqZNHfscyIhoZlygAtyYAceah+elrFbI+46gEHDGiW878Kj7JpWyfhg6iyRMymV1MKBSeVpfgLHIohyTojI6sRyK1VpcqzVZeEBLOnA9unhGKUXPJDYtV9Dxuz4iA5xSkSWhCJdAiJR9PHlvfvbntbrR14FDqUNRAYDJmSnv3oKxuz5+7fiblgVJyYLTbgUM05P7LESkoXvyWNfb0aUU6FZizgQIa25VqKQZqFrk6v6BsqqIHlQmkQ9KrBhkC20/DrFsAFEEYLjM+lj2wYHXCwnNvZQR42XJ2iVK+UBXnI+OBE6oXpUUHiQ1yg0MhA03iwGbnOdQYc1CMiPIPQrCQJFH4L4BMFktAtKd9PN5gnU2Gra4KuK+V+mjtBRpAGIqDVe4wnSnajiFGO5d7smvhVQEMEYwqshrENIEaY7YeblJYtsb3QhAHWZCEKK67swwPMKw0If1Ta+6DgHmlgPzcUTSbi3rrv1Y64/BYEMPQ5SDHUOR022B4QRF6xLUPAaPX/V4IDI5N2BMwx4LqO1uO4j6uW7NvM7lATqGAxY/ZHVgoGZbu7SvkNR75x6qGSB23FdouENVwN7sCbewTdsXGrrnQ5ZZKOCOFtMTIzxlPu6eYmtL+nMFmoK7OeXajn86r9sqWbfmvHC4IagE5qfCPGZvLSq5F55hHIxJFa4/vRxHBlz0og4TojU1l/MOHJX17lybdF0mQhFO44JYUNt3UA473IXw/iPfDWtKG5oFSXIF5iU/VnyDSjxxeDk3jAXRyVyGTNB9FxH9qcFDNJpVbt2y9LytUXkK7Py6+z1RezHQqnoY8XcLimmd8dCnBhQCuaGpJCq3SoIlmYvLz8UkWhJw7T8k+Db/DYEKwgAAAABJRU5ErkJggg==",mt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEX48dr48Nf58tv379X17NJtIBxUAAACFUlEQVQ4y1XRUZakMAgF0Af2AiDWApDZgHZqAV1nZv9rGh7Rj7Y8McUFEg1wvcMESMNVD/neU8Xcaz7nYYkYlYO6Ti82PBI4BvIEg1aj3wKwRvIMgZsUy5LdhCawPFh1sZs4SrlyN9fQKpv8s5dgZ2eLyqqJiu+WkCmUEybXkm3INS01WAiv0PapJ0CZc0SJQUzcWnZYbOOY20iFD8Bk+/j2A3wNxH7GdShFYS5ff237kXh9I9zSkQmIAhOsOSVfJ6DIXTMDaPnzkRJ92S1BQQmXl5LdirgRLLDdcYqcGPwe3QN4xCBiGNbrqq9wpW1XCecChwaQdVOsRDpPCpeoolPdxeXp3WNB9PHVzWBHlygy4NJCCrFHREv6bDt0VGwJZASkpONmm1UseGeFKAQexgaAkrfYWl3AGxWOLL2AIMBNbCXpktmS3k3vHeYjGCPBa43wJTurO3ZFVpQSJdAZGLoHTyk1upkjxMEaIxum3iIARcCa5kSkFAW5fi1mUlL9eyOsaanFmOMruwvEdE3ZYzsRSzo5ewRLXyVPPEvknt8ij4DvCg2O7xOgBCUprEzV4z1WekSpUgI8DT2mrnSOXKRfQavwuKA1F+tFnMKdJSUpMA7wQAifWRkMgjUKKZE4lBl6MCM4B1pq1P4uIjDE6Pq6rL0FnW1nIFmta5vrSvq/Ch4tpqG/ZNyyWa5jZPktq81eYv8Bt5s4iFITOp4AAAAASUVORK5CYII=",vt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXN383Q4tDP4c/R5NEInCCXAAACVElEQVQozw3Hv2sTYRwH4M/79pJ7bZL2bXqtERJ97zjUpbZDhg6pfC8qibi8hLR0EaJ0EFxaCSWDxjfpj1zrYBcRBKE6SAfBJWsx9i8IQfdQxDlKtA6t2OnhQfN3lbG7ytYRywF8rVoPCNO0X2sQOKDpAnSDK2VwkHgmh5yLGT8qASt+2KofnNt2Xg1gf1UF8AoM6052cRMNaloLZb7RKQGrKKji2OefsZF+VqIvos5ZLVIZCX61JcwUdk56wASVkgQvzPfvmT2twTSwyYaC/Pl/UhAHorFhBgZtL6XdAZRp1tkPwC1NLa9CWs5prLhI85NBQsLdXvjDymG3/EbYfQhVNYqc3TtktQhWLY3ko0QsdMbSEp+64v0NfxyqLbIGdh6M2xHHlLBGqKTyQo4E/nebBgBfe1GpdeywYXc8CT7D3cKXuMXkBy4xN6o5OuKamYp3DVI6uccO9lxgd2CAlJgI2BGgaAgIJV/TYwKqu3WFccjbMuA+bVkWgS2bfnlRbD1Eb1sDyWMmjKYIBgGAWbqKRicfvzBkBIz3V5AKnguWdglQEysQsSuVzOg6ALy1pitA5ykGCsc857BRYcgCSZyFOdvoOigSGoPc5Ta73mgxshIcQE5sHMHd9D7yqITw7JO+GHVMxjhzYLcKPSEgmz3fU+BRy3iYNtiXLaBssCW8KguReqkQOTb3MStV0Ugt4U1eIs1RZWRII6Ww8xeNNItyGGQI4ZMlpg/3lQtkl2JFnBp1imRyFe0kK2Id3PCslMgiQNMS77gvFeDhG3cSkYvheeg/e7ClIh5oh+IAAAAASUVORK5CYII=",kt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXh7eHl8eXj7+Pn8+eTbH1KAAACPElEQVQozxWPQWrbQABF/0xn3JFKQRTZOIuUsbCCbOgdRoYEOauxkYPcTRyTlPQWIxEltrsRwQ6hK9nEQek6F+gNTE/Q3qLLusv34cN7SH3mFicdYW4gNIhJWXPBRVXzjcFD0IqeU4o4PRbAIVjyico0vJpIifqPfL80QN9DAQY5ucRHE/hpHxBldXe9GilaHKcKMlj6pho2zXgkNdBl0oJ8kiF1DSiJF1ZHBJkQr0Dbux/5I42Zp4cFahJDFGeW6/QjBwmFY/Q7vZ2SnoOdW2parv/Cnm81+m0xrEfiVXQ3W4nOXIqVYi3l6AAQBwMFkViVBANMto4enXHPNTkHBB0oVj4r5vHzCWayrgBvxtygDlDB2CNDjd80ZInY69aKVYZcfJ8DW+fWuc+syEODALx+ojqoafHsthTI+ZW27PGpIeo/cR6YKcbqIuIFhHmBrzAovzIOOJk1ucvcDzrMRYGVBH2yvcAOf0KiKwfRovBI3tm/kW1eemtfNWwIIXE2mJNhvoszfmMBfRCv0OPwd2321uDW3nx2q/BDxFVeoN1g7a6Im8yRnoawa8kbdXnU0cHeTMxKfZGlJgvLb3sKsxgglQnDdAfvj9LUnqWRDo0GiUmPwyU7TAsD7wHeIW3Nfy1qVGKoE9NgJCdYCAexNRob9yCn4DAQmXtQuUtera6bEmTTXhZy6h856xi4mnEl6BI9mfISkLbtJyZIMJIAUd5ZOBEu88KRAk71yxfItj/hpIB0Errv4gO1os4/UICf+o3kkqwAAAAASUVORK5CYII=",Ct="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEX0/PTx+fH2/vbz+/P4//htSO9OAAAC5UlEQVQ4yyWT0QGjMAxDZTsDWKQDmJQBYrgBUsr+M517x0+LRWw9CyA+pC1YzndrMgHaNXVKQ+di13Of1qbur48nWhuRjj8i6ON8e7pNm7zyag/DBTfS9Z4Hup1fUuXMKY4HEE8QOHCByXkIkl7lDT239RtL9quO4JItmmhOAHXg45QuYKrQFLyGJcRvaTw6kQqZy6mkR6JAPFH/XqsQjEDRmUOA+MNLHGyMUT7AHApoAhjgjIJmCxy6XHdf648AWCdGe57IUDazCeTImQOY4/z+eVYVX2IjOw9RydeAeJwl79iGi4HpgQgHEchWraUZLtayu8scq0lHHHUKMY3Ml8hB7CS1jOckDLG9ccgNeX3124phOcjL9fPnWJhTXpLHeG9DRmHnTxHEaHakS2J51lwAJcUraNbuU7q4gMTDQj3Eripc/x+qFM5VEKAB1roQfAkX5/PxqnS2QpOrxfK1Zft0/omV5T+xCSBUAIbEIwUQgvAfxFE1O8dnk233+1UZiqJ1mAbsue6Yt8tF+yOrxC/YrUhzC4qPlE3EbR5hGKhhHdlrg7J9WunV7L7BcYQwAeE59u2tnN1c6gfVYrQiLSZ9OxZdWDXQq0+r0Pbarh3UqGCwauVvbiXuDsNxCtLDdW9rTF8oQYN4EoXXdfmwNguQP26n/tRjDeo+F2W7PjWtfSr6Bn/z+cXOLp4NnMV4RytvSW4B68m+XN9XfZTFGhO/S+cHTuTqZDC21ccA0N7QsePALaDQC3D1f94U9CWo+aq6BjB3v0rxIimBM12296M3aKPHjXLQE9KQKH4By8RHraJ3AgVto2r4xdFqlaPaiAHLl1ZF4P2pI6cYc+K8UZdcmxy7lqGc1IoPxLmIFuIeEZ6j2sQT88muEg1zwrEDTIX5U/ZmcsqfgVlBumiBLF4sAyhf9BFlXOPKLZ4H0iFb3VoHrGhtHTldKrOvP2/reu2zfV8CXMPqzRdlgd0a5eI7WwB/AYcgavcqxXWEAAAAAElFTkSuQmCC",It="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXM2t7O3ODQ3uLR4OTDp25yAAACdUlEQVQozw3P70sTcQDH8c/3/M7NG+j35mnHwjwh4hRy/QFK3zvPNbeIG1koPZmxfj2IDAwihL53zj0JYisfmEHcZJZOiBUG60lZiI8T/ANusuftgQ+kCPIPeMP7hS5mUrV9c1g6MQCAEZ8tDLHwofImAGRlX+SZK3Vu9rRRPuO4PK6/9nA4GIATsxlODS+rdCMhkAZivpYV0LWoQHSLSA4NfUg+6mY+7BKL2++F9LvnrBDYm6JO9i/YO3i/HJTGQ4pdIV82TbEDFG6vGYCd4wZchgK5J2CrKTLE+Tx0v+YGlIbdWJFcQl4ptBN8fUJQN1MCJLcZLYwUVVo+famGGty8EXJF5ofOEDzcodT3/Fb0I5sHmc1ZG7CcSl8COgxlXx09jT05OafjCZLIHJhGIaU6wDZHsuMQ41wbdjmQXbhKnMq1zlXSYrjCnyZblqexA7fC8RxS74tq2P3OxSQwTuJSApH8OZLzBBp1pOe0i3rdyDUA47GySZ31YmC4EQYSXvFSvieORGBxXF9aeVtUWKGS9WMC4Z9Y2uXnJ2nCUXVMbPOYqNYNmGWWQ7Evr+BWC+a0JAMTImcq/S4Z5INdQMeuOqDIMa9beilxfA60iC6sP1INcPDpmHBW8drZHNmqwyddJtVje9q8WGUgWAOzmbU4FCQBFi8B2Wk6pickBnYhJMenmJGuRmtt2IoKq9NuFGbNFR99sHnvrnLsLysKANDIsxbp6RNMAsoDSKuRpMwZbAAzI68QatIjmZ0aImyM3O8/4e2MNlOHZomFsa/fLDsysliHS+nlYLQJMnynxrH8QO4PaAV2Li8B/+52UgeGIVNFYf8B1XG/kFSmLcUAAAAASUVORK5CYII=",yt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXh7vLf7PDj8PTm8/ecW+lZAAACZElEQVQozw2RsU8TUQCHfz3fw7MS87jeI7DdmSMpDEoHE+P0HqGkvRR8vb5XC4NpN2RQZqcK9xJkwtriekcggerC4OZADDiT+A+goxv/gfwB3zd8H/T6vYF/pTZkCSmDNd3CBEtmZJP4N+CvvhecDvmntKsvwB17rpbIRTLOEoYkj9KZzRUuJsuBQFwgptyJ3Y7EL4V+ud5LO1UnMeQSSObqisiISZkbQBlliP3qWSk3GPQXjxv6VF2BTDO4ySx1zhuJXbA2wBNJF4t5vH9keg6wu5NvUpLtXrZ3OHC9ZsgVcZdOl38PM1y/L6m8GRiErj4AqezUjHGatGGIgs5NJDHh8Ua1IuB4035haVT6SaYWMoQ0eJ3rB/Gpnr3fB49YAy1Wa21YKqAHOmAveVw6CCMGMZh5bGtVI7jnZaiQNbta1Z+285oSoKoRbta1KZ/1bBdKH/RIxv2pRVpkoCmvpr097RWoo0CpMlTWllIenSjECU8mV43mHx2fIRfH/pncrJm3+58BWdbSqCS07/yiQnvHiCG4ZPGRFeAtfreoOubyctzHvLNHhjNvIhukxQzjU5O6QdOEzUp1Ef4d98Pxz+IPYX0bcpnT52dbedfz8y7C4R89RV+MjJkuCCx7mWDt4eyK/62lQB55xXGJK7p8u6bgRv4hVHylelYGGFs64W94tng8sAIVqSRJBpqRA9rFvAysS+9ak8s7557pz5HR4qhCRmWgplpTRJ+bhYfSAMO8/YBucWPuSdmFFtOnuWqvV2NbF6CJnbhNDzEZ/T0XSDrUydzkZCG1z/oIEyUFYxW/KPXNfwopuHDcO04UAAAAAElFTkSuQmCC",Bt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXm9PXq+Pno9vfs+vttWKBGAAACPElEQVQozw3RQWrbQACF4TfCMjPqZgIj4RRaxsZKE0PuMBZ2cLKaCI9RDAXFmJJknUWWI1O1UlamOMHJSjGkuFn3AD2Cr9CepDrAg+/xIxK4QwIqHHQkUhQ/WuphInVIFBojl8QXc012Tgq4RTtVHWVLZVFh1tEoI91uiN4joCqde8Ukn/zGM1B2W4ari2PtTwyw55Ld+Wways54qhGPyS6FzbIT3lIY8WwWdCq56Yolx6KmSKzoqrsCB5heAp4TGNQWJ1Pc6XlE5jQD5OlIX9I47A9uiUQcPQxcury/ToyxWJG/za6ki88crxKPocKS59Sl3EtBG7C89fCGflpfqoSzCeC4crioJA7F0V5+8MaSIk4qSCdwzpogmbqzEirVpGiS2dOVJvUuuqFEmhHao06KEpq+8lvHI14NJk3Qrmi9vBuRLwAz0qZB4hsDXQFXgtnlpDX3C6ug9BquSw/CYtwAzuTz5vuQNdr/YibhR68378ehZH30FSpjh71LpQkrsj+Q062h5WwZ5wlRoD6uQJy1DqvSYuCUapMBqT5YA4ZFw4KlWapxoUGlKWrx0eDQvmigu4WMYt97ruru98fYL8/0lG6CTOFcFWBhFK5gKw19h2JN808nh7xhkU6sWKLXdtkqBL6h+lULK5k19wFB/FldnGYf3LDeuf6IC2/MzJOSOP0qPxLqzaGIqtBcFIItrstkazONOkrc1D1czjuwEGESB4JJnjgSMN7PXAu7fZQpl1C236C+9mM4Af8P98Ch4R2TRl8AAAAASUVORK5CYII=",bt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXPz8/R0dHT09PU1NToNyAhAAACdElEQVQozw3NP0xTQQDH8d9d7sFrG+QeKVgQ4aoFCwFkYERyLY//0UB8GNGg1WAC0RBGJrzW4mCXQmpgvCYOwEAYiulSpYtza2KiW7s5FgNJFSV2/CzfL7RwpoJ20iadmgA8owOyaxmusKE44scBeb4vIv00dqYgmf6jzWcr7W6INbDQeZbQL9ytXeYgtFfzmW1Fek5msxJlwhyt6qDDxOLQzpVPompYrMPnEnhvLm7M5BxY5nowAj3zkydAkpC0FIG6g7AK+Ub25ybyNWVYwtpseP2rfrQwiGRpfqrnMuPeuvr2dA0p2YsHF2XghkrXKtZ8tLBjR7S2qIaYbKmyLd/QP+EogLjqqwNw5Lq1pDlMLkM5+gNoSvdq+Pxmz9/61EFq6GYM6GqaGvlN95zy3gsmEWI8K3k8OP9OmRLEPO6DP3Wv3g42COinJTZ33dcIvs4ESp6opMTjDs6mcYTEbFeUifuxh989yZrIx4lkpuixxz0nHLCekKbE17suKhYkMGhoYhTZtVBvg4bfq/1L1Im0AGMVpBFwumM0zwyuKiCMi5dqR4Flx47AGyF2xTbxqUdTwCH94BT3DozpLV5WuAL/N8rGtHKjotBOOuOtCJ9E21uqsyBoLOzaXbHPrK5PQBP+fBfeidvJAeMIAmzVt5IkJJ9DBWaZDAepYUhlQqHt0h72SJ3j8TZHom64f516xx9T5evgMPgwG82jZdJaJIDyWp6LAjOCclVyzNA3iTKzIULlBQEPaTXlPHok5gISclmyaWZlqY2aTHdRHpJOwTdDEQ3ZfKtbpclcNhyVClagmY+fIfyKukntPqBgnx5QvZHk/D/MK8JMClrSigAAAABJRU5ErkJggg==",St="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXe3t7a2trc3Nzg4OCXP9lCAAACoklEQVQozwXBzU/TYBwA4N+QEr4CNbSFwcFuowSqMRvEAwShHWAYNsu7dS0dLnGUSWT4kZB4lGzE4VtcwgIDJqcOWLJxcv4BOoQZuCPxSNSD4WSWLJGL8XmAIiyo2RgJ4A1pxQQlOxRAszLTdnPu2oQGb05RC5slJld7ZAIfo4O44Bn1ud59F0BcjnYOa17Jhwc6EdiKettncsXjT1f8KUBZUW41pK0Jc1Az4dEV3rkkPBtDSZ83Blyt0kSf2PRjzIykoBwINisPbPPtljdVE9iAXRfUPkXLVIgYrCccp5g687NdZbcJ+xa5VE/HhTtT23IKsN5jj/pcUd0dTZNAqCVw72n4gOwnTOC0vvHfaauT8d9zAoRRfPpISZRVyUiw8ELzOG1b2DZpFzkSrHLhq52twDEdyZHwvp2j4uv/bjvOf23/AcEtTuJbY5Cp4YcAer1IGkUzOo2rn8LQOKjFJw3NTw24nprQXY5aF4wxcqcSdbFQ00H4xFl8Drx4X4CikvAM1tuR8bKIBCBoLnKN10KJG4zKAsc7c9WEB9gnCi6BhVjqoco6t20ILAJuVctvaEZK732cRHDRmGfuihOam0o2CHByUZ/epCcVlRs2wmCnMqsd6aSim3ibBJtm1LGyXW3Bb7tJCPlFtUG+SvPdeEUAB60lNdo+VQbLcwRNVtT68FsLcr1+NotgNihlpExS1V2SFgNbeC8bEhgm8sM17wSi6Us2gxVWJU/5GKBpandvfyYbU1yHCLpCgWGbbPXn40rehEsUXKIJr9DMKgICfjc4bl1YfvUhE/YIECGRqjCxSM9hrybAIkND5OeWfFZsXkxB+qDzb7pUQ3EfQ3Ml6EChEt3D+iS01VqC7EQ/Z/DuPQcz4yChoFQJce2Qr+NNAv0HxofmpXGqgHkAAAAASUVORK5CYII=",wt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEXm5ubo6Ojp6enr6+vt7e1FnZagAAACrklEQVQ4yx1SixUbMQgT3AKAFwDcAfzpBN1/qMrJS5w7bCQhC6IGSUGYQJd6Ox9ZPXi1AGJBavhUTT0JjYPGAab9WcDYIxsmlnxkayX8mhxCmKHA75az5cfRbWybEExiu08xDSgGym0mwuf3j4SvHeQxDJJzh2zp4iOlrD8iOb4SXyC1wiOLRTcnrje+nGamFeXVKWkmzbFIPChkmJ6Fg7mBpV8n+JGOVCd4jv1thThkjeQGNeafpeV3rsEWLfyWc8tC9jOv6FQ8rRzHOOVB+jCYEUAJpDvh8xHNFm/Tm5p5lw94Pp3NhtKEfQsGvnXhowdZE73hPwxKvjDd4i4PCdd0fe3W5fO8ktAsUAacLgstpUw60JCiPLg2XpkgiqPIYYXJd9ksGIT3q+LlevypzItvO+s0F1dBzVr2QDMUkYmuyGcrIS44mVJ7JVKwQXjYuBYp0Uetecbswzsikzu3gUR8bJC/C8Gd/NAzI/xdUGOYQQHDZ8X2d5XuzGRUiXAi9si5CRgoiToRZPtzLJkd0FUHRHZwJf0BHT1sE7gcnh0jmKKlSSF4/GBirGk5+K9NKlGDCfc9JtPhg78JdabH0YQRKNZnJ8tFnPfXHJb4xum1TTCeEmyEdbyEJLjznMLHuFD2Y9NEkSleIBs7SiCbblhgctVi9ch++kDYnn1C9DA5TvdPsToXM55wI6k+8eKT1blwPTqWb5CFJ+7dTBmab+KHy+xwNtItXhZNSpHD2fxnynrxG3ZBKRe8KBpXk11AnadlccEhr9w1nBBvBylNkv7A8eqpGBCDqhitmWQXBjjdS6idr/QjXWLDeMzMbVDoJuM8zN7WenMZWXgZ2vX3F01J3jHZbwk1LRP+DWEvDJtOUoh/AIaBUz5VpWyhuyx4QtgL/NmgC6kM/JvNe+R/C/5aL7BKIbYAAAAASUVORK5CYII=",Et="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAElBMVEUQERMODxESFBYWGBkaHB0eICLm6ozJAAACkUlEQVQ4yyWTUdLbMAiEASfvoOkBkBy/O5keIE0v8E/uf5h+68qZWALELgu2MG9PP9qyvCzTVhrrsPGOCjvTfXQZvtp/W3Gy6LCITqs4q/DZ+KYl76zKzHVYpY2wNY27nqN1sbLGcrLH3/ENH4oWlGctsDu8AO+HzTLlsYdh8MzP1m6YDMz0ACfcimvakBj+mwO/+5Uta5teOD379sxK1fUxmUhv8MU3jUT5gs26PMephFznkLcpQZ6/dPL9C/GWHcCxDN6oZhD5xBm5qoYBPA+PFE/H1tXDWcWl8TW7rS+4dUzAVy0BIrvC4/HcqW2TkG1HO8q9dC23INAg7NA4AFRFkDTM2lfELPyFzi1VddcpX2z0KjHBUDmdLNJ6dDps4ytrX+FPsZwE31wSL+6OWfHOAJ3+Y0Rk/MiKfmWNPg7oVP/U3Ck9FoCkC2gBpALOiqbMNTkOe8P4FWkTD2Y9Q3+5VmV0uLUJBl68U5uAK2Kl6QDXvLxbwweOL2sixW78uU8p0ysfc7cWrF1j6B1sPJ4WgclYSnJN1bzozrhEcFHmRzBkbJWqqdG+EYJXRFmT5jnLXPUNF6WBdoFbTxYsmDXVLU/WA7MExNc93sJS5hIXDeLxzMScHzdhKvEkibr6cQXYPrmtmTA7JcInISrTzRDvShTdka0uVGrsJAAR6tSn1sKziZtfKVjAxPrJsYgZO0bye+vKTZ/DgoAoLGNO6jYHimZYTL/3pLJHawquJukjBpfz8WOGVSVIWx9ywUfS5iENutidRM4NzkAmxgUSQ68xgNOU+ZLalr4TS2V+D2xqukZig+Z9DilR7Nouzwp1cp/3E5q6Rdlf08obKvAM4qZ6pMr+w3PmQALSSBfjyZn5DwrNRVbywBQiAAAAAElFTkSuQmCC",Dt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEUWGBkYGhsdHyAfISI1t/v6AAAB5ElEQVQozxXQsYoTURSA4f/EeycZsDgDdySDjihk38Hy3GWi2J2BCaziQhaiaB+tt9AFu1kwvYUPsIXNPoB9BAUfwAfwEUzKv/v4odGrroyp9/rUaC6rZ5skv5F8qPsfYYP+yKUMymmAEEeW55oUR4o8jr05KNzJ07yvB7w0KKfLwcQUSjfmMU0PJfPHFoEVU+ohNrcKMEzMQ23FDnVSI2dqtYWI7KlLu6vE4UnyvKc3SJuL7lBbeEEl42ItpGLjzIT8PRJCmkRjVpVpsbJFVN0687okJNZiHAr5Z7MV0BnGIDc+THM1zlbieBc1Fq+tH5BH+OpnbWkj40hSqC8Lw2TvFuF0SUFJCk2IytXbjeqcRAt6NHpnrUkUU4KRzZs8RCK8N/Akn2W04LwxMU/V7XK0bDyN2RxfDyx7I4h5vjZby72V8UnOWumZL3qtYc+8DTE0siSBMXGhywx2dMYPnQHbxdFZ7deiNGxCCtD/QWnbwDoGhRYPDzUdUA3krjpnkvdAgDN4ddLkEQSov9qjd42HaDjI34gEqS9TUueAk+sc4qg5ws407KQYKs8G1jv4xBlqBVk6cb4dISZIwVi1Jzu4+HLk6lyfUxkXvwy+1Q+4WVdHIhwfybZ6CWVhxMEhShOgsP/HOW0MvZJeFwAAAABJRU5ErkJggg==",Ut="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEUWGBkYGhsdHyAfISI1t/v6AAAB5ElEQVQozxXQsYoTURSA4f/EeycZsDgDdySDjihk38Hy3GWi2J2BCaziQhaiaB+tt9AFu1kwvYUPsIXNPoB9BAUfwAfwEUzKv/v4odGrroyp9/rUaC6rZ5skv5F8qPsfYYP+yKUMymmAEEeW55oUR4o8jr05KNzJ07yvB7w0KKfLwcQUSjfmMU0PJfPHFoEVU+ohNrcKMEzMQ23FDnVSI2dqtYWI7KlLu6vE4UnyvKc3SJuL7lBbeEEl42ItpGLjzIT8PRJCmkRjVpVpsbJFVN0687okJNZiHAr5Z7MV0BnGIDc+THM1zlbieBc1Fq+tH5BH+OpnbWkj40hSqC8Lw2TvFuF0SUFJCk2IytXbjeqcRAt6NHpnrUkUU4KRzZs8RCK8N/Akn2W04LwxMU/V7XK0bDyN2RxfDyx7I4h5vjZby72V8UnOWumZL3qtYc+8DTE0siSBMXGhywx2dMYPnQHbxdFZ7deiNGxCCtD/QWnbwDoGhRYPDzUdUA3krjpnkvdAgDN4ddLkEQSov9qjd42HaDjI34gEqS9TUueAk+sc4qg5ws407KQYKs8G1jv4xBlqBVk6cb4dISZIwVi1Jzu4+HLk6lyfUxkXvwy+1Q+4WVdHIhwfybZ6CWVhxMEhShOgsP/HOW0MvZJeFwAAAABJRU5ErkJggg==";var te={themes:[{body:"#ede7da url("+ut+") repeat",content:"#ede7da url("+gt+") repeat",popup:"#ede7da url("+pt+") repeat"},{body:"#ede7da url("+ht+") repeat",content:"#ede7da url("+ft+") repeat",popup:"#ede7da url("+mt+") repeat"},{body:"#ede7da url("+vt+") repeat",content:"#ede7da url("+kt+") repeat",popup:"#ede7da url("+Ct+") repeat"},{body:"#ede7da url("+It+") repeat",content:"#ede7da url("+yt+") repeat",popup:"#ede7da url("+Bt+") repeat"},{body:"#ebcece repeat",content:"#f5e4e4 repeat",popup:"#faeceb repeat"},{body:"#ede7da url("+bt+") repeat",content:"#ede7da url("+St+") repeat",popup:"#ede7da url("+wt+") repeat"},{body:"#ede7da url("+Et+") repeat",content:"#ede7da url("+Dt+") repeat",popup:"#ede7da url("+Ut+") repeat"}],fonts:["Microsoft YaHei, PingFangSC-Regular, HelveticaNeue-Light, Helvetica Neue Light, sans-serif","PingFangSC-Regular, -apple-system, Simsun","Kaiti"]};const c=a=>(we("data-v-ed0bb531"),a=a(),Ee(),a),xt=c(()=>e("div",{class:"settings-title"},"设置",-1)),Qt={class:"setting-list"},Vt={class:"theme-list"},Pt=c(()=>e("i",null,"阅读主题",-1)),Mt=["onClick"],Rt={key:0,class:"iconfont"},Ft={key:1,class:"moon-icon"},Lt={class:"font-list"},_t=c(()=>e("i",null,"正文字体",-1)),Kt=["onClick"],Ot={class:"font-list"},zt=c(()=>e("i",null,"自定字体",-1)),Nt=c(()=>e("p",null," 请确认输入的字体名称完整无误,并且该字体已经安装在您的设备上。 ",-1)),Ht=c(()=>e("p",null,"确定保存吗?",-1)),Wt={style:{"text-align":"right",margin:"0"}},Jt=c(()=>e("span",{type:"text",class:"font-item"},"保存",-1)),Tt={class:"font-size"},qt=c(()=>e("i",null,"字体大小",-1)),Gt={class:"resize"},Zt=c(()=>e("em",{class:"iconfont"},"",-1)),Yt=[Zt],jt=c(()=>e("b",null,null,-1)),Xt={class:"lang"},$t=c(()=>e("b",null,null,-1)),eo=c(()=>e("em",{class:"iconfont"},"",-1)),to=[eo],oo={class:"letter-spacing"},no=c(()=>e("i",null,"字距",-1)),so={class:"resize"},ao=c(()=>e("em",{class:"iconfont"},"",-1)),io=[ao],co=c(()=>e("b",null,null,-1)),lo={class:"lang"},ro=c(()=>e("b",null,null,-1)),Ao=c(()=>e("em",{class:"iconfont"},"",-1)),uo=[Ao],go={class:"line-spacing"},po=c(()=>e("i",null,"行距",-1)),ho={class:"resize"},fo=c(()=>e("em",{class:"iconfont"},"",-1)),mo=[fo],vo=c(()=>e("b",null,null,-1)),ko={class:"lang"},Co=c(()=>e("b",null,null,-1)),Io=c(()=>e("em",{class:"iconfont"},"",-1)),yo=[Io],Bo={class:"paragraph-spacing"},bo=c(()=>e("i",null,"段距",-1)),So={class:"resize"},wo={class:"resize"},Eo=c(()=>e("em",{class:"iconfont"},"",-1)),Do=[Eo],Uo=c(()=>e("b",null,null,-1)),xo={class:"lang"},Qo=c(()=>e("b",null,null,-1)),Vo=c(()=>e("em",{class:"iconfont"},"",-1)),Po=[Vo],Mo={key:0,class:"read-width"},Ro=c(()=>e("i",null,"页面宽度",-1)),Fo={class:"resize"},Lo=c(()=>e("em",{class:"iconfont"},"",-1)),_o=[Lo],Ko=c(()=>e("b",null,null,-1)),Oo={class:"lang"},zo=c(()=>e("b",null,null,-1)),No=c(()=>e("em",{class:"iconfont"},"",-1)),Ho=[No],Wo={class:"paragraph-spacing"},Jo=c(()=>e("i",null,"翻页速度",-1)),To={class:"resize"},qo={class:"resize"},Go=c(()=>e("em",{class:"iconfont"},"",-1)),Zo=[Go],Yo=c(()=>e("b",null,null,-1)),jo={class:"lang"},Xo=c(()=>e("b",null,null,-1)),$o=c(()=>e("em",{class:"iconfont"},"",-1)),en=[$o],tn={class:"infinite-loading"},on=c(()=>e("i",null,"无限加载",-1)),nn={__name:"ReadSettings",setup(a){const s=De(),d=S(0),u=S(s.config.theme==6),n=S(""),U=Te([{background:"rgba(250, 245, 235, 0.8)"},{background:"rgba(245, 234, 204, 0.8)"},{background:"rgba(230, 242, 230, 0.8)"},{background:"rgba(228, 241, 245, 0.8)"},{background:"rgba(245, 228, 228, 0.8)"},{background:"rgba(224, 224, 224, 0.8)"},{background:"rgba(0, 0, 0, 0.5)"}]),v=S({display:"inline",color:"rgba(255,255,255,0.2)"}),w=S(["雅黑","宋体","楷书"]),h=S(s.config.customFontName),I=S(!1);Se(()=>{var D=s.config;d.value=D.theme,d.value==6?n.value="":n.value=""});const i=r(()=>s.config),y=r(()=>({background:te.themes[i.value.theme].popup})),F=r(()=>s.config.theme),A=r(()=>s.config.font),m=D=>{D==6?(u.value=!0,n.value="",v.value.color="#ed4259"):(u.value=!1,n.value="",v.value.color="rgba(255,255,255,0.2)"),i.value.theme=D,E(i.value)},l=D=>{i.value.font=D,E(i.value)},x=()=>{i.value.font=-1,i.value.customFontName=h.value,E(i.value)},q=r(()=>s.config.fontSize),R=()=>{i.value.fontSize<48&&(i.value.fontSize+=2),E(i.value)},k=()=>{i.value.fontSize>12&&(i.value.fontSize-=2),E(i.value)},B=r(()=>s.config.spacing),j=()=>{s.config.spacing.letter-=.01,E(i.value)},fe=()=>{s.config.spacing.letter+=.01,E(i.value)},re=()=>{s.config.spacing.line-=.1,E(i.value)},me=()=>{s.config.spacing.line+=.1,E(i.value)},ve=()=>{s.config.spacing.paragraph-=.1,E(i.value)},X=()=>{s.config.spacing.paragraph+=.1,E(i.value)},ke=r(()=>s.config.readWidth),Ce=()=>{i.value.readWidth+160+2*68>window.innerWidth||(i.value.readWidth+=160,E(i.value))},Ae=()=>{i.value.readWidth>640&&(i.value.readWidth-=160),E(i.value)},ne=r(()=>s.config.jumpDuration),de=()=>{s.config.jumpDuration+=100,E(i.value)},se=()=>{s.config.jumpDuration!==0&&(s.config.jumpDuration-=100,E(i.value))},ae=r(()=>s.config.infiniteLoading),ue=D=>{i.value.infiniteLoading=D,E(i.value)},E=D=>{s.setConfig(D),localStorage.setItem("config",JSON.stringify(D)),Ie(D)},Ie=D=>{pe.saveReadConfig(D)};return(D,b)=>{const N=Ze,G=Ye,ye=Ke;return p(),f("div",{class:P(["settings-wrapper",{night:o(u),day:!o(u)}]),style:Z(o(y))},[xt,e("div",Qt,[e("ul",null,[e("li",Vt,[Pt,(p(!0),f(oe,null,ce(o(U),(V,_)=>(p(),f("span",{class:P(["theme-item",{selected:o(F)==_}]),key:_,style:Z(V),ref_for:!0,ref:"themes",onClick:Be=>m(_)},[_<6?(p(),f("em",Rt,"")):(p(),f("em",Ft,z(o(n)),1))],14,Mt))),128))]),e("li",Lt,[_t,(p(!0),f(oe,null,ce(o(w),(V,_)=>(p(),f("span",{class:P(["font-item",{selected:o(A)==_}]),key:_,onClick:Be=>l(_)},z(V),11,Kt))),128))]),e("li",Ot,[zt,T(N,{effect:"dark",content:"自定义的字体名称",placement:"top"},{default:J(()=>[qe(e("input",{type:"text",class:"font-item font-item-input","onUpdate:modelValue":b[0]||(b[0]=V=>he(h)?h.value=V:null),placeholder:"请输入自定义的字体名称"},null,512),[[Ge,o(h)]])]),_:1}),T(ye,{placement:"top",width:"180",trigger:"click",visible:o(I),"onUpdate:visible":b[3]||(b[3]=V=>he(I)?I.value=V:null)},{reference:J(()=>[Jt]),default:J(()=>[Nt,Ht,e("div",Wt,[T(G,{size:"small",plain:"",onClick:b[1]||(b[1]=V=>I.value=!1)},{default:J(()=>[Y("取消")]),_:1}),T(G,{type:"primary",size:"small",onClick:b[2]||(b[2]=V=>{x(),I.value=!1})},{default:J(()=>[Y("确定")]),_:1})])]),_:1},8,["visible"])]),e("li",Tt,[qt,e("div",Gt,[e("span",{class:"less",onClick:k},Yt),jt,Y(),e("span",Xt,z(o(q)),1),$t,e("span",{class:"more",onClick:R},to)])]),e("li",oo,[no,e("div",so,[e("span",{class:"less",onClick:j},io),co,Y(),e("span",lo,z(o(B).letter.toFixed(2)),1),ro,e("span",{class:"more",onClick:fe},uo)])]),e("li",go,[po,e("div",ho,[e("span",{class:"less",onClick:re},mo),vo,Y(),e("span",ko,z(o(B).line.toFixed(1)),1),Co,e("span",{class:"more",onClick:me},yo)])]),e("li",Bo,[bo,e("div",So,[e("div",wo,[e("span",{class:"less",onClick:ve},Do),Uo,e("span",xo,z(o(B).paragraph.toFixed(1)),1),Qo,e("span",{class:"more",onClick:X},Po)])])]),o(s).miniInterface?ge("",!0):(p(),f("li",Mo,[Ro,e("div",Fo,[e("span",{class:"less",onClick:Ae},_o),Ko,Y(),e("span",Oo,z(o(ke)),1),zo,e("span",{class:"more",onClick:Ce},Ho)])])),e("li",Wo,[Jo,e("div",To,[e("div",qo,[e("span",{class:"less",onClick:se},Zo),Yo,Y(),e("span",jo,z(o(ne)),1),Xo,e("span",{class:"more",onClick:de},en)])])]),e("li",tn,[on,(p(),f("span",{class:P(["infinite-loading-item",{selected:o(ae)==!1}]),key:0,onClick:b[4]||(b[4]=V=>ue(!1))},"关闭",2)),(p(),f("span",{class:P(["infinite-loading-item",{selected:o(ae)==!0}]),key:1,onClick:b[5]||(b[5]=V=>ue(!0))},"开启",2))])])])],6)}}},sn=le(nn,[["__scopeId","data-v-ed0bb531"]]),an={class:"wrapper"},cn=["onClick"],ln={__name:"CatalogItem",props:["index","source","gotoChapter","currentChapterIndex"],setup(a){const s=a,d=n=>n==s.currentChapterIndex,u=r(()=>{var n;return((n=s.source)==null?void 0:n.catas)??[s.source]});return(n,U)=>(p(),f("div",an,[(p(!0),f(oe,null,ce(o(u),v=>(p(),f("div",{class:P(["cata-text",{selected:d(v.index)}]),key:v.url,onClick:w=>a.gotoChapter(v)},z(v.title),11,cn))),128))]))}},rn=le(ln,[["__scopeId","data-v-51153469"]]),An=a=>(we("data-v-7ec68dd9"),a=a(),Ee(),a),dn=An(()=>e("div",{class:"title"},"目录",-1)),un={__name:"PopCatalog",emits:["getContent"],setup(a,{emit:s}){const d=De(),u=r(()=>w.value==6),{catalog:n,popCataVisible:U,miniInterface:v}=Oe(d),w=r(()=>d.config.theme),h=r(()=>({background:te.themes[w.value].popup})),I=r({get:()=>d.readingBook.index,set:l=>d.readingBook.index=l}),i=r(()=>{let l=n.value;if(v.value)return l;let x=Math.ceil(l.length/2),q=new Array(x),R=0;for(;R{const x=n.value.indexOf(l);I.value=x,d.setPopCataVisible(!1),d.setContentLoading(!0),d.saveBookProgress(),y("getContent",x)},A=S(),m=r(()=>{let l=I.value;return v.value?l:Math.floor(l/2)});return je(()=>{U.value&&A.value.scrollToIndex(m.value)}),(l,x)=>(p(),f("div",{class:P({"cata-wrapper":!0,visible:o(U)}),style:Z(o(h))},[dn,T(o(Xe),{style:{height:"300px",overflow:"auto"},class:P({night:o(u),day:!o(u)}),ref_key:"virtualListRef",ref:A,"data-key":"index","wrap-class":"data-wrapper","item-class":"cata","data-sources":o(i),"data-component":rn,"estimate-size":40,"extra-props":{gotoChapter:F,currentChapterIndex:o(I)}},null,8,["class","data-sources","extra-props"])],6))}},gn=le(un,[["__scopeId","data-v-7ec68dd9"]]),M=a=>(we("data-v-9a75e165"),a=a(),Ee(),a),pn={class:"tools"},hn=M(()=>e("div",{class:"iconfont"},"",-1)),fn=M(()=>e("div",{class:"icon-text"},"目录",-1)),mn=[hn,fn],vn=M(()=>e("div",{class:"iconfont"},"",-1)),kn=M(()=>e("div",{class:"icon-text"},"设置",-1)),Cn=[vn,kn],In=M(()=>e("div",{class:"iconfont"},"",-1)),yn=M(()=>e("div",{class:"icon-text"},"书架",-1)),Bn=[In,yn],bn=M(()=>e("div",{class:"iconfont"},"",-1)),Sn=M(()=>e("div",{class:"icon-text"},"顶部",-1)),wn=[bn,Sn],En=M(()=>e("div",{class:"iconfont"},"",-1)),Dn=M(()=>e("div",{class:"icon-text"},"底部",-1)),Un=[En,Dn],xn={class:"tools"},Qn=M(()=>e("div",{class:"iconfont"},"",-1)),Vn={key:0},Pn={key:0},Mn=M(()=>e("div",{class:"iconfont"},"",-1)),Rn=M(()=>e("div",{class:"chapter-bar"},null,-1)),Fn={class:"content"},Ln=["chapterIndex"],_n={__name:"BookChapter",setup(a){const s=S(),{isLoading:d,loadingWrapper:u}=nt(s,"正在获取信息"),n=De();try{const t=JSON.parse(localStorage.getItem("config"));t!=null&&n.setConfig(t)}catch{localStorage.removeItem("config")}const{catalog:U,popCataVisible:v,readSettingsVisible:w,miniInterface:h,showContent:I,config:i,readingBook:y,bookProgress:F}=Oe(n),A=r({get:()=>y.value.chapterPos,set:t=>y.value.chapterPos=t}),m=r({get:()=>y.value.index,set:t=>y.value.index=t}),l=r(()=>i.value.theme),x=r(()=>i.value.infiniteLoading),q=r(()=>n.config.font>=0?te.fonts[n.config.font]:n.config.customFontName),R=r(()=>n.config.fontSize+"px"),k=r(()=>te.themes[l.value].body),B=r(()=>te.themes[l.value].content),j=r(()=>te.themes[l.value].popup),fe=r(()=>h.value?window.innerWidth+"px":n.config.readWidth-130+"px"),re=r(()=>h.value?window.innerWidth-33:n.config.readWidth-33),me=r(()=>({background:k.value})),ve=r(()=>({background:B.value,width:fe.value})),X=S(!1),ke=r(()=>({background:j.value,marginLeft:h.value?0:-(n.config.readWidth/2+68)+"px",display:h.value&&!X.value?"none":"block"})),Ce=r(()=>({background:j.value,marginRight:h.value?0:-(n.config.readWidth/2+52)+"px",display:h.value&&!X.value?"none":"block"})),Ae=r(()=>l.value==6),ne=()=>{n.setMiniInterface(window.innerWidth<776);const t=n.config.readWidth;de(t)},de=t=>{n.miniInterface||t+2*68>window.innerWidth&&(n.config.readWidth-=160)};$e(()=>n.config.readWidth,t=>de(t));const se=S(),ae=S(),ue=()=>{ee(se.value)},E=()=>{ee(ae.value)},Ie=et(),D=()=>{Ie.push("/")},b=S([]),N=S(!0),G=(t,C=!0,H=0)=>{C&&(n.setShowContent(!1),ee(se.value,{duration:0}),Ue(t,H),b.value=[]);let Q=sessionStorage.getItem("bookUrl"),{title:W,index:K}=U.value[t];u(pe.getBookContent(Q,K).then(g=>{if(g.data.isSuccess){let We=g.data.data.split(/\n+/);b.value.push({index:t,content:We,title:W}),C&&_(H)}else{O({message:g.data.errorMsg,type:"error"});let $=[g.data.errorMsg];b.value.push({index:t,content:$,title:W})}if(n.setContentLoading(!0),N.value=!1,n.setShowContent(!0),!g.data.isSuccess)throw g.data},g=>{O({message:"获取章节内容失败",type:"error"});let $=["获取章节内容失败!"];throw b.value.push({index:t,content:$,title:W}),n.setShowContent(!0),g}))},ye=S(),V=S(),_=t=>{_e(()=>{V.value.length===1&&V.value[0].scrollToReadedLength(t)})},Be=st(()=>n.saveBookProgress(),6e4),ze=(t,C)=>{Ue(t,C),Be()};Re(()=>{var t;document.title=((t=U.value[m.value])==null?void 0:t.title)||document.title});const Ue=(t,C)=>{let H=sessionStorage.getItem("bookUrl");var Q=JSON.parse(localStorage.getItem(H));Q.index=t,Q.chapterPos=C,localStorage.setItem(H,JSON.stringify(Q)),Q=JSON.parse(localStorage.getItem("readingRecent")),Q.chapterIndex=t,Q.chapterPos=C,localStorage.setItem("readingRecent",JSON.stringify(Q)),m.value=t,A.value=C,sessionStorage.setItem("chapterIndex",t),sessionStorage.setItem("chapterPos",String(C))},xe=()=>{document.visibilityState=="hidden"&&pe.saveBookProgressWithBeacon(F.value)},Qe=()=>{n.setContentLoading(!0);let t=m.value+1;typeof U.value[t]<"u"?(O({message:"下一章",type:"info"}),G(t),n.saveBookProgress()):O({message:"本章是最后一章",type:"error"})},Ve=()=>{n.setContentLoading(!0);let t=m.value-1;typeof U.value[t]<"u"?(O({message:"上一章",type:"info"}),G(t),n.saveBookProgress()):O({message:"本章是第一章",type:"error"})};let L;const be=S();Re(()=>{x.value?L==null||L.observe(be.value):L==null||L.disconnect()});const Ne=()=>{let t=b.value.slice(-1)[0].index;U.value.length-1>t&&(G(t+1,!1),n.saveBookProgress())},He=t=>{if(!d.value)for(let{isIntersecting:C}of t){if(!C)return;Ne()}};let ie=!0;const Pe=t=>{if(ie)switch(t.key){case"ArrowLeft":t.stopPropagation(),t.preventDefault(),Ve();break;case"ArrowRight":t.stopPropagation(),t.preventDefault(),Qe();break;case"ArrowUp":t.stopPropagation(),t.preventDefault(),document.documentElement.scrollTop===0?O({message:"已到达页面顶部",type:"warn"}):(ie=!1,ee(0-document.documentElement.clientHeight+100,{duration:n.config.jumpDuration,callback:()=>ie=!0}));break;case"ArrowDown":t.stopPropagation(),t.preventDefault(),document.documentElement.clientHeight+document.documentElement.scrollTop===document.documentElement.scrollHeight?O({message:"已到达页面底部",type:"warn"}):(ie=!1,ee(document.documentElement.clientHeight-100,{duration:n.config.jumpDuration,callback:()=>ie=!0}));break}},Me=t=>{(t.key==="ArrowUp"||t.key==="ArrowDown")&&(t.preventDefault(),t.stopPropagation())};return Se(()=>{let t=sessionStorage.getItem("bookUrl"),C=sessionStorage.getItem("bookName"),H=sessionStorage.getItem("bookAuthor"),Q=Number(sessionStorage.getItem("chapterIndex")||0),W=Number(sessionStorage.getItem("chapterPos")||0);var K=JSON.parse(localStorage.getItem(t));(K==null||Q!=K.index||W!=K.chapterPos)&&(K={bookName:C,bookAuthor:H,bookUrl:t,index:Q,chapterPos:W},localStorage.setItem(t,JSON.stringify(K))),ne(),window.addEventListener("resize",ne),u(pe.getChapterList(t).then(g=>{if(!g.data.isSuccess){O({message:g.data.errorMsg,type:"error"}),setTimeout(D,500);return}let $=g.data.data;n.setCatalog($),n.setReadingBook(K),G(Q,!0,W),window.addEventListener("keyup",Pe),window.addEventListener("keydown",Me),document.addEventListener("visibilitychange",xe),L=new IntersectionObserver(He,{rootMargin:"-100% 0% 20% 0%"}),x.value&&L.observe(be.value),document.title=null,document.title=C+" | "+U.value[Q].title},g=>{throw O({message:"获取书籍目录失败",type:"error"}),g}))}),Le(()=>{window.removeEventListener("keyup",Pe),window.removeEventListener("keydown",Me),window.removeEventListener("resize",ne),document.removeEventListener("visibilitychange",xe),w.value=!1,v.value=!1,L==null||L.disconnect()}),(t,C)=>{const H=gn,Q=Ke,W=sn,K=dt;return p(),f("div",{class:P(["chapter-wrapper",{night:o(Ae),day:!o(Ae)}]),style:Z(o(me)),onClick:C[2]||(C[2]=g=>X.value=!o(X))},[e("div",{class:"tool-bar",style:Z(o(ke))},[e("div",pn,[T(Q,{placement:"right",width:o(re),trigger:"click","show-arrow":!1,visible:o(v),"onUpdate:visible":C[0]||(C[0]=g=>he(v)?v.value=g:null),"popper-class":"pop-cata"},{reference:J(()=>[e("div",{class:P(["tool-icon",{"no-point":o(N)}])},mn,2)]),default:J(()=>[T(H,{onGetContent:G,class:"popup"})]),_:1},8,["width","visible"]),T(Q,{placement:"right",width:o(re),trigger:"click","show-arrow":!1,visible:o(w),"onUpdate:visible":C[1]||(C[1]=g=>he(w)?w.value=g:null),"popper-class":"pop-setting"},{reference:J(()=>[e("div",{class:P(["tool-icon",{"no-point":o(N)}])},Cn,2)]),default:J(()=>[T(W,{class:"popup"})]),_:1},8,["width","visible"]),e("div",{class:"tool-icon",onClick:D},Bn),e("div",{class:P(["tool-icon",{"no-point":o(N)}]),onClick:ue},wn,2),e("div",{class:P(["tool-icon",{"no-point":o(N)}]),onClick:E},Un,2)])],4),e("div",{class:"read-bar",style:Z(o(Ce))},[e("div",xn,[e("div",{class:P(["tool-icon",{"no-point":o(N)}]),onClick:Ve},[Qn,o(h)?(p(),f("span",Vn,"上一章")):ge("",!0)],2),e("div",{class:P(["tool-icon",{"no-point":o(N)}]),onClick:Qe},[o(h)?(p(),f("span",Pn,"下一章")):ge("",!0),Mn],2)])],4),Rn,e("div",{class:"chapter",ref_key:"content",ref:s,style:Z(o(ve))},[e("div",Fn,[e("div",{class:"top-bar",ref_key:"top",ref:se},null,512),(p(!0),f(oe,null,ce(o(b),g=>(p(),f("div",{key:g.index,chapterIndex:g.index,ref_for:!0,ref_key:"chapter",ref:ye},[o(I)?(p(),tt(K,{key:0,ref_for:!0,ref_key:"chapterRef",ref:V,chapterIndex:g.index,contents:g.content,title:g.title,spacing:o(n).config.spacing,fontSize:o(R),fontFamily:o(q),onReadedLengthChange:ze},null,8,["chapterIndex","contents","title","spacing","fontSize","fontFamily"])):ge("",!0)],8,Ln))),128)),e("div",{class:"loading",ref_key:"loading",ref:be},null,512),e("div",{class:"bottom-bar",ref_key:"bottom",ref:ae},null,512)])],4)],6)}}},Nn=le(_n,[["__scopeId","data-v-9a75e165"]]);export{Nn as default}; diff --git a/app/src/main/assets/web/vue/assets/BookChapter-txg2S1ZU.js b/app/src/main/assets/web/vue/assets/BookChapter-txg2S1ZU.js new file mode 100644 index 000000000000..166eb5cd76cf --- /dev/null +++ b/app/src/main/assets/web/vue/assets/BookChapter-txg2S1ZU.js @@ -0,0 +1 @@ +import{a0 as Ne,n as A,i as S,R as he,a5 as Pe,o as f,d as v,g as t,t as z,F as ee,N as ae,u as n,a6 as G,a7 as Re,a2 as He,q as V,e as J,w as W,a8 as We,y as ge,a9 as Je,f as Z,K as ue,aa as qe,v as Te,ab as Me,s as Fe,ac as Ge,V as Ze,I as Ye,M as Qe,k as K,a4 as je,c as Xe}from"./vendor-UVL3l2rb.js";import{i as _e,g as Ve,u as $e,a as et}from"./loading--qckEkbY.js";import{_ as ie,A as de}from"./index-CyZ_tLuT.js";import{u as be}from"./bookStore-O1g6rLjj.js";const tt=(c,a,d,g)=>(c/=g/2,c<1?d/2*c*c+a:(c--,-d/2*(c*(c-2)-1)+a)),ot=()=>{let c,a,d,g,s,U,C,w,m,I,i,B,R;function u(){let y=c.scrollTop||c.scrollY||c.pageYOffset;return y=typeof y>"u"?0:y,y}function k(y){const b=y.getBoundingClientRect().top,Y=c.getBoundingClientRect?c.getBoundingClientRect().top:0;return b-Y+d}function r(y){c.scrollTo?c.scrollTo(0,y):c.scrollTop=y}function h(y){I||(I=y),i=y-I,B=U(i,d,w,m),r(B),i({"5c00dbc4":g.spacing.letter,"0f47b712":g.spacing.line,a14ef5e0:g.spacing.paragraph}));const g=c,s=u=>{const k=/]*src="([^"]*(?:"[^>]+\})?)"[^>]*>/,r=u.match(k)[1];return _e(r)?Ve(r):r},U=u=>{u.target.src=Ve(u.target.src)},C=u=>{const k=/]*src="[^"]*(?:"[^>]+\})?"[^>]*>/g;return u.replaceAll(k," ").length},w=A(()=>{let u=-1;return Array.from(g.contents,k=>(u+=C(k)+1,u))}),m=S(),I=S();a({scrollToReadedLength:u=>{if(u===0)return;let k=w.value.findIndex(r=>r>=u);k!==-1&&Re(()=>{_(I.value[k],{duration:0})})}});let B=null;const R=d;return he(()=>{B=new IntersectionObserver(u=>{for(let{target:k,isIntersecting:r}of u)r&&R("readedLengthChange",g.chapterIndex,parseInt(k.dataset.chapterpos))},{rootMargin:`0px 0px -${window.innerHeight-24}px 0px`}),B.observe(m.value),I.value.forEach(u=>{B.observe(u)})}),Pe(()=>{B==null||B.disconnect(),B=null}),(u,k)=>(f(),v(ee,null,[t("div",{class:"title","data-chapterpos":"0",ref_key:"titleRef",ref:m},z(c.title),513),(f(!0),v(ee,null,ae(c.contents,(r,h)=>(f(),v("div",{key:h,ref_for:!0,ref_key:"paragraphRef",ref:I,"data-chapterpos":n(w)[h]},[/^\s*]*src[^>]+>$/.test(r)?(f(),v("img",{key:0,class:"full",src:s(r),onErrorOnce:U,loading:"lazy"},null,40,st)):(f(),v("p",{key:1,style:G({fontFamily:c.fontFamily,fontSize:c.fontSize}),innerHTML:r},null,12,at))],8,nt))),128))],64))}},lt=ie(it,[["__scopeId","data-v-2297fe46"]]),rt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXr5djn4dTp49bt59rT6LKxAAACnElEQVQozw3NUUwScRzA8d8R6MF8YMIx8uk47hDSJbj14IPzOGc7jPLvwTGg5uAYDbe2tt56cLtznvEnS6yDqCcEaWi91DvrbLJZz7b1aFtz1aO+2OZWvn+/+4CHeB6BMYaqBLfjPNRY6RFT2JJYby+uAk4WUTrtlmJ4hgPYb2q1XGDQjaK8pgJHvqNaAX+KyuIkDXpgQinb46nOulnn4b5laUHTxLfseeArAoNOeJlOIjdoal0n1FA7tKFv5roK+YaHOqP3P0XyKHPHY+MhTRe5uCZnKhtJKw2eSrSoBDPLtpZuNcFNJcFyiCMxOaaHIfXz1e8HQbWLySrBQ4x0x1qlhnHlnz2HQEC6TNb0gTHXa7IKhcaHqkE015hk9whA0YeWiLIXf7Fa2CZo3DjqjB4tTuF8jIcbfcEx5z/w4sXpQhXW+ju0cqh7icTFmRMaG+v6CIvTjcSpHcH8JEsF3EPh3fRthYdVLLgI2fWXm85/pGFE4l046s70L+yKCcirGFR+jbpy3kMmiCGHrSezVONsn1RBixncyk2PcVWk7DlgxHo8iZwDyq5uAUD854dZhdIFYzKoQig2haUKi1lVufz2RZUZPZ41n/hrOQB6h0Hhg8I367FNoEHgeM/KY7szSeQwD8q2WE3HM35ZLl0K1MJiOtHIkBclRQUwZnyOWcNsRQQgVLj1PSqkjF9DsoOSaSg3iinKzvfmgsNFFfpP/2T3GLGvL4fHEfwIX1sVvXcPqLztehWGcfn9nI2U9nTfCgJPe/jFPLZwgVEzimBgAm0VIyK2tt1cE/AzQdLK+SxLSQ4aDCZnnId94OG2S1XwvnTbNk/ZnhyRCQT+sZM6z9g6LXL1BOBe+zJySiFkHAINCtnQokbCJ/apCv0foqPiZVfhpywAAAAASUVORK5CYII=",At="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAACVBMVEX28ef48+n69esoK7jYAAAB4UlEQVQozw2OsW4bQQxEhwLXkDrysGdEqRRgVShfQQq8wOr2jD0jSpXCLvwXbtKfADlFqgSwC/9ljqweZgYzQFnb/QGepYhA9jzmTc1WaSEtQpbFgjWATI00ZZtIckXx8q2Oe5yEByBy+RHOTcM+VVTadULsvxvRC/q8WTwgcWGD+Mnaqa0oy2gw2pKFzK+PzEsus5hP9AHojKslVynLlioVTBEN8cjDNnZoR1uMGTiZAAN47HxMtEkGUE9b8HWzkqNX5Lpk0yVziAJOs46rK1pG/xNuXLjz95fSDoJE5IqG23MAYPtWoeWPvfVtIV/Ng9oH3W0gGMPIOqd4MK4QZ55dV61gOb8Zxp7I9qayaGxp6Q91cmC0ZRdBwEQVHWzSAanlZwVWc9yljeTCeaHjBVvlPSLeyeBUT2rPdJegQI103jVS3uYkyIx1il6mslMDedZuOkwzolsagvPuQAfp7cYg7k9V1NOxfq64PNSvMdwONV4VYEmqlbpZy5OAakRKkjPnL4CBv5/OZRgoWHBmNbxB0LgB1I4vXFj93UoF2/0TPEsWwV9EhbIiTPqYoTHYoMn3enTDjmrFeDTIzaL1bUC/PBIMuF+vSSYSaxoVt90EO3Gu1zrMuMRGUk7Ffv3L+A931Gsb/yBoIgAAAABJRU5ErkJggg==",ct="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEX6+fP8+/X+/ff///kbczPAAAACeElEQVQozxXHQUgUUQAG4P8936yzs6VvZNZmN9QxVxiF9OLBoOjtOC6rQq6ygXjI2fCQBdXBg4egtzFGdqkoI+zgBFbqkm3hQSxhFYLotOcubeKhOnVYoqQy+m4f5g5TvpX0xHLbLY9j8SMhJp+Jk4LfAUS2kVRIjILmnwGBTX42PhCVlDJQkIiy2nWAvaJ1h+oFIpJ0hMSYVbyyrgDWshcMpMyL1brPDQKWmduO+KTJ6XeXAMK9Yc3FpD7atyNwg6kt5XgFpLPhjUTFSYVn2abDiugGShwD8JTVRJVo/2ecuKtRb/qc4BK+9TboFfokog4T2Fn6Oqdnsjk90NMS76Rji6E0NmwkPBAZ4Xbkw8KoDAkAbEhkc78e9omxxgxg6qa5HvMv+UZbCV0qmHnSHKl5TxeA2XTCGWekR581mwC5crBH81PznASqB9va3TbkYAjJPLfg5uBfXaJgIgIBv9eessRIhxe7PA7kj6uUMeMaQ/OEQOYRaaHlqH2Gxwsl6E/pwVY5FH7uCypBZPKvDQyVziYBrAkMURe2MOOOxG/eQpp5PF+bFzUV5HtPj9GeiVSNZDELleifYTp9NAjsoiXg4cW+4ZORkdSMB/B74aAdjhsVakhgkugsbmqcDSLEoWp8zRjrux3tli6Q5uM3E+maT99Wy0RiP7tboiuRZle2c6CYeL2kcUc1KvPtQKucogMadKVTQOJYCeyCYlhQQ/Q7Etfd/vBygy9iqy+LyHeF46saCYvW6ingsbA9RBWtdi8GgUXW+oQx9/wP6bAAX1TWeV+CbShZDlQ9xT6SoSxZmKRAkmXb60kzEzkRF+Ccb94BGspGJoN/UzmyR4wjXHAAAAAASUVORK5CYII=",ut="data:image/png;base64,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",dt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAALVBMVEXx58b168ny6Mjz6sn06sf27Mvw5sTz6cbw5cLy58T37svv47/168v37s7t4Ltrv0//AAAEjUlEQVQ4yw2Ty2sTURxGf3dmOqmPxb0zmaStCnfmZpL6gpmbxIpUSMZGrSJkxsZiVZimNVaqMklrUnWTRq2KIDFWWx+IFrIRFxXEB4KIgqu6EBdu7M6FIPg32PW3+DhwDmBaYrK56KP4HGIsvg/uvOV0wK+qgBMlO9BujuH4DSJlOseqV5a/BEF97gt0ChyIPqBhXI9BtqtIB8vJB/LdCQ3OVjaLNX0g7+OmoI4e7nkemAqX6o8vg0yyQAyQS7IfgvFbI+6QyI3R4KELxw7kwM2ooQfyQigYnwY5MZbMlHI1DvnQVCoVcrt+R+bO7vPDif3ybNajwqAAe443dpfDsPt379VMWZzGRuqM79mQF+DUz9nt74bQ8J/O80MtVR51U02JKKmTCvTzLVf+vuxP/aHnPo9+2bW+zVsJ0Y630/CrfzX+b+UL+7O68Rczv+7lrMh5etfKXvhc2rk6KforxuoO2xB2tcxKfeXHt18rHOiHI/0RRjW/YGRDkHiwo3nzqL60o58C/bgRuaj7vk+QOwOhpnFNdjuWpKMCGP8Yapu9Ty5FTHKQLGSEFikjd9ADwP9ciaNNjc5qMH6w50AF/LKOsOYqsOG9GjKgc7ZXolqntm6fysJ6Ma6ll2CiqmOgE6O7x1wXExklbeqMYcwsmJmOoigt8SBg2WfilDSsAZJcBxDcrqtBXzFQJqZNHfscyIhoZlygAtyYAceah+elrFbI+46gEHDGiW878Kj7JpWyfhg6iyRMymV1MKBSeVpfgLHIohyTojI6sRyK1VpcqzVZeEBLOnA9unhGKUXPJDYtV9Dxuz4iA5xSkSWhCJdAiJR9PHlvfvbntbrR14FDqUNRAYDJmSnv3oKxuz5+7fiblgVJyYLTbgUM05P7LESkoXvyWNfb0aUU6FZizgQIa25VqKQZqFrk6v6BsqqIHlQmkQ9KrBhkC20/DrFsAFEEYLjM+lj2wYHXCwnNvZQR42XJ2iVK+UBXnI+OBE6oXpUUHiQ1yg0MhA03iwGbnOdQYc1CMiPIPQrCQJFH4L4BMFktAtKd9PN5gnU2Gra4KuK+V+mjtBRpAGIqDVe4wnSnajiFGO5d7smvhVQEMEYwqshrENIEaY7YeblJYtsb3QhAHWZCEKK67swwPMKw0If1Ta+6DgHmlgPzcUTSbi3rrv1Y64/BYEMPQ5SDHUOR022B4QRF6xLUPAaPX/V4IDI5N2BMwx4LqO1uO4j6uW7NvM7lATqGAxY/ZHVgoGZbu7SvkNR75x6qGSB23FdouENVwN7sCbewTdsXGrrnQ5ZZKOCOFtMTIzxlPu6eYmtL+nMFmoK7OeXajn86r9sqWbfmvHC4IagE5qfCPGZvLSq5F55hHIxJFa4/vRxHBlz0og4TojU1l/MOHJX17lybdF0mQhFO44JYUNt3UA473IXw/iPfDWtKG5oFSXIF5iU/VnyDSjxxeDk3jAXRyVyGTNB9FxH9qcFDNJpVbt2y9LytUXkK7Py6+z1RezHQqnoY8XcLimmd8dCnBhQCuaGpJCq3SoIlmYvLz8UkWhJw7T8k+Db/DYEKwgAAAABJRU5ErkJggg==",gt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEX48dr48Nf58tv379X17NJtIBxUAAACFUlEQVQ4y1XRUZakMAgF0Af2AiDWApDZgHZqAV1nZv9rGh7Rj7Y8McUFEg1wvcMESMNVD/neU8Xcaz7nYYkYlYO6Ti82PBI4BvIEg1aj3wKwRvIMgZsUy5LdhCawPFh1sZs4SrlyN9fQKpv8s5dgZ2eLyqqJiu+WkCmUEybXkm3INS01WAiv0PapJ0CZc0SJQUzcWnZYbOOY20iFD8Bk+/j2A3wNxH7GdShFYS5ff237kXh9I9zSkQmIAhOsOSVfJ6DIXTMDaPnzkRJ92S1BQQmXl5LdirgRLLDdcYqcGPwe3QN4xCBiGNbrqq9wpW1XCecChwaQdVOsRDpPCpeoolPdxeXp3WNB9PHVzWBHlygy4NJCCrFHREv6bDt0VGwJZASkpONmm1UseGeFKAQexgaAkrfYWl3AGxWOLL2AIMBNbCXpktmS3k3vHeYjGCPBa43wJTurO3ZFVpQSJdAZGLoHTyk1upkjxMEaIxum3iIARcCa5kSkFAW5fi1mUlL9eyOsaanFmOMruwvEdE3ZYzsRSzo5ewRLXyVPPEvknt8ij4DvCg2O7xOgBCUprEzV4z1WekSpUgI8DT2mrnSOXKRfQavwuKA1F+tFnMKdJSUpMA7wQAifWRkMgjUKKZE4lBl6MCM4B1pq1P4uIjDE6Pq6rL0FnW1nIFmta5vrSvq/Ch4tpqG/ZNyyWa5jZPktq81eYv8Bt5s4iFITOp4AAAAASUVORK5CYII=",pt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXN383Q4tDP4c/R5NEInCCXAAACVElEQVQozw3Hv2sTYRwH4M/79pJ7bZL2bXqtERJ97zjUpbZDhg6pfC8qibi8hLR0EaJ0EFxaCSWDxjfpj1zrYBcRBKE6SAfBJWsx9i8IQfdQxDlKtA6t2OnhQfN3lbG7ytYRywF8rVoPCNO0X2sQOKDpAnSDK2VwkHgmh5yLGT8qASt+2KofnNt2Xg1gf1UF8AoM6052cRMNaloLZb7RKQGrKKji2OefsZF+VqIvos5ZLVIZCX61JcwUdk56wASVkgQvzPfvmT2twTSwyYaC/Pl/UhAHorFhBgZtL6XdAZRp1tkPwC1NLa9CWs5prLhI85NBQsLdXvjDymG3/EbYfQhVNYqc3TtktQhWLY3ko0QsdMbSEp+64v0NfxyqLbIGdh6M2xHHlLBGqKTyQo4E/nebBgBfe1GpdeywYXc8CT7D3cKXuMXkBy4xN6o5OuKamYp3DVI6uccO9lxgd2CAlJgI2BGgaAgIJV/TYwKqu3WFccjbMuA+bVkWgS2bfnlRbD1Eb1sDyWMmjKYIBgGAWbqKRicfvzBkBIz3V5AKnguWdglQEysQsSuVzOg6ALy1pitA5ykGCsc857BRYcgCSZyFOdvoOigSGoPc5Ta73mgxshIcQE5sHMHd9D7yqITw7JO+GHVMxjhzYLcKPSEgmz3fU+BRy3iYNtiXLaBssCW8KguReqkQOTb3MStV0Ugt4U1eIs1RZWRII6Ww8xeNNItyGGQI4ZMlpg/3lQtkl2JFnBp1imRyFe0kK2Id3PCslMgiQNMS77gvFeDhG3cSkYvheeg/e7ClIh5oh+IAAAAASUVORK5CYII=",ft="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXh7eHl8eXj7+Pn8+eTbH1KAAACPElEQVQozxWPQWrbQABF/0xn3JFKQRTZOIuUsbCCbOgdRoYEOauxkYPcTRyTlPQWIxEltrsRwQ6hK9nEQek6F+gNTE/Q3qLLusv34cN7SH3mFicdYW4gNIhJWXPBRVXzjcFD0IqeU4o4PRbAIVjyico0vJpIifqPfL80QN9DAQY5ucRHE/hpHxBldXe9GilaHKcKMlj6pho2zXgkNdBl0oJ8kiF1DSiJF1ZHBJkQr0Dbux/5I42Zp4cFahJDFGeW6/QjBwmFY/Q7vZ2SnoOdW2parv/Cnm81+m0xrEfiVXQ3W4nOXIqVYi3l6AAQBwMFkViVBANMto4enXHPNTkHBB0oVj4r5vHzCWayrgBvxtygDlDB2CNDjd80ZInY69aKVYZcfJ8DW+fWuc+syEODALx+ojqoafHsthTI+ZW27PGpIeo/cR6YKcbqIuIFhHmBrzAovzIOOJk1ucvcDzrMRYGVBH2yvcAOf0KiKwfRovBI3tm/kW1eemtfNWwIIXE2mJNhvoszfmMBfRCv0OPwd2321uDW3nx2q/BDxFVeoN1g7a6Im8yRnoawa8kbdXnU0cHeTMxKfZGlJgvLb3sKsxgglQnDdAfvj9LUnqWRDo0GiUmPwyU7TAsD7wHeIW3Nfy1qVGKoE9NgJCdYCAexNRob9yCn4DAQmXtQuUtera6bEmTTXhZy6h856xi4mnEl6BI9mfISkLbtJyZIMJIAUd5ZOBEu88KRAk71yxfItj/hpIB0Errv4gO1os4/UICf+o3kkqwAAAAASUVORK5CYII=",mt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEX0/PTx+fH2/vbz+/P4//htSO9OAAAC5UlEQVQ4yyWT0QGjMAxDZTsDWKQDmJQBYrgBUsr+M517x0+LRWw9CyA+pC1YzndrMgHaNXVKQ+di13Of1qbur48nWhuRjj8i6ON8e7pNm7zyag/DBTfS9Z4Hup1fUuXMKY4HEE8QOHCByXkIkl7lDT239RtL9quO4JItmmhOAHXg45QuYKrQFLyGJcRvaTw6kQqZy6mkR6JAPFH/XqsQjEDRmUOA+MNLHGyMUT7AHApoAhjgjIJmCxy6XHdf648AWCdGe57IUDazCeTImQOY4/z+eVYVX2IjOw9RydeAeJwl79iGi4HpgQgHEchWraUZLtayu8scq0lHHHUKMY3Ml8hB7CS1jOckDLG9ccgNeX3124phOcjL9fPnWJhTXpLHeG9DRmHnTxHEaHakS2J51lwAJcUraNbuU7q4gMTDQj3Eripc/x+qFM5VEKAB1roQfAkX5/PxqnS2QpOrxfK1Zft0/omV5T+xCSBUAIbEIwUQgvAfxFE1O8dnk233+1UZiqJ1mAbsue6Yt8tF+yOrxC/YrUhzC4qPlE3EbR5hGKhhHdlrg7J9WunV7L7BcYQwAeE59u2tnN1c6gfVYrQiLSZ9OxZdWDXQq0+r0Pbarh3UqGCwauVvbiXuDsNxCtLDdW9rTF8oQYN4EoXXdfmwNguQP26n/tRjDeo+F2W7PjWtfSr6Bn/z+cXOLp4NnMV4RytvSW4B68m+XN9XfZTFGhO/S+cHTuTqZDC21ccA0N7QsePALaDQC3D1f94U9CWo+aq6BjB3v0rxIimBM12296M3aKPHjXLQE9KQKH4By8RHraJ3AgVto2r4xdFqlaPaiAHLl1ZF4P2pI6cYc+K8UZdcmxy7lqGc1IoPxLmIFuIeEZ6j2sQT88muEg1zwrEDTIX5U/ZmcsqfgVlBumiBLF4sAyhf9BFlXOPKLZ4H0iFb3VoHrGhtHTldKrOvP2/reu2zfV8CXMPqzRdlgd0a5eI7WwB/AYcgavcqxXWEAAAAAElFTkSuQmCC",vt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXM2t7O3ODQ3uLR4OTDp25yAAACdUlEQVQozw3P70sTcQDH8c/3/M7NG+j35mnHwjwh4hRy/QFK3zvPNbeIG1koPZmxfj2IDAwihL53zj0JYisfmEHcZJZOiBUG60lZiI8T/ANusuftgQ+kCPIPeMP7hS5mUrV9c1g6MQCAEZ8tDLHwofImAGRlX+SZK3Vu9rRRPuO4PK6/9nA4GIATsxlODS+rdCMhkAZivpYV0LWoQHSLSA4NfUg+6mY+7BKL2++F9LvnrBDYm6JO9i/YO3i/HJTGQ4pdIV82TbEDFG6vGYCd4wZchgK5J2CrKTLE+Tx0v+YGlIbdWJFcQl4ptBN8fUJQN1MCJLcZLYwUVVo+famGGty8EXJF5ofOEDzcodT3/Fb0I5sHmc1ZG7CcSl8COgxlXx09jT05OafjCZLIHJhGIaU6wDZHsuMQ41wbdjmQXbhKnMq1zlXSYrjCnyZblqexA7fC8RxS74tq2P3OxSQwTuJSApH8OZLzBBp1pOe0i3rdyDUA47GySZ31YmC4EQYSXvFSvieORGBxXF9aeVtUWKGS9WMC4Z9Y2uXnJ2nCUXVMbPOYqNYNmGWWQ7Evr+BWC+a0JAMTImcq/S4Z5INdQMeuOqDIMa9beilxfA60iC6sP1INcPDpmHBW8drZHNmqwyddJtVje9q8WGUgWAOzmbU4FCQBFi8B2Wk6pickBnYhJMenmJGuRmtt2IoKq9NuFGbNFR99sHnvrnLsLysKANDIsxbp6RNMAsoDSKuRpMwZbAAzI68QatIjmZ0aImyM3O8/4e2MNlOHZomFsa/fLDsysliHS+nlYLQJMnynxrH8QO4PaAV2Li8B/+52UgeGIVNFYf8B1XG/kFSmLcUAAAAASUVORK5CYII=",kt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXh7vLf7PDj8PTm8/ecW+lZAAACZElEQVQozw2RsU8TUQCHfz3fw7MS87jeI7DdmSMpDEoHE+P0HqGkvRR8vb5XC4NpN2RQZqcK9xJkwtriekcggerC4OZADDiT+A+goxv/gfwB3zd8H/T6vYF/pTZkCSmDNd3CBEtmZJP4N+CvvhecDvmntKsvwB17rpbIRTLOEoYkj9KZzRUuJsuBQFwgptyJ3Y7EL4V+ud5LO1UnMeQSSObqisiISZkbQBlliP3qWSk3GPQXjxv6VF2BTDO4ySx1zhuJXbA2wBNJF4t5vH9keg6wu5NvUpLtXrZ3OHC9ZsgVcZdOl38PM1y/L6m8GRiErj4AqezUjHGatGGIgs5NJDHh8Ua1IuB4035haVT6SaYWMoQ0eJ3rB/Gpnr3fB49YAy1Wa21YKqAHOmAveVw6CCMGMZh5bGtVI7jnZaiQNbta1Z+285oSoKoRbta1KZ/1bBdKH/RIxv2pRVpkoCmvpr097RWoo0CpMlTWllIenSjECU8mV43mHx2fIRfH/pncrJm3+58BWdbSqCS07/yiQnvHiCG4ZPGRFeAtfreoOubyctzHvLNHhjNvIhukxQzjU5O6QdOEzUp1Ef4d98Pxz+IPYX0bcpnT52dbedfz8y7C4R89RV+MjJkuCCx7mWDt4eyK/62lQB55xXGJK7p8u6bgRv4hVHylelYGGFs64W94tng8sAIVqSRJBpqRA9rFvAysS+9ak8s7557pz5HR4qhCRmWgplpTRJ+bhYfSAMO8/YBucWPuSdmFFtOnuWqvV2NbF6CJnbhNDzEZ/T0XSDrUydzkZCG1z/oIEyUFYxW/KPXNfwopuHDcO04UAAAAAElFTkSuQmCC",Ct="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXm9PXq+Pno9vfs+vttWKBGAAACPElEQVQozw3RQWrbQACF4TfCMjPqZgIj4RRaxsZKE0PuMBZ2cLKaCI9RDAXFmJJknUWWI1O1UlamOMHJSjGkuFn3AD2Cr9CepDrAg+/xIxK4QwIqHHQkUhQ/WuphInVIFBojl8QXc012Tgq4RTtVHWVLZVFh1tEoI91uiN4joCqde8Ukn/zGM1B2W4ari2PtTwyw55Ld+Wways54qhGPyS6FzbIT3lIY8WwWdCq56Yolx6KmSKzoqrsCB5heAp4TGNQWJ1Pc6XlE5jQD5OlIX9I47A9uiUQcPQxcury/ToyxWJG/za6ki88crxKPocKS59Sl3EtBG7C89fCGflpfqoSzCeC4crioJA7F0V5+8MaSIk4qSCdwzpogmbqzEirVpGiS2dOVJvUuuqFEmhHao06KEpq+8lvHI14NJk3Qrmi9vBuRLwAz0qZB4hsDXQFXgtnlpDX3C6ug9BquSw/CYtwAzuTz5vuQNdr/YibhR68378ehZH30FSpjh71LpQkrsj+Q062h5WwZ5wlRoD6uQJy1DqvSYuCUapMBqT5YA4ZFw4KlWapxoUGlKWrx0eDQvmigu4WMYt97ruru98fYL8/0lG6CTOFcFWBhFK5gKw19h2JN808nh7xhkU6sWKLXdtkqBL6h+lULK5k19wFB/FldnGYf3LDeuf6IC2/MzJOSOP0qPxLqzaGIqtBcFIItrstkazONOkrc1D1czjuwEGESB4JJnjgSMN7PXAu7fZQpl1C236C+9mM4Af8P98Ch4R2TRl8AAAAASUVORK5CYII=",yt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXPz8/R0dHT09PU1NToNyAhAAACdElEQVQozw3NP0xTQQDH8d9d7sFrG+QeKVgQ4aoFCwFkYERyLY//0UB8GNGg1WAC0RBGJrzW4mCXQmpgvCYOwEAYiulSpYtza2KiW7s5FgNJFSV2/CzfL7RwpoJ20iadmgA8owOyaxmusKE44scBeb4vIv00dqYgmf6jzWcr7W6INbDQeZbQL9ytXeYgtFfzmW1Fek5msxJlwhyt6qDDxOLQzpVPompYrMPnEnhvLm7M5BxY5nowAj3zkydAkpC0FIG6g7AK+Ub25ybyNWVYwtpseP2rfrQwiGRpfqrnMuPeuvr2dA0p2YsHF2XghkrXKtZ8tLBjR7S2qIaYbKmyLd/QP+EogLjqqwNw5Lq1pDlMLkM5+gNoSvdq+Pxmz9/61EFq6GYM6GqaGvlN95zy3gsmEWI8K3k8OP9OmRLEPO6DP3Wv3g42COinJTZ33dcIvs4ESp6opMTjDs6mcYTEbFeUifuxh989yZrIx4lkpuixxz0nHLCekKbE17suKhYkMGhoYhTZtVBvg4bfq/1L1Im0AGMVpBFwumM0zwyuKiCMi5dqR4Flx47AGyF2xTbxqUdTwCH94BT3DozpLV5WuAL/N8rGtHKjotBOOuOtCJ9E21uqsyBoLOzaXbHPrK5PQBP+fBfeidvJAeMIAmzVt5IkJJ9DBWaZDAepYUhlQqHt0h72SJ3j8TZHom64f516xx9T5evgMPgwG82jZdJaJIDyWp6LAjOCclVyzNA3iTKzIULlBQEPaTXlPHok5gISclmyaWZlqY2aTHdRHpJOwTdDEQ3ZfKtbpclcNhyVClagmY+fIfyKukntPqBgnx5QvZHk/D/MK8JMClrSigAAAABJRU5ErkJggg==",It="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEXe3t7a2trc3Nzg4OCXP9lCAAACoklEQVQozwXBzU/TYBwA4N+QEr4CNbSFwcFuowSqMRvEAwShHWAYNsu7dS0dLnGUSWT4kZB4lGzE4VtcwgIDJqcOWLJxcv4BOoQZuCPxSNSD4WSWLJGL8XmAIiyo2RgJ4A1pxQQlOxRAszLTdnPu2oQGb05RC5slJld7ZAIfo4O44Bn1ud59F0BcjnYOa17Jhwc6EdiKettncsXjT1f8KUBZUW41pK0Jc1Az4dEV3rkkPBtDSZ83Blyt0kSf2PRjzIykoBwINisPbPPtljdVE9iAXRfUPkXLVIgYrCccp5g687NdZbcJ+xa5VE/HhTtT23IKsN5jj/pcUd0dTZNAqCVw72n4gOwnTOC0vvHfaauT8d9zAoRRfPpISZRVyUiw8ELzOG1b2DZpFzkSrHLhq52twDEdyZHwvp2j4uv/bjvOf23/AcEtTuJbY5Cp4YcAer1IGkUzOo2rn8LQOKjFJw3NTw24nprQXY5aF4wxcqcSdbFQ00H4xFl8Drx4X4CikvAM1tuR8bKIBCBoLnKN10KJG4zKAsc7c9WEB9gnCi6BhVjqoco6t20ILAJuVctvaEZK732cRHDRmGfuihOam0o2CHByUZ/epCcVlRs2wmCnMqsd6aSim3ibBJtm1LGyXW3Bb7tJCPlFtUG+SvPdeEUAB60lNdo+VQbLcwRNVtT68FsLcr1+NotgNihlpExS1V2SFgNbeC8bEhgm8sM17wSi6Us2gxVWJU/5GKBpandvfyYbU1yHCLpCgWGbbPXn40rehEsUXKIJr9DMKgICfjc4bl1YfvUhE/YIECGRqjCxSM9hrybAIkND5OeWfFZsXkxB+qDzb7pUQ3EfQ3Ml6EChEt3D+iS01VqC7EQ/Z/DuPQcz4yChoFQJce2Qr+NNAv0HxofmpXGqgHkAAAAASUVORK5CYII=",Bt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAD1BMVEXm5ubo6Ojp6enr6+vt7e1FnZagAAACrklEQVQ4yx1SixUbMQgT3AKAFwDcAfzpBN1/qMrJS5w7bCQhC6IGSUGYQJd6Ox9ZPXi1AGJBavhUTT0JjYPGAab9WcDYIxsmlnxkayX8mhxCmKHA75az5cfRbWybEExiu08xDSgGym0mwuf3j4SvHeQxDJJzh2zp4iOlrD8iOb4SXyC1wiOLRTcnrje+nGamFeXVKWkmzbFIPChkmJ6Fg7mBpV8n+JGOVCd4jv1thThkjeQGNeafpeV3rsEWLfyWc8tC9jOv6FQ8rRzHOOVB+jCYEUAJpDvh8xHNFm/Tm5p5lw94Pp3NhtKEfQsGvnXhowdZE73hPwxKvjDd4i4PCdd0fe3W5fO8ktAsUAacLgstpUw60JCiPLg2XpkgiqPIYYXJd9ksGIT3q+LlevypzItvO+s0F1dBzVr2QDMUkYmuyGcrIS44mVJ7JVKwQXjYuBYp0Uetecbswzsikzu3gUR8bJC/C8Gd/NAzI/xdUGOYQQHDZ8X2d5XuzGRUiXAi9si5CRgoiToRZPtzLJkd0FUHRHZwJf0BHT1sE7gcnh0jmKKlSSF4/GBirGk5+K9NKlGDCfc9JtPhg78JdabH0YQRKNZnJ8tFnPfXHJb4xum1TTCeEmyEdbyEJLjznMLHuFD2Y9NEkSleIBs7SiCbblhgctVi9ch++kDYnn1C9DA5TvdPsToXM55wI6k+8eKT1blwPTqWb5CFJ+7dTBmab+KHy+xwNtItXhZNSpHD2fxnynrxG3ZBKRe8KBpXk11AnadlccEhr9w1nBBvBylNkv7A8eqpGBCDqhitmWQXBjjdS6idr/QjXWLDeMzMbVDoJuM8zN7WenMZWXgZ2vX3F01J3jHZbwk1LRP+DWEvDJtOUoh/AIaBUz5VpWyhuyx4QtgL/NmgC6kM/JvNe+R/C/5aL7BKIbYAAAAASUVORK5CYII=",ht="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyBAMAAADsEZWCAAAAElBMVEUQERMODxESFBYWGBkaHB0eICLm6ozJAAACkUlEQVQ4yyWTUdLbMAiEASfvoOkBkBy/O5keIE0v8E/uf5h+68qZWALELgu2MG9PP9qyvCzTVhrrsPGOCjvTfXQZvtp/W3Gy6LCITqs4q/DZ+KYl76zKzHVYpY2wNY27nqN1sbLGcrLH3/ENH4oWlGctsDu8AO+HzTLlsYdh8MzP1m6YDMz0ACfcimvakBj+mwO/+5Uta5teOD379sxK1fUxmUhv8MU3jUT5gs26PMephFznkLcpQZ6/dPL9C/GWHcCxDN6oZhD5xBm5qoYBPA+PFE/H1tXDWcWl8TW7rS+4dUzAVy0BIrvC4/HcqW2TkG1HO8q9dC23INAg7NA4AFRFkDTM2lfELPyFzi1VddcpX2z0KjHBUDmdLNJ6dDps4ytrX+FPsZwE31wSL+6OWfHOAJ3+Y0Rk/MiKfmWNPg7oVP/U3Ck9FoCkC2gBpALOiqbMNTkOe8P4FWkTD2Y9Q3+5VmV0uLUJBl68U5uAK2Kl6QDXvLxbwweOL2sixW78uU8p0ysfc7cWrF1j6B1sPJ4WgclYSnJN1bzozrhEcFHmRzBkbJWqqdG+EYJXRFmT5jnLXPUNF6WBdoFbTxYsmDXVLU/WA7MExNc93sJS5hIXDeLxzMScHzdhKvEkibr6cQXYPrmtmTA7JcInISrTzRDvShTdka0uVGrsJAAR6tSn1sKziZtfKVjAxPrJsYgZO0bye+vKTZ/DgoAoLGNO6jYHimZYTL/3pLJHawquJukjBpfz8WOGVSVIWx9ywUfS5iENutidRM4NzkAmxgUSQ68xgNOU+ZLalr4TS2V+D2xqukZig+Z9DilR7Nouzwp1cp/3E5q6Rdlf08obKvAM4qZ6pMr+w3PmQALSSBfjyZn5DwrNRVbywBQiAAAAAElFTkSuQmCC",bt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEUWGBkYGhsdHyAfISI1t/v6AAAB5ElEQVQozxXQsYoTURSA4f/EeycZsDgDdySDjihk38Hy3GWi2J2BCaziQhaiaB+tt9AFu1kwvYUPsIXNPoB9BAUfwAfwEUzKv/v4odGrroyp9/rUaC6rZ5skv5F8qPsfYYP+yKUMymmAEEeW55oUR4o8jr05KNzJ07yvB7w0KKfLwcQUSjfmMU0PJfPHFoEVU+ohNrcKMEzMQ23FDnVSI2dqtYWI7KlLu6vE4UnyvKc3SJuL7lBbeEEl42ItpGLjzIT8PRJCmkRjVpVpsbJFVN0687okJNZiHAr5Z7MV0BnGIDc+THM1zlbieBc1Fq+tH5BH+OpnbWkj40hSqC8Lw2TvFuF0SUFJCk2IytXbjeqcRAt6NHpnrUkUU4KRzZs8RCK8N/Akn2W04LwxMU/V7XK0bDyN2RxfDyx7I4h5vjZby72V8UnOWumZL3qtYc+8DTE0siSBMXGhywx2dMYPnQHbxdFZ7deiNGxCCtD/QWnbwDoGhRYPDzUdUA3krjpnkvdAgDN4ddLkEQSov9qjd42HaDjI34gEqS9TUueAk+sc4qg5ws407KQYKs8G1jv4xBlqBVk6cb4dISZIwVi1Jzu4+HLk6lyfUxkXvwy+1Q+4WVdHIhwfybZ6CWVhxMEhShOgsP/HOW0MvZJeFwAAAABJRU5ErkJggg==",St="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyAgMAAABjUWAiAAAADFBMVEUWGBkYGhsdHyAfISI1t/v6AAAB5ElEQVQozxXQsYoTURSA4f/EeycZsDgDdySDjihk38Hy3GWi2J2BCaziQhaiaB+tt9AFu1kwvYUPsIXNPoB9BAUfwAfwEUzKv/v4odGrroyp9/rUaC6rZ5skv5F8qPsfYYP+yKUMymmAEEeW55oUR4o8jr05KNzJ07yvB7w0KKfLwcQUSjfmMU0PJfPHFoEVU+ohNrcKMEzMQ23FDnVSI2dqtYWI7KlLu6vE4UnyvKc3SJuL7lBbeEEl42ItpGLjzIT8PRJCmkRjVpVpsbJFVN0687okJNZiHAr5Z7MV0BnGIDc+THM1zlbieBc1Fq+tH5BH+OpnbWkj40hSqC8Lw2TvFuF0SUFJCk2IytXbjeqcRAt6NHpnrUkUU4KRzZs8RCK8N/Akn2W04LwxMU/V7XK0bDyN2RxfDyx7I4h5vjZby72V8UnOWumZL3qtYc+8DTE0siSBMXGhywx2dMYPnQHbxdFZ7deiNGxCCtD/QWnbwDoGhRYPDzUdUA3krjpnkvdAgDN4ddLkEQSov9qjd42HaDjI34gEqS9TUueAk+sc4qg5ws407KQYKs8G1jv4xBlqBVk6cb4dISZIwVi1Jzu4+HLk6lyfUxkXvwy+1Q+4WVdHIhwfybZ6CWVhxMEhShOgsP/HOW0MvZJeFwAAAABJRU5ErkJggg==";var $={themes:[{body:"#ede7da url("+rt+") repeat",content:"#ede7da url("+At+") repeat",popup:"#ede7da url("+ct+") repeat"},{body:"#ede7da url("+ut+") repeat",content:"#ede7da url("+dt+") repeat",popup:"#ede7da url("+gt+") repeat"},{body:"#ede7da url("+pt+") repeat",content:"#ede7da url("+ft+") repeat",popup:"#ede7da url("+mt+") repeat"},{body:"#ede7da url("+vt+") repeat",content:"#ede7da url("+kt+") repeat",popup:"#ede7da url("+Ct+") repeat"},{body:"#ebcece repeat",content:"#f5e4e4 repeat",popup:"#faeceb repeat"},{body:"#ede7da url("+yt+") repeat",content:"#ede7da url("+It+") repeat",popup:"#ede7da url("+Bt+") repeat"},{body:"#ede7da url("+ht+") repeat",content:"#ede7da url("+bt+") repeat",popup:"#ede7da url("+St+") repeat"}],fonts:["Microsoft YaHei, PingFangSC-Regular, HelveticaNeue-Light, Helvetica Neue Light, sans-serif","PingFangSC-Regular, -apple-system, Simsun","Kaiti"]};const wt={class:"setting-list"},Et={class:"theme-list"},Dt=["onClick"],Ut={key:0,class:"iconfont"},xt={key:1,class:"moon-icon"},Qt={class:"font-list"},Vt=["onClick"],Pt={class:"font-list"},Rt={style:{"text-align":"right",margin:"0"}},Mt={class:"font-size"},Ft={class:"resize"},Lt={class:"lang"},Kt={class:"letter-spacing"},zt={class:"resize"},Ot={class:"lang"},Nt={class:"line-spacing"},Ht={class:"resize"},Wt={class:"lang"},Jt={class:"paragraph-spacing"},qt={class:"resize"},Tt={class:"resize"},Gt={class:"lang"},Zt={key:0,class:"read-width"},Yt={class:"resize"},jt={class:"lang"},Xt={class:"paragraph-spacing"},_t={class:"resize"},$t={class:"resize"},eo={class:"lang"},to={class:"infinite-loading"},oo={__name:"ReadSettings",setup(c){const a=be(),d=S(0),g=S(a.config.theme==6),s=S(""),U=He([{background:"rgba(250, 245, 235, 0.8)"},{background:"rgba(245, 234, 204, 0.8)"},{background:"rgba(230, 242, 230, 0.8)"},{background:"rgba(228, 241, 245, 0.8)"},{background:"rgba(245, 228, 228, 0.8)"},{background:"rgba(224, 224, 224, 0.8)"},{background:"rgba(0, 0, 0, 0.5)"}]),C=S({display:"inline",color:"rgba(255,255,255,0.2)"}),w=S(["雅黑","宋体","楷书"]),m=S(a.config.customFontName),I=S(!1);he(()=>{var D=a.config;d.value=D.theme,d.value==6?s.value="":s.value=""});const i=A(()=>a.config),B=A(()=>({background:$.themes[i.value.theme].popup})),R=A(()=>a.config.theme),u=A(()=>a.config.font),k=D=>{D==6?(g.value=!0,s.value="",C.value.color="#ed4259"):(g.value=!1,s.value="",C.value.color="rgba(255,255,255,0.2)"),i.value.theme=D,E(i.value)},r=D=>{i.value.font=D,E(i.value)},h=()=>{i.value.font=-1,i.value.customFontName=m.value,E(i.value)},q=A(()=>a.config.fontSize),P=()=>{i.value.fontSize<48&&(i.value.fontSize+=2),E(i.value)},y=()=>{i.value.fontSize>12&&(i.value.fontSize-=2),E(i.value)},b=A(()=>a.config.spacing),Y=()=>{a.config.spacing.letter-=.01,E(i.value)},pe=()=>{a.config.spacing.letter+=.01,E(i.value)},le=()=>{a.config.spacing.line-=.1,E(i.value)},fe=()=>{a.config.spacing.line+=.1,E(i.value)},me=()=>{a.config.spacing.paragraph-=.1,E(i.value)},j=()=>{a.config.spacing.paragraph+=.1,E(i.value)},ve=A(()=>a.config.readWidth),ke=()=>{i.value.readWidth+160+2*68>window.innerWidth||(i.value.readWidth+=160,E(i.value))},re=()=>{i.value.readWidth>640&&(i.value.readWidth-=160),E(i.value)},te=A(()=>a.config.jumpDuration),Ae=()=>{a.config.jumpDuration+=100,E(i.value)},oe=()=>{a.config.jumpDuration!==0&&(a.config.jumpDuration-=100,E(i.value))},ne=A(()=>a.config.infiniteLoading),ce=D=>{i.value.infiniteLoading=D,E(i.value)},E=D=>{a.setConfig(D),localStorage.setItem("config",JSON.stringify(D)),Ce(D)},Ce=D=>{de.saveReadConfig(D)};return(D,e)=>{const O=qe,T=Te,ye=Me;return f(),v("div",{class:V(["settings-wrapper",{night:n(g),day:!n(g)}]),style:G(n(B))},[e[50]||(e[50]=t("div",{class:"settings-title"},"设置",-1)),t("div",wt,[t("ul",null,[t("li",Et,[e[6]||(e[6]=t("i",null,"阅读主题",-1)),(f(!0),v(ee,null,ae(n(U),(Q,F)=>(f(),v("span",{class:V(["theme-item",{selected:n(R)==F}]),key:F,style:G(Q),ref_for:!0,ref:"themes",onClick:Ie=>k(F)},[F<6?(f(),v("em",Ut,"")):(f(),v("em",xt,z(n(s)),1))],14,Dt))),128))]),t("li",Qt,[e[7]||(e[7]=t("i",null,"正文字体",-1)),(f(!0),v(ee,null,ae(n(w),(Q,F)=>(f(),v("span",{class:V(["font-item",{selected:n(u)==F}]),key:F,onClick:Ie=>r(F)},z(Q),11,Vt))),128))]),t("li",Pt,[e[13]||(e[13]=t("i",null,"自定字体",-1)),J(O,{effect:"dark",content:"自定义的字体名称",placement:"top"},{default:W(()=>[We(t("input",{type:"text",class:"font-item font-item-input","onUpdate:modelValue":e[0]||(e[0]=Q=>ge(m)?m.value=Q:null),placeholder:"请输入自定义的字体名称"},null,512),[[Je,n(m)]])]),_:1}),J(ye,{placement:"top",width:"180",trigger:"click",visible:n(I),"onUpdate:visible":e[3]||(e[3]=Q=>ge(I)?I.value=Q:null)},{reference:W(()=>e[10]||(e[10]=[t("span",{type:"text",class:"font-item"},"保存",-1)])),default:W(()=>[e[11]||(e[11]=t("p",null," 请确认输入的字体名称完整无误,并且该字体已经安装在您的设备上。 ",-1)),e[12]||(e[12]=t("p",null,"确定保存吗?",-1)),t("div",Rt,[J(T,{size:"small",plain:"",onClick:e[1]||(e[1]=Q=>I.value=!1)},{default:W(()=>e[8]||(e[8]=[Z("取消")])),_:1}),J(T,{type:"primary",size:"small",onClick:e[2]||(e[2]=Q=>{h(),I.value=!1})},{default:W(()=>e[9]||(e[9]=[Z("确定")])),_:1})])]),_:1},8,["visible"])]),t("li",Mt,[e[19]||(e[19]=t("i",null,"字体大小",-1)),t("div",Ft,[t("span",{class:"less",onClick:y},e[14]||(e[14]=[t("em",{class:"iconfont"},"",-1)])),e[16]||(e[16]=t("b",null,null,-1)),e[17]||(e[17]=Z()),t("span",Lt,z(n(q)),1),e[18]||(e[18]=t("b",null,null,-1)),t("span",{class:"more",onClick:P},e[15]||(e[15]=[t("em",{class:"iconfont"},"",-1)]))])]),t("li",Kt,[e[25]||(e[25]=t("i",null,"字距",-1)),t("div",zt,[t("span",{class:"less",onClick:Y},e[20]||(e[20]=[t("em",{class:"iconfont"},"",-1)])),e[22]||(e[22]=t("b",null,null,-1)),e[23]||(e[23]=Z()),t("span",Ot,z(n(b).letter.toFixed(2)),1),e[24]||(e[24]=t("b",null,null,-1)),t("span",{class:"more",onClick:pe},e[21]||(e[21]=[t("em",{class:"iconfont"},"",-1)]))])]),t("li",Nt,[e[31]||(e[31]=t("i",null,"行距",-1)),t("div",Ht,[t("span",{class:"less",onClick:le},e[26]||(e[26]=[t("em",{class:"iconfont"},"",-1)])),e[28]||(e[28]=t("b",null,null,-1)),e[29]||(e[29]=Z()),t("span",Wt,z(n(b).line.toFixed(1)),1),e[30]||(e[30]=t("b",null,null,-1)),t("span",{class:"more",onClick:fe},e[27]||(e[27]=[t("em",{class:"iconfont"},"",-1)]))])]),t("li",Jt,[e[36]||(e[36]=t("i",null,"段距",-1)),t("div",qt,[t("div",Tt,[t("span",{class:"less",onClick:me},e[32]||(e[32]=[t("em",{class:"iconfont"},"",-1)])),e[34]||(e[34]=t("b",null,null,-1)),t("span",Gt,z(n(b).paragraph.toFixed(1)),1),e[35]||(e[35]=t("b",null,null,-1)),t("span",{class:"more",onClick:j},e[33]||(e[33]=[t("em",{class:"iconfont"},"",-1)]))])])]),n(a).miniInterface?ue("",!0):(f(),v("li",Zt,[e[42]||(e[42]=t("i",null,"页面宽度",-1)),t("div",Yt,[t("span",{class:"less",onClick:re},e[37]||(e[37]=[t("em",{class:"iconfont"},"",-1)])),e[39]||(e[39]=t("b",null,null,-1)),e[40]||(e[40]=Z()),t("span",jt,z(n(ve)),1),e[41]||(e[41]=t("b",null,null,-1)),t("span",{class:"more",onClick:ke},e[38]||(e[38]=[t("em",{class:"iconfont"},"",-1)]))])])),t("li",Xt,[e[48]||(e[48]=t("i",null,"翻页速度",-1)),t("div",_t,[t("div",$t,[t("span",{class:"less",onClick:oe},e[43]||(e[43]=[t("em",{class:"iconfont"},"",-1)])),e[45]||(e[45]=t("b",null,null,-1)),e[46]||(e[46]=Z()),t("span",eo,z(n(te)),1),e[47]||(e[47]=t("b",null,null,-1)),t("span",{class:"more",onClick:Ae},e[44]||(e[44]=[t("em",{class:"iconfont"},"",-1)]))])])]),t("li",to,[e[49]||(e[49]=t("i",null,"无限加载",-1)),(f(),v("span",{class:V(["infinite-loading-item",{selected:n(ne)==!1}]),key:0,onClick:e[4]||(e[4]=Q=>ce(!1))},"关闭",2)),(f(),v("span",{class:V(["infinite-loading-item",{selected:n(ne)==!0}]),key:1,onClick:e[5]||(e[5]=Q=>ce(!0))},"开启",2))])])])],6)}}},no=ie(oo,[["__scopeId","data-v-ed0bb531"]]),so={class:"wrapper"},ao=["onClick"],io={__name:"CatalogItem",props:["index","source","gotoChapter","currentChapterIndex"],setup(c){const a=c,d=s=>s==a.currentChapterIndex,g=A(()=>{var s;return((s=a.source)==null?void 0:s.catas)??[a.source]});return(s,U)=>(f(),v("div",so,[(f(!0),v(ee,null,ae(n(g),C=>(f(),v("div",{class:V(["cata-text",{selected:d(C.index)}]),key:C.url,onClick:w=>c.gotoChapter(C)},z(C.title),11,ao))),128))]))}},lo=ie(io,[["__scopeId","data-v-51153469"]]),ro={__name:"PopCatalog",emits:["getContent"],setup(c,{emit:a}){const d=be(),g=A(()=>w.value==6),{catalog:s,popCataVisible:U,miniInterface:C}=Fe(d),w=A(()=>d.config.theme),m=A(()=>({background:$.themes[w.value].popup})),I=A({get:()=>d.readingBook.index,set:r=>d.readingBook.index=r}),i=A(()=>{let r=s.value;if(C.value)return r;let h=Math.ceil(r.length/2),q=new Array(h),P=0;for(;P{const h=s.value.indexOf(r);I.value=h,d.setPopCataVisible(!1),d.setContentLoading(!0),d.saveBookProgress(),B("getContent",h)},u=S(),k=A(()=>{let r=I.value;return C.value?r:Math.floor(r/2)});return Ge(()=>{U.value&&u.value.scrollToIndex(k.value)}),(r,h)=>(f(),v("div",{class:V({"cata-wrapper":!0,visible:n(U)}),style:G(n(m))},[h[0]||(h[0]=t("div",{class:"title"},"目录",-1)),J(n(Ze),{style:{height:"300px",overflow:"auto"},class:V({night:n(g),day:!n(g)}),ref_key:"virtualListRef",ref:u,"data-key":"index","wrap-class":"data-wrapper","item-class":"cata","data-sources":n(i),"data-component":lo,"estimate-size":40,"extra-props":{gotoChapter:R,currentChapterIndex:n(I)}},null,8,["class","data-sources","extra-props"])],6))}},Ao=ie(ro,[["__scopeId","data-v-7ec68dd9"]]),co={class:"tools"},uo={class:"tools"},go={key:0},po={key:0},fo={class:"content"},mo=["chapterIndex"],vo={__name:"BookChapter",setup(c){const a=S(),{isLoading:d,loadingWrapper:g}=$e(a,"正在获取信息"),s=be();try{const o=JSON.parse(localStorage.getItem("config"));o!=null&&s.setConfig(o)}catch{localStorage.removeItem("config")}const{catalog:U,popCataVisible:C,readSettingsVisible:w,miniInterface:m,showContent:I,config:i,readingBook:B,bookProgress:R}=Fe(s),u=A({get:()=>B.value.chapterPos,set:o=>B.value.chapterPos=o}),k=A({get:()=>B.value.index,set:o=>B.value.index=o}),r=A(()=>i.value.theme),h=A(()=>i.value.infiniteLoading),q=A(()=>s.config.font>=0?$.fonts[s.config.font]:s.config.customFontName),P=A(()=>s.config.fontSize+"px"),y=A(()=>$.themes[r.value].body),b=A(()=>$.themes[r.value].content),Y=A(()=>$.themes[r.value].popup),pe=A(()=>m.value?window.innerWidth+"px":s.config.readWidth-130+"px"),le=A(()=>m.value?window.innerWidth-33:s.config.readWidth-33),fe=A(()=>({background:y.value})),me=A(()=>({background:b.value,width:pe.value})),j=S(!1),ve=A(()=>({background:Y.value,marginLeft:m.value?0:-(s.config.readWidth/2+68)+"px",display:m.value&&!j.value?"none":"block"})),ke=A(()=>({background:Y.value,marginRight:m.value?0:-(s.config.readWidth/2+52)+"px",display:m.value&&!j.value?"none":"block"})),re=A(()=>r.value==6),te=()=>{s.setMiniInterface(window.innerWidth<776);const o=s.config.readWidth;Ae(o)},Ae=o=>{s.miniInterface||o+2*68>window.innerWidth&&(s.config.readWidth-=160)};Ye(()=>s.config.readWidth,o=>Ae(o));const oe=S(),ne=S(),ce=()=>{_(oe.value)},E=()=>{_(ne.value)},Ce=je(),D=()=>{Ce.push("/")},e=S([]),O=S(!0),T=(o,l=!0,N=0)=>{l&&(s.setShowContent(!1),_(oe.value,{duration:0}),Se(o,N),e.value=[]);let x=sessionStorage.getItem("bookUrl"),{title:H,index:L}=U.value[o];g(de.getBookContent(x,L).then(p=>{if(p.data.isSuccess){let Oe=p.data.data.split(/\n+/);e.value.push({index:o,content:Oe,title:H}),l&&F(N)}else{K({message:p.data.errorMsg,type:"error"});let X=[p.data.errorMsg];e.value.push({index:o,content:X,title:H})}if(s.setContentLoading(!0),O.value=!1,s.setShowContent(!0),!p.data.isSuccess)throw p.data},p=>{K({message:"获取章节内容失败",type:"error"});let X=["获取章节内容失败!"];throw e.value.push({index:o,content:X,title:H}),s.setShowContent(!0),p}))},ye=S(),Q=S(),F=o=>{Re(()=>{Q.value.length===1&&Q.value[0].scrollToReadedLength(o)})},Ie=et(()=>s.saveBookProgress(),6e4),Le=(o,l)=>{Se(o,l),Ie()};Qe(()=>{var o;document.title=((o=U.value[k.value])==null?void 0:o.title)||document.title});const Se=(o,l)=>{let N=sessionStorage.getItem("bookUrl");var x=JSON.parse(localStorage.getItem(N));x.index=o,x.chapterPos=l,localStorage.setItem(N,JSON.stringify(x)),x=JSON.parse(localStorage.getItem("readingRecent")),x.chapterIndex=o,x.chapterPos=l,localStorage.setItem("readingRecent",JSON.stringify(x)),k.value=o,u.value=l,sessionStorage.setItem("chapterIndex",o),sessionStorage.setItem("chapterPos",String(l))},we=()=>{document.visibilityState=="hidden"&&de.saveBookProgressWithBeacon(R.value)},Ee=()=>{s.setContentLoading(!0);let o=k.value+1;typeof U.value[o]<"u"?(K({message:"下一章",type:"info"}),T(o),s.saveBookProgress()):K({message:"本章是最后一章",type:"error"})},De=()=>{s.setContentLoading(!0);let o=k.value-1;typeof U.value[o]<"u"?(K({message:"上一章",type:"info"}),T(o),s.saveBookProgress()):K({message:"本章是第一章",type:"error"})};let M;const Be=S();Qe(()=>{h.value?M==null||M.observe(Be.value):M==null||M.disconnect()});const Ke=()=>{let o=e.value.slice(-1)[0].index;U.value.length-1>o&&(T(o+1,!1),s.saveBookProgress())},ze=o=>{if(!d.value)for(let{isIntersecting:l}of o){if(!l)return;Ke()}};let se=!0;const Ue=o=>{if(se)switch(o.key){case"ArrowLeft":o.stopPropagation(),o.preventDefault(),De();break;case"ArrowRight":o.stopPropagation(),o.preventDefault(),Ee();break;case"ArrowUp":o.stopPropagation(),o.preventDefault(),document.documentElement.scrollTop===0?K({message:"已到达页面顶部",type:"warn"}):(se=!1,_(0-document.documentElement.clientHeight+100,{duration:s.config.jumpDuration,callback:()=>se=!0}));break;case"ArrowDown":o.stopPropagation(),o.preventDefault(),document.documentElement.clientHeight+document.documentElement.scrollTop===document.documentElement.scrollHeight?K({message:"已到达页面底部",type:"warn"}):(se=!1,_(document.documentElement.clientHeight-100,{duration:s.config.jumpDuration,callback:()=>se=!0}));break}},xe=o=>{(o.key==="ArrowUp"||o.key==="ArrowDown")&&(o.preventDefault(),o.stopPropagation())};return he(()=>{let o=sessionStorage.getItem("bookUrl"),l=sessionStorage.getItem("bookName"),N=sessionStorage.getItem("bookAuthor"),x=Number(sessionStorage.getItem("chapterIndex")||0),H=Number(sessionStorage.getItem("chapterPos")||0);var L=JSON.parse(localStorage.getItem(o));(L==null||x!=L.index||H!=L.chapterPos)&&(L={bookName:l,bookAuthor:N,bookUrl:o,index:x,chapterPos:H},localStorage.setItem(o,JSON.stringify(L))),te(),window.addEventListener("resize",te),g(de.getChapterList(o).then(p=>{if(!p.data.isSuccess){K({message:p.data.errorMsg,type:"error"}),setTimeout(D,500);return}let X=p.data.data;s.setCatalog(X),s.setReadingBook(L),T(x,!0,H),window.addEventListener("keyup",Ue),window.addEventListener("keydown",xe),document.addEventListener("visibilitychange",we),M=new IntersectionObserver(ze,{rootMargin:"-100% 0% 20% 0%"}),h.value&&M.observe(Be.value),document.title=null,document.title=l+" | "+U.value[x].title},p=>{throw K({message:"获取书籍目录失败",type:"error"}),p}))}),Pe(()=>{window.removeEventListener("keyup",Ue),window.removeEventListener("keydown",xe),window.removeEventListener("resize",te),document.removeEventListener("visibilitychange",we),w.value=!1,C.value=!1,M==null||M.disconnect()}),(o,l)=>{const N=Ao,x=Me,H=no,L=lt;return f(),v("div",{class:V(["chapter-wrapper",{night:n(re),day:!n(re)}]),style:G(n(fe)),onClick:l[2]||(l[2]=p=>j.value=!n(j))},[t("div",{class:"tool-bar",style:G(n(ve))},[t("div",co,[J(x,{placement:"right",width:n(le),trigger:"click","show-arrow":!1,visible:n(C),"onUpdate:visible":l[0]||(l[0]=p=>ge(C)?C.value=p:null),"popper-class":"pop-cata"},{reference:W(()=>[t("div",{class:V(["tool-icon",{"no-point":n(O)}])},l[3]||(l[3]=[t("div",{class:"iconfont"},"",-1),t("div",{class:"icon-text"},"目录",-1)]),2)]),default:W(()=>[J(N,{onGetContent:T,class:"popup"})]),_:1},8,["width","visible"]),J(x,{placement:"right",width:n(le),trigger:"click","show-arrow":!1,visible:n(w),"onUpdate:visible":l[1]||(l[1]=p=>ge(w)?w.value=p:null),"popper-class":"pop-setting"},{reference:W(()=>[t("div",{class:V(["tool-icon",{"no-point":n(O)}])},l[4]||(l[4]=[t("div",{class:"iconfont"},"",-1),t("div",{class:"icon-text"},"设置",-1)]),2)]),default:W(()=>[J(H,{class:"popup"})]),_:1},8,["width","visible"]),t("div",{class:"tool-icon",onClick:D},l[5]||(l[5]=[t("div",{class:"iconfont"},"",-1),t("div",{class:"icon-text"},"书架",-1)])),t("div",{class:V(["tool-icon",{"no-point":n(O)}]),onClick:ce},l[6]||(l[6]=[t("div",{class:"iconfont"},"",-1),t("div",{class:"icon-text"},"顶部",-1)]),2),t("div",{class:V(["tool-icon",{"no-point":n(O)}]),onClick:E},l[7]||(l[7]=[t("div",{class:"iconfont"},"",-1),t("div",{class:"icon-text"},"底部",-1)]),2)])],4),t("div",{class:"read-bar",style:G(n(ke))},[t("div",uo,[t("div",{class:V(["tool-icon",{"no-point":n(O)}]),onClick:De},[l[8]||(l[8]=t("div",{class:"iconfont"},"",-1)),n(m)?(f(),v("span",go,"上一章")):ue("",!0)],2),t("div",{class:V(["tool-icon",{"no-point":n(O)}]),onClick:Ee},[n(m)?(f(),v("span",po,"下一章")):ue("",!0),l[9]||(l[9]=t("div",{class:"iconfont"},"",-1))],2)])],4),l[10]||(l[10]=t("div",{class:"chapter-bar"},null,-1)),t("div",{class:"chapter",ref_key:"content",ref:a,style:G(n(me))},[t("div",fo,[t("div",{class:"top-bar",ref_key:"top",ref:oe},null,512),(f(!0),v(ee,null,ae(n(e),p=>(f(),v("div",{key:p.index,chapterIndex:p.index,ref_for:!0,ref_key:"chapter",ref:ye},[n(I)?(f(),Xe(L,{key:0,ref_for:!0,ref_key:"chapterRef",ref:Q,chapterIndex:p.index,contents:p.content,title:p.title,spacing:n(s).config.spacing,fontSize:n(P),fontFamily:n(q),onReadedLengthChange:Le},null,8,["chapterIndex","contents","title","spacing","fontSize","fontFamily"])):ue("",!0)],8,mo))),128)),t("div",{class:"loading",ref_key:"loading",ref:Be},null,512),t("div",{class:"bottom-bar",ref_key:"bottom",ref:ne},null,512)])],4)],6)}}},Bo=ie(vo,[["__scopeId","data-v-9a75e165"]]);export{Bo as default}; diff --git a/app/src/main/assets/web/vue/assets/BookShelf-Bs01BdYY.css b/app/src/main/assets/web/vue/assets/BookShelf-DZhbjTIU.css similarity index 60% rename from app/src/main/assets/web/vue/assets/BookShelf-Bs01BdYY.css rename to app/src/main/assets/web/vue/assets/BookShelf-DZhbjTIU.css index 80fb6cf9657f..3f6967be2a1b 100644 --- a/app/src/main/assets/web/vue/assets/BookShelf-Bs01BdYY.css +++ b/app/src/main/assets/web/vue/assets/BookShelf-DZhbjTIU.css @@ -1 +1 @@ -@charset "UTF-8";.books-wrapper[data-v-52a7a450]{overflow:auto}.books-wrapper .wrapper[data-v-52a7a450]{display:grid;grid-template-columns:repeat(auto-fill,380px);justify-content:space-around;grid-gap:10px}.books-wrapper .wrapper .book[data-v-52a7a450]{-webkit-user-select:none;user-select:none;display:flex;cursor:pointer;margin-bottom:18px;padding:24px;width:360px;flex-direction:row;justify-content:space-around}.books-wrapper .wrapper .book .cover-img[data-v-52a7a450],.books-wrapper .wrapper .book .cover-img .cover[data-v-52a7a450]{width:84px;height:112px}.books-wrapper .wrapper .book .info[data-v-52a7a450]{display:flex;flex-direction:column;justify-content:space-around;align-items:left;height:112px;margin-left:20px;flex:1;overflow:hidden}.books-wrapper .wrapper .book .info .name[data-v-52a7a450]{width:fit-content;font-size:16px;font-weight:700;color:#33373d}.books-wrapper .wrapper .book .info .sub[data-v-52a7a450]{display:flex;flex-direction:row;align-items:baseline;justify-content:var(--b777fdf2);font-size:12px;font-weight:600;color:#6b6b6b}.books-wrapper .wrapper .book .info .sub .tags[data-v-52a7a450] .el-tag{margin-right:.5em}.books-wrapper .wrapper .book .info .sub .update-info[data-v-52a7a450]{display:flex}.books-wrapper .wrapper .book .info .sub .update-info .dot[data-v-52a7a450]{margin:0 7px}.books-wrapper .wrapper .book .info .intro[data-v-52a7a450],.books-wrapper .wrapper .book .info .dur-chapter[data-v-52a7a450],.books-wrapper .wrapper .book .info .last-chapter[data-v-52a7a450]{color:#969ba3;font-size:13px;margin-top:3px;font-weight:500;word-wrap:break-word;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1;text-align:left}.books-wrapper .wrapper .book[data-v-52a7a450]:hover{background:#0000001a;transition-duration:.5s}.books-wrapper .wrapper[data-v-52a7a450]:last-child{margin-right:auto}.books-wrapper[data-v-52a7a450]::-webkit-scrollbar{width:0!important}@media screen and (max-width: 750px){.books-wrapper .wrapper[data-v-52a7a450]{display:flex;flex-direction:column}.books-wrapper .wrapper .book[data-v-52a7a450]{box-sizing:border-box;width:100%;margin-bottom:0;padding:10px 20px}}@font-face{font-family:FZZCYSK;src:local("☺"),url(./shelffont-D-W4UqG-.ttf);font-style:normal;font-weight:400}.index-wrapper[data-v-c22a3c0d]{height:100%;width:100%;display:flex;flex-direction:row}.index-wrapper .navigation-wrapper[data-v-c22a3c0d]{width:260px;min-width:260px;padding:48px 36px;background-color:#f7f7f7}.index-wrapper .navigation-wrapper .navigation-title[data-v-c22a3c0d]{font-size:24px;font-weight:500;font-family:FZZCYSK}.index-wrapper .navigation-wrapper .navigation-sub-title[data-v-c22a3c0d]{font-size:16px;font-weight:300;font-family:FZZCYSK;margin-top:16px;color:#b1b1b1}.index-wrapper .navigation-wrapper .search-wrapper .search-input[data-v-c22a3c0d]{border-radius:50%;margin-top:24px}.index-wrapper .navigation-wrapper .search-wrapper .search-input[data-v-c22a3c0d] .el-input__wrapper{border-radius:50px;border-color:#e3e3e3}.index-wrapper .navigation-wrapper .bottom-wrapper[data-v-c22a3c0d]{display:flex;flex-direction:column}.index-wrapper .navigation-wrapper .recent-wrapper[data-v-c22a3c0d]{margin-top:36px}.index-wrapper .navigation-wrapper .recent-wrapper .recent-title[data-v-c22a3c0d]{font-size:14px;color:#b1b1b1;font-family:FZZCYSK}.index-wrapper .navigation-wrapper .recent-wrapper .reading-recent[data-v-c22a3c0d]{margin:18px 0}.index-wrapper .navigation-wrapper .recent-wrapper .reading-recent .recent-book[data-v-c22a3c0d]{font-size:10px;cursor:pointer}.index-wrapper .navigation-wrapper .setting-wrapper[data-v-c22a3c0d]{margin-top:36px}.index-wrapper .navigation-wrapper .setting-wrapper .setting-title[data-v-c22a3c0d]{font-size:14px;color:#b1b1b1;font-family:FZZCYSK}.index-wrapper .navigation-wrapper .setting-wrapper .setting-ip[data-v-c22a3c0d]{margin-top:16px;white-space:nowrap}.index-wrapper .navigation-wrapper .setting-wrapper .setting-input[data-v-c22a3c0d]{width:216px;margin-right:4px}.index-wrapper .navigation-wrapper .setting-wrapper .no-point[data-v-c22a3c0d]{pointer-events:none}.index-wrapper .navigation-wrapper .setting-wrapper .setting-toggle[data-v-c22a3c0d]{font-size:10px;cursor:pointer}.index-wrapper .navigation-wrapper .setting-wrapper .setting-connect[data-v-c22a3c0d]{font-size:10px;margin-top:4px}.index-wrapper .navigation-wrapper .bottom-icons[data-v-c22a3c0d]{position:fixed;bottom:0;height:120px;width:260px;align-items:center;display:flex;flex-direction:row}.index-wrapper .shelf-wrapper[data-v-c22a3c0d]{padding:48px;width:100%;display:flex;flex-direction:column;box-sizing:border-box;overflow:hidden}@media screen and (max-width: 750px){.index-wrapper[data-v-c22a3c0d]{overflow-x:hidden;flex-direction:column}.index-wrapper .navigation-wrapper[data-v-c22a3c0d]{padding:20px 24px;box-sizing:border-box;width:100%}.index-wrapper .navigation-wrapper .navigation-title-wrapper[data-v-c22a3c0d]{white-space:nowrap;display:flex;justify-content:space-between;align-items:flex-end}.index-wrapper .navigation-wrapper .bottom-wrapper[data-v-c22a3c0d]{flex-direction:row}.index-wrapper .navigation-wrapper .bottom-wrapper[data-v-c22a3c0d]>*{flex-grow:1;margin-top:18px}.index-wrapper .navigation-wrapper .bottom-wrapper>* .reading-recent[data-v-c22a3c0d],.index-wrapper .navigation-wrapper .bottom-wrapper>* .setting-item[data-v-c22a3c0d]{margin-bottom:0}.index-wrapper .navigation-wrapper .bottom-icons[data-v-c22a3c0d]{display:none}.index-wrapper .shelf-wrapper[data-v-c22a3c0d]{padding:0;flex-grow:1}.index-wrapper .shelf-wrapper[data-v-c22a3c0d] .el-loading-spinner{display:none}}.night[data-v-c22a3c0d] .navigation-wrapper{background-color:#454545}.night[data-v-c22a3c0d] .navigation-wrapper .navigation-title{color:#aeaeae}.night[data-v-c22a3c0d] .navigation-wrapper .search-wrapper .search-input .el-input__wrapper{background-color:#454545}.night[data-v-c22a3c0d] .navigation-wrapper .search-wrapper .search-input .el-input__inner{color:#b1b1b1}.night[data-v-c22a3c0d] .shelf-wrapper{background-color:#161819} +@charset "UTF-8";.books-wrapper[data-v-52a7a450]{overflow:auto}.books-wrapper .wrapper[data-v-52a7a450]{display:grid;grid-template-columns:repeat(auto-fill,380px);justify-content:space-around;grid-gap:10px}.books-wrapper .wrapper .book[data-v-52a7a450]{-webkit-user-select:none;user-select:none;display:flex;cursor:pointer;margin-bottom:18px;padding:24px;width:360px;flex-direction:row;justify-content:space-around}.books-wrapper .wrapper .book .cover-img[data-v-52a7a450],.books-wrapper .wrapper .book .cover-img .cover[data-v-52a7a450]{width:84px;height:112px}.books-wrapper .wrapper .book .info[data-v-52a7a450]{display:flex;flex-direction:column;justify-content:space-around;align-items:left;height:112px;margin-left:20px;flex:1;overflow:hidden}.books-wrapper .wrapper .book .info .name[data-v-52a7a450]{width:fit-content;font-size:16px;font-weight:700;color:#33373d}.books-wrapper .wrapper .book .info .sub[data-v-52a7a450]{display:flex;flex-direction:row;align-items:baseline;justify-content:var(--b777fdf2);font-size:12px;font-weight:600;color:#6b6b6b}.books-wrapper .wrapper .book .info .sub .tags[data-v-52a7a450] .el-tag{margin-right:.5em}.books-wrapper .wrapper .book .info .sub .update-info[data-v-52a7a450]{display:flex}.books-wrapper .wrapper .book .info .sub .update-info .dot[data-v-52a7a450]{margin:0 7px}.books-wrapper .wrapper .book .info .intro[data-v-52a7a450],.books-wrapper .wrapper .book .info .dur-chapter[data-v-52a7a450],.books-wrapper .wrapper .book .info .last-chapter[data-v-52a7a450]{color:#969ba3;font-size:13px;margin-top:3px;font-weight:500;word-wrap:break-word;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1;text-align:left}.books-wrapper .wrapper .book[data-v-52a7a450]:hover{background:#0000001a;transition-duration:.5s}.books-wrapper .wrapper[data-v-52a7a450]:last-child{margin-right:auto}.books-wrapper[data-v-52a7a450]::-webkit-scrollbar{width:0!important}@media screen and (max-width: 750px){.books-wrapper .wrapper[data-v-52a7a450]{display:flex;flex-direction:column}.books-wrapper .wrapper .book[data-v-52a7a450]{box-sizing:border-box;width:100%;margin-bottom:0;padding:10px 20px}}@font-face{font-family:FZZCYSK;src:local("☺"),url(./shelffont-D-W4UqG-.ttf);font-style:normal;font-weight:400}.index-wrapper[data-v-3355089b]{height:100%;width:100%;display:flex;flex-direction:row}.index-wrapper .navigation-wrapper[data-v-3355089b]{width:260px;min-width:260px;padding:48px 36px;background-color:#f7f7f7}.index-wrapper .navigation-wrapper .navigation-title[data-v-3355089b]{font-size:24px;font-weight:500;font-family:FZZCYSK}.index-wrapper .navigation-wrapper .navigation-sub-title[data-v-3355089b]{font-size:16px;font-weight:300;font-family:FZZCYSK;margin-top:16px;color:#b1b1b1}.index-wrapper .navigation-wrapper .search-wrapper .search-input[data-v-3355089b]{border-radius:50%;margin-top:24px}.index-wrapper .navigation-wrapper .search-wrapper .search-input[data-v-3355089b] .el-input__wrapper{border-radius:50px;border-color:#e3e3e3}.index-wrapper .navigation-wrapper .bottom-wrapper[data-v-3355089b]{display:flex;flex-direction:column}.index-wrapper .navigation-wrapper .recent-wrapper[data-v-3355089b]{margin-top:36px}.index-wrapper .navigation-wrapper .recent-wrapper .recent-title[data-v-3355089b]{font-size:14px;color:#b1b1b1;font-family:FZZCYSK}.index-wrapper .navigation-wrapper .recent-wrapper .reading-recent[data-v-3355089b]{margin:18px 0}.index-wrapper .navigation-wrapper .recent-wrapper .reading-recent .recent-book[data-v-3355089b]{font-size:10px;cursor:pointer}.index-wrapper .navigation-wrapper .setting-wrapper[data-v-3355089b]{margin-top:36px}.index-wrapper .navigation-wrapper .setting-wrapper .setting-title[data-v-3355089b]{font-size:14px;color:#b1b1b1;font-family:FZZCYSK}.index-wrapper .navigation-wrapper .setting-wrapper .setting-ip[data-v-3355089b]{margin-top:16px;white-space:nowrap}.index-wrapper .navigation-wrapper .setting-wrapper .setting-input[data-v-3355089b]{width:216px;margin-right:4px}.index-wrapper .navigation-wrapper .setting-wrapper .no-point[data-v-3355089b]{pointer-events:none}.index-wrapper .navigation-wrapper .setting-wrapper .setting-toggle[data-v-3355089b]{font-size:10px;cursor:pointer}.index-wrapper .navigation-wrapper .setting-wrapper .setting-connect[data-v-3355089b]{font-size:10px;margin-top:4px}.index-wrapper .navigation-wrapper .bottom-icons[data-v-3355089b]{position:fixed;bottom:0;height:120px;width:260px;align-items:center;display:flex;flex-direction:row}.index-wrapper .shelf-wrapper[data-v-3355089b]{padding:48px;width:100%;display:flex;flex-direction:column;box-sizing:border-box;overflow:hidden}@media screen and (max-width: 750px){.index-wrapper[data-v-3355089b]{overflow-x:hidden;flex-direction:column}.index-wrapper .navigation-wrapper[data-v-3355089b]{padding:20px 24px;box-sizing:border-box;width:100%}.index-wrapper .navigation-wrapper .navigation-title-wrapper[data-v-3355089b]{white-space:nowrap;display:flex;justify-content:space-between;align-items:flex-end}.index-wrapper .navigation-wrapper .bottom-wrapper[data-v-3355089b]{flex-direction:row}.index-wrapper .navigation-wrapper .bottom-wrapper[data-v-3355089b]>*{flex-grow:1;margin-top:18px}.index-wrapper .navigation-wrapper .bottom-wrapper>* .reading-recent[data-v-3355089b],.index-wrapper .navigation-wrapper .bottom-wrapper>* .setting-item[data-v-3355089b]{margin-bottom:0}.index-wrapper .navigation-wrapper .bottom-icons[data-v-3355089b]{display:none}.index-wrapper .shelf-wrapper[data-v-3355089b]{padding:0;flex-grow:1}.index-wrapper .shelf-wrapper[data-v-3355089b] .el-loading-spinner{display:none}}.night[data-v-3355089b] .navigation-wrapper{background-color:#454545}.night[data-v-3355089b] .navigation-wrapper .navigation-title{color:#aeaeae}.night[data-v-3355089b] .navigation-wrapper .search-wrapper .search-input .el-input__wrapper{background-color:#454545}.night[data-v-3355089b] .navigation-wrapper .search-wrapper .search-input .el-input__inner{color:#b1b1b1}.night[data-v-3355089b] .shelf-wrapper{background-color:#161819} diff --git a/app/src/main/assets/web/vue/assets/BookShelf-DmN0EcU9.js b/app/src/main/assets/web/vue/assets/BookShelf-DmN0EcU9.js deleted file mode 100644 index 12e7fd8319c9..000000000000 --- a/app/src/main/assets/web/vue/assets/BookShelf-DmN0EcU9.js +++ /dev/null @@ -1 +0,0 @@ -import{a2 as se,q as T,o as r,d as h,g as e,F as W,P as O,t as l,c as ae,w as R,f as b,M as S,u as t,a3 as F,p as K,i as U,s as oe,j as C,a4 as ne,O as ce,a5 as ie,a6 as re,T as le,m as x,e as w,A as de,L as Z,x as H,I as ue,B as he}from"./vendor-B4RITwN5.js";import{d as pe,u as ve}from"./loading-BSPlXMjv.js";import{_ as Y,b as P,u as ge,A as M,s as _e}from"./index-DiJORxAd.js";const Q=n=>(K("data-v-52a7a450"),n=n(),U(),n),me={class:"books-wrapper"},fe={class:"wrapper"},we=["onClick"],Ie={class:"cover-img"},Ae=["src"],ke={class:"info"},Be={class:"name"},ye={class:"sub"},Se={class:"author"},Ce={key:0,class:"tags"},xe={key:1,class:"update-info"},Re=Q(()=>e("div",{class:"dot"},"•",-1)),be={class:"size"},Ee=Q(()=>e("div",{class:"dot"},"•",-1)),Ve={class:"date"},ze={key:0,class:"intro"},Me={key:1,class:"dur-chapter"},Te={class:"last-chapter"},Pe={__name:"BookItems",props:["books","isSearch"],emits:["bookClick"],setup(n,{emit:a}){se(d=>({b777fdf2:t(z)}));const E=n,V=a,N=d=>V("bookClick",d),k=d=>/^data:/.test(d)?d:P()+"/cover?path="+encodeURIComponent(d),z=T(()=>E.isSearch?"space-between":"flex-start");return(d,c)=>{const B=F;return r(),h("div",me,[e("div",fe,[(r(!0),h(W,null,O(n.books,i=>{var I;return r(),h("div",{class:"book",key:i.bookUrl,onClick:A=>N(i)},[e("div",Ie,[(r(),h("img",{class:"cover",src:k(i.coverUrl),key:i.coverUrl,alt:"",loading:"lazy"},null,8,Ae))]),e("div",ke,[e("div",Be,l(i.name),1),e("div",ye,[e("div",Se,l(i.author),1),n.isSearch?(r(),h("div",Ce,[(r(!0),h(W,null,O((I=i.kind)==null?void 0:I.split(",").slice(0,2),A=>(r(),ae(B,{key:A},{default:R(()=>[b(l(A),1)]),_:2},1024))),128))])):S("",!0),n.isSearch?S("",!0):(r(),h("div",xe,[Re,e("div",be,"共"+l(i.totalChapterNum)+"章",1),Ee,e("div",Ve,l(t(pe)(i.lastCheckTime)),1)]))]),n.isSearch?(r(),h("div",ze,l(i.intro),1)):S("",!0),n.isSearch?S("",!0):(r(),h("div",Me," 已读:"+l(i.durChapterTitle),1)),e("div",Te,"最新:"+l(i.latestChapterTitle),1)])],8,we)}),128))])])}}},Le=Y(Pe,[["__scopeId","data-v-52a7a450"]]),Ne="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAECUlEQVRYR7WXTYhcRRDHq3pY9yKrYBQ8KBsjgvHgwRhiQBTjYZm4Xe8NusawhwS/o9GLoKhgBGPAgJd1NdGIXwtZTbRf9Rqzl6gHTVyDeIkIgnEOghAM6oKHzTJd0sO8Zaa338zb7NjwmJn++Ndv+lVVVyOsoM3Ozl69sLBAiHiDc26NUuoKv9w5d14p9aeI/DI4OMgjIyN/lJXFMhOttQ8BgBaR0TLzEXEGAKzW+lCv+V0BmLmGiLtF5M5eQrFxRPxaRCaI6LOi9YUAzPwGADxxMYYjayaJ6MkoZKyTmU8AwF19Mp7LfElEW0LNZTvAzIcBYFufjedy00T0QLt2B4AxZo9S6qX/yXhT1jn3cpqme3IbSwDM/DgAvNlu3Dm3Uyl1HAA2IOJ2EdleEu5Io9H4EBHPVCqVLSISRsMuInrLazUBpqamhoaGhr4TkRsDgLVpmtbzPmPMLQBwOwD4vvzxw8P5IyJztVrtVL4my7L1iPhTx7Yj/jw/P79pfHx8vgmQZdkLiPhK+O8GBgauqVarv5f819FpxpjLlVJ/hYMi8mKSJHubAMz8KwBcF1EYI6IjqwRIlFImonGWiNZhlmVVRDxWYGTVAMx8HwB8EtMXka1orT0gIo9GJrxNRLH+FW8IMx8EgEeW5QDEgx5gTkQ2Bk7yr9b60hVb6rKAmc8BwJWBne+x4P3XiWhtPwGstV9FzpSzHuBvALgsMHaaiDp2ZbUwWZZNIuKuQOcfD7AAAJeEcaq1Xr9ao+3rmdknnscCzQse4LdWEukYazQaa2q12vl+QTDztwCwOdCr+zA8iYi3RQwREdl+ADDz9QDwIwB0OLaInPJRcEhEHoyEyAmt9d39ALDW2lg1hYjv+lfgC4WJgkTxcJIkPcuqbpC+qgKATwvm7PYAGwDgdBeRZ4notYvZCWPMDqXUe13W3to8C6y10yJyv//u6zj/2R6ziPiRiBwt6xPMrBExFZEdRcYR8WOt9bb8MNoKAJ+3Jvtwed05d4dSKtz+c4h4VGsdrRWttZMici8AXFVix+4homNLBUmWZQcQMc/9x4mommXZ84i4t11MKbV5dHR06bxvH5uZmbnZOfdN6O0RmMNE1CxulgCstdeKyBcAcFPrVTyltZ4wxiSVSuXplkhda72zh9P1rClFZFOSJHMdAP5Hq3rxR6eH+IGIvIOuqFlr94nIc10WdRzxy6riAMJnr2nn3JlcME3TppMWNWvtfhF5pmB8WX0RvZgEEEtaYUUbM2KtfUdE/FUubNHipvBmZIxZp5TaDwBprlQGIHLqzSHiPq01x4B7Xk6Z2d8TfDwPlwFozfd1f90598Hi4uKrY2NjFwrzQVkP81nNi/byAWOMv8gOp2n6fhnt/wDqJrRWLmhIrwAAAABJRU5ErkJggg==",L=n=>(K("data-v-c22a3c0d"),n=n(),U(),n),Je={class:"navigation-wrapper"},De=L(()=>e("div",{class:"navigation-title-wrapper"},[e("div",{class:"navigation-title"},"阅读"),e("div",{class:"navigation-sub-title"},"清风不识字,何故乱翻书")],-1)),We={class:"search-wrapper"},Oe={class:"bottom-wrapper"},Ze={class:"recent-wrapper"},He=L(()=>e("div",{class:"recent-title"},"最近阅读",-1)),Fe={class:"reading-recent"},Ke={class:"setting-wrapper"},Ue=L(()=>e("div",{class:"setting-title"},"基本设定",-1)),Ye={class:"setting-ip"},Qe={class:"setting-item"},qe={class:"bottom-icons"},$e={href:"https://github.com/gedoor/legado_web_bookshelf",target:"_blank"},Ge={class:"bottom-icon"},Xe=["src"],je={__name:"BookShelf",setup(n){const a=ge(),{connectStatus:E,connectType:V,newConnect:N,shelf:k}=oe(a),z=T(()=>a.config.theme),d=T(()=>z.value==6),c=C({name:"尚无阅读记录",author:"",url:"",chapterIndex:0,chapterPos:0}),B=C(null),{showLoading:i,closeLoading:I,loadingWrapper:A,isLoading:q}=ve(B,"正在获取书籍信息"),m=ne([]),p=C(""),y=C(!1);ce(()=>{if(!(y.value&&p.value!="")){if(y.value=!1,m.value=[],p.value==""){m.value=k.value;return}m.value=k.value.filter(s=>s.name.includes(p.value)||s.author.includes(p.value))}});const $=()=>{p.value!=""&&(m.value=[],a.clearSearchBooks(),i(),y.value=!0,M.search(p.value,s=>{q&&I();try{a.setSearchBooks(JSON.parse(s)),m.value=a.searchBooks}catch(o){throw x.error("后端数据错误"),o}},()=>{I(),m.value.length==0&&x.info("搜索结果为空")}))},v=ie({ip:P(),disable:!0}),G=()=>{v.ip=P(),v.disable=!v.disable},X=()=>{_e(v.ip),v.disable=!0,D()},j=re(),ee=async s=>{const{bookUrl:o,name:g,author:u,durChapterIndex:_=0,durChapterPos:f=0}=s;await M.saveBook(s),J(o,g,u,_,f)},J=(s,o,g,u,_)=>{o!=="尚无阅读记录"&&(sessionStorage.setItem("bookUrl",s),sessionStorage.setItem("bookName",o),sessionStorage.setItem("bookAuthor",g),sessionStorage.setItem("chapterIndex",u),sessionStorage.setItem("chapterPos",_),c.value={name:o,author:g,url:s,chapterIndex:u,chapterPos:_},localStorage.setItem("readingRecent",JSON.stringify(c.value)),j.push({path:"/chapter"}))};le(()=>{let s=localStorage.getItem("readingRecent");s!=null&&(c.value=JSON.parse(s),typeof c.value.chapterIndex>"u"&&(c.value.chapterIndex=0)),D()});const D=()=>{a.resetConnect(),A(a.saveBookProgress().finally(te))},te=()=>M.getBookShelf().then(s=>{a.setConnectType("success"),s.data.isSuccess?a.addBooks(s.data.data.sort(function(o,g){var u=o.durChapterTime||0,_=g.durChapterTime||0;return _-u})):x.error(s.data.errorMsg),a.setConnectStatus("已连接 "),a.setNewConnect(!1)}).catch(function(s){throw a.setConnectType("danger"),a.setConnectStatus("连接失败"),x.error("后端连接失败"),a.setNewConnect(!1),s});return(s,o)=>{const g=ue,u=F,_=Le;return r(),h("div",{class:H({"index-wrapper":!0,night:t(d),day:!t(d)})},[e("div",Je,[De,e("div",We,[w(g,{placeholder:"搜索书籍,在线书籍自动加入书架",modelValue:t(p),"onUpdate:modelValue":o[0]||(o[0]=f=>de(p)?p.value=f:null),class:"search-input","prefix-icon":t(he),onKeyup:Z($,["enter"])},null,8,["modelValue","prefix-icon"])]),e("div",Oe,[e("div",Ze,[He,e("div",Fe,[w(u,{type:t(c).name=="尚无阅读记录"?"warning":"",class:H(["recent-book",{"no-point":t(c).url==""}]),size:"large",onClick:o[1]||(o[1]=f=>J(t(c).url,t(c).name,t(c).author,t(c).chapterIndex,t(c).chapterPos))},{default:R(()=>[b(l(t(c).name),1)]),_:1},8,["type","class"])])]),e("div",Ke,[Ue,e("div",Ye,[w(g,{class:"setting-input",size:"small",disabled:t(v).disable,modelValue:t(v).ip,"onUpdate:modelValue":o[2]||(o[2]=f=>t(v).ip=f),onKeydown:Z(X,["enter"])},null,8,["disabled","modelValue"]),w(u,{type:"primary",class:"setting-toggle",onClick:G},{default:R(()=>[b(l(t(v).disable?"修改":"取消"),1)]),_:1})]),e("div",Qe,[w(u,{type:t(V),size:"large",class:"setting-connect"},{default:R(()=>[b(l(t(E)),1)]),_:1},8,["type"])])])]),e("div",qe,[e("a",$e,[e("div",Ge,[e("img",{src:t(Ne),alt:""},null,8,Xe)])])])]),e("div",{class:"shelf-wrapper",ref_key:"shelfWrapper",ref:B},[w(_,{books:t(m),onBookClick:ee,isSearch:t(y)},null,8,["books","isSearch"])],512)],2)}}},at=Y(je,[["__scopeId","data-v-c22a3c0d"]]);export{at as default}; diff --git a/app/src/main/assets/web/vue/assets/BookShelf-OCI2jMxW.js b/app/src/main/assets/web/vue/assets/BookShelf-OCI2jMxW.js new file mode 100644 index 000000000000..b4b138e368a1 --- /dev/null +++ b/app/src/main/assets/web/vue/assets/BookShelf-OCI2jMxW.js @@ -0,0 +1 @@ +import{a0 as $,n as T,o as i,d as u,g as e,F as D,N as W,t as l,c as j,w as R,f as b,K as C,u as t,a1 as K,s as ee,i as x,a2 as te,M as se,a3 as ae,R as oe,k as S,e as w,y as ne,J as Z,q as H,a4 as re,G as ie,z as le}from"./vendor-UVL3l2rb.js";import{d as ce,u as de}from"./loading--qckEkbY.js";import{_ as O,b as N,A as M,s as ue}from"./index-CyZ_tLuT.js";import{u as he}from"./bookStore-O1g6rLjj.js";const pe={class:"books-wrapper"},ge={class:"wrapper"},me=["onClick"],ve={class:"cover-img"},fe=["src"],_e={class:"info"},we={class:"name"},Ae={class:"sub"},Ie={class:"author"},ke={key:0,class:"tags"},ye={key:1,class:"update-info"},Be={class:"size"},Ce={class:"date"},xe={key:0,class:"intro"},Se={key:1,class:"dur-chapter"},Re={class:"last-chapter"},be={__name:"BookItems",props:["books","isSearch"],emits:["bookClick"],setup(v,{emit:n}){$(c=>({b777fdf2:t(V)}));const z=v,E=n,P=c=>E("bookClick",c),k=c=>/^data:/.test(c)?c:N()+"/cover?path="+encodeURIComponent(c),V=T(()=>z.isSearch?"space-between":"flex-start");return(c,o)=>{const y=K;return i(),u("div",pe,[e("div",ge,[(i(!0),u(D,null,W(v.books,r=>{var A;return i(),u("div",{class:"book",key:r.bookUrl,onClick:I=>P(r)},[e("div",ve,[(i(),u("img",{class:"cover",src:k(r.coverUrl),key:r.coverUrl,alt:"",loading:"lazy"},null,8,fe))]),e("div",_e,[e("div",we,l(r.name),1),e("div",Ae,[e("div",Ie,l(r.author),1),v.isSearch?(i(),u("div",ke,[(i(!0),u(D,null,W((A=r.kind)==null?void 0:A.split(",").slice(0,2),I=>(i(),j(y,{key:I},{default:R(()=>[b(l(I),1)]),_:2},1024))),128))])):C("",!0),v.isSearch?C("",!0):(i(),u("div",ye,[o[0]||(o[0]=e("div",{class:"dot"},"•",-1)),e("div",Be,"共"+l(r.totalChapterNum)+"章",1),o[1]||(o[1]=e("div",{class:"dot"},"•",-1)),e("div",Ce,l(t(ce)(r.lastCheckTime)),1)]))]),v.isSearch?(i(),u("div",xe,l(r.intro),1)):C("",!0),v.isSearch?C("",!0):(i(),u("div",Se," 已读:"+l(r.durChapterTitle),1)),e("div",Re,"最新:"+l(r.latestChapterTitle),1)])],8,me)}),128))])])}}},ze=O(be,[["__scopeId","data-v-52a7a450"]]),Ee="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAECUlEQVRYR7WXTYhcRRDHq3pY9yKrYBQ8KBsjgvHgwRhiQBTjYZm4Xe8NusawhwS/o9GLoKhgBGPAgJd1NdGIXwtZTbRf9Rqzl6gHTVyDeIkIgnEOghAM6oKHzTJd0sO8Zaa338zb7NjwmJn++Ndv+lVVVyOsoM3Ozl69sLBAiHiDc26NUuoKv9w5d14p9aeI/DI4OMgjIyN/lJXFMhOttQ8BgBaR0TLzEXEGAKzW+lCv+V0BmLmGiLtF5M5eQrFxRPxaRCaI6LOi9YUAzPwGADxxMYYjayaJ6MkoZKyTmU8AwF19Mp7LfElEW0LNZTvAzIcBYFufjedy00T0QLt2B4AxZo9S6qX/yXhT1jn3cpqme3IbSwDM/DgAvNlu3Dm3Uyl1HAA2IOJ2EdleEu5Io9H4EBHPVCqVLSISRsMuInrLazUBpqamhoaGhr4TkRsDgLVpmtbzPmPMLQBwOwD4vvzxw8P5IyJztVrtVL4my7L1iPhTx7Yj/jw/P79pfHx8vgmQZdkLiPhK+O8GBgauqVarv5f819FpxpjLlVJ/hYMi8mKSJHubAMz8KwBcF1EYI6IjqwRIlFImonGWiNZhlmVVRDxWYGTVAMx8HwB8EtMXka1orT0gIo9GJrxNRLH+FW8IMx8EgEeW5QDEgx5gTkQ2Bk7yr9b60hVb6rKAmc8BwJWBne+x4P3XiWhtPwGstV9FzpSzHuBvALgsMHaaiDp2ZbUwWZZNIuKuQOcfD7AAAJeEcaq1Xr9ao+3rmdknnscCzQse4LdWEukYazQaa2q12vl+QTDztwCwOdCr+zA8iYi3RQwREdl+ADDz9QDwIwB0OLaInPJRcEhEHoyEyAmt9d39ALDW2lg1hYjv+lfgC4WJgkTxcJIkPcuqbpC+qgKATwvm7PYAGwDgdBeRZ4notYvZCWPMDqXUe13W3to8C6y10yJyv//u6zj/2R6ziPiRiBwt6xPMrBExFZEdRcYR8WOt9bb8MNoKAJ+3Jvtwed05d4dSKtz+c4h4VGsdrRWttZMici8AXFVix+4homNLBUmWZQcQMc/9x4mommXZ84i4t11MKbV5dHR06bxvH5uZmbnZOfdN6O0RmMNE1CxulgCstdeKyBcAcFPrVTyltZ4wxiSVSuXplkhda72zh9P1rClFZFOSJHMdAP5Hq3rxR6eH+IGIvIOuqFlr94nIc10WdRzxy6riAMJnr2nn3JlcME3TppMWNWvtfhF5pmB8WX0RvZgEEEtaYUUbM2KtfUdE/FUubNHipvBmZIxZp5TaDwBprlQGIHLqzSHiPq01x4B7Xk6Z2d8TfDwPlwFozfd1f90598Hi4uKrY2NjFwrzQVkP81nNi/byAWOMv8gOp2n6fhnt/wDqJrRWLmhIrwAAAABJRU5ErkJggg==",Ve={class:"navigation-wrapper"},Me={class:"search-wrapper"},Te={class:"bottom-wrapper"},Ne={class:"recent-wrapper"},Pe={class:"reading-recent"},Le={class:"setting-wrapper"},Je={class:"setting-ip"},De={class:"setting-item"},We={class:"bottom-icons"},Ze={href:"https://github.com/gedoor/legado_web_bookshelf",target:"_blank"},He={class:"bottom-icon"},Ke=["src"],Oe={__name:"BookShelf",setup(v){const n=he(),{connectStatus:z,connectType:E,newConnect:P,shelf:k}=ee(n),V=T(()=>n.config.theme),c=T(()=>V.value==6),o=x({name:"尚无阅读记录",author:"",url:"",chapterIndex:0,chapterPos:0}),y=x(null),{showLoading:r,closeLoading:A,loadingWrapper:I,isLoading:F}=de(y,"正在获取书籍信息"),f=te([]),h=x(""),B=x(!1);se(()=>{if(!(B.value&&h.value!="")){if(B.value=!1,f.value=[],h.value==""){f.value=k.value;return}f.value=k.value.filter(a=>a.name.includes(h.value)||a.author.includes(h.value))}});const U=()=>{h.value!=""&&(f.value=[],n.clearSearchBooks(),r(),B.value=!0,M.search(h.value,a=>{F&&A();try{n.setSearchBooks(JSON.parse(a)),f.value=n.searchBooks}catch(s){throw S.error("后端数据错误"),s}},()=>{A(),f.value.length==0&&S.info("搜索结果为空")}))},p=ae({ip:N(),disable:!0}),Y=()=>{p.ip=N(),p.disable=!p.disable},Q=()=>{ue(p.ip),p.disable=!0,J()},q=re(),G=async a=>{const{bookUrl:s,name:g,author:d,durChapterIndex:m=0,durChapterPos:_=0}=a;a.durChapterIndex===void 0&&await M.saveBook(a),L(s,g,d,m,_)},L=(a,s,g,d,m)=>{s!=="尚无阅读记录"&&(sessionStorage.setItem("bookUrl",a),sessionStorage.setItem("bookName",s),sessionStorage.setItem("bookAuthor",g),sessionStorage.setItem("chapterIndex",d),sessionStorage.setItem("chapterPos",m),o.value={name:s,author:g,url:a,chapterIndex:d,chapterPos:m},localStorage.setItem("readingRecent",JSON.stringify(o.value)),q.push({path:"/chapter"}))};oe(()=>{let a=localStorage.getItem("readingRecent");a!=null&&(o.value=JSON.parse(a),typeof o.value.chapterIndex>"u"&&(o.value.chapterIndex=0)),J()});const J=()=>{n.resetConnect(),I(n.saveBookProgress().finally(X))},X=()=>M.getBookShelf().then(a=>{n.setConnectType("success"),a.data.isSuccess?n.addBooks(a.data.data.sort(function(s,g){var d=s.durChapterTime||0,m=g.durChapterTime||0;return m-d})):S.error(a.data.errorMsg),n.setConnectStatus("已连接 "),n.setNewConnect(!1)}).catch(function(a){throw n.setConnectType("danger"),n.setConnectStatus("连接失败"),S.error("后端连接失败"),n.setNewConnect(!1),a});return(a,s)=>{const g=ie,d=K,m=ze;return i(),u("div",{class:H({"index-wrapper":!0,night:t(c),day:!t(c)})},[e("div",Ve,[s[5]||(s[5]=e("div",{class:"navigation-title-wrapper"},[e("div",{class:"navigation-title"},"阅读"),e("div",{class:"navigation-sub-title"},"清风不识字,何故乱翻书")],-1)),e("div",Me,[w(g,{placeholder:"搜索书籍,在线书籍自动加入书架",modelValue:t(h),"onUpdate:modelValue":s[0]||(s[0]=_=>ne(h)?h.value=_:null),class:"search-input","prefix-icon":t(le),onKeyup:Z(U,["enter"])},null,8,["modelValue","prefix-icon"])]),e("div",Te,[e("div",Ne,[s[3]||(s[3]=e("div",{class:"recent-title"},"最近阅读",-1)),e("div",Pe,[w(d,{type:t(o).name=="尚无阅读记录"?"warning":"",class:H(["recent-book",{"no-point":t(o).url==""}]),size:"large",onClick:s[1]||(s[1]=_=>L(t(o).url,t(o).name,t(o).author,t(o).chapterIndex,t(o).chapterPos))},{default:R(()=>[b(l(t(o).name),1)]),_:1},8,["type","class"])])]),e("div",Le,[s[4]||(s[4]=e("div",{class:"setting-title"},"基本设定",-1)),e("div",Je,[w(g,{class:"setting-input",size:"small",disabled:t(p).disable,modelValue:t(p).ip,"onUpdate:modelValue":s[2]||(s[2]=_=>t(p).ip=_),onKeydown:Z(Q,["enter"])},null,8,["disabled","modelValue"]),w(d,{type:"primary",class:"setting-toggle",onClick:Y},{default:R(()=>[b(l(t(p).disable?"修改":"取消"),1)]),_:1})]),e("div",De,[w(d,{type:t(E),size:"large",class:"setting-connect"},{default:R(()=>[b(l(t(z)),1)]),_:1},8,["type"])])])]),e("div",We,[e("a",Ze,[e("div",He,[e("img",{src:t(Ee),alt:""},null,8,Ke)])])])]),e("div",{class:"shelf-wrapper",ref_key:"shelfWrapper",ref:y},[w(m,{books:t(f),onBookClick:G,isSearch:t(B)},null,8,["books","isSearch"])],512)],2)}}},qe=O(Oe,[["__scopeId","data-v-3355089b"]]);export{qe as default}; diff --git a/app/src/main/assets/web/vue/assets/bookStore-O1g6rLjj.js b/app/src/main/assets/web/vue/assets/bookStore-O1g6rLjj.js new file mode 100644 index 000000000000..101c92da8406 --- /dev/null +++ b/app/src/main/assets/web/vue/assets/bookStore-O1g6rLjj.js @@ -0,0 +1 @@ +import{m as r}from"./vendor-UVL3l2rb.js";import{A as c}from"./index-CyZ_tLuT.js";const f=r("book",{state:()=>({connectStatus:"正在连接后端服务器……",connectType:"",newConnect:!0,searchBooks:[],shelf:[],catalog:[],readingBook:{index:0,chapterPos:0},popCataVisible:!1,contentLoading:!0,showContent:!1,config:{theme:0,font:0,fontSize:18,readWidth:800,infiniteLoading:!1,customFontName:"",jumpDuration:1e3,spacing:{paragraph:1,line:.8,letter:0}},miniInterface:!1,readSettingsVisible:!1}),getters:{bookProgress:e=>{var i;if(e.catalog.length==0)return;const{index:t,chapterPos:s,bookName:o,bookAuthor:a}=e.readingBook;let n=(i=e.catalog[t])==null?void 0:i.title;if(n)return{name:o,author:a,durChapterIndex:t,durChapterPos:s,durChapterTime:new Date().getTime(),durChapterTitle:n}}},actions:{setConnectStatus(e){this.connectStatus=e},setConnectType(e){this.connectType=e},resetConnect(){this.connectStatus="正在连接后端服务器……",this.connectType="",this.clearBooks()},setNewConnect(e){this.newConnect=e},addBooks(e){this.shelf=e},clearBooks(){this.shelf=[]},setCatalog(e){this.catalog=e},setPopCataVisible(e){this.popCataVisible=e},setContentLoading(e){this.contentLoading=e},setReadingBook(e){this.readingBook=e},setConfig(e){Object.assign(this.config,e)},setReadSettingsVisible(e){this.readSettingsVisible=e},setShowContent(e){this.showContent=e},setMiniInterface(e){this.miniInterface=e},async setSearchBooks(e){e.forEach(t=>{this.shelf.find(o=>o.bookUrl==t.bookUrl)===void 0&&this.searchBooks.push(t)})},clearSearchBooks(){this.searchBooks=[]},async saveBookProgress(){return this.bookProgress?c.saveBookProgress(this.bookProgress):Promise.resolve()}}});export{f as u}; diff --git a/app/src/main/assets/web/vue/assets/config-BsTATf_v.js b/app/src/main/assets/web/vue/assets/config-BsTATf_v.js new file mode 100644 index 000000000000..e0fd06b6fc7d --- /dev/null +++ b/app/src/main/assets/web/vue/assets/config-BsTATf_v.js @@ -0,0 +1 @@ +import{A as f}from"./index-CyZ_tLuT.js";import{u as r}from"./bookStore-O1g6rLjj.js";import"./vendor-UVL3l2rb.js";f.getReadConfig().then(e=>{var t=e.data.data;if(t){const a=r();let o=JSON.parse(t),i=a.config;o=Object.assign(i,o),a.setConfig(o)}}); diff --git a/app/src/main/assets/web/vue/assets/config-MMLbq8EV.js b/app/src/main/assets/web/vue/assets/config-MMLbq8EV.js deleted file mode 100644 index ed81f125eaf2..000000000000 --- a/app/src/main/assets/web/vue/assets/config-MMLbq8EV.js +++ /dev/null @@ -1 +0,0 @@ -import{A as f,u as n}from"./index-DiJORxAd.js";import"./vendor-B4RITwN5.js";f.getReadConfig().then(e=>{var t=e.data.data;if(t){const a=n();let o=JSON.parse(t),i=a.config;o=Object.assign(i,o),a.setConfig(o)}}); diff --git a/app/src/main/assets/web/vue/assets/index-CyZ_tLuT.js b/app/src/main/assets/web/vue/assets/index-CyZ_tLuT.js new file mode 100644 index 000000000000..bdbece812e57 --- /dev/null +++ b/app/src/main/assets/web/vue/assets/index-CyZ_tLuT.js @@ -0,0 +1,10 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./BookShelf-OCI2jMxW.js","./vendor-UVL3l2rb.js","./vendor-S5atAh6y.css","./loading--qckEkbY.js","./bookStore-O1g6rLjj.js","./loading-B7pvk95E.css","./BookShelf-DZhbjTIU.css","./BookChapter-txg2S1ZU.js","./BookChapter-B8PYup72.css","./config-BsTATf_v.js","./config-B2IgxNHB.css"])))=>i.map(i=>d[i]); +import{r as xe,o as c,c as U,a as re,b as le,d as I,e as m,w as u,f,u as r,l as L,g as h,F as $,E as Be,h as ge,i as D,j as Ie,k as C,m as Ve,s as X,n as z,t as Q,p as me,q as Se,v as se,x as Ne,y as j,z as he,A as Te,B as Re,C as ue,V as Oe,D as Le,G as Y,H as $e,I as ye,J as De,K as R,L as Je,M as Pe,N as A,O as fe,P as _e,Q as H,R as Ae,S as je,T as Ke,U as He,W as Me,X as qe,Y as Fe,Z as We,_ as ze,$ as Ge}from"./vendor-UVL3l2rb.js";(function(){const o=document.createElement("link").relList;if(o&&o.supports&&o.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))l(n);new MutationObserver(n=>{for(const s of n)if(s.type==="childList")for(const p of s.addedNodes)p.tagName==="LINK"&&p.rel==="modulepreload"&&l(p)}).observe(document,{childList:!0,subtree:!0});function t(n){const s={};return n.integrity&&(s.integrity=n.integrity),n.referrerPolicy&&(s.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?s.credentials="include":n.crossOrigin==="anonymous"?s.credentials="omit":s.credentials="same-origin",s}function l(n){if(n.ep)return;n.ep=!0;const s=t(n);fetch(n.href,s)}})();const Qe="modulepreload",Xe=function(e,o){return new URL(e,o).href},ce={},oe=function(o,t,l){let n=Promise.resolve();if(t&&t.length>0){const p=document.getElementsByTagName("link"),g=document.querySelector("meta[property=csp-nonce]"),_=(g==null?void 0:g.nonce)||(g==null?void 0:g.getAttribute("nonce"));n=Promise.allSettled(t.map(b=>{if(b=Xe(b,l),b in ce)return;ce[b]=!0;const E=b.endsWith(".css"),B=E?'[rel="stylesheet"]':"";if(!!l)for(let d=p.length-1;d>=0;d--){const v=p[d];if(v.href===b&&(!E||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${b}"]${B}`))return;const i=document.createElement("link");if(i.rel=E?"stylesheet":Qe,E||(i.as="script"),i.crossOrigin="",i.href=b,_&&i.setAttribute("nonce",_),document.head.appendChild(i),E)return new Promise((d,v)=>{i.addEventListener("load",d),i.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${b}`)))})}))}function s(p){const g=new Event("vite:preloadError",{cancelable:!0});if(g.payload=p,window.dispatchEvent(g),!g.defaultPrevented)throw p}return n.then(p=>{for(const g of p||[])g.status==="rejected"&&s(g.reason);return o().catch(s)})},J=(e,o)=>{const t=e.__vccOpts||e;for(const[l,n]of o)t[l]=n;return t},Ye={};function Ze(e,o){const t=xe("router-view");return c(),U(t)}const et=J(Ye,[["render",Ze]]),be=[{path:"/",name:"shelf",component:()=>oe(()=>import("./BookShelf-OCI2jMxW.js"),__vite__mapDeps([0,1,2,3,4,5,6]),import.meta.url)},{path:"/chapter",name:"chapter",component:()=>oe(()=>import("./BookChapter-txg2S1ZU.js"),__vite__mapDeps([7,1,2,3,4,5,8]),import.meta.url)}];re({history:le(),routes:be});const tt={style:{"margin-top":"20px"}},ot={__name:"SourceHelp",setup(e){return(o,t)=>{const l=Be,n=ge;return c(),I($,null,[m(l,{icon:r(L),href:"/help/#appHelp",target:"_blank"},{default:u(()=>t[0]||(t[0]=[f("APP帮助文档")])),_:1},8,["icon"]),t[19]||(t[19]=h("br",null,null,-1)),m(l,{icon:r(L),href:"/help/#ruleHelp",target:"_blank"},{default:u(()=>t[1]||(t[1]=[f("书源制作教程")])),_:1},8,["icon"]),t[20]||(t[20]=h("br",null,null,-1)),m(l,{icon:r(L),href:"/help/#jsHelp",target:"_blank"},{default:u(()=>t[2]||(t[2]=[f("js变量和函数")])),_:1},8,["icon"]),t[21]||(t[21]=h("br",null,null,-1)),m(l,{icon:r(L),href:"/help/#xpathHelp",target:"_blank"},{default:u(()=>t[3]||(t[3]=[f("xpath语法教程")])),_:1},8,["icon"]),t[22]||(t[22]=h("br",null,null,-1)),m(l,{icon:r(L),href:"/help/#regexHelp",target:"_blank"},{default:u(()=>t[4]||(t[4]=[f("正则表达式教程")])),_:1},8,["icon"]),t[23]||(t[23]=h("br",null,null,-1)),m(l,{icon:r(L),href:"/help/#txtTocRuleHelp",target:"_blank"},{default:u(()=>t[5]||(t[5]=[f("txt目录正则说明")])),_:1},8,["icon"]),t[24]||(t[24]=h("br",null,null,-1)),m(l,{icon:r(L),href:"/help/#debugHelp",target:"_blank"},{default:u(()=>t[6]||(t[6]=[f("书源调试说明")])),_:1},8,["icon"]),t[25]||(t[25]=h("br",null,null,-1)),m(l,{icon:r(L),href:"/help/#httpTTSHelp",target:"_blank"},{default:u(()=>t[7]||(t[7]=[f("在线朗读规则")])),_:1},8,["icon"]),t[26]||(t[26]=h("br",null,null,-1)),m(l,{icon:r(L),href:"/help/#webDavBookHelp",target:"_blank"},{default:u(()=>t[8]||(t[8]=[f(" WebDav书籍简明使用教程")])),_:1},8,["icon"]),t[27]||(t[27]=h("br",null,null,-1)),m(l,{icon:r(L),href:"/help/#webDavHelp",target:"_blank"},{default:u(()=>t[9]||(t[9]=[f(" WebDav备份教程")])),_:1},8,["icon"]),t[28]||(t[28]=h("br",null,null,-1)),m(l,{icon:r(L),href:"https://regexr-cn.com/",target:"_blank"},{default:u(()=>t[10]||(t[10]=[f("正则表达式在线验证工具")])),_:1},8,["icon"]),t[29]||(t[29]=h("br",null,null,-1)),h("div",tt,[h("span",null,[m(n,null,{default:u(()=>t[11]||(t[11]=[h("code",null,"^$()[]{}.?+*|",-1),f(" 这些是Java正则特殊符号,匹配需转义")])),_:1})]),t[15]||(t[15]=h("br",null,null,-1)),h("span",null,[m(n,null,{default:u(()=>t[12]||(t[12]=[h("code",null,"(?s)",-1),f(" 前缀表示跨行解析")])),_:1})]),t[16]||(t[16]=h("br",null,null,-1)),h("span",null,[m(n,null,{default:u(()=>t[13]||(t[13]=[h("code",null,"(?m)",-1),f(" 前缀表示逐行匹配")])),_:1})]),t[17]||(t[17]=h("br",null,null,-1)),h("span",null,[m(n,null,{default:u(()=>t[14]||(t[14]=[h("code",null,"(?i)",-1),f(" 前缀表示忽略大小写")])),_:1})]),t[18]||(t[18]=h("br",null,null,-1))])],64)}}},nt=J(ot,[["__scopeId","data-v-35b7188a"]]),rt=1e3,ke=D(localStorage.getItem("remoteIp")),x=Ie.create({timeout:120*rt});x.interceptors.request.use(e=>(e.baseURL=ie(),e));const oo=e=>{ke.value=e,localStorage.setItem("remoteIp",e)},ie=()=>ke.value||location.origin,ve=()=>{const{hostname:e,port:o}=new URL(ie());return`${e}:${Number(o)+1}`},lt=/source/i.test(location.href),st=e=>{throw lt&&C({message:"后端错误,检查网络或者阅读app",type:"error"}),e};x.interceptors.response.use(e=>e,st);const it=()=>x.get("/getReadConfig"),at=e=>x.post("/saveReadConfig",e),ut=e=>x.post("/saveBookProgress",e),ct=e=>{e&&navigator.sendBeacon(`${ie()}/saveBookProgress`,JSON.stringify(e))},dt=()=>x.get("/getBookshelf"),pt=e=>x.get("/getChapterList?url="+encodeURIComponent(e)),gt=(e,o)=>x.get("/getBookContent?url="+encodeURIComponent(e)+"&index="+o),mt=(e,o,t)=>{const l=`ws://${ve()}/searchBook`,n=new WebSocket(l);n.onopen=()=>{n.send(`{"key":"${e}"}`)},n.onmessage=({data:s})=>o(s),n.onclose=()=>{t()}},St=e=>x.post("/saveBook",e),ht=e=>x.post("/deleteBook",e),G=/bookSource/i.test(location.href),yt=()=>G?x.get("/getBookSources"):x.get("/getRssSources"),ft=e=>G?x.post("/saveBookSource",e):x.post("/saveRssSource",e),_t=e=>G?x.post("/saveBookSources",e):x.post("/saveRssSources",e),bt=e=>G?x.post("/deleteBookSources",e):x.post("/deleteRssSources",e),kt=(e,o,t,l)=>{const n=`ws://${ve()}/${G?"bookSource":"rssSource"}Debug`,s=new WebSocket(n);s.onopen=()=>{s.send(JSON.stringify({tag:e,key:o}))},s.onmessage=({data:p})=>t(p),s.onclose=()=>{C({message:"调试已关闭!",type:"info"}),l()}},q={getReadConfig:it,saveReadConfig:at,saveBookProgress:ut,saveBookProgressWithBeacon:ct,getBookShelf:dt,getChapterList:pt,getBookContent:gt,search:mt,saveBook:St,deleteBook:ht,getSources:yt,saveSources:_t,saveSource:ft,deleteSource:bt,debug:kt},W=e=>e==null||e.length===0||/^\s+$/.test(e),ae=e=>"bookSourceName"in e,vt=e=>ae(e)?!W(e.bookSourceName)&&!W(e.bookSourceUrl)&&!W(e.bookSourceType):!W(e.sourceName)&&!W(e.sourceName),Z=e=>ae(e)?e.bookSourceUrl:e.sourceUrl,wt=(e,o)=>{var t,l,n,s,p,g,_,b;return ae(e)?(((t=e.bookSourceName)==null?void 0:t.includes(o))||((l=e.bookSourceUrl)==null?void 0:l.includes(o))||((n=e.bookSourceGroup)==null?void 0:n.includes(o))||((s=e.bookSourceComment)==null?void 0:s.includes(o)))??!1:(((p=e.sourceName)==null?void 0:p.includes(o))||((g=e.sourceUrl)==null?void 0:g.includes(o))||((_=e.sourceGroup)==null?void 0:_.includes(o))||((b=e.sourceComment)==null?void 0:b.includes(o)))??!1},ne=e=>{const o=new Map;return e.forEach(t=>o.set(Z(t),t)),o},Ut={ruleSearch:{},ruleBookInfo:{},ruleToc:{},ruleContent:{},ruleReview:{},ruleExplore:{}},Et={},M=/bookSource/i.test(location.href),de=M?Ut:Et,K=Ve("source",{state:()=>({bookSources:[],rssSources:[],savedSources:[],currentSource:de,currentTab:localStorage.getItem("tabName")||"editTab",editTabSource:{},isDebuging:!1}),getters:{sources:e=>M?e.bookSources:e.rssSources,sourcesMap:e=>ne(e.sources),savedSourcesMap:e=>ne(e.savedSources),currentSourceUrl:e=>M?e.currentSource.bookSourceUrl:e.currentSource.sourceUrl,searchKey:e=>M?e.currentSource.ruleSearch.checkKeyWord||"我的":null},actions:{startDebug(){this.currentTab="editDebug",this.isDebuging=!0},debugFinish(){this.isDebuging=!1},saveSources(e){M?this.bookSources=e:this.rssSources=e},setPushReturnSources(e){this.savedSources=e},deleteSources(e){let o=M?this.bookSources:this.rssSources;e.forEach(t=>{let l=o.indexOf(t);l>-1&&o.splice(l,1)})},saveCurrentSource(){let e=this.currentSource,o=this.sourcesMap;o.set(Z(e),JSON.parse(JSON.stringify(e))),this.saveSources(Array.from(o.values()))},changeCurrentSource(e){this.currentSource=JSON.parse(JSON.stringify(e))},changeTabName(e){this.currentTab=e,localStorage.setItem("tabName",e)},changeEditTabSource(e){this.editTabSource=JSON.parse(JSON.stringify(e))},editHistory(e){let o;if(localStorage.getItem("history"))o=JSON.parse(localStorage.getItem("history")),o.new.push(e),o.new.length>50&&o.new.shift(),o.old.length>50&&o.old.shift(),localStorage.setItem("history",JSON.stringify(o));else{const t={new:[e],old:[]};localStorage.setItem("history",JSON.stringify(t))}},editHistoryUndo(){if(localStorage.getItem("history")){let e=JSON.parse(localStorage.getItem("history"));e.old.push(this.currentSource),e.new.length&&(this.currentSource=e.new.pop()),localStorage.setItem("history",JSON.stringify(e))}},clearAllHistory(){localStorage.setItem("history",JSON.stringify({new:[],old:[]}))},clearEdit(){this.editTabSource={},this.currentSource=de},clearAllSource(){this.bookSources=[],this.rssSources=[],this.savedSources=[]}}}),Ct={__name:"SourceItem",props:["source"],setup(e){const o=e,t=K(),{savedSourcesMap:l,currentSourceUrl:n}=X(t),s=z(()=>Z(o.source)),p=_=>{t.changeCurrentSource(_)},g=z(()=>{const _=l.value;return _.size==0?!1:!_.has(s.value)});return(_,b)=>{const E=se,B=Ne;return c(),U(B,{size:"large",border:"",label:r(s),class:Se({error:r(g),edit:r(s)==r(n)})},{default:u(()=>[f(Q(e.source.bookSourceName||e.source.sourceName)+" ",1),m(E,{text:"",icon:r(me),onClick:b[0]||(b[0]=w=>p(e.source))},null,8,["icon"])]),_:1},8,["label","class"])}}},xt=J(Ct,[["__scopeId","data-v-830cee5a"]]),Bt={class:"tool"},It={__name:"SourceList",setup(e){const o=K(),t=D([]),l=D(""),{sources:n,sourcesMap:s}=X(o),p=z(()=>{const i=l.value;return i===""?n.value:n.value.filter(d=>wt(d,i))}),g=z(()=>{const i=t.value;if(i.length==0)return[];const d=l.value==""?s.value:ne(p.value);return i.reduce((v,k)=>{const V=d.get(k);return V&&v.push(V),v},[])}),_=()=>{const i=g.value;q.deleteSource(i).then(({data:d})=>{if(!d.isSuccess)return C.error(d.errorMsg);o.deleteSources(i);const v=Le(t.value);i.forEach(k=>{const V=v.indexOf(Z(k));V>-1&&v.splice(V,1)}),t.value=v})},b=()=>{o.clearAllSource(),t.value=[]},E=()=>{const i=document.createElement("input");i.type="file",i.accept=".json,.txt",i.addEventListener("change",d=>{const v=d.target.files[0];var k=new FileReader;k.readAsText(v),k.onload=()=>{try{const V=JSON.parse(k.result);o.saveSources(V)}catch{C({message:"上传的源格式错误",type:"error"})}}}),i.click()},B=/bookSource/.test(window.location.href),w=()=>{const i=document.createElement("a");let d=t.value.length===0?p.value:g.value,v=B?"BookSource":"RssSource";i.download=`${v}_${Date().replace(/.*?\s(\d+)\s(\d+)\s(\d+:\d+:\d+).*/,"$2$1$3").replace(/:/g,"")}.json`;let k=new Blob([JSON.stringify(d,null,4)],{type:"application/json"});i.href=window.URL.createObjectURL(k),i.click()};return(i,d)=>{const v=Y,k=se,V=$e;return c(),I($,null,[m(v,{modelValue:r(l),"onUpdate:modelValue":d[0]||(d[0]=N=>j(l)?l.value=N:null),class:"search","prefix-icon":r(he),placeholder:"筛选源"},null,8,["modelValue","prefix-icon"]),h("div",Bt,[m(k,{onClick:E,icon:r(Te)},{default:u(()=>d[2]||(d[2]=[f("打开")])),_:1},8,["icon"]),m(k,{disabled:r(p).length===0,onClick:w,icon:r(Re)},{default:u(()=>d[3]||(d[3]=[f(" 导出")])),_:1},8,["disabled","icon"]),m(k,{type:"danger",icon:r(ue),onClick:_,disabled:r(g).length===0},{default:u(()=>d[4]||(d[4]=[f("删除")])),_:1},8,["icon","disabled"]),m(k,{type:"danger",icon:r(ue),onClick:b,disabled:r(n).length===0},{default:u(()=>d[5]||(d[5]=[f("清空")])),_:1},8,["icon","disabled"])]),m(V,{id:"source-list",modelValue:r(t),"onUpdate:modelValue":d[1]||(d[1]=N=>j(t)?t.value=N:null)},{default:u(()=>[m(r(Oe),{style:{height:"100%","overflow-y":"auto","overflow-x":"hidden"},"data-key":N=>N.bookSourceUrl||N.sourceUrl,"data-sources":r(p),"data-component":xt,"estimate-size":45},null,8,["data-key","data-sources"])]),_:1},8,["modelValue"])],64)}}},Vt=J(It,[["__scopeId","data-v-cd1572ca"]]),Nt={__name:"SourceDebug",setup(e){const o=K(),t=D(""),l=D("");ye(()=>o.isDebuging,()=>{o.isDebuging&&s()});const n=g=>{let _=document.querySelector("#debug-text");_.scrollTop=_.scrollHeight,t.value+=g+` +`},s=async()=>{t.value="";try{await q.saveSource(o.currentSource)}catch(g){throw o.debugFinish(),g}q.debug(o.currentSourceUrl,l.value||o.searchKey,n,o.debugFinish)},p=z(()=>/bookSource/.test(window.location.href));return(g,_)=>{const b=Y;return c(),I($,null,[r(p)?(c(),U(b,{key:0,id:"debug-key",modelValue:r(l),"onUpdate:modelValue":_[0]||(_[0]=E=>j(l)?l.value=E:null),placeholder:"搜索书名、作者","prefix-icon":r(he),style:{"padding-bottom":"4px"},onKeydown:De(s,["enter"])},null,8,["modelValue","prefix-icon"])):R("",!0),m(b,{id:"debug-text",modelValue:r(t),"onUpdate:modelValue":_[1]||(_[1]=E=>j(t)?t.value=E:null),type:"textarea",readonly:"",rows:"29",placeholder:"这里用于输出调试信息"},null,8,["modelValue"])],64)}}},Tt=J(Nt,[["__scopeId","data-v-97ed449e"]]),Rt=Je(),Ot={__name:"SourceJson",setup(e){const o=K(),t=D(""),l=async n=>{try{o.changeEditTabSource(JSON.parse(n))}catch{C({message:"粘贴的源格式错误",type:"error"})}};return Pe(async()=>{let n=o.editTabSource;Object.keys(n).length>0?t.value=JSON.stringify(n,null,4):t.value=""}),(n,s)=>{const p=Y;return c(),U(p,{id:"source-json",modelValue:r(t),"onUpdate:modelValue":s[0]||(s[0]=g=>j(t)?t.value=g:null),type:"textarea",placeholder:"这里输出序列化的JSON数据,可直接导入'阅读'APP",rows:"30",onChange:l,style:{"margin-bottom":"4px"}},null,8,["modelValue"])}}},Lt=J(Ot,[["__scopeId","data-v-7e91a802"]]),$t={__name:"SourceTabTools",setup(e){const o=K(),{currentTab:t}=X(o),l=D([["editTab","编辑源"],["editDebug","调试源"],["editList","源列表"],["editHelp","帮助信息"]]);return(n,s)=>{const p=Lt,g=Tt,_=Vt,b=nt,E=fe,B=_e;return c(),U(B,{modelValue:r(t),"onUpdate:modelValue":s[0]||(s[0]=w=>j(t)?t.value=w:null)},{default:u(()=>[(c(!0),I($,null,A(r(l),(w,i)=>(c(),U(E,{key:w[0],name:w[0],label:w[1]},{default:u(()=>[i==0?(c(),U(p,{key:0})):R("",!0),i==1?(c(),U(g,{key:1})):R("",!0),i==2?(c(),U(_,{key:2})):R("",!0),i==3?(c(),U(b,{key:3})):R("",!0)]),_:2},1032,["name","label"]))),128))]),_:1},8,["modelValue"])}}},Dt=J($t,[["__scopeId","data-v-dcce2457"]]),Jt={class:"menu flex-column-center"},Pt={class:"hotkeys-header flex-space-between"},At=["id"],jt={key:0},Kt={class:"hotkeys-settings flex-column-center"},Ht={class:"title"},Mt={class:"hotkeys-item__content"},qt={key:0},Ft={key:0},Wt={__name:"ToolBar",setup(e){const o=K(),t=()=>{const y=C({message:"加载中……",showClose:!0,duration:0});q.getSources().then(({data:a})=>{a.isSuccess?(o.changeTabName("editList"),o.saveSources(a.data),C({message:`成功拉取${a.data.length}条源`,type:"success"})):C({message:a.errorMsg??"后端错误",type:"error"})}).finally(()=>y.close())},l=()=>{let y=o.sources;if(o.changeTabName("editList"),y.length===0)return C({message:"空空如也",type:"info"});C({message:"正在推送中",type:"info"}),q.saveSources(y).then(({data:a})=>{if(a.isSuccess){let S=a.data;if(Array.isArray(S)){let P="";y.length>S.length&&(P=` +推送失败的源将用红色字体标注!`,o.setPushReturnSources(S)),C({message:`批量推送源到「阅读3.0APP」 +共计: ${y.length} 条 +成功: ${S.length} 条 +失败: ${y.length-S.length} 条${P}`,type:"success"})}}else C({message:`批量推送源失败! +ErrorMsg: ${a.errorMsg}`,type:"error"})})},n=()=>{o.changeTabName("editTab"),o.changeEditTabSource(o.currentSource)},s=()=>{o.changeCurrentSource(o.editTabSource)},p=()=>{o.editHistoryUndo()},g=()=>{o.clearEdit(),C({message:"已清除",type:"success"})},_=()=>{o.clearEdit(),o.clearAllHistory(),C({message:"已清除所有历史记录",type:"success"})},b=()=>{let y=/bookSource/.test(location.href),a=o.currentSource;vt(a)?q.saveSource(a).then(({data:S})=>{S.isSuccess?(C({message:`源《${y?a.bookSourceName:a.sourceName}》已成功保存到「阅读3.0APP」`,type:"success"}),o.saveCurrentSource()):C({message:`源《${y?a.bookSourceName:a.sourceName}》保存失败! +ErrorMsg: ${S.errorMsg}`,type:"error"})}):C({message:"请检查<必填>项是否全部填写",type:"error"})},E=()=>{o.startDebug()},B=D(Array.of({name:"⇈推送源",hotKeys:[],action:l},{name:"⇊拉取源",hotKeys:[],action:t},{name:"⋙生成源",hotKeys:[],action:n},{name:"⋘编辑源",hotKeys:[],action:s},{name:"✗清空表单",hotKeys:[],action:g},{name:"↶撤销操作",hotKeys:[],action:p},{name:"↷重做操作",hotKeys:[],action:_},{name:"⇏调试源",hotKeys:[],action:E},{name:"✓保存源",hotKeys:[],action:b})),w=D(!0),i=D(!1),d=D(-1),v=()=>{i.value||(w.value=!1),i.value=!1};ye(w,y=>{if(!y){H.unbind("*"),F(),N();return}F(),H.unbind(),H("*",a=>{a.preventDefault();let S=H.getPressedKeyString();S.length==1&&S[0]=="esc"||i.value&&d.value>-1&&(B.value[d.value].hotKeys=S)})},{immediate:!0});const k=y=>{i.value=!0,C({message:"按ESC键或者点击空白处结束录入",type:"info"}),B.value[y].hotKeys=[],d.value=y},V=()=>{const y=[];B.value.forEach(({hotKeys:a})=>{y.push(a)}),O(y),w.value=!1},N=()=>{H.filter=()=>!0,B.value.forEach(({hotKeys:y,action:a})=>{y.length!=0&&H(y.join("+"),S=>{S.preventDefault(),a.call(null)})})},O=y=>{localStorage.setItem("legado_web_hotkeys",JSON.stringify(y))};function F(){try{const y=JSON.parse(localStorage.getItem("legado_web_hotkeys"));return!Array.isArray(y)||y.length==0?!1:(B.value.forEach((a,S)=>a.hotKeys=y[S]),!0)}catch{C({message:"快捷键配置错误",type:"error"}),localStorage.removeItem("legado_web_hotkeys")}return!1}return Ae(()=>{F()&&(w.value=!1)}),(y,a)=>{const S=se,P=ge,Ee=Ke;return c(),I($,null,[h("div",Jt,[(c(!0),I($,null,A(r(B),T=>(c(),U(S,{size:"large",key:T.name,onClick:T.action},{default:u(()=>[f(Q(T.name),1)]),_:2},1032,["onClick"]))),128)),m(S,{size:"large",onClick:a[0]||(a[0]=()=>w.value=!0)},{default:u(()=>a[2]||(a[2]=[f("快捷键")])),_:1})]),m(Ee,{modelValue:r(w),"onUpdate:modelValue":a[1]||(a[1]=T=>j(w)?w.value=T:null),"show-close":!1,"before-close":v},{header:u(({titleClass:T,titleId:ee})=>[h("div",Pt,[h("div",{id:ee,class:Se(T)},[a[4]||(a[4]=f(" 快捷键设置 ")),r(i)?(c(),I("span",jt,[m(P,null,{default:u(()=>a[3]||(a[3]=[f(" / 录入中 ")])),_:1})])):R("",!0)],10,At),m(S,{disabled:r(i),onClick:V,icon:r(je)},{default:u(()=>a[5]||(a[5]=[f("保存")])),_:1},8,["disabled","icon"])])]),default:u(()=>[h("div",Kt,[(c(!0),I($,null,A(r(B),(T,ee)=>(c(),I("div",{key:T.name,class:"hotkeys-item flex-space-between"},[h("span",Ht,[m(P,null,{default:u(()=>[f(Q(T.name),1)]),_:2},1024)]),h("div",Mt,[(c(!0),I($,null,A(T.hotKeys,(te,Ce)=>(c(),I("div",{key:te},[h("kbd",null,Q(te),1),Ce+1a[6]||(a[6]=[f("+")])),_:1})])):R("",!0)]))),128)),T.hotKeys.length==0?(c(),I("span",Ft,"未设置")):R("",!0)]),m(S,{disabled:r(i),text:"",icon:r(me),onClick:te=>k(ee)},{default:u(()=>a[7]||(a[7]=[f("编辑")])),_:2},1032,["disabled","icon","onClick"])]))),128))])]),_:1},8,["modelValue"])],64)}}},zt=J(Wt,[["__scopeId","data-v-9fd45dad"]]),Gt={__name:"SourceTabForm",props:["config"],setup(e){const o=K(),{currentSource:t}=X(o);return(l,n)=>{const s=Y,p=He,g=Me,_=qe,b=Fe,E=We,B=ze,w=fe,i=_e;return c(),U(i,{id:"source-edit"},{default:u(()=>[(c(!0),I($,null,A(Object.values(e.config),({name:d,children:v})=>(c(),U(w,{label:d,key:d},{default:u(()=>[m(B,{"label-position":"right","label-width":"auto"},{default:u(()=>[(c(!0),I($,null,A(v,({type:k,title:V,namespace:N,id:O,array:F,hint:y,required:a})=>(c(),U(E,{label:V,key:V,required:a},{default:u(()=>[k=="String"&&typeof N>"u"?(c(),U(s,{key:0,type:"textarea",modelValue:r(t)[O],"onUpdate:modelValue":S=>r(t)[O]=S,placeholder:y,autosize:""},null,8,["modelValue","onUpdate:modelValue","placeholder"])):R("",!0),k=="String"&&typeof N<"u"?(c(),U(s,{key:1,type:"textarea",modelValue:r(t)[N][O],"onUpdate:modelValue":S=>r(t)[N][O]=S,placeholder:y,autosize:""},null,8,["modelValue","onUpdate:modelValue","placeholder"])):R("",!0),k=="Boolean"?(c(),U(p,{key:2,modelValue:r(t)[O],"onUpdate:modelValue":S=>r(t)[O]=S},null,8,["modelValue","onUpdate:modelValue"])):R("",!0),k=="Number"?(c(),U(g,{key:3,modelValue:r(t)[O],"onUpdate:modelValue":S=>r(t)[O]=S,min:0},null,8,["modelValue","onUpdate:modelValue"])):R("",!0),k=="Array"?(c(),U(b,{key:4,modelValue:r(t)[O],"onUpdate:modelValue":S=>r(t)[O]=S},{default:u(()=>[(c(!0),I($,null,A(F,(S,P)=>(c(),U(_,{value:P,key:S,label:S},null,8,["value","label"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue"])):R("",!0)]),_:2},1032,["label","required"]))),128))]),_:2},1024)]),_:2},1032,["label"]))),128))]),_:1})}}},Qt=J(Gt,[["__scopeId","data-v-bced2b97"]]),Xt={base:{name:"基础",children:[{title:"源类型",id:"bookSourceType",type:"Array",array:["文本","音频","图片","文件"],required:!0},{title:"源域名",id:"bookSourceUrl",type:"String",hint:"通常填写网站主页,例: https://www.qidian.com",required:!0},{title:"源名称",id:"bookSourceName",type:"String",hint:"会显示在源列表",required:!0},{title:"源分组",id:"bookSourceGroup",type:"String",hint:"描述源的特征信息"},{title:"源注释",id:"bookSourceComment",type:"String",hint:"描述源作者和状态"},{title:"登录地址",id:"loginUrl",type:"String",hint:"填写网站登录网址,仅在需要登录的源有用"},{title:"登录界面",id:"loginUi",type:"String",hint:"自定义登录界面"},{title:"登录检测",id:"loginCheckJs",type:"String",hint:"登录检测js"},{title:"封面解密",id:"coverDecodeJs",type:"String",hint:"封面解密js"},{title:"链接验证",id:"bookUrlPattern",type:"String",hint:"书籍URL正则,当详情页URL与源URL的域名不一致时有效,用于添加网址"},{title:"请求头",id:"header",type:"String",hint:"客户端标识"},{title:"变量说明",id:"variableComment",type:"String",hint:"书源变量说明"},{title:"并发率",id:"concurrentRate",type:"String",hint:"并发率,如1000(访问间隔1000ms)或者1/1000(1000ms内访问1次)"},{title:"js库",id:"jsLib",type:"String",hint:"js库, 可填写js或者key-value object获取在线js文件"}]},search:{name:"搜索",children:[{title:"搜索地址",id:"searchUrl",type:"String",hint:"[域名可省略]/search.php@kw={{key}}"},{title:"校验文字",namespace:"ruleSearch",id:"checkKeyWord",type:"String",hint:"校验关键字,强烈建议填写"},{title:"列表规则",namespace:"ruleSearch",id:"bookList",type:"String",hint:"选择书籍节点 (规则结果为List)"},{title:"书名规则",namespace:"ruleSearch",id:"name",type:"String",hint:"选择节点书名 (规则结果为String)"},{title:"作者规则",namespace:"ruleSearch",id:"author",type:"String",hint:"选择节点作者 (规则结果为String)"},{title:"分类规则",namespace:"ruleSearch",id:"kind",type:"String",hint:"选择节点分类信息 (规则结果为String)"},{title:"字数规则",namespace:"ruleSearch",id:"wordCount",type:"String",hint:"选择节点字数信息 (规则结果为String)"},{title:"最新章节",namespace:"ruleSearch",id:"lastChapter",type:"String",hint:"选择节点最新章节 (规则结果为String)"},{title:"简介规则",namespace:"ruleSearch",id:"intro",type:"String",hint:"选择节点书籍简介 (规则结果为String)"},{title:"封面规则",namespace:"ruleSearch",id:"coverUrl",type:"String",hint:"选择节点书籍封面 (规则结果为String类型的url)"},{title:"详情地址",namespace:"ruleSearch",id:"bookUrl",type:"String",hint:"选择书籍详情页网址 (规则结果为String类型的url)"}]},find:{name:"发现",children:[{title:"发现地址",id:"exploreUrl",type:"String",hint:"单个发现格式::或者{url:,title:,style:...};前者用换行符或者&&连接,后者放在数组内;可用js动态生成"},{title:"列表规则",namespace:"ruleExplore",id:"bookList",type:"String",hint:"选择书籍节点 (规则结果为List)"},{title:"书名规则",namespace:"ruleExplore",id:"name",type:"String",hint:"选择节点书名 (规则结果为String)"},{title:"作者规则",namespace:"ruleExplore",id:"author",type:"String",hint:"选择节点作者 (规则结果为String)"},{title:"分类规则",namespace:"ruleExplore",id:"kind",type:"String",hint:"选择节点分类信息 (规则结果为String)"},{title:"字数规则",namespace:"ruleExplore",id:"wordCount",type:"String",hint:"选择节点字数信息 (规则结果为String)"},{title:"最新章节",namespace:"ruleExplore",id:"lastChapter",type:"String",hint:"选择节点最新章节 (规则结果为String)"},{title:"简介规则",namespace:"ruleExplore",id:"intro",type:"String",hint:"选择节点书籍简介 (规则结果为String)"},{title:"封面规则",namespace:"ruleExplore",id:"coverUrl",type:"String",hint:"选择节点书籍封面 (规则结果为String类型的url)"},{title:"详情地址",namespace:"ruleExplore",id:"bookUrl",type:"String",hint:"选择书籍详情页网址 (规则结果为String类型的url)"}]},detail:{name:"详情",children:[{title:"预处理",namespace:"ruleBookInfo",id:"init",type:"String",hint:"用于加速详情信息检索,只支持AllInOne规则"},{title:"书名规则",namespace:"ruleBookInfo",id:"name",type:"String",hint:"选择节点书名 (规则结果为String)"},{title:"作者规则",namespace:"ruleBookInfo",id:"author",type:"String",hint:"选择节点作者 (规则结果为String)"},{title:"分类规则",namespace:"ruleBookInfo",id:"kind",type:"String",hint:"选择节点分类信息 (规则结果为String)"},{title:"字数规则",namespace:"ruleBookInfo",id:"wordCount",type:"String",hint:"选择节点字数信息 (规则结果为String)"},{title:"最新章节",namespace:"ruleBookInfo",id:"lastChapter",type:"String",hint:"选择节点最新章节 (规则结果为String)"},{title:"简介规则",namespace:"ruleBookInfo",id:"intro",type:"String",hint:"选择节点书籍简介 (规则结果为String)"},{title:"封面规则",namespace:"ruleBookInfo",id:"coverUrl",type:"String",hint:"选择节点书籍封面 (规则结果为String类型的url)"},{title:"目录地址",namespace:"ruleBookInfo",id:"tocUrl",type:"String",hint:"选择书籍详情页网址 (规则结果为String类型的url, 与详情页相同时可省略)"},{title:"修改书籍",namespace:"ruleBookInfo",id:"canReName",type:"String",hint:"允许修改书名作者(规则结果为String类型, 默认不允许)"},{title:"下载URL",namespace:"ruleBookInfo",id:"downloadUrls",type:"String",hint:"文件类书源下载地址 (规则结果为String类型的url, 多个链接返回数组)"}]},directory:{name:"目录",children:[{title:"更新前JS",namespace:"ruleToc",id:"preUpdateJs",type:"String",hint:"更新目录前调用JS 动态更新目录链接"},{title:"列表规则",namespace:"ruleToc",id:"chapterList",type:"String",hint:"选择目录列表的章节节点 (规则结果为List)"},{title:"章节名称",namespace:"ruleToc",id:"chapterName",type:"String",hint:"选择章节名称 (规则结果为String)"},{title:"章节地址",namespace:"ruleToc",id:"chapterUrl",type:"String",hint:"选择章节链接 (规则结果为String类型的Url)"},{title:"标题处理",namespace:"ruleToc",id:"formatJs",type:"String",hint:"遍历去重后的章节列表的回调,提供index(章节序号从1开始)、title(章节标题)变量,额外提供gInt(初始值0),返回值作为新的标题"},{title:"卷名标识",namespace:"ruleToc",id:"isVolume",type:"String",hint:"章节名称是否是卷名 (规则结果为Bool)"},{title:"章节信息",namespace:"ruleToc",id:"updateTime",type:"String",hint:"选择章节信息(如更新时间) (规则结果为String)"},{title:"收费标识",namespace:"ruleToc",id:"isVip",type:"String",hint:"章节是否为VIP章节 (规则结果为Bool)"},{title:"购买标识",namespace:"ruleToc",id:"isPay",type:"String",hint:"章节是否为已购买 (规则结果为Bool)"},{title:"翻页规则",namespace:"ruleToc",id:"nextTocUrl",type:"String",hint:"选择目录下一页链接 (规则结果为List或String)"}]},content:{name:"正文",children:[{title:"正文规则",namespace:"ruleContent",id:"content",type:"String",hint:"选择正文内容 (规则结果为String)"},{title:"标题规则",namespace:"ruleContent",id:"title",type:"String",hint:"获取结果将会覆盖章节标题 (规则结果为String)"},{title:"翻页规则",namespace:"ruleContent",id:"nextContentUrl",type:"String",hint:"选择下一分页(不是下一章)链接 (规则结果为String类型的Url)"},{title:"脚本注入",namespace:"ruleContent",id:"webJs",type:"String",hint:"注入javascript,用于模拟鼠标点击等,必须有返回值,一般为String类型"},{title:"资源正则",namespace:"ruleContent",id:"sourceRegex",type:"String",hint:"匹配资源的url特征,用于嗅探"},{title:"替换规则",namespace:"ruleContent",id:"replaceRegex",type:"String",hint:"多页内容合并后替换,用于正文净化"},{title:"图片样式",namespace:"ruleContent",id:"imageStyle",type:"String",hint:"FULL:铺满 不填:默认样式"},{title:"图片解密",namespace:"ruleContent",id:"imageDecode",type:"String",hint:"填写JavaScript 返回解密图片的bytes "},{title:"购买操作",namespace:"ruleContent",id:"payAction",type:"String",hint:"填写JavaScript 返回购买链接或者调用购买接口"}]},other:{name:"其他",children:[{title:"启用搜索",id:"enabled",type:"Boolean"},{title:"启用发现",id:"enabledExplore",type:"Boolean"},{title:"CookieJar",id:"enabledCookieJar",type:"Boolean"},{title:"搜索权重",id:"weight",type:"Number"},{title:"排序编号",id:"customOrder",type:"Number"}]}},Yt={base:{name:"基础",children:[{title:"源域名",id:"sourceUrl",type:"String",hint:"通常填写网站主页,例: https://www.qidian.com",required:!0},{title:"图标",id:"sourceIcon",type:"String",hint:"填写图片网络链接"},{title:"源名称",id:"sourceName",type:"String",hint:"会显示在源列表",required:!0},{title:"源分组",id:"sourceGroup",type:"String",hint:"描述源的特征信息"},{title:"源注释",id:"sourceComment",type:"String",hint:"描述源作者和状态"},{title:"分类地址",id:"sortUrl",type:"String",hint:`名称1::链接1 +名称2::链接2`},{title:"登录地址",id:"loginUrl",type:"String",hint:"填写网站登录网址,仅在需要登录的源有用"},{title:"登录界面",id:"loginUi",type:"String",hint:"自定义登录界面"},{title:"登录检测",id:"loginCheckJs",type:"String",hint:"登录检测js"},{title:"封面解密",id:"coverDecodeJs",type:"String",hint:"封面解密js"},{title:"请求头",id:"header",type:"String",hint:"客户端标识"},{title:"变量说明",id:"variableComment",type:"String",hint:"源变量说明"},{title:"并发率",id:"concurrentRate",type:"String",hint:"并发率"}]},list:{name:"列表",children:[{title:"列表规则",id:"ruleArticles",type:"String",hint:"规则结果为List"},{title:"翻页规则",id:"ruleNextPage",type:"String",hint:"下一页链接 规则结果为List或String"},{title:"标题规则",id:"ruleTitle",type:"String",hint:"文章标题 规则结果为String"},{title:"时间规则",id:"rulePubDate",type:"String",hint:"文章发布时间 规则结果为String"},{title:"描述规则",id:"ruleDescription",type:"String",hint:"文章简要描述 规则结果为String"},{title:"图片规则",id:"ruleImage",type:"String",hint:"文章图片链接 规则结果为String"},{title:"链接规则",id:"ruleLink",type:"String",hint:"文章链接 规则结果为String"}]},webView:{name:"WebView",children:[{title:"内容规则",id:"ruleContent",type:"String",hint:"文章正文"},{title:"样式规则",id:"style",type:"String",hint:"文章正文样式 填写css"},{title:"注入规则",id:"injectJs",type:"String",hint:"注入网页的JavaScript"},{title:"黑名单",id:"contentBlacklist",type:"String",hint:"webView链接加载黑名单,英文逗号隔开"},{title:"白名单",id:"contentWhitelist",type:"String",hint:"webView链接加载白名单,英文逗号隔开"},{title:"链接拦截",id:"shouldOverrideUrlLoading",type:"String",hint:"填写js,变量url为当前资源链接,返回true拦截"}]},other:{name:"其他",children:[{title:"列表样式",id:"articleStyle",type:"Array",array:["默认","大图","双列"]},{title:"加载地址",id:"loadWithBaseUrl",type:"Boolean"},{title:"启用JS",id:"enableJs",type:"Boolean"},{title:"启用",id:"enabled",type:"Boolean"},{title:"Cookie",id:"enabledCookieJar",type:"Boolean"},{title:"单URL",id:"singleUrl",type:"Boolean"},{title:"排序编号",id:"customOrder",type:"Number"}]}},Zt={class:"editor"},eo={__name:"SourceEditor",setup(e){let o;return/bookSource/i.test(location.href)?(o=Xt,document.title="书源管理"):(o=Yt,document.title="订阅源管理"),(t,l)=>{const n=Qt,s=zt,p=Dt;return c(),I("div",Zt,[m(n,{class:"left",config:r(o)},null,8,["config"]),m(s),m(p,{class:"right"})])}}},pe=J(eo,[["__scopeId","data-v-5fe2b79d"]]),we=[{path:"/bookSource",name:"book-home",component:pe},{path:"/rssSource",name:"rss-home",component:pe}];re({history:le(),routes:we});const Ue=re({history:le(),routes:be.concat(we)});Ue.afterEach(e=>{e.name=="shelf"&&(document.title="书架")});Ge(et).use(Rt).use(Ue).mount("#app");oe(()=>import("./config-BsTATf_v.js"),__vite__mapDeps([9,4,1,2,10]),import.meta.url);export{q as A,J as _,ie as b,oo as s}; diff --git a/app/src/main/assets/web/vue/assets/index-DiJORxAd.js b/app/src/main/assets/web/vue/assets/index-DiJORxAd.js deleted file mode 100644 index 88e5418dc2c5..000000000000 --- a/app/src/main/assets/web/vue/assets/index-DiJORxAd.js +++ /dev/null @@ -1,10 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./BookShelf-DmN0EcU9.js","./vendor-B4RITwN5.js","./vendor-C9cXVWQA.css","./loading-BSPlXMjv.js","./loading-CBQeIji2.css","./BookShelf-Bs01BdYY.css","./BookChapter-BDwWiA-_.js","./BookChapter-B8PYup72.css","./config-MMLbq8EV.js","./config-B2IgxNHB.css"])))=>i.map(i=>d[i]); -import{o as u,c as C,r as Ie,a as se,b as le,d as x,e as d,w as c,f,u as s,l as O,g,F as P,E as Ve,h as ge,p as Te,i as Ne,j as D,k as $e,m as w,n as me,s as Y,q as G,t as X,v as Se,x as _e,y as ie,z as Re,A as H,B as fe,C as Le,D as Oe,G as ue,V as Pe,H as De,I as Z,J as Je,K as ye,L as Ae,M as R,N as je,O as Ke,P as j,Q as be,R as ke,S as q,T as He,U as Me,W as qe,X as Fe,Y as We,Z as ze,_ as Ge,$ as Qe,a0 as Xe,a1 as Ye}from"./vendor-B4RITwN5.js";(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const n of document.querySelectorAll('link[rel="modulepreload"]'))r(n);new MutationObserver(n=>{for(const l of n)if(l.type==="childList")for(const i of l.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&r(i)}).observe(document,{childList:!0,subtree:!0});function o(n){const l={};return n.integrity&&(l.integrity=n.integrity),n.referrerPolicy&&(l.referrerPolicy=n.referrerPolicy),n.crossOrigin==="use-credentials"?l.credentials="include":n.crossOrigin==="anonymous"?l.credentials="omit":l.credentials="same-origin",l}function r(n){if(n.ep)return;n.ep=!0;const l=o(n);fetch(n.href,l)}})();const Ze="modulepreload",et=function(e,t){return new URL(e,t).href},de={},ne=function(t,o,r){let n=Promise.resolve();if(o&&o.length>0){const l=document.getElementsByTagName("link"),i=document.querySelector("meta[property=csp-nonce]"),b=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));n=Promise.all(o.map(p=>{if(p=et(p,r),p in de)return;de[p]=!0;const k=p.endsWith(".css"),V=k?'[rel="stylesheet"]':"";if(!!r)for(let a=l.length-1;a>=0;a--){const y=l[a];if(y.href===p&&(!k||y.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${p}"]${V}`))return;const _=document.createElement("link");if(_.rel=k?"stylesheet":Ze,k||(_.as="script",_.crossOrigin=""),_.href=p,b&&_.setAttribute("nonce",b),document.head.appendChild(_),k)return new Promise((a,y)=>{_.addEventListener("load",a),_.addEventListener("error",()=>y(new Error(`Unable to preload CSS for ${p}`)))})}))}return n.then(()=>t()).catch(l=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=l,window.dispatchEvent(i),!i.defaultPrevented)throw l})},J=(e,t)=>{const o=e.__vccOpts||e;for(const[r,n]of t)o[r]=n;return o},tt={};function ot(e,t){const o=Ie("router-view");return u(),C(o)}const nt=J(tt,[["render",ot]]),ve=[{path:"/",name:"shelf",component:()=>ne(()=>import("./BookShelf-DmN0EcU9.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url)},{path:"/chapter",name:"chapter",component:()=>ne(()=>import("./BookChapter-BDwWiA-_.js"),__vite__mapDeps([6,1,2,3,4,7]),import.meta.url)}];se({history:le(),routes:ve});const B=e=>(Te("data-v-35b7188a"),e=e(),Ne(),e),rt=B(()=>g("br",null,null,-1)),st=B(()=>g("br",null,null,-1)),lt=B(()=>g("br",null,null,-1)),it=B(()=>g("br",null,null,-1)),at=B(()=>g("br",null,null,-1)),ct=B(()=>g("br",null,null,-1)),ut=B(()=>g("br",null,null,-1)),dt=B(()=>g("br",null,null,-1)),pt=B(()=>g("br",null,null,-1)),ht=B(()=>g("br",null,null,-1)),gt=B(()=>g("br",null,null,-1)),mt={style:{"margin-top":"20px"}},St=B(()=>g("code",null,"^$()[]{}.?+*|",-1)),_t=B(()=>g("br",null,null,-1)),ft=B(()=>g("code",null,"(?s)",-1)),yt=B(()=>g("br",null,null,-1)),bt=B(()=>g("code",null,"(?m)",-1)),kt=B(()=>g("br",null,null,-1)),vt=B(()=>g("code",null,"(?i)",-1)),Ct=B(()=>g("br",null,null,-1)),wt={__name:"SourceHelp",setup(e){return(t,o)=>{const r=Ve,n=ge;return u(),x(P,null,[d(r,{icon:s(O),href:"/help/#appHelp",target:"_blank"},{default:c(()=>[f("APP帮助文档")]),_:1},8,["icon"]),rt,d(r,{icon:s(O),href:"/help/#ruleHelp",target:"_blank"},{default:c(()=>[f("书源制作教程")]),_:1},8,["icon"]),st,d(r,{icon:s(O),href:"/help/#jsHelp",target:"_blank"},{default:c(()=>[f("js变量和函数")]),_:1},8,["icon"]),lt,d(r,{icon:s(O),href:"/help/#xpathHelp",target:"_blank"},{default:c(()=>[f("xpath语法教程")]),_:1},8,["icon"]),it,d(r,{icon:s(O),href:"/help/#regexHelp",target:"_blank"},{default:c(()=>[f("正则表达式教程")]),_:1},8,["icon"]),at,d(r,{icon:s(O),href:"/help/#txtTocRuleHelp",target:"_blank"},{default:c(()=>[f("txt目录正则说明")]),_:1},8,["icon"]),ct,d(r,{icon:s(O),href:"/help/#debugHelp",target:"_blank"},{default:c(()=>[f("书源调试说明")]),_:1},8,["icon"]),ut,d(r,{icon:s(O),href:"/help/#httpTTSHelp",target:"_blank"},{default:c(()=>[f("在线朗读规则")]),_:1},8,["icon"]),dt,d(r,{icon:s(O),href:"/help/#webDavBookHelp",target:"_blank"},{default:c(()=>[f(" WebDav书籍简明使用教程")]),_:1},8,["icon"]),pt,d(r,{icon:s(O),href:"/help/#webDavHelp",target:"_blank"},{default:c(()=>[f(" WebDav备份教程")]),_:1},8,["icon"]),ht,d(r,{icon:s(O),href:"https://regexr-cn.com/",target:"_blank"},{default:c(()=>[f("正则表达式在线验证工具")]),_:1},8,["icon"]),gt,g("div",mt,[g("span",null,[d(n,null,{default:c(()=>[St,f(" 这些是Java正则特殊符号,匹配需转义")]),_:1})]),_t,g("span",null,[d(n,null,{default:c(()=>[ft,f(" 前缀表示跨行解析")]),_:1})]),yt,g("span",null,[d(n,null,{default:c(()=>[bt,f(" 前缀表示逐行匹配")]),_:1})]),kt,g("span",null,[d(n,null,{default:c(()=>[vt,f(" 前缀表示忽略大小写")]),_:1})]),Ct])],64)}}},Bt=J(wt,[["__scopeId","data-v-35b7188a"]]),Ut=1e3,Ce=D(localStorage.getItem("remoteIp")),U=$e.create({timeout:120*Ut});U.interceptors.request.use(e=>(e.baseURL=ae(),e));const Bo=e=>{Ce.value=e,localStorage.setItem("remoteIp",e)},ae=()=>Ce.value||location.origin,we=()=>{const{hostname:e,port:t}=new URL(ae());return`${e}:${Number(t)+1}`},xt=/source/i.test(location.href),Et=e=>{throw xt&&w({message:"后端错误,检查网络或者阅读app",type:"error"}),e};U.interceptors.response.use(e=>e,Et);const It=()=>U.get("/getReadConfig"),Vt=e=>U.post("/saveReadConfig",e),Tt=e=>U.post("/saveBookProgress",e),Nt=e=>{e&&navigator.sendBeacon(`${ae()}/saveBookProgress`,JSON.stringify(e))},$t=()=>U.get("/getBookshelf"),Rt=e=>U.get("/getChapterList?url="+encodeURIComponent(e)),Lt=(e,t)=>U.get("/getBookContent?url="+encodeURIComponent(e)+"&index="+t),Ot=(e,t,o)=>{const r=`ws://${we()}/searchBook`,n=new WebSocket(r);n.onopen=()=>{n.send(`{"key":"${e}"}`)},n.onmessage=({data:l})=>t(l),n.onclose=()=>{o()}},Pt=e=>U.post("/saveBook",e),Dt=e=>U.post("/deleteBook",e),Q=/bookSource/i.test(location.href),Jt=()=>Q?U.get("/getBookSources"):U.get("/getRssSources"),At=e=>Q?U.post("/saveBookSource",e):U.post("/saveRssSource",e),jt=e=>Q?U.post("/saveBookSources",e):U.post("/saveRssSources",e),Kt=e=>Q?U.post("/deleteBookSources",e):U.post("/deleteRssSources",e),Ht=(e,t,o,r)=>{const n=`ws://${we()}/${Q?"bookSource":"rssSource"}Debug`,l=new WebSocket(n);l.onopen=()=>{l.send(JSON.stringify({tag:e,key:t}))},l.onmessage=({data:i})=>o(i),l.onclose=()=>{w({message:"调试已关闭!",type:"info"}),r()}},K={getReadConfig:It,saveReadConfig:Vt,saveBookProgress:Tt,saveBookProgressWithBeacon:Nt,getBookShelf:$t,getChapterList:Rt,getBookContent:Lt,search:Ot,saveBook:Pt,deleteBook:Dt,getSources:Jt,saveSources:jt,saveSource:At,deleteSource:Kt,debug:Ht},z=e=>e==null||e.length===0||/^\s+$/.test(e),ce=e=>"bookSourceName"in e,Mt=e=>ce(e)?!z(e.bookSourceName)&&!z(e.bookSourceUrl)&&!z(e.bookSourceType):!z(e.sourceName)&&!z(e.sourceName),ee=e=>ce(e)?e.bookSourceUrl:e.sourceUrl,qt=(e,t)=>{var o,r,n,l,i,b,p,k;return ce(e)?(((o=e.bookSourceName)==null?void 0:o.includes(t))||((r=e.bookSourceUrl)==null?void 0:r.includes(t))||((n=e.bookSourceGroup)==null?void 0:n.includes(t))||((l=e.bookSourceComment)==null?void 0:l.includes(t)))??!1:(((i=e.sourceName)==null?void 0:i.includes(t))||((b=e.sourceUrl)==null?void 0:b.includes(t))||((p=e.sourceGroup)==null?void 0:p.includes(t))||((k=e.sourceComment)==null?void 0:k.includes(t)))??!1},re=e=>{const t=new Map;return e.forEach(o=>t.set(ee(o),o)),t},Ft={ruleSearch:{},ruleBookInfo:{},ruleToc:{},ruleContent:{},ruleReview:{},ruleExplore:{}},Wt={},F=/bookSource/i.test(location.href),pe=F?Ft:Wt,M=me("source",{state:()=>({bookSources:[],rssSources:[],savedSources:[],currentSource:pe,currentTab:localStorage.getItem("tabName")||"editTab",editTabSource:{},isDebuging:!1}),getters:{sources:e=>F?e.bookSources:e.rssSources,sourcesMap:e=>re(e.sources),savedSourcesMap:e=>re(e.savedSources),currentSourceUrl:e=>F?e.currentSource.bookSourceUrl:e.currentSource.sourceUrl,searchKey:e=>F?e.currentSource.ruleSearch.checkKeyWord||"我的":null},actions:{startDebug(){this.currentTab="editDebug",this.isDebuging=!0},debugFinish(){this.isDebuging=!1},saveSources(e){F?this.bookSources=e:this.rssSources=e},setPushReturnSources(e){this.savedSources=e},deleteSources(e){let t=F?this.bookSources:this.rssSources;e.forEach(o=>{let r=t.indexOf(o);r>-1&&t.splice(r,1)})},saveCurrentSource(){let e=this.currentSource,t=this.sourcesMap;t.set(ee(e),JSON.parse(JSON.stringify(e))),this.saveSources(Array.from(t.values()))},changeCurrentSource(e){this.currentSource=JSON.parse(JSON.stringify(e))},changeTabName(e){this.currentTab=e,localStorage.setItem("tabName",e)},changeEditTabSource(e){this.editTabSource=JSON.parse(JSON.stringify(e))},editHistory(e){let t;if(localStorage.getItem("history"))t=JSON.parse(localStorage.getItem("history")),t.new.push(e),t.new.length>50&&t.new.shift(),t.old.length>50&&t.old.shift(),localStorage.setItem("history",JSON.stringify(t));else{const o={new:[e],old:[]};localStorage.setItem("history",JSON.stringify(o))}},editHistoryUndo(){if(localStorage.getItem("history")){let e=JSON.parse(localStorage.getItem("history"));e.old.push(this.currentSource),e.new.length&&(this.currentSource=e.new.pop()),localStorage.setItem("history",JSON.stringify(e))}},clearAllHistory(){localStorage.setItem("history",JSON.stringify({new:[],old:[]}))},clearEdit(){this.editTabSource={},this.currentSource=pe},clearAllSource(){this.bookSources=[],this.rssSources=[],this.savedSources=[]}}}),zt={__name:"SourceItem",props:["source"],setup(e){const t=e,o=M(),{savedSourcesMap:r,currentSourceUrl:n}=Y(o),l=G(()=>ee(t.source)),i=p=>{o.changeCurrentSource(p)},b=G(()=>{const p=r.value;return p.size==0?!1:!p.has(l.value)});return(p,k)=>{const V=ie,E=Re;return u(),C(E,{size:"large",border:"",label:s(l),class:_e({error:s(b),edit:s(l)==s(n)})},{default:c(()=>[f(X(e.source.bookSourceName||e.source.sourceName)+" ",1),d(V,{text:"",icon:s(Se),onClick:k[0]||(k[0]=_=>i(e.source))},null,8,["icon"])]),_:1},8,["label","class"])}}},Gt=J(zt,[["__scopeId","data-v-830cee5a"]]),Qt={class:"tool"},Xt={__name:"SourceList",setup(e){const t=M(),o=D([]),r=D(""),{sources:n,sourcesMap:l}=Y(t),i=G(()=>{const a=r.value;return a===""?n.value:n.value.filter(y=>qt(y,a))}),b=G(()=>{const a=o.value;if(a.length==0)return[];const y=r.value==""?l.value:re(i.value);return a.reduce((I,v)=>{const T=y.get(v);return T&&I.push(T),I},[])}),p=()=>{const a=b.value;K.deleteSource(a).then(({data:y})=>{if(!y.isSuccess)return w.error(y.errorMsg);t.deleteSources(a);const I=De(o.value);a.forEach(v=>{const T=I.indexOf(ee(v));T>-1&&I.splice(T,1)}),o.value=I})},k=()=>{t.clearAllSource(),o.value=[]},V=()=>{const a=document.createElement("input");a.type="file",a.accept=".json,.txt",a.addEventListener("change",y=>{const I=y.target.files[0];var v=new FileReader;v.readAsText(I),v.onload=()=>{try{const T=JSON.parse(v.result);t.saveSources(T)}catch{w({message:"上传的源格式错误",type:"error"})}}}),a.click()},E=/bookSource/.test(window.location.href),_=()=>{const a=document.createElement("a");let y=o.value.length===0?i.value:b.value,I=E?"BookSource":"RssSource";a.download=`${I}_${Date().replace(/.*?\s(\d+)\s(\d+)\s(\d+:\d+:\d+).*/,"$2$1$3").replace(/:/g,"")}.json`;let v=new Blob([JSON.stringify(y,null,4)],{type:"application/json"});a.href=window.URL.createObjectURL(v),a.click()};return(a,y)=>{const I=Z,v=ie,T=Je;return u(),x(P,null,[d(I,{modelValue:s(r),"onUpdate:modelValue":y[0]||(y[0]=N=>H(r)?r.value=N:null),class:"search","prefix-icon":s(fe),placeholder:"筛选源"},null,8,["modelValue","prefix-icon"]),g("div",Qt,[d(v,{onClick:V,icon:s(Le)},{default:c(()=>[f("打开")]),_:1},8,["icon"]),d(v,{disabled:s(i).length===0,onClick:_,icon:s(Oe)},{default:c(()=>[f(" 导出")]),_:1},8,["disabled","icon"]),d(v,{type:"danger",icon:s(ue),onClick:p,disabled:s(b).length===0},{default:c(()=>[f("删除")]),_:1},8,["icon","disabled"]),d(v,{type:"danger",icon:s(ue),onClick:k,disabled:s(n).length===0},{default:c(()=>[f("清空")]),_:1},8,["icon","disabled"])]),d(T,{id:"source-list",modelValue:s(o),"onUpdate:modelValue":y[1]||(y[1]=N=>H(o)?o.value=N:null)},{default:c(()=>[d(s(Pe),{style:{height:"100%","overflow-y":"auto","overflow-x":"hidden"},"data-key":N=>N.bookSourceUrl||N.sourceUrl,"data-sources":s(i),"data-component":Gt,"estimate-size":45},null,8,["data-key","data-sources"])]),_:1},8,["modelValue"])],64)}}},Yt=J(Xt,[["__scopeId","data-v-cd1572ca"]]),Zt={__name:"SourceDebug",setup(e){const t=M(),o=D(""),r=D("");ye(()=>t.isDebuging,()=>{t.isDebuging&&l()});const n=b=>{let p=document.querySelector("#debug-text");p.scrollTop=p.scrollHeight,o.value+=b+` -`},l=async()=>{o.value="";try{await K.saveSource(t.currentSource)}catch(b){throw t.debugFinish(),b}K.debug(t.currentSourceUrl,r.value||t.searchKey,n,t.debugFinish)},i=G(()=>/bookSource/.test(window.location.href));return(b,p)=>{const k=Z;return u(),x(P,null,[s(i)?(u(),C(k,{key:0,id:"debug-key",modelValue:s(r),"onUpdate:modelValue":p[0]||(p[0]=V=>H(r)?r.value=V:null),placeholder:"搜索书名、作者","prefix-icon":s(fe),style:{"padding-bottom":"4px"},onKeydown:Ae(l,["enter"])},null,8,["modelValue","prefix-icon"])):R("",!0),d(k,{id:"debug-text",modelValue:s(o),"onUpdate:modelValue":p[1]||(p[1]=V=>H(o)?o.value=V:null),type:"textarea",readonly:"",rows:"29",placeholder:"这里用于输出调试信息"},null,8,["modelValue"])],64)}}},eo=J(Zt,[["__scopeId","data-v-97ed449e"]]),Uo=me("book",{state:()=>({connectStatus:"正在连接后端服务器……",connectType:"",newConnect:!0,searchBooks:[],shelf:[],catalog:[],readingBook:{index:0,chapterPos:0},popCataVisible:!1,contentLoading:!0,showContent:!1,config:{theme:0,font:0,fontSize:18,readWidth:800,infiniteLoading:!1,customFontName:"",jumpDuration:1e3,spacing:{paragraph:1,line:.8,letter:0}},miniInterface:!1,readSettingsVisible:!1}),getters:{bookProgress:e=>{var i;if(e.catalog.length==0)return;const{index:t,chapterPos:o,bookName:r,bookAuthor:n}=e.readingBook;let l=(i=e.catalog[t])==null?void 0:i.title;if(l)return{name:r,author:n,durChapterIndex:t,durChapterPos:o,durChapterTime:new Date().getTime(),durChapterTitle:l}}},actions:{setConnectStatus(e){this.connectStatus=e},setConnectType(e){this.connectType=e},resetConnect(){this.connectStatus="正在连接后端服务器……",this.connectType="",this.clearBooks()},setNewConnect(e){this.newConnect=e},addBooks(e){this.shelf=e},clearBooks(){this.shelf=[]},setCatalog(e){this.catalog=e},setPopCataVisible(e){this.popCataVisible=e},setContentLoading(e){this.contentLoading=e},setReadingBook(e){this.readingBook=e},setConfig(e){Object.assign(this.config,e)},setReadSettingsVisible(e){this.readSettingsVisible=e},setShowContent(e){this.showContent=e},setMiniInterface(e){this.miniInterface=e},async setSearchBooks(e){e.forEach(t=>{this.shelf.find(r=>r.bookUrl==t.bookUrl)===void 0&&this.searchBooks.push(t)})},clearSearchBooks(){this.searchBooks=[]},async saveBookProgress(){return this.bookProgress?K.saveBookProgress(this.bookProgress):Promise.resolve()}}}),to=je(),oo={__name:"SourceJson",setup(e){const t=M(),o=D(""),r=async n=>{try{t.changeEditTabSource(JSON.parse(n))}catch{w({message:"粘贴的源格式错误",type:"error"})}};return Ke(async()=>{let n=t.editTabSource;Object.keys(n).length>0?o.value=JSON.stringify(n,null,4):o.value=""}),(n,l)=>{const i=Z;return u(),C(i,{id:"source-json",modelValue:s(o),"onUpdate:modelValue":l[0]||(l[0]=b=>H(o)?o.value=b:null),type:"textarea",placeholder:"这里输出序列化的JSON数据,可直接导入'阅读'APP",rows:"30",onChange:r,style:{"margin-bottom":"4px"}},null,8,["modelValue"])}}},no=J(oo,[["__scopeId","data-v-7e91a802"]]),ro={__name:"SourceTabTools",setup(e){const t=M(),{currentTab:o}=Y(t),r=D([["editTab","编辑源"],["editDebug","调试源"],["editList","源列表"],["editHelp","帮助信息"]]);return(n,l)=>{const i=no,b=eo,p=Yt,k=Bt,V=be,E=ke;return u(),C(E,{modelValue:s(o),"onUpdate:modelValue":l[0]||(l[0]=_=>H(o)?o.value=_:null)},{default:c(()=>[(u(!0),x(P,null,j(s(r),(_,a)=>(u(),C(V,{key:_[0],name:_[0],label:_[1]},{default:c(()=>[a==0?(u(),C(i,{key:0})):R("",!0),a==1?(u(),C(b,{key:1})):R("",!0),a==2?(u(),C(p,{key:2})):R("",!0),a==3?(u(),C(k,{key:3})):R("",!0)]),_:2},1032,["name","label"]))),128))]),_:1},8,["modelValue"])}}},so=J(ro,[["__scopeId","data-v-dcce2457"]]),lo={class:"menu flex-column-center"},io={class:"hotkeys-header flex-space-between"},ao=["id"],co={key:0},uo={class:"hotkeys-settings flex-column-center"},po={class:"title"},ho={class:"hotkeys-item__content"},go={key:0},mo={key:0},So={__name:"ToolBar",setup(e){const t=M(),o=()=>{const m=w({message:"加载中……",showClose:!0,duration:0});K.getSources().then(({data:S})=>{S.isSuccess?(t.changeTabName("editList"),t.saveSources(S.data),w({message:`成功拉取${S.data.length}条源`,type:"success"})):w({message:S.errorMsg??"后端错误",type:"error"})}).finally(()=>m.close())},r=()=>{let m=t.sources;if(t.changeTabName("editList"),m.length===0)return w({message:"空空如也",type:"info"});w({message:"正在推送中",type:"info"}),K.saveSources(m).then(({data:S})=>{if(S.isSuccess){let h=S.data;if(Array.isArray(h)){let A="";m.length>h.length&&(A=` -推送失败的源将用红色字体标注!`,t.setPushReturnSources(h)),w({message:`批量推送源到「阅读3.0APP」 -共计: ${m.length} 条 -成功: ${h.length} 条 -失败: ${m.length-h.length} 条${A}`,type:"success"})}}else w({message:`批量推送源失败! -ErrorMsg: ${S.errorMsg}`,type:"error"})})},n=()=>{t.changeTabName("editTab"),t.changeEditTabSource(t.currentSource)},l=()=>{t.changeCurrentSource(t.editTabSource)},i=()=>{t.editHistoryUndo()},b=()=>{t.clearEdit(),w({message:"已清除",type:"success"})},p=()=>{t.clearEdit(),t.clearAllHistory(),w({message:"已清除所有历史记录",type:"success"})},k=()=>{let m=/bookSource/.test(location.href),S=t.currentSource;Mt(S)?K.saveSource(S).then(({data:h})=>{h.isSuccess?(w({message:`源《${m?S.bookSourceName:S.sourceName}》已成功保存到「阅读3.0APP」`,type:"success"}),t.saveCurrentSource()):w({message:`源《${m?S.bookSourceName:S.sourceName}》保存失败! -ErrorMsg: ${h.errorMsg}`,type:"error"})}):w({message:"请检查<必填>项是否全部填写",type:"error"})},V=()=>{t.startDebug()},E=D(Array.of({name:"⇈推送源",hotKeys:[],action:r},{name:"⇊拉取源",hotKeys:[],action:o},{name:"⋙生成源",hotKeys:[],action:n},{name:"⋘编辑源",hotKeys:[],action:l},{name:"✗清空表单",hotKeys:[],action:b},{name:"↶撤销操作",hotKeys:[],action:i},{name:"↷重做操作",hotKeys:[],action:p},{name:"⇏调试源",hotKeys:[],action:V},{name:"✓保存源",hotKeys:[],action:k})),_=D(!0),a=D(!1),y=D(-1),I=()=>{a.value||(_.value=!1),a.value=!1};ye(_,m=>{if(!m){q.unbind("*"),W(),N();return}W(),q.unbind(),q("*",S=>{S.preventDefault();let h=q.getPressedKeyString();h.length==1&&h[0]=="esc"||a.value&&y.value>-1&&(E.value[y.value].hotKeys=h)})},{immediate:!0});const v=m=>{a.value=!0,w({message:"按ESC键或者点击空白处结束录入",type:"info"}),E.value[m].hotKeys=[],y.value=m},T=()=>{const m=[];E.value.forEach(({hotKeys:S})=>{m.push(S)}),L(m),_.value=!1},N=()=>{q.filter=()=>!0,E.value.forEach(({hotKeys:m,action:S})=>{m.length!=0&&q(m.join("+"),h=>{h.preventDefault(),S.call(null)})})},L=m=>{localStorage.setItem("legado_web_hotkeys",JSON.stringify(m))};function W(){try{const m=JSON.parse(localStorage.getItem("legado_web_hotkeys"));return!Array.isArray(m)||m.length==0?!1:(E.value.forEach((S,h)=>S.hotKeys=m[h]),!0)}catch{w({message:"快捷键配置错误",type:"error"}),localStorage.removeItem("legado_web_hotkeys")}return!1}return He(()=>{W()&&(_.value=!1)}),(m,S)=>{const h=ie,A=ge,xe=qe;return u(),x(P,null,[g("div",lo,[(u(!0),x(P,null,j(s(E),$=>(u(),C(h,{size:"large",key:$.name,onClick:$.action},{default:c(()=>[f(X($.name),1)]),_:2},1032,["onClick"]))),128)),d(h,{size:"large",onClick:S[0]||(S[0]=()=>_.value=!0)},{default:c(()=>[f("快捷键")]),_:1})]),d(xe,{modelValue:s(_),"onUpdate:modelValue":S[1]||(S[1]=$=>H(_)?_.value=$:null),"show-close":!1,"before-close":I},{header:c(({titleClass:$,titleId:te})=>[g("div",io,[g("div",{id:te,class:_e($)},[f(" 快捷键设置 "),s(a)?(u(),x("span",co,[d(A,null,{default:c(()=>[f(" / 录入中 ")]),_:1})])):R("",!0)],10,ao),d(h,{disabled:s(a),onClick:T,icon:s(Me)},{default:c(()=>[f("保存")]),_:1},8,["disabled","icon"])])]),default:c(()=>[g("div",uo,[(u(!0),x(P,null,j(s(E),($,te)=>(u(),x("div",{key:$.name,class:"hotkeys-item flex-space-between"},[g("span",po,[d(A,null,{default:c(()=>[f(X($.name),1)]),_:2},1024)]),g("div",ho,[(u(!0),x(P,null,j($.hotKeys,(oe,Ee)=>(u(),x("div",{key:oe},[g("kbd",null,X(oe),1),Ee+1<$.hotKeys.length?(u(),x("span",go,[d(A,null,{default:c(()=>[f("+")]),_:1})])):R("",!0)]))),128)),$.hotKeys.length==0?(u(),x("span",mo,"未设置")):R("",!0)]),d(h,{disabled:s(a),text:"",icon:s(Se),onClick:oe=>v(te)},{default:c(()=>[f("编辑")]),_:2},1032,["disabled","icon","onClick"])]))),128))])]),_:1},8,["modelValue"])],64)}}},_o=J(So,[["__scopeId","data-v-9fd45dad"]]),fo={__name:"SourceTabForm",props:["config"],setup(e){const t=M(),{currentSource:o}=Y(t);return(r,n)=>{const l=Z,i=Fe,b=We,p=ze,k=Ge,V=Qe,E=Xe,_=be,a=ke;return u(),C(a,{id:"source-edit"},{default:c(()=>[(u(!0),x(P,null,j(Object.values(e.config),({name:y,children:I})=>(u(),C(_,{label:y,key:y},{default:c(()=>[d(E,{"label-position":"right","label-width":"auto"},{default:c(()=>[(u(!0),x(P,null,j(I,({type:v,title:T,namespace:N,id:L,array:W,hint:m,required:S})=>(u(),C(V,{label:T,key:T,required:S},{default:c(()=>[v=="String"&&typeof N>"u"?(u(),C(l,{key:0,type:"textarea",modelValue:s(o)[L],"onUpdate:modelValue":h=>s(o)[L]=h,placeholder:m,autosize:""},null,8,["modelValue","onUpdate:modelValue","placeholder"])):R("",!0),v=="String"&&typeof N<"u"?(u(),C(l,{key:1,type:"textarea",modelValue:s(o)[N][L],"onUpdate:modelValue":h=>s(o)[N][L]=h,placeholder:m,autosize:""},null,8,["modelValue","onUpdate:modelValue","placeholder"])):R("",!0),v=="Boolean"?(u(),C(i,{key:2,modelValue:s(o)[L],"onUpdate:modelValue":h=>s(o)[L]=h},null,8,["modelValue","onUpdate:modelValue"])):R("",!0),v=="Number"?(u(),C(b,{key:3,modelValue:s(o)[L],"onUpdate:modelValue":h=>s(o)[L]=h,min:0},null,8,["modelValue","onUpdate:modelValue"])):R("",!0),v=="Array"?(u(),C(k,{key:4,modelValue:s(o)[L],"onUpdate:modelValue":h=>s(o)[L]=h},{default:c(()=>[(u(!0),x(P,null,j(W,(h,A)=>(u(),C(p,{value:A,key:h,label:h},null,8,["value","label"]))),128))]),_:2},1032,["modelValue","onUpdate:modelValue"])):R("",!0)]),_:2},1032,["label","required"]))),128))]),_:2},1024)]),_:2},1032,["label"]))),128))]),_:1})}}},yo=J(fo,[["__scopeId","data-v-bced2b97"]]),bo={base:{name:"基础",children:[{title:"源类型",id:"bookSourceType",type:"Array",array:["文本","音频","图片","文件"],required:!0},{title:"源域名",id:"bookSourceUrl",type:"String",hint:"通常填写网站主页,例: https://www.qidian.com",required:!0},{title:"源名称",id:"bookSourceName",type:"String",hint:"会显示在源列表",required:!0},{title:"源分组",id:"bookSourceGroup",type:"String",hint:"描述源的特征信息"},{title:"源注释",id:"bookSourceComment",type:"String",hint:"描述源作者和状态"},{title:"登录地址",id:"loginUrl",type:"String",hint:"填写网站登录网址,仅在需要登录的源有用"},{title:"登录界面",id:"loginUi",type:"String",hint:"自定义登录界面"},{title:"登录检测",id:"loginCheckJs",type:"String",hint:"登录检测js"},{title:"封面解密",id:"coverDecodeJs",type:"String",hint:"封面解密js"},{title:"链接验证",id:"bookUrlPattern",type:"String",hint:"书籍URL正则,当详情页URL与源URL的域名不一致时有效,用于添加网址"},{title:"请求头",id:"header",type:"String",hint:"客户端标识"},{title:"变量说明",id:"variableComment",type:"String",hint:"书源变量说明"},{title:"并发率",id:"concurrentRate",type:"String",hint:"并发率,如1000(访问间隔1000ms)或者1/1000(1000ms内访问1次)"},{title:"js库",id:"jsLib",type:"String",hint:"js库, 可填写js或者key-value object获取在线js文件"}]},search:{name:"搜索",children:[{title:"搜索地址",id:"searchUrl",type:"String",hint:"[域名可省略]/search.php@kw={{key}}"},{title:"校验文字",namespace:"ruleSearch",id:"checkKeyWord",type:"String",hint:"校验关键字,强烈建议填写"},{title:"列表规则",namespace:"ruleSearch",id:"bookList",type:"String",hint:"选择书籍节点 (规则结果为List)"},{title:"书名规则",namespace:"ruleSearch",id:"name",type:"String",hint:"选择节点书名 (规则结果为String)"},{title:"作者规则",namespace:"ruleSearch",id:"author",type:"String",hint:"选择节点作者 (规则结果为String)"},{title:"分类规则",namespace:"ruleSearch",id:"kind",type:"String",hint:"选择节点分类信息 (规则结果为String)"},{title:"字数规则",namespace:"ruleSearch",id:"wordCount",type:"String",hint:"选择节点字数信息 (规则结果为String)"},{title:"最新章节",namespace:"ruleSearch",id:"lastChapter",type:"String",hint:"选择节点最新章节 (规则结果为String)"},{title:"简介规则",namespace:"ruleSearch",id:"intro",type:"String",hint:"选择节点书籍简介 (规则结果为String)"},{title:"封面规则",namespace:"ruleSearch",id:"coverUrl",type:"String",hint:"选择节点书籍封面 (规则结果为String类型的url)"},{title:"详情地址",namespace:"ruleSearch",id:"bookUrl",type:"String",hint:"选择书籍详情页网址 (规则结果为String类型的url)"}]},find:{name:"发现",children:[{title:"发现地址",id:"exploreUrl",type:"String",hint:"单个发现格式::或者{url:,title:,style:...};前者用换行符或者&&连接,后者放在数组内;可用js动态生成"},{title:"列表规则",namespace:"ruleExplore",id:"bookList",type:"String",hint:"选择书籍节点 (规则结果为List)"},{title:"书名规则",namespace:"ruleExplore",id:"name",type:"String",hint:"选择节点书名 (规则结果为String)"},{title:"作者规则",namespace:"ruleExplore",id:"author",type:"String",hint:"选择节点作者 (规则结果为String)"},{title:"分类规则",namespace:"ruleExplore",id:"kind",type:"String",hint:"选择节点分类信息 (规则结果为String)"},{title:"字数规则",namespace:"ruleExplore",id:"wordCount",type:"String",hint:"选择节点字数信息 (规则结果为String)"},{title:"最新章节",namespace:"ruleExplore",id:"lastChapter",type:"String",hint:"选择节点最新章节 (规则结果为String)"},{title:"简介规则",namespace:"ruleExplore",id:"intro",type:"String",hint:"选择节点书籍简介 (规则结果为String)"},{title:"封面规则",namespace:"ruleExplore",id:"coverUrl",type:"String",hint:"选择节点书籍封面 (规则结果为String类型的url)"},{title:"详情地址",namespace:"ruleExplore",id:"bookUrl",type:"String",hint:"选择书籍详情页网址 (规则结果为String类型的url)"}]},detail:{name:"详情",children:[{title:"预处理",namespace:"ruleBookInfo",id:"init",type:"String",hint:"用于加速详情信息检索,只支持AllInOne规则"},{title:"书名规则",namespace:"ruleBookInfo",id:"name",type:"String",hint:"选择节点书名 (规则结果为String)"},{title:"作者规则",namespace:"ruleBookInfo",id:"author",type:"String",hint:"选择节点作者 (规则结果为String)"},{title:"分类规则",namespace:"ruleBookInfo",id:"kind",type:"String",hint:"选择节点分类信息 (规则结果为String)"},{title:"字数规则",namespace:"ruleBookInfo",id:"wordCount",type:"String",hint:"选择节点字数信息 (规则结果为String)"},{title:"最新章节",namespace:"ruleBookInfo",id:"lastChapter",type:"String",hint:"选择节点最新章节 (规则结果为String)"},{title:"简介规则",namespace:"ruleBookInfo",id:"intro",type:"String",hint:"选择节点书籍简介 (规则结果为String)"},{title:"封面规则",namespace:"ruleBookInfo",id:"coverUrl",type:"String",hint:"选择节点书籍封面 (规则结果为String类型的url)"},{title:"目录地址",namespace:"ruleBookInfo",id:"tocUrl",type:"String",hint:"选择书籍详情页网址 (规则结果为String类型的url, 与详情页相同时可省略)"},{title:"修改书籍",namespace:"ruleBookInfo",id:"canReName",type:"String",hint:"允许修改书名作者(规则结果为String类型, 默认不允许)"},{title:"下载URL",namespace:"ruleBookInfo",id:"downloadUrls",type:"String",hint:"文件类书源下载地址 (规则结果为String类型的url, 多个链接返回数组)"}]},directory:{name:"目录",children:[{title:"更新前JS",namespace:"ruleToc",id:"preUpdateJs",type:"String",hint:"更新目录前调用JS 动态更新目录链接"},{title:"列表规则",namespace:"ruleToc",id:"chapterList",type:"String",hint:"选择目录列表的章节节点 (规则结果为List)"},{title:"章节名称",namespace:"ruleToc",id:"chapterName",type:"String",hint:"选择章节名称 (规则结果为String)"},{title:"章节地址",namespace:"ruleToc",id:"chapterUrl",type:"String",hint:"选择章节链接 (规则结果为String类型的Url)"},{title:"标题处理",namespace:"ruleToc",id:"formatJs",type:"String",hint:"遍历去重后的章节列表的回调,提供index(章节序号从1开始)、title(章节标题)变量,额外提供gInt(初始值0),返回值作为新的标题"},{title:"卷名标识",namespace:"ruleToc",id:"isVolume",type:"String",hint:"章节名称是否是卷名 (规则结果为Bool)"},{title:"章节信息",namespace:"ruleToc",id:"updateTime",type:"String",hint:"选择章节信息(如更新时间) (规则结果为String)"},{title:"收费标识",namespace:"ruleToc",id:"isVip",type:"String",hint:"章节是否为VIP章节 (规则结果为Bool)"},{title:"购买标识",namespace:"ruleToc",id:"isPay",type:"String",hint:"章节是否为已购买 (规则结果为Bool)"},{title:"翻页规则",namespace:"ruleToc",id:"nextTocUrl",type:"String",hint:"选择目录下一页链接 (规则结果为List或String)"}]},content:{name:"正文",children:[{title:"正文规则",namespace:"ruleContent",id:"content",type:"String",hint:"选择正文内容 (规则结果为String)"},{title:"标题规则",namespace:"ruleContent",id:"title",type:"String",hint:"获取结果将会覆盖章节标题 (规则结果为String)"},{title:"翻页规则",namespace:"ruleContent",id:"nextContentUrl",type:"String",hint:"选择下一分页(不是下一章)链接 (规则结果为String类型的Url)"},{title:"脚本注入",namespace:"ruleContent",id:"webJs",type:"String",hint:"注入javascript,用于模拟鼠标点击等,必须有返回值,一般为String类型"},{title:"资源正则",namespace:"ruleContent",id:"sourceRegex",type:"String",hint:"匹配资源的url特征,用于嗅探"},{title:"替换规则",namespace:"ruleContent",id:"replaceRegex",type:"String",hint:"多页内容合并后替换,用于正文净化"},{title:"图片样式",namespace:"ruleContent",id:"imageStyle",type:"String",hint:"FULL:铺满 不填:默认样式"},{title:"图片解密",namespace:"ruleContent",id:"imageDecode",type:"String",hint:"填写JavaScript 返回解密图片的bytes "},{title:"购买操作",namespace:"ruleContent",id:"payAction",type:"String",hint:"填写JavaScript 返回购买链接或者调用购买接口"}]},other:{name:"其他",children:[{title:"启用搜索",id:"enabled",type:"Boolean"},{title:"启用发现",id:"enabledExplore",type:"Boolean"},{title:"CookieJar",id:"enabledCookieJar",type:"Boolean"},{title:"搜索权重",id:"weight",type:"Number"},{title:"排序编号",id:"customOrder",type:"Number"}]}},ko={base:{name:"基础",children:[{title:"源域名",id:"sourceUrl",type:"String",hint:"通常填写网站主页,例: https://www.qidian.com",required:!0},{title:"图标",id:"sourceIcon",type:"String",hint:"填写图片网络链接"},{title:"源名称",id:"sourceName",type:"String",hint:"会显示在源列表",required:!0},{title:"源分组",id:"sourceGroup",type:"String",hint:"描述源的特征信息"},{title:"源注释",id:"sourceComment",type:"String",hint:"描述源作者和状态"},{title:"分类地址",id:"sortUrl",type:"String",hint:`名称1::链接1 -名称2::链接2`},{title:"登录地址",id:"loginUrl",type:"String",hint:"填写网站登录网址,仅在需要登录的源有用"},{title:"登录界面",id:"loginUi",type:"String",hint:"自定义登录界面"},{title:"登录检测",id:"loginCheckJs",type:"String",hint:"登录检测js"},{title:"封面解密",id:"coverDecodeJs",type:"String",hint:"封面解密js"},{title:"请求头",id:"header",type:"String",hint:"客户端标识"},{title:"变量说明",id:"variableComment",type:"String",hint:"源变量说明"},{title:"并发率",id:"concurrentRate",type:"String",hint:"并发率"}]},list:{name:"列表",children:[{title:"列表规则",id:"ruleArticles",type:"String",hint:"规则结果为List"},{title:"翻页规则",id:"ruleNextPage",type:"String",hint:"下一页链接 规则结果为List或String"},{title:"标题规则",id:"ruleTitle",type:"String",hint:"文章标题 规则结果为String"},{title:"时间规则",id:"rulePubDate",type:"String",hint:"文章发布时间 规则结果为String"},{title:"描述规则",id:"ruleDescription",type:"String",hint:"文章简要描述 规则结果为String"},{title:"图片规则",id:"ruleImage",type:"String",hint:"文章图片链接 规则结果为String"},{title:"链接规则",id:"ruleLink",type:"String",hint:"文章链接 规则结果为String"}]},webView:{name:"WebView",children:[{title:"内容规则",id:"ruleContent",type:"String",hint:"文章正文"},{title:"样式规则",id:"style",type:"String",hint:"文章正文样式 填写css"},{title:"注入规则",id:"injectJs",type:"String",hint:"注入网页的JavaScript"},{title:"黑名单",id:"contentBlacklist",type:"String",hint:"webView链接加载黑名单,英文逗号隔开"},{title:"白名单",id:"contentWhitelist",type:"String",hint:"webView链接加载白名单,英文逗号隔开"},{title:"链接拦截",id:"shouldOverrideUrlLoading",type:"String",hint:"填写js,变量url为当前资源链接,返回true拦截"}]},other:{name:"其他",children:[{title:"列表样式",id:"articleStyle",type:"Array",array:["默认","大图","双列"]},{title:"加载地址",id:"loadWithBaseUrl",type:"Boolean"},{title:"启用JS",id:"enableJs",type:"Boolean"},{title:"启用",id:"enabled",type:"Boolean"},{title:"Cookie",id:"enabledCookieJar",type:"Boolean"},{title:"单URL",id:"singleUrl",type:"Boolean"},{title:"排序编号",id:"customOrder",type:"Number"}]}},vo={class:"editor"},Co={__name:"SourceEditor",setup(e){let t;return/bookSource/i.test(location.href)?(t=bo,document.title="书源管理"):(t=ko,document.title="订阅源管理"),(o,r)=>{const n=yo,l=_o,i=so;return u(),x("div",vo,[d(n,{class:"left",config:s(t)},null,8,["config"]),d(l),d(i,{class:"right"})])}}},he=J(Co,[["__scopeId","data-v-5fe2b79d"]]),Be=[{path:"/bookSource",name:"book-home",component:he},{path:"/rssSource",name:"rss-home",component:he}];se({history:le(),routes:Be});const Ue=se({history:le(),routes:ve.concat(Be)});Ue.afterEach(e=>{e.name=="shelf"&&(document.title="书架")});Ye(nt).use(to).use(Ue).mount("#app");ne(()=>import("./config-MMLbq8EV.js"),__vite__mapDeps([8,1,2,9]),import.meta.url);export{K as A,J as _,ae as b,Bo as s,Uo as u}; diff --git a/app/src/main/assets/web/vue/assets/loading--qckEkbY.js b/app/src/main/assets/web/vue/assets/loading--qckEkbY.js new file mode 100644 index 000000000000..5d1cd17acdb4 --- /dev/null +++ b/app/src/main/assets/web/vue/assets/loading--qckEkbY.js @@ -0,0 +1 @@ +import{y as L,u as D,i as v,I as y,a5 as Y,ad as b}from"./vendor-UVL3l2rb.js";import{b as k}from"./index-CyZ_tLuT.js";import{u as H}from"./bookStore-O1g6rLjj.js";function W(t){return typeof t=="function"?t():D(t)}typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const w=()=>{};function T(t,r){function e(...o){return new Promise((a,l)=>{Promise.resolve(t(()=>r.apply(this,o),{fn:r,thisArg:this,args:o})).then(a).catch(l)})}return e}function $(...t){let r=0,e,o=!0,a=w,l,i,s,n,c;!L(t[0])&&typeof t[0]=="object"?{delay:i,trailing:s=!0,leading:n=!0,rejectOnCancel:c=!1}=t[0]:[i,s=!0,n=!0,c=!1]=t;const p=()=>{e&&(clearTimeout(e),e=void 0,a(),a=w)};return d=>{const u=W(i),g=Date.now()-r,m=()=>l=d();return p(),u<=0?(r=Date.now(),m()):(g>u&&(n||!o)?(r=Date.now(),m()):s&&(l=new Promise((h,M)=>{a=c?M:h,e=setTimeout(()=>{r=Date.now(),o=!0,h(m()),p()},Math.max(0,u-g))})),!n&&!e&&(e=setTimeout(()=>o=!0,u)),o=!1,l)}}function E(t,r=200,e=!1,o=!0,a=!1){return T($(r,e,o,a),t)}const x=/[YMDHhms]o|\[([^\]]+)\]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|SSS/g;function A(t,r,e,o){let a=t<12?"AM":"PM";return o&&(a=a.split("").reduce((l,i)=>l+=`${i}.`,"")),e?a.toLowerCase():a}function f(t){const r=["th","st","nd","rd"],e=t%100;return t+(r[(e-20)%10]||r[e]||r[0])}function F(t,r,e={}){var o;const a=t.getFullYear(),l=t.getMonth(),i=t.getDate(),s=t.getHours(),n=t.getMinutes(),c=t.getSeconds(),p=t.getMilliseconds(),S=t.getDay(),d=(o=e.customMeridiem)!=null?o:A,u={Yo:()=>f(a),YY:()=>String(a).slice(-2),YYYY:()=>a,M:()=>l+1,Mo:()=>f(l+1),MM:()=>`${l+1}`.padStart(2,"0"),MMM:()=>t.toLocaleDateString(e.locales,{month:"short"}),MMMM:()=>t.toLocaleDateString(e.locales,{month:"long"}),D:()=>String(i),Do:()=>f(i),DD:()=>`${i}`.padStart(2,"0"),H:()=>String(s),Ho:()=>f(s),HH:()=>`${s}`.padStart(2,"0"),h:()=>`${s%12||12}`.padStart(1,"0"),ho:()=>f(s%12||12),hh:()=>`${s%12||12}`.padStart(2,"0"),m:()=>String(n),mo:()=>f(n),mm:()=>`${n}`.padStart(2,"0"),s:()=>String(c),so:()=>f(c),ss:()=>`${c}`.padStart(2,"0"),SSS:()=>`${p}`.padStart(3,"0"),d:()=>S,dd:()=>t.toLocaleDateString(e.locales,{weekday:"narrow"}),ddd:()=>t.toLocaleDateString(e.locales,{weekday:"short"}),dddd:()=>t.toLocaleDateString(e.locales,{weekday:"long"}),A:()=>d(s,n),AA:()=>d(s,n,!1,!0),a:()=>d(s,n,!0),aa:()=>d(s,n,!0,!0)};return r.replace(x,(g,m)=>{var h,M;return(M=m??((h=u[g])==null?void 0:h.call(u)))!=null?M:g})}const I=t=>/,\s*\{/.test(t)||!(t.startsWith("http")||t.startsWith("data:")||t.startsWith("blob:"));function V(t){return k()+"/image?path="+encodeURIComponent(t)+"&url="+encodeURIComponent(sessionStorage.getItem("bookUrl"))+"&width="+H().config.readWidth}const _=t=>{let r=new Date().getTime(),e=Math.floor((r-t)/1e3),o="";return e<=30?o="刚刚":e<60?o=e+"秒前":e<3600?o=Math.floor(e/60)+"分钟前":e<86400?o=Math.floor(e/3600)+"小时前":e<2592e3?o=Math.floor(e/86400)+"天前":o=F(new Date(t),"YYYY-MM-DD"),o},P='',j=(t,r,e=P)=>{const o=v(!1);let a=null;const l=()=>o.value=!1,i=()=>o.value=!0;y(o,n=>{if(!n)return a==null?void 0:a.close();a=b.service({target:D(t),spinner:e,text:r,lock:!0,background:"rgba(0, 0, 0, 0)"})});const s=n=>{if(!(n instanceof Promise))throw TypeError("loadingWrapper argument must be Promise");return i(),n.finally(l)};return Y(()=>{l()}),{isLoading:o,showLoading:i,closeLoading:l,loadingWrapper:s}};export{E as a,_ as d,V as g,I as i,j as u}; diff --git a/app/src/main/assets/web/vue/assets/loading-B7pvk95E.css b/app/src/main/assets/web/vue/assets/loading-B7pvk95E.css new file mode 100644 index 000000000000..dc71ba2ff29d --- /dev/null +++ b/app/src/main/assets/web/vue/assets/loading-B7pvk95E.css @@ -0,0 +1 @@ +:root{--el-loading-spinner-size:42px;--el-loading-fullscreen-spinner-size:50px}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{background-color:var(--el-mask-color);bottom:0;left:0;margin:0;position:absolute;right:0;top:0;transition:opacity var(--el-transition-duration);z-index:2000}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:calc((0px - var(--el-loading-fullscreen-spinner-size))/2)}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:var(--el-loading-fullscreen-spinner-size);width:var(--el-loading-fullscreen-spinner-size)}.el-loading-spinner{margin-top:calc((0px - var(--el-loading-spinner-size))/2);position:absolute;text-align:center;top:50%;width:100%}.el-loading-spinner .el-loading-text{color:var(--el-color-primary);font-size:14px;margin:3px 0}.el-loading-spinner .circular{animation:loading-rotate 2s linear infinite;display:inline;height:var(--el-loading-spinner-size);width:var(--el-loading-spinner-size)}.el-loading-spinner .path{animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:var(--el-color-primary);stroke-linecap:round}.el-loading-spinner i{color:var(--el-color-primary)}.el-loading-fade-enter-from,.el-loading-fade-leave-to{opacity:0}@keyframes loading-rotate{to{transform:rotate(1turn)}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-loading-spinner{font-size:36px;color:#b5b5b5}.el-loading-text{font-weight:500;color:#b5b5b5!important} diff --git a/app/src/main/assets/web/vue/assets/loading-BSPlXMjv.js b/app/src/main/assets/web/vue/assets/loading-BSPlXMjv.js deleted file mode 100644 index 6a6de99949a0..000000000000 --- a/app/src/main/assets/web/vue/assets/loading-BSPlXMjv.js +++ /dev/null @@ -1 +0,0 @@ -import{A as L,u as D,j as v,K as y,a7 as Y,af as b}from"./vendor-B4RITwN5.js";import{b as k,u as H}from"./index-DiJORxAd.js";function W(t){return typeof t=="function"?t():D(t)}typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const w=()=>{};function A(t,r){function e(...a){return new Promise((o,l)=>{Promise.resolve(t(()=>r.apply(this,a),{fn:r,thisArg:this,args:a})).then(o).catch(l)})}return e}function T(...t){let r=0,e,a=!0,o=w,l,i,s,n,c;!L(t[0])&&typeof t[0]=="object"?{delay:i,trailing:s=!0,leading:n=!0,rejectOnCancel:c=!1}=t[0]:[i,s=!0,n=!0,c=!1]=t;const p=()=>{e&&(clearTimeout(e),e=void 0,o(),o=w)};return d=>{const u=W(i),g=Date.now()-r,m=()=>l=d();return p(),u<=0?(r=Date.now(),m()):(g>u&&(n||!a)?(r=Date.now(),m()):s&&(l=new Promise((h,M)=>{o=c?M:h,e=setTimeout(()=>{r=Date.now(),a=!0,h(m()),p()},Math.max(0,u-g))})),!n&&!e&&(e=setTimeout(()=>a=!0,u)),a=!1,l)}}function C(t,r=200,e=!1,a=!0,o=!1){return A(T(r,e,a,o),t)}const $=/[YMDHhms]o|\[([^\]]+)\]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|SSS/g;function x(t,r,e,a){let o=t<12?"AM":"PM";return a&&(o=o.split("").reduce((l,i)=>l+=`${i}.`,"")),e?o.toLowerCase():o}function f(t){const r=["th","st","nd","rd"],e=t%100;return t+(r[(e-20)%10]||r[e]||r[0])}function F(t,r,e={}){var a;const o=t.getFullYear(),l=t.getMonth(),i=t.getDate(),s=t.getHours(),n=t.getMinutes(),c=t.getSeconds(),p=t.getMilliseconds(),S=t.getDay(),d=(a=e.customMeridiem)!=null?a:x,u={Yo:()=>f(o),YY:()=>String(o).slice(-2),YYYY:()=>o,M:()=>l+1,Mo:()=>f(l+1),MM:()=>`${l+1}`.padStart(2,"0"),MMM:()=>t.toLocaleDateString(e.locales,{month:"short"}),MMMM:()=>t.toLocaleDateString(e.locales,{month:"long"}),D:()=>String(i),Do:()=>f(i),DD:()=>`${i}`.padStart(2,"0"),H:()=>String(s),Ho:()=>f(s),HH:()=>`${s}`.padStart(2,"0"),h:()=>`${s%12||12}`.padStart(1,"0"),ho:()=>f(s%12||12),hh:()=>`${s%12||12}`.padStart(2,"0"),m:()=>String(n),mo:()=>f(n),mm:()=>`${n}`.padStart(2,"0"),s:()=>String(c),so:()=>f(c),ss:()=>`${c}`.padStart(2,"0"),SSS:()=>`${p}`.padStart(3,"0"),d:()=>S,dd:()=>t.toLocaleDateString(e.locales,{weekday:"narrow"}),ddd:()=>t.toLocaleDateString(e.locales,{weekday:"short"}),dddd:()=>t.toLocaleDateString(e.locales,{weekday:"long"}),A:()=>d(s,n),AA:()=>d(s,n,!1,!0),a:()=>d(s,n,!0),aa:()=>d(s,n,!0,!0)};return r.replace($,(g,m)=>{var h,M;return(M=m??((h=u[g])==null?void 0:h.call(u)))!=null?M:g})}const E=t=>/,\s*\{/.test(t)||!(t.startsWith("http")||t.startsWith("data:")||t.startsWith("blob:"));function j(t){return k()+"/image?path="+encodeURIComponent(t)+"&url="+encodeURIComponent(sessionStorage.getItem("bookUrl"))+"&width="+H().config.readWidth}const V=t=>{let r=new Date().getTime(),e=Math.floor((r-t)/1e3),a="";return e<=30?a="刚刚":e<60?a=e+"秒前":e<3600?a=Math.floor(e/60)+"分钟前":e<86400?a=Math.floor(e/3600)+"小时前":e<2592e3?a=Math.floor(e/86400)+"天前":a=F(new Date(t),"YYYY-MM-DD"),a},P='',_=(t,r,e=P)=>{const a=v(!1);let o=null;const l=()=>a.value=!1,i=()=>a.value=!0;y(a,n=>{if(!n)return o==null?void 0:o.close();o=b.service({target:D(t),spinner:e,text:r,lock:!0,background:"rgba(0, 0, 0, 0)"})});const s=n=>{if(!(n instanceof Promise))throw TypeError("loadingWrapper argument must be Promise");return i(),n.finally(l)};return Y(()=>{l()}),{isLoading:a,showLoading:i,closeLoading:l,loadingWrapper:s}};export{C as a,V as d,j as g,E as i,_ as u}; diff --git a/app/src/main/assets/web/vue/assets/loading-CBQeIji2.css b/app/src/main/assets/web/vue/assets/loading-CBQeIji2.css deleted file mode 100644 index d6dc22b312ef..000000000000 --- a/app/src/main/assets/web/vue/assets/loading-CBQeIji2.css +++ /dev/null @@ -1 +0,0 @@ -:root{--el-loading-spinner-size:42px;--el-loading-fullscreen-spinner-size:50px}.el-loading-parent--relative{position:relative!important}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{background-color:var(--el-mask-color);bottom:0;left:0;margin:0;position:absolute;right:0;top:0;transition:opacity var(--el-transition-duration);z-index:2000}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:calc((0px - var(--el-loading-fullscreen-spinner-size))/2)}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:var(--el-loading-fullscreen-spinner-size);width:var(--el-loading-fullscreen-spinner-size)}.el-loading-spinner{margin-top:calc((0px - var(--el-loading-spinner-size))/2);position:absolute;text-align:center;top:50%;width:100%}.el-loading-spinner .el-loading-text{color:var(--el-color-primary);font-size:14px;margin:3px 0}.el-loading-spinner .circular{-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite;display:inline;height:var(--el-loading-spinner-size);width:var(--el-loading-spinner-size)}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:var(--el-color-primary);stroke-linecap:round}.el-loading-spinner i{color:var(--el-color-primary)}.el-loading-fade-enter-from,.el-loading-fade-leave-to{opacity:0}@-webkit-keyframes loading-rotate{to{transform:rotate(1turn)}}@keyframes loading-rotate{to{transform:rotate(1turn)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-loading-spinner{font-size:36px;color:#b5b5b5}.el-loading-text{font-weight:500;color:#b5b5b5!important} diff --git a/app/src/main/assets/web/vue/assets/vendor-B4RITwN5.js b/app/src/main/assets/web/vue/assets/vendor-B4RITwN5.js deleted file mode 100644 index d50cc29bdfdc..000000000000 --- a/app/src/main/assets/web/vue/assets/vendor-B4RITwN5.js +++ /dev/null @@ -1,50 +0,0 @@ -/** -* @vue/shared v3.4.31 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**//*! #__NO_SIDE_EFFECTS__ */function ou(e,t){const n=new Set(e.split(","));return r=>n.has(r)}const et={},fo=[],ct=()=>{},Hg=()=>!1,Qi=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),su=e=>e.startsWith("onUpdate:"),ft=Object.assign,iu=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Kg=Object.prototype.hasOwnProperty,De=(e,t)=>Kg.call(e,t),ce=Array.isArray,po=e=>Is(e)==="[object Map]",ea=e=>Is(e)==="[object Set]",bc=e=>Is(e)==="[object Date]",ve=e=>typeof e=="function",xe=e=>typeof e=="string",xn=e=>typeof e=="symbol",Te=e=>e!==null&&typeof e=="object",$i=e=>(Te(e)||ve(e))&&ve(e.then)&&ve(e.catch),$p=Object.prototype.toString,Is=e=>$p.call(e),gi=e=>Is(e).slice(8,-1),Lp=e=>Is(e)==="[object Object]",au=e=>xe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Yo=ou(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ta=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ug=/-(\w)/g,un=ta(e=>e.replace(Ug,(t,n)=>n?n.toUpperCase():"")),qg=/\B([A-Z])/g,br=ta(e=>e.replace(qg,"-$1").toLowerCase()),$s=ta(e=>e.charAt(0).toUpperCase()+e.slice(1)),yi=ta(e=>e?`on${$s(e)}`:""),gr=(e,t)=>!Object.is(e,t),bi=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},dl=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Wg=e=>{const t=xe(e)?Number(e):NaN;return isNaN(t)?e:t};let wc;const Np=()=>wc||(wc=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ot(e){if(ce(e)){const t={};for(let n=0;n{if(n){const r=n.split(Yg);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function W(e){let t="";if(xe(e))t=e;else if(ce(e))for(let n=0;nna(n,t))}const Bp=e=>!!(e&&e.__v_isRef===!0),We=e=>xe(e)?e:e==null?"":ce(e)||Te(e)&&(e.toString===$p||!ve(e.toString))?Bp(e)?We(e.value):JSON.stringify(e,Dp,2):String(e),Dp=(e,t)=>Bp(t)?Dp(e,t.value):po(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],s)=>(n[Na(r,s)+" =>"]=o,n),{})}:ea(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Na(n))}:xn(t)?Na(t):Te(t)&&!ce(t)&&!Lp(t)?String(t):t,Na=(e,t="")=>{var n;return xn(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.4.31 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Mt;class jp{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Mt,!t&&Mt&&(this.index=(Mt.scopes||(Mt.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Mt;try{return Mt=this,t()}finally{Mt=n}}}on(){Mt=this}off(){Mt=this.parent}stop(t){if(this._active){let n,r;for(n=0,r=this.effects.length;n=4))break}this._dirtyLevel===1&&(this._dirtyLevel=0),_r()}return this._dirtyLevel>=4}set dirty(t){this._dirtyLevel=t?4:0}run(){if(this._dirtyLevel=0,!this.active)return this.fn();let t=pr,n=Fr;try{return pr=!0,Fr=this,this._runnings++,_c(this),this.fn()}finally{Sc(this),this._runnings--,Fr=n,pr=t}}stop(){this.active&&(_c(this),Sc(this),this.onStop&&this.onStop(),this.active=!1)}}function ny(e){return e.value}function _c(e){e._trackId++,e._depsLength=0}function Sc(e){if(e.deps.length>e._depsLength){for(let t=e._depsLength;t{const n=new Map;return n.cleanup=e,n.computed=t,n},Li=new WeakMap,Br=Symbol(""),vl=Symbol("");function kt(e,t,n){if(pr&&Fr){let r=Li.get(e);r||Li.set(e,r=new Map);let o=r.get(n);o||r.set(n,o=qp(()=>r.delete(n))),Kp(Fr,o)}}function jn(e,t,n,r,o,s){const i=Li.get(e);if(!i)return;let a=[];if(t==="clear")a=[...i.values()];else if(n==="length"&&ce(e)){const l=Number(r);i.forEach((u,c)=>{(c==="length"||!xn(c)&&c>=l)&&a.push(u)})}else switch(n!==void 0&&a.push(i.get(n)),t){case"add":ce(e)?au(n)&&a.push(i.get("length")):(a.push(i.get(Br)),po(e)&&a.push(i.get(vl)));break;case"delete":ce(e)||(a.push(i.get(Br)),po(e)&&a.push(i.get(vl)));break;case"set":po(e)&&a.push(i.get(Br));break}fu();for(const l of a)l&&Up(l,4);du()}function ry(e,t){const n=Li.get(e);return n&&n.get(t)}const oy=ou("__proto__,__v_isRef,__isVue"),Wp=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(xn)),Ec=sy();function sy(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const r=Le(this);for(let s=0,i=this.length;s{e[t]=function(...n){wr(),fu();const r=Le(this)[t].apply(this,n);return du(),_r(),r}}),e}function iy(e){xn(e)||(e=String(e));const t=Le(this);return kt(t,"has",e),t.hasOwnProperty(e)}class Gp{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const o=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(o?s?by:Zp:s?Xp:Jp).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=ce(t);if(!o){if(i&&De(Ec,n))return Reflect.get(Ec,n,r);if(n==="hasOwnProperty")return iy}const a=Reflect.get(t,n,r);return(xn(n)?Wp.has(n):oy(n))||(o||kt(t,"get",n),s)?a:qe(a)?i&&au(n)?a:a.value:Te(a)?o?Ls(a):Et(a):a}}class Yp extends Gp{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(!this._isShallow){const l=cs(s);if(!ki(r)&&!cs(r)&&(s=Le(s),r=Le(r)),!ce(t)&&qe(s)&&!qe(r))return l?!1:(s.value=r,!0)}const i=ce(t)&&au(n)?Number(n)e,ra=e=>Reflect.getPrototypeOf(e);function Js(e,t,n=!1,r=!1){e=e.__v_raw;const o=Le(e),s=Le(t);n||(gr(t,s)&&kt(o,"get",t),kt(o,"get",s));const{has:i}=ra(o),a=r?pu:n?yu:fs;if(i.call(o,t))return a(e.get(t));if(i.call(o,s))return a(e.get(s));e!==o&&e.get(t)}function Xs(e,t=!1){const n=this.__v_raw,r=Le(n),o=Le(e);return t||(gr(e,o)&&kt(r,"has",e),kt(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function Zs(e,t=!1){return e=e.__v_raw,!t&&kt(Le(e),"iterate",Br),Reflect.get(e,"size",e)}function Cc(e){e=Le(e);const t=Le(this);return ra(t).has.call(t,e)||(t.add(e),jn(t,"add",e,e)),this}function Oc(e,t){t=Le(t);const n=Le(this),{has:r,get:o}=ra(n);let s=r.call(n,e);s||(e=Le(e),s=r.call(n,e));const i=o.call(n,e);return n.set(e,t),s?gr(t,i)&&jn(n,"set",e,t):jn(n,"add",e,t),this}function Tc(e){const t=Le(this),{has:n,get:r}=ra(t);let o=n.call(t,e);o||(e=Le(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&jn(t,"delete",e,void 0),s}function xc(){const e=Le(this),t=e.size!==0,n=e.clear();return t&&jn(e,"clear",void 0,void 0),n}function Qs(e,t){return function(r,o){const s=this,i=s.__v_raw,a=Le(i),l=t?pu:e?yu:fs;return!e&&kt(a,"iterate",Br),i.forEach((u,c)=>r.call(o,l(u),l(c),s))}}function ei(e,t,n){return function(...r){const o=this.__v_raw,s=Le(o),i=po(s),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,u=o[e](...r),c=n?pu:t?yu:fs;return!t&&kt(s,"iterate",l?vl:Br),{next(){const{value:f,done:p}=u.next();return p?{value:f,done:p}:{value:a?[c(f[0]),c(f[1])]:c(f),done:p}},[Symbol.iterator](){return this}}}}function Jn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function fy(){const e={get(s){return Js(this,s)},get size(){return Zs(this)},has:Xs,add:Cc,set:Oc,delete:Tc,clear:xc,forEach:Qs(!1,!1)},t={get(s){return Js(this,s,!1,!0)},get size(){return Zs(this)},has:Xs,add:Cc,set:Oc,delete:Tc,clear:xc,forEach:Qs(!1,!0)},n={get(s){return Js(this,s,!0)},get size(){return Zs(this,!0)},has(s){return Xs.call(this,s,!0)},add:Jn("add"),set:Jn("set"),delete:Jn("delete"),clear:Jn("clear"),forEach:Qs(!0,!1)},r={get(s){return Js(this,s,!0,!0)},get size(){return Zs(this,!0)},has(s){return Xs.call(this,s,!0)},add:Jn("add"),set:Jn("set"),delete:Jn("delete"),clear:Jn("clear"),forEach:Qs(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=ei(s,!1,!1),n[s]=ei(s,!0,!1),t[s]=ei(s,!1,!0),r[s]=ei(s,!0,!0)}),[e,n,t,r]}const[dy,py,hy,vy]=fy();function hu(e,t){const n=t?e?vy:hy:e?py:dy;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(De(n,o)&&o in r?n:r,o,s)}const my={get:hu(!1,!1)},gy={get:hu(!1,!0)},yy={get:hu(!0,!1)};const Jp=new WeakMap,Xp=new WeakMap,Zp=new WeakMap,by=new WeakMap;function wy(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function _y(e){return e.__v_skip||!Object.isExtensible(e)?0:wy(gi(e))}function Et(e){return cs(e)?e:mu(e,!1,ly,my,Jp)}function vu(e){return mu(e,!1,cy,gy,Xp)}function Ls(e){return mu(e,!0,uy,yy,Zp)}function mu(e,t,n,r,o){if(!Te(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=_y(e);if(i===0)return e;const a=new Proxy(e,i===2?r:n);return o.set(e,a),a}function hr(e){return cs(e)?hr(e.__v_raw):!!(e&&e.__v_isReactive)}function cs(e){return!!(e&&e.__v_isReadonly)}function ki(e){return!!(e&&e.__v_isShallow)}function Qp(e){return e?!!e.__v_raw:!1}function Le(e){const t=e&&e.__v_raw;return t?Le(t):e}function gu(e){return Object.isExtensible(e)&&kp(e,"__v_skip",!0),e}const fs=e=>Te(e)?Et(e):e,yu=e=>Te(e)?Ls(e):e;class eh{constructor(t,n,r,o){this.getter=t,this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this.effect=new cu(()=>t(this._value),()=>wi(this,this.effect._dirtyLevel===2?2:3)),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=Le(this);return(!t._cacheable||t.effect.dirty)&&gr(t._value,t._value=t.effect.run())&&wi(t,4),th(t),t.effect._dirtyLevel>=2&&wi(t,2),t._value}set value(t){this._setter(t)}get _dirty(){return this.effect.dirty}set _dirty(t){this.effect.dirty=t}}function Sy(e,t,n=!1){let r,o;const s=ve(e);return s?(r=e,o=ct):(r=e.get,o=e.set),new eh(r,o,s||!o,n)}function th(e){var t;pr&&Fr&&(e=Le(e),Kp(Fr,(t=e.dep)!=null?t:e.dep=qp(()=>e.dep=void 0,e instanceof eh?e:void 0)))}function wi(e,t=4,n,r){e=Le(e);const o=e.dep;o&&Up(o,t)}function qe(e){return!!(e&&e.__v_isRef===!0)}function j(e){return nh(e,!1)}function vr(e){return nh(e,!0)}function nh(e,t){return qe(e)?e:new Ey(e,t)}class Ey{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:Le(t),this._value=n?t:fs(t)}get value(){return th(this),this._value}set value(t){const n=this.__v_isShallow||ki(t)||cs(t);t=n?t:Le(t),gr(t,this._rawValue)&&(this._rawValue,this._rawValue=t,this._value=n?t:fs(t),wi(this,4))}}function m(e){return qe(e)?e.value:e}const Cy={get:(e,t,n)=>m(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return qe(o)&&!qe(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function rh(e){return hr(e)?e:new Proxy(e,Cy)}function Gr(e){const t=ce(e)?new Array(e.length):{};for(const n in e)t[n]=oh(e,n);return t}class Oy{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return ry(Le(this._object),this._key)}}class Ty{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Ht(e,t,n){return qe(e)?e:ve(e)?new Ty(e):Te(e)&&arguments.length>1?oh(e,t,n):j(e)}function oh(e,t,n){const r=e[t];return qe(r)?r:new Oy(e,t,n)}/** -* @vue/runtime-core v3.4.31 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function mr(e,t,n,r){try{return r?e(...r):e()}catch(o){oa(o,t,n)}}function qt(e,t,n,r){if(ve(e)){const o=mr(e,t,n,r);return o&&$i(o)&&o.catch(s=>{oa(s,t,n)}),o}if(ce(e)){const o=[];for(let s=0;s>>1,o=St[r],s=ps(o);swn&&St.splice(t,1)}function Py(e){ce(e)?ho.push(...e):(!sr||!sr.includes(e,e.allowRecurse?$r+1:$r))&&ho.push(e),ih()}function Ac(e,t,n=ds?wn+1:0){for(;nps(n)-ps(r));if(ho.length=0,sr){sr.push(...t);return}for(sr=t,$r=0;$re.id==null?1/0:e.id,Iy=(e,t)=>{const n=ps(e)-ps(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function lh(e){ml=!1,ds=!0,St.sort(Iy);try{for(wn=0;wnxe(v)?v.trim():v)),f&&(o=n.map(dl))}let a,l=r[a=yi(t)]||r[a=yi(un(t))];!l&&s&&(l=r[a=yi(br(t))]),l&&qt(l,e,6,o);const u=r[a+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,qt(u,e,6,o)}}function uh(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},a=!1;if(!ve(e)){const l=u=>{const c=uh(u,t,!0);c&&(a=!0,ft(i,c))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(Te(e)&&r.set(e,null),null):(ce(s)?s.forEach(l=>i[l]=null):ft(i,s),Te(e)&&r.set(e,i),i)}function sa(e,t){return!e||!Qi(t)?!1:(t=t.slice(2).replace(/Once$/,""),De(e,t[0].toLowerCase()+t.slice(1))||De(e,br(t))||De(e,t))}let pt=null,ia=null;function Ni(e){const t=pt;return pt=e,ia=e&&e.type.__scopeId||null,t}function r8(e){ia=e}function o8(){ia=null}function ye(e,t=pt,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&Kc(-1);const s=Ni(t);let i;try{i=e(...o)}finally{Ni(s),r._d&&Kc(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function Ma(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[s],slots:i,attrs:a,emit:l,render:u,renderCache:c,props:f,data:p,setupState:v,ctx:h,inheritAttrs:d}=e,y=Ni(e);let g,_;try{if(n.shapeFlag&4){const T=o||r,C=T;g=bn(u.call(C,T,c,f,v,p,h)),_=a}else{const T=t;g=bn(T.length>1?T(f,{attrs:a,slots:i,emit:l}):T(f,null)),_=t.props?a:Ly(a)}}catch(T){Qo.length=0,oa(T,e,1),g=ae(xt)}let b=g;if(_&&d!==!1){const T=Object.keys(_),{shapeFlag:C}=b;T.length&&C&7&&(s&&T.some(su)&&(_=ky(_,s)),b=zn(b,_,!1,!0))}return n.dirs&&(b=zn(b,null,!1,!0),b.dirs=b.dirs?b.dirs.concat(n.dirs):n.dirs),n.transition&&(b.transition=n.transition),g=b,Ni(y),g}const Ly=e=>{let t;for(const n in e)(n==="class"||n==="style"||Qi(n))&&((t||(t={}))[n]=e[n]);return t},ky=(e,t)=>{const n={};for(const r in e)(!su(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Ny(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:a,patchFlag:l}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?Rc(r,i,u):!!i;if(l&8){const c=t.dynamicProps;for(let f=0;fe.__isSuspense;function jy(e,t){t&&t.pendingBranch?ce(e)?t.effects.push(...e):t.effects.push(e):Py(e)}function aa(e,t,n=gt,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{wr();const a=ks(n),l=qt(t,n,e,i);return a(),_r(),l});return r?o.unshift(s):o.push(s),s}}const Kn=e=>(t,n=gt)=>{(!ca||e==="sp")&&aa(e,(...r)=>t(...r),n)},Eu=Kn("bm"),Ue=Kn("m"),Vy=Kn("bu"),Yr=Kn("u"),Ct=Kn("bum"),Jr=Kn("um"),zy=Kn("sp"),Hy=Kn("rtg"),Ky=Kn("rtc");function Uy(e,t=gt){aa("ec",e,t)}function ht(e,t){if(pt===null)return e;const n=fa(pt),r=e.dirs||(e.dirs=[]);for(let o=0;ot(i,a,void 0,s));else{const i=Object.keys(e);o=new Array(i.length);for(let a=0,l=i.length;a{const s=r.fn(...o);return s&&(s.key=r.key),s}:r.fn)}return e}/*! #__NO_SIDE_EFFECTS__ */function J(e,t){return ve(e)?ft({name:e.name},t,{setup:e}):e}const Jo=e=>!!e.type.__asyncLoader;function de(e,t,n={},r,o){if(pt.isCE||pt.parent&&Jo(pt.parent)&&pt.parent.isCE)return t!=="default"&&(n.name=t),ae("slot",n,r&&r());let s=e[t];s&&s._c&&(s._d=!1),P();const i=s&&fh(s(n)),a=he(tt,{key:n.key||i&&i.key||`_${t}`},i||(r?r():[]),i&&e._===1?64:-2);return a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),s&&s._c&&(s._d=!0),a}function fh(e){return e.some(t=>Vn(t)?!(t.type===xt||t.type===tt&&!fh(t.children)):!0)?e:null}const gl=e=>e?Mh(e)?fa(e):gl(e.parent):null,Xo=ft(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>gl(e.parent),$root:e=>gl(e.root),$emit:e=>e.emit,$options:e=>Cu(e),$forceUpdate:e=>e.f||(e.f=()=>{e.effect.dirty=!0,wu(e.update)}),$nextTick:e=>e.n||(e.n=Ve.bind(e.proxy)),$watch:e=>vb.bind(e)}),Fa=(e,t)=>e!==et&&!e.__isScriptSetup&&De(e,t),Wy={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:a,appContext:l}=e;let u;if(t[0]!=="$"){const v=i[t];if(v!==void 0)switch(v){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(Fa(r,t))return i[t]=1,r[t];if(o!==et&&De(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&De(u,t))return i[t]=3,s[t];if(n!==et&&De(n,t))return i[t]=4,n[t];yl&&(i[t]=0)}}const c=Xo[t];let f,p;if(c)return t==="$attrs"&&kt(e.attrs,"get",""),c(e);if((f=a.__cssModules)&&(f=f[t]))return f;if(n!==et&&De(n,t))return i[t]=4,n[t];if(p=l.config.globalProperties,De(p,t))return p[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return Fa(o,t)?(o[t]=n,!0):r!==et&&De(r,t)?(r[t]=n,!0):De(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},i){let a;return!!n[i]||e!==et&&De(e,i)||Fa(t,i)||(a=s[0])&&De(a,i)||De(r,i)||De(Xo,i)||De(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:De(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Xr(){return dh().slots}function Gy(){return dh().attrs}function dh(){const e=rt();return e.setupContext||(e.setupContext=Bh(e))}function $c(e){return ce(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let yl=!0;function Yy(e){const t=Cu(e),n=e.proxy,r=e.ctx;yl=!1,t.beforeCreate&&Lc(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:a,provide:l,inject:u,created:c,beforeMount:f,mounted:p,beforeUpdate:v,updated:h,activated:d,deactivated:y,beforeDestroy:g,beforeUnmount:_,destroyed:b,unmounted:T,render:C,renderTracked:O,renderTriggered:x,errorCaptured:L,serverPrefetch:I,expose:k,inheritAttrs:z,components:B,directives:K,filters:G}=t;if(u&&Jy(u,r,null),i)for(const $ in i){const se=i[$];ve(se)&&(r[$]=se.bind(n))}if(o){const $=o.call(n,n);Te($)&&(e.data=Et($))}if(yl=!0,s)for(const $ in s){const se=s[$],me=ve(se)?se.bind(n,n):ve(se.get)?se.get.bind(n,n):ct,Pe=!ve(se)&&ve(se.set)?se.set.bind(n):ct,je=E({get:me,set:Pe});Object.defineProperty(r,$,{enumerable:!0,configurable:!0,get:()=>je.value,set:Ce=>je.value=Ce})}if(a)for(const $ in a)ph(a[$],r,n,$);if(l){const $=ve(l)?l.call(n):l;Reflect.ownKeys($).forEach(se=>{ut(se,$[se])})}c&&Lc(c,e,"c");function F($,se){ce(se)?se.forEach(me=>$(me.bind(n))):se&&$(se.bind(n))}if(F(Eu,f),F(Ue,p),F(Vy,v),F(Yr,h),F(Oh,d),F(Th,y),F(Uy,L),F(Ky,O),F(Hy,x),F(Ct,_),F(Jr,T),F(zy,I),ce(k))if(k.length){const $=e.exposed||(e.exposed={});k.forEach(se=>{Object.defineProperty($,se,{get:()=>n[se],set:me=>n[se]=me})})}else e.exposed||(e.exposed={});C&&e.render===ct&&(e.render=C),z!=null&&(e.inheritAttrs=z),B&&(e.components=B),K&&(e.directives=K)}function Jy(e,t,n=ct){ce(e)&&(e=bl(e));for(const r in e){const o=e[r];let s;Te(o)?"default"in o?s=Se(o.from||r,o.default,!0):s=Se(o.from||r):s=Se(o),qe(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function Lc(e,t,n){qt(ce(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function ph(e,t,n,r){const o=r.includes(".")?Ch(n,r):()=>n[r];if(xe(e)){const s=t[e];ve(s)&&pe(o,s)}else if(ve(e))pe(o,e.bind(n));else if(Te(e))if(ce(e))e.forEach(s=>ph(s,t,n,r));else{const s=ve(e.handler)?e.handler.bind(n):t[e.handler];ve(s)&&pe(o,s,e)}}function Cu(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,a=s.get(t);let l;return a?l=a:!o.length&&!n&&!r?l=t:(l={},o.length&&o.forEach(u=>Mi(l,u,i,!0)),Mi(l,t,i)),Te(t)&&s.set(t,l),l}function Mi(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&Mi(e,s,n,!0),o&&o.forEach(i=>Mi(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const a=Xy[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const Xy={data:kc,props:Nc,emits:Nc,methods:Wo,computed:Wo,beforeCreate:Tt,created:Tt,beforeMount:Tt,mounted:Tt,beforeUpdate:Tt,updated:Tt,beforeDestroy:Tt,beforeUnmount:Tt,destroyed:Tt,unmounted:Tt,activated:Tt,deactivated:Tt,errorCaptured:Tt,serverPrefetch:Tt,components:Wo,directives:Wo,watch:Qy,provide:kc,inject:Zy};function kc(e,t){return t?e?function(){return ft(ve(e)?e.call(this,this):e,ve(t)?t.call(this,this):t)}:t:e}function Zy(e,t){return Wo(bl(e),bl(t))}function bl(e){if(ce(e)){const t={};for(let n=0;n1)return n&&ve(t)?t.call(r&&r.proxy):t}}function nb(){return!!(gt||pt||vo)}const vh={},mh=()=>Object.create(vh),gh=e=>Object.getPrototypeOf(e)===vh;function rb(e,t,n,r=!1){const o={},s=mh();e.propsDefaults=Object.create(null),yh(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:vu(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function ob(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,a=Le(o),[l]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let f=0;f{l=!0;const[p,v]=bh(f,t,!0);ft(i,p),v&&a.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!s&&!l)return Te(e)&&r.set(e,fo),fo;if(ce(s))for(let c=0;c-1,v[1]=d<0||h-1||De(v,"default"))&&a.push(f)}}}const u=[i,a];return Te(e)&&r.set(e,u),u}function Mc(e){return e[0]!=="$"&&!Yo(e)}function Fc(e){return e===null?"null":typeof e=="function"?e.name||"":typeof e=="object"&&e.constructor&&e.constructor.name||""}function Bc(e,t){return Fc(e)===Fc(t)}function Dc(e,t){return ce(t)?t.findIndex(n=>Bc(n,e)):ve(t)&&Bc(t,e)?0:-1}const wh=e=>e[0]==="_"||e==="$stable",Ou=e=>ce(e)?e.map(bn):[bn(e)],sb=(e,t,n)=>{if(t._n)return t;const r=ye((...o)=>Ou(t(...o)),n);return r._c=!1,r},_h=(e,t,n)=>{const r=e._ctx;for(const o in e){if(wh(o))continue;const s=e[o];if(ve(s))t[o]=sb(o,s,r);else if(s!=null){const i=Ou(s);t[o]=()=>i}}},Sh=(e,t)=>{const n=Ou(t);e.slots.default=()=>n},ib=(e,t)=>{const n=e.slots=mh();if(e.vnode.shapeFlag&32){const r=t._;r?(ft(n,t),kp(n,"_",r,!0)):_h(t,n)}else t&&Sh(e,t)},ab=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=et;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:(ft(o,t),!n&&a===1&&delete o._):(s=!t.$stable,_h(t,o)),i=t}else t&&(Sh(e,t),i={default:1});if(s)for(const a in o)!wh(a)&&i[a]==null&&delete o[a]};function _l(e,t,n,r,o=!1){if(ce(e)){e.forEach((p,v)=>_l(p,t&&(ce(t)?t[v]:t),n,r,o));return}if(Jo(r)&&!o)return;const s=r.shapeFlag&4?fa(r.component):r.el,i=o?null:s,{i:a,r:l}=e,u=t&&t.r,c=a.refs===et?a.refs={}:a.refs,f=a.setupState;if(u!=null&&u!==l&&(xe(u)?(c[u]=null,De(f,u)&&(f[u]=null)):qe(u)&&(u.value=null)),ve(l))mr(l,a,12,[i,c]);else{const p=xe(l),v=qe(l);if(p||v){const h=()=>{if(e.f){const d=p?De(f,l)?f[l]:c[l]:l.value;o?ce(d)&&iu(d,s):ce(d)?d.includes(s)||d.push(s):p?(c[l]=[s],De(f,l)&&(f[l]=c[l])):(l.value=[s],e.k&&(c[e.k]=l.value))}else p?(c[l]=i,De(f,l)&&(f[l]=i)):v&&(l.value=i,e.k&&(c[e.k]=i))};i?(h.id=-1,Rt(h,n)):h()}}}const Rt=jy;function lb(e){return ub(e)}function ub(e,t){const n=Np();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:a,createComment:l,setText:u,setElementText:c,parentNode:f,nextSibling:p,setScopeId:v=ct,insertStaticContent:h}=e,d=(w,S,M,U=null,H=null,ee=null,ie=void 0,Z=null,te=!!S.dynamicChildren)=>{if(w===S)return;w&&!Lr(w,S)&&(U=A(w),Ce(w,H,ee,!0),w=null),S.patchFlag===-2&&(te=!1,S.dynamicChildren=null);const{type:Y,ref:le,shapeFlag:be}=S;switch(Y){case Ro:y(w,S,M,U);break;case xt:g(w,S,M,U);break;case _i:w==null&&_(S,M,U,ie);break;case tt:B(w,S,M,U,H,ee,ie,Z,te);break;default:be&1?C(w,S,M,U,H,ee,ie,Z,te):be&6?K(w,S,M,U,H,ee,ie,Z,te):(be&64||be&128)&&Y.process(w,S,M,U,H,ee,ie,Z,te,ne)}le!=null&&H&&_l(le,w&&w.ref,ee,S||w,!S)},y=(w,S,M,U)=>{if(w==null)r(S.el=a(S.children),M,U);else{const H=S.el=w.el;S.children!==w.children&&u(H,S.children)}},g=(w,S,M,U)=>{w==null?r(S.el=l(S.children||""),M,U):S.el=w.el},_=(w,S,M,U)=>{[w.el,w.anchor]=h(w.children,S,M,U,w.el,w.anchor)},b=({el:w,anchor:S},M,U)=>{let H;for(;w&&w!==S;)H=p(w),r(w,M,U),w=H;r(S,M,U)},T=({el:w,anchor:S})=>{let M;for(;w&&w!==S;)M=p(w),o(w),w=M;o(S)},C=(w,S,M,U,H,ee,ie,Z,te)=>{S.type==="svg"?ie="svg":S.type==="math"&&(ie="mathml"),w==null?O(S,M,U,H,ee,ie,Z,te):I(w,S,H,ee,ie,Z,te)},O=(w,S,M,U,H,ee,ie,Z)=>{let te,Y;const{props:le,shapeFlag:be,transition:N,dirs:re}=w;if(te=w.el=i(w.type,ee,le&&le.is,le),be&8?c(te,w.children):be&16&&L(w.children,te,null,U,H,Ba(w,ee),ie,Z),re&&xr(w,null,U,"created"),x(te,w,w.scopeId,ie,U),le){for(const Fe in le)Fe!=="value"&&!Yo(Fe)&&s(te,Fe,null,le[Fe],ee,w.children,U,H,$e);"value"in le&&s(te,"value",null,le.value,ee),(Y=le.onVnodeBeforeMount)&&yn(Y,U,w)}re&&xr(w,null,U,"beforeMount");const ge=cb(H,N);ge&&N.beforeEnter(te),r(te,S,M),((Y=le&&le.onVnodeMounted)||ge||re)&&Rt(()=>{Y&&yn(Y,U,w),ge&&N.enter(te),re&&xr(w,null,U,"mounted")},H)},x=(w,S,M,U,H)=>{if(M&&v(w,M),U)for(let ee=0;ee{for(let Y=te;Y{const Z=S.el=w.el;let{patchFlag:te,dynamicChildren:Y,dirs:le}=S;te|=w.patchFlag&16;const be=w.props||et,N=S.props||et;let re;if(M&&Ar(M,!1),(re=N.onVnodeBeforeUpdate)&&yn(re,M,S,w),le&&xr(S,w,M,"beforeUpdate"),M&&Ar(M,!0),Y?k(w.dynamicChildren,Y,Z,M,U,Ba(S,H),ee):ie||se(w,S,Z,null,M,U,Ba(S,H),ee,!1),te>0){if(te&16)z(Z,S,be,N,M,U,H);else if(te&2&&be.class!==N.class&&s(Z,"class",null,N.class,H),te&4&&s(Z,"style",be.style,N.style,H),te&8){const ge=S.dynamicProps;for(let Fe=0;Fe{re&&yn(re,M,S,w),le&&xr(S,w,M,"updated")},U)},k=(w,S,M,U,H,ee,ie)=>{for(let Z=0;Z{if(M!==U){if(M!==et)for(const Z in M)!Yo(Z)&&!(Z in U)&&s(w,Z,M[Z],null,ie,S.children,H,ee,$e);for(const Z in U){if(Yo(Z))continue;const te=U[Z],Y=M[Z];te!==Y&&Z!=="value"&&s(w,Z,Y,te,ie,S.children,H,ee,$e)}"value"in U&&s(w,"value",M.value,U.value,ie)}},B=(w,S,M,U,H,ee,ie,Z,te)=>{const Y=S.el=w?w.el:a(""),le=S.anchor=w?w.anchor:a("");let{patchFlag:be,dynamicChildren:N,slotScopeIds:re}=S;re&&(Z=Z?Z.concat(re):re),w==null?(r(Y,M,U),r(le,M,U),L(S.children||[],M,le,H,ee,ie,Z,te)):be>0&&be&64&&N&&w.dynamicChildren?(k(w.dynamicChildren,N,M,H,ee,ie,Z),(S.key!=null||H&&S===H.subTree)&&Tu(w,S,!0)):se(w,S,M,le,H,ee,ie,Z,te)},K=(w,S,M,U,H,ee,ie,Z,te)=>{S.slotScopeIds=Z,w==null?S.shapeFlag&512?H.ctx.activate(S,M,U,ie,te):G(S,M,U,H,ee,ie,te):R(w,S,te)},G=(w,S,M,U,H,ee,ie)=>{const Z=w.component=xb(w,U,H);if(ua(w)&&(Z.ctx.renderer=ne),Ab(Z),Z.asyncDep){if(H&&H.registerDep(Z,F,ie),!w.el){const te=Z.subTree=ae(xt);g(null,te,S,M)}}else F(Z,w,S,M,H,ee,ie)},R=(w,S,M)=>{const U=S.component=w.component;if(Ny(w,S,M))if(U.asyncDep&&!U.asyncResolved){$(U,S,M);return}else U.next=S,Ry(U.update),U.effect.dirty=!0,U.update();else S.el=w.el,U.vnode=S},F=(w,S,M,U,H,ee,ie)=>{const Z=()=>{if(w.isMounted){let{next:le,bu:be,u:N,parent:re,vnode:ge}=w;{const In=Eh(w);if(In){le&&(le.el=ge.el,$(w,le,ie)),In.asyncDep.then(()=>{w.isUnmounted||Z()});return}}let Fe=le,Be;Ar(w,!1),le?(le.el=ge.el,$(w,le,ie)):le=ge,be&&bi(be),(Be=le.props&&le.props.onVnodeBeforeUpdate)&&yn(Be,re,le,ge),Ar(w,!0);const dt=Ma(w),At=w.subTree;w.subTree=dt,d(At,dt,f(At.el),A(At),w,H,ee),le.el=dt.el,Fe===null&&My(w,dt.el),N&&Rt(N,H),(Be=le.props&&le.props.onVnodeUpdated)&&Rt(()=>yn(Be,re,le,ge),H)}else{let le;const{el:be,props:N}=S,{bm:re,m:ge,parent:Fe}=w,Be=Jo(S);if(Ar(w,!1),re&&bi(re),!Be&&(le=N&&N.onVnodeBeforeMount)&&yn(le,Fe,S),Ar(w,!0),be&&Re){const dt=()=>{w.subTree=Ma(w),Re(be,w.subTree,w,H,null)};Be?S.type.__asyncLoader().then(()=>!w.isUnmounted&&dt()):dt()}else{const dt=w.subTree=Ma(w);d(null,dt,M,U,w,H,ee),S.el=dt.el}if(ge&&Rt(ge,H),!Be&&(le=N&&N.onVnodeMounted)){const dt=S;Rt(()=>yn(le,Fe,dt),H)}(S.shapeFlag&256||Fe&&Jo(Fe.vnode)&&Fe.vnode.shapeFlag&256)&&w.a&&Rt(w.a,H),w.isMounted=!0,S=M=U=null}},te=w.effect=new cu(Z,ct,()=>wu(Y),w.scope),Y=w.update=()=>{te.dirty&&te.run()};Y.id=w.uid,Ar(w,!0),Y()},$=(w,S,M)=>{S.component=w;const U=w.vnode.props;w.vnode=S,w.next=null,ob(w,S.props,U,M),ab(w,S.children,M),wr(),Ac(w),_r()},se=(w,S,M,U,H,ee,ie,Z,te=!1)=>{const Y=w&&w.children,le=w?w.shapeFlag:0,be=S.children,{patchFlag:N,shapeFlag:re}=S;if(N>0){if(N&128){Pe(Y,be,M,U,H,ee,ie,Z,te);return}else if(N&256){me(Y,be,M,U,H,ee,ie,Z,te);return}}re&8?(le&16&&$e(Y,H,ee),be!==Y&&c(M,be)):le&16?re&16?Pe(Y,be,M,U,H,ee,ie,Z,te):$e(Y,H,ee,!0):(le&8&&c(M,""),re&16&&L(be,M,U,H,ee,ie,Z,te))},me=(w,S,M,U,H,ee,ie,Z,te)=>{w=w||fo,S=S||fo;const Y=w.length,le=S.length,be=Math.min(Y,le);let N;for(N=0;Nle?$e(w,H,ee,!0,!1,be):L(S,M,U,H,ee,ie,Z,te,be)},Pe=(w,S,M,U,H,ee,ie,Z,te)=>{let Y=0;const le=S.length;let be=w.length-1,N=le-1;for(;Y<=be&&Y<=N;){const re=w[Y],ge=S[Y]=te?ar(S[Y]):bn(S[Y]);if(Lr(re,ge))d(re,ge,M,null,H,ee,ie,Z,te);else break;Y++}for(;Y<=be&&Y<=N;){const re=w[be],ge=S[N]=te?ar(S[N]):bn(S[N]);if(Lr(re,ge))d(re,ge,M,null,H,ee,ie,Z,te);else break;be--,N--}if(Y>be){if(Y<=N){const re=N+1,ge=reN)for(;Y<=be;)Ce(w[Y],H,ee,!0),Y++;else{const re=Y,ge=Y,Fe=new Map;for(Y=ge;Y<=N;Y++){const Ot=S[Y]=te?ar(S[Y]):bn(S[Y]);Ot.key!=null&&Fe.set(Ot.key,Y)}let Be,dt=0;const At=N-ge+1;let In=!1,Bo=0;const mn=new Array(At);for(Y=0;Y=At){Ce(Ot,H,ee,!0);continue}let Vt;if(Ot.key!=null)Vt=Fe.get(Ot.key);else for(Be=ge;Be<=N;Be++)if(mn[Be-ge]===0&&Lr(Ot,S[Be])){Vt=Be;break}Vt===void 0?Ce(Ot,H,ee,!0):(mn[Vt-ge]=Y+1,Vt>=Bo?Bo=Vt:In=!0,d(Ot,S[Vt],M,null,H,ee,ie,Z,te),dt++)}const qs=In?fb(mn):fo;for(Be=qs.length-1,Y=At-1;Y>=0;Y--){const Ot=ge+Y,Vt=S[Ot],Ws=Ot+1{const{el:ee,type:ie,transition:Z,children:te,shapeFlag:Y}=w;if(Y&6){je(w.component.subTree,S,M,U);return}if(Y&128){w.suspense.move(S,M,U);return}if(Y&64){ie.move(w,S,M,ne);return}if(ie===tt){r(ee,S,M);for(let be=0;beZ.enter(ee),H);else{const{leave:be,delayLeave:N,afterLeave:re}=Z,ge=()=>r(ee,S,M),Fe=()=>{be(ee,()=>{ge(),re&&re()})};N?N(ee,ge,Fe):Fe()}else r(ee,S,M)},Ce=(w,S,M,U=!1,H=!1)=>{const{type:ee,props:ie,ref:Z,children:te,dynamicChildren:Y,shapeFlag:le,patchFlag:be,dirs:N,memoIndex:re}=w;if(be===-2&&(H=!1),Z!=null&&_l(Z,null,M,w,!0),re!=null&&(S.renderCache[re]=void 0),le&256){S.ctx.deactivate(w);return}const ge=le&1&&N,Fe=!Jo(w);let Be;if(Fe&&(Be=ie&&ie.onVnodeBeforeUnmount)&&yn(Be,S,w),le&6)Ze(w.component,M,U);else{if(le&128){w.suspense.unmount(M,U);return}ge&&xr(w,null,S,"beforeUnmount"),le&64?w.type.remove(w,S,M,ne,U):Y&&(ee!==tt||be>0&&be&64)?$e(Y,S,M,!1,!0):(ee===tt&&be&384||!H&&le&16)&&$e(te,S,M),U&&Oe(w)}(Fe&&(Be=ie&&ie.onVnodeUnmounted)||ge)&&Rt(()=>{Be&&yn(Be,S,w),ge&&xr(w,null,S,"unmounted")},M)},Oe=w=>{const{type:S,el:M,anchor:U,transition:H}=w;if(S===tt){Ee(M,U);return}if(S===_i){T(w);return}const ee=()=>{o(M),H&&!H.persisted&&H.afterLeave&&H.afterLeave()};if(w.shapeFlag&1&&H&&!H.persisted){const{leave:ie,delayLeave:Z}=H,te=()=>ie(M,ee);Z?Z(w.el,ee,te):te()}else ee()},Ee=(w,S)=>{let M;for(;w!==S;)M=p(w),o(w),w=M;o(S)},Ze=(w,S,M)=>{const{bum:U,scope:H,update:ee,subTree:ie,um:Z,m:te,a:Y}=w;jc(te),jc(Y),U&&bi(U),H.stop(),ee&&(ee.active=!1,Ce(ie,w,S,M)),Z&&Rt(Z,S),Rt(()=>{w.isUnmounted=!0},S),S&&S.pendingBranch&&!S.isUnmounted&&w.asyncDep&&!w.asyncResolved&&w.suspenseId===S.pendingId&&(S.deps--,S.deps===0&&S.resolve())},$e=(w,S,M,U=!1,H=!1,ee=0)=>{for(let ie=ee;iew.shapeFlag&6?A(w.component.subTree):w.shapeFlag&128?w.suspense.next():p(w.anchor||w.el);let q=!1;const X=(w,S,M)=>{w==null?S._vnode&&Ce(S._vnode,null,null,!0):d(S._vnode||null,w,S,null,null,null,M),q||(q=!0,Ac(),ah(),q=!1),S._vnode=w},ne={p:d,um:Ce,m:je,r:Oe,mt:G,mc:L,pc:se,pbc:k,n:A,o:e};let _e,Re;return{render:X,hydrate:_e,createApp:tb(X,_e)}}function Ba({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function Ar({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function cb(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Tu(e,t,n=!1){const r=e.children,o=t.children;if(ce(r)&&ce(o))for(let s=0;s>1,e[n[a]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,i=n[s-1];s-- >0;)n[s]=i,i=t[i];return n}function Eh(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Eh(t)}function jc(e){if(e)for(let t=0;tSe(db);function xu(e,t){return la(e,null,t)}function hb(e,t){return la(e,null,{flush:"post"})}const ti={};function pe(e,t,n){return la(e,t,n)}function la(e,t,{immediate:n,deep:r,flush:o,once:s,onTrack:i,onTrigger:a}=et){if(t&&s){const O=t;t=(...x)=>{O(...x),C()}}const l=gt,u=O=>r===!0?O:ur(O,r===!1?1:void 0);let c,f=!1,p=!1;if(qe(e)?(c=()=>e.value,f=ki(e)):hr(e)?(c=()=>u(e),f=!0):ce(e)?(p=!0,f=e.some(O=>hr(O)||ki(O)),c=()=>e.map(O=>{if(qe(O))return O.value;if(hr(O))return u(O);if(ve(O))return mr(O,l,2)})):ve(e)?t?c=()=>mr(e,l,2):c=()=>(v&&v(),qt(e,l,3,[h])):c=ct,t&&r){const O=c;c=()=>ur(O())}let v,h=O=>{v=b.onStop=()=>{mr(O,l,4),v=b.onStop=void 0}},d;if(ca)if(h=ct,t?n&&qt(t,l,3,[c(),p?[]:void 0,h]):c(),o==="sync"){const O=pb();d=O.__watcherHandles||(O.__watcherHandles=[])}else return ct;let y=p?new Array(e.length).fill(ti):ti;const g=()=>{if(!(!b.active||!b.dirty))if(t){const O=b.run();(r||f||(p?O.some((x,L)=>gr(x,y[L])):gr(O,y)))&&(v&&v(),qt(t,l,3,[O,y===ti?void 0:p&&y[0]===ti?[]:y,h]),y=O)}else b.run()};g.allowRecurse=!!t;let _;o==="sync"?_=g:o==="post"?_=()=>Rt(g,l&&l.suspense):(g.pre=!0,l&&(g.id=l.uid),_=()=>wu(g));const b=new cu(c,ct,_),T=lu(),C=()=>{b.stop(),T&&iu(T.effects,b)};return t?n?g():y=b.run():o==="post"?Rt(b.run.bind(b),l&&l.suspense):b.run(),d&&d.push(C),C}function vb(e,t,n){const r=this.proxy,o=xe(e)?e.includes(".")?Ch(r,e):()=>r[e]:e.bind(r,r);let s;ve(t)?s=t:(s=t.handler,n=t);const i=ks(this),a=la(o,s.bind(r),n);return i(),a}function Ch(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;o{ur(r,t,n)});else if(Lp(e)){for(const r in e)ur(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&ur(e[r],t,n)}return e}const ua=e=>e.type.__isKeepAlive;function Oh(e,t){xh(e,"a",t)}function Th(e,t){xh(e,"da",t)}function xh(e,t,n=gt){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(aa(t,r,n),n){let o=n.parent;for(;o&&o.parent;)ua(o.parent.vnode)&&mb(r,t,n,o),o=o.parent}}function mb(e,t,n,r){const o=aa(t,e,r,!0);Jr(()=>{iu(r[t],o)},n)}const ir=Symbol("_leaveCb"),ni=Symbol("_enterCb");function Ah(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Ue(()=>{e.isMounted=!0}),Ct(()=>{e.isUnmounting=!0}),e}const zt=[Function,Array],Rh={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:zt,onEnter:zt,onAfterEnter:zt,onEnterCancelled:zt,onBeforeLeave:zt,onLeave:zt,onAfterLeave:zt,onLeaveCancelled:zt,onBeforeAppear:zt,onAppear:zt,onAfterAppear:zt,onAppearCancelled:zt},Ph=e=>{const t=e.subTree;return t.component?Ph(t.component):t},gb={name:"BaseTransition",props:Rh,setup(e,{slots:t}){const n=rt(),r=Ah();return()=>{const o=t.default&&Au(t.default(),!0);if(!o||!o.length)return;let s=o[0];if(o.length>1){for(const p of o)if(p.type!==xt){s=p;break}}const i=Le(e),{mode:a}=i;if(r.isLeaving)return Da(s);const l=Vc(s);if(!l)return Da(s);let u=hs(l,i,r,n,p=>u=p);go(l,u);const c=n.subTree,f=c&&Vc(c);if(f&&f.type!==xt&&!Lr(l,f)&&Ph(n).type!==xt){const p=hs(f,i,r,n);if(go(f,p),a==="out-in"&&l.type!==xt)return r.isLeaving=!0,p.afterLeave=()=>{r.isLeaving=!1,n.update.active!==!1&&(n.effect.dirty=!0,n.update())},Da(s);a==="in-out"&&l.type!==xt&&(p.delayLeave=(v,h,d)=>{const y=Ih(r,f);y[String(f.key)]=f,v[ir]=()=>{h(),v[ir]=void 0,delete u.delayedLeave},u.delayedLeave=d})}return s}}},yb=gb;function Ih(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function hs(e,t,n,r,o){const{appear:s,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:c,onEnterCancelled:f,onBeforeLeave:p,onLeave:v,onAfterLeave:h,onLeaveCancelled:d,onBeforeAppear:y,onAppear:g,onAfterAppear:_,onAppearCancelled:b}=t,T=String(e.key),C=Ih(n,e),O=(I,k)=>{I&&qt(I,r,9,k)},x=(I,k)=>{const z=k[1];O(I,k),ce(I)?I.every(B=>B.length<=1)&&z():I.length<=1&&z()},L={mode:i,persisted:a,beforeEnter(I){let k=l;if(!n.isMounted)if(s)k=y||l;else return;I[ir]&&I[ir](!0);const z=C[T];z&&Lr(e,z)&&z.el[ir]&&z.el[ir](),O(k,[I])},enter(I){let k=u,z=c,B=f;if(!n.isMounted)if(s)k=g||u,z=_||c,B=b||f;else return;let K=!1;const G=I[ni]=R=>{K||(K=!0,R?O(B,[I]):O(z,[I]),L.delayedLeave&&L.delayedLeave(),I[ni]=void 0)};k?x(k,[I,G]):G()},leave(I,k){const z=String(e.key);if(I[ni]&&I[ni](!0),n.isUnmounting)return k();O(p,[I]);let B=!1;const K=I[ir]=G=>{B||(B=!0,k(),G?O(d,[I]):O(h,[I]),I[ir]=void 0,C[z]===e&&delete C[z])};C[z]=e,v?x(v,[I,K]):K()},clone(I){const k=hs(I,t,n,r,o);return o&&o(k),k}};return L}function Da(e){if(ua(e))return e=zn(e),e.children=null,e}function Vc(e){if(!ua(e))return e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&ve(n.default))return n.default()}}function go(e,t){e.shapeFlag&6&&e.component?go(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Au(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;se.__isTeleport,Zo=e=>e&&(e.disabled||e.disabled===""),zc=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Hc=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Sl=(e,t)=>{const n=e&&e.to;return xe(n)?t?t(n):null:n},wb={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,s,i,a,l,u){const{mc:c,pc:f,pbc:p,o:{insert:v,querySelector:h,createText:d,createComment:y}}=u,g=Zo(t.props);let{shapeFlag:_,children:b,dynamicChildren:T}=t;if(e==null){const C=t.el=d(""),O=t.anchor=d("");v(C,n,r),v(O,n,r);const x=t.target=Sl(t.props,h),L=t.targetAnchor=d("");x&&(v(L,x),i==="svg"||zc(x)?i="svg":(i==="mathml"||Hc(x))&&(i="mathml"));const I=(k,z)=>{_&16&&c(b,k,z,o,s,i,a,l)};g?I(n,O):x&&I(x,L)}else{t.el=e.el;const C=t.anchor=e.anchor,O=t.target=e.target,x=t.targetAnchor=e.targetAnchor,L=Zo(e.props),I=L?n:O,k=L?C:x;if(i==="svg"||zc(O)?i="svg":(i==="mathml"||Hc(O))&&(i="mathml"),T?(p(e.dynamicChildren,T,I,o,s,i,a),Tu(e,t,!0)):l||f(e,t,I,k,o,s,i,a,!1),g)L?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):ri(t,n,C,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const z=t.target=Sl(t.props,h);z&&ri(t,z,null,u,0)}else L&&ri(t,O,x,u,1)}Lh(t)},remove(e,t,n,{um:r,o:{remove:o}},s){const{shapeFlag:i,children:a,anchor:l,targetAnchor:u,target:c,props:f}=e;if(c&&o(u),s&&o(l),i&16){const p=s||!Zo(f);for(let v=0;v0?rn||fo:null,Sb(),vs>0&&rn&&rn.push(e),e}function Q(e,t,n,r,o,s){return kh(fe(e,t,n,r,o,s,!0))}function he(e,t,n,r,o){return kh(ae(e,t,n,r,o,!0))}function Vn(e){return e?e.__v_isVNode===!0:!1}function Lr(e,t){return e.type===t.type&&e.key===t.key}const Nh=({key:e})=>e??null,Si=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?xe(e)||qe(e)||ve(e)?{i:pt,r:e,k:t,f:!!n}:e:null);function fe(e,t=null,n=null,r=0,o=null,s=e===tt?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Nh(t),ref:t&&Si(t),scopeId:ia,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:pt};return a?(Ru(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=xe(n)?8:16),vs>0&&!i&&rn&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&rn.push(l),l}const ae=Eb;function Eb(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===ch)&&(e=xt),Vn(e)){const a=zn(e,t,!0);return n&&Ru(a,n),vs>0&&!s&&rn&&(a.shapeFlag&6?rn[rn.indexOf(e)]=a:rn.push(a)),a.patchFlag=-2,a}if($b(e)&&(e=e.__vccOpts),t){t=Cb(t);let{class:a,style:l}=t;a&&!xe(a)&&(t.class=W(a)),Te(l)&&(Qp(l)&&!ce(l)&&(l=ft({},l)),t.style=ot(l))}const i=xe(e)?1:Dy(e)?128:bb(e)?64:Te(e)?4:ve(e)?2:0;return fe(e,t,n,r,o,i,s,!0)}function Cb(e){return e?Qp(e)||gh(e)?ft({},e):e:null}function zn(e,t,n=!1,r=!1){const{props:o,ref:s,patchFlag:i,children:a,transition:l}=e,u=t?sn(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Nh(u),ref:t&&t.ref?n&&s?ce(s)?s.concat(Si(t)):[s,Si(t)]:Si(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==tt?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&zn(e.ssContent),ssFallback:e.ssFallback&&zn(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&go(c,l.clone(c)),c}function zr(e=" ",t=0){return ae(Ro,null,e,t)}function ue(e="",t=!1){return t?(P(),he(xt,null,e)):ae(xt,null,e)}function bn(e){return e==null||typeof e=="boolean"?ae(xt):ce(e)?ae(tt,null,e.slice()):typeof e=="object"?ar(e):ae(Ro,null,String(e))}function ar(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:zn(e)}function Ru(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(ce(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),Ru(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!gh(t)?t._ctx=pt:o===3&&pt&&(pt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ve(t)?(t={default:t,_ctx:pt},n=32):(t=String(t),r&64?(n=16,t=[zr(t)]):n=8);e.children=t,e.shapeFlag|=n}function sn(...e){const t={};for(let n=0;ngt||pt;let Fi,El;{const e=Np(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),s=>{o.length>1?o.forEach(i=>i(s)):o[0](s)}};Fi=t("__VUE_INSTANCE_SETTERS__",n=>gt=n),El=t("__VUE_SSR_SETTERS__",n=>ca=n)}const ks=e=>{const t=gt;return Fi(e),e.scope.on(),()=>{e.scope.off(),Fi(t)}},Uc=()=>{gt&>.scope.off(),Fi(null)};function Mh(e){return e.vnode.shapeFlag&4}let ca=!1;function Ab(e,t=!1){t&&El(t);const{props:n,children:r}=e.vnode,o=Mh(e);rb(e,n,o,t),ib(e,r);const s=o?Rb(e,t):void 0;return t&&El(!1),s}function Rb(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Wy);const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?Bh(e):null,s=ks(e);wr();const i=mr(r,e,0,[e.props,o]);if(_r(),s(),$i(i)){if(i.then(Uc,Uc),t)return i.then(a=>{qc(e,a,t)}).catch(a=>{oa(a,e,0)});e.asyncDep=i}else qc(e,i,t)}else Fh(e,t)}function qc(e,t,n){ve(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Te(t)&&(e.setupState=rh(t)),Fh(e,n)}let Wc;function Fh(e,t,n){const r=e.type;if(!e.render){if(!t&&Wc&&!r.render){const o=r.template||Cu(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,u=ft(ft({isCustomElement:s,delimiters:a},i),l);r.render=Wc(o,u)}}e.render=r.render||ct}{const o=ks(e);wr();try{Yy(e)}finally{_r(),o()}}}const Pb={get(e,t){return kt(e,"get",""),e[t]}};function Bh(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Pb),slots:e.slots,emit:e.emit,expose:t}}function fa(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(rh(gu(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Xo)return Xo[n](e)},has(t,n){return n in t||n in Xo}})):e.proxy}function Ib(e,t=!0){return ve(e)?e.displayName||e.name:e.name||t&&e.__name}function $b(e){return ve(e)&&"__vccOpts"in e}const E=(e,t)=>Sy(e,t,ca);function Bn(e,t,n){const r=arguments.length;return r===2?Te(t)&&!ce(t)?Vn(t)?ae(e,null,[t]):ae(e,t):ae(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Vn(n)&&(n=[n]),ae(e,t,n))}const Lb="3.4.31",kb=ct;/** -* @vue/runtime-dom v3.4.31 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/const Nb="http://www.w3.org/2000/svg",Mb="http://www.w3.org/1998/Math/MathML",Nn=typeof document<"u"?document:null,Gc=Nn&&Nn.createElement("template"),Fb={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?Nn.createElementNS(Nb,e):t==="mathml"?Nn.createElementNS(Mb,e):n?Nn.createElement(e,{is:n}):Nn.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>Nn.createTextNode(e),createComment:e=>Nn.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Nn.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{Gc.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const a=Gc.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Xn="transition",jo="animation",yo=Symbol("_vtc"),Un=(e,{slots:t})=>Bn(yb,jh(e),t);Un.displayName="Transition";const Dh={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Bb=Un.props=ft({},Rh,Dh),Rr=(e,t=[])=>{ce(e)?e.forEach(n=>n(...t)):e&&e(...t)},Yc=e=>e?ce(e)?e.some(t=>t.length>1):e.length>1:!1;function jh(e){const t={};for(const B in e)B in Dh||(t[B]=e[B]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:u=i,appearToClass:c=a,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,h=Db(o),d=h&&h[0],y=h&&h[1],{onBeforeEnter:g,onEnter:_,onEnterCancelled:b,onLeave:T,onLeaveCancelled:C,onBeforeAppear:O=g,onAppear:x=_,onAppearCancelled:L=b}=t,I=(B,K,G)=>{tr(B,K?c:a),tr(B,K?u:i),G&&G()},k=(B,K)=>{B._isLeaving=!1,tr(B,f),tr(B,v),tr(B,p),K&&K()},z=B=>(K,G)=>{const R=B?x:_,F=()=>I(K,B,G);Rr(R,[K,F]),Jc(()=>{tr(K,B?l:s),kn(K,B?c:a),Yc(R)||Xc(K,r,d,F)})};return ft(t,{onBeforeEnter(B){Rr(g,[B]),kn(B,s),kn(B,i)},onBeforeAppear(B){Rr(O,[B]),kn(B,l),kn(B,u)},onEnter:z(!1),onAppear:z(!0),onLeave(B,K){B._isLeaving=!0;const G=()=>k(B,K);kn(B,f),kn(B,p),zh(),Jc(()=>{B._isLeaving&&(tr(B,f),kn(B,v),Yc(T)||Xc(B,r,y,G))}),Rr(T,[B,G])},onEnterCancelled(B){I(B,!1),Rr(b,[B])},onAppearCancelled(B){I(B,!0),Rr(L,[B])},onLeaveCancelled(B){k(B),Rr(C,[B])}})}function Db(e){if(e==null)return null;if(Te(e))return[ja(e.enter),ja(e.leave)];{const t=ja(e);return[t,t]}}function ja(e){return Wg(e)}function kn(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[yo]||(e[yo]=new Set)).add(t)}function tr(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[yo];n&&(n.delete(t),n.size||(e[yo]=void 0))}function Jc(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let jb=0;function Xc(e,t,n,r){const o=e._endId=++jb,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:a,propCount:l}=Vh(e,t);if(!i)return r();const u=i+"end";let c=0;const f=()=>{e.removeEventListener(u,p),s()},p=v=>{v.target===e&&++c>=l&&f()};setTimeout(()=>{c(n[h]||"").split(", "),o=r(`${Xn}Delay`),s=r(`${Xn}Duration`),i=Zc(o,s),a=r(`${jo}Delay`),l=r(`${jo}Duration`),u=Zc(a,l);let c=null,f=0,p=0;t===Xn?i>0&&(c=Xn,f=i,p=s.length):t===jo?u>0&&(c=jo,f=u,p=l.length):(f=Math.max(i,u),c=f>0?i>u?Xn:jo:null,p=c?c===Xn?s.length:l.length:0);const v=c===Xn&&/\b(transform|all)(,|$)/.test(r(`${Xn}Property`).toString());return{type:c,timeout:f,propCount:p,hasTransform:v}}function Zc(e,t){for(;e.lengthQc(n)+Qc(e[r])))}function Qc(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function zh(){return document.body.offsetHeight}function Vb(e,t,n){const r=e[yo];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Bi=Symbol("_vod"),Hh=Symbol("_vsh"),Pn={beforeMount(e,{value:t},{transition:n}){e[Bi]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Vo(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Vo(e,!0),r.enter(e)):r.leave(e,()=>{Vo(e,!1)}):Vo(e,t))},beforeUnmount(e,{value:t}){Vo(e,t)}};function Vo(e,t){e.style.display=t?e[Bi]:"none",e[Hh]=!t}const Kh=Symbol("");function s8(e){const t=rt();if(!t)return;const n=t.ut=(o=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(s=>Ol(s,o))},r=()=>{const o=e(t.proxy);Cl(t.subTree,o),n(o)};Ue(()=>{hb(r);const o=new MutationObserver(r);o.observe(t.subTree.el.parentNode,{childList:!0}),Jr(()=>o.disconnect())})}function Cl(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Cl(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)Ol(e.el,t);else if(e.type===tt)e.children.forEach(n=>Cl(n,t));else if(e.type===_i){let{el:n,anchor:r}=e;for(;n&&(Ol(n,t),n!==r);)n=n.nextSibling}}function Ol(e,t){if(e.nodeType===1){const n=e.style;let r="";for(const o in t)n.setProperty(`--${o}`,t[o]),r+=`--${o}: ${t[o]};`;n[Kh]=r}}const zb=/(^|;)\s*display\s*:/;function Hb(e,t,n){const r=e.style,o=xe(n);let s=!1;if(n&&!o){if(t)if(xe(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();n[a]==null&&Ei(r,a,"")}else for(const i in t)n[i]==null&&Ei(r,i,"");for(const i in n)i==="display"&&(s=!0),Ei(r,i,n[i])}else if(o){if(t!==n){const i=r[Kh];i&&(n+=";"+i),r.cssText=n,s=zb.test(n)}}else t&&e.removeAttribute("style");Bi in e&&(e[Bi]=s?r.display:"",e[Hh]&&(r.display="none"))}const ef=/\s*!important$/;function Ei(e,t,n){if(ce(n))n.forEach(r=>Ei(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Kb(e,t);ef.test(n)?e.setProperty(br(r),n.replace(ef,""),"important"):e[r]=n}}const tf=["Webkit","Moz","ms"],Va={};function Kb(e,t){const n=Va[t];if(n)return n;let r=un(t);if(r!=="filter"&&r in e)return Va[t]=r;r=$s(r);for(let o=0;oza||(Yb.then(()=>za=0),za=Date.now());function Xb(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;qt(Zb(r,n.value),t,5,[r])};return n.value=e,n.attached=Jb(),n}function Zb(e,t){if(ce(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const af=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Qb=(e,t,n,r,o,s,i,a,l)=>{const u=o==="svg";t==="class"?Vb(e,r,u):t==="style"?Hb(e,n,r):Qi(t)?su(t)||Wb(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):e0(e,t,r,u))?(Ub(e,t,r,s,i,a,l),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&rf(e,t,r,u,i,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),rf(e,t,r,u))};function e0(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&af(t)&&ve(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return af(t)&&xe(n)?!1:t in e}const Uh=new WeakMap,qh=new WeakMap,Di=Symbol("_moveCb"),lf=Symbol("_enterCb"),Wh={name:"TransitionGroup",props:ft({},Bb,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=rt(),r=Ah();let o,s;return Yr(()=>{if(!o.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!i0(o[0].el,n.vnode.el,i))return;o.forEach(r0),o.forEach(o0);const a=o.filter(s0);zh(),a.forEach(l=>{const u=l.el,c=u.style;kn(u,i),c.transform=c.webkitTransform=c.transitionDuration="";const f=u[Di]=p=>{p&&p.target!==u||(!p||/transform$/.test(p.propertyName))&&(u.removeEventListener("transitionend",f),u[Di]=null,tr(u,i))};u.addEventListener("transitionend",f)})}),()=>{const i=Le(e),a=jh(i);let l=i.tag||tt;if(o=[],s)for(let u=0;udelete e.mode;Wh.props;const n0=Wh;function r0(e){const t=e.el;t[Di]&&t[Di](),t[lf]&&t[lf]()}function o0(e){qh.set(e,e.el.getBoundingClientRect())}function s0(e){const t=Uh.get(e),n=qh.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const s=e.el.style;return s.transform=s.webkitTransform=`translate(${r}px,${o}px)`,s.transitionDuration="0s",e}}function i0(e,t,n){const r=e.cloneNode(),o=e[yo];o&&o.forEach(a=>{a.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:i}=Vh(r);return s.removeChild(r),i}const ji=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ce(t)?n=>bi(t,n):t};function a0(e){e.target.composing=!0}function uf(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const mo=Symbol("_assign"),l0={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[mo]=ji(o);const s=r||o.props&&o.props.type==="number";kr(e,t?"change":"input",i=>{if(i.target.composing)return;let a=e.value;n&&(a=a.trim()),s&&(a=dl(a)),e[mo](a)}),n&&kr(e,"change",()=>{e.value=e.value.trim()}),t||(kr(e,"compositionstart",a0),kr(e,"compositionend",uf),kr(e,"change",uf))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:s}},i){if(e[mo]=ji(i),e.composing)return;const a=(s||e.type==="number")&&!/^0\d/.test(e.value)?dl(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||o&&e.value.trim()===l)||(e.value=l))}},Vi={deep:!0,created(e,t,n){e[mo]=ji(n),kr(e,"change",()=>{const r=e._modelValue,o=u0(e),s=e.checked,i=e[mo];if(ce(r)){const a=Fp(r,o),l=a!==-1;if(s&&!l)i(r.concat(o));else if(!s&&l){const u=[...r];u.splice(a,1),i(u)}}else if(ea(r)){const a=new Set(r);s?a.add(o):a.delete(o),i(a)}else i(Gh(e,s))})},mounted:cf,beforeUpdate(e,t,n){e[mo]=ji(n),cf(e,t,n)}};function cf(e,{value:t,oldValue:n},r){e._modelValue=t,ce(t)?e.checked=Fp(t,r.props.value)>-1:ea(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=na(t,Gh(e,!0)))}function u0(e){return"_value"in e?e._value:e.value}function Gh(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const c0=["ctrl","shift","alt","meta"],f0={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>c0.some(n=>e[`${n}Key`]&&!t.includes(n))},lt=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(o,...s)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=br(o.key);if(t.some(i=>i===s||d0[i]===s))return e(o)})},p0=ft({patchProp:Qb},Fb);let ff;function Yh(){return ff||(ff=lb(p0))}const df=(...e)=>{Yh().render(...e)},h0=(...e)=>{const t=Yh().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=m0(r);if(!o)return;const s=t._component;!ve(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML="";const i=n(o,!1,v0(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t};function v0(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function m0(e){return xe(e)?document.querySelector(e):e}/*! - * vue-router v4.4.0 - * (c) 2024 Eduardo San Martin Morote - * @license MIT - */const ao=typeof document<"u";function g0(e){return e.__esModule||e[Symbol.toStringTag]==="Module"}const Ke=Object.assign;function Ha(e,t){const n={};for(const r in t){const o=t[r];n[r]=cn(o)?o.map(e):e(o)}return n}const es=()=>{},cn=Array.isArray,Jh=/#/g,y0=/&/g,b0=/\//g,w0=/=/g,_0=/\?/g,Xh=/\+/g,S0=/%5B/g,E0=/%5D/g,Zh=/%5E/g,C0=/%60/g,Qh=/%7B/g,O0=/%7C/g,ev=/%7D/g,T0=/%20/g;function Pu(e){return encodeURI(""+e).replace(O0,"|").replace(S0,"[").replace(E0,"]")}function x0(e){return Pu(e).replace(Qh,"{").replace(ev,"}").replace(Zh,"^")}function Tl(e){return Pu(e).replace(Xh,"%2B").replace(T0,"+").replace(Jh,"%23").replace(y0,"%26").replace(C0,"`").replace(Qh,"{").replace(ev,"}").replace(Zh,"^")}function A0(e){return Tl(e).replace(w0,"%3D")}function R0(e){return Pu(e).replace(Jh,"%23").replace(_0,"%3F")}function P0(e){return e==null?"":R0(e).replace(b0,"%2F")}function ms(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const I0=/\/$/,$0=e=>e.replace(I0,"");function Ka(e,t,n="/"){let r,o={},s="",i="";const a=t.indexOf("#");let l=t.indexOf("?");return a=0&&(l=-1),l>-1&&(r=t.slice(0,l),s=t.slice(l+1,a>-1?a:t.length),o=e(s)),a>-1&&(r=r||t.slice(0,a),i=t.slice(a,t.length)),r=M0(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:ms(i)}}function L0(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function pf(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function k0(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&bo(t.matched[r],n.matched[o])&&tv(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function bo(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function tv(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!N0(e[n],t[n]))return!1;return!0}function N0(e,t){return cn(e)?hf(e,t):cn(t)?hf(t,e):e===t}function hf(e,t){return cn(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function M0(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];(o===".."||o===".")&&r.push("");let s=n.length-1,i,a;for(i=0;i1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(i).join("/")}const Zn={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var gs;(function(e){e.pop="pop",e.push="push"})(gs||(gs={}));var ts;(function(e){e.back="back",e.forward="forward",e.unknown=""})(ts||(ts={}));function F0(e){if(!e)if(ao){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),$0(e)}const B0=/^[^#]+#/;function D0(e,t){return e.replace(B0,"#")+t}function j0(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const da=()=>({left:window.scrollX,top:window.scrollY});function V0(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=j0(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function vf(e,t){return(history.state?history.state.position-t:-1)+e}const xl=new Map;function z0(e,t){xl.set(e,t)}function H0(e){const t=xl.get(e);return xl.delete(e),t}let K0=()=>location.protocol+"//"+location.host;function nv(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let a=o.includes(e.slice(s))?e.slice(s).length:1,l=o.slice(a);return l[0]!=="/"&&(l="/"+l),pf(l,"")}return pf(n,e)+r+o}function U0(e,t,n,r){let o=[],s=[],i=null;const a=({state:p})=>{const v=nv(e,location),h=n.value,d=t.value;let y=0;if(p){if(n.value=v,t.value=p,i&&i===h){i=null;return}y=d?p.position-d.position:0}else r(v);o.forEach(g=>{g(n.value,h,{delta:y,type:gs.pop,direction:y?y>0?ts.forward:ts.back:ts.unknown})})};function l(){i=n.value}function u(p){o.push(p);const v=()=>{const h=o.indexOf(p);h>-1&&o.splice(h,1)};return s.push(v),v}function c(){const{history:p}=window;p.state&&p.replaceState(Ke({},p.state,{scroll:da()}),"")}function f(){for(const p of s)p();s=[],window.removeEventListener("popstate",a),window.removeEventListener("beforeunload",c)}return window.addEventListener("popstate",a),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:l,listen:u,destroy:f}}function mf(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?da():null}}function q0(e){const{history:t,location:n}=window,r={value:nv(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(l,u,c){const f=e.indexOf("#"),p=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+l:K0()+e+l;try{t[c?"replaceState":"pushState"](u,"",p),o.value=u}catch(v){console.error(v),n[c?"replace":"assign"](p)}}function i(l,u){const c=Ke({},t.state,mf(o.value.back,l,o.value.forward,!0),u,{position:o.value.position});s(l,c,!0),r.value=l}function a(l,u){const c=Ke({},o.value,t.state,{forward:l,scroll:da()});s(c.current,c,!0);const f=Ke({},mf(r.value,l,null),{position:c.position+1},u);s(l,f,!1),r.value=l}return{location:r,state:o,push:a,replace:i}}function W0(e){e=F0(e);const t=q0(e),n=U0(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=Ke({location:"",base:e,go:r,createHref:D0.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function i8(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),W0(e)}function G0(e){return typeof e=="string"||e&&typeof e=="object"}function rv(e){return typeof e=="string"||typeof e=="symbol"}const ov=Symbol("");var gf;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})(gf||(gf={}));function wo(e,t){return Ke(new Error,{type:e,[ov]:!0},t)}function $n(e,t){return e instanceof Error&&ov in e&&(t==null||!!(e.type&t))}const yf="[^/]+?",Y0={sensitive:!1,strict:!1,start:!0,end:!0},J0=/[.+*?^${}()[\]/\\]/g;function X0(e,t){const n=Ke({},Y0,t),r=[];let o=n.start?"^":"";const s=[];for(const u of e){const c=u.length?[]:[90];n.strict&&!u.length&&(o+="/");for(let f=0;ft.length?t.length===1&&t[0]===80?1:-1:0}function sv(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const Q0={type:0,value:""},e1=/[a-zA-Z0-9_]/;function t1(e){if(!e)return[[]];if(e==="/")return[[Q0]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(v){throw new Error(`ERR (${n})/"${u}": ${v}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let a=0,l,u="",c="";function f(){u&&(n===0?s.push({type:0,value:u}):n===1||n===2||n===3?(s.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),u="")}function p(){u+=l}for(;a{i(b)}:es}function i(f){if(rv(f)){const p=r.get(f);p&&(r.delete(f),n.splice(n.indexOf(p),1),p.children.forEach(i),p.alias.forEach(i))}else{const p=n.indexOf(f);p>-1&&(n.splice(p,1),f.record.name&&r.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function a(){return n}function l(f){const p=a1(f,n);n.splice(p,0,f),f.record.name&&!_f(f)&&r.set(f.record.name,f)}function u(f,p){let v,h={},d,y;if("name"in f&&f.name){if(v=r.get(f.name),!v)throw wo(1,{location:f});y=v.record.name,h=Ke(wf(p.params,v.keys.filter(b=>!b.optional).concat(v.parent?v.parent.keys.filter(b=>b.optional):[]).map(b=>b.name)),f.params&&wf(f.params,v.keys.map(b=>b.name))),d=v.stringify(h)}else if(f.path!=null)d=f.path,v=n.find(b=>b.re.test(d)),v&&(h=v.parse(d),y=v.record.name);else{if(v=p.name?r.get(p.name):n.find(b=>b.re.test(p.path)),!v)throw wo(1,{location:f,currentLocation:p});y=v.record.name,h=Ke({},p.params,f.params),d=v.stringify(h)}const g=[];let _=v;for(;_;)g.unshift(_.record),_=_.parent;return{name:y,path:d,params:h,matched:g,meta:i1(g)}}e.forEach(f=>s(f));function c(){n.length=0,r.clear()}return{addRoute:s,resolve:u,removeRoute:i,clearRoutes:c,getRoutes:a,getRecordMatcher:o}}function wf(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function o1(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:s1(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}}}function s1(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function _f(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function i1(e){return e.reduce((t,n)=>Ke(t,n.meta),{})}function Sf(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function a1(e,t){let n=0,r=t.length;for(;n!==r;){const s=n+r>>1;sv(e,t[s])<0?r=s:n=s+1}const o=l1(e);return o&&(r=t.lastIndexOf(o,r-1)),r}function l1(e){let t=e;for(;t=t.parent;)if(iv(t)&&sv(e,t)===0)return t}function iv({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function u1(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&Tl(s)):[r&&Tl(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function c1(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=cn(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const f1=Symbol(""),Cf=Symbol(""),pa=Symbol(""),av=Symbol(""),Al=Symbol("");function zo(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function lr(e,t,n,r,o,s=i=>i()){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((a,l)=>{const u=p=>{p===!1?l(wo(4,{from:n,to:t})):p instanceof Error?l(p):G0(p)?l(wo(2,{from:t,to:p})):(i&&r.enterCallbacks[o]===i&&typeof p=="function"&&i.push(p),a())},c=s(()=>e.call(r&&r.instances[o],t,n,u));let f=Promise.resolve(c);e.length<3&&(f=f.then(u)),f.catch(p=>l(p))})}function Ua(e,t,n,r,o=s=>s()){const s=[];for(const i of e)for(const a in i.components){let l=i.components[a];if(!(t!=="beforeRouteEnter"&&!i.instances[a]))if(d1(l)){const c=(l.__vccOpts||l)[t];c&&s.push(lr(c,n,r,i,a,o))}else{let u=l();s.push(()=>u.then(c=>{if(!c)return Promise.reject(new Error(`Couldn't resolve component "${a}" at "${i.path}"`));const f=g0(c)?c.default:c;i.components[a]=f;const v=(f.__vccOpts||f)[t];return v&&lr(v,n,r,i,a,o)()}))}}return s}function d1(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function Of(e){const t=Se(pa),n=Se(av),r=E(()=>{const l=m(e.to);return t.resolve(l)}),o=E(()=>{const{matched:l}=r.value,{length:u}=l,c=l[u-1],f=n.matched;if(!c||!f.length)return-1;const p=f.findIndex(bo.bind(null,c));if(p>-1)return p;const v=Tf(l[u-2]);return u>1&&Tf(c)===v&&f[f.length-1].path!==v?f.findIndex(bo.bind(null,l[u-2])):p}),s=E(()=>o.value>-1&&m1(n.params,r.value.params)),i=E(()=>o.value>-1&&o.value===n.matched.length-1&&tv(n.params,r.value.params));function a(l={}){return v1(l)?t[m(e.replace)?"replace":"push"](m(e.to)).catch(es):Promise.resolve()}return{route:r,href:E(()=>r.value.href),isActive:s,isExactActive:i,navigate:a}}const p1=J({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:Of,setup(e,{slots:t}){const n=Et(Of(e)),{options:r}=Se(pa),o=E(()=>({[xf(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[xf(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:Bn("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),h1=p1;function v1(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function m1(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!cn(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function Tf(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const xf=(e,t,n)=>e??t??n,g1=J({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Se(Al),o=E(()=>e.route||r.value),s=Se(Cf,0),i=E(()=>{let u=m(s);const{matched:c}=o.value;let f;for(;(f=c[u])&&!f.components;)u++;return u}),a=E(()=>o.value.matched[i.value]);ut(Cf,E(()=>i.value+1)),ut(f1,a),ut(Al,o);const l=j();return pe(()=>[l.value,a.value,e.name],([u,c,f],[p,v,h])=>{c&&(c.instances[f]=u,v&&v!==c&&u&&u===p&&(c.leaveGuards.size||(c.leaveGuards=v.leaveGuards),c.updateGuards.size||(c.updateGuards=v.updateGuards))),u&&c&&(!v||!bo(c,v)||!p)&&(c.enterCallbacks[f]||[]).forEach(d=>d(u))},{flush:"post"}),()=>{const u=o.value,c=e.name,f=a.value,p=f&&f.components[c];if(!p)return Af(n.default,{Component:p,route:u});const v=f.props[c],h=v?v===!0?u.params:typeof v=="function"?v(u):v:null,y=Bn(p,Ke({},h,t,{onVnodeUnmounted:g=>{g.component.isUnmounted&&(f.instances[c]=null)},ref:l}));return Af(n.default,{Component:y,route:u})||y}}});function Af(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const y1=g1;function a8(e){const t=r1(e.routes,e),n=e.parseQuery||u1,r=e.stringifyQuery||Ef,o=e.history,s=zo(),i=zo(),a=zo(),l=vr(Zn);let u=Zn;ao&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=Ha.bind(null,A=>""+A),f=Ha.bind(null,P0),p=Ha.bind(null,ms);function v(A,q){let X,ne;return rv(A)?(X=t.getRecordMatcher(A),ne=q):ne=A,t.addRoute(ne,X)}function h(A){const q=t.getRecordMatcher(A);q&&t.removeRoute(q)}function d(){return t.getRoutes().map(A=>A.record)}function y(A){return!!t.getRecordMatcher(A)}function g(A,q){if(q=Ke({},q||l.value),typeof A=="string"){const S=Ka(n,A,q.path),M=t.resolve({path:S.path},q),U=o.createHref(S.fullPath);return Ke(S,M,{params:p(M.params),hash:ms(S.hash),redirectedFrom:void 0,href:U})}let X;if(A.path!=null)X=Ke({},A,{path:Ka(n,A.path,q.path).path});else{const S=Ke({},A.params);for(const M in S)S[M]==null&&delete S[M];X=Ke({},A,{params:f(S)}),q.params=f(q.params)}const ne=t.resolve(X,q),_e=A.hash||"";ne.params=c(p(ne.params));const Re=L0(r,Ke({},A,{hash:x0(_e),path:ne.path})),w=o.createHref(Re);return Ke({fullPath:Re,hash:_e,query:r===Ef?c1(A.query):A.query||{}},ne,{redirectedFrom:void 0,href:w})}function _(A){return typeof A=="string"?Ka(n,A,l.value.path):Ke({},A)}function b(A,q){if(u!==A)return wo(8,{from:q,to:A})}function T(A){return x(A)}function C(A){return T(Ke(_(A),{replace:!0}))}function O(A){const q=A.matched[A.matched.length-1];if(q&&q.redirect){const{redirect:X}=q;let ne=typeof X=="function"?X(A):X;return typeof ne=="string"&&(ne=ne.includes("?")||ne.includes("#")?ne=_(ne):{path:ne},ne.params={}),Ke({query:A.query,hash:A.hash,params:ne.path!=null?{}:A.params},ne)}}function x(A,q){const X=u=g(A),ne=l.value,_e=A.state,Re=A.force,w=A.replace===!0,S=O(X);if(S)return x(Ke(_(S),{state:typeof S=="object"?Ke({},_e,S.state):_e,force:Re,replace:w}),q||X);const M=X;M.redirectedFrom=q;let U;return!Re&&k0(r,ne,X)&&(U=wo(16,{to:M,from:ne}),je(ne,ne,!0,!1)),(U?Promise.resolve(U):k(M,ne)).catch(H=>$n(H)?$n(H,2)?H:Pe(H):se(H,M,ne)).then(H=>{if(H){if($n(H,2))return x(Ke({replace:w},_(H.to),{state:typeof H.to=="object"?Ke({},_e,H.to.state):_e,force:Re}),q||M)}else H=B(M,ne,!0,w,_e);return z(M,ne,H),H})}function L(A,q){const X=b(A,q);return X?Promise.reject(X):Promise.resolve()}function I(A){const q=Ee.values().next().value;return q&&typeof q.runWithContext=="function"?q.runWithContext(A):A()}function k(A,q){let X;const[ne,_e,Re]=b1(A,q);X=Ua(ne.reverse(),"beforeRouteLeave",A,q);for(const S of ne)S.leaveGuards.forEach(M=>{X.push(lr(M,A,q))});const w=L.bind(null,A,q);return X.push(w),$e(X).then(()=>{X=[];for(const S of s.list())X.push(lr(S,A,q));return X.push(w),$e(X)}).then(()=>{X=Ua(_e,"beforeRouteUpdate",A,q);for(const S of _e)S.updateGuards.forEach(M=>{X.push(lr(M,A,q))});return X.push(w),$e(X)}).then(()=>{X=[];for(const S of Re)if(S.beforeEnter)if(cn(S.beforeEnter))for(const M of S.beforeEnter)X.push(lr(M,A,q));else X.push(lr(S.beforeEnter,A,q));return X.push(w),$e(X)}).then(()=>(A.matched.forEach(S=>S.enterCallbacks={}),X=Ua(Re,"beforeRouteEnter",A,q,I),X.push(w),$e(X))).then(()=>{X=[];for(const S of i.list())X.push(lr(S,A,q));return X.push(w),$e(X)}).catch(S=>$n(S,8)?S:Promise.reject(S))}function z(A,q,X){a.list().forEach(ne=>I(()=>ne(A,q,X)))}function B(A,q,X,ne,_e){const Re=b(A,q);if(Re)return Re;const w=q===Zn,S=ao?history.state:{};X&&(ne||w?o.replace(A.fullPath,Ke({scroll:w&&S&&S.scroll},_e)):o.push(A.fullPath,_e)),l.value=A,je(A,q,X,w),Pe()}let K;function G(){K||(K=o.listen((A,q,X)=>{if(!Ze.listening)return;const ne=g(A),_e=O(ne);if(_e){x(Ke(_e,{replace:!0}),ne).catch(es);return}u=ne;const Re=l.value;ao&&z0(vf(Re.fullPath,X.delta),da()),k(ne,Re).catch(w=>$n(w,12)?w:$n(w,2)?(x(w.to,ne).then(S=>{$n(S,20)&&!X.delta&&X.type===gs.pop&&o.go(-1,!1)}).catch(es),Promise.reject()):(X.delta&&o.go(-X.delta,!1),se(w,ne,Re))).then(w=>{w=w||B(ne,Re,!1),w&&(X.delta&&!$n(w,8)?o.go(-X.delta,!1):X.type===gs.pop&&$n(w,20)&&o.go(-1,!1)),z(ne,Re,w)}).catch(es)}))}let R=zo(),F=zo(),$;function se(A,q,X){Pe(A);const ne=F.list();return ne.length?ne.forEach(_e=>_e(A,q,X)):console.error(A),Promise.reject(A)}function me(){return $&&l.value!==Zn?Promise.resolve():new Promise((A,q)=>{R.add([A,q])})}function Pe(A){return $||($=!A,G(),R.list().forEach(([q,X])=>A?X(A):q()),R.reset()),A}function je(A,q,X,ne){const{scrollBehavior:_e}=e;if(!ao||!_e)return Promise.resolve();const Re=!X&&H0(vf(A.fullPath,0))||(ne||!X)&&history.state&&history.state.scroll||null;return Ve().then(()=>_e(A,q,Re)).then(w=>w&&V0(w)).catch(w=>se(w,A,q))}const Ce=A=>o.go(A);let Oe;const Ee=new Set,Ze={currentRoute:l,listening:!0,addRoute:v,removeRoute:h,clearRoutes:t.clearRoutes,hasRoute:y,getRoutes:d,resolve:g,options:e,push:T,replace:C,go:Ce,back:()=>Ce(-1),forward:()=>Ce(1),beforeEach:s.add,beforeResolve:i.add,afterEach:a.add,onError:F.add,isReady:me,install(A){const q=this;A.component("RouterLink",h1),A.component("RouterView",y1),A.config.globalProperties.$router=q,Object.defineProperty(A.config.globalProperties,"$route",{enumerable:!0,get:()=>m(l)}),ao&&!Oe&&l.value===Zn&&(Oe=!0,T(o.location).catch(_e=>{}));const X={};for(const _e in Zn)Object.defineProperty(X,_e,{get:()=>l.value[_e],enumerable:!0});A.provide(pa,q),A.provide(av,vu(X)),A.provide(Al,l);const ne=A.unmount;Ee.add(A),A.unmount=function(){Ee.delete(A),Ee.size<1&&(u=Zn,K&&K(),K=null,l.value=Zn,Oe=!1,$=!1),ne()}}};function $e(A){return A.reduce((q,X)=>q.then(()=>I(X)),Promise.resolve())}return Ze}function b1(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;ibo(u,a))?r.push(a):n.push(a));const l=e.matched[i];l&&(t.matched.find(u=>bo(u,l))||o.push(l))}return[n,r,o]}function l8(){return Se(pa)}const Mn=(e,t,{checkForDefaultPrevented:n=!0}={})=>o=>{const s=e==null?void 0:e(o);if(n===!1||!s)return t==null?void 0:t(o)};var w1=!1,_1=Object.defineProperty,S1=Object.defineProperties,E1=Object.getOwnPropertyDescriptors,Rf=Object.getOwnPropertySymbols,C1=Object.prototype.hasOwnProperty,O1=Object.prototype.propertyIsEnumerable,Pf=(e,t,n)=>t in e?_1(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,T1=(e,t)=>{for(var n in t||(t={}))C1.call(t,n)&&Pf(e,n,t[n]);if(Rf)for(var n of Rf(t))O1.call(t,n)&&Pf(e,n,t[n]);return e},x1=(e,t)=>S1(e,E1(t));function If(e,t){var n;const r=vr();return xu(()=>{r.value=e()},x1(T1({},t),{flush:(n=void 0)!=null?n:"sync"})),Ls(r)}var $f;const nt=typeof window<"u",A1=e=>typeof e=="string",zi=()=>{},Rl=nt&&(($f=window==null?void 0:window.navigator)==null?void 0:$f.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function ys(e){return typeof e=="function"?e():m(e)}function R1(e,t){function n(...r){return new Promise((o,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(o).catch(s)})}return n}function P1(e,t={}){let n,r,o=zi;const s=a=>{clearTimeout(a),o(),o=zi};return a=>{const l=ys(e),u=ys(t.maxWait);return n&&s(n),l<=0||u!==void 0&&u<=0?(r&&(s(r),r=null),Promise.resolve(a())):new Promise((c,f)=>{o=t.rejectOnCancel?f:c,u&&!r&&(r=setTimeout(()=>{n&&s(n),r=null,c(a())},u)),n=setTimeout(()=>{r&&s(r),r=null,c(a())},l)})}}function I1(e){return e}function Ns(e){return lu()?(uu(e),!0):!1}function $1(e,t=200,n={}){return R1(P1(t,n),e)}function L1(e,t=200,n={}){const r=j(e.value),o=$1(()=>{r.value=e.value},t,n);return pe(e,()=>o()),r}function k1(e,t=!0){rt()?Ue(e):t?e():Ve(e)}function Pl(e,t,n={}){const{immediate:r=!0}=n,o=j(!1);let s=null;function i(){s&&(clearTimeout(s),s=null)}function a(){o.value=!1,i()}function l(...u){i(),o.value=!0,s=setTimeout(()=>{o.value=!1,s=null,e(...u)},ys(t))}return r&&(o.value=!0,nt&&l()),Ns(a),{isPending:Ls(o),start:l,stop:a}}function Dn(e){var t;const n=ys(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Ms=nt?window:void 0,N1=nt?window.document:void 0;function an(...e){let t,n,r,o;if(A1(e[0])||Array.isArray(e[0])?([n,r,o]=e,t=Ms):[t,n,r,o]=e,!t)return zi;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],i=()=>{s.forEach(c=>c()),s.length=0},a=(c,f,p,v)=>(c.addEventListener(f,p,v),()=>c.removeEventListener(f,p,v)),l=pe(()=>[Dn(t),ys(o)],([c,f])=>{i(),c&&s.push(...n.flatMap(p=>r.map(v=>a(c,p,v,f))))},{immediate:!0,flush:"post"}),u=()=>{l(),i()};return Ns(u),u}let Lf=!1;function M1(e,t,n={}){const{window:r=Ms,ignore:o=[],capture:s=!0,detectIframe:i=!1}=n;if(!r)return;Rl&&!Lf&&(Lf=!0,Array.from(r.document.body.children).forEach(p=>p.addEventListener("click",zi)));let a=!0;const l=p=>o.some(v=>{if(typeof v=="string")return Array.from(r.document.querySelectorAll(v)).some(h=>h===p.target||p.composedPath().includes(h));{const h=Dn(v);return h&&(p.target===h||p.composedPath().includes(h))}}),c=[an(r,"click",p=>{const v=Dn(e);if(!(!v||v===p.target||p.composedPath().includes(v))){if(p.detail===0&&(a=!l(p)),!a){a=!0;return}t(p)}},{passive:!0,capture:s}),an(r,"pointerdown",p=>{const v=Dn(e);v&&(a=!p.composedPath().includes(v)&&!l(p))},{passive:!0}),i&&an(r,"blur",p=>{var v;const h=Dn(e);((v=r.document.activeElement)==null?void 0:v.tagName)==="IFRAME"&&!(h!=null&&h.contains(r.document.activeElement))&&t(p)})].filter(Boolean);return()=>c.forEach(p=>p())}function lv(e,t=!1){const n=j(),r=()=>n.value=!!e();return r(),k1(r,t),n}const kf=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Nf="__vueuse_ssr_handlers__";kf[Nf]=kf[Nf]||{};function F1({document:e=N1}={}){if(!e)return j("visible");const t=j(e.visibilityState);return an(e,"visibilitychange",()=>{t.value=e.visibilityState}),t}var Mf=Object.getOwnPropertySymbols,B1=Object.prototype.hasOwnProperty,D1=Object.prototype.propertyIsEnumerable,j1=(e,t)=>{var n={};for(var r in e)B1.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Mf)for(var r of Mf(e))t.indexOf(r)<0&&D1.call(e,r)&&(n[r]=e[r]);return n};function Bt(e,t,n={}){const r=n,{window:o=Ms}=r,s=j1(r,["window"]);let i;const a=lv(()=>o&&"ResizeObserver"in o),l=()=>{i&&(i.disconnect(),i=void 0)},u=pe(()=>Dn(e),f=>{l(),a.value&&o&&f&&(i=new ResizeObserver(t),i.observe(f,s))},{immediate:!0,flush:"post"}),c=()=>{l(),u()};return Ns(c),{isSupported:a,stop:c}}var Ff=Object.getOwnPropertySymbols,V1=Object.prototype.hasOwnProperty,z1=Object.prototype.propertyIsEnumerable,H1=(e,t)=>{var n={};for(var r in e)V1.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Ff)for(var r of Ff(e))t.indexOf(r)<0&&z1.call(e,r)&&(n[r]=e[r]);return n};function K1(e,t,n={}){const r=n,{window:o=Ms}=r,s=H1(r,["window"]);let i;const a=lv(()=>o&&"MutationObserver"in o),l=()=>{i&&(i.disconnect(),i=void 0)},u=pe(()=>Dn(e),f=>{l(),a.value&&o&&f&&(i=new MutationObserver(t),i.observe(f,s))},{immediate:!0}),c=()=>{l(),u()};return Ns(c),{isSupported:a,stop:c}}var Bf;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(Bf||(Bf={}));var U1=Object.defineProperty,Df=Object.getOwnPropertySymbols,q1=Object.prototype.hasOwnProperty,W1=Object.prototype.propertyIsEnumerable,jf=(e,t,n)=>t in e?U1(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,G1=(e,t)=>{for(var n in t||(t={}))q1.call(t,n)&&jf(e,n,t[n]);if(Df)for(var n of Df(t))W1.call(t,n)&&jf(e,n,t[n]);return e};const Y1={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};G1({linear:I1},Y1);function J1({window:e=Ms}={}){if(!e)return j(!1);const t=j(e.document.hasFocus());return an(e,"blur",()=>{t.value=!1}),an(e,"focus",()=>{t.value=!0}),t}const X1=()=>nt&&/firefox/i.test(window.navigator.userAgent);var uv=typeof global=="object"&&global&&global.Object===Object&&global,Z1=typeof self=="object"&&self&&self.Object===Object&&self,pn=uv||Z1||Function("return this")(),Yt=pn.Symbol,cv=Object.prototype,Q1=cv.hasOwnProperty,ew=cv.toString,Ho=Yt?Yt.toStringTag:void 0;function tw(e){var t=Q1.call(e,Ho),n=e[Ho];try{e[Ho]=void 0;var r=!0}catch{}var o=ew.call(e);return r&&(t?e[Ho]=n:delete e[Ho]),o}var nw=Object.prototype,rw=nw.toString;function ow(e){return rw.call(e)}var sw="[object Null]",iw="[object Undefined]",Vf=Yt?Yt.toStringTag:void 0;function Po(e){return e==null?e===void 0?iw:sw:Vf&&Vf in Object(e)?tw(e):ow(e)}function yr(e){return e!=null&&typeof e=="object"}var aw="[object Symbol]";function ha(e){return typeof e=="symbol"||yr(e)&&Po(e)==aw}function lw(e,t){for(var n=-1,r=e==null?0:e.length,o=Array(r);++n0){if(++t>=Fw)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function Vw(e){return function(){return e}}var Hi=function(){try{var e=Qr(Object,"defineProperty");return e({},"",{}),e}catch{}}(),zw=Hi?function(e,t){return Hi(e,"toString",{configurable:!0,enumerable:!1,value:Vw(t),writable:!0})}:dv,Hw=jw(zw);function Kw(e,t){for(var n=-1,r=e==null?0:e.length;++n-1&&e%1==0&&e-1&&e%1==0&&e<=Xw}function vv(e){return e!=null&&ku(e.length)&&!pv(e)}var Zw=Object.prototype;function Nu(e){var t=e&&e.constructor,n=typeof t=="function"&&t.prototype||Zw;return e===n}function Qw(e,t){for(var n=-1,r=Array(e);++n-1}function aS(e,t){var n=this.__data__,r=ga(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}function qn(e){var t=-1,n=e==null?0:e.length;for(this.clear();++ta))return!1;var u=s.get(e),c=s.get(t);if(u&&c)return u==t&&c==e;var f=-1,p=!0,v=n&uE?new Wi:void 0;for(s.set(e,t),s.set(t,e);++f=t||x<0||f&&L>=s}function g(){var O=Ya();if(y(O))return _(O);a=setTimeout(g,d(O))}function _(O){return a=void 0,p&&r?v(O):(r=o=void 0,i)}function b(){a!==void 0&&clearTimeout(a),u=0,r=l=o=a=void 0}function T(){return a===void 0?i:_(Ya())}function C(){var O=Ya(),x=y(O);if(r=arguments,o=this,l=O,x){if(a===void 0)return h(l);if(f)return clearTimeout(a),a=setTimeout(g,t),v(l)}return a===void 0&&(a=setTimeout(g,t)),i}return C.cancel=b,C.flush=T,C}function XE(e,t,n){var r=e==null?0:e.length;if(!r)return-1;var o=r-1;return Uw(e,qE(t),o)}function Gi(e){for(var t=-1,n=e==null?0:e.length,r={};++te===void 0,jt=e=>typeof e=="boolean",ze=e=>typeof e=="number",So=e=>typeof Element>"u"?!1:e instanceof Element,Ml=e=>Cn(e),tC=e=>xe(e)?!Number.isNaN(Number(e)):!1,nC=(e="")=>e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d"),cr=e=>$s(e),yd=e=>Object.keys(e),Ja=(e,t,n)=>({get value(){return Sn(e,t,n)},set value(r){eC(e,t,r)}});class rC extends Error{constructor(t){super(t),this.name="ElementPlusError"}}function Sr(e,t){throw new rC(`[${e}] ${t}`)}const Fv=(e="")=>e.split(" ").filter(t=>!!t.trim()),bd=(e,t)=>{if(!e||!t)return!1;if(t.includes(" "))throw new Error("className should not contain space.");return e.classList.contains(t)},Fl=(e,t)=>{!e||!t.trim()||e.classList.add(...Fv(t))},Ss=(e,t)=>{!e||!t.trim()||e.classList.remove(...Fv(t))},lo=(e,t)=>{var n;if(!nt||!e||!t)return"";let r=un(t);r==="float"&&(r="cssFloat");try{const o=e.style[r];if(o)return o;const s=(n=document.defaultView)==null?void 0:n.getComputedStyle(e,"");return s?s[r]:""}catch{return e.style[r]}};function Xt(e,t="px"){if(!e)return"";if(ze(e)||tC(e))return`${e}${t}`;if(xe(e))return e}let si;const oC=e=>{var t;if(!nt)return 0;if(si!==void 0)return si;const n=document.createElement("div");n.className=`${e}-scrollbar__wrap`,n.style.visibility="hidden",n.style.width="100px",n.style.position="absolute",n.style.top="-9999px",document.body.appendChild(n);const r=n.offsetWidth;n.style.overflow="scroll";const o=document.createElement("div");o.style.width="100%",n.appendChild(o);const s=o.offsetWidth;return(t=n.parentNode)==null||t.removeChild(n),si=r-s,si};function sC(e,t){if(!nt)return;if(!t){e.scrollTop=0;return}const n=[];let r=t.offsetParent;for(;r!==null&&e!==r&&e.contains(r);)n.push(r),r=r.offsetParent;const o=t.offsetTop+n.reduce((l,u)=>l+u.offsetTop,0),s=o+t.offsetHeight,i=e.scrollTop,a=i+e.clientHeight;oa&&(e.scrollTop=s-e.clientHeight)}/*! Element Plus Icons Vue v2.3.1 */var iC=J({name:"ArrowDown",__name:"arrow-down",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.712a29.12 29.12 0 0 0 0-41.728 30.592 30.592 0 0 0-42.752 0z"})]))}}),Bv=iC,aC=J({name:"ArrowLeft",__name:"arrow-left",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M609.408 149.376 277.76 489.6a32 32 0 0 0 0 44.672l331.648 340.352a29.12 29.12 0 0 0 41.728 0 30.592 30.592 0 0 0 0-42.752L339.264 511.936l311.872-319.872a30.592 30.592 0 0 0 0-42.688 29.12 29.12 0 0 0-41.728 0z"})]))}}),lC=aC,uC=J({name:"ArrowRight",__name:"arrow-right",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z"})]))}}),cC=uC,fC=J({name:"ArrowUp",__name:"arrow-up",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"m488.832 344.32-339.84 356.672a32 32 0 0 0 0 44.16l.384.384a29.44 29.44 0 0 0 42.688 0l320-335.872 319.872 335.872a29.44 29.44 0 0 0 42.688 0l.384-.384a32 32 0 0 0 0-44.16L535.168 344.32a32 32 0 0 0-46.336 0"})]))}}),dC=fC,pC=J({name:"CircleCheckFilled",__name:"circle-check-filled",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.272 38.272 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),u8=pC,hC=J({name:"CircleCheck",__name:"circle-check",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896"}),fe("path",{fill:"currentColor",d:"M745.344 361.344a32 32 0 0 1 45.312 45.312l-288 288a32 32 0 0 1-45.312 0l-160-160a32 32 0 1 1 45.312-45.312L480 626.752l265.344-265.408z"})]))}}),vC=hC,mC=J({name:"CircleCloseFilled",__name:"circle-close-filled",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z"})]))}}),Dv=mC,gC=J({name:"CircleClose",__name:"circle-close",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"m466.752 512-90.496-90.496a32 32 0 0 1 45.248-45.248L512 466.752l90.496-90.496a32 32 0 1 1 45.248 45.248L557.248 512l90.496 90.496a32 32 0 1 1-45.248 45.248L512 557.248l-90.496 90.496a32 32 0 0 1-45.248-45.248z"}),fe("path",{fill:"currentColor",d:"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896"})]))}}),Uu=gC,yC=J({name:"Close",__name:"close",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"})]))}}),Es=yC,bC=J({name:"Delete",__name:"delete",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M160 256H96a32 32 0 0 1 0-64h256V95.936a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V192h256a32 32 0 1 1 0 64h-64v672a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32zm448-64v-64H416v64zM224 896h576V256H224zm192-128a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32m192 0a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32"})]))}}),c8=bC,wC=J({name:"Download",__name:"download",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64m384-253.696 236.288-236.352 45.248 45.248L508.8 704 192 387.2l45.248-45.248L480 584.704V128h64z"})]))}}),f8=wC,_C=J({name:"Edit",__name:"edit",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M832 512a32 32 0 1 1 64 0v352a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h352a32 32 0 0 1 0 64H192v640h640z"}),fe("path",{fill:"currentColor",d:"m469.952 554.24 52.8-7.552L847.104 222.4a32 32 0 1 0-45.248-45.248L477.44 501.44l-7.552 52.8zm422.4-422.4a96 96 0 0 1 0 135.808l-331.84 331.84a32 32 0 0 1-18.112 9.088L436.8 623.68a32 32 0 0 1-36.224-36.224l15.104-105.6a32 32 0 0 1 9.024-18.112l331.904-331.84a96 96 0 0 1 135.744 0z"})]))}}),d8=_C,SC=J({name:"Folder",__name:"folder",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M128 192v640h768V320H485.76L357.504 192zm-32-64h287.872l128.384 128H928a32 32 0 0 1 32 32v576a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32"})]))}}),p8=SC,EC=J({name:"Hide",__name:"hide",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M876.8 156.8c0-9.6-3.2-16-9.6-22.4-6.4-6.4-12.8-9.6-22.4-9.6-9.6 0-16 3.2-22.4 9.6L736 220.8c-64-32-137.6-51.2-224-60.8-160 16-288 73.6-377.6 176C44.8 438.4 0 496 0 512s48 73.6 134.4 176c22.4 25.6 44.8 48 73.6 67.2l-86.4 89.6c-6.4 6.4-9.6 12.8-9.6 22.4 0 9.6 3.2 16 9.6 22.4 6.4 6.4 12.8 9.6 22.4 9.6 9.6 0 16-3.2 22.4-9.6l704-710.4c3.2-6.4 6.4-12.8 6.4-22.4Zm-646.4 528c-76.8-70.4-128-128-153.6-172.8 28.8-48 80-105.6 153.6-172.8C304 272 400 230.4 512 224c64 3.2 124.8 19.2 176 44.8l-54.4 54.4C598.4 300.8 560 288 512 288c-64 0-115.2 22.4-160 64s-64 96-64 160c0 48 12.8 89.6 35.2 124.8L256 707.2c-9.6-6.4-19.2-16-25.6-22.4Zm140.8-96c-12.8-22.4-19.2-48-19.2-76.8 0-44.8 16-83.2 48-112 32-28.8 67.2-48 112-48 28.8 0 54.4 6.4 73.6 19.2zM889.599 336c-12.8-16-28.8-28.8-41.6-41.6l-48 48c73.6 67.2 124.8 124.8 150.4 169.6-28.8 48-80 105.6-153.6 172.8-73.6 67.2-172.8 108.8-284.8 115.2-51.2-3.2-99.2-12.8-140.8-28.8l-48 48c57.6 22.4 118.4 38.4 188.8 44.8 160-16 288-73.6 377.6-176C979.199 585.6 1024 528 1024 512s-48.001-73.6-134.401-176Z"}),fe("path",{fill:"currentColor",d:"M511.998 672c-12.8 0-25.6-3.2-38.4-6.4l-51.2 51.2c28.8 12.8 57.6 19.2 89.6 19.2 64 0 115.2-22.4 160-64 41.6-41.6 64-96 64-160 0-32-6.4-64-19.2-89.6l-51.2 51.2c3.2 12.8 6.4 25.6 6.4 38.4 0 44.8-16 83.2-48 112-32 28.8-67.2 48-112 48Z"})]))}}),CC=EC,OC=J({name:"InfoFilled",__name:"info-filled",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.992 12.992 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z"})]))}}),jv=OC,TC=J({name:"Link",__name:"link",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M715.648 625.152 670.4 579.904l90.496-90.56c75.008-74.944 85.12-186.368 22.656-248.896-62.528-62.464-173.952-52.352-248.96 22.656L444.16 353.6l-45.248-45.248 90.496-90.496c100.032-99.968 251.968-110.08 339.456-22.656 87.488 87.488 77.312 239.424-22.656 339.456l-90.496 90.496zm-90.496 90.496-90.496 90.496C434.624 906.112 282.688 916.224 195.2 828.8c-87.488-87.488-77.312-239.424 22.656-339.456l90.496-90.496 45.248 45.248-90.496 90.56c-75.008 74.944-85.12 186.368-22.656 248.896 62.528 62.464 173.952 52.352 248.96-22.656l90.496-90.496zm0-362.048 45.248 45.248L398.848 670.4 353.6 625.152z"})]))}}),h8=TC,xC=J({name:"Loading",__name:"loading",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32m0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32m448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32m-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32M195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0m-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"})]))}}),qu=xC,AC=J({name:"Minus",__name:"minus",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M128 544h768a32 32 0 1 0 0-64H128a32 32 0 0 0 0 64"})]))}}),RC=AC,PC=J({name:"Plus",__name:"plus",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M480 480V128a32 32 0 0 1 64 0v352h352a32 32 0 1 1 0 64H544v352a32 32 0 1 1-64 0V544H128a32 32 0 0 1 0-64z"})]))}}),Vv=PC,IC=J({name:"Search",__name:"search",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704"})]))}}),v8=IC,$C=J({name:"SuccessFilled",__name:"success-filled",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.272 38.272 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),zv=$C,LC=J({name:"View",__name:"view",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 160c320 0 512 352 512 352S832 864 512 864 0 512 0 512s192-352 512-352m0 64c-225.28 0-384.128 208.064-436.8 288 52.608 79.872 211.456 288 436.8 288 225.28 0 384.128-208.064 436.8-288-52.608-79.872-211.456-288-436.8-288zm0 64a224 224 0 1 1 0 448 224 224 0 0 1 0-448m0 64a160.192 160.192 0 0 0-160 160c0 88.192 71.744 160 160 160s160-71.808 160-160-71.744-160-160-160"})]))}}),kC=LC,NC=J({name:"WarningFilled",__name:"warning-filled",setup(e){return(t,n)=>(P(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.432 58.432 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.432 58.432 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4"})]))}}),Hv=NC;const Kv="__epPropKey",we=e=>e,MC=e=>Te(e)&&!!e[Kv],_a=(e,t)=>{if(!Te(e)||MC(e))return e;const{values:n,required:r,default:o,type:s,validator:i}=e,l={type:s,required:!!r,validator:n||i?u=>{let c=!1,f=[];if(n&&(f=Array.from(n),De(e,"default")&&f.push(o),c||(c=f.includes(u))),i&&(c||(c=i(u))),!c&&f.length>0){const p=[...new Set(f)].map(v=>JSON.stringify(v)).join(", ");kb(`Invalid prop: validation failed${t?` for prop "${t}"`:""}. Expected one of [${p}], got value ${JSON.stringify(u)}.`)}return c}:void 0,[Kv]:!0};return De(e,"default")&&(l.default=o),l},Ie=e=>Gi(Object.entries(e).map(([t,n])=>[t,_a(n,t)])),Pt=we([String,Object,Function]),FC={Close:Es},BC={Close:Es,SuccessFilled:zv,InfoFilled:jv,WarningFilled:Hv,CircleCloseFilled:Dv},wd={success:zv,warning:Hv,error:Dv,info:jv},Uv={validating:qu,success:vC,error:Uu},yt=(e,t)=>{if(e.install=n=>{for(const r of[e,...Object.values(t??{})])n.component(r.name,r)},t)for(const[n,r]of Object.entries(t))e[n]=r;return e},DC=(e,t)=>(e.install=n=>{e._context=n._context,n.config.globalProperties[t]=e},e),jC=(e,t)=>(e.install=n=>{n.directive(t,e)},e),eo=e=>(e.install=ct,e),VC=(...e)=>t=>{e.forEach(n=>{ve(n)?n(t):n.value=t})},On={tab:"Tab",enter:"Enter",space:"Space",left:"ArrowLeft",up:"ArrowUp",right:"ArrowRight",down:"ArrowDown",esc:"Escape",delete:"Delete",backspace:"Backspace",numpadEnter:"NumpadEnter",pageUp:"PageUp",pageDown:"PageDown",home:"Home",end:"End"},Ge="update:modelValue",Kr="change",Dr="input",Io=["","default","small","large"],zC=e=>["",...Io].includes(e);var Oi=(e=>(e[e.TEXT=1]="TEXT",e[e.CLASS=2]="CLASS",e[e.STYLE=4]="STYLE",e[e.PROPS=8]="PROPS",e[e.FULL_PROPS=16]="FULL_PROPS",e[e.HYDRATE_EVENTS=32]="HYDRATE_EVENTS",e[e.STABLE_FRAGMENT=64]="STABLE_FRAGMENT",e[e.KEYED_FRAGMENT=128]="KEYED_FRAGMENT",e[e.UNKEYED_FRAGMENT=256]="UNKEYED_FRAGMENT",e[e.NEED_PATCH=512]="NEED_PATCH",e[e.DYNAMIC_SLOTS=1024]="DYNAMIC_SLOTS",e[e.HOISTED=-1]="HOISTED",e[e.BAIL=-2]="BAIL",e))(Oi||{});const Ti=e=>{const t=ce(e)?e:[e],n=[];return t.forEach(r=>{var o;ce(r)?n.push(...Ti(r)):Vn(r)&&ce(r.children)?n.push(...Ti(r.children)):(n.push(r),Vn(r)&&((o=r.component)!=null&&o.subTree)&&n.push(...Ti(r.component.subTree)))}),n},qv=e=>/([\uAC00-\uD7AF\u3130-\u318F])+/gi.test(e),Sa=e=>e,HC=["class","style"],KC=/^on[A-Z]/,UC=(e={})=>{const{excludeListeners:t=!1,excludeKeys:n}=e,r=E(()=>((n==null?void 0:n.value)||[]).concat(HC)),o=rt();return E(o?()=>{var s;return Gi(Object.entries((s=o.proxy)==null?void 0:s.$attrs).filter(([i])=>!r.value.includes(i)&&!(t&&KC.test(i))))}:()=>({}))},Ut=({from:e,replacement:t,scope:n,version:r,ref:o,type:s="API"},i)=>{pe(()=>m(i),a=>{},{immediate:!0})},qC=(e,t,n,r)=>{let o={offsetX:0,offsetY:0};const s=l=>{const u=l.clientX,c=l.clientY,{offsetX:f,offsetY:p}=o,v=e.value.getBoundingClientRect(),h=v.left,d=v.top,y=v.width,g=v.height,_=document.documentElement.clientWidth,b=document.documentElement.clientHeight,T=-h+f,C=-d+p,O=_-h-y+f,x=b-d-g+p,L=k=>{let z=f+k.clientX-u,B=p+k.clientY-c;r!=null&&r.value||(z=Math.min(Math.max(z,T),O),B=Math.min(Math.max(B,C),x)),o={offsetX:z,offsetY:B},e.value&&(e.value.style.transform=`translate(${Xt(z)}, ${Xt(B)})`)},I=()=>{document.removeEventListener("mousemove",L),document.removeEventListener("mouseup",I)};document.addEventListener("mousemove",L),document.addEventListener("mouseup",I)},i=()=>{t.value&&e.value&&t.value.addEventListener("mousedown",s)},a=()=>{t.value&&e.value&&t.value.removeEventListener("mousedown",s)};Ue(()=>{xu(()=>{n.value?i():a()})}),Ct(()=>{a()})};var WC={name:"en",el:{breadcrumb:{label:"Breadcrumb"},colorpicker:{confirm:"OK",clear:"Clear",defaultLabel:"color picker",description:"current color is {color}. press enter to select a new color."},datepicker:{now:"Now",today:"Today",cancel:"Cancel",clear:"Clear",confirm:"OK",dateTablePrompt:"Use the arrow keys and enter to select the day of the month",monthTablePrompt:"Use the arrow keys and enter to select the month",yearTablePrompt:"Use the arrow keys and enter to select the year",selectedDate:"Selected date",selectDate:"Select date",selectTime:"Select time",startDate:"Start Date",startTime:"Start Time",endDate:"End Date",endTime:"End Time",prevYear:"Previous Year",nextYear:"Next Year",prevMonth:"Previous Month",nextMonth:"Next Month",year:"",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",week:"week",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},weeksFull:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"},months:{jan:"Jan",feb:"Feb",mar:"Mar",apr:"Apr",may:"May",jun:"Jun",jul:"Jul",aug:"Aug",sep:"Sep",oct:"Oct",nov:"Nov",dec:"Dec"}},inputNumber:{decrease:"decrease number",increase:"increase number"},select:{loading:"Loading",noMatch:"No matching data",noData:"No data",placeholder:"Select"},dropdown:{toggleDropdown:"Toggle Dropdown"},cascader:{noMatch:"No matching data",loading:"Loading",placeholder:"Select",noData:"No data"},pagination:{goto:"Go to",pagesize:"/page",total:"Total {total}",pageClassifier:"",page:"Page",prev:"Go to previous page",next:"Go to next page",currentPage:"page {pager}",prevPages:"Previous {pager} pages",nextPages:"Next {pager} pages",deprecationWarning:"Deprecated usages detected, please refer to the el-pagination documentation for more details"},dialog:{close:"Close this dialog"},drawer:{close:"Close this dialog"},messagebox:{title:"Message",confirm:"OK",cancel:"Cancel",error:"Illegal input",close:"Close this dialog"},upload:{deleteTip:"press delete to remove",delete:"Delete",preview:"Preview",continue:"Continue"},slider:{defaultLabel:"slider between {min} and {max}",defaultRangeStartLabel:"pick start value",defaultRangeEndLabel:"pick end value"},table:{emptyText:"No Data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum"},tour:{next:"Next",previous:"Previous",finish:"Finish"},tree:{emptyText:"No Data"},transfer:{noMatch:"No matching data",noData:"No data",titles:["List 1","List 2"],filterPlaceholder:"Enter keyword",noCheckedFormat:"{total} items",hasCheckedFormat:"{checked}/{total} checked"},image:{error:"FAILED"},pageHeader:{title:"Back"},popconfirm:{confirmButtonText:"Yes",cancelButtonText:"No"},carousel:{leftArrow:"Carousel arrow left",rightArrow:"Carousel arrow right",indicator:"Carousel switch to index {index}"}}};const GC=e=>(t,n)=>YC(t,n,m(e)),YC=(e,t,n)=>Sn(n,e,e).replace(/\{(\w+)\}/g,(r,o)=>{var s;return`${(s=t==null?void 0:t[o])!=null?s:`{${o}}`}`}),JC=e=>{const t=E(()=>m(e).name),n=qe(e)?e:j(e);return{lang:t,locale:n,t:GC(e)}},Wv=Symbol("localeContextKey"),Ea=e=>{const t=e||Se(Wv,j());return JC(E(()=>t.value||WC))},rs="el",XC="is-",Pr=(e,t,n,r,o)=>{let s=`${e}-${t}`;return n&&(s+=`-${n}`),r&&(s+=`__${r}`),o&&(s+=`--${o}`),s},Gv=Symbol("namespaceContextKey"),Wu=e=>{const t=e||(rt()?Se(Gv,j(rs)):j(rs));return E(()=>m(t)||rs)},ke=(e,t)=>{const n=Wu(t);return{namespace:n,b:(d="")=>Pr(n.value,e,d,"",""),e:d=>d?Pr(n.value,e,"",d,""):"",m:d=>d?Pr(n.value,e,"","",d):"",be:(d,y)=>d&&y?Pr(n.value,e,d,y,""):"",em:(d,y)=>d&&y?Pr(n.value,e,"",d,y):"",bm:(d,y)=>d&&y?Pr(n.value,e,d,"",y):"",bem:(d,y,g)=>d&&y&&g?Pr(n.value,e,d,y,g):"",is:(d,...y)=>{const g=y.length>=1?y[0]:!0;return d&&g?`${XC}${d}`:""},cssVar:d=>{const y={};for(const g in d)d[g]&&(y[`--${n.value}-${g}`]=d[g]);return y},cssVarName:d=>`--${n.value}-${d}`,cssVarBlock:d=>{const y={};for(const g in d)d[g]&&(y[`--${n.value}-${e}-${g}`]=d[g]);return y},cssVarBlockName:d=>`--${n.value}-${e}-${d}`}},ZC=(e,t={})=>{qe(e)||Sr("[useLockscreen]","You need to pass a ref param to this function");const n=t.ns||ke("popup"),r=E(()=>n.bm("parent","hidden"));if(!nt||bd(document.body,r.value))return;let o=0,s=!1,i="0";const a=()=>{setTimeout(()=>{Ss(document==null?void 0:document.body,r.value),s&&document&&(document.body.style.width=i)},200)};pe(e,l=>{if(!l){a();return}s=!bd(document.body,r.value),s&&(i=document.body.style.width),o=oC(n.namespace.value);const u=document.documentElement.clientHeight0&&(u||c==="scroll")&&s&&(document.body.style.width=`calc(100% - ${o}px)`),Fl(document.body,r.value)}),uu(()=>a())},QC=_a({type:we(Boolean),default:null}),eO=_a({type:we(Function)}),Yv=e=>{const t=`update:${e}`,n=`onUpdate:${e}`,r=[t],o={[e]:QC,[n]:eO};return{useModelToggle:({indicator:i,toggleReason:a,shouldHideWhenRouteChanges:l,shouldProceed:u,onShow:c,onHide:f})=>{const p=rt(),{emit:v}=p,h=p.props,d=E(()=>ve(h[n])),y=E(()=>h[e]===null),g=x=>{i.value!==!0&&(i.value=!0,a&&(a.value=x),ve(c)&&c(x))},_=x=>{i.value!==!1&&(i.value=!1,a&&(a.value=x),ve(f)&&f(x))},b=x=>{if(h.disabled===!0||ve(u)&&!u())return;const L=d.value&&nt;L&&v(t,!0),(y.value||!L)&&g(x)},T=x=>{if(h.disabled===!0||!nt)return;const L=d.value&&nt;L&&v(t,!1),(y.value||!L)&&_(x)},C=x=>{jt(x)&&(h.disabled&&x?d.value&&v(t,!1):i.value!==x&&(x?g():_()))},O=()=>{i.value?T():b()};return pe(()=>h[e],C),l&&p.appContext.config.globalProperties.$route!==void 0&&pe(()=>({...p.proxy.$route}),()=>{l.value&&i.value&&T()}),Ue(()=>{C(h[e])}),{hide:T,show:b,toggle:O,hasUpdateHandler:d}},useModelToggleProps:o,useModelToggleEmits:r}};Yv("modelValue");const Jv=e=>{const t=rt();return E(()=>{var n,r;return(r=(n=t==null?void 0:t.proxy)==null?void 0:n.$props)==null?void 0:r[e]})};var It="top",Zt="bottom",Qt="right",$t="left",Gu="auto",Bs=[It,Zt,Qt,$t],Eo="start",Cs="end",tO="clippingParents",Xv="viewport",Ko="popper",nO="reference",_d=Bs.reduce(function(e,t){return e.concat([t+"-"+Eo,t+"-"+Cs])},[]),Ca=[].concat(Bs,[Gu]).reduce(function(e,t){return e.concat([t,t+"-"+Eo,t+"-"+Cs])},[]),rO="beforeRead",oO="read",sO="afterRead",iO="beforeMain",aO="main",lO="afterMain",uO="beforeWrite",cO="write",fO="afterWrite",dO=[rO,oO,sO,iO,aO,lO,uO,cO,fO];function An(e){return e?(e.nodeName||"").toLowerCase():null}function hn(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function Co(e){var t=hn(e).Element;return e instanceof t||e instanceof Element}function Wt(e){var t=hn(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function Yu(e){if(typeof ShadowRoot>"u")return!1;var t=hn(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function pO(e){var t=e.state;Object.keys(t.elements).forEach(function(n){var r=t.styles[n]||{},o=t.attributes[n]||{},s=t.elements[n];!Wt(s)||!An(s)||(Object.assign(s.style,r),Object.keys(o).forEach(function(i){var a=o[i];a===!1?s.removeAttribute(i):s.setAttribute(i,a===!0?"":a)}))})}function hO(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(r){var o=t.elements[r],s=t.attributes[r]||{},i=Object.keys(t.styles.hasOwnProperty(r)?t.styles[r]:n[r]),a=i.reduce(function(l,u){return l[u]="",l},{});!Wt(o)||!An(o)||(Object.assign(o.style,a),Object.keys(s).forEach(function(l){o.removeAttribute(l)}))})}}var Zv={name:"applyStyles",enabled:!0,phase:"write",fn:pO,effect:hO,requires:["computeStyles"]};function Tn(e){return e.split("-")[0]}var jr=Math.max,Yi=Math.min,Oo=Math.round;function To(e,t){t===void 0&&(t=!1);var n=e.getBoundingClientRect(),r=1,o=1;if(Wt(e)&&t){var s=e.offsetHeight,i=e.offsetWidth;i>0&&(r=Oo(n.width)/i||1),s>0&&(o=Oo(n.height)/s||1)}return{width:n.width/r,height:n.height/o,top:n.top/o,right:n.right/r,bottom:n.bottom/o,left:n.left/r,x:n.left/r,y:n.top/o}}function Ju(e){var t=To(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function Qv(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&Yu(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function Hn(e){return hn(e).getComputedStyle(e)}function vO(e){return["table","td","th"].indexOf(An(e))>=0}function Er(e){return((Co(e)?e.ownerDocument:e.document)||window.document).documentElement}function Oa(e){return An(e)==="html"?e:e.assignedSlot||e.parentNode||(Yu(e)?e.host:null)||Er(e)}function Sd(e){return!Wt(e)||Hn(e).position==="fixed"?null:e.offsetParent}function mO(e){var t=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,n=navigator.userAgent.indexOf("Trident")!==-1;if(n&&Wt(e)){var r=Hn(e);if(r.position==="fixed")return null}var o=Oa(e);for(Yu(o)&&(o=o.host);Wt(o)&&["html","body"].indexOf(An(o))<0;){var s=Hn(o);if(s.transform!=="none"||s.perspective!=="none"||s.contain==="paint"||["transform","perspective"].indexOf(s.willChange)!==-1||t&&s.willChange==="filter"||t&&s.filter&&s.filter!=="none")return o;o=o.parentNode}return null}function Ds(e){for(var t=hn(e),n=Sd(e);n&&vO(n)&&Hn(n).position==="static";)n=Sd(n);return n&&(An(n)==="html"||An(n)==="body"&&Hn(n).position==="static")?t:n||mO(e)||t}function Xu(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function os(e,t,n){return jr(e,Yi(t,n))}function gO(e,t,n){var r=os(e,t,n);return r>n?n:r}function em(){return{top:0,right:0,bottom:0,left:0}}function tm(e){return Object.assign({},em(),e)}function nm(e,t){return t.reduce(function(n,r){return n[r]=e,n},{})}var yO=function(e,t){return e=typeof e=="function"?e(Object.assign({},t.rects,{placement:t.placement})):e,tm(typeof e!="number"?e:nm(e,Bs))};function bO(e){var t,n=e.state,r=e.name,o=e.options,s=n.elements.arrow,i=n.modifiersData.popperOffsets,a=Tn(n.placement),l=Xu(a),u=[$t,Qt].indexOf(a)>=0,c=u?"height":"width";if(!(!s||!i)){var f=yO(o.padding,n),p=Ju(s),v=l==="y"?It:$t,h=l==="y"?Zt:Qt,d=n.rects.reference[c]+n.rects.reference[l]-i[l]-n.rects.popper[c],y=i[l]-n.rects.reference[l],g=Ds(s),_=g?l==="y"?g.clientHeight||0:g.clientWidth||0:0,b=d/2-y/2,T=f[v],C=_-p[c]-f[h],O=_/2-p[c]/2+b,x=os(T,O,C),L=l;n.modifiersData[r]=(t={},t[L]=x,t.centerOffset=x-O,t)}}function wO(e){var t=e.state,n=e.options,r=n.element,o=r===void 0?"[data-popper-arrow]":r;o!=null&&(typeof o=="string"&&(o=t.elements.popper.querySelector(o),!o)||!Qv(t.elements.popper,o)||(t.elements.arrow=o))}var _O={name:"arrow",enabled:!0,phase:"main",fn:bO,effect:wO,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function xo(e){return e.split("-")[1]}var SO={top:"auto",right:"auto",bottom:"auto",left:"auto"};function EO(e){var t=e.x,n=e.y,r=window,o=r.devicePixelRatio||1;return{x:Oo(t*o)/o||0,y:Oo(n*o)/o||0}}function Ed(e){var t,n=e.popper,r=e.popperRect,o=e.placement,s=e.variation,i=e.offsets,a=e.position,l=e.gpuAcceleration,u=e.adaptive,c=e.roundOffsets,f=e.isFixed,p=i.x,v=p===void 0?0:p,h=i.y,d=h===void 0?0:h,y=typeof c=="function"?c({x:v,y:d}):{x:v,y:d};v=y.x,d=y.y;var g=i.hasOwnProperty("x"),_=i.hasOwnProperty("y"),b=$t,T=It,C=window;if(u){var O=Ds(n),x="clientHeight",L="clientWidth";if(O===hn(n)&&(O=Er(n),Hn(O).position!=="static"&&a==="absolute"&&(x="scrollHeight",L="scrollWidth")),O=O,o===It||(o===$t||o===Qt)&&s===Cs){T=Zt;var I=f&&O===C&&C.visualViewport?C.visualViewport.height:O[x];d-=I-r.height,d*=l?1:-1}if(o===$t||(o===It||o===Zt)&&s===Cs){b=Qt;var k=f&&O===C&&C.visualViewport?C.visualViewport.width:O[L];v-=k-r.width,v*=l?1:-1}}var z=Object.assign({position:a},u&&SO),B=c===!0?EO({x:v,y:d}):{x:v,y:d};if(v=B.x,d=B.y,l){var K;return Object.assign({},z,(K={},K[T]=_?"0":"",K[b]=g?"0":"",K.transform=(C.devicePixelRatio||1)<=1?"translate("+v+"px, "+d+"px)":"translate3d("+v+"px, "+d+"px, 0)",K))}return Object.assign({},z,(t={},t[T]=_?d+"px":"",t[b]=g?v+"px":"",t.transform="",t))}function CO(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=r===void 0?!0:r,s=n.adaptive,i=s===void 0?!0:s,a=n.roundOffsets,l=a===void 0?!0:a,u={placement:Tn(t.placement),variation:xo(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,Ed(Object.assign({},u,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:i,roundOffsets:l})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,Ed(Object.assign({},u,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}var rm={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:CO,data:{}},ii={passive:!0};function OO(e){var t=e.state,n=e.instance,r=e.options,o=r.scroll,s=o===void 0?!0:o,i=r.resize,a=i===void 0?!0:i,l=hn(t.elements.popper),u=[].concat(t.scrollParents.reference,t.scrollParents.popper);return s&&u.forEach(function(c){c.addEventListener("scroll",n.update,ii)}),a&&l.addEventListener("resize",n.update,ii),function(){s&&u.forEach(function(c){c.removeEventListener("scroll",n.update,ii)}),a&&l.removeEventListener("resize",n.update,ii)}}var om={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:OO,data:{}},TO={left:"right",right:"left",bottom:"top",top:"bottom"};function xi(e){return e.replace(/left|right|bottom|top/g,function(t){return TO[t]})}var xO={start:"end",end:"start"};function Cd(e){return e.replace(/start|end/g,function(t){return xO[t]})}function Zu(e){var t=hn(e),n=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:n,scrollTop:r}}function Qu(e){return To(Er(e)).left+Zu(e).scrollLeft}function AO(e){var t=hn(e),n=Er(e),r=t.visualViewport,o=n.clientWidth,s=n.clientHeight,i=0,a=0;return r&&(o=r.width,s=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(i=r.offsetLeft,a=r.offsetTop)),{width:o,height:s,x:i+Qu(e),y:a}}function RO(e){var t,n=Er(e),r=Zu(e),o=(t=e.ownerDocument)==null?void 0:t.body,s=jr(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),i=jr(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-r.scrollLeft+Qu(e),l=-r.scrollTop;return Hn(o||n).direction==="rtl"&&(a+=jr(n.clientWidth,o?o.clientWidth:0)-s),{width:s,height:i,x:a,y:l}}function ec(e){var t=Hn(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function sm(e){return["html","body","#document"].indexOf(An(e))>=0?e.ownerDocument.body:Wt(e)&&ec(e)?e:sm(Oa(e))}function ss(e,t){var n;t===void 0&&(t=[]);var r=sm(e),o=r===((n=e.ownerDocument)==null?void 0:n.body),s=hn(r),i=o?[s].concat(s.visualViewport||[],ec(r)?r:[]):r,a=t.concat(i);return o?a:a.concat(ss(Oa(i)))}function Bl(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function PO(e){var t=To(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}function Od(e,t){return t===Xv?Bl(AO(e)):Co(t)?PO(t):Bl(RO(Er(e)))}function IO(e){var t=ss(Oa(e)),n=["absolute","fixed"].indexOf(Hn(e).position)>=0,r=n&&Wt(e)?Ds(e):e;return Co(r)?t.filter(function(o){return Co(o)&&Qv(o,r)&&An(o)!=="body"}):[]}function $O(e,t,n){var r=t==="clippingParents"?IO(e):[].concat(t),o=[].concat(r,[n]),s=o[0],i=o.reduce(function(a,l){var u=Od(e,l);return a.top=jr(u.top,a.top),a.right=Yi(u.right,a.right),a.bottom=Yi(u.bottom,a.bottom),a.left=jr(u.left,a.left),a},Od(e,s));return i.width=i.right-i.left,i.height=i.bottom-i.top,i.x=i.left,i.y=i.top,i}function im(e){var t=e.reference,n=e.element,r=e.placement,o=r?Tn(r):null,s=r?xo(r):null,i=t.x+t.width/2-n.width/2,a=t.y+t.height/2-n.height/2,l;switch(o){case It:l={x:i,y:t.y-n.height};break;case Zt:l={x:i,y:t.y+t.height};break;case Qt:l={x:t.x+t.width,y:a};break;case $t:l={x:t.x-n.width,y:a};break;default:l={x:t.x,y:t.y}}var u=o?Xu(o):null;if(u!=null){var c=u==="y"?"height":"width";switch(s){case Eo:l[u]=l[u]-(t[c]/2-n[c]/2);break;case Cs:l[u]=l[u]+(t[c]/2-n[c]/2);break}}return l}function Os(e,t){t===void 0&&(t={});var n=t,r=n.placement,o=r===void 0?e.placement:r,s=n.boundary,i=s===void 0?tO:s,a=n.rootBoundary,l=a===void 0?Xv:a,u=n.elementContext,c=u===void 0?Ko:u,f=n.altBoundary,p=f===void 0?!1:f,v=n.padding,h=v===void 0?0:v,d=tm(typeof h!="number"?h:nm(h,Bs)),y=c===Ko?nO:Ko,g=e.rects.popper,_=e.elements[p?y:c],b=$O(Co(_)?_:_.contextElement||Er(e.elements.popper),i,l),T=To(e.elements.reference),C=im({reference:T,element:g,strategy:"absolute",placement:o}),O=Bl(Object.assign({},g,C)),x=c===Ko?O:T,L={top:b.top-x.top+d.top,bottom:x.bottom-b.bottom+d.bottom,left:b.left-x.left+d.left,right:x.right-b.right+d.right},I=e.modifiersData.offset;if(c===Ko&&I){var k=I[o];Object.keys(L).forEach(function(z){var B=[Qt,Zt].indexOf(z)>=0?1:-1,K=[It,Zt].indexOf(z)>=0?"y":"x";L[z]+=k[K]*B})}return L}function LO(e,t){t===void 0&&(t={});var n=t,r=n.placement,o=n.boundary,s=n.rootBoundary,i=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,u=l===void 0?Ca:l,c=xo(r),f=c?a?_d:_d.filter(function(h){return xo(h)===c}):Bs,p=f.filter(function(h){return u.indexOf(h)>=0});p.length===0&&(p=f);var v=p.reduce(function(h,d){return h[d]=Os(e,{placement:d,boundary:o,rootBoundary:s,padding:i})[Tn(d)],h},{});return Object.keys(v).sort(function(h,d){return v[h]-v[d]})}function kO(e){if(Tn(e)===Gu)return[];var t=xi(e);return[Cd(e),t,Cd(t)]}function NO(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,s=o===void 0?!0:o,i=n.altAxis,a=i===void 0?!0:i,l=n.fallbackPlacements,u=n.padding,c=n.boundary,f=n.rootBoundary,p=n.altBoundary,v=n.flipVariations,h=v===void 0?!0:v,d=n.allowedAutoPlacements,y=t.options.placement,g=Tn(y),_=g===y,b=l||(_||!h?[xi(y)]:kO(y)),T=[y].concat(b).reduce(function(Ee,Ze){return Ee.concat(Tn(Ze)===Gu?LO(t,{placement:Ze,boundary:c,rootBoundary:f,padding:u,flipVariations:h,allowedAutoPlacements:d}):Ze)},[]),C=t.rects.reference,O=t.rects.popper,x=new Map,L=!0,I=T[0],k=0;k=0,R=G?"width":"height",F=Os(t,{placement:z,boundary:c,rootBoundary:f,altBoundary:p,padding:u}),$=G?K?Qt:$t:K?Zt:It;C[R]>O[R]&&($=xi($));var se=xi($),me=[];if(s&&me.push(F[B]<=0),a&&me.push(F[$]<=0,F[se]<=0),me.every(function(Ee){return Ee})){I=z,L=!1;break}x.set(z,me)}if(L)for(var Pe=h?3:1,je=function(Ee){var Ze=T.find(function($e){var A=x.get($e);if(A)return A.slice(0,Ee).every(function(q){return q})});if(Ze)return I=Ze,"break"},Ce=Pe;Ce>0;Ce--){var Oe=je(Ce);if(Oe==="break")break}t.placement!==I&&(t.modifiersData[r]._skip=!0,t.placement=I,t.reset=!0)}}var MO={name:"flip",enabled:!0,phase:"main",fn:NO,requiresIfExists:["offset"],data:{_skip:!1}};function Td(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function xd(e){return[It,Qt,Zt,$t].some(function(t){return e[t]>=0})}function FO(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,s=t.modifiersData.preventOverflow,i=Os(t,{elementContext:"reference"}),a=Os(t,{altBoundary:!0}),l=Td(i,r),u=Td(a,o,s),c=xd(l),f=xd(u);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:u,isReferenceHidden:c,hasPopperEscaped:f},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":c,"data-popper-escaped":f})}var BO={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:FO};function DO(e,t,n){var r=Tn(e),o=[$t,It].indexOf(r)>=0?-1:1,s=typeof n=="function"?n(Object.assign({},t,{placement:e})):n,i=s[0],a=s[1];return i=i||0,a=(a||0)*o,[$t,Qt].indexOf(r)>=0?{x:a,y:i}:{x:i,y:a}}function jO(e){var t=e.state,n=e.options,r=e.name,o=n.offset,s=o===void 0?[0,0]:o,i=Ca.reduce(function(c,f){return c[f]=DO(f,t.rects,s),c},{}),a=i[t.placement],l=a.x,u=a.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=u),t.modifiersData[r]=i}var VO={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:jO};function zO(e){var t=e.state,n=e.name;t.modifiersData[n]=im({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}var am={name:"popperOffsets",enabled:!0,phase:"read",fn:zO,data:{}};function HO(e){return e==="x"?"y":"x"}function KO(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=o===void 0?!0:o,i=n.altAxis,a=i===void 0?!1:i,l=n.boundary,u=n.rootBoundary,c=n.altBoundary,f=n.padding,p=n.tether,v=p===void 0?!0:p,h=n.tetherOffset,d=h===void 0?0:h,y=Os(t,{boundary:l,rootBoundary:u,padding:f,altBoundary:c}),g=Tn(t.placement),_=xo(t.placement),b=!_,T=Xu(g),C=HO(T),O=t.modifiersData.popperOffsets,x=t.rects.reference,L=t.rects.popper,I=typeof d=="function"?d(Object.assign({},t.rects,{placement:t.placement})):d,k=typeof I=="number"?{mainAxis:I,altAxis:I}:Object.assign({mainAxis:0,altAxis:0},I),z=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,B={x:0,y:0};if(O){if(s){var K,G=T==="y"?It:$t,R=T==="y"?Zt:Qt,F=T==="y"?"height":"width",$=O[T],se=$+y[G],me=$-y[R],Pe=v?-L[F]/2:0,je=_===Eo?x[F]:L[F],Ce=_===Eo?-L[F]:-x[F],Oe=t.elements.arrow,Ee=v&&Oe?Ju(Oe):{width:0,height:0},Ze=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:em(),$e=Ze[G],A=Ze[R],q=os(0,x[F],Ee[F]),X=b?x[F]/2-Pe-q-$e-k.mainAxis:je-q-$e-k.mainAxis,ne=b?-x[F]/2+Pe+q+A+k.mainAxis:Ce+q+A+k.mainAxis,_e=t.elements.arrow&&Ds(t.elements.arrow),Re=_e?T==="y"?_e.clientTop||0:_e.clientLeft||0:0,w=(K=z==null?void 0:z[T])!=null?K:0,S=$+X-w-Re,M=$+ne-w,U=os(v?Yi(se,S):se,$,v?jr(me,M):me);O[T]=U,B[T]=U-$}if(a){var H,ee=T==="x"?It:$t,ie=T==="x"?Zt:Qt,Z=O[C],te=C==="y"?"height":"width",Y=Z+y[ee],le=Z-y[ie],be=[It,$t].indexOf(g)!==-1,N=(H=z==null?void 0:z[C])!=null?H:0,re=be?Y:Z-x[te]-L[te]-N+k.altAxis,ge=be?Z+x[te]+L[te]-N-k.altAxis:le,Fe=v&&be?gO(re,Z,ge):os(v?re:Y,Z,v?ge:le);O[C]=Fe,B[C]=Fe-Z}t.modifiersData[r]=B}}var UO={name:"preventOverflow",enabled:!0,phase:"main",fn:KO,requiresIfExists:["offset"]};function qO(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function WO(e){return e===hn(e)||!Wt(e)?Zu(e):qO(e)}function GO(e){var t=e.getBoundingClientRect(),n=Oo(t.width)/e.offsetWidth||1,r=Oo(t.height)/e.offsetHeight||1;return n!==1||r!==1}function YO(e,t,n){n===void 0&&(n=!1);var r=Wt(t),o=Wt(t)&&GO(t),s=Er(t),i=To(e,o),a={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(r||!r&&!n)&&((An(t)!=="body"||ec(s))&&(a=WO(t)),Wt(t)?(l=To(t,!0),l.x+=t.clientLeft,l.y+=t.clientTop):s&&(l.x=Qu(s))),{x:i.left+a.scrollLeft-l.x,y:i.top+a.scrollTop-l.y,width:i.width,height:i.height}}function JO(e){var t=new Map,n=new Set,r=[];e.forEach(function(s){t.set(s.name,s)});function o(s){n.add(s.name);var i=[].concat(s.requires||[],s.requiresIfExists||[]);i.forEach(function(a){if(!n.has(a)){var l=t.get(a);l&&o(l)}}),r.push(s)}return e.forEach(function(s){n.has(s.name)||o(s)}),r}function XO(e){var t=JO(e);return dO.reduce(function(n,r){return n.concat(t.filter(function(o){return o.phase===r}))},[])}function ZO(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function QO(e){var t=e.reduce(function(n,r){var o=n[r.name];return n[r.name]=o?Object.assign({},o,r,{options:Object.assign({},o.options,r.options),data:Object.assign({},o.data,r.data)}):r,n},{});return Object.keys(t).map(function(n){return t[n]})}var Ad={placement:"bottom",modifiers:[],strategy:"absolute"};function Rd(){for(var e=arguments.length,t=new Array(e),n=0;n{const r={name:"updateState",enabled:!0,phase:"write",fn:({state:l})=>{const u=oT(l);Object.assign(i.value,u)},requires:["computeStyles"]},o=E(()=>{const{onFirstUpdate:l,placement:u,strategy:c,modifiers:f}=m(n);return{onFirstUpdate:l,placement:u||"bottom",strategy:c||"absolute",modifiers:[...f||[],r,{name:"applyStyles",enabled:!1}]}}),s=vr(),i=j({styles:{popper:{position:m(o).strategy,left:"0",top:"0"},arrow:{position:"absolute"}},attributes:{}}),a=()=>{s.value&&(s.value.destroy(),s.value=void 0)};return pe(o,l=>{const u=m(s);u&&u.setOptions(l)},{deep:!0}),pe([e,t],([l,u])=>{a(),!(!l||!u)&&(s.value=nT(l,u,m(o)))}),Ct(()=>{a()}),{state:E(()=>{var l;return{...((l=m(s))==null?void 0:l.state)||{}}}),styles:E(()=>m(i).styles),attributes:E(()=>m(i).attributes),update:()=>{var l;return(l=m(s))==null?void 0:l.update()},forceUpdate:()=>{var l;return(l=m(s))==null?void 0:l.forceUpdate()},instanceRef:E(()=>m(s))}};function oT(e){const t=Object.keys(e.elements),n=Gi(t.map(o=>[o,e.styles[o]||{}])),r=Gi(t.map(o=>[o,e.attributes[o]]));return{styles:n,attributes:r}}const lm=e=>{if(!e)return{onClick:ct,onMousedown:ct,onMouseup:ct};let t=!1,n=!1;return{onClick:i=>{t&&n&&e(i),t=n=!1},onMousedown:i=>{t=i.target===i.currentTarget},onMouseup:i=>{n=i.target===i.currentTarget}}};function Pd(){let e;const t=(r,o)=>{n(),e=window.setTimeout(r,o)},n=()=>window.clearTimeout(e);return Ns(()=>n()),{registerTimeout:t,cancelTimeout:n}}const Id={prefix:Math.floor(Math.random()*1e4),current:0},sT=Symbol("elIdInjection"),um=()=>rt()?Se(sT,Id):Id,Ur=e=>{const t=um(),n=Wu();return E(()=>m(e)||`${n.value}-id-${t.prefix}-${t.current++}`)};let uo=[];const $d=e=>{const t=e;t.key===On.esc&&uo.forEach(n=>n(t))},iT=e=>{Ue(()=>{uo.length===0&&document.addEventListener("keydown",$d),nt&&uo.push(e)}),Ct(()=>{uo=uo.filter(t=>t!==e),uo.length===0&&nt&&document.removeEventListener("keydown",$d)})};let Ld;const cm=()=>{const e=Wu(),t=um(),n=E(()=>`${e.value}-popper-container-${t.prefix}`),r=E(()=>`#${n.value}`);return{id:n,selector:r}},aT=e=>{const t=document.createElement("div");return t.id=e,document.body.appendChild(t),t},lT=()=>{const{id:e,selector:t}=cm();return Eu(()=>{nt&&!Ld&&!document.body.querySelector(t.value)&&(Ld=aT(e.value))}),{id:e,selector:t}},uT=Ie({showAfter:{type:Number,default:0},hideAfter:{type:Number,default:200},autoClose:{type:Number,default:0}}),cT=({showAfter:e,hideAfter:t,autoClose:n,open:r,close:o})=>{const{registerTimeout:s}=Pd(),{registerTimeout:i,cancelTimeout:a}=Pd();return{onOpen:c=>{s(()=>{r(c);const f=m(n);ze(f)&&f>0&&i(()=>{o(c)},f)},m(e))},onClose:c=>{a(),s(()=>{o(c)},m(t))}}},fm=Symbol("elForwardRef"),fT=e=>{ut(fm,{setForwardRef:n=>{e.value=n}})},dT=e=>({mounted(t){e(t)},updated(t){e(t)},unmounted(){e(null)}}),kd={current:0},Nd=j(0),dm=2e3,Md=Symbol("elZIndexContextKey"),pm=Symbol("zIndexContextKey"),nc=e=>{const t=rt()?Se(Md,kd):kd,n=e||(rt()?Se(pm,void 0):void 0),r=E(()=>{const i=m(n);return ze(i)?i:dm}),o=E(()=>r.value+Nd.value),s=()=>(t.current++,Nd.value=t.current,o.value);return!nt&&Se(Md),{initialZIndex:r,currentZIndex:o,nextZIndex:s}};function pT(e){const t=j();function n(){if(e.value==null)return;const{selectionStart:o,selectionEnd:s,value:i}=e.value;if(o==null||s==null)return;const a=i.slice(0,Math.max(0,o)),l=i.slice(Math.max(0,s));t.value={selectionStart:o,selectionEnd:s,value:i,beforeTxt:a,afterTxt:l}}function r(){if(e.value==null||t.value==null)return;const{value:o}=e.value,{beforeTxt:s,afterTxt:i,selectionStart:a}=t.value;if(s==null||i==null||a==null)return;let l=o.length;if(o.endsWith(i))l=o.length-i.length;else if(o.startsWith(s))l=s.length;else{const u=s[a-1],c=o.indexOf(u,a-1);c!==-1&&(l=c+1)}e.value.setSelectionRange(l,l)}return[n,r]}const hT=(e,t,n)=>Ti(e.subTree).filter(s=>{var i;return Vn(s)&&((i=s.type)==null?void 0:i.name)===t&&!!s.component}).map(s=>s.component.uid).map(s=>n[s]).filter(s=>!!s),vT=(e,t)=>{const n={},r=vr([]);return{children:r,addChild:i=>{n[i.uid]=i,r.value=hT(e,t,n)},removeChild:i=>{delete n[i],r.value=r.value.filter(a=>a.uid!==i)}}},$o=_a({type:String,values:Io,required:!1}),hm=Symbol("size"),mT=()=>{const e=Se(hm,{});return E(()=>m(e.size)||"")};function vm(e,{afterFocus:t,beforeBlur:n,afterBlur:r}={}){const o=rt(),{emit:s}=o,i=vr(),a=j(!1),l=f=>{a.value||(a.value=!0,s("focus",f),t==null||t())},u=f=>{var p;ve(n)&&n(f)||f.relatedTarget&&((p=i.value)!=null&&p.contains(f.relatedTarget))||(a.value=!1,s("blur",f),r==null||r())},c=()=>{var f;(f=e.value)==null||f.focus()};return pe(i,f=>{f&&f.setAttribute("tabindex","-1")}),an(i,"click",c),{wrapperRef:i,isFocused:a,handleFocus:l,handleBlur:u}}const gT=["",void 0,null],yT=void 0,bT=Ie({emptyValues:Array,valueOnClear:{type:[String,Number,Boolean,Function],default:void 0,validator:e=>ve(e)?!e():!e}}),wT=(e,t)=>{let n=js();n.value||(n=j({}));const r=E(()=>e.emptyValues||n.value.emptyValues||gT),o=E(()=>ve(e.valueOnClear)?e.valueOnClear():e.valueOnClear!==void 0?e.valueOnClear:ve(n.value.valueOnClear)?n.value.valueOnClear():n.value.valueOnClear!==void 0?n.value.valueOnClear:yT),s=i=>r.value.includes(i);return r.value.includes(o.value),{emptyValues:r,valueOnClear:o,isEmptyValue:s}},_T=Ie({ariaLabel:String,ariaOrientation:{type:String,values:["horizontal","vertical","undefined"]},ariaControls:String}),Gn=e=>Mv(_T,e),mm=Symbol(),Ji=j();function js(e,t=void 0){const n=rt()?Se(mm,Ji):Ji;return e?E(()=>{var r,o;return(o=(r=n.value)==null?void 0:r[e])!=null?o:t}):n}function gm(e,t){const n=js(),r=ke(e,E(()=>{var a;return((a=n.value)==null?void 0:a.namespace)||rs})),o=Ea(E(()=>{var a;return(a=n.value)==null?void 0:a.locale})),s=nc(E(()=>{var a;return((a=n.value)==null?void 0:a.zIndex)||dm})),i=E(()=>{var a;return m(t)||((a=n.value)==null?void 0:a.size)||""});return ST(E(()=>m(n)||{})),{ns:r,locale:o,zIndex:s,size:i}}const ST=(e,t,n=!1)=>{var r;const o=!!rt(),s=o?js():void 0,i=(r=void 0)!=null?r:o?ut:void 0;if(!i)return;const a=E(()=>{const l=m(e);return s!=null&&s.value?ET(s.value,l):l});return i(mm,a),i(Wv,E(()=>a.value.locale)),i(Gv,E(()=>a.value.namespace)),i(pm,E(()=>a.value.zIndex)),i(hm,{size:E(()=>a.value.size||"")}),(n||!Ji.value)&&(Ji.value=a.value),a},ET=(e,t)=>{const n=[...new Set([...yd(e),...yd(t)])],r={};for(const o of n)r[o]=t[o]!==void 0?t[o]:e[o];return r},Fd={};var Ne=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n};const CT=Ie({size:{type:we([Number,String])},color:{type:String}}),OT=J({name:"ElIcon",inheritAttrs:!1}),TT=J({...OT,props:CT,setup(e){const t=e,n=ke("icon"),r=E(()=>{const{size:o,color:s}=t;return!o&&!s?{}:{fontSize:Kt(o)?void 0:Xt(o),"--color":s}});return(o,s)=>(P(),Q("i",sn({class:m(n).b(),style:m(r)},o.$attrs),[de(o.$slots,"default")],16))}});var xT=Ne(TT,[["__file","icon.vue"]]);const Xe=yt(xT),Lo=Symbol("formContextKey"),qr=Symbol("formItemContextKey"),dn=(e,t={})=>{const n=j(void 0),r=t.prop?n:Jv("size"),o=t.global?n:mT(),s=t.form?{size:void 0}:Se(Lo,void 0),i=t.formItem?{size:void 0}:Se(qr,void 0);return E(()=>r.value||m(e)||(i==null?void 0:i.size)||(s==null?void 0:s.size)||o.value||"")},ko=e=>{const t=Jv("disabled"),n=Se(Lo,void 0);return E(()=>t.value||m(e)||(n==null?void 0:n.disabled)||!1)},Cr=()=>{const e=Se(Lo,void 0),t=Se(qr,void 0);return{form:e,formItem:t}},Vs=(e,{formItemContext:t,disableIdGeneration:n,disableIdManagement:r})=>{n||(n=j(!1)),r||(r=j(!1));const o=j();let s;const i=E(()=>{var a;return!!(!(e.label||e.ariaLabel)&&t&&t.inputIds&&((a=t.inputIds)==null?void 0:a.length)<=1)});return Ue(()=>{s=pe([Ht(e,"id"),n],([a,l])=>{const u=a??(l?void 0:Ur().value);u!==o.value&&(t!=null&&t.removeInputId&&(o.value&&t.removeInputId(o.value),!(r!=null&&r.value)&&!l&&u&&t.addInputId(u)),o.value=u)},{immediate:!0})}),Jr(()=>{s&&s(),t!=null&&t.removeInputId&&o.value&&t.removeInputId(o.value)}),{isLabeledByFormItem:i,inputId:o}},AT=Ie({size:{type:String,values:Io},disabled:Boolean}),RT=Ie({...AT,model:Object,rules:{type:we(Object)},labelPosition:{type:String,values:["left","right","top"],default:"right"},requireAsteriskPosition:{type:String,values:["left","right"],default:"left"},labelWidth:{type:[String,Number],default:""},labelSuffix:{type:String,default:""},inline:Boolean,inlineMessage:Boolean,statusIcon:Boolean,showMessage:{type:Boolean,default:!0},validateOnRuleChange:{type:Boolean,default:!0},hideRequiredAsterisk:Boolean,scrollToError:Boolean,scrollIntoViewOptions:{type:[Object,Boolean]}}),PT={validate:(e,t,n)=>(ce(e)||xe(e))&&jt(t)&&xe(n)};function IT(){const e=j([]),t=E(()=>{if(!e.value.length)return"0";const s=Math.max(...e.value);return s?`${s}px`:""});function n(s){const i=e.value.indexOf(s);return i===-1&&t.value,i}function r(s,i){if(s&&i){const a=n(i);e.value.splice(a,1,s)}else s&&e.value.push(s)}function o(s){const i=n(s);i>-1&&e.value.splice(i,1)}return{autoLabelWidth:t,registerLabelWidth:r,deregisterLabelWidth:o}}const ai=(e,t)=>{const n=Ui(t);return n.length>0?e.filter(r=>r.prop&&n.includes(r.prop)):e},$T="ElForm",LT=J({name:$T}),kT=J({...LT,props:RT,emits:PT,setup(e,{expose:t,emit:n}){const r=e,o=[],s=dn(),i=ke("form"),a=E(()=>{const{labelPosition:b,inline:T}=r;return[i.b(),i.m(s.value||"default"),{[i.m(`label-${b}`)]:b,[i.m("inline")]:T}]}),l=b=>o.find(T=>T.prop===b),u=b=>{o.push(b)},c=b=>{b.prop&&o.splice(o.indexOf(b),1)},f=(b=[])=>{r.model&&ai(o,b).forEach(T=>T.resetField())},p=(b=[])=>{ai(o,b).forEach(T=>T.clearValidate())},v=E(()=>!!r.model),h=b=>{if(o.length===0)return[];const T=ai(o,b);return T.length?T:[]},d=async b=>g(void 0,b),y=async(b=[])=>{if(!v.value)return!1;const T=h(b);if(T.length===0)return!0;let C={};for(const O of T)try{await O.validate("")}catch(x){C={...C,...x}}return Object.keys(C).length===0?!0:Promise.reject(C)},g=async(b=[],T)=>{const C=!ve(T);try{const O=await y(b);return O===!0&&await(T==null?void 0:T(O)),O}catch(O){if(O instanceof Error)throw O;const x=O;return r.scrollToError&&_(Object.keys(x)[0]),await(T==null?void 0:T(!1,x)),C&&Promise.reject(x)}},_=b=>{var T;const C=ai(o,b)[0];C&&((T=C.$el)==null||T.scrollIntoView(r.scrollIntoViewOptions))};return pe(()=>r.rules,()=>{r.validateOnRuleChange&&d().catch(b=>void 0)},{deep:!0}),ut(Lo,Et({...Gr(r),emit:n,resetFields:f,clearValidate:p,validateField:g,getField:l,addField:u,removeField:c,...IT()})),t({validate:d,validateField:g,resetFields:f,clearValidate:p,scrollToField:_,fields:o}),(b,T)=>(P(),Q("form",{class:W(m(a))},[de(b.$slots,"default")],2))}});var NT=Ne(kT,[["__file","form.vue"]]);function Nr(){return Nr=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Ai(e,t,n){return FT()?Ai=Reflect.construct.bind():Ai=function(o,s,i){var a=[null];a.push.apply(a,s);var l=Function.bind.apply(o,a),u=new l;return i&&Ts(u,i.prototype),u},Ai.apply(null,arguments)}function BT(e){return Function.toString.call(e).indexOf("[native code]")!==-1}function jl(e){var t=typeof Map=="function"?new Map:void 0;return jl=function(r){if(r===null||!BT(r))return r;if(typeof r!="function")throw new TypeError("Super expression must either be null or a function");if(typeof t<"u"){if(t.has(r))return t.get(r);t.set(r,o)}function o(){return Ai(r,arguments,Dl(this).constructor)}return o.prototype=Object.create(r.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),Ts(o,r)},jl(e)}var DT=/%[sdj%]/g,jT=function(){};function Vl(e){if(!e||!e.length)return null;var t={};return e.forEach(function(n){var r=n.field;t[r]=t[r]||[],t[r].push(n)}),t}function Dt(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r=s)return a;switch(a){case"%s":return String(n[o++]);case"%d":return Number(n[o++]);case"%j":try{return JSON.stringify(n[o++])}catch{return"[Circular]"}break;default:return a}});return i}return e}function VT(e){return e==="string"||e==="url"||e==="hex"||e==="email"||e==="date"||e==="pattern"}function vt(e,t){return!!(e==null||t==="array"&&Array.isArray(e)&&!e.length||VT(t)&&typeof e=="string"&&!e)}function zT(e,t,n){var r=[],o=0,s=e.length;function i(a){r.push.apply(r,a||[]),o++,o===s&&n(r)}e.forEach(function(a){t(a,i)})}function Bd(e,t,n){var r=0,o=e.length;function s(i){if(i&&i.length){n(i);return}var a=r;r=r+1,a()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,hex:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i},Go={integer:function(t){return Go.number(t)&&parseInt(t,10)===t},float:function(t){return Go.number(t)&&!Go.integer(t)},array:function(t){return Array.isArray(t)},regexp:function(t){if(t instanceof RegExp)return!0;try{return!!new RegExp(t)}catch{return!1}},date:function(t){return typeof t.getTime=="function"&&typeof t.getMonth=="function"&&typeof t.getYear=="function"&&!isNaN(t.getTime())},number:function(t){return isNaN(t)?!1:typeof t=="number"},object:function(t){return typeof t=="object"&&!Go.array(t)},method:function(t){return typeof t=="function"},email:function(t){return typeof t=="string"&&t.length<=320&&!!t.match(zd.email)},url:function(t){return typeof t=="string"&&t.length<=2048&&!!t.match(GT())},hex:function(t){return typeof t=="string"&&!!t.match(zd.hex)}},YT=function(t,n,r,o,s){if(t.required&&n===void 0){ym(t,n,r,o,s);return}var i=["integer","float","array","regexp","object","method","email","number","date","url","hex"],a=t.type;i.indexOf(a)>-1?Go[a](n)||o.push(Dt(s.messages.types[a],t.fullField,t.type)):a&&typeof n!==t.type&&o.push(Dt(s.messages.types[a],t.fullField,t.type))},JT=function(t,n,r,o,s){var i=typeof t.len=="number",a=typeof t.min=="number",l=typeof t.max=="number",u=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,c=n,f=null,p=typeof n=="number",v=typeof n=="string",h=Array.isArray(n);if(p?f="number":v?f="string":h&&(f="array"),!f)return!1;h&&(c=n.length),v&&(c=n.replace(u,"_").length),i?c!==t.len&&o.push(Dt(s.messages[f].len,t.fullField,t.len)):a&&!l&&ct.max?o.push(Dt(s.messages[f].max,t.fullField,t.max)):a&&l&&(ct.max)&&o.push(Dt(s.messages[f].range,t.fullField,t.min,t.max))},no="enum",XT=function(t,n,r,o,s){t[no]=Array.isArray(t[no])?t[no]:[],t[no].indexOf(n)===-1&&o.push(Dt(s.messages[no],t.fullField,t[no].join(", ")))},ZT=function(t,n,r,o,s){if(t.pattern){if(t.pattern instanceof RegExp)t.pattern.lastIndex=0,t.pattern.test(n)||o.push(Dt(s.messages.pattern.mismatch,t.fullField,n,t.pattern));else if(typeof t.pattern=="string"){var i=new RegExp(t.pattern);i.test(n)||o.push(Dt(s.messages.pattern.mismatch,t.fullField,n,t.pattern))}}},Me={required:ym,whitespace:WT,type:YT,range:JT,enum:XT,pattern:ZT},QT=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n,"string")&&!t.required)return r();Me.required(t,n,o,i,s,"string"),vt(n,"string")||(Me.type(t,n,o,i,s),Me.range(t,n,o,i,s),Me.pattern(t,n,o,i,s),t.whitespace===!0&&Me.whitespace(t,n,o,i,s))}r(i)},e4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Me.required(t,n,o,i,s),n!==void 0&&Me.type(t,n,o,i,s)}r(i)},t4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(n===""&&(n=void 0),vt(n)&&!t.required)return r();Me.required(t,n,o,i,s),n!==void 0&&(Me.type(t,n,o,i,s),Me.range(t,n,o,i,s))}r(i)},n4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Me.required(t,n,o,i,s),n!==void 0&&Me.type(t,n,o,i,s)}r(i)},r4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Me.required(t,n,o,i,s),vt(n)||Me.type(t,n,o,i,s)}r(i)},o4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Me.required(t,n,o,i,s),n!==void 0&&(Me.type(t,n,o,i,s),Me.range(t,n,o,i,s))}r(i)},s4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Me.required(t,n,o,i,s),n!==void 0&&(Me.type(t,n,o,i,s),Me.range(t,n,o,i,s))}r(i)},i4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(n==null&&!t.required)return r();Me.required(t,n,o,i,s,"array"),n!=null&&(Me.type(t,n,o,i,s),Me.range(t,n,o,i,s))}r(i)},a4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Me.required(t,n,o,i,s),n!==void 0&&Me.type(t,n,o,i,s)}r(i)},l4="enum",u4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Me.required(t,n,o,i,s),n!==void 0&&Me[l4](t,n,o,i,s)}r(i)},c4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n,"string")&&!t.required)return r();Me.required(t,n,o,i,s),vt(n,"string")||Me.pattern(t,n,o,i,s)}r(i)},f4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n,"date")&&!t.required)return r();if(Me.required(t,n,o,i,s),!vt(n,"date")){var l;n instanceof Date?l=n:l=new Date(n),Me.type(t,l,o,i,s),l&&Me.range(t,l.getTime(),o,i,s)}}r(i)},d4=function(t,n,r,o,s){var i=[],a=Array.isArray(n)?"array":typeof n;Me.required(t,n,o,i,s,a),r(i)},Xa=function(t,n,r,o,s){var i=t.type,a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(vt(n,i)&&!t.required)return r();Me.required(t,n,o,a,s,i),vt(n,i)||Me.type(t,n,o,a,s)}r(a)},p4=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Me.required(t,n,o,i,s)}r(i)},is={string:QT,method:e4,number:t4,boolean:n4,regexp:r4,integer:o4,float:s4,array:i4,object:a4,enum:u4,pattern:c4,date:f4,url:Xa,hex:Xa,email:Xa,required:d4,any:p4};function zl(){return{default:"Validation error on field %s",required:"%s is required",enum:"%s must be one of %s",whitespace:"%s cannot be empty",date:{format:"%s date %s is invalid for format %s",parse:"%s date could not be parsed, %s is invalid ",invalid:"%s date %s is invalid"},types:{string:"%s is not a %s",method:"%s is not a %s (function)",array:"%s is not an %s",object:"%s is not an %s",number:"%s is not a %s",date:"%s is not a %s",boolean:"%s is not a %s",integer:"%s is not an %s",float:"%s is not a %s",regexp:"%s is not a valid %s",email:"%s is not a valid %s",url:"%s is not a valid %s",hex:"%s is not a valid %s"},string:{len:"%s must be exactly %s characters",min:"%s must be at least %s characters",max:"%s cannot be longer than %s characters",range:"%s must be between %s and %s characters"},number:{len:"%s must equal %s",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",range:"%s must be between %s and %s"},array:{len:"%s must be exactly %s in length",min:"%s cannot be less than %s in length",max:"%s cannot be greater than %s in length",range:"%s must be between %s and %s in length"},pattern:{mismatch:"%s value %s does not match pattern %s"},clone:function(){var t=JSON.parse(JSON.stringify(this));return t.clone=this.clone,t}}}var Hl=zl(),zs=function(){function e(n){this.rules=null,this._messages=Hl,this.define(n)}var t=e.prototype;return t.define=function(r){var o=this;if(!r)throw new Error("Cannot configure a schema with no rules");if(typeof r!="object"||Array.isArray(r))throw new Error("Rules must be an object");this.rules={},Object.keys(r).forEach(function(s){var i=r[s];o.rules[s]=Array.isArray(i)?i:[i]})},t.messages=function(r){return r&&(this._messages=Vd(zl(),r)),this._messages},t.validate=function(r,o,s){var i=this;o===void 0&&(o={}),s===void 0&&(s=function(){});var a=r,l=o,u=s;if(typeof l=="function"&&(u=l,l={}),!this.rules||Object.keys(this.rules).length===0)return u&&u(null,a),Promise.resolve(a);function c(d){var y=[],g={};function _(T){if(Array.isArray(T)){var C;y=(C=y).concat.apply(C,T)}else y.push(T)}for(var b=0;b");const o=ke("form"),s=j(),i=j(0),a=()=>{var c;if((c=s.value)!=null&&c.firstElementChild){const f=window.getComputedStyle(s.value.firstElementChild).width;return Math.ceil(Number.parseFloat(f))}else return 0},l=(c="update")=>{Ve(()=>{t.default&&e.isAutoWidth&&(c==="update"?i.value=a():c==="remove"&&(n==null||n.deregisterLabelWidth(i.value)))})},u=()=>l("update");return Ue(()=>{u()}),Ct(()=>{l("remove")}),Yr(()=>u()),pe(i,(c,f)=>{e.updateAll&&(n==null||n.registerLabelWidth(c,f))}),Bt(E(()=>{var c,f;return(f=(c=s.value)==null?void 0:c.firstElementChild)!=null?f:null}),u),()=>{var c,f;if(!t)return null;const{isAutoWidth:p}=e;if(p){const v=n==null?void 0:n.autoLabelWidth,h=r==null?void 0:r.hasLabel,d={};if(h&&v&&v!=="auto"){const y=Math.max(0,Number.parseInt(v,10)-i.value),g=n.labelPosition==="left"?"marginRight":"marginLeft";y&&(d[g]=`${y}px`)}return ae("div",{ref:s,class:[o.be("item","label-wrap")],style:d},[(c=t.default)==null?void 0:c.call(t)])}else return ae(tt,{ref:s},[(f=t.default)==null?void 0:f.call(t)])}}});const g4=["role","aria-labelledby"],y4=J({name:"ElFormItem"}),b4=J({...y4,props:v4,setup(e,{expose:t}){const n=e,r=Xr(),o=Se(Lo,void 0),s=Se(qr,void 0),i=dn(void 0,{formItem:!1}),a=ke("form-item"),l=Ur().value,u=j([]),c=j(""),f=L1(c,100),p=j(""),v=j();let h,d=!1;const y=E(()=>{if((o==null?void 0:o.labelPosition)==="top")return{};const A=Xt(n.labelWidth||(o==null?void 0:o.labelWidth)||"");return A?{width:A}:{}}),g=E(()=>{if((o==null?void 0:o.labelPosition)==="top"||o!=null&&o.inline)return{};if(!n.label&&!n.labelWidth&&I)return{};const A=Xt(n.labelWidth||(o==null?void 0:o.labelWidth)||"");return!n.label&&!r.label?{marginLeft:A}:{}}),_=E(()=>[a.b(),a.m(i.value),a.is("error",c.value==="error"),a.is("validating",c.value==="validating"),a.is("success",c.value==="success"),a.is("required",G.value||n.required),a.is("no-asterisk",o==null?void 0:o.hideRequiredAsterisk),(o==null?void 0:o.requireAsteriskPosition)==="right"?"asterisk-right":"asterisk-left",{[a.m("feedback")]:o==null?void 0:o.statusIcon}]),b=E(()=>jt(n.inlineMessage)?n.inlineMessage:(o==null?void 0:o.inlineMessage)||!1),T=E(()=>[a.e("error"),{[a.em("error","inline")]:b.value}]),C=E(()=>n.prop?xe(n.prop)?n.prop:n.prop.join("."):""),O=E(()=>!!(n.label||r.label)),x=E(()=>n.for||(u.value.length===1?u.value[0]:void 0)),L=E(()=>!x.value&&O.value),I=!!s,k=E(()=>{const A=o==null?void 0:o.model;if(!(!A||!n.prop))return Ja(A,n.prop).value}),z=E(()=>{const{required:A}=n,q=[];n.rules&&q.push(...Ui(n.rules));const X=o==null?void 0:o.rules;if(X&&n.prop){const ne=Ja(X,n.prop).value;ne&&q.push(...Ui(ne))}if(A!==void 0){const ne=q.map((_e,Re)=>[_e,Re]).filter(([_e])=>Object.keys(_e).includes("required"));if(ne.length>0)for(const[_e,Re]of ne)_e.required!==A&&(q[Re]={..._e,required:A});else q.push({required:A})}return q}),B=E(()=>z.value.length>0),K=A=>z.value.filter(X=>!X.trigger||!A?!0:Array.isArray(X.trigger)?X.trigger.includes(A):X.trigger===A).map(({trigger:X,...ne})=>ne),G=E(()=>z.value.some(A=>A.required)),R=E(()=>{var A;return f.value==="error"&&n.showMessage&&((A=o==null?void 0:o.showMessage)!=null?A:!0)}),F=E(()=>`${n.label||""}${(o==null?void 0:o.labelSuffix)||""}`),$=A=>{c.value=A},se=A=>{var q,X;const{errors:ne,fields:_e}=A;(!ne||!_e)&&console.error(A),$("error"),p.value=ne?(X=(q=ne==null?void 0:ne[0])==null?void 0:q.message)!=null?X:`${n.prop} is required`:"",o==null||o.emit("validate",n.prop,!1,p.value)},me=()=>{$("success"),o==null||o.emit("validate",n.prop,!0,"")},Pe=async A=>{const q=C.value;return new zs({[q]:A}).validate({[q]:k.value},{firstFields:!0}).then(()=>(me(),!0)).catch(ne=>(se(ne),Promise.reject(ne)))},je=async(A,q)=>{if(d||!n.prop)return!1;const X=ve(q);if(!B.value)return q==null||q(!1),!1;const ne=K(A);return ne.length===0?(q==null||q(!0),!0):($("validating"),Pe(ne).then(()=>(q==null||q(!0),!0)).catch(_e=>{const{fields:Re}=_e;return q==null||q(!1,Re),X?!1:Promise.reject(Re)}))},Ce=()=>{$(""),p.value="",d=!1},Oe=async()=>{const A=o==null?void 0:o.model;if(!A||!n.prop)return;const q=Ja(A,n.prop);d=!0,q.value=pd(h),await Ve(),Ce(),d=!1},Ee=A=>{u.value.includes(A)||u.value.push(A)},Ze=A=>{u.value=u.value.filter(q=>q!==A)};pe(()=>n.error,A=>{p.value=A||"",$(A?"error":"")},{immediate:!0}),pe(()=>n.validateStatus,A=>$(A||""));const $e=Et({...Gr(n),$el:v,size:i,validateState:c,labelId:l,inputIds:u,isGroup:L,hasLabel:O,fieldValue:k,addInputId:Ee,removeInputId:Ze,resetField:Oe,clearValidate:Ce,validate:je});return ut(qr,$e),Ue(()=>{n.prop&&(o==null||o.addField($e),h=pd(k.value))}),Ct(()=>{o==null||o.removeField($e)}),t({size:i,validateMessage:p,validateState:c,validate:je,clearValidate:Ce,resetField:Oe}),(A,q)=>{var X;return P(),Q("div",{ref_key:"formItemRef",ref:v,class:W(m(_)),role:m(L)?"group":void 0,"aria-labelledby":m(L)?m(l):void 0},[ae(m(m4),{"is-auto-width":m(y).width==="auto","update-all":((X=m(o))==null?void 0:X.labelWidth)==="auto"},{default:ye(()=>[m(O)?(P(),he(it(m(x)?"label":"div"),{key:0,id:m(l),for:m(x),class:W(m(a).e("label")),style:ot(m(y))},{default:ye(()=>[de(A.$slots,"label",{label:m(F)},()=>[zr(We(m(F)),1)])]),_:3},8,["id","for","class","style"])):ue("v-if",!0)]),_:3},8,["is-auto-width","update-all"]),fe("div",{class:W(m(a).e("content")),style:ot(m(g))},[de(A.$slots,"default"),ae(n0,{name:`${m(a).namespace.value}-zoom-in-top`},{default:ye(()=>[m(R)?de(A.$slots,"error",{key:0,error:p.value},()=>[fe("div",{class:W(m(T))},We(p.value),3)]):ue("v-if",!0)]),_:3},8,["name"])],6)],10,g4)}}});var bm=Ne(b4,[["__file","form-item.vue"]]);const m8=yt(NT,{FormItem:bm}),g8=eo(bm);let en;const w4=` - height:0 !important; - visibility:hidden !important; - ${X1()?"":"overflow:hidden !important;"} - position:absolute !important; - z-index:-1000 !important; - top:0 !important; - right:0 !important; -`,_4=["letter-spacing","line-height","padding-top","padding-bottom","font-family","font-weight","font-size","text-rendering","text-transform","width","text-indent","padding-left","padding-right","border-width","box-sizing"];function S4(e){const t=window.getComputedStyle(e),n=t.getPropertyValue("box-sizing"),r=Number.parseFloat(t.getPropertyValue("padding-bottom"))+Number.parseFloat(t.getPropertyValue("padding-top")),o=Number.parseFloat(t.getPropertyValue("border-bottom-width"))+Number.parseFloat(t.getPropertyValue("border-top-width"));return{contextStyle:_4.map(i=>`${i}:${t.getPropertyValue(i)}`).join(";"),paddingSize:r,borderSize:o,boxSizing:n}}function Kd(e,t=1,n){var r;en||(en=document.createElement("textarea"),document.body.appendChild(en));const{paddingSize:o,borderSize:s,boxSizing:i,contextStyle:a}=S4(e);en.setAttribute("style",`${a};${w4}`),en.value=e.value||e.placeholder||"";let l=en.scrollHeight;const u={};i==="border-box"?l=l+s:i==="content-box"&&(l=l-o),en.value="";const c=en.scrollHeight-o;if(ze(t)){let f=c*t;i==="border-box"&&(f=f+o+s),l=Math.max(f,l),u.minHeight=`${f}px`}if(ze(n)){let f=c*n;i==="border-box"&&(f=f+o+s),l=Math.min(f,l)}return u.height=`${l}px`,(r=en.parentNode)==null||r.removeChild(en),en=void 0,u}const E4=Ie({id:{type:String,default:void 0},size:$o,disabled:Boolean,modelValue:{type:we([String,Number,Object]),default:""},maxlength:{type:[String,Number]},minlength:{type:[String,Number]},type:{type:String,default:"text"},resize:{type:String,values:["none","both","horizontal","vertical"]},autosize:{type:we([Boolean,Object]),default:!1},autocomplete:{type:String,default:"off"},formatter:{type:Function},parser:{type:Function},placeholder:{type:String},form:{type:String},readonly:{type:Boolean,default:!1},clearable:{type:Boolean,default:!1},showPassword:{type:Boolean,default:!1},showWordLimit:{type:Boolean,default:!1},suffixIcon:{type:Pt},prefixIcon:{type:Pt},containerRole:{type:String,default:void 0},label:{type:String,default:void 0},tabindex:{type:[String,Number],default:0},validateEvent:{type:Boolean,default:!0},inputStyle:{type:we([Object,Array,String]),default:()=>Sa({})},autofocus:{type:Boolean,default:!1},...Gn(["ariaLabel"])}),C4={[Ge]:e=>xe(e),input:e=>xe(e),change:e=>xe(e),focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:()=>!0,mouseleave:e=>e instanceof MouseEvent,mouseenter:e=>e instanceof MouseEvent,keydown:e=>e instanceof Event,compositionstart:e=>e instanceof CompositionEvent,compositionupdate:e=>e instanceof CompositionEvent,compositionend:e=>e instanceof CompositionEvent},O4=["role"],T4=["id","minlength","maxlength","type","disabled","readonly","autocomplete","tabindex","aria-label","placeholder","form","autofocus"],x4=["id","minlength","maxlength","tabindex","disabled","readonly","autocomplete","aria-label","placeholder","form","autofocus"],A4=J({name:"ElInput",inheritAttrs:!1}),R4=J({...A4,props:E4,emits:C4,setup(e,{expose:t,emit:n}){const r=e,o=Gy(),s=Xr(),i=E(()=>{const N={};return r.containerRole==="combobox"&&(N["aria-haspopup"]=o["aria-haspopup"],N["aria-owns"]=o["aria-owns"],N["aria-expanded"]=o["aria-expanded"]),N}),a=E(()=>[r.type==="textarea"?y.b():d.b(),d.m(v.value),d.is("disabled",h.value),d.is("exceed",Ee.value),{[d.b("group")]:s.prepend||s.append,[d.m("prefix")]:s.prefix||r.prefixIcon,[d.m("suffix")]:s.suffix||r.suffixIcon||r.clearable||r.showPassword,[d.bm("suffix","password-clear")]:Pe.value&&je.value,[d.b("hidden")]:r.type==="hidden"},o.class]),l=E(()=>[d.e("wrapper"),d.is("focus",k.value)]),u=UC({excludeKeys:E(()=>Object.keys(i.value))}),{form:c,formItem:f}=Cr(),{inputId:p}=Vs(r,{formItemContext:f}),v=dn(),h=ko(),d=ke("input"),y=ke("textarea"),g=vr(),_=vr(),b=j(!1),T=j(!1),C=j(!1),O=j(),x=vr(r.inputStyle),L=E(()=>g.value||_.value),{wrapperRef:I,isFocused:k,handleFocus:z,handleBlur:B}=vm(L,{afterBlur(){var N;r.validateEvent&&((N=f==null?void 0:f.validate)==null||N.call(f,"blur").catch(re=>void 0))}}),K=E(()=>{var N;return(N=c==null?void 0:c.statusIcon)!=null?N:!1}),G=E(()=>(f==null?void 0:f.validateState)||""),R=E(()=>G.value&&Uv[G.value]),F=E(()=>C.value?kC:CC),$=E(()=>[o.style]),se=E(()=>[r.inputStyle,x.value,{resize:r.resize}]),me=E(()=>Cn(r.modelValue)?"":String(r.modelValue)),Pe=E(()=>r.clearable&&!h.value&&!r.readonly&&!!me.value&&(k.value||b.value)),je=E(()=>r.showPassword&&!h.value&&!r.readonly&&!!me.value&&(!!me.value||k.value)),Ce=E(()=>r.showWordLimit&&!!r.maxlength&&(r.type==="text"||r.type==="textarea")&&!h.value&&!r.readonly&&!r.showPassword),Oe=E(()=>me.value.length),Ee=E(()=>!!Ce.value&&Oe.value>Number(r.maxlength)),Ze=E(()=>!!s.suffix||!!r.suffixIcon||Pe.value||r.showPassword||Ce.value||!!G.value&&K.value),[$e,A]=pT(g);Bt(_,N=>{if(ne(),!Ce.value||r.resize!=="both")return;const re=N[0],{width:ge}=re.contentRect;O.value={right:`calc(100% - ${ge+15+6}px)`}});const q=()=>{const{type:N,autosize:re}=r;if(!(!nt||N!=="textarea"||!_.value))if(re){const ge=Te(re)?re.minRows:void 0,Fe=Te(re)?re.maxRows:void 0,Be=Kd(_.value,ge,Fe);x.value={overflowY:"hidden",...Be},Ve(()=>{_.value.offsetHeight,x.value=Be})}else x.value={minHeight:Kd(_.value).minHeight}},ne=(N=>{let re=!1;return()=>{var ge;if(re||!r.autosize)return;((ge=_.value)==null?void 0:ge.offsetParent)===null||(N(),re=!0)}})(q),_e=()=>{const N=L.value,re=r.formatter?r.formatter(me.value):me.value;!N||N.value===re||(N.value=re)},Re=async N=>{$e();let{value:re}=N.target;if(r.formatter&&(re=r.parser?r.parser(re):re),!T.value){if(re===me.value){_e();return}n(Ge,re),n("input",re),await Ve(),_e(),A()}},w=N=>{n("change",N.target.value)},S=N=>{n("compositionstart",N),T.value=!0},M=N=>{var re;n("compositionupdate",N);const ge=(re=N.target)==null?void 0:re.value,Fe=ge[ge.length-1]||"";T.value=!qv(Fe)},U=N=>{n("compositionend",N),T.value&&(T.value=!1,Re(N))},H=()=>{C.value=!C.value,ee()},ee=async()=>{var N;await Ve(),(N=L.value)==null||N.focus()},ie=()=>{var N;return(N=L.value)==null?void 0:N.blur()},Z=N=>{b.value=!1,n("mouseleave",N)},te=N=>{b.value=!0,n("mouseenter",N)},Y=N=>{n("keydown",N)},le=()=>{var N;(N=L.value)==null||N.select()},be=()=>{n(Ge,""),n("change",""),n("clear"),n("input","")};return pe(()=>r.modelValue,()=>{var N;Ve(()=>q()),r.validateEvent&&((N=f==null?void 0:f.validate)==null||N.call(f,"change").catch(re=>void 0))}),pe(me,()=>_e()),pe(()=>r.type,async()=>{await Ve(),_e(),q()}),Ue(()=>{!r.formatter&&r.parser,_e(),Ve(q)}),Ut({from:"label",replacement:"aria-label",version:"2.8.0",scope:"el-input",ref:"https://element-plus.org/en-US/component/input.html"},E(()=>!!r.label)),t({input:g,textarea:_,ref:L,textareaStyle:se,autosize:Ht(r,"autosize"),focus:ee,blur:ie,select:le,clear:be,resizeTextarea:q}),(N,re)=>(P(),Q("div",sn(m(i),{class:[m(a),{[m(d).bm("group","append")]:N.$slots.append,[m(d).bm("group","prepend")]:N.$slots.prepend}],style:m($),role:N.containerRole,onMouseenter:te,onMouseleave:Z}),[ue(" input "),N.type!=="textarea"?(P(),Q(tt,{key:0},[ue(" prepend slot "),N.$slots.prepend?(P(),Q("div",{key:0,class:W(m(d).be("group","prepend"))},[de(N.$slots,"prepend")],2)):ue("v-if",!0),fe("div",{ref_key:"wrapperRef",ref:I,class:W(m(l))},[ue(" prefix slot "),N.$slots.prefix||N.prefixIcon?(P(),Q("span",{key:0,class:W(m(d).e("prefix"))},[fe("span",{class:W(m(d).e("prefix-inner"))},[de(N.$slots,"prefix"),N.prefixIcon?(P(),he(m(Xe),{key:0,class:W(m(d).e("icon"))},{default:ye(()=>[(P(),he(it(N.prefixIcon)))]),_:1},8,["class"])):ue("v-if",!0)],2)],2)):ue("v-if",!0),fe("input",sn({id:m(p),ref_key:"input",ref:g,class:m(d).e("inner")},m(u),{minlength:N.minlength,maxlength:N.maxlength,type:N.showPassword?C.value?"text":"password":N.type,disabled:m(h),readonly:N.readonly,autocomplete:N.autocomplete,tabindex:N.tabindex,"aria-label":N.label||N.ariaLabel,placeholder:N.placeholder,style:N.inputStyle,form:N.form,autofocus:N.autofocus,onCompositionstart:S,onCompositionupdate:M,onCompositionend:U,onInput:Re,onFocus:re[0]||(re[0]=(...ge)=>m(z)&&m(z)(...ge)),onBlur:re[1]||(re[1]=(...ge)=>m(B)&&m(B)(...ge)),onChange:w,onKeydown:Y}),null,16,T4),ue(" suffix slot "),m(Ze)?(P(),Q("span",{key:1,class:W(m(d).e("suffix"))},[fe("span",{class:W(m(d).e("suffix-inner"))},[!m(Pe)||!m(je)||!m(Ce)?(P(),Q(tt,{key:0},[de(N.$slots,"suffix"),N.suffixIcon?(P(),he(m(Xe),{key:0,class:W(m(d).e("icon"))},{default:ye(()=>[(P(),he(it(N.suffixIcon)))]),_:1},8,["class"])):ue("v-if",!0)],64)):ue("v-if",!0),m(Pe)?(P(),he(m(Xe),{key:1,class:W([m(d).e("icon"),m(d).e("clear")]),onMousedown:lt(m(ct),["prevent"]),onClick:be},{default:ye(()=>[ae(m(Uu))]),_:1},8,["class","onMousedown"])):ue("v-if",!0),m(je)?(P(),he(m(Xe),{key:2,class:W([m(d).e("icon"),m(d).e("password")]),onClick:H},{default:ye(()=>[(P(),he(it(m(F))))]),_:1},8,["class"])):ue("v-if",!0),m(Ce)?(P(),Q("span",{key:3,class:W(m(d).e("count"))},[fe("span",{class:W(m(d).e("count-inner"))},We(m(Oe))+" / "+We(N.maxlength),3)],2)):ue("v-if",!0),m(G)&&m(R)&&m(K)?(P(),he(m(Xe),{key:4,class:W([m(d).e("icon"),m(d).e("validateIcon"),m(d).is("loading",m(G)==="validating")])},{default:ye(()=>[(P(),he(it(m(R))))]),_:1},8,["class"])):ue("v-if",!0)],2)],2)):ue("v-if",!0)],2),ue(" append slot "),N.$slots.append?(P(),Q("div",{key:1,class:W(m(d).be("group","append"))},[de(N.$slots,"append")],2)):ue("v-if",!0)],64)):(P(),Q(tt,{key:1},[ue(" textarea "),fe("textarea",sn({id:m(p),ref_key:"textarea",ref:_,class:[m(y).e("inner"),m(d).is("focus",m(k))]},m(u),{minlength:N.minlength,maxlength:N.maxlength,tabindex:N.tabindex,disabled:m(h),readonly:N.readonly,autocomplete:N.autocomplete,style:m(se),"aria-label":N.label||N.ariaLabel,placeholder:N.placeholder,form:N.form,autofocus:N.autofocus,onCompositionstart:S,onCompositionupdate:M,onCompositionend:U,onInput:Re,onFocus:re[2]||(re[2]=(...ge)=>m(z)&&m(z)(...ge)),onBlur:re[3]||(re[3]=(...ge)=>m(B)&&m(B)(...ge)),onChange:w,onKeydown:Y}),null,16,x4),m(Ce)?(P(),Q("span",{key:0,style:ot(O.value),class:W(m(d).e("count"))},We(m(Oe))+" / "+We(N.maxlength),7)):ue("v-if",!0)],64))],16,O4))}});var P4=Ne(R4,[["__file","input.vue"]]);const wm=yt(P4),ro=4,I4={vertical:{offset:"offsetHeight",scroll:"scrollTop",scrollSize:"scrollHeight",size:"height",key:"vertical",axis:"Y",client:"clientY",direction:"top"},horizontal:{offset:"offsetWidth",scroll:"scrollLeft",scrollSize:"scrollWidth",size:"width",key:"horizontal",axis:"X",client:"clientX",direction:"left"}},$4=({move:e,size:t,bar:n})=>({[n.size]:t,transform:`translate${n.axis}(${e}%)`}),rc=Symbol("scrollbarContextKey"),L4=Ie({vertical:Boolean,size:String,move:Number,ratio:{type:Number,required:!0},always:Boolean}),k4="Thumb",N4=J({__name:"thumb",props:L4,setup(e){const t=e,n=Se(rc),r=ke("scrollbar");n||Sr(k4,"can not inject scrollbar context");const o=j(),s=j(),i=j({}),a=j(!1);let l=!1,u=!1,c=nt?document.onselectstart:null;const f=E(()=>I4[t.vertical?"vertical":"horizontal"]),p=E(()=>$4({size:t.size,move:t.move,bar:f.value})),v=E(()=>o.value[f.value.offset]**2/n.wrapElement[f.value.scrollSize]/t.ratio/s.value[f.value.offset]),h=O=>{var x;if(O.stopPropagation(),O.ctrlKey||[1,2].includes(O.button))return;(x=window.getSelection())==null||x.removeAllRanges(),y(O);const L=O.currentTarget;L&&(i.value[f.value.axis]=L[f.value.offset]-(O[f.value.client]-L.getBoundingClientRect()[f.value.direction]))},d=O=>{if(!s.value||!o.value||!n.wrapElement)return;const x=Math.abs(O.target.getBoundingClientRect()[f.value.direction]-O[f.value.client]),L=s.value[f.value.offset]/2,I=(x-L)*100*v.value/o.value[f.value.offset];n.wrapElement[f.value.scroll]=I*n.wrapElement[f.value.scrollSize]/100},y=O=>{O.stopImmediatePropagation(),l=!0,document.addEventListener("mousemove",g),document.addEventListener("mouseup",_),c=document.onselectstart,document.onselectstart=()=>!1},g=O=>{if(!o.value||!s.value||l===!1)return;const x=i.value[f.value.axis];if(!x)return;const L=(o.value.getBoundingClientRect()[f.value.direction]-O[f.value.client])*-1,I=s.value[f.value.offset]-x,k=(L-I)*100*v.value/o.value[f.value.offset];n.wrapElement[f.value.scroll]=k*n.wrapElement[f.value.scrollSize]/100},_=()=>{l=!1,i.value[f.value.axis]=0,document.removeEventListener("mousemove",g),document.removeEventListener("mouseup",_),C(),u&&(a.value=!1)},b=()=>{u=!1,a.value=!!t.size},T=()=>{u=!0,a.value=l};Ct(()=>{C(),document.removeEventListener("mouseup",_)});const C=()=>{document.onselectstart!==c&&(document.onselectstart=c)};return an(Ht(n,"scrollbarElement"),"mousemove",b),an(Ht(n,"scrollbarElement"),"mouseleave",T),(O,x)=>(P(),he(Un,{name:m(r).b("fade"),persisted:""},{default:ye(()=>[ht(fe("div",{ref_key:"instance",ref:o,class:W([m(r).e("bar"),m(r).is(m(f).key)]),onMousedown:d},[fe("div",{ref_key:"thumb",ref:s,class:W(m(r).e("thumb")),style:ot(m(p)),onMousedown:h},null,38)],34),[[Pn,O.always||a.value]])]),_:1},8,["name"]))}});var Ud=Ne(N4,[["__file","thumb.vue"]]);const M4=Ie({always:{type:Boolean,default:!0},minSize:{type:Number,required:!0}}),F4=J({__name:"bar",props:M4,setup(e,{expose:t}){const n=e,r=Se(rc),o=j(0),s=j(0),i=j(""),a=j(""),l=j(1),u=j(1);return t({handleScroll:p=>{if(p){const v=p.offsetHeight-ro,h=p.offsetWidth-ro;s.value=p.scrollTop*100/v*l.value,o.value=p.scrollLeft*100/h*u.value}},update:()=>{const p=r==null?void 0:r.wrapElement;if(!p)return;const v=p.offsetHeight-ro,h=p.offsetWidth-ro,d=v**2/p.scrollHeight,y=h**2/p.scrollWidth,g=Math.max(d,n.minSize),_=Math.max(y,n.minSize);l.value=d/(v-d)/(g/(v-g)),u.value=y/(h-y)/(_/(h-_)),a.value=g+ro(P(),Q(tt,null,[ae(Ud,{move:o.value,ratio:u.value,size:i.value,always:p.always},null,8,["move","ratio","size","always"]),ae(Ud,{move:s.value,ratio:l.value,size:a.value,vertical:"",always:p.always},null,8,["move","ratio","size","always"])],64))}});var B4=Ne(F4,[["__file","bar.vue"]]);const D4=Ie({height:{type:[String,Number],default:""},maxHeight:{type:[String,Number],default:""},native:{type:Boolean,default:!1},wrapStyle:{type:we([String,Object,Array]),default:""},wrapClass:{type:[String,Array],default:""},viewClass:{type:[String,Array],default:""},viewStyle:{type:[String,Array,Object],default:""},noresize:Boolean,tag:{type:String,default:"div"},always:Boolean,minSize:{type:Number,default:20},id:String,role:String,...Gn(["ariaLabel","ariaOrientation"])}),j4={scroll:({scrollTop:e,scrollLeft:t})=>[e,t].every(ze)},V4="ElScrollbar",z4=J({name:V4}),H4=J({...z4,props:D4,emits:j4,setup(e,{expose:t,emit:n}){const r=e,o=ke("scrollbar");let s,i;const a=j(),l=j(),u=j(),c=j(),f=E(()=>{const b={};return r.height&&(b.height=Xt(r.height)),r.maxHeight&&(b.maxHeight=Xt(r.maxHeight)),[r.wrapStyle,b]}),p=E(()=>[r.wrapClass,o.e("wrap"),{[o.em("wrap","hidden-default")]:!r.native}]),v=E(()=>[o.e("view"),r.viewClass]),h=()=>{var b;l.value&&((b=c.value)==null||b.handleScroll(l.value),n("scroll",{scrollTop:l.value.scrollTop,scrollLeft:l.value.scrollLeft}))};function d(b,T){Te(b)?l.value.scrollTo(b):ze(b)&&ze(T)&&l.value.scrollTo(b,T)}const y=b=>{ze(b)&&(l.value.scrollTop=b)},g=b=>{ze(b)&&(l.value.scrollLeft=b)},_=()=>{var b;(b=c.value)==null||b.update()};return pe(()=>r.noresize,b=>{b?(s==null||s(),i==null||i()):({stop:s}=Bt(u,_),i=an("resize",_))},{immediate:!0}),pe(()=>[r.maxHeight,r.height],()=>{r.native||Ve(()=>{var b;_(),l.value&&((b=c.value)==null||b.handleScroll(l.value))})}),ut(rc,Et({scrollbarElement:a,wrapElement:l})),Ue(()=>{r.native||Ve(()=>{_()})}),Yr(()=>_()),t({wrapRef:l,update:_,scrollTo:d,setScrollTop:y,setScrollLeft:g,handleScroll:h}),(b,T)=>(P(),Q("div",{ref_key:"scrollbarRef",ref:a,class:W(m(o).b())},[fe("div",{ref_key:"wrapRef",ref:l,class:W(m(p)),style:ot(m(f)),onScroll:h},[(P(),he(it(b.tag),{id:b.id,ref_key:"resizeRef",ref:u,class:W(m(v)),style:ot(b.viewStyle),role:b.role,"aria-label":b.ariaLabel,"aria-orientation":b.ariaOrientation},{default:ye(()=>[de(b.$slots,"default")]),_:3},8,["id","class","style","role","aria-label","aria-orientation"]))],38),b.native?ue("v-if",!0):(P(),he(B4,{key:0,ref_key:"barRef",ref:c,always:b.always,"min-size":b.minSize},null,8,["always","min-size"]))],2))}});var K4=Ne(H4,[["__file","scrollbar.vue"]]);const U4=yt(K4),oc=Symbol("popper"),_m=Symbol("popperContent"),q4=["dialog","grid","group","listbox","menu","navigation","tooltip","tree"],Sm=Ie({role:{type:String,values:q4,default:"tooltip"}}),W4=J({name:"ElPopper",inheritAttrs:!1}),G4=J({...W4,props:Sm,setup(e,{expose:t}){const n=e,r=j(),o=j(),s=j(),i=j(),a=E(()=>n.role),l={triggerRef:r,popperInstanceRef:o,contentRef:s,referenceRef:i,role:a};return t(l),ut(oc,l),(u,c)=>de(u.$slots,"default")}});var Y4=Ne(G4,[["__file","popper.vue"]]);const Em=Ie({arrowOffset:{type:Number,default:5}}),J4=J({name:"ElPopperArrow",inheritAttrs:!1}),X4=J({...J4,props:Em,setup(e,{expose:t}){const n=e,r=ke("popper"),{arrowOffset:o,arrowRef:s,arrowStyle:i}=Se(_m,void 0);return pe(()=>n.arrowOffset,a=>{o.value=a}),Ct(()=>{s.value=void 0}),t({arrowRef:s}),(a,l)=>(P(),Q("span",{ref_key:"arrowRef",ref:s,class:W(m(r).e("arrow")),style:ot(m(i)),"data-popper-arrow":""},null,6))}});var Z4=Ne(X4,[["__file","arrow.vue"]]);const Q4="ElOnlyChild",ex=J({name:Q4,setup(e,{slots:t,attrs:n}){var r;const o=Se(fm),s=dT((r=o==null?void 0:o.setForwardRef)!=null?r:ct);return()=>{var i;const a=(i=t.default)==null?void 0:i.call(t,n);if(!a||a.length>1)return null;const l=Cm(a);return l?ht(zn(l,n),[[s]]):null}}});function Cm(e){if(!e)return null;const t=e;for(const n of t){if(Te(n))switch(n.type){case xt:continue;case Ro:case"svg":return qd(n);case tt:return Cm(n.children);default:return n}return qd(n)}return null}function qd(e){const t=ke("only-child");return ae("span",{class:t.e("content")},[e])}const Om=Ie({virtualRef:{type:we(Object)},virtualTriggering:Boolean,onMouseenter:{type:we(Function)},onMouseleave:{type:we(Function)},onClick:{type:we(Function)},onKeydown:{type:we(Function)},onFocus:{type:we(Function)},onBlur:{type:we(Function)},onContextmenu:{type:we(Function)},id:String,open:Boolean}),tx=J({name:"ElPopperTrigger",inheritAttrs:!1}),nx=J({...tx,props:Om,setup(e,{expose:t}){const n=e,{role:r,triggerRef:o}=Se(oc,void 0);fT(o);const s=E(()=>a.value?n.id:void 0),i=E(()=>{if(r&&r.value==="tooltip")return n.open&&n.id?n.id:void 0}),a=E(()=>{if(r&&r.value!=="tooltip")return r.value}),l=E(()=>a.value?`${n.open}`:void 0);let u;return Ue(()=>{pe(()=>n.virtualRef,c=>{c&&(o.value=Dn(c))},{immediate:!0}),pe(o,(c,f)=>{u==null||u(),u=void 0,So(c)&&(["onMouseenter","onMouseleave","onClick","onKeydown","onFocus","onBlur","onContextmenu"].forEach(p=>{var v;const h=n[p];h&&(c.addEventListener(p.slice(2).toLowerCase(),h),(v=f==null?void 0:f.removeEventListener)==null||v.call(f,p.slice(2).toLowerCase(),h))}),u=pe([s,i,a,l],p=>{["aria-controls","aria-describedby","aria-haspopup","aria-expanded"].forEach((v,h)=>{Cn(p[h])?c.removeAttribute(v):c.setAttribute(v,p[h])})},{immediate:!0})),So(f)&&["aria-controls","aria-describedby","aria-haspopup","aria-expanded"].forEach(p=>f.removeAttribute(p))},{immediate:!0})}),Ct(()=>{u==null||u(),u=void 0}),t({triggerRef:o}),(c,f)=>c.virtualTriggering?ue("v-if",!0):(P(),he(m(ex),sn({key:0},c.$attrs,{"aria-controls":m(s),"aria-describedby":m(i),"aria-expanded":m(l),"aria-haspopup":m(a)}),{default:ye(()=>[de(c.$slots,"default")]),_:3},16,["aria-controls","aria-describedby","aria-expanded","aria-haspopup"]))}});var rx=Ne(nx,[["__file","trigger.vue"]]);const Za="focus-trap.focus-after-trapped",Qa="focus-trap.focus-after-released",ox="focus-trap.focusout-prevented",Wd={cancelable:!0,bubbles:!1},sx={cancelable:!0,bubbles:!1},Gd="focusAfterTrapped",Yd="focusAfterReleased",Tm=Symbol("elFocusTrap"),sc=j(),Ta=j(0),ic=j(0);let ui=0;const xm=e=>{const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const o=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||o?NodeFilter.FILTER_SKIP:r.tabIndex>=0||r===document.activeElement?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t},Jd=(e,t)=>{for(const n of e)if(!ix(n,t))return n},ix=(e,t)=>{if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1},ax=e=>{const t=xm(e),n=Jd(t,e),r=Jd(t.reverse(),e);return[n,r]},lx=e=>e instanceof HTMLInputElement&&"select"in e,nr=(e,t)=>{if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),ic.value=window.performance.now(),e!==n&&lx(e)&&t&&e.select()}};function Xd(e,t){const n=[...e],r=e.indexOf(t);return r!==-1&&n.splice(r,1),n}const ux=()=>{let e=[];return{push:r=>{const o=e[0];o&&r!==o&&o.pause(),e=Xd(e,r),e.unshift(r)},remove:r=>{var o,s;e=Xd(e,r),(s=(o=e[0])==null?void 0:o.resume)==null||s.call(o)}}},cx=(e,t=!1)=>{const n=document.activeElement;for(const r of e)if(nr(r,t),document.activeElement!==n)return},Zd=ux(),fx=()=>Ta.value>ic.value,ci=()=>{sc.value="pointer",Ta.value=window.performance.now()},Qd=()=>{sc.value="keyboard",Ta.value=window.performance.now()},dx=()=>(Ue(()=>{ui===0&&(document.addEventListener("mousedown",ci),document.addEventListener("touchstart",ci),document.addEventListener("keydown",Qd)),ui++}),Ct(()=>{ui--,ui<=0&&(document.removeEventListener("mousedown",ci),document.removeEventListener("touchstart",ci),document.removeEventListener("keydown",Qd))}),{focusReason:sc,lastUserFocusTimestamp:Ta,lastAutomatedFocusTimestamp:ic}),fi=e=>new CustomEvent(ox,{...sx,detail:e}),px=J({name:"ElFocusTrap",inheritAttrs:!1,props:{loop:Boolean,trapped:Boolean,focusTrapEl:Object,focusStartEl:{type:[Object,String],default:"first"}},emits:[Gd,Yd,"focusin","focusout","focusout-prevented","release-requested"],setup(e,{emit:t}){const n=j();let r,o;const{focusReason:s}=dx();iT(h=>{e.trapped&&!i.paused&&t("release-requested",h)});const i={paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}},a=h=>{if(!e.loop&&!e.trapped||i.paused)return;const{key:d,altKey:y,ctrlKey:g,metaKey:_,currentTarget:b,shiftKey:T}=h,{loop:C}=e,O=d===On.tab&&!y&&!g&&!_,x=document.activeElement;if(O&&x){const L=b,[I,k]=ax(L);if(I&&k){if(!T&&x===k){const B=fi({focusReason:s.value});t("focusout-prevented",B),B.defaultPrevented||(h.preventDefault(),C&&nr(I,!0))}else if(T&&[I,L].includes(x)){const B=fi({focusReason:s.value});t("focusout-prevented",B),B.defaultPrevented||(h.preventDefault(),C&&nr(k,!0))}}else if(x===L){const B=fi({focusReason:s.value});t("focusout-prevented",B),B.defaultPrevented||h.preventDefault()}}};ut(Tm,{focusTrapRef:n,onKeydown:a}),pe(()=>e.focusTrapEl,h=>{h&&(n.value=h)},{immediate:!0}),pe([n],([h],[d])=>{h&&(h.addEventListener("keydown",a),h.addEventListener("focusin",c),h.addEventListener("focusout",f)),d&&(d.removeEventListener("keydown",a),d.removeEventListener("focusin",c),d.removeEventListener("focusout",f))});const l=h=>{t(Gd,h)},u=h=>t(Yd,h),c=h=>{const d=m(n);if(!d)return;const y=h.target,g=h.relatedTarget,_=y&&d.contains(y);e.trapped||g&&d.contains(g)||(r=g),_&&t("focusin",h),!i.paused&&e.trapped&&(_?o=y:nr(o,!0))},f=h=>{const d=m(n);if(!(i.paused||!d))if(e.trapped){const y=h.relatedTarget;!Cn(y)&&!d.contains(y)&&setTimeout(()=>{if(!i.paused&&e.trapped){const g=fi({focusReason:s.value});t("focusout-prevented",g),g.defaultPrevented||nr(o,!0)}},0)}else{const y=h.target;y&&d.contains(y)||t("focusout",h)}};async function p(){await Ve();const h=m(n);if(h){Zd.push(i);const d=h.contains(document.activeElement)?r:document.activeElement;if(r=d,!h.contains(d)){const g=new Event(Za,Wd);h.addEventListener(Za,l),h.dispatchEvent(g),g.defaultPrevented||Ve(()=>{let _=e.focusStartEl;xe(_)||(nr(_),document.activeElement!==_&&(_="first")),_==="first"&&cx(xm(h),!0),(document.activeElement===d||_==="container")&&nr(h)})}}}function v(){const h=m(n);if(h){h.removeEventListener(Za,l);const d=new CustomEvent(Qa,{...Wd,detail:{focusReason:s.value}});h.addEventListener(Qa,u),h.dispatchEvent(d),!d.defaultPrevented&&(s.value=="keyboard"||!fx()||h.contains(document.activeElement))&&nr(r??document.body),h.removeEventListener(Qa,u),Zd.remove(i)}}return Ue(()=>{e.trapped&&p(),pe(()=>e.trapped,h=>{h?p():v()})}),Ct(()=>{e.trapped&&v()}),{onKeydown:a}}});function hx(e,t,n,r,o,s){return de(e.$slots,"default",{handleKeydown:e.onKeydown})}var Am=Ne(px,[["render",hx],["__file","focus-trap.vue"]]);const vx=["fixed","absolute"],mx=Ie({boundariesPadding:{type:Number,default:0},fallbackPlacements:{type:we(Array),default:void 0},gpuAcceleration:{type:Boolean,default:!0},offset:{type:Number,default:12},placement:{type:String,values:Ca,default:"bottom"},popperOptions:{type:we(Object),default:()=>({})},strategy:{type:String,values:vx,default:"absolute"}}),Rm=Ie({...mx,id:String,style:{type:we([String,Array,Object])},className:{type:we([String,Array,Object])},effect:{type:String,default:"dark"},visible:Boolean,enterable:{type:Boolean,default:!0},pure:Boolean,focusOnShow:{type:Boolean,default:!1},trapping:{type:Boolean,default:!1},popperClass:{type:we([String,Array,Object])},popperStyle:{type:we([String,Array,Object])},referenceEl:{type:we(Object)},triggerTargetEl:{type:we(Object)},stopPopperMouseEvent:{type:Boolean,default:!0},virtualTriggering:Boolean,zIndex:Number,...Gn(["ariaLabel"])}),gx={mouseenter:e=>e instanceof MouseEvent,mouseleave:e=>e instanceof MouseEvent,focus:()=>!0,blur:()=>!0,close:()=>!0},yx=(e,t=[])=>{const{placement:n,strategy:r,popperOptions:o}=e,s={placement:n,strategy:r,...o,modifiers:[...wx(e),...t]};return _x(s,o==null?void 0:o.modifiers),s},bx=e=>{if(nt)return Dn(e)};function wx(e){const{offset:t,gpuAcceleration:n,fallbackPlacements:r}=e;return[{name:"offset",options:{offset:[0,t??12]}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5,fallbackPlacements:r}},{name:"computeStyles",options:{gpuAcceleration:n}}]}function _x(e,t){t&&(e.modifiers=[...e.modifiers,...t??[]])}const Sx=0,Ex=e=>{const{popperInstanceRef:t,contentRef:n,triggerRef:r,role:o}=Se(oc,void 0),s=j(),i=j(),a=E(()=>({name:"eventListeners",enabled:!!e.visible})),l=E(()=>{var g;const _=m(s),b=(g=m(i))!=null?g:Sx;return{name:"arrow",enabled:!kv(_),options:{element:_,padding:b}}}),u=E(()=>({onFirstUpdate:()=>{h()},...yx(e,[m(l),m(a)])})),c=E(()=>bx(e.referenceEl)||m(r)),{attributes:f,state:p,styles:v,update:h,forceUpdate:d,instanceRef:y}=rT(c,n,u);return pe(y,g=>t.value=g),Ue(()=>{pe(()=>{var g;return(g=m(c))==null?void 0:g.getBoundingClientRect()},()=>{h()})}),{attributes:f,arrowRef:s,contentRef:n,instanceRef:y,state:p,styles:v,role:o,forceUpdate:d,update:h}},Cx=(e,{attributes:t,styles:n,role:r})=>{const{nextZIndex:o}=nc(),s=ke("popper"),i=E(()=>m(t).popper),a=j(ze(e.zIndex)?e.zIndex:o()),l=E(()=>[s.b(),s.is("pure",e.pure),s.is(e.effect),e.popperClass]),u=E(()=>[{zIndex:m(a)},m(n).popper,e.popperStyle||{}]),c=E(()=>r.value==="dialog"?"false":void 0),f=E(()=>m(n).arrow||{});return{ariaModal:c,arrowStyle:f,contentAttrs:i,contentClass:l,contentStyle:u,contentZIndex:a,updateZIndex:()=>{a.value=ze(e.zIndex)?e.zIndex:o()}}},Ox=(e,t)=>{const n=j(!1),r=j();return{focusStartRef:r,trapped:n,onFocusAfterReleased:u=>{var c;((c=u.detail)==null?void 0:c.focusReason)!=="pointer"&&(r.value="first",t("blur"))},onFocusAfterTrapped:()=>{t("focus")},onFocusInTrap:u=>{e.visible&&!n.value&&(u.target&&(r.value=u.target),n.value=!0)},onFocusoutPrevented:u=>{e.trapping||(u.detail.focusReason==="pointer"&&u.preventDefault(),n.value=!1)},onReleaseRequested:()=>{n.value=!1,t("close")}}},Tx=J({name:"ElPopperContent"}),xx=J({...Tx,props:Rm,emits:gx,setup(e,{expose:t,emit:n}){const r=e,{focusStartRef:o,trapped:s,onFocusAfterReleased:i,onFocusAfterTrapped:a,onFocusInTrap:l,onFocusoutPrevented:u,onReleaseRequested:c}=Ox(r,n),{attributes:f,arrowRef:p,contentRef:v,styles:h,instanceRef:d,role:y,update:g}=Ex(r),{ariaModal:_,arrowStyle:b,contentAttrs:T,contentClass:C,contentStyle:O,updateZIndex:x}=Cx(r,{styles:h,attributes:f,role:y}),L=Se(qr,void 0),I=j();ut(_m,{arrowStyle:b,arrowRef:p,arrowOffset:I}),L&&ut(qr,{...L,addInputId:ct,removeInputId:ct});let k;const z=(K=!0)=>{g(),K&&x()},B=()=>{z(!1),r.visible&&r.focusOnShow?s.value=!0:r.visible===!1&&(s.value=!1)};return Ue(()=>{pe(()=>r.triggerTargetEl,(K,G)=>{k==null||k(),k=void 0;const R=m(K||v.value),F=m(G||v.value);So(R)&&(k=pe([y,()=>r.ariaLabel,_,()=>r.id],$=>{["role","aria-label","aria-modal","id"].forEach((se,me)=>{Cn($[me])?R.removeAttribute(se):R.setAttribute(se,$[me])})},{immediate:!0})),F!==R&&So(F)&&["role","aria-label","aria-modal","id"].forEach($=>{F.removeAttribute($)})},{immediate:!0}),pe(()=>r.visible,B,{immediate:!0})}),Ct(()=>{k==null||k(),k=void 0}),t({popperContentRef:v,popperInstanceRef:d,updatePopper:z,contentStyle:O}),(K,G)=>(P(),Q("div",sn({ref_key:"contentRef",ref:v},m(T),{style:m(O),class:m(C),tabindex:"-1",onMouseenter:G[0]||(G[0]=R=>K.$emit("mouseenter",R)),onMouseleave:G[1]||(G[1]=R=>K.$emit("mouseleave",R))}),[ae(m(Am),{trapped:m(s),"trap-on-focus-in":!0,"focus-trap-el":m(v),"focus-start-el":m(o),onFocusAfterTrapped:m(a),onFocusAfterReleased:m(i),onFocusin:m(l),onFocusoutPrevented:m(u),onReleaseRequested:m(c)},{default:ye(()=>[de(K.$slots,"default")]),_:3},8,["trapped","focus-trap-el","focus-start-el","onFocusAfterTrapped","onFocusAfterReleased","onFocusin","onFocusoutPrevented","onReleaseRequested"])],16))}});var Ax=Ne(xx,[["__file","content.vue"]]);const Rx=yt(Y4),ac=Symbol("elTooltip"),Ft=Ie({...uT,...Rm,appendTo:{type:we([String,Object])},content:{type:String,default:""},rawContent:{type:Boolean,default:!1},persistent:Boolean,visible:{type:we(Boolean),default:null},transition:String,teleported:{type:Boolean,default:!0},disabled:Boolean,...Gn(["ariaLabel"])}),xs=Ie({...Om,disabled:Boolean,trigger:{type:we([String,Array]),default:"hover"},triggerKeys:{type:we(Array),default:()=>[On.enter,On.space]}}),{useModelToggleProps:Px,useModelToggleEmits:Ix,useModelToggle:$x}=Yv("visible"),Lx=Ie({...Sm,...Px,...Ft,...xs,...Em,showArrow:{type:Boolean,default:!0}}),kx=[...Ix,"before-show","before-hide","show","hide","open","close"],Nx=(e,t)=>ce(e)?e.includes(t):e===t,oo=(e,t,n)=>r=>{Nx(m(e),t)&&n(r)},Mx=J({name:"ElTooltipTrigger"}),Fx=J({...Mx,props:xs,setup(e,{expose:t}){const n=e,r=ke("tooltip"),{controlled:o,id:s,open:i,onOpen:a,onClose:l,onToggle:u}=Se(ac,void 0),c=j(null),f=()=>{if(m(o)||n.disabled)return!0},p=Ht(n,"trigger"),v=Mn(f,oo(p,"hover",a)),h=Mn(f,oo(p,"hover",l)),d=Mn(f,oo(p,"click",T=>{T.button===0&&u(T)})),y=Mn(f,oo(p,"focus",a)),g=Mn(f,oo(p,"focus",l)),_=Mn(f,oo(p,"contextmenu",T=>{T.preventDefault(),u(T)})),b=Mn(f,T=>{const{code:C}=T;n.triggerKeys.includes(C)&&(T.preventDefault(),u(T))});return t({triggerRef:c}),(T,C)=>(P(),he(m(rx),{id:m(s),"virtual-ref":T.virtualRef,open:m(i),"virtual-triggering":T.virtualTriggering,class:W(m(r).e("trigger")),onBlur:m(g),onClick:m(d),onContextmenu:m(_),onFocus:m(y),onMouseenter:m(v),onMouseleave:m(h),onKeydown:m(b)},{default:ye(()=>[de(T.$slots,"default")]),_:3},8,["id","virtual-ref","open","virtual-triggering","class","onBlur","onClick","onContextmenu","onFocus","onMouseenter","onMouseleave","onKeydown"]))}});var Bx=Ne(Fx,[["__file","trigger.vue"]]);const Dx=J({name:"ElTooltipContent",inheritAttrs:!1}),jx=J({...Dx,props:Ft,setup(e,{expose:t}){const n=e,{selector:r}=cm(),o=ke("tooltip"),s=j(null),i=j(!1),{controlled:a,id:l,open:u,trigger:c,onClose:f,onOpen:p,onShow:v,onHide:h,onBeforeShow:d,onBeforeHide:y}=Se(ac,void 0),g=E(()=>n.transition||`${o.namespace.value}-fade-in-linear`),_=E(()=>n.persistent);Ct(()=>{i.value=!0});const b=E(()=>m(_)?!0:m(u)),T=E(()=>n.disabled?!1:m(u)),C=E(()=>n.appendTo||r.value),O=E(()=>{var $;return($=n.style)!=null?$:{}}),x=E(()=>!m(u)),L=()=>{h()},I=()=>{if(m(a))return!0},k=Mn(I,()=>{n.enterable&&m(c)==="hover"&&p()}),z=Mn(I,()=>{m(c)==="hover"&&f()}),B=()=>{var $,se;(se=($=s.value)==null?void 0:$.updatePopper)==null||se.call($),d==null||d()},K=()=>{y==null||y()},G=()=>{v(),F=M1(E(()=>{var $;return($=s.value)==null?void 0:$.popperContentRef}),()=>{if(m(a))return;m(c)!=="hover"&&f()})},R=()=>{n.virtualTriggering||f()};let F;return pe(()=>m(u),$=>{$||F==null||F()},{flush:"post"}),pe(()=>n.content,()=>{var $,se;(se=($=s.value)==null?void 0:$.updatePopper)==null||se.call($)}),t({contentRef:s}),($,se)=>(P(),he($h,{disabled:!$.teleported,to:m(C)},[ae(Un,{name:m(g),onAfterLeave:L,onBeforeEnter:B,onAfterEnter:G,onBeforeLeave:K},{default:ye(()=>[m(b)?ht((P(),he(m(Ax),sn({key:0,id:m(l),ref_key:"contentRef",ref:s},$.$attrs,{"aria-label":$.ariaLabel,"aria-hidden":m(x),"boundaries-padding":$.boundariesPadding,"fallback-placements":$.fallbackPlacements,"gpu-acceleration":$.gpuAcceleration,offset:$.offset,placement:$.placement,"popper-options":$.popperOptions,strategy:$.strategy,effect:$.effect,enterable:$.enterable,pure:$.pure,"popper-class":$.popperClass,"popper-style":[$.popperStyle,m(O)],"reference-el":$.referenceEl,"trigger-target-el":$.triggerTargetEl,visible:m(T),"z-index":$.zIndex,onMouseenter:m(k),onMouseleave:m(z),onBlur:R,onClose:m(f)}),{default:ye(()=>[i.value?ue("v-if",!0):de($.$slots,"default",{key:0})]),_:3},16,["id","aria-label","aria-hidden","boundaries-padding","fallback-placements","gpu-acceleration","offset","placement","popper-options","strategy","effect","enterable","pure","popper-class","popper-style","reference-el","trigger-target-el","visible","z-index","onMouseenter","onMouseleave","onClose"])),[[Pn,m(T)]]):ue("v-if",!0)]),_:3},8,["name"])],8,["disabled","to"]))}});var Vx=Ne(jx,[["__file","content.vue"]]);const zx=["innerHTML"],Hx={key:1},Kx=J({name:"ElTooltip"}),Ux=J({...Kx,props:Lx,emits:kx,setup(e,{expose:t,emit:n}){const r=e;lT();const o=Ur(),s=j(),i=j(),a=()=>{var g;const _=m(s);_&&((g=_.popperInstanceRef)==null||g.update())},l=j(!1),u=j(),{show:c,hide:f,hasUpdateHandler:p}=$x({indicator:l,toggleReason:u}),{onOpen:v,onClose:h}=cT({showAfter:Ht(r,"showAfter"),hideAfter:Ht(r,"hideAfter"),autoClose:Ht(r,"autoClose"),open:c,close:f}),d=E(()=>jt(r.visible)&&!p.value);ut(ac,{controlled:d,id:o,open:Ls(l),trigger:Ht(r,"trigger"),onOpen:g=>{v(g)},onClose:g=>{h(g)},onToggle:g=>{m(l)?h(g):v(g)},onShow:()=>{n("show",u.value)},onHide:()=>{n("hide",u.value)},onBeforeShow:()=>{n("before-show",u.value)},onBeforeHide:()=>{n("before-hide",u.value)},updatePopper:a}),pe(()=>r.disabled,g=>{g&&l.value&&(l.value=!1)});const y=g=>{var _,b;const T=(b=(_=i.value)==null?void 0:_.contentRef)==null?void 0:b.popperContentRef,C=(g==null?void 0:g.relatedTarget)||document.activeElement;return T&&T.contains(C)};return Th(()=>l.value&&f()),t({popperRef:s,contentRef:i,isFocusInsideContent:y,updatePopper:a,onOpen:v,onClose:h,hide:f}),(g,_)=>(P(),he(m(Rx),{ref_key:"popperRef",ref:s,role:g.role},{default:ye(()=>[ae(Bx,{disabled:g.disabled,trigger:g.trigger,"trigger-keys":g.triggerKeys,"virtual-ref":g.virtualRef,"virtual-triggering":g.virtualTriggering},{default:ye(()=>[g.$slots.default?de(g.$slots,"default",{key:0}):ue("v-if",!0)]),_:3},8,["disabled","trigger","trigger-keys","virtual-ref","virtual-triggering"]),ae(Vx,{ref_key:"contentRef",ref:i,"aria-label":g.ariaLabel,"boundaries-padding":g.boundariesPadding,content:g.content,disabled:g.disabled,effect:g.effect,enterable:g.enterable,"fallback-placements":g.fallbackPlacements,"hide-after":g.hideAfter,"gpu-acceleration":g.gpuAcceleration,offset:g.offset,persistent:g.persistent,"popper-class":g.popperClass,"popper-style":g.popperStyle,placement:g.placement,"popper-options":g.popperOptions,pure:g.pure,"raw-content":g.rawContent,"reference-el":g.referenceEl,"trigger-target-el":g.triggerTargetEl,"show-after":g.showAfter,strategy:g.strategy,teleported:g.teleported,transition:g.transition,"virtual-triggering":g.virtualTriggering,"z-index":g.zIndex,"append-to":g.appendTo},{default:ye(()=>[de(g.$slots,"content",{},()=>[g.rawContent?(P(),Q("span",{key:0,innerHTML:g.content},null,8,zx)):(P(),Q("span",Hx,We(g.content),1))]),g.showArrow?(P(),he(m(Z4),{key:0,"arrow-offset":g.arrowOffset},null,8,["arrow-offset"])):ue("v-if",!0)]),_:3},8,["aria-label","boundaries-padding","content","disabled","effect","enterable","fallback-placements","hide-after","gpu-acceleration","offset","persistent","popper-class","popper-style","placement","popper-options","pure","raw-content","reference-el","trigger-target-el","show-after","strategy","teleported","transition","virtual-triggering","z-index","append-to"])]),_:3},8,["role"]))}});var qx=Ne(Ux,[["__file","tooltip.vue"]]);const Pm=yt(qx),Wx=Ie({value:{type:[String,Number],default:""},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:["primary","success","warning","info","danger"],default:"danger"},showZero:{type:Boolean,default:!0},color:String,dotStyle:{type:we([String,Object,Array])},badgeStyle:{type:we([String,Object,Array])},offset:{type:we(Array),default:[0,0]},dotClass:{type:String},badgeClass:{type:String}}),Gx=["textContent"],Yx=J({name:"ElBadge"}),Jx=J({...Yx,props:Wx,setup(e,{expose:t}){const n=e,r=ke("badge"),o=E(()=>n.isDot?"":ze(n.value)&&ze(n.max)?n.max{var i,a,l,u,c,f;return[{backgroundColor:n.color,marginRight:Xt(-((a=(i=n.offset)==null?void 0:i[0])!=null?a:0)),marginTop:Xt((u=(l=n.offset)==null?void 0:l[1])!=null?u:0)},(c=n.dotStyle)!=null?c:{},(f=n.badgeStyle)!=null?f:{}]});return Ut({from:"dot-style",replacement:"badge-style",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},E(()=>!!n.dotStyle)),Ut({from:"dot-class",replacement:"badge-class",version:"2.8.0",scope:"el-badge",ref:"https://element-plus.org/en-US/component/badge.html"},E(()=>!!n.dotClass)),t({content:o}),(i,a)=>(P(),Q("div",{class:W(m(r).b())},[de(i.$slots,"default"),ae(Un,{name:`${m(r).namespace.value}-zoom-in-center`,persisted:""},{default:ye(()=>[ht(fe("sup",{class:W([m(r).e("content"),m(r).em("content",i.type),m(r).is("fixed",!!i.$slots.default),m(r).is("dot",i.isDot),i.dotClass,i.badgeClass]),style:ot(m(s)),textContent:We(m(o))},null,14,Gx),[[Pn,!i.hidden&&(m(o)||i.isDot)]])]),_:1},8,["name"])],2))}});var Xx=Ne(Jx,[["__file","badge.vue"]]);const Zx=yt(Xx),Im=Symbol("buttonGroupContextKey"),Qx=(e,t)=>{Ut({from:"type.text",replacement:"link",version:"3.0.0",scope:"props",ref:"https://element-plus.org/en-US/component/button.html#button-attributes"},E(()=>e.type==="text"));const n=Se(Im,void 0),r=js("button"),{form:o}=Cr(),s=dn(E(()=>n==null?void 0:n.size)),i=ko(),a=j(),l=Xr(),u=E(()=>e.type||(n==null?void 0:n.type)||""),c=E(()=>{var h,d,y;return(y=(d=e.autoInsertSpace)!=null?d:(h=r.value)==null?void 0:h.autoInsertSpace)!=null?y:!1}),f=E(()=>e.tag==="button"?{ariaDisabled:i.value||e.loading,disabled:i.value||e.loading,autofocus:e.autofocus,type:e.nativeType}:{}),p=E(()=>{var h;const d=(h=l.default)==null?void 0:h.call(l);if(c.value&&(d==null?void 0:d.length)===1){const y=d[0];if((y==null?void 0:y.type)===Ro){const g=y.children;return new RegExp("^\\p{Unified_Ideograph}{2}$","u").test(g.trim())}}return!1});return{_disabled:i,_size:s,_type:u,_ref:a,_props:f,shouldAddSpace:p,handleClick:h=>{e.nativeType==="reset"&&(o==null||o.resetFields()),t("click",h)}}},eA=["default","primary","success","warning","info","danger","text",""],tA=["button","submit","reset"],Kl=Ie({size:$o,disabled:Boolean,type:{type:String,values:eA,default:""},icon:{type:Pt},nativeType:{type:String,values:tA,default:"button"},loading:Boolean,loadingIcon:{type:Pt,default:()=>qu},plain:Boolean,text:Boolean,link:Boolean,bg:Boolean,autofocus:Boolean,round:Boolean,circle:Boolean,color:String,dark:Boolean,autoInsertSpace:{type:Boolean,default:void 0},tag:{type:we([String,Object]),default:"button"}}),nA={click:e=>e instanceof MouseEvent};function wt(e,t){rA(e)&&(e="100%");var n=oA(e);return e=t===360?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:(t===360?e=(e<0?e%t+t:e%t)/parseFloat(String(t)):e=e%t/parseFloat(String(t)),e)}function di(e){return Math.min(1,Math.max(0,e))}function rA(e){return typeof e=="string"&&e.indexOf(".")!==-1&&parseFloat(e)===1}function oA(e){return typeof e=="string"&&e.indexOf("%")!==-1}function $m(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function pi(e){return e<=1?"".concat(Number(e)*100,"%"):e}function Mr(e){return e.length===1?"0"+e:String(e)}function sA(e,t,n){return{r:wt(e,255)*255,g:wt(t,255)*255,b:wt(n,255)*255}}function ep(e,t,n){e=wt(e,255),t=wt(t,255),n=wt(n,255);var r=Math.max(e,t,n),o=Math.min(e,t,n),s=0,i=0,a=(r+o)/2;if(r===o)i=0,s=0;else{var l=r-o;switch(i=a>.5?l/(2-r-o):l/(r+o),r){case e:s=(t-n)/l+(t1&&(n-=1),n<1/6?e+(t-e)*(6*n):n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function iA(e,t,n){var r,o,s;if(e=wt(e,360),t=wt(t,100),n=wt(n,100),t===0)o=n,s=n,r=n;else{var i=n<.5?n*(1+t):n+t-n*t,a=2*n-i;r=el(a,i,e+1/3),o=el(a,i,e),s=el(a,i,e-1/3)}return{r:r*255,g:o*255,b:s*255}}function tp(e,t,n){e=wt(e,255),t=wt(t,255),n=wt(n,255);var r=Math.max(e,t,n),o=Math.min(e,t,n),s=0,i=r,a=r-o,l=r===0?0:a/r;if(r===o)s=0;else{switch(r){case e:s=(t-n)/a+(t>16,g:(e&65280)>>8,b:e&255}}var Ul={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};function fA(e){var t={r:0,g:0,b:0},n=1,r=null,o=null,s=null,i=!1,a=!1;return typeof e=="string"&&(e=hA(e)),typeof e=="object"&&(Ln(e.r)&&Ln(e.g)&&Ln(e.b)?(t=sA(e.r,e.g,e.b),i=!0,a=String(e.r).substr(-1)==="%"?"prgb":"rgb"):Ln(e.h)&&Ln(e.s)&&Ln(e.v)?(r=pi(e.s),o=pi(e.v),t=aA(e.h,r,o),i=!0,a="hsv"):Ln(e.h)&&Ln(e.s)&&Ln(e.l)&&(r=pi(e.s),s=pi(e.l),t=iA(e.h,r,s),i=!0,a="hsl"),Object.prototype.hasOwnProperty.call(e,"a")&&(n=e.a)),n=$m(n),{ok:i,format:e.format||a,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var dA="[-\\+]?\\d+%?",pA="[-\\+]?\\d*\\.\\d+%?",fr="(?:".concat(pA,")|(?:").concat(dA,")"),tl="[\\s|\\(]+(".concat(fr,")[,|\\s]+(").concat(fr,")[,|\\s]+(").concat(fr,")\\s*\\)?"),nl="[\\s|\\(]+(".concat(fr,")[,|\\s]+(").concat(fr,")[,|\\s]+(").concat(fr,")[,|\\s]+(").concat(fr,")\\s*\\)?"),tn={CSS_UNIT:new RegExp(fr),rgb:new RegExp("rgb"+tl),rgba:new RegExp("rgba"+nl),hsl:new RegExp("hsl"+tl),hsla:new RegExp("hsla"+nl),hsv:new RegExp("hsv"+tl),hsva:new RegExp("hsva"+nl),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function hA(e){if(e=e.trim().toLowerCase(),e.length===0)return!1;var t=!1;if(Ul[e])e=Ul[e],t=!0;else if(e==="transparent")return{r:0,g:0,b:0,a:0,format:"name"};var n=tn.rgb.exec(e);return n?{r:n[1],g:n[2],b:n[3]}:(n=tn.rgba.exec(e),n?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=tn.hsl.exec(e),n?{h:n[1],s:n[2],l:n[3]}:(n=tn.hsla.exec(e),n?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=tn.hsv.exec(e),n?{h:n[1],s:n[2],v:n[3]}:(n=tn.hsva.exec(e),n?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=tn.hex8.exec(e),n?{r:Nt(n[1]),g:Nt(n[2]),b:Nt(n[3]),a:rp(n[4]),format:t?"name":"hex8"}:(n=tn.hex6.exec(e),n?{r:Nt(n[1]),g:Nt(n[2]),b:Nt(n[3]),format:t?"name":"hex"}:(n=tn.hex4.exec(e),n?{r:Nt(n[1]+n[1]),g:Nt(n[2]+n[2]),b:Nt(n[3]+n[3]),a:rp(n[4]+n[4]),format:t?"name":"hex8"}:(n=tn.hex3.exec(e),n?{r:Nt(n[1]+n[1]),g:Nt(n[2]+n[2]),b:Nt(n[3]+n[3]),format:t?"name":"hex"}:!1)))))))))}function Ln(e){return!!tn.CSS_UNIT.exec(String(e))}var vA=function(){function e(t,n){t===void 0&&(t=""),n===void 0&&(n={});var r;if(t instanceof e)return t;typeof t=="number"&&(t=cA(t)),this.originalInput=t;var o=fA(t);this.originalInput=t,this.r=o.r,this.g=o.g,this.b=o.b,this.a=o.a,this.roundA=Math.round(100*this.a)/100,this.format=(r=n.format)!==null&&r!==void 0?r:o.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=o.ok}return e.prototype.isDark=function(){return this.getBrightness()<128},e.prototype.isLight=function(){return!this.isDark()},e.prototype.getBrightness=function(){var t=this.toRgb();return(t.r*299+t.g*587+t.b*114)/1e3},e.prototype.getLuminance=function(){var t=this.toRgb(),n,r,o,s=t.r/255,i=t.g/255,a=t.b/255;return s<=.03928?n=s/12.92:n=Math.pow((s+.055)/1.055,2.4),i<=.03928?r=i/12.92:r=Math.pow((i+.055)/1.055,2.4),a<=.03928?o=a/12.92:o=Math.pow((a+.055)/1.055,2.4),.2126*n+.7152*r+.0722*o},e.prototype.getAlpha=function(){return this.a},e.prototype.setAlpha=function(t){return this.a=$m(t),this.roundA=Math.round(100*this.a)/100,this},e.prototype.isMonochrome=function(){var t=this.toHsl().s;return t===0},e.prototype.toHsv=function(){var t=tp(this.r,this.g,this.b);return{h:t.h*360,s:t.s,v:t.v,a:this.a}},e.prototype.toHsvString=function(){var t=tp(this.r,this.g,this.b),n=Math.round(t.h*360),r=Math.round(t.s*100),o=Math.round(t.v*100);return this.a===1?"hsv(".concat(n,", ").concat(r,"%, ").concat(o,"%)"):"hsva(".concat(n,", ").concat(r,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHsl=function(){var t=ep(this.r,this.g,this.b);return{h:t.h*360,s:t.s,l:t.l,a:this.a}},e.prototype.toHslString=function(){var t=ep(this.r,this.g,this.b),n=Math.round(t.h*360),r=Math.round(t.s*100),o=Math.round(t.l*100);return this.a===1?"hsl(".concat(n,", ").concat(r,"%, ").concat(o,"%)"):"hsla(".concat(n,", ").concat(r,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHex=function(t){return t===void 0&&(t=!1),np(this.r,this.g,this.b,t)},e.prototype.toHexString=function(t){return t===void 0&&(t=!1),"#"+this.toHex(t)},e.prototype.toHex8=function(t){return t===void 0&&(t=!1),lA(this.r,this.g,this.b,this.a,t)},e.prototype.toHex8String=function(t){return t===void 0&&(t=!1),"#"+this.toHex8(t)},e.prototype.toHexShortString=function(t){return t===void 0&&(t=!1),this.a===1?this.toHexString(t):this.toHex8String(t)},e.prototype.toRgb=function(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}},e.prototype.toRgbString=function(){var t=Math.round(this.r),n=Math.round(this.g),r=Math.round(this.b);return this.a===1?"rgb(".concat(t,", ").concat(n,", ").concat(r,")"):"rgba(".concat(t,", ").concat(n,", ").concat(r,", ").concat(this.roundA,")")},e.prototype.toPercentageRgb=function(){var t=function(n){return"".concat(Math.round(wt(n,255)*100),"%")};return{r:t(this.r),g:t(this.g),b:t(this.b),a:this.a}},e.prototype.toPercentageRgbString=function(){var t=function(n){return Math.round(wt(n,255)*100)};return this.a===1?"rgb(".concat(t(this.r),"%, ").concat(t(this.g),"%, ").concat(t(this.b),"%)"):"rgba(".concat(t(this.r),"%, ").concat(t(this.g),"%, ").concat(t(this.b),"%, ").concat(this.roundA,")")},e.prototype.toName=function(){if(this.a===0)return"transparent";if(this.a<1)return!1;for(var t="#"+np(this.r,this.g,this.b,!1),n=0,r=Object.entries(Ul);n=0,s=!n&&o&&(t.startsWith("hex")||t==="name");return s?t==="name"&&this.a===0?this.toName():this.toRgbString():(t==="rgb"&&(r=this.toRgbString()),t==="prgb"&&(r=this.toPercentageRgbString()),(t==="hex"||t==="hex6")&&(r=this.toHexString()),t==="hex3"&&(r=this.toHexString(!0)),t==="hex4"&&(r=this.toHex8String(!0)),t==="hex8"&&(r=this.toHex8String()),t==="name"&&(r=this.toName()),t==="hsl"&&(r=this.toHslString()),t==="hsv"&&(r=this.toHsvString()),r||this.toHexString())},e.prototype.toNumber=function(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)},e.prototype.clone=function(){return new e(this.toString())},e.prototype.lighten=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.l+=t/100,n.l=di(n.l),new e(n)},e.prototype.brighten=function(t){t===void 0&&(t=10);var n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(255*-(t/100)))),n.g=Math.max(0,Math.min(255,n.g-Math.round(255*-(t/100)))),n.b=Math.max(0,Math.min(255,n.b-Math.round(255*-(t/100)))),new e(n)},e.prototype.darken=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.l-=t/100,n.l=di(n.l),new e(n)},e.prototype.tint=function(t){return t===void 0&&(t=10),this.mix("white",t)},e.prototype.shade=function(t){return t===void 0&&(t=10),this.mix("black",t)},e.prototype.desaturate=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.s-=t/100,n.s=di(n.s),new e(n)},e.prototype.saturate=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.s+=t/100,n.s=di(n.s),new e(n)},e.prototype.greyscale=function(){return this.desaturate(100)},e.prototype.spin=function(t){var n=this.toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,new e(n)},e.prototype.mix=function(t,n){n===void 0&&(n=50);var r=this.toRgb(),o=new e(t).toRgb(),s=n/100,i={r:(o.r-r.r)*s+r.r,g:(o.g-r.g)*s+r.g,b:(o.b-r.b)*s+r.b,a:(o.a-r.a)*s+r.a};return new e(i)},e.prototype.analogous=function(t,n){t===void 0&&(t=6),n===void 0&&(n=30);var r=this.toHsl(),o=360/n,s=[this];for(r.h=(r.h-(o*t>>1)+720)%360;--t;)r.h=(r.h+o)%360,s.push(new e(r));return s},e.prototype.complement=function(){var t=this.toHsl();return t.h=(t.h+180)%360,new e(t)},e.prototype.monochromatic=function(t){t===void 0&&(t=6);for(var n=this.toHsv(),r=n.h,o=n.s,s=n.v,i=[],a=1/t;t--;)i.push(new e({h:r,s:o,v:s})),s=(s+a)%1;return i},e.prototype.splitcomplement=function(){var t=this.toHsl(),n=t.h;return[this,new e({h:(n+72)%360,s:t.s,l:t.l}),new e({h:(n+216)%360,s:t.s,l:t.l})]},e.prototype.onBackground=function(t){var n=this.toRgb(),r=new e(t).toRgb(),o=n.a+r.a*(1-n.a);return new e({r:(n.r*n.a+r.r*r.a*(1-n.a))/o,g:(n.g*n.a+r.g*r.a*(1-n.a))/o,b:(n.b*n.a+r.b*r.a*(1-n.a))/o,a:o})},e.prototype.triad=function(){return this.polyad(3)},e.prototype.tetrad=function(){return this.polyad(4)},e.prototype.polyad=function(t){for(var n=this.toHsl(),r=n.h,o=[this],s=360/t,i=1;i{let r={};const o=e.color;if(o){const s=new vA(o),i=e.dark?s.tint(20).toString():Qn(s,20);if(e.plain)r=n.cssVarBlock({"bg-color":e.dark?Qn(s,90):s.tint(90).toString(),"text-color":o,"border-color":e.dark?Qn(s,50):s.tint(50).toString(),"hover-text-color":`var(${n.cssVarName("color-white")})`,"hover-bg-color":o,"hover-border-color":o,"active-bg-color":i,"active-text-color":`var(${n.cssVarName("color-white")})`,"active-border-color":i}),t.value&&(r[n.cssVarBlockName("disabled-bg-color")]=e.dark?Qn(s,90):s.tint(90).toString(),r[n.cssVarBlockName("disabled-text-color")]=e.dark?Qn(s,50):s.tint(50).toString(),r[n.cssVarBlockName("disabled-border-color")]=e.dark?Qn(s,80):s.tint(80).toString());else{const a=e.dark?Qn(s,30):s.tint(30).toString(),l=s.isDark()?`var(${n.cssVarName("color-white")})`:`var(${n.cssVarName("color-black")})`;if(r=n.cssVarBlock({"bg-color":o,"text-color":l,"border-color":o,"hover-bg-color":a,"hover-text-color":l,"hover-border-color":a,"active-bg-color":i,"active-border-color":i}),t.value){const u=e.dark?Qn(s,50):s.tint(50).toString();r[n.cssVarBlockName("disabled-bg-color")]=u,r[n.cssVarBlockName("disabled-text-color")]=e.dark?"rgba(255, 255, 255, 0.5)":`var(${n.cssVarName("color-white")})`,r[n.cssVarBlockName("disabled-border-color")]=u}}}return r})}const gA=J({name:"ElButton"}),yA=J({...gA,props:Kl,emits:nA,setup(e,{expose:t,emit:n}){const r=e,o=mA(r),s=ke("button"),{_ref:i,_size:a,_type:l,_disabled:u,_props:c,shouldAddSpace:f,handleClick:p}=Qx(r,n),v=E(()=>[s.b(),s.m(l.value),s.m(a.value),s.is("disabled",u.value),s.is("loading",r.loading),s.is("plain",r.plain),s.is("round",r.round),s.is("circle",r.circle),s.is("text",r.text),s.is("link",r.link),s.is("has-bg",r.bg)]);return t({ref:i,size:a,type:l,disabled:u,shouldAddSpace:f}),(h,d)=>(P(),he(it(h.tag),sn({ref_key:"_ref",ref:i},m(c),{class:m(v),style:m(o),onClick:m(p)}),{default:ye(()=>[h.loading?(P(),Q(tt,{key:0},[h.$slots.loading?de(h.$slots,"loading",{key:0}):(P(),he(m(Xe),{key:1,class:W(m(s).is("loading"))},{default:ye(()=>[(P(),he(it(h.loadingIcon)))]),_:1},8,["class"]))],64)):h.icon||h.$slots.icon?(P(),he(m(Xe),{key:1},{default:ye(()=>[h.icon?(P(),he(it(h.icon),{key:0})):de(h.$slots,"icon",{key:1})]),_:3})):ue("v-if",!0),h.$slots.default?(P(),Q("span",{key:2,class:W({[m(s).em("text","expand")]:m(f)})},[de(h.$slots,"default")],2)):ue("v-if",!0)]),_:3},16,["class","style","onClick"]))}});var bA=Ne(yA,[["__file","button.vue"]]);const wA={size:Kl.size,type:Kl.type},_A=J({name:"ElButtonGroup"}),SA=J({..._A,props:wA,setup(e){const t=e;ut(Im,Et({size:Ht(t,"size"),type:Ht(t,"type")}));const n=ke("button");return(r,o)=>(P(),Q("div",{class:W(`${m(n).b("group")}`)},[de(r.$slots,"default")],2))}});var Lm=Ne(SA,[["__file","button-group.vue"]]);const y8=yt(bA,{ButtonGroup:Lm});eo(Lm);const rr=new Map;let op;nt&&(document.addEventListener("mousedown",e=>op=e),document.addEventListener("mouseup",e=>{for(const t of rr.values())for(const{documentHandler:n}of t)n(e,op)}));function sp(e,t){let n=[];return Array.isArray(t.arg)?n=t.arg:So(t.arg)&&n.push(t.arg),function(r,o){const s=t.instance.popperRef,i=r.target,a=o==null?void 0:o.target,l=!t||!t.instance,u=!i||!a,c=e.contains(i)||e.contains(a),f=e===i,p=n.length&&n.some(h=>h==null?void 0:h.contains(i))||n.length&&n.includes(a),v=s&&(s.contains(i)||s.contains(a));l||u||c||f||p||v||t.value(r,o)}}const EA={beforeMount(e,t){rr.has(e)||rr.set(e,[]),rr.get(e).push({documentHandler:sp(e,t),bindingFn:t.value})},updated(e,t){rr.has(e)||rr.set(e,[]);const n=rr.get(e),r=n.findIndex(s=>s.bindingFn===t.oldValue),o={documentHandler:sp(e,t),bindingFn:t.value};r>=0?n.splice(r,1,o):n.push(o)},unmounted(e){rr.delete(e)}},CA=100,OA=600,ip={beforeMount(e,t){const n=t.value,{interval:r=CA,delay:o=OA}=ve(n)?{}:n;let s,i;const a=()=>ve(n)?n():n.handler(),l=()=>{i&&(clearTimeout(i),i=void 0),s&&(clearInterval(s),s=void 0)};e.addEventListener("mousedown",u=>{u.button===0&&(l(),a(),document.addEventListener("mouseup",()=>l(),{once:!0}),i=setTimeout(()=>{s=setInterval(()=>{a()},r)},o))})}},km={modelValue:{type:[Number,String,Boolean],default:void 0},label:{type:[String,Boolean,Number,Object],default:void 0},value:{type:[String,Boolean,Number,Object],default:void 0},indeterminate:Boolean,disabled:Boolean,checked:Boolean,name:{type:String,default:void 0},trueValue:{type:[String,Number],default:void 0},falseValue:{type:[String,Number],default:void 0},trueLabel:{type:[String,Number],default:void 0},falseLabel:{type:[String,Number],default:void 0},id:{type:String,default:void 0},controls:{type:String,default:void 0},border:Boolean,size:$o,tabindex:[String,Number],validateEvent:{type:Boolean,default:!0},...Gn(["ariaControls"])},Nm={[Ge]:e=>xe(e)||ze(e)||jt(e),change:e=>xe(e)||ze(e)||jt(e)},No=Symbol("checkboxGroupContextKey"),TA=({model:e,isChecked:t})=>{const n=Se(No,void 0),r=E(()=>{var s,i;const a=(s=n==null?void 0:n.max)==null?void 0:s.value,l=(i=n==null?void 0:n.min)==null?void 0:i.value;return!Kt(a)&&e.value.length>=a&&!t.value||!Kt(l)&&e.value.length<=l&&t.value});return{isDisabled:ko(E(()=>(n==null?void 0:n.disabled.value)||r.value)),isLimitDisabled:r}},xA=(e,{model:t,isLimitExceeded:n,hasOwnLabel:r,isDisabled:o,isLabeledByFormItem:s})=>{const i=Se(No,void 0),{formItem:a}=Cr(),{emit:l}=rt();function u(h){var d,y,g,_;return[!0,e.trueValue,e.trueLabel].includes(h)?(y=(d=e.trueValue)!=null?d:e.trueLabel)!=null?y:!0:(_=(g=e.falseValue)!=null?g:e.falseLabel)!=null?_:!1}function c(h,d){l("change",u(h),d)}function f(h){if(n.value)return;const d=h.target;l("change",u(d.checked),h)}async function p(h){n.value||!r.value&&!o.value&&s.value&&(h.composedPath().some(g=>g.tagName==="LABEL")||(t.value=u([!1,e.falseValue,e.falseLabel].includes(t.value)),await Ve(),c(t.value,h)))}const v=E(()=>(i==null?void 0:i.validateEvent)||e.validateEvent);return pe(()=>e.modelValue,()=>{v.value&&(a==null||a.validate("change").catch(h=>void 0))}),{handleChange:f,onClickRoot:p}},AA=e=>{const t=j(!1),{emit:n}=rt(),r=Se(No,void 0),o=E(()=>Kt(r)===!1),s=j(!1),i=E({get(){var a,l;return o.value?(a=r==null?void 0:r.modelValue)==null?void 0:a.value:(l=e.modelValue)!=null?l:t.value},set(a){var l,u;o.value&&ce(a)?(s.value=((l=r==null?void 0:r.max)==null?void 0:l.value)!==void 0&&a.length>(r==null?void 0:r.max.value)&&a.length>i.value.length,s.value===!1&&((u=r==null?void 0:r.changeEvent)==null||u.call(r,a))):(n(Ge,a),t.value=a)}});return{model:i,isGroup:o,isLimitExceeded:s}},RA=(e,t,{model:n})=>{const r=Se(No,void 0),o=j(!1),s=E(()=>Ml(e.value)?e.label:e.value),i=E(()=>{const c=n.value;return jt(c)?c:ce(c)?Te(s.value)?c.map(Le).some(f=>_s(f,s.value)):c.map(Le).includes(s.value):c!=null?c===e.trueValue||c===e.trueLabel:!!c}),a=dn(E(()=>{var c;return(c=r==null?void 0:r.size)==null?void 0:c.value}),{prop:!0}),l=dn(E(()=>{var c;return(c=r==null?void 0:r.size)==null?void 0:c.value})),u=E(()=>!!t.default||!Ml(s.value));return{checkboxButtonSize:a,isChecked:i,isFocused:o,checkboxSize:l,hasOwnLabel:u,actualValue:s}},Mm=(e,t)=>{const{formItem:n}=Cr(),{model:r,isGroup:o,isLimitExceeded:s}=AA(e),{isFocused:i,isChecked:a,checkboxButtonSize:l,checkboxSize:u,hasOwnLabel:c,actualValue:f}=RA(e,t,{model:r}),{isDisabled:p}=TA({model:r,isChecked:a}),{inputId:v,isLabeledByFormItem:h}=Vs(e,{formItemContext:n,disableIdGeneration:c,disableIdManagement:o}),{handleChange:d,onClickRoot:y}=xA(e,{model:r,isLimitExceeded:s,hasOwnLabel:c,isDisabled:p,isLabeledByFormItem:h});return(()=>{function _(){var b,T;ce(r.value)&&!r.value.includes(f.value)?r.value.push(f.value):r.value=(T=(b=e.trueValue)!=null?b:e.trueLabel)!=null?T:!0}e.checked&&_()})(),Ut({from:"controls",replacement:"aria-controls",version:"2.8.0",scope:"el-checkbox",ref:"https://element-plus.org/en-US/component/checkbox.html"},E(()=>!!e.controls)),Ut({from:"label act as value",replacement:"value",version:"3.0.0",scope:"el-checkbox",ref:"https://element-plus.org/en-US/component/checkbox.html"},E(()=>o.value&&Ml(e.value))),Ut({from:"true-label",replacement:"true-value",version:"3.0.0",scope:"el-checkbox",ref:"https://element-plus.org/en-US/component/checkbox.html"},E(()=>!!e.trueLabel)),Ut({from:"false-label",replacement:"false-value",version:"3.0.0",scope:"el-checkbox",ref:"https://element-plus.org/en-US/component/checkbox.html"},E(()=>!!e.falseLabel)),{inputId:v,isLabeledByFormItem:h,isChecked:a,isDisabled:p,isFocused:i,checkboxButtonSize:l,checkboxSize:u,hasOwnLabel:c,model:r,actualValue:f,handleChange:d,onClickRoot:y}},PA=["id","indeterminate","name","tabindex","disabled","true-value","false-value"],IA=["id","indeterminate","disabled","value","name","tabindex"],$A=J({name:"ElCheckbox"}),LA=J({...$A,props:km,emits:Nm,setup(e){const t=e,n=Xr(),{inputId:r,isLabeledByFormItem:o,isChecked:s,isDisabled:i,isFocused:a,checkboxSize:l,hasOwnLabel:u,model:c,actualValue:f,handleChange:p,onClickRoot:v}=Mm(t,n),h=ke("checkbox"),d=E(()=>[h.b(),h.m(l.value),h.is("disabled",i.value),h.is("bordered",t.border),h.is("checked",s.value)]),y=E(()=>[h.e("input"),h.is("disabled",i.value),h.is("checked",s.value),h.is("indeterminate",t.indeterminate),h.is("focus",a.value)]);return(g,_)=>(P(),he(it(!m(u)&&m(o)?"span":"label"),{class:W(m(d)),"aria-controls":g.indeterminate?g.controls||g.ariaControls:null,onClick:m(v)},{default:ye(()=>{var b,T;return[fe("span",{class:W(m(y))},[g.trueValue||g.falseValue||g.trueLabel||g.falseLabel?ht((P(),Q("input",{key:0,id:m(r),"onUpdate:modelValue":_[0]||(_[0]=C=>qe(c)?c.value=C:null),class:W(m(h).e("original")),type:"checkbox",indeterminate:g.indeterminate,name:g.name,tabindex:g.tabindex,disabled:m(i),"true-value":(b=g.trueValue)!=null?b:g.trueLabel,"false-value":(T=g.falseValue)!=null?T:g.falseLabel,onChange:_[1]||(_[1]=(...C)=>m(p)&&m(p)(...C)),onFocus:_[2]||(_[2]=C=>a.value=!0),onBlur:_[3]||(_[3]=C=>a.value=!1),onClick:_[4]||(_[4]=lt(()=>{},["stop"]))},null,42,PA)),[[Vi,m(c)]]):ht((P(),Q("input",{key:1,id:m(r),"onUpdate:modelValue":_[5]||(_[5]=C=>qe(c)?c.value=C:null),class:W(m(h).e("original")),type:"checkbox",indeterminate:g.indeterminate,disabled:m(i),value:m(f),name:g.name,tabindex:g.tabindex,onChange:_[6]||(_[6]=(...C)=>m(p)&&m(p)(...C)),onFocus:_[7]||(_[7]=C=>a.value=!0),onBlur:_[8]||(_[8]=C=>a.value=!1),onClick:_[9]||(_[9]=lt(()=>{},["stop"]))},null,42,IA)),[[Vi,m(c)]]),fe("span",{class:W(m(h).e("inner"))},null,2)],2),m(u)?(P(),Q("span",{key:0,class:W(m(h).e("label"))},[de(g.$slots,"default"),g.$slots.default?ue("v-if",!0):(P(),Q(tt,{key:0},[zr(We(g.label),1)],64))],2)):ue("v-if",!0)]}),_:3},8,["class","aria-controls","onClick"]))}});var kA=Ne(LA,[["__file","checkbox.vue"]]);const NA=["name","tabindex","disabled","true-value","false-value"],MA=["name","tabindex","disabled","value"],FA=J({name:"ElCheckboxButton"}),BA=J({...FA,props:km,emits:Nm,setup(e){const t=e,n=Xr(),{isFocused:r,isChecked:o,isDisabled:s,checkboxButtonSize:i,model:a,actualValue:l,handleChange:u}=Mm(t,n),c=Se(No,void 0),f=ke("checkbox"),p=E(()=>{var h,d,y,g;const _=(d=(h=c==null?void 0:c.fill)==null?void 0:h.value)!=null?d:"";return{backgroundColor:_,borderColor:_,color:(g=(y=c==null?void 0:c.textColor)==null?void 0:y.value)!=null?g:"",boxShadow:_?`-1px 0 0 0 ${_}`:void 0}}),v=E(()=>[f.b("button"),f.bm("button",i.value),f.is("disabled",s.value),f.is("checked",o.value),f.is("focus",r.value)]);return(h,d)=>{var y,g;return P(),Q("label",{class:W(m(v))},[h.trueValue||h.falseValue||h.trueLabel||h.falseLabel?ht((P(),Q("input",{key:0,"onUpdate:modelValue":d[0]||(d[0]=_=>qe(a)?a.value=_:null),class:W(m(f).be("button","original")),type:"checkbox",name:h.name,tabindex:h.tabindex,disabled:m(s),"true-value":(y=h.trueValue)!=null?y:h.trueLabel,"false-value":(g=h.falseValue)!=null?g:h.falseLabel,onChange:d[1]||(d[1]=(..._)=>m(u)&&m(u)(..._)),onFocus:d[2]||(d[2]=_=>r.value=!0),onBlur:d[3]||(d[3]=_=>r.value=!1),onClick:d[4]||(d[4]=lt(()=>{},["stop"]))},null,42,NA)),[[Vi,m(a)]]):ht((P(),Q("input",{key:1,"onUpdate:modelValue":d[5]||(d[5]=_=>qe(a)?a.value=_:null),class:W(m(f).be("button","original")),type:"checkbox",name:h.name,tabindex:h.tabindex,disabled:m(s),value:m(l),onChange:d[6]||(d[6]=(..._)=>m(u)&&m(u)(..._)),onFocus:d[7]||(d[7]=_=>r.value=!0),onBlur:d[8]||(d[8]=_=>r.value=!1),onClick:d[9]||(d[9]=lt(()=>{},["stop"]))},null,42,MA)),[[Vi,m(a)]]),h.$slots.default||h.label?(P(),Q("span",{key:2,class:W(m(f).be("button","inner")),style:ot(m(o)?m(p):void 0)},[de(h.$slots,"default",{},()=>[zr(We(h.label),1)])],6)):ue("v-if",!0)],2)}}});var Fm=Ne(BA,[["__file","checkbox-button.vue"]]);const DA=Ie({modelValue:{type:we(Array),default:()=>[]},disabled:Boolean,min:Number,max:Number,size:$o,label:String,fill:String,textColor:String,tag:{type:String,default:"div"},validateEvent:{type:Boolean,default:!0},...Gn(["ariaLabel"])}),jA={[Ge]:e=>ce(e),change:e=>ce(e)},VA=J({name:"ElCheckboxGroup"}),zA=J({...VA,props:DA,emits:jA,setup(e,{emit:t}){const n=e,r=ke("checkbox"),{formItem:o}=Cr(),{inputId:s,isLabeledByFormItem:i}=Vs(n,{formItemContext:o}),a=async u=>{t(Ge,u),await Ve(),t("change",u)},l=E({get(){return n.modelValue},set(u){a(u)}});return ut(No,{...Mv(Gr(n),["size","min","max","disabled","validateEvent","fill","textColor"]),modelValue:l,changeEvent:a}),Ut({from:"label",replacement:"aria-label",version:"2.8.0",scope:"el-checkbox-group",ref:"https://element-plus.org/en-US/component/checkbox.html"},E(()=>!!n.label)),pe(()=>n.modelValue,()=>{n.validateEvent&&(o==null||o.validate("change").catch(u=>void 0))}),(u,c)=>{var f;return P(),he(it(u.tag),{id:m(s),class:W(m(r).b("group")),role:"group","aria-label":m(i)?void 0:u.label||u.ariaLabel||"checkbox-group","aria-labelledby":m(i)?(f=m(o))==null?void 0:f.labelId:void 0},{default:ye(()=>[de(u.$slots,"default")]),_:3},8,["id","class","aria-label","aria-labelledby"])}}});var Bm=Ne(zA,[["__file","checkbox-group.vue"]]);const b8=yt(kA,{CheckboxButton:Fm,CheckboxGroup:Bm});eo(Fm);const w8=eo(Bm),Dm=Ie({type:{type:String,values:["primary","success","info","warning","danger"],default:"primary"},closable:Boolean,disableTransitions:Boolean,hit:Boolean,color:String,size:{type:String,values:Io},effect:{type:String,values:["dark","light","plain"],default:"light"},round:Boolean}),HA={close:e=>e instanceof MouseEvent,click:e=>e instanceof MouseEvent},KA=J({name:"ElTag"}),UA=J({...KA,props:Dm,emits:HA,setup(e,{emit:t}){const n=e,r=dn(),o=ke("tag"),s=E(()=>{const{type:l,hit:u,effect:c,closable:f,round:p}=n;return[o.b(),o.is("closable",f),o.m(l||"primary"),o.m(r.value),o.m(c),o.is("hit",u),o.is("round",p)]}),i=l=>{t("close",l)},a=l=>{t("click",l)};return(l,u)=>l.disableTransitions?(P(),Q("span",{key:0,class:W(m(s)),style:ot({backgroundColor:l.color}),onClick:a},[fe("span",{class:W(m(o).e("content"))},[de(l.$slots,"default")],2),l.closable?(P(),he(m(Xe),{key:0,class:W(m(o).e("close")),onClick:lt(i,["stop"])},{default:ye(()=>[ae(m(Es))]),_:1},8,["class","onClick"])):ue("v-if",!0)],6)):(P(),he(Un,{key:1,name:`${m(o).namespace.value}-zoom-in-center`,appear:""},{default:ye(()=>[fe("span",{class:W(m(s)),style:ot({backgroundColor:l.color}),onClick:a},[fe("span",{class:W(m(o).e("content"))},[de(l.$slots,"default")],2),l.closable?(P(),he(m(Xe),{key:0,class:W(m(o).e("close")),onClick:lt(i,["stop"])},{default:ye(()=>[ae(m(Es))]),_:1},8,["class","onClick"])):ue("v-if",!0)],6)]),_:3},8,["name"]))}});var qA=Ne(UA,[["__file","tag.vue"]]);const WA=yt(qA),GA=Ie({mask:{type:Boolean,default:!0},customMaskEvent:{type:Boolean,default:!1},overlayClass:{type:we([String,Array,Object])},zIndex:{type:we([String,Number])}}),YA={click:e=>e instanceof MouseEvent},JA="overlay";var XA=J({name:"ElOverlay",props:GA,emits:YA,setup(e,{slots:t,emit:n}){const r=ke(JA),o=l=>{n("click",l)},{onClick:s,onMousedown:i,onMouseup:a}=lm(e.customMaskEvent?void 0:o);return()=>e.mask?ae("div",{class:[r.b(),e.overlayClass],style:{zIndex:e.zIndex},onClick:s,onMousedown:i,onMouseup:a},[de(t,"default")],Oi.STYLE|Oi.CLASS|Oi.PROPS,["onClick","onMouseup","onMousedown"]):Bn("div",{class:e.overlayClass,style:{zIndex:e.zIndex,position:"fixed",top:"0px",right:"0px",bottom:"0px",left:"0px"}},[de(t,"default")])}});const ZA=XA,jm=Symbol("dialogInjectionKey"),Vm=Ie({center:Boolean,alignCenter:Boolean,closeIcon:{type:Pt},draggable:Boolean,overflow:Boolean,fullscreen:Boolean,showClose:{type:Boolean,default:!0},title:{type:String,default:""},ariaLevel:{type:String,default:"2"}}),QA={close:()=>!0},e3=["aria-level"],t3=["aria-label"],n3=["id"],r3=J({name:"ElDialogContent"}),o3=J({...r3,props:Vm,emits:QA,setup(e){const t=e,{t:n}=Ea(),{Close:r}=FC,{dialogRef:o,headerRef:s,bodyId:i,ns:a,style:l}=Se(jm),{focusTrapRef:u}=Se(Tm),c=E(()=>[a.b(),a.is("fullscreen",t.fullscreen),a.is("draggable",t.draggable),a.is("align-center",t.alignCenter),{[a.m("center")]:t.center}]),f=VC(u,o),p=E(()=>t.draggable),v=E(()=>t.overflow);return qC(o,s,p,v),(h,d)=>(P(),Q("div",{ref:m(f),class:W(m(c)),style:ot(m(l)),tabindex:"-1"},[fe("header",{ref_key:"headerRef",ref:s,class:W([m(a).e("header"),{"show-close":h.showClose}])},[de(h.$slots,"header",{},()=>[fe("span",{role:"heading","aria-level":h.ariaLevel,class:W(m(a).e("title"))},We(h.title),11,e3)]),h.showClose?(P(),Q("button",{key:0,"aria-label":m(n)("el.dialog.close"),class:W(m(a).e("headerbtn")),type:"button",onClick:d[0]||(d[0]=y=>h.$emit("close"))},[ae(m(Xe),{class:W(m(a).e("close"))},{default:ye(()=>[(P(),he(it(h.closeIcon||m(r))))]),_:1},8,["class"])],10,t3)):ue("v-if",!0)],2),fe("div",{id:m(i),class:W(m(a).e("body"))},[de(h.$slots,"default")],10,n3),h.$slots.footer?(P(),Q("footer",{key:0,class:W(m(a).e("footer"))},[de(h.$slots,"footer")],2)):ue("v-if",!0)],6))}});var s3=Ne(o3,[["__file","dialog-content.vue"]]);const i3=Ie({...Vm,appendToBody:Boolean,appendTo:{type:we(String),default:"body"},beforeClose:{type:we(Function)},destroyOnClose:Boolean,closeOnClickModal:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!0},lockScroll:{type:Boolean,default:!0},modal:{type:Boolean,default:!0},openDelay:{type:Number,default:0},closeDelay:{type:Number,default:0},top:{type:String},modelValue:Boolean,modalClass:String,width:{type:[String,Number]},zIndex:{type:Number},trapFocus:{type:Boolean,default:!1},headerAriaLevel:{type:String,default:"2"}}),a3={open:()=>!0,opened:()=>!0,close:()=>!0,closed:()=>!0,[Ge]:e=>jt(e),openAutoFocus:()=>!0,closeAutoFocus:()=>!0},l3=(e,t)=>{var n;const o=rt().emit,{nextZIndex:s}=nc();let i="";const a=Ur(),l=Ur(),u=j(!1),c=j(!1),f=j(!1),p=j((n=e.zIndex)!=null?n:s());let v,h;const d=js("namespace",rs),y=E(()=>{const R={},F=`--${d.value}-dialog`;return e.fullscreen||(e.top&&(R[`${F}-margin-top`]=e.top),e.width&&(R[`${F}-width`]=Xt(e.width))),R}),g=E(()=>e.alignCenter?{display:"flex"}:{});function _(){o("opened")}function b(){o("closed"),o(Ge,!1),e.destroyOnClose&&(f.value=!1)}function T(){o("close")}function C(){h==null||h(),v==null||v(),e.openDelay&&e.openDelay>0?{stop:v}=Pl(()=>I(),e.openDelay):I()}function O(){v==null||v(),h==null||h(),e.closeDelay&&e.closeDelay>0?{stop:h}=Pl(()=>k(),e.closeDelay):k()}function x(){function R(F){F||(c.value=!0,u.value=!1)}e.beforeClose?e.beforeClose(R):O()}function L(){e.closeOnClickModal&&x()}function I(){nt&&(u.value=!0)}function k(){u.value=!1}function z(){o("openAutoFocus")}function B(){o("closeAutoFocus")}function K(R){var F;((F=R.detail)==null?void 0:F.focusReason)==="pointer"&&R.preventDefault()}e.lockScroll&&ZC(u);function G(){e.closeOnPressEscape&&x()}return pe(()=>e.modelValue,R=>{R?(c.value=!1,C(),f.value=!0,p.value=kv(e.zIndex)?s():p.value++,Ve(()=>{o("open"),t.value&&(t.value.scrollTop=0)})):u.value&&O()}),pe(()=>e.fullscreen,R=>{t.value&&(R?(i=t.value.style.transform,t.value.style.transform=""):t.value.style.transform=i)}),Ue(()=>{e.modelValue&&(u.value=!0,f.value=!0,C())}),{afterEnter:_,afterLeave:b,beforeLeave:T,handleClose:x,onModalClick:L,close:O,doClose:k,onOpenAutoFocus:z,onCloseAutoFocus:B,onCloseRequested:G,onFocusoutPrevented:K,titleId:a,bodyId:l,closed:c,style:y,overlayDialogStyle:g,rendered:f,visible:u,zIndex:p}},u3=["aria-label","aria-labelledby","aria-describedby"],c3=J({name:"ElDialog",inheritAttrs:!1}),f3=J({...c3,props:i3,emits:a3,setup(e,{expose:t}){const n=e,r=Xr();Ut({scope:"el-dialog",from:"the title slot",replacement:"the header slot",version:"3.0.0",ref:"https://element-plus.org/en-US/component/dialog.html#slots"},E(()=>!!r.title));const o=ke("dialog"),s=j(),i=j(),a=j(),{visible:l,titleId:u,bodyId:c,style:f,overlayDialogStyle:p,rendered:v,zIndex:h,afterEnter:d,afterLeave:y,beforeLeave:g,handleClose:_,onModalClick:b,onOpenAutoFocus:T,onCloseAutoFocus:C,onCloseRequested:O,onFocusoutPrevented:x}=l3(n,s);ut(jm,{dialogRef:s,headerRef:i,bodyId:c,ns:o,rendered:v,style:f});const L=lm(b),I=E(()=>n.draggable&&!n.fullscreen);return t({visible:l,dialogContentRef:a}),(k,z)=>(P(),he($h,{to:k.appendTo,disabled:k.appendTo!=="body"?!1:!k.appendToBody},[ae(Un,{name:"dialog-fade",onAfterEnter:m(d),onAfterLeave:m(y),onBeforeLeave:m(g),persisted:""},{default:ye(()=>[ht(ae(m(ZA),{"custom-mask-event":"",mask:k.modal,"overlay-class":k.modalClass,"z-index":m(h)},{default:ye(()=>[fe("div",{role:"dialog","aria-modal":"true","aria-label":k.title||void 0,"aria-labelledby":k.title?void 0:m(u),"aria-describedby":m(c),class:W(`${m(o).namespace.value}-overlay-dialog`),style:ot(m(p)),onClick:z[0]||(z[0]=(...B)=>m(L).onClick&&m(L).onClick(...B)),onMousedown:z[1]||(z[1]=(...B)=>m(L).onMousedown&&m(L).onMousedown(...B)),onMouseup:z[2]||(z[2]=(...B)=>m(L).onMouseup&&m(L).onMouseup(...B))},[ae(m(Am),{loop:"",trapped:m(l),"focus-start-el":"container",onFocusAfterTrapped:m(T),onFocusAfterReleased:m(C),onFocusoutPrevented:m(x),onReleaseRequested:m(O)},{default:ye(()=>[m(v)?(P(),he(s3,sn({key:0,ref_key:"dialogContentRef",ref:a},k.$attrs,{center:k.center,"align-center":k.alignCenter,"close-icon":k.closeIcon,draggable:m(I),overflow:k.overflow,fullscreen:k.fullscreen,"show-close":k.showClose,title:k.title,"aria-level":k.headerAriaLevel,onClose:m(_)}),qy({header:ye(()=>[k.$slots.title?de(k.$slots,"title",{key:1}):de(k.$slots,"header",{key:0,close:m(_),titleId:m(u),titleClass:m(o).e("title")})]),default:ye(()=>[de(k.$slots,"default")]),_:2},[k.$slots.footer?{name:"footer",fn:ye(()=>[de(k.$slots,"footer")])}:void 0]),1040,["center","align-center","close-icon","draggable","overflow","fullscreen","show-close","title","aria-level","onClose"])):ue("v-if",!0)]),_:3},8,["trapped","onFocusAfterTrapped","onFocusAfterReleased","onFocusoutPrevented","onReleaseRequested"])],46,u3)]),_:3},8,["mask","overlay-class","z-index"]),[[Pn,m(l)]])]),_:3},8,["onAfterEnter","onAfterLeave","onBeforeLeave"])],8,["to","disabled"]))}});var d3=Ne(f3,[["__file","dialog.vue"]]);const _8=yt(d3),p3=J({inheritAttrs:!1});function h3(e,t,n,r,o,s){return de(e.$slots,"default")}var v3=Ne(p3,[["render",h3],["__file","collection.vue"]]);const m3=J({name:"ElCollectionItem",inheritAttrs:!1});function g3(e,t,n,r,o,s){return de(e.$slots,"default")}var y3=Ne(m3,[["render",g3],["__file","collection-item.vue"]]);const b3="data-el-collection-item",w3=e=>{const t=`El${e}Collection`,n=`${t}Item`,r=Symbol(t),o=Symbol(n),s={...v3,name:t,setup(){const a=j(null),l=new Map;ut(r,{itemMap:l,getItems:()=>{const c=m(a);if(!c)return[];const f=Array.from(c.querySelectorAll(`[${b3}]`));return[...l.values()].sort((v,h)=>f.indexOf(v.ref)-f.indexOf(h.ref))},collectionRef:a})}},i={...y3,name:n,setup(a,{attrs:l}){const u=j(null),c=Se(r,void 0);ut(o,{collectionItemRef:u}),Ue(()=>{const f=m(u);f&&c.itemMap.set(f,{ref:f,...l})}),Ct(()=>{const f=m(u);c.itemMap.delete(f)})}};return{COLLECTION_INJECTION_KEY:r,COLLECTION_ITEM_INJECTION_KEY:o,ElCollection:s,ElCollectionItem:i}},rl=Ie({trigger:xs.trigger,effect:{...Ft.effect,default:"light"},type:{type:we(String)},placement:{type:we(String),default:"bottom"},popperOptions:{type:we(Object),default:()=>({})},id:String,size:{type:String,default:""},splitButton:Boolean,hideOnClick:{type:Boolean,default:!0},loop:{type:Boolean,default:!0},showTimeout:{type:Number,default:150},hideTimeout:{type:Number,default:150},tabindex:{type:we([Number,String]),default:0},maxHeight:{type:we([Number,String]),default:""},popperClass:{type:String,default:""},disabled:{type:Boolean,default:!1},role:{type:String,default:"menu"},buttonProps:{type:we(Object)},teleported:Ft.teleported});Ie({command:{type:[Object,String,Number],default:()=>({})},disabled:Boolean,divided:Boolean,textValue:String,icon:{type:Pt}});Ie({onKeydown:{type:we(Function)}});w3("Dropdown");const _3=Ie({id:{type:String,default:void 0},step:{type:Number,default:1},stepStrictly:Boolean,max:{type:Number,default:Number.POSITIVE_INFINITY},min:{type:Number,default:Number.NEGATIVE_INFINITY},modelValue:Number,readonly:Boolean,disabled:Boolean,size:$o,controls:{type:Boolean,default:!0},controlsPosition:{type:String,default:"",values:["","right"]},valueOnClear:{type:[String,Number,null],validator:e=>e===null||ze(e)||["min","max"].includes(e),default:null},name:String,label:String,placeholder:String,precision:{type:Number,validator:e=>e>=0&&e===Number.parseInt(`${e}`,10)},validateEvent:{type:Boolean,default:!0},...Gn(["ariaLabel"])}),S3={[Kr]:(e,t)=>t!==e,blur:e=>e instanceof FocusEvent,focus:e=>e instanceof FocusEvent,[Dr]:e=>ze(e)||Cn(e),[Ge]:e=>ze(e)||Cn(e)},E3=["aria-label","onKeydown"],C3=["aria-label","onKeydown"],O3=J({name:"ElInputNumber"}),T3=J({...O3,props:_3,emits:S3,setup(e,{expose:t,emit:n}){const r=e,{t:o}=Ea(),s=ke("input-number"),i=j(),a=Et({currentValue:r.modelValue,userInput:null}),{formItem:l}=Cr(),u=E(()=>ze(r.modelValue)&&r.modelValue<=r.min),c=E(()=>ze(r.modelValue)&&r.modelValue>=r.max),f=E(()=>{const R=g(r.step);return Kt(r.precision)?Math.max(g(r.modelValue),R):(R>r.precision,r.precision)}),p=E(()=>r.controls&&r.controlsPosition==="right"),v=dn(),h=ko(),d=E(()=>{if(a.userInput!==null)return a.userInput;let R=a.currentValue;if(Cn(R))return"";if(ze(R)){if(Number.isNaN(R))return"";Kt(r.precision)||(R=R.toFixed(r.precision))}return R}),y=(R,F)=>{if(Kt(F)&&(F=f.value),F===0)return Math.round(R);let $=String(R);const se=$.indexOf(".");if(se===-1||!$.replace(".","").split("")[se+F])return R;const je=$.length;return $.charAt(je-1)==="5"&&($=`${$.slice(0,Math.max(0,je-1))}6`),Number.parseFloat(Number($).toFixed(F))},g=R=>{if(Cn(R))return 0;const F=R.toString(),$=F.indexOf(".");let se=0;return $!==-1&&(se=F.length-$-1),se},_=(R,F=1)=>ze(R)?y(R+r.step*F):a.currentValue,b=()=>{if(r.readonly||h.value||c.value)return;const R=Number(d.value)||0,F=_(R);O(F),n(Dr,a.currentValue),K()},T=()=>{if(r.readonly||h.value||u.value)return;const R=Number(d.value)||0,F=_(R,-1);O(F),n(Dr,a.currentValue),K()},C=(R,F)=>{const{max:$,min:se,step:me,precision:Pe,stepStrictly:je,valueOnClear:Ce}=r;$$||Oe$?$:se,F&&n(Ge,Oe)),Oe},O=(R,F=!0)=>{var $;const se=a.currentValue,me=C(R);if(!F){n(Ge,me);return}se===me&&R||(a.userInput=null,n(Ge,me),se!==me&&n(Kr,me,se),r.validateEvent&&(($=l==null?void 0:l.validate)==null||$.call(l,"change").catch(Pe=>void 0)),a.currentValue=me)},x=R=>{a.userInput=R;const F=R===""?null:Number(R);n(Dr,F),O(F,!1)},L=R=>{const F=R!==""?Number(R):"";(ze(F)&&!Number.isNaN(F)||R==="")&&O(F),K(),a.userInput=null},I=()=>{var R,F;(F=(R=i.value)==null?void 0:R.focus)==null||F.call(R)},k=()=>{var R,F;(F=(R=i.value)==null?void 0:R.blur)==null||F.call(R)},z=R=>{n("focus",R)},B=R=>{var F;a.userInput=null,n("blur",R),r.validateEvent&&((F=l==null?void 0:l.validate)==null||F.call(l,"blur").catch($=>void 0))},K=()=>{a.currentValue!==r.modelValue&&(a.currentValue=r.modelValue)},G=R=>{document.activeElement===R.target&&R.preventDefault()};return pe(()=>r.modelValue,(R,F)=>{const $=C(R,!0);a.userInput===null&&$!==F&&(a.currentValue=$)},{immediate:!0}),Ue(()=>{var R;const{min:F,max:$,modelValue:se}=r,me=(R=i.value)==null?void 0:R.input;if(me.setAttribute("role","spinbutton"),Number.isFinite($)?me.setAttribute("aria-valuemax",String($)):me.removeAttribute("aria-valuemax"),Number.isFinite(F)?me.setAttribute("aria-valuemin",String(F)):me.removeAttribute("aria-valuemin"),me.setAttribute("aria-valuenow",a.currentValue||a.currentValue===0?String(a.currentValue):""),me.setAttribute("aria-disabled",String(h.value)),!ze(se)&&se!=null){let Pe=Number(se);Number.isNaN(Pe)&&(Pe=null),n(Ge,Pe)}me.addEventListener("wheel",G,{passive:!1})}),Yr(()=>{var R,F;const $=(R=i.value)==null?void 0:R.input;$==null||$.setAttribute("aria-valuenow",`${(F=a.currentValue)!=null?F:""}`)}),Ut({from:"label",replacement:"aria-label",version:"2.8.0",scope:"el-input-number",ref:"https://element-plus.org/en-US/component/input-number.html"},E(()=>!!r.label)),t({focus:I,blur:k}),(R,F)=>(P(),Q("div",{class:W([m(s).b(),m(s).m(m(v)),m(s).is("disabled",m(h)),m(s).is("without-controls",!R.controls),m(s).is("controls-right",m(p))]),onDragstart:F[0]||(F[0]=lt(()=>{},["prevent"]))},[R.controls?ht((P(),Q("span",{key:0,role:"button","aria-label":m(o)("el.inputNumber.decrease"),class:W([m(s).e("decrease"),m(s).is("disabled",m(u))]),onKeydown:_n(T,["enter"])},[de(R.$slots,"decrease-icon",{},()=>[ae(m(Xe),null,{default:ye(()=>[m(p)?(P(),he(m(Bv),{key:0})):(P(),he(m(RC),{key:1}))]),_:1})])],42,E3)),[[m(ip),T]]):ue("v-if",!0),R.controls?ht((P(),Q("span",{key:1,role:"button","aria-label":m(o)("el.inputNumber.increase"),class:W([m(s).e("increase"),m(s).is("disabled",m(c))]),onKeydown:_n(b,["enter"])},[de(R.$slots,"increase-icon",{},()=>[ae(m(Xe),null,{default:ye(()=>[m(p)?(P(),he(m(dC),{key:0})):(P(),he(m(Vv),{key:1}))]),_:1})])],42,C3)),[[m(ip),b]]):ue("v-if",!0),ae(m(wm),{id:R.id,ref_key:"input",ref:i,type:"number",step:R.step,"model-value":m(d),placeholder:R.placeholder,readonly:R.readonly,disabled:m(h),size:m(v),max:R.max,min:R.min,name:R.name,"aria-label":R.label||R.ariaLabel,"validate-event":!1,onKeydown:[_n(lt(b,["prevent"]),["up"]),_n(lt(T,["prevent"]),["down"])],onBlur:B,onFocus:z,onInput:x,onChange:L},null,8,["id","step","model-value","placeholder","readonly","disabled","size","max","min","name","aria-label","onKeydown"])],34))}});var x3=Ne(T3,[["__file","input-number.vue"]]);const S8=yt(x3),A3=Ie({type:{type:String,values:["primary","success","warning","info","danger","default"],default:"default"},underline:{type:Boolean,default:!0},disabled:{type:Boolean,default:!1},href:{type:String,default:""},target:{type:String,default:"_self"},icon:{type:Pt}}),R3={click:e=>e instanceof MouseEvent},P3=["href","target"],I3=J({name:"ElLink"}),$3=J({...I3,props:A3,emits:R3,setup(e,{emit:t}){const n=e,r=ke("link"),o=E(()=>[r.b(),r.m(n.type),r.is("disabled",n.disabled),r.is("underline",n.underline&&!n.disabled)]);function s(i){n.disabled||t("click",i)}return(i,a)=>(P(),Q("a",{class:W(m(o)),href:i.disabled||!i.href?void 0:i.href,target:i.disabled||!i.href?void 0:i.target,onClick:s},[i.icon?(P(),he(m(Xe),{key:0},{default:ye(()=>[(P(),he(it(i.icon)))]),_:1})):ue("v-if",!0),i.$slots.default?(P(),Q("span",{key:1,class:W(m(r).e("inner"))},[de(i.$slots,"default")],2)):ue("v-if",!0),i.$slots.icon?de(i.$slots,"icon",{key:2}):ue("v-if",!0)],10,P3))}});var L3=Ne($3,[["__file","link.vue"]]);const E8=yt(L3),zm=Symbol("ElSelectGroup"),xa=Symbol("ElSelect");function k3(e,t){const n=Se(xa),r=Se(zm,{disabled:!1}),o=E(()=>n.props.multiple?c(n.props.modelValue,e.value):c([n.props.modelValue],e.value)),s=E(()=>{if(n.props.multiple){const v=n.props.modelValue||[];return!o.value&&v.length>=n.props.multipleLimit&&n.props.multipleLimit>0}else return!1}),i=E(()=>e.label||(Te(e.value)?"":e.value)),a=E(()=>e.value||e.label||""),l=E(()=>e.disabled||t.groupDisabled||s.value),u=rt(),c=(v=[],h)=>{if(Te(e.value)){const d=n.props.valueKey;return v&&v.some(y=>Le(Sn(y,d))===Sn(h,d))}else return v&&v.includes(h)},f=()=>{!e.disabled&&!r.disabled&&(n.states.hoveringIndex=n.optionsArray.indexOf(u.proxy))},p=v=>{const h=new RegExp(nC(v),"i");t.visible=h.test(i.value)||e.created};return pe(()=>i.value,()=>{!e.created&&!n.props.remote&&n.setSelected()}),pe(()=>e.value,(v,h)=>{const{remote:d,valueKey:y}=n.props;if(_s(v,h)||(n.onOptionDestroy(h,u.proxy),n.onOptionCreate(u.proxy)),!e.created&&!d){if(y&&Te(v)&&Te(h)&&v[y]===h[y])return;n.setSelected()}}),pe(()=>r.disabled,()=>{t.groupDisabled=r.disabled},{immediate:!0}),{select:n,currentLabel:i,currentValue:a,itemSelected:o,isDisabled:l,hoverItem:f,updateOption:p}}const N3=J({name:"ElOption",componentName:"ElOption",props:{value:{required:!0,type:[String,Number,Boolean,Object]},label:[String,Number],created:Boolean,disabled:Boolean},setup(e){const t=ke("select"),n=Ur(),r=E(()=>[t.be("dropdown","item"),t.is("disabled",m(a)),t.is("selected",m(i)),t.is("hovering",m(p))]),o=Et({index:-1,groupDisabled:!1,visible:!0,hover:!1}),{currentLabel:s,itemSelected:i,isDisabled:a,select:l,hoverItem:u,updateOption:c}=k3(e,o),{visible:f,hover:p}=Gr(o),v=rt().proxy;l.onOptionCreate(v),Ct(()=>{const d=v.value,{selected:y}=l.states,_=(l.props.multiple?y:[y]).some(b=>b.value===v.value);Ve(()=>{l.states.cachedOptions.get(d)===v&&!_&&l.states.cachedOptions.delete(d)}),l.onOptionDestroy(d,v)});function h(){e.disabled!==!0&&o.groupDisabled!==!0&&l.handleOptionSelect(v)}return{ns:t,id:n,containerKls:r,currentLabel:s,itemSelected:i,isDisabled:a,select:l,hoverItem:u,updateOption:c,visible:f,hover:p,selectOptionClick:h,states:o}}}),M3=["id","aria-disabled","aria-selected"];function F3(e,t,n,r,o,s){return ht((P(),Q("li",{id:e.id,class:W(e.containerKls),role:"option","aria-disabled":e.isDisabled||void 0,"aria-selected":e.itemSelected,onMouseenter:t[0]||(t[0]=(...i)=>e.hoverItem&&e.hoverItem(...i)),onClick:t[1]||(t[1]=lt((...i)=>e.selectOptionClick&&e.selectOptionClick(...i),["stop"]))},[de(e.$slots,"default",{},()=>[fe("span",null,We(e.currentLabel),1)])],42,M3)),[[Pn,e.visible]])}var lc=Ne(N3,[["render",F3],["__file","option.vue"]]);const B3=J({name:"ElSelectDropdown",componentName:"ElSelectDropdown",setup(){const e=Se(xa),t=ke("select"),n=E(()=>e.props.popperClass),r=E(()=>e.props.multiple),o=E(()=>e.props.fitInputWidth),s=j("");function i(){var a;s.value=`${(a=e.selectRef)==null?void 0:a.offsetWidth}px`}return Ue(()=>{i(),Bt(e.selectRef,i)}),{ns:t,minWidth:s,popperClass:n,isMultiple:r,isFitInputWidth:o}}});function D3(e,t,n,r,o,s){return P(),Q("div",{class:W([e.ns.b("dropdown"),e.ns.is("multiple",e.isMultiple),e.popperClass]),style:ot({[e.isFitInputWidth?"width":"minWidth"]:e.minWidth})},[e.$slots.header?(P(),Q("div",{key:0,class:W(e.ns.be("dropdown","header"))},[de(e.$slots,"header")],2)):ue("v-if",!0),de(e.$slots,"default"),e.$slots.footer?(P(),Q("div",{key:1,class:W(e.ns.be("dropdown","footer"))},[de(e.$slots,"footer")],2)):ue("v-if",!0)],6)}var j3=Ne(B3,[["render",D3],["__file","select-dropdown.vue"]]);function V3(e){const t=j(!1);return{handleCompositionStart:()=>{t.value=!0},handleCompositionUpdate:s=>{const i=s.target.value,a=i[i.length-1]||"";t.value=!qv(a)},handleCompositionEnd:s=>{t.value&&(t.value=!1,ve(e)&&e(s))}}}const z3=11,H3=(e,t)=>{const{t:n}=Ea(),r=Ur(),o=ke("select"),s=ke("input"),i=Et({inputValue:"",options:new Map,cachedOptions:new Map,disabledOptions:new Map,optionValues:[],selected:e.multiple?[]:{},selectionWidth:0,calculatorWidth:0,collapseItemWidth:0,selectedLabel:"",hoveringIndex:-1,previousQuery:null,inputHovering:!1,menuVisibleOnFocus:!1,isBeforeHide:!1}),a=j(null),l=j(null),u=j(null),c=j(null),f=j(null),p=j(null),v=j(null),h=j(null),d=j(null),y=j(null),g=j(null),_=j(null),{wrapperRef:b,isFocused:T,handleFocus:C,handleBlur:O}=vm(f,{afterFocus(){e.automaticDropdown&&!x.value&&(x.value=!0,i.menuVisibleOnFocus=!0)},beforeBlur(D){var oe,He;return((oe=u.value)==null?void 0:oe.isFocusInsideContent(D))||((He=c.value)==null?void 0:He.isFocusInsideContent(D))},afterBlur(){x.value=!1,i.menuVisibleOnFocus=!1}}),x=j(!1),L=j(),{form:I,formItem:k}=Cr(),{inputId:z}=Vs(e,{formItemContext:k}),{valueOnClear:B,isEmptyValue:K}=wT(e),G=E(()=>e.disabled||(I==null?void 0:I.disabled)),R=E(()=>e.multiple?ce(e.modelValue)&&e.modelValue.length>0:!K(e.modelValue)),F=E(()=>e.clearable&&!G.value&&i.inputHovering&&R.value),$=E(()=>e.remote&&e.filterable&&!e.remoteShowSuffix?"":e.suffixIcon),se=E(()=>o.is("reverse",$.value&&x.value)),me=E(()=>(k==null?void 0:k.validateState)||""),Pe=E(()=>Uv[me.value]),je=E(()=>e.remote?300:0),Ce=E(()=>e.loading?e.loadingText||n("el.select.loading"):e.remote&&!i.inputValue&&i.options.size===0?!1:e.filterable&&i.inputValue&&i.options.size>0&&Oe.value===0?e.noMatchText||n("el.select.noMatch"):i.options.size===0?e.noDataText||n("el.select.noData"):null),Oe=E(()=>Ee.value.filter(D=>D.visible).length),Ee=E(()=>{const D=Array.from(i.options.values()),oe=[];return i.optionValues.forEach(He=>{const st=D.findIndex(Yn=>Yn.value===He);st>-1&&oe.push(D[st])}),oe.length>=D.length?oe:D}),Ze=E(()=>Array.from(i.cachedOptions.values())),$e=E(()=>{const D=Ee.value.filter(oe=>!oe.created).some(oe=>oe.currentLabel===i.inputValue);return e.filterable&&e.allowCreate&&i.inputValue!==""&&!D}),A=()=>{e.filterable&&ve(e.filterMethod)||e.filterable&&e.remote&&ve(e.remoteMethod)||Ee.value.forEach(D=>{var oe;(oe=D.updateOption)==null||oe.call(D,i.inputValue)})},q=dn(),X=E(()=>["small"].includes(q.value)?"small":"default"),ne=E({get(){return x.value&&Ce.value!==!1},set(D){x.value=D}}),_e=E(()=>ce(e.modelValue)?e.modelValue.length===0&&!i.inputValue:e.filterable?!i.inputValue:!0),Re=E(()=>{var D;const oe=(D=e.placeholder)!=null?D:n("el.select.placeholder");return e.multiple||!R.value?oe:i.selectedLabel}),w=E(()=>Rl?null:"mouseenter");pe(()=>e.modelValue,(D,oe)=>{e.multiple&&e.filterable&&!e.reserveKeyword&&(i.inputValue="",S("")),U(),!_s(D,oe)&&e.validateEvent&&(k==null||k.validate("change").catch(He=>void 0))},{flush:"post",deep:!0}),pe(()=>x.value,D=>{D?S(i.inputValue):(i.inputValue="",i.previousQuery=null,i.isBeforeHide=!0),t("visible-change",D)}),pe(()=>i.options.entries(),()=>{var D;if(!nt)return;const oe=((D=a.value)==null?void 0:D.querySelectorAll("input"))||[];(!e.filterable&&!e.defaultFirstOption&&!Kt(e.modelValue)||!Array.from(oe).includes(document.activeElement))&&U(),e.defaultFirstOption&&(e.filterable||e.remote)&&Oe.value&&M()},{flush:"post"}),pe(()=>i.hoveringIndex,D=>{ze(D)&&D>-1?L.value=Ee.value[D]||{}:L.value={},Ee.value.forEach(oe=>{oe.hover=L.value===oe})}),xu(()=>{i.isBeforeHide||A()});const S=D=>{i.previousQuery!==D&&(i.previousQuery=D,e.filterable&&ve(e.filterMethod)?e.filterMethod(D):e.filterable&&e.remote&&ve(e.remoteMethod)&&e.remoteMethod(D),e.defaultFirstOption&&(e.filterable||e.remote)&&Oe.value?Ve(M):Ve(ee))},M=()=>{const D=Ee.value.filter(st=>st.visible&&!st.disabled&&!st.states.groupDisabled),oe=D.find(st=>st.created),He=D[0];i.hoveringIndex=Bo(Ee.value,oe||He)},U=()=>{if(e.multiple)i.selectedLabel="";else{const oe=H(e.modelValue);i.selectedLabel=oe.currentLabel,i.selected=oe;return}const D=[];ce(e.modelValue)&&e.modelValue.forEach(oe=>{D.push(H(oe))}),i.selected=D},H=D=>{let oe;const He=gi(D).toLowerCase()==="object",st=gi(D).toLowerCase()==="null",Yn=gi(D).toLowerCase()==="undefined";for(let Or=i.cachedOptions.size-1;Or>=0;Or--){const gn=Ze.value[Or];if(He?Sn(gn.value,e.valueKey)===Sn(D,e.valueKey):gn.value===D){oe={value:D,currentLabel:gn.currentLabel,get isDisabled(){return gn.isDisabled}};break}}if(oe)return oe;const to=He?D.label:!st&&!Yn?D:"";return{value:D,currentLabel:to}},ee=()=>{e.multiple?i.hoveringIndex=Ee.value.findIndex(D=>i.selected.some(oe=>Do(oe)===Do(D))):i.hoveringIndex=Ee.value.findIndex(D=>Do(D)===Do(i.selected))},ie=()=>{i.selectionWidth=l.value.getBoundingClientRect().width},Z=()=>{i.calculatorWidth=p.value.getBoundingClientRect().width},te=()=>{i.collapseItemWidth=g.value.getBoundingClientRect().width},Y=()=>{var D,oe;(oe=(D=u.value)==null?void 0:D.updatePopper)==null||oe.call(D)},le=()=>{var D,oe;(oe=(D=c.value)==null?void 0:D.updatePopper)==null||oe.call(D)},be=()=>{i.inputValue.length>0&&!x.value&&(x.value=!0),S(i.inputValue)},N=D=>{if(i.inputValue=D.target.value,e.remote)re();else return be()},re=JE(()=>{be()},je.value),ge=D=>{_s(e.modelValue,D)||t(Kr,D)},Fe=D=>XE(D,oe=>!i.disabledOptions.has(oe)),Be=D=>{if(e.multiple&&D.code!==On.delete&&D.target.value.length<=0){const oe=e.modelValue.slice(),He=Fe(oe);if(He<0)return;const st=oe[He];oe.splice(He,1),t(Ge,oe),ge(oe),t("remove-tag",st)}},dt=(D,oe)=>{const He=i.selected.indexOf(oe);if(He>-1&&!G.value){const st=e.modelValue.slice();st.splice(He,1),t(Ge,st),ge(st),t("remove-tag",oe.value)}D.stopPropagation(),Gs()},At=D=>{D.stopPropagation();const oe=e.multiple?[]:B.value;if(e.multiple)for(const He of i.selected)He.isDisabled&&oe.push(He.value);t(Ge,oe),ge(oe),i.hoveringIndex=-1,x.value=!1,t("clear"),Gs()},In=D=>{if(e.multiple){const oe=(e.modelValue||[]).slice(),He=Bo(oe,D.value);He>-1?oe.splice(He,1):(e.multipleLimit<=0||oe.length{mn(D)})},Bo=(D=[],oe)=>{if(!Te(oe))return D.indexOf(oe);const He=e.valueKey;let st=-1;return D.some((Yn,to)=>Le(Sn(Yn,He))===Sn(oe,He)?(st=to,!0):!1),st},mn=D=>{var oe,He,st,Yn,to;const Ys=ce(D)?D[0]:D;let Or=null;if(Ys!=null&&Ys.value){const gn=Ee.value.filter(yc=>yc.value===Ys.value);gn.length>0&&(Or=gn[0].$el)}if(u.value&&Or){const gn=(Yn=(st=(He=(oe=u.value)==null?void 0:oe.popperRef)==null?void 0:He.contentRef)==null?void 0:st.querySelector)==null?void 0:Yn.call(st,`.${o.be("dropdown","wrap")}`);gn&&sC(gn,Or)}(to=_.value)==null||to.handleScroll()},qs=D=>{i.options.set(D.value,D),i.cachedOptions.set(D.value,D),D.disabled&&i.disabledOptions.set(D.value,D)},Ot=(D,oe)=>{i.options.get(D)===oe&&i.options.delete(D)},{handleCompositionStart:Vt,handleCompositionUpdate:Ws,handleCompositionEnd:Rg}=V3(D=>N(D)),Pg=E(()=>{var D,oe;return(oe=(D=u.value)==null?void 0:D.popperRef)==null?void 0:oe.contentRef}),Ig=()=>{i.isBeforeHide=!1,Ve(()=>mn(i.selected))},Gs=()=>{var D;(D=f.value)==null||D.focus()},$g=()=>{vc()},Lg=D=>{At(D)},vc=D=>{if(x.value=!1,T.value){const oe=new FocusEvent("focus",D);Ve(()=>O(oe))}},kg=()=>{i.inputValue.length>0?i.inputValue="":x.value=!1},mc=()=>{G.value||(Rl&&(i.inputHovering=!0),i.menuVisibleOnFocus?i.menuVisibleOnFocus=!1:x.value=!x.value)},Ng=()=>{x.value?Ee.value[i.hoveringIndex]&&In(Ee.value[i.hoveringIndex]):mc()},Do=D=>Te(D.value)?Sn(D.value,e.valueKey):D.value,Mg=E(()=>Ee.value.filter(D=>D.visible).every(D=>D.disabled)),Fg=E(()=>e.multiple?e.collapseTags?i.selected.slice(0,e.maxCollapseTags):i.selected:[]),Bg=E(()=>e.multiple?e.collapseTags?i.selected.slice(e.maxCollapseTags):[]:[]),gc=D=>{if(!x.value){x.value=!0;return}if(!(i.options.size===0||Oe.value===0)&&!Mg.value){D==="next"?(i.hoveringIndex++,i.hoveringIndex===i.options.size&&(i.hoveringIndex=0)):D==="prev"&&(i.hoveringIndex--,i.hoveringIndex<0&&(i.hoveringIndex=i.options.size-1));const oe=Ee.value[i.hoveringIndex];(oe.disabled===!0||oe.states.groupDisabled===!0||!oe.visible)&&gc(D),Ve(()=>mn(L.value))}},Dg=()=>{if(!l.value)return 0;const D=window.getComputedStyle(l.value);return Number.parseFloat(D.gap||"6px")},jg=E(()=>{const D=Dg();return{maxWidth:`${g.value&&e.maxCollapseTags===1?i.selectionWidth-i.collapseItemWidth-D:i.selectionWidth}px`}}),Vg=E(()=>({maxWidth:`${i.selectionWidth}px`})),zg=E(()=>({width:`${Math.max(i.calculatorWidth,z3)}px`}));return e.multiple&&!ce(e.modelValue)&&t(Ge,[]),!e.multiple&&ce(e.modelValue)&&t(Ge,""),Bt(l,ie),Bt(p,Z),Bt(d,Y),Bt(b,Y),Bt(y,le),Bt(g,te),Ue(()=>{U()}),{inputId:z,contentId:r,nsSelect:o,nsInput:s,states:i,isFocused:T,expanded:x,optionsArray:Ee,hoverOption:L,selectSize:q,filteredOptionsCount:Oe,resetCalculatorWidth:Z,updateTooltip:Y,updateTagTooltip:le,debouncedOnInputChange:re,onInput:N,deletePrevTag:Be,deleteTag:dt,deleteSelected:At,handleOptionSelect:In,scrollToOption:mn,hasModelValue:R,shouldShowPlaceholder:_e,currentPlaceholder:Re,mouseEnterEventName:w,showClose:F,iconComponent:$,iconReverse:se,validateState:me,validateIcon:Pe,showNewOption:$e,updateOptions:A,collapseTagSize:X,setSelected:U,selectDisabled:G,emptyText:Ce,handleCompositionStart:Vt,handleCompositionUpdate:Ws,handleCompositionEnd:Rg,onOptionCreate:qs,onOptionDestroy:Ot,handleMenuEnter:Ig,handleFocus:C,focus:Gs,blur:$g,handleBlur:O,handleClearClick:Lg,handleClickOutside:vc,handleEsc:kg,toggleMenu:mc,selectOption:Ng,getValueKey:Do,navigateOptions:gc,dropdownMenuVisible:ne,showTagList:Fg,collapseTagList:Bg,tagStyle:jg,collapseTagStyle:Vg,inputStyle:zg,popperRef:Pg,inputRef:f,tooltipRef:u,tagTooltipRef:c,calculatorRef:p,prefixRef:v,suffixRef:h,selectRef:a,wrapperRef:b,selectionRef:l,scrollbarRef:_,menuRef:d,tagMenuRef:y,collapseItemRef:g}};var K3=J({name:"ElOptions",setup(e,{slots:t}){const n=Se(xa);let r=[];return()=>{var o,s;const i=(o=t.default)==null?void 0:o.call(t),a=[];function l(u){ce(u)&&u.forEach(c=>{var f,p,v,h;const d=(f=(c==null?void 0:c.type)||{})==null?void 0:f.name;d==="ElOptionGroup"?l(!xe(c.children)&&!ce(c.children)&&ve((p=c.children)==null?void 0:p.default)?(v=c.children)==null?void 0:v.default():c.children):d==="ElOption"?a.push((h=c.props)==null?void 0:h.value):ce(c.children)&&l(c.children)})}return i.length&&l((s=i[0])==null?void 0:s.children),_s(a,r)||(r=a,n&&(n.states.optionValues=a)),i}}});const U3=Ie({name:String,id:String,modelValue:{type:[Array,String,Number,Boolean,Object],default:void 0},autocomplete:{type:String,default:"off"},automaticDropdown:Boolean,size:$o,effect:{type:we(String),default:"light"},disabled:Boolean,clearable:Boolean,filterable:Boolean,allowCreate:Boolean,loading:Boolean,popperClass:{type:String,default:""},popperOptions:{type:we(Object),default:()=>({})},remote:Boolean,loadingText:String,noMatchText:String,noDataText:String,remoteMethod:Function,filterMethod:Function,multiple:Boolean,multipleLimit:{type:Number,default:0},placeholder:{type:String},defaultFirstOption:Boolean,reserveKeyword:{type:Boolean,default:!0},valueKey:{type:String,default:"value"},collapseTags:Boolean,collapseTagsTooltip:Boolean,maxCollapseTags:{type:Number,default:1},teleported:Ft.teleported,persistent:{type:Boolean,default:!0},clearIcon:{type:Pt,default:Uu},fitInputWidth:Boolean,suffixIcon:{type:Pt,default:Bv},tagType:{...Dm.type,default:"info"},validateEvent:{type:Boolean,default:!0},remoteShowSuffix:Boolean,placement:{type:we(String),values:Ca,default:"bottom-start"},fallbackPlacements:{type:we(Array),default:["bottom-start","top-start","right","left"]},...bT,...Gn(["ariaLabel"])}),ap="ElSelect",q3=J({name:ap,componentName:ap,components:{ElInput:wm,ElSelectMenu:j3,ElOption:lc,ElOptions:K3,ElTag:WA,ElScrollbar:U4,ElTooltip:Pm,ElIcon:Xe},directives:{ClickOutside:EA},props:U3,emits:[Ge,Kr,"remove-tag","clear","visible-change","focus","blur"],setup(e,{emit:t}){const n=H3(e,t);return ut(xa,Et({props:e,states:n.states,optionsArray:n.optionsArray,handleOptionSelect:n.handleOptionSelect,onOptionCreate:n.onOptionCreate,onOptionDestroy:n.onOptionDestroy,selectRef:n.selectRef,setSelected:n.setSelected})),{...n}}}),W3=["id","name","disabled","autocomplete","readonly","aria-activedescendant","aria-controls","aria-expanded","aria-label"],G3=["textContent"],Y3={key:1};function J3(e,t,n,r,o,s){const i=Tr("el-tag"),a=Tr("el-tooltip"),l=Tr("el-icon"),u=Tr("el-option"),c=Tr("el-options"),f=Tr("el-scrollbar"),p=Tr("el-select-menu"),v=By("click-outside");return ht((P(),Q("div",{ref:"selectRef",class:W([e.nsSelect.b(),e.nsSelect.m(e.selectSize)]),[yi(e.mouseEnterEventName)]:t[16]||(t[16]=h=>e.states.inputHovering=!0),onMouseleave:t[17]||(t[17]=h=>e.states.inputHovering=!1),onClick:t[18]||(t[18]=lt((...h)=>e.toggleMenu&&e.toggleMenu(...h),["prevent","stop"]))},[ae(a,{ref:"tooltipRef",visible:e.dropdownMenuVisible,placement:e.placement,teleported:e.teleported,"popper-class":[e.nsSelect.e("popper"),e.popperClass],"popper-options":e.popperOptions,"fallback-placements":e.fallbackPlacements,effect:e.effect,pure:"",trigger:"click",transition:`${e.nsSelect.namespace.value}-zoom-in-top`,"stop-popper-mouse-event":!1,"gpu-acceleration":!1,persistent:e.persistent,onBeforeShow:e.handleMenuEnter,onHide:t[15]||(t[15]=h=>e.states.isBeforeHide=!1)},{default:ye(()=>{var h;return[fe("div",{ref:"wrapperRef",class:W([e.nsSelect.e("wrapper"),e.nsSelect.is("focused",e.isFocused),e.nsSelect.is("hovering",e.states.inputHovering),e.nsSelect.is("filterable",e.filterable),e.nsSelect.is("disabled",e.selectDisabled)])},[e.$slots.prefix?(P(),Q("div",{key:0,ref:"prefixRef",class:W(e.nsSelect.e("prefix"))},[de(e.$slots,"prefix")],2)):ue("v-if",!0),fe("div",{ref:"selectionRef",class:W([e.nsSelect.e("selection"),e.nsSelect.is("near",e.multiple&&!e.$slots.prefix&&!!e.states.selected.length)])},[e.multiple?de(e.$slots,"tag",{key:0},()=>[(P(!0),Q(tt,null,Ic(e.showTagList,d=>(P(),Q("div",{key:e.getValueKey(d),class:W(e.nsSelect.e("selected-item"))},[ae(i,{closable:!e.selectDisabled&&!d.isDisabled,size:e.collapseTagSize,type:e.tagType,"disable-transitions":"",style:ot(e.tagStyle),onClose:y=>e.deleteTag(y,d)},{default:ye(()=>[fe("span",{class:W(e.nsSelect.e("tags-text"))},[de(e.$slots,"label",{label:d.currentLabel,value:d.value},()=>[zr(We(d.currentLabel),1)])],2)]),_:2},1032,["closable","size","type","style","onClose"])],2))),128)),e.collapseTags&&e.states.selected.length>e.maxCollapseTags?(P(),he(a,{key:0,ref:"tagTooltipRef",disabled:e.dropdownMenuVisible||!e.collapseTagsTooltip,"fallback-placements":["bottom","top","right","left"],effect:e.effect,placement:"bottom",teleported:e.teleported},{default:ye(()=>[fe("div",{ref:"collapseItemRef",class:W(e.nsSelect.e("selected-item"))},[ae(i,{closable:!1,size:e.collapseTagSize,type:e.tagType,"disable-transitions":"",style:ot(e.collapseTagStyle)},{default:ye(()=>[fe("span",{class:W(e.nsSelect.e("tags-text"))}," + "+We(e.states.selected.length-e.maxCollapseTags),3)]),_:1},8,["size","type","style"])],2)]),content:ye(()=>[fe("div",{ref:"tagMenuRef",class:W(e.nsSelect.e("selection"))},[(P(!0),Q(tt,null,Ic(e.collapseTagList,d=>(P(),Q("div",{key:e.getValueKey(d),class:W(e.nsSelect.e("selected-item"))},[ae(i,{class:"in-tooltip",closable:!e.selectDisabled&&!d.isDisabled,size:e.collapseTagSize,type:e.tagType,"disable-transitions":"",onClose:y=>e.deleteTag(y,d)},{default:ye(()=>[fe("span",{class:W(e.nsSelect.e("tags-text"))},[de(e.$slots,"label",{label:d.currentLabel,value:d.value},()=>[zr(We(d.currentLabel),1)])],2)]),_:2},1032,["closable","size","type","onClose"])],2))),128))],2)]),_:3},8,["disabled","effect","teleported"])):ue("v-if",!0)]):ue("v-if",!0),e.selectDisabled?ue("v-if",!0):(P(),Q("div",{key:1,class:W([e.nsSelect.e("selected-item"),e.nsSelect.e("input-wrapper"),e.nsSelect.is("hidden",!e.filterable)])},[ht(fe("input",{id:e.inputId,ref:"inputRef","onUpdate:modelValue":t[0]||(t[0]=d=>e.states.inputValue=d),type:"text",name:e.name,class:W([e.nsSelect.e("input"),e.nsSelect.is(e.selectSize)]),disabled:e.selectDisabled,autocomplete:e.autocomplete,style:ot(e.inputStyle),role:"combobox",readonly:!e.filterable,spellcheck:"false","aria-activedescendant":((h=e.hoverOption)==null?void 0:h.id)||"","aria-controls":e.contentId,"aria-expanded":e.dropdownMenuVisible,"aria-label":e.ariaLabel,"aria-autocomplete":"none","aria-haspopup":"listbox",onFocus:t[1]||(t[1]=(...d)=>e.handleFocus&&e.handleFocus(...d)),onBlur:t[2]||(t[2]=(...d)=>e.handleBlur&&e.handleBlur(...d)),onKeydown:[t[3]||(t[3]=_n(lt(d=>e.navigateOptions("next"),["stop","prevent"]),["down"])),t[4]||(t[4]=_n(lt(d=>e.navigateOptions("prev"),["stop","prevent"]),["up"])),t[5]||(t[5]=_n(lt((...d)=>e.handleEsc&&e.handleEsc(...d),["stop","prevent"]),["esc"])),t[6]||(t[6]=_n(lt((...d)=>e.selectOption&&e.selectOption(...d),["stop","prevent"]),["enter"])),t[7]||(t[7]=_n(lt((...d)=>e.deletePrevTag&&e.deletePrevTag(...d),["stop"]),["delete"]))],onCompositionstart:t[8]||(t[8]=(...d)=>e.handleCompositionStart&&e.handleCompositionStart(...d)),onCompositionupdate:t[9]||(t[9]=(...d)=>e.handleCompositionUpdate&&e.handleCompositionUpdate(...d)),onCompositionend:t[10]||(t[10]=(...d)=>e.handleCompositionEnd&&e.handleCompositionEnd(...d)),onInput:t[11]||(t[11]=(...d)=>e.onInput&&e.onInput(...d)),onClick:t[12]||(t[12]=lt((...d)=>e.toggleMenu&&e.toggleMenu(...d),["stop"]))},null,46,W3),[[l0,e.states.inputValue]]),e.filterable?(P(),Q("span",{key:0,ref:"calculatorRef","aria-hidden":"true",class:W(e.nsSelect.e("input-calculator")),textContent:We(e.states.inputValue)},null,10,G3)):ue("v-if",!0)],2)),e.shouldShowPlaceholder?(P(),Q("div",{key:2,class:W([e.nsSelect.e("selected-item"),e.nsSelect.e("placeholder"),e.nsSelect.is("transparent",!e.hasModelValue||e.expanded&&!e.states.inputValue)])},[e.hasModelValue?de(e.$slots,"label",{key:0,label:e.currentPlaceholder,value:e.modelValue},()=>[fe("span",null,We(e.currentPlaceholder),1)]):(P(),Q("span",Y3,We(e.currentPlaceholder),1))],2)):ue("v-if",!0)],2),fe("div",{ref:"suffixRef",class:W(e.nsSelect.e("suffix"))},[e.iconComponent&&!e.showClose?(P(),he(l,{key:0,class:W([e.nsSelect.e("caret"),e.nsSelect.e("icon"),e.iconReverse])},{default:ye(()=>[(P(),he(it(e.iconComponent)))]),_:1},8,["class"])):ue("v-if",!0),e.showClose&&e.clearIcon?(P(),he(l,{key:1,class:W([e.nsSelect.e("caret"),e.nsSelect.e("icon")]),onClick:e.handleClearClick},{default:ye(()=>[(P(),he(it(e.clearIcon)))]),_:1},8,["class","onClick"])):ue("v-if",!0),e.validateState&&e.validateIcon?(P(),he(l,{key:2,class:W([e.nsInput.e("icon"),e.nsInput.e("validateIcon")])},{default:ye(()=>[(P(),he(it(e.validateIcon)))]),_:1},8,["class"])):ue("v-if",!0)],2)],2)]}),content:ye(()=>[ae(p,{ref:"menuRef"},{default:ye(()=>[e.$slots.header?(P(),Q("div",{key:0,class:W(e.nsSelect.be("dropdown","header")),onClick:t[13]||(t[13]=lt(()=>{},["stop"]))},[de(e.$slots,"header")],2)):ue("v-if",!0),ht(ae(f,{id:e.contentId,ref:"scrollbarRef",tag:"ul","wrap-class":e.nsSelect.be("dropdown","wrap"),"view-class":e.nsSelect.be("dropdown","list"),class:W([e.nsSelect.is("empty",e.filteredOptionsCount===0)]),role:"listbox","aria-label":e.ariaLabel,"aria-orientation":"vertical"},{default:ye(()=>[e.showNewOption?(P(),he(u,{key:0,value:e.states.inputValue,created:!0},null,8,["value"])):ue("v-if",!0),ae(c,null,{default:ye(()=>[de(e.$slots,"default")]),_:3})]),_:3},8,["id","wrap-class","view-class","class","aria-label"]),[[Pn,e.states.options.size>0&&!e.loading]]),e.$slots.loading&&e.loading?(P(),Q("div",{key:1,class:W(e.nsSelect.be("dropdown","loading"))},[de(e.$slots,"loading")],2)):e.loading||e.filteredOptionsCount===0?(P(),Q("div",{key:2,class:W(e.nsSelect.be("dropdown","empty"))},[de(e.$slots,"empty",{},()=>[fe("span",null,We(e.emptyText),1)])],2)):ue("v-if",!0),e.$slots.footer?(P(),Q("div",{key:3,class:W(e.nsSelect.be("dropdown","footer")),onClick:t[14]||(t[14]=lt(()=>{},["stop"]))},[de(e.$slots,"footer")],2)):ue("v-if",!0)]),_:3},512)]),_:3},8,["visible","placement","teleported","popper-class","popper-options","fallback-placements","effect","transition","persistent","onBeforeShow"])],16)),[[v,e.handleClickOutside,e.popperRef]])}var X3=Ne(q3,[["render",J3],["__file","select.vue"]]);const Z3=J({name:"ElOptionGroup",componentName:"ElOptionGroup",props:{label:String,disabled:Boolean},setup(e){const t=ke("select"),n=j(null),r=rt(),o=j([]);ut(zm,Et({...Gr(e)}));const s=E(()=>o.value.some(u=>u.visible===!0)),i=u=>{var c,f;return((c=u.type)==null?void 0:c.name)==="ElOption"&&!!((f=u.component)!=null&&f.proxy)},a=u=>{const c=Ui(u),f=[];return c.forEach(p=>{var v,h;i(p)?f.push(p.component.proxy):(v=p.children)!=null&&v.length?f.push(...a(p.children)):(h=p.component)!=null&&h.subTree&&f.push(...a(p.component.subTree))}),f},l=()=>{o.value=a(r.subTree)};return Ue(()=>{l()}),K1(n,l,{attributes:!0,subtree:!0,childList:!0}),{groupRef:n,visible:s,ns:t}}});function Q3(e,t,n,r,o,s){return ht((P(),Q("ul",{ref:"groupRef",class:W(e.ns.be("group","wrap"))},[fe("li",{class:W(e.ns.be("group","title"))},We(e.label),3),fe("li",null,[fe("ul",{class:W(e.ns.b("group"))},[de(e.$slots,"default")],2)])],2)),[[Pn,e.visible]])}var Hm=Ne(Z3,[["render",Q3],["__file","option-group.vue"]]);const C8=yt(X3,{Option:lc,OptionGroup:Hm}),O8=eo(lc);eo(Hm);const eR=Ie({trigger:xs.trigger,placement:rl.placement,disabled:xs.disabled,visible:Ft.visible,transition:Ft.transition,popperOptions:rl.popperOptions,tabindex:rl.tabindex,content:Ft.content,popperStyle:Ft.popperStyle,popperClass:Ft.popperClass,enterable:{...Ft.enterable,default:!0},effect:{...Ft.effect,default:"light"},teleported:Ft.teleported,title:String,width:{type:[String,Number],default:150},offset:{type:Number,default:void 0},showAfter:{type:Number,default:0},hideAfter:{type:Number,default:200},autoClose:{type:Number,default:0},showArrow:{type:Boolean,default:!0},persistent:{type:Boolean,default:!0},"onUpdate:visible":{type:Function}}),tR={"update:visible":e=>jt(e),"before-enter":()=>!0,"before-leave":()=>!0,"after-enter":()=>!0,"after-leave":()=>!0},nR="onUpdate:visible",rR=J({name:"ElPopover"}),oR=J({...rR,props:eR,emits:tR,setup(e,{expose:t,emit:n}){const r=e,o=E(()=>r[nR]),s=ke("popover"),i=j(),a=E(()=>{var y;return(y=m(i))==null?void 0:y.popperRef}),l=E(()=>[{width:Xt(r.width)},r.popperStyle]),u=E(()=>[s.b(),r.popperClass,{[s.m("plain")]:!!r.content}]),c=E(()=>r.transition===`${s.namespace.value}-fade-in-linear`),f=()=>{var y;(y=i.value)==null||y.hide()},p=()=>{n("before-enter")},v=()=>{n("before-leave")},h=()=>{n("after-enter")},d=()=>{n("update:visible",!1),n("after-leave")};return t({popperRef:a,hide:f}),(y,g)=>(P(),he(m(Pm),sn({ref_key:"tooltipRef",ref:i},y.$attrs,{trigger:y.trigger,placement:y.placement,disabled:y.disabled,visible:y.visible,transition:y.transition,"popper-options":y.popperOptions,tabindex:y.tabindex,content:y.content,offset:y.offset,"show-after":y.showAfter,"hide-after":y.hideAfter,"auto-close":y.autoClose,"show-arrow":y.showArrow,"aria-label":y.title,effect:y.effect,enterable:y.enterable,"popper-class":m(u),"popper-style":m(l),teleported:y.teleported,persistent:y.persistent,"gpu-acceleration":m(c),"onUpdate:visible":m(o),onBeforeShow:p,onBeforeHide:v,onShow:h,onHide:d}),{content:ye(()=>[y.title?(P(),Q("div",{key:0,class:W(m(s).e("title")),role:"title"},We(y.title),3)):ue("v-if",!0),de(y.$slots,"default",{},()=>[zr(We(y.content),1)])]),default:ye(()=>[y.$slots.reference?de(y.$slots,"reference",{key:0}):ue("v-if",!0)]),_:3},16,["trigger","placement","disabled","visible","transition","popper-options","tabindex","content","offset","show-after","hide-after","auto-close","show-arrow","aria-label","effect","enterable","popper-class","popper-style","teleported","persistent","gpu-acceleration","onUpdate:visible"]))}});var sR=Ne(oR,[["__file","popover.vue"]]);const lp=(e,t)=>{const n=t.arg||t.value,r=n==null?void 0:n.popperRef;r&&(r.triggerRef=e)};var iR={mounted(e,t){lp(e,t)},updated(e,t){lp(e,t)}};const aR="popover",lR=jC(iR,aR),T8=yt(sR,{directive:lR}),uR=Ie({modelValue:{type:[Boolean,String,Number],default:!1},disabled:{type:Boolean,default:!1},loading:{type:Boolean,default:!1},size:{type:String,validator:zC},width:{type:[String,Number],default:""},inlinePrompt:{type:Boolean,default:!1},inactiveActionIcon:{type:Pt},activeActionIcon:{type:Pt},activeIcon:{type:Pt},inactiveIcon:{type:Pt},activeText:{type:String,default:""},inactiveText:{type:String,default:""},activeValue:{type:[Boolean,String,Number],default:!0},inactiveValue:{type:[Boolean,String,Number],default:!1},name:{type:String,default:""},validateEvent:{type:Boolean,default:!0},beforeChange:{type:we(Function)},id:String,tabindex:{type:[String,Number]},label:{type:String,default:void 0},...Gn(["ariaLabel"])}),cR={[Ge]:e=>jt(e)||xe(e)||ze(e),[Kr]:e=>jt(e)||xe(e)||ze(e),[Dr]:e=>jt(e)||xe(e)||ze(e)},fR=["onClick"],dR=["id","aria-checked","aria-disabled","aria-label","name","true-value","false-value","disabled","tabindex","onKeydown"],pR=["aria-hidden"],hR=["aria-hidden"],vR=["aria-hidden"],Km="ElSwitch",mR=J({name:Km}),gR=J({...mR,props:uR,emits:cR,setup(e,{expose:t,emit:n}){const r=e,{formItem:o}=Cr(),s=dn(),i=ke("switch"),{inputId:a}=Vs(r,{formItemContext:o}),l=ko(E(()=>r.loading)),u=j(r.modelValue!==!1),c=j(),f=j(),p=E(()=>[i.b(),i.m(s.value),i.is("disabled",l.value),i.is("checked",g.value)]),v=E(()=>[i.e("label"),i.em("label","left"),i.is("active",!g.value)]),h=E(()=>[i.e("label"),i.em("label","right"),i.is("active",g.value)]),d=E(()=>({width:Xt(r.width)}));pe(()=>r.modelValue,()=>{u.value=!0});const y=E(()=>u.value?r.modelValue:!1),g=E(()=>y.value===r.activeValue);[r.activeValue,r.inactiveValue].includes(y.value)||(n(Ge,r.inactiveValue),n(Kr,r.inactiveValue),n(Dr,r.inactiveValue)),pe(g,C=>{var O;c.value.checked=C,r.validateEvent&&((O=o==null?void 0:o.validate)==null||O.call(o,"change").catch(x=>void 0))});const _=()=>{const C=g.value?r.inactiveValue:r.activeValue;n(Ge,C),n(Kr,C),n(Dr,C),Ve(()=>{c.value.checked=g.value})},b=()=>{if(l.value)return;const{beforeChange:C}=r;if(!C){_();return}const O=C();[$i(O),jt(O)].includes(!0)||Sr(Km,"beforeChange must return type `Promise` or `boolean`"),$i(O)?O.then(L=>{L&&_()}).catch(L=>{}):O&&_()},T=()=>{var C,O;(O=(C=c.value)==null?void 0:C.focus)==null||O.call(C)};return Ue(()=>{c.value.checked=g.value}),Ut({from:"label",replacement:"aria-label",version:"2.8.0",scope:"el-switch",ref:"https://element-plus.org/en-US/component/switch.html"},E(()=>!!r.label)),t({focus:T,checked:g}),(C,O)=>(P(),Q("div",{class:W(m(p)),onClick:lt(b,["prevent"])},[fe("input",{id:m(a),ref_key:"input",ref:c,class:W(m(i).e("input")),type:"checkbox",role:"switch","aria-checked":m(g),"aria-disabled":m(l),"aria-label":C.label||C.ariaLabel,name:C.name,"true-value":C.activeValue,"false-value":C.inactiveValue,disabled:m(l),tabindex:C.tabindex,onChange:_,onKeydown:_n(b,["enter"])},null,42,dR),!C.inlinePrompt&&(C.inactiveIcon||C.inactiveText)?(P(),Q("span",{key:0,class:W(m(v))},[C.inactiveIcon?(P(),he(m(Xe),{key:0},{default:ye(()=>[(P(),he(it(C.inactiveIcon)))]),_:1})):ue("v-if",!0),!C.inactiveIcon&&C.inactiveText?(P(),Q("span",{key:1,"aria-hidden":m(g)},We(C.inactiveText),9,pR)):ue("v-if",!0)],2)):ue("v-if",!0),fe("span",{ref_key:"core",ref:f,class:W(m(i).e("core")),style:ot(m(d))},[C.inlinePrompt?(P(),Q("div",{key:0,class:W(m(i).e("inner"))},[C.activeIcon||C.inactiveIcon?(P(),he(m(Xe),{key:0,class:W(m(i).is("icon"))},{default:ye(()=>[(P(),he(it(m(g)?C.activeIcon:C.inactiveIcon)))]),_:1},8,["class"])):C.activeText||C.inactiveText?(P(),Q("span",{key:1,class:W(m(i).is("text")),"aria-hidden":!m(g)},We(m(g)?C.activeText:C.inactiveText),11,hR)):ue("v-if",!0)],2)):ue("v-if",!0),fe("div",{class:W(m(i).e("action"))},[C.loading?(P(),he(m(Xe),{key:0,class:W(m(i).is("loading"))},{default:ye(()=>[ae(m(qu))]),_:1},8,["class"])):m(g)?de(C.$slots,"active-action",{key:1},()=>[C.activeActionIcon?(P(),he(m(Xe),{key:0},{default:ye(()=>[(P(),he(it(C.activeActionIcon)))]),_:1})):ue("v-if",!0)]):m(g)?ue("v-if",!0):de(C.$slots,"inactive-action",{key:2},()=>[C.inactiveActionIcon?(P(),he(m(Xe),{key:0},{default:ye(()=>[(P(),he(it(C.inactiveActionIcon)))]),_:1})):ue("v-if",!0)])],2)],6),!C.inlinePrompt&&(C.activeIcon||C.activeText)?(P(),Q("span",{key:1,class:W(m(h))},[C.activeIcon?(P(),he(m(Xe),{key:0},{default:ye(()=>[(P(),he(it(C.activeIcon)))]),_:1})):ue("v-if",!0),!C.activeIcon&&C.activeText?(P(),Q("span",{key:1,"aria-hidden":!m(g)},We(C.activeText),9,vR)):ue("v-if",!0)],2)):ue("v-if",!0)],10,fR))}});var yR=Ne(gR,[["__file","switch.vue"]]);const x8=yt(yR),Aa=Symbol("tabsRootContextKey"),bR=Ie({tabs:{type:we(Array),default:()=>Sa([])}}),Um="ElTabBar",wR=J({name:Um}),_R=J({...wR,props:bR,setup(e,{expose:t}){const n=e,r=rt(),o=Se(Aa);o||Sr(Um,"");const s=ke("tabs"),i=j(),a=j(),l=()=>{let c=0,f=0;const p=["top","bottom"].includes(o.props.tabPosition)?"width":"height",v=p==="width"?"x":"y",h=v==="x"?"left":"top";return n.tabs.every(d=>{var y,g;const _=(g=(y=r.parent)==null?void 0:y.refs)==null?void 0:g[`tab-${d.uid}`];if(!_)return!1;if(!d.active)return!0;c=_[`offset${cr(h)}`],f=_[`client${cr(p)}`];const b=window.getComputedStyle(_);return p==="width"&&(n.tabs.length>1&&(f-=Number.parseFloat(b.paddingLeft)+Number.parseFloat(b.paddingRight)),c+=Number.parseFloat(b.paddingLeft)),!1}),{[p]:`${f}px`,transform:`translate${cr(v)}(${c}px)`}},u=()=>a.value=l();return pe(()=>n.tabs,async()=>{await Ve(),u()},{immediate:!0}),Bt(i,()=>u()),t({ref:i,update:u}),(c,f)=>(P(),Q("div",{ref_key:"barRef",ref:i,class:W([m(s).e("active-bar"),m(s).is(m(o).props.tabPosition)]),style:ot(a.value)},null,6))}});var SR=Ne(_R,[["__file","tab-bar.vue"]]);const ER=Ie({panes:{type:we(Array),default:()=>Sa([])},currentName:{type:[String,Number],default:""},editable:Boolean,type:{type:String,values:["card","border-card",""],default:""},stretch:Boolean}),CR={tabClick:(e,t,n)=>n instanceof Event,tabRemove:(e,t)=>t instanceof Event},up="ElTabNav",OR=J({name:up,props:ER,emits:CR,setup(e,{expose:t,emit:n}){const r=rt(),o=Se(Aa);o||Sr(up,"");const s=ke("tabs"),i=F1(),a=J1(),l=j(),u=j(),c=j(),f=j(),p=j(!1),v=j(0),h=j(!1),d=j(!0),y=E(()=>["top","bottom"].includes(o.props.tabPosition)?"width":"height"),g=E(()=>({transform:`translate${y.value==="width"?"X":"Y"}(-${v.value}px)`})),_=()=>{if(!l.value)return;const I=l.value[`offset${cr(y.value)}`],k=v.value;if(!k)return;const z=k>I?k-I:0;v.value=z},b=()=>{if(!l.value||!u.value)return;const I=u.value[`offset${cr(y.value)}`],k=l.value[`offset${cr(y.value)}`],z=v.value;if(I-z<=k)return;const B=I-z>k*2?z+k:I-k;v.value=B},T=async()=>{const I=u.value;if(!p.value||!c.value||!l.value||!I)return;await Ve();const k=c.value.querySelector(".is-active");if(!k)return;const z=l.value,B=["top","bottom"].includes(o.props.tabPosition),K=k.getBoundingClientRect(),G=z.getBoundingClientRect(),R=B?I.offsetWidth-G.width:I.offsetHeight-G.height,F=v.value;let $=F;B?(K.leftG.right&&($=F+K.right-G.right)):(K.topG.bottom&&($=F+(K.bottom-G.bottom))),$=Math.max($,0),v.value=Math.min($,R)},C=()=>{var I;if(!u.value||!l.value)return;e.stretch&&((I=f.value)==null||I.update());const k=u.value[`offset${cr(y.value)}`],z=l.value[`offset${cr(y.value)}`],B=v.value;z0&&(v.value=0))},O=I=>{const k=I.code,{up:z,down:B,left:K,right:G}=On;if(![z,B,K,G].includes(k))return;const R=Array.from(I.currentTarget.querySelectorAll("[role=tab]:not(.is-disabled)")),F=R.indexOf(I.target);let $;k===K||k===z?F===0?$=R.length-1:$=F-1:F{d.value&&(h.value=!0)},L=()=>h.value=!1;return pe(i,I=>{I==="hidden"?d.value=!1:I==="visible"&&setTimeout(()=>d.value=!0,50)}),pe(a,I=>{I?setTimeout(()=>d.value=!0,50):d.value=!1}),Bt(c,C),Ue(()=>setTimeout(()=>T(),0)),Yr(()=>C()),t({scrollToActiveTab:T,removeFocus:L}),pe(()=>e.panes,()=>r.update(),{flush:"post",deep:!0}),()=>{const I=p.value?[ae("span",{class:[s.e("nav-prev"),s.is("disabled",!p.value.prev)],onClick:_},[ae(Xe,null,{default:()=>[ae(lC,null,null)]})]),ae("span",{class:[s.e("nav-next"),s.is("disabled",!p.value.next)],onClick:b},[ae(Xe,null,{default:()=>[ae(cC,null,null)]})])]:null,k=e.panes.map((z,B)=>{var K,G,R,F;const $=z.uid,se=z.props.disabled,me=(G=(K=z.props.name)!=null?K:z.index)!=null?G:`${B}`,Pe=!se&&(z.isClosable||e.editable);z.index=`${B}`;const je=Pe?ae(Xe,{class:"is-icon-close",onClick:Ee=>n("tabRemove",z,Ee)},{default:()=>[ae(Es,null,null)]}):null,Ce=((F=(R=z.slots).label)==null?void 0:F.call(R))||z.props.label,Oe=!se&&z.active?0:-1;return ae("div",{ref:`tab-${$}`,class:[s.e("item"),s.is(o.props.tabPosition),s.is("active",z.active),s.is("disabled",se),s.is("closable",Pe),s.is("focus",h.value)],id:`tab-${me}`,key:`tab-${$}`,"aria-controls":`pane-${me}`,role:"tab","aria-selected":z.active,tabindex:Oe,onFocus:()=>x(),onBlur:()=>L(),onClick:Ee=>{L(),n("tabClick",z,me,Ee)},onKeydown:Ee=>{Pe&&(Ee.code===On.delete||Ee.code===On.backspace)&&n("tabRemove",z,Ee)}},[Ce,je])});return ae("div",{ref:c,class:[s.e("nav-wrap"),s.is("scrollable",!!p.value),s.is(o.props.tabPosition)]},[I,ae("div",{class:s.e("nav-scroll"),ref:l},[ae("div",{class:[s.e("nav"),s.is(o.props.tabPosition),s.is("stretch",e.stretch&&["top","bottom"].includes(o.props.tabPosition))],ref:u,style:g.value,role:"tablist",onKeydown:O},[e.type?null:ae(SR,{ref:f,tabs:[...e.panes]},null),k])])])}}}),TR=Ie({type:{type:String,values:["card","border-card",""],default:""},closable:Boolean,addable:Boolean,modelValue:{type:[String,Number]},editable:Boolean,tabPosition:{type:String,values:["top","right","bottom","left"],default:"top"},beforeLeave:{type:we(Function),default:()=>!0},stretch:Boolean}),ol=e=>xe(e)||ze(e),xR={[Ge]:e=>ol(e),tabClick:(e,t)=>t instanceof Event,tabChange:e=>ol(e),edit:(e,t)=>["remove","add"].includes(t),tabRemove:e=>ol(e),tabAdd:()=>!0},AR=J({name:"ElTabs",props:TR,emits:xR,setup(e,{emit:t,slots:n,expose:r}){var o;const s=ke("tabs"),{children:i,addChild:a,removeChild:l}=vT(rt(),"ElTabPane"),u=j(),c=j((o=e.modelValue)!=null?o:"0"),f=async(d,y=!1)=>{var g,_,b;if(!(c.value===d||Kt(d)))try{await((g=e.beforeLeave)==null?void 0:g.call(e,d,c.value))!==!1&&(c.value=d,y&&(t(Ge,d),t("tabChange",d)),(b=(_=u.value)==null?void 0:_.removeFocus)==null||b.call(_))}catch{}},p=(d,y,g)=>{d.props.disabled||(f(y,!0),t("tabClick",d,g))},v=(d,y)=>{d.props.disabled||Kt(d.props.name)||(y.stopPropagation(),t("edit",d.props.name,"remove"),t("tabRemove",d.props.name))},h=()=>{t("edit",void 0,"add"),t("tabAdd")};return pe(()=>e.modelValue,d=>f(d)),pe(c,async()=>{var d;await Ve(),(d=u.value)==null||d.scrollToActiveTab()}),ut(Aa,{props:e,currentName:c,registerPane:a,unregisterPane:l}),r({currentName:c}),()=>{const d=n["add-icon"],y=e.editable||e.addable?ae("span",{class:s.e("new-tab"),tabindex:"0",onClick:h,onKeydown:b=>{b.code===On.enter&&h()}},[d?de(n,"add-icon"):ae(Xe,{class:s.is("icon-plus")},{default:()=>[ae(Vv,null,null)]})]):null,g=ae("div",{class:[s.e("header"),s.is(e.tabPosition)]},[y,ae(OR,{ref:u,currentName:c.value,editable:e.editable,type:e.type,panes:i.value,stretch:e.stretch,onTabClick:p,onTabRemove:v},null)]),_=ae("div",{class:s.e("content")},[de(n,"default")]);return ae("div",{class:[s.b(),s.m(e.tabPosition),{[s.m("card")]:e.type==="card",[s.m("border-card")]:e.type==="border-card"}]},[...e.tabPosition!=="bottom"?[g,_]:[_,g]])}}}),RR=Ie({label:{type:String,default:""},name:{type:[String,Number]},closable:Boolean,disabled:Boolean,lazy:Boolean}),PR=["id","aria-hidden","aria-labelledby"],qm="ElTabPane",IR=J({name:qm}),$R=J({...IR,props:RR,setup(e){const t=e,n=rt(),r=Xr(),o=Se(Aa);o||Sr(qm,"usage: ");const s=ke("tab-pane"),i=j(),a=E(()=>t.closable||o.props.closable),l=If(()=>{var v;return o.currentName.value===((v=t.name)!=null?v:i.value)}),u=j(l.value),c=E(()=>{var v;return(v=t.name)!=null?v:i.value}),f=If(()=>!t.lazy||u.value||l.value);pe(l,v=>{v&&(u.value=!0)});const p=Et({uid:n.uid,slots:r,props:t,paneName:c,active:l,index:i,isClosable:a});return Ue(()=>{o.registerPane(p)}),Jr(()=>{o.unregisterPane(p.uid)}),(v,h)=>m(f)?ht((P(),Q("div",{key:0,id:`pane-${m(c)}`,class:W(m(s).b()),role:"tabpanel","aria-hidden":!m(l),"aria-labelledby":`tab-${m(c)}`},[de(v.$slots,"default")],10,PR)),[[Pn,m(l)]]):ue("v-if",!0)}});var Wm=Ne($R,[["__file","tab-pane.vue"]]);const A8=yt(AR,{TabPane:Wm}),R8=eo(Wm),LR=Ie({type:{type:String,values:["primary","success","info","warning","danger",""],default:""},size:{type:String,values:Io,default:""},truncated:{type:Boolean},lineClamp:{type:[String,Number]},tag:{type:String,default:"span"}}),kR=J({name:"ElText"}),NR=J({...kR,props:LR,setup(e){const t=e,n=dn(),r=ke("text"),o=E(()=>[r.b(),r.m(t.type),r.m(n.value),r.is("truncated",t.truncated),r.is("line-clamp",!Kt(t.lineClamp))]);return(s,i)=>(P(),he(it(s.tag),{class:W(m(o)),style:ot({"-webkit-line-clamp":s.lineClamp})},{default:ye(()=>[de(s.$slots,"default")]),_:3},8,["class","style"]))}});var MR=Ne(NR,[["__file","text.vue"]]);const P8=yt(MR);function FR(e){let t;const n=j(!1),r=Et({...e,originalPosition:"",originalOverflow:"",visible:!1});function o(p){r.text=p}function s(){const p=r.parent,v=f.ns;if(!p.vLoadingAddClassList){let h=p.getAttribute("loading-number");h=Number.parseInt(h)-1,h?p.setAttribute("loading-number",h.toString()):(Ss(p,v.bm("parent","relative")),p.removeAttribute("loading-number")),Ss(p,v.bm("parent","hidden"))}i(),c.unmount()}function i(){var p,v;(v=(p=f.$el)==null?void 0:p.parentNode)==null||v.removeChild(f.$el)}function a(){var p;e.beforeClose&&!e.beforeClose()||(n.value=!0,clearTimeout(t),t=window.setTimeout(l,400),r.visible=!1,(p=e.closed)==null||p.call(e))}function l(){if(!n.value)return;const p=r.parent;n.value=!1,p.vLoadingAddClassList=void 0,s()}const c=h0(J({name:"ElLoading",setup(p,{expose:v}){const{ns:h,zIndex:d}=gm("loading");return v({ns:h,zIndex:d}),()=>{const y=r.spinner||r.svg,g=Bn("svg",{class:"circular",viewBox:r.svgViewBox?r.svgViewBox:"0 0 50 50",...y?{innerHTML:y}:{}},[Bn("circle",{class:"path",cx:"25",cy:"25",r:"20",fill:"none"})]),_=r.text?Bn("p",{class:h.b("text")},[r.text]):void 0;return Bn(Un,{name:h.b("fade"),onAfterLeave:l},{default:ye(()=>[ht(ae("div",{style:{backgroundColor:r.background||""},class:[h.b("mask"),r.customClass,r.fullscreen?"is-fullscreen":""]},[Bn("div",{class:h.b("spinner")},[g,_])]),[[Pn,r.visible]])])})}}})),f=c.mount(document.createElement("div"));return{...Gr(r),setText:o,removeElLoadingChild:i,close:a,handleAfterLeave:l,vm:f,get $el(){return f.$el}}}let hi;const ql=function(e={}){if(!nt)return;const t=BR(e);if(t.fullscreen&&hi)return hi;const n=FR({...t,closed:()=>{var o;(o=t.closed)==null||o.call(t),t.fullscreen&&(hi=void 0)}});DR(t,t.parent,n),cp(t,t.parent,n),t.parent.vLoadingAddClassList=()=>cp(t,t.parent,n);let r=t.parent.getAttribute("loading-number");return r?r=`${Number.parseInt(r)+1}`:r="1",t.parent.setAttribute("loading-number",r),t.parent.appendChild(n.$el),Ve(()=>n.visible.value=t.visible),t.fullscreen&&(hi=n),n},BR=e=>{var t,n,r,o;let s;return xe(e.target)?s=(t=document.querySelector(e.target))!=null?t:document.body:s=e.target||document.body,{parent:s===document.body||e.body?document.body:s,background:e.background||"",svg:e.svg||"",svgViewBox:e.svgViewBox||"",spinner:e.spinner||!1,text:e.text||"",fullscreen:s===document.body&&((n=e.fullscreen)!=null?n:!0),lock:(r=e.lock)!=null?r:!1,customClass:e.customClass||"",visible:(o=e.visible)!=null?o:!0,target:s}},DR=async(e,t,n)=>{const{nextZIndex:r}=n.vm.zIndex||n.vm._.exposed.zIndex,o={};if(e.fullscreen)n.originalPosition.value=lo(document.body,"position"),n.originalOverflow.value=lo(document.body,"overflow"),o.zIndex=r();else if(e.parent===document.body){n.originalPosition.value=lo(document.body,"position"),await Ve();for(const s of["top","left"]){const i=s==="top"?"scrollTop":"scrollLeft";o[s]=`${e.target.getBoundingClientRect()[s]+document.body[i]+document.documentElement[i]-Number.parseInt(lo(document.body,`margin-${s}`),10)}px`}for(const s of["height","width"])o[s]=`${e.target.getBoundingClientRect()[s]}px`}else n.originalPosition.value=lo(t,"position");for(const[s,i]of Object.entries(o))n.$el.style[s]=i},cp=(e,t,n)=>{const r=n.vm.ns||n.vm._.exposed.ns;["absolute","fixed","sticky"].includes(n.originalPosition.value)?Ss(t,r.bm("parent","relative")):Fl(t,r.bm("parent","relative")),e.fullscreen&&e.lock?Fl(t,r.bm("parent","hidden")):Ss(t,r.bm("parent","hidden"))},Ri=Symbol("ElLoading"),fp=(e,t)=>{var n,r,o,s;const i=t.instance,a=p=>Te(t.value)?t.value[p]:void 0,l=p=>{const v=xe(p)&&(i==null?void 0:i[p])||p;return v&&j(v)},u=p=>l(a(p)||e.getAttribute(`element-loading-${br(p)}`)),c=(n=a("fullscreen"))!=null?n:t.modifiers.fullscreen,f={text:u("text"),svg:u("svg"),svgViewBox:u("svgViewBox"),spinner:u("spinner"),background:u("background"),customClass:u("customClass"),fullscreen:c,target:(r=a("target"))!=null?r:c?void 0:e,body:(o=a("body"))!=null?o:t.modifiers.body,lock:(s=a("lock"))!=null?s:t.modifiers.lock};e[Ri]={options:f,instance:ql(f)}},jR=(e,t)=>{for(const n of Object.keys(t))qe(t[n])&&(t[n].value=e[n])},dp={mounted(e,t){t.value&&fp(e,t)},updated(e,t){const n=e[Ri];t.oldValue!==t.value&&(t.value&&!t.oldValue?fp(e,t):t.value&&t.oldValue?Te(t.value)&&jR(t.value,n.options):n==null||n.instance.close())},unmounted(e){var t;(t=e[Ri])==null||t.instance.close(),e[Ri]=null}},I8={install(e){e.directive("loading",dp),e.config.globalProperties.$loading=ql},directive:dp,service:ql},Gm=["success","info","warning","error"],_t=Sa({customClass:"",center:!1,dangerouslyUseHTMLString:!1,duration:3e3,icon:void 0,id:"",message:"",onClose:void 0,showClose:!1,type:"info",plain:!1,offset:16,zIndex:0,grouping:!1,repeatNum:1,appendTo:nt?document.body:void 0}),VR=Ie({customClass:{type:String,default:_t.customClass},center:{type:Boolean,default:_t.center},dangerouslyUseHTMLString:{type:Boolean,default:_t.dangerouslyUseHTMLString},duration:{type:Number,default:_t.duration},icon:{type:Pt,default:_t.icon},id:{type:String,default:_t.id},message:{type:we([String,Object,Function]),default:_t.message},onClose:{type:we(Function),default:_t.onClose},showClose:{type:Boolean,default:_t.showClose},type:{type:String,values:Gm,default:_t.type},plain:{type:Boolean,default:_t.plain},offset:{type:Number,default:_t.offset},zIndex:{type:Number,default:_t.zIndex},grouping:{type:Boolean,default:_t.grouping},repeatNum:{type:Number,default:_t.repeatNum}}),zR={destroy:()=>!0},on=vu([]),HR=e=>{const t=on.findIndex(o=>o.id===e),n=on[t];let r;return t>0&&(r=on[t-1]),{current:n,prev:r}},KR=e=>{const{prev:t}=HR(e);return t?t.vm.exposed.bottom.value:0},UR=(e,t)=>on.findIndex(r=>r.id===e)>0?16:t,qR=["id"],WR=["innerHTML"],GR=J({name:"ElMessage"}),YR=J({...GR,props:VR,emits:zR,setup(e,{expose:t}){const n=e,{Close:r}=BC,{ns:o,zIndex:s}=gm("message"),{currentZIndex:i,nextZIndex:a}=s,l=j(),u=j(!1),c=j(0);let f;const p=E(()=>n.type?n.type==="error"?"danger":n.type:"info"),v=E(()=>{const x=n.type;return{[o.bm("icon",x)]:x&&wd[x]}}),h=E(()=>n.icon||wd[n.type]||""),d=E(()=>KR(n.id)),y=E(()=>UR(n.id,n.offset)+d.value),g=E(()=>c.value+y.value),_=E(()=>({top:`${y.value}px`,zIndex:i.value}));function b(){n.duration!==0&&({stop:f}=Pl(()=>{C()},n.duration))}function T(){f==null||f()}function C(){u.value=!1}function O({code:x}){x===On.esc&&C()}return Ue(()=>{b(),a(),u.value=!0}),pe(()=>n.repeatNum,()=>{T(),b()}),an(document,"keydown",O),Bt(l,()=>{c.value=l.value.getBoundingClientRect().height}),t({visible:u,bottom:g,close:C}),(x,L)=>(P(),he(Un,{name:m(o).b("fade"),onBeforeLeave:x.onClose,onAfterLeave:L[0]||(L[0]=I=>x.$emit("destroy")),persisted:""},{default:ye(()=>[ht(fe("div",{id:x.id,ref_key:"messageRef",ref:l,class:W([m(o).b(),{[m(o).m(x.type)]:x.type},m(o).is("center",x.center),m(o).is("closable",x.showClose),m(o).is("plain",x.plain),x.customClass]),style:ot(m(_)),role:"alert",onMouseenter:T,onMouseleave:b},[x.repeatNum>1?(P(),he(m(Zx),{key:0,value:x.repeatNum,type:m(p),class:W(m(o).e("badge"))},null,8,["value","type","class"])):ue("v-if",!0),m(h)?(P(),he(m(Xe),{key:1,class:W([m(o).e("icon"),m(v)])},{default:ye(()=>[(P(),he(it(m(h))))]),_:1},8,["class"])):ue("v-if",!0),de(x.$slots,"default",{},()=>[x.dangerouslyUseHTMLString?(P(),Q(tt,{key:1},[ue(" Caution here, message could've been compromised, never use user's input as message "),fe("p",{class:W(m(o).e("content")),innerHTML:x.message},null,10,WR)],2112)):(P(),Q("p",{key:0,class:W(m(o).e("content"))},We(x.message),3))]),x.showClose?(P(),he(m(Xe),{key:2,class:W(m(o).e("closeBtn")),onClick:lt(C,["stop"])},{default:ye(()=>[ae(m(r))]),_:1},8,["class","onClick"])):ue("v-if",!0)],46,qR),[[Pn,u.value]])]),_:3},8,["name","onBeforeLeave"]))}});var JR=Ne(YR,[["__file","message.vue"]]);let XR=1;const Ym=e=>{const t=!e||xe(e)||Vn(e)||ve(e)?{message:e}:e,n={..._t,...t};if(!n.appendTo)n.appendTo=document.body;else if(xe(n.appendTo)){let r=document.querySelector(n.appendTo);So(r)||(r=document.body),n.appendTo=r}return n},ZR=e=>{const t=on.indexOf(e);if(t===-1)return;on.splice(t,1);const{handler:n}=e;n.close()},QR=({appendTo:e,...t},n)=>{const r=`message_${XR++}`,o=t.onClose,s=document.createElement("div"),i={...t,id:r,onClose:()=>{o==null||o(),ZR(c)},onDestroy:()=>{df(null,s)}},a=ae(JR,i,ve(i.message)||Vn(i.message)?{default:ve(i.message)?i.message:()=>i.message}:null);a.appContext=n||Ao._context,df(a,s),e.appendChild(s.firstElementChild);const l=a.component,c={id:r,vnode:a,vm:l,handler:{close:()=>{l.exposed.visible.value=!1}},props:a.component.props};return c},Ao=(e={},t)=>{if(!nt)return{close:()=>{}};if(ze(Fd.max)&&on.length>=Fd.max)return{close:()=>{}};const n=Ym(e);if(n.grouping&&on.length){const o=on.find(({vnode:s})=>{var i;return((i=s.props)==null?void 0:i.message)===n.message});if(o)return o.props.repeatNum+=1,o.props.type=n.type,o.handler}const r=QR(n,t);return on.push(r),r.handler};Gm.forEach(e=>{Ao[e]=(t={},n)=>{const r=Ym(t);return Ao({...r,type:e},n)}});function eP(e){for(const t of on)(!e||e===t.props.type)&&t.handler.close()}Ao.closeAll=eP;Ao._context=null;const $8=DC(Ao,"$message");function Jm(e,t){return function(){return e.apply(t,arguments)}}const{toString:tP}=Object.prototype,{getPrototypeOf:uc}=Object,Ra=(e=>t=>{const n=tP.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),vn=e=>(e=e.toLowerCase(),t=>Ra(t)===e),Pa=e=>t=>typeof t===e,{isArray:Mo}=Array,As=Pa("undefined");function nP(e){return e!==null&&!As(e)&&e.constructor!==null&&!As(e.constructor)&&Gt(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const Xm=vn("ArrayBuffer");function rP(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Xm(e.buffer),t}const oP=Pa("string"),Gt=Pa("function"),Zm=Pa("number"),Ia=e=>e!==null&&typeof e=="object",sP=e=>e===!0||e===!1,Pi=e=>{if(Ra(e)!=="object")return!1;const t=uc(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},iP=vn("Date"),aP=vn("File"),lP=vn("Blob"),uP=vn("FileList"),cP=e=>Ia(e)&&Gt(e.pipe),fP=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Gt(e.append)&&((t=Ra(e))==="formdata"||t==="object"&&Gt(e.toString)&&e.toString()==="[object FormData]"))},dP=vn("URLSearchParams"),[pP,hP,vP,mP]=["ReadableStream","Request","Response","Headers"].map(vn),gP=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Hs(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,o;if(typeof e!="object"&&(e=[e]),Mo(e))for(r=0,o=e.length;r0;)if(o=n[r],t===o.toLowerCase())return o;return null}const eg=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,tg=e=>!As(e)&&e!==eg;function Wl(){const{caseless:e}=tg(this)&&this||{},t={},n=(r,o)=>{const s=e&&Qm(t,o)||o;Pi(t[s])&&Pi(r)?t[s]=Wl(t[s],r):Pi(r)?t[s]=Wl({},r):Mo(r)?t[s]=r.slice():t[s]=r};for(let r=0,o=arguments.length;r(Hs(t,(o,s)=>{n&&Gt(o)?e[s]=Jm(o,n):e[s]=o},{allOwnKeys:r}),e),bP=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),wP=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},_P=(e,t,n,r)=>{let o,s,i;const a={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),s=o.length;s-- >0;)i=o[s],(!r||r(i,e,t))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&uc(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},SP=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},EP=e=>{if(!e)return null;if(Mo(e))return e;let t=e.length;if(!Zm(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},CP=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&uc(Uint8Array)),OP=(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let o;for(;(o=r.next())&&!o.done;){const s=o.value;t.call(e,s[0],s[1])}},TP=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},xP=vn("HTMLFormElement"),AP=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,o){return r.toUpperCase()+o}),pp=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),RP=vn("RegExp"),ng=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Hs(n,(o,s)=>{let i;(i=t(o,s,e))!==!1&&(r[s]=i||o)}),Object.defineProperties(e,r)},PP=e=>{ng(e,(t,n)=>{if(Gt(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(Gt(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},IP=(e,t)=>{const n={},r=o=>{o.forEach(s=>{n[s]=!0})};return Mo(e)?r(e):r(String(e).split(t)),n},$P=()=>{},LP=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t,sl="abcdefghijklmnopqrstuvwxyz",hp="0123456789",rg={DIGIT:hp,ALPHA:sl,ALPHA_DIGIT:sl+sl.toUpperCase()+hp},kP=(e=16,t=rg.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function NP(e){return!!(e&&Gt(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const MP=e=>{const t=new Array(10),n=(r,o)=>{if(Ia(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[o]=r;const s=Mo(r)?[]:{};return Hs(r,(i,a)=>{const l=n(i,o+1);!As(l)&&(s[a]=l)}),t[o]=void 0,s}}return r};return n(e,0)},FP=vn("AsyncFunction"),BP=e=>e&&(Ia(e)||Gt(e))&&Gt(e.then)&&Gt(e.catch),V={isArray:Mo,isArrayBuffer:Xm,isBuffer:nP,isFormData:fP,isArrayBufferView:rP,isString:oP,isNumber:Zm,isBoolean:sP,isObject:Ia,isPlainObject:Pi,isReadableStream:pP,isRequest:hP,isResponse:vP,isHeaders:mP,isUndefined:As,isDate:iP,isFile:aP,isBlob:lP,isRegExp:RP,isFunction:Gt,isStream:cP,isURLSearchParams:dP,isTypedArray:CP,isFileList:uP,forEach:Hs,merge:Wl,extend:yP,trim:gP,stripBOM:bP,inherits:wP,toFlatObject:_P,kindOf:Ra,kindOfTest:vn,endsWith:SP,toArray:EP,forEachEntry:OP,matchAll:TP,isHTMLForm:xP,hasOwnProperty:pp,hasOwnProp:pp,reduceDescriptors:ng,freezeMethods:PP,toObjectSet:IP,toCamelCase:AP,noop:$P,toFiniteNumber:LP,findKey:Qm,global:eg,isContextDefined:tg,ALPHABET:rg,generateString:kP,isSpecCompliantForm:NP,toJSONObject:MP,isAsyncFn:FP,isThenable:BP};function Ae(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}V.inherits(Ae,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:V.toJSONObject(this.config),code:this.code,status:this.response&&this.response.status?this.response.status:null}}});const og=Ae.prototype,sg={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{sg[e]={value:e}});Object.defineProperties(Ae,sg);Object.defineProperty(og,"isAxiosError",{value:!0});Ae.from=(e,t,n,r,o,s)=>{const i=Object.create(og);return V.toFlatObject(e,i,function(l){return l!==Error.prototype},a=>a!=="isAxiosError"),Ae.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};const DP=null;function Gl(e){return V.isPlainObject(e)||V.isArray(e)}function ig(e){return V.endsWith(e,"[]")?e.slice(0,-2):e}function vp(e,t,n){return e?e.concat(t).map(function(o,s){return o=ig(o),!n&&s?"["+o+"]":o}).join(n?".":""):t}function jP(e){return V.isArray(e)&&!e.some(Gl)}const VP=V.toFlatObject(V,{},null,function(t){return/^is[A-Z]/.test(t)});function $a(e,t,n){if(!V.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=V.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(d,y){return!V.isUndefined(y[d])});const r=n.metaTokens,o=n.visitor||c,s=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&V.isSpecCompliantForm(t);if(!V.isFunction(o))throw new TypeError("visitor must be a function");function u(h){if(h===null)return"";if(V.isDate(h))return h.toISOString();if(!l&&V.isBlob(h))throw new Ae("Blob is not supported. Use a Buffer instead.");return V.isArrayBuffer(h)||V.isTypedArray(h)?l&&typeof Blob=="function"?new Blob([h]):Buffer.from(h):h}function c(h,d,y){let g=h;if(h&&!y&&typeof h=="object"){if(V.endsWith(d,"{}"))d=r?d:d.slice(0,-2),h=JSON.stringify(h);else if(V.isArray(h)&&jP(h)||(V.isFileList(h)||V.endsWith(d,"[]"))&&(g=V.toArray(h)))return d=ig(d),g.forEach(function(b,T){!(V.isUndefined(b)||b===null)&&t.append(i===!0?vp([d],T,s):i===null?d:d+"[]",u(b))}),!1}return Gl(h)?!0:(t.append(vp(y,d,s),u(h)),!1)}const f=[],p=Object.assign(VP,{defaultVisitor:c,convertValue:u,isVisitable:Gl});function v(h,d){if(!V.isUndefined(h)){if(f.indexOf(h)!==-1)throw Error("Circular reference detected in "+d.join("."));f.push(h),V.forEach(h,function(g,_){(!(V.isUndefined(g)||g===null)&&o.call(t,g,V.isString(_)?_.trim():_,d,p))===!0&&v(g,d?d.concat(_):[_])}),f.pop()}}if(!V.isObject(e))throw new TypeError("data must be an object");return v(e),t}function mp(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function cc(e,t){this._pairs=[],e&&$a(e,this,t)}const ag=cc.prototype;ag.append=function(t,n){this._pairs.push([t,n])};ag.toString=function(t){const n=t?function(r){return t.call(this,r,mp)}:mp;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function zP(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function lg(e,t,n){if(!t)return e;const r=n&&n.encode||zP,o=n&&n.serialize;let s;if(o?s=o(t,n):s=V.isURLSearchParams(t)?t.toString():new cc(t,n).toString(r),s){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}class gp{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){V.forEach(this.handlers,function(r){r!==null&&t(r)})}}const ug={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},HP=typeof URLSearchParams<"u"?URLSearchParams:cc,KP=typeof FormData<"u"?FormData:null,UP=typeof Blob<"u"?Blob:null,qP={isBrowser:!0,classes:{URLSearchParams:HP,FormData:KP,Blob:UP},protocols:["http","https","file","blob","url","data"]},fc=typeof window<"u"&&typeof document<"u",WP=(e=>fc&&["ReactNative","NativeScript","NS"].indexOf(e)<0)(typeof navigator<"u"&&navigator.product),GP=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",YP=fc&&window.location.href||"http://localhost",JP=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:fc,hasStandardBrowserEnv:WP,hasStandardBrowserWebWorkerEnv:GP,origin:YP},Symbol.toStringTag,{value:"Module"})),ln={...JP,...qP};function XP(e,t){return $a(e,new ln.classes.URLSearchParams,Object.assign({visitor:function(n,r,o,s){return ln.isNode&&V.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)}},t))}function ZP(e){return V.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function QP(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r=n.length;return i=!i&&V.isArray(o)?o.length:i,l?(V.hasOwnProp(o,i)?o[i]=[o[i],r]:o[i]=r,!a):((!o[i]||!V.isObject(o[i]))&&(o[i]=[]),t(n,r,o[i],s)&&V.isArray(o[i])&&(o[i]=QP(o[i])),!a)}if(V.isFormData(e)&&V.isFunction(e.entries)){const n={};return V.forEachEntry(e,(r,o)=>{t(ZP(r),o,n,0)}),n}return null}function eI(e,t,n){if(V.isString(e))try{return(t||JSON.parse)(e),V.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(n||JSON.stringify)(e)}const Ks={transitional:ug,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",o=r.indexOf("application/json")>-1,s=V.isObject(t);if(s&&V.isHTMLForm(t)&&(t=new FormData(t)),V.isFormData(t))return o?JSON.stringify(cg(t)):t;if(V.isArrayBuffer(t)||V.isBuffer(t)||V.isStream(t)||V.isFile(t)||V.isBlob(t)||V.isReadableStream(t))return t;if(V.isArrayBufferView(t))return t.buffer;if(V.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return XP(t,this.formSerializer).toString();if((a=V.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return $a(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return s||o?(n.setContentType("application/json",!1),eI(t)):t}],transformResponse:[function(t){const n=this.transitional||Ks.transitional,r=n&&n.forcedJSONParsing,o=this.responseType==="json";if(V.isResponse(t)||V.isReadableStream(t))return t;if(t&&V.isString(t)&&(r&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t)}catch(a){if(i)throw a.name==="SyntaxError"?Ae.from(a,Ae.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:ln.classes.FormData,Blob:ln.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};V.forEach(["delete","get","head","post","put","patch"],e=>{Ks.headers[e]={}});const tI=V.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),nI=e=>{const t={};let n,r,o;return e&&e.split(` -`).forEach(function(i){o=i.indexOf(":"),n=i.substring(0,o).trim().toLowerCase(),r=i.substring(o+1).trim(),!(!n||t[n]&&tI[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},yp=Symbol("internals");function Uo(e){return e&&String(e).trim().toLowerCase()}function Ii(e){return e===!1||e==null?e:V.isArray(e)?e.map(Ii):String(e)}function rI(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const oI=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function il(e,t,n,r,o){if(V.isFunction(r))return r.call(this,t,n);if(o&&(t=n),!!V.isString(t)){if(V.isString(r))return t.indexOf(r)!==-1;if(V.isRegExp(r))return r.test(t)}}function sI(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function iI(e,t){const n=V.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(o,s,i){return this[r].call(this,t,o,s,i)},configurable:!0})})}class Lt{constructor(t){t&&this.set(t)}set(t,n,r){const o=this;function s(a,l,u){const c=Uo(l);if(!c)throw new Error("header name must be a non-empty string");const f=V.findKey(o,c);(!f||o[f]===void 0||u===!0||u===void 0&&o[f]!==!1)&&(o[f||l]=Ii(a))}const i=(a,l)=>V.forEach(a,(u,c)=>s(u,c,l));if(V.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(V.isString(t)&&(t=t.trim())&&!oI(t))i(nI(t),n);else if(V.isHeaders(t))for(const[a,l]of t.entries())s(l,a,r);else t!=null&&s(n,t,r);return this}get(t,n){if(t=Uo(t),t){const r=V.findKey(this,t);if(r){const o=this[r];if(!n)return o;if(n===!0)return rI(o);if(V.isFunction(n))return n.call(this,o,r);if(V.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=Uo(t),t){const r=V.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||il(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let o=!1;function s(i){if(i=Uo(i),i){const a=V.findKey(r,i);a&&(!n||il(r,r[a],a,n))&&(delete r[a],o=!0)}}return V.isArray(t)?t.forEach(s):s(t),o}clear(t){const n=Object.keys(this);let r=n.length,o=!1;for(;r--;){const s=n[r];(!t||il(this,this[s],s,t,!0))&&(delete this[s],o=!0)}return o}normalize(t){const n=this,r={};return V.forEach(this,(o,s)=>{const i=V.findKey(r,s);if(i){n[i]=Ii(o),delete n[s];return}const a=t?sI(s):String(s).trim();a!==s&&delete n[s],n[a]=Ii(o),r[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return V.forEach(this,(r,o)=>{r!=null&&r!==!1&&(n[o]=t&&V.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` -`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(o=>r.set(o)),r}static accessor(t){const r=(this[yp]=this[yp]={accessors:{}}).accessors,o=this.prototype;function s(i){const a=Uo(i);r[a]||(iI(o,i),r[a]=!0)}return V.isArray(t)?t.forEach(s):s(t),this}}Lt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);V.reduceDescriptors(Lt.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});V.freezeMethods(Lt);function al(e,t){const n=this||Ks,r=t||n,o=Lt.from(r.headers);let s=r.data;return V.forEach(e,function(a){s=a.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function fg(e){return!!(e&&e.__CANCEL__)}function Fo(e,t,n){Ae.call(this,e??"canceled",Ae.ERR_CANCELED,t,n),this.name="CanceledError"}V.inherits(Fo,Ae,{__CANCEL__:!0});function dg(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new Ae("Request failed with status code "+n.status,[Ae.ERR_BAD_REQUEST,Ae.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function aI(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function lI(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o=0,s=0,i;return t=t!==void 0?t:1e3,function(l){const u=Date.now(),c=r[s];i||(i=u),n[o]=l,r[o]=u;let f=s,p=0;for(;f!==o;)p+=n[f++],f=f%e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),u-ir)return o&&(clearTimeout(o),o=null),n=a,e.apply(null,arguments);o||(o=setTimeout(()=>(o=null,n=Date.now(),e.apply(null,arguments)),r-(a-n)))}}const Xi=(e,t,n=3)=>{let r=0;const o=lI(50,250);return uI(s=>{const i=s.loaded,a=s.lengthComputable?s.total:void 0,l=i-r,u=o(l),c=i<=a;r=i;const f={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:u||void 0,estimated:u&&a&&c?(a-i)/u:void 0,event:s,lengthComputable:a!=null};f[t?"download":"upload"]=!0,e(f)},n)},cI=ln.hasStandardBrowserEnv?function(){const t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement("a");let r;function o(s){let i=s;return t&&(n.setAttribute("href",i),i=n.href),n.setAttribute("href",i),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:n.pathname.charAt(0)==="/"?n.pathname:"/"+n.pathname}}return r=o(window.location.href),function(i){const a=V.isString(i)?o(i):i;return a.protocol===r.protocol&&a.host===r.host}}():function(){return function(){return!0}}(),fI=ln.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];V.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),V.isString(r)&&i.push("path="+r),V.isString(o)&&i.push("domain="+o),s===!0&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function dI(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function pI(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function pg(e,t){return e&&!dI(t)?pI(e,t):t}const bp=e=>e instanceof Lt?{...e}:e;function Wr(e,t){t=t||{};const n={};function r(u,c,f){return V.isPlainObject(u)&&V.isPlainObject(c)?V.merge.call({caseless:f},u,c):V.isPlainObject(c)?V.merge({},c):V.isArray(c)?c.slice():c}function o(u,c,f){if(V.isUndefined(c)){if(!V.isUndefined(u))return r(void 0,u,f)}else return r(u,c,f)}function s(u,c){if(!V.isUndefined(c))return r(void 0,c)}function i(u,c){if(V.isUndefined(c)){if(!V.isUndefined(u))return r(void 0,u)}else return r(void 0,c)}function a(u,c,f){if(f in t)return r(u,c);if(f in e)return r(void 0,u)}const l={url:s,method:s,data:s,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:a,headers:(u,c)=>o(bp(u),bp(c),!0)};return V.forEach(Object.keys(Object.assign({},e,t)),function(c){const f=l[c]||o,p=f(e[c],t[c],c);V.isUndefined(p)&&f!==a||(n[c]=p)}),n}const hg=e=>{const t=Wr({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:o,xsrfCookieName:s,headers:i,auth:a}=t;t.headers=i=Lt.from(i),t.url=lg(pg(t.baseURL,t.url),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):"")));let l;if(V.isFormData(n)){if(ln.hasStandardBrowserEnv||ln.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if((l=i.getContentType())!==!1){const[u,...c]=l?l.split(";").map(f=>f.trim()).filter(Boolean):[];i.setContentType([u||"multipart/form-data",...c].join("; "))}}if(ln.hasStandardBrowserEnv&&(r&&V.isFunction(r)&&(r=r(t)),r||r!==!1&&cI(t.url))){const u=o&&s&&fI.read(s);u&&i.set(o,u)}return t},hI=typeof XMLHttpRequest<"u",vI=hI&&function(e){return new Promise(function(n,r){const o=hg(e);let s=o.data;const i=Lt.from(o.headers).normalize();let{responseType:a}=o,l;function u(){o.cancelToken&&o.cancelToken.unsubscribe(l),o.signal&&o.signal.removeEventListener("abort",l)}let c=new XMLHttpRequest;c.open(o.method.toUpperCase(),o.url,!0),c.timeout=o.timeout;function f(){if(!c)return;const v=Lt.from("getAllResponseHeaders"in c&&c.getAllResponseHeaders()),d={data:!a||a==="text"||a==="json"?c.responseText:c.response,status:c.status,statusText:c.statusText,headers:v,config:e,request:c};dg(function(g){n(g),u()},function(g){r(g),u()},d),c=null}"onloadend"in c?c.onloadend=f:c.onreadystatechange=function(){!c||c.readyState!==4||c.status===0&&!(c.responseURL&&c.responseURL.indexOf("file:")===0)||setTimeout(f)},c.onabort=function(){c&&(r(new Ae("Request aborted",Ae.ECONNABORTED,o,c)),c=null)},c.onerror=function(){r(new Ae("Network Error",Ae.ERR_NETWORK,o,c)),c=null},c.ontimeout=function(){let h=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const d=o.transitional||ug;o.timeoutErrorMessage&&(h=o.timeoutErrorMessage),r(new Ae(h,d.clarifyTimeoutError?Ae.ETIMEDOUT:Ae.ECONNABORTED,o,c)),c=null},s===void 0&&i.setContentType(null),"setRequestHeader"in c&&V.forEach(i.toJSON(),function(h,d){c.setRequestHeader(d,h)}),V.isUndefined(o.withCredentials)||(c.withCredentials=!!o.withCredentials),a&&a!=="json"&&(c.responseType=o.responseType),typeof o.onDownloadProgress=="function"&&c.addEventListener("progress",Xi(o.onDownloadProgress,!0)),typeof o.onUploadProgress=="function"&&c.upload&&c.upload.addEventListener("progress",Xi(o.onUploadProgress)),(o.cancelToken||o.signal)&&(l=v=>{c&&(r(!v||v.type?new Fo(null,e,c):v),c.abort(),c=null)},o.cancelToken&&o.cancelToken.subscribe(l),o.signal&&(o.signal.aborted?l():o.signal.addEventListener("abort",l)));const p=aI(o.url);if(p&&ln.protocols.indexOf(p)===-1){r(new Ae("Unsupported protocol "+p+":",Ae.ERR_BAD_REQUEST,e));return}c.send(s||null)})},mI=(e,t)=>{let n=new AbortController,r;const o=function(l){if(!r){r=!0,i();const u=l instanceof Error?l:this.reason;n.abort(u instanceof Ae?u:new Fo(u instanceof Error?u.message:u))}};let s=t&&setTimeout(()=>{o(new Ae(`timeout ${t} of ms exceeded`,Ae.ETIMEDOUT))},t);const i=()=>{e&&(s&&clearTimeout(s),s=null,e.forEach(l=>{l&&(l.removeEventListener?l.removeEventListener("abort",o):l.unsubscribe(o))}),e=null)};e.forEach(l=>l&&l.addEventListener&&l.addEventListener("abort",o));const{signal:a}=n;return a.unsubscribe=i,[a,()=>{s&&clearTimeout(s),s=null}]},gI=function*(e,t){let n=e.byteLength;if(!t||n{const s=yI(e,t,o);let i=0;return new ReadableStream({type:"bytes",async pull(a){const{done:l,value:u}=await s.next();if(l){a.close(),r();return}let c=u.byteLength;n&&n(i+=c),a.enqueue(new Uint8Array(u))},cancel(a){return r(a),s.return()}},{highWaterMark:2})},_p=(e,t)=>{const n=e!=null;return r=>setTimeout(()=>t({lengthComputable:n,total:e,loaded:r}))},La=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",vg=La&&typeof ReadableStream=="function",Yl=La&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),bI=vg&&(()=>{let e=!1;const t=new Request(ln.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t})(),Sp=64*1024,Jl=vg&&!!(()=>{try{return V.isReadableStream(new Response("").body)}catch{}})(),Zi={stream:Jl&&(e=>e.body)};La&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!Zi[t]&&(Zi[t]=V.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new Ae(`Response type '${t}' is not supported`,Ae.ERR_NOT_SUPPORT,r)})})})(new Response);const wI=async e=>{if(e==null)return 0;if(V.isBlob(e))return e.size;if(V.isSpecCompliantForm(e))return(await new Request(e).arrayBuffer()).byteLength;if(V.isArrayBufferView(e))return e.byteLength;if(V.isURLSearchParams(e)&&(e=e+""),V.isString(e))return(await Yl(e)).byteLength},_I=async(e,t)=>{const n=V.toFiniteNumber(e.getContentLength());return n??wI(t)},SI=La&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:s,timeout:i,onDownloadProgress:a,onUploadProgress:l,responseType:u,headers:c,withCredentials:f="same-origin",fetchOptions:p}=hg(e);u=u?(u+"").toLowerCase():"text";let[v,h]=o||s||i?mI([o,s],i):[],d,y;const g=()=>{!d&&setTimeout(()=>{v&&v.unsubscribe()}),d=!0};let _;try{if(l&&bI&&n!=="get"&&n!=="head"&&(_=await _I(c,r))!==0){let O=new Request(t,{method:"POST",body:r,duplex:"half"}),x;V.isFormData(r)&&(x=O.headers.get("content-type"))&&c.setContentType(x),O.body&&(r=wp(O.body,Sp,_p(_,Xi(l)),null,Yl))}V.isString(f)||(f=f?"cors":"omit"),y=new Request(t,{...p,signal:v,method:n.toUpperCase(),headers:c.normalize().toJSON(),body:r,duplex:"half",withCredentials:f});let b=await fetch(y);const T=Jl&&(u==="stream"||u==="response");if(Jl&&(a||T)){const O={};["status","statusText","headers"].forEach(L=>{O[L]=b[L]});const x=V.toFiniteNumber(b.headers.get("content-length"));b=new Response(wp(b.body,Sp,a&&_p(x,Xi(a,!0)),T&&g,Yl),O)}u=u||"text";let C=await Zi[V.findKey(Zi,u)||"text"](b,e);return!T&&g(),h&&h(),await new Promise((O,x)=>{dg(O,x,{data:C,headers:Lt.from(b.headers),status:b.status,statusText:b.statusText,config:e,request:y})})}catch(b){throw g(),b&&b.name==="TypeError"&&/fetch/i.test(b.message)?Object.assign(new Ae("Network Error",Ae.ERR_NETWORK,e,y),{cause:b.cause||b}):Ae.from(b,b&&b.code,e,y)}}),Xl={http:DP,xhr:vI,fetch:SI};V.forEach(Xl,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Ep=e=>`- ${e}`,EI=e=>V.isFunction(e)||e===null||e===!1,mg={getAdapter:e=>{e=V.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s`adapter ${a} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?s.length>1?`since : -`+s.map(Ep).join(` -`):" "+Ep(s[0]):"as no adapter specified";throw new Ae("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:Xl};function ll(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Fo(null,e)}function Cp(e){return ll(e),e.headers=Lt.from(e.headers),e.data=al.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),mg.getAdapter(e.adapter||Ks.adapter)(e).then(function(r){return ll(e),r.data=al.call(e,e.transformResponse,r),r.headers=Lt.from(r.headers),r},function(r){return fg(r)||(ll(e),r&&r.response&&(r.response.data=al.call(e,e.transformResponse,r.response),r.response.headers=Lt.from(r.response.headers))),Promise.reject(r)})}const gg="1.7.2",dc={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{dc[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const Op={};dc.transitional=function(t,n,r){function o(s,i){return"[Axios v"+gg+"] Transitional option '"+s+"'"+i+(r?". "+r:"")}return(s,i,a)=>{if(t===!1)throw new Ae(o(i," has been removed"+(n?" in "+n:"")),Ae.ERR_DEPRECATED);return n&&!Op[i]&&(Op[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(s,i,a):!0}};function CI(e,t,n){if(typeof e!="object")throw new Ae("options must be an object",Ae.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const s=r[o],i=t[s];if(i){const a=e[s],l=a===void 0||i(a,s,e);if(l!==!0)throw new Ae("option "+s+" must be "+l,Ae.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Ae("Unknown option "+s,Ae.ERR_BAD_OPTION)}}const Zl={assertOptions:CI,validators:dc},er=Zl.validators;class Vr{constructor(t){this.defaults=t,this.interceptors={request:new gp,response:new gp}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let o;Error.captureStackTrace?Error.captureStackTrace(o={}):o=new Error;const s=o.stack?o.stack.replace(/^.+\n/,""):"";try{r.stack?s&&!String(r.stack).endsWith(s.replace(/^.+\n.+\n/,""))&&(r.stack+=` -`+s):r.stack=s}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=Wr(this.defaults,n);const{transitional:r,paramsSerializer:o,headers:s}=n;r!==void 0&&Zl.assertOptions(r,{silentJSONParsing:er.transitional(er.boolean),forcedJSONParsing:er.transitional(er.boolean),clarifyTimeoutError:er.transitional(er.boolean)},!1),o!=null&&(V.isFunction(o)?n.paramsSerializer={serialize:o}:Zl.assertOptions(o,{encode:er.function,serialize:er.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=s&&V.merge(s.common,s[n.method]);s&&V.forEach(["delete","get","head","post","put","patch","common"],h=>{delete s[h]}),n.headers=Lt.concat(i,s);const a=[];let l=!0;this.interceptors.request.forEach(function(d){typeof d.runWhen=="function"&&d.runWhen(n)===!1||(l=l&&d.synchronous,a.unshift(d.fulfilled,d.rejected))});const u=[];this.interceptors.response.forEach(function(d){u.push(d.fulfilled,d.rejected)});let c,f=0,p;if(!l){const h=[Cp.bind(this),void 0];for(h.unshift.apply(h,a),h.push.apply(h,u),p=h.length,c=Promise.resolve(n);f{if(!r._listeners)return;let s=r._listeners.length;for(;s-- >0;)r._listeners[s](o);r._listeners=null}),this.promise.then=o=>{let s;const i=new Promise(a=>{r.subscribe(a),s=a}).then(o);return i.cancel=function(){r.unsubscribe(s)},i},t(function(s,i,a){r.reason||(r.reason=new Fo(s,i,a),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}static source(){let t;return{token:new pc(function(o){t=o}),cancel:t}}}function OI(e){return function(n){return e.apply(null,n)}}function TI(e){return V.isObject(e)&&e.isAxiosError===!0}const Ql={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(Ql).forEach(([e,t])=>{Ql[t]=e});function yg(e){const t=new Vr(e),n=Jm(Vr.prototype.request,t);return V.extend(n,Vr.prototype,t,{allOwnKeys:!0}),V.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return yg(Wr(e,o))},n}const mt=yg(Ks);mt.Axios=Vr;mt.CanceledError=Fo;mt.CancelToken=pc;mt.isCancel=fg;mt.VERSION=gg;mt.toFormData=$a;mt.AxiosError=Ae;mt.Cancel=mt.CanceledError;mt.all=function(t){return Promise.all(t)};mt.spread=OI;mt.isAxiosError=TI;mt.mergeConfig=Wr;mt.AxiosHeaders=Lt;mt.formToJSON=e=>cg(V.isHTMLForm(e)?new FormData(e):e);mt.getAdapter=mg.getAdapter;mt.HttpStatusCode=Ql;mt.default=mt;function Tp(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function vi(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);nthis.range.start)){var r=Math.max(n-this.param.buffer,0);this.checkRange(r,this.getEndByStart(r))}}},{key:"handleBehind",value:function(){var n=this.getScrollOvers();nn&&(i=o-1)}return r>0?--r:0}},{key:"getIndexOffset",value:function(n){if(!n)return 0;for(var r=0,o=0,s=0;s=F&&r("tobottom")},g=function(G){var R=v(),F=h(),$=d();R<0||R+F>$+1||!$||(f.handleScroll(R),y(R,F,$,G))},_=function(){var G=t.dataKey,R=t.dataSources,F=R===void 0?[]:R;return F.map(function($){return typeof G=="function"?G($):$[G]})},b=function(G){l.value=G},T=function(){f=new MI({slotHeaderSize:0,slotFooterSize:0,keeps:t.keeps,estimateSize:t.estimateSize,buffer:Math.round(t.keeps/3),uniqueIds:_()},b),l.value=f.getRange()},C=function(G){if(G>=t.dataSources.length-1)k();else{var R=f.getOffset(G);O(R)}},O=function(G){t.pageMode?(document.body[a]=G,document.documentElement[a]=G):u.value&&(u.value[a]=G)},x=function(){for(var G=[],R=l.value,F=R.start,$=R.end,se=t.dataSources,me=t.dataKey,Pe=t.itemClass,je=t.itemTag,Ce=t.itemStyle,Oe=t.extraProps,Ee=t.dataComponent,Ze=t.itemScopedSlots,$e=F;$e<=$;$e++){var A=se[$e];if(A){var q=typeof me=="function"?me(A):A[me];typeof q=="string"||typeof q=="number"?G.push(ae(jI,{index:$e,tag:je,event:as.ITEM,horizontal:i,uniqueKey:q,source:A,extraProps:Oe,component:Ee,scopedSlots:Ze,style:Ce,class:"".concat(Pe).concat(t.itemClassAdd?" "+t.itemClassAdd($e):""),onItemResize:L},null)):console.warn("Cannot get the data-key '".concat(me,"' from data-sources."))}else console.warn("Cannot get the index '".concat($e,"' from data-sources."))}return G},L=function(G,R){f.saveSize(G,R),r("resized",G,R)},I=function(G,R,F){G===co.HEADER?f.updateParam("slotHeaderSize",R):G===co.FOOTER&&f.updateParam("slotFooterSize",R),F&&f.handleSlotSizeChange()},k=function K(){if(c.value){var G=c.value[i?"offsetLeft":"offsetTop"];O(G),setTimeout(function(){v()+h()wg=e,_g=Symbol();function tu(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var ls;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(ls||(ls={}));function k8(){const e=Vp(!0),t=e.run(()=>j({}));let n=[],r=[];const o=gu({install(s){ka(o),o._a=s,s.provide(_g,o),s.config.globalProperties.$pinia=o,r.forEach(i=>n.push(i)),r=[]},use(s){return!this._a&&!w1?r.push(s):n.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const Sg=()=>{};function Rp(e,t,n,r=Sg){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&lu()&&uu(o),o}function io(e,...t){e.slice().forEach(n=>{n(...t)})}const VI=e=>e();function nu(e,t){e instanceof Map&&t instanceof Map&&t.forEach((n,r)=>e.set(r,n)),e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],o=e[n];tu(o)&&tu(r)&&e.hasOwnProperty(n)&&!qe(r)&&!hr(r)?e[n]=nu(o,r):e[n]=r}return e}const zI=Symbol();function HI(e){return!tu(e)||!e.hasOwnProperty(zI)}const{assign:or}=Object;function KI(e){return!!(qe(e)&&e.effect)}function UI(e,t,n,r){const{state:o,actions:s,getters:i}=t,a=n.state.value[e];let l;function u(){a||(n.state.value[e]=o?o():{});const c=Gr(n.state.value[e]);return or(c,s,Object.keys(i||{}).reduce((f,p)=>(f[p]=gu(E(()=>{ka(n);const v=n._s.get(e);return i[p].call(v,v)})),f),{}))}return l=Eg(e,u,t,n,r,!0),l}function Eg(e,t,n={},r,o,s){let i;const a=or({actions:{}},n),l={deep:!0};let u,c,f=[],p=[],v;const h=r.state.value[e];!s&&!h&&(r.state.value[e]={}),j({});let d;function y(L){let I;u=c=!1,typeof L=="function"?(L(r.state.value[e]),I={type:ls.patchFunction,storeId:e,events:v}):(nu(r.state.value[e],L),I={type:ls.patchObject,payload:L,storeId:e,events:v});const k=d=Symbol();Ve().then(()=>{d===k&&(u=!0)}),c=!0,io(f,I,r.state.value[e])}const g=s?function(){const{state:I}=n,k=I?I():{};this.$patch(z=>{or(z,k)})}:Sg;function _(){i.stop(),f=[],p=[],r._s.delete(e)}function b(L,I){return function(){ka(r);const k=Array.from(arguments),z=[],B=[];function K(F){z.push(F)}function G(F){B.push(F)}io(p,{args:k,name:L,store:C,after:K,onError:G});let R;try{R=I.apply(this&&this.$id===e?this:C,k)}catch(F){throw io(B,F),F}return R instanceof Promise?R.then(F=>(io(z,F),F)).catch(F=>(io(B,F),Promise.reject(F))):(io(z,R),R)}}const T={_p:r,$id:e,$onAction:Rp.bind(null,p),$patch:y,$reset:g,$subscribe(L,I={}){const k=Rp(f,L,I.detached,()=>z()),z=i.run(()=>pe(()=>r.state.value[e],B=>{(I.flush==="sync"?c:u)&&L({storeId:e,type:ls.direct,events:v},B)},or({},l,I)));return k},$dispose:_},C=Et(T);r._s.set(e,C);const x=(r._a&&r._a.runWithContext||VI)(()=>r._e.run(()=>(i=Vp()).run(t)));for(const L in x){const I=x[L];if(qe(I)&&!KI(I)||hr(I))s||(h&&HI(I)&&(qe(I)?I.value=h[L]:nu(I,h[L])),r.state.value[e][L]=I);else if(typeof I=="function"){const k=b(L,I);x[L]=k,a.actions[L]=I}}return or(C,x),or(Le(C),x),Object.defineProperty(C,"$state",{get:()=>r.state.value[e],set:L=>{y(I=>{or(I,L)})}}),r._p.forEach(L=>{or(C,i.run(()=>L({store:C,app:r._a,pinia:r,options:a})))}),h&&s&&n.hydrate&&n.hydrate(C.$state,h),u=!0,c=!0,C}function N8(e,t,n){let r,o;const s=typeof t=="function";typeof e=="string"?(r=e,o=s?n:t):(o=e,r=e.id);function i(a,l){const u=nb();return a=a||(u?Se(_g,null):null),a&&ka(a),a=wg,a._s.has(r)||(s?Eg(r,t,o,a):UI(r,o,a)),a._s.get(r)}return i.$id=r,i}function M8(e){{e=Le(e);const t={};for(const n in e){const r=e[n];(qe(r)||hr(r))&&(t[n]=Ht(e,n))}return t}}const ul=typeof navigator<"u"?navigator.userAgent.toLowerCase().indexOf("firefox")>0:!1;function cl(e,t,n,r){e.addEventListener?e.addEventListener(t,n,r):e.attachEvent&&e.attachEvent("on".concat(t),n)}function qo(e,t,n,r){e.removeEventListener?e.removeEventListener(t,n,r):e.detachEvent&&e.detachEvent("on".concat(t),n)}function Cg(e,t){const n=t.slice(0,t.length-1);for(let r=0;r=0;)t[n-1]+=",",t.splice(n,1),n=t.lastIndexOf("");return t}function qI(e,t){const n=e.length>=t.length?e:t,r=e.length>=t.length?t:e;let o=!0;for(let s=0;sRs[e.toLowerCase()]||Rn[e.toLowerCase()]||e.toUpperCase().charCodeAt(0),WI=e=>Object.keys(Rs).find(t=>Rs[t]===e),GI=e=>Object.keys(Rn).find(t=>Rn[t]===e);function xg(e){Tg=e||"all"}function Ps(){return Tg||"all"}function YI(){return Je.slice(0)}function JI(){return Je.map(e=>WI(e)||GI(e)||String.fromCharCode(e))}function XI(){const e=[];return Object.keys(at).forEach(t=>{at[t].forEach(n=>{let{key:r,scope:o,mods:s,shortcut:i}=n;e.push({scope:o,shortcut:i,mods:s,keys:r.split("+").map(a=>Us(a))})})}),e}function ZI(e){const t=e.target||e.srcElement,{tagName:n}=t;let r=!0;const o=n==="INPUT"&&!["checkbox","radio","range","button","file","reset","submit","color"].includes(t.type);return(t.isContentEditable||(o||n==="TEXTAREA"||n==="SELECT")&&!t.readOnly)&&(r=!1),r}function QI(e){return typeof e=="string"&&(e=Us(e)),Je.indexOf(e)!==-1}function e8(e,t){let n,r;e||(e=Ps());for(const o in at)if(Object.prototype.hasOwnProperty.call(at,o))for(n=at[o],r=0;r{let{element:a}=i;return hc(a)}):r++;Ps()===e&&xg(t||"all")}function t8(e){let t=e.keyCode||e.which||e.charCode;const n=Je.indexOf(t);if(n>=0&&Je.splice(n,1),e.key&&e.key.toLowerCase()==="meta"&&Je.splice(0,Je.length),(t===93||t===224)&&(t=91),t in bt){bt[t]=!1;for(const r in Rn)Rn[r]===t&&(dr[r]=!1)}}function Ag(e){if(typeof e>"u")Object.keys(at).forEach(o=>{Array.isArray(at[o])&&at[o].forEach(s=>mi(s)),delete at[o]}),hc(null);else if(Array.isArray(e))e.forEach(o=>{o.key&&mi(o)});else if(typeof e=="object")e.key&&mi(e);else if(typeof e=="string"){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{let{key:t,scope:n,method:r,splitKey:o="+"}=e;Og(t).forEach(i=>{const a=i.split(o),l=a.length,u=a[l-1],c=u==="*"?"*":Us(u);if(!at[c])return;n||(n=Ps());const f=l>1?Cg(Rn,a):[],p=[];at[c]=at[c].filter(v=>{const d=(r?v.method===r:!0)&&v.scope===n&&qI(v.mods,f);return d&&p.push(v.element),!d}),p.forEach(v=>hc(v))})};function Pp(e,t,n,r){if(t.element!==r)return;let o;if(t.scope===n||t.scope==="all"){o=t.mods.length>0;for(const s in bt)Object.prototype.hasOwnProperty.call(bt,s)&&(!bt[s]&&t.mods.indexOf(+s)>-1||bt[s]&&t.mods.indexOf(+s)===-1)&&(o=!1);(t.mods.length===0&&!bt[16]&&!bt[18]&&!bt[17]&&!bt[91]||o||t.shortcut==="*")&&(t.keys=[],t.keys=t.keys.concat(Je),t.method(e,t)===!1&&(e.preventDefault?e.preventDefault():e.returnValue=!1,e.stopPropagation&&e.stopPropagation(),e.cancelBubble&&(e.cancelBubble=!0)))}}function Ip(e,t){const n=at["*"];let r=e.keyCode||e.which||e.charCode;if(!dr.filter.call(this,e))return;if((r===93||r===224)&&(r=91),Je.indexOf(r)===-1&&r!==229&&Je.push(r),["ctrlKey","altKey","shiftKey","metaKey"].forEach(a=>{const l=ru[a];e[a]&&Je.indexOf(l)===-1?Je.push(l):!e[a]&&Je.indexOf(l)>-1?Je.splice(Je.indexOf(l),1):a==="metaKey"&&e[a]&&Je.length===3&&(e.ctrlKey||e.shiftKey||e.altKey||(Je=Je.slice(Je.indexOf(l))))}),r in bt){bt[r]=!0;for(const a in Rn)Rn[a]===r&&(dr[a]=!0);if(!n)return}for(const a in bt)Object.prototype.hasOwnProperty.call(bt,a)&&(bt[a]=e[ru[a]]);e.getModifierState&&!(e.altKey&&!e.ctrlKey)&&e.getModifierState("AltGraph")&&(Je.indexOf(17)===-1&&Je.push(17),Je.indexOf(18)===-1&&Je.push(18),bt[17]=!0,bt[18]=!0);const o=Ps();if(n)for(let a=0;a1&&(o=Cg(Rn,e)),e=e[e.length-1],e=e==="*"?"*":Us(e),e in at||(at[e]=[]),at[e].push({keyup:l,keydown:u,scope:s,mods:o,shortcut:r[a],method:n,key:r[a],splitKey:c,element:i});if(typeof i<"u"&&window){if(!Fn.has(i)){const v=function(){let d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:window.event;return Ip(d,i)},h=function(){let d=arguments.length>0&&arguments[0]!==void 0?arguments[0]:window.event;Ip(d,i),t8(d)};Fn.set(i,{keydownListener:v,keyupListenr:h,capture:f}),cl(i,"keydown",v,f),cl(i,"keyup",h,f)}if(!us){const v=()=>{Je=[]};us={listener:v,capture:f},cl(window,"focus",v,f)}}}function n8(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"all";Object.keys(at).forEach(n=>{at[n].filter(o=>o.scope===t&&o.shortcut===e).forEach(o=>{o&&o.method&&o.method()})})}function hc(e){const t=Object.values(at).flat();if(t.findIndex(r=>{let{element:o}=r;return o===e})<0){const{keydownListener:r,keyupListenr:o,capture:s}=Fn.get(e)||{};r&&o&&(qo(e,"keyup",o,s),qo(e,"keydown",r,s),Fn.delete(e))}if((t.length<=0||Fn.size<=0)&&(Object.keys(Fn).forEach(o=>{const{keydownListener:s,keyupListenr:i,capture:a}=Fn.get(o)||{};s&&i&&(qo(o,"keyup",i,a),qo(o,"keydown",s,a),Fn.delete(o))}),Fn.clear(),Object.keys(at).forEach(o=>delete at[o]),us)){const{listener:o,capture:s}=us;qo(window,"focus",o,s),us=null}}const fl={getPressedKeyString:JI,setScope:xg,getScope:Ps,deleteScope:e8,getPressedKeyCodes:YI,getAllKeyCodes:XI,isPressed:QI,filter:ZI,trigger:n8,unbind:Ag,keyMap:Rs,modifier:Rn,modifierMap:ru};for(const e in fl)Object.prototype.hasOwnProperty.call(fl,e)&&(dr[e]=fl[e]);if(typeof window<"u"){const e=window.hotkeys;dr.noConflict=t=>(t&&window.hotkeys===dr&&(window.hotkeys=e),dr),window.hotkeys=dr}export{g8 as $,qe as A,v8 as B,p8 as C,f8 as D,E8 as E,tt as F,c8 as G,Le as H,wm as I,w8 as J,pe as K,_n as L,ue as M,k8 as N,xu as O,Ic as P,R8 as Q,A8 as R,dr as S,Ue as T,u8 as U,L8 as V,_8 as W,x8 as X,S8 as Y,O8 as Z,C8 as _,a8 as a,m8 as a0,h0 as a1,s8 as a2,WA as a3,vr as a4,Et as a5,l8 as a6,Jr as a7,ot as a8,Ve as a9,ht as aa,l0 as ab,Pm as ac,T8 as ad,Yr as ae,I8 as af,i8 as b,he as c,Q as d,ae as e,zr as f,fe as g,P8 as h,o8 as i,j,mt as k,h8 as l,$8 as m,N8 as n,P as o,r8 as p,E as q,Tr as r,M8 as s,We as t,m as u,d8 as v,ye as w,W as x,y8 as y,b8 as z}; diff --git a/app/src/main/assets/web/vue/assets/vendor-C9cXVWQA.css b/app/src/main/assets/web/vue/assets/vendor-C9cXVWQA.css deleted file mode 100644 index 9e3887580641..000000000000 --- a/app/src/main/assets/web/vue/assets/vendor-C9cXVWQA.css +++ /dev/null @@ -1 +0,0 @@ -@charset "UTF-8";:root{--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary-rgb:64,158,255;--el-color-success-rgb:103,194,58;--el-color-warning-rgb:230,162,60;--el-color-danger-rgb:245,108,108;--el-color-error-rgb:245,108,108;--el-color-info-rgb:144,147,153;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-transition-duration:.3s;--el-transition-duration-fast:.2s;--el-transition-function-ease-in-out-bezier:cubic-bezier(.645,.045,.355,1);--el-transition-function-fast-bezier:cubic-bezier(.23,1,.32,1);--el-transition-all:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);--el-transition-fade:opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-md-fade:transform var(--el-transition-duration) var(--el-transition-function-fast-bezier),opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-fade-linear:opacity var(--el-transition-duration-fast) linear;--el-transition-border:border-color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-box-shadow:box-shadow var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-color:color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-component-size-large:40px;--el-component-size:32px;--el-component-size-small:24px}:root{color-scheme:light;--el-color-primary:#409eff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-primary-dark-2:#337ecc;--el-color-success:#67c23a;--el-color-success-light-3:#95d475;--el-color-success-light-5:#b3e19d;--el-color-success-light-7:#d1edc4;--el-color-success-light-8:#e1f3d8;--el-color-success-light-9:#f0f9eb;--el-color-success-dark-2:#529b2e;--el-color-warning:#e6a23c;--el-color-warning-light-3:#eebe77;--el-color-warning-light-5:#f3d19e;--el-color-warning-light-7:#f8e3c5;--el-color-warning-light-8:#faecd8;--el-color-warning-light-9:#fdf6ec;--el-color-warning-dark-2:#b88230;--el-color-danger:#f56c6c;--el-color-danger-light-3:#f89898;--el-color-danger-light-5:#fab6b6;--el-color-danger-light-7:#fcd3d3;--el-color-danger-light-8:#fde2e2;--el-color-danger-light-9:#fef0f0;--el-color-danger-dark-2:#c45656;--el-color-error:#f56c6c;--el-color-error-light-3:#f89898;--el-color-error-light-5:#fab6b6;--el-color-error-light-7:#fcd3d3;--el-color-error-light-8:#fde2e2;--el-color-error-light-9:#fef0f0;--el-color-error-dark-2:#c45656;--el-color-info:#909399;--el-color-info-light-3:#b1b3b8;--el-color-info-light-5:#c8c9cc;--el-color-info-light-7:#dedfe0;--el-color-info-light-8:#e9e9eb;--el-color-info-light-9:#f4f4f5;--el-color-info-dark-2:#73767a;--el-bg-color:#ffffff;--el-bg-color-page:#f2f3f5;--el-bg-color-overlay:#ffffff;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#a8abb2;--el-text-color-disabled:#c0c4cc;--el-border-color:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-border-color-dark:#d4d7de;--el-border-color-darker:#cdd0d6;--el-fill-color:#f0f2f5;--el-fill-color-light:#f5f7fa;--el-fill-color-lighter:#fafafa;--el-fill-color-extra-light:#fafcff;--el-fill-color-dark:#ebedf0;--el-fill-color-darker:#e6e8eb;--el-fill-color-blank:#ffffff;--el-box-shadow:0px 12px 32px 4px rgba(0,0,0,.04),0px 8px 20px rgba(0,0,0,.08);--el-box-shadow-light:0px 0px 12px rgba(0,0,0,.12);--el-box-shadow-lighter:0px 0px 6px rgba(0,0,0,.12);--el-box-shadow-dark:0px 16px 48px 16px rgba(0,0,0,.08),0px 12px 32px rgba(0,0,0,.12),0px 8px 16px -8px rgba(0,0,0,.16);--el-disabled-bg-color:var(--el-fill-color-light);--el-disabled-text-color:var(--el-text-color-placeholder);--el-disabled-border-color:var(--el-border-color-light);--el-overlay-color:rgba(0,0,0,.8);--el-overlay-color-light:rgba(0,0,0,.7);--el-overlay-color-lighter:rgba(0,0,0,.5);--el-mask-color:rgba(255,255,255,.9);--el-mask-color-extra-light:rgba(255,255,255,.3);--el-border-width:1px;--el-border-style:solid;--el-border-color-hover:var(--el-text-color-disabled);--el-border:var(--el-border-width) var(--el-border-style) var(--el-border-color);--el-svg-monochrome-grey:var(--el-border-color)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transform:scaleY(1);transform-origin:center top;transition:var(--el-transition-md-fade)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transform:scaleY(1);transform-origin:center bottom;transition:var(--el-transition-md-fade)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transform:scale(1);transform-origin:top left;transition:var(--el-transition-md-fade)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-enter-active,.el-collapse-transition-leave-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(1turn)}}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.el-icon{--color:inherit;align-items:center;display:inline-flex;height:1em;justify-content:center;line-height:1em;position:relative;width:1em;fill:currentColor;color:var(--color);font-size:inherit}.el-icon.is-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon svg{height:1em;width:1em}.el-tabs{--el-tabs-header-height:40px}.el-tabs__header{margin:0 0 15px;padding:0;position:relative}.el-tabs__active-bar{background-color:var(--el-color-primary);bottom:0;height:2px;left:0;list-style:none;position:absolute;transition:width var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),transform var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);z-index:1}.el-tabs__new-tab{align-items:center;border:1px solid var(--el-border-color);border-radius:3px;color:var(--el-text-color-primary);cursor:pointer;display:flex;float:right;font-size:12px;height:20px;justify-content:center;line-height:20px;margin:10px 0 10px 10px;text-align:center;transition:all .15s;width:20px}.el-tabs__new-tab .is-icon-plus{height:inherit;transform:scale(.8);width:inherit}.el-tabs__new-tab .is-icon-plus svg{vertical-align:middle}.el-tabs__new-tab:hover{color:var(--el-color-primary)}.el-tabs__nav-wrap{margin-bottom:-1px;overflow:hidden;position:relative}.el-tabs__nav-wrap:after{background-color:var(--el-border-color-light);bottom:0;content:"";height:2px;left:0;position:absolute;width:100%;z-index:var(--el-index-normal)}.el-tabs__nav-wrap.is-scrollable{box-sizing:border-box;padding:0 20px}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{color:var(--el-text-color-secondary);cursor:pointer;font-size:12px;line-height:44px;position:absolute;text-align:center;width:20px}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{display:flex;float:left;position:relative;transition:transform var(--el-transition-duration);white-space:nowrap;z-index:calc(var(--el-index-normal) + 1)}.el-tabs__nav.is-stretch{display:flex;min-width:100%}.el-tabs__nav.is-stretch>*{flex:1;text-align:center}.el-tabs__item{align-items:center;box-sizing:border-box;color:var(--el-text-color-primary);display:flex;font-size:var(--el-font-size-base);font-weight:500;height:var(--el-tabs-header-height);justify-content:center;list-style:none;padding:0 20px;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:none}.el-tabs__item:focus-visible{border-radius:3px;box-shadow:0 0 2px 2px var(--el-color-primary) inset}.el-tabs__item .is-icon-close{border-radius:50%;margin-left:5px;text-align:center;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs__item .is-icon-close:before{display:inline-block;transform:scale(.9)}.el-tabs__item .is-icon-close:hover{background-color:var(--el-text-color-placeholder);color:#fff}.el-tabs__item.is-active{color:var(--el-color-primary)}.el-tabs__item:hover{color:var(--el-color-primary);cursor:pointer}.el-tabs__item.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid var(--el-border-color-light);height:var(--el-tabs-header-height)}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid var(--el-border-color-light);border-bottom:none;border-radius:4px 4px 0 0;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .is-icon-close{font-size:12px;height:14px;overflow:hidden;position:relative;right:-2px;transform-origin:100% 50%;width:0}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid var(--el-border-color-light);transition:color var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),padding var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .is-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:var(--el-bg-color)}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .is-icon-close{width:14px}.el-tabs--border-card{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:var(--el-fill-color-light);border-bottom:1px solid var(--el-border-color-light);margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{border:1px solid transparent;color:var(--el-text-color-secondary);margin-top:-1px;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{background-color:var(--el-bg-color-overlay);border-left-color:var(--el-border-color);border-right-color:var(--el-border-color);color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:var(--el-disabled-text-color)}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover{padding-left:13px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child:not(.is-active).is-closable:hover{padding-right:13px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid var(--el-border-color)}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-bottom:0;margin-top:-1px}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{bottom:auto;height:auto;top:0;width:2px}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{cursor:pointer;height:30px;line-height:30px;text-align:center;width:100%}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{bottom:0;right:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{bottom:auto;height:100%;top:0;width:2px}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{flex-direction:column}.el-tabs--left .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-left{justify-content:flex-end}.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-right{justify-content:flex-start}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__nav-wrap.is-left:after{left:auto;right:0}.el-tabs--left .el-tabs__active-bar.is-left{left:auto;right:0}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left{display:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-bottom:none;border-left:none;border-right:1px solid var(--el-border-color-light);border-top:1px solid var(--el-border-color-light);text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid var(--el-border-color-light);border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left:none;border-right:1px solid #fff}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-radius:4px 0 0 4px;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid var(--el-border-color)}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:rgb(209,219,229) transparent}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid var(--el-border-color-light)}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid var(--el-border-color-light);border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left:1px solid #fff;border-right:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-left:none;border-radius:0 4px 4px 0}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid var(--el-border-color)}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:rgb(209,219,229) transparent}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter var(--el-transition-duration);animation:slideInRight-enter var(--el-transition-duration)}.slideInRight-leave{-webkit-animation:slideInRight-leave var(--el-transition-duration);animation:slideInRight-leave var(--el-transition-duration);left:0;position:absolute;right:0}.slideInLeft-enter{-webkit-animation:slideInLeft-enter var(--el-transition-duration);animation:slideInLeft-enter var(--el-transition-duration)}.slideInLeft-leave{-webkit-animation:slideInLeft-leave var(--el-transition-duration);animation:slideInLeft-leave var(--el-transition-duration);left:0;position:absolute;right:0}@-webkit-keyframes slideInRight-enter{0%{opacity:0;transform:translate(100%);transform-origin:0 0}to{opacity:1;transform:translate(0);transform-origin:0 0}}@keyframes slideInRight-enter{0%{opacity:0;transform:translate(100%);transform-origin:0 0}to{opacity:1;transform:translate(0);transform-origin:0 0}}@-webkit-keyframes slideInRight-leave{0%{opacity:1;transform:translate(0);transform-origin:0 0}to{opacity:0;transform:translate(100%);transform-origin:0 0}}@keyframes slideInRight-leave{0%{opacity:1;transform:translate(0);transform-origin:0 0}to{opacity:0;transform:translate(100%);transform-origin:0 0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;transform:translate(-100%);transform-origin:0 0}to{opacity:1;transform:translate(0);transform-origin:0 0}}@keyframes slideInLeft-enter{0%{opacity:0;transform:translate(-100%);transform-origin:0 0}to{opacity:1;transform:translate(0);transform-origin:0 0}}@-webkit-keyframes slideInLeft-leave{0%{opacity:1;transform:translate(0);transform-origin:0 0}to{opacity:0;transform:translate(-100%);transform-origin:0 0}}@keyframes slideInLeft-leave{0%{opacity:1;transform:translate(0);transform-origin:0 0}to{opacity:0;transform:translate(-100%);transform-origin:0 0}}.el-text{--el-text-font-size:var(--el-font-size-base);--el-text-color:var(--el-text-color-regular);align-self:center;color:var(--el-text-color);font-size:var(--el-text-font-size);margin:0;overflow-wrap:break-word;padding:0}.el-text.is-truncated{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-text.is-line-clamp{display:-webkit-inline-box;-webkit-box-orient:vertical;overflow:hidden}.el-text--large{--el-text-font-size:var(--el-font-size-medium)}.el-text--default{--el-text-font-size:var(--el-font-size-base)}.el-text--small{--el-text-font-size:var(--el-font-size-extra-small)}.el-text.el-text--primary{--el-text-color:var(--el-color-primary)}.el-text.el-text--success{--el-text-color:var(--el-color-success)}.el-text.el-text--warning{--el-text-color:var(--el-color-warning)}.el-text.el-text--danger{--el-text-color:var(--el-color-danger)}.el-text.el-text--error{--el-text-color:var(--el-color-error)}.el-text.el-text--info{--el-text-color:var(--el-color-info)}.el-text>.el-icon{vertical-align:-2px}.el-link{--el-link-font-size:var(--el-font-size-base);--el-link-font-weight:var(--el-font-weight-primary);--el-link-text-color:var(--el-text-color-regular);--el-link-hover-text-color:var(--el-color-primary);--el-link-disabled-text-color:var(--el-text-color-placeholder);align-items:center;color:var(--el-link-text-color);cursor:pointer;display:inline-flex;flex-direction:row;font-size:var(--el-link-font-size);font-weight:var(--el-link-font-weight);justify-content:center;outline:none;padding:0;position:relative;text-decoration:none;vertical-align:middle}.el-link:hover{color:var(--el-link-hover-text-color)}.el-link.is-underline:hover:after{border-bottom:1px solid var(--el-link-hover-text-color);bottom:0;content:"";height:0;left:0;position:absolute;right:0}.el-link.is-disabled{color:var(--el-link-disabled-text-color);cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default:after{border-color:var(--el-link-hover-text-color)}.el-link__inner{align-items:center;display:inline-flex;justify-content:center}.el-link.el-link--primary{--el-link-text-color:var(--el-color-primary);--el-link-hover-text-color:var(--el-color-primary-light-3);--el-link-disabled-text-color:var(--el-color-primary-light-5)}.el-link.el-link--primary:after{border-color:var(--el-link-text-color)}.el-link.el-link--primary.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--success{--el-link-text-color:var(--el-color-success);--el-link-hover-text-color:var(--el-color-success-light-3);--el-link-disabled-text-color:var(--el-color-success-light-5)}.el-link.el-link--success:after{border-color:var(--el-link-text-color)}.el-link.el-link--success.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--warning{--el-link-text-color:var(--el-color-warning);--el-link-hover-text-color:var(--el-color-warning-light-3);--el-link-disabled-text-color:var(--el-color-warning-light-5)}.el-link.el-link--warning:after{border-color:var(--el-link-text-color)}.el-link.el-link--warning.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--danger{--el-link-text-color:var(--el-color-danger);--el-link-hover-text-color:var(--el-color-danger-light-3);--el-link-disabled-text-color:var(--el-color-danger-light-5)}.el-link.el-link--danger:after{border-color:var(--el-link-text-color)}.el-link.el-link--danger.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--error{--el-link-text-color:var(--el-color-error);--el-link-hover-text-color:var(--el-color-error-light-3);--el-link-disabled-text-color:var(--el-color-error-light-5)}.el-link.el-link--error:after{border-color:var(--el-link-text-color)}.el-link.el-link--error.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--info{--el-link-text-color:var(--el-color-info);--el-link-hover-text-color:var(--el-color-info-light-3);--el-link-disabled-text-color:var(--el-color-info-light-5)}.el-link.el-link--info:after{border-color:var(--el-link-text-color)}.el-link.el-link--info.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-checkbox-group{font-size:0;line-height:0}.el-button{--el-button-font-weight:var(--el-font-weight-primary);--el-button-border-color:var(--el-border-color);--el-button-bg-color:var(--el-fill-color-blank);--el-button-text-color:var(--el-text-color-regular);--el-button-disabled-text-color:var(--el-disabled-text-color);--el-button-disabled-bg-color:var(--el-fill-color-blank);--el-button-disabled-border-color:var(--el-border-color-light);--el-button-divide-border-color:rgba(255,255,255,.5);--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-7);--el-button-active-text-color:var(--el-button-hover-text-color);--el-button-active-border-color:var(--el-color-primary);--el-button-active-bg-color:var(--el-button-hover-bg-color);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-hover-link-text-color:var(--el-color-info);--el-button-active-color:var(--el-text-color-primary);align-items:center;-webkit-appearance:none;background-color:var(--el-button-bg-color);border:var(--el-border);border-color:var(--el-button-border-color);border-radius:var(--el-border-radius-base);box-sizing:border-box;color:var(--el-button-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-button-font-weight);height:32px;justify-content:center;line-height:1;outline:none;padding:8px 15px;text-align:center;transition:.1s;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.el-button:hover{background-color:var(--el-button-hover-bg-color);border-color:var(--el-button-hover-border-color);color:var(--el-button-hover-text-color);outline:none}.el-button:active{background-color:var(--el-button-active-bg-color);border-color:var(--el-button-active-border-color);color:var(--el-button-active-text-color);outline:none}.el-button:focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset 0s,outline 0s}.el-button>span{align-items:center;display:inline-flex}.el-button+.el-button{margin-left:12px}.el-button.is-round{padding:8px 15px}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon]+span{margin-left:6px}.el-button [class*=el-icon] svg{vertical-align:bottom}.el-button.is-plain{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary)}.el-button.is-active{background-color:var(--el-button-active-bg-color);border-color:var(--el-button-active-border-color);color:var(--el-button-active-text-color);outline:none}.el-button.is-disabled,.el-button.is-disabled:hover{background-color:var(--el-button-disabled-bg-color);background-image:none;border-color:var(--el-button-disabled-border-color);color:var(--el-button-disabled-text-color);cursor:not-allowed}.el-button.is-loading{pointer-events:none;position:relative}.el-button.is-loading:before{background-color:var(--el-mask-color-extra-light);border-radius:inherit;bottom:-1px;content:"";left:-1px;pointer-events:none;position:absolute;right:-1px;top:-1px;z-index:1}.el-button.is-round{border-radius:var(--el-border-radius-round)}.el-button.is-circle{border-radius:50%;padding:8px;width:32px}.el-button.is-text{background-color:transparent;border:0 solid transparent;color:var(--el-button-text-color)}.el-button.is-text.is-disabled{background-color:transparent!important;color:var(--el-button-disabled-text-color)}.el-button.is-text:not(.is-disabled):hover{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled):focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset 0s,outline 0s}.el-button.is-text:not(.is-disabled):active{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled).is-has-bg:hover{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg:active{background-color:var(--el-fill-color-dark)}.el-button__text--expand{letter-spacing:.3em;margin-right:-.3em}.el-button.is-link{background:transparent;border-color:transparent;color:var(--el-button-text-color);height:auto;padding:2px}.el-button.is-link:hover{color:var(--el-button-hover-link-text-color)}.el-button.is-link.is-disabled{background-color:transparent!important;border-color:transparent!important;color:var(--el-button-disabled-text-color)}.el-button.is-link:not(.is-disabled):hover{background-color:transparent;border-color:transparent}.el-button.is-link:not(.is-disabled):active{background-color:transparent;border-color:transparent;color:var(--el-button-active-color)}.el-button--text{background:transparent;border-color:transparent;color:var(--el-color-primary);padding-left:0;padding-right:0}.el-button--text.is-disabled{background-color:transparent!important;border-color:transparent!important;color:var(--el-button-disabled-text-color)}.el-button--text:not(.is-disabled):hover{background-color:transparent;border-color:transparent;color:var(--el-color-primary-light-3)}.el-button--text:not(.is-disabled):active{background-color:transparent;border-color:transparent;color:var(--el-color-primary-dark-2)}.el-button__link--expand{letter-spacing:.3em;margin-right:-.3em}.el-button--primary{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-primary);--el-button-border-color:var(--el-color-primary);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-active-color:var(--el-color-primary-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-primary-light-5);--el-button-hover-bg-color:var(--el-color-primary-light-3);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-primary-light-5);--el-button-disabled-border-color:var(--el-color-primary-light-5)}.el-button--primary.is-link,.el-button--primary.is-plain,.el-button--primary.is-text{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-primary);--el-button-hover-border-color:var(--el-color-primary);--el-button-active-text-color:var(--el-color-white)}.el-button--primary.is-link.is-disabled,.el-button--primary.is-link.is-disabled:active,.el-button--primary.is-link.is-disabled:focus,.el-button--primary.is-link.is-disabled:hover,.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover,.el-button--primary.is-text.is-disabled,.el-button--primary.is-text.is-disabled:active,.el-button--primary.is-text.is-disabled:focus,.el-button--primary.is-text.is-disabled:hover{background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8);color:var(--el-color-primary-light-5)}.el-button--success{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-success);--el-button-border-color:var(--el-color-success);--el-button-outline-color:var(--el-color-success-light-5);--el-button-active-color:var(--el-color-success-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-success-light-5);--el-button-hover-bg-color:var(--el-color-success-light-3);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-bg-color:var(--el-color-success-dark-2);--el-button-active-border-color:var(--el-color-success-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-success-light-5);--el-button-disabled-border-color:var(--el-color-success-light-5)}.el-button--success.is-link,.el-button--success.is-plain,.el-button--success.is-text{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-success);--el-button-hover-border-color:var(--el-color-success);--el-button-active-text-color:var(--el-color-white)}.el-button--success.is-link.is-disabled,.el-button--success.is-link.is-disabled:active,.el-button--success.is-link.is-disabled:focus,.el-button--success.is-link.is-disabled:hover,.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover,.el-button--success.is-text.is-disabled,.el-button--success.is-text.is-disabled:active,.el-button--success.is-text.is-disabled:focus,.el-button--success.is-text.is-disabled:hover{background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8);color:var(--el-color-success-light-5)}.el-button--warning{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-warning);--el-button-border-color:var(--el-color-warning);--el-button-outline-color:var(--el-color-warning-light-5);--el-button-active-color:var(--el-color-warning-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-warning-light-5);--el-button-hover-bg-color:var(--el-color-warning-light-3);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-bg-color:var(--el-color-warning-dark-2);--el-button-active-border-color:var(--el-color-warning-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-warning-light-5);--el-button-disabled-border-color:var(--el-color-warning-light-5)}.el-button--warning.is-link,.el-button--warning.is-plain,.el-button--warning.is-text{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-warning);--el-button-hover-border-color:var(--el-color-warning);--el-button-active-text-color:var(--el-color-white)}.el-button--warning.is-link.is-disabled,.el-button--warning.is-link.is-disabled:active,.el-button--warning.is-link.is-disabled:focus,.el-button--warning.is-link.is-disabled:hover,.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover,.el-button--warning.is-text.is-disabled,.el-button--warning.is-text.is-disabled:active,.el-button--warning.is-text.is-disabled:focus,.el-button--warning.is-text.is-disabled:hover{background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8);color:var(--el-color-warning-light-5)}.el-button--danger{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-danger);--el-button-border-color:var(--el-color-danger);--el-button-outline-color:var(--el-color-danger-light-5);--el-button-active-color:var(--el-color-danger-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-danger-light-5);--el-button-hover-bg-color:var(--el-color-danger-light-3);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-bg-color:var(--el-color-danger-dark-2);--el-button-active-border-color:var(--el-color-danger-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-danger-light-5);--el-button-disabled-border-color:var(--el-color-danger-light-5)}.el-button--danger.is-link,.el-button--danger.is-plain,.el-button--danger.is-text{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-danger);--el-button-hover-border-color:var(--el-color-danger);--el-button-active-text-color:var(--el-color-white)}.el-button--danger.is-link.is-disabled,.el-button--danger.is-link.is-disabled:active,.el-button--danger.is-link.is-disabled:focus,.el-button--danger.is-link.is-disabled:hover,.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover,.el-button--danger.is-text.is-disabled,.el-button--danger.is-text.is-disabled:active,.el-button--danger.is-text.is-disabled:focus,.el-button--danger.is-text.is-disabled:hover{background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8);color:var(--el-color-danger-light-5)}.el-button--info{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-info);--el-button-border-color:var(--el-color-info);--el-button-outline-color:var(--el-color-info-light-5);--el-button-active-color:var(--el-color-info-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-info-light-5);--el-button-hover-bg-color:var(--el-color-info-light-3);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-bg-color:var(--el-color-info-dark-2);--el-button-active-border-color:var(--el-color-info-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-info-light-5);--el-button-disabled-border-color:var(--el-color-info-light-5)}.el-button--info.is-link,.el-button--info.is-plain,.el-button--info.is-text{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-info);--el-button-hover-border-color:var(--el-color-info);--el-button-active-text-color:var(--el-color-white)}.el-button--info.is-link.is-disabled,.el-button--info.is-link.is-disabled:active,.el-button--info.is-link.is-disabled:focus,.el-button--info.is-link.is-disabled:hover,.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover,.el-button--info.is-text.is-disabled,.el-button--info.is-text.is-disabled:active,.el-button--info.is-text.is-disabled:focus,.el-button--info.is-text.is-disabled:hover{background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8);color:var(--el-color-info-light-5)}.el-button--large{--el-button-size:40px;border-radius:var(--el-border-radius-base);font-size:var(--el-font-size-base);height:var(--el-button-size);padding:12px 19px}.el-button--large [class*=el-icon]+span{margin-left:8px}.el-button--large.is-round{padding:12px 19px}.el-button--large.is-circle{padding:12px;width:var(--el-button-size)}.el-button--small{--el-button-size:24px;border-radius:calc(var(--el-border-radius-base) - 1px);font-size:12px;height:var(--el-button-size);padding:5px 11px}.el-button--small [class*=el-icon]+span{margin-left:4px}.el-button--small.is-round{padding:5px 11px}.el-button--small.is-circle{padding:5px;width:var(--el-button-size)}.el-textarea{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;display:inline-block;font-size:var(--el-font-size-base);position:relative;vertical-align:bottom;width:100%}.el-textarea__inner{-webkit-appearance:none;background-color:var(--el-input-bg-color,var(--el-fill-color-blank));background-image:none;border:none;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;box-sizing:border-box;color:var(--el-input-text-color,var(--el-text-color-regular));display:block;font-family:inherit;font-size:inherit;line-height:1.5;padding:5px 11px;position:relative;resize:vertical;transition:var(--el-transition-box-shadow);width:100%}.el-textarea__inner::-moz-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner:-ms-input-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-textarea__inner:focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset;outline:none}.el-textarea .el-input__count{background:var(--el-fill-color-blank);bottom:5px;color:var(--el-color-info);font-size:12px;line-height:14px;position:absolute;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:var(--el-disabled-bg-color);box-shadow:0 0 0 1px var(--el-disabled-border-color) inset;color:var(--el-disabled-text-color);cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-exceed .el-textarea__inner{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-textarea.is-exceed .el-input__count{color:var(--el-color-danger)}.el-input{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;--el-input-height:var(--el-component-size);box-sizing:border-box;display:inline-flex;font-size:var(--el-font-size-base);line-height:var(--el-input-height);position:relative;vertical-align:middle;width:var(--el-input-width)}.el-input::-webkit-scrollbar{width:6px;z-index:11}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{background:var(--el-text-color-disabled);border-radius:5px;width:6px}.el-input::-webkit-scrollbar-corner,.el-input::-webkit-scrollbar-track{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track-piece{background:var(--el-fill-color-blank);width:6px}.el-input .el-input__clear,.el-input .el-input__password{color:var(--el-input-icon-color);cursor:pointer;font-size:14px}.el-input .el-input__clear:hover,.el-input .el-input__password:hover{color:var(--el-input-clear-hover-color)}.el-input .el-input__count{align-items:center;color:var(--el-color-info);display:inline-flex;font-size:12px;height:100%}.el-input .el-input__count .el-input__count-inner{background:var(--el-fill-color-blank);display:inline-block;line-height:normal;padding-left:8px}.el-input__wrapper{align-items:center;background-color:var(--el-input-bg-color,var(--el-fill-color-blank));background-image:none;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;cursor:text;display:inline-flex;flex-grow:1;justify-content:center;padding:1px 11px;transform:translateZ(0);transition:var(--el-transition-box-shadow)}.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 32px) - 2px);-webkit-appearance:none;background:none;border:none;box-sizing:border-box;color:var(--el-input-text-color,var(--el-text-color-regular));flex-grow:1;font-size:inherit;height:var(--el-input-inner-height);line-height:var(--el-input-inner-height);outline:none;padding:0;width:100%}.el-input__inner:focus{outline:none}.el-input__inner::-moz-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner:-ms-input-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner[type=password]::-ms-reveal{display:none}.el-input__inner[type=number]{line-height:1}.el-input__prefix{color:var(--el-input-icon-color,var(--el-text-color-placeholder));display:inline-flex;flex-shrink:0;flex-wrap:nowrap;height:100%;pointer-events:none;text-align:center;transition:all var(--el-transition-duration);white-space:nowrap}.el-input__prefix-inner{align-items:center;display:inline-flex;justify-content:center;pointer-events:all}.el-input__prefix-inner>:last-child{margin-right:8px}.el-input__prefix-inner>:first-child,.el-input__prefix-inner>:first-child.el-input__icon{margin-left:0}.el-input__suffix{color:var(--el-input-icon-color,var(--el-text-color-placeholder));display:inline-flex;flex-shrink:0;flex-wrap:nowrap;height:100%;pointer-events:none;text-align:center;transition:all var(--el-transition-duration);white-space:nowrap}.el-input__suffix-inner{align-items:center;display:inline-flex;justify-content:center;pointer-events:all}.el-input__suffix-inner>:first-child{margin-left:8px}.el-input .el-input__icon{align-items:center;display:flex;height:inherit;justify-content:center;line-height:inherit;margin-left:8px;transition:all var(--el-transition-duration)}.el-input__validateIcon{pointer-events:none}.el-input.is-active .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-color, ) inset}.el-input.is-disabled{cursor:not-allowed}.el-input.is-disabled .el-input__wrapper{background-color:var(--el-disabled-bg-color);box-shadow:0 0 0 1px var(--el-disabled-border-color) inset}.el-input.is-disabled .el-input__inner{color:var(--el-disabled-text-color);-webkit-text-fill-color:var(--el-disabled-text-color);cursor:not-allowed}.el-input.is-disabled .el-input__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input.is-exceed .el-input__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-input.is-exceed .el-input__suffix .el-input__count{color:var(--el-color-danger)}.el-input--large{--el-input-height:var(--el-component-size-large);font-size:14px}.el-input--large .el-input__wrapper{padding:1px 15px}.el-input--large .el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 40px) - 2px)}.el-input--small{--el-input-height:var(--el-component-size-small);font-size:12px}.el-input--small .el-input__wrapper{padding:1px 7px}.el-input--small .el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 24px) - 2px)}.el-input-group{align-items:stretch;display:inline-flex;width:100%}.el-input-group__append,.el-input-group__prepend{align-items:center;background-color:var(--el-fill-color-light);border-radius:var(--el-input-border-radius);color:var(--el-color-info);display:inline-flex;justify-content:center;min-height:100%;padding:0 20px;position:relative;white-space:nowrap}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:none}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:0 -20px}.el-input-group__append button.el-button,.el-input-group__append button.el-button:hover,.el-input-group__append div.el-select .el-select__wrapper,.el-input-group__append div.el-select:hover .el-select__wrapper,.el-input-group__prepend button.el-button,.el-input-group__prepend button.el-button:hover,.el-input-group__prepend div.el-select .el-select__wrapper,.el-input-group__prepend div.el-select:hover .el-select__wrapper{background-color:transparent;border-color:transparent;color:inherit}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{border-bottom-right-radius:0;border-right:0;border-top-right-radius:0;box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset}.el-input-group__append{border-bottom-left-radius:0;border-left:0;border-top-left-radius:0;box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset}.el-input-group--prepend>.el-input__wrapper{border-bottom-left-radius:0;border-top-left-radius:0}.el-input-group--prepend .el-input-group__prepend .el-select .el-select__wrapper{border-bottom-right-radius:0;border-top-right-radius:0;box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset}.el-input-group--append>.el-input__wrapper{border-bottom-right-radius:0;border-top-right-radius:0}.el-input-group--append .el-input-group__append .el-select .el-select__wrapper{border-bottom-left-radius:0;border-top-left-radius:0;box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset}.el-input-hidden{display:none!important}.el-checkbox{--el-checkbox-font-size:14px;--el-checkbox-font-weight:var(--el-font-weight-primary);--el-checkbox-text-color:var(--el-text-color-regular);--el-checkbox-input-height:14px;--el-checkbox-input-width:14px;--el-checkbox-border-radius:var(--el-border-radius-small);--el-checkbox-bg-color:var(--el-fill-color-blank);--el-checkbox-input-border:var(--el-border);--el-checkbox-disabled-border-color:var(--el-border-color);--el-checkbox-disabled-input-fill:var(--el-fill-color-light);--el-checkbox-disabled-icon-color:var(--el-text-color-placeholder);--el-checkbox-disabled-checked-input-fill:var(--el-border-color-extra-light);--el-checkbox-disabled-checked-input-border-color:var(--el-border-color);--el-checkbox-disabled-checked-icon-color:var(--el-text-color-placeholder);--el-checkbox-checked-text-color:var(--el-color-primary);--el-checkbox-checked-input-border-color:var(--el-color-primary);--el-checkbox-checked-bg-color:var(--el-color-primary);--el-checkbox-checked-icon-color:var(--el-color-white);--el-checkbox-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-checkbox-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-checkbox-font-weight);height:var(--el-checkbox-height,32px);margin-right:30px;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.el-checkbox.is-disabled{cursor:not-allowed}.el-checkbox.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-checkbox.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-checkbox.is-bordered.is-disabled{border-color:var(--el-border-color-lighter)}.el-checkbox.is-bordered.el-checkbox--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__label{font-size:var(--el-font-size-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:0 11px 0 7px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox input:focus-visible+.el-checkbox__inner{border-radius:var(--el-checkbox-border-radius);outline:2px solid var(--el-checkbox-input-border-color-hover);outline-offset:1px}.el-checkbox__input{cursor:pointer;display:inline-flex;outline:none;position:relative;white-space:nowrap}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:var(--el-checkbox-disabled-input-fill);border-color:var(--el-checkbox-disabled-border-color);cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-icon-color);cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-disabled-checked-icon-color);border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:var(--el-disabled-text-color);cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-checked-icon-color);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--el-checkbox-checked-text-color)}.el-checkbox__input.is-focus:not(.is-checked) .el-checkbox__original:not(:focus-visible){border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-checked-icon-color);content:"";display:block;height:2px;left:0;position:absolute;right:0;top:5px;transform:scale(.5)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{background-color:var(--el-checkbox-bg-color);border:var(--el-checkbox-input-border);border-radius:var(--el-checkbox-border-radius);box-sizing:border-box;display:inline-block;height:var(--el-checkbox-input-height);position:relative;transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46),outline .25s cubic-bezier(.71,-.46,.29,1.46);width:var(--el-checkbox-input-width);z-index:var(--el-index-normal)}.el-checkbox__inner:hover{border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__inner:after{border:1px solid transparent;border-left:0;border-top:0;box-sizing:content-box;content:"";height:7px;left:4px;position:absolute;top:1px;transform:rotate(45deg) scaleY(0);transform-origin:center;transition:transform .15s ease-in .05s;width:3px}.el-checkbox__original{height:0;margin:0;opacity:0;outline:none;position:absolute;width:0;z-index:-1}.el-checkbox__label{display:inline-block;font-size:var(--el-checkbox-font-size);line-height:1;padding-left:8px}.el-checkbox.el-checkbox--large{height:40px}.el-checkbox.el-checkbox--large .el-checkbox__label{font-size:14px}.el-checkbox.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.el-checkbox--small{height:24px}.el-checkbox.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.el-checkbox--small .el-checkbox__input.is-indeterminate .el-checkbox__inner:before{top:4px}.el-checkbox.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox:last-of-type{margin-right:0}.el-badge{--el-badge-bg-color:var(--el-color-danger);--el-badge-radius:10px;--el-badge-font-size:12px;--el-badge-padding:6px;--el-badge-size:18px;display:inline-block;position:relative;vertical-align:middle;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.el-badge__content{align-items:center;background-color:var(--el-badge-bg-color);border:1px solid var(--el-bg-color);border-radius:var(--el-badge-radius);color:var(--el-color-white);display:inline-flex;font-size:var(--el-badge-font-size);height:var(--el-badge-size);justify-content:center;padding:0 var(--el-badge-padding);white-space:nowrap}.el-badge__content.is-fixed{position:absolute;right:calc(1px + var(--el-badge-size)/2);top:0;transform:translateY(-50%) translate(100%);z-index:var(--el-index-normal)}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{border-radius:50%;height:8px;padding:0;right:0;width:8px}.el-badge__content--primary{background-color:var(--el-color-primary)}.el-badge__content--success{background-color:var(--el-color-success)}.el-badge__content--warning{background-color:var(--el-color-warning)}.el-badge__content--info{background-color:var(--el-color-info)}.el-badge__content--danger{background-color:var(--el-color-danger)}.el-message{--el-message-bg-color:var(--el-color-info-light-9);--el-message-border-color:var(--el-border-color-lighter);--el-message-padding:11px 15px;--el-message-close-size:16px;--el-message-close-icon-color:var(--el-text-color-placeholder);--el-message-close-hover-color:var(--el-text-color-secondary);align-items:center;background-color:var(--el-message-bg-color);border-color:var(--el-message-border-color);border-radius:var(--el-border-radius-base);border-style:var(--el-border-style);border-width:var(--el-border-width);box-sizing:border-box;display:flex;gap:8px;left:50%;max-width:calc(100% - 32px);padding:var(--el-message-padding);position:fixed;top:20px;transform:translate(-50%);transition:opacity var(--el-transition-duration),transform .4s,top .4s;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.el-message.is-center{justify-content:center}.el-message.is-plain{background-color:var(--el-bg-color-overlay);border-color:var(--el-bg-color-overlay);box-shadow:var(--el-box-shadow-light)}.el-message p{margin:0}.el-message--success{--el-message-bg-color:var(--el-color-success-light-9);--el-message-border-color:var(--el-color-success-light-8);--el-message-text-color:var(--el-color-success)}.el-message--success .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--success{color:var(--el-message-text-color)}.el-message--info{--el-message-bg-color:var(--el-color-info-light-9);--el-message-border-color:var(--el-color-info-light-8);--el-message-text-color:var(--el-color-info)}.el-message--info .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--info{color:var(--el-message-text-color)}.el-message--warning{--el-message-bg-color:var(--el-color-warning-light-9);--el-message-border-color:var(--el-color-warning-light-8);--el-message-text-color:var(--el-color-warning)}.el-message--warning .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--warning{color:var(--el-message-text-color)}.el-message--error{--el-message-bg-color:var(--el-color-error-light-9);--el-message-border-color:var(--el-color-error-light-8);--el-message-text-color:var(--el-color-error)}.el-message--error .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--error{color:var(--el-message-text-color)}.el-message .el-message__badge{position:absolute;right:-8px;top:-8px}.el-message__content{font-size:14px;line-height:1;padding:0}.el-message__content:focus{outline-width:0}.el-message .el-message__closeBtn{color:var(--el-message-close-icon-color);cursor:pointer;font-size:var(--el-message-close-size)}.el-message .el-message__closeBtn:focus{outline-width:0}.el-message .el-message__closeBtn:hover{color:var(--el-message-close-hover-color)}.el-message-fade-enter-from,.el-message-fade-leave-to{opacity:0;transform:translate(-50%,-100%)}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:.5}.v-modal-enter{-webkit-animation:v-modal-in var(--el-transition-duration-fast) ease;animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{-webkit-animation:v-modal-out var(--el-transition-duration-fast) ease forwards;animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@-webkit-keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{to{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-small);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{-webkit-animation:modal-fade-in var(--el-transition-duration);animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{-webkit-animation:dialog-fade-in var(--el-transition-duration);animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{-webkit-animation:modal-fade-out var(--el-transition-duration);animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{-webkit-animation:dialog-fade-out var(--el-transition-duration);animation:dialog-fade-out var(--el-transition-duration)}@-webkit-keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@-webkit-keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@-webkit-keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@-webkit-keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-overlay{background-color:var(--el-overlay-color-lighter);bottom:0;height:100%;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:2000}.el-overlay .el-overlay-root{height:0}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--label-left .el-form-item__label{justify-content:flex-start}.el-form--label-top .el-form-item{display:block}.el-form--label-top .el-form-item .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;text-align:left}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form--large.el-form--label-top .el-form-item .el-form-item__label{line-height:22px;margin-bottom:12px}.el-form--default.el-form--label-top .el-form-item .el-form-item__label{line-height:22px;margin-bottom:8px}.el-form--small.el-form--label-top .el-form-item .el-form-item__label{line-height:20px;margin-bottom:4px}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;justify-content:flex-end;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-input__wrapper,.el-form-item.is-error .el-input__wrapper.is-focus,.el-form-item.is-error .el-input__wrapper:focus,.el-form-item.is-error .el-input__wrapper:hover,.el-form-item.is-error .el-select__wrapper,.el-form-item.is-error .el-select__wrapper.is-focus,.el-form-item.is-error .el-select__wrapper:focus,.el-form-item.is-error .el-select__wrapper:hover,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner.is-focus,.el-form-item.is-error .el-textarea__inner:focus,.el-form-item.is-error .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon{display:inline-flex}.el-tag{--el-tag-font-size:12px;--el-tag-border-radius:4px;--el-tag-border-radius-rounded:9999px;--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary);align-items:center;background-color:var(--el-tag-bg-color);border-color:var(--el-tag-border-color);border-radius:var(--el-tag-border-radius);border-style:solid;border-width:1px;box-sizing:border-box;color:var(--el-tag-text-color);display:inline-flex;font-size:var(--el-tag-font-size);height:24px;justify-content:center;line-height:1;padding:0 9px;vertical-align:middle;white-space:nowrap;--el-icon-size:14px}.el-tag.el-tag--primary{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-bg-color:var(--el-color-success-light-9);--el-tag-border-color:var(--el-color-success-light-8);--el-tag-hover-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-bg-color:var(--el-color-warning-light-9);--el-tag-border-color:var(--el-color-warning-light-8);--el-tag-hover-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-bg-color:var(--el-color-danger-light-9);--el-tag-border-color:var(--el-color-danger-light-8);--el-tag-hover-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-bg-color:var(--el-color-error-light-9);--el-tag-border-color:var(--el-color-error-light-8);--el-tag-hover-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-bg-color:var(--el-color-info-light-9);--el-tag-border-color:var(--el-color-info-light-8);--el-tag-hover-color:var(--el-color-info)}.el-tag.el-tag--primary{--el-tag-text-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-text-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-text-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-text-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-text-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-text-color:var(--el-color-info)}.el-tag.is-hit{border-color:var(--el-color-primary)}.el-tag.is-round{border-radius:var(--el-tag-border-radius-rounded)}.el-tag .el-tag__close{color:var(--el-tag-text-color);flex-shrink:0}.el-tag .el-tag__close:hover{background-color:var(--el-tag-hover-color);color:var(--el-color-white)}.el-tag .el-icon{border-radius:50%;cursor:pointer;font-size:calc(var(--el-icon-size) - 2px);height:var(--el-icon-size);width:var(--el-icon-size)}.el-tag .el-tag__close{margin-left:6px}.el-tag--dark{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3);--el-tag-text-color:var(--el-color-white)}.el-tag--dark.el-tag--primary{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--success{--el-tag-bg-color:var(--el-color-success);--el-tag-border-color:var(--el-color-success);--el-tag-hover-color:var(--el-color-success-light-3)}.el-tag--dark.el-tag--warning{--el-tag-bg-color:var(--el-color-warning);--el-tag-border-color:var(--el-color-warning);--el-tag-hover-color:var(--el-color-warning-light-3)}.el-tag--dark.el-tag--danger{--el-tag-bg-color:var(--el-color-danger);--el-tag-border-color:var(--el-color-danger);--el-tag-hover-color:var(--el-color-danger-light-3)}.el-tag--dark.el-tag--error{--el-tag-bg-color:var(--el-color-error);--el-tag-border-color:var(--el-color-error);--el-tag-hover-color:var(--el-color-error-light-3)}.el-tag--dark.el-tag--info{--el-tag-bg-color:var(--el-color-info);--el-tag-border-color:var(--el-color-info);--el-tag-hover-color:var(--el-color-info-light-3)}.el-tag--dark.el-tag--danger,.el-tag--dark.el-tag--error,.el-tag--dark.el-tag--info,.el-tag--dark.el-tag--primary,.el-tag--dark.el-tag--success,.el-tag--dark.el-tag--warning{--el-tag-text-color:var(--el-color-white)}.el-tag--plain{--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary);--el-tag-bg-color:var(--el-fill-color-blank)}.el-tag--plain.el-tag--primary{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary)}.el-tag--plain.el-tag--success{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-success-light-5);--el-tag-hover-color:var(--el-color-success)}.el-tag--plain.el-tag--warning{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-warning-light-5);--el-tag-hover-color:var(--el-color-warning)}.el-tag--plain.el-tag--danger{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-danger-light-5);--el-tag-hover-color:var(--el-color-danger)}.el-tag--plain.el-tag--error{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-error-light-5);--el-tag-hover-color:var(--el-color-error)}.el-tag--plain.el-tag--info{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-info-light-5);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-closable{padding-right:5px}.el-tag--large{height:32px;padding:0 11px;--el-icon-size:16px}.el-tag--large .el-tag__close{margin-left:8px}.el-tag--large.is-closable{padding-right:7px}.el-tag--small{height:20px;padding:0 7px;--el-icon-size:12px}.el-tag--small .el-tag__close{margin-left:4px}.el-tag--small.is-closable{padding-right:3px}.el-tag--small .el-icon-close{transform:scale(.8)}.el-tag.el-tag--primary.is-hit{border-color:var(--el-color-primary)}.el-tag.el-tag--success.is-hit{border-color:var(--el-color-success)}.el-tag.el-tag--warning.is-hit{border-color:var(--el-color-warning)}.el-tag.el-tag--danger.is-hit{border-color:var(--el-color-danger)}.el-tag.el-tag--error.is-hit{border-color:var(--el-color-error)}.el-tag.el-tag--info.is-hit{border-color:var(--el-color-info)}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after{background-color:var(--el-color-primary);background-position:50%;background-repeat:no-repeat;border-right:none;border-top:none;content:"";height:12px;mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;mask-size:100% 100%;-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;-webkit-mask-size:100% 100%;position:absolute;right:20px;top:50%;transform:translateY(-50%);width:12px}.el-scrollbar{--el-scrollbar-opacity:.3;--el-scrollbar-bg-color:var(--el-text-color-secondary);--el-scrollbar-hover-opacity:.5;--el-scrollbar-hover-bg-color:var(--el-text-color-secondary);height:100%;overflow:hidden;position:relative}.el-scrollbar__wrap{height:100%;overflow:auto}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{display:none}.el-scrollbar__thumb{background-color:var(--el-scrollbar-bg-color,var(--el-text-color-secondary));border-radius:inherit;cursor:pointer;display:block;height:0;opacity:var(--el-scrollbar-opacity,.3);position:relative;transition:var(--el-transition-duration) background-color;width:0}.el-scrollbar__thumb:hover{background-color:var(--el-scrollbar-hover-bg-color,var(--el-text-color-secondary));opacity:var(--el-scrollbar-hover-opacity,.5)}.el-scrollbar__bar{border-radius:4px;bottom:2px;position:absolute;right:2px;z-index:1}.el-scrollbar__bar.is-vertical{top:2px;width:6px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-scrollbar-fade-enter-active{transition:opacity .34s ease-out}.el-scrollbar-fade-leave-active{transition:opacity .12s ease-out}.el-scrollbar-fade-enter-from,.el-scrollbar-fade-leave-active{opacity:0}.el-popper{--el-popper-border-radius:var(--el-popover-border-radius,4px);border-radius:var(--el-popper-border-radius);font-size:12px;line-height:20px;min-width:10px;overflow-wrap:break-word;padding:5px 11px;position:absolute;visibility:visible;z-index:2000}.el-popper.is-dark{background:var(--el-text-color-primary);border:1px solid var(--el-text-color-primary);color:var(--el-bg-color)}.el-popper.is-dark .el-popper__arrow:before{background:var(--el-text-color-primary);border:1px solid var(--el-text-color-primary);right:0}.el-popper.is-light{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light)}.el-popper.is-light .el-popper__arrow:before{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);right:0}.el-popper.is-pure{padding:0}.el-popper__arrow{height:10px;position:absolute;width:10px;z-index:-1}.el-popper__arrow:before{background:var(--el-text-color-primary);box-sizing:border-box;content:" ";height:10px;position:absolute;transform:rotate(45deg);width:10px;z-index:-1}.el-popper[data-popper-placement^=top]>.el-popper__arrow{bottom:-5px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-bottom-right-radius:2px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow{top:-5px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-top-left-radius:2px}.el-popper[data-popper-placement^=left]>.el-popper__arrow{right:-5px}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-top-right-radius:2px}.el-popper[data-popper-placement^=right]>.el-popper__arrow{left:-5px}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-bottom-left-radius:2px}.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-left-color:transparent!important;border-top-color:transparent!important}.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent!important;border-right-color:transparent!important}.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:transparent!important;border-left-color:transparent!important}.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent!important;border-top-color:transparent!important}.el-select-dropdown{border-radius:var(--el-border-radius-base);box-sizing:border-box;z-index:calc(var(--el-index-top) + 1)}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty,.el-select-dropdown__loading{color:var(--el-text-color-secondary);font-size:var(--el-select-font-size);margin:0;padding:10px 0;text-align:center}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{box-sizing:border-box;list-style:none;margin:0;padding:6px 0}.el-select-dropdown__list.el-vl__window{margin:6px 0;padding:0}.el-select-dropdown__header{border-bottom:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__footer{border-top:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__item{box-sizing:border-box;color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-base);height:34px;line-height:34px;overflow:hidden;padding:0 32px 0 20px;position:relative;text-overflow:ellipsis;white-space:nowrap}.el-select-dropdown__item.is-hovering{background-color:var(--el-fill-color-light)}.el-select-dropdown__item.is-selected{color:var(--el-color-primary);font-weight:700}.el-select-dropdown__item.is-disabled{background-color:unset;color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after{background-color:var(--el-color-primary);background-position:50%;background-repeat:no-repeat;border-right:none;border-top:none;content:"";height:12px;mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;mask-size:100% 100%;-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;-webkit-mask-size:100% 100%;position:absolute;right:20px;top:50%;transform:translateY(-50%);width:12px}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-disabled:after{background-color:var(--el-text-color-placeholder)}.el-select-group{margin:0;padding:0}.el-select-group__wrap{list-style:none;margin:0;padding:0;position:relative}.el-select-group__title{color:var(--el-color-info);font-size:12px;line-height:34px;padding-left:20px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-color:var(--el-disabled-text-color);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px;--el-select-width:100%;display:inline-block;position:relative;vertical-align:middle;width:var(--el-select-width)}.el-select__wrapper{align-items:center;background-color:var(--el-fill-color-blank);border-radius:var(--el-border-radius-base);box-shadow:0 0 0 1px var(--el-border-color) inset;box-sizing:border-box;cursor:pointer;display:flex;font-size:14px;gap:6px;line-height:24px;min-height:32px;padding:4px 12px;position:relative;text-align:left;transition:var(--el-transition-duration)}.el-select__wrapper:hover{box-shadow:0 0 0 1px var(--el-text-color) inset}.el-select__wrapper.is-filterable{cursor:text}.el-select__wrapper.is-focused{box-shadow:0 0 0 1px var(--el-color-primary) inset}.el-select__wrapper.is-hovering:not(.is-focused){box-shadow:0 0 0 1px var(--el-border-color-hover) inset}.el-select__wrapper.is-disabled{background-color:var(--el-fill-color-light);box-shadow:0 0 0 1px var(--el-select-disabled-border) inset;color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select__wrapper.is-disabled:hover{box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select__wrapper.is-disabled.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-select__wrapper.is-disabled .el-select__selected-item{color:var(--el-select-disabled-color)}.el-select__wrapper.is-disabled .el-select__caret,.el-select__wrapper.is-disabled .el-tag{cursor:not-allowed}.el-select__prefix,.el-select__suffix{align-items:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));display:flex;flex-shrink:0;gap:6px}.el-select__caret{color:var(--el-select-input-color);cursor:pointer;font-size:var(--el-select-input-font-size);transform:rotate(0);transition:var(--el-transition-duration)}.el-select__caret.is-reverse{transform:rotate(180deg)}.el-select__selection{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:6px;min-width:0;position:relative}.el-select__selection.is-near{margin-left:-8px}.el-select__selection .el-tag{border-color:transparent;cursor:pointer}.el-select__selection .el-tag .el-tag__content{min-width:0}.el-select__selected-item{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-select__tags-text{line-height:normal}.el-select__placeholder,.el-select__tags-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-select__placeholder{color:var(--el-input-text-color,var(--el-text-color-regular));position:absolute;top:50%;transform:translateY(-50%);width:100%}.el-select__placeholder.is-transparent{color:var(--el-text-color-placeholder);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-select__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-box-shadow-light)}.el-select__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-left-color:transparent;border-top-color:transparent}.el-select__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-select__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:transparent;border-left-color:transparent}.el-select__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-select__input-wrapper{max-width:100%}.el-select__input-wrapper.is-hidden{opacity:0;position:absolute}.el-select__input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:none;color:var(--el-select-multiple-input-color);font-family:inherit;font-size:inherit;height:24px;max-width:100%;outline:none;padding:0}.el-select__input.is-disabled{cursor:not-allowed}.el-select__input-calculator{left:0;max-width:100%;overflow:hidden;position:absolute;top:0;visibility:hidden;white-space:pre}.el-select--large .el-select__wrapper{font-size:14px;gap:6px;line-height:24px;min-height:40px;padding:8px 16px}.el-select--large .el-select__selection{gap:6px}.el-select--large .el-select__selection.is-near{margin-left:-8px}.el-select--large .el-select__prefix,.el-select--large .el-select__suffix{gap:6px}.el-select--large .el-select__input{height:24px}.el-select--small .el-select__wrapper{font-size:12px;gap:4px;line-height:20px;min-height:24px;padding:2px 8px}.el-select--small .el-select__selection{gap:4px}.el-select--small .el-select__selection.is-near{margin-left:-6px}.el-select--small .el-select__prefix,.el-select--small .el-select__suffix{gap:4px}.el-select--small .el-select__input{height:20px}.el-input-number{display:inline-flex;line-height:30px;position:relative;width:150px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;line-height:1;text-align:center}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number__decrease,.el-input-number__increase{align-items:center;background:var(--el-fill-color-light);bottom:1px;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:13px;height:auto;justify-content:center;position:absolute;top:1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:32px;z-index:1}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-left:var(--el-border);border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{line-height:38px;width:180px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{font-size:14px;width:40px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{line-height:22px;width:120px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{font-size:12px;width:24px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-bottom:var(--el-border);border-radius:0 var(--el-border-radius-base) 0 0;bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;border-right:none;left:auto;right:1px;top:auto}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.el-switch{--el-switch-on-color:var(--el-color-primary);--el-switch-off-color:var(--el-border-color);align-items:center;display:inline-flex;font-size:14px;height:32px;line-height:20px;position:relative;vertical-align:middle}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{color:var(--el-text-color-primary);cursor:pointer;display:inline-block;font-size:14px;font-weight:500;height:20px;transition:var(--el-transition-duration-fast);vertical-align:middle}.el-switch__label.is-active{color:var(--el-color-primary)}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{display:inline-block;font-size:14px;line-height:1}.el-switch__label .el-icon{height:inherit}.el-switch__label .el-icon svg{vertical-align:middle}.el-switch__input{height:0;margin:0;opacity:0;position:absolute;width:0}.el-switch__input:focus-visible~.el-switch__core{outline:2px solid var(--el-switch-on-color);outline-offset:1px}.el-switch__core{align-items:center;background:var(--el-switch-off-color);border:1px solid var(--el-switch-border-color,var(--el-switch-off-color));border-radius:10px;box-sizing:border-box;cursor:pointer;display:inline-flex;height:20px;min-width:40px;outline:none;position:relative;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration)}.el-switch__core .el-switch__inner{align-items:center;display:flex;height:16px;justify-content:center;overflow:hidden;padding:0 4px 0 18px;transition:all var(--el-transition-duration);width:100%}.el-switch__core .el-switch__inner .is-icon,.el-switch__core .el-switch__inner .is-text{color:var(--el-color-white);font-size:12px;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap}.el-switch__core .el-switch__action{align-items:center;background-color:var(--el-color-white);border-radius:var(--el-border-radius-circle);color:var(--el-switch-off-color);display:flex;height:16px;justify-content:center;left:1px;position:absolute;transition:all var(--el-transition-duration);width:16px}.el-switch.is-checked .el-switch__core{background-color:var(--el-switch-on-color);border-color:var(--el-switch-border-color,var(--el-switch-on-color))}.el-switch.is-checked .el-switch__core .el-switch__action{color:var(--el-switch-on-color);left:calc(100% - 17px)}.el-switch.is-checked .el-switch__core .el-switch__inner{padding:0 18px 0 4px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter-from,.el-switch .label-fade-leave-active{opacity:0}.el-switch--large{font-size:14px;height:40px;line-height:24px}.el-switch--large .el-switch__label{font-size:14px;height:24px}.el-switch--large .el-switch__label *{font-size:14px}.el-switch--large .el-switch__core{border-radius:12px;height:24px;min-width:50px}.el-switch--large .el-switch__core .el-switch__inner{height:20px;padding:0 6px 0 22px}.el-switch--large .el-switch__core .el-switch__action{height:20px;width:20px}.el-switch--large.is-checked .el-switch__core .el-switch__action{left:calc(100% - 21px)}.el-switch--large.is-checked .el-switch__core .el-switch__inner{padding:0 22px 0 6px}.el-switch--small{font-size:12px;height:24px;line-height:16px}.el-switch--small .el-switch__label{font-size:12px;height:16px}.el-switch--small .el-switch__label *{font-size:12px}.el-switch--small .el-switch__core{border-radius:8px;height:16px;min-width:30px}.el-switch--small .el-switch__core .el-switch__inner{height:12px;padding:0 2px 0 14px}.el-switch--small .el-switch__core .el-switch__action{height:12px;width:12px}.el-switch--small.is-checked .el-switch__core .el-switch__action{left:calc(100% - 13px)}.el-switch--small.is-checked .el-switch__core .el-switch__inner{padding:0 14px 0 2px} diff --git a/app/src/main/assets/web/vue/assets/vendor-S5atAh6y.css b/app/src/main/assets/web/vue/assets/vendor-S5atAh6y.css new file mode 100644 index 000000000000..e7544d035619 --- /dev/null +++ b/app/src/main/assets/web/vue/assets/vendor-S5atAh6y.css @@ -0,0 +1 @@ +@charset "UTF-8";:root{--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary-rgb:64,158,255;--el-color-success-rgb:103,194,58;--el-color-warning-rgb:230,162,60;--el-color-danger-rgb:245,108,108;--el-color-error-rgb:245,108,108;--el-color-info-rgb:144,147,153;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:"Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-transition-duration:.3s;--el-transition-duration-fast:.2s;--el-transition-function-ease-in-out-bezier:cubic-bezier(.645,.045,.355,1);--el-transition-function-fast-bezier:cubic-bezier(.23,1,.32,1);--el-transition-all:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);--el-transition-fade:opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-md-fade:transform var(--el-transition-duration) var(--el-transition-function-fast-bezier),opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-fade-linear:opacity var(--el-transition-duration-fast) linear;--el-transition-border:border-color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-box-shadow:box-shadow var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-color:color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-component-size-large:40px;--el-component-size:32px;--el-component-size-small:24px;color-scheme:light;--el-color-primary:#409eff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-primary-dark-2:#337ecc;--el-color-success:#67c23a;--el-color-success-light-3:#95d475;--el-color-success-light-5:#b3e19d;--el-color-success-light-7:#d1edc4;--el-color-success-light-8:#e1f3d8;--el-color-success-light-9:#f0f9eb;--el-color-success-dark-2:#529b2e;--el-color-warning:#e6a23c;--el-color-warning-light-3:#eebe77;--el-color-warning-light-5:#f3d19e;--el-color-warning-light-7:#f8e3c5;--el-color-warning-light-8:#faecd8;--el-color-warning-light-9:#fdf6ec;--el-color-warning-dark-2:#b88230;--el-color-danger:#f56c6c;--el-color-danger-light-3:#f89898;--el-color-danger-light-5:#fab6b6;--el-color-danger-light-7:#fcd3d3;--el-color-danger-light-8:#fde2e2;--el-color-danger-light-9:#fef0f0;--el-color-danger-dark-2:#c45656;--el-color-error:#f56c6c;--el-color-error-light-3:#f89898;--el-color-error-light-5:#fab6b6;--el-color-error-light-7:#fcd3d3;--el-color-error-light-8:#fde2e2;--el-color-error-light-9:#fef0f0;--el-color-error-dark-2:#c45656;--el-color-info:#909399;--el-color-info-light-3:#b1b3b8;--el-color-info-light-5:#c8c9cc;--el-color-info-light-7:#dedfe0;--el-color-info-light-8:#e9e9eb;--el-color-info-light-9:#f4f4f5;--el-color-info-dark-2:#73767a;--el-bg-color:#ffffff;--el-bg-color-page:#f2f3f5;--el-bg-color-overlay:#ffffff;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#a8abb2;--el-text-color-disabled:#c0c4cc;--el-border-color:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-border-color-dark:#d4d7de;--el-border-color-darker:#cdd0d6;--el-fill-color:#f0f2f5;--el-fill-color-light:#f5f7fa;--el-fill-color-lighter:#fafafa;--el-fill-color-extra-light:#fafcff;--el-fill-color-dark:#ebedf0;--el-fill-color-darker:#e6e8eb;--el-fill-color-blank:#ffffff;--el-box-shadow:0px 12px 32px 4px rgba(0,0,0,.04),0px 8px 20px rgba(0,0,0,.08);--el-box-shadow-light:0px 0px 12px rgba(0,0,0,.12);--el-box-shadow-lighter:0px 0px 6px rgba(0,0,0,.12);--el-box-shadow-dark:0px 16px 48px 16px rgba(0,0,0,.08),0px 12px 32px rgba(0,0,0,.12),0px 8px 16px -8px rgba(0,0,0,.16);--el-disabled-bg-color:var(--el-fill-color-light);--el-disabled-text-color:var(--el-text-color-placeholder);--el-disabled-border-color:var(--el-border-color-light);--el-overlay-color:rgba(0,0,0,.8);--el-overlay-color-light:rgba(0,0,0,.7);--el-overlay-color-lighter:rgba(0,0,0,.5);--el-mask-color:rgba(255,255,255,.9);--el-mask-color-extra-light:rgba(255,255,255,.3);--el-border-width:1px;--el-border-style:solid;--el-border-color-hover:var(--el-text-color-disabled);--el-border:var(--el-border-width) var(--el-border-style) var(--el-border-color);--el-svg-monochrome-grey:var(--el-border-color)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transform:scaleY(1);transform-origin:center top;transition:var(--el-transition-md-fade)}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transform:scaleY(1);transform-origin:center bottom;transition:var(--el-transition-md-fade)}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transform:scale(1);transform-origin:top left;transition:var(--el-transition-md-fade)}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-enter-active,.el-collapse-transition-leave-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-icon-loading{animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(1turn)}}.el-icon{--color:inherit;align-items:center;display:inline-flex;height:1em;justify-content:center;line-height:1em;position:relative;width:1em;fill:currentColor;color:var(--color);font-size:inherit}.el-icon.is-loading{animation:rotating 2s linear infinite}.el-icon svg{height:1em;width:1em}.el-tabs{--el-tabs-header-height:40px;display:flex}.el-tabs__header{align-items:center;display:flex;justify-content:space-between;margin:0 0 15px;padding:0;position:relative}.el-tabs__header-vertical{flex-direction:column}.el-tabs__active-bar{background-color:var(--el-color-primary);bottom:0;height:2px;left:0;list-style:none;position:absolute;transition:width var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),transform var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);z-index:1}.el-tabs__new-tab{align-items:center;border:1px solid var(--el-border-color);border-radius:3px;color:var(--el-text-color-primary);cursor:pointer;display:flex;font-size:12px;height:20px;justify-content:center;line-height:20px;margin:10px 0 10px 10px;text-align:center;transition:all .15s;width:20px}.el-tabs__new-tab .is-icon-plus{height:inherit;transform:scale(.8);width:inherit}.el-tabs__new-tab .is-icon-plus svg{vertical-align:middle}.el-tabs__new-tab:hover{color:var(--el-color-primary)}.el-tabs__new-tab-vertical{margin-left:0}.el-tabs__nav-wrap{flex:1 auto;margin-bottom:-1px;overflow:hidden;position:relative}.el-tabs__nav-wrap:after{background-color:var(--el-border-color-light);bottom:0;content:"";height:2px;left:0;position:absolute;width:100%;z-index:var(--el-index-normal)}.el-tabs__nav-wrap.is-scrollable{box-sizing:border-box;padding:0 20px}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{color:var(--el-text-color-secondary);cursor:pointer;font-size:12px;line-height:44px;position:absolute;text-align:center;width:20px}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{display:flex;float:left;position:relative;transition:transform var(--el-transition-duration);white-space:nowrap;z-index:calc(var(--el-index-normal) + 1)}.el-tabs__nav.is-stretch{display:flex;min-width:100%}.el-tabs__nav.is-stretch>*{flex:1;text-align:center}.el-tabs__item{align-items:center;box-sizing:border-box;color:var(--el-text-color-primary);display:flex;font-size:var(--el-font-size-base);font-weight:500;height:var(--el-tabs-header-height);justify-content:center;list-style:none;padding:0 20px;position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:none}.el-tabs__item:focus-visible{border-radius:3px;box-shadow:0 0 2px 2px var(--el-color-primary) inset}.el-tabs__item .is-icon-close{border-radius:50%;margin-left:5px;text-align:center;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs__item .is-icon-close:before{display:inline-block;transform:scale(.9)}.el-tabs__item .is-icon-close:hover{background-color:var(--el-text-color-placeholder);color:#fff}.el-tabs__item.is-active,.el-tabs__item:hover{color:var(--el-color-primary)}.el-tabs__item:hover{cursor:pointer}.el-tabs__item.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-tabs__content{flex-grow:1;overflow:hidden;position:relative}.el-tabs--bottom>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:0}.el-tabs--bottom>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top>.el-tabs__header .el-tabs__item:last-child{padding-right:0}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--card>.el-tabs__header{border-bottom:1px solid var(--el-border-color-light);height:var(--el-tabs-header-height)}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid var(--el-border-color-light);border-bottom:none;border-radius:4px 4px 0 0;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .is-icon-close{font-size:12px;height:14px;overflow:hidden;position:relative;right:-2px;transform-origin:100% 50%;width:0}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid var(--el-border-color-light);transition:color var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),padding var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .is-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:var(--el-bg-color)}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .is-icon-close{width:14px}.el-tabs--border-card{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:var(--el-fill-color-light);border-bottom:1px solid var(--el-border-color-light);margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{border:1px solid transparent;color:var(--el-text-color-secondary);margin-top:-1px;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item,.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{background-color:var(--el-bg-color-overlay);border-left-color:var(--el-border-color);border-right-color:var(--el-border-color);color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:var(--el-disabled-text-color)}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom{flex-direction:column}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid var(--el-border-color)}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-bottom:0;margin-top:-1px}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{bottom:auto;height:auto;top:0;width:2px}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{cursor:pointer;height:30px;line-height:30px;text-align:center;width:100%}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{bottom:0;right:auto}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{bottom:auto;height:100%;top:0;width:2px}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{flex-direction:column}.el-tabs--left .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-left{justify-content:flex-end}.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-right{justify-content:flex-start}.el-tabs--left{flex-direction:row-reverse}.el-tabs--left .el-tabs__header.is-left{margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__nav-wrap.is-left:after{left:auto;right:0}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left{display:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-bottom:none;border-left:none;border-right:1px solid var(--el-border-color-light);border-top:1px solid var(--el-border-color-light);text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid var(--el-border-color-light);border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left:none;border-right:1px solid #fff}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-radius:4px 0 0 4px;border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid var(--el-border-color)}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:rgb(209,219,229) transparent}.el-tabs--right .el-tabs__header.is-right{margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid var(--el-border-color-light)}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid var(--el-border-color-light);border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid var(--el-border-color-light);border-bottom:none;border-left:1px solid #fff;border-right:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-bottom:1px solid var(--el-border-color-light);border-left:none;border-radius:0 4px 4px 0}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid var(--el-border-color)}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:rgb(209,219,229) transparent}.el-tabs--top{flex-direction:column-reverse}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{animation:slideInRight-enter var(--el-transition-duration)}.slideInRight-leave{animation:slideInRight-leave var(--el-transition-duration);left:0;position:absolute;right:0}.slideInLeft-enter{animation:slideInLeft-enter var(--el-transition-duration)}.slideInLeft-leave{animation:slideInLeft-leave var(--el-transition-duration);left:0;position:absolute;right:0}@keyframes slideInRight-enter{0%{opacity:0;transform:translate(100%);transform-origin:0 0}to{opacity:1;transform:translate(0);transform-origin:0 0}}@keyframes slideInRight-leave{0%{opacity:1;transform:translate(0);transform-origin:0 0}to{opacity:0;transform:translate(100%);transform-origin:0 0}}@keyframes slideInLeft-enter{0%{opacity:0;transform:translate(-100%);transform-origin:0 0}to{opacity:1;transform:translate(0);transform-origin:0 0}}@keyframes slideInLeft-leave{0%{opacity:1;transform:translate(0);transform-origin:0 0}to{opacity:0;transform:translate(-100%);transform-origin:0 0}}.el-text{--el-text-font-size:var(--el-font-size-base);--el-text-color:var(--el-text-color-regular);align-self:center;color:var(--el-text-color);font-size:var(--el-text-font-size);margin:0;overflow-wrap:break-word;padding:0}.el-text.is-truncated{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-text.is-line-clamp{display:-webkit-inline-box;-webkit-box-orient:vertical;overflow:hidden}.el-text--large{--el-text-font-size:var(--el-font-size-medium)}.el-text--default{--el-text-font-size:var(--el-font-size-base)}.el-text--small{--el-text-font-size:var(--el-font-size-extra-small)}.el-text.el-text--primary{--el-text-color:var(--el-color-primary)}.el-text.el-text--success{--el-text-color:var(--el-color-success)}.el-text.el-text--warning{--el-text-color:var(--el-color-warning)}.el-text.el-text--danger{--el-text-color:var(--el-color-danger)}.el-text.el-text--error{--el-text-color:var(--el-color-error)}.el-text.el-text--info{--el-text-color:var(--el-color-info)}.el-text>.el-icon{vertical-align:-2px}.el-link{--el-link-font-size:var(--el-font-size-base);--el-link-font-weight:var(--el-font-weight-primary);--el-link-text-color:var(--el-text-color-regular);--el-link-hover-text-color:var(--el-color-primary);--el-link-disabled-text-color:var(--el-text-color-placeholder);align-items:center;color:var(--el-link-text-color);cursor:pointer;display:inline-flex;flex-direction:row;font-size:var(--el-link-font-size);font-weight:var(--el-link-font-weight);justify-content:center;outline:none;padding:0;position:relative;text-decoration:none;vertical-align:middle}.el-link:hover{color:var(--el-link-hover-text-color)}.el-link.is-underline:hover:after{border-bottom:1px solid var(--el-link-hover-text-color);bottom:0;content:"";height:0;left:0;position:absolute;right:0}.el-link.is-disabled{color:var(--el-link-disabled-text-color);cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default:after{border-color:var(--el-link-hover-text-color)}.el-link__inner{align-items:center;display:inline-flex;justify-content:center}.el-link.el-link--primary{--el-link-text-color:var(--el-color-primary);--el-link-hover-text-color:var(--el-color-primary-light-3);--el-link-disabled-text-color:var(--el-color-primary-light-5)}.el-link.el-link--primary.is-underline:hover:after,.el-link.el-link--primary:after{border-color:var(--el-link-text-color)}.el-link.el-link--success{--el-link-text-color:var(--el-color-success);--el-link-hover-text-color:var(--el-color-success-light-3);--el-link-disabled-text-color:var(--el-color-success-light-5)}.el-link.el-link--success.is-underline:hover:after,.el-link.el-link--success:after{border-color:var(--el-link-text-color)}.el-link.el-link--warning{--el-link-text-color:var(--el-color-warning);--el-link-hover-text-color:var(--el-color-warning-light-3);--el-link-disabled-text-color:var(--el-color-warning-light-5)}.el-link.el-link--warning.is-underline:hover:after,.el-link.el-link--warning:after{border-color:var(--el-link-text-color)}.el-link.el-link--danger{--el-link-text-color:var(--el-color-danger);--el-link-hover-text-color:var(--el-color-danger-light-3);--el-link-disabled-text-color:var(--el-color-danger-light-5)}.el-link.el-link--danger.is-underline:hover:after,.el-link.el-link--danger:after{border-color:var(--el-link-text-color)}.el-link.el-link--error{--el-link-text-color:var(--el-color-error);--el-link-hover-text-color:var(--el-color-error-light-3);--el-link-disabled-text-color:var(--el-color-error-light-5)}.el-link.el-link--error.is-underline:hover:after,.el-link.el-link--error:after{border-color:var(--el-link-text-color)}.el-link.el-link--info{--el-link-text-color:var(--el-color-info);--el-link-hover-text-color:var(--el-color-info-light-3);--el-link-disabled-text-color:var(--el-color-info-light-5)}.el-link.el-link--info.is-underline:hover:after,.el-link.el-link--info:after{border-color:var(--el-link-text-color)}.el-checkbox-group{font-size:0;line-height:0}.el-button{--el-button-font-weight:var(--el-font-weight-primary);--el-button-border-color:var(--el-border-color);--el-button-bg-color:var(--el-fill-color-blank);--el-button-text-color:var(--el-text-color-regular);--el-button-disabled-text-color:var(--el-disabled-text-color);--el-button-disabled-bg-color:var(--el-fill-color-blank);--el-button-disabled-border-color:var(--el-border-color-light);--el-button-divide-border-color:rgba(255,255,255,.5);--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-7);--el-button-active-text-color:var(--el-button-hover-text-color);--el-button-active-border-color:var(--el-color-primary);--el-button-active-bg-color:var(--el-button-hover-bg-color);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-hover-link-text-color:var(--el-color-info);--el-button-active-color:var(--el-text-color-primary);align-items:center;-webkit-appearance:none;background-color:var(--el-button-bg-color);border:var(--el-border);border-color:var(--el-button-border-color);box-sizing:border-box;color:var(--el-button-text-color);cursor:pointer;display:inline-flex;font-weight:var(--el-button-font-weight);height:32px;justify-content:center;line-height:1;outline:none;text-align:center;transition:.1s;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.el-button:hover{background-color:var(--el-button-hover-bg-color);border-color:var(--el-button-hover-border-color);color:var(--el-button-hover-text-color);outline:none}.el-button:active{background-color:var(--el-button-active-bg-color);border-color:var(--el-button-active-border-color);color:var(--el-button-active-text-color);outline:none}.el-button:focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset 0s,outline 0s}.el-button>span{align-items:center;display:inline-flex}.el-button+.el-button{margin-left:12px}.el-button{border-radius:var(--el-border-radius-base);font-size:var(--el-font-size-base)}.el-button,.el-button.is-round{padding:8px 15px}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon]+span{margin-left:6px}.el-button [class*=el-icon] svg{vertical-align:bottom}.el-button.is-plain{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary)}.el-button.is-active{background-color:var(--el-button-active-bg-color);border-color:var(--el-button-active-border-color);color:var(--el-button-active-text-color);outline:none}.el-button.is-disabled,.el-button.is-disabled:hover{background-color:var(--el-button-disabled-bg-color);background-image:none;border-color:var(--el-button-disabled-border-color);color:var(--el-button-disabled-text-color);cursor:not-allowed}.el-button.is-loading{pointer-events:none;position:relative}.el-button.is-loading:before{background-color:var(--el-mask-color-extra-light);border-radius:inherit;bottom:-1px;content:"";left:-1px;pointer-events:none;position:absolute;right:-1px;top:-1px;z-index:1}.el-button.is-round{border-radius:var(--el-border-radius-round)}.el-button.is-circle{border-radius:50%;padding:8px;width:32px}.el-button.is-text{background-color:transparent;border:0 solid transparent;color:var(--el-button-text-color)}.el-button.is-text.is-disabled{background-color:transparent!important;color:var(--el-button-disabled-text-color)}.el-button.is-text:not(.is-disabled):hover{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled):focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px;transition:outline-offset 0s,outline 0s}.el-button.is-text:not(.is-disabled):active{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled).is-has-bg:hover{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg:active{background-color:var(--el-fill-color-dark)}.el-button__text--expand{letter-spacing:.3em;margin-right:-.3em}.el-button.is-link{background:transparent;border-color:transparent;color:var(--el-button-text-color);height:auto;padding:2px}.el-button.is-link:hover{color:var(--el-button-hover-link-text-color)}.el-button.is-link.is-disabled{background-color:transparent!important;border-color:transparent!important;color:var(--el-button-disabled-text-color)}.el-button.is-link:not(.is-disabled):active,.el-button.is-link:not(.is-disabled):hover{background-color:transparent;border-color:transparent}.el-button.is-link:not(.is-disabled):active{color:var(--el-button-active-color)}.el-button--text{background:transparent;border-color:transparent;color:var(--el-color-primary);padding-left:0;padding-right:0}.el-button--text.is-disabled{background-color:transparent!important;border-color:transparent!important;color:var(--el-button-disabled-text-color)}.el-button--text:not(.is-disabled):hover{background-color:transparent;border-color:transparent;color:var(--el-color-primary-light-3)}.el-button--text:not(.is-disabled):active{background-color:transparent;border-color:transparent;color:var(--el-color-primary-dark-2)}.el-button__link--expand{letter-spacing:.3em;margin-right:-.3em}.el-button--primary{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-primary);--el-button-border-color:var(--el-color-primary);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-active-color:var(--el-color-primary-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-primary-light-5);--el-button-hover-bg-color:var(--el-color-primary-light-3);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-primary-light-5);--el-button-disabled-border-color:var(--el-color-primary-light-5)}.el-button--primary.is-link,.el-button--primary.is-plain,.el-button--primary.is-text{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-primary);--el-button-hover-border-color:var(--el-color-primary);--el-button-active-text-color:var(--el-color-white)}.el-button--primary.is-link.is-disabled,.el-button--primary.is-link.is-disabled:active,.el-button--primary.is-link.is-disabled:focus,.el-button--primary.is-link.is-disabled:hover,.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover,.el-button--primary.is-text.is-disabled,.el-button--primary.is-text.is-disabled:active,.el-button--primary.is-text.is-disabled:focus,.el-button--primary.is-text.is-disabled:hover{background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8);color:var(--el-color-primary-light-5)}.el-button--success{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-success);--el-button-border-color:var(--el-color-success);--el-button-outline-color:var(--el-color-success-light-5);--el-button-active-color:var(--el-color-success-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-success-light-5);--el-button-hover-bg-color:var(--el-color-success-light-3);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-bg-color:var(--el-color-success-dark-2);--el-button-active-border-color:var(--el-color-success-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-success-light-5);--el-button-disabled-border-color:var(--el-color-success-light-5)}.el-button--success.is-link,.el-button--success.is-plain,.el-button--success.is-text{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-success);--el-button-hover-border-color:var(--el-color-success);--el-button-active-text-color:var(--el-color-white)}.el-button--success.is-link.is-disabled,.el-button--success.is-link.is-disabled:active,.el-button--success.is-link.is-disabled:focus,.el-button--success.is-link.is-disabled:hover,.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover,.el-button--success.is-text.is-disabled,.el-button--success.is-text.is-disabled:active,.el-button--success.is-text.is-disabled:focus,.el-button--success.is-text.is-disabled:hover{background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8);color:var(--el-color-success-light-5)}.el-button--warning{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-warning);--el-button-border-color:var(--el-color-warning);--el-button-outline-color:var(--el-color-warning-light-5);--el-button-active-color:var(--el-color-warning-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-warning-light-5);--el-button-hover-bg-color:var(--el-color-warning-light-3);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-bg-color:var(--el-color-warning-dark-2);--el-button-active-border-color:var(--el-color-warning-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-warning-light-5);--el-button-disabled-border-color:var(--el-color-warning-light-5)}.el-button--warning.is-link,.el-button--warning.is-plain,.el-button--warning.is-text{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-warning);--el-button-hover-border-color:var(--el-color-warning);--el-button-active-text-color:var(--el-color-white)}.el-button--warning.is-link.is-disabled,.el-button--warning.is-link.is-disabled:active,.el-button--warning.is-link.is-disabled:focus,.el-button--warning.is-link.is-disabled:hover,.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover,.el-button--warning.is-text.is-disabled,.el-button--warning.is-text.is-disabled:active,.el-button--warning.is-text.is-disabled:focus,.el-button--warning.is-text.is-disabled:hover{background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8);color:var(--el-color-warning-light-5)}.el-button--danger{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-danger);--el-button-border-color:var(--el-color-danger);--el-button-outline-color:var(--el-color-danger-light-5);--el-button-active-color:var(--el-color-danger-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-danger-light-5);--el-button-hover-bg-color:var(--el-color-danger-light-3);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-bg-color:var(--el-color-danger-dark-2);--el-button-active-border-color:var(--el-color-danger-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-danger-light-5);--el-button-disabled-border-color:var(--el-color-danger-light-5)}.el-button--danger.is-link,.el-button--danger.is-plain,.el-button--danger.is-text{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-danger);--el-button-hover-border-color:var(--el-color-danger);--el-button-active-text-color:var(--el-color-white)}.el-button--danger.is-link.is-disabled,.el-button--danger.is-link.is-disabled:active,.el-button--danger.is-link.is-disabled:focus,.el-button--danger.is-link.is-disabled:hover,.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover,.el-button--danger.is-text.is-disabled,.el-button--danger.is-text.is-disabled:active,.el-button--danger.is-text.is-disabled:focus,.el-button--danger.is-text.is-disabled:hover{background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8);color:var(--el-color-danger-light-5)}.el-button--info{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-info);--el-button-border-color:var(--el-color-info);--el-button-outline-color:var(--el-color-info-light-5);--el-button-active-color:var(--el-color-info-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-info-light-5);--el-button-hover-bg-color:var(--el-color-info-light-3);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-bg-color:var(--el-color-info-dark-2);--el-button-active-border-color:var(--el-color-info-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-info-light-5);--el-button-disabled-border-color:var(--el-color-info-light-5)}.el-button--info.is-link,.el-button--info.is-plain,.el-button--info.is-text{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-info);--el-button-hover-border-color:var(--el-color-info);--el-button-active-text-color:var(--el-color-white)}.el-button--info.is-link.is-disabled,.el-button--info.is-link.is-disabled:active,.el-button--info.is-link.is-disabled:focus,.el-button--info.is-link.is-disabled:hover,.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover,.el-button--info.is-text.is-disabled,.el-button--info.is-text.is-disabled:active,.el-button--info.is-text.is-disabled:focus,.el-button--info.is-text.is-disabled:hover{background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8);color:var(--el-color-info-light-5)}.el-button--large{--el-button-size:40px;height:var(--el-button-size)}.el-button--large [class*=el-icon]+span{margin-left:8px}.el-button--large{border-radius:var(--el-border-radius-base);font-size:var(--el-font-size-base);padding:12px 19px}.el-button--large.is-round{padding:12px 19px}.el-button--large.is-circle{padding:12px;width:var(--el-button-size)}.el-button--small{--el-button-size:24px;height:var(--el-button-size)}.el-button--small [class*=el-icon]+span{margin-left:4px}.el-button--small{border-radius:calc(var(--el-border-radius-base) - 1px);font-size:12px;padding:5px 11px}.el-button--small.is-round{padding:5px 11px}.el-button--small.is-circle{padding:5px;width:var(--el-button-size)}.el-textarea{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;display:inline-block;font-size:var(--el-font-size-base);position:relative;vertical-align:bottom;width:100%}.el-textarea__inner{-webkit-appearance:none;background-color:var(--el-input-bg-color,var(--el-fill-color-blank));background-image:none;border:none;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;box-sizing:border-box;color:var(--el-input-text-color,var(--el-text-color-regular));display:block;font-family:inherit;font-size:inherit;line-height:1.5;padding:5px 11px;position:relative;resize:vertical;transition:var(--el-transition-box-shadow);width:100%}.el-textarea__inner::-moz-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-textarea__inner:focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset;outline:none}.el-textarea .el-input__count{background:var(--el-fill-color-blank);bottom:5px;color:var(--el-color-info);font-size:12px;line-height:14px;position:absolute;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:var(--el-disabled-bg-color);box-shadow:0 0 0 1px var(--el-disabled-border-color) inset;color:var(--el-disabled-text-color);cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-exceed .el-textarea__inner{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-textarea.is-exceed .el-input__count{color:var(--el-color-danger)}.el-input{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);--el-input-width:100%;--el-input-height:var(--el-component-size);box-sizing:border-box;display:inline-flex;font-size:var(--el-font-size-base);line-height:var(--el-input-height);position:relative;vertical-align:middle;width:var(--el-input-width)}.el-input::-webkit-scrollbar{width:6px;z-index:11}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{background:var(--el-text-color-disabled);border-radius:5px;width:6px}.el-input::-webkit-scrollbar-corner,.el-input::-webkit-scrollbar-track{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track-piece{background:var(--el-fill-color-blank);width:6px}.el-input .el-input__clear,.el-input .el-input__password{color:var(--el-input-icon-color);cursor:pointer;font-size:14px}.el-input .el-input__clear:hover,.el-input .el-input__password:hover{color:var(--el-input-clear-hover-color)}.el-input .el-input__count{align-items:center;color:var(--el-color-info);display:inline-flex;font-size:12px;height:100%}.el-input .el-input__count .el-input__count-inner{background:var(--el-fill-color-blank);display:inline-block;line-height:normal;padding-left:8px}.el-input__wrapper{align-items:center;background-color:var(--el-input-bg-color,var(--el-fill-color-blank));background-image:none;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;cursor:text;display:inline-flex;flex-grow:1;justify-content:center;padding:1px 11px;transform:translateZ(0);transition:var(--el-transition-box-shadow)}.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 32px) - 2px);-webkit-appearance:none;background:none;border:none;box-sizing:border-box;color:var(--el-input-text-color,var(--el-text-color-regular));flex-grow:1;font-size:inherit;height:var(--el-input-inner-height);line-height:var(--el-input-inner-height);outline:none;padding:0;width:100%}.el-input__inner:focus{outline:none}.el-input__inner::-moz-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner[type=password]::-ms-reveal{display:none}.el-input__inner[type=number]{line-height:1}.el-input__prefix{color:var(--el-input-icon-color,var(--el-text-color-placeholder));display:inline-flex;flex-shrink:0;flex-wrap:nowrap;height:100%;pointer-events:none;text-align:center;transition:all var(--el-transition-duration);white-space:nowrap}.el-input__prefix-inner{align-items:center;display:inline-flex;justify-content:center;pointer-events:all}.el-input__prefix-inner>:last-child{margin-right:8px}.el-input__prefix-inner>:first-child,.el-input__prefix-inner>:first-child.el-input__icon{margin-left:0}.el-input__suffix{color:var(--el-input-icon-color,var(--el-text-color-placeholder));display:inline-flex;flex-shrink:0;flex-wrap:nowrap;height:100%;pointer-events:none;text-align:center;transition:all var(--el-transition-duration);white-space:nowrap}.el-input__suffix-inner{align-items:center;display:inline-flex;justify-content:center;pointer-events:all}.el-input__suffix-inner>:first-child{margin-left:8px}.el-input .el-input__icon{align-items:center;display:flex;height:inherit;justify-content:center;line-height:inherit;margin-left:8px;transition:all var(--el-transition-duration)}.el-input__validateIcon{pointer-events:none}.el-input.is-active .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-color, ) inset}.el-input.is-disabled{cursor:not-allowed}.el-input.is-disabled .el-input__wrapper{background-color:var(--el-disabled-bg-color);box-shadow:0 0 0 1px var(--el-disabled-border-color) inset}.el-input.is-disabled .el-input__inner{color:var(--el-disabled-text-color);-webkit-text-fill-color:var(--el-disabled-text-color);cursor:not-allowed}.el-input.is-disabled .el-input__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input.is-exceed .el-input__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-input.is-exceed .el-input__suffix .el-input__count{color:var(--el-color-danger)}.el-input--large{--el-input-height:var(--el-component-size-large);font-size:14px}.el-input--large .el-input__wrapper{padding:1px 15px}.el-input--large .el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 40px) - 2px)}.el-input--small{--el-input-height:var(--el-component-size-small);font-size:12px}.el-input--small .el-input__wrapper{padding:1px 7px}.el-input--small .el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 24px) - 2px)}.el-input-group{align-items:stretch;display:inline-flex;width:100%}.el-input-group__append,.el-input-group__prepend{align-items:center;background-color:var(--el-fill-color-light);border-radius:var(--el-input-border-radius);color:var(--el-color-info);display:inline-flex;justify-content:center;min-height:100%;padding:0 20px;position:relative;white-space:nowrap}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:none}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:0 -20px}.el-input-group__append button.el-button,.el-input-group__append button.el-button:hover,.el-input-group__append div.el-select .el-select__wrapper,.el-input-group__append div.el-select:hover .el-select__wrapper,.el-input-group__prepend button.el-button,.el-input-group__prepend button.el-button:hover,.el-input-group__prepend div.el-select .el-select__wrapper,.el-input-group__prepend div.el-select:hover .el-select__wrapper{background-color:transparent;border-color:transparent;color:inherit}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{border-bottom-right-radius:0;border-right:0;border-top-right-radius:0;box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset}.el-input-group__append{border-left:0;box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset}.el-input-group--prepend>.el-input__wrapper,.el-input-group__append{border-bottom-left-radius:0;border-top-left-radius:0}.el-input-group--prepend .el-input-group__prepend .el-select .el-select__wrapper{border-bottom-right-radius:0;border-top-right-radius:0;box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset}.el-input-group--append>.el-input__wrapper{border-bottom-right-radius:0;border-top-right-radius:0}.el-input-group--append .el-input-group__append .el-select .el-select__wrapper{border-bottom-left-radius:0;border-top-left-radius:0;box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset}.el-input-hidden{display:none!important}.el-checkbox{--el-checkbox-font-size:14px;--el-checkbox-font-weight:var(--el-font-weight-primary);--el-checkbox-text-color:var(--el-text-color-regular);--el-checkbox-input-height:14px;--el-checkbox-input-width:14px;--el-checkbox-border-radius:var(--el-border-radius-small);--el-checkbox-bg-color:var(--el-fill-color-blank);--el-checkbox-input-border:var(--el-border);--el-checkbox-disabled-border-color:var(--el-border-color);--el-checkbox-disabled-input-fill:var(--el-fill-color-light);--el-checkbox-disabled-icon-color:var(--el-text-color-placeholder);--el-checkbox-disabled-checked-input-fill:var(--el-border-color-extra-light);--el-checkbox-disabled-checked-input-border-color:var(--el-border-color);--el-checkbox-disabled-checked-icon-color:var(--el-text-color-placeholder);--el-checkbox-checked-text-color:var(--el-color-primary);--el-checkbox-checked-input-border-color:var(--el-color-primary);--el-checkbox-checked-bg-color:var(--el-color-primary);--el-checkbox-checked-icon-color:var(--el-color-white);--el-checkbox-input-border-color-hover:var(--el-color-primary);align-items:center;color:var(--el-checkbox-text-color);cursor:pointer;display:inline-flex;font-size:var(--el-font-size-base);font-weight:var(--el-checkbox-font-weight);height:var(--el-checkbox-height,32px);margin-right:30px;position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}.el-checkbox.is-disabled{cursor:not-allowed}.el-checkbox.is-bordered{border:var(--el-border);border-radius:var(--el-border-radius-base);box-sizing:border-box;padding:0 15px 0 9px}.el-checkbox.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-checkbox.is-bordered.is-disabled{border-color:var(--el-border-color-lighter)}.el-checkbox.is-bordered.el-checkbox--large{border-radius:var(--el-border-radius-base);padding:0 19px 0 11px}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__label{font-size:var(--el-font-size-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{border-radius:calc(var(--el-border-radius-base) - 1px);padding:0 11px 0 7px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox input:focus-visible+.el-checkbox__inner{border-radius:var(--el-checkbox-border-radius);outline:2px solid var(--el-checkbox-input-border-color-hover);outline-offset:1px}.el-checkbox__input{cursor:pointer;display:inline-flex;outline:none;position:relative;white-space:nowrap}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:var(--el-checkbox-disabled-input-fill);border-color:var(--el-checkbox-disabled-border-color);cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-icon-color);cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-disabled-checked-icon-color);border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:var(--el-disabled-text-color);cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-checked-icon-color);transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--el-checkbox-checked-text-color)}.el-checkbox__input.is-focus:not(.is-checked) .el-checkbox__original:not(:focus-visible){border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-checked-icon-color);content:"";display:block;height:2px;left:0;position:absolute;right:0;top:5px;transform:scale(.5)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{background-color:var(--el-checkbox-bg-color);border:var(--el-checkbox-input-border);border-radius:var(--el-checkbox-border-radius);box-sizing:border-box;display:inline-block;height:var(--el-checkbox-input-height);position:relative;transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46),outline .25s cubic-bezier(.71,-.46,.29,1.46);width:var(--el-checkbox-input-width);z-index:var(--el-index-normal)}.el-checkbox__inner:hover{border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__inner:after{border:1px solid transparent;border-left:0;border-top:0;box-sizing:content-box;content:"";height:7px;left:4px;position:absolute;top:1px;transform:rotate(45deg) scaleY(0);transform-origin:center;transition:transform .15s ease-in .05s;width:3px}.el-checkbox__original{height:0;margin:0;opacity:0;outline:none;position:absolute;width:0;z-index:-1}.el-checkbox__label{display:inline-block;font-size:var(--el-checkbox-font-size);line-height:1;padding-left:8px}.el-checkbox.el-checkbox--large{height:40px}.el-checkbox.el-checkbox--large .el-checkbox__label{font-size:14px}.el-checkbox.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.el-checkbox--small{height:24px}.el-checkbox.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.el-checkbox--small .el-checkbox__input.is-indeterminate .el-checkbox__inner:before{top:4px}.el-checkbox.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox:last-of-type{margin-right:0}.el-badge{--el-badge-bg-color:var(--el-color-danger);--el-badge-radius:10px;--el-badge-font-size:12px;--el-badge-padding:6px;--el-badge-size:18px;display:inline-block;position:relative;vertical-align:middle;width:-moz-fit-content;width:fit-content}.el-badge__content{align-items:center;background-color:var(--el-badge-bg-color);border:1px solid var(--el-bg-color);border-radius:var(--el-badge-radius);color:var(--el-color-white);display:inline-flex;font-size:var(--el-badge-font-size);height:var(--el-badge-size);justify-content:center;padding:0 var(--el-badge-padding);white-space:nowrap}.el-badge__content.is-fixed{position:absolute;right:calc(1px + var(--el-badge-size)/2);top:0;transform:translateY(-50%) translate(100%);z-index:var(--el-index-normal)}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{border-radius:50%;height:8px;padding:0;right:0;width:8px}.el-badge__content--primary{background-color:var(--el-color-primary)}.el-badge__content--success{background-color:var(--el-color-success)}.el-badge__content--warning{background-color:var(--el-color-warning)}.el-badge__content--info{background-color:var(--el-color-info)}.el-badge__content--danger{background-color:var(--el-color-danger)}.el-message{--el-message-bg-color:var(--el-color-info-light-9);--el-message-border-color:var(--el-border-color-lighter);--el-message-padding:11px 15px;--el-message-close-size:16px;--el-message-close-icon-color:var(--el-text-color-placeholder);--el-message-close-hover-color:var(--el-text-color-secondary);align-items:center;background-color:var(--el-message-bg-color);border-color:var(--el-message-border-color);border-radius:var(--el-border-radius-base);border-style:var(--el-border-style);border-width:var(--el-border-width);box-sizing:border-box;display:flex;gap:8px;left:50%;max-width:calc(100% - 32px);padding:var(--el-message-padding);position:fixed;top:20px;transform:translate(-50%);transition:opacity var(--el-transition-duration),transform .4s,top .4s;width:-moz-fit-content;width:fit-content}.el-message.is-center{justify-content:center}.el-message.is-plain{background-color:var(--el-bg-color-overlay);border-color:var(--el-bg-color-overlay);box-shadow:var(--el-box-shadow-light)}.el-message p{margin:0}.el-message--success{--el-message-bg-color:var(--el-color-success-light-9);--el-message-border-color:var(--el-color-success-light-8);--el-message-text-color:var(--el-color-success)}.el-message--success .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--success{color:var(--el-message-text-color)}.el-message--info{--el-message-bg-color:var(--el-color-info-light-9);--el-message-border-color:var(--el-color-info-light-8);--el-message-text-color:var(--el-color-info)}.el-message--info .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--info{color:var(--el-message-text-color)}.el-message--warning{--el-message-bg-color:var(--el-color-warning-light-9);--el-message-border-color:var(--el-color-warning-light-8);--el-message-text-color:var(--el-color-warning)}.el-message--warning .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--warning{color:var(--el-message-text-color)}.el-message--error{--el-message-bg-color:var(--el-color-error-light-9);--el-message-border-color:var(--el-color-error-light-8);--el-message-text-color:var(--el-color-error)}.el-message--error .el-message__content{color:var(--el-message-text-color);overflow-wrap:break-word}.el-message .el-message-icon--error{color:var(--el-message-text-color)}.el-message .el-message__badge{position:absolute;right:-8px;top:-8px}.el-message__content{font-size:14px;line-height:1;padding:0}.el-message__content:focus{outline-width:0}.el-message .el-message__closeBtn{color:var(--el-message-close-icon-color);cursor:pointer;font-size:var(--el-message-close-size)}.el-message .el-message__closeBtn:focus{outline-width:0}.el-message .el-message__closeBtn:hover{color:var(--el-message-close-hover-color)}.el-message-fade-enter-from,.el-message-fade-leave-to{opacity:0;transform:translate(-50%,-100%)}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:.5}.v-modal-enter{animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{background:var(--el-popup-modal-bg-color);height:100%;left:0;opacity:var(--el-popup-modal-opacity);position:fixed;top:0;width:100%}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:16px;--el-dialog-border-radius:var(--el-border-radius-base);background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;margin:var(--el-dialog-margin-top,15vh) auto 50px;overflow-wrap:break-word;padding:var(--el-dialog-padding-primary);position:relative;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:none!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;height:100%;margin-bottom:0;overflow:auto}.el-dialog__wrapper{bottom:0;left:0;margin:0;overflow:auto;position:fixed;right:0;top:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;-moz-user-select:none;user-select:none}.el-dialog__header{padding-bottom:var(--el-dialog-padding-primary)}.el-dialog__header.show-close{padding-right:calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px))}.el-dialog__headerbtn{background:transparent;border:none;cursor:pointer;font-size:var(--el-message-close-size,16px);height:48px;outline:none;padding:0;position:absolute;right:0;top:0;width:48px}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{color:var(--el-text-color-primary);font-size:var(--el-dialog-title-font-size);line-height:var(--el-dialog-font-line-height)}.el-dialog__body{color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{box-sizing:border-box;padding-top:var(--el-dialog-padding-primary);text-align:right}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-overlay-dialog{bottom:0;left:0;overflow:auto;position:fixed;right:0;top:0}.dialog-fade-enter-active{animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{animation:dialog-fade-out var(--el-transition-duration)}@keyframes dialog-fade-in{0%{opacity:0;transform:translate3d(0,-20px,0)}to{opacity:1;transform:translateZ(0)}}@keyframes dialog-fade-out{0%{opacity:1;transform:translateZ(0)}to{opacity:0;transform:translate3d(0,-20px,0)}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-overlay{background-color:var(--el-overlay-color-lighter);bottom:0;height:100%;left:0;overflow:auto;position:fixed;right:0;top:0;z-index:2000}.el-overlay .el-overlay-root{height:0}.el-form{--el-form-label-font-size:var(--el-font-size-base);--el-form-inline-content-width:220px}.el-form--inline .el-form-item{display:inline-flex;margin-right:32px;vertical-align:middle}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item--label-left .el-form-item__label{justify-content:flex-start}.el-form-item--label-top{display:block}.el-form-item--label-top .el-form-item__label{display:block;height:auto;line-height:22px;margin-bottom:8px;text-align:left}.el-form-item__label-wrap{display:flex}.el-form-item__label{align-items:flex-start;box-sizing:border-box;color:var(--el-text-color-regular);display:inline-flex;flex:0 0 auto;font-size:var(--el-form-label-font-size);height:32px;justify-content:flex-end;line-height:32px;padding:0 12px 0 0}.el-form-item__content{align-items:center;display:flex;flex:1;flex-wrap:wrap;font-size:var(--font-size);line-height:32px;min-width:0;position:relative}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;left:0;line-height:1;padding-top:2px;position:absolute;top:100%}.el-form-item__error--inline{display:inline-block;left:auto;margin-left:10px;position:relative;top:auto}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{color:var(--el-color-danger);content:"*";margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{color:var(--el-color-danger);content:"*";margin-left:4px}.el-form-item.is-error .el-input__wrapper,.el-form-item.is-error .el-input__wrapper.is-focus,.el-form-item.is-error .el-input__wrapper:focus,.el-form-item.is-error .el-input__wrapper:hover,.el-form-item.is-error .el-select__wrapper,.el-form-item.is-error .el-select__wrapper.is-focus,.el-form-item.is-error .el-select__wrapper:focus,.el-form-item.is-error .el-select__wrapper:hover,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner.is-focus,.el-form-item.is-error .el-textarea__inner:focus,.el-form-item.is-error .el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-input-group__prepend .el-input__wrapper{box-shadow:inset 0 0 0 1px transparent}.el-form-item.is-error .el-input-group__append .el-input__validateIcon,.el-form-item.is-error .el-input-group__prepend .el-input__validateIcon{display:none}.el-form-item.is-error .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon{display:inline-flex}.el-tag{--el-tag-font-size:12px;--el-tag-border-radius:4px;--el-tag-border-radius-rounded:9999px;align-items:center;background-color:var(--el-tag-bg-color);border-color:var(--el-tag-border-color);border-radius:var(--el-tag-border-radius);border-style:solid;border-width:1px;box-sizing:border-box;color:var(--el-tag-text-color);display:inline-flex;font-size:var(--el-tag-font-size);height:24px;justify-content:center;line-height:1;padding:0 9px;vertical-align:middle;white-space:nowrap;--el-icon-size:14px}.el-tag,.el-tag.el-tag--primary{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-bg-color:var(--el-color-success-light-9);--el-tag-border-color:var(--el-color-success-light-8);--el-tag-hover-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-bg-color:var(--el-color-warning-light-9);--el-tag-border-color:var(--el-color-warning-light-8);--el-tag-hover-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-bg-color:var(--el-color-danger-light-9);--el-tag-border-color:var(--el-color-danger-light-8);--el-tag-hover-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-bg-color:var(--el-color-error-light-9);--el-tag-border-color:var(--el-color-error-light-8);--el-tag-hover-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-bg-color:var(--el-color-info-light-9);--el-tag-border-color:var(--el-color-info-light-8);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-hit{border-color:var(--el-color-primary)}.el-tag.is-round{border-radius:var(--el-tag-border-radius-rounded)}.el-tag .el-tag__close{color:var(--el-tag-text-color);flex-shrink:0}.el-tag .el-tag__close:hover{background-color:var(--el-tag-hover-color);color:var(--el-color-white)}.el-tag.el-tag--primary{--el-tag-text-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-text-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-text-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-text-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-text-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-text-color:var(--el-color-info)}.el-tag .el-icon{border-radius:50%;cursor:pointer;font-size:calc(var(--el-icon-size) - 2px);height:var(--el-icon-size);width:var(--el-icon-size)}.el-tag .el-tag__close{margin-left:6px}.el-tag--dark{--el-tag-text-color:var(--el-color-white)}.el-tag--dark,.el-tag--dark.el-tag--primary{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--success{--el-tag-bg-color:var(--el-color-success);--el-tag-border-color:var(--el-color-success);--el-tag-hover-color:var(--el-color-success-light-3)}.el-tag--dark.el-tag--warning{--el-tag-bg-color:var(--el-color-warning);--el-tag-border-color:var(--el-color-warning);--el-tag-hover-color:var(--el-color-warning-light-3)}.el-tag--dark.el-tag--danger{--el-tag-bg-color:var(--el-color-danger);--el-tag-border-color:var(--el-color-danger);--el-tag-hover-color:var(--el-color-danger-light-3)}.el-tag--dark.el-tag--error{--el-tag-bg-color:var(--el-color-error);--el-tag-border-color:var(--el-color-error);--el-tag-hover-color:var(--el-color-error-light-3)}.el-tag--dark.el-tag--info{--el-tag-bg-color:var(--el-color-info);--el-tag-border-color:var(--el-color-info);--el-tag-hover-color:var(--el-color-info-light-3)}.el-tag--dark.el-tag--danger,.el-tag--dark.el-tag--error,.el-tag--dark.el-tag--info,.el-tag--dark.el-tag--primary,.el-tag--dark.el-tag--success,.el-tag--dark.el-tag--warning{--el-tag-text-color:var(--el-color-white)}.el-tag--plain,.el-tag--plain.el-tag--primary{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary)}.el-tag--plain.el-tag--success{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-success-light-5);--el-tag-hover-color:var(--el-color-success)}.el-tag--plain.el-tag--warning{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-warning-light-5);--el-tag-hover-color:var(--el-color-warning)}.el-tag--plain.el-tag--danger{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-danger-light-5);--el-tag-hover-color:var(--el-color-danger)}.el-tag--plain.el-tag--error{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-error-light-5);--el-tag-hover-color:var(--el-color-error)}.el-tag--plain.el-tag--info{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-info-light-5);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-closable{padding-right:5px}.el-tag--large{height:32px;padding:0 11px;--el-icon-size:16px}.el-tag--large .el-tag__close{margin-left:8px}.el-tag--large.is-closable{padding-right:7px}.el-tag--small{height:20px;padding:0 7px;--el-icon-size:12px}.el-tag--small .el-tag__close{margin-left:4px}.el-tag--small.is-closable{padding-right:3px}.el-tag--small .el-icon-close{transform:scale(.8)}.el-tag.el-tag--primary.is-hit{border-color:var(--el-color-primary)}.el-tag.el-tag--success.is-hit{border-color:var(--el-color-success)}.el-tag.el-tag--warning.is-hit{border-color:var(--el-color-warning)}.el-tag.el-tag--danger.is-hit{border-color:var(--el-color-danger)}.el-tag.el-tag--error.is-hit{border-color:var(--el-color-error)}.el-tag.el-tag--info.is-hit{border-color:var(--el-color-info)}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after{background-color:var(--el-color-primary);background-position:50%;background-repeat:no-repeat;border-right:none;border-top:none;content:"";height:12px;mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;mask-size:100% 100%;-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;-webkit-mask-size:100% 100%;position:absolute;right:20px;top:50%;transform:translateY(-50%);width:12px}.el-scrollbar{--el-scrollbar-opacity:.3;--el-scrollbar-bg-color:var(--el-text-color-secondary);--el-scrollbar-hover-opacity:.5;--el-scrollbar-hover-bg-color:var(--el-text-color-secondary);height:100%;overflow:hidden;position:relative}.el-scrollbar__wrap{height:100%;overflow:auto}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{display:none}.el-scrollbar__thumb{background-color:var(--el-scrollbar-bg-color,var(--el-text-color-secondary));border-radius:inherit;cursor:pointer;display:block;height:0;opacity:var(--el-scrollbar-opacity,.3);position:relative;transition:var(--el-transition-duration) background-color;width:0}.el-scrollbar__thumb:hover{background-color:var(--el-scrollbar-hover-bg-color,var(--el-text-color-secondary));opacity:var(--el-scrollbar-hover-opacity,.5)}.el-scrollbar__bar{border-radius:4px;bottom:2px;position:absolute;right:2px;z-index:1}.el-scrollbar__bar.is-vertical{top:2px;width:6px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-scrollbar-fade-enter-active{transition:opacity .34s ease-out}.el-scrollbar-fade-leave-active{transition:opacity .12s ease-out}.el-scrollbar-fade-enter-from,.el-scrollbar-fade-leave-active{opacity:0}.el-popper{--el-popper-border-radius:var(--el-popover-border-radius,4px);border-radius:var(--el-popper-border-radius);font-size:12px;line-height:20px;min-width:10px;overflow-wrap:break-word;padding:5px 11px;position:absolute;visibility:visible;z-index:2000}.el-popper.is-dark{color:var(--el-bg-color)}.el-popper.is-dark,.el-popper.is-dark>.el-popper__arrow:before{background:var(--el-text-color-primary);border:1px solid var(--el-text-color-primary)}.el-popper.is-dark>.el-popper__arrow:before{right:0}.el-popper.is-light,.el-popper.is-light>.el-popper__arrow:before{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light)}.el-popper.is-light>.el-popper__arrow:before{right:0}.el-popper.is-pure{padding:0}.el-popper__arrow,.el-popper__arrow:before{height:10px;position:absolute;width:10px;z-index:-1}.el-popper__arrow:before{background:var(--el-text-color-primary);box-sizing:border-box;content:" ";transform:rotate(45deg)}.el-popper[data-popper-placement^=top]>.el-popper__arrow{bottom:-5px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-bottom-right-radius:2px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow{top:-5px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-top-left-radius:2px}.el-popper[data-popper-placement^=left]>.el-popper__arrow{right:-5px}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-top-right-radius:2px}.el-popper[data-popper-placement^=right]>.el-popper__arrow{left:-5px}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-bottom-left-radius:2px}.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-left-color:transparent!important;border-top-color:transparent!important}.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent!important;border-right-color:transparent!important}.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:transparent!important;border-left-color:transparent!important}.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent!important;border-top-color:transparent!important}.el-select-dropdown{border-radius:var(--el-border-radius-base);box-sizing:border-box;z-index:calc(var(--el-index-top) + 1)}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__empty,.el-select-dropdown__loading{color:var(--el-text-color-secondary);font-size:var(--el-select-font-size);margin:0;padding:10px 0;text-align:center}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{box-sizing:border-box;list-style:none;margin:0;padding:6px 0}.el-select-dropdown__list.el-vl__window{margin:6px 0;padding:0}.el-select-dropdown__header{border-bottom:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__footer{border-top:1px solid var(--el-border-color-light);padding:10px}.el-select-dropdown__item{box-sizing:border-box;color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-base);height:34px;line-height:34px;overflow:hidden;padding:0 32px 0 20px;position:relative;text-overflow:ellipsis;white-space:nowrap}.el-select-dropdown__item.is-hovering{background-color:var(--el-fill-color-light)}.el-select-dropdown__item.is-selected{color:var(--el-color-primary);font-weight:700}.el-select-dropdown__item.is-disabled{background-color:unset;color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after{background-color:var(--el-color-primary);background-position:50%;background-repeat:no-repeat;border-right:none;border-top:none;content:"";height:12px;mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;mask-size:100% 100%;-webkit-mask:url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat;-webkit-mask-size:100% 100%;position:absolute;right:20px;top:50%;transform:translateY(-50%);width:12px}.el-select-dropdown.is-multiple .el-select-dropdown__item.is-disabled:after{background-color:var(--el-text-color-placeholder)}.el-select-group{margin:0;padding:0}.el-select-group__wrap{list-style:none;margin:0;padding:0;position:relative}.el-select-group__title{color:var(--el-color-info);font-size:12px;line-height:34px;padding-left:20px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-color:var(--el-disabled-text-color);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px;--el-select-width:100%;display:inline-block;position:relative;vertical-align:middle;width:var(--el-select-width)}.el-select__wrapper{align-items:center;background-color:var(--el-fill-color-blank);border-radius:var(--el-border-radius-base);box-shadow:0 0 0 1px var(--el-border-color) inset;box-sizing:border-box;cursor:pointer;display:flex;font-size:14px;gap:6px;line-height:24px;min-height:32px;padding:4px 12px;position:relative;text-align:left;transform:translateZ(0);transition:var(--el-transition-duration)}.el-select__wrapper.is-filterable{cursor:text}.el-select__wrapper.is-focused{box-shadow:0 0 0 1px var(--el-color-primary) inset}.el-select__wrapper.is-hovering:not(.is-focused){box-shadow:0 0 0 1px var(--el-border-color-hover) inset}.el-select__wrapper.is-disabled{background-color:var(--el-fill-color-light);color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select__wrapper.is-disabled,.el-select__wrapper.is-disabled:hover{box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select__wrapper.is-disabled.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-select__wrapper.is-disabled .el-select__selected-item{color:var(--el-select-disabled-color)}.el-select__wrapper.is-disabled .el-select__caret,.el-select__wrapper.is-disabled .el-tag{cursor:not-allowed}.el-select__prefix,.el-select__suffix{align-items:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));display:flex;flex-shrink:0;gap:6px}.el-select__caret{color:var(--el-select-input-color);cursor:pointer;font-size:var(--el-select-input-font-size);transform:rotate(0);transition:var(--el-transition-duration)}.el-select__caret.is-reverse{transform:rotate(180deg)}.el-select__selection{align-items:center;display:flex;flex:1;flex-wrap:wrap;gap:6px;min-width:0;position:relative}.el-select__selection.is-near{margin-left:-8px}.el-select__selection .el-tag{border-color:transparent;cursor:pointer}.el-select__selection .el-tag.el-tag--plain{border-color:var(--el-tag-border-color)}.el-select__selection .el-tag .el-tag__content{min-width:0}.el-select__selected-item{display:flex;flex-wrap:wrap;-webkit-user-select:none;-moz-user-select:none;user-select:none}.el-select__tags-text{line-height:normal}.el-select__placeholder,.el-select__tags-text{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-select__placeholder{color:var(--el-input-text-color,var(--el-text-color-regular));position:absolute;top:50%;transform:translateY(-50%);width:100%}.el-select__placeholder.is-transparent{color:var(--el-text-color-placeholder);-webkit-user-select:none;-moz-user-select:none;user-select:none}.el-select__popper.el-popper{background:var(--el-bg-color-overlay);box-shadow:var(--el-box-shadow-light)}.el-select__popper.el-popper,.el-select__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-left-color:transparent;border-top-color:transparent}.el-select__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-select__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-bottom-color:transparent;border-left-color:transparent}.el-select__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-select__input-wrapper{max-width:100%}.el-select__input-wrapper.is-hidden{opacity:0;position:absolute}.el-select__input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;border:none;color:var(--el-select-multiple-input-color);font-family:inherit;font-size:inherit;height:24px;max-width:100%;outline:none;padding:0}.el-select__input.is-disabled{cursor:not-allowed}.el-select__input-calculator{left:0;max-width:100%;overflow:hidden;position:absolute;top:0;visibility:hidden;white-space:pre}.el-select--large .el-select__wrapper{font-size:14px;gap:6px;line-height:24px;min-height:40px;padding:8px 16px}.el-select--large .el-select__selection{gap:6px}.el-select--large .el-select__selection.is-near{margin-left:-8px}.el-select--large .el-select__prefix,.el-select--large .el-select__suffix{gap:6px}.el-select--large .el-select__input{height:24px}.el-select--small .el-select__wrapper{font-size:12px;gap:4px;line-height:20px;min-height:24px;padding:2px 8px}.el-select--small .el-select__selection{gap:4px}.el-select--small .el-select__selection.is-near{margin-left:-6px}.el-select--small .el-select__prefix,.el-select--small .el-select__suffix{gap:4px}.el-select--small .el-select__input{height:20px}.el-input-number{display:inline-flex;line-height:30px;position:relative;vertical-align:middle;width:150px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;line-height:1;text-align:center}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-input-number__decrease,.el-input-number__increase{align-items:center;background:var(--el-fill-color-light);bottom:1px;color:var(--el-text-color-regular);cursor:pointer;display:flex;font-size:13px;height:auto;justify-content:center;position:absolute;top:1px;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:32px;z-index:1}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{border-left:var(--el-border);border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;right:1px}.el-input-number__decrease{border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border);left:1px}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{line-height:38px;width:180px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{font-size:14px;width:40px}.el-input-number--large .el-input--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{line-height:22px;width:120px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{font-size:12px;width:24px}.el-input-number--small .el-input--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{border-bottom:var(--el-border);border-radius:0 var(--el-border-radius-base) 0 0;bottom:auto;left:auto}.el-input-number.is-controls-right .el-input-number__decrease{border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0;border-right:none;left:auto;right:1px;top:auto}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.el-switch{--el-switch-on-color:var(--el-color-primary);--el-switch-off-color:var(--el-border-color);align-items:center;display:inline-flex;font-size:14px;height:32px;line-height:20px;position:relative;vertical-align:middle}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{color:var(--el-text-color-primary);cursor:pointer;display:inline-block;font-size:14px;font-weight:500;height:20px;transition:var(--el-transition-duration-fast);vertical-align:middle}.el-switch__label.is-active{color:var(--el-color-primary)}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{display:inline-block;font-size:14px;line-height:1}.el-switch__label .el-icon{height:inherit}.el-switch__label .el-icon svg{vertical-align:middle}.el-switch__input{height:0;margin:0;opacity:0;position:absolute;width:0}.el-switch__input:focus-visible~.el-switch__core{outline:2px solid var(--el-switch-on-color);outline-offset:1px}.el-switch__core{align-items:center;background:var(--el-switch-off-color);border:1px solid var(--el-switch-border-color,var(--el-switch-off-color));border-radius:10px;box-sizing:border-box;cursor:pointer;display:inline-flex;height:20px;min-width:40px;outline:none;position:relative;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration)}.el-switch__core .el-switch__inner{align-items:center;display:flex;height:16px;justify-content:center;overflow:hidden;padding:0 4px 0 18px;transition:all var(--el-transition-duration);width:100%}.el-switch__core .el-switch__inner .is-icon,.el-switch__core .el-switch__inner .is-text{color:var(--el-color-white);font-size:12px;overflow:hidden;text-overflow:ellipsis;-webkit-user-select:none;-moz-user-select:none;user-select:none;white-space:nowrap}.el-switch__core .el-switch__action{align-items:center;background-color:var(--el-color-white);border-radius:var(--el-border-radius-circle);color:var(--el-switch-off-color);display:flex;height:16px;justify-content:center;left:1px;position:absolute;transition:all var(--el-transition-duration);width:16px}.el-switch.is-checked .el-switch__core{background-color:var(--el-switch-on-color);border-color:var(--el-switch-border-color,var(--el-switch-on-color))}.el-switch.is-checked .el-switch__core .el-switch__action{color:var(--el-switch-on-color);left:calc(100% - 17px)}.el-switch.is-checked .el-switch__core .el-switch__inner{padding:0 18px 0 4px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter-from,.el-switch .label-fade-leave-active{opacity:0}.el-switch--large{font-size:14px;height:40px;line-height:24px}.el-switch--large .el-switch__label{font-size:14px;height:24px}.el-switch--large .el-switch__label *{font-size:14px}.el-switch--large .el-switch__core{border-radius:12px;height:24px;min-width:50px}.el-switch--large .el-switch__core .el-switch__inner{height:20px;padding:0 6px 0 22px}.el-switch--large .el-switch__core .el-switch__action{height:20px;width:20px}.el-switch--large.is-checked .el-switch__core .el-switch__action{left:calc(100% - 21px)}.el-switch--large.is-checked .el-switch__core .el-switch__inner{padding:0 22px 0 6px}.el-switch--small{font-size:12px;height:24px;line-height:16px}.el-switch--small .el-switch__label{font-size:12px;height:16px}.el-switch--small .el-switch__label *{font-size:12px}.el-switch--small .el-switch__core{border-radius:8px;height:16px;min-width:30px}.el-switch--small .el-switch__core .el-switch__inner{height:12px;padding:0 2px 0 14px}.el-switch--small .el-switch__core .el-switch__action{height:12px;width:12px}.el-switch--small.is-checked .el-switch__core .el-switch__action{left:calc(100% - 13px)}.el-switch--small.is-checked .el-switch__core .el-switch__inner{padding:0 14px 0 2px} diff --git a/app/src/main/assets/web/vue/assets/vendor-UVL3l2rb.js b/app/src/main/assets/web/vue/assets/vendor-UVL3l2rb.js new file mode 100644 index 000000000000..6889a836ec73 --- /dev/null +++ b/app/src/main/assets/web/vue/assets/vendor-UVL3l2rb.js @@ -0,0 +1,50 @@ +/** +* @vue/shared v3.5.6 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function wu(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Ye={},Co=[],pt=()=>{},dy=()=>!1,la=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),_u=e=>e.startsWith("onUpdate:"),ft=Object.assign,Su=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},py=Object.prototype.hasOwnProperty,je=(e,t)=>py.call(e,t),ce=Array.isArray,To=e=>Vs(e)==="[object Map]",ua=e=>Vs(e)==="[object Set]",Fc=e=>Vs(e)==="[object Date]",he=e=>typeof e=="function",Oe=e=>typeof e=="string",kn=e=>typeof e=="symbol",xe=e=>e!==null&&typeof e=="object",Vi=e=>(xe(e)||he(e))&&he(e.then)&&he(e.catch),Gp=Object.prototype.toString,Vs=e=>Gp.call(e),Ti=e=>Vs(e).slice(8,-1),Yp=e=>Vs(e)==="[object Object]",Eu=e=>Oe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,os=wu(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ca=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},hy=/-(\w)/g,tn=ca(e=>e.replace(hy,(t,n)=>n?n.toUpperCase():"")),vy=/\B([A-Z])/g,Zn=ca(e=>e.replace(vy,"-$1").toLowerCase()),js=ca(e=>e.charAt(0).toUpperCase()+e.slice(1)),Oi=ca(e=>e?`on${js(e)}`:""),Sr=(e,t)=>!Object.is(e,t),xi=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},Al=e=>{const t=parseFloat(e);return isNaN(t)?e:t},my=e=>{const t=Oe(e)?Number(e):NaN;return isNaN(t)?e:t};let Bc;const Xp=()=>Bc||(Bc=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function it(e){if(ce(e)){const t={};for(let n=0;n{if(n){const r=n.split(yy);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function q(e){let t="";if(Oe(e))t=e;else if(ce(e))for(let n=0;nfa(n,t))}const eh=e=>!!(e&&e.__v_isRef===!0),Je=e=>Oe(e)?e:e==null?"":ce(e)||xe(e)&&(e.toString===Gp||!he(e.toString))?eh(e)?Je(e.value):JSON.stringify(e,th,2):String(e),th=(e,t)=>eh(t)?th(e,t.value):To(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o],s)=>(n[Wa(r,s)+" =>"]=o,n),{})}:ua(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>Wa(n))}:kn(t)?Wa(t):xe(t)&&!ce(t)&&!Yp(t)?String(t):t,Wa=(e,t="")=>{var n;return kn(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.6 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let $t;class nh{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=$t,!t&&$t&&(this.index=($t.scopes||($t.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;let e;for(;ss;){let t=ss;for(ss=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function ah(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function lh(e){let t,n=e.depsTail,r=n;for(;r;){const o=r.prevDep;r.version===-1?(r===n&&(n=o),Au(r),Cy(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=o}e.deps=t,e.depsTail=n}function Rl(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(uh(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function uh(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===ws))return;e.globalVersion=ws;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!Rl(e)){e.flags&=-3;return}const n=Ge,r=pn;Ge=e,pn=!0;try{ah(e);const o=e.fn(e._value);(t.version===0||Sr(o,e._value))&&(e._value=o,t.version++)}catch(o){throw t.version++,o}finally{Ge=n,pn=r,lh(e),e.flags&=-3}}function Au(e){const{dep:t,prevSub:n,nextSub:r}=e;if(n&&(n.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=n,e.nextSub=void 0),t.subs===e&&(t.subs=n),!t.subs&&t.computed){t.computed.flags&=-5;for(let o=t.computed.deps;o;o=o.nextDep)Au(o)}}function Cy(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let pn=!0;const ch=[];function Cr(){ch.push(pn),pn=!1}function Tr(){const e=ch.pop();pn=e===void 0?!0:e}function Dc(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=Ge;Ge=void 0;try{t()}finally{Ge=n}}}let ws=0,Ty=class{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}};class Ru{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0}track(t){if(!Ge||!pn||Ge===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==Ge)n=this.activeLink=new Ty(Ge,this),Ge.deps?(n.prevDep=Ge.depsTail,Ge.depsTail.nextDep=n,Ge.depsTail=n):Ge.deps=Ge.depsTail=n,Ge.flags&4&&fh(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=Ge.depsTail,n.nextDep=void 0,Ge.depsTail.nextDep=n,Ge.depsTail=n,Ge.deps===n&&(Ge.deps=r)}return n}trigger(t){this.version++,ws++,this.notify(t)}notify(t){Ou();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{xu()}}}function fh(e){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)fh(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}const ji=new WeakMap,Hr=Symbol(""),Pl=Symbol(""),_s=Symbol("");function Rt(e,t,n){if(pn&&Ge){let r=ji.get(e);r||ji.set(e,r=new Map);let o=r.get(n);o||r.set(n,o=new Ru),o.track()}}function Wn(e,t,n,r,o,s){const i=ji.get(e);if(!i){ws++;return}const a=l=>{l&&l.trigger()};if(Ou(),t==="clear")i.forEach(a);else{const l=ce(e),u=l&&Eu(n);if(l&&n==="length"){const c=Number(r);i.forEach((f,d)=>{(d==="length"||d===_s||!kn(d)&&d>=c)&&a(f)})}else switch(n!==void 0&&a(i.get(n)),u&&a(i.get(_s)),t){case"add":l?u&&a(i.get("length")):(a(i.get(Hr)),To(e)&&a(i.get(Pl)));break;case"delete":l||(a(i.get(Hr)),To(e)&&a(i.get(Pl)));break;case"set":To(e)&&a(i.get(Hr));break}}xu()}function Oy(e,t){var n;return(n=ji.get(e))==null?void 0:n.get(t)}function po(e){const t=Ie(e);return t===e?t:(Rt(t,"iterate",_s),Qt(e)?t:t.map(xt))}function da(e){return Rt(e=Ie(e),"iterate",_s),e}const xy={__proto__:null,[Symbol.iterator](){return Ya(this,Symbol.iterator,xt)},concat(...e){return po(this).concat(...e.map(t=>ce(t)?po(t):t))},entries(){return Ya(this,"entries",e=>(e[1]=xt(e[1]),e))},every(e,t){return Fn(this,"every",e,t,void 0,arguments)},filter(e,t){return Fn(this,"filter",e,t,n=>n.map(xt),arguments)},find(e,t){return Fn(this,"find",e,t,xt,arguments)},findIndex(e,t){return Fn(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Fn(this,"findLast",e,t,xt,arguments)},findLastIndex(e,t){return Fn(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Fn(this,"forEach",e,t,void 0,arguments)},includes(...e){return Ja(this,"includes",e)},indexOf(...e){return Ja(this,"indexOf",e)},join(e){return po(this).join(e)},lastIndexOf(...e){return Ja(this,"lastIndexOf",e)},map(e,t){return Fn(this,"map",e,t,void 0,arguments)},pop(){return Go(this,"pop")},push(...e){return Go(this,"push",e)},reduce(e,...t){return Vc(this,"reduce",e,t)},reduceRight(e,...t){return Vc(this,"reduceRight",e,t)},shift(){return Go(this,"shift")},some(e,t){return Fn(this,"some",e,t,void 0,arguments)},splice(...e){return Go(this,"splice",e)},toReversed(){return po(this).toReversed()},toSorted(e){return po(this).toSorted(e)},toSpliced(...e){return po(this).toSpliced(...e)},unshift(...e){return Go(this,"unshift",e)},values(){return Ya(this,"values",xt)}};function Ya(e,t,n){const r=da(e),o=r[t]();return r!==e&&!Qt(e)&&(o._next=o.next,o.next=()=>{const s=o._next();return s.value&&(s.value=n(s.value)),s}),o}const Ay=Array.prototype;function Fn(e,t,n,r,o,s){const i=da(e),a=i!==e&&!Qt(e),l=i[t];if(l!==Ay[t]){const f=l.apply(e,s);return a?xt(f):f}let u=n;i!==e&&(a?u=function(f,d){return n.call(this,xt(f),d,e)}:n.length>2&&(u=function(f,d){return n.call(this,f,d,e)}));const c=l.call(i,u,r);return a&&o?o(c):c}function Vc(e,t,n,r){const o=da(e);let s=n;return o!==e&&(Qt(e)?n.length>3&&(s=function(i,a,l){return n.call(this,i,a,l,e)}):s=function(i,a,l){return n.call(this,i,xt(a),l,e)}),o[t](s,...r)}function Ja(e,t,n){const r=Ie(e);Rt(r,"iterate",_s);const o=r[t](...n);return(o===-1||o===!1)&&Lu(n[0])?(n[0]=Ie(n[0]),r[t](...n)):o}function Go(e,t,n=[]){Cr(),Ou();const r=Ie(e)[t].apply(e,n);return xu(),Tr(),r}const Ry=wu("__proto__,__v_isRef,__isVue"),dh=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(kn));function Py(e){kn(e)||(e=String(e));const t=Ie(this);return Rt(t,"has",e),t.hasOwnProperty(e)}class ph{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){const o=this._isReadonly,s=this._isShallow;if(n==="__v_isReactive")return!o;if(n==="__v_isReadonly")return o;if(n==="__v_isShallow")return s;if(n==="__v_raw")return r===(o?s?Hy:gh:s?mh:vh).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const i=ce(t);if(!o){let l;if(i&&(l=xy[n]))return l;if(n==="hasOwnProperty")return Py}const a=Reflect.get(t,n,He(t)?t:r);return(kn(n)?dh.has(n):Ry(n))||(o||Rt(t,"get",n),s)?a:He(a)?i&&Eu(n)?a:a.value:xe(a)?o?zs(a):Et(a):a}}class hh extends ph{constructor(t=!1){super(!1,t)}set(t,n,r,o){let s=t[n];if(!this._isShallow){const l=Yr(s);if(!Qt(r)&&!Yr(r)&&(s=Ie(s),r=Ie(r)),!ce(t)&&He(s)&&!He(r))return l?!1:(s.value=r,!0)}const i=ce(t)&&Eu(n)?Number(n)e,pa=e=>Reflect.getPrototypeOf(e);function oi(e,t,n=!1,r=!1){e=e.__v_raw;const o=Ie(e),s=Ie(t);n||(Sr(t,s)&&Rt(o,"get",t),Rt(o,"get",s));const{has:i}=pa(o),a=r?Pu:n?Mu:xt;if(i.call(o,t))return a(e.get(t));if(i.call(o,s))return a(e.get(s));e!==o&&e.get(t)}function si(e,t=!1){const n=this.__v_raw,r=Ie(n),o=Ie(e);return t||(Sr(e,o)&&Rt(r,"has",e),Rt(r,"has",o)),e===o?n.has(e):n.has(e)||n.has(o)}function ii(e,t=!1){return e=e.__v_raw,!t&&Rt(Ie(e),"iterate",Hr),Reflect.get(e,"size",e)}function jc(e,t=!1){!t&&!Qt(e)&&!Yr(e)&&(e=Ie(e));const n=Ie(this);return pa(n).has.call(n,e)||(n.add(e),Wn(n,"add",e,e)),this}function zc(e,t,n=!1){!n&&!Qt(t)&&!Yr(t)&&(t=Ie(t));const r=Ie(this),{has:o,get:s}=pa(r);let i=o.call(r,e);i||(e=Ie(e),i=o.call(r,e));const a=s.call(r,e);return r.set(e,t),i?Sr(t,a)&&Wn(r,"set",e,t):Wn(r,"add",e,t),this}function Hc(e){const t=Ie(this),{has:n,get:r}=pa(t);let o=n.call(t,e);o||(e=Ie(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&Wn(t,"delete",e,void 0),s}function Kc(){const e=Ie(this),t=e.size!==0,n=e.clear();return t&&Wn(e,"clear",void 0,void 0),n}function ai(e,t){return function(r,o){const s=this,i=s.__v_raw,a=Ie(i),l=t?Pu:e?Mu:xt;return!e&&Rt(a,"iterate",Hr),i.forEach((u,c)=>r.call(o,l(u),l(c),s))}}function li(e,t,n){return function(...r){const o=this.__v_raw,s=Ie(o),i=To(s),a=e==="entries"||e===Symbol.iterator&&i,l=e==="keys"&&i,u=o[e](...r),c=n?Pu:t?Mu:xt;return!t&&Rt(s,"iterate",l?Pl:Hr),{next(){const{value:f,done:d}=u.next();return d?{value:f,done:d}:{value:a?[c(f[0]),c(f[1])]:c(f),done:d}},[Symbol.iterator](){return this}}}}function sr(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Ny(){const e={get(s){return oi(this,s)},get size(){return ii(this)},has:si,add:jc,set:zc,delete:Hc,clear:Kc,forEach:ai(!1,!1)},t={get(s){return oi(this,s,!1,!0)},get size(){return ii(this)},has:si,add(s){return jc.call(this,s,!0)},set(s,i){return zc.call(this,s,i,!0)},delete:Hc,clear:Kc,forEach:ai(!1,!0)},n={get(s){return oi(this,s,!0)},get size(){return ii(this,!0)},has(s){return si.call(this,s,!0)},add:sr("add"),set:sr("set"),delete:sr("delete"),clear:sr("clear"),forEach:ai(!0,!1)},r={get(s){return oi(this,s,!0,!0)},get size(){return ii(this,!0)},has(s){return si.call(this,s,!0)},add:sr("add"),set:sr("set"),delete:sr("delete"),clear:sr("clear"),forEach:ai(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(s=>{e[s]=li(s,!1,!1),n[s]=li(s,!0,!1),t[s]=li(s,!1,!0),r[s]=li(s,!0,!0)}),[e,n,t,r]}const[My,Fy,By,Dy]=Ny();function Iu(e,t){const n=t?e?Dy:By:e?Fy:My;return(r,o,s)=>o==="__v_isReactive"?!e:o==="__v_isReadonly"?e:o==="__v_raw"?r:Reflect.get(je(n,o)&&o in r?n:r,o,s)}const Vy={get:Iu(!1,!1)},jy={get:Iu(!1,!0)},zy={get:Iu(!0,!1)};const vh=new WeakMap,mh=new WeakMap,gh=new WeakMap,Hy=new WeakMap;function Ky(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Uy(e){return e.__v_skip||!Object.isExtensible(e)?0:Ky(Ti(e))}function Et(e){return Yr(e)?e:ku(e,!1,$y,Vy,vh)}function $u(e){return ku(e,!1,Ly,jy,mh)}function zs(e){return ku(e,!0,ky,zy,gh)}function ku(e,t,n,r,o){if(!xe(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=Uy(e);if(i===0)return e;const a=new Proxy(e,i===2?r:n);return o.set(e,a),a}function Gn(e){return Yr(e)?Gn(e.__v_raw):!!(e&&e.__v_isReactive)}function Yr(e){return!!(e&&e.__v_isReadonly)}function Qt(e){return!!(e&&e.__v_isShallow)}function Lu(e){return e?!!e.__v_raw:!1}function Ie(e){const t=e&&e.__v_raw;return t?Ie(t):e}function Nu(e){return!je(e,"__v_skip")&&Object.isExtensible(e)&&Jp(e,"__v_skip",!0),e}const xt=e=>xe(e)?Et(e):e,Mu=e=>xe(e)?zs(e):e;function He(e){return e?e.__v_isRef===!0:!1}function z(e){return yh(e,!1)}function _r(e){return yh(e,!0)}function yh(e,t){return He(e)?e:new qy(e,t)}class qy{constructor(t,n){this.dep=new Ru,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:Ie(t),this._value=n?t:xt(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||Qt(t)||Yr(t);t=r?t:Ie(t),Sr(t,n)&&(this._rawValue=t,this._value=r?t:xt(t),this.dep.trigger())}}function m(e){return He(e)?e.value:e}const Wy={get:(e,t,n)=>t==="__v_raw"?e:m(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return He(o)&&!He(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function bh(e){return Gn(e)?e:new Proxy(e,Wy)}function Or(e){const t=ce(e)?new Array(e.length):{};for(const n in e)t[n]=wh(e,n);return t}class Gy{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return Oy(Ie(this._object),this._key)}}class Yy{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Zt(e,t,n){return He(e)?e:he(e)?new Yy(e):xe(e)&&arguments.length>1?wh(e,t,n):z(e)}function wh(e,t,n){const r=e[t];return He(r)?r:new Gy(e,t,n)}class Jy{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Ru(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=ws-1,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&Ge!==this)return ih(this),!0}get value(){const t=this.dep.track();return uh(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Xy(e,t,n=!1){let r,o;return he(e)?r=e:(r=e.get,o=e.set),new Jy(r,o,n)}const ui={},zi=new WeakMap;let Fr;function Zy(e,t=!1,n=Fr){if(n){let r=zi.get(n);r||zi.set(n,r=[]),r.push(e)}}function Qy(e,t,n=Ye){const{immediate:r,deep:o,once:s,scheduler:i,augmentJob:a,call:l}=n,u=S=>o?S:Qt(S)||o===!1||o===0?Kn(S,1):Kn(S);let c,f,d,v,p=!1,h=!1;if(He(e)?(f=()=>e.value,p=Qt(e)):Gn(e)?(f=()=>u(e),p=!0):ce(e)?(h=!0,p=e.some(S=>Gn(S)||Qt(S)),f=()=>e.map(S=>{if(He(S))return S.value;if(Gn(S))return u(S);if(he(S))return l?l(S,2):S()})):he(e)?t?f=l?()=>l(e,2):e:f=()=>{if(d){Cr();try{d()}finally{Tr()}}const S=Fr;Fr=c;try{return l?l(e,3,[v]):e(v)}finally{Fr=S}}:f=pt,t&&o){const S=f,b=o===!0?1/0:o;f=()=>Kn(S(),b)}const y=Cu(),g=()=>{c.stop(),y&&Su(y.effects,c)};if(s&&t){const S=t;t=(...b)=>{S(...b),g()}}let _=h?new Array(e.length).fill(ui):ui;const E=S=>{if(!(!(c.flags&1)||!c.dirty&&!S))if(t){const b=c.run();if(o||p||(h?b.some((O,A)=>Sr(O,_[A])):Sr(b,_))){d&&d();const O=Fr;Fr=c;try{const A=[b,_===ui?void 0:h&&_[0]===ui?[]:_,v];l?l(t,3,A):t(...A),_=b}finally{Fr=O}}}else c.run()};return a&&a(E),c=new oh(f),c.scheduler=i?()=>i(E,!1):E,v=S=>Zy(S,!1,c),d=c.onStop=()=>{const S=zi.get(c);if(S){if(l)l(S,4);else for(const b of S)b();zi.delete(c)}},t?r?E(!0):_=c.run():i?i(E.bind(null,!0),!0):c.run(),g.pause=c.pause.bind(c),g.resume=c.resume.bind(c),g.stop=g,g}function Kn(e,t=1/0,n){if(t<=0||!xe(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,He(e))Kn(e.value,t,n);else if(ce(e))for(let r=0;r{Kn(r,t,n)});else if(Yp(e)){for(const r in e)Kn(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Kn(e[r],t,n)}return e}/** +* @vue/runtime-core v3.5.6 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function Hs(e,t,n,r){try{return r?e(...r):e()}catch(o){ha(o,t,n)}}function vn(e,t,n,r){if(he(e)){const o=Hs(e,t,n,r);return o&&Vi(o)&&o.catch(s=>{ha(s,t,n)}),o}if(ce(e)){const o=[];for(let s=0;s>>1,o=kt[r],s=Es(o);s=Es(n)?kt.push(e):kt.splice(tb(t),0,e),e.flags|=1,Sh()}}function Sh(){!Ss&&!Il&&(Il=!0,Fu=_h.then(Ch))}function nb(e){ce(e)?Oo.push(...e):hr&&e.id===-1?hr.splice(bo+1,0,e):e.flags&1||(Oo.push(e),e.flags|=1),Sh()}function Uc(e,t,n=Ss?Cn+1:0){for(;nEs(n)-Es(r));if(Oo.length=0,hr){hr.push(...t);return}for(hr=t,bo=0;boe.id==null?e.flags&2?-1:1/0:e.id;function Ch(e){Il=!1,Ss=!0;try{for(Cn=0;Cn{r._d&&of(-1);const s=Hi(t);let i;try{i=e(...o)}finally{Hi(s),r._d&&of(1)}return i};return r._n=!0,r._c=!0,r._d=!0,r}function ht(e,t){if(dt===null)return e;const n=_a(dt),r=e.dirs||(e.dirs=[]);for(let o=0;oe.__isTeleport,is=e=>e&&(e.disabled||e.disabled===""),rb=e=>e&&(e.defer||e.defer===""),qc=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Wc=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,$l=(e,t)=>{const n=e&&e.to;return Oe(n)?t?t(n):null:n},ob={name:"Teleport",__isTeleport:!0,process(e,t,n,r,o,s,i,a,l,u){const{mc:c,pc:f,pbc:d,o:{insert:v,querySelector:p,createText:h,createComment:y}}=u,g=is(t.props);let{shapeFlag:_,children:E,dynamicChildren:S}=t;if(e==null){const b=t.el=h(""),O=t.anchor=h("");v(b,n,r),v(O,n,r);const A=(x,M)=>{_&16&&(o&&o.isCE&&(o.ce._teleportTarget=x),c(E,x,M,o,s,i,a,l))},P=()=>{const x=t.target=$l(t.props,p),M=Ah(x,t,h,v);x&&(i!=="svg"&&qc(x)?i="svg":i!=="mathml"&&Wc(x)&&(i="mathml"),g||(A(x,M),Ai(t)))};g&&(A(n,O),Ai(t)),rb(t.props)?Mt(P,s):P()}else{t.el=e.el,t.targetStart=e.targetStart;const b=t.anchor=e.anchor,O=t.target=e.target,A=t.targetAnchor=e.targetAnchor,P=is(e.props),x=P?n:O,M=P?b:A;if(i==="svg"||qc(O)?i="svg":(i==="mathml"||Wc(O))&&(i="mathml"),S?(d(e.dynamicChildren,S,x,o,s,i,a),Uu(e,t,!0)):l||f(e,t,x,M,o,s,i,a,!1),g)P?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):ci(t,n,b,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const U=t.target=$l(t.props,p);U&&ci(t,U,null,u,0)}else P&&ci(t,O,A,u,1);Ai(t)}},remove(e,t,n,{um:r,o:{remove:o}},s){const{shapeFlag:i,children:a,anchor:l,targetStart:u,targetAnchor:c,target:f,props:d}=e;if(f&&(o(u),o(c)),s&&o(l),i&16){const v=s||!is(d);for(let p=0;p{e.isMounted=!0}),Ct(()=>{e.isUnmounting=!0}),e}const Xt=[Function,Array],Ph={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Xt,onEnter:Xt,onAfterEnter:Xt,onEnterCancelled:Xt,onBeforeLeave:Xt,onLeave:Xt,onAfterLeave:Xt,onLeaveCancelled:Xt,onBeforeAppear:Xt,onAppear:Xt,onAfterAppear:Xt,onAppearCancelled:Xt},Ih=e=>{const t=e.subTree;return t.component?Ih(t.component):t},ab={name:"BaseTransition",props:Ph,setup(e,{slots:t}){const n=st(),r=Rh();return()=>{const o=t.default&&Du(t.default(),!0);if(!o||!o.length)return;const s=$h(o),i=Ie(e),{mode:a}=i;if(r.isLeaving)return Xa(s);const l=Gc(s);if(!l)return Xa(s);let u=Cs(l,i,r,n,d=>u=d);l.type!==At&&Jr(l,u);const c=n.subTree,f=c&&Gc(c);if(f&&f.type!==At&&!Br(l,f)&&Ih(n).type!==At){const d=Cs(f,i,r,n);if(Jr(f,d),a==="out-in"&&l.type!==At)return r.isLeaving=!0,d.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave},Xa(s);a==="in-out"&&l.type!==At&&(d.delayLeave=(v,p,h)=>{const y=kh(r,f);y[String(f.key)]=f,v[vr]=()=>{p(),v[vr]=void 0,delete u.delayedLeave},u.delayedLeave=h})}return s}}};function $h(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==At){t=n;break}}return t}const lb=ab;function kh(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Cs(e,t,n,r,o){const{appear:s,mode:i,persisted:a=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:c,onEnterCancelled:f,onBeforeLeave:d,onLeave:v,onAfterLeave:p,onLeaveCancelled:h,onBeforeAppear:y,onAppear:g,onAfterAppear:_,onAppearCancelled:E}=t,S=String(e.key),b=kh(n,e),O=(x,M)=>{x&&vn(x,r,9,M)},A=(x,M)=>{const U=M[1];O(x,M),ce(x)?x.every(N=>N.length<=1)&&U():x.length<=1&&U()},P={mode:i,persisted:a,beforeEnter(x){let M=l;if(!n.isMounted)if(s)M=y||l;else return;x[vr]&&x[vr](!0);const U=b[S];U&&Br(e,U)&&U.el[vr]&&U.el[vr](),O(M,[x])},enter(x){let M=u,U=c,N=f;if(!n.isMounted)if(s)M=g||u,U=_||c,N=E||f;else return;let D=!1;const Z=x[fi]=I=>{D||(D=!0,I?O(N,[x]):O(U,[x]),P.delayedLeave&&P.delayedLeave(),x[fi]=void 0)};M?A(M,[x,Z]):Z()},leave(x,M){const U=String(e.key);if(x[fi]&&x[fi](!0),n.isUnmounting)return M();O(d,[x]);let N=!1;const D=x[vr]=Z=>{N||(N=!0,M(),Z?O(h,[x]):O(p,[x]),x[vr]=void 0,b[U]===e&&delete b[U])};b[U]=e,v?A(v,[x,D]):D()},clone(x){const M=Cs(x,t,n,r,o);return o&&o(M),M}};return P}function Xa(e){if(va(e))return e=Jn(e),e.children=null,e}function Gc(e){if(!va(e))return xh(e.type)&&e.children?$h(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&he(n.default))return n.default()}}function Jr(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Jr(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Du(e,t=!1,n){let r=[],o=0;for(let s=0;s1)for(let s=0;skl(p,t&&(ce(t)?t[h]:t),n,r,o));return}if(xo(r)&&!o)return;const s=r.shapeFlag&4?_a(r.component):r.el,i=o?null:s,{i:a,r:l}=e,u=t&&t.r,c=a.refs===Ye?a.refs={}:a.refs,f=a.setupState,d=Ie(f),v=f===Ye?()=>!1:p=>je(d,p);if(u!=null&&u!==l&&(Oe(u)?(c[u]=null,v(u)&&(f[u]=null)):He(u)&&(u.value=null)),he(l))Hs(l,a,12,[i,c]);else{const p=Oe(l),h=He(l);if(p||h){const y=()=>{if(e.f){const g=p?v(l)?f[l]:c[l]:l.value;o?ce(g)&&Su(g,s):ce(g)?g.includes(s)||g.push(s):p?(c[l]=[s],v(l)&&(f[l]=c[l])):(l.value=[s],e.k&&(c[e.k]=l.value))}else p?(c[l]=i,v(l)&&(f[l]=i)):h&&(l.value=i,e.k&&(c[e.k]=i))};i?(y.id=-1,Mt(y,n)):y()}}}const xo=e=>!!e.type.__asyncLoader,va=e=>e.type.__isKeepAlive;function Vu(e,t){Mh(e,"a",t)}function Nh(e,t){Mh(e,"da",t)}function Mh(e,t,n=wt){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(ma(t,r,n),n){let o=n.parent;for(;o&&o.parent;)va(o.parent.vnode)&&ub(r,t,n,o),o=o.parent}}function ub(e,t,n,r){const o=ma(t,e,r,!0);oo(()=>{Su(r[t],o)},n)}function ma(e,t,n=wt,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{Cr();const a=Ks(n),l=vn(t,n,e,i);return a(),Tr(),l});return r?o.unshift(s):o.push(s),s}}const Qn=e=>(t,n=wt)=>{(!wa||e==="sp")&&ma(e,(...r)=>t(...r),n)},ga=Qn("bm"),Ue=Qn("m"),cb=Qn("bu"),ro=Qn("u"),Ct=Qn("bum"),oo=Qn("um"),fb=Qn("sp"),db=Qn("rtg"),pb=Qn("rtc");function hb(e,t=wt){ma("ec",e,t)}const ju="components",vb="directives";function $r(e,t){return zu(ju,e,!0,t)||e}const Fh=Symbol.for("v-ndc");function at(e){return Oe(e)?zu(ju,e,!1)||e:e||Fh}function mb(e){return zu(vb,e)}function zu(e,t,n=!0,r=!1){const o=dt||wt;if(o){const s=o.type;if(e===ju){const a=o0(s,!1);if(a&&(a===t||a===tn(t)||a===js(tn(t))))return s}const i=Yc(o[e]||s[e],t)||Yc(o.appContext[e],t);return!i&&r?s:i}}function Yc(e,t){return e&&(e[t]||e[tn(t)]||e[js(tn(t))])}function Jc(e,t,n,r){let o;const s=n,i=ce(e);if(i||Oe(e)){const a=i&&Gn(e);let l=!1;a&&(l=!Qt(e),e=da(e)),o=new Array(e.length);for(let u=0,c=e.length;ut(a,l,void 0,s));else{const a=Object.keys(e);o=new Array(a.length);for(let l=0,u=a.length;l{const s=r.fn(...o);return s&&(s.key=r.key),s}:r.fn)}return e}function de(e,t,n={},r,o){if(dt.ce||dt.parent&&xo(dt.parent)&&dt.parent.ce)return t!=="default"&&(n.name=t),$(),pe(et,null,[ie("slot",n,r&&r())],64);let s=e[t];s&&s._c&&(s._d=!1),$();const i=s&&Bh(s(n)),a=pe(et,{key:(n.key||i&&i.key||`_${t}`)+(!i&&r?"_fb":"")},i||(r?r():[]),i&&e._===1?64:-2);return a.scopeId&&(a.slotScopeIds=[a.scopeId+"-s"]),s&&s._c&&(s._d=!0),a}function Bh(e){return e.some(t=>Yn(t)?!(t.type===At||t.type===et&&!Bh(t.children)):!0)?e:null}const Ll=e=>e?rv(e)?_a(e):Ll(e.parent):null,as=ft(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ll(e.parent),$root:e=>Ll(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Hu(e),$forceUpdate:e=>e.f||(e.f=()=>{Bu(e.update)}),$nextTick:e=>e.n||(e.n=ze.bind(e.proxy)),$watch:e=>jb.bind(e)}),Za=(e,t)=>e!==Ye&&!e.__isScriptSetup&&je(e,t),yb={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:a,appContext:l}=e;let u;if(t[0]!=="$"){const v=i[t];if(v!==void 0)switch(v){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(Za(r,t))return i[t]=1,r[t];if(o!==Ye&&je(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&je(u,t))return i[t]=3,s[t];if(n!==Ye&&je(n,t))return i[t]=4,n[t];Nl&&(i[t]=0)}}const c=as[t];let f,d;if(c)return t==="$attrs"&&Rt(e.attrs,"get",""),c(e);if((f=a.__cssModules)&&(f=f[t]))return f;if(n!==Ye&&je(n,t))return i[t]=4,n[t];if(d=l.config.globalProperties,je(d,t))return d[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return Za(o,t)?(o[t]=n,!0):r!==Ye&&je(r,t)?(r[t]=n,!0):je(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},i){let a;return!!n[i]||e!==Ye&&je(e,i)||Za(t,i)||(a=s[0])&&je(a,i)||je(r,i)||je(as,i)||je(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:je(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function so(){return Dh().slots}function bb(){return Dh().attrs}function Dh(){const e=st();return e.setupContext||(e.setupContext=sv(e))}function Xc(e){return ce(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Nl=!0;function wb(e){const t=Hu(e),n=e.proxy,r=e.ctx;Nl=!1,t.beforeCreate&&Zc(t.beforeCreate,e,"bc");const{data:o,computed:s,methods:i,watch:a,provide:l,inject:u,created:c,beforeMount:f,mounted:d,beforeUpdate:v,updated:p,activated:h,deactivated:y,beforeDestroy:g,beforeUnmount:_,destroyed:E,unmounted:S,render:b,renderTracked:O,renderTriggered:A,errorCaptured:P,serverPrefetch:x,expose:M,inheritAttrs:U,components:N,directives:D,filters:Z}=t;if(u&&_b(u,r,null),i)for(const H in i){const re=i[H];he(re)&&(r[H]=re.bind(n))}if(o){const H=o.call(n,n);xe(H)&&(e.data=Et(H))}if(Nl=!0,s)for(const H in s){const re=s[H],ye=he(re)?re.bind(n,n):he(re.get)?re.get.bind(n,n):pt,Ne=!he(re)&&he(re.set)?re.set.bind(n):pt,Me=T({get:ye,set:Ne});Object.defineProperty(r,H,{enumerable:!0,configurable:!0,get:()=>Me.value,set:Pe=>Me.value=Pe})}if(a)for(const H in a)Vh(a[H],r,n,H);if(l){const H=he(l)?l.call(n):l;Reflect.ownKeys(H).forEach(re=>{ct(re,H[re])})}c&&Zc(c,e,"c");function R(H,re){ce(re)?re.forEach(ye=>H(ye.bind(n))):re&&H(re.bind(n))}if(R(ga,f),R(Ue,d),R(cb,v),R(ro,p),R(Vu,h),R(Nh,y),R(hb,P),R(pb,O),R(db,A),R(Ct,_),R(oo,S),R(fb,x),ce(M))if(M.length){const H=e.exposed||(e.exposed={});M.forEach(re=>{Object.defineProperty(H,re,{get:()=>n[re],set:ye=>n[re]=ye})})}else e.exposed||(e.exposed={});b&&e.render===pt&&(e.render=b),U!=null&&(e.inheritAttrs=U),N&&(e.components=N),D&&(e.directives=D),x&&Lh(e)}function _b(e,t,n=pt){ce(e)&&(e=Ml(e));for(const r in e){const o=e[r];let s;xe(o)?"default"in o?s=_e(o.from||r,o.default,!0):s=_e(o.from||r):s=_e(o),He(s)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>s.value,set:i=>s.value=i}):t[r]=s}}function Zc(e,t,n){vn(ce(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function Vh(e,t,n,r){let o=r.includes(".")?Zh(n,r):()=>n[r];if(Oe(e)){const s=t[e];he(s)&&me(o,s)}else if(he(e))me(o,e.bind(n));else if(xe(e))if(ce(e))e.forEach(s=>Vh(s,t,n,r));else{const s=he(e.handler)?e.handler.bind(n):t[e.handler];he(s)&&me(o,s,e)}}function Hu(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,a=s.get(t);let l;return a?l=a:!o.length&&!n&&!r?l=t:(l={},o.length&&o.forEach(u=>Ki(l,u,i,!0)),Ki(l,t,i)),xe(t)&&s.set(t,l),l}function Ki(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&Ki(e,s,n,!0),o&&o.forEach(i=>Ki(e,i,n,!0));for(const i in t)if(!(r&&i==="expose")){const a=Sb[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const Sb={data:Qc,props:ef,emits:ef,methods:ns,computed:ns,beforeCreate:It,created:It,beforeMount:It,mounted:It,beforeUpdate:It,updated:It,beforeDestroy:It,beforeUnmount:It,destroyed:It,unmounted:It,activated:It,deactivated:It,errorCaptured:It,serverPrefetch:It,components:ns,directives:ns,watch:Cb,provide:Qc,inject:Eb};function Qc(e,t){return t?e?function(){return ft(he(e)?e.call(this,this):e,he(t)?t.call(this,this):t)}:t:e}function Eb(e,t){return ns(Ml(e),Ml(t))}function Ml(e){if(ce(e)){const t={};for(let n=0;n1)return n&&he(t)?t.call(r&&r.proxy):t}}function xb(){return!!(wt||dt||Kr)}const zh={},Hh=()=>Object.create(zh),Kh=e=>Object.getPrototypeOf(e)===zh;function Ab(e,t,n,r=!1){const o={},s=Hh();e.propsDefaults=Object.create(null),Uh(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:$u(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function Rb(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,a=Ie(o),[l]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let f=0;f{l=!0;const[d,v]=qh(f,t,!0);ft(i,d),v&&a.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!s&&!l)return xe(e)&&r.set(e,Co),Co;if(ce(s))for(let c=0;ce[0]==="_"||e==="$stable",Ku=e=>ce(e)?e.map(On):[On(e)],Ib=(e,t,n)=>{if(t._n)return t;const r=ve((...o)=>Ku(t(...o)),n);return r._c=!1,r},Gh=(e,t,n)=>{const r=e._ctx;for(const o in e){if(Wh(o))continue;const s=e[o];if(he(s))t[o]=Ib(o,s,r);else if(s!=null){const i=Ku(s);t[o]=()=>i}}},Yh=(e,t)=>{const n=Ku(t);e.slots.default=()=>n},Jh=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},$b=(e,t,n)=>{const r=e.slots=Hh();if(e.vnode.shapeFlag&32){const o=t._;o?(Jh(r,t,n),n&&Jp(r,"_",o,!0)):Gh(t,r)}else t&&Yh(e,t)},kb=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=Ye;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:Jh(o,t,n):(s=!t.$stable,Gh(t,o)),i=t}else t&&(Yh(e,t),i={default:1});if(s)for(const a in o)!Wh(a)&&i[a]==null&&delete o[a]},Mt=Gb;function Lb(e){return Nb(e)}function Nb(e,t){const n=Xp();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:a,createComment:l,setText:u,setElementText:c,parentNode:f,nextSibling:d,setScopeId:v=pt,insertStaticContent:p}=e,h=(w,C,k,G=null,K=null,Y=null,oe=void 0,ee=null,ne=!!C.dynamicChildren)=>{if(w===C)return;w&&!Br(w,C)&&(G=F(w),Pe(w,K,Y,!0),w=null),C.patchFlag===-2&&(ne=!1,C.dynamicChildren=null);const{type:X,ref:we,shapeFlag:se}=C;switch(X){case Do:y(w,C,k,G);break;case At:g(w,C,k,G);break;case Ri:w==null&&_(C,k,G,oe);break;case et:N(w,C,k,G,K,Y,oe,ee,ne);break;default:se&1?b(w,C,k,G,K,Y,oe,ee,ne):se&6?D(w,C,k,G,K,Y,oe,ee,ne):(se&64||se&128)&&X.process(w,C,k,G,K,Y,oe,ee,ne,te)}we!=null&&K&&kl(we,w&&w.ref,Y,C||w,!C)},y=(w,C,k,G)=>{if(w==null)r(C.el=a(C.children),k,G);else{const K=C.el=w.el;C.children!==w.children&&u(K,C.children)}},g=(w,C,k,G)=>{w==null?r(C.el=l(C.children||""),k,G):C.el=w.el},_=(w,C,k,G)=>{[w.el,w.anchor]=p(w.children,C,k,G,w.el,w.anchor)},E=({el:w,anchor:C},k,G)=>{let K;for(;w&&w!==C;)K=d(w),r(w,k,G),w=K;r(C,k,G)},S=({el:w,anchor:C})=>{let k;for(;w&&w!==C;)k=d(w),o(w),w=k;o(C)},b=(w,C,k,G,K,Y,oe,ee,ne)=>{C.type==="svg"?oe="svg":C.type==="math"&&(oe="mathml"),w==null?O(C,k,G,K,Y,oe,ee,ne):x(w,C,K,Y,oe,ee,ne)},O=(w,C,k,G,K,Y,oe,ee)=>{let ne,X;const{props:we,shapeFlag:se,transition:L,dirs:ae}=w;if(ne=w.el=i(w.type,Y,we&&we.is,we),se&8?c(ne,w.children):se&16&&P(w.children,ne,null,G,K,Qa(w,Y),oe,ee),ae&&Ir(w,null,G,"created"),A(ne,w,w.scopeId,oe,G),we){for(const De in we)De!=="value"&&!os(De)&&s(ne,De,null,we[De],Y,G);"value"in we&&s(ne,"value",null,we.value,Y),(X=we.onVnodeBeforeMount)&&En(X,G,w)}ae&&Ir(w,null,G,"beforeMount");const Se=Mb(K,L);Se&&L.beforeEnter(ne),r(ne,C,k),((X=we&&we.onVnodeMounted)||Se||ae)&&Mt(()=>{X&&En(X,G,w),Se&&L.enter(ne),ae&&Ir(w,null,G,"mounted")},K)},A=(w,C,k,G,K)=>{if(k&&v(w,k),G)for(let Y=0;Y{for(let X=ne;X{const ee=C.el=w.el;let{patchFlag:ne,dynamicChildren:X,dirs:we}=C;ne|=w.patchFlag&16;const se=w.props||Ye,L=C.props||Ye;let ae;if(k&&kr(k,!1),(ae=L.onVnodeBeforeUpdate)&&En(ae,k,C,w),we&&Ir(C,w,k,"beforeUpdate"),k&&kr(k,!0),(se.innerHTML&&L.innerHTML==null||se.textContent&&L.textContent==null)&&c(ee,""),X?M(w.dynamicChildren,X,ee,k,G,Qa(C,K),Y):oe||re(w,C,ee,null,k,G,Qa(C,K),Y,!1),ne>0){if(ne&16)U(ee,se,L,k,K);else if(ne&2&&se.class!==L.class&&s(ee,"class",null,L.class,K),ne&4&&s(ee,"style",se.style,L.style,K),ne&8){const Se=C.dynamicProps;for(let De=0;De{ae&&En(ae,k,C,w),we&&Ir(C,w,k,"updated")},G)},M=(w,C,k,G,K,Y,oe)=>{for(let ee=0;ee{if(C!==k){if(C!==Ye)for(const Y in C)!os(Y)&&!(Y in k)&&s(w,Y,C[Y],null,K,G);for(const Y in k){if(os(Y))continue;const oe=k[Y],ee=C[Y];oe!==ee&&Y!=="value"&&s(w,Y,ee,oe,K,G)}"value"in k&&s(w,"value",C.value,k.value,K)}},N=(w,C,k,G,K,Y,oe,ee,ne)=>{const X=C.el=w?w.el:a(""),we=C.anchor=w?w.anchor:a("");let{patchFlag:se,dynamicChildren:L,slotScopeIds:ae}=C;ae&&(ee=ee?ee.concat(ae):ae),w==null?(r(X,k,G),r(we,k,G),P(C.children||[],k,we,K,Y,oe,ee,ne)):se>0&&se&64&&L&&w.dynamicChildren?(M(w.dynamicChildren,L,k,K,Y,oe,ee),(C.key!=null||K&&C===K.subTree)&&Uu(w,C,!0)):re(w,C,k,we,K,Y,oe,ee,ne)},D=(w,C,k,G,K,Y,oe,ee,ne)=>{C.slotScopeIds=ee,w==null?C.shapeFlag&512?K.ctx.activate(C,k,G,oe,ne):Z(C,k,G,K,Y,oe,ne):I(w,C,ne)},Z=(w,C,k,G,K,Y,oe)=>{const ee=w.component=e0(w,G,K);if(va(w)&&(ee.ctx.renderer=te),t0(ee,!1,oe),ee.asyncDep){if(K&&K.registerDep(ee,R,oe),!w.el){const ne=ee.subTree=ie(At);g(null,ne,C,k)}}else R(ee,w,C,k,K,Y,oe)},I=(w,C,k)=>{const G=C.component=w.component;if(qb(w,C,k))if(G.asyncDep&&!G.asyncResolved){H(G,C,k);return}else G.next=C,G.update();else C.el=w.el,G.vnode=C},R=(w,C,k,G,K,Y,oe)=>{const ee=()=>{if(w.isMounted){let{next:se,bu:L,u:ae,parent:Se,vnode:De}=w;{const Tt=Xh(w);if(Tt){se&&(se.el=De.el,H(w,se,oe)),Tt.asyncDep.then(()=>{w.isUnmounted||ee()});return}}let Le=se,Pt;kr(w,!1),se?(se.el=De.el,H(w,se,oe)):se=De,L&&xi(L),(Pt=se.props&&se.props.onVnodeBeforeUpdate)&&En(Pt,Se,se,De),kr(w,!0);const yt=el(w),Ht=w.subTree;w.subTree=yt,h(Ht,yt,f(Ht.el),F(Ht),w,K,Y),se.el=yt.el,Le===null&&Wb(w,yt.el),ae&&Mt(ae,K),(Pt=se.props&&se.props.onVnodeUpdated)&&Mt(()=>En(Pt,Se,se,De),K)}else{let se;const{el:L,props:ae}=C,{bm:Se,m:De,parent:Le,root:Pt,type:yt}=w,Ht=xo(C);if(kr(w,!1),Se&&xi(Se),!Ht&&(se=ae&&ae.onVnodeBeforeMount)&&En(se,Le,C),kr(w,!0),L&&Te){const Tt=()=>{w.subTree=el(w),Te(L,w.subTree,w,K,null)};Ht&&yt.__asyncHydrate?yt.__asyncHydrate(L,w,Tt):Tt()}else{Pt.ce&&Pt.ce._injectChildStyle(yt);const Tt=w.subTree=el(w);h(null,Tt,k,G,w,K,Y),C.el=Tt.el}if(De&&Mt(De,K),!Ht&&(se=ae&&ae.onVnodeMounted)){const Tt=C;Mt(()=>En(se,Le,Tt),K)}(C.shapeFlag&256||Le&&xo(Le.vnode)&&Le.vnode.shapeFlag&256)&&w.a&&Mt(w.a,K),w.isMounted=!0,C=k=G=null}};w.scope.on();const ne=w.effect=new oh(ee);w.scope.off();const X=w.update=ne.run.bind(ne),we=w.job=ne.runIfDirty.bind(ne);we.i=w,we.id=w.uid,ne.scheduler=()=>Bu(we),kr(w,!0),X()},H=(w,C,k)=>{C.component=w;const G=w.vnode.props;w.vnode=C,w.next=null,Rb(w,C.props,G,k),kb(w,C.children,k),Cr(),Uc(w),Tr()},re=(w,C,k,G,K,Y,oe,ee,ne=!1)=>{const X=w&&w.children,we=w?w.shapeFlag:0,se=C.children,{patchFlag:L,shapeFlag:ae}=C;if(L>0){if(L&128){Ne(X,se,k,G,K,Y,oe,ee,ne);return}else if(L&256){ye(X,se,k,G,K,Y,oe,ee,ne);return}}ae&8?(we&16&&Ee(X,K,Y),se!==X&&c(k,se)):we&16?ae&16?Ne(X,se,k,G,K,Y,oe,ee,ne):Ee(X,K,Y,!0):(we&8&&c(k,""),ae&16&&P(se,k,G,K,Y,oe,ee,ne))},ye=(w,C,k,G,K,Y,oe,ee,ne)=>{w=w||Co,C=C||Co;const X=w.length,we=C.length,se=Math.min(X,we);let L;for(L=0;Lwe?Ee(w,K,Y,!0,!1,se):P(C,k,G,K,Y,oe,ee,ne,se)},Ne=(w,C,k,G,K,Y,oe,ee,ne)=>{let X=0;const we=C.length;let se=w.length-1,L=we-1;for(;X<=se&&X<=L;){const ae=w[X],Se=C[X]=ne?mr(C[X]):On(C[X]);if(Br(ae,Se))h(ae,Se,k,null,K,Y,oe,ee,ne);else break;X++}for(;X<=se&&X<=L;){const ae=w[se],Se=C[L]=ne?mr(C[L]):On(C[L]);if(Br(ae,Se))h(ae,Se,k,null,K,Y,oe,ee,ne);else break;se--,L--}if(X>se){if(X<=L){const ae=L+1,Se=aeL)for(;X<=se;)Pe(w[X],K,Y,!0),X++;else{const ae=X,Se=X,De=new Map;for(X=Se;X<=L;X++){const bt=C[X]=ne?mr(C[X]):On(C[X]);bt.key!=null&&De.set(bt.key,X)}let Le,Pt=0;const yt=L-Se+1;let Ht=!1,Tt=0;const rr=new Array(yt);for(X=0;X=yt){Pe(bt,K,Y,!0);continue}let Jt;if(bt.key!=null)Jt=De.get(bt.key);else for(Le=Se;Le<=L;Le++)if(rr[Le-Se]===0&&Br(bt,C[Le])){Jt=Le;break}Jt===void 0?Pe(bt,K,Y,!0):(rr[Jt-Se]=X+1,Jt>=Tt?Tt=Jt:Ht=!0,h(bt,C[Jt],k,null,K,Y,oe,ee,ne),Pt++)}const Wo=Ht?Fb(rr):Co;for(Le=Wo.length-1,X=yt-1;X>=0;X--){const bt=Se+X,Jt=C[bt],ti=bt+1{const{el:Y,type:oe,transition:ee,children:ne,shapeFlag:X}=w;if(X&6){Me(w.component.subTree,C,k,G);return}if(X&128){w.suspense.move(C,k,G);return}if(X&64){oe.move(w,C,k,te);return}if(oe===et){r(Y,C,k);for(let se=0;seee.enter(Y),K);else{const{leave:se,delayLeave:L,afterLeave:ae}=ee,Se=()=>r(Y,C,k),De=()=>{se(Y,()=>{Se(),ae&&ae()})};L?L(Y,Se,De):De()}else r(Y,C,k)},Pe=(w,C,k,G=!1,K=!1)=>{const{type:Y,props:oe,ref:ee,children:ne,dynamicChildren:X,shapeFlag:we,patchFlag:se,dirs:L,cacheIndex:ae}=w;if(se===-2&&(K=!1),ee!=null&&kl(ee,null,k,w,!0),ae!=null&&(C.renderCache[ae]=void 0),we&256){C.ctx.deactivate(w);return}const Se=we&1&&L,De=!xo(w);let Le;if(De&&(Le=oe&&oe.onVnodeBeforeUnmount)&&En(Le,C,w),we&6)qe(w.component,k,G);else{if(we&128){w.suspense.unmount(k,G);return}Se&&Ir(w,null,C,"beforeUnmount"),we&64?w.type.remove(w,C,k,te,G):X&&!X.hasOnce&&(Y!==et||se>0&&se&64)?Ee(X,C,k,!1,!0):(Y===et&&se&384||!K&&we&16)&&Ee(ne,C,k),G&&Ce(w)}(De&&(Le=oe&&oe.onVnodeUnmounted)||Se)&&Mt(()=>{Le&&En(Le,C,w),Se&&Ir(w,null,C,"unmounted")},k)},Ce=w=>{const{type:C,el:k,anchor:G,transition:K}=w;if(C===et){We(k,G);return}if(C===Ri){S(w);return}const Y=()=>{o(k),K&&!K.persisted&&K.afterLeave&&K.afterLeave()};if(w.shapeFlag&1&&K&&!K.persisted){const{leave:oe,delayLeave:ee}=K,ne=()=>oe(k,Y);ee?ee(w.el,Y,ne):ne()}else Y()},We=(w,C)=>{let k;for(;w!==C;)k=d(w),o(w),w=k;o(C)},qe=(w,C,k)=>{const{bum:G,scope:K,job:Y,subTree:oe,um:ee,m:ne,a:X}=w;nf(ne),nf(X),G&&xi(G),K.stop(),Y&&(Y.flags|=8,Pe(oe,w,C,k)),ee&&Mt(ee,C),Mt(()=>{w.isUnmounted=!0},C),C&&C.pendingBranch&&!C.isUnmounted&&w.asyncDep&&!w.asyncResolved&&w.suspenseId===C.pendingId&&(C.deps--,C.deps===0&&C.resolve())},Ee=(w,C,k,G=!1,K=!1,Y=0)=>{for(let oe=Y;oe{if(w.shapeFlag&6)return F(w.component.subTree);if(w.shapeFlag&128)return w.suspense.next();const C=d(w.anchor||w.el),k=C&&C[Oh];return k?d(k):C};let j=!1;const W=(w,C,k)=>{w==null?C._vnode&&Pe(C._vnode,null,null,!0):h(C._vnode||null,w,C,null,null,null,k),C._vnode=w,j||(j=!0,Uc(),Eh(),j=!1)},te={p:h,um:Pe,m:Me,r:Ce,mt:Z,mc:P,pc:re,pbc:M,n:F,o:e};let be,Te;return{render:W,hydrate:be,createApp:Ob(W,be)}}function Qa({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function kr({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Mb(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Uu(e,t,n=!1){const r=e.children,o=t.children;if(ce(r)&&ce(o))for(let s=0;s>1,e[n[a]]0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,i=n[s-1];s-- >0;)n[s]=i,i=t[i];return n}function Xh(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Xh(t)}function nf(e){if(e)for(let t=0;t_e(Bb);function qu(e,t){return ya(e,null,t)}function Vb(e,t){return ya(e,null,{flush:"post"})}function me(e,t,n){return ya(e,t,n)}function ya(e,t,n=Ye){const{immediate:r,deep:o,flush:s,once:i}=n,a=ft({},n);let l;if(wa)if(s==="sync"){const d=Db();l=d.__watcherHandles||(d.__watcherHandles=[])}else if(!t||r)a.once=!0;else{const d=()=>{};return d.stop=pt,d.resume=pt,d.pause=pt,d}const u=wt;a.call=(d,v,p)=>vn(d,u,v,p);let c=!1;s==="post"?a.scheduler=d=>{Mt(d,u&&u.suspense)}:s!=="sync"&&(c=!0,a.scheduler=(d,v)=>{v?d():Bu(d)}),a.augmentJob=d=>{t&&(d.flags|=4),c&&(d.flags|=2,u&&(d.id=u.uid,d.i=u))};const f=Qy(e,t,a);return l&&l.push(f),f}function jb(e,t,n){const r=this.proxy,o=Oe(e)?e.includes(".")?Zh(r,e):()=>r[e]:e.bind(r,r);let s;he(t)?s=t:(s=t.handler,n=t);const i=Ks(this),a=ya(o,s.bind(r),n);return i(),a}function Zh(e,t){const n=t.split(".");return()=>{let r=e;for(let o=0;ot==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${tn(t)}Modifiers`]||e[`${Zn(t)}Modifiers`];function Hb(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||Ye;let o=n;const s=t.startsWith("update:"),i=s&&zb(r,t.slice(7));i&&(i.trim&&(o=n.map(c=>Oe(c)?c.trim():c)),i.number&&(o=n.map(Al)));let a,l=r[a=Oi(t)]||r[a=Oi(tn(t))];!l&&s&&(l=r[a=Oi(Zn(t))]),l&&vn(l,e,6,o);const u=r[a+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,vn(u,e,6,o)}}function Qh(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},a=!1;if(!he(e)){const l=u=>{const c=Qh(u,t,!0);c&&(a=!0,ft(i,c))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(xe(e)&&r.set(e,null),null):(ce(s)?s.forEach(l=>i[l]=null):ft(i,s),xe(e)&&r.set(e,i),i)}function ba(e,t){return!e||!la(t)?!1:(t=t.slice(2).replace(/Once$/,""),je(e,t[0].toLowerCase()+t.slice(1))||je(e,Zn(t))||je(e,t))}function el(e){const{type:t,vnode:n,proxy:r,withProxy:o,propsOptions:[s],slots:i,attrs:a,emit:l,render:u,renderCache:c,props:f,data:d,setupState:v,ctx:p,inheritAttrs:h}=e,y=Hi(e);let g,_;try{if(n.shapeFlag&4){const S=o||r,b=S;g=On(u.call(b,S,c,f,v,d,p)),_=a}else{const S=t;g=On(S.length>1?S(f,{attrs:a,slots:i,emit:l}):S(f,null)),_=t.props?a:Kb(a)}}catch(S){ls.length=0,ha(S,e,1),g=ie(At)}let E=g;if(_&&h!==!1){const S=Object.keys(_),{shapeFlag:b}=E;S.length&&b&7&&(s&&S.some(_u)&&(_=Ub(_,s)),E=Jn(E,_,!1,!0))}return n.dirs&&(E=Jn(E,null,!1,!0),E.dirs=E.dirs?E.dirs.concat(n.dirs):n.dirs),n.transition&&Jr(E,n.transition),g=E,Hi(y),g}const Kb=e=>{let t;for(const n in e)(n==="class"||n==="style"||la(n))&&((t||(t={}))[n]=e[n]);return t},Ub=(e,t)=>{const n={};for(const r in e)(!_u(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function qb(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:a,patchFlag:l}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?rf(r,i,u):!!i;if(l&8){const c=t.dynamicProps;for(let f=0;fe.__isSuspense;function Gb(e,t){t&&t.pendingBranch?ce(e)?t.effects.push(...e):t.effects.push(e):nb(e)}const et=Symbol.for("v-fgt"),Do=Symbol.for("v-txt"),At=Symbol.for("v-cmt"),Ri=Symbol.for("v-stc"),ls=[];let qt=null;function $(e=!1){ls.push(qt=e?null:[])}function Yb(){ls.pop(),qt=ls[ls.length-1]||null}let Ts=1;function of(e){Ts+=e,e<0&&qt&&(qt.hasOnce=!0)}function tv(e){return e.dynamicChildren=Ts>0?qt||Co:null,Yb(),Ts>0&&qt&&qt.push(e),e}function Q(e,t,n,r,o,s){return tv(fe(e,t,n,r,o,s,!0))}function pe(e,t,n,r,o){return tv(ie(e,t,n,r,o,!0))}function Yn(e){return e?e.__v_isVNode===!0:!1}function Br(e,t){return e.type===t.type&&e.key===t.key}const nv=({key:e})=>e??null,Pi=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?Oe(e)||He(e)||he(e)?{i:dt,r:e,k:t,f:!!n}:e:null);function fe(e,t=null,n=null,r=0,o=null,s=e===et?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&nv(t),ref:t&&Pi(t),scopeId:Th,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null,ctx:dt};return a?(Wu(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=Oe(n)?8:16),Ts>0&&!i&&qt&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&qt.push(l),l}const ie=Jb;function Jb(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===Fh)&&(e=At),Yn(e)){const a=Jn(e,t,!0);return n&&Wu(a,n),Ts>0&&!s&&qt&&(a.shapeFlag&6?qt[qt.indexOf(e)]=a:qt.push(a)),a.patchFlag=-2,a}if(s0(e)&&(e=e.__vccOpts),t){t=Xb(t);let{class:a,style:l}=t;a&&!Oe(a)&&(t.class=q(a)),xe(l)&&(Lu(l)&&!ce(l)&&(l=ft({},l)),t.style=it(l))}const i=Oe(e)?1:ev(e)?128:xh(e)?64:xe(e)?4:he(e)?2:0;return fe(e,t,n,r,o,i,s,!0)}function Xb(e){return e?Lu(e)||Kh(e)?ft({},e):e:null}function Jn(e,t,n=!1,r=!1){const{props:o,ref:s,patchFlag:i,children:a,transition:l}=e,u=t?hn(o||{},t):o,c={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&nv(u),ref:t&&t.ref?n&&s?ce(s)?s.concat(Pi(t)):[s,Pi(t)]:Pi(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==et?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:l,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&Jn(e.ssContent),ssFallback:e.ssFallback&&Jn(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return l&&r&&Jr(c,l.clone(c)),c}function Xr(e=" ",t=0){return ie(Do,null,e,t)}function ue(e="",t=!1){return t?($(),pe(At,null,e)):ie(At,null,e)}function On(e){return e==null||typeof e=="boolean"?ie(At):ce(e)?ie(et,null,e.slice()):typeof e=="object"?mr(e):ie(Do,null,String(e))}function mr(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:Jn(e)}function Wu(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(ce(t))n=16;else if(typeof t=="object")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),Wu(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!Kh(t)?t._ctx=dt:o===3&&dt&&(dt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else he(t)?(t={default:t,_ctx:dt},n=32):(t=String(t),r&64?(n=16,t=[Xr(t)]):n=8);e.children=t,e.shapeFlag|=n}function hn(...e){const t={};for(let n=0;nwt||dt;let Ui,Bl;{const e=Xp(),t=(n,r)=>{let o;return(o=e[n])||(o=e[n]=[]),o.push(r),s=>{o.length>1?o.forEach(i=>i(s)):o[0](s)}};Ui=t("__VUE_INSTANCE_SETTERS__",n=>wt=n),Bl=t("__VUE_SSR_SETTERS__",n=>wa=n)}const Ks=e=>{const t=wt;return Ui(e),e.scope.on(),()=>{e.scope.off(),Ui(t)}},sf=()=>{wt&&wt.scope.off(),Ui(null)};function rv(e){return e.vnode.shapeFlag&4}let wa=!1;function t0(e,t=!1,n=!1){t&&Bl(t);const{props:r,children:o}=e.vnode,s=rv(e);Ab(e,r,s,t),$b(e,o,n);const i=s?n0(e,t):void 0;return t&&Bl(!1),i}function n0(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,yb);const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?sv(e):null,s=Ks(e);Cr();const i=Hs(r,e,0,[e.props,o]);if(Tr(),s(),Vi(i)){if(xo(e)||Lh(e),i.then(sf,sf),t)return i.then(a=>{af(e,a,t)}).catch(a=>{ha(a,e,0)});e.asyncDep=i}else af(e,i,t)}else ov(e,t)}function af(e,t,n){he(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:xe(t)&&(e.setupState=bh(t)),ov(e,n)}let lf;function ov(e,t,n){const r=e.type;if(!e.render){if(!t&&lf&&!r.render){const o=r.template||Hu(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,u=ft(ft({isCustomElement:s,delimiters:a},i),l);r.render=lf(o,u)}}e.render=r.render||pt}{const o=Ks(e);Cr();try{wb(e)}finally{Tr(),o()}}}const r0={get(e,t){return Rt(e,"get",""),e[t]}};function sv(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,r0),slots:e.slots,emit:e.emit,expose:t}}function _a(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(bh(Nu(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in as)return as[n](e)},has(t,n){return n in t||n in as}})):e.proxy}function o0(e,t=!0){return he(e)?e.displayName||e.name:e.name||t&&e.__name}function s0(e){return he(e)&&"__vccOpts"in e}const T=(e,t)=>Xy(e,t,wa);function Un(e,t,n){const r=arguments.length;return r===2?xe(t)&&!ce(t)?Yn(t)?ie(e,null,[t]):ie(e,t):ie(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&Yn(n)&&(n=[n]),ie(e,t,n))}const i0="3.5.6",a0=pt;/** +* @vue/runtime-dom v3.5.6 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Dl;const uf=typeof window<"u"&&window.trustedTypes;if(uf)try{Dl=uf.createPolicy("vue",{createHTML:e=>e})}catch{}const iv=Dl?e=>Dl.createHTML(e):e=>e,l0="http://www.w3.org/2000/svg",u0="http://www.w3.org/1998/Math/MathML",jn=typeof document<"u"?document:null,cf=jn&&jn.createElement("template"),c0={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t==="svg"?jn.createElementNS(l0,e):t==="mathml"?jn.createElementNS(u0,e):n?jn.createElement(e,{is:n}):jn.createElement(e);return e==="select"&&r&&r.multiple!=null&&o.setAttribute("multiple",r.multiple),o},createText:e=>jn.createTextNode(e),createComment:e=>jn.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>jn.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{cf.innerHTML=iv(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const a=cf.content;if(r==="svg"||r==="mathml"){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ir="transition",Yo="animation",Ro=Symbol("_vtc"),av={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},lv=ft({},Ph,av),f0=e=>(e.displayName="Transition",e.props=lv,e),io=f0((e,{slots:t})=>Un(lb,uv(e),t)),Lr=(e,t=[])=>{ce(e)?e.forEach(n=>n(...t)):e&&e(...t)},ff=e=>e?ce(e)?e.some(t=>t.length>1):e.length>1:!1;function uv(e){const t={};for(const N in e)N in av||(t[N]=e[N]);if(e.css===!1)return t;const{name:n="v",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:u=i,appearToClass:c=a,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:d=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,p=d0(o),h=p&&p[0],y=p&&p[1],{onBeforeEnter:g,onEnter:_,onEnterCancelled:E,onLeave:S,onLeaveCancelled:b,onBeforeAppear:O=g,onAppear:A=_,onAppearCancelled:P=E}=t,x=(N,D,Z)=>{cr(N,D?c:a),cr(N,D?u:i),Z&&Z()},M=(N,D)=>{N._isLeaving=!1,cr(N,f),cr(N,v),cr(N,d),D&&D()},U=N=>(D,Z)=>{const I=N?A:_,R=()=>x(D,N,Z);Lr(I,[D,R]),df(()=>{cr(D,N?l:s),Vn(D,N?c:a),ff(I)||pf(D,r,h,R)})};return ft(t,{onBeforeEnter(N){Lr(g,[N]),Vn(N,s),Vn(N,i)},onBeforeAppear(N){Lr(O,[N]),Vn(N,l),Vn(N,u)},onEnter:U(!1),onAppear:U(!0),onLeave(N,D){N._isLeaving=!0;const Z=()=>M(N,D);Vn(N,f),Vn(N,d),fv(),df(()=>{N._isLeaving&&(cr(N,f),Vn(N,v),ff(S)||pf(N,r,y,Z))}),Lr(S,[N,Z])},onEnterCancelled(N){x(N,!1),Lr(E,[N])},onAppearCancelled(N){x(N,!0),Lr(P,[N])},onLeaveCancelled(N){M(N),Lr(b,[N])}})}function d0(e){if(e==null)return null;if(xe(e))return[tl(e.enter),tl(e.leave)];{const t=tl(e);return[t,t]}}function tl(e){return my(e)}function Vn(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Ro]||(e[Ro]=new Set)).add(t)}function cr(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Ro];n&&(n.delete(t),n.size||(e[Ro]=void 0))}function df(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let p0=0;function pf(e,t,n,r){const o=e._endId=++p0,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:a,propCount:l}=cv(e,t);if(!i)return r();const u=i+"end";let c=0;const f=()=>{e.removeEventListener(u,d),s()},d=v=>{v.target===e&&++c>=l&&f()};setTimeout(()=>{c(n[p]||"").split(", "),o=r(`${ir}Delay`),s=r(`${ir}Duration`),i=hf(o,s),a=r(`${Yo}Delay`),l=r(`${Yo}Duration`),u=hf(a,l);let c=null,f=0,d=0;t===ir?i>0&&(c=ir,f=i,d=s.length):t===Yo?u>0&&(c=Yo,f=u,d=l.length):(f=Math.max(i,u),c=f>0?i>u?ir:Yo:null,d=c?c===ir?s.length:l.length:0);const v=c===ir&&/\b(transform|all)(,|$)/.test(r(`${ir}Property`).toString());return{type:c,timeout:f,propCount:d,hasTransform:v}}function hf(e,t){for(;e.lengthvf(n)+vf(e[r])))}function vf(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function fv(){return document.body.offsetHeight}function h0(e,t,n){const r=e[Ro];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const qi=Symbol("_vod"),dv=Symbol("_vsh"),Mn={beforeMount(e,{value:t},{transition:n}){e[qi]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Jo(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Jo(e,!0),r.enter(e)):r.leave(e,()=>{Jo(e,!1)}):Jo(e,t))},beforeUnmount(e,{value:t}){Jo(e,t)}};function Jo(e,t){e.style.display=t?e[qi]:"none",e[dv]=!t}const pv=Symbol("");function a8(e){const t=st();if(!t)return;const n=t.ut=(o=e(t.proxy))=>{Array.from(document.querySelectorAll(`[data-v-owner="${t.uid}"]`)).forEach(s=>Wi(s,o))},r=()=>{const o=e(t.proxy);t.ce?Wi(t.ce,o):Vl(t.subTree,o),n(o)};ga(()=>{Vb(r)}),Ue(()=>{const o=new MutationObserver(r);o.observe(t.subTree.el.parentNode,{childList:!0}),oo(()=>o.disconnect())})}function Vl(e,t){if(e.shapeFlag&128){const n=e.suspense;e=n.activeBranch,n.pendingBranch&&!n.isHydrating&&n.effects.push(()=>{Vl(n.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)Wi(e.el,t);else if(e.type===et)e.children.forEach(n=>Vl(n,t));else if(e.type===Ri){let{el:n,anchor:r}=e;for(;n&&(Wi(n,t),n!==r);)n=n.nextSibling}}function Wi(e,t){if(e.nodeType===1){const n=e.style;let r="";for(const o in t)n.setProperty(`--${o}`,t[o]),r+=`--${o}: ${t[o]};`;n[pv]=r}}const v0=/(^|;)\s*display\s*:/;function m0(e,t,n){const r=e.style,o=Oe(n);let s=!1;if(n&&!o){if(t)if(Oe(t))for(const i of t.split(";")){const a=i.slice(0,i.indexOf(":")).trim();n[a]==null&&Ii(r,a,"")}else for(const i in t)n[i]==null&&Ii(r,i,"");for(const i in n)i==="display"&&(s=!0),Ii(r,i,n[i])}else if(o){if(t!==n){const i=r[pv];i&&(n+=";"+i),r.cssText=n,s=v0.test(n)}}else t&&e.removeAttribute("style");qi in e&&(e[qi]=s?r.display:"",e[dv]&&(r.display="none"))}const mf=/\s*!important$/;function Ii(e,t,n){if(ce(n))n.forEach(r=>Ii(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=g0(e,t);mf.test(n)?e.setProperty(Zn(r),n.replace(mf,""),"important"):e[r]=n}}const gf=["Webkit","Moz","ms"],nl={};function g0(e,t){const n=nl[t];if(n)return n;let r=tn(t);if(r!=="filter"&&r in e)return nl[t]=r;r=js(r);for(let o=0;orl||(S0.then(()=>rl=0),rl=Date.now());function C0(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;vn(T0(r,n.value),t,5,[r])};return n.value=e,n.attached=E0(),n}function T0(e,t){if(ce(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const Sf=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,O0=(e,t,n,r,o,s)=>{const i=o==="svg";t==="class"?h0(e,r,i):t==="style"?m0(e,n,r):la(t)?_u(t)||w0(e,t,n,r,s):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):x0(e,t,r,i))?(y0(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&bf(e,t,r,i,s,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),bf(e,t,r,i))};function x0(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Sf(t)&&he(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const o=e.tagName;if(o==="IMG"||o==="VIDEO"||o==="CANVAS"||o==="SOURCE")return!1}return Sf(t)&&Oe(n)?!1:!!(t in e||e._isVueCE&&(/[A-Z]/.test(t)||!Oe(n)))}const hv=new WeakMap,vv=new WeakMap,Gi=Symbol("_moveCb"),Ef=Symbol("_enterCb"),A0=e=>(delete e.props.mode,e),R0=A0({name:"TransitionGroup",props:ft({},lv,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=st(),r=Rh();let o,s;return ro(()=>{if(!o.length)return;const i=e.moveClass||`${e.name||"v"}-move`;if(!L0(o[0].el,n.vnode.el,i))return;o.forEach(I0),o.forEach($0);const a=o.filter(k0);fv(),a.forEach(l=>{const u=l.el,c=u.style;Vn(u,i),c.transform=c.webkitTransform=c.transitionDuration="";const f=u[Gi]=d=>{d&&d.target!==u||(!d||/transform$/.test(d.propertyName))&&(u.removeEventListener("transitionend",f),u[Gi]=null,cr(u,i))};u.addEventListener("transitionend",f)})}),()=>{const i=Ie(e),a=uv(i);let l=i.tag||et;if(o=[],s)for(let u=0;u{a.split(/\s+/).forEach(l=>l&&r.classList.remove(l))}),n.split(/\s+/).forEach(a=>a&&r.classList.add(a)),r.style.display="none";const s=t.nodeType===1?t:t.parentNode;s.appendChild(r);const{hasTransform:i}=cv(r);return s.removeChild(r),i}const Yi=e=>{const t=e.props["onUpdate:modelValue"]||!1;return ce(t)?n=>xi(t,n):t};function N0(e){e.target.composing=!0}function Cf(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Ao=Symbol("_assign"),M0={created(e,{modifiers:{lazy:t,trim:n,number:r}},o){e[Ao]=Yi(o);const s=r||o.props&&o.props.type==="number";Dr(e,t?"change":"input",i=>{if(i.target.composing)return;let a=e.value;n&&(a=a.trim()),s&&(a=Al(a)),e[Ao](a)}),n&&Dr(e,"change",()=>{e.value=e.value.trim()}),t||(Dr(e,"compositionstart",N0),Dr(e,"compositionend",Cf),Dr(e,"change",Cf))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:o,number:s}},i){if(e[Ao]=Yi(i),e.composing)return;const a=(s||e.type==="number")&&!/^0\d/.test(e.value)?Al(e.value):e.value,l=t??"";a!==l&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||o&&e.value.trim()===l)||(e.value=l))}},Ji={deep:!0,created(e,t,n){e[Ao]=Yi(n),Dr(e,"change",()=>{const r=e._modelValue,o=F0(e),s=e.checked,i=e[Ao];if(ce(r)){const a=Qp(r,o),l=a!==-1;if(s&&!l)i(r.concat(o));else if(!s&&l){const u=[...r];u.splice(a,1),i(u)}}else if(ua(r)){const a=new Set(r);s?a.add(o):a.delete(o),i(a)}else i(mv(e,s))})},mounted:Tf,beforeUpdate(e,t,n){e[Ao]=Yi(n),Tf(e,t,n)}};function Tf(e,{value:t,oldValue:n},r){e._modelValue=t;let o;ce(t)?o=Qp(t,r.props.value)>-1:ua(t)?o=t.has(r.props.value):o=fa(t,mv(e,!0)),e.checked!==o&&(e.checked=o)}function F0(e){return"_value"in e?e._value:e.value}function mv(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const B0=["ctrl","shift","alt","meta"],D0={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>B0.some(n=>e[`${n}Key`]&&!t.includes(n))},ut=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(o,...s)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=o=>{if(!("key"in o))return;const s=Zn(o.key);if(t.some(i=>i===s||V0[i]===s))return e(o)})},j0=ft({patchProp:O0},c0);let Of;function gv(){return Of||(Of=Lb(j0))}const xf=(...e)=>{gv().render(...e)},z0=(...e)=>{const t=gv().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=K0(r);if(!o)return;const s=t._component;!he(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.nodeType===1&&(o.textContent="");const i=n(o,!1,H0(o));return o instanceof Element&&(o.removeAttribute("v-cloak"),o.setAttribute("data-v-app","")),i},t};function H0(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function K0(e){return Oe(e)?document.querySelector(e):e}/*! + * vue-router v4.4.5 + * (c) 2024 Eduardo San Martin Morote + * @license MIT + */const wo=typeof document<"u";function yv(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function U0(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&yv(e.default)}const Ke=Object.assign;function ol(e,t){const n={};for(const r in t){const o=t[r];n[r]=mn(o)?o.map(e):e(o)}return n}const us=()=>{},mn=Array.isArray,bv=/#/g,q0=/&/g,W0=/\//g,G0=/=/g,Y0=/\?/g,wv=/\+/g,J0=/%5B/g,X0=/%5D/g,_v=/%5E/g,Z0=/%60/g,Sv=/%7B/g,Q0=/%7C/g,Ev=/%7D/g,ew=/%20/g;function Gu(e){return encodeURI(""+e).replace(Q0,"|").replace(J0,"[").replace(X0,"]")}function tw(e){return Gu(e).replace(Sv,"{").replace(Ev,"}").replace(_v,"^")}function jl(e){return Gu(e).replace(wv,"%2B").replace(ew,"+").replace(bv,"%23").replace(q0,"%26").replace(Z0,"`").replace(Sv,"{").replace(Ev,"}").replace(_v,"^")}function nw(e){return jl(e).replace(G0,"%3D")}function rw(e){return Gu(e).replace(bv,"%23").replace(Y0,"%3F")}function ow(e){return e==null?"":rw(e).replace(W0,"%2F")}function Os(e){try{return decodeURIComponent(""+e)}catch{}return""+e}const sw=/\/$/,iw=e=>e.replace(sw,"");function sl(e,t,n="/"){let r,o={},s="",i="";const a=t.indexOf("#");let l=t.indexOf("?");return a=0&&(l=-1),l>-1&&(r=t.slice(0,l),s=t.slice(l+1,a>-1?a:t.length),o=e(s)),a>-1&&(r=r||t.slice(0,a),i=t.slice(a,t.length)),r=cw(r??t,n),{fullPath:r+(s&&"?")+s+i,path:r,query:o,hash:Os(i)}}function aw(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function Af(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function lw(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&Po(t.matched[r],n.matched[o])&&Cv(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Po(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Cv(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!uw(e[n],t[n]))return!1;return!0}function uw(e,t){return mn(e)?Rf(e,t):mn(t)?Rf(t,e):e===t}function Rf(e,t){return mn(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function cw(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),r=e.split("/"),o=r[r.length-1];(o===".."||o===".")&&r.push("");let s=n.length-1,i,a;for(i=0;i1&&s--;else break;return n.slice(0,s).join("/")+"/"+r.slice(i).join("/")}const ar={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};var xs;(function(e){e.pop="pop",e.push="push"})(xs||(xs={}));var cs;(function(e){e.back="back",e.forward="forward",e.unknown=""})(cs||(cs={}));function fw(e){if(!e)if(wo){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),iw(e)}const dw=/^[^#]+#/;function pw(e,t){return e.replace(dw,"#")+t}function hw(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const Sa=()=>({left:window.scrollX,top:window.scrollY});function vw(e){let t;if("el"in e){const n=e.el,r=typeof n=="string"&&n.startsWith("#"),o=typeof n=="string"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=hw(o,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function Pf(e,t){return(history.state?history.state.position-t:-1)+e}const zl=new Map;function mw(e,t){zl.set(e,t)}function gw(e){const t=zl.get(e);return zl.delete(e),t}let yw=()=>location.protocol+"//"+location.host;function Tv(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf("#");if(s>-1){let a=o.includes(e.slice(s))?e.slice(s).length:1,l=o.slice(a);return l[0]!=="/"&&(l="/"+l),Af(l,"")}return Af(n,e)+r+o}function bw(e,t,n,r){let o=[],s=[],i=null;const a=({state:d})=>{const v=Tv(e,location),p=n.value,h=t.value;let y=0;if(d){if(n.value=v,t.value=d,i&&i===p){i=null;return}y=h?d.position-h.position:0}else r(v);o.forEach(g=>{g(n.value,p,{delta:y,type:xs.pop,direction:y?y>0?cs.forward:cs.back:cs.unknown})})};function l(){i=n.value}function u(d){o.push(d);const v=()=>{const p=o.indexOf(d);p>-1&&o.splice(p,1)};return s.push(v),v}function c(){const{history:d}=window;d.state&&d.replaceState(Ke({},d.state,{scroll:Sa()}),"")}function f(){for(const d of s)d();s=[],window.removeEventListener("popstate",a),window.removeEventListener("beforeunload",c)}return window.addEventListener("popstate",a),window.addEventListener("beforeunload",c,{passive:!0}),{pauseListeners:l,listen:u,destroy:f}}function If(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?Sa():null}}function ww(e){const{history:t,location:n}=window,r={value:Tv(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(l,u,c){const f=e.indexOf("#"),d=f>-1?(n.host&&document.querySelector("base")?e:e.slice(f))+l:yw()+e+l;try{t[c?"replaceState":"pushState"](u,"",d),o.value=u}catch(v){console.error(v),n[c?"replace":"assign"](d)}}function i(l,u){const c=Ke({},t.state,If(o.value.back,l,o.value.forward,!0),u,{position:o.value.position});s(l,c,!0),r.value=l}function a(l,u){const c=Ke({},o.value,t.state,{forward:l,scroll:Sa()});s(c.current,c,!0);const f=Ke({},If(r.value,l,null),{position:c.position+1},u);s(l,f,!1),r.value=l}return{location:r,state:o,push:a,replace:i}}function _w(e){e=fw(e);const t=ww(e),n=bw(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=Ke({location:"",base:e,go:r,createHref:pw.bind(null,e)},t,n);return Object.defineProperty(o,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,"state",{enumerable:!0,get:()=>t.state.value}),o}function l8(e){return e=location.host?e||location.pathname+location.search:"",e.includes("#")||(e+="#"),_w(e)}function Sw(e){return typeof e=="string"||e&&typeof e=="object"}function Ov(e){return typeof e=="string"||typeof e=="symbol"}const xv=Symbol("");var $f;(function(e){e[e.aborted=4]="aborted",e[e.cancelled=8]="cancelled",e[e.duplicated=16]="duplicated"})($f||($f={}));function Io(e,t){return Ke(new Error,{type:e,[xv]:!0},t)}function Bn(e,t){return e instanceof Error&&xv in e&&(t==null||!!(e.type&t))}const kf="[^/]+?",Ew={sensitive:!1,strict:!1,start:!0,end:!0},Cw=/[.+*?^${}()[\]/\\]/g;function Tw(e,t){const n=Ke({},Ew,t),r=[];let o=n.start?"^":"";const s=[];for(const u of e){const c=u.length?[]:[90];n.strict&&!u.length&&(o+="/");for(let f=0;ft.length?t.length===1&&t[0]===80?1:-1:0}function Av(e,t){let n=0;const r=e.score,o=t.score;for(;n0&&t[t.length-1]<0}const xw={type:0,value:""},Aw=/[a-zA-Z0-9_]/;function Rw(e){if(!e)return[[]];if(e==="/")return[[xw]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(v){throw new Error(`ERR (${n})/"${u}": ${v}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let a=0,l,u="",c="";function f(){u&&(n===0?s.push({type:0,value:u}):n===1||n===2||n===3?(s.length>1&&(l==="*"||l==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:l==="*"||l==="+",optional:l==="*"||l==="?"})):t("Invalid state to consume buffer"),u="")}function d(){u+=l}for(;a{i(E)}:us}function i(f){if(Ov(f)){const d=r.get(f);d&&(r.delete(f),n.splice(n.indexOf(d),1),d.children.forEach(i),d.alias.forEach(i))}else{const d=n.indexOf(f);d>-1&&(n.splice(d,1),f.record.name&&r.delete(f.record.name),f.children.forEach(i),f.alias.forEach(i))}}function a(){return n}function l(f){const d=Lw(f,n);n.splice(d,0,f),f.record.name&&!Ff(f)&&r.set(f.record.name,f)}function u(f,d){let v,p={},h,y;if("name"in f&&f.name){if(v=r.get(f.name),!v)throw Io(1,{location:f});y=v.record.name,p=Ke(Nf(d.params,v.keys.filter(E=>!E.optional).concat(v.parent?v.parent.keys.filter(E=>E.optional):[]).map(E=>E.name)),f.params&&Nf(f.params,v.keys.map(E=>E.name))),h=v.stringify(p)}else if(f.path!=null)h=f.path,v=n.find(E=>E.re.test(h)),v&&(p=v.parse(h),y=v.record.name);else{if(v=d.name?r.get(d.name):n.find(E=>E.re.test(d.path)),!v)throw Io(1,{location:f,currentLocation:d});y=v.record.name,p=Ke({},d.params,f.params),h=v.stringify(p)}const g=[];let _=v;for(;_;)g.unshift(_.record),_=_.parent;return{name:y,path:h,params:p,matched:g,meta:kw(g)}}e.forEach(f=>s(f));function c(){n.length=0,r.clear()}return{addRoute:s,resolve:u,removeRoute:i,clearRoutes:c,getRoutes:a,getRecordMatcher:o}}function Nf(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function Mf(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:$w(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function $w(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const r in e.components)t[r]=typeof n=="object"?n[r]:n;return t}function Ff(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function kw(e){return e.reduce((t,n)=>Ke(t,n.meta),{})}function Bf(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function Lw(e,t){let n=0,r=t.length;for(;n!==r;){const s=n+r>>1;Av(e,t[s])<0?r=s:n=s+1}const o=Nw(e);return o&&(r=t.lastIndexOf(o,r-1)),r}function Nw(e){let t=e;for(;t=t.parent;)if(Rv(t)&&Av(e,t)===0)return t}function Rv({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function Mw(e){const t={};if(e===""||e==="?")return t;const r=(e[0]==="?"?e.slice(1):e).split("&");for(let o=0;os&&jl(s)):[r&&jl(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?"&":"")+n,s!=null&&(t+="="+s))})}return t}function Fw(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=mn(r)?r.map(o=>o==null?null:""+o):r==null?r:""+r)}return t}const Bw=Symbol(""),Vf=Symbol(""),Ea=Symbol(""),Pv=Symbol(""),Hl=Symbol("");function Xo(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function gr(e,t,n,r,o,s=i=>i()){const i=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((a,l)=>{const u=d=>{d===!1?l(Io(4,{from:n,to:t})):d instanceof Error?l(d):Sw(d)?l(Io(2,{from:t,to:d})):(i&&r.enterCallbacks[o]===i&&typeof d=="function"&&i.push(d),a())},c=s(()=>e.call(r&&r.instances[o],t,n,u));let f=Promise.resolve(c);e.length<3&&(f=f.then(u)),f.catch(d=>l(d))})}function il(e,t,n,r,o=s=>s()){const s=[];for(const i of e)for(const a in i.components){let l=i.components[a];if(!(t!=="beforeRouteEnter"&&!i.instances[a]))if(yv(l)){const c=(l.__vccOpts||l)[t];c&&s.push(gr(c,n,r,i,a,o))}else{let u=l();s.push(()=>u.then(c=>{if(!c)throw new Error(`Couldn't resolve component "${a}" at "${i.path}"`);const f=U0(c)?c.default:c;i.mods[a]=c,i.components[a]=f;const v=(f.__vccOpts||f)[t];return v&&gr(v,n,r,i,a,o)()}))}}return s}function jf(e){const t=_e(Ea),n=_e(Pv),r=T(()=>{const l=m(e.to);return t.resolve(l)}),o=T(()=>{const{matched:l}=r.value,{length:u}=l,c=l[u-1],f=n.matched;if(!c||!f.length)return-1;const d=f.findIndex(Po.bind(null,c));if(d>-1)return d;const v=zf(l[u-2]);return u>1&&zf(c)===v&&f[f.length-1].path!==v?f.findIndex(Po.bind(null,l[u-2])):d}),s=T(()=>o.value>-1&&zw(n.params,r.value.params)),i=T(()=>o.value>-1&&o.value===n.matched.length-1&&Cv(n.params,r.value.params));function a(l={}){return jw(l)?t[m(e.replace)?"replace":"push"](m(e.to)).catch(us):Promise.resolve()}return{route:r,href:T(()=>r.value.href),isActive:s,isExactActive:i,navigate:a}}const Dw=J({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"}},useLink:jf,setup(e,{slots:t}){const n=Et(jf(e)),{options:r}=_e(Ea),o=T(()=>({[Hf(e.activeClass,r.linkActiveClass,"router-link-active")]:n.isActive,[Hf(e.exactActiveClass,r.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:Un("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),Vw=Dw;function jw(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function zw(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r=="string"){if(r!==o)return!1}else if(!mn(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function zf(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const Hf=(e,t,n)=>e??t??n,Hw=J({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=_e(Hl),o=T(()=>e.route||r.value),s=_e(Vf,0),i=T(()=>{let u=m(s);const{matched:c}=o.value;let f;for(;(f=c[u])&&!f.components;)u++;return u}),a=T(()=>o.value.matched[i.value]);ct(Vf,T(()=>i.value+1)),ct(Bw,a),ct(Hl,o);const l=z();return me(()=>[l.value,a.value,e.name],([u,c,f],[d,v,p])=>{c&&(c.instances[f]=u,v&&v!==c&&u&&u===d&&(c.leaveGuards.size||(c.leaveGuards=v.leaveGuards),c.updateGuards.size||(c.updateGuards=v.updateGuards))),u&&c&&(!v||!Po(c,v)||!d)&&(c.enterCallbacks[f]||[]).forEach(h=>h(u))},{flush:"post"}),()=>{const u=o.value,c=e.name,f=a.value,d=f&&f.components[c];if(!d)return Kf(n.default,{Component:d,route:u});const v=f.props[c],p=v?v===!0?u.params:typeof v=="function"?v(u):v:null,y=Un(d,Ke({},p,t,{onVnodeUnmounted:g=>{g.component.isUnmounted&&(f.instances[c]=null)},ref:l}));return Kf(n.default,{Component:y,route:u})||y}}});function Kf(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const Kw=Hw;function u8(e){const t=Iw(e.routes,e),n=e.parseQuery||Mw,r=e.stringifyQuery||Df,o=e.history,s=Xo(),i=Xo(),a=Xo(),l=_r(ar);let u=ar;wo&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const c=ol.bind(null,F=>""+F),f=ol.bind(null,ow),d=ol.bind(null,Os);function v(F,j){let W,te;return Ov(F)?(W=t.getRecordMatcher(F),te=j):te=F,t.addRoute(te,W)}function p(F){const j=t.getRecordMatcher(F);j&&t.removeRoute(j)}function h(){return t.getRoutes().map(F=>F.record)}function y(F){return!!t.getRecordMatcher(F)}function g(F,j){if(j=Ke({},j||l.value),typeof F=="string"){const C=sl(n,F,j.path),k=t.resolve({path:C.path},j),G=o.createHref(C.fullPath);return Ke(C,k,{params:d(k.params),hash:Os(C.hash),redirectedFrom:void 0,href:G})}let W;if(F.path!=null)W=Ke({},F,{path:sl(n,F.path,j.path).path});else{const C=Ke({},F.params);for(const k in C)C[k]==null&&delete C[k];W=Ke({},F,{params:f(C)}),j.params=f(j.params)}const te=t.resolve(W,j),be=F.hash||"";te.params=c(d(te.params));const Te=aw(r,Ke({},F,{hash:tw(be),path:te.path})),w=o.createHref(Te);return Ke({fullPath:Te,hash:be,query:r===Df?Fw(F.query):F.query||{}},te,{redirectedFrom:void 0,href:w})}function _(F){return typeof F=="string"?sl(n,F,l.value.path):Ke({},F)}function E(F,j){if(u!==F)return Io(8,{from:j,to:F})}function S(F){return A(F)}function b(F){return S(Ke(_(F),{replace:!0}))}function O(F){const j=F.matched[F.matched.length-1];if(j&&j.redirect){const{redirect:W}=j;let te=typeof W=="function"?W(F):W;return typeof te=="string"&&(te=te.includes("?")||te.includes("#")?te=_(te):{path:te},te.params={}),Ke({query:F.query,hash:F.hash,params:te.path!=null?{}:F.params},te)}}function A(F,j){const W=u=g(F),te=l.value,be=F.state,Te=F.force,w=F.replace===!0,C=O(W);if(C)return A(Ke(_(C),{state:typeof C=="object"?Ke({},be,C.state):be,force:Te,replace:w}),j||W);const k=W;k.redirectedFrom=j;let G;return!Te&&lw(r,te,W)&&(G=Io(16,{to:k,from:te}),Me(te,te,!0,!1)),(G?Promise.resolve(G):M(k,te)).catch(K=>Bn(K)?Bn(K,2)?K:Ne(K):re(K,k,te)).then(K=>{if(K){if(Bn(K,2))return A(Ke({replace:w},_(K.to),{state:typeof K.to=="object"?Ke({},be,K.to.state):be,force:Te}),j||k)}else K=N(k,te,!0,w,be);return U(k,te,K),K})}function P(F,j){const W=E(F,j);return W?Promise.reject(W):Promise.resolve()}function x(F){const j=We.values().next().value;return j&&typeof j.runWithContext=="function"?j.runWithContext(F):F()}function M(F,j){let W;const[te,be,Te]=Uw(F,j);W=il(te.reverse(),"beforeRouteLeave",F,j);for(const C of te)C.leaveGuards.forEach(k=>{W.push(gr(k,F,j))});const w=P.bind(null,F,j);return W.push(w),Ee(W).then(()=>{W=[];for(const C of s.list())W.push(gr(C,F,j));return W.push(w),Ee(W)}).then(()=>{W=il(be,"beforeRouteUpdate",F,j);for(const C of be)C.updateGuards.forEach(k=>{W.push(gr(k,F,j))});return W.push(w),Ee(W)}).then(()=>{W=[];for(const C of Te)if(C.beforeEnter)if(mn(C.beforeEnter))for(const k of C.beforeEnter)W.push(gr(k,F,j));else W.push(gr(C.beforeEnter,F,j));return W.push(w),Ee(W)}).then(()=>(F.matched.forEach(C=>C.enterCallbacks={}),W=il(Te,"beforeRouteEnter",F,j,x),W.push(w),Ee(W))).then(()=>{W=[];for(const C of i.list())W.push(gr(C,F,j));return W.push(w),Ee(W)}).catch(C=>Bn(C,8)?C:Promise.reject(C))}function U(F,j,W){a.list().forEach(te=>x(()=>te(F,j,W)))}function N(F,j,W,te,be){const Te=E(F,j);if(Te)return Te;const w=j===ar,C=wo?history.state:{};W&&(te||w?o.replace(F.fullPath,Ke({scroll:w&&C&&C.scroll},be)):o.push(F.fullPath,be)),l.value=F,Me(F,j,W,w),Ne()}let D;function Z(){D||(D=o.listen((F,j,W)=>{if(!qe.listening)return;const te=g(F),be=O(te);if(be){A(Ke(be,{replace:!0}),te).catch(us);return}u=te;const Te=l.value;wo&&mw(Pf(Te.fullPath,W.delta),Sa()),M(te,Te).catch(w=>Bn(w,12)?w:Bn(w,2)?(A(w.to,te).then(C=>{Bn(C,20)&&!W.delta&&W.type===xs.pop&&o.go(-1,!1)}).catch(us),Promise.reject()):(W.delta&&o.go(-W.delta,!1),re(w,te,Te))).then(w=>{w=w||N(te,Te,!1),w&&(W.delta&&!Bn(w,8)?o.go(-W.delta,!1):W.type===xs.pop&&Bn(w,20)&&o.go(-1,!1)),U(te,Te,w)}).catch(us)}))}let I=Xo(),R=Xo(),H;function re(F,j,W){Ne(F);const te=R.list();return te.length?te.forEach(be=>be(F,j,W)):console.error(F),Promise.reject(F)}function ye(){return H&&l.value!==ar?Promise.resolve():new Promise((F,j)=>{I.add([F,j])})}function Ne(F){return H||(H=!F,Z(),I.list().forEach(([j,W])=>F?W(F):j()),I.reset()),F}function Me(F,j,W,te){const{scrollBehavior:be}=e;if(!wo||!be)return Promise.resolve();const Te=!W&&gw(Pf(F.fullPath,0))||(te||!W)&&history.state&&history.state.scroll||null;return ze().then(()=>be(F,j,Te)).then(w=>w&&vw(w)).catch(w=>re(w,F,j))}const Pe=F=>o.go(F);let Ce;const We=new Set,qe={currentRoute:l,listening:!0,addRoute:v,removeRoute:p,clearRoutes:t.clearRoutes,hasRoute:y,getRoutes:h,resolve:g,options:e,push:S,replace:b,go:Pe,back:()=>Pe(-1),forward:()=>Pe(1),beforeEach:s.add,beforeResolve:i.add,afterEach:a.add,onError:R.add,isReady:ye,install(F){const j=this;F.component("RouterLink",Vw),F.component("RouterView",Kw),F.config.globalProperties.$router=j,Object.defineProperty(F.config.globalProperties,"$route",{enumerable:!0,get:()=>m(l)}),wo&&!Ce&&l.value===ar&&(Ce=!0,S(o.location).catch(be=>{}));const W={};for(const be in ar)Object.defineProperty(W,be,{get:()=>l.value[be],enumerable:!0});F.provide(Ea,j),F.provide(Pv,$u(W)),F.provide(Hl,l);const te=F.unmount;We.add(F),F.unmount=function(){We.delete(F),We.size<1&&(u=ar,D&&D(),D=null,l.value=ar,Ce=!1,H=!1),te()}}};function Ee(F){return F.reduce((j,W)=>j.then(()=>x(W)),Promise.resolve())}return qe}function Uw(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;iPo(u,a))?r.push(a):n.push(a));const l=e.matched[i];l&&(t.matched.find(u=>Po(u,l))||o.push(l))}return[n,r,o]}function c8(){return _e(Ea)}const zn=(e,t,{checkForDefaultPrevented:n=!0}={})=>o=>{const s=e==null?void 0:e(o);if(n===!1||!s)return t==null?void 0:t(o)};var qw=!1,Ww=Object.defineProperty,Gw=Object.defineProperties,Yw=Object.getOwnPropertyDescriptors,Uf=Object.getOwnPropertySymbols,Jw=Object.prototype.hasOwnProperty,Xw=Object.prototype.propertyIsEnumerable,qf=(e,t,n)=>t in e?Ww(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Zw=(e,t)=>{for(var n in t||(t={}))Jw.call(t,n)&&qf(e,n,t[n]);if(Uf)for(var n of Uf(t))Xw.call(t,n)&&qf(e,n,t[n]);return e},Qw=(e,t)=>Gw(e,Yw(t));function Wf(e,t){var n;const r=_r();return qu(()=>{r.value=e()},Qw(Zw({},t),{flush:(n=void 0)!=null?n:"sync"})),zs(r)}var Gf;const ot=typeof window<"u",e1=e=>typeof e=="string",Xi=()=>{},Kl=ot&&((Gf=window==null?void 0:window.navigator)==null?void 0:Gf.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function As(e){return typeof e=="function"?e():m(e)}function t1(e,t){function n(...r){return new Promise((o,s)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(o).catch(s)})}return n}function n1(e,t={}){let n,r,o=Xi;const s=a=>{clearTimeout(a),o(),o=Xi};return a=>{const l=As(e),u=As(t.maxWait);return n&&s(n),l<=0||u!==void 0&&u<=0?(r&&(s(r),r=null),Promise.resolve(a())):new Promise((c,f)=>{o=t.rejectOnCancel?f:c,u&&!r&&(r=setTimeout(()=>{n&&s(n),r=null,c(a())},u)),n=setTimeout(()=>{r&&s(r),r=null,c(a())},l)})}}function r1(e){return e}function Us(e){return Cu()?(Tu(e),!0):!1}function o1(e,t=200,n={}){return t1(n1(t,n),e)}function s1(e,t=200,n={}){const r=z(e.value),o=o1(()=>{r.value=e.value},t,n);return me(e,()=>o()),r}function i1(e,t=!0){st()?Ue(e):t?e():ze(e)}function Ul(e,t,n={}){const{immediate:r=!0}=n,o=z(!1);let s=null;function i(){s&&(clearTimeout(s),s=null)}function a(){o.value=!1,i()}function l(...u){i(),o.value=!0,s=setTimeout(()=>{o.value=!1,s=null,e(...u)},As(t))}return r&&(o.value=!0,ot&&l()),Us(a),{isPending:zs(o),start:l,stop:a}}function qn(e){var t;const n=As(e);return(t=n==null?void 0:n.$el)!=null?t:n}const qs=ot?window:void 0,a1=ot?window.document:void 0;function Gt(...e){let t,n,r,o;if(e1(e[0])||Array.isArray(e[0])?([n,r,o]=e,t=qs):[t,n,r,o]=e,!t)return Xi;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const s=[],i=()=>{s.forEach(c=>c()),s.length=0},a=(c,f,d,v)=>(c.addEventListener(f,d,v),()=>c.removeEventListener(f,d,v)),l=me(()=>[qn(t),As(o)],([c,f])=>{i(),c&&s.push(...n.flatMap(d=>r.map(v=>a(c,d,v,f))))},{immediate:!0,flush:"post"}),u=()=>{l(),i()};return Us(u),u}let Yf=!1;function l1(e,t,n={}){const{window:r=qs,ignore:o=[],capture:s=!0,detectIframe:i=!1}=n;if(!r)return;Kl&&!Yf&&(Yf=!0,Array.from(r.document.body.children).forEach(d=>d.addEventListener("click",Xi)));let a=!0;const l=d=>o.some(v=>{if(typeof v=="string")return Array.from(r.document.querySelectorAll(v)).some(p=>p===d.target||d.composedPath().includes(p));{const p=qn(v);return p&&(d.target===p||d.composedPath().includes(p))}}),c=[Gt(r,"click",d=>{const v=qn(e);if(!(!v||v===d.target||d.composedPath().includes(v))){if(d.detail===0&&(a=!l(d)),!a){a=!0;return}t(d)}},{passive:!0,capture:s}),Gt(r,"pointerdown",d=>{const v=qn(e);v&&(a=!d.composedPath().includes(v)&&!l(d))},{passive:!0}),i&&Gt(r,"blur",d=>{var v;const p=qn(e);((v=r.document.activeElement)==null?void 0:v.tagName)==="IFRAME"&&!(p!=null&&p.contains(r.document.activeElement))&&t(d)})].filter(Boolean);return()=>c.forEach(d=>d())}function Iv(e,t=!1){const n=z(),r=()=>n.value=!!e();return r(),i1(r,t),n}const Jf=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},Xf="__vueuse_ssr_handlers__";Jf[Xf]=Jf[Xf]||{};function u1({document:e=a1}={}){if(!e)return z("visible");const t=z(e.visibilityState);return Gt(e,"visibilitychange",()=>{t.value=e.visibilityState}),t}var Zf=Object.getOwnPropertySymbols,c1=Object.prototype.hasOwnProperty,f1=Object.prototype.propertyIsEnumerable,d1=(e,t)=>{var n={};for(var r in e)c1.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Zf)for(var r of Zf(e))t.indexOf(r)<0&&f1.call(e,r)&&(n[r]=e[r]);return n};function Ft(e,t,n={}){const r=n,{window:o=qs}=r,s=d1(r,["window"]);let i;const a=Iv(()=>o&&"ResizeObserver"in o),l=()=>{i&&(i.disconnect(),i=void 0)},u=me(()=>qn(e),f=>{l(),a.value&&o&&f&&(i=new ResizeObserver(t),i.observe(f,s))},{immediate:!0,flush:"post"}),c=()=>{l(),u()};return Us(c),{isSupported:a,stop:c}}var Qf=Object.getOwnPropertySymbols,p1=Object.prototype.hasOwnProperty,h1=Object.prototype.propertyIsEnumerable,v1=(e,t)=>{var n={};for(var r in e)p1.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&Qf)for(var r of Qf(e))t.indexOf(r)<0&&h1.call(e,r)&&(n[r]=e[r]);return n};function m1(e,t,n={}){const r=n,{window:o=qs}=r,s=v1(r,["window"]);let i;const a=Iv(()=>o&&"MutationObserver"in o),l=()=>{i&&(i.disconnect(),i=void 0)},u=me(()=>qn(e),f=>{l(),a.value&&o&&f&&(i=new MutationObserver(t),i.observe(f,s))},{immediate:!0}),c=()=>{l(),u()};return Us(c),{isSupported:a,stop:c}}var ed;(function(e){e.UP="UP",e.RIGHT="RIGHT",e.DOWN="DOWN",e.LEFT="LEFT",e.NONE="NONE"})(ed||(ed={}));var g1=Object.defineProperty,td=Object.getOwnPropertySymbols,y1=Object.prototype.hasOwnProperty,b1=Object.prototype.propertyIsEnumerable,nd=(e,t,n)=>t in e?g1(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,w1=(e,t)=>{for(var n in t||(t={}))y1.call(t,n)&&nd(e,n,t[n]);if(td)for(var n of td(t))b1.call(t,n)&&nd(e,n,t[n]);return e};const _1={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};w1({linear:r1},_1);function S1({window:e=qs}={}){if(!e)return z(!1);const t=z(e.document.hasFocus());return Gt(e,"blur",()=>{t.value=!1}),Gt(e,"focus",()=>{t.value=!0}),t}const E1=()=>ot&&/firefox/i.test(window.navigator.userAgent);var $v=typeof global=="object"&&global&&global.Object===Object&&global,C1=typeof self=="object"&&self&&self.Object===Object&&self,bn=$v||C1||Function("return this")(),nn=bn.Symbol,kv=Object.prototype,T1=kv.hasOwnProperty,O1=kv.toString,Zo=nn?nn.toStringTag:void 0;function x1(e){var t=T1.call(e,Zo),n=e[Zo];try{e[Zo]=void 0;var r=!0}catch{}var o=O1.call(e);return r&&(t?e[Zo]=n:delete e[Zo]),o}var A1=Object.prototype,R1=A1.toString;function P1(e){return R1.call(e)}var I1="[object Null]",$1="[object Undefined]",rd=nn?nn.toStringTag:void 0;function Vo(e){return e==null?e===void 0?$1:I1:rd&&rd in Object(e)?x1(e):P1(e)}function Er(e){return e!=null&&typeof e=="object"}var k1="[object Symbol]";function Ca(e){return typeof e=="symbol"||Er(e)&&Vo(e)==k1}function L1(e,t){for(var n=-1,r=e==null?0:e.length,o=Array(r);++n0){if(++t>=u_)return arguments[0]}else t=0;return e.apply(void 0,arguments)}}function p_(e){return function(){return e}}var Zi=function(){try{var e=lo(Object,"defineProperty");return e({},"",{}),e}catch{}}(),h_=Zi?function(e,t){return Zi(e,"toString",{configurable:!0,enumerable:!1,value:p_(t),writable:!0})}:Nv,v_=d_(h_);function m_(e,t){for(var n=-1,r=e==null?0:e.length;++n-1&&e%1==0&&e-1&&e%1==0&&e<=E_}function Bv(e){return e!=null&&Zu(e.length)&&!Mv(e)}var C_=Object.prototype;function Qu(e){var t=e&&e.constructor,n=typeof t=="function"&&t.prototype||C_;return e===n}function T_(e,t){for(var n=-1,r=Array(e);++n-1}function kS(e,t){var n=this.__data__,r=xa(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}function er(e){var t=-1,n=e==null?0:e.length;for(this.clear();++ta))return!1;var u=s.get(e),c=s.get(t);if(u&&c)return u==t&&c==e;var f=-1,d=!0,v=n&N2?new ta:void 0;for(s.set(e,t),s.set(t,e);++f=t||A<0||f&&P>=s}function g(){var O=cl();if(y(O))return _(O);a=setTimeout(g,h(O))}function _(O){return a=void 0,d&&r?v(O):(r=o=void 0,i)}function E(){a!==void 0&&clearTimeout(a),u=0,r=l=o=a=void 0}function S(){return a===void 0?i:_(cl())}function b(){var O=cl(),A=y(O);if(r=arguments,o=this,l=O,A){if(a===void 0)return p(l);if(f)return clearTimeout(a),a=setTimeout(g,t),v(l)}return a===void 0&&(a=setTimeout(g,t)),i}return b.cancel=E,b.flush=S,b}function EC(e,t,n){var r=e==null?0:e.length;if(!r)return-1;var o=r-1;return g_(e,yC(t),o)}function na(e){for(var t=-1,n=e==null?0:e.length,r={};++te===void 0,Nt=e=>typeof e=="boolean",Ve=e=>typeof e=="number",Ur=e=>typeof Element>"u"?!1:e instanceof Element,Xl=e=>Pn(e),xC=e=>Oe(e)?!Number.isNaN(Number(e)):!1,AC=(e="")=>e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d"),yr=e=>js(e),Ld=e=>Object.keys(e),fl=(e,t,n)=>({get value(){return An(e,t,n)},set value(r){OC(e,t,r)}});class RC extends Error{constructor(t){super(t),this.name="ElementPlusError"}}function xr(e,t){throw new RC(`[${e}] ${t}`)}const im=(e="")=>e.split(" ").filter(t=>!!t.trim()),Nd=(e,t)=>{if(!e||!t)return!1;if(t.includes(" "))throw new Error("className should not contain space.");return e.classList.contains(t)},Zl=(e,t)=>{!e||!t.trim()||e.classList.add(...im(t))},Is=(e,t)=>{!e||!t.trim()||e.classList.remove(...im(t))},_o=(e,t)=>{var n;if(!ot||!e||!t)return"";let r=tn(t);r==="float"&&(r="cssFloat");try{const o=e.style[r];if(o)return o;const s=(n=document.defaultView)==null?void 0:n.getComputedStyle(e,"");return s?s[r]:""}catch{return e.style[r]}};function on(e,t="px"){if(!e)return"";if(Ve(e)||xC(e))return`${e}${t}`;if(Oe(e))return e}let pi;const PC=e=>{var t;if(!ot)return 0;if(pi!==void 0)return pi;const n=document.createElement("div");n.className=`${e}-scrollbar__wrap`,n.style.visibility="hidden",n.style.width="100px",n.style.position="absolute",n.style.top="-9999px",document.body.appendChild(n);const r=n.offsetWidth;n.style.overflow="scroll";const o=document.createElement("div");o.style.width="100%",n.appendChild(o);const s=o.offsetWidth;return(t=n.parentNode)==null||t.removeChild(n),pi=r-s,pi};function IC(e,t){if(!ot)return;if(!t){e.scrollTop=0;return}const n=[];let r=t.offsetParent;for(;r!==null&&e!==r&&e.contains(r);)n.push(r),r=r.offsetParent;const o=t.offsetTop+n.reduce((l,u)=>l+u.offsetTop,0),s=o+t.offsetHeight,i=e.scrollTop,a=i+e.clientHeight;oa&&(e.scrollTop=s-e.clientHeight)}/*! Element Plus Icons Vue v2.3.1 */var $C=J({name:"ArrowDown",__name:"arrow-down",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.712a29.12 29.12 0 0 0 0-41.728 30.592 30.592 0 0 0-42.752 0z"})]))}}),am=$C,kC=J({name:"ArrowLeft",__name:"arrow-left",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M609.408 149.376 277.76 489.6a32 32 0 0 0 0 44.672l331.648 340.352a29.12 29.12 0 0 0 41.728 0 30.592 30.592 0 0 0 0-42.752L339.264 511.936l311.872-319.872a30.592 30.592 0 0 0 0-42.688 29.12 29.12 0 0 0-41.728 0z"})]))}}),LC=kC,NC=J({name:"ArrowRight",__name:"arrow-right",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z"})]))}}),MC=NC,FC=J({name:"ArrowUp",__name:"arrow-up",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"m488.832 344.32-339.84 356.672a32 32 0 0 0 0 44.16l.384.384a29.44 29.44 0 0 0 42.688 0l320-335.872 319.872 335.872a29.44 29.44 0 0 0 42.688 0l.384-.384a32 32 0 0 0 0-44.16L535.168 344.32a32 32 0 0 0-46.336 0"})]))}}),BC=FC,DC=J({name:"CircleCheckFilled",__name:"circle-check-filled",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.272 38.272 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),f8=DC,VC=J({name:"CircleCheck",__name:"circle-check",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896"}),fe("path",{fill:"currentColor",d:"M745.344 361.344a32 32 0 0 1 45.312 45.312l-288 288a32 32 0 0 1-45.312 0l-160-160a32 32 0 1 1 45.312-45.312L480 626.752l265.344-265.408z"})]))}}),jC=VC,zC=J({name:"CircleCloseFilled",__name:"circle-close-filled",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336z"})]))}}),lm=zC,HC=J({name:"CircleClose",__name:"circle-close",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"m466.752 512-90.496-90.496a32 32 0 0 1 45.248-45.248L512 466.752l90.496-90.496a32 32 0 1 1 45.248 45.248L557.248 512l90.496 90.496a32 32 0 1 1-45.248 45.248L512 557.248l-90.496 90.496a32 32 0 0 1-45.248-45.248z"}),fe("path",{fill:"currentColor",d:"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896"})]))}}),uc=HC,KC=J({name:"Close",__name:"close",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z"})]))}}),$s=KC,UC=J({name:"Delete",__name:"delete",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M160 256H96a32 32 0 0 1 0-64h256V95.936a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V192h256a32 32 0 1 1 0 64h-64v672a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32zm448-64v-64H416v64zM224 896h576V256H224zm192-128a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32m192 0a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32"})]))}}),d8=UC,qC=J({name:"Download",__name:"download",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64m384-253.696 236.288-236.352 45.248 45.248L508.8 704 192 387.2l45.248-45.248L480 584.704V128h64z"})]))}}),p8=qC,WC=J({name:"Edit",__name:"edit",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M832 512a32 32 0 1 1 64 0v352a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32h352a32 32 0 0 1 0 64H192v640h640z"}),fe("path",{fill:"currentColor",d:"m469.952 554.24 52.8-7.552L847.104 222.4a32 32 0 1 0-45.248-45.248L477.44 501.44l-7.552 52.8zm422.4-422.4a96 96 0 0 1 0 135.808l-331.84 331.84a32 32 0 0 1-18.112 9.088L436.8 623.68a32 32 0 0 1-36.224-36.224l15.104-105.6a32 32 0 0 1 9.024-18.112l331.904-331.84a96 96 0 0 1 135.744 0z"})]))}}),h8=WC,GC=J({name:"Folder",__name:"folder",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M128 192v640h768V320H485.76L357.504 192zm-32-64h287.872l128.384 128H928a32 32 0 0 1 32 32v576a32 32 0 0 1-32 32H96a32 32 0 0 1-32-32V160a32 32 0 0 1 32-32"})]))}}),v8=GC,YC=J({name:"Hide",__name:"hide",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M876.8 156.8c0-9.6-3.2-16-9.6-22.4-6.4-6.4-12.8-9.6-22.4-9.6-9.6 0-16 3.2-22.4 9.6L736 220.8c-64-32-137.6-51.2-224-60.8-160 16-288 73.6-377.6 176C44.8 438.4 0 496 0 512s48 73.6 134.4 176c22.4 25.6 44.8 48 73.6 67.2l-86.4 89.6c-6.4 6.4-9.6 12.8-9.6 22.4 0 9.6 3.2 16 9.6 22.4 6.4 6.4 12.8 9.6 22.4 9.6 9.6 0 16-3.2 22.4-9.6l704-710.4c3.2-6.4 6.4-12.8 6.4-22.4Zm-646.4 528c-76.8-70.4-128-128-153.6-172.8 28.8-48 80-105.6 153.6-172.8C304 272 400 230.4 512 224c64 3.2 124.8 19.2 176 44.8l-54.4 54.4C598.4 300.8 560 288 512 288c-64 0-115.2 22.4-160 64s-64 96-64 160c0 48 12.8 89.6 35.2 124.8L256 707.2c-9.6-6.4-19.2-16-25.6-22.4Zm140.8-96c-12.8-22.4-19.2-48-19.2-76.8 0-44.8 16-83.2 48-112 32-28.8 67.2-48 112-48 28.8 0 54.4 6.4 73.6 19.2zM889.599 336c-12.8-16-28.8-28.8-41.6-41.6l-48 48c73.6 67.2 124.8 124.8 150.4 169.6-28.8 48-80 105.6-153.6 172.8-73.6 67.2-172.8 108.8-284.8 115.2-51.2-3.2-99.2-12.8-140.8-28.8l-48 48c57.6 22.4 118.4 38.4 188.8 44.8 160-16 288-73.6 377.6-176C979.199 585.6 1024 528 1024 512s-48.001-73.6-134.401-176Z"}),fe("path",{fill:"currentColor",d:"M511.998 672c-12.8 0-25.6-3.2-38.4-6.4l-51.2 51.2c28.8 12.8 57.6 19.2 89.6 19.2 64 0 115.2-22.4 160-64 41.6-41.6 64-96 64-160 0-32-6.4-64-19.2-89.6l-51.2 51.2c3.2 12.8 6.4 25.6 6.4 38.4 0 44.8-16 83.2-48 112-32 28.8-67.2 48-112 48Z"})]))}}),JC=YC,XC=J({name:"InfoFilled",__name:"info-filled",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64m67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344M590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.992 12.992 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z"})]))}}),um=XC,ZC=J({name:"Link",__name:"link",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M715.648 625.152 670.4 579.904l90.496-90.56c75.008-74.944 85.12-186.368 22.656-248.896-62.528-62.464-173.952-52.352-248.96 22.656L444.16 353.6l-45.248-45.248 90.496-90.496c100.032-99.968 251.968-110.08 339.456-22.656 87.488 87.488 77.312 239.424-22.656 339.456l-90.496 90.496zm-90.496 90.496-90.496 90.496C434.624 906.112 282.688 916.224 195.2 828.8c-87.488-87.488-77.312-239.424 22.656-339.456l90.496-90.496 45.248 45.248-90.496 90.56c-75.008 74.944-85.12 186.368-22.656 248.896 62.528 62.464 173.952 52.352 248.96-22.656l90.496-90.496zm0-362.048 45.248 45.248L398.848 670.4 353.6 625.152z"})]))}}),m8=ZC,QC=J({name:"Loading",__name:"loading",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32m0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32m448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32m-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32M195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0m-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z"})]))}}),cc=QC,eT=J({name:"Minus",__name:"minus",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M128 544h768a32 32 0 1 0 0-64H128a32 32 0 0 0 0 64"})]))}}),tT=eT,nT=J({name:"Plus",__name:"plus",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M480 480V128a32 32 0 0 1 64 0v352h352a32 32 0 1 1 0 64H544v352a32 32 0 1 1-64 0V544H128a32 32 0 0 1 0-64z"})]))}}),cm=nT,rT=J({name:"Search",__name:"search",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704"})]))}}),g8=rT,oT=J({name:"SuccessFilled",__name:"success-filled",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.272 38.272 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336z"})]))}}),fm=oT,sT=J({name:"View",__name:"view",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 160c320 0 512 352 512 352S832 864 512 864 0 512 0 512s192-352 512-352m0 64c-225.28 0-384.128 208.064-436.8 288 52.608 79.872 211.456 288 436.8 288 225.28 0 384.128-208.064 436.8-288-52.608-79.872-211.456-288-436.8-288zm0 64a224 224 0 1 1 0 448 224 224 0 0 1 0-448m0 64a160.192 160.192 0 0 0-160 160c0 88.192 71.744 160 160 160s160-71.808 160-160-71.744-160-160-160"})]))}}),iT=sT,aT=J({name:"WarningFilled",__name:"warning-filled",setup(e){return(t,n)=>($(),Q("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[fe("path",{fill:"currentColor",d:"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896m0 192a58.432 58.432 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.432 58.432 0 0 0 512 256m0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4"})]))}}),dm=aT;const pm="__epPropKey",ge=e=>e,lT=e=>xe(e)&&!!e[pm],Ia=(e,t)=>{if(!xe(e)||lT(e))return e;const{values:n,required:r,default:o,type:s,validator:i}=e,l={type:s,required:!!r,validator:n||i?u=>{let c=!1,f=[];if(n&&(f=Array.from(n),je(e,"default")&&f.push(o),c||(c=f.includes(u))),i&&(c||(c=i(u))),!c&&f.length>0){const d=[...new Set(f)].map(v=>JSON.stringify(v)).join(", ");a0(`Invalid prop: validation failed${t?` for prop "${t}"`:""}. Expected one of [${d}], got value ${JSON.stringify(u)}.`)}return c}:void 0,[pm]:!0};return je(e,"default")&&(l.default=o),l},Re=e=>na(Object.entries(e).map(([t,n])=>[t,Ia(n,t)])),Bt=ge([String,Object,Function]),uT={Close:$s},cT={Close:$s,SuccessFilled:fm,InfoFilled:um,WarningFilled:dm,CircleCloseFilled:lm},Md={success:fm,warning:dm,error:lm,info:um},hm={validating:cc,success:jC,error:uc},gt=(e,t)=>{if(e.install=n=>{for(const r of[e,...Object.values(t??{})])n.component(r.name,r)},t)for(const[n,r]of Object.entries(t))e[n]=r;return e},fT=(e,t)=>(e.install=n=>{e._context=n._context,n.config.globalProperties[t]=e},e),dT=(e,t)=>(e.install=n=>{n.directive(t,e)},e),uo=e=>(e.install=pt,e),pT=(...e)=>t=>{e.forEach(n=>{he(n)?n(t):n.value=t})},In={tab:"Tab",enter:"Enter",space:"Space",left:"ArrowLeft",up:"ArrowUp",right:"ArrowRight",down:"ArrowDown",esc:"Escape",delete:"Delete",backspace:"Backspace",numpadEnter:"NumpadEnter",pageUp:"PageUp",pageDown:"PageDown",home:"Home",end:"End"},rt="update:modelValue",Qr="change",qr="input",jo=["","default","small","large"],hT=e=>["",...jo].includes(e);var ki=(e=>(e[e.TEXT=1]="TEXT",e[e.CLASS=2]="CLASS",e[e.STYLE=4]="STYLE",e[e.PROPS=8]="PROPS",e[e.FULL_PROPS=16]="FULL_PROPS",e[e.HYDRATE_EVENTS=32]="HYDRATE_EVENTS",e[e.STABLE_FRAGMENT=64]="STABLE_FRAGMENT",e[e.KEYED_FRAGMENT=128]="KEYED_FRAGMENT",e[e.UNKEYED_FRAGMENT=256]="UNKEYED_FRAGMENT",e[e.NEED_PATCH=512]="NEED_PATCH",e[e.DYNAMIC_SLOTS=1024]="DYNAMIC_SLOTS",e[e.HOISTED=-1]="HOISTED",e[e.BAIL=-2]="BAIL",e))(ki||{});const Li=e=>{const t=ce(e)?e:[e],n=[];return t.forEach(r=>{var o;ce(r)?n.push(...Li(r)):Yn(r)&&ce(r.children)?n.push(...Li(r.children)):(n.push(r),Yn(r)&&((o=r.component)!=null&&o.subTree)&&n.push(...Li(r.component.subTree)))}),n},vT=e=>/([\uAC00-\uD7AF\u3130-\u318F])+/gi.test(e),$a=e=>e,mT=["class","style"],gT=/^on[A-Z]/,yT=(e={})=>{const{excludeListeners:t=!1,excludeKeys:n}=e,r=T(()=>((n==null?void 0:n.value)||[]).concat(mT)),o=st();return T(o?()=>{var s;return na(Object.entries((s=o.proxy)==null?void 0:s.$attrs).filter(([i])=>!r.value.includes(i)&&!(t&&gT.test(i))))}:()=>({}))},ds=({from:e,replacement:t,scope:n,version:r,ref:o,type:s="API"},i)=>{me(()=>m(i),a=>{},{immediate:!0})},bT=(e,t,n,r)=>{let o={offsetX:0,offsetY:0};const s=u=>{const c=u.clientX,f=u.clientY,{offsetX:d,offsetY:v}=o,p=e.value.getBoundingClientRect(),h=p.left,y=p.top,g=p.width,_=p.height,E=document.documentElement.clientWidth,S=document.documentElement.clientHeight,b=-h+d,O=-y+v,A=E-h-g+d,P=S-y-_+v,x=U=>{let N=d+U.clientX-c,D=v+U.clientY-f;r!=null&&r.value||(N=Math.min(Math.max(N,b),A),D=Math.min(Math.max(D,O),P)),o={offsetX:N,offsetY:D},e.value&&(e.value.style.transform=`translate(${on(N)}, ${on(D)})`)},M=()=>{document.removeEventListener("mousemove",x),document.removeEventListener("mouseup",M)};document.addEventListener("mousemove",x),document.addEventListener("mouseup",M)},i=()=>{t.value&&e.value&&t.value.addEventListener("mousedown",s)},a=()=>{t.value&&e.value&&t.value.removeEventListener("mousedown",s)},l=()=>{o={offsetX:0,offsetY:0},e.value&&(e.value.style.transform="none")};return Ue(()=>{qu(()=>{n.value?i():a()})}),Ct(()=>{a()}),{resetPosition:l}};var wT={name:"en",el:{breadcrumb:{label:"Breadcrumb"},colorpicker:{confirm:"OK",clear:"Clear",defaultLabel:"color picker",description:"current color is {color}. press enter to select a new color.",alphaLabel:"pick alpha value"},datepicker:{now:"Now",today:"Today",cancel:"Cancel",clear:"Clear",confirm:"OK",dateTablePrompt:"Use the arrow keys and enter to select the day of the month",monthTablePrompt:"Use the arrow keys and enter to select the month",yearTablePrompt:"Use the arrow keys and enter to select the year",selectedDate:"Selected date",selectDate:"Select date",selectTime:"Select time",startDate:"Start Date",startTime:"Start Time",endDate:"End Date",endTime:"End Time",prevYear:"Previous Year",nextYear:"Next Year",prevMonth:"Previous Month",nextMonth:"Next Month",year:"",month1:"January",month2:"February",month3:"March",month4:"April",month5:"May",month6:"June",month7:"July",month8:"August",month9:"September",month10:"October",month11:"November",month12:"December",week:"week",weeks:{sun:"Sun",mon:"Mon",tue:"Tue",wed:"Wed",thu:"Thu",fri:"Fri",sat:"Sat"},weeksFull:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"},months:{jan:"Jan",feb:"Feb",mar:"Mar",apr:"Apr",may:"May",jun:"Jun",jul:"Jul",aug:"Aug",sep:"Sep",oct:"Oct",nov:"Nov",dec:"Dec"}},inputNumber:{decrease:"decrease number",increase:"increase number"},select:{loading:"Loading",noMatch:"No matching data",noData:"No data",placeholder:"Select"},mention:{loading:"Loading"},dropdown:{toggleDropdown:"Toggle Dropdown"},cascader:{noMatch:"No matching data",loading:"Loading",placeholder:"Select",noData:"No data"},pagination:{goto:"Go to",pagesize:"/page",total:"Total {total}",pageClassifier:"",page:"Page",prev:"Go to previous page",next:"Go to next page",currentPage:"page {pager}",prevPages:"Previous {pager} pages",nextPages:"Next {pager} pages",deprecationWarning:"Deprecated usages detected, please refer to the el-pagination documentation for more details"},dialog:{close:"Close this dialog"},drawer:{close:"Close this dialog"},messagebox:{title:"Message",confirm:"OK",cancel:"Cancel",error:"Illegal input",close:"Close this dialog"},upload:{deleteTip:"press delete to remove",delete:"Delete",preview:"Preview",continue:"Continue"},slider:{defaultLabel:"slider between {min} and {max}",defaultRangeStartLabel:"pick start value",defaultRangeEndLabel:"pick end value"},table:{emptyText:"No Data",confirmFilter:"Confirm",resetFilter:"Reset",clearFilter:"All",sumText:"Sum"},tour:{next:"Next",previous:"Previous",finish:"Finish"},tree:{emptyText:"No Data"},transfer:{noMatch:"No matching data",noData:"No data",titles:["List 1","List 2"],filterPlaceholder:"Enter keyword",noCheckedFormat:"{total} items",hasCheckedFormat:"{checked}/{total} checked"},image:{error:"FAILED"},pageHeader:{title:"Back"},popconfirm:{confirmButtonText:"Yes",cancelButtonText:"No"},carousel:{leftArrow:"Carousel arrow left",rightArrow:"Carousel arrow right",indicator:"Carousel switch to index {index}"}}};const _T=e=>(t,n)=>ST(t,n,m(e)),ST=(e,t,n)=>An(n,e,e).replace(/\{(\w+)\}/g,(r,o)=>{var s;return`${(s=t==null?void 0:t[o])!=null?s:`{${o}}`}`}),ET=e=>{const t=T(()=>m(e).name),n=He(e)?e:z(e);return{lang:t,locale:n,t:_T(e)}},vm=Symbol("localeContextKey"),ka=e=>{const t=e||_e(vm,z());return ET(T(()=>t.value||wT))},ps="el",CT="is-",Nr=(e,t,n,r,o)=>{let s=`${e}-${t}`;return n&&(s+=`-${n}`),r&&(s+=`__${r}`),o&&(s+=`--${o}`),s},mm=Symbol("namespaceContextKey"),fc=e=>{const t=e||(st()?_e(mm,z(ps)):z(ps));return T(()=>m(t)||ps)},$e=(e,t)=>{const n=fc(t);return{namespace:n,b:(h="")=>Nr(n.value,e,h,"",""),e:h=>h?Nr(n.value,e,"",h,""):"",m:h=>h?Nr(n.value,e,"","",h):"",be:(h,y)=>h&&y?Nr(n.value,e,h,y,""):"",em:(h,y)=>h&&y?Nr(n.value,e,"",h,y):"",bm:(h,y)=>h&&y?Nr(n.value,e,h,"",y):"",bem:(h,y,g)=>h&&y&&g?Nr(n.value,e,h,y,g):"",is:(h,...y)=>{const g=y.length>=1?y[0]:!0;return h&&g?`${CT}${h}`:""},cssVar:h=>{const y={};for(const g in h)h[g]&&(y[`--${n.value}-${g}`]=h[g]);return y},cssVarName:h=>`--${n.value}-${h}`,cssVarBlock:h=>{const y={};for(const g in h)h[g]&&(y[`--${n.value}-${e}-${g}`]=h[g]);return y},cssVarBlockName:h=>`--${n.value}-${e}-${h}`}},TT=(e,t={})=>{He(e)||xr("[useLockscreen]","You need to pass a ref param to this function");const n=t.ns||$e("popup"),r=T(()=>n.bm("parent","hidden"));if(!ot||Nd(document.body,r.value))return;let o=0,s=!1,i="0";const a=()=>{setTimeout(()=>{Is(document==null?void 0:document.body,r.value),s&&document&&(document.body.style.width=i)},200)};me(e,l=>{if(!l){a();return}s=!Nd(document.body,r.value),s&&(i=document.body.style.width),o=PC(n.namespace.value);const u=document.documentElement.clientHeight0&&(u||c==="scroll")&&s&&(document.body.style.width=`calc(100% - ${o}px)`),Zl(document.body,r.value)}),Tu(()=>a())},OT=Ia({type:ge(Boolean),default:null}),xT=Ia({type:ge(Function)}),AT=e=>{const t=`update:${e}`,n=`onUpdate:${e}`,r=[t],o={[e]:OT,[n]:xT};return{useModelToggle:({indicator:i,toggleReason:a,shouldHideWhenRouteChanges:l,shouldProceed:u,onShow:c,onHide:f})=>{const d=st(),{emit:v}=d,p=d.props,h=T(()=>he(p[n])),y=T(()=>p[e]===null),g=A=>{i.value!==!0&&(i.value=!0,a&&(a.value=A),he(c)&&c(A))},_=A=>{i.value!==!1&&(i.value=!1,a&&(a.value=A),he(f)&&f(A))},E=A=>{if(p.disabled===!0||he(u)&&!u())return;const P=h.value&&ot;P&&v(t,!0),(y.value||!P)&&g(A)},S=A=>{if(p.disabled===!0||!ot)return;const P=h.value&&ot;P&&v(t,!1),(y.value||!P)&&_(A)},b=A=>{Nt(A)&&(p.disabled&&A?h.value&&v(t,!1):i.value!==A&&(A?g():_()))},O=()=>{i.value?S():E()};return me(()=>p[e],b),l&&d.appContext.config.globalProperties.$route!==void 0&&me(()=>({...d.proxy.$route}),()=>{l.value&&i.value&&S()}),Ue(()=>{b(p[e])}),{hide:S,show:E,toggle:O,hasUpdateHandler:h}},useModelToggleProps:o,useModelToggleEmits:r}},gm=e=>{const t=st();return T(()=>{var n,r;return(r=(n=t==null?void 0:t.proxy)==null?void 0:n.$props)==null?void 0:r[e]})};var Dt="top",sn="bottom",an="right",Vt="left",dc="auto",Gs=[Dt,sn,an,Vt],ko="start",ks="end",RT="clippingParents",ym="viewport",Qo="popper",PT="reference",Fd=Gs.reduce(function(e,t){return e.concat([t+"-"+ko,t+"-"+ks])},[]),La=[].concat(Gs,[dc]).reduce(function(e,t){return e.concat([t,t+"-"+ko,t+"-"+ks])},[]),IT="beforeRead",$T="read",kT="afterRead",LT="beforeMain",NT="main",MT="afterMain",FT="beforeWrite",BT="write",DT="afterWrite",VT=[IT,$T,kT,LT,NT,MT,FT,BT,DT];function Ln(e){return e?(e.nodeName||"").toLowerCase():null}function wn(e){if(e==null)return window;if(e.toString()!=="[object Window]"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function Lo(e){var t=wn(e).Element;return e instanceof t||e instanceof Element}function en(e){var t=wn(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function pc(e){if(typeof ShadowRoot>"u")return!1;var t=wn(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function jT(e){var t=e.state;Object.keys(t.elements).forEach(function(n){var r=t.styles[n]||{},o=t.attributes[n]||{},s=t.elements[n];!en(s)||!Ln(s)||(Object.assign(s.style,r),Object.keys(o).forEach(function(i){var a=o[i];a===!1?s.removeAttribute(i):s.setAttribute(i,a===!0?"":a)}))})}function zT(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach(function(r){var o=t.elements[r],s=t.attributes[r]||{},i=Object.keys(t.styles.hasOwnProperty(r)?t.styles[r]:n[r]),a=i.reduce(function(l,u){return l[u]="",l},{});!en(o)||!Ln(o)||(Object.assign(o.style,a),Object.keys(s).forEach(function(l){o.removeAttribute(l)}))})}}var bm={name:"applyStyles",enabled:!0,phase:"write",fn:jT,effect:zT,requires:["computeStyles"]};function $n(e){return e.split("-")[0]}var Wr=Math.max,oa=Math.min,No=Math.round;function Mo(e,t){t===void 0&&(t=!1);var n=e.getBoundingClientRect(),r=1,o=1;if(en(e)&&t){var s=e.offsetHeight,i=e.offsetWidth;i>0&&(r=No(n.width)/i||1),s>0&&(o=No(n.height)/s||1)}return{width:n.width/r,height:n.height/o,top:n.top/o,right:n.right/r,bottom:n.bottom/o,left:n.left/r,x:n.left/r,y:n.top/o}}function hc(e){var t=Mo(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function wm(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&pc(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function Xn(e){return wn(e).getComputedStyle(e)}function HT(e){return["table","td","th"].indexOf(Ln(e))>=0}function Ar(e){return((Lo(e)?e.ownerDocument:e.document)||window.document).documentElement}function Na(e){return Ln(e)==="html"?e:e.assignedSlot||e.parentNode||(pc(e)?e.host:null)||Ar(e)}function Bd(e){return!en(e)||Xn(e).position==="fixed"?null:e.offsetParent}function KT(e){var t=navigator.userAgent.toLowerCase().indexOf("firefox")!==-1,n=navigator.userAgent.indexOf("Trident")!==-1;if(n&&en(e)){var r=Xn(e);if(r.position==="fixed")return null}var o=Na(e);for(pc(o)&&(o=o.host);en(o)&&["html","body"].indexOf(Ln(o))<0;){var s=Xn(o);if(s.transform!=="none"||s.perspective!=="none"||s.contain==="paint"||["transform","perspective"].indexOf(s.willChange)!==-1||t&&s.willChange==="filter"||t&&s.filter&&s.filter!=="none")return o;o=o.parentNode}return null}function Ys(e){for(var t=wn(e),n=Bd(e);n&&HT(n)&&Xn(n).position==="static";)n=Bd(n);return n&&(Ln(n)==="html"||Ln(n)==="body"&&Xn(n).position==="static")?t:n||KT(e)||t}function vc(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function hs(e,t,n){return Wr(e,oa(t,n))}function UT(e,t,n){var r=hs(e,t,n);return r>n?n:r}function _m(){return{top:0,right:0,bottom:0,left:0}}function Sm(e){return Object.assign({},_m(),e)}function Em(e,t){return t.reduce(function(n,r){return n[r]=e,n},{})}var qT=function(e,t){return e=typeof e=="function"?e(Object.assign({},t.rects,{placement:t.placement})):e,Sm(typeof e!="number"?e:Em(e,Gs))};function WT(e){var t,n=e.state,r=e.name,o=e.options,s=n.elements.arrow,i=n.modifiersData.popperOffsets,a=$n(n.placement),l=vc(a),u=[Vt,an].indexOf(a)>=0,c=u?"height":"width";if(!(!s||!i)){var f=qT(o.padding,n),d=hc(s),v=l==="y"?Dt:Vt,p=l==="y"?sn:an,h=n.rects.reference[c]+n.rects.reference[l]-i[l]-n.rects.popper[c],y=i[l]-n.rects.reference[l],g=Ys(s),_=g?l==="y"?g.clientHeight||0:g.clientWidth||0:0,E=h/2-y/2,S=f[v],b=_-d[c]-f[p],O=_/2-d[c]/2+E,A=hs(S,O,b),P=l;n.modifiersData[r]=(t={},t[P]=A,t.centerOffset=A-O,t)}}function GT(e){var t=e.state,n=e.options,r=n.element,o=r===void 0?"[data-popper-arrow]":r;o!=null&&(typeof o=="string"&&(o=t.elements.popper.querySelector(o),!o)||!wm(t.elements.popper,o)||(t.elements.arrow=o))}var YT={name:"arrow",enabled:!0,phase:"main",fn:WT,effect:GT,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fo(e){return e.split("-")[1]}var JT={top:"auto",right:"auto",bottom:"auto",left:"auto"};function XT(e){var t=e.x,n=e.y,r=window,o=r.devicePixelRatio||1;return{x:No(t*o)/o||0,y:No(n*o)/o||0}}function Dd(e){var t,n=e.popper,r=e.popperRect,o=e.placement,s=e.variation,i=e.offsets,a=e.position,l=e.gpuAcceleration,u=e.adaptive,c=e.roundOffsets,f=e.isFixed,d=i.x,v=d===void 0?0:d,p=i.y,h=p===void 0?0:p,y=typeof c=="function"?c({x:v,y:h}):{x:v,y:h};v=y.x,h=y.y;var g=i.hasOwnProperty("x"),_=i.hasOwnProperty("y"),E=Vt,S=Dt,b=window;if(u){var O=Ys(n),A="clientHeight",P="clientWidth";if(O===wn(n)&&(O=Ar(n),Xn(O).position!=="static"&&a==="absolute"&&(A="scrollHeight",P="scrollWidth")),O=O,o===Dt||(o===Vt||o===an)&&s===ks){S=sn;var x=f&&O===b&&b.visualViewport?b.visualViewport.height:O[A];h-=x-r.height,h*=l?1:-1}if(o===Vt||(o===Dt||o===sn)&&s===ks){E=an;var M=f&&O===b&&b.visualViewport?b.visualViewport.width:O[P];v-=M-r.width,v*=l?1:-1}}var U=Object.assign({position:a},u&&JT),N=c===!0?XT({x:v,y:h}):{x:v,y:h};if(v=N.x,h=N.y,l){var D;return Object.assign({},U,(D={},D[S]=_?"0":"",D[E]=g?"0":"",D.transform=(b.devicePixelRatio||1)<=1?"translate("+v+"px, "+h+"px)":"translate3d("+v+"px, "+h+"px, 0)",D))}return Object.assign({},U,(t={},t[S]=_?h+"px":"",t[E]=g?v+"px":"",t.transform="",t))}function ZT(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=r===void 0?!0:r,s=n.adaptive,i=s===void 0?!0:s,a=n.roundOffsets,l=a===void 0?!0:a,u={placement:$n(t.placement),variation:Fo(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:t.options.strategy==="fixed"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,Dd(Object.assign({},u,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:i,roundOffsets:l})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,Dd(Object.assign({},u,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})}var Cm={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:ZT,data:{}},hi={passive:!0};function QT(e){var t=e.state,n=e.instance,r=e.options,o=r.scroll,s=o===void 0?!0:o,i=r.resize,a=i===void 0?!0:i,l=wn(t.elements.popper),u=[].concat(t.scrollParents.reference,t.scrollParents.popper);return s&&u.forEach(function(c){c.addEventListener("scroll",n.update,hi)}),a&&l.addEventListener("resize",n.update,hi),function(){s&&u.forEach(function(c){c.removeEventListener("scroll",n.update,hi)}),a&&l.removeEventListener("resize",n.update,hi)}}var Tm={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:QT,data:{}},eO={left:"right",right:"left",bottom:"top",top:"bottom"};function Ni(e){return e.replace(/left|right|bottom|top/g,function(t){return eO[t]})}var tO={start:"end",end:"start"};function Vd(e){return e.replace(/start|end/g,function(t){return tO[t]})}function mc(e){var t=wn(e),n=t.pageXOffset,r=t.pageYOffset;return{scrollLeft:n,scrollTop:r}}function gc(e){return Mo(Ar(e)).left+mc(e).scrollLeft}function nO(e){var t=wn(e),n=Ar(e),r=t.visualViewport,o=n.clientWidth,s=n.clientHeight,i=0,a=0;return r&&(o=r.width,s=r.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(i=r.offsetLeft,a=r.offsetTop)),{width:o,height:s,x:i+gc(e),y:a}}function rO(e){var t,n=Ar(e),r=mc(e),o=(t=e.ownerDocument)==null?void 0:t.body,s=Wr(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),i=Wr(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),a=-r.scrollLeft+gc(e),l=-r.scrollTop;return Xn(o||n).direction==="rtl"&&(a+=Wr(n.clientWidth,o?o.clientWidth:0)-s),{width:s,height:i,x:a,y:l}}function yc(e){var t=Xn(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function Om(e){return["html","body","#document"].indexOf(Ln(e))>=0?e.ownerDocument.body:en(e)&&yc(e)?e:Om(Na(e))}function vs(e,t){var n;t===void 0&&(t=[]);var r=Om(e),o=r===((n=e.ownerDocument)==null?void 0:n.body),s=wn(r),i=o?[s].concat(s.visualViewport||[],yc(r)?r:[]):r,a=t.concat(i);return o?a:a.concat(vs(Na(i)))}function Ql(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function oO(e){var t=Mo(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}function jd(e,t){return t===ym?Ql(nO(e)):Lo(t)?oO(t):Ql(rO(Ar(e)))}function sO(e){var t=vs(Na(e)),n=["absolute","fixed"].indexOf(Xn(e).position)>=0,r=n&&en(e)?Ys(e):e;return Lo(r)?t.filter(function(o){return Lo(o)&&wm(o,r)&&Ln(o)!=="body"}):[]}function iO(e,t,n){var r=t==="clippingParents"?sO(e):[].concat(t),o=[].concat(r,[n]),s=o[0],i=o.reduce(function(a,l){var u=jd(e,l);return a.top=Wr(u.top,a.top),a.right=oa(u.right,a.right),a.bottom=oa(u.bottom,a.bottom),a.left=Wr(u.left,a.left),a},jd(e,s));return i.width=i.right-i.left,i.height=i.bottom-i.top,i.x=i.left,i.y=i.top,i}function xm(e){var t=e.reference,n=e.element,r=e.placement,o=r?$n(r):null,s=r?Fo(r):null,i=t.x+t.width/2-n.width/2,a=t.y+t.height/2-n.height/2,l;switch(o){case Dt:l={x:i,y:t.y-n.height};break;case sn:l={x:i,y:t.y+t.height};break;case an:l={x:t.x+t.width,y:a};break;case Vt:l={x:t.x-n.width,y:a};break;default:l={x:t.x,y:t.y}}var u=o?vc(o):null;if(u!=null){var c=u==="y"?"height":"width";switch(s){case ko:l[u]=l[u]-(t[c]/2-n[c]/2);break;case ks:l[u]=l[u]+(t[c]/2-n[c]/2);break}}return l}function Ls(e,t){t===void 0&&(t={});var n=t,r=n.placement,o=r===void 0?e.placement:r,s=n.boundary,i=s===void 0?RT:s,a=n.rootBoundary,l=a===void 0?ym:a,u=n.elementContext,c=u===void 0?Qo:u,f=n.altBoundary,d=f===void 0?!1:f,v=n.padding,p=v===void 0?0:v,h=Sm(typeof p!="number"?p:Em(p,Gs)),y=c===Qo?PT:Qo,g=e.rects.popper,_=e.elements[d?y:c],E=iO(Lo(_)?_:_.contextElement||Ar(e.elements.popper),i,l),S=Mo(e.elements.reference),b=xm({reference:S,element:g,strategy:"absolute",placement:o}),O=Ql(Object.assign({},g,b)),A=c===Qo?O:S,P={top:E.top-A.top+h.top,bottom:A.bottom-E.bottom+h.bottom,left:E.left-A.left+h.left,right:A.right-E.right+h.right},x=e.modifiersData.offset;if(c===Qo&&x){var M=x[o];Object.keys(P).forEach(function(U){var N=[an,sn].indexOf(U)>=0?1:-1,D=[Dt,sn].indexOf(U)>=0?"y":"x";P[U]+=M[D]*N})}return P}function aO(e,t){t===void 0&&(t={});var n=t,r=n.placement,o=n.boundary,s=n.rootBoundary,i=n.padding,a=n.flipVariations,l=n.allowedAutoPlacements,u=l===void 0?La:l,c=Fo(r),f=c?a?Fd:Fd.filter(function(p){return Fo(p)===c}):Gs,d=f.filter(function(p){return u.indexOf(p)>=0});d.length===0&&(d=f);var v=d.reduce(function(p,h){return p[h]=Ls(e,{placement:h,boundary:o,rootBoundary:s,padding:i})[$n(h)],p},{});return Object.keys(v).sort(function(p,h){return v[p]-v[h]})}function lO(e){if($n(e)===dc)return[];var t=Ni(e);return[Vd(e),t,Vd(t)]}function uO(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,s=o===void 0?!0:o,i=n.altAxis,a=i===void 0?!0:i,l=n.fallbackPlacements,u=n.padding,c=n.boundary,f=n.rootBoundary,d=n.altBoundary,v=n.flipVariations,p=v===void 0?!0:v,h=n.allowedAutoPlacements,y=t.options.placement,g=$n(y),_=g===y,E=l||(_||!p?[Ni(y)]:lO(y)),S=[y].concat(E).reduce(function(We,qe){return We.concat($n(qe)===dc?aO(t,{placement:qe,boundary:c,rootBoundary:f,padding:u,flipVariations:p,allowedAutoPlacements:h}):qe)},[]),b=t.rects.reference,O=t.rects.popper,A=new Map,P=!0,x=S[0],M=0;M=0,I=Z?"width":"height",R=Ls(t,{placement:U,boundary:c,rootBoundary:f,altBoundary:d,padding:u}),H=Z?D?an:Vt:D?sn:Dt;b[I]>O[I]&&(H=Ni(H));var re=Ni(H),ye=[];if(s&&ye.push(R[N]<=0),a&&ye.push(R[H]<=0,R[re]<=0),ye.every(function(We){return We})){x=U,P=!1;break}A.set(U,ye)}if(P)for(var Ne=p?3:1,Me=function(We){var qe=S.find(function(Ee){var F=A.get(Ee);if(F)return F.slice(0,We).every(function(j){return j})});if(qe)return x=qe,"break"},Pe=Ne;Pe>0;Pe--){var Ce=Me(Pe);if(Ce==="break")break}t.placement!==x&&(t.modifiersData[r]._skip=!0,t.placement=x,t.reset=!0)}}var cO={name:"flip",enabled:!0,phase:"main",fn:uO,requiresIfExists:["offset"],data:{_skip:!1}};function zd(e,t,n){return n===void 0&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function Hd(e){return[Dt,an,sn,Vt].some(function(t){return e[t]>=0})}function fO(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,s=t.modifiersData.preventOverflow,i=Ls(t,{elementContext:"reference"}),a=Ls(t,{altBoundary:!0}),l=zd(i,r),u=zd(a,o,s),c=Hd(l),f=Hd(u);t.modifiersData[n]={referenceClippingOffsets:l,popperEscapeOffsets:u,isReferenceHidden:c,hasPopperEscaped:f},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":c,"data-popper-escaped":f})}var dO={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:fO};function pO(e,t,n){var r=$n(e),o=[Vt,Dt].indexOf(r)>=0?-1:1,s=typeof n=="function"?n(Object.assign({},t,{placement:e})):n,i=s[0],a=s[1];return i=i||0,a=(a||0)*o,[Vt,an].indexOf(r)>=0?{x:a,y:i}:{x:i,y:a}}function hO(e){var t=e.state,n=e.options,r=e.name,o=n.offset,s=o===void 0?[0,0]:o,i=La.reduce(function(c,f){return c[f]=pO(f,t.rects,s),c},{}),a=i[t.placement],l=a.x,u=a.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=l,t.modifiersData.popperOffsets.y+=u),t.modifiersData[r]=i}var vO={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:hO};function mO(e){var t=e.state,n=e.name;t.modifiersData[n]=xm({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})}var Am={name:"popperOffsets",enabled:!0,phase:"read",fn:mO,data:{}};function gO(e){return e==="x"?"y":"x"}function yO(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=o===void 0?!0:o,i=n.altAxis,a=i===void 0?!1:i,l=n.boundary,u=n.rootBoundary,c=n.altBoundary,f=n.padding,d=n.tether,v=d===void 0?!0:d,p=n.tetherOffset,h=p===void 0?0:p,y=Ls(t,{boundary:l,rootBoundary:u,padding:f,altBoundary:c}),g=$n(t.placement),_=Fo(t.placement),E=!_,S=vc(g),b=gO(S),O=t.modifiersData.popperOffsets,A=t.rects.reference,P=t.rects.popper,x=typeof h=="function"?h(Object.assign({},t.rects,{placement:t.placement})):h,M=typeof x=="number"?{mainAxis:x,altAxis:x}:Object.assign({mainAxis:0,altAxis:0},x),U=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,N={x:0,y:0};if(O){if(s){var D,Z=S==="y"?Dt:Vt,I=S==="y"?sn:an,R=S==="y"?"height":"width",H=O[S],re=H+y[Z],ye=H-y[I],Ne=v?-P[R]/2:0,Me=_===ko?A[R]:P[R],Pe=_===ko?-P[R]:-A[R],Ce=t.elements.arrow,We=v&&Ce?hc(Ce):{width:0,height:0},qe=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:_m(),Ee=qe[Z],F=qe[I],j=hs(0,A[R],We[R]),W=E?A[R]/2-Ne-j-Ee-M.mainAxis:Me-j-Ee-M.mainAxis,te=E?-A[R]/2+Ne+j+F+M.mainAxis:Pe+j+F+M.mainAxis,be=t.elements.arrow&&Ys(t.elements.arrow),Te=be?S==="y"?be.clientTop||0:be.clientLeft||0:0,w=(D=U==null?void 0:U[S])!=null?D:0,C=H+W-w-Te,k=H+te-w,G=hs(v?oa(re,C):re,H,v?Wr(ye,k):ye);O[S]=G,N[S]=G-H}if(a){var K,Y=S==="x"?Dt:Vt,oe=S==="x"?sn:an,ee=O[b],ne=b==="y"?"height":"width",X=ee+y[Y],we=ee-y[oe],se=[Dt,Vt].indexOf(g)!==-1,L=(K=U==null?void 0:U[b])!=null?K:0,ae=se?X:ee-A[ne]-P[ne]-L+M.altAxis,Se=se?ee+A[ne]+P[ne]-L-M.altAxis:we,De=v&&se?UT(ae,ee,Se):hs(v?ae:X,ee,v?Se:we);O[b]=De,N[b]=De-ee}t.modifiersData[r]=N}}var bO={name:"preventOverflow",enabled:!0,phase:"main",fn:yO,requiresIfExists:["offset"]};function wO(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function _O(e){return e===wn(e)||!en(e)?mc(e):wO(e)}function SO(e){var t=e.getBoundingClientRect(),n=No(t.width)/e.offsetWidth||1,r=No(t.height)/e.offsetHeight||1;return n!==1||r!==1}function EO(e,t,n){n===void 0&&(n=!1);var r=en(t),o=en(t)&&SO(t),s=Ar(t),i=Mo(e,o),a={scrollLeft:0,scrollTop:0},l={x:0,y:0};return(r||!r&&!n)&&((Ln(t)!=="body"||yc(s))&&(a=_O(t)),en(t)?(l=Mo(t,!0),l.x+=t.clientLeft,l.y+=t.clientTop):s&&(l.x=gc(s))),{x:i.left+a.scrollLeft-l.x,y:i.top+a.scrollTop-l.y,width:i.width,height:i.height}}function CO(e){var t=new Map,n=new Set,r=[];e.forEach(function(s){t.set(s.name,s)});function o(s){n.add(s.name);var i=[].concat(s.requires||[],s.requiresIfExists||[]);i.forEach(function(a){if(!n.has(a)){var l=t.get(a);l&&o(l)}}),r.push(s)}return e.forEach(function(s){n.has(s.name)||o(s)}),r}function TO(e){var t=CO(e);return VT.reduce(function(n,r){return n.concat(t.filter(function(o){return o.phase===r}))},[])}function OO(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function xO(e){var t=e.reduce(function(n,r){var o=n[r.name];return n[r.name]=o?Object.assign({},o,r,{options:Object.assign({},o.options,r.options),data:Object.assign({},o.data,r.data)}):r,n},{});return Object.keys(t).map(function(n){return t[n]})}var Kd={placement:"bottom",modifiers:[],strategy:"absolute"};function Ud(){for(var e=arguments.length,t=new Array(e),n=0;n{const r={name:"updateState",enabled:!0,phase:"write",fn:({state:l})=>{const u=$O(l);Object.assign(i.value,u)},requires:["computeStyles"]},o=T(()=>{const{onFirstUpdate:l,placement:u,strategy:c,modifiers:f}=m(n);return{onFirstUpdate:l,placement:u||"bottom",strategy:c||"absolute",modifiers:[...f||[],r,{name:"applyStyles",enabled:!1}]}}),s=_r(),i=z({styles:{popper:{position:m(o).strategy,left:"0",top:"0"},arrow:{position:"absolute"}},attributes:{}}),a=()=>{s.value&&(s.value.destroy(),s.value=void 0)};return me(o,l=>{const u=m(s);u&&u.setOptions(l)},{deep:!0}),me([e,t],([l,u])=>{a(),!(!l||!u)&&(s.value=PO(l,u,m(o)))}),Ct(()=>{a()}),{state:T(()=>{var l;return{...((l=m(s))==null?void 0:l.state)||{}}}),styles:T(()=>m(i).styles),attributes:T(()=>m(i).attributes),update:()=>{var l;return(l=m(s))==null?void 0:l.update()},forceUpdate:()=>{var l;return(l=m(s))==null?void 0:l.forceUpdate()},instanceRef:T(()=>m(s))}};function $O(e){const t=Object.keys(e.elements),n=na(t.map(o=>[o,e.styles[o]||{}])),r=na(t.map(o=>[o,e.attributes[o]]));return{styles:n,attributes:r}}const Rm=e=>{if(!e)return{onClick:pt,onMousedown:pt,onMouseup:pt};let t=!1,n=!1;return{onClick:i=>{t&&n&&e(i),t=n=!1},onMousedown:i=>{t=i.target===i.currentTarget},onMouseup:i=>{n=i.target===i.currentTarget}}};function qd(){let e;const t=(r,o)=>{n(),e=window.setTimeout(r,o)},n=()=>window.clearTimeout(e);return Us(()=>n()),{registerTimeout:t,cancelTimeout:n}}const Wd={prefix:Math.floor(Math.random()*1e4),current:0},kO=Symbol("elIdInjection"),Pm=()=>st()?_e(kO,Wd):Wd,eo=e=>{const t=Pm(),n=fc();return T(()=>m(e)||`${n.value}-id-${t.prefix}-${t.current++}`)};let So=[];const Gd=e=>{const t=e;t.key===In.esc&&So.forEach(n=>n(t))},LO=e=>{Ue(()=>{So.length===0&&document.addEventListener("keydown",Gd),ot&&So.push(e)}),Ct(()=>{So=So.filter(t=>t!==e),So.length===0&&ot&&document.removeEventListener("keydown",Gd)})};let Yd;const Im=()=>{const e=fc(),t=Pm(),n=T(()=>`${e.value}-popper-container-${t.prefix}`),r=T(()=>`#${n.value}`);return{id:n,selector:r}},NO=e=>{const t=document.createElement("div");return t.id=e,document.body.appendChild(t),t},MO=()=>{const{id:e,selector:t}=Im();return ga(()=>{ot&&(!Yd||!document.body.querySelector(t.value))&&(Yd=NO(e.value))}),{id:e,selector:t}},FO=Re({showAfter:{type:Number,default:0},hideAfter:{type:Number,default:200},autoClose:{type:Number,default:0}}),BO=({showAfter:e,hideAfter:t,autoClose:n,open:r,close:o})=>{const{registerTimeout:s}=qd(),{registerTimeout:i,cancelTimeout:a}=qd();return{onOpen:c=>{s(()=>{r(c);const f=m(n);Ve(f)&&f>0&&i(()=>{o(c)},f)},m(e))},onClose:c=>{a(),s(()=>{o(c)},m(t))}}},$m=Symbol("elForwardRef"),DO=e=>{ct($m,{setForwardRef:n=>{e.value=n}})},VO=e=>({mounted(t){e(t)},updated(t){e(t)},unmounted(){e(null)}}),Jd={current:0},Xd=z(0),km=2e3,Zd=Symbol("elZIndexContextKey"),Lm=Symbol("zIndexContextKey"),wc=e=>{const t=st()?_e(Zd,Jd):Jd,n=e||(st()?_e(Lm,void 0):void 0),r=T(()=>{const i=m(n);return Ve(i)?i:km}),o=T(()=>r.value+Xd.value),s=()=>(t.current++,Xd.value=t.current,o.value);return!ot&&_e(Zd),{initialZIndex:r,currentZIndex:o,nextZIndex:s}};function jO(e){let t;function n(){if(e.value==null)return;const{selectionStart:o,selectionEnd:s,value:i}=e.value;if(o==null||s==null)return;const a=i.slice(0,Math.max(0,o)),l=i.slice(Math.max(0,s));t={selectionStart:o,selectionEnd:s,value:i,beforeTxt:a,afterTxt:l}}function r(){if(e.value==null||t==null)return;const{value:o}=e.value,{beforeTxt:s,afterTxt:i,selectionStart:a}=t;if(s==null||i==null||a==null)return;let l=o.length;if(o.endsWith(i))l=o.length-i.length;else if(o.startsWith(s))l=s.length;else{const u=s[a-1],c=o.indexOf(u,a-1);c!==-1&&(l=c+1)}e.value.setSelectionRange(l,l)}return[n,r]}const zO=(e,t,n)=>Li(e.subTree).filter(s=>{var i;return Yn(s)&&((i=s.type)==null?void 0:i.name)===t&&!!s.component}).map(s=>s.component.uid).map(s=>n[s]).filter(s=>!!s),HO=(e,t)=>{const n={},r=_r([]);return{children:r,addChild:i=>{n[i.uid]=i,r.value=zO(e,t,n)},removeChild:i=>{delete n[i],r.value=r.value.filter(a=>a.uid!==i)}}},co=Ia({type:String,values:jo,required:!1}),Nm=Symbol("size"),KO=()=>{const e=_e(Nm,{});return T(()=>m(e.size)||"")};function Mm(e,{beforeFocus:t,afterFocus:n,beforeBlur:r,afterBlur:o}={}){const s=st(),{emit:i}=s,a=_r(),l=z(!1),u=d=>{he(t)&&t(d)||l.value||(l.value=!0,i("focus",d),n==null||n())},c=d=>{var v;he(r)&&r(d)||d.relatedTarget&&((v=a.value)!=null&&v.contains(d.relatedTarget))||(l.value=!1,i("blur",d),o==null||o())},f=()=>{var d,v;(d=a.value)!=null&&d.contains(document.activeElement)&&a.value!==document.activeElement||(v=e.value)==null||v.focus()};return me(a,d=>{d&&d.setAttribute("tabindex","-1")}),Gt(a,"focus",u,!0),Gt(a,"blur",c,!0),Gt(a,"click",f,!0),{isFocused:l,wrapperRef:a,handleFocus:u,handleBlur:c}}function Fm({afterComposition:e,emit:t}){const n=z(!1),r=a=>{t==null||t("compositionstart",a),n.value=!0},o=a=>{var l;t==null||t("compositionupdate",a);const u=(l=a.target)==null?void 0:l.value,c=u[u.length-1]||"";n.value=!vT(c)},s=a=>{t==null||t("compositionend",a),n.value&&(n.value=!1,ze(()=>e(a)))};return{isComposing:n,handleComposition:a=>{a.type==="compositionend"?s(a):o(a)},handleCompositionStart:r,handleCompositionUpdate:o,handleCompositionEnd:s}}const Bm=Symbol("emptyValuesContextKey"),UO=["",void 0,null],qO=void 0,Dm=Re({emptyValues:Array,valueOnClear:{type:[String,Number,Boolean,Function],default:void 0,validator:e=>he(e)?!e():!e}}),WO=(e,t)=>{const n=st()?_e(Bm,z({})):z({}),r=T(()=>e.emptyValues||n.value.emptyValues||UO),o=T(()=>he(e.valueOnClear)?e.valueOnClear():e.valueOnClear!==void 0?e.valueOnClear:he(n.value.valueOnClear)?n.value.valueOnClear():n.value.valueOnClear!==void 0?n.value.valueOnClear:qO),s=i=>r.value.includes(i);return r.value.includes(o.value),{emptyValues:r,valueOnClear:o,isEmptyValue:s}},GO=Re({ariaLabel:String,ariaOrientation:{type:String,values:["horizontal","vertical","undefined"]},ariaControls:String}),nr=e=>sm(GO,e),Vm=Symbol(),sa=z();function Ma(e,t=void 0){const n=st()?_e(Vm,sa):sa;return e?T(()=>{var r,o;return(o=(r=n.value)==null?void 0:r[e])!=null?o:t}):n}function jm(e,t){const n=Ma(),r=$e(e,T(()=>{var a;return((a=n.value)==null?void 0:a.namespace)||ps})),o=ka(T(()=>{var a;return(a=n.value)==null?void 0:a.locale})),s=wc(T(()=>{var a;return((a=n.value)==null?void 0:a.zIndex)||km})),i=T(()=>{var a;return m(t)||((a=n.value)==null?void 0:a.size)||""});return YO(T(()=>m(n)||{})),{ns:r,locale:o,zIndex:s,size:i}}const YO=(e,t,n=!1)=>{var r;const o=!!st(),s=o?Ma():void 0,i=(r=void 0)!=null?r:o?ct:void 0;if(!i)return;const a=T(()=>{const l=m(e);return s!=null&&s.value?JO(s.value,l):l});return i(Vm,a),i(vm,T(()=>a.value.locale)),i(mm,T(()=>a.value.namespace)),i(Lm,T(()=>a.value.zIndex)),i(Nm,{size:T(()=>a.value.size||"")}),i(Bm,T(()=>({emptyValues:a.value.emptyValues,valueOnClear:a.value.valueOnClear}))),(n||!sa.value)&&(sa.value=a.value),a},JO=(e,t)=>{const n=[...new Set([...Ld(e),...Ld(t)])],r={};for(const o of n)r[o]=t[o]!==void 0?t[o]:e[o];return r};Re({a11y:{type:Boolean,default:!0},locale:{type:ge(Object)},size:co,button:{type:ge(Object)},experimentalFeatures:{type:ge(Object)},keyboardNavigation:{type:Boolean,default:!0},message:{type:ge(Object)},zIndex:Number,namespace:{type:String,default:"el"},...Dm});const Tn={};var ke=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n};const XO=Re({size:{type:ge([Number,String])},color:{type:String}}),ZO=J({name:"ElIcon",inheritAttrs:!1}),QO=J({...ZO,props:XO,setup(e){const t=e,n=$e("icon"),r=T(()=>{const{size:o,color:s}=t;return!o&&!s?{}:{fontSize:Lt(o)?void 0:on(o),"--color":s}});return(o,s)=>($(),Q("i",hn({class:m(n).b(),style:m(r)},o.$attrs),[de(o.$slots,"default")],16))}});var ex=ke(QO,[["__file","icon.vue"]]);const tt=gt(ex),zo=Symbol("formContextKey"),to=Symbol("formItemContextKey"),yn=(e,t={})=>{const n=z(void 0),r=t.prop?n:gm("size"),o=t.global?n:KO(),s=t.form?{size:void 0}:_e(zo,void 0),i=t.formItem?{size:void 0}:_e(to,void 0);return T(()=>r.value||m(e)||(i==null?void 0:i.size)||(s==null?void 0:s.size)||o.value||"")},Ho=e=>{const t=gm("disabled"),n=_e(zo,void 0);return T(()=>t.value||m(e)||(n==null?void 0:n.disabled)||!1)},Rr=()=>{const e=_e(zo,void 0),t=_e(to,void 0);return{form:e,formItem:t}},Js=(e,{formItemContext:t,disableIdGeneration:n,disableIdManagement:r})=>{n||(n=z(!1)),r||(r=z(!1));const o=z();let s;const i=T(()=>{var a;return!!(!(e.label||e.ariaLabel)&&t&&t.inputIds&&((a=t.inputIds)==null?void 0:a.length)<=1)});return Ue(()=>{s=me([Zt(e,"id"),n],([a,l])=>{const u=a??(l?void 0:eo().value);u!==o.value&&(t!=null&&t.removeInputId&&(o.value&&t.removeInputId(o.value),!(r!=null&&r.value)&&!l&&u&&t.addInputId(u)),o.value=u)},{immediate:!0})}),oo(()=>{s&&s(),t!=null&&t.removeInputId&&o.value&&t.removeInputId(o.value)}),{isLabeledByFormItem:i,inputId:o}},tx=Re({size:{type:String,values:jo},disabled:Boolean}),nx=Re({...tx,model:Object,rules:{type:ge(Object)},labelPosition:{type:String,values:["left","right","top"],default:"right"},requireAsteriskPosition:{type:String,values:["left","right"],default:"left"},labelWidth:{type:[String,Number],default:""},labelSuffix:{type:String,default:""},inline:Boolean,inlineMessage:Boolean,statusIcon:Boolean,showMessage:{type:Boolean,default:!0},validateOnRuleChange:{type:Boolean,default:!0},hideRequiredAsterisk:Boolean,scrollToError:Boolean,scrollIntoViewOptions:{type:[Object,Boolean]}}),rx={validate:(e,t,n)=>(ce(e)||Oe(e))&&Nt(t)&&Oe(n)};function ox(){const e=z([]),t=T(()=>{if(!e.value.length)return"0";const s=Math.max(...e.value);return s?`${s}px`:""});function n(s){const i=e.value.indexOf(s);return i===-1&&t.value,i}function r(s,i){if(s&&i){const a=n(i);e.value.splice(a,1,s)}else s&&e.value.push(s)}function o(s){const i=n(s);i>-1&&e.value.splice(i,1)}return{autoLabelWidth:t,registerLabelWidth:r,deregisterLabelWidth:o}}const vi=(e,t)=>{const n=fn(t);return n.length>0?e.filter(r=>r.prop&&n.includes(r.prop)):e},sx="ElForm",ix=J({name:sx}),ax=J({...ix,props:nx,emits:rx,setup(e,{expose:t,emit:n}){const r=e,o=[],s=yn(),i=$e("form"),a=T(()=>{const{labelPosition:E,inline:S}=r;return[i.b(),i.m(s.value||"default"),{[i.m(`label-${E}`)]:E,[i.m("inline")]:S}]}),l=E=>o.find(S=>S.prop===E),u=E=>{o.push(E)},c=E=>{E.prop&&o.splice(o.indexOf(E),1)},f=(E=[])=>{r.model&&vi(o,E).forEach(S=>S.resetField())},d=(E=[])=>{vi(o,E).forEach(S=>S.clearValidate())},v=T(()=>!!r.model),p=E=>{if(o.length===0)return[];const S=vi(o,E);return S.length?S:[]},h=async E=>g(void 0,E),y=async(E=[])=>{if(!v.value)return!1;const S=p(E);if(S.length===0)return!0;let b={};for(const O of S)try{await O.validate("")}catch(A){b={...b,...A}}return Object.keys(b).length===0?!0:Promise.reject(b)},g=async(E=[],S)=>{const b=!he(S);try{const O=await y(E);return O===!0&&await(S==null?void 0:S(O)),O}catch(O){if(O instanceof Error)throw O;const A=O;return r.scrollToError&&_(Object.keys(A)[0]),await(S==null?void 0:S(!1,A)),b&&Promise.reject(A)}},_=E=>{var S;const b=vi(o,E)[0];b&&((S=b.$el)==null||S.scrollIntoView(r.scrollIntoViewOptions))};return me(()=>r.rules,()=>{r.validateOnRuleChange&&h().catch(E=>void 0)},{deep:!0}),ct(zo,Et({...Or(r),emit:n,resetFields:f,clearValidate:d,validateField:g,getField:l,addField:u,removeField:c,...ox()})),t({validate:h,validateField:g,resetFields:f,clearValidate:d,scrollToField:_,fields:o}),(E,S)=>($(),Q("form",{class:q(m(a))},[de(E.$slots,"default")],2))}});var lx=ke(ax,[["__file","form.vue"]]);function Vr(){return Vr=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Mi(e,t,n){return cx()?Mi=Reflect.construct.bind():Mi=function(o,s,i){var a=[null];a.push.apply(a,s);var l=Function.bind.apply(o,a),u=new l;return i&&Ns(u,i.prototype),u},Mi.apply(null,arguments)}function fx(e){return Function.toString.call(e).indexOf("[native code]")!==-1}function tu(e){var t=typeof Map=="function"?new Map:void 0;return tu=function(r){if(r===null||!fx(r))return r;if(typeof r!="function")throw new TypeError("Super expression must either be null or a function");if(typeof t<"u"){if(t.has(r))return t.get(r);t.set(r,o)}function o(){return Mi(r,arguments,eu(this).constructor)}return o.prototype=Object.create(r.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),Ns(o,r)},tu(e)}var dx=/%[sdj%]/g,px=function(){};function nu(e){if(!e||!e.length)return null;var t={};return e.forEach(function(n){var r=n.field;t[r]=t[r]||[],t[r].push(n)}),t}function Wt(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r=s)return a;switch(a){case"%s":return String(n[o++]);case"%d":return Number(n[o++]);case"%j":try{return JSON.stringify(n[o++])}catch{return"[Circular]"}break;default:return a}});return i}return e}function hx(e){return e==="string"||e==="url"||e==="hex"||e==="email"||e==="date"||e==="pattern"}function vt(e,t){return!!(e==null||t==="array"&&Array.isArray(e)&&!e.length||hx(t)&&typeof e=="string"&&!e)}function vx(e,t,n){var r=[],o=0,s=e.length;function i(a){r.push.apply(r,a||[]),o++,o===s&&n(r)}e.forEach(function(a){t(a,i)})}function Qd(e,t,n){var r=0,o=e.length;function s(i){if(i&&i.length){n(i);return}var a=r;r=r+1,a()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+\.)+[a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]{2,}))$/,hex:/^#?([a-f0-9]{6}|[a-f0-9]{3})$/i},rs={integer:function(t){return rs.number(t)&&parseInt(t,10)===t},float:function(t){return rs.number(t)&&!rs.integer(t)},array:function(t){return Array.isArray(t)},regexp:function(t){if(t instanceof RegExp)return!0;try{return!!new RegExp(t)}catch{return!1}},date:function(t){return typeof t.getTime=="function"&&typeof t.getMonth=="function"&&typeof t.getYear=="function"&&!isNaN(t.getTime())},number:function(t){return isNaN(t)?!1:typeof t=="number"},object:function(t){return typeof t=="object"&&!rs.array(t)},method:function(t){return typeof t=="function"},email:function(t){return typeof t=="string"&&t.length<=320&&!!t.match(rp.email)},url:function(t){return typeof t=="string"&&t.length<=2048&&!!t.match(_x())},hex:function(t){return typeof t=="string"&&!!t.match(rp.hex)}},Sx=function(t,n,r,o,s){if(t.required&&n===void 0){zm(t,n,r,o,s);return}var i=["integer","float","array","regexp","object","method","email","number","date","url","hex"],a=t.type;i.indexOf(a)>-1?rs[a](n)||o.push(Wt(s.messages.types[a],t.fullField,t.type)):a&&typeof n!==t.type&&o.push(Wt(s.messages.types[a],t.fullField,t.type))},Ex=function(t,n,r,o,s){var i=typeof t.len=="number",a=typeof t.min=="number",l=typeof t.max=="number",u=/[\uD800-\uDBFF][\uDC00-\uDFFF]/g,c=n,f=null,d=typeof n=="number",v=typeof n=="string",p=Array.isArray(n);if(d?f="number":v?f="string":p&&(f="array"),!f)return!1;p&&(c=n.length),v&&(c=n.replace(u,"_").length),i?c!==t.len&&o.push(Wt(s.messages[f].len,t.fullField,t.len)):a&&!l&&ct.max?o.push(Wt(s.messages[f].max,t.fullField,t.max)):a&&l&&(ct.max)&&o.push(Wt(s.messages[f].range,t.fullField,t.min,t.max))},ho="enum",Cx=function(t,n,r,o,s){t[ho]=Array.isArray(t[ho])?t[ho]:[],t[ho].indexOf(n)===-1&&o.push(Wt(s.messages[ho],t.fullField,t[ho].join(", ")))},Tx=function(t,n,r,o,s){if(t.pattern){if(t.pattern instanceof RegExp)t.pattern.lastIndex=0,t.pattern.test(n)||o.push(Wt(s.messages.pattern.mismatch,t.fullField,n,t.pattern));else if(typeof t.pattern=="string"){var i=new RegExp(t.pattern);i.test(n)||o.push(Wt(s.messages.pattern.mismatch,t.fullField,n,t.pattern))}}},Be={required:zm,whitespace:wx,type:Sx,range:Ex,enum:Cx,pattern:Tx},Ox=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n,"string")&&!t.required)return r();Be.required(t,n,o,i,s,"string"),vt(n,"string")||(Be.type(t,n,o,i,s),Be.range(t,n,o,i,s),Be.pattern(t,n,o,i,s),t.whitespace===!0&&Be.whitespace(t,n,o,i,s))}r(i)},xx=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Be.required(t,n,o,i,s),n!==void 0&&Be.type(t,n,o,i,s)}r(i)},Ax=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(n===""&&(n=void 0),vt(n)&&!t.required)return r();Be.required(t,n,o,i,s),n!==void 0&&(Be.type(t,n,o,i,s),Be.range(t,n,o,i,s))}r(i)},Rx=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Be.required(t,n,o,i,s),n!==void 0&&Be.type(t,n,o,i,s)}r(i)},Px=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Be.required(t,n,o,i,s),vt(n)||Be.type(t,n,o,i,s)}r(i)},Ix=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Be.required(t,n,o,i,s),n!==void 0&&(Be.type(t,n,o,i,s),Be.range(t,n,o,i,s))}r(i)},$x=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Be.required(t,n,o,i,s),n!==void 0&&(Be.type(t,n,o,i,s),Be.range(t,n,o,i,s))}r(i)},kx=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(n==null&&!t.required)return r();Be.required(t,n,o,i,s,"array"),n!=null&&(Be.type(t,n,o,i,s),Be.range(t,n,o,i,s))}r(i)},Lx=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Be.required(t,n,o,i,s),n!==void 0&&Be.type(t,n,o,i,s)}r(i)},Nx="enum",Mx=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Be.required(t,n,o,i,s),n!==void 0&&Be[Nx](t,n,o,i,s)}r(i)},Fx=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n,"string")&&!t.required)return r();Be.required(t,n,o,i,s),vt(n,"string")||Be.pattern(t,n,o,i,s)}r(i)},Bx=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n,"date")&&!t.required)return r();if(Be.required(t,n,o,i,s),!vt(n,"date")){var l;n instanceof Date?l=n:l=new Date(n),Be.type(t,l,o,i,s),l&&Be.range(t,l.getTime(),o,i,s)}}r(i)},Dx=function(t,n,r,o,s){var i=[],a=Array.isArray(n)?"array":typeof n;Be.required(t,n,o,i,s,a),r(i)},dl=function(t,n,r,o,s){var i=t.type,a=[],l=t.required||!t.required&&o.hasOwnProperty(t.field);if(l){if(vt(n,i)&&!t.required)return r();Be.required(t,n,o,a,s,i),vt(n,i)||Be.type(t,n,o,a,s)}r(a)},Vx=function(t,n,r,o,s){var i=[],a=t.required||!t.required&&o.hasOwnProperty(t.field);if(a){if(vt(n)&&!t.required)return r();Be.required(t,n,o,i,s)}r(i)},ms={string:Ox,method:xx,number:Ax,boolean:Rx,regexp:Px,integer:Ix,float:$x,array:kx,object:Lx,enum:Mx,pattern:Fx,date:Bx,url:dl,hex:dl,email:dl,required:Dx,any:Vx};function ru(){return{default:"Validation error on field %s",required:"%s is required",enum:"%s must be one of %s",whitespace:"%s cannot be empty",date:{format:"%s date %s is invalid for format %s",parse:"%s date could not be parsed, %s is invalid ",invalid:"%s date %s is invalid"},types:{string:"%s is not a %s",method:"%s is not a %s (function)",array:"%s is not an %s",object:"%s is not an %s",number:"%s is not a %s",date:"%s is not a %s",boolean:"%s is not a %s",integer:"%s is not an %s",float:"%s is not a %s",regexp:"%s is not a valid %s",email:"%s is not a valid %s",url:"%s is not a valid %s",hex:"%s is not a valid %s"},string:{len:"%s must be exactly %s characters",min:"%s must be at least %s characters",max:"%s cannot be longer than %s characters",range:"%s must be between %s and %s characters"},number:{len:"%s must equal %s",min:"%s cannot be less than %s",max:"%s cannot be greater than %s",range:"%s must be between %s and %s"},array:{len:"%s must be exactly %s in length",min:"%s cannot be less than %s in length",max:"%s cannot be greater than %s in length",range:"%s must be between %s and %s in length"},pattern:{mismatch:"%s value %s does not match pattern %s"},clone:function(){var t=JSON.parse(JSON.stringify(this));return t.clone=this.clone,t}}}var ou=ru(),Xs=function(){function e(n){this.rules=null,this._messages=ou,this.define(n)}var t=e.prototype;return t.define=function(r){var o=this;if(!r)throw new Error("Cannot configure a schema with no rules");if(typeof r!="object"||Array.isArray(r))throw new Error("Rules must be an object");this.rules={},Object.keys(r).forEach(function(s){var i=r[s];o.rules[s]=Array.isArray(i)?i:[i]})},t.messages=function(r){return r&&(this._messages=np(ru(),r)),this._messages},t.validate=function(r,o,s){var i=this;o===void 0&&(o={}),s===void 0&&(s=function(){});var a=r,l=o,u=s;if(typeof l=="function"&&(u=l,l={}),!this.rules||Object.keys(this.rules).length===0)return u&&u(null,a),Promise.resolve(a);function c(h){var y=[],g={};function _(S){if(Array.isArray(S)){var b;y=(b=y).concat.apply(b,S)}else y.push(S)}for(var E=0;E");const o=$e("form"),s=z(),i=z(0),a=()=>{var c;if((c=s.value)!=null&&c.firstElementChild){const f=window.getComputedStyle(s.value.firstElementChild).width;return Math.ceil(Number.parseFloat(f))}else return 0},l=(c="update")=>{ze(()=>{t.default&&e.isAutoWidth&&(c==="update"?i.value=a():c==="remove"&&(n==null||n.deregisterLabelWidth(i.value)))})},u=()=>l("update");return Ue(()=>{u()}),Ct(()=>{l("remove")}),ro(()=>u()),me(i,(c,f)=>{e.updateAll&&(n==null||n.registerLabelWidth(c,f))}),Ft(T(()=>{var c,f;return(f=(c=s.value)==null?void 0:c.firstElementChild)!=null?f:null}),u),()=>{var c,f;if(!t)return null;const{isAutoWidth:d}=e;if(d){const v=n==null?void 0:n.autoLabelWidth,p=r==null?void 0:r.hasLabel,h={};if(p&&v&&v!=="auto"){const y=Math.max(0,Number.parseInt(v,10)-i.value),_=(r.labelPosition||n.labelPosition)==="left"?"marginRight":"marginLeft";y&&(h[_]=`${y}px`)}return ie("div",{ref:s,class:[o.be("item","label-wrap")],style:h},[(c=t.default)==null?void 0:c.call(t)])}else return ie(et,{ref:s},[(f=t.default)==null?void 0:f.call(t)])}}});const Kx=J({name:"ElFormItem"}),Ux=J({...Kx,props:zx,setup(e,{expose:t}){const n=e,r=so(),o=_e(zo,void 0),s=_e(to,void 0),i=yn(void 0,{formItem:!1}),a=$e("form-item"),l=eo().value,u=z([]),c=z(""),f=s1(c,100),d=z(""),v=z();let p,h=!1;const y=T(()=>n.labelPosition||(o==null?void 0:o.labelPosition)),g=T(()=>{if(y.value==="top")return{};const j=on(n.labelWidth||(o==null?void 0:o.labelWidth)||"");return j?{width:j}:{}}),_=T(()=>{if(y.value==="top"||o!=null&&o.inline)return{};if(!n.label&&!n.labelWidth&&M)return{};const j=on(n.labelWidth||(o==null?void 0:o.labelWidth)||"");return!n.label&&!r.label?{marginLeft:j}:{}}),E=T(()=>[a.b(),a.m(i.value),a.is("error",c.value==="error"),a.is("validating",c.value==="validating"),a.is("success",c.value==="success"),a.is("required",I.value||n.required),a.is("no-asterisk",o==null?void 0:o.hideRequiredAsterisk),(o==null?void 0:o.requireAsteriskPosition)==="right"?"asterisk-right":"asterisk-left",{[a.m("feedback")]:o==null?void 0:o.statusIcon,[a.m(`label-${y.value}`)]:y.value}]),S=T(()=>Nt(n.inlineMessage)?n.inlineMessage:(o==null?void 0:o.inlineMessage)||!1),b=T(()=>[a.e("error"),{[a.em("error","inline")]:S.value}]),O=T(()=>n.prop?Oe(n.prop)?n.prop:n.prop.join("."):""),A=T(()=>!!(n.label||r.label)),P=T(()=>n.for||(u.value.length===1?u.value[0]:void 0)),x=T(()=>!P.value&&A.value),M=!!s,U=T(()=>{const j=o==null?void 0:o.model;if(!(!j||!n.prop))return fl(j,n.prop).value}),N=T(()=>{const{required:j}=n,W=[];n.rules&&W.push(...fn(n.rules));const te=o==null?void 0:o.rules;if(te&&n.prop){const be=fl(te,n.prop).value;be&&W.push(...fn(be))}if(j!==void 0){const be=W.map((Te,w)=>[Te,w]).filter(([Te])=>Object.keys(Te).includes("required"));if(be.length>0)for(const[Te,w]of be)Te.required!==j&&(W[w]={...Te,required:j});else W.push({required:j})}return W}),D=T(()=>N.value.length>0),Z=j=>N.value.filter(te=>!te.trigger||!j?!0:Array.isArray(te.trigger)?te.trigger.includes(j):te.trigger===j).map(({trigger:te,...be})=>be),I=T(()=>N.value.some(j=>j.required)),R=T(()=>{var j;return f.value==="error"&&n.showMessage&&((j=o==null?void 0:o.showMessage)!=null?j:!0)}),H=T(()=>`${n.label||""}${(o==null?void 0:o.labelSuffix)||""}`),re=j=>{c.value=j},ye=j=>{var W,te;const{errors:be,fields:Te}=j;(!be||!Te)&&console.error(j),re("error"),d.value=be?(te=(W=be==null?void 0:be[0])==null?void 0:W.message)!=null?te:`${n.prop} is required`:"",o==null||o.emit("validate",n.prop,!1,d.value)},Ne=()=>{re("success"),o==null||o.emit("validate",n.prop,!0,"")},Me=async j=>{const W=O.value;return new Xs({[W]:j}).validate({[W]:U.value},{firstFields:!0}).then(()=>(Ne(),!0)).catch(be=>(ye(be),Promise.reject(be)))},Pe=async(j,W)=>{if(h||!n.prop)return!1;const te=he(W);if(!D.value)return W==null||W(!1),!1;const be=Z(j);return be.length===0?(W==null||W(!0),!0):(re("validating"),Me(be).then(()=>(W==null||W(!0),!0)).catch(Te=>{const{fields:w}=Te;return W==null||W(!1,w),te?!1:Promise.reject(w)}))},Ce=()=>{re(""),d.value="",h=!1},We=async()=>{const j=o==null?void 0:o.model;if(!j||!n.prop)return;const W=fl(j,n.prop);h=!0,W.value=Rd(p),await ze(),Ce(),h=!1},qe=j=>{u.value.includes(j)||u.value.push(j)},Ee=j=>{u.value=u.value.filter(W=>W!==j)};me(()=>n.error,j=>{d.value=j||"",re(j?"error":"")},{immediate:!0}),me(()=>n.validateStatus,j=>re(j||""));const F=Et({...Or(n),$el:v,size:i,validateState:c,labelId:l,inputIds:u,isGroup:x,hasLabel:A,fieldValue:U,addInputId:qe,removeInputId:Ee,resetField:We,clearValidate:Ce,validate:Pe});return ct(to,F),Ue(()=>{n.prop&&(o==null||o.addField(F),p=Rd(U.value))}),Ct(()=>{o==null||o.removeField(F)}),t({size:i,validateMessage:d,validateState:c,validate:Pe,clearValidate:Ce,resetField:We}),(j,W)=>{var te;return $(),Q("div",{ref_key:"formItemRef",ref:v,class:q(m(E)),role:m(x)?"group":void 0,"aria-labelledby":m(x)?m(l):void 0},[ie(m(Hx),{"is-auto-width":m(g).width==="auto","update-all":((te=m(o))==null?void 0:te.labelWidth)==="auto"},{default:ve(()=>[m(A)?($(),pe(at(m(P)?"label":"div"),{key:0,id:m(l),for:m(P),class:q(m(a).e("label")),style:it(m(g))},{default:ve(()=>[de(j.$slots,"label",{label:m(H)},()=>[Xr(Je(m(H)),1)])]),_:3},8,["id","for","class","style"])):ue("v-if",!0)]),_:3},8,["is-auto-width","update-all"]),fe("div",{class:q(m(a).e("content")),style:it(m(_))},[de(j.$slots,"default"),ie(P0,{name:`${m(a).namespace.value}-zoom-in-top`},{default:ve(()=>[m(R)?de(j.$slots,"error",{key:0,error:d.value},()=>[fe("div",{class:q(m(b))},Je(d.value),3)]):ue("v-if",!0)]),_:3},8,["name"])],6)],10,["role","aria-labelledby"])}}});var Hm=ke(Ux,[["__file","form-item.vue"]]);const y8=gt(lx,{FormItem:Hm}),b8=uo(Hm);let ln;const qx=` + height:0 !important; + visibility:hidden !important; + ${E1()?"":"overflow:hidden !important;"} + position:absolute !important; + z-index:-1000 !important; + top:0 !important; + right:0 !important; +`,Wx=["letter-spacing","line-height","padding-top","padding-bottom","font-family","font-weight","font-size","text-rendering","text-transform","width","text-indent","padding-left","padding-right","border-width","box-sizing"];function Gx(e){const t=window.getComputedStyle(e),n=t.getPropertyValue("box-sizing"),r=Number.parseFloat(t.getPropertyValue("padding-bottom"))+Number.parseFloat(t.getPropertyValue("padding-top")),o=Number.parseFloat(t.getPropertyValue("border-bottom-width"))+Number.parseFloat(t.getPropertyValue("border-top-width"));return{contextStyle:Wx.map(i=>`${i}:${t.getPropertyValue(i)}`).join(";"),paddingSize:r,borderSize:o,boxSizing:n}}function sp(e,t=1,n){var r;ln||(ln=document.createElement("textarea"),document.body.appendChild(ln));const{paddingSize:o,borderSize:s,boxSizing:i,contextStyle:a}=Gx(e);ln.setAttribute("style",`${a};${qx}`),ln.value=e.value||e.placeholder||"";let l=ln.scrollHeight;const u={};i==="border-box"?l=l+s:i==="content-box"&&(l=l-o),ln.value="";const c=ln.scrollHeight-o;if(Ve(t)){let f=c*t;i==="border-box"&&(f=f+o+s),l=Math.max(f,l),u.minHeight=`${f}px`}if(Ve(n)){let f=c*n;i==="border-box"&&(f=f+o+s),l=Math.min(f,l)}return u.height=`${l}px`,(r=ln.parentNode)==null||r.removeChild(ln),ln=void 0,u}const Yx=Re({id:{type:String,default:void 0},size:co,disabled:Boolean,modelValue:{type:ge([String,Number,Object]),default:""},maxlength:{type:[String,Number]},minlength:{type:[String,Number]},type:{type:String,default:"text"},resize:{type:String,values:["none","both","horizontal","vertical"]},autosize:{type:ge([Boolean,Object]),default:!1},autocomplete:{type:String,default:"off"},formatter:{type:Function},parser:{type:Function},placeholder:{type:String},form:{type:String},readonly:Boolean,clearable:Boolean,showPassword:Boolean,showWordLimit:Boolean,suffixIcon:{type:Bt},prefixIcon:{type:Bt},containerRole:{type:String,default:void 0},tabindex:{type:[String,Number],default:0},validateEvent:{type:Boolean,default:!0},inputStyle:{type:ge([Object,Array,String]),default:()=>$a({})},autofocus:Boolean,rows:{type:Number,default:2},...nr(["ariaLabel"])}),Jx={[rt]:e=>Oe(e),input:e=>Oe(e),change:e=>Oe(e),focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:()=>!0,mouseleave:e=>e instanceof MouseEvent,mouseenter:e=>e instanceof MouseEvent,keydown:e=>e instanceof Event,compositionstart:e=>e instanceof CompositionEvent,compositionupdate:e=>e instanceof CompositionEvent,compositionend:e=>e instanceof CompositionEvent},Xx=J({name:"ElInput",inheritAttrs:!1}),Zx=J({...Xx,props:Yx,emits:Jx,setup(e,{expose:t,emit:n}){const r=e,o=bb(),s=so(),i=T(()=>{const L={};return r.containerRole==="combobox"&&(L["aria-haspopup"]=o["aria-haspopup"],L["aria-owns"]=o["aria-owns"],L["aria-expanded"]=o["aria-expanded"]),L}),a=T(()=>[r.type==="textarea"?y.b():h.b(),h.m(v.value),h.is("disabled",p.value),h.is("exceed",Ce.value),{[h.b("group")]:s.prepend||s.append,[h.m("prefix")]:s.prefix||r.prefixIcon,[h.m("suffix")]:s.suffix||r.suffixIcon||r.clearable||r.showPassword,[h.bm("suffix","password-clear")]:ye.value&&Ne.value,[h.b("hidden")]:r.type==="hidden"},o.class]),l=T(()=>[h.e("wrapper"),h.is("focus",x.value)]),u=yT({excludeKeys:T(()=>Object.keys(i.value))}),{form:c,formItem:f}=Rr(),{inputId:d}=Js(r,{formItemContext:f}),v=yn(),p=Ho(),h=$e("input"),y=$e("textarea"),g=_r(),_=_r(),E=z(!1),S=z(!1),b=z(),O=_r(r.inputStyle),A=T(()=>g.value||_.value),{wrapperRef:P,isFocused:x,handleFocus:M,handleBlur:U}=Mm(A,{beforeFocus(){return p.value},afterBlur(){var L;r.validateEvent&&((L=f==null?void 0:f.validate)==null||L.call(f,"blur").catch(ae=>void 0))}}),N=T(()=>{var L;return(L=c==null?void 0:c.statusIcon)!=null?L:!1}),D=T(()=>(f==null?void 0:f.validateState)||""),Z=T(()=>D.value&&hm[D.value]),I=T(()=>S.value?iT:JC),R=T(()=>[o.style]),H=T(()=>[r.inputStyle,O.value,{resize:r.resize}]),re=T(()=>Pn(r.modelValue)?"":String(r.modelValue)),ye=T(()=>r.clearable&&!p.value&&!r.readonly&&!!re.value&&(x.value||E.value)),Ne=T(()=>r.showPassword&&!p.value&&!r.readonly&&!!re.value&&(!!re.value||x.value)),Me=T(()=>r.showWordLimit&&!!r.maxlength&&(r.type==="text"||r.type==="textarea")&&!p.value&&!r.readonly&&!r.showPassword),Pe=T(()=>re.value.length),Ce=T(()=>!!Me.value&&Pe.value>Number(r.maxlength)),We=T(()=>!!s.suffix||!!r.suffixIcon||ye.value||r.showPassword||Me.value||!!D.value&&N.value),[qe,Ee]=jO(g);Ft(_,L=>{if(W(),!Me.value||r.resize!=="both")return;const ae=L[0],{width:Se}=ae.contentRect;b.value={right:`calc(100% - ${Se+15+6}px)`}});const F=()=>{const{type:L,autosize:ae}=r;if(!(!ot||L!=="textarea"||!_.value))if(ae){const Se=xe(ae)?ae.minRows:void 0,De=xe(ae)?ae.maxRows:void 0,Le=sp(_.value,Se,De);O.value={overflowY:"hidden",...Le},ze(()=>{_.value.offsetHeight,O.value=Le})}else O.value={minHeight:sp(_.value).minHeight}},W=(L=>{let ae=!1;return()=>{var Se;if(ae||!r.autosize)return;((Se=_.value)==null?void 0:Se.offsetParent)===null||(L(),ae=!0)}})(F),te=()=>{const L=A.value,ae=r.formatter?r.formatter(re.value):re.value;!L||L.value===ae||(L.value=ae)},be=async L=>{qe();let{value:ae}=L.target;if(r.formatter&&(ae=r.parser?r.parser(ae):ae),!w.value){if(ae===re.value){te();return}n(rt,ae),n("input",ae),await ze(),te(),Ee()}},Te=L=>{n("change",L.target.value)},{isComposing:w,handleCompositionStart:C,handleCompositionUpdate:k,handleCompositionEnd:G}=Fm({emit:n,afterComposition:be}),K=()=>{S.value=!S.value,Y()},Y=async()=>{var L;await ze(),(L=A.value)==null||L.focus()},oe=()=>{var L;return(L=A.value)==null?void 0:L.blur()},ee=L=>{E.value=!1,n("mouseleave",L)},ne=L=>{E.value=!0,n("mouseenter",L)},X=L=>{n("keydown",L)},we=()=>{var L;(L=A.value)==null||L.select()},se=()=>{n(rt,""),n("change",""),n("clear"),n("input","")};return me(()=>r.modelValue,()=>{var L;ze(()=>F()),r.validateEvent&&((L=f==null?void 0:f.validate)==null||L.call(f,"change").catch(ae=>void 0))}),me(re,()=>te()),me(()=>r.type,async()=>{await ze(),te(),F()}),Ue(()=>{!r.formatter&&r.parser,te(),ze(F)}),t({input:g,textarea:_,ref:A,textareaStyle:H,autosize:Zt(r,"autosize"),isComposing:w,focus:Y,blur:oe,select:we,clear:se,resizeTextarea:F}),(L,ae)=>($(),Q("div",hn(m(i),{class:[m(a),{[m(h).bm("group","append")]:L.$slots.append,[m(h).bm("group","prepend")]:L.$slots.prepend}],style:m(R),role:L.containerRole,onMouseenter:ne,onMouseleave:ee}),[ue(" input "),L.type!=="textarea"?($(),Q(et,{key:0},[ue(" prepend slot "),L.$slots.prepend?($(),Q("div",{key:0,class:q(m(h).be("group","prepend"))},[de(L.$slots,"prepend")],2)):ue("v-if",!0),fe("div",{ref_key:"wrapperRef",ref:P,class:q(m(l))},[ue(" prefix slot "),L.$slots.prefix||L.prefixIcon?($(),Q("span",{key:0,class:q(m(h).e("prefix"))},[fe("span",{class:q(m(h).e("prefix-inner"))},[de(L.$slots,"prefix"),L.prefixIcon?($(),pe(m(tt),{key:0,class:q(m(h).e("icon"))},{default:ve(()=>[($(),pe(at(L.prefixIcon)))]),_:1},8,["class"])):ue("v-if",!0)],2)],2)):ue("v-if",!0),fe("input",hn({id:m(d),ref_key:"input",ref:g,class:m(h).e("inner")},m(u),{minlength:L.minlength,maxlength:L.maxlength,type:L.showPassword?S.value?"text":"password":L.type,disabled:m(p),readonly:L.readonly,autocomplete:L.autocomplete,tabindex:L.tabindex,"aria-label":L.ariaLabel,placeholder:L.placeholder,style:L.inputStyle,form:L.form,autofocus:L.autofocus,onCompositionstart:m(C),onCompositionupdate:m(k),onCompositionend:m(G),onInput:be,onChange:Te,onKeydown:X}),null,16,["id","minlength","maxlength","type","disabled","readonly","autocomplete","tabindex","aria-label","placeholder","form","autofocus","onCompositionstart","onCompositionupdate","onCompositionend"]),ue(" suffix slot "),m(We)?($(),Q("span",{key:1,class:q(m(h).e("suffix"))},[fe("span",{class:q(m(h).e("suffix-inner"))},[!m(ye)||!m(Ne)||!m(Me)?($(),Q(et,{key:0},[de(L.$slots,"suffix"),L.suffixIcon?($(),pe(m(tt),{key:0,class:q(m(h).e("icon"))},{default:ve(()=>[($(),pe(at(L.suffixIcon)))]),_:1},8,["class"])):ue("v-if",!0)],64)):ue("v-if",!0),m(ye)?($(),pe(m(tt),{key:1,class:q([m(h).e("icon"),m(h).e("clear")]),onMousedown:ut(m(pt),["prevent"]),onClick:se},{default:ve(()=>[ie(m(uc))]),_:1},8,["class","onMousedown"])):ue("v-if",!0),m(Ne)?($(),pe(m(tt),{key:2,class:q([m(h).e("icon"),m(h).e("password")]),onClick:K},{default:ve(()=>[($(),pe(at(m(I))))]),_:1},8,["class"])):ue("v-if",!0),m(Me)?($(),Q("span",{key:3,class:q(m(h).e("count"))},[fe("span",{class:q(m(h).e("count-inner"))},Je(m(Pe))+" / "+Je(L.maxlength),3)],2)):ue("v-if",!0),m(D)&&m(Z)&&m(N)?($(),pe(m(tt),{key:4,class:q([m(h).e("icon"),m(h).e("validateIcon"),m(h).is("loading",m(D)==="validating")])},{default:ve(()=>[($(),pe(at(m(Z))))]),_:1},8,["class"])):ue("v-if",!0)],2)],2)):ue("v-if",!0)],2),ue(" append slot "),L.$slots.append?($(),Q("div",{key:1,class:q(m(h).be("group","append"))},[de(L.$slots,"append")],2)):ue("v-if",!0)],64)):($(),Q(et,{key:1},[ue(" textarea "),fe("textarea",hn({id:m(d),ref_key:"textarea",ref:_,class:[m(y).e("inner"),m(h).is("focus",m(x))]},m(u),{minlength:L.minlength,maxlength:L.maxlength,tabindex:L.tabindex,disabled:m(p),readonly:L.readonly,autocomplete:L.autocomplete,style:m(H),"aria-label":L.ariaLabel,placeholder:L.placeholder,form:L.form,autofocus:L.autofocus,rows:L.rows,onCompositionstart:m(C),onCompositionupdate:m(k),onCompositionend:m(G),onInput:be,onFocus:m(M),onBlur:m(U),onChange:Te,onKeydown:X}),null,16,["id","minlength","maxlength","tabindex","disabled","readonly","autocomplete","aria-label","placeholder","form","autofocus","rows","onCompositionstart","onCompositionupdate","onCompositionend","onFocus","onBlur"]),m(Me)?($(),Q("span",{key:0,style:it(b.value),class:q(m(h).e("count"))},Je(m(Pe))+" / "+Je(L.maxlength),7)):ue("v-if",!0)],64))],16,["role"]))}});var Qx=ke(Zx,[["__file","input.vue"]]);const e4=gt(Qx),vo=4,t4={vertical:{offset:"offsetHeight",scroll:"scrollTop",scrollSize:"scrollHeight",size:"height",key:"vertical",axis:"Y",client:"clientY",direction:"top"},horizontal:{offset:"offsetWidth",scroll:"scrollLeft",scrollSize:"scrollWidth",size:"width",key:"horizontal",axis:"X",client:"clientX",direction:"left"}},n4=({move:e,size:t,bar:n})=>({[n.size]:t,transform:`translate${n.axis}(${e}%)`}),_c=Symbol("scrollbarContextKey"),r4=Re({vertical:Boolean,size:String,move:Number,ratio:{type:Number,required:!0},always:Boolean}),o4="Thumb",s4=J({__name:"thumb",props:r4,setup(e){const t=e,n=_e(_c),r=$e("scrollbar");n||xr(o4,"can not inject scrollbar context");const o=z(),s=z(),i=z({}),a=z(!1);let l=!1,u=!1,c=ot?document.onselectstart:null;const f=T(()=>t4[t.vertical?"vertical":"horizontal"]),d=T(()=>n4({size:t.size,move:t.move,bar:f.value})),v=T(()=>o.value[f.value.offset]**2/n.wrapElement[f.value.scrollSize]/t.ratio/s.value[f.value.offset]),p=O=>{var A;if(O.stopPropagation(),O.ctrlKey||[1,2].includes(O.button))return;(A=window.getSelection())==null||A.removeAllRanges(),y(O);const P=O.currentTarget;P&&(i.value[f.value.axis]=P[f.value.offset]-(O[f.value.client]-P.getBoundingClientRect()[f.value.direction]))},h=O=>{if(!s.value||!o.value||!n.wrapElement)return;const A=Math.abs(O.target.getBoundingClientRect()[f.value.direction]-O[f.value.client]),P=s.value[f.value.offset]/2,x=(A-P)*100*v.value/o.value[f.value.offset];n.wrapElement[f.value.scroll]=x*n.wrapElement[f.value.scrollSize]/100},y=O=>{O.stopImmediatePropagation(),l=!0,document.addEventListener("mousemove",g),document.addEventListener("mouseup",_),c=document.onselectstart,document.onselectstart=()=>!1},g=O=>{if(!o.value||!s.value||l===!1)return;const A=i.value[f.value.axis];if(!A)return;const P=(o.value.getBoundingClientRect()[f.value.direction]-O[f.value.client])*-1,x=s.value[f.value.offset]-A,M=(P-x)*100*v.value/o.value[f.value.offset];n.wrapElement[f.value.scroll]=M*n.wrapElement[f.value.scrollSize]/100},_=()=>{l=!1,i.value[f.value.axis]=0,document.removeEventListener("mousemove",g),document.removeEventListener("mouseup",_),b(),u&&(a.value=!1)},E=()=>{u=!1,a.value=!!t.size},S=()=>{u=!0,a.value=l};Ct(()=>{b(),document.removeEventListener("mouseup",_)});const b=()=>{document.onselectstart!==c&&(document.onselectstart=c)};return Gt(Zt(n,"scrollbarElement"),"mousemove",E),Gt(Zt(n,"scrollbarElement"),"mouseleave",S),(O,A)=>($(),pe(io,{name:m(r).b("fade"),persisted:""},{default:ve(()=>[ht(fe("div",{ref_key:"instance",ref:o,class:q([m(r).e("bar"),m(r).is(m(f).key)]),onMousedown:h},[fe("div",{ref_key:"thumb",ref:s,class:q(m(r).e("thumb")),style:it(m(d)),onMousedown:p},null,38)],34),[[Mn,O.always||a.value]])]),_:1},8,["name"]))}});var ip=ke(s4,[["__file","thumb.vue"]]);const i4=Re({always:{type:Boolean,default:!0},minSize:{type:Number,required:!0}}),a4=J({__name:"bar",props:i4,setup(e,{expose:t}){const n=e,r=_e(_c),o=z(0),s=z(0),i=z(""),a=z(""),l=z(1),u=z(1);return t({handleScroll:d=>{if(d){const v=d.offsetHeight-vo,p=d.offsetWidth-vo;s.value=d.scrollTop*100/v*l.value,o.value=d.scrollLeft*100/p*u.value}},update:()=>{const d=r==null?void 0:r.wrapElement;if(!d)return;const v=d.offsetHeight-vo,p=d.offsetWidth-vo,h=v**2/d.scrollHeight,y=p**2/d.scrollWidth,g=Math.max(h,n.minSize),_=Math.max(y,n.minSize);l.value=h/(v-h)/(g/(v-g)),u.value=y/(p-y)/(_/(p-_)),a.value=g+vo($(),Q(et,null,[ie(ip,{move:o.value,ratio:u.value,size:i.value,always:d.always},null,8,["move","ratio","size","always"]),ie(ip,{move:s.value,ratio:l.value,size:a.value,vertical:"",always:d.always},null,8,["move","ratio","size","always"])],64))}});var l4=ke(a4,[["__file","bar.vue"]]);const u4=Re({height:{type:[String,Number],default:""},maxHeight:{type:[String,Number],default:""},native:{type:Boolean,default:!1},wrapStyle:{type:ge([String,Object,Array]),default:""},wrapClass:{type:[String,Array],default:""},viewClass:{type:[String,Array],default:""},viewStyle:{type:[String,Array,Object],default:""},noresize:Boolean,tag:{type:String,default:"div"},always:Boolean,minSize:{type:Number,default:20},tabindex:{type:[String,Number],default:void 0},id:String,role:String,...nr(["ariaLabel","ariaOrientation"])}),c4={scroll:({scrollTop:e,scrollLeft:t})=>[e,t].every(Ve)},f4="ElScrollbar",d4=J({name:f4}),p4=J({...d4,props:u4,emits:c4,setup(e,{expose:t,emit:n}){const r=e,o=$e("scrollbar");let s,i,a=0,l=0;const u=z(),c=z(),f=z(),d=z(),v=T(()=>{const b={};return r.height&&(b.height=on(r.height)),r.maxHeight&&(b.maxHeight=on(r.maxHeight)),[r.wrapStyle,b]}),p=T(()=>[r.wrapClass,o.e("wrap"),{[o.em("wrap","hidden-default")]:!r.native}]),h=T(()=>[o.e("view"),r.viewClass]),y=()=>{var b;c.value&&((b=d.value)==null||b.handleScroll(c.value),a=c.value.scrollTop,l=c.value.scrollLeft,n("scroll",{scrollTop:c.value.scrollTop,scrollLeft:c.value.scrollLeft}))};function g(b,O){xe(b)?c.value.scrollTo(b):Ve(b)&&Ve(O)&&c.value.scrollTo(b,O)}const _=b=>{Ve(b)&&(c.value.scrollTop=b)},E=b=>{Ve(b)&&(c.value.scrollLeft=b)},S=()=>{var b;(b=d.value)==null||b.update()};return me(()=>r.noresize,b=>{b?(s==null||s(),i==null||i()):({stop:s}=Ft(f,S),i=Gt("resize",S))},{immediate:!0}),me(()=>[r.maxHeight,r.height],()=>{r.native||ze(()=>{var b;S(),c.value&&((b=d.value)==null||b.handleScroll(c.value))})}),ct(_c,Et({scrollbarElement:u,wrapElement:c})),Vu(()=>{c.value.scrollTop=a,c.value.scrollLeft=l}),Ue(()=>{r.native||ze(()=>{S()})}),ro(()=>S()),t({wrapRef:c,update:S,scrollTo:g,setScrollTop:_,setScrollLeft:E,handleScroll:y}),(b,O)=>($(),Q("div",{ref_key:"scrollbarRef",ref:u,class:q(m(o).b())},[fe("div",{ref_key:"wrapRef",ref:c,class:q(m(p)),style:it(m(v)),tabindex:b.tabindex,onScroll:y},[($(),pe(at(b.tag),{id:b.id,ref_key:"resizeRef",ref:f,class:q(m(h)),style:it(b.viewStyle),role:b.role,"aria-label":b.ariaLabel,"aria-orientation":b.ariaOrientation},{default:ve(()=>[de(b.$slots,"default")]),_:3},8,["id","class","style","role","aria-label","aria-orientation"]))],46,["tabindex"]),b.native?ue("v-if",!0):($(),pe(l4,{key:0,ref_key:"barRef",ref:d,always:b.always,"min-size":b.minSize},null,8,["always","min-size"]))],2))}});var h4=ke(p4,[["__file","scrollbar.vue"]]);const v4=gt(h4),Sc=Symbol("popper"),Km=Symbol("popperContent"),m4=["dialog","grid","group","listbox","menu","navigation","tooltip","tree"],Um=Re({role:{type:String,values:m4,default:"tooltip"}}),g4=J({name:"ElPopper",inheritAttrs:!1}),y4=J({...g4,props:Um,setup(e,{expose:t}){const n=e,r=z(),o=z(),s=z(),i=z(),a=T(()=>n.role),l={triggerRef:r,popperInstanceRef:o,contentRef:s,referenceRef:i,role:a};return t(l),ct(Sc,l),(u,c)=>de(u.$slots,"default")}});var b4=ke(y4,[["__file","popper.vue"]]);const qm=Re({arrowOffset:{type:Number,default:5}}),w4=J({name:"ElPopperArrow",inheritAttrs:!1}),_4=J({...w4,props:qm,setup(e,{expose:t}){const n=e,r=$e("popper"),{arrowOffset:o,arrowRef:s,arrowStyle:i}=_e(Km,void 0);return me(()=>n.arrowOffset,a=>{o.value=a}),Ct(()=>{s.value=void 0}),t({arrowRef:s}),(a,l)=>($(),Q("span",{ref_key:"arrowRef",ref:s,class:q(m(r).e("arrow")),style:it(m(i)),"data-popper-arrow":""},null,6))}});var S4=ke(_4,[["__file","arrow.vue"]]);const E4="ElOnlyChild",C4=J({name:E4,setup(e,{slots:t,attrs:n}){var r;const o=_e($m),s=VO((r=o==null?void 0:o.setForwardRef)!=null?r:pt);return()=>{var i;const a=(i=t.default)==null?void 0:i.call(t,n);if(!a||a.length>1)return null;const l=Wm(a);return l?ht(Jn(l,n),[[s]]):null}}});function Wm(e){if(!e)return null;const t=e;for(const n of t){if(xe(n))switch(n.type){case At:continue;case Do:case"svg":return ap(n);case et:return Wm(n.children);default:return n}return ap(n)}return null}function ap(e){const t=$e("only-child");return ie("span",{class:t.e("content")},[e])}const Gm=Re({virtualRef:{type:ge(Object)},virtualTriggering:Boolean,onMouseenter:{type:ge(Function)},onMouseleave:{type:ge(Function)},onClick:{type:ge(Function)},onKeydown:{type:ge(Function)},onFocus:{type:ge(Function)},onBlur:{type:ge(Function)},onContextmenu:{type:ge(Function)},id:String,open:Boolean}),T4=J({name:"ElPopperTrigger",inheritAttrs:!1}),O4=J({...T4,props:Gm,setup(e,{expose:t}){const n=e,{role:r,triggerRef:o}=_e(Sc,void 0);DO(o);const s=T(()=>a.value?n.id:void 0),i=T(()=>{if(r&&r.value==="tooltip")return n.open&&n.id?n.id:void 0}),a=T(()=>{if(r&&r.value!=="tooltip")return r.value}),l=T(()=>a.value?`${n.open}`:void 0);let u;const c=["onMouseenter","onMouseleave","onClick","onKeydown","onFocus","onBlur","onContextmenu"];return Ue(()=>{me(()=>n.virtualRef,f=>{f&&(o.value=qn(f))},{immediate:!0}),me(o,(f,d)=>{u==null||u(),u=void 0,Ur(f)&&(c.forEach(v=>{var p;const h=n[v];h&&(f.addEventListener(v.slice(2).toLowerCase(),h),(p=d==null?void 0:d.removeEventListener)==null||p.call(d,v.slice(2).toLowerCase(),h))}),u=me([s,i,a,l],v=>{["aria-controls","aria-describedby","aria-haspopup","aria-expanded"].forEach((p,h)=>{Pn(v[h])?f.removeAttribute(p):f.setAttribute(p,v[h])})},{immediate:!0})),Ur(d)&&["aria-controls","aria-describedby","aria-haspopup","aria-expanded"].forEach(v=>d.removeAttribute(v))},{immediate:!0})}),Ct(()=>{if(u==null||u(),u=void 0,o.value&&Ur(o.value)){const f=o.value;c.forEach(d=>{const v=n[d];v&&f.removeEventListener(d.slice(2).toLowerCase(),v)}),o.value=void 0}}),t({triggerRef:o}),(f,d)=>f.virtualTriggering?ue("v-if",!0):($(),pe(m(C4),hn({key:0},f.$attrs,{"aria-controls":m(s),"aria-describedby":m(i),"aria-expanded":m(l),"aria-haspopup":m(a)}),{default:ve(()=>[de(f.$slots,"default")]),_:3},16,["aria-controls","aria-describedby","aria-expanded","aria-haspopup"]))}});var x4=ke(O4,[["__file","trigger.vue"]]);const pl="focus-trap.focus-after-trapped",hl="focus-trap.focus-after-released",A4="focus-trap.focusout-prevented",lp={cancelable:!0,bubbles:!1},R4={cancelable:!0,bubbles:!1},up="focusAfterTrapped",cp="focusAfterReleased",Ym=Symbol("elFocusTrap"),Ec=z(),Fa=z(0),Cc=z(0);let gi=0;const Jm=e=>{const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const o=r.tagName==="INPUT"&&r.type==="hidden";return r.disabled||r.hidden||o?NodeFilter.FILTER_SKIP:r.tabIndex>=0||r===document.activeElement?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t},fp=(e,t)=>{for(const n of e)if(!P4(n,t))return n},P4=(e,t)=>{if(getComputedStyle(e).visibility==="hidden")return!0;for(;e;){if(t&&e===t)return!1;if(getComputedStyle(e).display==="none")return!0;e=e.parentElement}return!1},I4=e=>{const t=Jm(e),n=fp(t,e),r=fp(t.reverse(),e);return[n,r]},$4=e=>e instanceof HTMLInputElement&&"select"in e,fr=(e,t)=>{if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),Cc.value=window.performance.now(),e!==n&&$4(e)&&t&&e.select()}};function dp(e,t){const n=[...e],r=e.indexOf(t);return r!==-1&&n.splice(r,1),n}const k4=()=>{let e=[];return{push:r=>{const o=e[0];o&&r!==o&&o.pause(),e=dp(e,r),e.unshift(r)},remove:r=>{var o,s;e=dp(e,r),(s=(o=e[0])==null?void 0:o.resume)==null||s.call(o)}}},L4=(e,t=!1)=>{const n=document.activeElement;for(const r of e)if(fr(r,t),document.activeElement!==n)return},pp=k4(),N4=()=>Fa.value>Cc.value,yi=()=>{Ec.value="pointer",Fa.value=window.performance.now()},hp=()=>{Ec.value="keyboard",Fa.value=window.performance.now()},M4=()=>(Ue(()=>{gi===0&&(document.addEventListener("mousedown",yi),document.addEventListener("touchstart",yi),document.addEventListener("keydown",hp)),gi++}),Ct(()=>{gi--,gi<=0&&(document.removeEventListener("mousedown",yi),document.removeEventListener("touchstart",yi),document.removeEventListener("keydown",hp))}),{focusReason:Ec,lastUserFocusTimestamp:Fa,lastAutomatedFocusTimestamp:Cc}),bi=e=>new CustomEvent(A4,{...R4,detail:e}),F4=J({name:"ElFocusTrap",inheritAttrs:!1,props:{loop:Boolean,trapped:Boolean,focusTrapEl:Object,focusStartEl:{type:[Object,String],default:"first"}},emits:[up,cp,"focusin","focusout","focusout-prevented","release-requested"],setup(e,{emit:t}){const n=z();let r,o;const{focusReason:s}=M4();LO(p=>{e.trapped&&!i.paused&&t("release-requested",p)});const i={paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}},a=p=>{if(!e.loop&&!e.trapped||i.paused)return;const{key:h,altKey:y,ctrlKey:g,metaKey:_,currentTarget:E,shiftKey:S}=p,{loop:b}=e,O=h===In.tab&&!y&&!g&&!_,A=document.activeElement;if(O&&A){const P=E,[x,M]=I4(P);if(x&&M){if(!S&&A===M){const N=bi({focusReason:s.value});t("focusout-prevented",N),N.defaultPrevented||(p.preventDefault(),b&&fr(x,!0))}else if(S&&[x,P].includes(A)){const N=bi({focusReason:s.value});t("focusout-prevented",N),N.defaultPrevented||(p.preventDefault(),b&&fr(M,!0))}}else if(A===P){const N=bi({focusReason:s.value});t("focusout-prevented",N),N.defaultPrevented||p.preventDefault()}}};ct(Ym,{focusTrapRef:n,onKeydown:a}),me(()=>e.focusTrapEl,p=>{p&&(n.value=p)},{immediate:!0}),me([n],([p],[h])=>{p&&(p.addEventListener("keydown",a),p.addEventListener("focusin",c),p.addEventListener("focusout",f)),h&&(h.removeEventListener("keydown",a),h.removeEventListener("focusin",c),h.removeEventListener("focusout",f))});const l=p=>{t(up,p)},u=p=>t(cp,p),c=p=>{const h=m(n);if(!h)return;const y=p.target,g=p.relatedTarget,_=y&&h.contains(y);e.trapped||g&&h.contains(g)||(r=g),_&&t("focusin",p),!i.paused&&e.trapped&&(_?o=y:fr(o,!0))},f=p=>{const h=m(n);if(!(i.paused||!h))if(e.trapped){const y=p.relatedTarget;!Pn(y)&&!h.contains(y)&&setTimeout(()=>{if(!i.paused&&e.trapped){const g=bi({focusReason:s.value});t("focusout-prevented",g),g.defaultPrevented||fr(o,!0)}},0)}else{const y=p.target;y&&h.contains(y)||t("focusout",p)}};async function d(){await ze();const p=m(n);if(p){pp.push(i);const h=p.contains(document.activeElement)?r:document.activeElement;if(r=h,!p.contains(h)){const g=new Event(pl,lp);p.addEventListener(pl,l),p.dispatchEvent(g),g.defaultPrevented||ze(()=>{let _=e.focusStartEl;Oe(_)||(fr(_),document.activeElement!==_&&(_="first")),_==="first"&&L4(Jm(p),!0),(document.activeElement===h||_==="container")&&fr(p)})}}}function v(){const p=m(n);if(p){p.removeEventListener(pl,l);const h=new CustomEvent(hl,{...lp,detail:{focusReason:s.value}});p.addEventListener(hl,u),p.dispatchEvent(h),!h.defaultPrevented&&(s.value=="keyboard"||!N4()||p.contains(document.activeElement))&&fr(r??document.body),p.removeEventListener(hl,u),pp.remove(i)}}return Ue(()=>{e.trapped&&d(),me(()=>e.trapped,p=>{p?d():v()})}),Ct(()=>{e.trapped&&v(),n.value&&(n.value.removeEventListener("keydown",a),n.value.removeEventListener("focusin",c),n.value.removeEventListener("focusout",f),n.value=void 0)}),{onKeydown:a}}});function B4(e,t,n,r,o,s){return de(e.$slots,"default",{handleKeydown:e.onKeydown})}var Xm=ke(F4,[["render",B4],["__file","focus-trap.vue"]]);const D4=["fixed","absolute"],V4=Re({boundariesPadding:{type:Number,default:0},fallbackPlacements:{type:ge(Array),default:void 0},gpuAcceleration:{type:Boolean,default:!0},offset:{type:Number,default:12},placement:{type:String,values:La,default:"bottom"},popperOptions:{type:ge(Object),default:()=>({})},strategy:{type:String,values:D4,default:"absolute"}}),Zm=Re({...V4,id:String,style:{type:ge([String,Array,Object])},className:{type:ge([String,Array,Object])},effect:{type:ge(String),default:"dark"},visible:Boolean,enterable:{type:Boolean,default:!0},pure:Boolean,focusOnShow:{type:Boolean,default:!1},trapping:{type:Boolean,default:!1},popperClass:{type:ge([String,Array,Object])},popperStyle:{type:ge([String,Array,Object])},referenceEl:{type:ge(Object)},triggerTargetEl:{type:ge(Object)},stopPopperMouseEvent:{type:Boolean,default:!0},virtualTriggering:Boolean,zIndex:Number,...nr(["ariaLabel"])}),j4={mouseenter:e=>e instanceof MouseEvent,mouseleave:e=>e instanceof MouseEvent,focus:()=>!0,blur:()=>!0,close:()=>!0},z4=(e,t=[])=>{const{placement:n,strategy:r,popperOptions:o}=e,s={placement:n,strategy:r,...o,modifiers:[...K4(e),...t]};return U4(s,o==null?void 0:o.modifiers),s},H4=e=>{if(ot)return qn(e)};function K4(e){const{offset:t,gpuAcceleration:n,fallbackPlacements:r}=e;return[{name:"offset",options:{offset:[0,t??12]}},{name:"preventOverflow",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:"flip",options:{padding:5,fallbackPlacements:r}},{name:"computeStyles",options:{gpuAcceleration:n}}]}function U4(e,t){t&&(e.modifiers=[...e.modifiers,...t??[]])}const q4=0,W4=e=>{const{popperInstanceRef:t,contentRef:n,triggerRef:r,role:o}=_e(Sc,void 0),s=z(),i=z(),a=T(()=>({name:"eventListeners",enabled:!!e.visible})),l=T(()=>{var g;const _=m(s),E=(g=m(i))!=null?g:q4;return{name:"arrow",enabled:!rm(_),options:{element:_,padding:E}}}),u=T(()=>({onFirstUpdate:()=>{p()},...z4(e,[m(l),m(a)])})),c=T(()=>H4(e.referenceEl)||m(r)),{attributes:f,state:d,styles:v,update:p,forceUpdate:h,instanceRef:y}=IO(c,n,u);return me(y,g=>t.value=g),Ue(()=>{me(()=>{var g;return(g=m(c))==null?void 0:g.getBoundingClientRect()},()=>{p()})}),{attributes:f,arrowRef:s,contentRef:n,instanceRef:y,state:d,styles:v,role:o,forceUpdate:h,update:p}},G4=(e,{attributes:t,styles:n,role:r})=>{const{nextZIndex:o}=wc(),s=$e("popper"),i=T(()=>m(t).popper),a=z(Ve(e.zIndex)?e.zIndex:o()),l=T(()=>[s.b(),s.is("pure",e.pure),s.is(e.effect),e.popperClass]),u=T(()=>[{zIndex:m(a)},m(n).popper,e.popperStyle||{}]),c=T(()=>r.value==="dialog"?"false":void 0),f=T(()=>m(n).arrow||{});return{ariaModal:c,arrowStyle:f,contentAttrs:i,contentClass:l,contentStyle:u,contentZIndex:a,updateZIndex:()=>{a.value=Ve(e.zIndex)?e.zIndex:o()}}},Y4=(e,t)=>{const n=z(!1),r=z();return{focusStartRef:r,trapped:n,onFocusAfterReleased:u=>{var c;((c=u.detail)==null?void 0:c.focusReason)!=="pointer"&&(r.value="first",t("blur"))},onFocusAfterTrapped:()=>{t("focus")},onFocusInTrap:u=>{e.visible&&!n.value&&(u.target&&(r.value=u.target),n.value=!0)},onFocusoutPrevented:u=>{e.trapping||(u.detail.focusReason==="pointer"&&u.preventDefault(),n.value=!1)},onReleaseRequested:()=>{n.value=!1,t("close")}}},J4=J({name:"ElPopperContent"}),X4=J({...J4,props:Zm,emits:j4,setup(e,{expose:t,emit:n}){const r=e,{focusStartRef:o,trapped:s,onFocusAfterReleased:i,onFocusAfterTrapped:a,onFocusInTrap:l,onFocusoutPrevented:u,onReleaseRequested:c}=Y4(r,n),{attributes:f,arrowRef:d,contentRef:v,styles:p,instanceRef:h,role:y,update:g}=W4(r),{ariaModal:_,arrowStyle:E,contentAttrs:S,contentClass:b,contentStyle:O,updateZIndex:A}=G4(r,{styles:p,attributes:f,role:y}),P=_e(to,void 0),x=z();ct(Km,{arrowStyle:E,arrowRef:d,arrowOffset:x}),P&&ct(to,{...P,addInputId:pt,removeInputId:pt});let M;const U=(D=!0)=>{g(),D&&A()},N=()=>{U(!1),r.visible&&r.focusOnShow?s.value=!0:r.visible===!1&&(s.value=!1)};return Ue(()=>{me(()=>r.triggerTargetEl,(D,Z)=>{M==null||M(),M=void 0;const I=m(D||v.value),R=m(Z||v.value);Ur(I)&&(M=me([y,()=>r.ariaLabel,_,()=>r.id],H=>{["role","aria-label","aria-modal","id"].forEach((re,ye)=>{Pn(H[ye])?I.removeAttribute(re):I.setAttribute(re,H[ye])})},{immediate:!0})),R!==I&&Ur(R)&&["role","aria-label","aria-modal","id"].forEach(H=>{R.removeAttribute(H)})},{immediate:!0}),me(()=>r.visible,N,{immediate:!0})}),Ct(()=>{M==null||M(),M=void 0}),t({popperContentRef:v,popperInstanceRef:h,updatePopper:U,contentStyle:O}),(D,Z)=>($(),Q("div",hn({ref_key:"contentRef",ref:v},m(S),{style:m(O),class:m(b),tabindex:"-1",onMouseenter:I=>D.$emit("mouseenter",I),onMouseleave:I=>D.$emit("mouseleave",I)}),[ie(m(Xm),{trapped:m(s),"trap-on-focus-in":!0,"focus-trap-el":m(v),"focus-start-el":m(o),onFocusAfterTrapped:m(a),onFocusAfterReleased:m(i),onFocusin:m(l),onFocusoutPrevented:m(u),onReleaseRequested:m(c)},{default:ve(()=>[de(D.$slots,"default")]),_:3},8,["trapped","focus-trap-el","focus-start-el","onFocusAfterTrapped","onFocusAfterReleased","onFocusin","onFocusoutPrevented","onReleaseRequested"])],16,["onMouseenter","onMouseleave"]))}});var Z4=ke(X4,[["__file","content.vue"]]);const Q4=gt(b4),Tc=Symbol("elTooltip"),Ut=Re({...FO,...Zm,appendTo:{type:ge([String,Object])},content:{type:String,default:""},rawContent:Boolean,persistent:Boolean,visible:{type:ge(Boolean),default:null},transition:String,teleported:{type:Boolean,default:!0},disabled:Boolean,...nr(["ariaLabel"])}),Ms=Re({...Gm,disabled:Boolean,trigger:{type:ge([String,Array]),default:"hover"},triggerKeys:{type:ge(Array),default:()=>[In.enter,In.space]}}),{useModelToggleProps:eA,useModelToggleEmits:tA,useModelToggle:nA}=AT("visible"),rA=Re({...Um,...eA,...Ut,...Ms,...qm,showArrow:{type:Boolean,default:!0}}),oA=[...tA,"before-show","before-hide","show","hide","open","close"],sA=(e,t)=>ce(e)?e.includes(t):e===t,mo=(e,t,n)=>r=>{sA(m(e),t)&&n(r)},iA=J({name:"ElTooltipTrigger"}),aA=J({...iA,props:Ms,setup(e,{expose:t}){const n=e,r=$e("tooltip"),{controlled:o,id:s,open:i,onOpen:a,onClose:l,onToggle:u}=_e(Tc,void 0),c=z(null),f=()=>{if(m(o)||n.disabled)return!0},d=Zt(n,"trigger"),v=zn(f,mo(d,"hover",a)),p=zn(f,mo(d,"hover",l)),h=zn(f,mo(d,"click",S=>{S.button===0&&u(S)})),y=zn(f,mo(d,"focus",a)),g=zn(f,mo(d,"focus",l)),_=zn(f,mo(d,"contextmenu",S=>{S.preventDefault(),u(S)})),E=zn(f,S=>{const{code:b}=S;n.triggerKeys.includes(b)&&(S.preventDefault(),u(S))});return t({triggerRef:c}),(S,b)=>($(),pe(m(x4),{id:m(s),"virtual-ref":S.virtualRef,open:m(i),"virtual-triggering":S.virtualTriggering,class:q(m(r).e("trigger")),onBlur:m(g),onClick:m(h),onContextmenu:m(_),onFocus:m(y),onMouseenter:m(v),onMouseleave:m(p),onKeydown:m(E)},{default:ve(()=>[de(S.$slots,"default")]),_:3},8,["id","virtual-ref","open","virtual-triggering","class","onBlur","onClick","onContextmenu","onFocus","onMouseenter","onMouseleave","onKeydown"]))}});var lA=ke(aA,[["__file","trigger.vue"]]);const uA=Re({to:{type:ge([String,Object]),required:!0},disabled:Boolean}),cA=J({__name:"teleport",props:uA,setup(e){return(t,n)=>t.disabled?de(t.$slots,"default",{key:0}):($(),pe(ib,{key:1,to:t.to},[de(t.$slots,"default")],8,["to"]))}});var fA=ke(cA,[["__file","teleport.vue"]]);const Qm=gt(fA),dA=J({name:"ElTooltipContent",inheritAttrs:!1}),pA=J({...dA,props:Ut,setup(e,{expose:t}){const n=e,{selector:r}=Im(),o=$e("tooltip"),s=z(null);let i;const{controlled:a,id:l,open:u,trigger:c,onClose:f,onOpen:d,onShow:v,onHide:p,onBeforeShow:h,onBeforeHide:y}=_e(Tc,void 0),g=T(()=>n.transition||`${o.namespace.value}-fade-in-linear`),_=T(()=>n.persistent);Ct(()=>{i==null||i()});const E=T(()=>m(_)?!0:m(u)),S=T(()=>n.disabled?!1:m(u)),b=T(()=>n.appendTo||r.value),O=T(()=>{var R;return(R=n.style)!=null?R:{}}),A=z(!0),P=()=>{p(),A.value=!0},x=()=>{if(m(a))return!0},M=zn(x,()=>{n.enterable&&m(c)==="hover"&&d()}),U=zn(x,()=>{m(c)==="hover"&&f()}),N=()=>{var R,H;(H=(R=s.value)==null?void 0:R.updatePopper)==null||H.call(R),h==null||h()},D=()=>{y==null||y()},Z=()=>{v(),i=l1(T(()=>{var R;return(R=s.value)==null?void 0:R.popperContentRef}),()=>{if(m(a))return;m(c)!=="hover"&&f()})},I=()=>{n.virtualTriggering||f()};return me(()=>m(u),R=>{R?A.value=!1:i==null||i()},{flush:"post"}),me(()=>n.content,()=>{var R,H;(H=(R=s.value)==null?void 0:R.updatePopper)==null||H.call(R)}),t({contentRef:s}),(R,H)=>($(),pe(m(Qm),{disabled:!R.teleported,to:m(b)},{default:ve(()=>[ie(io,{name:m(g),onAfterLeave:P,onBeforeEnter:N,onAfterEnter:Z,onBeforeLeave:D},{default:ve(()=>[m(E)?ht(($(),pe(m(Z4),hn({key:0,id:m(l),ref_key:"contentRef",ref:s},R.$attrs,{"aria-label":R.ariaLabel,"aria-hidden":A.value,"boundaries-padding":R.boundariesPadding,"fallback-placements":R.fallbackPlacements,"gpu-acceleration":R.gpuAcceleration,offset:R.offset,placement:R.placement,"popper-options":R.popperOptions,strategy:R.strategy,effect:R.effect,enterable:R.enterable,pure:R.pure,"popper-class":R.popperClass,"popper-style":[R.popperStyle,m(O)],"reference-el":R.referenceEl,"trigger-target-el":R.triggerTargetEl,visible:m(S),"z-index":R.zIndex,onMouseenter:m(M),onMouseleave:m(U),onBlur:I,onClose:m(f)}),{default:ve(()=>[de(R.$slots,"default")]),_:3},16,["id","aria-label","aria-hidden","boundaries-padding","fallback-placements","gpu-acceleration","offset","placement","popper-options","strategy","effect","enterable","pure","popper-class","popper-style","reference-el","trigger-target-el","visible","z-index","onMouseenter","onMouseleave","onClose"])),[[Mn,m(S)]]):ue("v-if",!0)]),_:3},8,["name"])]),_:3},8,["disabled","to"]))}});var hA=ke(pA,[["__file","content.vue"]]);const vA=J({name:"ElTooltip"}),mA=J({...vA,props:rA,emits:oA,setup(e,{expose:t,emit:n}){const r=e;MO();const o=eo(),s=z(),i=z(),a=()=>{var g;const _=m(s);_&&((g=_.popperInstanceRef)==null||g.update())},l=z(!1),u=z(),{show:c,hide:f,hasUpdateHandler:d}=nA({indicator:l,toggleReason:u}),{onOpen:v,onClose:p}=BO({showAfter:Zt(r,"showAfter"),hideAfter:Zt(r,"hideAfter"),autoClose:Zt(r,"autoClose"),open:c,close:f}),h=T(()=>Nt(r.visible)&&!d.value);ct(Tc,{controlled:h,id:o,open:zs(l),trigger:Zt(r,"trigger"),onOpen:g=>{v(g)},onClose:g=>{p(g)},onToggle:g=>{m(l)?p(g):v(g)},onShow:()=>{n("show",u.value)},onHide:()=>{n("hide",u.value)},onBeforeShow:()=>{n("before-show",u.value)},onBeforeHide:()=>{n("before-hide",u.value)},updatePopper:a}),me(()=>r.disabled,g=>{g&&l.value&&(l.value=!1)});const y=g=>{var _,E;const S=(E=(_=i.value)==null?void 0:_.contentRef)==null?void 0:E.popperContentRef,b=(g==null?void 0:g.relatedTarget)||document.activeElement;return S&&S.contains(b)};return Nh(()=>l.value&&f()),t({popperRef:s,contentRef:i,isFocusInsideContent:y,updatePopper:a,onOpen:v,onClose:p,hide:f}),(g,_)=>($(),pe(m(Q4),{ref_key:"popperRef",ref:s,role:g.role},{default:ve(()=>[ie(lA,{disabled:g.disabled,trigger:g.trigger,"trigger-keys":g.triggerKeys,"virtual-ref":g.virtualRef,"virtual-triggering":g.virtualTriggering},{default:ve(()=>[g.$slots.default?de(g.$slots,"default",{key:0}):ue("v-if",!0)]),_:3},8,["disabled","trigger","trigger-keys","virtual-ref","virtual-triggering"]),ie(hA,{ref_key:"contentRef",ref:i,"aria-label":g.ariaLabel,"boundaries-padding":g.boundariesPadding,content:g.content,disabled:g.disabled,effect:g.effect,enterable:g.enterable,"fallback-placements":g.fallbackPlacements,"hide-after":g.hideAfter,"gpu-acceleration":g.gpuAcceleration,offset:g.offset,persistent:g.persistent,"popper-class":g.popperClass,"popper-style":g.popperStyle,placement:g.placement,"popper-options":g.popperOptions,pure:g.pure,"raw-content":g.rawContent,"reference-el":g.referenceEl,"trigger-target-el":g.triggerTargetEl,"show-after":g.showAfter,strategy:g.strategy,teleported:g.teleported,transition:g.transition,"virtual-triggering":g.virtualTriggering,"z-index":g.zIndex,"append-to":g.appendTo},{default:ve(()=>[de(g.$slots,"content",{},()=>[g.rawContent?($(),Q("span",{key:0,innerHTML:g.content},null,8,["innerHTML"])):($(),Q("span",{key:1},Je(g.content),1))]),g.showArrow?($(),pe(m(S4),{key:0,"arrow-offset":g.arrowOffset},null,8,["arrow-offset"])):ue("v-if",!0)]),_:3},8,["aria-label","boundaries-padding","content","disabled","effect","enterable","fallback-placements","hide-after","gpu-acceleration","offset","persistent","popper-class","popper-style","placement","popper-options","pure","raw-content","reference-el","trigger-target-el","show-after","strategy","teleported","transition","virtual-triggering","z-index","append-to"])]),_:3},8,["role"]))}});var gA=ke(mA,[["__file","tooltip.vue"]]);const eg=gt(gA),yA=Re({value:{type:[String,Number],default:""},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:["primary","success","warning","info","danger"],default:"danger"},showZero:{type:Boolean,default:!0},color:String,badgeStyle:{type:ge([String,Object,Array])},offset:{type:ge(Array),default:[0,0]},badgeClass:{type:String}}),bA=J({name:"ElBadge"}),wA=J({...bA,props:yA,setup(e,{expose:t}){const n=e,r=$e("badge"),o=T(()=>n.isDot?"":Ve(n.value)&&Ve(n.max)?n.max{var i,a,l,u,c;return[{backgroundColor:n.color,marginRight:on(-((a=(i=n.offset)==null?void 0:i[0])!=null?a:0)),marginTop:on((u=(l=n.offset)==null?void 0:l[1])!=null?u:0)},(c=n.badgeStyle)!=null?c:{}]});return t({content:o}),(i,a)=>($(),Q("div",{class:q(m(r).b())},[de(i.$slots,"default"),ie(io,{name:`${m(r).namespace.value}-zoom-in-center`,persisted:""},{default:ve(()=>[ht(fe("sup",{class:q([m(r).e("content"),m(r).em("content",i.type),m(r).is("fixed",!!i.$slots.default),m(r).is("dot",i.isDot),i.badgeClass]),style:it(m(s)),textContent:Je(m(o))},null,14,["textContent"]),[[Mn,!i.hidden&&(m(o)||i.isDot)]])]),_:1},8,["name"])],2))}});var _A=ke(wA,[["__file","badge.vue"]]);const SA=gt(_A),tg=Symbol("buttonGroupContextKey"),EA=(e,t)=>{ds({from:"type.text",replacement:"link",version:"3.0.0",scope:"props",ref:"https://element-plus.org/en-US/component/button.html#button-attributes"},T(()=>e.type==="text"));const n=_e(tg,void 0),r=Ma("button"),{form:o}=Rr(),s=yn(T(()=>n==null?void 0:n.size)),i=Ho(),a=z(),l=so(),u=T(()=>e.type||(n==null?void 0:n.type)||""),c=T(()=>{var p,h,y;return(y=(h=e.autoInsertSpace)!=null?h:(p=r.value)==null?void 0:p.autoInsertSpace)!=null?y:!1}),f=T(()=>e.tag==="button"?{ariaDisabled:i.value||e.loading,disabled:i.value||e.loading,autofocus:e.autofocus,type:e.nativeType}:{}),d=T(()=>{var p;const h=(p=l.default)==null?void 0:p.call(l);if(c.value&&(h==null?void 0:h.length)===1){const y=h[0];if((y==null?void 0:y.type)===Do){const g=y.children;return new RegExp("^\\p{Unified_Ideograph}{2}$","u").test(g.trim())}}return!1});return{_disabled:i,_size:s,_type:u,_ref:a,_props:f,shouldAddSpace:d,handleClick:p=>{if(i.value||e.loading){p.stopPropagation();return}e.nativeType==="reset"&&(o==null||o.resetFields()),t("click",p)}}},CA=["default","primary","success","warning","info","danger","text",""],TA=["button","submit","reset"],su=Re({size:co,disabled:Boolean,type:{type:String,values:CA,default:""},icon:{type:Bt},nativeType:{type:String,values:TA,default:"button"},loading:Boolean,loadingIcon:{type:Bt,default:()=>cc},plain:Boolean,text:Boolean,link:Boolean,bg:Boolean,autofocus:Boolean,round:Boolean,circle:Boolean,color:String,dark:Boolean,autoInsertSpace:{type:Boolean,default:void 0},tag:{type:ge([String,Object]),default:"button"}}),OA={click:e=>e instanceof MouseEvent};function St(e,t){xA(e)&&(e="100%");var n=AA(e);return e=t===360?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:(t===360?e=(e<0?e%t+t:e%t)/parseFloat(String(t)):e=e%t/parseFloat(String(t)),e)}function wi(e){return Math.min(1,Math.max(0,e))}function xA(e){return typeof e=="string"&&e.indexOf(".")!==-1&&parseFloat(e)===1}function AA(e){return typeof e=="string"&&e.indexOf("%")!==-1}function ng(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function _i(e){return e<=1?"".concat(Number(e)*100,"%"):e}function jr(e){return e.length===1?"0"+e:String(e)}function RA(e,t,n){return{r:St(e,255)*255,g:St(t,255)*255,b:St(n,255)*255}}function vp(e,t,n){e=St(e,255),t=St(t,255),n=St(n,255);var r=Math.max(e,t,n),o=Math.min(e,t,n),s=0,i=0,a=(r+o)/2;if(r===o)i=0,s=0;else{var l=r-o;switch(i=a>.5?l/(2-r-o):l/(r+o),r){case e:s=(t-n)/l+(t1&&(n-=1),n<1/6?e+(t-e)*(6*n):n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function PA(e,t,n){var r,o,s;if(e=St(e,360),t=St(t,100),n=St(n,100),t===0)o=n,s=n,r=n;else{var i=n<.5?n*(1+t):n+t-n*t,a=2*n-i;r=vl(a,i,e+1/3),o=vl(a,i,e),s=vl(a,i,e-1/3)}return{r:r*255,g:o*255,b:s*255}}function mp(e,t,n){e=St(e,255),t=St(t,255),n=St(n,255);var r=Math.max(e,t,n),o=Math.min(e,t,n),s=0,i=r,a=r-o,l=r===0?0:a/r;if(r===o)s=0;else{switch(r){case e:s=(t-n)/a+(t>16,g:(e&65280)>>8,b:e&255}}var iu={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",goldenrod:"#daa520",gold:"#ffd700",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavenderblush:"#fff0f5",lavender:"#e6e6fa",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};function NA(e){var t={r:0,g:0,b:0},n=1,r=null,o=null,s=null,i=!1,a=!1;return typeof e=="string"&&(e=BA(e)),typeof e=="object"&&(Dn(e.r)&&Dn(e.g)&&Dn(e.b)?(t=RA(e.r,e.g,e.b),i=!0,a=String(e.r).substr(-1)==="%"?"prgb":"rgb"):Dn(e.h)&&Dn(e.s)&&Dn(e.v)?(r=_i(e.s),o=_i(e.v),t=IA(e.h,r,o),i=!0,a="hsv"):Dn(e.h)&&Dn(e.s)&&Dn(e.l)&&(r=_i(e.s),s=_i(e.l),t=PA(e.h,r,s),i=!0,a="hsl"),Object.prototype.hasOwnProperty.call(e,"a")&&(n=e.a)),n=ng(n),{ok:i,format:e.format||a,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var MA="[-\\+]?\\d+%?",FA="[-\\+]?\\d*\\.\\d+%?",br="(?:".concat(FA,")|(?:").concat(MA,")"),ml="[\\s|\\(]+(".concat(br,")[,|\\s]+(").concat(br,")[,|\\s]+(").concat(br,")\\s*\\)?"),gl="[\\s|\\(]+(".concat(br,")[,|\\s]+(").concat(br,")[,|\\s]+(").concat(br,")[,|\\s]+(").concat(br,")\\s*\\)?"),un={CSS_UNIT:new RegExp(br),rgb:new RegExp("rgb"+ml),rgba:new RegExp("rgba"+gl),hsl:new RegExp("hsl"+ml),hsla:new RegExp("hsla"+gl),hsv:new RegExp("hsv"+ml),hsva:new RegExp("hsva"+gl),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function BA(e){if(e=e.trim().toLowerCase(),e.length===0)return!1;var t=!1;if(iu[e])e=iu[e],t=!0;else if(e==="transparent")return{r:0,g:0,b:0,a:0,format:"name"};var n=un.rgb.exec(e);return n?{r:n[1],g:n[2],b:n[3]}:(n=un.rgba.exec(e),n?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=un.hsl.exec(e),n?{h:n[1],s:n[2],l:n[3]}:(n=un.hsla.exec(e),n?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=un.hsv.exec(e),n?{h:n[1],s:n[2],v:n[3]}:(n=un.hsva.exec(e),n?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=un.hex8.exec(e),n?{r:Kt(n[1]),g:Kt(n[2]),b:Kt(n[3]),a:yp(n[4]),format:t?"name":"hex8"}:(n=un.hex6.exec(e),n?{r:Kt(n[1]),g:Kt(n[2]),b:Kt(n[3]),format:t?"name":"hex"}:(n=un.hex4.exec(e),n?{r:Kt(n[1]+n[1]),g:Kt(n[2]+n[2]),b:Kt(n[3]+n[3]),a:yp(n[4]+n[4]),format:t?"name":"hex8"}:(n=un.hex3.exec(e),n?{r:Kt(n[1]+n[1]),g:Kt(n[2]+n[2]),b:Kt(n[3]+n[3]),format:t?"name":"hex"}:!1)))))))))}function Dn(e){return!!un.CSS_UNIT.exec(String(e))}var DA=function(){function e(t,n){t===void 0&&(t=""),n===void 0&&(n={});var r;if(t instanceof e)return t;typeof t=="number"&&(t=LA(t)),this.originalInput=t;var o=NA(t);this.originalInput=t,this.r=o.r,this.g=o.g,this.b=o.b,this.a=o.a,this.roundA=Math.round(100*this.a)/100,this.format=(r=n.format)!==null&&r!==void 0?r:o.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=o.ok}return e.prototype.isDark=function(){return this.getBrightness()<128},e.prototype.isLight=function(){return!this.isDark()},e.prototype.getBrightness=function(){var t=this.toRgb();return(t.r*299+t.g*587+t.b*114)/1e3},e.prototype.getLuminance=function(){var t=this.toRgb(),n,r,o,s=t.r/255,i=t.g/255,a=t.b/255;return s<=.03928?n=s/12.92:n=Math.pow((s+.055)/1.055,2.4),i<=.03928?r=i/12.92:r=Math.pow((i+.055)/1.055,2.4),a<=.03928?o=a/12.92:o=Math.pow((a+.055)/1.055,2.4),.2126*n+.7152*r+.0722*o},e.prototype.getAlpha=function(){return this.a},e.prototype.setAlpha=function(t){return this.a=ng(t),this.roundA=Math.round(100*this.a)/100,this},e.prototype.isMonochrome=function(){var t=this.toHsl().s;return t===0},e.prototype.toHsv=function(){var t=mp(this.r,this.g,this.b);return{h:t.h*360,s:t.s,v:t.v,a:this.a}},e.prototype.toHsvString=function(){var t=mp(this.r,this.g,this.b),n=Math.round(t.h*360),r=Math.round(t.s*100),o=Math.round(t.v*100);return this.a===1?"hsv(".concat(n,", ").concat(r,"%, ").concat(o,"%)"):"hsva(".concat(n,", ").concat(r,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHsl=function(){var t=vp(this.r,this.g,this.b);return{h:t.h*360,s:t.s,l:t.l,a:this.a}},e.prototype.toHslString=function(){var t=vp(this.r,this.g,this.b),n=Math.round(t.h*360),r=Math.round(t.s*100),o=Math.round(t.l*100);return this.a===1?"hsl(".concat(n,", ").concat(r,"%, ").concat(o,"%)"):"hsla(".concat(n,", ").concat(r,"%, ").concat(o,"%, ").concat(this.roundA,")")},e.prototype.toHex=function(t){return t===void 0&&(t=!1),gp(this.r,this.g,this.b,t)},e.prototype.toHexString=function(t){return t===void 0&&(t=!1),"#"+this.toHex(t)},e.prototype.toHex8=function(t){return t===void 0&&(t=!1),$A(this.r,this.g,this.b,this.a,t)},e.prototype.toHex8String=function(t){return t===void 0&&(t=!1),"#"+this.toHex8(t)},e.prototype.toHexShortString=function(t){return t===void 0&&(t=!1),this.a===1?this.toHexString(t):this.toHex8String(t)},e.prototype.toRgb=function(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}},e.prototype.toRgbString=function(){var t=Math.round(this.r),n=Math.round(this.g),r=Math.round(this.b);return this.a===1?"rgb(".concat(t,", ").concat(n,", ").concat(r,")"):"rgba(".concat(t,", ").concat(n,", ").concat(r,", ").concat(this.roundA,")")},e.prototype.toPercentageRgb=function(){var t=function(n){return"".concat(Math.round(St(n,255)*100),"%")};return{r:t(this.r),g:t(this.g),b:t(this.b),a:this.a}},e.prototype.toPercentageRgbString=function(){var t=function(n){return Math.round(St(n,255)*100)};return this.a===1?"rgb(".concat(t(this.r),"%, ").concat(t(this.g),"%, ").concat(t(this.b),"%)"):"rgba(".concat(t(this.r),"%, ").concat(t(this.g),"%, ").concat(t(this.b),"%, ").concat(this.roundA,")")},e.prototype.toName=function(){if(this.a===0)return"transparent";if(this.a<1)return!1;for(var t="#"+gp(this.r,this.g,this.b,!1),n=0,r=Object.entries(iu);n=0,s=!n&&o&&(t.startsWith("hex")||t==="name");return s?t==="name"&&this.a===0?this.toName():this.toRgbString():(t==="rgb"&&(r=this.toRgbString()),t==="prgb"&&(r=this.toPercentageRgbString()),(t==="hex"||t==="hex6")&&(r=this.toHexString()),t==="hex3"&&(r=this.toHexString(!0)),t==="hex4"&&(r=this.toHex8String(!0)),t==="hex8"&&(r=this.toHex8String()),t==="name"&&(r=this.toName()),t==="hsl"&&(r=this.toHslString()),t==="hsv"&&(r=this.toHsvString()),r||this.toHexString())},e.prototype.toNumber=function(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)},e.prototype.clone=function(){return new e(this.toString())},e.prototype.lighten=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.l+=t/100,n.l=wi(n.l),new e(n)},e.prototype.brighten=function(t){t===void 0&&(t=10);var n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(255*-(t/100)))),n.g=Math.max(0,Math.min(255,n.g-Math.round(255*-(t/100)))),n.b=Math.max(0,Math.min(255,n.b-Math.round(255*-(t/100)))),new e(n)},e.prototype.darken=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.l-=t/100,n.l=wi(n.l),new e(n)},e.prototype.tint=function(t){return t===void 0&&(t=10),this.mix("white",t)},e.prototype.shade=function(t){return t===void 0&&(t=10),this.mix("black",t)},e.prototype.desaturate=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.s-=t/100,n.s=wi(n.s),new e(n)},e.prototype.saturate=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.s+=t/100,n.s=wi(n.s),new e(n)},e.prototype.greyscale=function(){return this.desaturate(100)},e.prototype.spin=function(t){var n=this.toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,new e(n)},e.prototype.mix=function(t,n){n===void 0&&(n=50);var r=this.toRgb(),o=new e(t).toRgb(),s=n/100,i={r:(o.r-r.r)*s+r.r,g:(o.g-r.g)*s+r.g,b:(o.b-r.b)*s+r.b,a:(o.a-r.a)*s+r.a};return new e(i)},e.prototype.analogous=function(t,n){t===void 0&&(t=6),n===void 0&&(n=30);var r=this.toHsl(),o=360/n,s=[this];for(r.h=(r.h-(o*t>>1)+720)%360;--t;)r.h=(r.h+o)%360,s.push(new e(r));return s},e.prototype.complement=function(){var t=this.toHsl();return t.h=(t.h+180)%360,new e(t)},e.prototype.monochromatic=function(t){t===void 0&&(t=6);for(var n=this.toHsv(),r=n.h,o=n.s,s=n.v,i=[],a=1/t;t--;)i.push(new e({h:r,s:o,v:s})),s=(s+a)%1;return i},e.prototype.splitcomplement=function(){var t=this.toHsl(),n=t.h;return[this,new e({h:(n+72)%360,s:t.s,l:t.l}),new e({h:(n+216)%360,s:t.s,l:t.l})]},e.prototype.onBackground=function(t){var n=this.toRgb(),r=new e(t).toRgb(),o=n.a+r.a*(1-n.a);return new e({r:(n.r*n.a+r.r*r.a*(1-n.a))/o,g:(n.g*n.a+r.g*r.a*(1-n.a))/o,b:(n.b*n.a+r.b*r.a*(1-n.a))/o,a:o})},e.prototype.triad=function(){return this.polyad(3)},e.prototype.tetrad=function(){return this.polyad(4)},e.prototype.polyad=function(t){for(var n=this.toHsl(),r=n.h,o=[this],s=360/t,i=1;i{let r={},o=e.color;if(o){const s=o.match(/var\((.*?)\)/);s&&(o=window.getComputedStyle(window.document.documentElement).getPropertyValue(s[1]));const i=new DA(o),a=e.dark?i.tint(20).toString():lr(i,20);if(e.plain)r=n.cssVarBlock({"bg-color":e.dark?lr(i,90):i.tint(90).toString(),"text-color":o,"border-color":e.dark?lr(i,50):i.tint(50).toString(),"hover-text-color":`var(${n.cssVarName("color-white")})`,"hover-bg-color":o,"hover-border-color":o,"active-bg-color":a,"active-text-color":`var(${n.cssVarName("color-white")})`,"active-border-color":a}),t.value&&(r[n.cssVarBlockName("disabled-bg-color")]=e.dark?lr(i,90):i.tint(90).toString(),r[n.cssVarBlockName("disabled-text-color")]=e.dark?lr(i,50):i.tint(50).toString(),r[n.cssVarBlockName("disabled-border-color")]=e.dark?lr(i,80):i.tint(80).toString());else{const l=e.dark?lr(i,30):i.tint(30).toString(),u=i.isDark()?`var(${n.cssVarName("color-white")})`:`var(${n.cssVarName("color-black")})`;if(r=n.cssVarBlock({"bg-color":o,"text-color":u,"border-color":o,"hover-bg-color":l,"hover-text-color":u,"hover-border-color":l,"active-bg-color":a,"active-border-color":a}),t.value){const c=e.dark?lr(i,50):i.tint(50).toString();r[n.cssVarBlockName("disabled-bg-color")]=c,r[n.cssVarBlockName("disabled-text-color")]=e.dark?"rgba(255, 255, 255, 0.5)":`var(${n.cssVarName("color-white")})`,r[n.cssVarBlockName("disabled-border-color")]=c}}}return r})}const jA=J({name:"ElButton"}),zA=J({...jA,props:su,emits:OA,setup(e,{expose:t,emit:n}){const r=e,o=VA(r),s=$e("button"),{_ref:i,_size:a,_type:l,_disabled:u,_props:c,shouldAddSpace:f,handleClick:d}=EA(r,n),v=T(()=>[s.b(),s.m(l.value),s.m(a.value),s.is("disabled",u.value),s.is("loading",r.loading),s.is("plain",r.plain),s.is("round",r.round),s.is("circle",r.circle),s.is("text",r.text),s.is("link",r.link),s.is("has-bg",r.bg)]);return t({ref:i,size:a,type:l,disabled:u,shouldAddSpace:f}),(p,h)=>($(),pe(at(p.tag),hn({ref_key:"_ref",ref:i},m(c),{class:m(v),style:m(o),onClick:m(d)}),{default:ve(()=>[p.loading?($(),Q(et,{key:0},[p.$slots.loading?de(p.$slots,"loading",{key:0}):($(),pe(m(tt),{key:1,class:q(m(s).is("loading"))},{default:ve(()=>[($(),pe(at(p.loadingIcon)))]),_:1},8,["class"]))],64)):p.icon||p.$slots.icon?($(),pe(m(tt),{key:1},{default:ve(()=>[p.icon?($(),pe(at(p.icon),{key:0})):de(p.$slots,"icon",{key:1})]),_:3})):ue("v-if",!0),p.$slots.default?($(),Q("span",{key:2,class:q({[m(s).em("text","expand")]:m(f)})},[de(p.$slots,"default")],2)):ue("v-if",!0)]),_:3},16,["class","style","onClick"]))}});var HA=ke(zA,[["__file","button.vue"]]);const KA={size:su.size,type:su.type},UA=J({name:"ElButtonGroup"}),qA=J({...UA,props:KA,setup(e){const t=e;ct(tg,Et({size:Zt(t,"size"),type:Zt(t,"type")}));const n=$e("button");return(r,o)=>($(),Q("div",{class:q(m(n).b("group"))},[de(r.$slots,"default")],2))}});var rg=ke(qA,[["__file","button-group.vue"]]);const w8=gt(HA,{ButtonGroup:rg});uo(rg);const dr=new Map;if(ot){let e;document.addEventListener("mousedown",t=>e=t),document.addEventListener("mouseup",t=>{if(e){for(const n of dr.values())for(const{documentHandler:r}of n)r(t,e);e=void 0}})}function bp(e,t){let n=[];return Array.isArray(t.arg)?n=t.arg:Ur(t.arg)&&n.push(t.arg),function(r,o){const s=t.instance.popperRef,i=r.target,a=o==null?void 0:o.target,l=!t||!t.instance,u=!i||!a,c=e.contains(i)||e.contains(a),f=e===i,d=n.length&&n.some(p=>p==null?void 0:p.contains(i))||n.length&&n.includes(a),v=s&&(s.contains(i)||s.contains(a));l||u||c||f||d||v||t.value(r,o)}}const WA={beforeMount(e,t){dr.has(e)||dr.set(e,[]),dr.get(e).push({documentHandler:bp(e,t),bindingFn:t.value})},updated(e,t){dr.has(e)||dr.set(e,[]);const n=dr.get(e),r=n.findIndex(s=>s.bindingFn===t.oldValue),o={documentHandler:bp(e,t),bindingFn:t.value};r>=0?n.splice(r,1,o):n.push(o)},unmounted(e){dr.delete(e)}},GA=100,YA=600,wp={beforeMount(e,t){const n=t.value,{interval:r=GA,delay:o=YA}=he(n)?{}:n;let s,i;const a=()=>he(n)?n():n.handler(),l=()=>{i&&(clearTimeout(i),i=void 0),s&&(clearInterval(s),s=void 0)};e.addEventListener("mousedown",u=>{u.button===0&&(l(),a(),document.addEventListener("mouseup",()=>l(),{once:!0}),i=setTimeout(()=>{s=setInterval(()=>{a()},r)},o))})}},og={modelValue:{type:[Number,String,Boolean],default:void 0},label:{type:[String,Boolean,Number,Object],default:void 0},value:{type:[String,Boolean,Number,Object],default:void 0},indeterminate:Boolean,disabled:Boolean,checked:Boolean,name:{type:String,default:void 0},trueValue:{type:[String,Number],default:void 0},falseValue:{type:[String,Number],default:void 0},trueLabel:{type:[String,Number],default:void 0},falseLabel:{type:[String,Number],default:void 0},id:{type:String,default:void 0},border:Boolean,size:co,tabindex:[String,Number],validateEvent:{type:Boolean,default:!0},...nr(["ariaControls"])},sg={[rt]:e=>Oe(e)||Ve(e)||Nt(e),change:e=>Oe(e)||Ve(e)||Nt(e)},Ko=Symbol("checkboxGroupContextKey"),JA=({model:e,isChecked:t})=>{const n=_e(Ko,void 0),r=T(()=>{var s,i;const a=(s=n==null?void 0:n.max)==null?void 0:s.value,l=(i=n==null?void 0:n.min)==null?void 0:i.value;return!Lt(a)&&e.value.length>=a&&!t.value||!Lt(l)&&e.value.length<=l&&t.value});return{isDisabled:Ho(T(()=>(n==null?void 0:n.disabled.value)||r.value)),isLimitDisabled:r}},XA=(e,{model:t,isLimitExceeded:n,hasOwnLabel:r,isDisabled:o,isLabeledByFormItem:s})=>{const i=_e(Ko,void 0),{formItem:a}=Rr(),{emit:l}=st();function u(p){var h,y,g,_;return[!0,e.trueValue,e.trueLabel].includes(p)?(y=(h=e.trueValue)!=null?h:e.trueLabel)!=null?y:!0:(_=(g=e.falseValue)!=null?g:e.falseLabel)!=null?_:!1}function c(p,h){l("change",u(p),h)}function f(p){if(n.value)return;const h=p.target;l("change",u(h.checked),p)}async function d(p){n.value||!r.value&&!o.value&&s.value&&(p.composedPath().some(g=>g.tagName==="LABEL")||(t.value=u([!1,e.falseValue,e.falseLabel].includes(t.value)),await ze(),c(t.value,p)))}const v=T(()=>(i==null?void 0:i.validateEvent)||e.validateEvent);return me(()=>e.modelValue,()=>{v.value&&(a==null||a.validate("change").catch(p=>void 0))}),{handleChange:f,onClickRoot:d}},ZA=e=>{const t=z(!1),{emit:n}=st(),r=_e(Ko,void 0),o=T(()=>Lt(r)===!1),s=z(!1),i=T({get(){var a,l;return o.value?(a=r==null?void 0:r.modelValue)==null?void 0:a.value:(l=e.modelValue)!=null?l:t.value},set(a){var l,u;o.value&&ce(a)?(s.value=((l=r==null?void 0:r.max)==null?void 0:l.value)!==void 0&&a.length>(r==null?void 0:r.max.value)&&a.length>i.value.length,s.value===!1&&((u=r==null?void 0:r.changeEvent)==null||u.call(r,a))):(n(rt,a),t.value=a)}});return{model:i,isGroup:o,isLimitExceeded:s}},QA=(e,t,{model:n})=>{const r=_e(Ko,void 0),o=z(!1),s=T(()=>Xl(e.value)?e.label:e.value),i=T(()=>{const c=n.value;return Nt(c)?c:ce(c)?xe(s.value)?c.map(Ie).some(f=>ra(f,s.value)):c.map(Ie).includes(s.value):c!=null?c===e.trueValue||c===e.trueLabel:!!c}),a=yn(T(()=>{var c;return(c=r==null?void 0:r.size)==null?void 0:c.value}),{prop:!0}),l=yn(T(()=>{var c;return(c=r==null?void 0:r.size)==null?void 0:c.value})),u=T(()=>!!t.default||!Xl(s.value));return{checkboxButtonSize:a,isChecked:i,isFocused:o,checkboxSize:l,hasOwnLabel:u,actualValue:s}},ig=(e,t)=>{const{formItem:n}=Rr(),{model:r,isGroup:o,isLimitExceeded:s}=ZA(e),{isFocused:i,isChecked:a,checkboxButtonSize:l,checkboxSize:u,hasOwnLabel:c,actualValue:f}=QA(e,t,{model:r}),{isDisabled:d}=JA({model:r,isChecked:a}),{inputId:v,isLabeledByFormItem:p}=Js(e,{formItemContext:n,disableIdGeneration:c,disableIdManagement:o}),{handleChange:h,onClickRoot:y}=XA(e,{model:r,isLimitExceeded:s,hasOwnLabel:c,isDisabled:d,isLabeledByFormItem:p});return(()=>{function _(){var E,S;ce(r.value)&&!r.value.includes(f.value)?r.value.push(f.value):r.value=(S=(E=e.trueValue)!=null?E:e.trueLabel)!=null?S:!0}e.checked&&_()})(),ds({from:"label act as value",replacement:"value",version:"3.0.0",scope:"el-checkbox",ref:"https://element-plus.org/en-US/component/checkbox.html"},T(()=>o.value&&Xl(e.value))),ds({from:"true-label",replacement:"true-value",version:"3.0.0",scope:"el-checkbox",ref:"https://element-plus.org/en-US/component/checkbox.html"},T(()=>!!e.trueLabel)),ds({from:"false-label",replacement:"false-value",version:"3.0.0",scope:"el-checkbox",ref:"https://element-plus.org/en-US/component/checkbox.html"},T(()=>!!e.falseLabel)),{inputId:v,isLabeledByFormItem:p,isChecked:a,isDisabled:d,isFocused:i,checkboxButtonSize:l,checkboxSize:u,hasOwnLabel:c,model:r,actualValue:f,handleChange:h,onClickRoot:y}},eR=J({name:"ElCheckbox"}),tR=J({...eR,props:og,emits:sg,setup(e){const t=e,n=so(),{inputId:r,isLabeledByFormItem:o,isChecked:s,isDisabled:i,isFocused:a,checkboxSize:l,hasOwnLabel:u,model:c,actualValue:f,handleChange:d,onClickRoot:v}=ig(t,n),p=$e("checkbox"),h=T(()=>[p.b(),p.m(l.value),p.is("disabled",i.value),p.is("bordered",t.border),p.is("checked",s.value)]),y=T(()=>[p.e("input"),p.is("disabled",i.value),p.is("checked",s.value),p.is("indeterminate",t.indeterminate),p.is("focus",a.value)]);return(g,_)=>($(),pe(at(!m(u)&&m(o)?"span":"label"),{class:q(m(h)),"aria-controls":g.indeterminate?g.ariaControls:null,onClick:m(v)},{default:ve(()=>{var E,S;return[fe("span",{class:q(m(y))},[g.trueValue||g.falseValue||g.trueLabel||g.falseLabel?ht(($(),Q("input",{key:0,id:m(r),"onUpdate:modelValue":b=>He(c)?c.value=b:null,class:q(m(p).e("original")),type:"checkbox",indeterminate:g.indeterminate,name:g.name,tabindex:g.tabindex,disabled:m(i),"true-value":(E=g.trueValue)!=null?E:g.trueLabel,"false-value":(S=g.falseValue)!=null?S:g.falseLabel,onChange:m(d),onFocus:b=>a.value=!0,onBlur:b=>a.value=!1,onClick:ut(()=>{},["stop"])},null,42,["id","onUpdate:modelValue","indeterminate","name","tabindex","disabled","true-value","false-value","onChange","onFocus","onBlur","onClick"])),[[Ji,m(c)]]):ht(($(),Q("input",{key:1,id:m(r),"onUpdate:modelValue":b=>He(c)?c.value=b:null,class:q(m(p).e("original")),type:"checkbox",indeterminate:g.indeterminate,disabled:m(i),value:m(f),name:g.name,tabindex:g.tabindex,onChange:m(d),onFocus:b=>a.value=!0,onBlur:b=>a.value=!1,onClick:ut(()=>{},["stop"])},null,42,["id","onUpdate:modelValue","indeterminate","disabled","value","name","tabindex","onChange","onFocus","onBlur","onClick"])),[[Ji,m(c)]]),fe("span",{class:q(m(p).e("inner"))},null,2)],2),m(u)?($(),Q("span",{key:0,class:q(m(p).e("label"))},[de(g.$slots,"default"),g.$slots.default?ue("v-if",!0):($(),Q(et,{key:0},[Xr(Je(g.label),1)],64))],2)):ue("v-if",!0)]}),_:3},8,["class","aria-controls","onClick"]))}});var nR=ke(tR,[["__file","checkbox.vue"]]);const rR=J({name:"ElCheckboxButton"}),oR=J({...rR,props:og,emits:sg,setup(e){const t=e,n=so(),{isFocused:r,isChecked:o,isDisabled:s,checkboxButtonSize:i,model:a,actualValue:l,handleChange:u}=ig(t,n),c=_e(Ko,void 0),f=$e("checkbox"),d=T(()=>{var p,h,y,g;const _=(h=(p=c==null?void 0:c.fill)==null?void 0:p.value)!=null?h:"";return{backgroundColor:_,borderColor:_,color:(g=(y=c==null?void 0:c.textColor)==null?void 0:y.value)!=null?g:"",boxShadow:_?`-1px 0 0 0 ${_}`:void 0}}),v=T(()=>[f.b("button"),f.bm("button",i.value),f.is("disabled",s.value),f.is("checked",o.value),f.is("focus",r.value)]);return(p,h)=>{var y,g;return $(),Q("label",{class:q(m(v))},[p.trueValue||p.falseValue||p.trueLabel||p.falseLabel?ht(($(),Q("input",{key:0,"onUpdate:modelValue":_=>He(a)?a.value=_:null,class:q(m(f).be("button","original")),type:"checkbox",name:p.name,tabindex:p.tabindex,disabled:m(s),"true-value":(y=p.trueValue)!=null?y:p.trueLabel,"false-value":(g=p.falseValue)!=null?g:p.falseLabel,onChange:m(u),onFocus:_=>r.value=!0,onBlur:_=>r.value=!1,onClick:ut(()=>{},["stop"])},null,42,["onUpdate:modelValue","name","tabindex","disabled","true-value","false-value","onChange","onFocus","onBlur","onClick"])),[[Ji,m(a)]]):ht(($(),Q("input",{key:1,"onUpdate:modelValue":_=>He(a)?a.value=_:null,class:q(m(f).be("button","original")),type:"checkbox",name:p.name,tabindex:p.tabindex,disabled:m(s),value:m(l),onChange:m(u),onFocus:_=>r.value=!0,onBlur:_=>r.value=!1,onClick:ut(()=>{},["stop"])},null,42,["onUpdate:modelValue","name","tabindex","disabled","value","onChange","onFocus","onBlur","onClick"])),[[Ji,m(a)]]),p.$slots.default||p.label?($(),Q("span",{key:2,class:q(m(f).be("button","inner")),style:it(m(o)?m(d):void 0)},[de(p.$slots,"default",{},()=>[Xr(Je(p.label),1)])],6)):ue("v-if",!0)],2)}}});var ag=ke(oR,[["__file","checkbox-button.vue"]]);const sR=Re({modelValue:{type:ge(Array),default:()=>[]},disabled:Boolean,min:Number,max:Number,size:co,fill:String,textColor:String,tag:{type:String,default:"div"},validateEvent:{type:Boolean,default:!0},...nr(["ariaLabel"])}),iR={[rt]:e=>ce(e),change:e=>ce(e)},aR=J({name:"ElCheckboxGroup"}),lR=J({...aR,props:sR,emits:iR,setup(e,{emit:t}){const n=e,r=$e("checkbox"),{formItem:o}=Rr(),{inputId:s,isLabeledByFormItem:i}=Js(n,{formItemContext:o}),a=async u=>{t(rt,u),await ze(),t("change",u)},l=T({get(){return n.modelValue},set(u){a(u)}});return ct(Ko,{...sm(Or(n),["size","min","max","disabled","validateEvent","fill","textColor"]),modelValue:l,changeEvent:a}),me(()=>n.modelValue,()=>{n.validateEvent&&(o==null||o.validate("change").catch(u=>void 0))}),(u,c)=>{var f;return $(),pe(at(u.tag),{id:m(s),class:q(m(r).b("group")),role:"group","aria-label":m(i)?void 0:u.ariaLabel||"checkbox-group","aria-labelledby":m(i)?(f=m(o))==null?void 0:f.labelId:void 0},{default:ve(()=>[de(u.$slots,"default")]),_:3},8,["id","class","aria-label","aria-labelledby"])}}});var lg=ke(lR,[["__file","checkbox-group.vue"]]);const _8=gt(nR,{CheckboxButton:ag,CheckboxGroup:lg});uo(ag);const S8=uo(lg),au=Re({type:{type:String,values:["primary","success","info","warning","danger"],default:"primary"},closable:Boolean,disableTransitions:Boolean,hit:Boolean,color:String,size:{type:String,values:jo},effect:{type:String,values:["dark","light","plain"],default:"light"},round:Boolean}),uR={close:e=>e instanceof MouseEvent,click:e=>e instanceof MouseEvent},cR=J({name:"ElTag"}),fR=J({...cR,props:au,emits:uR,setup(e,{emit:t}){const n=e,r=yn(),o=$e("tag"),s=T(()=>{const{type:u,hit:c,effect:f,closable:d,round:v}=n;return[o.b(),o.is("closable",d),o.m(u||"primary"),o.m(r.value),o.m(f),o.is("hit",c),o.is("round",v)]}),i=u=>{t("close",u)},a=u=>{t("click",u)},l=u=>{u.component.subTree.component.bum=null};return(u,c)=>u.disableTransitions?($(),Q("span",{key:0,class:q(m(s)),style:it({backgroundColor:u.color}),onClick:a},[fe("span",{class:q(m(o).e("content"))},[de(u.$slots,"default")],2),u.closable?($(),pe(m(tt),{key:0,class:q(m(o).e("close")),onClick:ut(i,["stop"])},{default:ve(()=>[ie(m($s))]),_:1},8,["class","onClick"])):ue("v-if",!0)],6)):($(),pe(io,{key:1,name:`${m(o).namespace.value}-zoom-in-center`,appear:"",onVnodeMounted:l},{default:ve(()=>[fe("span",{class:q(m(s)),style:it({backgroundColor:u.color}),onClick:a},[fe("span",{class:q(m(o).e("content"))},[de(u.$slots,"default")],2),u.closable?($(),pe(m(tt),{key:0,class:q(m(o).e("close")),onClick:ut(i,["stop"])},{default:ve(()=>[ie(m($s))]),_:1},8,["class","onClick"])):ue("v-if",!0)],6)]),_:3},8,["name"]))}});var dR=ke(fR,[["__file","tag.vue"]]);const pR=gt(dR),hR=Re({mask:{type:Boolean,default:!0},customMaskEvent:Boolean,overlayClass:{type:ge([String,Array,Object])},zIndex:{type:ge([String,Number])}}),vR={click:e=>e instanceof MouseEvent},mR="overlay";var gR=J({name:"ElOverlay",props:hR,emits:vR,setup(e,{slots:t,emit:n}){const r=$e(mR),o=l=>{n("click",l)},{onClick:s,onMousedown:i,onMouseup:a}=Rm(e.customMaskEvent?void 0:o);return()=>e.mask?ie("div",{class:[r.b(),e.overlayClass],style:{zIndex:e.zIndex},onClick:s,onMousedown:i,onMouseup:a},[de(t,"default")],ki.STYLE|ki.CLASS|ki.PROPS,["onClick","onMouseup","onMousedown"]):Un("div",{class:e.overlayClass,style:{zIndex:e.zIndex,position:"fixed",top:"0px",right:"0px",bottom:"0px",left:"0px"}},[de(t,"default")])}});const yR=gR,ug=Symbol("dialogInjectionKey"),cg=Re({center:Boolean,alignCenter:Boolean,closeIcon:{type:Bt},draggable:Boolean,overflow:Boolean,fullscreen:Boolean,showClose:{type:Boolean,default:!0},title:{type:String,default:""},ariaLevel:{type:String,default:"2"}}),bR={close:()=>!0},wR=J({name:"ElDialogContent"}),_R=J({...wR,props:cg,emits:bR,setup(e,{expose:t}){const n=e,{t:r}=ka(),{Close:o}=uT,{dialogRef:s,headerRef:i,bodyId:a,ns:l,style:u}=_e(ug),{focusTrapRef:c}=_e(Ym),f=T(()=>[l.b(),l.is("fullscreen",n.fullscreen),l.is("draggable",n.draggable),l.is("align-center",n.alignCenter),{[l.m("center")]:n.center}]),d=pT(c,s),v=T(()=>n.draggable),p=T(()=>n.overflow),{resetPosition:h}=bT(s,i,v,p);return t({resetPosition:h}),(y,g)=>($(),Q("div",{ref:m(d),class:q(m(f)),style:it(m(u)),tabindex:"-1"},[fe("header",{ref_key:"headerRef",ref:i,class:q([m(l).e("header"),{"show-close":y.showClose}])},[de(y.$slots,"header",{},()=>[fe("span",{role:"heading","aria-level":y.ariaLevel,class:q(m(l).e("title"))},Je(y.title),11,["aria-level"])]),y.showClose?($(),Q("button",{key:0,"aria-label":m(r)("el.dialog.close"),class:q(m(l).e("headerbtn")),type:"button",onClick:_=>y.$emit("close")},[ie(m(tt),{class:q(m(l).e("close"))},{default:ve(()=>[($(),pe(at(y.closeIcon||m(o))))]),_:1},8,["class"])],10,["aria-label","onClick"])):ue("v-if",!0)],2),fe("div",{id:m(a),class:q(m(l).e("body"))},[de(y.$slots,"default")],10,["id"]),y.$slots.footer?($(),Q("footer",{key:0,class:q(m(l).e("footer"))},[de(y.$slots,"footer")],2)):ue("v-if",!0)],6))}});var SR=ke(_R,[["__file","dialog-content.vue"]]);const ER=Re({...cg,appendToBody:Boolean,appendTo:{type:ge([String,Object]),default:"body"},beforeClose:{type:ge(Function)},destroyOnClose:Boolean,closeOnClickModal:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!0},lockScroll:{type:Boolean,default:!0},modal:{type:Boolean,default:!0},openDelay:{type:Number,default:0},closeDelay:{type:Number,default:0},top:{type:String},modelValue:Boolean,modalClass:String,width:{type:[String,Number]},zIndex:{type:Number},trapFocus:Boolean,headerAriaLevel:{type:String,default:"2"}}),CR={open:()=>!0,opened:()=>!0,close:()=>!0,closed:()=>!0,[rt]:e=>Nt(e),openAutoFocus:()=>!0,closeAutoFocus:()=>!0},TR=(e,t)=>{var n;const o=st().emit,{nextZIndex:s}=wc();let i="";const a=eo(),l=eo(),u=z(!1),c=z(!1),f=z(!1),d=z((n=e.zIndex)!=null?n:s());let v,p;const h=Ma("namespace",ps),y=T(()=>{const I={},R=`--${h.value}-dialog`;return e.fullscreen||(e.top&&(I[`${R}-margin-top`]=e.top),e.width&&(I[`${R}-width`]=on(e.width))),I}),g=T(()=>e.alignCenter?{display:"flex"}:{});function _(){o("opened")}function E(){o("closed"),o(rt,!1),e.destroyOnClose&&(f.value=!1)}function S(){o("close")}function b(){p==null||p(),v==null||v(),e.openDelay&&e.openDelay>0?{stop:v}=Ul(()=>x(),e.openDelay):x()}function O(){v==null||v(),p==null||p(),e.closeDelay&&e.closeDelay>0?{stop:p}=Ul(()=>M(),e.closeDelay):M()}function A(){function I(R){R||(c.value=!0,u.value=!1)}e.beforeClose?e.beforeClose(I):O()}function P(){e.closeOnClickModal&&A()}function x(){ot&&(u.value=!0)}function M(){u.value=!1}function U(){o("openAutoFocus")}function N(){o("closeAutoFocus")}function D(I){var R;((R=I.detail)==null?void 0:R.focusReason)==="pointer"&&I.preventDefault()}e.lockScroll&&TT(u);function Z(){e.closeOnPressEscape&&A()}return me(()=>e.modelValue,I=>{I?(c.value=!1,b(),f.value=!0,d.value=rm(e.zIndex)?s():d.value++,ze(()=>{o("open"),t.value&&(t.value.scrollTop=0)})):u.value&&O()}),me(()=>e.fullscreen,I=>{t.value&&(I?(i=t.value.style.transform,t.value.style.transform=""):t.value.style.transform=i)}),Ue(()=>{e.modelValue&&(u.value=!0,f.value=!0,b())}),{afterEnter:_,afterLeave:E,beforeLeave:S,handleClose:A,onModalClick:P,close:O,doClose:M,onOpenAutoFocus:U,onCloseAutoFocus:N,onCloseRequested:Z,onFocusoutPrevented:D,titleId:a,bodyId:l,closed:c,style:y,overlayDialogStyle:g,rendered:f,visible:u,zIndex:d}},OR=J({name:"ElDialog",inheritAttrs:!1}),xR=J({...OR,props:ER,emits:CR,setup(e,{expose:t}){const n=e,r=so();ds({scope:"el-dialog",from:"the title slot",replacement:"the header slot",version:"3.0.0",ref:"https://element-plus.org/en-US/component/dialog.html#slots"},T(()=>!!r.title));const o=$e("dialog"),s=z(),i=z(),a=z(),{visible:l,titleId:u,bodyId:c,style:f,overlayDialogStyle:d,rendered:v,zIndex:p,afterEnter:h,afterLeave:y,beforeLeave:g,handleClose:_,onModalClick:E,onOpenAutoFocus:S,onCloseAutoFocus:b,onCloseRequested:O,onFocusoutPrevented:A}=TR(n,s);ct(ug,{dialogRef:s,headerRef:i,bodyId:c,ns:o,rendered:v,style:f});const P=Rm(E),x=T(()=>n.draggable&&!n.fullscreen);return t({visible:l,dialogContentRef:a,resetPosition:()=>{var U;(U=a.value)==null||U.resetPosition()}}),(U,N)=>($(),pe(m(Qm),{to:U.appendTo,disabled:U.appendTo!=="body"?!1:!U.appendToBody},{default:ve(()=>[ie(io,{name:"dialog-fade",onAfterEnter:m(h),onAfterLeave:m(y),onBeforeLeave:m(g),persisted:""},{default:ve(()=>[ht(ie(m(yR),{"custom-mask-event":"",mask:U.modal,"overlay-class":U.modalClass,"z-index":m(p)},{default:ve(()=>[fe("div",{role:"dialog","aria-modal":"true","aria-label":U.title||void 0,"aria-labelledby":U.title?void 0:m(u),"aria-describedby":m(c),class:q(`${m(o).namespace.value}-overlay-dialog`),style:it(m(d)),onClick:m(P).onClick,onMousedown:m(P).onMousedown,onMouseup:m(P).onMouseup},[ie(m(Xm),{loop:"",trapped:m(l),"focus-start-el":"container",onFocusAfterTrapped:m(S),onFocusAfterReleased:m(b),onFocusoutPrevented:m(A),onReleaseRequested:m(O)},{default:ve(()=>[m(v)?($(),pe(SR,hn({key:0,ref_key:"dialogContentRef",ref:a},U.$attrs,{center:U.center,"align-center":U.alignCenter,"close-icon":U.closeIcon,draggable:m(x),overflow:U.overflow,fullscreen:U.fullscreen,"show-close":U.showClose,title:U.title,"aria-level":U.headerAriaLevel,onClose:m(_)}),gb({header:ve(()=>[U.$slots.title?de(U.$slots,"title",{key:1}):de(U.$slots,"header",{key:0,close:m(_),titleId:m(u),titleClass:m(o).e("title")})]),default:ve(()=>[de(U.$slots,"default")]),_:2},[U.$slots.footer?{name:"footer",fn:ve(()=>[de(U.$slots,"footer")])}:void 0]),1040,["center","align-center","close-icon","draggable","overflow","fullscreen","show-close","title","aria-level","onClose"])):ue("v-if",!0)]),_:3},8,["trapped","onFocusAfterTrapped","onFocusAfterReleased","onFocusoutPrevented","onReleaseRequested"])],46,["aria-label","aria-labelledby","aria-describedby","onClick","onMousedown","onMouseup"])]),_:3},8,["mask","overlay-class","z-index"]),[[Mn,m(l)]])]),_:3},8,["onAfterEnter","onAfterLeave","onBeforeLeave"])]),_:3},8,["to","disabled"]))}});var AR=ke(xR,[["__file","dialog.vue"]]);const E8=gt(AR),RR=J({inheritAttrs:!1});function PR(e,t,n,r,o,s){return de(e.$slots,"default")}var IR=ke(RR,[["render",PR],["__file","collection.vue"]]);const $R=J({name:"ElCollectionItem",inheritAttrs:!1});function kR(e,t,n,r,o,s){return de(e.$slots,"default")}var LR=ke($R,[["render",kR],["__file","collection-item.vue"]]);const NR="data-el-collection-item",MR=e=>{const t=`El${e}Collection`,n=`${t}Item`,r=Symbol(t),o=Symbol(n),s={...IR,name:t,setup(){const a=z(null),l=new Map;ct(r,{itemMap:l,getItems:()=>{const c=m(a);if(!c)return[];const f=Array.from(c.querySelectorAll(`[${NR}]`));return[...l.values()].sort((v,p)=>f.indexOf(v.ref)-f.indexOf(p.ref))},collectionRef:a})}},i={...LR,name:n,setup(a,{attrs:l}){const u=z(null),c=_e(r,void 0);ct(o,{collectionItemRef:u}),Ue(()=>{const f=m(u);f&&c.itemMap.set(f,{ref:f,...l})}),Ct(()=>{const f=m(u);c.itemMap.delete(f)})}};return{COLLECTION_INJECTION_KEY:r,COLLECTION_ITEM_INJECTION_KEY:o,ElCollection:s,ElCollectionItem:i}},yl=Re({trigger:Ms.trigger,effect:{...Ut.effect,default:"light"},type:{type:ge(String)},placement:{type:ge(String),default:"bottom"},popperOptions:{type:ge(Object),default:()=>({})},id:String,size:{type:String,default:""},splitButton:Boolean,hideOnClick:{type:Boolean,default:!0},loop:{type:Boolean,default:!0},showTimeout:{type:Number,default:150},hideTimeout:{type:Number,default:150},tabindex:{type:ge([Number,String]),default:0},maxHeight:{type:ge([Number,String]),default:""},popperClass:{type:String,default:""},disabled:Boolean,role:{type:String,default:"menu"},buttonProps:{type:ge(Object)},teleported:Ut.teleported});Re({command:{type:[Object,String,Number],default:()=>({})},disabled:Boolean,divided:Boolean,textValue:String,icon:{type:Bt}});Re({onKeydown:{type:ge(Function)}});MR("Dropdown");const FR=Re({id:{type:String,default:void 0},step:{type:Number,default:1},stepStrictly:Boolean,max:{type:Number,default:Number.POSITIVE_INFINITY},min:{type:Number,default:Number.NEGATIVE_INFINITY},modelValue:Number,readonly:Boolean,disabled:Boolean,size:co,controls:{type:Boolean,default:!0},controlsPosition:{type:String,default:"",values:["","right"]},valueOnClear:{type:[String,Number,null],validator:e=>e===null||Ve(e)||["min","max"].includes(e),default:null},name:String,placeholder:String,precision:{type:Number,validator:e=>e>=0&&e===Number.parseInt(`${e}`,10)},validateEvent:{type:Boolean,default:!0},...nr(["ariaLabel"])}),BR={[Qr]:(e,t)=>t!==e,blur:e=>e instanceof FocusEvent,focus:e=>e instanceof FocusEvent,[qr]:e=>Ve(e)||Pn(e),[rt]:e=>Ve(e)||Pn(e)},DR=J({name:"ElInputNumber"}),VR=J({...DR,props:FR,emits:BR,setup(e,{expose:t,emit:n}){const r=e,{t:o}=ka(),s=$e("input-number"),i=z(),a=Et({currentValue:r.modelValue,userInput:null}),{formItem:l}=Rr(),u=T(()=>Ve(r.modelValue)&&r.modelValue<=r.min),c=T(()=>Ve(r.modelValue)&&r.modelValue>=r.max),f=T(()=>{const I=g(r.step);return Lt(r.precision)?Math.max(g(r.modelValue),I):(I>r.precision,r.precision)}),d=T(()=>r.controls&&r.controlsPosition==="right"),v=yn(),p=Ho(),h=T(()=>{if(a.userInput!==null)return a.userInput;let I=a.currentValue;if(Pn(I))return"";if(Ve(I)){if(Number.isNaN(I))return"";Lt(r.precision)||(I=I.toFixed(r.precision))}return I}),y=(I,R)=>{if(Lt(R)&&(R=f.value),R===0)return Math.round(I);let H=String(I);const re=H.indexOf(".");if(re===-1||!H.replace(".","").split("")[re+R])return I;const Me=H.length;return H.charAt(Me-1)==="5"&&(H=`${H.slice(0,Math.max(0,Me-1))}6`),Number.parseFloat(Number(H).toFixed(R))},g=I=>{if(Pn(I))return 0;const R=I.toString(),H=R.indexOf(".");let re=0;return H!==-1&&(re=R.length-H-1),re},_=(I,R=1)=>Ve(I)?y(I+r.step*R):a.currentValue,E=()=>{if(r.readonly||p.value||c.value)return;const I=Number(h.value)||0,R=_(I);O(R),n(qr,a.currentValue),D()},S=()=>{if(r.readonly||p.value||u.value)return;const I=Number(h.value)||0,R=_(I,-1);O(R),n(qr,a.currentValue),D()},b=(I,R)=>{const{max:H,min:re,step:ye,precision:Ne,stepStrictly:Me,valueOnClear:Pe}=r;HH||CeH?H:re,R&&n(rt,Ce)),Ce},O=(I,R=!0)=>{var H;const re=a.currentValue,ye=b(I);if(!R){n(rt,ye);return}re===ye&&I||(a.userInput=null,n(rt,ye),re!==ye&&n(Qr,ye,re),r.validateEvent&&((H=l==null?void 0:l.validate)==null||H.call(l,"change").catch(Ne=>void 0)),a.currentValue=ye)},A=I=>{a.userInput=I;const R=I===""?null:Number(I);n(qr,R),O(R,!1)},P=I=>{const R=I!==""?Number(I):"";(Ve(R)&&!Number.isNaN(R)||I==="")&&O(R),D(),a.userInput=null},x=()=>{var I,R;(R=(I=i.value)==null?void 0:I.focus)==null||R.call(I)},M=()=>{var I,R;(R=(I=i.value)==null?void 0:I.blur)==null||R.call(I)},U=I=>{n("focus",I)},N=I=>{var R;a.userInput=null,n("blur",I),r.validateEvent&&((R=l==null?void 0:l.validate)==null||R.call(l,"blur").catch(H=>void 0))},D=()=>{a.currentValue!==r.modelValue&&(a.currentValue=r.modelValue)},Z=I=>{document.activeElement===I.target&&I.preventDefault()};return me(()=>r.modelValue,(I,R)=>{const H=b(I,!0);a.userInput===null&&H!==R&&(a.currentValue=H)},{immediate:!0}),Ue(()=>{var I;const{min:R,max:H,modelValue:re}=r,ye=(I=i.value)==null?void 0:I.input;if(ye.setAttribute("role","spinbutton"),Number.isFinite(H)?ye.setAttribute("aria-valuemax",String(H)):ye.removeAttribute("aria-valuemax"),Number.isFinite(R)?ye.setAttribute("aria-valuemin",String(R)):ye.removeAttribute("aria-valuemin"),ye.setAttribute("aria-valuenow",a.currentValue||a.currentValue===0?String(a.currentValue):""),ye.setAttribute("aria-disabled",String(p.value)),!Ve(re)&&re!=null){let Ne=Number(re);Number.isNaN(Ne)&&(Ne=null),n(rt,Ne)}ye.addEventListener("wheel",Z,{passive:!1})}),ro(()=>{var I,R;const H=(I=i.value)==null?void 0:I.input;H==null||H.setAttribute("aria-valuenow",`${(R=a.currentValue)!=null?R:""}`)}),t({focus:x,blur:M}),(I,R)=>($(),Q("div",{class:q([m(s).b(),m(s).m(m(v)),m(s).is("disabled",m(p)),m(s).is("without-controls",!I.controls),m(s).is("controls-right",m(d))]),onDragstart:ut(()=>{},["prevent"])},[I.controls?ht(($(),Q("span",{key:0,role:"button","aria-label":m(o)("el.inputNumber.decrease"),class:q([m(s).e("decrease"),m(s).is("disabled",m(u))]),onKeydown:xn(S,["enter"])},[de(I.$slots,"decrease-icon",{},()=>[ie(m(tt),null,{default:ve(()=>[m(d)?($(),pe(m(am),{key:0})):($(),pe(m(tT),{key:1}))]),_:1})])],42,["aria-label","onKeydown"])),[[m(wp),S]]):ue("v-if",!0),I.controls?ht(($(),Q("span",{key:1,role:"button","aria-label":m(o)("el.inputNumber.increase"),class:q([m(s).e("increase"),m(s).is("disabled",m(c))]),onKeydown:xn(E,["enter"])},[de(I.$slots,"increase-icon",{},()=>[ie(m(tt),null,{default:ve(()=>[m(d)?($(),pe(m(BC),{key:0})):($(),pe(m(cm),{key:1}))]),_:1})])],42,["aria-label","onKeydown"])),[[m(wp),E]]):ue("v-if",!0),ie(m(e4),{id:I.id,ref_key:"input",ref:i,type:"number",step:I.step,"model-value":m(h),placeholder:I.placeholder,readonly:I.readonly,disabled:m(p),size:m(v),max:I.max,min:I.min,name:I.name,"aria-label":I.ariaLabel,"validate-event":!1,onKeydown:[xn(ut(E,["prevent"]),["up"]),xn(ut(S,["prevent"]),["down"])],onBlur:N,onFocus:U,onInput:A,onChange:P},null,8,["id","step","model-value","placeholder","readonly","disabled","size","max","min","name","aria-label","onKeydown"])],42,["onDragstart"]))}});var jR=ke(VR,[["__file","input-number.vue"]]);const C8=gt(jR),zR=Re({type:{type:String,values:["primary","success","warning","info","danger","default"],default:"default"},underline:{type:Boolean,default:!0},disabled:Boolean,href:{type:String,default:""},target:{type:String,default:"_self"},icon:{type:Bt}}),HR={click:e=>e instanceof MouseEvent},KR=J({name:"ElLink"}),UR=J({...KR,props:zR,emits:HR,setup(e,{emit:t}){const n=e,r=$e("link"),o=T(()=>[r.b(),r.m(n.type),r.is("disabled",n.disabled),r.is("underline",n.underline&&!n.disabled)]);function s(i){n.disabled||t("click",i)}return(i,a)=>($(),Q("a",{class:q(m(o)),href:i.disabled||!i.href?void 0:i.href,target:i.disabled||!i.href?void 0:i.target,onClick:s},[i.icon?($(),pe(m(tt),{key:0},{default:ve(()=>[($(),pe(at(i.icon)))]),_:1})):ue("v-if",!0),i.$slots.default?($(),Q("span",{key:1,class:q(m(r).e("inner"))},[de(i.$slots,"default")],2)):ue("v-if",!0),i.$slots.icon?de(i.$slots,"icon",{key:2}):ue("v-if",!0)],10,["href","target"]))}});var qR=ke(UR,[["__file","link.vue"]]);const T8=gt(qR),fg=Symbol("ElSelectGroup"),Ba=Symbol("ElSelect");function WR(e,t){const n=_e(Ba),r=_e(fg,{disabled:!1}),o=T(()=>c(fn(n.props.modelValue),e.value)),s=T(()=>{var v;if(n.props.multiple){const p=fn((v=n.props.modelValue)!=null?v:[]);return!o.value&&p.length>=n.props.multipleLimit&&n.props.multipleLimit>0}else return!1}),i=T(()=>e.label||(xe(e.value)?"":e.value)),a=T(()=>e.value||e.label||""),l=T(()=>e.disabled||t.groupDisabled||s.value),u=st(),c=(v=[],p)=>{if(xe(e.value)){const h=n.props.valueKey;return v&&v.some(y=>Ie(An(y,h))===An(p,h))}else return v&&v.includes(p)},f=()=>{!e.disabled&&!r.disabled&&(n.states.hoveringIndex=n.optionsArray.indexOf(u.proxy))},d=v=>{const p=new RegExp(AC(v),"i");t.visible=p.test(i.value)||e.created};return me(()=>i.value,()=>{!e.created&&!n.props.remote&&n.setSelected()}),me(()=>e.value,(v,p)=>{const{remote:h,valueKey:y}=n.props;if(v!==p&&(n.onOptionDestroy(p,u.proxy),n.onOptionCreate(u.proxy)),!e.created&&!h){if(y&&xe(v)&&xe(p)&&v[y]===p[y])return;n.setSelected()}}),me(()=>r.disabled,()=>{t.groupDisabled=r.disabled},{immediate:!0}),{select:n,currentLabel:i,currentValue:a,itemSelected:o,isDisabled:l,hoverItem:f,updateOption:d}}const GR=J({name:"ElOption",componentName:"ElOption",props:{value:{required:!0,type:[String,Number,Boolean,Object]},label:[String,Number],created:Boolean,disabled:Boolean},setup(e){const t=$e("select"),n=eo(),r=T(()=>[t.be("dropdown","item"),t.is("disabled",m(a)),t.is("selected",m(i)),t.is("hovering",m(d))]),o=Et({index:-1,groupDisabled:!1,visible:!0,hover:!1}),{currentLabel:s,itemSelected:i,isDisabled:a,select:l,hoverItem:u,updateOption:c}=WR(e,o),{visible:f,hover:d}=Or(o),v=st().proxy;l.onOptionCreate(v),Ct(()=>{const h=v.value,{selected:y}=l.states,_=(l.props.multiple?y:[y]).some(E=>E.value===v.value);ze(()=>{l.states.cachedOptions.get(h)===v&&!_&&l.states.cachedOptions.delete(h)}),l.onOptionDestroy(h,v)});function p(){a.value||l.handleOptionSelect(v)}return{ns:t,id:n,containerKls:r,currentLabel:s,itemSelected:i,isDisabled:a,select:l,hoverItem:u,updateOption:c,visible:f,hover:d,selectOptionClick:p,states:o}}});function YR(e,t,n,r,o,s){return ht(($(),Q("li",{id:e.id,class:q(e.containerKls),role:"option","aria-disabled":e.isDisabled||void 0,"aria-selected":e.itemSelected,onMouseenter:e.hoverItem,onClick:ut(e.selectOptionClick,["stop"])},[de(e.$slots,"default",{},()=>[fe("span",null,Je(e.currentLabel),1)])],42,["id","aria-disabled","aria-selected","onMouseenter","onClick"])),[[Mn,e.visible]])}var Oc=ke(GR,[["render",YR],["__file","option.vue"]]);const JR=J({name:"ElSelectDropdown",componentName:"ElSelectDropdown",setup(){const e=_e(Ba),t=$e("select"),n=T(()=>e.props.popperClass),r=T(()=>e.props.multiple),o=T(()=>e.props.fitInputWidth),s=z("");function i(){var a;s.value=`${(a=e.selectRef)==null?void 0:a.offsetWidth}px`}return Ue(()=>{i(),Ft(e.selectRef,i)}),{ns:t,minWidth:s,popperClass:n,isMultiple:r,isFitInputWidth:o}}});function XR(e,t,n,r,o,s){return $(),Q("div",{class:q([e.ns.b("dropdown"),e.ns.is("multiple",e.isMultiple),e.popperClass]),style:it({[e.isFitInputWidth?"width":"minWidth"]:e.minWidth})},[e.$slots.header?($(),Q("div",{key:0,class:q(e.ns.be("dropdown","header"))},[de(e.$slots,"header")],2)):ue("v-if",!0),de(e.$slots,"default"),e.$slots.footer?($(),Q("div",{key:1,class:q(e.ns.be("dropdown","footer"))},[de(e.$slots,"footer")],2)):ue("v-if",!0)],6)}var ZR=ke(JR,[["render",XR],["__file","select-dropdown.vue"]]);const QR=11,eP=(e,t)=>{const{t:n}=ka(),r=eo(),o=$e("select"),s=$e("input"),i=Et({inputValue:"",options:new Map,cachedOptions:new Map,disabledOptions:new Map,optionValues:[],selected:[],selectionWidth:0,calculatorWidth:0,collapseItemWidth:0,selectedLabel:"",hoveringIndex:-1,previousQuery:null,inputHovering:!1,menuVisibleOnFocus:!1,isBeforeHide:!1}),a=z(null),l=z(null),u=z(null),c=z(null),f=z(null),d=z(null),v=z(null),p=z(null),h=z(null),y=z(null),g=z(null),_=z(null),{isComposing:E,handleCompositionStart:S,handleCompositionUpdate:b,handleCompositionEnd:O}=Fm({afterComposition:V=>Se(V)}),{wrapperRef:A,isFocused:P}=Mm(f,{beforeFocus(){return R.value},afterFocus(){e.automaticDropdown&&!x.value&&(x.value=!0,i.menuVisibleOnFocus=!0)},beforeBlur(V){var le,Fe;return((le=u.value)==null?void 0:le.isFocusInsideContent(V))||((Fe=c.value)==null?void 0:Fe.isFocusInsideContent(V))},afterBlur(){x.value=!1,i.menuVisibleOnFocus=!1}}),x=z(!1),M=z(),{form:U,formItem:N}=Rr(),{inputId:D}=Js(e,{formItemContext:N}),{valueOnClear:Z,isEmptyValue:I}=WO(e),R=T(()=>e.disabled||(U==null?void 0:U.disabled)),H=T(()=>ce(e.modelValue)?e.modelValue.length>0:!I(e.modelValue)),re=T(()=>e.clearable&&!R.value&&i.inputHovering&&H.value),ye=T(()=>e.remote&&e.filterable&&!e.remoteShowSuffix?"":e.suffixIcon),Ne=T(()=>o.is("reverse",ye.value&&x.value)),Me=T(()=>(N==null?void 0:N.validateState)||""),Pe=T(()=>hm[Me.value]),Ce=T(()=>e.remote?300:0),We=T(()=>e.loading?e.loadingText||n("el.select.loading"):e.remote&&!i.inputValue&&i.options.size===0?!1:e.filterable&&i.inputValue&&i.options.size>0&&qe.value===0?e.noMatchText||n("el.select.noMatch"):i.options.size===0?e.noDataText||n("el.select.noData"):null),qe=T(()=>Ee.value.filter(V=>V.visible).length),Ee=T(()=>{const V=Array.from(i.options.values()),le=[];return i.optionValues.forEach(Fe=>{const Xe=V.findIndex(or=>or.value===Fe);Xe>-1&&le.push(V[Xe])}),le.length>=V.length?le:V}),F=T(()=>Array.from(i.cachedOptions.values())),j=T(()=>{const V=Ee.value.filter(le=>!le.created).some(le=>le.currentLabel===i.inputValue);return e.filterable&&e.allowCreate&&i.inputValue!==""&&!V}),W=()=>{e.filterable&&he(e.filterMethod)||e.filterable&&e.remote&&he(e.remoteMethod)||Ee.value.forEach(V=>{var le;(le=V.updateOption)==null||le.call(V,i.inputValue)})},te=yn(),be=T(()=>["small"].includes(te.value)?"small":"default"),Te=T({get(){return x.value&&We.value!==!1},set(V){x.value=V}}),w=T(()=>{if(e.multiple&&!Lt(e.modelValue))return fn(e.modelValue).length===0&&!i.inputValue;const V=ce(e.modelValue)?e.modelValue[0]:e.modelValue;return e.filterable||Lt(V)?!i.inputValue:!0}),C=T(()=>{var V;const le=(V=e.placeholder)!=null?V:n("el.select.placeholder");return e.multiple||!H.value?le:i.selectedLabel}),k=T(()=>Kl?null:"mouseenter");me(()=>e.modelValue,(V,le)=>{e.multiple&&e.filterable&&!e.reserveKeyword&&(i.inputValue="",G("")),Y(),!ra(V,le)&&e.validateEvent&&(N==null||N.validate("change").catch(Fe=>void 0))},{flush:"post",deep:!0}),me(()=>x.value,V=>{V?G(i.inputValue):(i.inputValue="",i.previousQuery=null,i.isBeforeHide=!0),t("visible-change",V)}),me(()=>i.options.entries(),()=>{var V;if(!ot)return;const le=((V=a.value)==null?void 0:V.querySelectorAll("input"))||[];(!e.filterable&&!e.defaultFirstOption&&!Lt(e.modelValue)||!Array.from(le).includes(document.activeElement))&&Y(),e.defaultFirstOption&&(e.filterable||e.remote)&&qe.value&&K()},{flush:"post"}),me(()=>i.hoveringIndex,V=>{Ve(V)&&V>-1?M.value=Ee.value[V]||{}:M.value={},Ee.value.forEach(le=>{le.hover=M.value===le})}),qu(()=>{i.isBeforeHide||W()});const G=V=>{i.previousQuery===V||E.value||(i.previousQuery=V,e.filterable&&he(e.filterMethod)?e.filterMethod(V):e.filterable&&e.remote&&he(e.remoteMethod)&&e.remoteMethod(V),e.defaultFirstOption&&(e.filterable||e.remote)&&qe.value?ze(K):ze(ee))},K=()=>{const V=Ee.value.filter(Xe=>Xe.visible&&!Xe.disabled&&!Xe.states.groupDisabled),le=V.find(Xe=>Xe.created),Fe=V[0];i.hoveringIndex=Wo(Ee.value,le||Fe)},Y=()=>{if(e.multiple)i.selectedLabel="";else{const le=ce(e.modelValue)?e.modelValue[0]:e.modelValue,Fe=oe(le);i.selectedLabel=Fe.currentLabel,i.selected=[Fe];return}const V=[];Lt(e.modelValue)||fn(e.modelValue).forEach(le=>{V.push(oe(le))}),i.selected=V},oe=V=>{let le;const Fe=Ti(V).toLowerCase()==="object",Xe=Ti(V).toLowerCase()==="null",or=Ti(V).toLowerCase()==="undefined";for(let Pr=i.cachedOptions.size-1;Pr>=0;Pr--){const Sn=F.value[Pr];if(Fe?An(Sn.value,e.valueKey)===An(V,e.valueKey):Sn.value===V){le={value:V,currentLabel:Sn.currentLabel,get isDisabled(){return Sn.isDisabled}};break}}if(le)return le;const fo=Fe?V.label:!Xe&&!or?V:"";return{value:V,currentLabel:fo}},ee=()=>{i.hoveringIndex=Ee.value.findIndex(V=>i.selected.some(le=>qa(le)===qa(V)))},ne=()=>{i.selectionWidth=l.value.getBoundingClientRect().width},X=()=>{i.calculatorWidth=d.value.getBoundingClientRect().width},we=()=>{i.collapseItemWidth=g.value.getBoundingClientRect().width},se=()=>{var V,le;(le=(V=u.value)==null?void 0:V.updatePopper)==null||le.call(V)},L=()=>{var V,le;(le=(V=c.value)==null?void 0:V.updatePopper)==null||le.call(V)},ae=()=>{i.inputValue.length>0&&!x.value&&(x.value=!0),G(i.inputValue)},Se=V=>{if(i.inputValue=V.target.value,e.remote)De();else return ae()},De=SC(()=>{ae()},Ce.value),Le=V=>{ra(e.modelValue,V)||t(Qr,V)},Pt=V=>EC(V,le=>!i.disabledOptions.has(le)),yt=V=>{if(e.multiple&&V.code!==In.delete&&V.target.value.length<=0){const le=fn(e.modelValue).slice(),Fe=Pt(le);if(Fe<0)return;const Xe=le[Fe];le.splice(Fe,1),t(rt,le),Le(le),t("remove-tag",Xe)}},Ht=(V,le)=>{const Fe=i.selected.indexOf(le);if(Fe>-1&&!R.value){const Xe=fn(e.modelValue).slice();Xe.splice(Fe,1),t(rt,Xe),Le(Xe),t("remove-tag",le.value)}V.stopPropagation(),ni()},Tt=V=>{V.stopPropagation();const le=e.multiple?[]:Z.value;if(e.multiple)for(const Fe of i.selected)Fe.isDisabled&&le.push(Fe.value);t(rt,le),Le(le),i.hoveringIndex=-1,x.value=!1,t("clear"),ni()},rr=V=>{var le;if(e.multiple){const Fe=fn((le=e.modelValue)!=null?le:[]).slice(),Xe=Wo(Fe,V.value);Xe>-1?Fe.splice(Xe,1):(e.multipleLimit<=0||Fe.length{bt(V)})},Wo=(V=[],le)=>{if(!xe(le))return V.indexOf(le);const Fe=e.valueKey;let Xe=-1;return V.some((or,fo)=>Ie(An(or,Fe))===An(le,Fe)?(Xe=fo,!0):!1),Xe},bt=V=>{var le,Fe,Xe,or,fo;const ri=ce(V)?V[0]:V;let Pr=null;if(ri!=null&&ri.value){const Sn=Ee.value.filter(Mc=>Mc.value===ri.value);Sn.length>0&&(Pr=Sn[0].$el)}if(u.value&&Pr){const Sn=(or=(Xe=(Fe=(le=u.value)==null?void 0:le.popperRef)==null?void 0:Fe.contentRef)==null?void 0:Xe.querySelector)==null?void 0:or.call(Xe,`.${o.be("dropdown","wrap")}`);Sn&&IC(Sn,Pr)}(fo=_.value)==null||fo.handleScroll()},Jt=V=>{i.options.set(V.value,V),i.cachedOptions.set(V.value,V),V.disabled&&i.disabledOptions.set(V.value,V)},ti=(V,le)=>{i.options.get(V)===le&&i.options.delete(V)},Qg=T(()=>{var V,le;return(le=(V=u.value)==null?void 0:V.popperRef)==null?void 0:le.contentRef}),ey=()=>{i.isBeforeHide=!1,ze(()=>bt(i.selected))},ni=()=>{var V;(V=f.value)==null||V.focus()},kc=()=>{var V;(V=f.value)==null||V.blur()},ty=V=>{Tt(V)},ny=()=>{x.value=!1,P.value&&kc()},ry=()=>{i.inputValue.length>0?i.inputValue="":x.value=!1},Lc=()=>{R.value||(Kl&&(i.inputHovering=!0),i.menuVisibleOnFocus?i.menuVisibleOnFocus=!1:x.value=!x.value)},oy=()=>{x.value?Ee.value[i.hoveringIndex]&&rr(Ee.value[i.hoveringIndex]):Lc()},qa=V=>xe(V.value)?An(V.value,e.valueKey):V.value,sy=T(()=>Ee.value.filter(V=>V.visible).every(V=>V.disabled)),iy=T(()=>e.multiple?e.collapseTags?i.selected.slice(0,e.maxCollapseTags):i.selected:[]),ay=T(()=>e.multiple?e.collapseTags?i.selected.slice(e.maxCollapseTags):[]:[]),Nc=V=>{if(!x.value){x.value=!0;return}if(!(i.options.size===0||i.filteredOptionsCount===0||E.value)&&!sy.value){V==="next"?(i.hoveringIndex++,i.hoveringIndex===i.options.size&&(i.hoveringIndex=0)):V==="prev"&&(i.hoveringIndex--,i.hoveringIndex<0&&(i.hoveringIndex=i.options.size-1));const le=Ee.value[i.hoveringIndex];(le.disabled===!0||le.states.groupDisabled===!0||!le.visible)&&Nc(V),ze(()=>bt(M.value))}},ly=()=>{if(!l.value)return 0;const V=window.getComputedStyle(l.value);return Number.parseFloat(V.gap||"6px")},uy=T(()=>{const V=ly();return{maxWidth:`${g.value&&e.maxCollapseTags===1?i.selectionWidth-i.collapseItemWidth-V:i.selectionWidth}px`}}),cy=T(()=>({maxWidth:`${i.selectionWidth}px`})),fy=T(()=>({width:`${Math.max(i.calculatorWidth,QR)}px`}));return Ft(l,ne),Ft(d,X),Ft(h,se),Ft(A,se),Ft(y,L),Ft(g,we),Ue(()=>{Y()}),{inputId:D,contentId:r,nsSelect:o,nsInput:s,states:i,isFocused:P,expanded:x,optionsArray:Ee,hoverOption:M,selectSize:te,filteredOptionsCount:qe,resetCalculatorWidth:X,updateTooltip:se,updateTagTooltip:L,debouncedOnInputChange:De,onInput:Se,deletePrevTag:yt,deleteTag:Ht,deleteSelected:Tt,handleOptionSelect:rr,scrollToOption:bt,hasModelValue:H,shouldShowPlaceholder:w,currentPlaceholder:C,mouseEnterEventName:k,showClose:re,iconComponent:ye,iconReverse:Ne,validateState:Me,validateIcon:Pe,showNewOption:j,updateOptions:W,collapseTagSize:be,setSelected:Y,selectDisabled:R,emptyText:We,handleCompositionStart:S,handleCompositionUpdate:b,handleCompositionEnd:O,onOptionCreate:Jt,onOptionDestroy:ti,handleMenuEnter:ey,focus:ni,blur:kc,handleClearClick:ty,handleClickOutside:ny,handleEsc:ry,toggleMenu:Lc,selectOption:oy,getValueKey:qa,navigateOptions:Nc,dropdownMenuVisible:Te,showTagList:iy,collapseTagList:ay,tagStyle:uy,collapseTagStyle:cy,inputStyle:fy,popperRef:Qg,inputRef:f,tooltipRef:u,tagTooltipRef:c,calculatorRef:d,prefixRef:v,suffixRef:p,selectRef:a,wrapperRef:A,selectionRef:l,scrollbarRef:_,menuRef:h,tagMenuRef:y,collapseItemRef:g}};var tP=J({name:"ElOptions",setup(e,{slots:t}){const n=_e(Ba);let r=[];return()=>{var o,s;const i=(o=t.default)==null?void 0:o.call(t),a=[];function l(u){ce(u)&&u.forEach(c=>{var f,d,v,p;const h=(f=(c==null?void 0:c.type)||{})==null?void 0:f.name;h==="ElOptionGroup"?l(!Oe(c.children)&&!ce(c.children)&&he((d=c.children)==null?void 0:d.default)?(v=c.children)==null?void 0:v.default():c.children):h==="ElOption"?a.push((p=c.props)==null?void 0:p.value):ce(c.children)&&l(c.children)})}return i.length&&l((s=i[0])==null?void 0:s.children),ra(a,r)||(r=a,n&&(n.states.optionValues=a)),i}}});const nP=Re({name:String,id:String,modelValue:{type:[Array,String,Number,Boolean,Object],default:void 0},autocomplete:{type:String,default:"off"},automaticDropdown:Boolean,size:co,effect:{type:ge(String),default:"light"},disabled:Boolean,clearable:Boolean,filterable:Boolean,allowCreate:Boolean,loading:Boolean,popperClass:{type:String,default:""},popperOptions:{type:ge(Object),default:()=>({})},remote:Boolean,loadingText:String,noMatchText:String,noDataText:String,remoteMethod:Function,filterMethod:Function,multiple:Boolean,multipleLimit:{type:Number,default:0},placeholder:{type:String},defaultFirstOption:Boolean,reserveKeyword:{type:Boolean,default:!0},valueKey:{type:String,default:"value"},collapseTags:Boolean,collapseTagsTooltip:Boolean,maxCollapseTags:{type:Number,default:1},teleported:Ut.teleported,persistent:{type:Boolean,default:!0},clearIcon:{type:Bt,default:uc},fitInputWidth:Boolean,suffixIcon:{type:Bt,default:am},tagType:{...au.type,default:"info"},tagEffect:{...au.effect,default:"light"},validateEvent:{type:Boolean,default:!0},remoteShowSuffix:Boolean,placement:{type:ge(String),values:La,default:"bottom-start"},fallbackPlacements:{type:ge(Array),default:["bottom-start","top-start","right","left"]},...Dm,...nr(["ariaLabel"])}),_p="ElSelect",rP=J({name:_p,componentName:_p,components:{ElSelectMenu:ZR,ElOption:Oc,ElOptions:tP,ElTag:pR,ElScrollbar:v4,ElTooltip:eg,ElIcon:tt},directives:{ClickOutside:WA},props:nP,emits:[rt,Qr,"remove-tag","clear","visible-change","focus","blur"],setup(e,{emit:t}){const n=T(()=>{const{modelValue:s,multiple:i}=e,a=i?[]:void 0;return ce(s)?i?s:a:i?a:s}),r=Et({...Or(e),modelValue:n}),o=eP(r,t);return ct(Ba,Et({props:r,states:o.states,optionsArray:o.optionsArray,handleOptionSelect:o.handleOptionSelect,onOptionCreate:o.onOptionCreate,onOptionDestroy:o.onOptionDestroy,selectRef:o.selectRef,setSelected:o.setSelected})),{...o,modelValue:n}}});function oP(e,t,n,r,o,s){const i=$r("el-tag"),a=$r("el-tooltip"),l=$r("el-icon"),u=$r("el-option"),c=$r("el-options"),f=$r("el-scrollbar"),d=$r("el-select-menu"),v=mb("click-outside");return ht(($(),Q("div",{ref:"selectRef",class:q([e.nsSelect.b(),e.nsSelect.m(e.selectSize)]),[Oi(e.mouseEnterEventName)]:p=>e.states.inputHovering=!0,onMouseleave:p=>e.states.inputHovering=!1},[ie(a,{ref:"tooltipRef",visible:e.dropdownMenuVisible,placement:e.placement,teleported:e.teleported,"popper-class":[e.nsSelect.e("popper"),e.popperClass],"popper-options":e.popperOptions,"fallback-placements":e.fallbackPlacements,effect:e.effect,pure:"",trigger:"click",transition:`${e.nsSelect.namespace.value}-zoom-in-top`,"stop-popper-mouse-event":!1,"gpu-acceleration":!1,persistent:e.persistent,onBeforeShow:e.handleMenuEnter,onHide:p=>e.states.isBeforeHide=!1},{default:ve(()=>{var p;return[fe("div",{ref:"wrapperRef",class:q([e.nsSelect.e("wrapper"),e.nsSelect.is("focused",e.isFocused),e.nsSelect.is("hovering",e.states.inputHovering),e.nsSelect.is("filterable",e.filterable),e.nsSelect.is("disabled",e.selectDisabled)]),onClick:ut(e.toggleMenu,["prevent"])},[e.$slots.prefix?($(),Q("div",{key:0,ref:"prefixRef",class:q(e.nsSelect.e("prefix"))},[de(e.$slots,"prefix")],2)):ue("v-if",!0),fe("div",{ref:"selectionRef",class:q([e.nsSelect.e("selection"),e.nsSelect.is("near",e.multiple&&!e.$slots.prefix&&!!e.states.selected.length)])},[e.multiple?de(e.$slots,"tag",{key:0},()=>[($(!0),Q(et,null,Jc(e.showTagList,h=>($(),Q("div",{key:e.getValueKey(h),class:q(e.nsSelect.e("selected-item"))},[ie(i,{closable:!e.selectDisabled&&!h.isDisabled,size:e.collapseTagSize,type:e.tagType,effect:e.tagEffect,"disable-transitions":"",style:it(e.tagStyle),onClose:y=>e.deleteTag(y,h)},{default:ve(()=>[fe("span",{class:q(e.nsSelect.e("tags-text"))},[de(e.$slots,"label",{label:h.currentLabel,value:h.value},()=>[Xr(Je(h.currentLabel),1)])],2)]),_:2},1032,["closable","size","type","effect","style","onClose"])],2))),128)),e.collapseTags&&e.states.selected.length>e.maxCollapseTags?($(),pe(a,{key:0,ref:"tagTooltipRef",disabled:e.dropdownMenuVisible||!e.collapseTagsTooltip,"fallback-placements":["bottom","top","right","left"],effect:e.effect,placement:"bottom",teleported:e.teleported},{default:ve(()=>[fe("div",{ref:"collapseItemRef",class:q(e.nsSelect.e("selected-item"))},[ie(i,{closable:!1,size:e.collapseTagSize,type:e.tagType,effect:e.tagEffect,"disable-transitions":"",style:it(e.collapseTagStyle)},{default:ve(()=>[fe("span",{class:q(e.nsSelect.e("tags-text"))}," + "+Je(e.states.selected.length-e.maxCollapseTags),3)]),_:1},8,["size","type","effect","style"])],2)]),content:ve(()=>[fe("div",{ref:"tagMenuRef",class:q(e.nsSelect.e("selection"))},[($(!0),Q(et,null,Jc(e.collapseTagList,h=>($(),Q("div",{key:e.getValueKey(h),class:q(e.nsSelect.e("selected-item"))},[ie(i,{class:"in-tooltip",closable:!e.selectDisabled&&!h.isDisabled,size:e.collapseTagSize,type:e.tagType,effect:e.tagEffect,"disable-transitions":"",onClose:y=>e.deleteTag(y,h)},{default:ve(()=>[fe("span",{class:q(e.nsSelect.e("tags-text"))},[de(e.$slots,"label",{label:h.currentLabel,value:h.value},()=>[Xr(Je(h.currentLabel),1)])],2)]),_:2},1032,["closable","size","type","effect","onClose"])],2))),128))],2)]),_:3},8,["disabled","effect","teleported"])):ue("v-if",!0)]):ue("v-if",!0),e.selectDisabled?ue("v-if",!0):($(),Q("div",{key:1,class:q([e.nsSelect.e("selected-item"),e.nsSelect.e("input-wrapper"),e.nsSelect.is("hidden",!e.filterable)])},[ht(fe("input",{id:e.inputId,ref:"inputRef","onUpdate:modelValue":h=>e.states.inputValue=h,type:"text",name:e.name,class:q([e.nsSelect.e("input"),e.nsSelect.is(e.selectSize)]),disabled:e.selectDisabled,autocomplete:e.autocomplete,style:it(e.inputStyle),role:"combobox",readonly:!e.filterable,spellcheck:"false","aria-activedescendant":((p=e.hoverOption)==null?void 0:p.id)||"","aria-controls":e.contentId,"aria-expanded":e.dropdownMenuVisible,"aria-label":e.ariaLabel,"aria-autocomplete":"none","aria-haspopup":"listbox",onKeydown:[xn(ut(h=>e.navigateOptions("next"),["stop","prevent"]),["down"]),xn(ut(h=>e.navigateOptions("prev"),["stop","prevent"]),["up"]),xn(ut(e.handleEsc,["stop","prevent"]),["esc"]),xn(ut(e.selectOption,["stop","prevent"]),["enter"]),xn(ut(e.deletePrevTag,["stop"]),["delete"])],onCompositionstart:e.handleCompositionStart,onCompositionupdate:e.handleCompositionUpdate,onCompositionend:e.handleCompositionEnd,onInput:e.onInput,onClick:ut(e.toggleMenu,["stop"])},null,46,["id","onUpdate:modelValue","name","disabled","autocomplete","readonly","aria-activedescendant","aria-controls","aria-expanded","aria-label","onKeydown","onCompositionstart","onCompositionupdate","onCompositionend","onInput","onClick"]),[[M0,e.states.inputValue]]),e.filterable?($(),Q("span",{key:0,ref:"calculatorRef","aria-hidden":"true",class:q(e.nsSelect.e("input-calculator")),textContent:Je(e.states.inputValue)},null,10,["textContent"])):ue("v-if",!0)],2)),e.shouldShowPlaceholder?($(),Q("div",{key:2,class:q([e.nsSelect.e("selected-item"),e.nsSelect.e("placeholder"),e.nsSelect.is("transparent",!e.hasModelValue||e.expanded&&!e.states.inputValue)])},[e.hasModelValue?de(e.$slots,"label",{key:0,label:e.currentPlaceholder,value:e.modelValue},()=>[fe("span",null,Je(e.currentPlaceholder),1)]):($(),Q("span",{key:1},Je(e.currentPlaceholder),1))],2)):ue("v-if",!0)],2),fe("div",{ref:"suffixRef",class:q(e.nsSelect.e("suffix"))},[e.iconComponent&&!e.showClose?($(),pe(l,{key:0,class:q([e.nsSelect.e("caret"),e.nsSelect.e("icon"),e.iconReverse])},{default:ve(()=>[($(),pe(at(e.iconComponent)))]),_:1},8,["class"])):ue("v-if",!0),e.showClose&&e.clearIcon?($(),pe(l,{key:1,class:q([e.nsSelect.e("caret"),e.nsSelect.e("icon"),e.nsSelect.e("clear")]),onClick:e.handleClearClick},{default:ve(()=>[($(),pe(at(e.clearIcon)))]),_:1},8,["class","onClick"])):ue("v-if",!0),e.validateState&&e.validateIcon?($(),pe(l,{key:2,class:q([e.nsInput.e("icon"),e.nsInput.e("validateIcon")])},{default:ve(()=>[($(),pe(at(e.validateIcon)))]),_:1},8,["class"])):ue("v-if",!0)],2)],10,["onClick"])]}),content:ve(()=>[ie(d,{ref:"menuRef"},{default:ve(()=>[e.$slots.header?($(),Q("div",{key:0,class:q(e.nsSelect.be("dropdown","header")),onClick:ut(()=>{},["stop"])},[de(e.$slots,"header")],10,["onClick"])):ue("v-if",!0),ht(ie(f,{id:e.contentId,ref:"scrollbarRef",tag:"ul","wrap-class":e.nsSelect.be("dropdown","wrap"),"view-class":e.nsSelect.be("dropdown","list"),class:q([e.nsSelect.is("empty",e.filteredOptionsCount===0)]),role:"listbox","aria-label":e.ariaLabel,"aria-orientation":"vertical"},{default:ve(()=>[e.showNewOption?($(),pe(u,{key:0,value:e.states.inputValue,created:!0},null,8,["value"])):ue("v-if",!0),ie(c,null,{default:ve(()=>[de(e.$slots,"default")]),_:3})]),_:3},8,["id","wrap-class","view-class","class","aria-label"]),[[Mn,e.states.options.size>0&&!e.loading]]),e.$slots.loading&&e.loading?($(),Q("div",{key:1,class:q(e.nsSelect.be("dropdown","loading"))},[de(e.$slots,"loading")],2)):e.loading||e.filteredOptionsCount===0?($(),Q("div",{key:2,class:q(e.nsSelect.be("dropdown","empty"))},[de(e.$slots,"empty",{},()=>[fe("span",null,Je(e.emptyText),1)])],2)):ue("v-if",!0),e.$slots.footer?($(),Q("div",{key:3,class:q(e.nsSelect.be("dropdown","footer")),onClick:ut(()=>{},["stop"])},[de(e.$slots,"footer")],10,["onClick"])):ue("v-if",!0)]),_:3},512)]),_:3},8,["visible","placement","teleported","popper-class","popper-options","fallback-placements","effect","transition","persistent","onBeforeShow","onHide"])],16,["onMouseleave"])),[[v,e.handleClickOutside,e.popperRef]])}var sP=ke(rP,[["render",oP],["__file","select.vue"]]);const iP=J({name:"ElOptionGroup",componentName:"ElOptionGroup",props:{label:String,disabled:Boolean},setup(e){const t=$e("select"),n=z(null),r=st(),o=z([]);ct(fg,Et({...Or(e)}));const s=T(()=>o.value.some(u=>u.visible===!0)),i=u=>{var c,f;return((c=u.type)==null?void 0:c.name)==="ElOption"&&!!((f=u.component)!=null&&f.proxy)},a=u=>{const c=fn(u),f=[];return c.forEach(d=>{var v,p;i(d)?f.push(d.component.proxy):(v=d.children)!=null&&v.length?f.push(...a(d.children)):(p=d.component)!=null&&p.subTree&&f.push(...a(d.component.subTree))}),f},l=()=>{o.value=a(r.subTree)};return Ue(()=>{l()}),m1(n,l,{attributes:!0,subtree:!0,childList:!0}),{groupRef:n,visible:s,ns:t}}});function aP(e,t,n,r,o,s){return ht(($(),Q("ul",{ref:"groupRef",class:q(e.ns.be("group","wrap"))},[fe("li",{class:q(e.ns.be("group","title"))},Je(e.label),3),fe("li",null,[fe("ul",{class:q(e.ns.b("group"))},[de(e.$slots,"default")],2)])],2)),[[Mn,e.visible]])}var dg=ke(iP,[["render",aP],["__file","option-group.vue"]]);const O8=gt(sP,{Option:Oc,OptionGroup:dg}),x8=uo(Oc);uo(dg);const lP=Re({trigger:Ms.trigger,placement:yl.placement,disabled:Ms.disabled,visible:Ut.visible,transition:Ut.transition,popperOptions:yl.popperOptions,tabindex:yl.tabindex,content:Ut.content,popperStyle:Ut.popperStyle,popperClass:Ut.popperClass,enterable:{...Ut.enterable,default:!0},effect:{...Ut.effect,default:"light"},teleported:Ut.teleported,title:String,width:{type:[String,Number],default:150},offset:{type:Number,default:void 0},showAfter:{type:Number,default:0},hideAfter:{type:Number,default:200},autoClose:{type:Number,default:0},showArrow:{type:Boolean,default:!0},persistent:{type:Boolean,default:!0},"onUpdate:visible":{type:Function}}),uP={"update:visible":e=>Nt(e),"before-enter":()=>!0,"before-leave":()=>!0,"after-enter":()=>!0,"after-leave":()=>!0},cP="onUpdate:visible",fP=J({name:"ElPopover"}),dP=J({...fP,props:lP,emits:uP,setup(e,{expose:t,emit:n}){const r=e,o=T(()=>r[cP]),s=$e("popover"),i=z(),a=T(()=>{var y;return(y=m(i))==null?void 0:y.popperRef}),l=T(()=>[{width:on(r.width)},r.popperStyle]),u=T(()=>[s.b(),r.popperClass,{[s.m("plain")]:!!r.content}]),c=T(()=>r.transition===`${s.namespace.value}-fade-in-linear`),f=()=>{var y;(y=i.value)==null||y.hide()},d=()=>{n("before-enter")},v=()=>{n("before-leave")},p=()=>{n("after-enter")},h=()=>{n("update:visible",!1),n("after-leave")};return t({popperRef:a,hide:f}),(y,g)=>($(),pe(m(eg),hn({ref_key:"tooltipRef",ref:i},y.$attrs,{trigger:y.trigger,placement:y.placement,disabled:y.disabled,visible:y.visible,transition:y.transition,"popper-options":y.popperOptions,tabindex:y.tabindex,content:y.content,offset:y.offset,"show-after":y.showAfter,"hide-after":y.hideAfter,"auto-close":y.autoClose,"show-arrow":y.showArrow,"aria-label":y.title,effect:y.effect,enterable:y.enterable,"popper-class":m(u),"popper-style":m(l),teleported:y.teleported,persistent:y.persistent,"gpu-acceleration":m(c),"onUpdate:visible":m(o),onBeforeShow:d,onBeforeHide:v,onShow:p,onHide:h}),{content:ve(()=>[y.title?($(),Q("div",{key:0,class:q(m(s).e("title")),role:"title"},Je(y.title),3)):ue("v-if",!0),de(y.$slots,"default",{},()=>[Xr(Je(y.content),1)])]),default:ve(()=>[y.$slots.reference?de(y.$slots,"reference",{key:0}):ue("v-if",!0)]),_:3},16,["trigger","placement","disabled","visible","transition","popper-options","tabindex","content","offset","show-after","hide-after","auto-close","show-arrow","aria-label","effect","enterable","popper-class","popper-style","teleported","persistent","gpu-acceleration","onUpdate:visible"]))}});var pP=ke(dP,[["__file","popover.vue"]]);const Sp=(e,t)=>{const n=t.arg||t.value,r=n==null?void 0:n.popperRef;r&&(r.triggerRef=e)};var hP={mounted(e,t){Sp(e,t)},updated(e,t){Sp(e,t)}};const vP="popover",mP=dT(hP,vP),A8=gt(pP,{directive:mP}),gP=Re({modelValue:{type:[Boolean,String,Number],default:!1},disabled:Boolean,loading:Boolean,size:{type:String,validator:hT},width:{type:[String,Number],default:""},inlinePrompt:Boolean,inactiveActionIcon:{type:Bt},activeActionIcon:{type:Bt},activeIcon:{type:Bt},inactiveIcon:{type:Bt},activeText:{type:String,default:""},inactiveText:{type:String,default:""},activeValue:{type:[Boolean,String,Number],default:!0},inactiveValue:{type:[Boolean,String,Number],default:!1},name:{type:String,default:""},validateEvent:{type:Boolean,default:!0},beforeChange:{type:ge(Function)},id:String,tabindex:{type:[String,Number]},...nr(["ariaLabel"])}),yP={[rt]:e=>Nt(e)||Oe(e)||Ve(e),[Qr]:e=>Nt(e)||Oe(e)||Ve(e),[qr]:e=>Nt(e)||Oe(e)||Ve(e)},pg="ElSwitch",bP=J({name:pg}),wP=J({...bP,props:gP,emits:yP,setup(e,{expose:t,emit:n}){const r=e,{formItem:o}=Rr(),s=yn(),i=$e("switch"),{inputId:a}=Js(r,{formItemContext:o}),l=Ho(T(()=>r.loading)),u=z(r.modelValue!==!1),c=z(),f=z(),d=T(()=>[i.b(),i.m(s.value),i.is("disabled",l.value),i.is("checked",g.value)]),v=T(()=>[i.e("label"),i.em("label","left"),i.is("active",!g.value)]),p=T(()=>[i.e("label"),i.em("label","right"),i.is("active",g.value)]),h=T(()=>({width:on(r.width)}));me(()=>r.modelValue,()=>{u.value=!0});const y=T(()=>u.value?r.modelValue:!1),g=T(()=>y.value===r.activeValue);[r.activeValue,r.inactiveValue].includes(y.value)||(n(rt,r.inactiveValue),n(Qr,r.inactiveValue),n(qr,r.inactiveValue)),me(g,b=>{var O;c.value.checked=b,r.validateEvent&&((O=o==null?void 0:o.validate)==null||O.call(o,"change").catch(A=>void 0))});const _=()=>{const b=g.value?r.inactiveValue:r.activeValue;n(rt,b),n(Qr,b),n(qr,b),ze(()=>{c.value.checked=g.value})},E=()=>{if(l.value)return;const{beforeChange:b}=r;if(!b){_();return}const O=b();[Vi(O),Nt(O)].includes(!0)||xr(pg,"beforeChange must return type `Promise` or `boolean`"),Vi(O)?O.then(P=>{P&&_()}).catch(P=>{}):O&&_()},S=()=>{var b,O;(O=(b=c.value)==null?void 0:b.focus)==null||O.call(b)};return Ue(()=>{c.value.checked=g.value}),t({focus:S,checked:g}),(b,O)=>($(),Q("div",{class:q(m(d)),onClick:ut(E,["prevent"])},[fe("input",{id:m(a),ref_key:"input",ref:c,class:q(m(i).e("input")),type:"checkbox",role:"switch","aria-checked":m(g),"aria-disabled":m(l),"aria-label":b.ariaLabel,name:b.name,"true-value":b.activeValue,"false-value":b.inactiveValue,disabled:m(l),tabindex:b.tabindex,onChange:_,onKeydown:xn(E,["enter"])},null,42,["id","aria-checked","aria-disabled","aria-label","name","true-value","false-value","disabled","tabindex","onKeydown"]),!b.inlinePrompt&&(b.inactiveIcon||b.inactiveText)?($(),Q("span",{key:0,class:q(m(v))},[b.inactiveIcon?($(),pe(m(tt),{key:0},{default:ve(()=>[($(),pe(at(b.inactiveIcon)))]),_:1})):ue("v-if",!0),!b.inactiveIcon&&b.inactiveText?($(),Q("span",{key:1,"aria-hidden":m(g)},Je(b.inactiveText),9,["aria-hidden"])):ue("v-if",!0)],2)):ue("v-if",!0),fe("span",{ref_key:"core",ref:f,class:q(m(i).e("core")),style:it(m(h))},[b.inlinePrompt?($(),Q("div",{key:0,class:q(m(i).e("inner"))},[b.activeIcon||b.inactiveIcon?($(),pe(m(tt),{key:0,class:q(m(i).is("icon"))},{default:ve(()=>[($(),pe(at(m(g)?b.activeIcon:b.inactiveIcon)))]),_:1},8,["class"])):b.activeText||b.inactiveText?($(),Q("span",{key:1,class:q(m(i).is("text")),"aria-hidden":!m(g)},Je(m(g)?b.activeText:b.inactiveText),11,["aria-hidden"])):ue("v-if",!0)],2)):ue("v-if",!0),fe("div",{class:q(m(i).e("action"))},[b.loading?($(),pe(m(tt),{key:0,class:q(m(i).is("loading"))},{default:ve(()=>[ie(m(cc))]),_:1},8,["class"])):m(g)?de(b.$slots,"active-action",{key:1},()=>[b.activeActionIcon?($(),pe(m(tt),{key:0},{default:ve(()=>[($(),pe(at(b.activeActionIcon)))]),_:1})):ue("v-if",!0)]):m(g)?ue("v-if",!0):de(b.$slots,"inactive-action",{key:2},()=>[b.inactiveActionIcon?($(),pe(m(tt),{key:0},{default:ve(()=>[($(),pe(at(b.inactiveActionIcon)))]),_:1})):ue("v-if",!0)])],2)],6),!b.inlinePrompt&&(b.activeIcon||b.activeText)?($(),Q("span",{key:1,class:q(m(p))},[b.activeIcon?($(),pe(m(tt),{key:0},{default:ve(()=>[($(),pe(at(b.activeIcon)))]),_:1})):ue("v-if",!0),!b.activeIcon&&b.activeText?($(),Q("span",{key:1,"aria-hidden":!m(g)},Je(b.activeText),9,["aria-hidden"])):ue("v-if",!0)],2)):ue("v-if",!0)],10,["onClick"]))}});var _P=ke(wP,[["__file","switch.vue"]]);const R8=gt(_P),Da=Symbol("tabsRootContextKey"),SP=Re({tabs:{type:ge(Array),default:()=>$a([])}}),hg="ElTabBar",EP=J({name:hg}),CP=J({...EP,props:SP,setup(e,{expose:t}){const n=e,r=st(),o=_e(Da);o||xr(hg,"");const s=$e("tabs"),i=z(),a=z(),l=()=>{let v=0,p=0;const h=["top","bottom"].includes(o.props.tabPosition)?"width":"height",y=h==="width"?"x":"y",g=y==="x"?"left":"top";return n.tabs.every(_=>{var E,S;const b=(S=(E=r.parent)==null?void 0:E.refs)==null?void 0:S[`tab-${_.uid}`];if(!b)return!1;if(!_.active)return!0;v=b[`offset${yr(g)}`],p=b[`client${yr(h)}`];const O=window.getComputedStyle(b);return h==="width"&&(p-=Number.parseFloat(O.paddingLeft)+Number.parseFloat(O.paddingRight),v+=Number.parseFloat(O.paddingLeft)),!1}),{[h]:`${p}px`,transform:`translate${yr(y)}(${v}px)`}},u=()=>a.value=l(),c=[],f=()=>{var v;c.forEach(h=>h.stop()),c.length=0;const p=(v=r.parent)==null?void 0:v.refs;if(p){for(const h in p)if(h.startsWith("tab-")){const y=p[h];y&&c.push(Ft(y,u))}}};me(()=>n.tabs,async()=>{await ze(),u(),f()},{immediate:!0});const d=Ft(i,()=>u());return Ct(()=>{c.forEach(v=>v.stop()),c.length=0,d.stop()}),t({ref:i,update:u}),(v,p)=>($(),Q("div",{ref_key:"barRef",ref:i,class:q([m(s).e("active-bar"),m(s).is(m(o).props.tabPosition)]),style:it(a.value)},null,6))}});var TP=ke(CP,[["__file","tab-bar.vue"]]);const OP=Re({panes:{type:ge(Array),default:()=>$a([])},currentName:{type:[String,Number],default:""},editable:Boolean,type:{type:String,values:["card","border-card",""],default:""},stretch:Boolean}),xP={tabClick:(e,t,n)=>n instanceof Event,tabRemove:(e,t)=>t instanceof Event},Ep="ElTabNav",AP=J({name:Ep,props:OP,emits:xP,setup(e,{expose:t,emit:n}){const r=_e(Da);r||xr(Ep,"");const o=$e("tabs"),s=u1(),i=S1(),a=z(),l=z(),u=z(),c=z(),f=z(!1),d=z(0),v=z(!1),p=z(!0),h=T(()=>["top","bottom"].includes(r.props.tabPosition)?"width":"height"),y=T(()=>({transform:`translate${h.value==="width"?"X":"Y"}(-${d.value}px)`})),g=()=>{if(!a.value)return;const P=a.value[`offset${yr(h.value)}`],x=d.value;if(!x)return;const M=x>P?x-P:0;d.value=M},_=()=>{if(!a.value||!l.value)return;const P=l.value[`offset${yr(h.value)}`],x=a.value[`offset${yr(h.value)}`],M=d.value;if(P-M<=x)return;const U=P-M>x*2?M+x:P-x;d.value=U},E=async()=>{const P=l.value;if(!f.value||!u.value||!a.value||!P)return;await ze();const x=u.value.querySelector(".is-active");if(!x)return;const M=a.value,U=["top","bottom"].includes(r.props.tabPosition),N=x.getBoundingClientRect(),D=M.getBoundingClientRect(),Z=U?P.offsetWidth-D.width:P.offsetHeight-D.height,I=d.value;let R=I;U?(N.leftD.right&&(R=I+N.right-D.right)):(N.topD.bottom&&(R=I+(N.bottom-D.bottom))),R=Math.max(R,0),d.value=Math.min(R,Z)},S=()=>{var P;if(!l.value||!a.value)return;e.stretch&&((P=c.value)==null||P.update());const x=l.value[`offset${yr(h.value)}`],M=a.value[`offset${yr(h.value)}`],U=d.value;M0&&(d.value=0))},b=P=>{const x=P.code,{up:M,down:U,left:N,right:D}=In;if(![M,U,N,D].includes(x))return;const Z=Array.from(P.currentTarget.querySelectorAll("[role=tab]:not(.is-disabled)")),I=Z.indexOf(P.target);let R;x===N||x===M?I===0?R=Z.length-1:R=I-1:I{p.value&&(v.value=!0)},A=()=>v.value=!1;return me(s,P=>{P==="hidden"?p.value=!1:P==="visible"&&setTimeout(()=>p.value=!0,50)}),me(i,P=>{P?setTimeout(()=>p.value=!0,50):p.value=!1}),Ft(u,S),Ue(()=>setTimeout(()=>E(),0)),ro(()=>S()),t({scrollToActiveTab:E,removeFocus:A}),()=>{const P=f.value?[ie("span",{class:[o.e("nav-prev"),o.is("disabled",!f.value.prev)],onClick:g},[ie(tt,null,{default:()=>[ie(LC,null,null)]})]),ie("span",{class:[o.e("nav-next"),o.is("disabled",!f.value.next)],onClick:_},[ie(tt,null,{default:()=>[ie(MC,null,null)]})])]:null,x=e.panes.map((M,U)=>{var N,D,Z,I;const R=M.uid,H=M.props.disabled,re=(D=(N=M.props.name)!=null?N:M.index)!=null?D:`${U}`,ye=!H&&(M.isClosable||e.editable);M.index=`${U}`;const Ne=ye?ie(tt,{class:"is-icon-close",onClick:Ce=>n("tabRemove",M,Ce)},{default:()=>[ie($s,null,null)]}):null,Me=((I=(Z=M.slots).label)==null?void 0:I.call(Z))||M.props.label,Pe=!H&&M.active?0:-1;return ie("div",{ref:`tab-${R}`,class:[o.e("item"),o.is(r.props.tabPosition),o.is("active",M.active),o.is("disabled",H),o.is("closable",ye),o.is("focus",v.value)],id:`tab-${re}`,key:`tab-${R}`,"aria-controls":`pane-${re}`,role:"tab","aria-selected":M.active,tabindex:Pe,onFocus:()=>O(),onBlur:()=>A(),onClick:Ce=>{A(),n("tabClick",M,re,Ce)},onKeydown:Ce=>{ye&&(Ce.code===In.delete||Ce.code===In.backspace)&&n("tabRemove",M,Ce)}},[Me,Ne])});return ie("div",{ref:u,class:[o.e("nav-wrap"),o.is("scrollable",!!f.value),o.is(r.props.tabPosition)]},[P,ie("div",{class:o.e("nav-scroll"),ref:a},[ie("div",{class:[o.e("nav"),o.is(r.props.tabPosition),o.is("stretch",e.stretch&&["top","bottom"].includes(r.props.tabPosition))],ref:l,style:y.value,role:"tablist",onKeydown:b},[e.type?null:ie(TP,{ref:c,tabs:[...e.panes]},null),x])])])}}}),RP=Re({type:{type:String,values:["card","border-card",""],default:""},closable:Boolean,addable:Boolean,modelValue:{type:[String,Number]},editable:Boolean,tabPosition:{type:String,values:["top","right","bottom","left"],default:"top"},beforeLeave:{type:ge(Function),default:()=>!0},stretch:Boolean}),bl=e=>Oe(e)||Ve(e),PP={[rt]:e=>bl(e),tabClick:(e,t)=>t instanceof Event,tabChange:e=>bl(e),edit:(e,t)=>["remove","add"].includes(t),tabRemove:e=>bl(e),tabAdd:()=>!0},IP=J({name:"ElTabs",props:RP,emits:PP,setup(e,{emit:t,slots:n,expose:r}){var o;const s=$e("tabs"),i=T(()=>["left","right"].includes(e.tabPosition)),{children:a,addChild:l,removeChild:u}=HO(st(),"ElTabPane"),c=z(),f=z((o=e.modelValue)!=null?o:"0"),d=async(g,_=!1)=>{var E,S,b;if(!(f.value===g||Lt(g)))try{await((E=e.beforeLeave)==null?void 0:E.call(e,g,f.value))!==!1&&(f.value=g,_&&(t(rt,g),t("tabChange",g)),(b=(S=c.value)==null?void 0:S.removeFocus)==null||b.call(S))}catch{}},v=(g,_,E)=>{g.props.disabled||(d(_,!0),t("tabClick",g,E))},p=(g,_)=>{g.props.disabled||Lt(g.props.name)||(_.stopPropagation(),t("edit",g.props.name,"remove"),t("tabRemove",g.props.name))},h=()=>{t("edit",void 0,"add"),t("tabAdd")};me(()=>e.modelValue,g=>d(g)),me(f,async()=>{var g;await ze(),(g=c.value)==null||g.scrollToActiveTab()}),ct(Da,{props:e,currentName:f,registerPane:g=>{a.value.push(g)},sortPane:l,unregisterPane:u}),r({currentName:f});const y=({render:g})=>g();return()=>{const g=n["add-icon"],_=e.editable||e.addable?ie("div",{class:[s.e("new-tab"),i.value&&s.e("new-tab-vertical")],tabindex:"0",onClick:h,onKeydown:b=>{b.code===In.enter&&h()}},[g?de(n,"add-icon"):ie(tt,{class:s.is("icon-plus")},{default:()=>[ie(cm,null,null)]})]):null,E=ie("div",{class:[s.e("header"),i.value&&s.e("header-vertical"),s.is(e.tabPosition)]},[ie(y,{render:()=>{const b=a.value.some(O=>O.slots.label);return ie(AP,{ref:c,currentName:f.value,editable:e.editable,type:e.type,panes:a.value,stretch:e.stretch,onTabClick:v,onTabRemove:p},{$stable:!b})}},null),_]),S=ie("div",{class:s.e("content")},[de(n,"default")]);return ie("div",{class:[s.b(),s.m(e.tabPosition),{[s.m("card")]:e.type==="card",[s.m("border-card")]:e.type==="border-card"}]},[S,E])}}}),$P=Re({label:{type:String,default:""},name:{type:[String,Number]},closable:Boolean,disabled:Boolean,lazy:Boolean}),vg="ElTabPane",kP=J({name:vg}),LP=J({...kP,props:$P,setup(e){const t=e,n=st(),r=so(),o=_e(Da);o||xr(vg,"usage: ");const s=$e("tab-pane"),i=z(),a=T(()=>t.closable||o.props.closable),l=Wf(()=>{var v;return o.currentName.value===((v=t.name)!=null?v:i.value)}),u=z(l.value),c=T(()=>{var v;return(v=t.name)!=null?v:i.value}),f=Wf(()=>!t.lazy||u.value||l.value);me(l,v=>{v&&(u.value=!0)});const d=Et({uid:n.uid,slots:r,props:t,paneName:c,active:l,index:i,isClosable:a});return o.registerPane(d),Ue(()=>{o.sortPane(d)}),oo(()=>{o.unregisterPane(d.uid)}),(v,p)=>m(f)?ht(($(),Q("div",{key:0,id:`pane-${m(c)}`,class:q(m(s).b()),role:"tabpanel","aria-hidden":!m(l),"aria-labelledby":`tab-${m(c)}`},[de(v.$slots,"default")],10,["id","aria-hidden","aria-labelledby"])),[[Mn,m(l)]]):ue("v-if",!0)}});var mg=ke(LP,[["__file","tab-pane.vue"]]);const P8=gt(IP,{TabPane:mg}),I8=uo(mg),NP=Re({type:{type:String,values:["primary","success","info","warning","danger",""],default:""},size:{type:String,values:jo,default:""},truncated:Boolean,lineClamp:{type:[String,Number]},tag:{type:String,default:"span"}}),MP=J({name:"ElText"}),FP=J({...MP,props:NP,setup(e){const t=e,n=yn(),r=$e("text"),o=T(()=>[r.b(),r.m(t.type),r.m(n.value),r.is("truncated",t.truncated),r.is("line-clamp",!Lt(t.lineClamp))]);return(s,i)=>($(),pe(at(s.tag),{class:q(m(o)),style:it({"-webkit-line-clamp":s.lineClamp})},{default:ve(()=>[de(s.$slots,"default")]),_:3},8,["class","style"]))}});var BP=ke(FP,[["__file","text.vue"]]);const $8=gt(BP);function DP(e){let t;const n=z(!1),r=Et({...e,originalPosition:"",originalOverflow:"",visible:!1});function o(d){r.text=d}function s(){const d=r.parent,v=f.ns;if(!d.vLoadingAddClassList){let p=d.getAttribute("loading-number");p=Number.parseInt(p)-1,p?d.setAttribute("loading-number",p.toString()):(Is(d,v.bm("parent","relative")),d.removeAttribute("loading-number")),Is(d,v.bm("parent","hidden"))}i(),c.unmount()}function i(){var d,v;(v=(d=f.$el)==null?void 0:d.parentNode)==null||v.removeChild(f.$el)}function a(){var d;e.beforeClose&&!e.beforeClose()||(n.value=!0,clearTimeout(t),t=setTimeout(l,400),r.visible=!1,(d=e.closed)==null||d.call(e))}function l(){if(!n.value)return;const d=r.parent;n.value=!1,d.vLoadingAddClassList=void 0,s()}const c=z0(J({name:"ElLoading",setup(d,{expose:v}){const{ns:p,zIndex:h}=jm("loading");return v({ns:p,zIndex:h}),()=>{const y=r.spinner||r.svg,g=Un("svg",{class:"circular",viewBox:r.svgViewBox?r.svgViewBox:"0 0 50 50",...y?{innerHTML:y}:{}},[Un("circle",{class:"path",cx:"25",cy:"25",r:"20",fill:"none"})]),_=r.text?Un("p",{class:p.b("text")},[r.text]):void 0;return Un(io,{name:p.b("fade"),onAfterLeave:l},{default:ve(()=>[ht(ie("div",{style:{backgroundColor:r.background||""},class:[p.b("mask"),r.customClass,r.fullscreen?"is-fullscreen":""]},[Un("div",{class:p.b("spinner")},[g,_])]),[[Mn,r.visible]])])})}}})),f=c.mount(document.createElement("div"));return{...Or(r),setText:o,removeElLoadingChild:i,close:a,handleAfterLeave:l,vm:f,get $el(){return f.$el}}}let Si;const lu=function(e={}){if(!ot)return;const t=VP(e);if(t.fullscreen&&Si)return Si;const n=DP({...t,closed:()=>{var o;(o=t.closed)==null||o.call(t),t.fullscreen&&(Si=void 0)}});jP(t,t.parent,n),Cp(t,t.parent,n),t.parent.vLoadingAddClassList=()=>Cp(t,t.parent,n);let r=t.parent.getAttribute("loading-number");return r?r=`${Number.parseInt(r)+1}`:r="1",t.parent.setAttribute("loading-number",r),t.parent.appendChild(n.$el),ze(()=>n.visible.value=t.visible),t.fullscreen&&(Si=n),n},VP=e=>{var t,n,r,o;let s;return Oe(e.target)?s=(t=document.querySelector(e.target))!=null?t:document.body:s=e.target||document.body,{parent:s===document.body||e.body?document.body:s,background:e.background||"",svg:e.svg||"",svgViewBox:e.svgViewBox||"",spinner:e.spinner||!1,text:e.text||"",fullscreen:s===document.body&&((n=e.fullscreen)!=null?n:!0),lock:(r=e.lock)!=null?r:!1,customClass:e.customClass||"",visible:(o=e.visible)!=null?o:!0,beforeClose:e.beforeClose,closed:e.closed,target:s}},jP=async(e,t,n)=>{const{nextZIndex:r}=n.vm.zIndex||n.vm._.exposed.zIndex,o={};if(e.fullscreen)n.originalPosition.value=_o(document.body,"position"),n.originalOverflow.value=_o(document.body,"overflow"),o.zIndex=r();else if(e.parent===document.body){n.originalPosition.value=_o(document.body,"position"),await ze();for(const s of["top","left"]){const i=s==="top"?"scrollTop":"scrollLeft";o[s]=`${e.target.getBoundingClientRect()[s]+document.body[i]+document.documentElement[i]-Number.parseInt(_o(document.body,`margin-${s}`),10)}px`}for(const s of["height","width"])o[s]=`${e.target.getBoundingClientRect()[s]}px`}else n.originalPosition.value=_o(t,"position");for(const[s,i]of Object.entries(o))n.$el.style[s]=i},Cp=(e,t,n)=>{const r=n.vm.ns||n.vm._.exposed.ns;["absolute","fixed","sticky"].includes(n.originalPosition.value)?Is(t,r.bm("parent","relative")):Zl(t,r.bm("parent","relative")),e.fullscreen&&e.lock?Zl(t,r.bm("parent","hidden")):Is(t,r.bm("parent","hidden"))},Fi=Symbol("ElLoading"),Tp=(e,t)=>{var n,r,o,s;const i=t.instance,a=d=>xe(t.value)?t.value[d]:void 0,l=d=>{const v=Oe(d)&&(i==null?void 0:i[d])||d;return v&&z(v)},u=d=>l(a(d)||e.getAttribute(`element-loading-${Zn(d)}`)),c=(n=a("fullscreen"))!=null?n:t.modifiers.fullscreen,f={text:u("text"),svg:u("svg"),svgViewBox:u("svgViewBox"),spinner:u("spinner"),background:u("background"),customClass:u("customClass"),fullscreen:c,target:(r=a("target"))!=null?r:c?void 0:e,body:(o=a("body"))!=null?o:t.modifiers.body,lock:(s=a("lock"))!=null?s:t.modifiers.lock};e[Fi]={options:f,instance:lu(f)}},zP=(e,t)=>{for(const n of Object.keys(t))He(t[n])&&(t[n].value=e[n])},Op={mounted(e,t){t.value&&Tp(e,t)},updated(e,t){const n=e[Fi];t.oldValue!==t.value&&(t.value&&!t.oldValue?Tp(e,t):t.value&&t.oldValue?xe(t.value)&&zP(t.value,n.options):n==null||n.instance.close())},unmounted(e){var t;(t=e[Fi])==null||t.instance.close(),e[Fi]=null}},k8={install(e){e.directive("loading",Op),e.config.globalProperties.$loading=lu},directive:Op,service:lu},gg=["success","info","warning","error"],Ot=$a({customClass:"",center:!1,dangerouslyUseHTMLString:!1,duration:3e3,icon:void 0,id:"",message:"",onClose:void 0,showClose:!1,type:"info",plain:!1,offset:16,zIndex:0,grouping:!1,repeatNum:1,appendTo:ot?document.body:void 0}),HP=Re({customClass:{type:String,default:Ot.customClass},center:{type:Boolean,default:Ot.center},dangerouslyUseHTMLString:{type:Boolean,default:Ot.dangerouslyUseHTMLString},duration:{type:Number,default:Ot.duration},icon:{type:Bt,default:Ot.icon},id:{type:String,default:Ot.id},message:{type:ge([String,Object,Function]),default:Ot.message},onClose:{type:ge(Function),default:Ot.onClose},showClose:{type:Boolean,default:Ot.showClose},type:{type:String,values:gg,default:Ot.type},plain:{type:Boolean,default:Ot.plain},offset:{type:Number,default:Ot.offset},zIndex:{type:Number,default:Ot.zIndex},grouping:{type:Boolean,default:Ot.grouping},repeatNum:{type:Number,default:Ot.repeatNum}}),KP={destroy:()=>!0},dn=$u([]),UP=e=>{const t=dn.findIndex(o=>o.id===e),n=dn[t];let r;return t>0&&(r=dn[t-1]),{current:n,prev:r}},qP=e=>{const{prev:t}=UP(e);return t?t.vm.exposed.bottom.value:0},WP=(e,t)=>dn.findIndex(r=>r.id===e)>0?16:t,GP=J({name:"ElMessage"}),YP=J({...GP,props:HP,emits:KP,setup(e,{expose:t}){const n=e,{Close:r}=cT,{ns:o,zIndex:s}=jm("message"),{currentZIndex:i,nextZIndex:a}=s,l=z(),u=z(!1),c=z(0);let f;const d=T(()=>n.type?n.type==="error"?"danger":n.type:"info"),v=T(()=>{const A=n.type;return{[o.bm("icon",A)]:A&&Md[A]}}),p=T(()=>n.icon||Md[n.type]||""),h=T(()=>qP(n.id)),y=T(()=>WP(n.id,n.offset)+h.value),g=T(()=>c.value+y.value),_=T(()=>({top:`${y.value}px`,zIndex:i.value}));function E(){n.duration!==0&&({stop:f}=Ul(()=>{b()},n.duration))}function S(){f==null||f()}function b(){u.value=!1}function O({code:A}){A===In.esc&&b()}return Ue(()=>{E(),a(),u.value=!0}),me(()=>n.repeatNum,()=>{S(),E()}),Gt(document,"keydown",O),Ft(l,()=>{c.value=l.value.getBoundingClientRect().height}),t({visible:u,bottom:g,close:b}),(A,P)=>($(),pe(io,{name:m(o).b("fade"),onBeforeLeave:A.onClose,onAfterLeave:x=>A.$emit("destroy"),persisted:""},{default:ve(()=>[ht(fe("div",{id:A.id,ref_key:"messageRef",ref:l,class:q([m(o).b(),{[m(o).m(A.type)]:A.type},m(o).is("center",A.center),m(o).is("closable",A.showClose),m(o).is("plain",A.plain),A.customClass]),style:it(m(_)),role:"alert",onMouseenter:S,onMouseleave:E},[A.repeatNum>1?($(),pe(m(SA),{key:0,value:A.repeatNum,type:m(d),class:q(m(o).e("badge"))},null,8,["value","type","class"])):ue("v-if",!0),m(p)?($(),pe(m(tt),{key:1,class:q([m(o).e("icon"),m(v)])},{default:ve(()=>[($(),pe(at(m(p))))]),_:1},8,["class"])):ue("v-if",!0),de(A.$slots,"default",{},()=>[A.dangerouslyUseHTMLString?($(),Q(et,{key:1},[ue(" Caution here, message could've been compromised, never use user's input as message "),fe("p",{class:q(m(o).e("content")),innerHTML:A.message},null,10,["innerHTML"])],2112)):($(),Q("p",{key:0,class:q(m(o).e("content"))},Je(A.message),3))]),A.showClose?($(),pe(m(tt),{key:2,class:q(m(o).e("closeBtn")),onClick:ut(b,["stop"])},{default:ve(()=>[ie(m(r))]),_:1},8,["class","onClick"])):ue("v-if",!0)],46,["id"]),[[Mn,u.value]])]),_:3},8,["name","onBeforeLeave","onAfterLeave"]))}});var JP=ke(YP,[["__file","message.vue"]]);let XP=1;const yg=e=>{const t=!e||Oe(e)||Yn(e)||he(e)?{message:e}:e,n={...Ot,...t};if(!n.appendTo)n.appendTo=document.body;else if(Oe(n.appendTo)){let r=document.querySelector(n.appendTo);Ur(r)||(r=document.body),n.appendTo=r}return Nt(Tn.grouping)&&!n.grouping&&(n.grouping=Tn.grouping),Ve(Tn.duration)&&n.duration===3e3&&(n.duration=Tn.duration),Ve(Tn.offset)&&n.offset===16&&(n.offset=Tn.offset),Nt(Tn.showClose)&&!n.showClose&&(n.showClose=Tn.showClose),n},ZP=e=>{const t=dn.indexOf(e);if(t===-1)return;dn.splice(t,1);const{handler:n}=e;n.close()},QP=({appendTo:e,...t},n)=>{const r=`message_${XP++}`,o=t.onClose,s=document.createElement("div"),i={...t,id:r,onClose:()=>{o==null||o(),ZP(c)},onDestroy:()=>{xf(null,s)}},a=ie(JP,i,he(i.message)||Yn(i.message)?{default:he(i.message)?i.message:()=>i.message}:null);a.appContext=n||Bo._context,xf(a,s),e.appendChild(s.firstElementChild);const l=a.component,c={id:r,vnode:a,vm:l,handler:{close:()=>{l.exposed.visible.value=!1}},props:a.component.props};return c},Bo=(e={},t)=>{if(!ot)return{close:()=>{}};const n=yg(e);if(n.grouping&&dn.length){const o=dn.find(({vnode:s})=>{var i;return((i=s.props)==null?void 0:i.message)===n.message});if(o)return o.props.repeatNum+=1,o.props.type=n.type,o.handler}if(Ve(Tn.max)&&dn.length>=Tn.max)return{close:()=>{}};const r=QP(n,t);return dn.push(r),r.handler};gg.forEach(e=>{Bo[e]=(t={},n)=>{const r=yg(t);return Bo({...r,type:e},n)}});function e3(e){for(const t of dn)(!e||e===t.props.type)&&t.handler.close()}Bo.closeAll=e3;Bo._context=null;const L8=fT(Bo,"$message");function bg(e,t){return function(){return e.apply(t,arguments)}}const{toString:t3}=Object.prototype,{getPrototypeOf:xc}=Object,Va=(e=>t=>{const n=t3.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())})(Object.create(null)),_n=e=>(e=e.toLowerCase(),t=>Va(t)===e),ja=e=>t=>typeof t===e,{isArray:Uo}=Array,Fs=ja("undefined");function n3(e){return e!==null&&!Fs(e)&&e.constructor!==null&&!Fs(e.constructor)&&Yt(e.constructor.isBuffer)&&e.constructor.isBuffer(e)}const wg=_n("ArrayBuffer");function r3(e){let t;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&wg(e.buffer),t}const o3=ja("string"),Yt=ja("function"),_g=ja("number"),za=e=>e!==null&&typeof e=="object",s3=e=>e===!0||e===!1,Bi=e=>{if(Va(e)!=="object")return!1;const t=xc(e);return(t===null||t===Object.prototype||Object.getPrototypeOf(t)===null)&&!(Symbol.toStringTag in e)&&!(Symbol.iterator in e)},i3=_n("Date"),a3=_n("File"),l3=_n("Blob"),u3=_n("FileList"),c3=e=>za(e)&&Yt(e.pipe),f3=e=>{let t;return e&&(typeof FormData=="function"&&e instanceof FormData||Yt(e.append)&&((t=Va(e))==="formdata"||t==="object"&&Yt(e.toString)&&e.toString()==="[object FormData]"))},d3=_n("URLSearchParams"),[p3,h3,v3,m3]=["ReadableStream","Request","Response","Headers"].map(_n),g3=e=>e.trim?e.trim():e.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function Zs(e,t,{allOwnKeys:n=!1}={}){if(e===null||typeof e>"u")return;let r,o;if(typeof e!="object"&&(e=[e]),Uo(e))for(r=0,o=e.length;r0;)if(o=n[r],t===o.toLowerCase())return o;return null}const zr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,Eg=e=>!Fs(e)&&e!==zr;function uu(){const{caseless:e}=Eg(this)&&this||{},t={},n=(r,o)=>{const s=e&&Sg(t,o)||o;Bi(t[s])&&Bi(r)?t[s]=uu(t[s],r):Bi(r)?t[s]=uu({},r):Uo(r)?t[s]=r.slice():t[s]=r};for(let r=0,o=arguments.length;r(Zs(t,(o,s)=>{n&&Yt(o)?e[s]=bg(o,n):e[s]=o},{allOwnKeys:r}),e),b3=e=>(e.charCodeAt(0)===65279&&(e=e.slice(1)),e),w3=(e,t,n,r)=>{e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,Object.defineProperty(e,"super",{value:t.prototype}),n&&Object.assign(e.prototype,n)},_3=(e,t,n,r)=>{let o,s,i;const a={};if(t=t||{},e==null)return t;do{for(o=Object.getOwnPropertyNames(e),s=o.length;s-- >0;)i=o[s],(!r||r(i,e,t))&&!a[i]&&(t[i]=e[i],a[i]=!0);e=n!==!1&&xc(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t},S3=(e,t,n)=>{e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;const r=e.indexOf(t,n);return r!==-1&&r===n},E3=e=>{if(!e)return null;if(Uo(e))return e;let t=e.length;if(!_g(t))return null;const n=new Array(t);for(;t-- >0;)n[t]=e[t];return n},C3=(e=>t=>e&&t instanceof e)(typeof Uint8Array<"u"&&xc(Uint8Array)),T3=(e,t)=>{const r=(e&&e[Symbol.iterator]).call(e);let o;for(;(o=r.next())&&!o.done;){const s=o.value;t.call(e,s[0],s[1])}},O3=(e,t)=>{let n;const r=[];for(;(n=e.exec(t))!==null;)r.push(n);return r},x3=_n("HTMLFormElement"),A3=e=>e.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(n,r,o){return r.toUpperCase()+o}),xp=(({hasOwnProperty:e})=>(t,n)=>e.call(t,n))(Object.prototype),R3=_n("RegExp"),Cg=(e,t)=>{const n=Object.getOwnPropertyDescriptors(e),r={};Zs(n,(o,s)=>{let i;(i=t(o,s,e))!==!1&&(r[s]=i||o)}),Object.defineProperties(e,r)},P3=e=>{Cg(e,(t,n)=>{if(Yt(e)&&["arguments","caller","callee"].indexOf(n)!==-1)return!1;const r=e[n];if(Yt(r)){if(t.enumerable=!1,"writable"in t){t.writable=!1;return}t.set||(t.set=()=>{throw Error("Can not rewrite read-only method '"+n+"'")})}})},I3=(e,t)=>{const n={},r=o=>{o.forEach(s=>{n[s]=!0})};return Uo(e)?r(e):r(String(e).split(t)),n},$3=()=>{},k3=(e,t)=>e!=null&&Number.isFinite(e=+e)?e:t,wl="abcdefghijklmnopqrstuvwxyz",Ap="0123456789",Tg={DIGIT:Ap,ALPHA:wl,ALPHA_DIGIT:wl+wl.toUpperCase()+Ap},L3=(e=16,t=Tg.ALPHA_DIGIT)=>{let n="";const{length:r}=t;for(;e--;)n+=t[Math.random()*r|0];return n};function N3(e){return!!(e&&Yt(e.append)&&e[Symbol.toStringTag]==="FormData"&&e[Symbol.iterator])}const M3=e=>{const t=new Array(10),n=(r,o)=>{if(za(r)){if(t.indexOf(r)>=0)return;if(!("toJSON"in r)){t[o]=r;const s=Uo(r)?[]:{};return Zs(r,(i,a)=>{const l=n(i,o+1);!Fs(l)&&(s[a]=l)}),t[o]=void 0,s}}return r};return n(e,0)},F3=_n("AsyncFunction"),B3=e=>e&&(za(e)||Yt(e))&&Yt(e.then)&&Yt(e.catch),Og=((e,t)=>e?setImmediate:t?((n,r)=>(zr.addEventListener("message",({source:o,data:s})=>{o===zr&&s===n&&r.length&&r.shift()()},!1),o=>{r.push(o),zr.postMessage(n,"*")}))(`axios@${Math.random()}`,[]):n=>setTimeout(n))(typeof setImmediate=="function",Yt(zr.postMessage)),D3=typeof queueMicrotask<"u"?queueMicrotask.bind(zr):typeof process<"u"&&process.nextTick||Og,B={isArray:Uo,isArrayBuffer:wg,isBuffer:n3,isFormData:f3,isArrayBufferView:r3,isString:o3,isNumber:_g,isBoolean:s3,isObject:za,isPlainObject:Bi,isReadableStream:p3,isRequest:h3,isResponse:v3,isHeaders:m3,isUndefined:Fs,isDate:i3,isFile:a3,isBlob:l3,isRegExp:R3,isFunction:Yt,isStream:c3,isURLSearchParams:d3,isTypedArray:C3,isFileList:u3,forEach:Zs,merge:uu,extend:y3,trim:g3,stripBOM:b3,inherits:w3,toFlatObject:_3,kindOf:Va,kindOfTest:_n,endsWith:S3,toArray:E3,forEachEntry:T3,matchAll:O3,isHTMLForm:x3,hasOwnProperty:xp,hasOwnProp:xp,reduceDescriptors:Cg,freezeMethods:P3,toObjectSet:I3,toCamelCase:A3,noop:$3,toFiniteNumber:k3,findKey:Sg,global:zr,isContextDefined:Eg,ALPHABET:Tg,generateString:L3,isSpecCompliantForm:N3,toJSONObject:M3,isAsyncFn:F3,isThenable:B3,setImmediate:Og,asap:D3};function Ae(e,t,n,r,o){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack,this.message=e,this.name="AxiosError",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o,this.status=o.status?o.status:null)}B.inherits(Ae,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:B.toJSONObject(this.config),code:this.code,status:this.status}}});const xg=Ae.prototype,Ag={};["ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","ECONNABORTED","ETIMEDOUT","ERR_NETWORK","ERR_FR_TOO_MANY_REDIRECTS","ERR_DEPRECATED","ERR_BAD_RESPONSE","ERR_BAD_REQUEST","ERR_CANCELED","ERR_NOT_SUPPORT","ERR_INVALID_URL"].forEach(e=>{Ag[e]={value:e}});Object.defineProperties(Ae,Ag);Object.defineProperty(xg,"isAxiosError",{value:!0});Ae.from=(e,t,n,r,o,s)=>{const i=Object.create(xg);return B.toFlatObject(e,i,function(l){return l!==Error.prototype},a=>a!=="isAxiosError"),Ae.call(i,e.message,t,n,r,o),i.cause=e,i.name=e.name,s&&Object.assign(i,s),i};const V3=null;function cu(e){return B.isPlainObject(e)||B.isArray(e)}function Rg(e){return B.endsWith(e,"[]")?e.slice(0,-2):e}function Rp(e,t,n){return e?e.concat(t).map(function(o,s){return o=Rg(o),!n&&s?"["+o+"]":o}).join(n?".":""):t}function j3(e){return B.isArray(e)&&!e.some(cu)}const z3=B.toFlatObject(B,{},null,function(t){return/^is[A-Z]/.test(t)});function Ha(e,t,n){if(!B.isObject(e))throw new TypeError("target must be an object");t=t||new FormData,n=B.toFlatObject(n,{metaTokens:!0,dots:!1,indexes:!1},!1,function(h,y){return!B.isUndefined(y[h])});const r=n.metaTokens,o=n.visitor||c,s=n.dots,i=n.indexes,l=(n.Blob||typeof Blob<"u"&&Blob)&&B.isSpecCompliantForm(t);if(!B.isFunction(o))throw new TypeError("visitor must be a function");function u(p){if(p===null)return"";if(B.isDate(p))return p.toISOString();if(!l&&B.isBlob(p))throw new Ae("Blob is not supported. Use a Buffer instead.");return B.isArrayBuffer(p)||B.isTypedArray(p)?l&&typeof Blob=="function"?new Blob([p]):Buffer.from(p):p}function c(p,h,y){let g=p;if(p&&!y&&typeof p=="object"){if(B.endsWith(h,"{}"))h=r?h:h.slice(0,-2),p=JSON.stringify(p);else if(B.isArray(p)&&j3(p)||(B.isFileList(p)||B.endsWith(h,"[]"))&&(g=B.toArray(p)))return h=Rg(h),g.forEach(function(E,S){!(B.isUndefined(E)||E===null)&&t.append(i===!0?Rp([h],S,s):i===null?h:h+"[]",u(E))}),!1}return cu(p)?!0:(t.append(Rp(y,h,s),u(p)),!1)}const f=[],d=Object.assign(z3,{defaultVisitor:c,convertValue:u,isVisitable:cu});function v(p,h){if(!B.isUndefined(p)){if(f.indexOf(p)!==-1)throw Error("Circular reference detected in "+h.join("."));f.push(p),B.forEach(p,function(g,_){(!(B.isUndefined(g)||g===null)&&o.call(t,g,B.isString(_)?_.trim():_,h,d))===!0&&v(g,h?h.concat(_):[_])}),f.pop()}}if(!B.isObject(e))throw new TypeError("data must be an object");return v(e),t}function Pp(e){const t={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"};return encodeURIComponent(e).replace(/[!'()~]|%20|%00/g,function(r){return t[r]})}function Ac(e,t){this._pairs=[],e&&Ha(e,this,t)}const Pg=Ac.prototype;Pg.append=function(t,n){this._pairs.push([t,n])};Pg.toString=function(t){const n=t?function(r){return t.call(this,r,Pp)}:Pp;return this._pairs.map(function(o){return n(o[0])+"="+n(o[1])},"").join("&")};function H3(e){return encodeURIComponent(e).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+").replace(/%5B/gi,"[").replace(/%5D/gi,"]")}function Ig(e,t,n){if(!t)return e;const r=n&&n.encode||H3,o=n&&n.serialize;let s;if(o?s=o(t,n):s=B.isURLSearchParams(t)?t.toString():new Ac(t,n).toString(r),s){const i=e.indexOf("#");i!==-1&&(e=e.slice(0,i)),e+=(e.indexOf("?")===-1?"?":"&")+s}return e}class Ip{constructor(){this.handlers=[]}use(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1}eject(t){this.handlers[t]&&(this.handlers[t]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(t){B.forEach(this.handlers,function(r){r!==null&&t(r)})}}const $g={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},K3=typeof URLSearchParams<"u"?URLSearchParams:Ac,U3=typeof FormData<"u"?FormData:null,q3=typeof Blob<"u"?Blob:null,W3={isBrowser:!0,classes:{URLSearchParams:K3,FormData:U3,Blob:q3},protocols:["http","https","file","blob","url","data"]},Rc=typeof window<"u"&&typeof document<"u",fu=typeof navigator=="object"&&navigator||void 0,G3=Rc&&(!fu||["ReactNative","NativeScript","NS"].indexOf(fu.product)<0),Y3=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",J3=Rc&&window.location.href||"http://localhost",X3=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Rc,hasStandardBrowserEnv:G3,hasStandardBrowserWebWorkerEnv:Y3,navigator:fu,origin:J3},Symbol.toStringTag,{value:"Module"})),jt={...X3,...W3};function Z3(e,t){return Ha(e,new jt.classes.URLSearchParams,Object.assign({visitor:function(n,r,o,s){return jt.isNode&&B.isBuffer(n)?(this.append(r,n.toString("base64")),!1):s.defaultVisitor.apply(this,arguments)}},t))}function Q3(e){return B.matchAll(/\w+|\[(\w*)]/g,e).map(t=>t[0]==="[]"?"":t[1]||t[0])}function eI(e){const t={},n=Object.keys(e);let r;const o=n.length;let s;for(r=0;r=n.length;return i=!i&&B.isArray(o)?o.length:i,l?(B.hasOwnProp(o,i)?o[i]=[o[i],r]:o[i]=r,!a):((!o[i]||!B.isObject(o[i]))&&(o[i]=[]),t(n,r,o[i],s)&&B.isArray(o[i])&&(o[i]=eI(o[i])),!a)}if(B.isFormData(e)&&B.isFunction(e.entries)){const n={};return B.forEachEntry(e,(r,o)=>{t(Q3(r),o,n,0)}),n}return null}function tI(e,t,n){if(B.isString(e))try{return(t||JSON.parse)(e),B.trim(e)}catch(r){if(r.name!=="SyntaxError")throw r}return(0,JSON.stringify)(e)}const Qs={transitional:$g,adapter:["xhr","http","fetch"],transformRequest:[function(t,n){const r=n.getContentType()||"",o=r.indexOf("application/json")>-1,s=B.isObject(t);if(s&&B.isHTMLForm(t)&&(t=new FormData(t)),B.isFormData(t))return o?JSON.stringify(kg(t)):t;if(B.isArrayBuffer(t)||B.isBuffer(t)||B.isStream(t)||B.isFile(t)||B.isBlob(t)||B.isReadableStream(t))return t;if(B.isArrayBufferView(t))return t.buffer;if(B.isURLSearchParams(t))return n.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),t.toString();let a;if(s){if(r.indexOf("application/x-www-form-urlencoded")>-1)return Z3(t,this.formSerializer).toString();if((a=B.isFileList(t))||r.indexOf("multipart/form-data")>-1){const l=this.env&&this.env.FormData;return Ha(a?{"files[]":t}:t,l&&new l,this.formSerializer)}}return s||o?(n.setContentType("application/json",!1),tI(t)):t}],transformResponse:[function(t){const n=this.transitional||Qs.transitional,r=n&&n.forcedJSONParsing,o=this.responseType==="json";if(B.isResponse(t)||B.isReadableStream(t))return t;if(t&&B.isString(t)&&(r&&!this.responseType||o)){const i=!(n&&n.silentJSONParsing)&&o;try{return JSON.parse(t)}catch(a){if(i)throw a.name==="SyntaxError"?Ae.from(a,Ae.ERR_BAD_RESPONSE,this,null,this.response):a}}return t}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:jt.classes.FormData,Blob:jt.classes.Blob},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};B.forEach(["delete","get","head","post","put","patch"],e=>{Qs.headers[e]={}});const nI=B.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),rI=e=>{const t={};let n,r,o;return e&&e.split(` +`).forEach(function(i){o=i.indexOf(":"),n=i.substring(0,o).trim().toLowerCase(),r=i.substring(o+1).trim(),!(!n||t[n]&&nI[n])&&(n==="set-cookie"?t[n]?t[n].push(r):t[n]=[r]:t[n]=t[n]?t[n]+", "+r:r)}),t},$p=Symbol("internals");function es(e){return e&&String(e).trim().toLowerCase()}function Di(e){return e===!1||e==null?e:B.isArray(e)?e.map(Di):String(e)}function oI(e){const t=Object.create(null),n=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let r;for(;r=n.exec(e);)t[r[1]]=r[2];return t}const sI=e=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(e.trim());function _l(e,t,n,r,o){if(B.isFunction(r))return r.call(this,t,n);if(o&&(t=n),!!B.isString(t)){if(B.isString(r))return t.indexOf(r)!==-1;if(B.isRegExp(r))return r.test(t)}}function iI(e){return e.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(t,n,r)=>n.toUpperCase()+r)}function aI(e,t){const n=B.toCamelCase(" "+t);["get","set","has"].forEach(r=>{Object.defineProperty(e,r+n,{value:function(o,s,i){return this[r].call(this,t,o,s,i)},configurable:!0})})}class zt{constructor(t){t&&this.set(t)}set(t,n,r){const o=this;function s(a,l,u){const c=es(l);if(!c)throw new Error("header name must be a non-empty string");const f=B.findKey(o,c);(!f||o[f]===void 0||u===!0||u===void 0&&o[f]!==!1)&&(o[f||l]=Di(a))}const i=(a,l)=>B.forEach(a,(u,c)=>s(u,c,l));if(B.isPlainObject(t)||t instanceof this.constructor)i(t,n);else if(B.isString(t)&&(t=t.trim())&&!sI(t))i(rI(t),n);else if(B.isHeaders(t))for(const[a,l]of t.entries())s(l,a,r);else t!=null&&s(n,t,r);return this}get(t,n){if(t=es(t),t){const r=B.findKey(this,t);if(r){const o=this[r];if(!n)return o;if(n===!0)return oI(o);if(B.isFunction(n))return n.call(this,o,r);if(B.isRegExp(n))return n.exec(o);throw new TypeError("parser must be boolean|regexp|function")}}}has(t,n){if(t=es(t),t){const r=B.findKey(this,t);return!!(r&&this[r]!==void 0&&(!n||_l(this,this[r],r,n)))}return!1}delete(t,n){const r=this;let o=!1;function s(i){if(i=es(i),i){const a=B.findKey(r,i);a&&(!n||_l(r,r[a],a,n))&&(delete r[a],o=!0)}}return B.isArray(t)?t.forEach(s):s(t),o}clear(t){const n=Object.keys(this);let r=n.length,o=!1;for(;r--;){const s=n[r];(!t||_l(this,this[s],s,t,!0))&&(delete this[s],o=!0)}return o}normalize(t){const n=this,r={};return B.forEach(this,(o,s)=>{const i=B.findKey(r,s);if(i){n[i]=Di(o),delete n[s];return}const a=t?iI(s):String(s).trim();a!==s&&delete n[s],n[a]=Di(o),r[a]=!0}),this}concat(...t){return this.constructor.concat(this,...t)}toJSON(t){const n=Object.create(null);return B.forEach(this,(r,o)=>{r!=null&&r!==!1&&(n[o]=t&&B.isArray(r)?r.join(", "):r)}),n}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([t,n])=>t+": "+n).join(` +`)}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(t){return t instanceof this?t:new this(t)}static concat(t,...n){const r=new this(t);return n.forEach(o=>r.set(o)),r}static accessor(t){const r=(this[$p]=this[$p]={accessors:{}}).accessors,o=this.prototype;function s(i){const a=es(i);r[a]||(aI(o,i),r[a]=!0)}return B.isArray(t)?t.forEach(s):s(t),this}}zt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);B.reduceDescriptors(zt.prototype,({value:e},t)=>{let n=t[0].toUpperCase()+t.slice(1);return{get:()=>e,set(r){this[n]=r}}});B.freezeMethods(zt);function Sl(e,t){const n=this||Qs,r=t||n,o=zt.from(r.headers);let s=r.data;return B.forEach(e,function(a){s=a.call(n,s,o.normalize(),t?t.status:void 0)}),o.normalize(),s}function Lg(e){return!!(e&&e.__CANCEL__)}function qo(e,t,n){Ae.call(this,e??"canceled",Ae.ERR_CANCELED,t,n),this.name="CanceledError"}B.inherits(qo,Ae,{__CANCEL__:!0});function Ng(e,t,n){const r=n.config.validateStatus;!n.status||!r||r(n.status)?e(n):t(new Ae("Request failed with status code "+n.status,[Ae.ERR_BAD_REQUEST,Ae.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))}function lI(e){const t=/^([-+\w]{1,25})(:?\/\/|:)/.exec(e);return t&&t[1]||""}function uI(e,t){e=e||10;const n=new Array(e),r=new Array(e);let o=0,s=0,i;return t=t!==void 0?t:1e3,function(l){const u=Date.now(),c=r[s];i||(i=u),n[o]=l,r[o]=u;let f=s,d=0;for(;f!==o;)d+=n[f++],f=f%e;if(o=(o+1)%e,o===s&&(s=(s+1)%e),u-i{n=c,o=null,s&&(clearTimeout(s),s=null),e.apply(null,u)};return[(...u)=>{const c=Date.now(),f=c-n;f>=r?i(u,c):(o=u,s||(s=setTimeout(()=>{s=null,i(o)},r-f)))},()=>o&&i(o)]}const ia=(e,t,n=3)=>{let r=0;const o=uI(50,250);return cI(s=>{const i=s.loaded,a=s.lengthComputable?s.total:void 0,l=i-r,u=o(l),c=i<=a;r=i;const f={loaded:i,total:a,progress:a?i/a:void 0,bytes:l,rate:u||void 0,estimated:u&&a&&c?(a-i)/u:void 0,event:s,lengthComputable:a!=null,[t?"download":"upload"]:!0};e(f)},n)},kp=(e,t)=>{const n=e!=null;return[r=>t[0]({lengthComputable:n,total:e,loaded:r}),t[1]]},Lp=e=>(...t)=>B.asap(()=>e(...t)),fI=jt.hasStandardBrowserEnv?function(){const t=jt.navigator&&/(msie|trident)/i.test(jt.navigator.userAgent),n=document.createElement("a");let r;function o(s){let i=s;return t&&(n.setAttribute("href",i),i=n.href),n.setAttribute("href",i),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,""):"",host:n.host,search:n.search?n.search.replace(/^\?/,""):"",hash:n.hash?n.hash.replace(/^#/,""):"",hostname:n.hostname,port:n.port,pathname:n.pathname.charAt(0)==="/"?n.pathname:"/"+n.pathname}}return r=o(window.location.href),function(i){const a=B.isString(i)?o(i):i;return a.protocol===r.protocol&&a.host===r.host}}():function(){return function(){return!0}}(),dI=jt.hasStandardBrowserEnv?{write(e,t,n,r,o,s){const i=[e+"="+encodeURIComponent(t)];B.isNumber(n)&&i.push("expires="+new Date(n).toGMTString()),B.isString(r)&&i.push("path="+r),B.isString(o)&&i.push("domain="+o),s===!0&&i.push("secure"),document.cookie=i.join("; ")},read(e){const t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove(e){this.write(e,"",Date.now()-864e5)}}:{write(){},read(){return null},remove(){}};function pI(e){return/^([a-z][a-z\d+\-.]*:)?\/\//i.test(e)}function hI(e,t){return t?e.replace(/\/?\/$/,"")+"/"+t.replace(/^\/+/,""):e}function Mg(e,t){return e&&!pI(t)?hI(e,t):t}const Np=e=>e instanceof zt?{...e}:e;function no(e,t){t=t||{};const n={};function r(u,c,f){return B.isPlainObject(u)&&B.isPlainObject(c)?B.merge.call({caseless:f},u,c):B.isPlainObject(c)?B.merge({},c):B.isArray(c)?c.slice():c}function o(u,c,f){if(B.isUndefined(c)){if(!B.isUndefined(u))return r(void 0,u,f)}else return r(u,c,f)}function s(u,c){if(!B.isUndefined(c))return r(void 0,c)}function i(u,c){if(B.isUndefined(c)){if(!B.isUndefined(u))return r(void 0,u)}else return r(void 0,c)}function a(u,c,f){if(f in t)return r(u,c);if(f in e)return r(void 0,u)}const l={url:s,method:s,data:s,baseURL:i,transformRequest:i,transformResponse:i,paramsSerializer:i,timeout:i,timeoutMessage:i,withCredentials:i,withXSRFToken:i,adapter:i,responseType:i,xsrfCookieName:i,xsrfHeaderName:i,onUploadProgress:i,onDownloadProgress:i,decompress:i,maxContentLength:i,maxBodyLength:i,beforeRedirect:i,transport:i,httpAgent:i,httpsAgent:i,cancelToken:i,socketPath:i,responseEncoding:i,validateStatus:a,headers:(u,c)=>o(Np(u),Np(c),!0)};return B.forEach(Object.keys(Object.assign({},e,t)),function(c){const f=l[c]||o,d=f(e[c],t[c],c);B.isUndefined(d)&&f!==a||(n[c]=d)}),n}const Fg=e=>{const t=no({},e);let{data:n,withXSRFToken:r,xsrfHeaderName:o,xsrfCookieName:s,headers:i,auth:a}=t;t.headers=i=zt.from(i),t.url=Ig(Mg(t.baseURL,t.url),e.params,e.paramsSerializer),a&&i.set("Authorization","Basic "+btoa((a.username||"")+":"+(a.password?unescape(encodeURIComponent(a.password)):"")));let l;if(B.isFormData(n)){if(jt.hasStandardBrowserEnv||jt.hasStandardBrowserWebWorkerEnv)i.setContentType(void 0);else if((l=i.getContentType())!==!1){const[u,...c]=l?l.split(";").map(f=>f.trim()).filter(Boolean):[];i.setContentType([u||"multipart/form-data",...c].join("; "))}}if(jt.hasStandardBrowserEnv&&(r&&B.isFunction(r)&&(r=r(t)),r||r!==!1&&fI(t.url))){const u=o&&s&&dI.read(s);u&&i.set(o,u)}return t},vI=typeof XMLHttpRequest<"u",mI=vI&&function(e){return new Promise(function(n,r){const o=Fg(e);let s=o.data;const i=zt.from(o.headers).normalize();let{responseType:a,onUploadProgress:l,onDownloadProgress:u}=o,c,f,d,v,p;function h(){v&&v(),p&&p(),o.cancelToken&&o.cancelToken.unsubscribe(c),o.signal&&o.signal.removeEventListener("abort",c)}let y=new XMLHttpRequest;y.open(o.method.toUpperCase(),o.url,!0),y.timeout=o.timeout;function g(){if(!y)return;const E=zt.from("getAllResponseHeaders"in y&&y.getAllResponseHeaders()),b={data:!a||a==="text"||a==="json"?y.responseText:y.response,status:y.status,statusText:y.statusText,headers:E,config:e,request:y};Ng(function(A){n(A),h()},function(A){r(A),h()},b),y=null}"onloadend"in y?y.onloadend=g:y.onreadystatechange=function(){!y||y.readyState!==4||y.status===0&&!(y.responseURL&&y.responseURL.indexOf("file:")===0)||setTimeout(g)},y.onabort=function(){y&&(r(new Ae("Request aborted",Ae.ECONNABORTED,e,y)),y=null)},y.onerror=function(){r(new Ae("Network Error",Ae.ERR_NETWORK,e,y)),y=null},y.ontimeout=function(){let S=o.timeout?"timeout of "+o.timeout+"ms exceeded":"timeout exceeded";const b=o.transitional||$g;o.timeoutErrorMessage&&(S=o.timeoutErrorMessage),r(new Ae(S,b.clarifyTimeoutError?Ae.ETIMEDOUT:Ae.ECONNABORTED,e,y)),y=null},s===void 0&&i.setContentType(null),"setRequestHeader"in y&&B.forEach(i.toJSON(),function(S,b){y.setRequestHeader(b,S)}),B.isUndefined(o.withCredentials)||(y.withCredentials=!!o.withCredentials),a&&a!=="json"&&(y.responseType=o.responseType),u&&([d,p]=ia(u,!0),y.addEventListener("progress",d)),l&&y.upload&&([f,v]=ia(l),y.upload.addEventListener("progress",f),y.upload.addEventListener("loadend",v)),(o.cancelToken||o.signal)&&(c=E=>{y&&(r(!E||E.type?new qo(null,e,y):E),y.abort(),y=null)},o.cancelToken&&o.cancelToken.subscribe(c),o.signal&&(o.signal.aborted?c():o.signal.addEventListener("abort",c)));const _=lI(o.url);if(_&&jt.protocols.indexOf(_)===-1){r(new Ae("Unsupported protocol "+_+":",Ae.ERR_BAD_REQUEST,e));return}y.send(s||null)})},gI=(e,t)=>{const{length:n}=e=e?e.filter(Boolean):[];if(t||n){let r=new AbortController,o;const s=function(u){if(!o){o=!0,a();const c=u instanceof Error?u:this.reason;r.abort(c instanceof Ae?c:new qo(c instanceof Error?c.message:c))}};let i=t&&setTimeout(()=>{i=null,s(new Ae(`timeout ${t} of ms exceeded`,Ae.ETIMEDOUT))},t);const a=()=>{e&&(i&&clearTimeout(i),i=null,e.forEach(u=>{u.unsubscribe?u.unsubscribe(s):u.removeEventListener("abort",s)}),e=null)};e.forEach(u=>u.addEventListener("abort",s));const{signal:l}=r;return l.unsubscribe=()=>B.asap(a),l}},yI=function*(e,t){let n=e.byteLength;if(n{const o=bI(e,t);let s=0,i,a=l=>{i||(i=!0,r&&r(l))};return new ReadableStream({async pull(l){try{const{done:u,value:c}=await o.next();if(u){a(),l.close();return}let f=c.byteLength;if(n){let d=s+=f;n(d)}l.enqueue(new Uint8Array(c))}catch(u){throw a(u),u}},cancel(l){return a(l),o.return()}},{highWaterMark:2})},Ka=typeof fetch=="function"&&typeof Request=="function"&&typeof Response=="function",Bg=Ka&&typeof ReadableStream=="function",_I=Ka&&(typeof TextEncoder=="function"?(e=>t=>e.encode(t))(new TextEncoder):async e=>new Uint8Array(await new Response(e).arrayBuffer())),Dg=(e,...t)=>{try{return!!e(...t)}catch{return!1}},SI=Bg&&Dg(()=>{let e=!1;const t=new Request(jt.origin,{body:new ReadableStream,method:"POST",get duplex(){return e=!0,"half"}}).headers.has("Content-Type");return e&&!t}),Fp=64*1024,du=Bg&&Dg(()=>B.isReadableStream(new Response("").body)),aa={stream:du&&(e=>e.body)};Ka&&(e=>{["text","arrayBuffer","blob","formData","stream"].forEach(t=>{!aa[t]&&(aa[t]=B.isFunction(e[t])?n=>n[t]():(n,r)=>{throw new Ae(`Response type '${t}' is not supported`,Ae.ERR_NOT_SUPPORT,r)})})})(new Response);const EI=async e=>{if(e==null)return 0;if(B.isBlob(e))return e.size;if(B.isSpecCompliantForm(e))return(await new Request(jt.origin,{method:"POST",body:e}).arrayBuffer()).byteLength;if(B.isArrayBufferView(e)||B.isArrayBuffer(e))return e.byteLength;if(B.isURLSearchParams(e)&&(e=e+""),B.isString(e))return(await _I(e)).byteLength},CI=async(e,t)=>{const n=B.toFiniteNumber(e.getContentLength());return n??EI(t)},TI=Ka&&(async e=>{let{url:t,method:n,data:r,signal:o,cancelToken:s,timeout:i,onDownloadProgress:a,onUploadProgress:l,responseType:u,headers:c,withCredentials:f="same-origin",fetchOptions:d}=Fg(e);u=u?(u+"").toLowerCase():"text";let v=gI([o,s&&s.toAbortSignal()],i),p;const h=v&&v.unsubscribe&&(()=>{v.unsubscribe()});let y;try{if(l&&SI&&n!=="get"&&n!=="head"&&(y=await CI(c,r))!==0){let b=new Request(t,{method:"POST",body:r,duplex:"half"}),O;if(B.isFormData(r)&&(O=b.headers.get("content-type"))&&c.setContentType(O),b.body){const[A,P]=kp(y,ia(Lp(l)));r=Mp(b.body,Fp,A,P)}}B.isString(f)||(f=f?"include":"omit");const g="credentials"in Request.prototype;p=new Request(t,{...d,signal:v,method:n.toUpperCase(),headers:c.normalize().toJSON(),body:r,duplex:"half",credentials:g?f:void 0});let _=await fetch(p);const E=du&&(u==="stream"||u==="response");if(du&&(a||E&&h)){const b={};["status","statusText","headers"].forEach(x=>{b[x]=_[x]});const O=B.toFiniteNumber(_.headers.get("content-length")),[A,P]=a&&kp(O,ia(Lp(a),!0))||[];_=new Response(Mp(_.body,Fp,A,()=>{P&&P(),h&&h()}),b)}u=u||"text";let S=await aa[B.findKey(aa,u)||"text"](_,e);return!E&&h&&h(),await new Promise((b,O)=>{Ng(b,O,{data:S,headers:zt.from(_.headers),status:_.status,statusText:_.statusText,config:e,request:p})})}catch(g){throw h&&h(),g&&g.name==="TypeError"&&/fetch/i.test(g.message)?Object.assign(new Ae("Network Error",Ae.ERR_NETWORK,e,p),{cause:g.cause||g}):Ae.from(g,g&&g.code,e,p)}}),pu={http:V3,xhr:mI,fetch:TI};B.forEach(pu,(e,t)=>{if(e){try{Object.defineProperty(e,"name",{value:t})}catch{}Object.defineProperty(e,"adapterName",{value:t})}});const Bp=e=>`- ${e}`,OI=e=>B.isFunction(e)||e===null||e===!1,Vg={getAdapter:e=>{e=B.isArray(e)?e:[e];const{length:t}=e;let n,r;const o={};for(let s=0;s`adapter ${a} `+(l===!1?"is not supported by the environment":"is not available in the build"));let i=t?s.length>1?`since : +`+s.map(Bp).join(` +`):" "+Bp(s[0]):"as no adapter specified";throw new Ae("There is no suitable adapter to dispatch the request "+i,"ERR_NOT_SUPPORT")}return r},adapters:pu};function El(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new qo(null,e)}function Dp(e){return El(e),e.headers=zt.from(e.headers),e.data=Sl.call(e,e.transformRequest),["post","put","patch"].indexOf(e.method)!==-1&&e.headers.setContentType("application/x-www-form-urlencoded",!1),Vg.getAdapter(e.adapter||Qs.adapter)(e).then(function(r){return El(e),r.data=Sl.call(e,e.transformResponse,r),r.headers=zt.from(r.headers),r},function(r){return Lg(r)||(El(e),r&&r.response&&(r.response.data=Sl.call(e,e.transformResponse,r.response),r.response.headers=zt.from(r.response.headers))),Promise.reject(r)})}const jg="1.7.7",Pc={};["object","boolean","number","function","string","symbol"].forEach((e,t)=>{Pc[e]=function(r){return typeof r===e||"a"+(t<1?"n ":" ")+e}});const Vp={};Pc.transitional=function(t,n,r){function o(s,i){return"[Axios v"+jg+"] Transitional option '"+s+"'"+i+(r?". "+r:"")}return(s,i,a)=>{if(t===!1)throw new Ae(o(i," has been removed"+(n?" in "+n:"")),Ae.ERR_DEPRECATED);return n&&!Vp[i]&&(Vp[i]=!0,console.warn(o(i," has been deprecated since v"+n+" and will be removed in the near future"))),t?t(s,i,a):!0}};function xI(e,t,n){if(typeof e!="object")throw new Ae("options must be an object",Ae.ERR_BAD_OPTION_VALUE);const r=Object.keys(e);let o=r.length;for(;o-- >0;){const s=r[o],i=t[s];if(i){const a=e[s],l=a===void 0||i(a,s,e);if(l!==!0)throw new Ae("option "+s+" must be "+l,Ae.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Ae("Unknown option "+s,Ae.ERR_BAD_OPTION)}}const hu={assertOptions:xI,validators:Pc},ur=hu.validators;class Gr{constructor(t){this.defaults=t,this.interceptors={request:new Ip,response:new Ip}}async request(t,n){try{return await this._request(t,n)}catch(r){if(r instanceof Error){let o;Error.captureStackTrace?Error.captureStackTrace(o={}):o=new Error;const s=o.stack?o.stack.replace(/^.+\n/,""):"";try{r.stack?s&&!String(r.stack).endsWith(s.replace(/^.+\n.+\n/,""))&&(r.stack+=` +`+s):r.stack=s}catch{}}throw r}}_request(t,n){typeof t=="string"?(n=n||{},n.url=t):n=t||{},n=no(this.defaults,n);const{transitional:r,paramsSerializer:o,headers:s}=n;r!==void 0&&hu.assertOptions(r,{silentJSONParsing:ur.transitional(ur.boolean),forcedJSONParsing:ur.transitional(ur.boolean),clarifyTimeoutError:ur.transitional(ur.boolean)},!1),o!=null&&(B.isFunction(o)?n.paramsSerializer={serialize:o}:hu.assertOptions(o,{encode:ur.function,serialize:ur.function},!0)),n.method=(n.method||this.defaults.method||"get").toLowerCase();let i=s&&B.merge(s.common,s[n.method]);s&&B.forEach(["delete","get","head","post","put","patch","common"],p=>{delete s[p]}),n.headers=zt.concat(i,s);const a=[];let l=!0;this.interceptors.request.forEach(function(h){typeof h.runWhen=="function"&&h.runWhen(n)===!1||(l=l&&h.synchronous,a.unshift(h.fulfilled,h.rejected))});const u=[];this.interceptors.response.forEach(function(h){u.push(h.fulfilled,h.rejected)});let c,f=0,d;if(!l){const p=[Dp.bind(this),void 0];for(p.unshift.apply(p,a),p.push.apply(p,u),d=p.length,c=Promise.resolve(n);f{if(!r._listeners)return;let s=r._listeners.length;for(;s-- >0;)r._listeners[s](o);r._listeners=null}),this.promise.then=o=>{let s;const i=new Promise(a=>{r.subscribe(a),s=a}).then(o);return i.cancel=function(){r.unsubscribe(s)},i},t(function(s,i,a){r.reason||(r.reason=new qo(s,i,a),n(r.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]}unsubscribe(t){if(!this._listeners)return;const n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}toAbortSignal(){const t=new AbortController,n=r=>{t.abort(r)};return this.subscribe(n),t.signal.unsubscribe=()=>this.unsubscribe(n),t.signal}static source(){let t;return{token:new Ic(function(o){t=o}),cancel:t}}}function AI(e){return function(n){return e.apply(null,n)}}function RI(e){return B.isObject(e)&&e.isAxiosError===!0}const vu={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511};Object.entries(vu).forEach(([e,t])=>{vu[t]=e});function zg(e){const t=new Gr(e),n=bg(Gr.prototype.request,t);return B.extend(n,Gr.prototype,t,{allOwnKeys:!0}),B.extend(n,t,null,{allOwnKeys:!0}),n.create=function(o){return zg(no(e,o))},n}const mt=zg(Qs);mt.Axios=Gr;mt.CanceledError=qo;mt.CancelToken=Ic;mt.isCancel=Lg;mt.VERSION=jg;mt.toFormData=Ha;mt.AxiosError=Ae;mt.Cancel=mt.CanceledError;mt.all=function(t){return Promise.all(t)};mt.spread=AI;mt.isAxiosError=RI;mt.mergeConfig=no;mt.AxiosHeaders=zt;mt.formToJSON=e=>kg(B.isHTMLForm(e)?new FormData(e):e);mt.getAdapter=Vg.getAdapter;mt.HttpStatusCode=vu;mt.default=mt;function jp(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function Ei(e){for(var t=1;te.length)&&(t=e.length);for(var n=0,r=new Array(t);nthis.range.start)){var r=Math.max(n-this.param.buffer,0);this.checkRange(r,this.getEndByStart(r))}}},{key:"handleBehind",value:function(){var n=this.getScrollOvers();nn&&(i=o-1)}return r>0?--r:0}},{key:"getIndexOffset",value:function(n){if(!n)return 0;for(var r=0,o=0,s=0;s=R&&r("tobottom")},g=function(Z){var I=v(),R=p(),H=h();I<0||I+R>H+1||!H||(f.handleScroll(I),y(I,R,H,Z))},_=function(){var Z=t.dataKey,I=t.dataSources,R=I===void 0?[]:I;return R.map(function(H){return typeof Z=="function"?Z(H):H[Z]})},E=function(Z){l.value=Z},S=function(){f=new DI({slotHeaderSize:0,slotFooterSize:0,keeps:t.keeps,estimateSize:t.estimateSize,buffer:Math.round(t.keeps/3),uniqueIds:_()},E),l.value=f.getRange()},b=function(Z){if(Z>=t.dataSources.length-1)M();else{var I=f.getOffset(Z);O(I)}},O=function(Z){t.pageMode?(document.body[a]=Z,document.documentElement[a]=Z):u.value&&(u.value[a]=Z)},A=function(){for(var Z=[],I=l.value,R=I.start,H=I.end,re=t.dataSources,ye=t.dataKey,Ne=t.itemClass,Me=t.itemTag,Pe=t.itemStyle,Ce=t.extraProps,We=t.dataComponent,qe=t.itemScopedSlots,Ee=R;Ee<=H;Ee++){var F=re[Ee];if(F){var j=typeof ye=="function"?ye(F):F[ye];typeof j=="string"||typeof j=="number"?Z.push(ie(HI,{index:Ee,tag:Me,event:gs.ITEM,horizontal:i,uniqueKey:j,source:F,extraProps:Ce,component:We,scopedSlots:qe,style:Pe,class:"".concat(Ne).concat(t.itemClassAdd?" "+t.itemClassAdd(Ee):""),onItemResize:P},null)):console.warn("Cannot get the data-key '".concat(ye,"' from data-sources."))}else console.warn("Cannot get the index '".concat(Ee,"' from data-sources."))}return Z},P=function(Z,I){f.saveSize(Z,I),r("resized",Z,I)},x=function(Z,I,R){Z===Eo.HEADER?f.updateParam("slotHeaderSize",I):Z===Eo.FOOTER&&f.updateParam("slotFooterSize",I),R&&f.handleSlotSizeChange()},M=function D(){if(c.value){var Z=c.value[i?"offsetLeft":"offsetTop"];O(Z),setTimeout(function(){v()+p()Kg=e,Ug=Symbol();function gu(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var ys;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(ys||(ys={}));function M8(){const e=rh(!0),t=e.run(()=>z({}));let n=[],r=[];const o=Nu({install(s){Ua(o),o._a=s,s.provide(Ug,o),s.config.globalProperties.$pinia=o,r.forEach(i=>n.push(i)),r=[]},use(s){return!this._a&&!qw?r.push(s):n.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const qg=()=>{};function Kp(e,t,n,r=qg){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&Cu()&&Tu(o),o}function yo(e,...t){e.slice().forEach(n=>{n(...t)})}const KI=e=>e(),Up=Symbol(),Cl=Symbol();function yu(e,t){e instanceof Map&&t instanceof Map?t.forEach((n,r)=>e.set(r,n)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],o=e[n];gu(o)&&gu(r)&&e.hasOwnProperty(n)&&!He(r)&&!Gn(r)?e[n]=yu(o,r):e[n]=r}return e}const UI=Symbol();function qI(e){return!gu(e)||!e.hasOwnProperty(UI)}const{assign:pr}=Object;function WI(e){return!!(He(e)&&e.effect)}function GI(e,t,n,r){const{state:o,actions:s,getters:i}=t,a=n.state.value[e];let l;function u(){a||(n.state.value[e]=o?o():{});const c=Or(n.state.value[e]);return pr(c,s,Object.keys(i||{}).reduce((f,d)=>(f[d]=Nu(T(()=>{Ua(n);const v=n._s.get(e);return i[d].call(v,v)})),f),{}))}return l=Wg(e,u,t,n,r,!0),l}function Wg(e,t,n={},r,o,s){let i;const a=pr({actions:{}},n),l={deep:!0};let u,c,f=[],d=[],v;const p=r.state.value[e];!s&&!p&&(r.state.value[e]={}),z({});let h;function y(P){let x;u=c=!1,typeof P=="function"?(P(r.state.value[e]),x={type:ys.patchFunction,storeId:e,events:v}):(yu(r.state.value[e],P),x={type:ys.patchObject,payload:P,storeId:e,events:v});const M=h=Symbol();ze().then(()=>{h===M&&(u=!0)}),c=!0,yo(f,x,r.state.value[e])}const g=s?function(){const{state:x}=n,M=x?x():{};this.$patch(U=>{pr(U,M)})}:qg;function _(){i.stop(),f=[],d=[],r._s.delete(e)}const E=(P,x="")=>{if(Up in P)return P[Cl]=x,P;const M=function(){Ua(r);const U=Array.from(arguments),N=[],D=[];function Z(H){N.push(H)}function I(H){D.push(H)}yo(d,{args:U,name:M[Cl],store:b,after:Z,onError:I});let R;try{R=P.apply(this&&this.$id===e?this:b,U)}catch(H){throw yo(D,H),H}return R instanceof Promise?R.then(H=>(yo(N,H),H)).catch(H=>(yo(D,H),Promise.reject(H))):(yo(N,R),R)};return M[Up]=!0,M[Cl]=x,M},S={_p:r,$id:e,$onAction:Kp.bind(null,d),$patch:y,$reset:g,$subscribe(P,x={}){const M=Kp(f,P,x.detached,()=>U()),U=i.run(()=>me(()=>r.state.value[e],N=>{(x.flush==="sync"?c:u)&&P({storeId:e,type:ys.direct,events:v},N)},pr({},l,x)));return M},$dispose:_},b=Et(S);r._s.set(e,b);const A=(r._a&&r._a.runWithContext||KI)(()=>r._e.run(()=>(i=rh()).run(()=>t({action:E}))));for(const P in A){const x=A[P];if(He(x)&&!WI(x)||Gn(x))s||(p&&qI(x)&&(He(x)?x.value=p[P]:yu(x,p[P])),r.state.value[e][P]=x);else if(typeof x=="function"){const M=E(x,P);A[P]=M,a.actions[P]=x}}return pr(b,A),pr(Ie(b),A),Object.defineProperty(b,"$state",{get:()=>r.state.value[e],set:P=>{y(x=>{pr(x,P)})}}),r._p.forEach(P=>{pr(b,i.run(()=>P({store:b,app:r._a,pinia:r,options:a})))}),p&&s&&n.hydrate&&n.hydrate(b.$state,p),u=!0,c=!0,b}function F8(e,t,n){let r,o;const s=typeof t=="function";typeof e=="string"?(r=e,o=s?n:t):(o=e,r=e.id);function i(a,l){const u=xb();return a=a||(u?_e(Ug,null):null),a&&Ua(a),a=Kg,a._s.has(r)||(s?Wg(r,t,o,a):GI(r,o,a)),a._s.get(r)}return i.$id=r,i}function B8(e){{e=Ie(e);const t={};for(const n in e){const r=e[n];(He(r)||Gn(r))&&(t[n]=Zt(e,n))}return t}}const Tl=typeof navigator<"u"?navigator.userAgent.toLowerCase().indexOf("firefox")>0:!1;function Ol(e,t,n,r){e.addEventListener?e.addEventListener(t,n,r):e.attachEvent&&e.attachEvent("on".concat(t),n)}function ts(e,t,n,r){e.removeEventListener?e.removeEventListener(t,n,r):e.detachEvent&&e.detachEvent("on".concat(t),n)}function Gg(e,t){const n=t.slice(0,t.length-1);for(let r=0;r=0;)t[n-1]+=",",t.splice(n,1),n=t.lastIndexOf("");return t}function YI(e,t){const n=e.length>=t.length?e:t,r=e.length>=t.length?t:e;let o=!0;for(let s=0;sBs[e.toLowerCase()]||Nn[e.toLowerCase()]||e.toUpperCase().charCodeAt(0),JI=e=>Object.keys(Bs).find(t=>Bs[t]===e),XI=e=>Object.keys(Nn).find(t=>Nn[t]===e);function Xg(e){Jg=e||"all"}function Ds(){return Jg||"all"}function ZI(){return Qe.slice(0)}function QI(){return Qe.map(e=>JI(e)||XI(e)||String.fromCharCode(e))}function e8(){const e=[];return Object.keys(lt).forEach(t=>{lt[t].forEach(n=>{let{key:r,scope:o,mods:s,shortcut:i}=n;e.push({scope:o,shortcut:i,mods:s,keys:r.split("+").map(a=>ei(a))})})}),e}function t8(e){const t=e.target||e.srcElement,{tagName:n}=t;let r=!0;const o=n==="INPUT"&&!["checkbox","radio","range","button","file","reset","submit","color"].includes(t.type);return(t.isContentEditable||(o||n==="TEXTAREA"||n==="SELECT")&&!t.readOnly)&&(r=!1),r}function n8(e){return typeof e=="string"&&(e=ei(e)),Qe.indexOf(e)!==-1}function r8(e,t){let n,r;e||(e=Ds());for(const o in lt)if(Object.prototype.hasOwnProperty.call(lt,o))for(n=lt[o],r=0;r{let{element:a}=i;return $c(a)}):r++;Ds()===e&&Xg(t||"all")}function o8(e){let t=e.keyCode||e.which||e.charCode;const n=Qe.indexOf(t);if(n>=0&&Qe.splice(n,1),e.key&&e.key.toLowerCase()==="meta"&&Qe.splice(0,Qe.length),(t===93||t===224)&&(t=91),t in _t){_t[t]=!1;for(const r in Nn)Nn[r]===t&&(wr[r]=!1)}}function Zg(e){if(typeof e>"u")Object.keys(lt).forEach(o=>{Array.isArray(lt[o])&<[o].forEach(s=>Ci(s)),delete lt[o]}),$c(null);else if(Array.isArray(e))e.forEach(o=>{o.key&&Ci(o)});else if(typeof e=="object")e.key&&Ci(e);else if(typeof e=="string"){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{let{key:t,scope:n,method:r,splitKey:o="+"}=e;Yg(t).forEach(i=>{const a=i.split(o),l=a.length,u=a[l-1],c=u==="*"?"*":ei(u);if(!lt[c])return;n||(n=Ds());const f=l>1?Gg(Nn,a):[],d=[];lt[c]=lt[c].filter(v=>{const h=(r?v.method===r:!0)&&v.scope===n&&YI(v.mods,f);return h&&d.push(v.element),!h}),d.forEach(v=>$c(v))})};function qp(e,t,n,r){if(t.element!==r)return;let o;if(t.scope===n||t.scope==="all"){o=t.mods.length>0;for(const s in _t)Object.prototype.hasOwnProperty.call(_t,s)&&(!_t[s]&&t.mods.indexOf(+s)>-1||_t[s]&&t.mods.indexOf(+s)===-1)&&(o=!1);(t.mods.length===0&&!_t[16]&&!_t[18]&&!_t[17]&&!_t[91]||o||t.shortcut==="*")&&(t.keys=[],t.keys=t.keys.concat(Qe),t.method(e,t)===!1&&(e.preventDefault?e.preventDefault():e.returnValue=!1,e.stopPropagation&&e.stopPropagation(),e.cancelBubble&&(e.cancelBubble=!0)))}}function Wp(e,t){const n=lt["*"];let r=e.keyCode||e.which||e.charCode;if(!wr.filter.call(this,e))return;if((r===93||r===224)&&(r=91),Qe.indexOf(r)===-1&&r!==229&&Qe.push(r),["ctrlKey","altKey","shiftKey","metaKey"].forEach(a=>{const l=bu[a];e[a]&&Qe.indexOf(l)===-1?Qe.push(l):!e[a]&&Qe.indexOf(l)>-1?Qe.splice(Qe.indexOf(l),1):a==="metaKey"&&e[a]&&Qe.length===3&&(e.ctrlKey||e.shiftKey||e.altKey||(Qe=Qe.slice(Qe.indexOf(l))))}),r in _t){_t[r]=!0;for(const a in Nn)Nn[a]===r&&(wr[a]=!0);if(!n)return}for(const a in _t)Object.prototype.hasOwnProperty.call(_t,a)&&(_t[a]=e[bu[a]]);e.getModifierState&&!(e.altKey&&!e.ctrlKey)&&e.getModifierState("AltGraph")&&(Qe.indexOf(17)===-1&&Qe.push(17),Qe.indexOf(18)===-1&&Qe.push(18),_t[17]=!0,_t[18]=!0);const o=Ds();if(n)for(let a=0;a1&&(o=Gg(Nn,e)),e=e[e.length-1],e=e==="*"?"*":ei(e),e in lt||(lt[e]=[]),lt[e].push({keyup:l,keydown:u,scope:s,mods:o,shortcut:r[a],method:n,key:r[a],splitKey:c,element:i});if(typeof i<"u"&&window){if(!Hn.has(i)){const v=function(){let h=arguments.length>0&&arguments[0]!==void 0?arguments[0]:window.event;return Wp(h,i)},p=function(){let h=arguments.length>0&&arguments[0]!==void 0?arguments[0]:window.event;Wp(h,i),o8(h)};Hn.set(i,{keydownListener:v,keyupListenr:p,capture:f}),Ol(i,"keydown",v,f),Ol(i,"keyup",p,f)}if(!bs){const v=()=>{Qe=[]};bs={listener:v,capture:f},Ol(window,"focus",v,f)}}}function s8(e){let t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"all";Object.keys(lt).forEach(n=>{lt[n].filter(o=>o.scope===t&&o.shortcut===e).forEach(o=>{o&&o.method&&o.method()})})}function $c(e){const t=Object.values(lt).flat();if(t.findIndex(r=>{let{element:o}=r;return o===e})<0){const{keydownListener:r,keyupListenr:o,capture:s}=Hn.get(e)||{};r&&o&&(ts(e,"keyup",o,s),ts(e,"keydown",r,s),Hn.delete(e))}if((t.length<=0||Hn.size<=0)&&(Object.keys(Hn).forEach(o=>{const{keydownListener:s,keyupListenr:i,capture:a}=Hn.get(o)||{};s&&i&&(ts(o,"keyup",i,a),ts(o,"keydown",s,a),Hn.delete(o))}),Hn.clear(),Object.keys(lt).forEach(o=>delete lt[o]),bs)){const{listener:o,capture:s}=bs;ts(window,"focus",o,s),bs=null}}const xl={getPressedKeyString:QI,setScope:Xg,getScope:Ds,deleteScope:r8,getPressedKeyCodes:ZI,getAllKeyCodes:e8,isPressed:n8,filter:t8,trigger:s8,unbind:Zg,keyMap:Bs,modifier:Nn,modifierMap:bu};for(const e in xl)Object.prototype.hasOwnProperty.call(xl,e)&&(wr[e]=xl[e]);if(typeof window<"u"){const e=window.hotkeys;wr.noConflict=t=>(t&&window.hotkeys===wr&&(window.hotkeys=e),wr),window.hotkeys=wr}export{z0 as $,v8 as A,p8 as B,d8 as C,Ie as D,T8 as E,et as F,e4 as G,S8 as H,me as I,xn as J,ue as K,M8 as L,qu as M,Jc as N,I8 as O,P8 as P,wr as Q,Ue as R,f8 as S,E8 as T,R8 as U,N8 as V,C8 as W,x8 as X,O8 as Y,b8 as Z,y8 as _,u8 as a,a8 as a0,pR as a1,_r as a2,Et as a3,c8 as a4,oo as a5,it as a6,ze as a7,ht as a8,M0 as a9,eg as aa,A8 as ab,ro as ac,k8 as ad,l8 as b,pe as c,Q as d,ie as e,Xr as f,fe as g,$8 as h,z as i,mt as j,L8 as k,m8 as l,F8 as m,T as n,$ as o,h8 as p,q,$r as r,B8 as s,Je as t,m as u,w8 as v,ve as w,_8 as x,He as y,g8 as z}; diff --git a/app/src/main/assets/web/vue/index.html b/app/src/main/assets/web/vue/index.html index e0cc84fb8010..b0f4083f928b 100644 --- a/app/src/main/assets/web/vue/index.html +++ b/app/src/main/assets/web/vue/index.html @@ -4,9 +4,9 @@ - - - + + + From f6f5d1d46e6215191554a1799052c13585a77300 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 19 Sep 2024 16:13:54 +0800 Subject: [PATCH 137/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/CrashHandler.kt | 3 ++- app/src/main/java/io/legado/app/utils/LogUtils.kt | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/help/CrashHandler.kt b/app/src/main/java/io/legado/app/help/CrashHandler.kt index d01b520e07e7..550faca6c271 100644 --- a/app/src/main/java/io/legado/app/help/CrashHandler.kt +++ b/app/src/main/java/io/legado/app/help/CrashHandler.kt @@ -81,7 +81,7 @@ class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler { LocalConfig.appCrash = true //保存日志文件 saveCrashInfo2File(ex) - if (ex is OutOfMemoryError && AppConfig.recordHeapDump) { + if ((ex is OutOfMemoryError || ex.cause is OutOfMemoryError) && AppConfig.recordHeapDump) { doHeapDump() } context.longToastOnUiLegacy(ex.stackTraceStr) @@ -106,6 +106,7 @@ class CrashHandler(val context: Context) : Thread.UncaughtExceptionHandler { } catch (e: Throwable) { e.toString() } + map["packageName"] = appCtx.packageName //获取app版本信息 AppConst.appInfo.let { map["versionName"] = it.versionName diff --git a/app/src/main/java/io/legado/app/utils/LogUtils.kt b/app/src/main/java/io/legado/app/utils/LogUtils.kt index 7ae782e67ea3..6d136659b416 100644 --- a/app/src/main/java/io/legado/app/utils/LogUtils.kt +++ b/app/src/main/java/io/legado/app/utils/LogUtils.kt @@ -114,6 +114,7 @@ object LogUtils { e.toString() } append("WebViewUserAgent=").append(userAgent).append("\n") + append("packageName=").append(appCtx.packageName).append("\n") //获取app版本信息 AppConst.appInfo.let { append("versionName=").append(it.versionName).append("\n") From 7dba21affcf3ccd8e0ab5d7ccf50c56d62d1287f Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 20 Sep 2024 15:20:26 +0800 Subject: [PATCH 138/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/api/controller/BookController.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/api/controller/BookController.kt b/app/src/main/java/io/legado/app/api/controller/BookController.kt index 727c5d221237..bff481dd639c 100644 --- a/app/src/main/java/io/legado/app/api/controller/BookController.kt +++ b/app/src/main/java/io/legado/app/api/controller/BookController.kt @@ -28,6 +28,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking import splitties.init.appCtx import java.io.File +import java.util.concurrent.TimeUnit object BookController { @@ -69,7 +70,7 @@ object BookController { .centerCrop() .submit() return try { - returnData.setData(ftBitmap.get()) + returnData.setData(ftBitmap.get(3, TimeUnit.SECONDS)) } catch (e: Exception) { val defaultBitmap = Glide.with(appCtx) .asBitmap() From 38cecec4ad7882f877fd7bdf297c8b92e30cdfc0 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 20 Sep 2024 18:07:52 +0800 Subject: [PATCH 139/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/book/BookHelp.kt | 5 +++-- app/src/main/java/io/legado/app/model/CacheBook.kt | 2 +- .../app/ui/book/read/page/provider/TextChapterLayout.kt | 9 ++++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/book/BookHelp.kt b/app/src/main/java/io/legado/app/help/book/BookHelp.kt index 32c68db838e6..896e78b6cf9b 100644 --- a/app/src/main/java/io/legado/app/help/book/BookHelp.kt +++ b/app/src/main/java/io/legado/app/help/book/BookHelp.kt @@ -154,7 +154,8 @@ object BookHelp { bookSource: BookSource, book: Book, bookChapter: BookChapter, - content: String + content: String, + concurrency: Int = AppConfig.threadCount ) = coroutineScope { flow { val matcher = AppPattern.imgPattern.matcher(content) @@ -163,7 +164,7 @@ object BookHelp { val mSrc = NetworkUtils.getAbsoluteURL(bookChapter.url, src) emit(mSrc) } - }.onEachParallel(AppConfig.threadCount) { mSrc -> + }.onEachParallel(concurrency) { mSrc -> saveImage(bookSource, book, mSrc, bookChapter) }.collect() } diff --git a/app/src/main/java/io/legado/app/model/CacheBook.kt b/app/src/main/java/io/legado/app/model/CacheBook.kt index b7b1a3030746..32d33970f9cc 100644 --- a/app/src/main/java/io/legado/app/model/CacheBook.kt +++ b/app/src/main/java/io/legado/app/model/CacheBook.kt @@ -269,7 +269,7 @@ object CacheBook { if (BookHelp.hasContent(book, chapter)) { Coroutine.async(executeContext = context) { BookHelp.getContent(book, chapter)?.let { - BookHelp.saveImages(bookSource, book, chapter, it) + BookHelp.saveImages(bookSource, book, chapter, it, 1) } }.onSuccess { onSuccess(chapter) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt index f4b9d1ee44ea..b01201611af0 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt @@ -27,6 +27,8 @@ import io.legado.app.utils.fastSum import io.legado.app.utils.splitNotBlank import kotlinx.coroutines.CancellationException import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.ensureActive import kotlinx.coroutines.launch @@ -83,7 +85,11 @@ class TextChapterLayout( var channel = Channel(Int.MAX_VALUE) init { - job = Coroutine.async(scope) { + job = Coroutine.async( + scope, + start = CoroutineStart.LAZY, + executeContext = IO + ) { launch { val bookSource = book.getBookSource() ?: return@launch BookHelp.saveImages(bookSource, book, bookChapter, bookContent.toString()) @@ -95,6 +101,7 @@ class TextChapterLayout( }.onFinally { isCompleted = true } + job.start() } fun setProgressListener(l: LayoutProgressListener?) { From 4b741f168d5e43844b782267679c93267b595d49 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 20 Sep 2024 19:22:48 +0800 Subject: [PATCH 140/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/config/ReadAloudConfigDialog.kt | 2 +- .../io/legado/app/ui/book/read/config/SpeakEngineDialog.kt | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt index cdc21cf921e7..c9db5b2d8207 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/ReadAloudConfigDialog.kt @@ -103,7 +103,7 @@ class ReadAloudConfigDialog : DialogFragment() { override fun onPreferenceTreeClick(preference: Preference): Boolean { when (preference.key) { - PreferKey.ttsEngine -> showDialogFragment(SpeakEngineDialog(this)) + PreferKey.ttsEngine -> showDialogFragment(SpeakEngineDialog()) "sysTtsConfig" -> IntentHelp.openTTSSetting() } return super.onPreferenceTreeClick(preference) diff --git a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt index e3cf4f23fdd6..54104ef310c4 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/config/SpeakEngineDialog.kt @@ -54,7 +54,7 @@ import kotlinx.coroutines.launch /** * tts引擎管理 */ -class SpeakEngineDialog(val callBack: CallBack) : BaseDialogFragment(R.layout.dialog_recycler_view), +class SpeakEngineDialog() : BaseDialogFragment(R.layout.dialog_recycler_view), Toolbar.OnMenuItemClickListener { private val binding by viewBinding(DialogRecyclerViewBinding::bind) @@ -63,6 +63,7 @@ class SpeakEngineDialog(val callBack: CallBack) : BaseDialogFragment(R.layout.di private val adapter by lazy { Adapter(requireContext()) } private var ttsEngine: String? = ReadAloud.ttsEngine private val sysTtsViews = arrayListOf() + private val callBack: CallBack? get() = parentFragment as? CallBack private val importDocResult = registerForActivityResult(HandleFileContract()) { it.uri?.let { uri -> viewModel.importLocal(uri) @@ -140,7 +141,7 @@ class SpeakEngineDialog(val callBack: CallBack) : BaseDialogFragment(R.layout.di tvFooterLeft.visible() tvFooterLeft.setOnClickListener { ReadBook.book?.setTtsEngine(ttsEngine) - callBack.upSpeakEngineSummary() + callBack?.upSpeakEngineSummary() ReadAloud.upReadAloudClass() dismissAllowingStateLoss() } @@ -149,7 +150,7 @@ class SpeakEngineDialog(val callBack: CallBack) : BaseDialogFragment(R.layout.di tvOk.setOnClickListener { ReadBook.book?.setTtsEngine(null) AppConfig.ttsEngine = ttsEngine - callBack.upSpeakEngineSummary() + callBack?.upSpeakEngineSummary() ReadAloud.upReadAloudClass() dismissAllowingStateLoss() } From 0fd8054963cb8bf17c5a72b3f53b720eb1830056 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sun, 22 Sep 2024 13:56:44 +0800 Subject: [PATCH 141/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/model/CacheBook.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/model/CacheBook.kt b/app/src/main/java/io/legado/app/model/CacheBook.kt index 32d33970f9cc..9b36b760c81f 100644 --- a/app/src/main/java/io/legado/app/model/CacheBook.kt +++ b/app/src/main/java/io/legado/app/model/CacheBook.kt @@ -267,7 +267,7 @@ object CacheBook { waitDownloadSet.remove(chapterIndex) onDownloadSet.add(chapterIndex) if (BookHelp.hasContent(book, chapter)) { - Coroutine.async(executeContext = context) { + Coroutine.async(scope, context, executeContext = context) { BookHelp.getContent(book, chapter)?.let { BookHelp.saveImages(bookSource, book, chapter, it, 1) } From 6df00e9f499d4fb2ad20ac0d725f13853e410f73 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 24 Sep 2024 10:59:04 +0800 Subject: [PATCH 142/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/App.kt | 1 - app/src/main/java/io/legado/app/ui/main/MainActivity.kt | 1 + app/src/main/java/io/legado/app/ui/main/MainViewModel.kt | 6 ++++++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/App.kt b/app/src/main/java/io/legado/app/App.kt index 005fca10e8ac..d2dd202286f0 100644 --- a/app/src/main/java/io/legado/app/App.kt +++ b/app/src/main/java/io/legado/app/App.kt @@ -84,7 +84,6 @@ class App : Application() { val clearTime = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(1) appDb.searchBookDao.clearExpired(clearTime) } - appDb.bookDao.deleteNotShelfBook() RuleBigDataHelp.clearInvalid() BookHelp.clearInvalidCache() Backup.clearCache() diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 57e6bfa562f5..a8e493bed9f4 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -98,6 +98,7 @@ class MainActivity : VMBaseActivity(), bottomNavigationView.setOnNavigationItemReselectedListener(this@MainActivity) } upHomePage() + viewModel.deleteNotShelfBook() onBackPressedDispatcher.addCallback(this) { if (pagePosition != 0) { binding.viewPagerMain.currentItem = 0 diff --git a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt index fc8d40e0114c..6406ca3313c8 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt @@ -250,4 +250,10 @@ class MainViewModel(application: Application) : BaseViewModel(application) { } } + fun deleteNotShelfBook() { + execute { + appDb.bookDao.deleteNotShelfBook() + } + } + } \ No newline at end of file From 80a359ba5a0442ae3e5bf905d1e9ca1f5856ffcd Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Tue, 24 Sep 2024 12:29:14 +0800 Subject: [PATCH 143/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/model/analyzeRule/AnalyzeUrl.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt index 7b2f87069634..49b95ab10720 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt +++ b/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt @@ -320,11 +320,16 @@ class AnalyzeUrl( val rateIndex = concurrentRate.indexOf("/") var fetchRecord = concurrentRecordMap[source.getKey()] if (fetchRecord == null) { - fetchRecord = ConcurrentRecord(rateIndex > 0, System.currentTimeMillis(), 1) - concurrentRecordMap[source.getKey()] = fetchRecord - return fetchRecord + synchronized(concurrentRecordMap) { + fetchRecord = concurrentRecordMap[source.getKey()] + if (fetchRecord == null) { + fetchRecord = ConcurrentRecord(rateIndex > 0, System.currentTimeMillis(), 1) + concurrentRecordMap[source.getKey()] = fetchRecord + return fetchRecord + } + } } - val waitTime: Int = synchronized(fetchRecord) { + val waitTime: Int = synchronized(fetchRecord!!) { try { if (!fetchRecord.isConcurrent) { //并发控制非 次数/毫秒 From 72af4d737a4fd7b7b37cbb3e91898fd77eac7630 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Wed, 25 Sep 2024 18:05:46 +0800 Subject: [PATCH 144/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/receiver/MediaButtonReceiver.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt b/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt index 03e2616c5340..fccb50ac25fe 100644 --- a/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt +++ b/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt @@ -15,6 +15,7 @@ import io.legado.app.service.AudioPlayService import io.legado.app.service.BaseReadAloudService import io.legado.app.ui.book.audio.AudioPlayActivity import io.legado.app.ui.book.read.ReadBookActivity +import io.legado.app.utils.LogUtils import io.legado.app.utils.getPrefBoolean import io.legado.app.utils.postEvent @@ -33,6 +34,8 @@ class MediaButtonReceiver : BroadcastReceiver() { companion object { + private const val TAG = "MediaButtonReceiver" + fun handleIntent(context: Context, intent: Intent): Boolean { val intentAction = intent.action if (Intent.ACTION_MEDIA_BUTTON == intentAction) { @@ -42,6 +45,7 @@ class MediaButtonReceiver : BroadcastReceiver() { val keycode: Int = keyEvent.keyCode val action: Int = keyEvent.action if (action == KeyEvent.ACTION_DOWN) { + LogUtils.d(TAG, "Receive mediaButton event, keycode:$keycode") when (keycode) { KeyEvent.KEYCODE_MEDIA_PREVIOUS -> { if (context.getPrefBoolean("mediaButtonPerNext", false)) { From a762ba4587350a9b901997ba2b64d05993ee379d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E7=89=9B?= <76513019+old-yellow-ox@users.noreply.github.com> Date: Thu, 26 Sep 2024 14:50:17 +0800 Subject: [PATCH 145/837] =?UTF-8?q?rss=E6=94=B6=E8=97=8F=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=88=86=E7=BB=84=E7=AE=A1=E7=90=86=20(#4236)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * rss收藏增加分组和标题编辑选项 * 优化变量命名 * 订阅收藏按分组展示 * 优化:订阅收藏分组展示 * 优化 * 优化rss收藏分组管理 * 优化数据库版本控制 --- .../io.legado.app.data.AppDatabase/72.json | 1912 +++++++++++++++++ .../java/io/legado/app/data/AppDatabase.kt | 3 +- .../io/legado/app/data/dao/RssArticleDao.kt | 2 +- .../java/io/legado/app/data/dao/RssStarDao.kt | 6 + .../io/legado/app/data/entities/RssArticle.kt | 5 +- .../io/legado/app/data/entities/RssStar.kt | 4 + .../ui/rss/favorites/RssFavoritesActivity.kt | 82 +- .../ui/rss/favorites/RssFavoritesDialog.kt | 81 + .../ui/rss/favorites/RssFavoritesFragment.kt | 77 + .../ui/rss/favorites/RssFavoritesViewModel.kt | 9 + .../legado/app/ui/rss/read/ReadRssActivity.kt | 24 +- .../app/ui/rss/read/ReadRssViewModel.kt | 33 + .../res/layout/activity_rss_favorites.xml | 31 +- .../main/res/layout/dialog_rssfavorites.xml | 112 + 14 files changed, 2327 insertions(+), 54 deletions(-) create mode 100644 app/schemas/io.legado.app.data.AppDatabase/72.json create mode 100644 app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesDialog.kt create mode 100644 app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt create mode 100644 app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesViewModel.kt create mode 100644 app/src/main/res/layout/dialog_rssfavorites.xml diff --git a/app/schemas/io.legado.app.data.AppDatabase/72.json b/app/schemas/io.legado.app.data.AppDatabase/72.json new file mode 100644 index 000000000000..03a2072bd98d --- /dev/null +++ b/app/schemas/io.legado.app.data.AppDatabase/72.json @@ -0,0 +1,1912 @@ +{ + "formatVersion": 1, + "database": { + "version": 72, + "identityHash": "53d960f1fdc04a6f157a25b269a0d93b", + "entities": [ + { + "tableName": "books", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`bookUrl` TEXT NOT NULL DEFAULT '', `tocUrl` TEXT NOT NULL DEFAULT '', `origin` TEXT NOT NULL DEFAULT 'loc_book', `originName` TEXT NOT NULL DEFAULT '', `name` TEXT NOT NULL DEFAULT '', `author` TEXT NOT NULL DEFAULT '', `kind` TEXT, `customTag` TEXT, `coverUrl` TEXT, `customCoverUrl` TEXT, `intro` TEXT, `customIntro` TEXT, `charset` TEXT, `type` INTEGER NOT NULL DEFAULT 0, `group` INTEGER NOT NULL DEFAULT 0, `latestChapterTitle` TEXT, `latestChapterTime` INTEGER NOT NULL DEFAULT 0, `lastCheckTime` INTEGER NOT NULL DEFAULT 0, `lastCheckCount` INTEGER NOT NULL DEFAULT 0, `totalChapterNum` INTEGER NOT NULL DEFAULT 0, `durChapterTitle` TEXT, `durChapterIndex` INTEGER NOT NULL DEFAULT 0, `durChapterPos` INTEGER NOT NULL DEFAULT 0, `durChapterTime` INTEGER NOT NULL DEFAULT 0, `wordCount` TEXT, `canUpdate` INTEGER NOT NULL DEFAULT 1, `order` INTEGER NOT NULL DEFAULT 0, `originOrder` INTEGER NOT NULL DEFAULT 0, `variable` TEXT, `readConfig` TEXT, `syncTime` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`bookUrl`))", + "fields": [ + { + "fieldPath": "bookUrl", + "columnName": "bookUrl", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "tocUrl", + "columnName": "tocUrl", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "origin", + "columnName": "origin", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'loc_book'" + }, + { + "fieldPath": "originName", + "columnName": "originName", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "kind", + "columnName": "kind", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "customTag", + "columnName": "customTag", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "coverUrl", + "columnName": "coverUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "customCoverUrl", + "columnName": "customCoverUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "intro", + "columnName": "intro", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "customIntro", + "columnName": "customIntro", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "charset", + "columnName": "charset", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "latestChapterTitle", + "columnName": "latestChapterTitle", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "latestChapterTime", + "columnName": "latestChapterTime", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "lastCheckTime", + "columnName": "lastCheckTime", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "lastCheckCount", + "columnName": "lastCheckCount", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "totalChapterNum", + "columnName": "totalChapterNum", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "durChapterTitle", + "columnName": "durChapterTitle", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "durChapterIndex", + "columnName": "durChapterIndex", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "durChapterPos", + "columnName": "durChapterPos", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "durChapterTime", + "columnName": "durChapterTime", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "wordCount", + "columnName": "wordCount", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "canUpdate", + "columnName": "canUpdate", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "order", + "columnName": "order", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "originOrder", + "columnName": "originOrder", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "variable", + "columnName": "variable", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "readConfig", + "columnName": "readConfig", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "syncTime", + "columnName": "syncTime", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "bookUrl" + ] + }, + "indices": [ + { + "name": "index_books_name_author", + "unique": true, + "columnNames": [ + "name", + "author" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_books_name_author` ON `${TABLE_NAME}` (`name`, `author`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "book_groups", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`groupId` INTEGER NOT NULL, `groupName` TEXT NOT NULL, `cover` TEXT, `order` INTEGER NOT NULL, `enableRefresh` INTEGER NOT NULL DEFAULT 1, `show` INTEGER NOT NULL DEFAULT 1, `bookSort` INTEGER NOT NULL DEFAULT -1, PRIMARY KEY(`groupId`))", + "fields": [ + { + "fieldPath": "groupId", + "columnName": "groupId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "groupName", + "columnName": "groupName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cover", + "columnName": "cover", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "order", + "columnName": "order", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "enableRefresh", + "columnName": "enableRefresh", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "show", + "columnName": "show", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "bookSort", + "columnName": "bookSort", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "-1" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "groupId" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "book_sources", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`bookSourceUrl` TEXT NOT NULL, `bookSourceName` TEXT NOT NULL, `bookSourceGroup` TEXT, `bookSourceType` INTEGER NOT NULL, `bookUrlPattern` TEXT, `customOrder` INTEGER NOT NULL DEFAULT 0, `enabled` INTEGER NOT NULL DEFAULT 1, `enabledExplore` INTEGER NOT NULL DEFAULT 1, `jsLib` TEXT, `enabledCookieJar` INTEGER DEFAULT 0, `concurrentRate` TEXT, `header` TEXT, `loginUrl` TEXT, `loginUi` TEXT, `loginCheckJs` TEXT, `coverDecodeJs` TEXT, `bookSourceComment` TEXT, `variableComment` TEXT, `lastUpdateTime` INTEGER NOT NULL, `respondTime` INTEGER NOT NULL, `weight` INTEGER NOT NULL, `exploreUrl` TEXT, `exploreScreen` TEXT, `ruleExplore` TEXT, `searchUrl` TEXT, `ruleSearch` TEXT, `ruleBookInfo` TEXT, `ruleToc` TEXT, `ruleContent` TEXT, `ruleReview` TEXT, PRIMARY KEY(`bookSourceUrl`))", + "fields": [ + { + "fieldPath": "bookSourceUrl", + "columnName": "bookSourceUrl", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "bookSourceName", + "columnName": "bookSourceName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "bookSourceGroup", + "columnName": "bookSourceGroup", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "bookSourceType", + "columnName": "bookSourceType", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "bookUrlPattern", + "columnName": "bookUrlPattern", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "customOrder", + "columnName": "customOrder", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "enabled", + "columnName": "enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "enabledExplore", + "columnName": "enabledExplore", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "jsLib", + "columnName": "jsLib", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "enabledCookieJar", + "columnName": "enabledCookieJar", + "affinity": "INTEGER", + "notNull": false, + "defaultValue": "0" + }, + { + "fieldPath": "concurrentRate", + "columnName": "concurrentRate", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "header", + "columnName": "header", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "loginUrl", + "columnName": "loginUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "loginUi", + "columnName": "loginUi", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "loginCheckJs", + "columnName": "loginCheckJs", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "coverDecodeJs", + "columnName": "coverDecodeJs", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "bookSourceComment", + "columnName": "bookSourceComment", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "variableComment", + "columnName": "variableComment", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastUpdateTime", + "columnName": "lastUpdateTime", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "respondTime", + "columnName": "respondTime", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "exploreUrl", + "columnName": "exploreUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "exploreScreen", + "columnName": "exploreScreen", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleExplore", + "columnName": "ruleExplore", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "searchUrl", + "columnName": "searchUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleSearch", + "columnName": "ruleSearch", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleBookInfo", + "columnName": "ruleBookInfo", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleToc", + "columnName": "ruleToc", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleContent", + "columnName": "ruleContent", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleReview", + "columnName": "ruleReview", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "bookSourceUrl" + ] + }, + "indices": [ + { + "name": "index_book_sources_bookSourceUrl", + "unique": false, + "columnNames": [ + "bookSourceUrl" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_book_sources_bookSourceUrl` ON `${TABLE_NAME}` (`bookSourceUrl`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "chapters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `title` TEXT NOT NULL, `isVolume` INTEGER NOT NULL, `baseUrl` TEXT NOT NULL, `bookUrl` TEXT NOT NULL, `index` INTEGER NOT NULL, `isVip` INTEGER NOT NULL, `isPay` INTEGER NOT NULL, `resourceUrl` TEXT, `tag` TEXT, `start` INTEGER, `end` INTEGER, `startFragmentId` TEXT, `endFragmentId` TEXT, `variable` TEXT, PRIMARY KEY(`url`, `bookUrl`), FOREIGN KEY(`bookUrl`) REFERENCES `books`(`bookUrl`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isVolume", + "columnName": "isVolume", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "baseUrl", + "columnName": "baseUrl", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "bookUrl", + "columnName": "bookUrl", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "index", + "columnName": "index", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isVip", + "columnName": "isVip", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "isPay", + "columnName": "isPay", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "resourceUrl", + "columnName": "resourceUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tag", + "columnName": "tag", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "end", + "columnName": "end", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "startFragmentId", + "columnName": "startFragmentId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "endFragmentId", + "columnName": "endFragmentId", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "variable", + "columnName": "variable", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "url", + "bookUrl" + ] + }, + "indices": [ + { + "name": "index_chapters_bookUrl", + "unique": false, + "columnNames": [ + "bookUrl" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_chapters_bookUrl` ON `${TABLE_NAME}` (`bookUrl`)" + }, + { + "name": "index_chapters_bookUrl_index", + "unique": true, + "columnNames": [ + "bookUrl", + "index" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_chapters_bookUrl_index` ON `${TABLE_NAME}` (`bookUrl`, `index`)" + } + ], + "foreignKeys": [ + { + "table": "books", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "bookUrl" + ], + "referencedColumns": [ + "bookUrl" + ] + } + ] + }, + { + "tableName": "replace_rules", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL DEFAULT '', `group` TEXT, `pattern` TEXT NOT NULL DEFAULT '', `replacement` TEXT NOT NULL DEFAULT '', `scope` TEXT, `scopeTitle` INTEGER NOT NULL DEFAULT 0, `scopeContent` INTEGER NOT NULL DEFAULT 1, `excludeScope` TEXT, `isEnabled` INTEGER NOT NULL DEFAULT 1, `isRegex` INTEGER NOT NULL DEFAULT 1, `timeoutMillisecond` INTEGER NOT NULL DEFAULT 3000, `sortOrder` INTEGER NOT NULL DEFAULT 0)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "pattern", + "columnName": "pattern", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "replacement", + "columnName": "replacement", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "scope", + "columnName": "scope", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "scopeTitle", + "columnName": "scopeTitle", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "scopeContent", + "columnName": "scopeContent", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "excludeScope", + "columnName": "excludeScope", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isEnabled", + "columnName": "isEnabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "isRegex", + "columnName": "isRegex", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "timeoutMillisecond", + "columnName": "timeoutMillisecond", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "3000" + }, + { + "fieldPath": "order", + "columnName": "sortOrder", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_replace_rules_id", + "unique": false, + "columnNames": [ + "id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_replace_rules_id` ON `${TABLE_NAME}` (`id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "searchBooks", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`bookUrl` TEXT NOT NULL, `origin` TEXT NOT NULL, `originName` TEXT NOT NULL, `type` INTEGER NOT NULL, `name` TEXT NOT NULL, `author` TEXT NOT NULL, `kind` TEXT, `coverUrl` TEXT, `intro` TEXT, `wordCount` TEXT, `latestChapterTitle` TEXT, `tocUrl` TEXT NOT NULL, `time` INTEGER NOT NULL, `variable` TEXT, `originOrder` INTEGER NOT NULL, `chapterWordCountText` TEXT, `chapterWordCount` INTEGER NOT NULL DEFAULT -1, `respondTime` INTEGER NOT NULL DEFAULT -1, PRIMARY KEY(`bookUrl`), FOREIGN KEY(`origin`) REFERENCES `book_sources`(`bookSourceUrl`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "bookUrl", + "columnName": "bookUrl", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "origin", + "columnName": "origin", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "originName", + "columnName": "originName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "author", + "columnName": "author", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "kind", + "columnName": "kind", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "coverUrl", + "columnName": "coverUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "intro", + "columnName": "intro", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "wordCount", + "columnName": "wordCount", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "latestChapterTitle", + "columnName": "latestChapterTitle", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tocUrl", + "columnName": "tocUrl", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "time", + "columnName": "time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "variable", + "columnName": "variable", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "originOrder", + "columnName": "originOrder", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "chapterWordCountText", + "columnName": "chapterWordCountText", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "chapterWordCount", + "columnName": "chapterWordCount", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "-1" + }, + { + "fieldPath": "respondTime", + "columnName": "respondTime", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "-1" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "bookUrl" + ] + }, + "indices": [ + { + "name": "index_searchBooks_bookUrl", + "unique": true, + "columnNames": [ + "bookUrl" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_searchBooks_bookUrl` ON `${TABLE_NAME}` (`bookUrl`)" + }, + { + "name": "index_searchBooks_origin", + "unique": false, + "columnNames": [ + "origin" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_searchBooks_origin` ON `${TABLE_NAME}` (`origin`)" + } + ], + "foreignKeys": [ + { + "table": "book_sources", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "origin" + ], + "referencedColumns": [ + "bookSourceUrl" + ] + } + ] + }, + { + "tableName": "search_keywords", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`word` TEXT NOT NULL, `usage` INTEGER NOT NULL, `lastUseTime` INTEGER NOT NULL, PRIMARY KEY(`word`))", + "fields": [ + { + "fieldPath": "word", + "columnName": "word", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "usage", + "columnName": "usage", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lastUseTime", + "columnName": "lastUseTime", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "word" + ] + }, + "indices": [ + { + "name": "index_search_keywords_word", + "unique": true, + "columnNames": [ + "word" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_search_keywords_word` ON `${TABLE_NAME}` (`word`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "cookies", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`url` TEXT NOT NULL, `cookie` TEXT NOT NULL, PRIMARY KEY(`url`))", + "fields": [ + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "cookie", + "columnName": "cookie", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "url" + ] + }, + "indices": [ + { + "name": "index_cookies_url", + "unique": true, + "columnNames": [ + "url" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_cookies_url` ON `${TABLE_NAME}` (`url`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "rssSources", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`sourceUrl` TEXT NOT NULL, `sourceName` TEXT NOT NULL, `sourceIcon` TEXT NOT NULL, `sourceGroup` TEXT, `sourceComment` TEXT, `enabled` INTEGER NOT NULL, `variableComment` TEXT, `jsLib` TEXT, `enabledCookieJar` INTEGER DEFAULT 0, `concurrentRate` TEXT, `header` TEXT, `loginUrl` TEXT, `loginUi` TEXT, `loginCheckJs` TEXT, `coverDecodeJs` TEXT, `sortUrl` TEXT, `singleUrl` INTEGER NOT NULL, `articleStyle` INTEGER NOT NULL DEFAULT 0, `ruleArticles` TEXT, `ruleNextPage` TEXT, `ruleTitle` TEXT, `rulePubDate` TEXT, `ruleDescription` TEXT, `ruleImage` TEXT, `ruleLink` TEXT, `ruleContent` TEXT, `contentWhitelist` TEXT, `contentBlacklist` TEXT, `shouldOverrideUrlLoading` TEXT, `style` TEXT, `enableJs` INTEGER NOT NULL DEFAULT 1, `loadWithBaseUrl` INTEGER NOT NULL DEFAULT 1, `injectJs` TEXT, `lastUpdateTime` INTEGER NOT NULL DEFAULT 0, `customOrder` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`sourceUrl`))", + "fields": [ + { + "fieldPath": "sourceUrl", + "columnName": "sourceUrl", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sourceName", + "columnName": "sourceName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sourceIcon", + "columnName": "sourceIcon", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sourceGroup", + "columnName": "sourceGroup", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "sourceComment", + "columnName": "sourceComment", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "enabled", + "columnName": "enabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "variableComment", + "columnName": "variableComment", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "jsLib", + "columnName": "jsLib", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "enabledCookieJar", + "columnName": "enabledCookieJar", + "affinity": "INTEGER", + "notNull": false, + "defaultValue": "0" + }, + { + "fieldPath": "concurrentRate", + "columnName": "concurrentRate", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "header", + "columnName": "header", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "loginUrl", + "columnName": "loginUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "loginUi", + "columnName": "loginUi", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "loginCheckJs", + "columnName": "loginCheckJs", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "coverDecodeJs", + "columnName": "coverDecodeJs", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "sortUrl", + "columnName": "sortUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "singleUrl", + "columnName": "singleUrl", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "articleStyle", + "columnName": "articleStyle", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "ruleArticles", + "columnName": "ruleArticles", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleNextPage", + "columnName": "ruleNextPage", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleTitle", + "columnName": "ruleTitle", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "rulePubDate", + "columnName": "rulePubDate", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleDescription", + "columnName": "ruleDescription", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleImage", + "columnName": "ruleImage", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleLink", + "columnName": "ruleLink", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "ruleContent", + "columnName": "ruleContent", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "contentWhitelist", + "columnName": "contentWhitelist", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "contentBlacklist", + "columnName": "contentBlacklist", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "shouldOverrideUrlLoading", + "columnName": "shouldOverrideUrlLoading", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "style", + "columnName": "style", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "enableJs", + "columnName": "enableJs", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "loadWithBaseUrl", + "columnName": "loadWithBaseUrl", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "injectJs", + "columnName": "injectJs", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastUpdateTime", + "columnName": "lastUpdateTime", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "customOrder", + "columnName": "customOrder", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "sourceUrl" + ] + }, + "indices": [ + { + "name": "index_rssSources_sourceUrl", + "unique": false, + "columnNames": [ + "sourceUrl" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_rssSources_sourceUrl` ON `${TABLE_NAME}` (`sourceUrl`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "bookmarks", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`time` INTEGER NOT NULL, `bookName` TEXT NOT NULL, `bookAuthor` TEXT NOT NULL, `chapterIndex` INTEGER NOT NULL, `chapterPos` INTEGER NOT NULL, `chapterName` TEXT NOT NULL, `bookText` TEXT NOT NULL, `content` TEXT NOT NULL, PRIMARY KEY(`time`))", + "fields": [ + { + "fieldPath": "time", + "columnName": "time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "bookName", + "columnName": "bookName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "bookAuthor", + "columnName": "bookAuthor", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "chapterIndex", + "columnName": "chapterIndex", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "chapterPos", + "columnName": "chapterPos", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "chapterName", + "columnName": "chapterName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "bookText", + "columnName": "bookText", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "time" + ] + }, + "indices": [ + { + "name": "index_bookmarks_bookName_bookAuthor", + "unique": false, + "columnNames": [ + "bookName", + "bookAuthor" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_bookmarks_bookName_bookAuthor` ON `${TABLE_NAME}` (`bookName`, `bookAuthor`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "rssArticles", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`origin` TEXT NOT NULL, `sort` TEXT NOT NULL, `title` TEXT NOT NULL, `order` INTEGER NOT NULL, `link` TEXT NOT NULL, `pubDate` TEXT, `description` TEXT, `content` TEXT, `image` TEXT, `group` TEXT NOT NULL DEFAULT '默认分组', `read` INTEGER NOT NULL, `variable` TEXT, PRIMARY KEY(`origin`, `link`))", + "fields": [ + { + "fieldPath": "origin", + "columnName": "origin", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sort", + "columnName": "sort", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "order", + "columnName": "order", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "link", + "columnName": "link", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pubDate", + "columnName": "pubDate", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "image", + "columnName": "image", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'默认分组'" + }, + { + "fieldPath": "read", + "columnName": "read", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "variable", + "columnName": "variable", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "origin", + "link" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "rssReadRecords", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`record` TEXT NOT NULL, `read` INTEGER NOT NULL, PRIMARY KEY(`record`))", + "fields": [ + { + "fieldPath": "record", + "columnName": "record", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "read", + "columnName": "read", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "record" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "rssStars", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`origin` TEXT NOT NULL, `sort` TEXT NOT NULL, `title` TEXT NOT NULL, `starTime` INTEGER NOT NULL, `link` TEXT NOT NULL, `pubDate` TEXT, `description` TEXT, `content` TEXT, `image` TEXT, `group` TEXT NOT NULL DEFAULT '默认分组', `variable` TEXT, PRIMARY KEY(`origin`, `link`))", + "fields": [ + { + "fieldPath": "origin", + "columnName": "origin", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sort", + "columnName": "sort", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "starTime", + "columnName": "starTime", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "link", + "columnName": "link", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "pubDate", + "columnName": "pubDate", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "content", + "columnName": "content", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "image", + "columnName": "image", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "group", + "columnName": "group", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'默认分组'" + }, + { + "fieldPath": "variable", + "columnName": "variable", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "origin", + "link" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "txtTocRules", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `rule` TEXT NOT NULL, `example` TEXT, `serialNumber` INTEGER NOT NULL, `enable` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "rule", + "columnName": "rule", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "example", + "columnName": "example", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "serialNumber", + "columnName": "serialNumber", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "enable", + "columnName": "enable", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "readRecord", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`deviceId` TEXT NOT NULL, `bookName` TEXT NOT NULL, `readTime` INTEGER NOT NULL DEFAULT 0, `lastRead` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`deviceId`, `bookName`))", + "fields": [ + { + "fieldPath": "deviceId", + "columnName": "deviceId", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "bookName", + "columnName": "bookName", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "readTime", + "columnName": "readTime", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "lastRead", + "columnName": "lastRead", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "deviceId", + "bookName" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "httpTTS", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `url` TEXT NOT NULL, `contentType` TEXT, `concurrentRate` TEXT DEFAULT '0', `loginUrl` TEXT, `loginUi` TEXT, `header` TEXT, `jsLib` TEXT, `enabledCookieJar` INTEGER DEFAULT 0, `loginCheckJs` TEXT, `lastUpdateTime` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "contentType", + "columnName": "contentType", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "concurrentRate", + "columnName": "concurrentRate", + "affinity": "TEXT", + "notNull": false, + "defaultValue": "'0'" + }, + { + "fieldPath": "loginUrl", + "columnName": "loginUrl", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "loginUi", + "columnName": "loginUi", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "header", + "columnName": "header", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "jsLib", + "columnName": "jsLib", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "enabledCookieJar", + "columnName": "enabledCookieJar", + "affinity": "INTEGER", + "notNull": false, + "defaultValue": "0" + }, + { + "fieldPath": "loginCheckJs", + "columnName": "loginCheckJs", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "lastUpdateTime", + "columnName": "lastUpdateTime", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "caches", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`key` TEXT NOT NULL, `value` TEXT, `deadline` INTEGER NOT NULL, PRIMARY KEY(`key`))", + "fields": [ + { + "fieldPath": "key", + "columnName": "key", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "deadline", + "columnName": "deadline", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "key" + ] + }, + "indices": [ + { + "name": "index_caches_key", + "unique": true, + "columnNames": [ + "key" + ], + "orders": [], + "createSql": "CREATE UNIQUE INDEX IF NOT EXISTS `index_caches_key` ON `${TABLE_NAME}` (`key`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "ruleSubs", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `url` TEXT NOT NULL, `type` INTEGER NOT NULL, `customOrder` INTEGER NOT NULL, `autoUpdate` INTEGER NOT NULL, `update` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "url", + "columnName": "url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "customOrder", + "columnName": "customOrder", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "autoUpdate", + "columnName": "autoUpdate", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "update", + "columnName": "update", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "dictRules", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`name` TEXT NOT NULL, `urlRule` TEXT NOT NULL, `showRule` TEXT NOT NULL, `enabled` INTEGER NOT NULL DEFAULT 1, `sortNumber` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`name`))", + "fields": [ + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "urlRule", + "columnName": "urlRule", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "showRule", + "columnName": "showRule", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "enabled", + "columnName": "enabled", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "sortNumber", + "columnName": "sortNumber", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "name" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "keyboardAssists", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`type` INTEGER NOT NULL DEFAULT 0, `key` TEXT NOT NULL DEFAULT '', `value` TEXT NOT NULL DEFAULT '', `serialNo` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`type`, `key`))", + "fields": [ + { + "fieldPath": "type", + "columnName": "type", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "key", + "columnName": "key", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "value", + "columnName": "value", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "serialNo", + "columnName": "serialNo", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "type", + "key" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "servers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `type` TEXT NOT NULL, `config` TEXT, `sortNumber` INTEGER NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "config", + "columnName": "config", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "sortNumber", + "columnName": "sortNumber", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '53d960f1fdc04a6f157a25b269a0d93b')" + ] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/AppDatabase.kt b/app/src/main/java/io/legado/app/data/AppDatabase.kt index c5e8221d1f9a..1e0c59d52843 100644 --- a/app/src/main/java/io/legado/app/data/AppDatabase.kt +++ b/app/src/main/java/io/legado/app/data/AppDatabase.kt @@ -63,7 +63,7 @@ val appDb by lazy { } @Database( - version = 71, + version = 72, exportSchema = true, entities = [Book::class, BookGroup::class, BookSource::class, BookChapter::class, ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class, @@ -99,6 +99,7 @@ val appDb by lazy { AutoMigration(from = 68, to = 69), AutoMigration(from = 69, to = 70), AutoMigration(from = 70, to = 71), + AutoMigration(from = 71, to = 72), ] ) abstract class AppDatabase : RoomDatabase() { diff --git a/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt b/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt index 30caf63dae0d..2ed311aa38c2 100644 --- a/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/RssArticleDao.kt @@ -13,7 +13,7 @@ interface RssArticleDao { @Query( """select t1.link, t1.sort, t1.origin, t1.`order`, t1.title, t1.content, - t1.description, t1.image, t1.pubDate, t1.variable, ifNull(t2.read, 0) as read + t1.description, t1.image, t1.`group`, t1.pubDate, t1.variable, ifNull(t2.read, 0) as read from rssArticles as t1 left join rssReadRecords as t2 on t1.link = t2.record where origin = :origin and sort = :sort order by `order` desc""" diff --git a/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt b/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt index 2c40349c0305..7501180817a1 100644 --- a/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt @@ -10,6 +10,12 @@ interface RssStarDao { @get:Query("select * from rssStars order by starTime desc") val all: List + @Query("select `group` from rssStars group by `group` order by `group`") + fun groupList(): Flow> + + @Query("select * from rssStars where `group` = :group order by starTime desc") + fun getByGroup(group: String): Flow> + @Query("select * from rssStars where origin = :origin and link = :link") fun get(origin: String, link: String): RssStar? diff --git a/app/src/main/java/io/legado/app/data/entities/RssArticle.kt b/app/src/main/java/io/legado/app/data/entities/RssArticle.kt index c7eee2fa4f67..a6aa1e63914d 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssArticle.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssArticle.kt @@ -1,12 +1,12 @@ package io.legado.app.data.entities +import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.Ignore import io.legado.app.utils.GSON import io.legado.app.utils.fromJsonObject import kotlinx.parcelize.IgnoredOnParcel - @Entity( tableName = "rssArticles", primaryKeys = ["origin", "link"] @@ -21,6 +21,8 @@ data class RssArticle( var description: String? = null, var content: String? = null, var image: String? = null, + @ColumnInfo(defaultValue = "默认分组") + var group: String = "默认分组", var read: Boolean = false, override var variable: String? = null ) : BaseRssArticle { @@ -49,6 +51,7 @@ data class RssArticle( description = description, content = content, image = image, + group = group, variable = variable ) } diff --git a/app/src/main/java/io/legado/app/data/entities/RssStar.kt b/app/src/main/java/io/legado/app/data/entities/RssStar.kt index fc5a1199bdf1..f9a74109d982 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssStar.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssStar.kt @@ -1,5 +1,6 @@ package io.legado.app.data.entities +import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.Ignore import io.legado.app.utils.GSON @@ -21,6 +22,8 @@ data class RssStar( var description: String? = null, var content: String? = null, var image: String? = null, + @ColumnInfo(defaultValue = "默认分组") + var group: String = "默认分组", override var variable: String? = null ) : BaseRssArticle { @@ -40,6 +43,7 @@ data class RssStar( description = description, content = content, image = image, + group = group, variable = variable ) } diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt index d1f1a3591f21..6b0a8d3a16de 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt @@ -1,62 +1,84 @@ +@file:Suppress("DEPRECATION") + package io.legado.app.ui.rss.favorites import android.os.Bundle +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.fragment.app.FragmentStatePagerAdapter import androidx.lifecycle.lifecycleScope -import androidx.recyclerview.widget.LinearLayoutManager import io.legado.app.base.BaseActivity import io.legado.app.constant.AppLog import io.legado.app.data.appDb -import io.legado.app.data.entities.RssStar import io.legado.app.databinding.ActivityRssFavoritesBinding import io.legado.app.lib.theme.accentColor -import io.legado.app.ui.rss.read.ReadRssActivity -import io.legado.app.ui.widget.recycler.VerticalDivider -import io.legado.app.utils.startActivity +import io.legado.app.utils.gone import io.legado.app.utils.viewbindingdelegate.viewBinding +import io.legado.app.utils.visible import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Job import kotlinx.coroutines.flow.catch -import kotlinx.coroutines.flow.conflate import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch /** * 收藏夹 */ -class RssFavoritesActivity : BaseActivity(), - RssFavoritesAdapter.CallBack { +class RssFavoritesActivity : BaseActivity(){ override val binding by viewBinding(ActivityRssFavoritesBinding::inflate) - private val adapter by lazy { RssFavoritesAdapter(this, this) } + private val adapter by lazy { TabFragmentPageAdapter() } + private var groupList = mutableListOf() + private var rssStarFlowJob: Job? = null override fun onActivityCreated(savedInstanceState: Bundle?) { - initView() - initData() + binding.viewPager.adapter = adapter + binding.tabLayout.setupWithViewPager(binding.viewPager) + binding.tabLayout.setSelectedTabIndicatorColor(accentColor) + upFragments() } - private fun initView() { - binding.refreshLayout.setColorSchemeColors(accentColor) - binding.recyclerView.let { - it.layoutManager = LinearLayoutManager(this) - it.addItemDecoration(VerticalDivider(this)) - it.adapter = adapter + private fun upFragments() { + rssStarFlowJob?.cancel() + rssStarFlowJob = lifecycleScope.launch { + appDb.rssStarDao.groupList().catch { + AppLog.put("订阅分组数据获取失败\n${it.localizedMessage}", it) + }.flowOn(IO).collect { + groupList.clear() + groupList.addAll(it) + if (groupList.size == 1) { + binding.tabLayout.gone() + } else { + binding.tabLayout.visible() + } + adapter.notifyDataSetChanged() + } } } - private fun initData() { - lifecycleScope.launch { - appDb.rssStarDao.liveAll().catch { - AppLog.put("订阅收藏夹界面获取数据失败\n${it.localizedMessage}", it) - }.flowOn(IO).conflate().collect { - adapter.setItems(it) - } + private inner class TabFragmentPageAdapter : + FragmentStatePagerAdapter(supportFragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + + override fun getItemPosition(`object`: Any): Int { + return POSITION_NONE + } + + override fun getPageTitle(position: Int): CharSequence { + return groupList[position] + } + + override fun getItem(position: Int): Fragment { + val group = groupList[position] + return RssFavoritesFragment(group) + } + + override fun getCount(): Int { + return groupList.size } - } - override fun readRss(rssStar: RssStar) { - startActivity { - putExtra("title", rssStar.title) - putExtra("origin", rssStar.origin) - putExtra("link", rssStar.link) + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val fragment = super.instantiateItem(container, position) as Fragment + return fragment } } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesDialog.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesDialog.kt new file mode 100644 index 000000000000..41da4c12f874 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesDialog.kt @@ -0,0 +1,81 @@ +package io.legado.app.ui.rss.favorites + +import android.os.Bundle +import android.text.TextUtils +import android.view.View +import android.view.ViewGroup +import androidx.lifecycle.lifecycleScope +import io.legado.app.R +import io.legado.app.base.BaseDialogFragment +import io.legado.app.data.entities.RssArticle +import io.legado.app.databinding.DialogRssfavoritesBinding +import io.legado.app.lib.theme.primaryColor +import io.legado.app.utils.setLayout +import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.launch + +class RssFavoritesDialog() : BaseDialogFragment(R.layout.dialog_rssfavorites, true) { + + constructor(rssArticle: RssArticle) : this() { + arguments = Bundle().apply { + putString("title", rssArticle.title) + putString("group", rssArticle.group) + } + } + + private val binding by viewBinding(DialogRssfavoritesBinding::bind) + + override fun onStart() { + super.onStart() + setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT) + } + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + binding.toolBar.setBackgroundColor(primaryColor) + val arguments = arguments ?: let { + dismiss() + return + } + + var title = arguments.getString("title") ?: "默认名称" + var group = arguments.getString("group") ?: "默认分组" + binding.run { + editTitle.setText(title) + editGroup.setText(group) + tvCancel.setOnClickListener { + dismiss() + } + tvOk.setOnClickListener { + val editTitle = editTitle.text.toString() + if(!TextUtils.isEmpty(editTitle)){ + title = editTitle + } + val editGroup = editGroup.text.toString() + if(!TextUtils.isEmpty(editGroup)){ + group = editGroup + } + lifecycleScope.launch { + callback?.updateFavorite(title, group) + dismiss() + } + } + tvFooterLeft.setOnClickListener { + lifecycleScope.launch { + callback?.deleteFavorite() + dismiss() + } + } + } + } + + val callback get() = (parentFragment as? Callback) ?: (activity as? Callback) + + interface Callback { + + fun updateFavorite(title: String, group: String) + + fun deleteFavorite() + + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt new file mode 100644 index 000000000000..747a49b34046 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt @@ -0,0 +1,77 @@ +package io.legado.app.ui.rss.favorites + + +import android.os.Bundle +import android.view.View +import androidx.fragment.app.viewModels +import androidx.lifecycle.lifecycleScope +import androidx.recyclerview.widget.LinearLayoutManager +import io.legado.app.R +import io.legado.app.base.VMBaseFragment +import io.legado.app.constant.AppLog +import io.legado.app.data.appDb +import io.legado.app.data.entities.RssStar +import io.legado.app.databinding.FragmentRssArticlesBinding +import io.legado.app.lib.theme.primaryColor +import io.legado.app.ui.rss.read.ReadRssActivity +import io.legado.app.ui.widget.recycler.VerticalDivider +import io.legado.app.utils.setEdgeEffectColor +import io.legado.app.utils.startActivity +import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.launch + +class RssFavoritesFragment() : VMBaseFragment(R.layout.fragment_rss_articles), + RssFavoritesAdapter.CallBack { + + constructor(group: String) : this() { + arguments = Bundle().apply { + putString("group", group) + } + } + + private val binding by viewBinding(FragmentRssArticlesBinding::bind) + override val viewModel by viewModels() + private val adapter: RssFavoritesAdapter by lazy { + RssFavoritesAdapter(requireContext(), this@RssFavoritesFragment) + } + private var articlesFlowJob: Job? = null + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + initView() + } + + private fun initView() = binding.run { + refreshLayout.setEnabled(false) + recyclerView.setEdgeEffectColor(primaryColor) + recyclerView.layoutManager = run { + recyclerView.addItemDecoration(VerticalDivider(requireContext())) + LinearLayoutManager(requireContext()) + } + recyclerView.adapter = adapter + loadArticles() + } + + private fun loadArticles() { + articlesFlowJob?.cancel() + articlesFlowJob = lifecycleScope.launch { + val group = arguments?.getString("group") ?: "默认分组" + appDb.rssStarDao.getByGroup(group).catch { + AppLog.put("订阅文章界面获取数据失败\n${it.localizedMessage}", it) + }.flowOn(IO).collect { + adapter.setItems(it) + } + } + } + + override fun readRss(rssStar: RssStar) { + startActivity { + putExtra("title", rssStar.title) + putExtra("origin", rssStar.origin) + putExtra("link", rssStar.link) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesViewModel.kt new file mode 100644 index 000000000000..2f892004b9c9 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesViewModel.kt @@ -0,0 +1,9 @@ +package io.legado.app.ui.rss.favorites + +import android.app.Application +import io.legado.app.base.BaseViewModel + + +class RssFavoritesViewModel(application: Application) : BaseViewModel(application) { + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index 4614d047a603..ca970e67597d 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -42,6 +42,7 @@ import io.legado.app.model.Download import io.legado.app.ui.association.OnLineImportActivity import io.legado.app.ui.file.HandleFileContract import io.legado.app.ui.login.SourceLoginActivity +import io.legado.app.ui.rss.favorites.RssFavoritesDialog import io.legado.app.utils.ACache import io.legado.app.utils.NetworkUtils import io.legado.app.utils.get @@ -53,6 +54,7 @@ import io.legado.app.utils.openUrl import io.legado.app.utils.setDarkeningAllowed import io.legado.app.utils.setTintMutate import io.legado.app.utils.share +import io.legado.app.utils.showDialogFragment import io.legado.app.utils.splitNotBlank import io.legado.app.utils.startActivity import io.legado.app.utils.textArray @@ -70,7 +72,7 @@ import java.util.regex.PatternSyntaxException /** * rss阅读界面 */ -class ReadRssActivity : VMBaseActivity() { +class ReadRssActivity : VMBaseActivity(), RssFavoritesDialog.Callback { override val binding by viewBinding(ActivityRssReadBinding::inflate) override val viewModel by viewModels() @@ -151,8 +153,12 @@ class ReadRssActivity : VMBaseActivity R.id.menu_rss_refresh -> viewModel.refresh { binding.webView.reload() } - - R.id.menu_rss_star -> viewModel.favorite() + R.id.menu_rss_star -> { + viewModel.addFavorite() + viewModel.rssArticle?.let { + showDialogFragment(RssFavoritesDialog(it)) + } + } R.id.menu_share_it -> { binding.webView.url?.let { share(it) @@ -174,6 +180,16 @@ class ReadRssActivity : VMBaseActivity return super.onCompatOptionsItemSelected(item) } + override fun updateFavorite(title: String, group: String) { + viewModel.rssArticle?.title = title + viewModel.rssArticle?.group = group + viewModel.updateFavorite() + } + + override fun deleteFavorite() { + viewModel.delFavorite() + } + @JavascriptInterface fun isNightTheme(): Boolean { return AppConfig.isNightTheme @@ -188,7 +204,7 @@ class ReadRssActivity : VMBaseActivity } } - @SuppressLint("SetJavaScriptEnabled") + @SuppressLint("SetJavaScriptEnabled", "JavascriptInterface") private fun initWebView() { binding.progressBar.fontColor = accentColor binding.webView.webChromeClient = CustomWebChromeClient() diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt index 64bd51c3df19..c59e5f4fff69 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssViewModel.kt @@ -135,6 +135,39 @@ class ReadRssViewModel(application: Application) : BaseViewModel(application), J } } + fun addFavorite() { + execute { + rssStar ?: rssArticle?.toStar()?.let { + appDb.rssStarDao.insert(it) + rssStar = it + } + }.onSuccess { + upStarMenuData.postValue(true) + } + } + + fun updateFavorite() { + execute { + rssArticle?.toStar()?.let { + appDb.rssStarDao.update(it) + rssStar = it + } + }.onSuccess { + upStarMenuData.postValue(true) + } + } + + fun delFavorite() { + execute { + rssStar?.let { + appDb.rssStarDao.delete(it.origin, it.link) + rssStar = null + } + }.onSuccess { + upStarMenuData.postValue(true) + } + } + fun saveImage(webPic: String?, uri: Uri) { webPic ?: return execute { diff --git a/app/src/main/res/layout/activity_rss_favorites.xml b/app/src/main/res/layout/activity_rss_favorites.xml index 098af211a044..59e3ab0fa3fc 100644 --- a/app/src/main/res/layout/activity_rss_favorites.xml +++ b/app/src/main/res/layout/activity_rss_favorites.xml @@ -1,30 +1,27 @@ - + app:title="@string/favorites" /> - - - + android:layout_height="wrap_content" + app:tabMode="scrollable" /> - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_rssfavorites.xml b/app/src/main/res/layout/dialog_rssfavorites.xml new file mode 100644 index 000000000000..382b1f3d4aac --- /dev/null +++ b/app/src/main/res/layout/dialog_rssfavorites.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From ae1c2bbce30f3adfd29c1952a04a87177ba33cf3 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 26 Sep 2024 15:14:26 +0800 Subject: [PATCH 146/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/data/dao/RssStarDao.kt | 4 +-- .../ui/rss/favorites/RssFavoritesActivity.kt | 25 ++++++++--------- .../ui/rss/favorites/RssFavoritesDialog.kt | 27 +++++++------------ .../ui/rss/favorites/RssFavoritesFragment.kt | 13 ++++----- .../ui/rss/favorites/RssFavoritesViewModel.kt | 2 +- .../legado/app/ui/rss/read/ReadRssActivity.kt | 5 +++- ...tes.xml => dialog_rss_favorite_config.xml} | 0 7 files changed, 33 insertions(+), 43 deletions(-) rename app/src/main/res/layout/{dialog_rssfavorites.xml => dialog_rss_favorite_config.xml} (100%) diff --git a/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt b/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt index 7501180817a1..28d31d45d0fd 100644 --- a/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/RssStarDao.kt @@ -11,10 +11,10 @@ interface RssStarDao { val all: List @Query("select `group` from rssStars group by `group` order by `group`") - fun groupList(): Flow> + fun flowGroups(): Flow> @Query("select * from rssStars where `group` = :group order by starTime desc") - fun getByGroup(group: String): Flow> + fun flowByGroup(group: String): Flow> @Query("select * from rssStars where origin = :origin and link = :link") fun get(origin: String, link: String): RssStar? diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt index 6b0a8d3a16de..d0458e2191b2 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesActivity.kt @@ -3,7 +3,6 @@ package io.legado.app.ui.rss.favorites import android.os.Bundle -import android.view.ViewGroup import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentStatePagerAdapter import androidx.lifecycle.lifecycleScope @@ -16,34 +15,36 @@ import io.legado.app.utils.gone import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible import kotlinx.coroutines.Dispatchers.IO -import kotlinx.coroutines.Job import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch /** * 收藏夹 */ -class RssFavoritesActivity : BaseActivity(){ +class RssFavoritesActivity : BaseActivity() { override val binding by viewBinding(ActivityRssFavoritesBinding::inflate) private val adapter by lazy { TabFragmentPageAdapter() } private var groupList = mutableListOf() - private var rssStarFlowJob: Job? = null override fun onActivityCreated(savedInstanceState: Bundle?) { + initView() + upFragments() + } + + private fun initView() { binding.viewPager.adapter = adapter binding.tabLayout.setupWithViewPager(binding.viewPager) binding.tabLayout.setSelectedTabIndicatorColor(accentColor) - upFragments() } private fun upFragments() { - rssStarFlowJob?.cancel() - rssStarFlowJob = lifecycleScope.launch { - appDb.rssStarDao.groupList().catch { + lifecycleScope.launch { + appDb.rssStarDao.flowGroups().catch { AppLog.put("订阅分组数据获取失败\n${it.localizedMessage}", it) - }.flowOn(IO).collect { + }.distinctUntilChanged().flowOn(IO).collect { groupList.clear() groupList.addAll(it) if (groupList.size == 1) { @@ -76,9 +77,5 @@ class RssFavoritesActivity : BaseActivity(){ return groupList.size } - override fun instantiateItem(container: ViewGroup, position: Int): Any { - val fragment = super.instantiateItem(container, position) as Fragment - return fragment - } } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesDialog.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesDialog.kt index 41da4c12f874..9752f912a7ca 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesDialog.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesDialog.kt @@ -1,20 +1,17 @@ package io.legado.app.ui.rss.favorites import android.os.Bundle -import android.text.TextUtils import android.view.View import android.view.ViewGroup -import androidx.lifecycle.lifecycleScope import io.legado.app.R import io.legado.app.base.BaseDialogFragment import io.legado.app.data.entities.RssArticle -import io.legado.app.databinding.DialogRssfavoritesBinding +import io.legado.app.databinding.DialogRssFavoriteConfigBinding import io.legado.app.lib.theme.primaryColor import io.legado.app.utils.setLayout import io.legado.app.utils.viewbindingdelegate.viewBinding -import kotlinx.coroutines.launch -class RssFavoritesDialog() : BaseDialogFragment(R.layout.dialog_rssfavorites, true) { +class RssFavoritesDialog() : BaseDialogFragment(R.layout.dialog_rss_favorite_config, true) { constructor(rssArticle: RssArticle) : this() { arguments = Bundle().apply { @@ -23,7 +20,7 @@ class RssFavoritesDialog() : BaseDialogFragment(R.layout.dialog_rssfavorites, tr } } - private val binding by viewBinding(DialogRssfavoritesBinding::bind) + private val binding by viewBinding(DialogRssFavoriteConfigBinding::bind) override fun onStart() { super.onStart() @@ -47,23 +44,19 @@ class RssFavoritesDialog() : BaseDialogFragment(R.layout.dialog_rssfavorites, tr } tvOk.setOnClickListener { val editTitle = editTitle.text.toString() - if(!TextUtils.isEmpty(editTitle)){ + if (editTitle.isNotBlank()) { title = editTitle } val editGroup = editGroup.text.toString() - if(!TextUtils.isEmpty(editGroup)){ + if (editGroup.isNotBlank()) { group = editGroup } - lifecycleScope.launch { - callback?.updateFavorite(title, group) - dismiss() - } + callback?.updateFavorite(title, group) + dismiss() } tvFooterLeft.setOnClickListener { - lifecycleScope.launch { - callback?.deleteFavorite() - dismiss() - } + callback?.deleteFavorite() + dismiss() } } } @@ -78,4 +71,4 @@ class RssFavoritesDialog() : BaseDialogFragment(R.layout.dialog_rssfavorites, tr } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt index 747a49b34046..3d8e026c0300 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt @@ -19,7 +19,6 @@ import io.legado.app.utils.setEdgeEffectColor import io.legado.app.utils.startActivity import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO -import kotlinx.coroutines.Job import kotlinx.coroutines.flow.catch import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch @@ -38,28 +37,26 @@ class RssFavoritesFragment() : VMBaseFragment(R.layout.fr private val adapter: RssFavoritesAdapter by lazy { RssFavoritesAdapter(requireContext(), this@RssFavoritesFragment) } - private var articlesFlowJob: Job? = null override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { initView() + loadArticles() } private fun initView() = binding.run { - refreshLayout.setEnabled(false) + refreshLayout.isEnabled = false recyclerView.setEdgeEffectColor(primaryColor) recyclerView.layoutManager = run { recyclerView.addItemDecoration(VerticalDivider(requireContext())) LinearLayoutManager(requireContext()) } recyclerView.adapter = adapter - loadArticles() } private fun loadArticles() { - articlesFlowJob?.cancel() - articlesFlowJob = lifecycleScope.launch { + lifecycleScope.launch { val group = arguments?.getString("group") ?: "默认分组" - appDb.rssStarDao.getByGroup(group).catch { + appDb.rssStarDao.flowByGroup(group).catch { AppLog.put("订阅文章界面获取数据失败\n${it.localizedMessage}", it) }.flowOn(IO).collect { adapter.setItems(it) @@ -74,4 +71,4 @@ class RssFavoritesFragment() : VMBaseFragment(R.layout.fr putExtra("link", rssStar.link) } } -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesViewModel.kt index 2f892004b9c9..bc028698a5f2 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesViewModel.kt @@ -6,4 +6,4 @@ import io.legado.app.base.BaseViewModel class RssFavoritesViewModel(application: Application) : BaseViewModel(application) { -} \ No newline at end of file +} diff --git a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt index ca970e67597d..5d6c23f7a43e 100644 --- a/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt @@ -72,7 +72,8 @@ import java.util.regex.PatternSyntaxException /** * rss阅读界面 */ -class ReadRssActivity : VMBaseActivity(), RssFavoritesDialog.Callback { +class ReadRssActivity : VMBaseActivity(), + RssFavoritesDialog.Callback { override val binding by viewBinding(ActivityRssReadBinding::inflate) override val viewModel by viewModels() @@ -153,12 +154,14 @@ class ReadRssActivity : VMBaseActivity R.id.menu_rss_refresh -> viewModel.refresh { binding.webView.reload() } + R.id.menu_rss_star -> { viewModel.addFavorite() viewModel.rssArticle?.let { showDialogFragment(RssFavoritesDialog(it)) } } + R.id.menu_share_it -> { binding.webView.url?.let { share(it) diff --git a/app/src/main/res/layout/dialog_rssfavorites.xml b/app/src/main/res/layout/dialog_rss_favorite_config.xml similarity index 100% rename from app/src/main/res/layout/dialog_rssfavorites.xml rename to app/src/main/res/layout/dialog_rss_favorite_config.xml From 45252a24dc8255bf36fb307100a9457beb641624 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 26 Sep 2024 18:35:20 +0800 Subject: [PATCH 147/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/receiver/MediaButtonReceiver.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt b/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt index fccb50ac25fe..0ceaa74cce0f 100644 --- a/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt +++ b/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt @@ -54,6 +54,7 @@ class MediaButtonReceiver : BroadcastReceiver() { ReadAloud.prevParagraph(context) } } + KeyEvent.KEYCODE_MEDIA_NEXT -> { if (context.getPrefBoolean("mediaButtonPerNext", false)) { ReadBook.moveToNextChapter(true) @@ -61,6 +62,11 @@ class MediaButtonReceiver : BroadcastReceiver() { ReadAloud.nextParagraph(context) } } + + KeyEvent.KEYCODE_MEDIA_PAUSE -> { + pauseReadAloud(context) + } + else -> readAloud(context) } } @@ -68,6 +74,11 @@ class MediaButtonReceiver : BroadcastReceiver() { return true } + private fun pauseReadAloud(context: Context) { + ReadAloud.pause(context) + AudioPlay.pause(context) + } + fun readAloud(context: Context, isMediaKey: Boolean = true) { when { BaseReadAloudService.isRun -> { @@ -79,6 +90,7 @@ class MediaButtonReceiver : BroadcastReceiver() { AudioPlay.resume(context) } } + AudioPlayService.isRun -> { if (AudioPlayService.pause) { AudioPlay.resume(context) @@ -86,10 +98,13 @@ class MediaButtonReceiver : BroadcastReceiver() { AudioPlay.pause(context) } } + LifecycleHelp.isExistActivity(ReadBookActivity::class.java) -> postEvent(EventBus.MEDIA_BUTTON, true) + LifecycleHelp.isExistActivity(AudioPlayActivity::class.java) -> postEvent(EventBus.MEDIA_BUTTON, true) + else -> if (AppConfig.mediaButtonOnExit || LifecycleHelp.activitySize() > 0 || !isMediaKey) { ReadAloud.upReadAloudClass() if (ReadBook.book != null) { From bd671f4bb562beb29aaba8805cf2fd8348972ddc Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 26 Sep 2024 21:39:12 +0800 Subject: [PATCH 148/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/constant/PreferKey.kt | 1 + .../java/io/legado/app/help/config/AppConfig.kt | 3 +++ .../io/legado/app/receiver/MediaButtonReceiver.kt | 13 ++++--------- app/src/main/res/values-es-rES/strings.xml | 2 ++ app/src/main/res/values-ja-rJP/strings.xml | 2 ++ app/src/main/res/values-pt-rBR/strings.xml | 2 ++ app/src/main/res/values-vi/strings.xml | 2 ++ app/src/main/res/values-zh-rHK/strings.xml | 2 ++ app/src/main/res/values-zh-rTW/strings.xml | 2 ++ app/src/main/res/values-zh/strings.xml | 2 ++ app/src/main/res/values/strings.xml | 2 ++ app/src/main/res/xml/pref_config_other.xml | 7 +++++++ 12 files changed, 31 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index 013008a42fbf..2c0adfd48bfa 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -148,6 +148,7 @@ object PreferKey { const val updateToVariant = "updateToVariant" const val streamReadAloudAudio = "streamReadAloudAudio" const val pauseReadAloudWhilePhoneCalls = "pauseReadAloudWhilePhoneCalls" + const val readAloudByMediaButton = "readAloudByMediaButton" const val cPrimary = "colorPrimary" const val cAccent = "colorAccent" diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index bfaa2620508a..e1f244ea6ad6 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -453,6 +453,9 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { val mediaButtonOnExit get() = appCtx.getPrefBoolean("mediaButtonOnExit", true) + val readAloudByMediaButton + get() = appCtx.getPrefBoolean(PreferKey.readAloudByMediaButton, false) + val replaceEnableDefault get() = appCtx.getPrefBoolean(PreferKey.replaceEnableDefault, true) val webDavDir get() = appCtx.getPrefString(PreferKey.webDavDir, "legado") diff --git a/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt b/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt index 0ceaa74cce0f..d7548a19a2f6 100644 --- a/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt +++ b/app/src/main/java/io/legado/app/receiver/MediaButtonReceiver.kt @@ -63,10 +63,6 @@ class MediaButtonReceiver : BroadcastReceiver() { } } - KeyEvent.KEYCODE_MEDIA_PAUSE -> { - pauseReadAloud(context) - } - else -> readAloud(context) } } @@ -74,11 +70,6 @@ class MediaButtonReceiver : BroadcastReceiver() { return true } - private fun pauseReadAloud(context: Context) { - ReadAloud.pause(context) - AudioPlay.pause(context) - } - fun readAloud(context: Context, isMediaKey: Boolean = true) { when { BaseReadAloudService.isRun -> { @@ -99,6 +90,10 @@ class MediaButtonReceiver : BroadcastReceiver() { } } + isMediaKey && !AppConfig.readAloudByMediaButton -> { + // break + } + LifecycleHelp.isExistActivity(ReadBookActivity::class.java) -> postEvent(EventBus.MEDIA_BUTTON, true) diff --git a/app/src/main/res/values-es-rES/strings.xml b/app/src/main/res/values-es-rES/strings.xml index 047a7afb321b..ee5970b2f8a6 100644 --- a/app/src/main/res/values-es-rES/strings.xml +++ b/app/src/main/res/values-es-rES/strings.xml @@ -1164,4 +1164,6 @@ 来电期间暂停朗读 在通话期间暂停朗读,需要读取手机状态权限 阅读需要读取手机状态实现来电期间暂停朗读功能 + 耳机按键启动朗读 + 通过耳机按键来启动朗读 diff --git a/app/src/main/res/values-ja-rJP/strings.xml b/app/src/main/res/values-ja-rJP/strings.xml index d93a197ddb5d..d373e0c5147c 100644 --- a/app/src/main/res/values-ja-rJP/strings.xml +++ b/app/src/main/res/values-ja-rJP/strings.xml @@ -1167,4 +1167,6 @@ 来电期间暂停朗读 在通话期间暂停朗读,需要读取手机状态权限 阅读需要读取手机状态实现来电期间暂停朗读功能 + 耳机按键启动朗读 + 通过耳机按键来启动朗读 diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index b749ccdf4ddb..c4baf3d08e6c 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -1167,4 +1167,6 @@ 来电期间暂停朗读 在通话期间暂停朗读,需要读取手机状态权限 阅读需要读取手机状态实现来电期间暂停朗读功能 + 耳机按键启动朗读 + 通过耳机按键来启动朗读 diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index a2eb0523812f..f52b4898c7b1 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -1163,4 +1163,6 @@ Còn 来电期间暂停朗读 在通话期间暂停朗读,需要读取手机状态权限 阅读需要读取手机状态实现来电期间暂停朗读功能 + 耳机按键启动朗读 + 通过耳机按键来启动朗读 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 05b7583eac5f..e9e10d768fa6 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -1164,4 +1164,6 @@ 来电期间暂停朗读 在通话期间暂停朗读,需要读取手机状态权限 阅读需要读取手机状态实现来电期间暂停朗读功能 + 耳机按键启动朗读 + 通过耳机按键来启动朗读 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 27971b84690f..72d29400b887 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -1166,4 +1166,6 @@ 来电期间暂停朗读 在通话期间暂停朗读,需要读取手机状态权限 阅读需要读取手机状态实现来电期间暂停朗读功能 + 耳机按键启动朗读 + 通过耳机按键来启动朗读 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index fd13a510f88b..68c42f6ac64d 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -1166,4 +1166,6 @@ 来电期间暂停朗读 在通话期间暂停朗读,需要读取手机状态权限 阅读需要读取手机状态实现来电期间暂停朗读功能 + 耳机按键启动朗读 + 通过耳机按键来启动朗读 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 233aeb80b4b1..783d0f3e6bdb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1167,4 +1167,6 @@ 来电期间暂停朗读 在通话期间暂停朗读,需要读取手机状态权限 阅读需要读取手机状态实现来电期间暂停朗读功能 + 耳机按键启动朗读 + 通过耳机按键来启动朗读 diff --git a/app/src/main/res/xml/pref_config_other.xml b/app/src/main/res/xml/pref_config_other.xml index 94cedff3fe87..400494ab14a6 100644 --- a/app/src/main/res/xml/pref_config_other.xml +++ b/app/src/main/res/xml/pref_config_other.xml @@ -128,6 +128,13 @@ android:title="@string/media_button_on_exit_title" app:iconSpaceReserved="false" /> + + Date: Fri, 27 Sep 2024 15:41:00 +0800 Subject: [PATCH 149/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/widget/anima/explosion_field/ExplosionView.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionView.kt b/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionView.kt index 1d7619d072fd..39bd137801d7 100644 --- a/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/anima/explosion_field/ExplosionView.kt @@ -82,7 +82,7 @@ class ExplosionView @JvmOverloads constructor(context: Context, attrs: Attribute view.scaleX = 1f view.scaleY = 1f view.alpha = 1f - view.setOnClickListener(mOnClickListener)//set event + //view.setOnClickListener(mOnClickListener)//set event } } }) From bb5876e4a25df37ab0bbf167c63ef691a3664c05 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 27 Sep 2024 18:59:53 +0800 Subject: [PATCH 150/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/help/http/DecompressInterceptor.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/http/DecompressInterceptor.kt b/app/src/main/java/io/legado/app/help/http/DecompressInterceptor.kt index 8d2c0a422854..de3c0220949b 100644 --- a/app/src/main/java/io/legado/app/help/http/DecompressInterceptor.kt +++ b/app/src/main/java/io/legado/app/help/http/DecompressInterceptor.kt @@ -7,9 +7,10 @@ import okhttp3.internal.http.promisesBody import okio.buffer import okio.source import java.util.zip.GZIPInputStream +import java.util.zip.Inflater import java.util.zip.InflaterInputStream -object DecompressInterceptor: Interceptor { +object DecompressInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() val requestBuilder = request.newBuilder() @@ -30,7 +31,7 @@ object DecompressInterceptor: Interceptor { val encoding = response.header("Content-Encoding")?.lowercase() val source = when (encoding) { "gzip" -> GZIPInputStream(body.byteStream()).source().buffer() - "deflate" -> InflaterInputStream(body.byteStream()).source().buffer() + "deflate" -> InflaterInputStream(body.byteStream(), Inflater(true)).source().buffer() else -> return response } From ed5d13f455bc47ca7a54095375f70b116678bd19 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Sun, 29 Sep 2024 17:29:50 +0800 Subject: [PATCH 151/837] CI(modules/web/build): check github workflows ENV --- modules/web/scripts/sync.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/web/scripts/sync.js b/modules/web/scripts/sync.js index 2e47c89479d7..1d761449e96b 100644 --- a/modules/web/scripts/sync.js +++ b/modules/web/scripts/sync.js @@ -1,6 +1,11 @@ import { URL } from "node:url"; import fs from "node:fs"; +import process from "node:process"; +if (!process.env.GITHUB_ENV) { + console.log("非Github WorkFlows环境,取消文件复制") + process.exit() +} const LEGADO_ASSETS_WEB_VUE_DIR = new URL( "../../../app/src/main/assets/web/vue", import.meta.url, From bf91a6f206ceb546bbee54f2e3acf31eeefc2cf8 Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Sun, 29 Sep 2024 18:05:04 +0800 Subject: [PATCH 152/837] =?UTF-8?q?fix(modules/web):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E9=98=85=E8=AF=BBAPI;=E5=B0=81=E9=9D=A2=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E4=BC=98=E5=85=88=E4=BD=BF=E7=94=A8=E6=BA=90=E7=AB=99=E8=B5=84?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加图片代理接口API;API地址测试(3s超时) --- modules/web/.eslintrc-auto-import.json | 7 +- modules/web/src/api/axios.js | 17 +- modules/web/src/api/index.js | 100 +++++++-- modules/web/src/auto-imports.d.ts | 6 +- modules/web/src/components/BookItems.vue | 15 +- modules/web/src/components/ChapterContent.vue | 7 +- modules/web/src/main.js | 2 - modules/web/src/pages/bookshelf/config.js | 17 -- modules/web/src/pages/bookshelf/main.js | 2 - modules/web/src/store/bookStore.js | 10 +- modules/web/src/utils/utils.js | 16 +- modules/web/src/views/BookShelf.vue | 199 ++++++++++-------- 12 files changed, 222 insertions(+), 176 deletions(-) delete mode 100644 modules/web/src/pages/bookshelf/config.js diff --git a/modules/web/.eslintrc-auto-import.json b/modules/web/.eslintrc-auto-import.json index 051d6ac720db..cf5c92ea2ef1 100644 --- a/modules/web/.eslintrc-auto-import.json +++ b/modules/web/.eslintrc-auto-import.json @@ -5,6 +5,7 @@ "ComputedRef": true, "EffectScope": true, "ElMessage": true, + "ElMessageBox": true, "InjectionKey": true, "PropType": true, "Ref": true, @@ -78,8 +79,6 @@ "watch": true, "watchEffect": true, "watchPostEffect": true, - "watchSyncEffect": true, - "toValue": true, - "WritableComputedRef": true + "watchSyncEffect": true } -} +} \ No newline at end of file diff --git a/modules/web/src/api/axios.js b/modules/web/src/api/axios.js index 16018213b7dc..f3931c9adac4 100644 --- a/modules/web/src/api/axios.js +++ b/modules/web/src/api/axios.js @@ -1,25 +1,10 @@ import axios from "axios"; const SECOND = 1000; -const remoteIp = ref(localStorage.getItem("remoteIp")); const ajax = axios.create({ - // baseURL: import.meta.env.VITE_API || location.origin, + baseURL: import.meta.env.VITE_API || localStorage.getItem("remoteIp") || location.origin, timeout: 120 * SECOND, }); -ajax.interceptors.request.use((config) => { - config.baseURL = baseUrl(); - return config; -}); - export default ajax; - -export const setRemoteIp = (ip) => { - remoteIp.value = ip; - localStorage.setItem("remoteIp", ip); -}; - -export const baseUrl = () => { - return remoteIp.value || location.origin; -}; diff --git a/modules/web/src/api/index.js b/modules/web/src/api/index.js index 86ff820eebc2..7e045998de90 100644 --- a/modules/web/src/api/index.js +++ b/modules/web/src/api/index.js @@ -1,14 +1,48 @@ -import ajax, { baseUrl } from "./axios"; +import ajax from "./axios"; import { ElMessage } from "element-plus/es"; /** https://github.com/gedoor/legado/tree/master/app/src/main/java/io/legado/app/api */ /** https://github.com/gedoor/legado/tree/master/app/src/main/java/io/legado/app/web */ -const getUrl = () => { - const { hostname, port } = new URL(baseUrl()); - return `${hostname}:${Number(port) + 1}`; +let legado_http_origin +let legado_webSocket_origin + +const setLeagdoHttpUrl = (http_url) => { + let legado_webSocket_port; + const { protocol, hostname, port } = new URL(http_url); + if (!protocol.startsWith("http")) + throw new Error("unexpect protocol:" + http_url); + ajax.defaults.baseURL = http_url; + legado_http_origin = http_url; + if (port !== "") { + legado_webSocket_port = Number(port) + 1; + } else { + legado_webSocket_port = protocol.startsWith("https:") ? "444" : "81"; + } + legado_webSocket_origin = + `${protocol.startsWith("https:") ? "wss://" : "ws://"}${hostname}:${legado_webSocket_port}`; + + console.info("legado_server_config:"); + console.table({legado_http_origin, legado_webSocket_origin}); }; +// 手动初始化 阅读web服务地址 +setLeagdoHttpUrl(ajax.defaults.baseURL); + +const testLeagdoHttpUrlConnection = async (http_url) => { + const {data = {}} = await ajax.get("/getReadConfig", { + baseURL: http_url, + timeout: 3000 + }) + // 返回结果应该是JSON 并有键值isSuccess + try { + if ("isSuccess" in data) return + throw new Error("ReadConfig后端返回格式错误" ) + } catch { + throw new Error("ReadConfig后端返回格式错误" ) + } +} + const isSourecEditor = /source/i.test(location.href); const APIExceptionHandler = (error) => { if (isSourecEditor) { @@ -19,8 +53,10 @@ const APIExceptionHandler = (error) => { } throw error; }; + ajax.interceptors.response.use((response) => response, APIExceptionHandler); +// 书架API // Http const getReadConfig = () => ajax.get("/getReadConfig"); const saveReadConfig = (config) => ajax.post("/saveReadConfig", config); @@ -32,8 +68,8 @@ const saveBookProgressWithBeacon = (bookProgress) => { if (!bookProgress) return; // 常规请求可能会被取消 使用Fetch keep-alive 或者 navigator.sendBeacon navigator.sendBeacon( - `${baseUrl()}/saveBookProgress`, - JSON.stringify(bookProgress), + `${legado_http_origin}/saveBookProgress`, + JSON.stringify(bookProgress) ); }; @@ -44,22 +80,23 @@ const getChapterList = (/** @type {string} */ bookUrl) => const getBookContent = ( /** @type {string} */ bookUrl, - /** @type {number} */ chapterIndex, + /** @type {number} */ chapterIndex ) => ajax.get( "/getBookContent?url=" + encodeURIComponent(bookUrl) + "&index=" + - chapterIndex, + chapterIndex ); +// webSocket const search = ( /** @type {string} */ searchKey, /** @type {(data: string) => void} */ onReceive, - /** @type {() => void} */ onFinish, + /** @type {() => void} */ onFinish ) => { - // webSocket - const url = `ws://${getUrl()}/searchBook`; + + const url = `${legado_webSocket_origin}/searchBook`; const socket = new WebSocket(url); socket.onopen = () => { @@ -77,6 +114,7 @@ const deleteBook = (book) => ajax.post("/deleteBook", book); const isBookSource = /bookSource/i.test(location.href); +// 源编辑API // Http const getSources = () => isBookSource ? ajax.get("/getBookSources") : ajax.get("/getRssSources"); @@ -96,14 +134,15 @@ const deleteSource = (data) => ? ajax.post("/deleteBookSources", data) : ajax.post("/deleteRssSources", data); +// webSocket const debug = ( /** @type {string} */ sourceUrl, /** @type {string} */ searchKey, /** @type {(data: string) => void} */ onReceive, - /** @type {() => void} */ onFinish, + /** @type {() => void} */ onFinish ) => { - // webSocket - const url = `ws://${getUrl()}/${ + + const url = `${legado_webSocket_origin}/${ isBookSource ? "bookSource" : "rssSource" }Debug`; @@ -123,6 +162,32 @@ const debug = ( }; }; +/** + * 从阅读获取需要特定处理的书籍封面 + * @param {string} coverUrl + */ +const getProxyCoverUrl = (coverUrl) => { + if(coverUrl.startsWith(legado_http_origin)) return coverUrl + return legado_http_origin + "/cover?path=" + encodeURIComponent(coverUrl); +} +/** + * 从阅读获取需要特定处理的图片 + * @param {string} src + * @param {`{number}`} width + */ +const getProxyImageUrl = (src, width) => { + if (src.startsWith(legado_http_origin)) return src + return ( + legado_http_origin + + "/image?path=" + + encodeURIComponent(src) + + "&url=" + + encodeURIComponent(sessionStorage.getItem("bookUrl")) + + "&width=" + + width + ); +} + export default { getReadConfig, saveReadConfig, @@ -140,4 +205,11 @@ export default { saveSource, deleteSource, debug, + + getProxyCoverUrl, + getProxyImageUrl, + + testLeagdoHttpUrlConnection, + setLeagdoHttpUrl, + legado_http_origin, }; diff --git a/modules/web/src/auto-imports.d.ts b/modules/web/src/auto-imports.d.ts index 567fdd4b194e..a0f15d7d0199 100644 --- a/modules/web/src/auto-imports.d.ts +++ b/modules/web/src/auto-imports.d.ts @@ -1,12 +1,12 @@ /* eslint-disable */ /* prettier-ignore */ // @ts-nocheck -// noinspection JSUnusedGlobalSymbols // Generated by unplugin-auto-import export {} declare global { const EffectScope: typeof import('vue')['EffectScope'] const ElMessage: typeof import('element-plus/es')['ElMessage'] + const ElMessageBox: typeof import('element-plus/es')['ElMessageBox'] const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate'] const computed: typeof import('vue')['computed'] const createApp: typeof import('vue')['createApp'] @@ -62,7 +62,6 @@ declare global { const toRaw: typeof import('vue')['toRaw'] const toRef: typeof import('vue')['toRef'] const toRefs: typeof import('vue')['toRefs'] - const toValue: typeof import('vue')['toValue'] const triggerRef: typeof import('vue')['triggerRef'] const unref: typeof import('vue')['unref'] const useAttrs: typeof import('vue')['useAttrs'] @@ -82,6 +81,5 @@ declare global { // for type re-export declare global { // @ts-ignore - export type { Component, ComponentPublicInstance, ComputedRef, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, VNode, WritableComputedRef } from 'vue' - import('vue') + export type { Component, ComponentPublicInstance, ComputedRef, InjectionKey, PropType, Ref, VNode } from 'vue' } diff --git a/modules/web/src/components/BookItems.vue b/modules/web/src/components/BookItems.vue index c8543882c2f0..cb503dfa84a0 100644 --- a/modules/web/src/components/BookItems.vue +++ b/modules/web/src/components/BookItems.vue @@ -12,6 +12,7 @@ class="cover" :src="getCover(book.coverUrl)" :key="book.coverUrl" + @error.once="proxyImage" alt="" loading="lazy" /> @@ -49,17 +50,21 @@ + + + + + + From 8e66c7ed6691917e9f12da291df002a1e65c8970 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:47:59 +0800 Subject: [PATCH 429/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/help/source/BookSourceExtensions.kt | 4 +-- .../io/legado/app/utils/GsonExtensions.kt | 27 +++++++++++++------ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/source/BookSourceExtensions.kt b/app/src/main/java/io/legado/app/help/source/BookSourceExtensions.kt index 2830e3ddde1a..bae0972156e3 100644 --- a/app/src/main/java/io/legado/app/help/source/BookSourceExtensions.kt +++ b/app/src/main/java/io/legado/app/help/source/BookSourceExtensions.kt @@ -64,8 +64,8 @@ suspend fun BookSource.exploreKinds(): List { } } if (ruleStr.isJsonArray()) { - GSON.fromJsonArray(ruleStr).getOrThrow().let { - kinds.addAll(it.filterNotNull()) + GSON.fromJsonArray(ruleStr).getOrThrow().let { + kinds.addAll(it) } } else { ruleStr.split("(&&|\n)+".toRegex()).forEach { kindStr -> diff --git a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt index 4ea23f2a9f2f..a7b03ec85ba7 100644 --- a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt @@ -65,10 +65,13 @@ inline fun Gson.fromJsonArray(json: String?): Result> { if (json == null) { throw JsonSyntaxException("解析字符串为空") } - fromJson( - json, - TypeToken.getParameterized(List::class.java, T::class.java).type - ) as List + val type = TypeToken.getParameterized(List::class.java, T::class.java).type + val list = fromJson(json, type) as List + if (list.contains(null)) { + throw JsonSyntaxException("存在null") + } + @Suppress("UNCHECKED_CAST") + list as List } } @@ -88,10 +91,13 @@ inline fun Gson.fromJsonArray(inputStream: InputStream?): Result + val type = TypeToken.getParameterized(List::class.java, T::class.java).type + val list = fromJson(reader, type) as List + if (list.contains(null)) { + throw JsonSyntaxException("存在null") + } + @Suppress("UNCHECKED_CAST") + list as List } } @@ -150,6 +156,7 @@ class IntJsonDeserializer : JsonDeserializer { null } } + else -> null } } @@ -182,6 +189,7 @@ class MapDeserializerDoubleAsIntFix : } return list } + json.isJsonObject -> { val map: MutableMap = LinkedTreeMap() @@ -193,15 +201,18 @@ class MapDeserializerDoubleAsIntFix : } return map } + json.isJsonPrimitive -> { val prim = json.asJsonPrimitive when { prim.isBoolean -> { return prim.asBoolean } + prim.isString -> { return prim.asString } + prim.isNumber -> { val num: Number = prim.asNumber // here you can handle double int/long values From cde5628b0d09e085447d3991b9f07639fcd019a4 Mon Sep 17 00:00:00 2001 From: Sun-QAQ <75133710+Sun-QAQ@users.noreply.github.com> Date: Wed, 12 Feb 2025 12:51:32 +0800 Subject: [PATCH 430/837] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=A4=9C=E6=99=9A?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E4=B8=8B=E5=AF=B9=E8=AF=9D=E6=A1=86=E6=96=87?= =?UTF-8?q?=E5=AD=97+=E6=B7=BB=E5=8A=A0MIME=20=E7=B1=BB=E5=9E=8B=E5=8F=82?= =?UTF-8?q?=E6=95=B0=EF=BC=8C=E8=B0=83=E7=94=A8=E5=AF=B9=E5=BA=94=E5=BA=94?= =?UTF-8?q?=E7=94=A8=20(#4655)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * style(dialog): 优化确认对话框样式 - 修改工具栏 ID为 tool_bar - 为消息文本添加主文本颜色 - 设置工具栏标题文本颜色 * feat(app): 优化外部链接跳转逻辑并支持 MIME 类型- 重构 ConfirmationDialogActivity 中的跳转逻辑,支持处理 MIME 类型 - 在 JsExtensions 中的 openUrl 函数增加 mimeType 参数,允许传递 MIME 类型 --------- Co-authored-by: SunQAQ --- .../java/io/legado/app/help/JsExtensions.kt | 15 +++++++-- .../javascript/ConfirmationDialogActivity.kt | 33 ++++++++++++------- .../main/res/layout/confirmation_dialog.xml | 5 +-- app/src/main/res/values/styles.xml | 1 + 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 3211990664ab..3927e2b86424 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -963,11 +963,19 @@ interface JsExtensions : JsEncodeUtils { return AppConst.androidId } - fun openUrl(url: String) { + // 新增 mimeType 参数,默认为 null(保持兼容性) + fun openUrl(url: String, mimeType: String? = null) { try { val intent = Intent(appCtx, ConfirmationDialogActivity::class.java).apply { - data = Uri.parse(url) - putExtra("sourceTag", getSource()?.getTag() ?: "") // 添加来源标签参数 + // 同时设置 Data 和 Type(避免单独设置 data/type 导致冲突) + if (mimeType != null) { + setDataAndType(Uri.parse(url), mimeType) + } else { + data = Uri.parse(url) + } + putExtra("sourceTag", getSource()?.getTag() ?: "") + // 可选:添加 MIME 类型到 Extra 供后续逻辑使用 + putExtra("mimeType", mimeType) addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } appCtx.startActivity(intent) @@ -976,4 +984,5 @@ interface JsExtensions : JsEncodeUtils { appCtx.toastOnUi("启动跳转确认失败") } } + } diff --git a/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt b/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt index 0f0d1b508591..e212ba2f6d40 100644 --- a/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt +++ b/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt @@ -2,7 +2,6 @@ package io.legado.app.ui.javascript import android.content.ActivityNotFoundException import android.content.Intent -import android.net.Uri import android.os.Bundle import android.widget.TextView import androidx.appcompat.widget.Toolbar @@ -12,22 +11,21 @@ import io.legado.app.constant.AppLog import io.legado.app.ui.widget.text.AccentTextView import io.legado.app.utils.toastOnUi - class ConfirmationDialogActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - // 必须先设置布局再获取控件 setContentView(R.layout.confirmation_dialog) - // 正确顺序:先设置布局再获取视图 val messageView = findViewById(R.id.message) - val toolbar = findViewById(R.id.toolbar) + val toolbar = findViewById(R.id.tool_bar) val btnNegative = findViewById(R.id.btn_negative) val btnPositive = findViewById(R.id.btn_positive) - val url = intent?.dataString - if (url.isNullOrBlank()) { + // 获取原始 Intent 的数据和 MIME 类型 + val uri = intent?.data + val mimeType = intent?.getStringExtra("mimeType") + if (uri == null) { finish() return } @@ -36,16 +34,27 @@ class ConfirmationDialogActivity : AppCompatActivity() { val sourceTag = intent.getStringExtra("sourceTag").takeIf { !it.isNullOrBlank() } ?: "当前来源" messageView.text = "$sourceTag 正在请求跳转外部链接/应用,是否跳转?" - // 设置其他组件 toolbar.setNavigationOnClickListener { finish() } btnNegative.setOnClickListener { finish() } btnPositive.setOnClickListener { try { - startActivity( - Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply { - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + // 创建目标 Intent 并设置类型 + val targetIntent = Intent(Intent.ACTION_VIEW).apply { + // 同时设置 Data 和 Type + if (!mimeType.isNullOrBlank()) { + setDataAndType(uri, mimeType) + } else { + data = uri } - ) + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + + // 验证是否有应用可以处理 + if (targetIntent.resolveActivity(packageManager) != null) { + startActivity(targetIntent) + } else { + toastOnUi(R.string.can_not_open) + } } catch (e: ActivityNotFoundException) { toastOnUi(R.string.can_not_open) } catch (e: Exception) { diff --git a/app/src/main/res/layout/confirmation_dialog.xml b/app/src/main/res/layout/confirmation_dialog.xml index f1829047a9e3..26c768c6dd39 100644 --- a/app/src/main/res/layout/confirmation_dialog.xml +++ b/app/src/main/res/layout/confirmation_dialog.xml @@ -14,7 +14,7 @@ android:orientation="vertical"> + android:textAppearance="?attr/textAppearanceBodyMedium" + android:textColor="@color/primaryText" /> 20sp + @color/primaryText //*******************Widget Style**********************************// From dbf82124b3818005196e2747914b5d3d4753a556 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Wed, 12 Feb 2025 13:06:11 +0800 Subject: [PATCH 431/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/JsExtensions.kt | 9 +++++---- app/src/main/res/values/styles.xml | 1 - 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index 3927e2b86424..b002aacb012e 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -1,9 +1,8 @@ package io.legado.app.help +import android.content.Intent import android.net.Uri import android.webkit.WebSettings -import android.app.AlertDialog -import android.content.Intent import androidx.annotation.Keep import cn.hutool.core.codec.Base64 import cn.hutool.core.util.HexUtil @@ -48,11 +47,9 @@ import io.legado.app.utils.readText import io.legado.app.utils.stackTraceStr import io.legado.app.utils.toStringArray import io.legado.app.utils.toastOnUi -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.async import kotlinx.coroutines.runBlocking -import kotlinx.coroutines.withContext import okio.use import org.jsoup.Connection import org.jsoup.Jsoup @@ -963,6 +960,10 @@ interface JsExtensions : JsEncodeUtils { return AppConst.androidId } + fun openUrl(url: String) { + openUrl(url, null) + } + // 新增 mimeType 参数,默认为 null(保持兼容性) fun openUrl(url: String, mimeType: String? = null) { try { diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 15f1904d466c..885aa835200b 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -80,7 +80,6 @@ //*******************Widget Style**********************************// From 65d4d7fb62a0ccbc773940ab641a39cb3fb355c8 Mon Sep 17 00:00:00 2001 From: Xwite <82232510+Xwite@users.noreply.github.com> Date: Wed, 12 Feb 2025 13:43:24 +0800 Subject: [PATCH 432/837] fix(source.loginUI): filter null when arrays end with comma see https://github.com/gedoor/legado/discussions/4650 --- app/src/main/java/io/legado/app/data/entities/BaseSource.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt b/app/src/main/java/io/legado/app/data/entities/BaseSource.kt index 79c8cdae8ced..275835fae88a 100644 --- a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BaseSource.kt @@ -67,7 +67,7 @@ interface BaseSource : JsExtensions { fun loginUi(): List? { return GSON.fromJsonArray(loginUi).onFailure { it.printOnDebug() - }.getOrNull() + }.getOrNull()?.filterNotNull() // filter null, see https://github.com/gedoor/legado/discussions/4650 } fun getLoginJs(): String? { @@ -253,4 +253,4 @@ interface BaseSource : JsExtensions { fun getShareScope(): Scriptable? { return SharedJsScope.getScope(jsLib) } -} \ No newline at end of file +} From b5816440200267b6069e8d319ed3363a6df4c31f Mon Sep 17 00:00:00 2001 From: niuhb <76513019+niu-hb@users.noreply.github.com> Date: Wed, 12 Feb 2025 14:55:23 +0800 Subject: [PATCH 433/837] =?UTF-8?q?rss=E6=94=B6=E8=97=8F=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=95=BF=E6=8C=89=E5=88=A0=E9=99=A4=20(#4657)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/rss/favorites/RssFavoritesAdapter.kt | 8 ++++++++ .../app/ui/rss/favorites/RssFavoritesFragment.kt | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt index c1886d64bc3f..f6b5e525bd94 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesAdapter.kt @@ -75,9 +75,17 @@ class RssFavoritesAdapter(context: Context, val callBack: CallBack) : callBack.readRss(it) } } + holder.itemView.setOnLongClickListener { + getItem(holder.layoutPosition)?.let { + callBack.delStar(it) + } + true + } } interface CallBack { fun readRss(rssStar: RssStar) + + fun delStar(rssStar: RssStar) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt index 3b9792dc3ac3..f18b29847595 100644 --- a/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt +++ b/app/src/main/java/io/legado/app/ui/rss/favorites/RssFavoritesFragment.kt @@ -12,6 +12,7 @@ import io.legado.app.constant.AppLog import io.legado.app.data.appDb import io.legado.app.data.entities.RssStar import io.legado.app.databinding.FragmentRssArticlesBinding +import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.rss.read.ReadRssActivity import io.legado.app.ui.widget.recycler.VerticalDivider @@ -73,4 +74,14 @@ class RssFavoritesFragment() : VMBaseFragment(R.layout.fr putExtra("link", rssStar.link) } } + + override fun delStar(rssStar: RssStar) { + alert(R.string.draw) { + setMessage(getString(R.string.sure_del) + "\n<" + rssStar.title + ">") + noButton() + yesButton { + appDb.rssStarDao.delete(rssStar.origin, rssStar.link) + } + } + } } From c4a3d12e825b54469c1987e3af05e020b657d7e6 Mon Sep 17 00:00:00 2001 From: Sun-QAQ <75133710+Sun-QAQ@users.noreply.github.com> Date: Wed, 12 Feb 2025 17:13:14 +0800 Subject: [PATCH 434/837] =?UTF-8?q?style(dialog):=20=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E5=AF=B9=E8=AF=9D=E6=A1=86=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=20(#4659)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * style(dialog): 修改确认对话框标题样式 - 将确认对话框的标题文本外观从 "@style/ToolbarTitle" 更改为 "@style/ToolbarTitleX" - 新增 "ToolbarTitleX" 样式,继承自 "TextAppearance.Widget.AppCompat.Toolbar.Title" * 添加openUrl方法说明 --------- Co-authored-by: SunQAQ --- app/src/main/assets/web/help/md/jsHelp.md | 7 +++++++ app/src/main/res/layout/confirmation_dialog.xml | 2 +- app/src/main/res/values/styles.xml | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/web/help/md/jsHelp.md b/app/src/main/assets/web/help/md/jsHelp.md index 830679b16fd2..b5f6b9b2a09f 100644 --- a/app/src/main/assets/web/help/md/jsHelp.md +++ b/app/src/main/assets/web/help/md/jsHelp.md @@ -443,3 +443,10 @@ cache.getFromMemory(key: String): Any? cache.putMemory(key: String, value: Any) ``` + +## 跳转外部链接/应用函数 +```js +// 跳转外部链接,传入http链接或者scheme跳转到浏览器或其他应用 +java.openUrl(url:String) +// 指定mimeType,可以跳转指定类型应用,例如(video/*) +java.openUrl(url:String,mimeType:String) \ No newline at end of file diff --git a/app/src/main/res/layout/confirmation_dialog.xml b/app/src/main/res/layout/confirmation_dialog.xml index 26c768c6dd39..b8b0b36d1481 100644 --- a/app/src/main/res/layout/confirmation_dialog.xml +++ b/app/src/main/res/layout/confirmation_dialog.xml @@ -20,7 +20,7 @@ android:theme="?attr/actionBarStyle" app:popupTheme="@style/AppTheme.PopupOverlay" app:title="跳转确认" - app:titleTextAppearance="@style/ToolbarTitle" /> + app:titleTextAppearance="@style/ToolbarTitleX" /> true + + From c1e555c65472a5c15acb53f2fcc7001fb9176466 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:13:02 +0800 Subject: [PATCH 435/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/utils/ChineseUtils.kt | 38 ++++++----------- .../io/legado/app/utils/TrieExtensions.kt | 41 ------------------- gradle/libs.versions.toml | 2 +- 3 files changed, 13 insertions(+), 68 deletions(-) delete mode 100644 app/src/main/java/io/legado/app/utils/TrieExtensions.kt diff --git a/app/src/main/java/io/legado/app/utils/ChineseUtils.kt b/app/src/main/java/io/legado/app/utils/ChineseUtils.kt index 97fc10ae8729..0934af5cf5a8 100644 --- a/app/src/main/java/io/legado/app/utils/ChineseUtils.kt +++ b/app/src/main/java/io/legado/app/utils/ChineseUtils.kt @@ -2,8 +2,6 @@ package io.legado.app.utils import com.github.liuyueyi.quick.transfer.ChineseUtils import com.github.liuyueyi.quick.transfer.constants.TransType -import com.github.liuyueyi.quick.transfer.dictionary.BasicDictionary -import com.github.liuyueyi.quick.transfer.dictionary.DictionaryContainer object ChineseUtils { @@ -15,7 +13,6 @@ object ChineseUtils { fun t2s(content: String): String { if (!fixed) { - fixed = true fixT2sDict() } return ChineseUtils.t2s(content) @@ -30,29 +27,18 @@ object ChineseUtils { } fun fixT2sDict() { - val dict = DictionaryContainer.getInstance().getDictionary(TransType.TRADITIONAL_TO_SIMPLE) - dict.run { - remove( - "劈", "脊", "槃", - "支援", "沈默", "類比", "模擬", "划槳", "列根", "先進", "雪梨", "雪糕", - "零錢", "零钱", "離線", "碟片", "模組", "桌球", "案頭", "機車", "電漿", - "鳳梨", "魔戒", "載入", "菲林", "整合", - "路易斯", "非同步", "出租车", "周杰倫", "马铃薯", "馬鈴薯", "機械人", "電單車", - "電扶梯", "音效卡", "飆車族", "點陣圖", "個入球", "顆進球", - "魔獸紀元", "高空彈跳", "铁达尼号", - "魔鬼終結者", "純文字檔案" - ) - } - } - - fun BasicDictionary.remove(vararg keys: String) { - for (key in keys) { - if (key.length == 1) { - chars.remove(key[0]) - } else { - dict.remove(key) - } - } + fixed = true + val excludeList = listOf( + "槃", + "划槳", "列根", "雪梨", "雪糕", + "零錢", "零钱", "離線", "碟片", "模組", "桌球", "案頭", "機車", "電漿", + "鳳梨", "魔戒", "載入", "菲林", "整合", "變數", + "路易斯", "非同步", "出租车", "周杰倫", "马铃薯", "馬鈴薯", "機械人", "電單車", + "電扶梯", "音效卡", "飆車族", "點陣圖", "個入球", "顆進球", + "魔獸紀元", "高空彈跳", "铁达尼号", + "魔鬼終結者", "純文字檔案" + ) + ChineseUtils.loadExcludeDict(TransType.TRADITIONAL_TO_SIMPLE, excludeList) } } diff --git a/app/src/main/java/io/legado/app/utils/TrieExtensions.kt b/app/src/main/java/io/legado/app/utils/TrieExtensions.kt deleted file mode 100644 index c0e78ef6e486..000000000000 --- a/app/src/main/java/io/legado/app/utils/TrieExtensions.kt +++ /dev/null @@ -1,41 +0,0 @@ -package io.legado.app.utils - -import com.github.liuyueyi.quick.transfer.Trie -import com.github.liuyueyi.quick.transfer.TrieNode -import java.util.HashMap - -fun Trie.getRoot(): TrieNode { - val rootField = javaClass.getDeclaredField("root") - .apply { isAccessible = true } - @Suppress("UNCHECKED_CAST") - return rootField.get(this) as TrieNode -} - -fun TrieNode.getChildren(): HashMap> { - val childrenField = javaClass.getDeclaredField("children") - .apply { isAccessible = true } - @Suppress("UNCHECKED_CAST") - return childrenField.get(this) as HashMap> -} - -fun Trie.remove(value: String) { - kotlin.runCatching { - var node = getRoot() - val nodes = arrayListOf>() - val chars = value.toCharArray() - for (c in chars) { - nodes.add(node) - node = node.getChildren()[c] ?: break - if (!node.isLeaf) { - continue - } - for ((ch, n) in chars.reversed().zip(nodes.reversed())) { - val children = n.getChildren() - children.remove(ch) - if (children.isNotEmpty()) { - break - } - } - } - } -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7e22e8e23436..961c8e95bf79 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -34,7 +34,7 @@ nanoHttpd = "2.3.1" okhttp = "4.12.0" preference = "1.2.1" protobufJavalite = "4.26.1" -quickChineseTransfer = "0.2.15" +quickChineseTransfer = "0.2.16" room = "2.6.1" splitties = "3.0.0" rhino = "1.8.0" From b925d1b26f95e7aa2440f7ec2394bbde3bd31a6d Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Wed, 12 Feb 2025 19:17:27 +0800 Subject: [PATCH 436/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/App.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/App.kt b/app/src/main/java/io/legado/app/App.kt index aa310af8f48d..b139d5e41101 100644 --- a/app/src/main/java/io/legado/app/App.kt +++ b/app/src/main/java/io/legado/app/App.kt @@ -89,8 +89,9 @@ class App : Application() { Backup.clearCache() //初始化简繁转换引擎 when (AppConfig.chineseConverterType) { - 1 -> launch { + 1 -> { ChineseUtils.fixT2sDict() + ChineseUtils.preLoad(true, TransType.TRADITIONAL_TO_SIMPLE) } 2 -> ChineseUtils.preLoad(true, TransType.SIMPLE_TO_TRADITIONAL) From 8685957fdbbe8131d8e5bcfaedc9c258d416de6f Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Thu, 13 Feb 2025 18:26:03 +0800 Subject: [PATCH 437/837] Fix #4665 --- .../legado/app/ui/book/read/page/delegate/PageDelegate.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt index ef763108a1b0..7ff252eb3e5c 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt @@ -83,9 +83,11 @@ abstract class PageDelegate(protected val readView: ReadView) { protected fun stopScroll() { isStarted = false - isMoved = false - isRunning = false - readView.postInvalidate() + readView.post { + isMoved = false + isRunning = false + readView.invalidate() + } } @CallSuper From 9576a50cc10d5a0257a21ff6d46c9d28c7c2898f Mon Sep 17 00:00:00 2001 From: Sun-QAQ <75133710+Sun-QAQ@users.noreply.github.com> Date: Thu, 13 Feb 2025 18:41:30 +0800 Subject: [PATCH 438/837] =?UTF-8?q?feat(read):=20=E4=BC=98=E5=8C=96single?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E6=8E=92=E7=89=88=20(#4663)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -调整标题和内容的排版方式 Co-authored-by: SunQAQ --- .../read/page/provider/TextChapterLayout.kt | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt index f12e2b5ae617..2d894d88cf7d 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt @@ -186,6 +186,9 @@ class TextChapterLayout( val contents = bookContent.textList var absStartX = paddingLeft var durY = 0f + val imageStyle = book.getImageStyle() + val isSingleImageStyle = imageStyle.equals(Book.imgStyleSingle, true) + if (ReadBookConfig.titleMode != 2 || bookChapter.isVolume || contents.isEmpty()) { //标题非隐藏 displayTitle.splitNotBlank("\n").forEach { text -> @@ -195,7 +198,7 @@ class TextChapterLayout( titlePaint, titlePaintTextHeight, titlePaintFontMetrics, - book.getImageStyle(), + imageStyle, isTitle = true, emptyContent = contents.isEmpty(), isVolumeTitle = bookChapter.isVolume @@ -207,6 +210,17 @@ class TextChapterLayout( pendingTextPage.lines.last().isParagraphEnd = true stringBuilder.append("\n") durY += titleBottomSpacing + + // 如果是单图模式且当前页有内容,强制分页 + if (isSingleImageStyle && pendingTextPage.lines.isNotEmpty()) { + pendingTextPage.height = durY + textPages.add(pendingTextPage) + onPageCompleted() + pendingTextPage = TextPage() + stringBuilder.clear() + absStartX = paddingLeft + durY = 0f + } } val sb = StringBuffer() contents.forEach { content -> @@ -273,6 +287,15 @@ class TextChapterLayout( absStartX = it.first durY = it.second } + if (isSingleImageStyle) { + pendingTextPage.height = durY + textPages.add(pendingTextPage) + onPageCompleted() + pendingTextPage = TextPage() + stringBuilder.clear() + absStartX = paddingLeft + durY = 0f + } start = matcher.end() } if (start < content.length) { @@ -293,7 +316,9 @@ class TextChapterLayout( } } } - pendingTextPage.lines.last().isParagraphEnd = true + if (pendingTextPage.lines.isNotEmpty()) { + pendingTextPage.lines.last().isParagraphEnd = true + } stringBuilder.append("\n") } textPages.add(pendingTextPage) From 0bbc6c774d168fcc2e6a5a6ed4142790f5d1fc28 Mon Sep 17 00:00:00 2001 From: Sun-QAQ <75133710+Sun-QAQ@users.noreply.github.com> Date: Thu, 13 Feb 2025 21:21:54 +0800 Subject: [PATCH 439/837] =?UTF-8?q?=E6=9C=89bug=EF=BC=8C=E5=85=88=E5=9B=9E?= =?UTF-8?q?=E9=80=80=20(#4669)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/page/provider/TextChapterLayout.kt | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt index 2d894d88cf7d..0ab1cee6b4d1 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/provider/TextChapterLayout.kt @@ -287,15 +287,6 @@ class TextChapterLayout( absStartX = it.first durY = it.second } - if (isSingleImageStyle) { - pendingTextPage.height = durY - textPages.add(pendingTextPage) - onPageCompleted() - pendingTextPage = TextPage() - stringBuilder.clear() - absStartX = paddingLeft - durY = 0f - } start = matcher.end() } if (start < content.length) { From b85a008d3a0455bbc76728fa9046bfa689bb9ffe Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Fri, 14 Feb 2025 12:22:28 +0800 Subject: [PATCH 440/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/data/entities/BaseSource.kt | 2 +- .../legado/app/ui/book/read/page/delegate/PageDelegate.kt | 4 ++-- app/src/main/java/io/legado/app/utils/GsonExtensions.kt | 8 ++++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt b/app/src/main/java/io/legado/app/data/entities/BaseSource.kt index 275835fae88a..22f8c86d5666 100644 --- a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BaseSource.kt @@ -116,7 +116,7 @@ interface BaseSource : JsExtensions { putAll(map) } } catch (e: Exception) { - AppLog.put("getHeaderMap 出错\n$e", e) + AppLog.put("执行请求头规则出错\n$e", e) } } if (!has(AppConst.UA_NAME, true)) { diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt index 7ff252eb3e5c..374622a1bed4 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt @@ -191,9 +191,9 @@ abstract class PageDelegate(protected val readView: ReadView) { } fun postInvalidate() { - if (isRunning && this is HorizontalPageDelegate) { + if (isStarted && isRunning && this is HorizontalPageDelegate) { readView.post { - if (isRunning) { + if (isStarted && isRunning) { setBitmap() readView.invalidate() } diff --git a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt index a7b03ec85ba7..4d818eb0a9a5 100644 --- a/app/src/main/java/io/legado/app/utils/GsonExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/GsonExtensions.kt @@ -68,7 +68,9 @@ inline fun Gson.fromJsonArray(json: String?): Result> { val type = TypeToken.getParameterized(List::class.java, T::class.java).type val list = fromJson(json, type) as List if (list.contains(null)) { - throw JsonSyntaxException("存在null") + throw JsonSyntaxException( + "列表不能存在null元素,可能是json格式错误,通常为列表存在多余的逗号所致" + ) } @Suppress("UNCHECKED_CAST") list as List @@ -94,7 +96,9 @@ inline fun Gson.fromJsonArray(inputStream: InputStream?): Result if (list.contains(null)) { - throw JsonSyntaxException("存在null") + throw JsonSyntaxException( + "列表不能存在null元素,可能是json格式错误,通常为列表存在多余的逗号所致" + ) } @Suppress("UNCHECKED_CAST") list as List From e4d6e045db92ee3818f5977e2daa614130e406ec Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Fri, 10 Jan 2025 20:07:48 +0800 Subject: [PATCH 441/837] [skip ci] Delete folder .vscode --- .vscode/settings.json | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index cf3a569492af..000000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "editor.formatOnType": true -} \ No newline at end of file From 6b56f3768d87a58bb1c3ec667c971fb15ce475cb Mon Sep 17 00:00:00 2001 From: Xwite <1797350009@qq.com> Date: Sat, 15 Feb 2025 15:40:28 +0800 Subject: [PATCH 442/837] Revert "fix(source.loginUI): filter null when arrays end with comma" Gson will throw error when json has extra comma in array or object. see 8e66c7ed6691917e9f12da291df002a1e65c8970 This reverts commit 65d4d7fb62a0ccbc773940ab641a39cb3fb355c8. --- app/src/main/java/io/legado/app/data/entities/BaseSource.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt b/app/src/main/java/io/legado/app/data/entities/BaseSource.kt index 22f8c86d5666..18825085cb0b 100644 --- a/app/src/main/java/io/legado/app/data/entities/BaseSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/BaseSource.kt @@ -67,7 +67,7 @@ interface BaseSource : JsExtensions { fun loginUi(): List? { return GSON.fromJsonArray(loginUi).onFailure { it.printOnDebug() - }.getOrNull()?.filterNotNull() // filter null, see https://github.com/gedoor/legado/discussions/4650 + }.getOrNull() } fun getLoginJs(): String? { @@ -253,4 +253,4 @@ interface BaseSource : JsExtensions { fun getShareScope(): Scriptable? { return SharedJsScope.getScope(jsLib) } -} +} \ No newline at end of file From 8c7ef5620bcac9dedaf4006699e6a51652414647 Mon Sep 17 00:00:00 2001 From: Horis <8674809+821938089@users.noreply.github.com> Date: Sat, 15 Feb 2025 16:53:31 +0800 Subject: [PATCH 443/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/book/search/SearchActivity.kt | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt index 029496342cb4..1b64f60ec88f 100644 --- a/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/search/SearchActivity.kt @@ -54,6 +54,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import splitties.init.appCtx +import kotlin.math.abs class SearchActivity : VMBaseActivity(), BookAdapter.CallBack, @@ -240,7 +241,20 @@ class SearchActivity : VMBaseActivity Date: Sat, 15 Feb 2025 18:08:08 +0800 Subject: [PATCH 444/837] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 13 +- .../java/io/legado/app/help/JsExtensions.kt | 27 ++-- .../ui/association/OpenUrlConfirmActivity.kt | 23 ++++ .../ui/association/OpenUrlConfirmDialog.kt | 130 ++++++++++++++++++ .../ui/association/OpenUrlConfirmViewModel.kt | 38 +++++ .../javascript/ConfirmationDialogActivity.kt | 72 ---------- .../main/res/layout/confirmation_dialog.xml | 57 -------- .../res/layout/dialog_open_url_confirm.xml | 47 +++++++ app/src/main/res/menu/open_url_confirm.xml | 17 +++ app/src/main/res/values/strings.xml | 2 - app/src/main/res/values/styles.xml | 17 --- 11 files changed, 268 insertions(+), 175 deletions(-) create mode 100644 app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmActivity.kt create mode 100644 app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmDialog.kt create mode 100644 app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmViewModel.kt delete mode 100644 app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt delete mode 100644 app/src/main/res/layout/confirmation_dialog.xml create mode 100644 app/src/main/res/layout/dialog_open_url_confirm.xml create mode 100644 app/src/main/res/menu/open_url_confirm.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 0b2ad12fd0ae..07a76c223776 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -340,7 +340,11 @@ + + - - diff --git a/app/src/main/java/io/legado/app/help/JsExtensions.kt b/app/src/main/java/io/legado/app/help/JsExtensions.kt index b002aacb012e..8d0f7ffb1028 100644 --- a/app/src/main/java/io/legado/app/help/JsExtensions.kt +++ b/app/src/main/java/io/legado/app/help/JsExtensions.kt @@ -1,6 +1,5 @@ package io.legado.app.help -import android.content.Intent import android.net.Uri import android.webkit.WebSettings import androidx.annotation.Keep @@ -22,7 +21,7 @@ import io.legado.app.help.source.SourceVerificationHelp import io.legado.app.model.Debug import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.model.analyzeRule.QueryTTF -import io.legado.app.ui.javascript.ConfirmationDialogActivity +import io.legado.app.ui.association.OpenUrlConfirmActivity import io.legado.app.utils.ArchiveUtils import io.legado.app.utils.ChineseUtils import io.legado.app.utils.EncoderUtils @@ -45,6 +44,7 @@ import io.legado.app.utils.longToastOnUi import io.legado.app.utils.readBytes import io.legado.app.utils.readText import io.legado.app.utils.stackTraceStr +import io.legado.app.utils.startActivity import io.legado.app.utils.toStringArray import io.legado.app.utils.toastOnUi import kotlinx.coroutines.Dispatchers.IO @@ -966,23 +966,12 @@ interface JsExtensions : JsEncodeUtils { // 新增 mimeType 参数,默认为 null(保持兼容性) fun openUrl(url: String, mimeType: String? = null) { - try { - val intent = Intent(appCtx, ConfirmationDialogActivity::class.java).apply { - // 同时设置 Data 和 Type(避免单独设置 data/type 导致冲突) - if (mimeType != null) { - setDataAndType(Uri.parse(url), mimeType) - } else { - data = Uri.parse(url) - } - putExtra("sourceTag", getSource()?.getTag() ?: "") - // 可选:添加 MIME 类型到 Extra 供后续逻辑使用 - putExtra("mimeType", mimeType) - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - } - appCtx.startActivity(intent) - } catch (e: Exception) { - AppLog.put("启动跳转对话框失败", e) - appCtx.toastOnUi("启动跳转确认失败") + val source = getSource() ?: throw NoStackTraceException("openUrl source cannot be null") + appCtx.startActivity { + putExtra("uri", url) + putExtra("mimeType", mimeType) + putExtra("sourceOrigin", source.getKey()) + putExtra("sourceName", source.getTag()) } } diff --git a/app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmActivity.kt b/app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmActivity.kt new file mode 100644 index 000000000000..ceb0978b18d5 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmActivity.kt @@ -0,0 +1,23 @@ +package io.legado.app.ui.association + +import android.os.Bundle +import io.legado.app.base.BaseActivity +import io.legado.app.databinding.ActivityTranslucenceBinding +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.viewbindingdelegate.viewBinding + +class OpenUrlConfirmActivity : + BaseActivity() { + + override val binding by viewBinding(ActivityTranslucenceBinding::inflate) + + override fun onActivityCreated(savedInstanceState: Bundle?) { + intent.getStringExtra("uri")?.let { + val mimeType = intent.getStringExtra("mimeType") + val sourceOrigin = intent.getStringExtra("sourceOrigin") + val sourceName = intent.getStringExtra("sourceName") + showDialogFragment(OpenUrlConfirmDialog(it, mimeType, sourceOrigin, sourceName)) + } ?: finish() + } + +} diff --git a/app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmDialog.kt b/app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmDialog.kt new file mode 100644 index 000000000000..dbf3d443b302 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmDialog.kt @@ -0,0 +1,130 @@ +package io.legado.app.ui.association + +import android.content.Intent +import android.os.Bundle +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.Toolbar +import androidx.core.net.toUri +import androidx.fragment.app.viewModels +import io.legado.app.R +import io.legado.app.base.BaseDialogFragment +import io.legado.app.constant.AppLog +import io.legado.app.databinding.DialogOpenUrlConfirmBinding +import io.legado.app.lib.dialogs.alert +import io.legado.app.lib.theme.primaryColor +import io.legado.app.utils.applyTint +import io.legado.app.utils.setLayout +import io.legado.app.utils.toastOnUi +import io.legado.app.utils.viewbindingdelegate.viewBinding +import splitties.init.appCtx + +class OpenUrlConfirmDialog() : BaseDialogFragment(R.layout.dialog_open_url_confirm), + Toolbar.OnMenuItemClickListener { + + constructor( + uri: String, + mimeType: String?, + sourceOrigin: String? = null, + sourceName: String? = null + ) : this() { + arguments = Bundle().apply { + putString("uri", uri) + putString("mimeType", mimeType) + putString("sourceOrigin", sourceOrigin) + putString("sourceName", sourceName) + } + } + + val binding by viewBinding(DialogOpenUrlConfirmBinding::bind) + val viewModel by viewModels() + + override fun onStart() { + super.onStart() + setLayout(1f, ViewGroup.LayoutParams.WRAP_CONTENT) + } + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + initMenu() + val arguments = arguments ?: return + viewModel.initData(arguments) + if (viewModel.uri.isBlank()) { + dismiss() + return + } + binding.toolBar.setBackgroundColor(primaryColor) + binding.toolBar.subtitle = viewModel.sourceName + initView() + } + + private fun initMenu() { + binding.toolBar.setOnMenuItemClickListener(this) + binding.toolBar.inflateMenu(R.menu.open_url_confirm) + binding.toolBar.menu.applyTint(requireContext()) + } + + private fun initView() { + binding.message.text = "${viewModel.sourceName} 正在请求跳转链接/应用,是否跳转?" + binding.btnNegative.setOnClickListener { dismiss() } + binding.btnPositive.setOnClickListener { + openUrl() + dismiss() + } + } + + private fun openUrl() { + try { + val uri = viewModel.uri.toUri() + val mimeType = viewModel.mimeType + // 创建目标 Intent 并设置类型 + val targetIntent = Intent(Intent.ACTION_VIEW).apply { + // 同时设置 Data 和 Type + if (!mimeType.isNullOrBlank()) { + setDataAndType(uri, mimeType) + } else { + data = uri + } + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + + // 验证是否有应用可以处理 + if (targetIntent.resolveActivity(appCtx.packageManager) != null) { + startActivity(targetIntent) + } else { + toastOnUi(R.string.can_not_open) + } + } catch (e: Exception) { + AppLog.put("打开链接失败", e, true) + } + } + + override fun onMenuItemClick(item: MenuItem): Boolean { + when (item.itemId) { + R.id.menu_disable_source -> { + viewModel.disableSource { + dismiss() + } + } + + R.id.menu_delete_source -> { + alert(R.string.draw) { + setMessage(getString(R.string.sure_del) + "\n" + viewModel.sourceName) + noButton() + yesButton { + viewModel.deleteSource { + dismiss() + } + } + } + } + } + return false + } + + override fun onDestroy() { + super.onDestroy() + activity?.finish() + } + +} diff --git a/app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmViewModel.kt b/app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmViewModel.kt new file mode 100644 index 000000000000..e677fb6834b9 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/association/OpenUrlConfirmViewModel.kt @@ -0,0 +1,38 @@ +package io.legado.app.ui.association + +import android.app.Application +import android.os.Bundle +import io.legado.app.base.BaseViewModel +import io.legado.app.data.appDb + +class OpenUrlConfirmViewModel(app: Application): BaseViewModel(app) { + + var uri = "" + var mimeType: String? = null + var sourceOrigin = "" + var sourceName = "" + + fun initData(arguments: Bundle) { + uri = arguments.getString("uri") ?: "" + mimeType = arguments.getString("mimeType") + sourceName = arguments.getString("sourceName") ?: "" + sourceOrigin = arguments.getString("sourceOrigin") ?: "" + } + + fun disableSource(block: () -> Unit) { + execute { + appDb.bookSourceDao.enable(sourceOrigin, false) + }.onSuccess { + block.invoke() + } + } + + fun deleteSource(block: () -> Unit) { + execute { + appDb.bookSourceDao.delete(sourceOrigin) + }.onSuccess { + block.invoke() + } + } + +} diff --git a/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt b/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt deleted file mode 100644 index e212ba2f6d40..000000000000 --- a/app/src/main/java/io/legado/app/ui/javascript/ConfirmationDialogActivity.kt +++ /dev/null @@ -1,72 +0,0 @@ -package io.legado.app.ui.javascript - -import android.content.ActivityNotFoundException -import android.content.Intent -import android.os.Bundle -import android.widget.TextView -import androidx.appcompat.widget.Toolbar -import androidx.appcompat.app.AppCompatActivity -import io.legado.app.R -import io.legado.app.constant.AppLog -import io.legado.app.ui.widget.text.AccentTextView -import io.legado.app.utils.toastOnUi - -class ConfirmationDialogActivity : AppCompatActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.confirmation_dialog) - - val messageView = findViewById(R.id.message) - val toolbar = findViewById(R.id.tool_bar) - val btnNegative = findViewById(R.id.btn_negative) - val btnPositive = findViewById(R.id.btn_positive) - - // 获取原始 Intent 的数据和 MIME 类型 - val uri = intent?.data - val mimeType = intent?.getStringExtra("mimeType") - if (uri == null) { - finish() - return - } - - // 处理来源标签显示 - val sourceTag = intent.getStringExtra("sourceTag").takeIf { !it.isNullOrBlank() } ?: "当前来源" - messageView.text = "$sourceTag 正在请求跳转外部链接/应用,是否跳转?" - - toolbar.setNavigationOnClickListener { finish() } - btnNegative.setOnClickListener { finish() } - btnPositive.setOnClickListener { - try { - // 创建目标 Intent 并设置类型 - val targetIntent = Intent(Intent.ACTION_VIEW).apply { - // 同时设置 Data 和 Type - if (!mimeType.isNullOrBlank()) { - setDataAndType(uri, mimeType) - } else { - data = uri - } - addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - } - - // 验证是否有应用可以处理 - if (targetIntent.resolveActivity(packageManager) != null) { - startActivity(targetIntent) - } else { - toastOnUi(R.string.can_not_open) - } - } catch (e: ActivityNotFoundException) { - toastOnUi(R.string.can_not_open) - } catch (e: Exception) { - AppLog.put("打开链接失败", e) - toastOnUi(R.string.error_occurred) - } - finish() - } - } - - override fun onBackPressed() { - super.onBackPressed() - finish() - } -} diff --git a/app/src/main/res/layout/confirmation_dialog.xml b/app/src/main/res/layout/confirmation_dialog.xml deleted file mode 100644 index b8b0b36d1481..000000000000 --- a/app/src/main/res/layout/confirmation_dialog.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/dialog_open_url_confirm.xml b/app/src/main/res/layout/dialog_open_url_confirm.xml new file mode 100644 index 000000000000..f6e5d147b09a --- /dev/null +++ b/app/src/main/res/layout/dialog_open_url_confirm.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + diff --git a/app/src/main/res/menu/open_url_confirm.xml b/app/src/main/res/menu/open_url_confirm.xml new file mode 100644 index 000000000000..e85dbaf20032 --- /dev/null +++ b/app/src/main/res/menu/open_url_confirm.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 00bf22601d36..a67ff259a75b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1185,6 +1185,4 @@ 主题配置 Download the chapter after Download all chapter - 打开失败 - %s正在请求跳转外部链接/应用,是否跳转? diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 7f736e1b63f2..4bc8faa05a0f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -127,21 +127,4 @@ wrap_content - - - - - - - - From bcdbbcc5625f4915c0f655d463b4862c3468ca39 Mon Sep 17 00:00:00 2001 From: lhjgege <1079947827@qq.com> Date: Sat, 15 Feb 2025 20:44:57 +0800 Subject: [PATCH 445/837] =?UTF-8?q?=E9=87=8D=E5=81=9A=E6=BC=AB=E7=94=BB?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=B8=8D=E5=BD=B1=E5=93=8D=E7=8E=B0?= =?UTF-8?q?=E6=9C=89=E9=80=BB=E8=BE=91=E6=BC=AB=E7=94=BB=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=20(#4685)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 增加漫画UI * ... * ... * ... * ... * ... * ... * ... * ... * ... * 完成加载图片人机验证问题 * 完成加载框 * ... * ... * .... * ... * ... * ... * ... * ... * ... * ... * ... * ... * 剔除重复章节 * ... * .... * ... * ... * ... * ... * .... * ... * ... * ... * .... * ... * ... * ... * .... * ... * ... * ... * .... * ... * ... * ... * ... * ... * ... * ... * ... * ... * ... * .... * ... * ... * ... * ... * ... * ... * ... * ... * ... * ... * .... * ... * ... * ... * ... * ... * ... * ... * ... * ... * .... * ... * ... * ... * ... * ... * ... * ... * ... * ... * ... * ... --- app/build.gradle | 3 + app/src/main/AndroidManifest.xml | 16 + app/src/main/assets/18PlusList.txt | 2 +- .../app/base/adapter/RecyclerAdapter.kt | 2 +- .../java/io/legado/app/constant/PreferKey.kt | 2 + .../io/legado/app/help/config/AppConfig.kt | 8 + .../app/help/glide/LegadoGlideModule.kt | 22 +- .../app/help/glide/OkHttpModeLoaderFactory.kt | 3 +- .../app/help/glide/OkHttpModelLoader.kt | 9 +- .../app/help/glide/OkHttpStreamFetcher.kt | 28 +- .../help/glide/progress/OnProgressListener.kt | 3 + .../help/glide/progress/ProgressManager.kt | 51 ++ .../glide/progress/ProgressResponseBody.kt | 54 ++ .../io/legado/app/help/http/HttpHelper.kt | 13 +- .../java/io/legado/app/model/BookCover.kt | 37 +- .../java/io/legado/app/model/ReadMange.kt | 638 ++++++++++++++++++ .../legado/app/model/recyclerView/MangaVH.kt | 116 ++++ .../app/model/recyclerView/MangeContent.kt | 11 + .../app/model/recyclerView/ReaderLoading.kt | 8 + .../legado/app/ui/about/ReadRecordActivity.kt | 10 +- .../ui/association/FileAssociationActivity.kt | 6 +- .../association/FileAssociationViewModel.kt | 5 +- .../app/ui/book/audio/AudioPlayActivity.kt | 4 +- .../ui/book/import/BaseImportBookActivity.kt | 19 +- .../book/import/local/ImportBookActivity.kt | 2 +- .../book/import/remote/RemoteBookActivity.kt | 2 +- .../app/ui/book/info/BookInfoActivity.kt | 13 +- .../app/ui/book/manga/MangaViewModel.kt | 240 +++++++ .../app/ui/book/manga/ReadMangaActivity.kt | 483 +++++++++++++ .../manga/rv/GestureDetectorWithLongTap.kt | 64 ++ .../app/ui/book/manga/rv/MangaAdapter.kt | 230 +++++++ .../app/ui/book/manga/rv/WebtoonFrame.kt | 85 +++ .../ui/book/manga/rv/WebtoonRecyclerView.kt | 390 +++++++++++ .../io/legado/app/ui/book/read/MangaMenu.kt | 236 +++++++ .../bookshelf/style1/books/BooksFragment.kt | 4 +- .../bookshelf/style2/BookshelfFragment2.kt | 3 +- .../legado/app/ui/widget/ReaderInfoBarView.kt | 205 ++++++ .../app/ui/widget/recycler/LoadMoreView.kt | 10 +- .../io/legado/app/utils/ActivityExtensions.kt | 6 + .../io/legado/app/utils/ContextExtensions.kt | 27 +- .../io/legado/app/utils/FragmentExtensions.kt | 16 + .../app/utils/RecyclerViewExtensions.kt | 28 + app/src/main/res/layout/activity_mange.xml | 93 +++ .../main/res/layout/book_comic_loading_rv.xml | 16 + app/src/main/res/layout/book_comic_rv.xml | 64 ++ app/src/main/res/layout/view_manga_menu.xml | 73 ++ app/src/main/res/menu/book_manga.xml | 21 + app/src/main/res/values-es-rES/strings.xml | 3 + app/src/main/res/values-ja-rJP/strings.xml | 3 + app/src/main/res/values-pt-rBR/strings.xml | 3 + app/src/main/res/values-vi/strings.xml | 3 + app/src/main/res/values-zh-rHK/strings.xml | 3 + app/src/main/res/values-zh-rTW/strings.xml | 3 + app/src/main/res/values-zh/strings.xml | 3 + app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/strings.xml | 3 + app/src/main/res/xml/pref_config_other.xml | 12 + gradle/libs.versions.toml | 3 + 58 files changed, 3373 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/io/legado/app/help/glide/progress/OnProgressListener.kt create mode 100644 app/src/main/java/io/legado/app/help/glide/progress/ProgressManager.kt create mode 100644 app/src/main/java/io/legado/app/help/glide/progress/ProgressResponseBody.kt create mode 100644 app/src/main/java/io/legado/app/model/ReadMange.kt create mode 100644 app/src/main/java/io/legado/app/model/recyclerView/MangaVH.kt create mode 100644 app/src/main/java/io/legado/app/model/recyclerView/MangeContent.kt create mode 100644 app/src/main/java/io/legado/app/model/recyclerView/ReaderLoading.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/manga/MangaViewModel.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/manga/rv/GestureDetectorWithLongTap.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/manga/rv/MangaAdapter.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonFrame.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt create mode 100644 app/src/main/java/io/legado/app/ui/book/read/MangaMenu.kt create mode 100644 app/src/main/java/io/legado/app/ui/widget/ReaderInfoBarView.kt create mode 100644 app/src/main/java/io/legado/app/utils/RecyclerViewExtensions.kt create mode 100644 app/src/main/res/layout/activity_mange.xml create mode 100644 app/src/main/res/layout/book_comic_loading_rv.xml create mode 100644 app/src/main/res/layout/book_comic_rv.xml create mode 100644 app/src/main/res/layout/view_manga_menu.xml create mode 100644 app/src/main/res/menu/book_manga.xml diff --git a/app/build.gradle b/app/build.gradle index e9db05bedfab..7e18c25b4ba0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -238,6 +238,7 @@ dependencies { //Glide implementation(libs.glide.glide) + implementation(libs.glide.okhttp) ksp(libs.glide.ksp) //Svg @@ -279,6 +280,8 @@ dependencies { implementation platform(libs.firebase.bom) implementation libs.firebase.analytics implementation libs.firebase.perf + implementation libs.zoom.imageview + implementation libs.glide.recyclerview //LeakCanary, 内存泄露检测 //debugImplementation('com.squareup.leakcanary:leakcanary-android:2.7') diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 07a76c223776..ecb3093470ee 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,6 +24,7 @@ + + + + + + + + + (protected val context: Co companion object { private const val TYPE_HEADER_VIEW = Int.MIN_VALUE - private const val TYPE_FOOTER_VIEW = Int.MAX_VALUE - 999 + const val TYPE_FOOTER_VIEW = Int.MAX_VALUE - 999 private val handler by lazy { buildMainHandler() } } diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index bcf5fb8fa9a6..b5960674cda5 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -153,6 +153,8 @@ object PreferKey { const val streamReadAloudAudio = "streamReadAloudAudio" const val pauseReadAloudWhilePhoneCalls = "pauseReadAloudWhilePhoneCalls" const val readAloudByMediaButton = "readAloudByMediaButton" + const val showMangaUi="showMangaUi" + const val disableMangaScaling="disableMangaScaling" const val cPrimary = "colorPrimary" const val cAccent = "colorAccent" diff --git a/app/src/main/java/io/legado/app/help/config/AppConfig.kt b/app/src/main/java/io/legado/app/help/config/AppConfig.kt index 2afadab09536..3d25d5d22401 100644 --- a/app/src/main/java/io/legado/app/help/config/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/config/AppConfig.kt @@ -604,5 +604,13 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { appCtx.toastOnUi("当前没有配置菜单区域,自动恢复中间区域为菜单.") } } + + //跳转到漫画界面不使用富文本模式 + val showMangaUi: Boolean + get() = appCtx.getPrefBoolean(PreferKey.showMangaUi, true) + + //禁用漫画缩放 + val disableMangaScaling: Boolean + get() = appCtx.getPrefBoolean(PreferKey.disableMangaScaling, true) } diff --git a/app/src/main/java/io/legado/app/help/glide/LegadoGlideModule.kt b/app/src/main/java/io/legado/app/help/glide/LegadoGlideModule.kt index bed786283574..dde9cba19c47 100644 --- a/app/src/main/java/io/legado/app/help/glide/LegadoGlideModule.kt +++ b/app/src/main/java/io/legado/app/help/glide/LegadoGlideModule.kt @@ -2,10 +2,16 @@ package io.legado.app.help.glide import android.content.Context import com.bumptech.glide.Glide +import com.bumptech.glide.GlideBuilder import com.bumptech.glide.Registry import com.bumptech.glide.annotation.GlideModule +import com.bumptech.glide.load.DecodeFormat +import com.bumptech.glide.load.engine.bitmap_recycle.LruBitmapPool +import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory +import com.bumptech.glide.load.engine.cache.LruResourceCache import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.module.AppGlideModule +import com.bumptech.glide.request.RequestOptions import java.io.InputStream @@ -13,7 +19,6 @@ import java.io.InputStream @GlideModule class LegadoGlideModule : AppGlideModule() { - override fun registerComponents(context: Context, glide: Glide, registry: Registry) { registry.replace( GlideUrl::class.java, @@ -22,4 +27,19 @@ class LegadoGlideModule : AppGlideModule() { ) } + override fun applyOptions(context: Context, builder: GlideBuilder) { + super.applyOptions(context, builder) + builder.setMemoryCache(LruResourceCache(1024 * 1024 * 500)) + .setBitmapPool(LruBitmapPool(1024 * 1024 * 200)) + .setDiskCache( + InternalCacheDiskCacheFactory( + context, + 1024 * 1024 * 1000 + ) + ) + .setDefaultRequestOptions { + RequestOptions().format(DecodeFormat.PREFER_RGB_565) + .encodeQuality(90) + } + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/glide/OkHttpModeLoaderFactory.kt b/app/src/main/java/io/legado/app/help/glide/OkHttpModeLoaderFactory.kt index 7b99fb0fbb85..6be342699bce 100644 --- a/app/src/main/java/io/legado/app/help/glide/OkHttpModeLoaderFactory.kt +++ b/app/src/main/java/io/legado/app/help/glide/OkHttpModeLoaderFactory.kt @@ -4,10 +4,11 @@ import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.model.ModelLoader import com.bumptech.glide.load.model.ModelLoaderFactory import com.bumptech.glide.load.model.MultiModelLoaderFactory +import okhttp3.Call import java.io.InputStream -object OkHttpModeLoaderFactory : ModelLoaderFactory { +object OkHttpModeLoaderFactory: ModelLoaderFactory { override fun build(multiFactory: MultiModelLoaderFactory): ModelLoader { return OkHttpModelLoader diff --git a/app/src/main/java/io/legado/app/help/glide/OkHttpModelLoader.kt b/app/src/main/java/io/legado/app/help/glide/OkHttpModelLoader.kt index e7dc687f0797..1f813a7c1e62 100644 --- a/app/src/main/java/io/legado/app/help/glide/OkHttpModelLoader.kt +++ b/app/src/main/java/io/legado/app/help/glide/OkHttpModelLoader.kt @@ -6,26 +6,29 @@ import com.bumptech.glide.load.model.GlideUrl import com.bumptech.glide.load.model.ModelLoader import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.utils.isAbsUrl - import java.io.InputStream object OkHttpModelLoader : ModelLoader { val loadOnlyWifiOption = Option.memory("loadOnlyWifi", false) val sourceOriginOption = Option.memory("sourceOrigin") + val mangaOption = Option.memory("manga",false) override fun buildLoadData( model: GlideUrl, width: Int, height: Int, - options: Options + options: Options, ): ModelLoader.LoadData { val cacheKey = model.toString() var modelWithHeader = model if (cacheKey.isAbsUrl()) { modelWithHeader = AnalyzeUrl(cacheKey).getGlideUrl() } - return ModelLoader.LoadData(modelWithHeader, OkHttpStreamFetcher(modelWithHeader, options)) + return ModelLoader.LoadData( + modelWithHeader, + OkHttpStreamFetcher(modelWithHeader, options) + ) } override fun handles(model: GlideUrl): Boolean { diff --git a/app/src/main/java/io/legado/app/help/glide/OkHttpStreamFetcher.kt b/app/src/main/java/io/legado/app/help/glide/OkHttpStreamFetcher.kt index d7409b0feac6..5e9895961819 100644 --- a/app/src/main/java/io/legado/app/help/glide/OkHttpStreamFetcher.kt +++ b/app/src/main/java/io/legado/app/help/glide/OkHttpStreamFetcher.kt @@ -14,6 +14,7 @@ import io.legado.app.help.http.CookieManager.cookieJarHeader import io.legado.app.help.http.addHeaders import io.legado.app.help.http.okHttpClient import io.legado.app.help.source.SourceHelp +import io.legado.app.model.ReadMange import io.legado.app.utils.ImageUtils import io.legado.app.utils.isWifiConnect import okhttp3.Call @@ -26,7 +27,10 @@ import java.io.IOException import java.io.InputStream -class OkHttpStreamFetcher(private val url: GlideUrl, private val options: Options) : +class OkHttpStreamFetcher( + private val url: GlideUrl, + private val options: Options, +) : DataFetcher, okhttp3.Callback { private var stream: InputStream? = null private var responseBody: ResponseBody? = null @@ -95,15 +99,31 @@ class OkHttpStreamFetcher(private val url: GlideUrl, private val options: Option override fun onResponse(call: Call, response: Response) { responseBody = response.body - if (response.isSuccessful) { - val decodeResult = ImageUtils.decode( + val manga = options.get(OkHttpModelLoader.mangaOption) == true + val decodeResult = if (manga) { + ImageUtils.decode( + url.toStringUrl(), + responseBody!!.byteStream().readBytes(), + isCover = false, + source, + ReadMange.book + ).let { + ByteArrayInputStream(it) + } + } else { + ImageUtils.decode( url.toStringUrl(), responseBody!!.byteStream(), isCover = true, source ) + } + if (response.isSuccessful) { + if (decodeResult == null) { callback?.onLoadFailed(NoStackTraceException("封面二次解密失败")) } else { - val contentLength: Long = if (decodeResult is ByteArrayInputStream) decodeResult.available().toLong() else Preconditions.checkNotNull(responseBody).contentLength() + val contentLength: Long = + if (decodeResult is ByteArrayInputStream) decodeResult.available() + .toLong() else Preconditions.checkNotNull(responseBody).contentLength() stream = ContentLengthInputStream.obtain(decodeResult, contentLength) callback?.onDataReady(stream) } diff --git a/app/src/main/java/io/legado/app/help/glide/progress/OnProgressListener.kt b/app/src/main/java/io/legado/app/help/glide/progress/OnProgressListener.kt new file mode 100644 index 000000000000..19561c75bfee --- /dev/null +++ b/app/src/main/java/io/legado/app/help/glide/progress/OnProgressListener.kt @@ -0,0 +1,3 @@ +package io.legado.app.help.glide.progress + +typealias OnProgressListener = ((isComplete: Boolean, percentage: Int, bytesRead: Long, totalBytes: Long) -> Unit)? \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/glide/progress/ProgressManager.kt b/app/src/main/java/io/legado/app/help/glide/progress/ProgressManager.kt new file mode 100644 index 000000000000..0cebbc5f05ae --- /dev/null +++ b/app/src/main/java/io/legado/app/help/glide/progress/ProgressManager.kt @@ -0,0 +1,51 @@ +package io.legado.app.help.glide.progress + +import android.text.TextUtils +import io.legado.app.utils.runOnUI +import java.util.concurrent.ConcurrentHashMap + +/** + * 进度监听器管理类 + * 加入图片加载进度监听,加入Https支持 + */ +object ProgressManager { + private val listenersMap = ConcurrentHashMap() + + val LISTENER = object : ProgressResponseBody.InternalProgressListener { + override fun onProgress(url: String, bytesRead: Long, totalBytes: Long) { + getProgressListener(url)?.let { + var percentage = (bytesRead * 1f / totalBytes * 100f).toInt() + var isComplete = percentage >= 100 + if (percentage <= -100) { + percentage = 0 + isComplete = true + } + runOnUI { + it.invoke(isComplete, percentage, bytesRead, totalBytes) + } + if (isComplete) { + removeListener(url) + } + } + } + } + + fun addListener(url: String, listener: OnProgressListener) { + if (!TextUtils.isEmpty(url) && listener != null) { + listenersMap[url] = listener + listener.invoke(false, 1, 0, 0) + } + } + + fun removeListener(url: String) { + if (!TextUtils.isEmpty(url)) { + listenersMap.remove(url) + } + } + + fun getProgressListener(url: String?): OnProgressListener { + return if (TextUtils.isEmpty(url) || listenersMap.size == 0) { + null + } else listenersMap[url] + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/glide/progress/ProgressResponseBody.kt b/app/src/main/java/io/legado/app/help/glide/progress/ProgressResponseBody.kt new file mode 100644 index 000000000000..9a8158a9a1c1 --- /dev/null +++ b/app/src/main/java/io/legado/app/help/glide/progress/ProgressResponseBody.kt @@ -0,0 +1,54 @@ +package io.legado.app.help.glide.progress + +import android.os.Handler +import android.os.Looper +import okhttp3.MediaType +import okhttp3.ResponseBody +import okio.* +import java.io.IOException +import kotlin.jvm.Throws + +class ProgressResponseBody internal constructor(private val url: String, private val internalProgressListener: InternalProgressListener?, private val responseBody: ResponseBody) : ResponseBody() { + private var bufferedSource: BufferedSource? = null + override fun contentType(): MediaType? { + return responseBody.contentType() + } + + override fun contentLength(): Long { + return responseBody.contentLength() + } + + override fun source(): BufferedSource { + if (bufferedSource == null) { + bufferedSource = source(responseBody.source()).buffer() + } + return bufferedSource!! + } + + private fun source(source: Source): Source { + return object : ForwardingSource(source) { + var totalBytesRead: Long = 0 + var lastTotalBytesRead: Long = 0 + + @Throws(IOException::class) + override fun read(sink: Buffer, byteCount: Long): Long { + val bytesRead = super.read(sink, byteCount) + totalBytesRead += if (bytesRead == -1L) 0 else bytesRead + if (internalProgressListener != null && lastTotalBytesRead != totalBytesRead) { + lastTotalBytesRead = totalBytesRead + mainThreadHandler.post { internalProgressListener.onProgress(url, totalBytesRead, contentLength()) } + } + return bytesRead + } + } + } + + interface InternalProgressListener { + fun onProgress(url: String, bytesRead: Long, totalBytes: Long) + } + + companion object { + private val mainThreadHandler = Handler(Looper.getMainLooper()) + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/http/HttpHelper.kt b/app/src/main/java/io/legado/app/help/http/HttpHelper.kt index df8d1b217c39..67e30b7d3caf 100644 --- a/app/src/main/java/io/legado/app/help/http/HttpHelper.kt +++ b/app/src/main/java/io/legado/app/help/http/HttpHelper.kt @@ -3,6 +3,9 @@ package io.legado.app.help.http import io.legado.app.constant.AppConst import io.legado.app.help.CacheManager import io.legado.app.help.config.AppConfig +import io.legado.app.help.glide.progress.ProgressManager +import io.legado.app.help.glide.progress.ProgressManager.LISTENER +import io.legado.app.help.glide.progress.ProgressResponseBody import io.legado.app.help.http.CookieManager.cookieJarHeader import io.legado.app.utils.NetworkUtils import okhttp3.ConnectionSpec @@ -93,7 +96,15 @@ val okHttpClient: OkHttpClient by lazy { if (enableCookieJar) { CookieManager.saveResponse(networkResponse) } - networkResponse + networkResponse.newBuilder() + .body( + ProgressResponseBody( + request.url.toString(), + LISTENER, + networkResponse.body!! + ) + ) + .build() } if (AppConfig.isCronet) { if (Cronet.loader?.install() == true) { diff --git a/app/src/main/java/io/legado/app/model/BookCover.kt b/app/src/main/java/io/legado/app/model/BookCover.kt index 477fb8de2dff..a458c0de7d7f 100644 --- a/app/src/main/java/io/legado/app/model/BookCover.kt +++ b/app/src/main/java/io/legado/app/model/BookCover.kt @@ -6,9 +6,11 @@ import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable import androidx.annotation.Keep import com.bumptech.glide.RequestBuilder +import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL import io.legado.app.R import io.legado.app.constant.PreferKey import io.legado.app.data.entities.BaseSource @@ -21,7 +23,11 @@ import io.legado.app.help.glide.ImageLoader import io.legado.app.help.glide.OkHttpModelLoader import io.legado.app.model.analyzeRule.AnalyzeRule import io.legado.app.model.analyzeRule.AnalyzeUrl -import io.legado.app.utils.* +import io.legado.app.utils.BitmapUtils +import io.legado.app.utils.GSON +import io.legado.app.utils.fromJsonObject +import io.legado.app.utils.getPrefBoolean +import io.legado.app.utils.getPrefString import splitties.init.appCtx @Keep @@ -71,7 +77,7 @@ object BookCover { context: Context, path: String?, loadOnlyWifi: Boolean = false, - sourceOrigin: String? = null + sourceOrigin: String? = null, ): RequestBuilder { if (AppConfig.useDefaultCover) { return ImageLoader.load(context, defaultDrawable) @@ -88,6 +94,31 @@ object BookCover { .centerCrop() } + /** + * 加载漫画图片 + */ + + fun loadManga( + context: Context, + path: String?, + loadOnlyWifi: Boolean = false, + sourceOrigin: String? = null, + manga: Boolean = false, + useDefaultCover: Drawable? = null, + ): RequestBuilder { + var options = RequestOptions().set(OkHttpModelLoader.loadOnlyWifiOption, loadOnlyWifi) + .set(OkHttpModelLoader.mangaOption, manga) + if (sourceOrigin != null) { + options = options.set(OkHttpModelLoader.sourceOriginOption, sourceOrigin) + } + return ImageLoader.load(context, path) + .apply(options) + .override(context.resources.displayMetrics.widthPixels, SIZE_ORIGINAL) + .placeholder(useDefaultCover) + .error(useDefaultCover) + .diskCacheStrategy(DiskCacheStrategy.ALL) + } + /** * 加载模糊封面 */ @@ -95,7 +126,7 @@ object BookCover { context: Context, path: String?, loadOnlyWifi: Boolean = false, - sourceOrigin: String? = null + sourceOrigin: String? = null, ): RequestBuilder { val loadBlur = ImageLoader.load(context, defaultDrawable) .transform(BlurTransformation(25), CenterCrop()) diff --git a/app/src/main/java/io/legado/app/model/ReadMange.kt b/app/src/main/java/io/legado/app/model/ReadMange.kt new file mode 100644 index 000000000000..a87773dd6e77 --- /dev/null +++ b/app/src/main/java/io/legado/app/model/ReadMange.kt @@ -0,0 +1,638 @@ +package io.legado.app.model + +import io.legado.app.constant.AppLog +import io.legado.app.constant.AppPattern +import io.legado.app.data.appDb +import io.legado.app.data.entities.Book +import io.legado.app.data.entities.BookChapter +import io.legado.app.data.entities.BookProgress +import io.legado.app.data.entities.BookSource +import io.legado.app.data.entities.ReadRecord +import io.legado.app.help.AppWebDav +import io.legado.app.help.book.BookHelp +import io.legado.app.help.book.ContentProcessor +import io.legado.app.help.book.isLocal +import io.legado.app.help.book.readSimulating +import io.legado.app.help.book.simulatedTotalChapterNum +import io.legado.app.help.book.update +import io.legado.app.help.config.AppConfig +import io.legado.app.help.coroutine.Coroutine +import io.legado.app.help.globalExecutor +import io.legado.app.model.recyclerView.MangeContent +import io.legado.app.model.recyclerView.ReaderLoading +import io.legado.app.model.webBook.WebBook +import io.legado.app.utils.NetworkUtils +import io.legado.app.utils.mapIndexed +import io.legado.app.utils.runOnUI +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Job +import kotlinx.coroutines.MainScope +import kotlinx.coroutines.SupervisorJob +import kotlinx.coroutines.asCoroutineDispatcher +import kotlinx.coroutines.cancelChildren +import kotlinx.coroutines.delay +import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.flow.distinctUntilChangedBy +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.toList +import kotlinx.coroutines.launch +import kotlin.math.min + +@Suppress("MemberVisibilityCanBePrivate") +object ReadMange : CoroutineScope by MainScope() { + var inBookshelf = false + var tocChanged = false + var chapterChanged = false + var book: Book? = null + val executor = globalExecutor + var durChapterPagePos = 0 //章节位置 + var durChapterPageCount = 0//总章节 + var durChapterCount = 0 + var durChapterPos = 0 + var bookSource: BookSource? = null + var chapterTitle: String = "" + var readStartTime: Long = System.currentTimeMillis() + private val readRecord = ReadRecord() + private val loadingChapters = arrayListOf() + var simulatedChapterSize = 0 + var mCallback: Callback? = null + var mFirstLoading = false + var gameOver = false + var mTopChapter: BookChapter? = null + var preDownloadTask: Job? = null + val downloadedChapters = hashSetOf() + val downloadFailChapters = hashMapOf() + private val downloadLoadingChapters = arrayListOf() + var isMangaMode = false + val downloadScope = CoroutineScope(SupervisorJob() + IO) + + fun saveRead(pageChanged: Boolean = false) { + executor.execute { + val book = ReadMange.book ?: return@execute + book.lastCheckCount = 0 + book.durChapterTime = System.currentTimeMillis() + val chapterChanged = book.durChapterIndex != durChapterPagePos + book.durChapterIndex = durChapterPagePos + book.durChapterPos = durChapterPos + if (!pageChanged || chapterChanged) { + appDb.bookChapterDao.getChapter(book.bookUrl, durChapterPagePos)?.let { + book.durChapterTitle = it.getDisplayTitle( + ContentProcessor.get(book.name, book.origin).getTitleReplaceRules(), + book.getUseReplaceRule() + ) + } + } + appDb.bookDao.update(book) + } + } + + fun upData(book: Book) { + ReadMange.book = book + isMangaMode = true + durChapterPageCount = appDb.bookChapterDao.getChapterCount(book.bookUrl) + simulatedChapterSize = if (book.readSimulating()) { + book.simulatedTotalChapterNum() + } else { + durChapterPageCount + } + + if (durChapterPagePos != book.durChapterIndex || tocChanged) { + durChapterPagePos = book.durChapterIndex + durChapterPos = book.durChapterPos + } + upWebBook(book) + + synchronized(this) { + loadingChapters.clear() + } + } + + fun resetData(book: Book) { + ReadMange.book = book + isMangaMode = true + readRecord.bookName = book.name + readRecord.readTime = appDb.readRecordDao.getReadTime(book.name) ?: 0 + durChapterPageCount = appDb.bookChapterDao.getChapterCount(book.bookUrl) + simulatedChapterSize = if (book.readSimulating()) { + book.simulatedTotalChapterNum() + } else { + durChapterPageCount + } + durChapterPagePos = book.durChapterIndex + durChapterPos = book.durChapterPos + upWebBook(book) + synchronized(this) { + loadingChapters.clear() + } + } + + fun upWebBook(book: Book) { + appDb.bookSourceDao.getBookSource(book.origin)?.let { + bookSource = it + } ?: let { + bookSource = null + } + } + + + //每次切换章节更新阅读记录 + fun upReadTime() { + executor.execute { + if (!AppConfig.enableReadRecord) { + return@execute + } + readRecord.readTime = readRecord.readTime + System.currentTimeMillis() - readStartTime + readStartTime = System.currentTimeMillis() + readRecord.lastRead = System.currentTimeMillis() + appDb.readRecordDao.insert(readRecord) + } + } + + private fun addLoading(index: Int): Boolean { + synchronized(this) { + if (loadingChapters.contains(index)) return false + loadingChapters.add(index) + return true + } + } + + private fun addDownloadLoading(index: Int): Boolean { + synchronized(this) { + if (downloadLoadingChapters.contains(index)) return false + downloadLoadingChapters.add(index) + return true + } + } + + + fun removeDownloadLoading(index: Int) { + synchronized(this) { + downloadLoadingChapters.remove(index) + } + } + + fun removeLoading(index: Int) { + synchronized(this) { + loadingChapters.remove(index) + } + } + + fun loading(index: Int): Boolean { + synchronized(this) { + return loadingChapters.contains(index) + } + } + + + /** + * 获取正文 + */ + private suspend fun getContent( + scope: CoroutineScope, + chapter: BookChapter, + ) { + val book = ReadMange.book ?: return removeLoading(chapter.index) + val bookSource = ReadMange.bookSource + if (bookSource != null) { + getContent(bookSource, scope, chapter, book) + } + } + + + fun loadContent() { + loadContent(durChapterPagePos) + } + + fun loadContent( + index: Int, + ) { + if (addLoading(index)) { + Coroutine.async { + val book = ReadMange.book!! + appDb.bookChapterDao.getChapter(book.bookUrl, index)?.let { chapter -> + getContent( + downloadScope, + chapter, + ) + } ?: removeLoading(index) + }.onError { + removeLoading(index) + AppLog.put("加载正文出错\n${it.localizedMessage}") + } + } + + } + + + /** + * 注册回调 + */ + fun register(cb: Callback) { + mCallback = cb + } + + /** + * 取消注册回调 + */ + fun unregister() { + inBookshelf = false + tocChanged = false + chapterChanged = false + book = null + durChapterPagePos = 0 + isMangaMode = false + durChapterPageCount = 0 + durChapterPos = 0 + durChapterCount = 0 + bookSource = null + chapterTitle = "" + loadingChapters.clear() + simulatedChapterSize = 0 + mCallback = null + mFirstLoading = false + gameOver = false + mTopChapter = null + preDownloadTask?.cancel() + preDownloadTask = null + downloadedChapters.clear() + downloadFailChapters.clear() + downloadLoadingChapters.clear() + executor.asCoroutineDispatcher().cancelChildren() + downloadScope.coroutineContext.cancelChildren() + coroutineContext.cancelChildren() + } + + /** + * 内容加载完成 + */ + suspend fun contentLoadFinish( + chapter: BookChapter, + content: String, + book: Book + ) { + if (mTopChapter != null && mTopChapter!!.title != chapterTitle && BookHelp.hasContent( + book, + mTopChapter!! + ) + ) { + BookHelp.delContent(book, chapter) + } + mTopChapter = chapter + chapterTitle = chapter.title + if (chapter.index !in durChapterPagePos - 1..durChapterPagePos + 1) { + return + } + if (content.isNotEmpty()) { + val list = flow { + val matcher = AppPattern.imgPattern.matcher(content) + while (matcher.find()) { + val src = matcher.group(1) ?: continue + val mSrc = NetworkUtils.getAbsoluteURL(chapter.url, src) + emit(mSrc) + } + }.distinctUntilChangedBy { + it + }.mapIndexed { index, src -> + MangeContent( + mChapterPageCount = durChapterPageCount, + mChapterPagePos = durChapterPagePos, + mChapterNextPagePos = durChapterPagePos.plus(1), + mImageUrl = src, + mDurChapterPos = index.plus(1) + ) + }.toList().apply { + this.forEach { + it.mDurChapterCount = this.size + } + } + val contentList = mutableListOf() + contentList.add( + ReaderLoading( + durChapterPagePos, + "阅读 ${chapter.title}", + mNextChapterIndex = durChapterPagePos.plus(1) + ) + ) + contentList.addAll(list) + durChapterCount = contentList.size + contentList.add( + ReaderLoading( + durChapterPagePos, + "已读完 ${chapter.title}", + mNextChapterIndex = durChapterPagePos.plus(1) + ) + ) + runOnUI { + mCallback?.loadContentFinish(contentList) + } + } + } + + /** + * 加载下一章 + */ + fun moveToNextChapter(index: Int) { + + if (loading(index)) { + return + } + + if (index > durChapterPageCount - 1) { + upToc(index) + return + } + if (durChapterPagePos < simulatedChapterSize - 1) { + durChapterPos = 0 + durChapterPagePos = index + saveRead() + loadContent(durChapterPagePos) + AppLog.putDebug("moveToNextChapter-curPageChanged()") + curPageChanged() + } else { + AppLog.putDebug("跳转下一章失败,没有下一章") + } + } + + fun curPageChanged() { + upReadTime() + preDownload() + } + + @Synchronized + fun upToc(index: Int) { + val bookSource = bookSource ?: return + val book = book ?: return + if (!book.canUpdate) return + if (System.currentTimeMillis() - book.lastCheckTime < 600000) return + book.lastCheckTime = System.currentTimeMillis() + WebBook.getChapterList(this, bookSource, book).onSuccess(IO) { cList -> + if (book.bookUrl == ReadMange.book?.bookUrl + && cList.size > durChapterPageCount + ) { + appDb.bookChapterDao.delByBook(book.bookUrl) + appDb.bookChapterDao.insert(*cList.toTypedArray()) + saveRead() + durChapterPos = 0 + durChapterPagePos = index + durChapterPageCount = cList.size + simulatedChapterSize = book.simulatedTotalChapterNum() + loadContent(durChapterPagePos) + } else { + durChapterPagePos = durChapterPagePos.minus(1) + saveRead() + gameOver = true + runOnUI { + mCallback?.noData() + } + } + } + } + + private suspend fun getContent( + bookSource: BookSource, + scope: CoroutineScope, + chapter: BookChapter, + book: Book, + ) { + if (BookHelp.hasContent(book, chapter)) { + BookHelp.getContent(book, chapter)?.apply { + contentLoadFinish(chapter, this, book) + runOnUI { + mCallback?.loadComplete() + } + if (durChapterPagePos >= durChapterPageCount.minus(1)) { + gameOver = true + runOnUI { + mCallback?.noData() + } + } + } ?: downloadNetworkContent(bookSource, scope, chapter, book, success = { + contentLoadFinish(chapter, it, book) + runOnUI { + mCallback?.loadComplete() + } + }, error = { + removeLoading(chapter.index) + runOnUI { + mCallback?.loadFail("加载内容失败") + } + }) + } else { + downloadNetworkContent(bookSource, scope, chapter, book, success = { + contentLoadFinish(chapter, it, book) + runOnUI { + mCallback?.loadComplete() + } + }, error = { + removeLoading(chapter.index) + runOnUI { + mCallback?.loadFail("加载内容失败") + } + }) + } + } + + private fun downloadNetworkContent( + bookSource: BookSource, + scope: CoroutineScope, + chapter: BookChapter, + book: Book, + success: suspend (String) -> Unit = {}, + error: suspend () -> Unit = {}, + ) { + WebBook.getContent( + scope, + bookSource, + book, + chapter, + start = CoroutineStart.LAZY, + executeContext = IO, + needSave = true + ).onSuccess { content -> + success.invoke(content) + }.onError { + error.invoke() + }.start() + } + + private fun preDownload() { + if (book?.isLocal == true) return + executor.execute { + if (AppConfig.preDownloadNum < 2) { + return@execute + } + preDownloadTask?.cancel() + preDownloadTask = launch(IO) { + //预下载 + launch { + val maxChapterIndex = + min(durChapterPagePos + AppConfig.preDownloadNum, durChapterPageCount) + for (i in durChapterPagePos.plus(2)..maxChapterIndex) { + if (downloadedChapters.contains(i)) continue + if ((downloadFailChapters[i] ?: 0) >= 3) continue + downloadIndex(i) + } + } + launch { + val minChapterIndex = durChapterPagePos - min(5, AppConfig.preDownloadNum) + for (i in durChapterPagePos.minus(2) downTo minChapterIndex) { + if (downloadedChapters.contains(i)) continue + if ((downloadFailChapters[i] ?: 0) >= 3) continue + downloadIndex(i) + } + } + } + } + } + + private suspend fun downloadIndex(index: Int) { + if (index < 0) return + if (index > durChapterPageCount - 1) { + upToc() + return + } + val book = book ?: return + if (addDownloadLoading(index)) { + try { + appDb.bookChapterDao.getChapter(book.bookUrl, index)?.let { chapter -> + if (BookHelp.hasContent(book, chapter)) { + removeDownloadLoading(chapter.index) + downloadedChapters.add(chapter.index) + } else { + delay(1000) + downloadNetworkContent( + bookSource!!, + downloadScope, + chapter, + book, + success = { + downloadedChapters.add(chapter.index) + downloadFailChapters.remove(chapter.index) + }, + error = { + downloadFailChapters[chapter.index] = + (downloadFailChapters[chapter.index] ?: 0) + 1 + removeDownloadLoading(chapter.index) + }) + } + } ?: removeDownloadLoading(index) + } catch (e: Exception) { + removeLoading(index) + } + } + } + + @Synchronized + fun upToc() { + val bookSource = bookSource ?: return + val book = book ?: return + if (!book.canUpdate) return + if (System.currentTimeMillis() - book.lastCheckTime < 600000) return + book.lastCheckTime = System.currentTimeMillis() + WebBook.getChapterList(this, bookSource, book).onSuccess(IO) { cList -> + if (book.bookUrl == ReadMange.book?.bookUrl + && cList.size > durChapterPageCount + ) { + appDb.bookChapterDao.delByBook(book.bookUrl) + appDb.bookChapterDao.insert(*cList.toTypedArray()) + saveRead() + durChapterPageCount = cList.size + simulatedChapterSize = book.simulatedTotalChapterNum() + } + } + } + + fun uploadProgress(successAction: (() -> Unit)? = null) { + book?.let { + launch(IO) { + AppWebDav.uploadBookProgress(it) + ensureActive() + it.update() + successAction?.invoke() + } + } + } + + + /** + * 同步阅读进度 + * 如果当前进度快于服务器进度或者没有进度进行上传,如果慢与服务器进度则执行传入动作 + */ + fun syncProgress( + newProgressAction: ((progress: BookProgress) -> Unit)? = null, + uploadSuccessAction: (() -> Unit)? = null, + syncSuccessAction: (() -> Unit)? = null + ) { + if (!AppConfig.syncBookProgress) return + book?.let { + Coroutine.async { + AppWebDav.getBookProgress(it) + }.onError { + AppLog.put("拉取阅读进度失败", it) + }.onSuccess { progress -> + if (progress == null || progress.durChapterIndex < it.durChapterIndex || + (progress.durChapterIndex == it.durChapterIndex + && progress.durChapterPos < it.durChapterPos) + ) { + // 服务器没有进度或者进度比服务器快,上传现有进度 + Coroutine.async { + AppWebDav.uploadBookProgress(BookProgress(it), uploadSuccessAction) + it.update() + } + } else if (progress.durChapterIndex > it.durChapterIndex || + progress.durChapterPos > it.durChapterPos + ) { + // 进度比服务器慢,执行传入动作 + newProgressAction?.invoke(progress) + } else { + syncSuccessAction?.invoke() + } + } + } + } + + fun setProgress(progress: BookProgress) { + if (progress.durChapterIndex < durChapterPageCount && + (durChapterPagePos != progress.durChapterIndex + || durChapterPos != progress.durChapterPos) + ) { + chapterChanged = true + if (progress.durChapterIndex == durChapterPagePos) { + durChapterPos = progress.durChapterPos + mCallback?.adjustmentProgress() + } else { + durChapterPagePos = progress.durChapterIndex + durChapterPos = progress.durChapterPos + if (addLoading(durChapterPagePos)) { + loadContent(durChapterPagePos) + } else { + Coroutine.async { + val book = ReadMange.book!! + appDb.bookChapterDao.getChapter(book.bookUrl, durChapterPagePos) + ?.let { chapter -> + getContent( + downloadScope, + chapter, + ) + } + }.onError { + AppLog.put("加载正文出错\n${it.localizedMessage}") + } + } + } + saveRead() + } + } + + interface Callback { + fun loadContentFinish(list: MutableList) + fun loadComplete() + fun loadFail(msg: String) + fun noData() + fun adjustmentProgress() + fun sureNewProgress(progress: BookProgress) + val chapterList: MutableList + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/recyclerView/MangaVH.kt b/app/src/main/java/io/legado/app/model/recyclerView/MangaVH.kt new file mode 100644 index 000000000000..c51aeba7acb5 --- /dev/null +++ b/app/src/main/java/io/legado/app/model/recyclerView/MangaVH.kt @@ -0,0 +1,116 @@ +package io.legado.app.model.recyclerView + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.drawable.Drawable +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import android.view.ViewGroup.LayoutParams.WRAP_CONTENT +import android.widget.Button +import android.widget.FrameLayout +import android.widget.ProgressBar +import android.widget.TextView +import androidx.core.view.isGone +import androidx.core.view.isVisible +import androidx.core.view.updateLayoutParams +import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.target.Target +import com.github.panpf.zoomimage.GlideZoomImageView +import io.legado.app.R +import io.legado.app.help.glide.progress.OnProgressListener +import io.legado.app.help.glide.progress.ProgressManager +import io.legado.app.model.BookCover +import io.legado.app.model.ReadMange +import io.legado.app.utils.getCompatDrawable +import io.legado.app.utils.printOnDebug + +open class MangaVH(val binding: VB, private val context: Context) : + RecyclerView.ViewHolder(binding.root) { + + protected lateinit var mLoading: ProgressBar + protected lateinit var mImage: GlideZoomImageView + protected lateinit var mProgress: TextView + protected lateinit var mFlProgress: FrameLayout + protected var mRetry: Button? = null + + fun initComponent( + loading: ProgressBar, + image: GlideZoomImageView, + progress: TextView, + button: Button? = null, + flProgress: FrameLayout, + ) { + mLoading = loading + mImage = image + mRetry = button + mProgress = progress + mFlProgress = flProgress + } + + @SuppressLint("CheckResult") + fun loadImageWithRetry(imageUrl: String) { + mFlProgress.isVisible = true + mLoading.isVisible = true + mRetry?.isGone = true + mProgress.isVisible = true + ProgressManager.removeListener(imageUrl) + ProgressManager.addListener(imageUrl, object : OnProgressListener { + @SuppressLint("SetTextI18n") + override fun invoke( + isComplete: Boolean, + percentage: Int, + bytesRead: Long, + totalBytes: Long, + ) { + mProgress.text = "${percentage}%" + } + }) + try { + mImage.tag = imageUrl + BookCover.loadManga( + context, + imageUrl, + sourceOrigin = ReadMange.book?.origin, + manga = true, + useDefaultCover = context.getCompatDrawable(R.color.book_ant_10) + ).addListener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target, + isFirstResource: Boolean, + ): Boolean { + mFlProgress.isVisible = true + mLoading.isGone = true + mRetry?.isVisible = true + mProgress.isGone = true + itemView.updateLayoutParams { + height = MATCH_PARENT + } + return false + } + + override fun onResourceReady( + resource: Drawable, + model: Any, + target: Target?, + dataSource: DataSource, + isFirstResource: Boolean, + ): Boolean { + mFlProgress.isGone = true + itemView.updateLayoutParams { + height = WRAP_CONTENT + } + return false + } + }).into(mImage) + } catch (e: Exception) { + e.printOnDebug() + } + + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/recyclerView/MangeContent.kt b/app/src/main/java/io/legado/app/model/recyclerView/MangeContent.kt new file mode 100644 index 000000000000..0f7160db09fa --- /dev/null +++ b/app/src/main/java/io/legado/app/model/recyclerView/MangeContent.kt @@ -0,0 +1,11 @@ +package io.legado.app.model.recyclerView + + +data class MangeContent( + var mChapterPagePos: Int = 0,//总章节位置 + var mChapterPageCount:Int,//总章节数量 + var mChapterNextPagePos: Int = 0,//下一章 + val mImageUrl: String="",//当前URL + var mDurChapterPos:Int=0,//当前章节位置 + var mDurChapterCount:Int=0//当前章节内容总数 +) \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/model/recyclerView/ReaderLoading.kt b/app/src/main/java/io/legado/app/model/recyclerView/ReaderLoading.kt new file mode 100644 index 000000000000..ad7dcf9b13ad --- /dev/null +++ b/app/src/main/java/io/legado/app/model/recyclerView/ReaderLoading.kt @@ -0,0 +1,8 @@ +package io.legado.app.model.recyclerView + +data class ReaderLoading( + val mChapterPagePos: Int = 0, + val mMessage: String? = null, + val mNextChapterIndex: Int = 0, + var mLoading: Boolean = false, +) diff --git a/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt b/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt index c14d3ba1854a..516b04afea06 100644 --- a/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt +++ b/app/src/main/java/io/legado/app/ui/about/ReadRecordActivity.kt @@ -19,6 +19,7 @@ import io.legado.app.help.config.AppConfig import io.legado.app.help.config.LocalConfig import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.primaryTextColor +import io.legado.app.ui.book.manga.ReadMangaActivity import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.book.search.SearchActivity import io.legado.app.utils.applyNavigationBarPadding @@ -26,7 +27,7 @@ import io.legado.app.utils.applyTint import io.legado.app.utils.cnCompare import io.legado.app.utils.getInt import io.legado.app.utils.putInt -import io.legado.app.utils.startActivity +import io.legado.app.utils.startReadOrMangaActivity import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.launch @@ -76,16 +77,19 @@ class ReadRecordActivity : BaseActivity() { item.isChecked = true initData() } + R.id.menu_sort_read_long -> { sortMode = 1 item.isChecked = true initData() } + R.id.menu_sort_read_time -> { sortMode = 2 item.isChecked = true initData() } + R.id.menu_enable_record -> { AppConfig.enableReadRecord = !item.isChecked } @@ -165,7 +169,7 @@ class ReadRecordActivity : BaseActivity() { holder: ItemViewHolder, binding: ItemReadRecordBinding, item: ReadRecordShow, - payloads: MutableList + payloads: MutableList, ) { binding.apply { tvBookName.text = item.bookName @@ -189,7 +193,7 @@ class ReadRecordActivity : BaseActivity() { if (book == null) { SearchActivity.start(this@ReadRecordActivity, item.bookName) } else { - startActivity { + startReadOrMangaActivity(book) { putExtra("bookUrl", book.bookUrl) } } diff --git a/app/src/main/java/io/legado/app/ui/association/FileAssociationActivity.kt b/app/src/main/java/io/legado/app/ui/association/FileAssociationActivity.kt index da99ac719e40..fbcfb8523fac 100644 --- a/app/src/main/java/io/legado/app/ui/association/FileAssociationActivity.kt +++ b/app/src/main/java/io/legado/app/ui/association/FileAssociationActivity.kt @@ -15,6 +15,7 @@ import io.legado.app.help.config.AppConfig import io.legado.app.lib.dialogs.alert import io.legado.app.lib.permission.Permissions import io.legado.app.lib.permission.PermissionsCompat +import io.legado.app.ui.book.manga.ReadMangaActivity import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.file.HandleFileContract import io.legado.app.utils.FileUtils @@ -26,6 +27,7 @@ import io.legado.app.utils.isContentScheme import io.legado.app.utils.readUri import io.legado.app.utils.showDialogFragment import io.legado.app.utils.startActivity +import io.legado.app.utils.startReadOrMangaActivity import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers.IO @@ -90,8 +92,8 @@ class FileAssociationActivity : } viewModel.openBookLiveData.observe(this) { binding.rotateLoading.gone() - startActivity { - putExtra("bookUrl", it) + startReadOrMangaActivity(it) { + putExtra("bookUrl", it.bookUrl) } finish() } diff --git a/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt b/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt index f16beb563077..08a03674c937 100644 --- a/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/association/FileAssociationViewModel.kt @@ -6,13 +6,14 @@ import androidx.lifecycle.MutableLiveData import io.legado.app.constant.AppLog import io.legado.app.constant.AppPattern import io.legado.app.constant.AppPattern.bookFileRegex +import io.legado.app.data.entities.Book import io.legado.app.model.localBook.LocalBook import io.legado.app.utils.* class FileAssociationViewModel(application: Application) : BaseAssociationViewModel(application) { val importBookLiveData = MutableLiveData() val onLineImportLive = MutableLiveData() - val openBookLiveData = MutableLiveData() + val openBookLiveData = MutableLiveData() val notSupportedLiveData = MutableLiveData>() fun dispatchIntent(uri: Uri) { @@ -60,6 +61,6 @@ class FileAssociationViewModel(application: Application) : BaseAssociationViewMo fun importBook(uri: Uri) { val book = LocalBook.importFile(uri) - openBookLiveData.postValue(book.bookUrl) + openBookLiveData.postValue(book) } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt index 747ccd744570..bab16cdab382 100644 --- a/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/audio/AudioPlayActivity.kt @@ -31,6 +31,7 @@ import io.legado.app.model.BookCover import io.legado.app.service.AudioPlayService import io.legado.app.ui.about.AppLogDialog import io.legado.app.ui.book.changesource.ChangeBookSourceDialog +import io.legado.app.ui.book.manga.ReadMangaActivity import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.book.source.edit.BookSourceEditActivity import io.legado.app.ui.book.toc.TocActivityResult @@ -45,6 +46,7 @@ import io.legado.app.utils.observeEventSticky import io.legado.app.utils.sendToClip import io.legado.app.utils.showDialogFragment import io.legado.app.utils.startActivity +import io.legado.app.utils.startReadOrMangaActivity import io.legado.app.utils.viewbindingdelegate.viewBinding import io.legado.app.utils.visible import kotlinx.coroutines.Dispatchers.IO @@ -218,7 +220,7 @@ class AudioPlayActivity : AudioPlay.book?.delete() appDb.bookDao.insert(book) } - startActivity { + startReadOrMangaActivity(book) { putExtra("bookUrl", book.bookUrl) } finish() diff --git a/app/src/main/java/io/legado/app/ui/book/import/BaseImportBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/import/BaseImportBookActivity.kt index aec1cf32114a..d61d298d693e 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/BaseImportBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/BaseImportBookActivity.kt @@ -2,19 +2,20 @@ package io.legado.app.ui.book.import import android.os.Bundle import android.view.MotionEvent -import android.widget.EditText import androidx.appcompat.widget.SearchView import androidx.lifecycle.ViewModel import io.legado.app.R import io.legado.app.base.VMBaseActivity import io.legado.app.constant.AppPattern import io.legado.app.data.appDb +import io.legado.app.data.entities.Book import io.legado.app.databinding.ActivityImportBookBinding import io.legado.app.help.config.AppConfig import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.selector import io.legado.app.lib.theme.primaryTextColor import io.legado.app.model.localBook.LocalBook +import io.legado.app.ui.book.manga.ReadMangaActivity import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.file.HandleFileContract import io.legado.app.utils.ArchiveUtils @@ -22,7 +23,7 @@ import io.legado.app.utils.FileDoc import io.legado.app.utils.applyTint import io.legado.app.utils.hideSoftInput import io.legado.app.utils.shouldHideSoftInput -import io.legado.app.utils.startActivity +import io.legado.app.utils.startReadOrMangaActivity import io.legado.app.utils.toastOnUi import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlin.coroutines.resume @@ -97,9 +98,9 @@ abstract class BaseImportBookActivity : VMBaseActivity { - putExtra("bookUrl", bookUrl) + protected fun startReadBook(book: Book) { + startReadOrMangaActivity(book) { + putExtra("bookUrl", book.bookUrl) } } @@ -110,7 +111,7 @@ abstract class BaseImportBookActivity : VMBaseActivity : VMBaseActivity appDb.bookDao.getBookByFileName(name)?.let { - startReadBook(it.bookUrl) + startReadBook(it) } ?: showImportAlert(fileDoc, name) } } @@ -136,12 +137,12 @@ abstract class BaseImportBookActivity : VMBaseActivity Unit + onSuccess: (Book) -> Unit ) { LocalBook.importArchiveFile(fileDoc.uri, fileName) { it.contains(fileName) }.firstOrNull()?.run { - onSuccess.invoke(bookUrl) + onSuccess.invoke(this) } } diff --git a/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookActivity.kt index 5eb7c58cdd00..0901d1d0ed84 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/local/ImportBookActivity.kt @@ -304,7 +304,7 @@ class ImportBookActivity : BaseImportBookActivity(), override fun startRead(fileDoc: FileDoc) { if (!ArchiveUtils.isArchive(fileDoc.name)) { appDb.bookDao.getBookByFileName(fileDoc.name)?.let { - startReadBook(it.bookUrl) + startReadBook(it) } } else { onArchiveFileClick(fileDoc) diff --git a/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookActivity.kt index 5951f781392b..5c30c8cd3b23 100644 --- a/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/import/remote/RemoteBookActivity.kt @@ -228,7 +228,7 @@ class RemoteBookActivity : BaseImportBookActivity(), val downloadFileName = remoteBook.filename if (!ArchiveUtils.isArchive(downloadFileName)) { appDb.bookDao.getBookByFileName(downloadFileName)?.let { - startReadBook(it.bookUrl) + startReadBook(it) } } else { AppConfig.defaultBookTreeUri ?: return diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt index 6c968978b887..98c33a4a960b 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoActivity.kt @@ -27,6 +27,7 @@ import io.legado.app.help.AppWebDav import io.legado.app.help.book.addType import io.legado.app.help.book.getRemoteUrl import io.legado.app.help.book.isAudio +import io.legado.app.help.book.isImage import io.legado.app.help.book.isLocal import io.legado.app.help.book.isLocalTxt import io.legado.app.help.book.isWebFile @@ -47,6 +48,7 @@ import io.legado.app.ui.book.changecover.ChangeCoverDialog import io.legado.app.ui.book.changesource.ChangeBookSourceDialog import io.legado.app.ui.book.group.GroupSelectDialog import io.legado.app.ui.book.info.edit.BookInfoEditActivity +import io.legado.app.ui.book.manga.ReadMangaActivity import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.book.read.ReadBookActivity.Companion.RESULT_DELETED import io.legado.app.ui.book.search.SearchActivity @@ -310,7 +312,7 @@ class BookInfoActivity : private fun upLoadBook( book: Book, - bookWebDav: RemoteBookWebDav? = AppWebDav.defaultBookWebDav + bookWebDav: RemoteBookWebDav? = AppWebDav.defaultBookWebDav, ) { lifecycleScope.launch { waitDialog.setText("上传中.....") @@ -604,7 +606,7 @@ class BookInfoActivity : } private fun showWebFileDownloadAlert( - onClick: ((Book) -> Unit)? = null + onClick: ((Book) -> Unit)? = null, ) { val webFiles = viewModel.webFiles if (webFiles.isEmpty()) { @@ -653,7 +655,7 @@ class BookInfoActivity : private fun showDecompressFileImportAlert( archiveFileUri: Uri, fileNames: List, - success: ((Book) -> Unit)? = null + success: ((Book) -> Unit)? = null, ) { if (fileNames.isEmpty()) { toastOnUi(R.string.unsupport_archivefile_entry) @@ -693,7 +695,10 @@ class BookInfoActivity : ) else -> readBookResult.launch( - Intent(this, ReadBookActivity::class.java) + Intent( + this, + if (book.isImage&&AppConfig.showMangaUi) ReadMangaActivity::class.java else ReadBookActivity::class.java + ) .putExtra("bookUrl", book.bookUrl) .putExtra("inBookshelf", viewModel.inBookshelf) .putExtra("tocChanged", tocChanged) diff --git a/app/src/main/java/io/legado/app/ui/book/manga/MangaViewModel.kt b/app/src/main/java/io/legado/app/ui/book/manga/MangaViewModel.kt new file mode 100644 index 000000000000..7c552d1bc302 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/manga/MangaViewModel.kt @@ -0,0 +1,240 @@ +package io.legado.app.ui.book.manga + +import android.app.Application +import android.content.Intent +import io.legado.app.R +import io.legado.app.base.BaseViewModel +import io.legado.app.constant.AppLog +import io.legado.app.constant.BookType +import io.legado.app.constant.EventBus +import io.legado.app.data.appDb +import io.legado.app.data.entities.Book +import io.legado.app.data.entities.BookChapter +import io.legado.app.exception.NoStackTraceException +import io.legado.app.help.book.BookHelp +import io.legado.app.help.book.isLocal +import io.legado.app.help.book.isLocalModified +import io.legado.app.help.book.removeType +import io.legado.app.help.book.simulatedTotalChapterNum +import io.legado.app.help.config.AppConfig +import io.legado.app.help.coroutine.Coroutine +import io.legado.app.model.ReadMange +import io.legado.app.model.localBook.LocalBook +import io.legado.app.model.webBook.WebBook +import io.legado.app.utils.mapParallelSafe +import io.legado.app.utils.postEvent +import io.legado.app.utils.toastOnUi +import kotlinx.coroutines.flow.catch +import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.onEmpty +import kotlinx.coroutines.flow.onStart +import kotlinx.coroutines.flow.take + +class MangaViewModel(application: Application) : BaseViewModel(application) { + + private var changeSourceCoroutine: Coroutine<*>? = null + + /** + * 初始化 + */ + fun initData(intent: Intent, success: (() -> Unit)? = null) { + execute { + ReadMange.inBookshelf = intent.getBooleanExtra("inBookshelf", true) + ReadMange.tocChanged = intent.getBooleanExtra("tocChanged", false) + val bookUrl = intent.getStringExtra("bookUrl") + val book = when { + bookUrl.isNullOrEmpty() -> appDb.bookDao.lastReadBook + else -> appDb.bookDao.getBook(bookUrl) + } ?: ReadMange.book + when { + book != null -> initMange(book) + else -> context.getString(R.string.no_book)//没有找到书 + } + }.onSuccess { + success?.invoke() + }.onError { + val msg = "初始化数据失败\n${it.localizedMessage}" + AppLog.put(msg, it) + }.onFinally { + ReadMange.saveRead() + } + } + + private suspend fun initMange(book: Book) { + val isSameBook = ReadMange.book?.bookUrl == book.bookUrl + if (isSameBook) { + ReadMange.upData(book) + } else { + ReadMange.resetData(book) + } + if (!book.isLocal && book.tocUrl.isEmpty() && !loadBookInfo(book)) { + return + } + + if (book.isLocal && !checkLocalBookFileExist(book)) { + return + } + + if ((ReadMange.durChapterPageCount == 0 || book.isLocalModified()) && !loadChapterListAwait( + book + ) + ) { + return + } + ensureChapterExist() + + //开始加载内容 + ReadMange.loadContent() + + //自动换源 + if (!book.isLocal && ReadMange.bookSource == null) { + autoChangeSource(book.name, book.author) + return + } + } + + private suspend fun loadChapterListAwait(book: Book): Boolean { + ReadMange.bookSource?.let { + val oldBook = book.copy() + WebBook.getChapterListAwait(it, book, true).onSuccess { cList -> + if (oldBook.bookUrl == book.bookUrl) { + appDb.bookDao.update(book) + } else { + appDb.bookDao.insert(book) + BookHelp.updateCacheFolder(oldBook, book) + } + appDb.bookChapterDao.delByBook(oldBook.bookUrl) + appDb.bookChapterDao.insert(*cList.toTypedArray()) + ReadMange.durChapterPageCount = cList.size + ReadMange.simulatedChapterSize = book.simulatedTotalChapterNum() + return true + }.onFailure { + //加载章节出错 + ReadMange.mCallback?.loadFail("加载目录失败") + return false + } + } + + return true + + } + + /** + * 加载详情页 + */ + private suspend fun loadBookInfo(book: Book): Boolean { + val source = ReadMange.bookSource ?: return true + try { + WebBook.getBookInfoAwait(source, book, canReName = false) + return true + } catch (e: Throwable) { + // 加载详情页失败 +// ReadBook.upMsg("详情页出错: ${e.localizedMessage}") + return false + } + } + + private fun ensureChapterExist() { + if (ReadMange.simulatedChapterSize > 0 && ReadMange.durChapterPagePos > ReadMange.simulatedChapterSize - 1) { + ReadMange.durChapterPagePos = ReadMange.simulatedChapterSize - 1 + } + } + + /** + * 自动换源 + */ + private fun autoChangeSource(name: String, author: String) { + if (!AppConfig.autoChangeSource) return + execute { + val sources = appDb.bookSourceDao.allTextEnabledPart + flow { + for (source in sources) { + source.getBookSource()?.let { + emit(it) + } + } + }.onStart { + // 自动换源 + + }.mapParallelSafe(AppConfig.threadCount) { source -> + val book = WebBook.preciseSearchAwait(this, source, name, author).getOrThrow() + if (book.tocUrl.isEmpty()) { + WebBook.getBookInfoAwait(source, book) + } + val toc = WebBook.getChapterListAwait(source, book).getOrThrow() + val chapter = toc.getOrElse(book.durChapterIndex) { + toc.last() + } + val nextChapter = toc.getOrElse(chapter.index) { + toc.first() + } + WebBook.getContentAwait( + bookSource = source, + book = book, + bookChapter = chapter, + nextChapterUrl = nextChapter.url + ) + book to toc + }.take(1).onEach { (book, toc) -> + changeTo(book, toc) + }.onEmpty { + throw NoStackTraceException("没有合适书源") + }.onCompletion { + // 换源完成 + }.catch { + AppLog.put("自动换源失败\n${it.localizedMessage}", it) + context.toastOnUi("自动换源失败\n${it.localizedMessage}") + }.collect() + } + } + + /** + * 换源 + */ + fun changeTo(book: Book, toc: List) { + changeSourceCoroutine?.cancel() + changeSourceCoroutine = execute { + //换源中 + ReadMange.book?.migrateTo(book, toc) + book.removeType(BookType.updateError) + ReadMange.book?.delete() + appDb.bookDao.insert(book) + appDb.bookChapterDao.insert(*toc.toTypedArray()) + ReadMange.resetData(book) + toc.find { it.title.contains(ReadMange.chapterTitle) }?.run { + ReadMange.loadContent(index) + } ?: ReadMange.loadContent() + }.onError { + AppLog.put("换源失败\n$it", it, true) + }.onFinally { + postEvent(EventBus.SOURCE_CHANGED, book.bookUrl) + } + } + + private fun checkLocalBookFileExist(book: Book): Boolean { + try { + LocalBook.getBookInputStream(book) + return true + } catch (e: Throwable) { + return false + } + } + + fun openChapter(index: Int, durChapterPos: Int = 0) { + if (index < ReadMange.durChapterPageCount) { + ReadMange.chapterChanged = true + ReadMange.durChapterPagePos = index + ReadMange.durChapterPos = durChapterPos + ReadMange.saveRead() + ReadMange.loadContent(index) + } + } + + override fun onCleared() { + super.onCleared() + changeSourceCoroutine?.cancel() + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt b/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt new file mode 100644 index 000000000000..660ab693ffaa --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/manga/ReadMangaActivity.kt @@ -0,0 +1,483 @@ +package io.legado.app.ui.book.manga + +import android.annotation.SuppressLint +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.os.Looper +import android.view.KeyEvent +import android.view.Menu +import android.view.MenuItem +import android.view.View +import android.view.WindowInsets +import androidx.activity.viewModels +import androidx.appcompat.app.AlertDialog +import androidx.core.view.WindowInsetsControllerCompat +import androidx.core.view.isGone +import androidx.core.view.isVisible +import androidx.recyclerview.widget.LinearLayoutManager +import com.bumptech.glide.Glide +import com.bumptech.glide.integration.recyclerview.RecyclerViewPreloader +import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL +import com.bumptech.glide.util.FixedPreloadSizeProvider +import io.legado.app.BuildConfig +import io.legado.app.R +import io.legado.app.base.VMBaseActivity +import io.legado.app.data.entities.Book +import io.legado.app.data.entities.BookChapter +import io.legado.app.data.entities.BookProgress +import io.legado.app.data.entities.BookSource +import io.legado.app.databinding.ActivityMangeBinding +import io.legado.app.databinding.ViewLoadMoreBinding +import io.legado.app.help.book.isImage +import io.legado.app.help.config.AppConfig +import io.legado.app.help.config.ReadBookConfig +import io.legado.app.help.storage.Backup +import io.legado.app.lib.dialogs.alert +import io.legado.app.lib.theme.ThemeStore +import io.legado.app.model.ReadMange +import io.legado.app.model.ReadMange.mFirstLoading +import io.legado.app.model.recyclerView.MangeContent +import io.legado.app.model.recyclerView.ReaderLoading +import io.legado.app.receiver.NetworkChangedListener +import io.legado.app.ui.book.changesource.ChangeBookSourceDialog +import io.legado.app.ui.book.info.BookInfoActivity +import io.legado.app.ui.book.manga.rv.MangaAdapter +import io.legado.app.ui.book.read.MangaMenu +import io.legado.app.ui.book.read.ReadBookActivity.Companion.RESULT_DELETED +import io.legado.app.ui.book.toc.TocActivityResult +import io.legado.app.ui.widget.recycler.LoadMoreView +import io.legado.app.utils.ColorUtils +import io.legado.app.utils.NetworkUtils +import io.legado.app.utils.StartActivityContract +import io.legado.app.utils.getCompatColor +import io.legado.app.utils.gone +import io.legado.app.utils.immersionFullScreen +import io.legado.app.utils.printOnDebug +import io.legado.app.utils.setLightStatusBar +import io.legado.app.utils.setNavigationBarColorAuto +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.toastOnUi +import io.legado.app.utils.viewbindingdelegate.viewBinding +import io.legado.app.utils.visible + +class ReadMangaActivity : VMBaseActivity(), + ReadMange.Callback, ChangeBookSourceDialog.CallBack, MangaMenu.CallBack { + + private val menuLayoutIsVisible get() = binding.mangaMenu.isVisible + + private val mLayoutManager by lazy { + LinearLayoutManager(this@ReadMangaActivity) + } + private val mAdapter: MangaAdapter by lazy { + MangaAdapter(this@ReadMangaActivity) + } + private val mSizeProvider by lazy { + FixedPreloadSizeProvider( + this@ReadMangaActivity.resources.displayMetrics.widthPixels, + SIZE_ORIGINAL + ) + } + + private val mRecyclerViewPreloader by lazy { + RecyclerViewPreloader(Glide.with(this), mAdapter, mSizeProvider, 10) + } + + private val networkChangedListener by lazy { + NetworkChangedListener(this) + } + + private var justInitData: Boolean = false + private var syncDialog: AlertDialog? = null + + private val loadMoreView by lazy { + LoadMoreView(this).apply { + setBackgroundColor(getCompatColor(R.color.book_ant_10)) + getLoading().loadingColor = getCompatColor(R.color.white) + getLoadingText().setTextColor(getCompatColor(R.color.white)) + } + } + + //打开目录返回选择章节返回结果 + private val tocActivity = + registerForActivityResult(TocActivityResult()) { + it?.let { + binding.flLoading.isVisible = true + viewModel.openChapter(it.first, it.second) + } + } + private val bookInfoActivity = + registerForActivityResult(StartActivityContract(BookInfoActivity::class.java)) { + if (it.resultCode == RESULT_OK) { + setResult(RESULT_DELETED) + super.finish() + } + } + override val binding by viewBinding(ActivityMangeBinding::inflate) + override val viewModel by viewModels() + + override fun onActivityCreated(savedInstanceState: Bundle?) { + immersionFullScreen(WindowInsetsControllerCompat(window, binding.root)) + ReadMange.register(this) + binding.mRecyclerMange.run { + adapter = mAdapter + itemAnimator = null + layoutManager = mLayoutManager + setHasFixedSize(true) + mLayoutManager.initialPrefetchItemCount = 4 + mLayoutManager.isItemPrefetchEnabled = true + setItemViewCacheSize(AppConfig.preDownloadNum) + setPreScrollListener { _, _, dy, position -> + if (dy > 0 && position + 2 > mAdapter.getCurrentList().size - 3) { + if (mAdapter.getCurrentList().last() is ReaderLoading) { + val nextIndex = + (mAdapter.getCurrentList().last() as ReaderLoading).mNextChapterIndex + if (nextIndex != -1) { + scrollToBottom(false, nextIndex) + } + } + } + } + setNestedPreScrollListener { _, _, _, position -> + if (mAdapter.getCurrentList() + .isNotEmpty() && position <= mAdapter.getCurrentList().lastIndex + ) { + try { + val content = mAdapter.getCurrentList()[position] + if (content is MangeContent) { + ReadMange.durChapterPos = content.mDurChapterPos.minus(1) + upText( + content.mChapterPagePos, + content.mChapterPageCount, + content.mDurChapterPos, + content.mDurChapterCount + ) + } + } catch (e: Exception) { + e.printOnDebug() + } + + } + } + addOnScrollListener(mRecyclerViewPreloader) + onToucheMiddle { + if (!binding.mangaMenu.isVisible) { + binding.mangaMenu.runMenuIn() + } + } + } + binding.retry.setOnClickListener { + binding.llLoading.isVisible = true + binding.llRetry.isGone = true + mFirstLoading = false + ReadMange.loadContent() + } + + mAdapter.addFooterView { + ViewLoadMoreBinding.bind(loadMoreView) + } + loadMoreView.setOnClickListener { + if (!loadMoreView.isLoading && !ReadMange.gameOver) { + scrollToBottom(true, ReadMange.durChapterPagePos) + } + } + loadMoreView.gone() + } + + override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) + viewModel.initData(intent) + } + + private fun scrollToBottom(forceLoad: Boolean = false, index: Int) { + if ((loadMoreView.hasMore && !loadMoreView.isLoading) && !ReadMange.gameOver || forceLoad) { + loadMoreView.hasMore() + ReadMange.moveToNextChapter(index) + } + } + + override fun onPostCreate(savedInstanceState: Bundle?) { + super.onPostCreate(savedInstanceState) + Looper.myQueue().addIdleHandler { + viewModel.initData(intent) + false + } + justInitData = true + } + + override fun loadContentFinish(list: MutableList) { + if (!this.isDestroyed) { + mAdapter.submitList(list) { + if (!mFirstLoading) { + if (list.size > 1) { + binding.infobar.isVisible = true + upText( + ReadMange.durChapterPagePos, + ReadMange.durChapterPageCount, + ReadMange.durChapterPos, + ReadMange.durChapterCount + ) + } + + if (ReadMange.durChapterPos + 2 > mAdapter.getCurrentList().size - 3) { + val nextIndex = + (mAdapter.getCurrentList().last() as ReaderLoading).mNextChapterIndex + scrollToBottom(index = nextIndex) + } else { + binding.mRecyclerMange.scrollToPosition(ReadMange.durChapterPos) + } + } + + if (ReadMange.chapterChanged) { + binding.mRecyclerMange.scrollToPosition(ReadMange.durChapterPos) + } + + ReadMange.chapterChanged = false + loadMoreView.visible() + mFirstLoading = true + loadMoreView.stopLoad() + } + } + } + + private fun upText( + chapterPagePos: Int, chapterPageCount: Int, chapterPos: Int, chapterCount: Int, + ) { + binding.infobar.update( + chapterPagePos, + chapterPageCount, + chapterPagePos.minus(1f).div(chapterPageCount.minus(1f)), + chapterPos, + chapterCount + ) + } + + override fun onResume() { + super.onResume() + networkChangedListener.register() + networkChangedListener.onNetworkChanged = { + // 当网络是可用状态且无需初始化时同步进度(初始化中已有同步进度逻辑) + if (AppConfig.syncBookProgressPlus && NetworkUtils.isAvailable()&&!justInitData) { + ReadMange.syncProgress({ progress -> sureNewProgress(progress) }) + } + } + } + + override fun onPause() { + super.onPause() + if (ReadMange.inBookshelf) { + ReadMange.saveRead() + if (!BuildConfig.DEBUG) { + if (AppConfig.syncBookProgressPlus) { + ReadMange.syncProgress() + } else { + ReadMange.uploadProgress() + } + Backup.autoBack(this) + } + } + networkChangedListener.unRegister() + } + + override fun loadComplete() { + binding.flLoading.isGone = true + } + + override fun loadFail(msg: String) { + if (!mFirstLoading || ReadMange.chapterChanged) { + binding.llLoading.isGone = true + binding.llRetry.isVisible = true + binding.tvMsg.text = msg + } else { + loadMoreView.error(null, "加载失败,点击重试") + } + } + + override fun noData() { + loadMoreView.noMore("暂无章节了!") + } + + override fun adjustmentProgress() { + if (ReadMange.chapterChanged) { + binding.mRecyclerMange.scrollToPosition(ReadMange.durChapterPos) + binding.flLoading.isGone = true + } + } + + override val chapterList: MutableList + get() = mAdapter.getCurrentList() + + override fun onDestroy() { + ReadMange.unregister() + super.onDestroy() + } + + override fun onLowMemory() { + super.onLowMemory() + Glide.get(this).clearMemory() + } + + override fun sureNewProgress(progress: BookProgress) { + syncDialog?.dismiss() + syncDialog = alert(R.string.get_book_progress) { + setMessage(R.string.cloud_progress_exceeds_current) + okButton { + binding.flLoading.isVisible = true + ReadMange.setProgress(progress) + } + noButton() + } + } + + override val oldBook: Book? + get() = ReadMange.book + + override fun changeTo(source: BookSource, book: Book, toc: List) { + if (book.isImage) { + binding.flLoading.isVisible = true + ReadMange.chapterChanged = true + viewModel.changeTo(book, toc) + } else { + toastOnUi("所选择的源不是漫画源") + } + } + + + override fun onCompatCreateOptionsMenu(menu: Menu): Boolean { + menuInflater.inflate(R.menu.book_manga, menu) + return super.onCompatCreateOptionsMenu(menu) + } + + /** + * 菜单 + */ + override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.menu_change_source -> { + binding.mangaMenu.runMenuOut() + ReadMange.book?.let { + showDialogFragment(ChangeBookSourceDialog(it.name, it.author)) + } + } + + R.id.menu_catalog -> { + ReadMange.book?.let { + tocActivity.launch(it.bookUrl) + } + } + } + return super.onCompatOptionsItemSelected(item) + } + + override fun upNavigationBarColor() { + when { + binding.mangaMenu.isVisible -> super.upNavigationBarColor() + !AppConfig.immNavigationBar -> super.upNavigationBarColor() + else -> setNavigationBarColorAuto(ReadBookConfig.bgMeanColor) + } + } + + @SuppressLint("RtlHardcoded") + private fun upNavigationBar(value: Boolean) { + binding.mangaMenu.isVisible = value + } + + override fun openBookInfoActivity() { + ReadMange.book?.let { + bookInfoActivity.launch { + putExtra("name", it.name) + putExtra("author", it.author) + } + } + } + + override fun upSystemUiVisibility(value: Boolean) { + upSystemUiVisibility(isInMultiWindow, !menuLayoutIsVisible, false) + upNavigationBarColor() + upNavigationBar(value) + if (!value) { + immersionFullScreen(WindowInsetsControllerCompat(window, binding.root)) + } + } + + /** + * 更新状态栏,导航栏 + */ + fun upSystemUiVisibility( + isInMultiWindow: Boolean, + toolBarHide: Boolean = true, + useBgMeanColor: Boolean = false, + ) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + window.insetsController?.run { + if (toolBarHide && ReadBookConfig.hideNavigationBar) { + hide(WindowInsets.Type.navigationBars()) + } else { + show(WindowInsets.Type.navigationBars()) + } + if (toolBarHide && ReadBookConfig.hideStatusBar) { + hide(WindowInsets.Type.statusBars()) + } else { + show(WindowInsets.Type.statusBars()) + } + } + } + upSystemUiVisibilityO(isInMultiWindow, toolBarHide) + if (toolBarHide) { + setLightStatusBar(ReadBookConfig.durConfig.curStatusIconDark()) + } else { + val statusBarColor = + if (AppConfig.readBarStyleFollowPage + && ReadBookConfig.durConfig.curBgType() == 0 + || useBgMeanColor + ) { + ReadBookConfig.bgMeanColor + } else { + ThemeStore.statusBarColor(this, AppConfig.isTransparentStatusBar) + } + setLightStatusBar(ColorUtils.isColorLight(statusBarColor)) + } + } + + @Suppress("DEPRECATION") + private fun upSystemUiVisibilityO( + isInMultiWindow: Boolean, + toolBarHide: Boolean = true, + ) { + var flag = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE + or View.SYSTEM_UI_FLAG_IMMERSIVE + or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) + if (!isInMultiWindow) { + flag = flag or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + } + if (ReadBookConfig.hideNavigationBar) { + flag = flag or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + if (toolBarHide) { + flag = flag or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + } + } + if (ReadBookConfig.hideStatusBar && toolBarHide) { + flag = flag or View.SYSTEM_UI_FLAG_FULLSCREEN + } + window.decorView.systemUiVisibility = flag + } + + override fun dispatchKeyEvent(event: KeyEvent): Boolean { + val keyCode = event.keyCode + val action = event.action + val isDown = action == 0 + + if (keyCode == KeyEvent.KEYCODE_MENU) { + if (isDown && !binding.mangaMenu.canShowMenu) { + binding.mangaMenu.runMenuIn() + return true + } + if (!isDown && !binding.mangaMenu.canShowMenu) { + binding.mangaMenu.canShowMenu = true + return true + } + } + return super.dispatchKeyEvent(event) + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/manga/rv/GestureDetectorWithLongTap.kt b/app/src/main/java/io/legado/app/ui/book/manga/rv/GestureDetectorWithLongTap.kt new file mode 100644 index 000000000000..cc5397d47198 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/manga/rv/GestureDetectorWithLongTap.kt @@ -0,0 +1,64 @@ +package io.legado.app.ui.book.manga.rv + +import android.content.Context +import android.os.Handler +import android.os.Looper +import android.view.GestureDetector +import android.view.MotionEvent +import android.view.ViewConfiguration +import kotlin.math.abs + +open class GestureDetectorWithLongTap( + context: Context, + listener: Listener, +) : GestureDetector(context, listener) { + + private val handler = Handler(Looper.getMainLooper()) + private val slop = ViewConfiguration.get(context).scaledTouchSlop + private val longTapTime = ViewConfiguration.getLongPressTimeout().toLong() + private val doubleTapTime = ViewConfiguration.getDoubleTapTimeout().toLong() + + private var downX = 0f + private var downY = 0f + private var lastUp = 0L + private var lastDownEvent: MotionEvent? = null + + + private val longTapFn = Runnable { listener.onLongTapConfirmed(lastDownEvent!!) } + + override fun onTouchEvent(ev: MotionEvent): Boolean { + when (ev.actionMasked) { + MotionEvent.ACTION_DOWN -> { + lastDownEvent?.recycle() + lastDownEvent = MotionEvent.obtain(ev) + + if (ev.downTime - lastUp > doubleTapTime) { + downX = ev.rawX + downY = ev.rawY + handler.postDelayed(longTapFn, longTapTime) + } + } + + MotionEvent.ACTION_MOVE -> { + if (abs(ev.rawX - downX) > slop || abs(ev.rawY - downY) > slop) { + handler.removeCallbacks(longTapFn) + } + } + + MotionEvent.ACTION_UP -> { + lastUp = ev.eventTime + handler.removeCallbacks(longTapFn) + } + + MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_POINTER_DOWN -> { + handler.removeCallbacks(longTapFn) + } + } + return super.onTouchEvent(ev) + } + + open class Listener : SimpleOnGestureListener() { + open fun onLongTapConfirmed(ev: MotionEvent) { + } + } +} diff --git a/app/src/main/java/io/legado/app/ui/book/manga/rv/MangaAdapter.kt b/app/src/main/java/io/legado/app/ui/book/manga/rv/MangaAdapter.kt new file mode 100644 index 000000000000..feee936d7c98 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/manga/rv/MangaAdapter.kt @@ -0,0 +1,230 @@ +package io.legado.app.ui.book.manga.rv + +import android.content.Context +import android.util.SparseArray +import android.view.LayoutInflater +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.MATCH_PARENT +import androidx.annotation.IntRange +import androidx.core.view.updateLayoutParams +import androidx.recyclerview.widget.AsyncListDiffer +import androidx.recyclerview.widget.DiffUtil +import androidx.recyclerview.widget.RecyclerView +import androidx.viewbinding.ViewBinding +import com.bumptech.glide.Glide +import com.bumptech.glide.ListPreloader.PreloadModelProvider +import com.bumptech.glide.RequestBuilder +import com.github.panpf.zoomimage.zoom.GestureType +import io.legado.app.R +import io.legado.app.base.adapter.ItemViewHolder +import io.legado.app.base.adapter.RecyclerAdapter.Companion.TYPE_FOOTER_VIEW +import io.legado.app.databinding.BookComicLoadingRvBinding +import io.legado.app.databinding.BookComicRvBinding +import io.legado.app.help.glide.progress.ProgressManager +import io.legado.app.model.BookCover +import io.legado.app.model.ReadMange +import io.legado.app.model.recyclerView.MangaVH +import io.legado.app.model.recyclerView.MangeContent +import io.legado.app.model.recyclerView.ReaderLoading +import io.legado.app.utils.getCompatDrawable +import java.util.Collections + + +class MangaAdapter(private val context: Context) : + RecyclerView.Adapter(), PreloadModelProvider { + + companion object { + private const val LOADING_VIEW = 0 + private const val CONTENT_VIEW = 1 + } + + private val mDiffCallback: DiffUtil.ItemCallback = object : DiffUtil.ItemCallback() { + override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean { + return if (oldItem is ReaderLoading && newItem is ReaderLoading) { + newItem.mMessage == oldItem.mMessage + } else if (oldItem is MangeContent && newItem is MangeContent) { + oldItem.mImageUrl == newItem.mImageUrl + } else false + } + + override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean { + return if (oldItem is ReaderLoading && newItem is ReaderLoading) { + oldItem == newItem + } else if (oldItem is MangeContent && newItem is MangeContent) { + oldItem == newItem + } else false + } + } + + private val mDiffer = AsyncListDiffer(this, mDiffCallback) + + private fun getItem(@IntRange(from = 0) position: Int) = mDiffer.currentList[position] + + fun getCurrentList() = mDiffer.currentList + + //全部替换数据 + fun submitList(contents: MutableList, runnable: Runnable) { + val currentList = mDiffer.currentList.toMutableList() + currentList.addAll(contents) + if (ReadMange.chapterChanged) { + mDiffer.submitList(contents) { + runnable.run() + } + } else { + mDiffer.submitList(currentList) { + runnable.run() + } + } + + } + + inner class PageViewHolder(binding: BookComicRvBinding) : + MangaVH(binding, context) { + + init { + initComponent( + binding.loading, + binding.image, + binding.progress, + binding.retry, + binding.flProgress + ) + binding.image.zoomable.disabledGestureTypesState.value = + GestureType.DOUBLE_TAP_SCALE or GestureType.ONE_FINGER_SCALE or + GestureType.TWO_FINGER_SCALE or GestureType.KEYBOARD_DRAG or + GestureType.ONE_FINGER_DRAG or GestureType.KEYBOARD_SCALE or GestureType.MOUSE_WHEEL_SCALE + binding.retry.setOnClickListener { + val item = mDiffer.currentList[layoutPosition] + if (item is MangeContent) { + loadImageWithRetry(item.mImageUrl) + } + } + } + + fun onBind(item: MangeContent) { + loadImageWithRetry(item.mImageUrl) + } + } + + inner class PageMoreViewHolder(val binding: BookComicLoadingRvBinding) : + RecyclerView.ViewHolder(binding.root) { + fun onBind(item: ReaderLoading) { + val message = item.mMessage + binding.text.text = message + } + } + + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + + return when { + + viewType >= TYPE_FOOTER_VIEW -> { + ItemViewHolder(footerItems.get(viewType).invoke(parent)) + } + + viewType == LOADING_VIEW -> PageMoreViewHolder( + BookComicLoadingRvBinding.inflate( + LayoutInflater.from( + parent.context + ), parent, false + ) + ) + + viewType == CONTENT_VIEW -> PageViewHolder( + BookComicRvBinding.inflate( + LayoutInflater.from(parent.context), + parent, + false + ) + ) + + + else -> error("Unknown view type!") + } + } + + override fun getItemCount(): Int = getActualItemCount() + getFooterCount() + + override fun getItemViewType(position: Int): Int { + return when { + isFooter(position) -> TYPE_FOOTER_VIEW + position - getActualItemCount() + getItem(position) is MangeContent -> CONTENT_VIEW + getItem(position) is ReaderLoading -> LOADING_VIEW + else -> error("Unknown view type!") + } + } + + fun getFooterCount() = footerItems.size() + + private fun isFooter(position: Int) = position >= getActualItemCount() + + override fun onViewRecycled(vh: RecyclerView.ViewHolder) { + super.onViewRecycled(vh) + when (vh) { + is PageViewHolder -> { + vh.itemView.updateLayoutParams { + height = MATCH_PARENT + } + Glide.with(context).clear(vh.binding.image) + if (vh.binding.image.tag is String) { + ProgressManager.removeListener(vh.binding.image.tag as String) + } + } + } + } + + override fun onBindViewHolder(vh: RecyclerView.ViewHolder, position: Int) { + when (vh) { + is PageViewHolder -> vh.onBind(getItem(position) as MangeContent) + is PageMoreViewHolder -> vh.onBind(getItem(position) as ReaderLoading) + } + } + + + private val footerItems: SparseArray<(parent: ViewGroup) -> ViewBinding> by lazy { SparseArray() } + + @Synchronized + fun addFooterView(footer: ((parent: ViewGroup) -> ViewBinding)) { + kotlin.runCatching { + val index = getActualItemCount() + footerItems.size() + footerItems.put(TYPE_FOOTER_VIEW + footerItems.size(), footer) + notifyItemInserted(index) + } + } + + /** + * 除去header和footer + */ + fun getActualItemCount() = getCurrentList().size + + @Synchronized + fun removeFooterView(footer: ((parent: ViewGroup) -> ViewBinding)) { + kotlin.runCatching { + val index = footerItems.indexOfValue(footer) + if (index >= 0) { + footerItems.remove(index) + notifyItemRemoved(getActualItemCount() + index - 2) + } + } + } + + override fun getPreloadItems(position: Int): MutableList { + if (getCurrentList().isEmpty()) return Collections.emptyList() + if (position >= getCurrentList().size) return Collections.emptyList() + return getCurrentList().subList(position, position + 1) + } + + override fun getPreloadRequestBuilder(item: Any): RequestBuilder<*>? { + if (item is MangeContent) { + return BookCover.loadManga( + context, + item.mImageUrl, + sourceOrigin = ReadMange.book?.origin, + manga = true, + useDefaultCover = context.getCompatDrawable(R.color.book_ant_10) + ) + } + return null + } +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonFrame.kt b/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonFrame.kt new file mode 100644 index 000000000000..276425149eff --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonFrame.kt @@ -0,0 +1,85 @@ +package io.legado.app.ui.book.manga.rv + +import android.content.Context +import android.graphics.Rect +import android.util.AttributeSet +import android.view.GestureDetector +import android.view.MotionEvent +import android.view.ScaleGestureDetector +import android.widget.FrameLayout +import io.legado.app.help.config.AppConfig + +class WebtoonFrame : FrameLayout { + + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( + context, + attrs, + defStyle + ) + + private val scaleDetector = ScaleGestureDetector(context, ScaleListener()) + private val flingDetector = GestureDetector(context, FlingListener()) + + var doubleTapZoom = true + set(value) { + field = value + recycler?.doubleTapZoom = value + scaleDetector.isQuickScaleEnabled = value + } + + private val recycler: WebtoonRecyclerView? + get() = getChildAt(0) as? WebtoonRecyclerView + + override fun dispatchTouchEvent(ev: MotionEvent): Boolean { + if (!AppConfig.disableMangaScaling) { + scaleDetector.onTouchEvent(ev) + flingDetector.onTouchEvent(ev) + val recyclerRect = Rect() + recycler?.getHitRect(recyclerRect) ?: return super.dispatchTouchEvent(ev) + recyclerRect.inset(1, 1) + + if (recyclerRect.right < recyclerRect.left || recyclerRect.bottom < recyclerRect.top) { + return super.dispatchTouchEvent(ev) + } + + ev.setLocation( + ev.x.coerceIn(recyclerRect.left.toFloat(), recyclerRect.right.toFloat()), + ev.y.coerceIn(recyclerRect.top.toFloat(), recyclerRect.bottom.toFloat()), + ) + } + return super.dispatchTouchEvent(ev) + } + + inner class ScaleListener : ScaleGestureDetector.SimpleOnScaleGestureListener() { + override fun onScaleBegin(detector: ScaleGestureDetector): Boolean { + recycler?.onScaleBegin() + return true + } + + override fun onScale(detector: ScaleGestureDetector): Boolean { + recycler?.onScale(detector.scaleFactor) + return true + } + + override fun onScaleEnd(detector: ScaleGestureDetector) { + recycler?.onScaleEnd() + } + } + + inner class FlingListener : GestureDetector.SimpleOnGestureListener() { + override fun onDown(e: MotionEvent): Boolean { + return true + } + + override fun onFling( + e1: MotionEvent?, + e2: MotionEvent, + velocityX: Float, + velocityY: Float, + ): Boolean { + return recycler?.zoomFling(velocityX.toInt(), velocityY.toInt()) ?: false + } + } +} diff --git a/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt b/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt new file mode 100644 index 000000000000..c7cac1235152 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/manga/rv/WebtoonRecyclerView.kt @@ -0,0 +1,390 @@ +package io.legado.app.ui.book.manga.rv + +import android.animation.AnimatorSet +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.RectF +import android.util.AttributeSet +import android.view.HapticFeedbackConstants +import android.view.MotionEvent +import android.view.ViewConfiguration +import android.view.animation.DecelerateInterpolator +import androidx.core.animation.doOnEnd +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import io.legado.app.help.config.AppConfig +import io.legado.app.utils.findCenterViewPosition +import kotlin.math.abs + + +class WebtoonRecyclerView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0, +) : RecyclerView(context, attrs, defStyle) { + + private var isZooming = false + private var atLastPosition = false + private var atFirstPosition = false + private var halfWidth = 0 + private var halfHeight = 0 + private var originalHeight = 0 + private var heightSet = false + private var firstVisibleItemPosition = 0 + private var lastVisibleItemPosition = 0 + private var currentScale = DEFAULT_RATE + private var mLastCenterViewPosition = 0 + + private var mPreScrollListener: IComicPreScroll? = null + private var mNestedPreScrollListener: IComicPreScroll? = null + private val listener = GestureListener() + private val detector = Detector() + private val mcRect = RectF() + private var mToucheMiddle: (() -> Unit)? = null + + //起始点 + private var startX: Float = 0f + private var startY: Float = 0f + + var doubleTapZoom = true + + var tapListener: ((MotionEvent) -> Unit)? = null + var longTapListener: ((MotionEvent) -> Boolean)? = null + fun onToucheMiddle(init: () -> Unit) = apply { this.mToucheMiddle = init } + + override fun onMeasure(widthSpec: Int, heightSpec: Int) { + halfWidth = MeasureSpec.getSize(widthSpec) / 2 + halfHeight = MeasureSpec.getSize(heightSpec) / 2 + if (!heightSet) { + originalHeight = MeasureSpec.getSize(heightSpec) + heightSet = true + } + super.onMeasure(widthSpec, heightSpec) + } + + override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { + detector.onTouchEvent(ev!!) + return super.dispatchTouchEvent(ev) + } + + override fun onScrolled(dx: Int, dy: Int) { + super.onScrolled(dx, dy) + val layoutManager = layoutManager + lastVisibleItemPosition = + (layoutManager as LinearLayoutManager).findLastVisibleItemPosition() + firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition() + } + + override fun onScrollStateChanged(state: Int) { + super.onScrollStateChanged(state) + val layoutManager = layoutManager + val visibleItemCount = layoutManager?.childCount ?: 0 + val totalItemCount = layoutManager?.itemCount ?: 0 + atLastPosition = visibleItemCount > 0 && lastVisibleItemPosition == totalItemCount - 1 + atFirstPosition = firstVisibleItemPosition == 0 + } + + override fun dispatchNestedPreScroll( + dx: Int, + dy: Int, + consumed: IntArray?, + offsetInWindow: IntArray?, + type: Int + ): Boolean { + val position = findCenterViewPosition() + if (position != NO_POSITION && position != mLastCenterViewPosition) { + mLastCenterViewPosition = position + mPreScrollListener?.onPreScrollListener(this, dx, dy, position) + } + mNestedPreScrollListener?.onPreScrollListener(this, dx, dy, position) + return super.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow, type) + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + mcRect.set(width * 0.33f, height * 0.33f, width * 0.66f, height * 0.66f) + } + + private fun getPositionX(positionX: Float): Float { + if (currentScale < 1) { + return 0f + } + val maxPositionX = halfWidth * (currentScale - 1) + return positionX.coerceIn(-maxPositionX, maxPositionX) + } + + private fun getPositionY(positionY: Float): Float { + if (currentScale < 1) { + return (originalHeight / 2 - halfHeight).toFloat() + } + val maxPositionY = halfHeight * (currentScale - 1) + return positionY.coerceIn(-maxPositionY, maxPositionY) + } + + private fun zoom( + fromRate: Float, + toRate: Float, + fromX: Float, + toX: Float, + fromY: Float, + toY: Float, + ) { + isZooming = true + val animatorSet = AnimatorSet() + val translationXAnimator = ValueAnimator.ofFloat(fromX, toX) + translationXAnimator.addUpdateListener { animation -> x = animation.animatedValue as Float } + + val translationYAnimator = ValueAnimator.ofFloat(fromY, toY) + translationYAnimator.addUpdateListener { animation -> y = animation.animatedValue as Float } + + val scaleAnimator = ValueAnimator.ofFloat(fromRate, toRate) + scaleAnimator.addUpdateListener { animation -> + currentScale = animation.animatedValue as Float + setScaleRate(currentScale) + } + animatorSet.playTogether(translationXAnimator, translationYAnimator, scaleAnimator) + animatorSet.duration = ANIMATOR_DURATION_TIME.toLong() + animatorSet.interpolator = DecelerateInterpolator() + animatorSet.start() + animatorSet.doOnEnd { + isZooming = false + currentScale = toRate + } + } + + fun zoomFling(velocityX: Int, velocityY: Int): Boolean { + if (currentScale <= 1f) return false + + val distanceTimeFactor = 0.4f + val animatorSet = AnimatorSet() + + if (velocityX != 0) { + val dx = (distanceTimeFactor * velocityX / 2) + val newX = getPositionX(x + dx) + val translationXAnimator = ValueAnimator.ofFloat(x, newX) + translationXAnimator.addUpdateListener { animation -> + x = getPositionX(animation.animatedValue as Float) + } + animatorSet.play(translationXAnimator) + } + if (velocityY != 0 && (atFirstPosition || atLastPosition)) { + val dy = (distanceTimeFactor * velocityY / 2) + val newY = getPositionY(y + dy) + val translationYAnimator = ValueAnimator.ofFloat(y, newY) + translationYAnimator.addUpdateListener { animation -> + y = getPositionY(animation.animatedValue as Float) + } + animatorSet.play(translationYAnimator) + } + + animatorSet.duration = 400 + animatorSet.interpolator = DecelerateInterpolator() + animatorSet.start() + + return true + } + + private fun zoomScrollBy(dx: Int, dy: Int) { + if (dx != 0) { + x = getPositionX(x + dx) + } + if (dy != 0) { + y = getPositionY(y + dy) + } + } + + private fun setScaleRate(rate: Float) { + scaleX = rate + scaleY = rate + } + + fun onScale(scaleFactor: Float) { + currentScale *= scaleFactor + currentScale = currentScale.coerceIn( + MIN_RATE, + MAX_SCALE_RATE, + ) + + setScaleRate(currentScale) + + layoutParams.height = if (currentScale < 1) { + (originalHeight / currentScale).toInt() + } else { + originalHeight + } + halfHeight = layoutParams.height / 2 + + if (currentScale != DEFAULT_RATE) { + x = getPositionX(x) + y = getPositionY(y) + } else { + x = 0f + y = 0f + } + + requestLayout() + } + + fun onScaleBegin() { + if (detector.isDoubleTapping) { + detector.isQuickScaling = true + } + } + + fun onScaleEnd() { + if (scaleX < MIN_RATE) { + zoom(currentScale, MIN_RATE, x, 0f, y, 0f) + } + } + + inner class GestureListener : GestureDetectorWithLongTap.Listener() { + + override fun onSingleTapConfirmed(ev: MotionEvent): Boolean { + if (mcRect.contains(startX, startY)) { + mToucheMiddle?.invoke() + } else { + tapListener?.invoke(ev) + } + return false + } + + override fun onDoubleTap(ev: MotionEvent): Boolean { + detector.isDoubleTapping = true + return false + } + + fun onDoubleTapConfirmed(ev: MotionEvent) { + if (!isZooming && doubleTapZoom) { + if (scaleX != DEFAULT_RATE) { + zoom(currentScale, DEFAULT_RATE, x, 0f, y, 0f) + } else { + val toScale = 2f + val toX = (halfWidth - ev.x) * (toScale - 1) + val toY = (halfHeight - ev.y) * (toScale - 1) + zoom(DEFAULT_RATE, toScale, 0f, toX, 0f, toY) + } + } + } + + override fun onLongTapConfirmed(ev: MotionEvent) { + if (longTapListener?.invoke(ev) == true) { + performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) + } + } + } + + inner class Detector : GestureDetectorWithLongTap(context, listener) { + + private var scrollPointerId = 0 + private var downX = 0 + private var downY = 0 + private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop + private var isZoomDragging = false + var isDoubleTapping = false + var isQuickScaling = false + val disableMangaScaling = AppConfig.disableMangaScaling + override fun onTouchEvent(ev: MotionEvent): Boolean { + val action = ev.actionMasked + val actionIndex = ev.actionIndex + + when (action) { + MotionEvent.ACTION_DOWN -> { + scrollPointerId = ev.getPointerId(0) + val eveX = (ev.x + 0.5f) + val eveY = (ev.y + 0.5f) + downX = eveX.toInt() + downY = eveY.toInt() + startX = eveX + startY = eveY + } + + MotionEvent.ACTION_POINTER_DOWN -> { + scrollPointerId = ev.getPointerId(actionIndex) + downX = (ev.getX(actionIndex) + 0.5f).toInt() + downY = (ev.getY(actionIndex) + 0.5f).toInt() + } + + MotionEvent.ACTION_MOVE -> { + if (disableMangaScaling) { + return false + } + if (isDoubleTapping && isQuickScaling) { + return true + } + + val index = ev.findPointerIndex(scrollPointerId) + if (index < 0) { + return false + } + + val x = (ev.getX(index) + 0.5f).toInt() + val y = (ev.getY(index) + 0.5f).toInt() + var dx = x - downX + var dy = if (atFirstPosition || atLastPosition) y - downY else 0 + + if (!isZoomDragging && currentScale > 1f) { + var startScroll = false + + if (abs(dx) > touchSlop) { + if (dx < 0) { + dx += touchSlop + } else { + dx -= touchSlop + } + startScroll = true + } + if (abs(dy) > touchSlop) { + if (dy < 0) { + dy += touchSlop + } else { + dy -= touchSlop + } + startScroll = true + } + + if (startScroll) { + isZoomDragging = true + } + } + + if (isZoomDragging) { + zoomScrollBy(dx, dy) + } + } + + MotionEvent.ACTION_UP -> { + if (isDoubleTapping && !isQuickScaling && !disableMangaScaling) { + listener.onDoubleTapConfirmed(ev) + } + isZoomDragging = false + isDoubleTapping = false + isQuickScaling = false + } + + MotionEvent.ACTION_CANCEL -> { + isZoomDragging = false + isDoubleTapping = false + isQuickScaling = false + } + } + return super.onTouchEvent(ev) + } + } + + fun setPreScrollListener(iComicPreScroll: IComicPreScroll) { + mPreScrollListener = iComicPreScroll + } + + fun setNestedPreScrollListener(iComicPreScroll: IComicPreScroll) { + mNestedPreScrollListener = iComicPreScroll + } + + fun interface IComicPreScroll { + fun onPreScrollListener(recyclerView: RecyclerView, dx: Int, dy: Int, position: Int) + } +} + +private const val ANIMATOR_DURATION_TIME = 200 +private const val MIN_RATE = 0.5f +private const val DEFAULT_RATE = 1f +private const val MAX_SCALE_RATE = 3f diff --git a/app/src/main/java/io/legado/app/ui/book/read/MangaMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/MangaMenu.kt new file mode 100644 index 000000000000..0c8580821f1b --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/book/read/MangaMenu.kt @@ -0,0 +1,236 @@ +package io.legado.app.ui.book.read + +import android.annotation.SuppressLint +import android.content.Context +import android.graphics.Color +import android.graphics.drawable.GradientDrawable +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View.OnClickListener +import android.view.View.OnLongClickListener +import android.view.animation.Animation +import android.widget.FrameLayout +import androidx.core.view.isGone +import androidx.core.view.isVisible +import io.legado.app.R +import io.legado.app.databinding.ViewMangaMenuBinding +import io.legado.app.help.IntentData +import io.legado.app.help.config.AppConfig +import io.legado.app.help.config.ReadBookConfig +import io.legado.app.lib.dialogs.alert +import io.legado.app.lib.theme.bottomBackground +import io.legado.app.lib.theme.getPrimaryTextColor +import io.legado.app.lib.theme.primaryColor +import io.legado.app.lib.theme.primaryTextColor +import io.legado.app.model.ReadMange +import io.legado.app.ui.browser.WebViewActivity +import io.legado.app.utils.ColorUtils +import io.legado.app.utils.ConstraintModify +import io.legado.app.utils.activity +import io.legado.app.utils.applyNavigationBarPadding +import io.legado.app.utils.dpToPx +import io.legado.app.utils.gone +import io.legado.app.utils.invisible +import io.legado.app.utils.loadAnimation +import io.legado.app.utils.modifyBegin +import io.legado.app.utils.openUrl +import io.legado.app.utils.startActivity +import io.legado.app.utils.visible + +class MangaMenu @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, +) : FrameLayout(context, attrs) { + private val binding = ViewMangaMenuBinding.inflate(LayoutInflater.from(context), this, true) + private val callBack: CallBack get() = activity as CallBack + var canShowMenu: Boolean = false + private val menuTopIn: Animation by lazy { + loadAnimation(context, R.anim.anim_readbook_top_in) + } + private val menuTopOut: Animation by lazy { + loadAnimation(context, R.anim.anim_readbook_top_out) + } + private val menuBottomIn: Animation by lazy { + loadAnimation(context, R.anim.anim_readbook_bottom_in) + } + private val menuBottomOut: Animation by lazy { + loadAnimation(context, R.anim.anim_readbook_bottom_out) + } + private var isMenuOutAnimating = false + private val immersiveMenu: Boolean + get() = AppConfig.readBarStyleFollowPage && ReadBookConfig.durConfig.curBgType() == 0 + + private var bgColor: Int = if (immersiveMenu) { + kotlin.runCatching { + Color.parseColor(ReadBookConfig.durConfig.curBgStr()) + }.getOrDefault(context.bottomBackground) + } else { + context.bottomBackground + } + + private var textColor: Int = if (immersiveMenu) { + ReadBookConfig.durConfig.curTextColor() + } else { + context.getPrimaryTextColor(ColorUtils.isColorLight(bgColor)) + } + + private val menuOutListener = object : Animation.AnimationListener { + override fun onAnimationStart(animation: Animation) { + isMenuOutAnimating = true + binding.vwMenuBg.setOnClickListener(null) + } + + override fun onAnimationEnd(animation: Animation) { + binding.titleBar.invisible() + isMenuOutAnimating = false + canShowMenu = false + callBack.upSystemUiVisibility(false) + } + + override fun onAnimationRepeat(animation: Animation) = Unit + } + private val menuInListener = object : Animation.AnimationListener { + override fun onAnimationStart(animation: Animation) { + binding.tvSourceAction.text = + ReadMange.bookSource?.bookSourceName ?: context.getString(R.string.book_source) + callBack.upSystemUiVisibility(true) + binding.tvSourceAction.isGone = false + } + + @SuppressLint("RtlHardcoded") + override fun onAnimationEnd(animation: Animation) { + binding.run { + vwMenuBg.setOnClickListener { runMenuOut() } + } + } + + override fun onAnimationRepeat(animation: Animation) = Unit + } + + init { + initView() + bindEvent() + } + + private fun initView(reset: Boolean = false) = binding.run { + initAnimation() + if (immersiveMenu) { + val lightTextColor = ColorUtils.withAlpha(ColorUtils.lightenColor(textColor), 0.75f) + titleBar.setTextColor(textColor) + titleBar.setBackgroundColor(bgColor) + titleBar.setColorFilter(textColor) + tvChapterName.setTextColor(lightTextColor) + tvChapterUrl.setTextColor(lightTextColor) + } else if (reset) { + val bgColor = context.primaryColor + val textColor = context.primaryTextColor + titleBar.setTextColor(textColor) + titleBar.setBackgroundColor(bgColor) + titleBar.setColorFilter(textColor) + tvChapterName.setTextColor(textColor) + tvChapterUrl.setTextColor(textColor) + } + val brightnessBackground = GradientDrawable() + brightnessBackground.cornerRadius = 5F.dpToPx() + brightnessBackground.setColor(ColorUtils.adjustAlpha(bgColor, 0.5f)) + if (AppConfig.isEInkMode) { + titleBar.setBackgroundResource(R.drawable.bg_eink_border_bottom) + } + if (AppConfig.showReadTitleBarAddition) { + titleBarAddition.visible() + } else { + titleBarAddition.gone() + } + upBrightnessVwPos() + /** + * 确保视图不被导航栏遮挡 + */ + applyNavigationBarPadding() + } + + private fun upBrightnessVwPos() { + if (AppConfig.brightnessVwPos) { + binding.root.modifyBegin() + .clear(R.id.ll_brightness, ConstraintModify.Anchor.LEFT) + .rightToRightOf(R.id.ll_brightness, R.id.vw_menu_root) + .commit() + } else { + binding.root.modifyBegin() + .clear(R.id.ll_brightness, ConstraintModify.Anchor.RIGHT) + .leftToLeftOf(R.id.ll_brightness, R.id.vw_menu_root) + .commit() + } + } + + private fun initAnimation() { + menuTopIn.setAnimationListener(menuInListener) + menuTopOut.setAnimationListener(menuOutListener) + } + + fun runMenuOut(anim: Boolean = !AppConfig.isEInkMode) { + if (isMenuOutAnimating) { + return + } + if (this.isVisible) { + if (anim) { + binding.titleBar.startAnimation(menuTopOut) + } else { + menuOutListener.onAnimationStart(menuBottomOut) + menuOutListener.onAnimationEnd(menuBottomOut) + } + } + } + + fun runMenuIn(anim: Boolean = !AppConfig.isEInkMode) { + this.visible() + binding.titleBar.visible() + if (anim) { + binding.titleBar.startAnimation(menuTopIn) + } else { + menuInListener.onAnimationStart(menuBottomIn) + menuInListener.onAnimationEnd(menuBottomIn) + } + } + + + private fun bindEvent() = binding.run { + vwMenuBg.setOnClickListener { runMenuOut() } + titleBar.toolbar.setOnClickListener { + callBack.openBookInfoActivity() + } + val chapterViewClickListener = OnClickListener { + if (AppConfig.readUrlInBrowser) { + context.openUrl(tvChapterUrl.text.toString().substringBefore(",{")) + } else { + context.startActivity { + val url = tvChapterUrl.text.toString() + putExtra("title", tvChapterName.text) + putExtra("url", url) + IntentData.put(url, ReadMange.bookSource?.getHeaderMap(true)) + } + } + } + val chapterViewLongClickListener = OnLongClickListener { + context.alert(R.string.open_fun) { + setMessage(R.string.use_browser_open) + okButton { + AppConfig.readUrlInBrowser = true + } + noButton { + AppConfig.readUrlInBrowser = false + } + } + true + } + tvChapterName.setOnClickListener(chapterViewClickListener) + tvChapterName.setOnLongClickListener(chapterViewLongClickListener) + tvChapterUrl.setOnClickListener(chapterViewClickListener) + tvChapterUrl.setOnLongClickListener(chapterViewLongClickListener) + } + + interface CallBack { + fun openBookInfoActivity() + fun upSystemUiVisibility(value:Boolean) + } + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksFragment.kt index af9a88ce8fc8..bf7fb051a0b8 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style1/books/BooksFragment.kt @@ -28,6 +28,7 @@ import io.legado.app.lib.theme.accentColor import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.book.audio.AudioPlayActivity import io.legado.app.ui.book.info.BookInfoActivity +import io.legado.app.ui.book.manga.ReadMangaActivity import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.main.MainViewModel import io.legado.app.utils.cnCompare @@ -35,6 +36,7 @@ import io.legado.app.utils.flowWithLifecycleAndDatabaseChangeFirst import io.legado.app.utils.observeEvent import io.legado.app.utils.setEdgeEffectColor import io.legado.app.utils.startActivity +import io.legado.app.utils.startReadOrMangaActivity import io.legado.app.utils.viewbindingdelegate.viewBinding import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -247,7 +249,7 @@ class BooksFragment() : BaseFragment(R.layout.fragment_books), putExtra("bookUrl", book.bookUrl) } - else -> startActivity { + else -> startReadOrMangaActivity(book) { putExtra("bookUrl", book.bookUrl) } } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BookshelfFragment2.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BookshelfFragment2.kt index 6df5eab717df..24dae4285187 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BookshelfFragment2.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/style2/BookshelfFragment2.kt @@ -23,6 +23,7 @@ import io.legado.app.lib.theme.primaryColor import io.legado.app.ui.book.audio.AudioPlayActivity import io.legado.app.ui.book.group.GroupEditDialog import io.legado.app.ui.book.info.BookInfoActivity +import io.legado.app.ui.book.manga.ReadMangaActivity import io.legado.app.ui.book.read.ReadBookActivity import io.legado.app.ui.book.search.SearchActivity import io.legado.app.ui.main.bookshelf.BaseBookshelfFragment @@ -203,7 +204,7 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2) startActivity { putExtra("bookUrl", item.bookUrl) } - else -> startActivity { + else -> startReadOrMangaActivity(item) { putExtra("bookUrl", item.bookUrl) } } diff --git a/app/src/main/java/io/legado/app/ui/widget/ReaderInfoBarView.kt b/app/src/main/java/io/legado/app/ui/widget/ReaderInfoBarView.kt new file mode 100644 index 000000000000..37df004dc079 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/widget/ReaderInfoBarView.kt @@ -0,0 +1,205 @@ +package io.legado.app.ui.widget + +import android.content.BroadcastReceiver +import android.content.Context +import android.content.Intent +import android.content.IntentFilter +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Paint +import android.graphics.Rect +import android.util.AttributeSet +import android.view.View +import android.view.WindowInsets +import androidx.annotation.AttrRes +import androidx.core.content.ContextCompat +import androidx.core.content.res.use +import androidx.core.graphics.ColorUtils +import androidx.core.view.ViewCompat +import androidx.core.view.WindowInsetsCompat +import io.legado.app.R +import splitties.dimensions.dp +import java.text.DecimalFormat +import java.text.NumberFormat +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale +import com.google.android.material.R as materialR + +class ReaderInfoBarView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + @AttrRes defStyleAttr: Int = 0, +) : View(context, attrs, defStyleAttr) { + + private val paint = Paint(Paint.ANTI_ALIAS_FLAG) + private val textBounds = Rect() + private val timeFormat = SimpleDateFormat.getTimeInstance(SimpleDateFormat.SHORT) + private val timeReceiver = TimeReceiver() + private var insetLeft: Int = 0 + private var insetRight: Int = 0 + private var insetTop: Int = 0 + private var cutoutInsetLeft = 0 + private var cutoutInsetRight = 0 + private val colorText = ColorUtils.setAlphaComponent( + context.obtainStyledAttributes(intArrayOf(materialR.attr.colorOnSurface)).use { + it.getColor(0, Color.BLACK) + }, + 200, + ) + private val colorOutline = ColorUtils.setAlphaComponent( + context.obtainStyledAttributes(intArrayOf(materialR.attr.colorSurface)).use { + it.getColor(0, Color.WHITE) + }, + 200, + ) + + private var timeText = timeFormat.format(Date()) + private var text: String = "" + + private val innerHeight + get() = height - paddingTop - paddingBottom - insetTop + + private val innerWidth + get() = width - paddingLeft - paddingRight - insetLeft - insetRight + + init { + val insetStart = dp(10f).toInt() + val insetEnd = dp(10f).toInt() + paint.strokeWidth = dp(2f) + paint.setShadowLayer(2f, 1f, 1f, Color.GRAY) + insetLeft = insetStart + insetRight = insetEnd + insetTop = minOf(insetLeft, insetRight) + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + val ty = innerHeight / 2f + textBounds.height() / 2f - textBounds.bottom + paint.textAlign = Paint.Align.LEFT + canvas.drawTextOutline( + text, + (paddingLeft + insetLeft + cutoutInsetLeft).toFloat(), + paddingTop + insetTop + ty, + ) + paint.textAlign = Paint.Align.RIGHT + canvas.drawTextOutline( + timeText, + (width - paddingRight - insetRight - cutoutInsetRight).toFloat(), + paddingTop + insetTop + ty, + ) + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + updateCutoutInsets(ViewCompat.getRootWindowInsets(this)) + updateTextSize() + } + + override fun onApplyWindowInsets(insets: WindowInsets): WindowInsets { + updateCutoutInsets(WindowInsetsCompat.toWindowInsetsCompat(insets)) + return super.onApplyWindowInsets(insets) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + ContextCompat.registerReceiver( + context, + timeReceiver, + IntentFilter(Intent.ACTION_TIME_TICK), + ContextCompat.RECEIVER_EXPORTED, + ) + updateCutoutInsets(ViewCompat.getRootWindowInsets(this)) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + context.unregisterReceiver(timeReceiver) + } + + fun update( + currentPage: Int, + totalPage: Int, + percent: Float, + chapterIndex: Int, + chapterCount: Int + ) { + text = context.getString( + R.string.book_reader_info_bar, + chapterIndex, + chapterCount, + currentPage, + totalPage, + if (percent in 0f..1f) (percent * 100).format() else "" + ) + updateTextSize() + invalidate() + } + + private fun Number.format( + decimals: Int = 0, + decPoint: Char = '.', + thousandsSep: Char? = ' ' + ): String { + val formatter = NumberFormat.getInstance(Locale.US) as DecimalFormat + val symbols = formatter.decimalFormatSymbols + if (thousandsSep != null) { + symbols.groupingSeparator = thousandsSep + formatter.isGroupingUsed = true + } else { + formatter.isGroupingUsed = false + } + symbols.decimalSeparator = decPoint + formatter.decimalFormatSymbols = symbols + formatter.minimumFractionDigits = decimals + formatter.maximumFractionDigits = decimals + return when (this) { + is Float, + is Double, + -> formatter.format(this.toDouble()) + + else -> formatter.format(this.toLong()) + } + } + + + private fun updateTextSize() { + val str = text + timeText + val testTextSize = 48f + paint.textSize = testTextSize + paint.getTextBounds(str, 0, str.length, textBounds) + paint.textSize = testTextSize * innerHeight / textBounds.height() + paint.getTextBounds(str, 0, str.length, textBounds) + } + + private fun Canvas.drawTextOutline(text: String, x: Float, y: Float) { + paint.color = colorOutline + paint.style = Paint.Style.STROKE + drawText(text, x, y, paint) + paint.color = colorText + paint.style = Paint.Style.FILL + drawText(text, x, y, paint) + } + + private fun updateCutoutInsets(insetsCompat: WindowInsetsCompat?) { + val cutouts = (insetsCompat ?: return).displayCutout?.boundingRects.orEmpty() + cutoutInsetLeft = 0 + cutoutInsetRight = 0 + for (rect in cutouts) { + if (rect.left <= paddingLeft) { + cutoutInsetLeft += rect.width() + } + if (rect.right >= width - paddingRight) { + cutoutInsetRight += rect.width() + } + } + } + + private inner class TimeReceiver : BroadcastReceiver() { + + override fun onReceive(context: Context?, intent: Intent?) { + timeText = timeFormat.format(Date()) + invalidate() + } + } +} diff --git a/app/src/main/java/io/legado/app/ui/widget/recycler/LoadMoreView.kt b/app/src/main/java/io/legado/app/ui/widget/recycler/LoadMoreView.kt index 53f20f0c270c..d13e034b97b9 100644 --- a/app/src/main/java/io/legado/app/ui/widget/recycler/LoadMoreView.kt +++ b/app/src/main/java/io/legado/app/ui/widget/recycler/LoadMoreView.kt @@ -70,14 +70,18 @@ class LoadMoreView(context: Context, attrs: AttributeSet? = null) : FrameLayout( binding.tvText.visible() } - fun error(msg: String) { + fun error(msg: String?, text: String = "") { stopLoad() hasMore = false - errorMsg = msg - binding.tvText.text = context.getString(R.string.error_load_msg, "点击查看详情") + errorMsg = msg ?: "" + binding.tvText.text = + text.ifEmpty { context.getString(R.string.error_load_msg, "点击查看详情") } binding.tvText.visible() } + fun getLoading() = binding.rotateLoading + fun getLoadingText() = binding.tvText + private fun showErrorDialog(): Boolean { if (errorMsg.isBlank()) { return false diff --git a/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt b/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt index 72552b5b7142..51a092ed45d5 100644 --- a/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ActivityExtensions.kt @@ -18,6 +18,7 @@ import androidx.annotation.ColorInt import androidx.appcompat.app.AppCompatActivity import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat +import androidx.core.view.WindowInsetsControllerCompat import androidx.core.view.WindowInsetsControllerCompat.BEHAVIOR_DEFAULT import androidx.core.view.WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE import androidx.fragment.app.DialogFragment @@ -243,4 +244,9 @@ val Activity.navigationBarGravity: Int fun AppCompatActivity.showHelp(fileName: String) { val mdText = String(assets.open("web/help/md/${fileName}.md").readBytes()) showDialogFragment(TextDialog(getString(R.string.help), mdText, TextDialog.Mode.MD)) +} + +fun immersionFullScreen(windowInsetsControllerCompat: WindowInsetsControllerCompat) { + windowInsetsControllerCompat.systemBarsBehavior = BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + windowInsetsControllerCompat.hide(WindowInsetsCompat.Type.systemBars()) } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt index 94840a39bf7a..874e49654f48 100644 --- a/app/src/main/java/io/legado/app/utils/ContextExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/ContextExtensions.kt @@ -38,7 +38,10 @@ import androidx.preference.PreferenceManager import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel import io.legado.app.R import io.legado.app.constant.AppConst +import io.legado.app.data.entities.Book import io.legado.app.help.IntentHelp +import io.legado.app.help.book.isImage +import io.legado.app.help.config.AppConfig import splitties.systemservices.clipboardManager import splitties.systemservices.connectivityManager import splitties.systemservices.uiModeManager @@ -53,6 +56,18 @@ inline fun Context.startActivity(configIntent: Intent.() startActivity(intent) } +inline fun Context.startReadOrMangaActivity( + book: Book, + configIntent: Intent.() -> Unit = {}, +) { + val intent = + Intent(this, if (book.isImage && AppConfig.showMangaUi) M::class.java else A::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + intent.apply(configIntent) + startActivity(intent) +} + + inline fun Context.startService(configIntent: Intent.() -> Unit = {}) { startService(Intent(this, T::class.java).apply(configIntent)) } @@ -65,7 +80,7 @@ inline fun Context.stopService() { inline fun Context.servicePendingIntent( action: String, requestCode: Int = 0, - configIntent: Intent.() -> Unit = {} + configIntent: Intent.() -> Unit = {}, ): PendingIntent? { val intent = Intent(this, T::class.java) intent.action = action @@ -81,7 +96,7 @@ inline fun Context.servicePendingIntent( @SuppressLint("UnspecifiedImmutableFlag") fun Context.activityPendingIntent( intent: Intent, - action: String + action: String, ): PendingIntent? { intent.action = action val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { @@ -95,7 +110,7 @@ fun Context.activityPendingIntent( @SuppressLint("UnspecifiedImmutableFlag") inline fun Context.activityPendingIntent( action: String, - configIntent: Intent.() -> Unit = {} + configIntent: Intent.() -> Unit = {}, ): PendingIntent? { val intent = Intent(this, T::class.java) intent.action = action @@ -111,7 +126,7 @@ inline fun Context.activityPendingIntent( @SuppressLint("UnspecifiedImmutableFlag") inline fun Context.broadcastPendingIntent( action: String, - configIntent: Intent.() -> Unit = {} + configIntent: Intent.() -> Unit = {}, ): PendingIntent? { val intent = Intent(this, T::class.java) intent.action = action @@ -161,7 +176,7 @@ fun Context.putPrefString(key: String, value: String?) = fun Context.getPrefStringSet( key: String, - defValue: MutableSet? = null + defValue: MutableSet? = null, ): MutableSet? = defaultSharedPreferences.getStringSet(key, defValue) fun Context.putPrefStringSet(key: String, value: MutableSet) = @@ -255,7 +270,7 @@ fun Context.share(file: File, type: String = "text/*") { fun Context.shareWithQr( text: String, title: String = getString(R.string.share), - errorCorrectionLevel: ErrorCorrectionLevel = ErrorCorrectionLevel.H + errorCorrectionLevel: ErrorCorrectionLevel = ErrorCorrectionLevel.H, ) { val bitmap = QRCodeUtils.createQRCode(text, errorCorrectionLevel = errorCorrectionLevel) if (bitmap == null) { diff --git a/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt b/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt index 432d0690fc97..9a143d5cc481 100644 --- a/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/FragmentExtensions.kt @@ -14,6 +14,9 @@ import androidx.fragment.app.DialogFragment import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle import io.legado.app.R +import io.legado.app.data.entities.Book +import io.legado.app.help.book.isImage +import io.legado.app.help.config.AppConfig import io.legado.app.ui.widget.dialog.TextDialog inline fun Fragment.showDialogFragment( @@ -81,6 +84,19 @@ inline fun Fragment.startActivity( startActivity(Intent(requireContext(), T::class.java).apply(configIntent)) } +inline fun Fragment.startReadOrMangaActivity( + book: Book, + configIntent: Intent.() -> Unit = {}, +) { + val intent = Intent( + requireActivity(), + if (book.isImage && AppConfig.showMangaUi) M::class.java else A::class.java + ) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + intent.apply(configIntent) + startActivity(intent) +} + fun Fragment.showHelp(fileName: String) { val mdText = String(requireContext().assets.open("web/help/md/${fileName}.md").readBytes()) showDialogFragment(TextDialog(getString(R.string.help), mdText, TextDialog.Mode.MD)) diff --git a/app/src/main/java/io/legado/app/utils/RecyclerViewExtensions.kt b/app/src/main/java/io/legado/app/utils/RecyclerViewExtensions.kt new file mode 100644 index 000000000000..5a364992c89b --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/RecyclerViewExtensions.kt @@ -0,0 +1,28 @@ +package io.legado.app.utils + +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView + +fun RecyclerView.findCenterViewPosition(): Int { + return getChildAdapterPosition(findChildViewUnder(width / 2f, height / 2f) ?: return RecyclerView.NO_POSITION) +} + +fun RecyclerView.findViewPosition(x: Float, y: Float): Int { + return getChildAdapterPosition(findChildViewUnder(x, y) ?: return RecyclerView.NO_POSITION) +} + +fun RecyclerView.findFirstVisibleViewPosition(): Int { + var pos = -1 + if (layoutManager is LinearLayoutManager) { + pos = (layoutManager as LinearLayoutManager).findFirstVisibleItemPosition() + } + return pos +} + +fun RecyclerView.findLastVisibleViewPosition(): Int { + var pos = -1 + if ( layoutManager is LinearLayoutManager) { + pos = (layoutManager as LinearLayoutManager).findLastVisibleItemPosition() + } + return pos +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_mange.xml b/app/src/main/res/layout/activity_mange.xml new file mode 100644 index 000000000000..626c749c0442 --- /dev/null +++ b/app/src/main/res/layout/activity_mange.xml @@ -0,0 +1,93 @@ + + + + + + + + + + + + + + + + + + + + + + + +