commit 6072b2ba29a78975fc1bf086314fb60b094938e0 Author: Aryan Date: Tue Feb 24 17:37:40 2026 +0530 Initial commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..37919a3 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +app/src/main/cpp/** linguist-vendored +pdfiumandroid/** linguist-vendored \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e3b1d94 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties +.env +*.jks +google-services.json +.kotlin/ +.idea/ \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..30b5200 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,187 @@ +@file:Suppress("UnstableApiUsage") + +import java.util.Properties + +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.compose) + id("org.jetbrains.kotlin.plugin.serialization") version "2.1.20" + alias(libs.plugins.kotlin.ksp) +} + +val localProperties = Properties() +val localPropertiesFile = rootProject.file("local.properties") +if (localPropertiesFile.exists()) { + localPropertiesFile.inputStream().use { localProperties.load(it) } +} + +android { + namespace = "com.aryan.reader" + compileSdk = 35 + + defaultConfig { + applicationId = "com.aryan.reader" + minSdk = 26 + targetSdk = 35 + versionCode = 32 + versionName = "1.0.31" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + externalNativeBuild { + cmake { + cppFlags += "" + } + } + buildConfigField("boolean", "IS_PRO", "false") + } + + flavorDimensions += "version" + productFlavors { + create("oss") { + dimension = "version" + applicationIdSuffix = ".oss" + versionNameSuffix = "-oss" + buildConfigField("String", "AI_WORKER_URL", "\"\"") + buildConfigField("String", "VERIFIER_WORKER_URL", "\"\"") + buildConfigField("String", "FEEDBACK_WORKER_URL", "\"\"") + buildConfigField("boolean", "IS_PRO", "false") + } + } + + packaging { + resources { + excludes += "/META-INF/{AL2.0,LGPL2.1}" + } + } + + signingConfigs { + create("release") { + val storePath = localProperties.getProperty("MYAPP_RELEASE_STORE_FILE") + if (!storePath.isNullOrEmpty()) { + storeFile = file(storePath) + storePassword = localProperties.getProperty("MYAPP_RELEASE_STORE_PASSWORD") + keyAlias = localProperties.getProperty("MYAPP_RELEASE_KEY_ALIAS") + keyPassword = localProperties.getProperty("MYAPP_RELEASE_KEY_PASSWORD") + } + } + } + + buildTypes { + release { + signingConfig = signingConfigs.getByName("release") + isMinifyEnabled = true + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlinOptions { + jvmTarget = "17" + } + buildFeatures { + compose = true + buildConfig = true + } + publishing { + singleVariant("release") { + } + } + externalNativeBuild { + cmake { + path = file("src/main/cpp/CMakeLists.txt") + version = "3.22.1" + } + } +} +//noinspection UseTomlInstead +dependencies { + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.ui) + implementation(libs.androidx.ui.graphics) + implementation(libs.androidx.ui.tooling.preview) + implementation(libs.androidx.material3) + implementation(libs.androidx.material3.window.size.class1.android) + implementation(libs.androidx.credentials) + + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.espresso.core) + androidTestImplementation(platform(libs.androidx.compose.bom)) + androidTestImplementation(libs.androidx.ui.test.junit4) + androidTestImplementation("androidx.test:rules:1.7.0") + androidTestImplementation("androidx.test.espresso:espresso-web:3.7.0") + androidTestImplementation("com.google.truth:truth:1.4.2") + androidTestImplementation("androidx.navigation:navigation-testing:2.9.6") + androidTestImplementation("io.mockk:mockk-android:1.13.11") { + exclude(group = "org.junit.jupiter") + } + androidTestImplementation(libs.kotlinx.coroutines.test) + + debugImplementation(libs.androidx.ui.test.manifest) + + implementation(libs.androidx.room.runtime) + implementation(libs.androidx.room.ktx) + + ksp(libs.androidx.room.compiler) + + implementation("androidx.compose.material:material-icons-extended:1.7.8") + + implementation("androidx.appcompat:appcompat:1.7.1") + + //noinspection GradleDependency (Updating these might cause the custom toolbox in pagination to break) + implementation("androidx.navigation:navigation-compose:2.9.2") + //noinspection GradleDependency + implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.9.2") + //noinspection GradleDependency + implementation("androidx.lifecycle:lifecycle-runtime-compose:2.9.2") + //noinspection GradleDependency + implementation("androidx.compose.material3.adaptive:adaptive:1.2.0-alpha11") + + implementation("org.jsoup:jsoup:1.17.2") + + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-protobuf:1.7.3") + + implementation("io.coil-kt:coil-compose:2.7.0") + implementation("io.coil-kt:coil-svg:2.6.0") + + implementation(project(":pdfiumandroid")) + + implementation("androidx.media3:media3-exoplayer:1.8.0") + implementation("androidx.media3:media3-session:1.8.0") + implementation("androidx.media3:media3-ui:1.8.0") + + implementation("androidx.work:work-runtime-ktx:2.10.5") + implementation("androidx.compose.runtime:runtime-livedata:1.9.3") + + implementation("org.slf4j:slf4j-android:1.7.36") + + implementation("org.commonmark:commonmark:0.22.0") + + implementation("com.jakewharton.timber:timber:5.0.1") + + implementation("com.tom-roush:pdfbox-android:2.0.27.0") + + implementation("androidx.paging:paging-runtime-ktx:3.3.6") + implementation("androidx.paging:paging-compose:3.3.6") + implementation("androidx.room:room-paging:2.7.1") + + // Flexmark for Markdown parsing (MD -> HTML) + implementation("com.vladsch.flexmark:flexmark:0.64.8") + implementation("com.vladsch.flexmark:flexmark-ext-tables:0.64.8") + implementation("com.vladsch.flexmark:flexmark-ext-gfm-strikethrough:0.64.8") + implementation("com.vladsch.flexmark:flexmark-ext-gfm-tasklist:0.64.8") + implementation("com.vladsch.flexmark:flexmark-ext-autolink:0.64.8") + + implementation("androidx.documentfile:documentfile:1.0.1") + implementation("androidx.browser:browser:1.8.0") +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..eaf6fc8 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,81 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +-renamesourcefileattribute SourceFile + +# Fix for Firestore crash in release builds. +# This prevents ProGuard from removing the default constructor and fields +# that Firestore needs for data serialization and deserialization. +-keepattributes Signature +-keep class com.google.firebase.firestore.** { *; } +-keepnames class com.google.protobuf.** { *; } + +# IMPORTANT: Keep all your data model classes that you use with Firestore. +# The following rule covers all classes in your 'data' package. +-keep class com.aryan.reader.data.** { + (); + *; +} + +# Keep MobiParser inner classes that are accessed from JNI. +# ProGuard/R8 can't detect this usage, so we must keep them explicitly +# to prevent renaming/removal in release builds. +-keep class com.aryan.reader.epub.MobiParser$* { + (...); + *; +} + +# Keep classes for Google Sign In and Credential Manager +-keep class com.google.android.libraries.identity.googleid.** { *; } +-keep class com.google.android.gms.auth.api.identity.** { *; } +-keep class androidx.credentials.** { *; } + +# Keep classes for Firebase Auth +-keep class com.google.firebase.auth.** { *; } + +# These rules can help prevent gRPC-related issues in release builds. +-keep class io.grpc.** { *; } +-dontwarn com.squareup.okhttp.** + +#noinspection ShrinkerUnresolvedReference +-dontwarn com.google.protobuf.GeneratedMessageV3 +-keepclassmembers class * extends com.google.protobuf.GeneratedMessageV3 { + ; +} + +# Keep GSON TypeToken for proper JSON serialization/deserialization in release builds. +# This prevents R8 from stripping generic type information needed by Gson. +-keep class com.google.gson.reflect.TypeToken { *; } +-keep class * extends com.google.gson.reflect.TypeToken + +-keep class com.aryan.reader.paginatedreader.Woff2Converter { *; } + +-dontwarn com.gemalto.jp2.** + +# Flexmark Markdown parser rules +-keep class com.vladsch.flexmark.** { *; } +-keepnames class com.vladsch.flexmark.** { *; } +-keepclassmembers class com.vladsch.flexmark.** { *; } + +-dontwarn java.awt.** +-dontwarn javax.swing.** +-dontwarn javax.imageio.** + +-keepattributes Signature, EnclosingMethod, InnerClasses, *Annotation* \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/AppNavigationTest.kt b/app/src/androidTest/java/com/aryan/reader/AppNavigationTest.kt new file mode 100644 index 0000000..7fa5d16 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/AppNavigationTest.kt @@ -0,0 +1,118 @@ +// AppNavigationTest.kt +package com.aryan.reader + +import android.net.Uri +import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi +import androidx.compose.material3.windowsizeclass.WindowSizeClass +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.test.junit4.createComposeRule +import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.dp +import androidx.navigation.compose.ComposeNavigator +import androidx.navigation.testing.TestNavHostController +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.aryan.reader.epub.EpubBook +import kotlinx.coroutines.flow.MutableStateFlow +import org.junit.Assert.assertEquals +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class AppNavigationTest { + + @get:Rule + val composeTestRule = createComposeRule() + + private lateinit var navController: TestNavHostController + private val fakeUiState = MutableStateFlow(ReaderScreenState()) + + // Mock ViewModel that uses the fake state + private val fakeViewModel: MainViewModel = object : MainViewModel( + ApplicationProvider.getApplicationContext() + ) { + override val uiState = fakeUiState + override fun clearSelectedFile() { + fakeUiState.value = fakeUiState.value.copy( + selectedFileType = null, + selectedPdfUri = null, + selectedEpubBook = null + ) + } + } + + @OptIn(ExperimentalMaterial3WindowSizeClassApi::class) + @Before + fun setup() { + composeTestRule.setContent { + navController = TestNavHostController(LocalContext.current) + navController.navigatorProvider.addNavigator(ComposeNavigator()) + AppNavigation( + navController = navController, + windowSizeClass = WindowSizeClass.calculateFromSize(DpSize(400.dp, 800.dp)), + viewModel = fakeViewModel + ) + } + } + + @Test + fun appNavigation_defaultStartDestination_isMainRoute() { + val currentRoute = navController.currentBackStackEntry?.destination?.route + assertEquals(AppDestinations.MAIN_ROUTE, currentRoute) + } + + @Test + fun appNavigation_whenPdfSelected_navigatesToPdfViewer() { + // Trigger state change + fakeUiState.value = ReaderScreenState( + selectedFileType = FileType.PDF, + selectedPdfUri = Uri.parse("content://dummy.pdf") + ) + + // Let compose recompose and run LaunchedEffect + composeTestRule.waitForIdle() + + val currentRoute = navController.currentBackStackEntry?.destination?.route + assertEquals(AppDestinations.PDF_VIEWER_ROUTE, currentRoute) + } + + @Test + fun appNavigation_whenEpubSelected_navigatesToEpubReader() { + // Trigger state change + fakeUiState.value = ReaderScreenState( + selectedFileType = FileType.EPUB, + selectedEpubBook = EpubBook( + fileName = "dummy.epub", + title = "Dummy Book", + author = "Author", + language = "en", + coverImage = null + ) + ) + + composeTestRule.waitForIdle() + + val currentRoute = navController.currentBackStackEntry?.destination?.route + assertEquals(AppDestinations.EPUB_READER_ROUTE, currentRoute) + } + + @Test + fun appNavigation_whenFileCleared_navigatesBackToMain() { + // First, navigate to PDF viewer + fakeUiState.value = ReaderScreenState( + selectedFileType = FileType.PDF, + selectedPdfUri = Uri.parse("content://dummy.pdf") + ) + composeTestRule.waitForIdle() + assertEquals(AppDestinations.PDF_VIEWER_ROUTE, navController.currentBackStackEntry?.destination?.route) + + // Then, trigger the clear action (simulating onNavigateBack) + fakeViewModel.clearSelectedFile() + composeTestRule.waitForIdle() + + val currentRoute = navController.currentBackStackEntry?.destination?.route + assertEquals(AppDestinations.MAIN_ROUTE, currentRoute) + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/MainDispatcherRule.kt b/app/src/androidTest/java/com/aryan/reader/MainDispatcherRule.kt new file mode 100644 index 0000000..1cf2f5b --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/MainDispatcherRule.kt @@ -0,0 +1,27 @@ +package com.aryan.reader + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain +import org.junit.rules.TestWatcher +import org.junit.runner.Description + +/** + * A JUnit TestRule that sets the Main dispatcher to a TestDispatcher for the duration of a test. + * This allows tests to execute coroutines on the Main dispatcher without needing a real Android environment. + */ +@OptIn(ExperimentalCoroutinesApi::class) +class MainDispatcherRule( + private val testDispatcher: TestDispatcher = UnconfinedTestDispatcher() +) : TestWatcher() { + override fun starting(description: Description) { + Dispatchers.setMain(testDispatcher) + } + + override fun finished(description: Description) { + Dispatchers.resetMain() + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/epubreader/ChapterWebViewBridgeTest.kt b/app/src/androidTest/java/com/aryan/reader/epubreader/ChapterWebViewBridgeTest.kt new file mode 100644 index 0000000..cf9996f --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/epubreader/ChapterWebViewBridgeTest.kt @@ -0,0 +1,156 @@ +package com.aryan.reader.epubreader + +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Rule +import org.junit.Test + +@OptIn(ExperimentalCoroutinesApi::class) +class ChapterWebViewBridgeTest { + + @get:Rule + val mainDispatcherRule = MainDispatcherRule() + + @Test + fun cfiJsBridge_onCfiExtracted_callsCallbackWithCorrectCfi() { + var receivedCfi = "" + val bridge = CfiJsBridge( + onCfiReady = { cfi -> receivedCfi = cfi }, + onCfiForBookmarkReady = {} + ) + + val cfi = "/4/2[chapter1]/6:10" + val jsonResponse = JSONObject().apply { + put("cfi", cfi) + put("log", JSONArray(listOf("log message 1", "log message 2"))) + }.toString() + + bridge.onCfiExtracted(jsonResponse) + + assertThat(receivedCfi).isEqualTo(cfi) + } + + @Test + fun cfiJsBridge_onCfiExtracted_withInvalidJson_callsCallbackWithFallbackCfi() { + var receivedCfi = "" + val bridge = CfiJsBridge( + onCfiReady = { cfi -> receivedCfi = cfi }, + onCfiForBookmarkReady = {} + ) + + val invalidJson = "this is not json" + + bridge.onCfiExtracted(invalidJson) + + assertThat(receivedCfi).isEqualTo("/4") + } + + @Test + fun cfiJsBridge_onCfiExtracted_withEmptyCfi_callsCallbackWithCfi() { + var receivedCfi: String? = null + val bridge = CfiJsBridge( + onCfiReady = { cfi -> receivedCfi = cfi }, + onCfiForBookmarkReady = {} + ) + + val jsonResponse = JSONObject().apply { + put("cfi", "") + put("log", JSONArray()) + }.toString() + + bridge.onCfiExtracted(jsonResponse) + + // The handler is only called if the CFI is not blank, so it should remain null + assertThat(receivedCfi).isNull() + } + + @Test + fun ttsJsBridge_onStructuredTextExtracted_callsHandlerWithJson() = runTest { + var receivedJson: String? = null + val bridge = TtsJsBridge( + scope = this, + ttsStructuredTextHandler = { json -> receivedJson = json } + ) + val jsonPayload = "[{\"text\":\"Hello world\",\"cfi\":\"/4/2\"}]" + bridge.onStructuredTextExtracted(jsonPayload) + advanceUntilIdle() + assertThat(receivedJson).isEqualTo(jsonPayload) + } + + @Test + fun ttsJsBridge_onStructuredTextExtracted_withEmptyJson_callsHandlerWithEmptyArray() = runTest { + var receivedJson: String? = null + val bridge = TtsJsBridge( + scope = this, + ttsStructuredTextHandler = { json -> receivedJson = json } + ) + val jsonPayload = "" + bridge.onStructuredTextExtracted(jsonPayload) + advanceUntilIdle() + assertThat(receivedJson).isEqualTo("[]") + } + + @Test + fun snippetJsBridge_onSnippetExtracted_callsCallbackWithCfiAndSnippet() { + var receivedCfi = "" + var receivedSnippet = "" + val bridge = SnippetJsBridge( + onSnippetReady = { cfi, snippet -> + receivedCfi = cfi + receivedSnippet = snippet + } + ) + + val cfi = "/4/8:5" + val snippet = "This is the bookmark snippet." + bridge.onSnippetExtracted(cfi, snippet) + + assertThat(receivedCfi).isEqualTo(cfi) + assertThat(receivedSnippet).isEqualTo(snippet) + } + + @Test + fun progressJsBridge_onTopChunkUpdated_invokesCallback() { + var updatedChunk = -1 + val bridge = ProgressJsBridge(onTopChunkUpdated = { index -> updatedChunk = index }) + + bridge.updateTopChunk(5) + assertThat(updatedChunk).isEqualTo(5) + + bridge.updateTopChunk(10) + assertThat(updatedChunk).isEqualTo(10) + } + + @Test + fun progressJsBridge_onTopChunkUpdated_doesNotCallForSameIndex() { + var callCount = 0 + val bridge = ProgressJsBridge(onTopChunkUpdated = { callCount++ }) + + bridge.updateTopChunk(3) + assertThat(callCount).isEqualTo(1) + + // Reporting the same index should not trigger the callback again + bridge.updateTopChunk(3) + assertThat(callCount).isEqualTo(1) + + bridge.updateTopChunk(4) + assertThat(callCount).isEqualTo(2) + } + + @Test + fun aiJsBridge_onContentExtracted_invokesCallback() = runTest { + var receivedContent: String? = null + val bridge = AiJsBridge( + scope = this, + onContentReady = { content -> receivedContent = content } + ) + val content = "This is the chapter content for summarization." + bridge.onContentExtractedForSummarization(content) + advanceUntilIdle() + assertThat(receivedContent).isEqualTo(content) + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/epubreader/EpubReaderBookmarkTest.kt b/app/src/androidTest/java/com/aryan/reader/epubreader/EpubReaderBookmarkTest.kt new file mode 100644 index 0000000..36e67ca --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/epubreader/EpubReaderBookmarkTest.kt @@ -0,0 +1,93 @@ +package com.aryan.reader.epubreader + +import android.content.Context +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.aryan.reader.epub.EpubChapter +import com.google.common.truth.Truth.assertThat +import org.json.JSONArray +import org.json.JSONObject +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class EpubReaderBookmarkTest { + + private lateinit var context: Context + private val testBookTitle = "My Test Book" + private val chapters = listOf( + EpubChapter(chapterId = "ch1", title = "Chapter 1", htmlFilePath = "", absPath = "", htmlContent = "", plainTextContent = ""), + EpubChapter(chapterId = "ch2", title = "Chapter 2", htmlFilePath = "", absPath = "", htmlContent = "", plainTextContent = "") + ) + + @Before + fun setup() { + context = ApplicationProvider.getApplicationContext() + // Clear any old prefs to ensure a clean slate for each test + val prefs = context.getSharedPreferences("epub_reader_bookmarks", Context.MODE_PRIVATE) + prefs.edit().clear().apply() + } + + @Test + fun loadBookmarks_withValidJson_parsesCorrectly() { + val bookmark1 = JSONObject().apply { + put("cfi", "/4/2:10") + put("chapterTitle", "Chapter 1") + put("snippet", "A snippet of text") + put("chapterIndex", 0) + } + val bookmark2 = JSONObject().apply { + put("cfi", "/6/4:22") + put("chapterTitle", "Chapter 2") + put("snippet", "Another snippet") + put("chapterIndex", 1) + } + val bookmarksJson = JSONArray(listOf(bookmark1.toString(), bookmark2.toString())).toString() + + val bookmarks = loadBookmarks(context, testBookTitle, chapters, bookmarksJson) + + assertThat(bookmarks).hasSize(2) + assertThat(bookmarks).contains( + Bookmark( + cfi = "/4/2:10", + chapterTitle = "Chapter 1", + snippet = "A snippet of text", + pageInChapter = null, + totalPagesInChapter = null, + chapterIndex = 0 + ) + ) + } + + @Test + fun loadBookmarks_withInvalidJson_returnsEmptySet() { + val invalidJson = "[{\"cfi\": \"/4/2:10\", snippet: \"invalid json\"}]" // snippet value not in quotes + val bookmarks = loadBookmarks(context, testBookTitle, chapters, invalidJson) + assertThat(bookmarks).isEmpty() + } + + @Test + fun loadBookmarks_withMissingChapterIndex_calculatesItFromTitle() { + val bookmark1 = JSONObject().apply { + put("cfi", "/6/4:22") + put("chapterTitle", "Chapter 2") // This should map to index 1 + put("snippet", "Another snippet") + } + val bookmarksJson = JSONArray(listOf(bookmark1.toString())).toString() + + val bookmarks = loadBookmarks(context, testBookTitle, chapters, bookmarksJson) + + assertThat(bookmarks).hasSize(1) + val loadedBookmark = bookmarks.first() + assertThat(loadedBookmark.chapterIndex).isEqualTo(1) + assertThat(loadedBookmark.chapterTitle).isEqualTo("Chapter 2") + } + + @Test + fun loadBookmarks_withNullJson_fallsBackToSharedPreferences() { + // This test doesn't write to shared prefs, so it should return an empty set. + val bookmarks = loadBookmarks(context, testBookTitle, chapters, null) + assertThat(bookmarks).isEmpty() + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/epubreader/EpubReaderLogicTest.kt b/app/src/androidTest/java/com/aryan/reader/epubreader/EpubReaderLogicTest.kt new file mode 100644 index 0000000..a310b2d --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/epubreader/EpubReaderLogicTest.kt @@ -0,0 +1,204 @@ +// app/src/androidTest/java/com/aryan/reader/epubreader/EpubReaderLogicTest.kt +package com.aryan.reader.epubreader + +import android.content.Context +import timber.log.Timber +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.font.FontWeight +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.aryan.reader.SearchResult +import com.aryan.reader.epub.EpubBook +import com.aryan.reader.epub.EpubChapter +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withContext +import org.jsoup.Jsoup +import org.junit.After +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import java.io.File +import kotlin.math.max +import kotlin.math.min + +@RunWith(AndroidJUnit4::class) +class EpubReaderLogicTest { + + private lateinit var context: Context + private lateinit var testDir: File + private lateinit var mockEpubBook: EpubBook + + @Before + fun setup() { + context = ApplicationProvider.getApplicationContext() + testDir = File(context.cacheDir, "test_epub").apply { mkdirs() } + + // Create dummy chapter files + val chapter1File = File(testDir, "chapter1.html") + chapter1File.writeText("

A simple Test case.

") + + val chapter2File = File(testDir, "chapter2.html") + chapter2File.writeText("

Another test case here.

The word Test appears twice.

") + + mockEpubBook = EpubBook( + fileName = "test.epub", + title = "Test Book", + author = "Tester", + language = "en", + coverImage = null, + extractionBasePath = testDir.absolutePath, + chapters = listOf( + EpubChapter( + chapterId = "ch1", + absPath = chapter1File.absolutePath, + title = "Chapter 1", + htmlFilePath = "chapter1.html", + plainTextContent = "", + htmlContent = "" + ), + EpubChapter( + chapterId = "ch2", + absPath = chapter2File.absolutePath, + title = "Chapter 2", + htmlFilePath = "chapter2.html", + plainTextContent = "", + htmlContent = "" + ) + ) + ) + } + + @After + fun tearDown() { + testDir.deleteRecursively() + } + + private suspend fun searchEpub(book: EpubBook, query: String): List { + val TAG = "EpubReaderLogicTest" + Timber.d("Starting search for query: '$query'") + return withContext(Dispatchers.IO) { + val results = mutableListOf() + book.chapters.forEachIndexed { chapterIndex, chapter -> + try { + val fullPath = "${book.extractionBasePath}/${chapter.htmlFilePath}" + Timber.d("Chapter ${chapterIndex + 1}: Checking path '$fullPath'") + val htmlFile = File(fullPath) + if (!htmlFile.exists()) { + Timber.e("File does not exist: $fullPath") + return@forEachIndexed + } + + val doc = Jsoup.parse(htmlFile, "UTF-8") + val bodyChildren = doc.body().children().toList() + val chunks = bodyChildren.chunked(20) + + chunks.forEachIndexed { chunkIndex, chunkOfElements -> + val chunkHtml = chunkOfElements.joinToString(separator = "\n") { it.outerHtml() } + val content = Jsoup.parse(chunkHtml).text() + var lastIndex = -1 + + while (true) { + lastIndex = content.indexOf(query, startIndex = lastIndex + 1, ignoreCase = true) + if (lastIndex == -1) break + + Timber.d("Found potential match for '$query' at index $lastIndex.") + val isWordStart = lastIndex == 0 || !content[lastIndex - 1].isLetterOrDigit() + Timber.d("Is it a word start? -> $isWordStart") + if (isWordStart) { + Timber.d("Match is a word start. Adding to results.") + val snippetStart = max(0, lastIndex - 35) + val snippetEnd = min(content.length, lastIndex + query.length + 35) + val rawSnippet = content.substring(snippetStart, snippetEnd) + val annotatedSnippet = buildAnnotatedString { + append(rawSnippet) + val highlightStart = content.indexOf(query, lastIndex, ignoreCase = true) - snippetStart + val highlightEnd = highlightStart + query.length + addStyle( + style = SpanStyle(fontWeight = FontWeight.Bold), + start = highlightStart, + end = highlightEnd + ) + } + results.add( + SearchResult( + locationInSource = chapterIndex, + locationTitle = chapter.title, + snippet = annotatedSnippet, + query = query, + occurrenceIndexInLocation = results.count { it.locationInSource == chapterIndex }, + chunkIndex = chunkIndex + ) + ) + } + } + } + } catch (e: Exception) { + Timber.e("Error during search in chapter ${chapter.title}", e) + throw e + } + } + Timber.d("Search finished. Total results found: ${results.size}") + results + } + } + + @Test + fun search_findsCorrectResults() = runBlocking { + val results = searchEpub(mockEpubBook, "case") + assertThat(results).hasSize(2) + assertThat(results.count { it.locationTitle == "Chapter 1" }).isEqualTo(1) + assertThat(results.count { it.locationTitle == "Chapter 2" }).isEqualTo(1) + } + + @Test + fun search_isCaseInsensitive() = runBlocking { + val results = searchEpub(mockEpubBook, "test") + assertThat(results).hasSize(3) + assertThat(results[0].locationTitle).isEqualTo("Chapter 1") + assertThat(results[1].locationTitle).isEqualTo("Chapter 2") + assertThat(results[2].locationTitle).isEqualTo("Chapter 2") + } + + @Test + fun search_noResultsFound() = runBlocking { + val results = searchEpub(mockEpubBook, "nonexistent") + assertThat(results).isEmpty() + } + + @Test + fun search_createsCorrectSnippetHighlight() = runBlocking { + val query = "Test" + mockEpubBook.chapters.first() + val content = "A simple Test case." + val annotatedString = buildAnnotatedStringWithHighlight(content, query) + + val spanStyles = annotatedString.spanStyles + assertThat(spanStyles).hasSize(1) + + val style = spanStyles.first().item + assertThat(style.fontWeight).isEqualTo(FontWeight.Bold) + + val start = spanStyles.first().start + val end = spanStyles.first().end + assertThat(annotatedString.substring(start, end)).isEqualTo(query) + } + + @Suppress("SameParameterValue") + private fun buildAnnotatedStringWithHighlight(content: String, query: String): AnnotatedString { + return buildAnnotatedString { + append(content) + val highlightStart = content.indexOf(query, ignoreCase = true) + if (highlightStart != -1) { + addStyle( + style = SpanStyle(fontWeight = FontWeight.Bold), + start = highlightStart, + end = highlightStart + query.length + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/epubreader/MainDispatcherRule.kt b/app/src/androidTest/java/com/aryan/reader/epubreader/MainDispatcherRule.kt new file mode 100644 index 0000000..1f804a0 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/epubreader/MainDispatcherRule.kt @@ -0,0 +1,27 @@ +package com.aryan.reader.epubreader + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain +import org.junit.rules.TestWatcher +import org.junit.runner.Description + +/** + * A JUnit TestRule that sets the Main dispatcher to a TestDispatcher for the duration of a test. + * This allows tests to execute coroutines on the Main dispatcher without needing a real Android environment. + */ +@OptIn(ExperimentalCoroutinesApi::class) +class MainDispatcherRule( + private val testDispatcher: TestDispatcher = UnconfinedTestDispatcher() +) : TestWatcher() { + override fun starting(description: Description) { + Dispatchers.setMain(testDispatcher) + } + + override fun finished(description: Description) { + Dispatchers.resetMain() + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/paginatedreader/CssParserTest.kt b/app/src/androidTest/java/com/aryan/reader/paginatedreader/CssParserTest.kt new file mode 100644 index 0000000..c6fe395 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/paginatedreader/CssParserTest.kt @@ -0,0 +1,336 @@ +// CssParserTest.kt +package com.aryan.reader.paginatedreader + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.isSpecified +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.em +import com.google.common.truth.Truth.assertThat +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class CssParserTest { + + @Test + fun parseColor_handlesNamedColorsCorrectly() { + assertThat(CssParser.parseColor("red")).isEqualTo(Color.Red) + assertThat(CssParser.parseColor("black")).isEqualTo(Color.Black) + assertThat(CssParser.parseColor("transparent")).isEqualTo(Color.Transparent) + } + + @Test + fun parseColor_handles3DigitHexCodes() { + assertThat(CssParser.parseColor("#F0C")).isEqualTo(Color(0xFFFF00CC)) + } + + @Test + fun parseColor_handles6DigitHexCodes() { + assertThat(CssParser.parseColor("#FF00CC")).isEqualTo(Color(0xFFFF00CC)) + } + + @Test + fun parseColor_handles8DigitHexCodes() { + assertThat(CssParser.parseColor("#80FF00CC")).isEqualTo(Color(0x80FF00CC)) + } + + @Test + fun parseColor_handlesRgbFunction() { + assertThat(CssParser.parseColor("rgb(255, 0, 204)")).isEqualTo(Color(255, 0, 204)) + } + + @Test + fun parseColor_handlesRgbaFunction() { + assertThat(CssParser.parseColor("rgba(255, 0, 204, 0.5)")).isEqualTo(Color(255, 0, 204, 128)) + } + + @Test + fun parseColor_returnsNullForInvalidInput() { + assertThat(CssParser.parseColor("not a color")).isNull() + assertThat(CssParser.parseColor("#12345")).isNull() + assertThat(CssParser.parseColor("rgb(1,2)")).isNull() + } + + private val dummyConstraints = androidx.compose.ui.unit.Constraints() + private val baseFontSize = 16f + private val density = 1f + + @Test + fun parse_handlesSimpleRule() { + val css = "p { color: red; }" + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + val rules = result.rules.byTag["p"] + assertThat(rules).hasSize(1) + assertThat(rules?.first()?.style?.spanStyle?.color).isEqualTo(Color.Red) + } + + @Test + fun parse_handlesMultipleSelectors() { + val css = "h1, h2, h3 { font-weight: bold; }" + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + assertThat(result.rules.byTag["h1"]).hasSize(1) + assertThat(result.rules.byTag["h2"]).hasSize(1) + assertThat(result.rules.byTag["h3"]).hasSize(1) + assertThat(result.rules.byTag["h1"]?.first()?.style?.spanStyle?.fontWeight).isEqualTo(FontWeight.Bold) + assertThat(result.rules.byTag["h2"]?.first()?.style?.spanStyle?.fontWeight).isEqualTo(FontWeight.Bold) + assertThat(result.rules.byTag["h3"]?.first()?.style?.spanStyle?.fontWeight).isEqualTo(FontWeight.Bold) + } + + @Test + fun parse_handlesImportantRules() { + val css = "p { color: red !important; }" + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + val importantRule = result.rules.byTag["p"]?.find { it.selector.specificity >= 10000 } + assertThat(importantRule).isNotNull() + assertThat(importantRule!!.style.spanStyle.color).isEqualTo(Color.Red) + val normalRule = result.rules.byTag["p"]?.find { it.selector.specificity < 10000 } + assertThat(normalRule).isNull() + } + + @Test + fun parse_createsBothNormalAndImportantRulesWhenMixed() { + val css = "p { color: blue; background-color: white !important; }" + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + val rules = result.rules.byTag["p"] + assertThat(rules).hasSize(2) + + val importantRule = rules?.find { it.selector.specificity >= 10000 } + assertThat(importantRule).isNotNull() + assertThat(importantRule!!.style.blockStyle.backgroundColor).isEqualTo(Color.White) + assertThat(importantRule.style.spanStyle.color.isSpecified).isFalse() + + val normalRule = rules.find { it.selector.specificity < 10000 } + assertThat(normalRule).isNotNull() + assertThat(normalRule!!.style.spanStyle.color).isEqualTo(Color.Blue) + assertThat(normalRule.style.blockStyle.backgroundColor.isSpecified).isFalse() + } + + @Test + fun parse_extractsFontFaceRulesAndResolvesPath() { + val css = """ + @font-face { + font-family: "MyCustomFont"; + src: url("../fonts/myfont.ttf"); + font-weight: bold; + } + p { color: black; } + """.trimIndent() + val result = CssParser.parse(css, "/some/path/style.css", baseFontSize, density, dummyConstraints, isDarkTheme = false) + assertThat(result.rules.byTag).containsKey("p") + assertThat(result.fontFaces).hasSize(1) + val fontFace = result.fontFaces.first() + assertThat(fontFace.fontFamily).isEqualTo("mycustomfont") + assertThat(fontFace.src).isEqualTo("/some/fonts/myfont.ttf") + assertThat(fontFace.fontWeight).isEqualTo(FontWeight.Bold) + assertThat(fontFace.fontStyle).isEqualTo(FontStyle.Normal) + } + + @Test + fun parse_handlesFontFaceWithDataUri() { + val dataUri = "data:font/truetype;base64,AAEAAA..." + val css = """ + @font-face { + font-family: 'MyDataFont'; + src: url('$dataUri'); + } + """.trimIndent() + val result = CssParser.parse(css, "/css/style.css", baseFontSize, density, dummyConstraints, isDarkTheme = false) + assertThat(result.fontFaces).hasSize(1) + assertThat(result.fontFaces.first().src).isEqualTo(dataUri) + } + + @Test + fun parse_sanitizesPseudoClassesFromSelectors() { + val css = "a:hover, p::first-line, button:focus { color: red; }" + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + assertThat(result.rules.byTag.keys).containsExactly("a", "p", "button") + } + + @Test + fun parse_calculatesSpecificityCorrectly() { + val css = """ + #myId { color: red; } /* 100 */ + p.myClass { color: green; } /* 11 */ + p { color: blue; } /* 1 */ + div p { color: yellow; } /* 2 */ + """.trimIndent() + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + val idRule = result.rules.byId["myId"]?.first() + val classRule = result.rules.otherComplex.find { it.selector.selector == "p.myClass" } + val elementRule = result.rules.byTag["p"]?.first() + val descendantRule = result.rules.otherComplex.find { it.selector.selector == "div p" } + + assertThat(idRule?.selector?.specificity).isEqualTo(100) + assertThat(classRule?.selector?.specificity).isEqualTo(11) + assertThat(elementRule?.selector?.specificity).isEqualTo(1) + assertThat(descendantRule?.selector?.specificity).isEqualTo(2) + } + + @Test + fun parse_ignoresComments() { + val css = """ + /* This is a comment */ + p { + color: /* another comment */ blue; /* block comment */ + } + """.trimIndent() + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + val rules = result.rules.byTag["p"] + assertThat(rules).hasSize(1) + assertThat(rules?.first()?.style?.spanStyle?.color).isEqualTo(Color.Blue) + } + + @Test + fun parse_handlesBorderShorthand() { + val css = "div { border: 2px solid red; }" + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + val style = result.rules.byTag["div"]?.first()?.style?.blockStyle + assertThat(style?.border).isNotNull() + assertThat(style?.border?.width).isEqualTo(2.dp) + assertThat(style?.border?.style).isEqualTo("solid") + assertThat(style?.border?.color).isEqualTo(Color.Red) + } + + @Test + fun parse_handlesMarginAndPaddingShorthand() { + val css = "p { margin: 10px 20px; padding: 1em 2em 3em 4em; }" + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + val style = result.rules.byTag["p"]?.first()?.style?.blockStyle + assertThat(style?.margin?.top).isEqualTo(10.dp) + assertThat(style?.margin?.right).isEqualTo(20.dp) + assertThat(style?.margin?.bottom).isEqualTo(10.dp) + assertThat(style?.margin?.left).isEqualTo(20.dp) + + assertThat(style?.padding?.top).isEqualTo(16.dp) // 1em + assertThat(style?.padding?.right).isEqualTo(32.dp) // 2em + assertThat(style?.padding?.bottom).isEqualTo(48.dp) // 3em + assertThat(style?.padding?.left).isEqualTo(64.dp) // 4em + } + + @Test + fun parse_handlesFontSizeWithEmUnits() { + val css = "p { font-size: 1.2em; }" + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + val style = result.rules.byTag["p"]?.first()?.style + assertThat(style?.fontSize?.isEm).isTrue() + assertThat(style?.fontSize?.value).isEqualTo(1.2f) + } + + @Test + fun parse_optimizationCategorizesRulesCorrectly() { + val css = """ + p { color: blue; } + .myClass { color: green; } + #myId { color: red; } + div > p { color: yellow; } + """.trimIndent() + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + assertThat(result.rules.byTag).containsKey("p") + assertThat(result.rules.byClass).containsKey("myClass") + assertThat(result.rules.byId).containsKey("myId") + assertThat(result.rules.otherComplex).hasSize(1) + assertThat(result.rules.otherComplex.first().selector.selector).isEqualTo("div > p") + } + + @Test + fun parse_mediaQueryAppliesDarkThemeRules() { + val css = """ + p { color: black; } + @media (prefers-color-scheme: dark) { + p { color: white; } + } + """.trimIndent() + val lightResult = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + assertThat(lightResult.rules.byTag["p"]?.first()?.style?.spanStyle?.color).isEqualTo(Color.Black) + + val darkResult = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = true) + assertThat(darkResult.rules.byTag["p"]?.last()?.style?.spanStyle?.color).isEqualTo(Color.White) + } + + @Test + fun parse_fontFaceSelectsPreferredSourceFormat() { + val css = """ + @font-face { + font-family: "MyFont"; + src: url("font.woff2") format("woff2"), + url("font.otf") format("opentype"), + url("font.ttf") format("truetype"); + } + """.trimIndent() + val result = CssParser.parse(css, "/css/style.css", baseFontSize, density, dummyConstraints, isDarkTheme = false) + assertThat(result.fontFaces).hasSize(1) + assertThat(result.fontFaces.first().src).isEqualTo("/css/font.otf") + } + + @Test + fun parse_propertiesHandlesVariousUnitsAndValues() { + val css = """ + p { + font-size: 150%; + text-transform: uppercase; + text-decoration: underline; + text-align: center; + page-break-inside: avoid; + margin: 0 auto; + } + """.trimIndent() + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + val style = result.rules.byTag["p"]?.first()?.style + assertThat(style?.fontSize).isEqualTo(1.5.em) + assertThat(style?.textTransform).isEqualTo("uppercase") + assertThat(style?.spanStyle?.textDecoration).isEqualTo(TextDecoration.Underline) + assertThat(style?.paragraphStyle?.textAlign).isEqualTo(TextAlign.Center) + assertThat(style?.blockStyle?.pageBreakInsideAvoid).isTrue() + assertThat(style?.blockStyle?.horizontalAlign).isEqualTo("center") + } + + @Test + fun parse_themeAdaptationAdaptsColorsCorrectlyForDarkTheme() { + val css = "p { color: #111; background-color: #EEE; }" // very dark text, very light bg + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = true) + val style = result.rules.byTag["p"]?.first()?.style + + assertThat(style?.spanStyle?.color).isEqualTo(Color.White.copy(alpha = 0.87f)) + assertThat(style?.blockStyle?.backgroundColor).isEqualTo(Color.Transparent) + } + + @Test + fun parse_dataUriWithSemicolonParsesCorrectly() { + val dataUri = "data:font/opentype;base64,d09GMgABAAAAAAPs...;something=else" + val css = """ + @font-face { + font-family: 'MyDataFont'; + src: url('$dataUri'); + } + p { color: red; } + """.trimIndent() + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + assertThat(result.fontFaces).hasSize(1) + assertThat(result.fontFaces.first().src).isEqualTo(dataUri) + assertThat(result.rules.byTag).containsKey("p") + } + + @Test + fun parse_textEmphasisParsesCorrectly() { + val css = "p { -epub-text-emphasis-style: filled dot; -epub-text-emphasis-color: red; }" + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + val emphasis = result.rules.byTag["p"]?.first()?.style?.textEmphasis + assertThat(emphasis).isNotNull() + assertThat(emphasis?.style).isEqualTo("dot") + assertThat(emphasis?.fill).isEqualTo("filled") + assertThat(emphasis?.color).isEqualTo(Color.Red) + } + + @Test + fun parse_lineHeightClampsSmallEmValues() { + val css = "p { line-height: 1.1; }" // This is treated as 1.1em + val result = CssParser.parse(css, null, baseFontSize, density, dummyConstraints, isDarkTheme = false) + val style = result.rules.byTag["p"]?.first()?.style + assertThat(style?.paragraphStyle?.lineHeight).isEqualTo(2.0.em) + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/paginatedreader/HtmlParserTest.kt b/app/src/androidTest/java/com/aryan/reader/paginatedreader/HtmlParserTest.kt new file mode 100644 index 0000000..25996eb --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/paginatedreader/HtmlParserTest.kt @@ -0,0 +1,375 @@ +// HtmlParserTest.kt +package com.aryan.reader.paginatedreader + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.Constraints +import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.sp +import com.google.common.truth.Truth.assertThat +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.platform.app.InstrumentationRegistry +import org.junit.Test +import org.junit.runner.RunWith +import java.io.File + +@RunWith(AndroidJUnit4::class) +class HtmlParserTest { + + // region Test Setup + private val defaultTextStyle = TextStyle.Default.copy(fontSize = 16.sp, color = Color.Black) + private val defaultDensity = Density(density = 1f, fontScale = 1f) + private val defaultConstraints = Constraints(maxWidth = 1000) + private val defaultChapterPath = "OEBPS/chapter1.xhtml" + private val defaultExtractionPath = InstrumentationRegistry.getInstrumentation().targetContext.cacheDir.absolutePath + "/epub_test/" + + private fun parse( + html: String, + cssRules: OptimizedCssRules? = null, + mathSvgCache: Map = emptyMap() + ): List { + val userAgentRules = CssParser.parse( + cssContent = UserAgentStylesheet.default, + cssPath = null, + baseFontSizeSp = defaultTextStyle.fontSize.value, + density = defaultDensity.density, + constraints = defaultConstraints, + isDarkTheme = false // This is for CSS parsing, not the semantic parser + ).rules + + val allRules = cssRules?.let { userAgentRules.merge(it) } ?: userAgentRules + + return htmlToSemanticBlocks( + html = "$html", // Wrap in body to match real usage + cssRules = allRules, // Use the combined list of rules + textStyle = defaultTextStyle, + chapterAbsPath = defaultChapterPath, + extractionBasePath = defaultExtractionPath, + density = defaultDensity, + fontFamilyMap = emptyMap(), + constraints = defaultConstraints, + mathSvgCache = mathSvgCache + ) + } + + @Test + fun htmlToSemanticBlocks_simpleParagraphTag_createsSemanticParagraph() { + val blocks = parse("

Hello World

") + + assertThat(blocks).hasSize(1) + val block = blocks.first() + assertThat(block).isInstanceOf(SemanticParagraph::class.java) + val pBlock = block as SemanticParagraph + assertThat(pBlock.text).isEqualTo("Hello World") + } + + @Test + fun htmlToSemanticBlocks_headerTag_createsSemanticHeaderWithCorrectLevel() { + val blocks = parse("

Chapter 2

") + + assertThat(blocks).hasSize(1) + val block = blocks.first() + assertThat(block).isInstanceOf(SemanticHeader::class.java) + val hBlock = block as SemanticHeader + assertThat(hBlock.text).isEqualTo("Chapter 2") + assertThat(hBlock.level).isEqualTo(2) + } + + @Test + fun htmlToSemanticBlocks_nestedTag_inheritsStyleFromParent() { + val blocks = parse("

This text should be red.

") + + assertThat(blocks).hasSize(1) + val pBlock = blocks.first() as SemanticParagraph + assertThat(pBlock.text).isEqualTo("This text should be red.") + assertThat(pBlock.style.spanStyle.color).isEqualTo(Color.Red) + } + + @Test + fun htmlToSemanticBlocks_inlineStyle_overridesCssRule() { + val css = "p { color: red; }" + val cssRules = CssParser.parse(css, null, 16f, 1f, defaultConstraints, isDarkTheme = false).rules + + val blocks = parse("

I am green.

", cssRules = cssRules) + + assertThat(blocks).hasSize(1) + val pBlock = blocks.first() as SemanticParagraph + val blockStyle = pBlock.style.spanStyle + assertThat(blockStyle.color).isEqualTo(Color.Green) + } + + @Test + fun htmlToSemanticBlocks_elementWithDisplayNone_isNotIncludedInOutput() { + val blocks = parse("

Visible

Invisible

") + + assertThat(blocks).hasSize(1) + assertThat((blocks.first() as SemanticParagraph).text).isEqualTo("Visible") + } + + @Test + fun htmlToSemanticBlocks_imageWithNonExistentPath_producesNoBlock() { + // This tests the negative path where resolveImagePath returns null + val blocks = parse("") + + assertThat(blocks).isEmpty() + } + + @Test + fun htmlToSemanticBlocks_unorderedList_createsSemanticList() { + val blocks = parse("
  • Item 1
  • Item 2
") + + assertThat(blocks).hasSize(1) + val listBlock = blocks.first() as SemanticList + assertThat(listBlock.isOrdered).isFalse() + assertThat(listBlock.items).hasSize(2) + + val item1 = listBlock.items[0] + val item2 = listBlock.items[1] + + assertThat(item1.text).isEqualTo("Item 1") + assertThat(item2.text).isEqualTo("Item 2") + } + + @Test + fun htmlToSemanticBlocks_orderedListWithCssType_createsCorrectSemanticList() { + val css = "ol { list-style-type: lower-roman; }" + val cssRules = CssParser.parse(css, null, 16f, 1f, defaultConstraints, isDarkTheme = false).rules + + val blocks = parse("
  1. Item 1
  2. Item 2
", cssRules = cssRules) + + assertThat(blocks).hasSize(1) + val listBlock = blocks.first() as SemanticList + assertThat(listBlock.isOrdered).isTrue() + assertThat(listBlock.style.blockStyle.listStyleType).isEqualTo("lower-roman") + assertThat(listBlock.items).hasSize(2) + } + + + @Test + fun htmlToSemanticBlocks_table_createsSemanticTableWithCorrectStructure() { + val html = """ + + + + + + + + + +
Header 1Header 2
Data AData B
+ """.trimIndent() + + val blocks = parse(html) + + assertThat(blocks).hasSize(1) + val tableBlock = blocks.first() as SemanticTable + assertThat(tableBlock.rows).hasSize(2) + + // Verify Header Row + val headerRow = tableBlock.rows[0] + assertThat(headerRow).hasSize(2) + assertThat(headerRow[0].isHeader).isTrue() + assertThat((headerRow[0].content.first() as SemanticParagraph).text).isEqualTo("Header 1") + assertThat(headerRow[1].isHeader).isTrue() + assertThat((headerRow[1].content.first() as SemanticParagraph).text).isEqualTo("Header 2") + assertThat(headerRow[1].style.paragraphStyle.textAlign).isEqualTo(TextAlign.End) + + // Verify Data Row + val dataRow = tableBlock.rows[1] + assertThat(dataRow).hasSize(2) + assertThat(dataRow[0].isHeader).isFalse() + assertThat((dataRow[0].content.first() as SemanticParagraph).text).isEqualTo("Data A") + assertThat(dataRow[1].isHeader).isFalse() + assertThat((dataRow[1].content.first() as SemanticParagraph).text).isEqualTo("Data B") + } + + @Test + fun htmlToSemanticBlocks_textTransformations_areAppliedCorrectly() { + val blocks = parse("

hello world

") + + assertThat(blocks).hasSize(1) + val pBlock = blocks.first() as SemanticParagraph + // The transformation is applied during text building + assertThat(pBlock.text).isEqualTo("HELLO WORLD") + } + + @Test + fun htmlToSemanticBlocks_complexInlineFormatting_isPreserved() { + val html = "

This is bold and italic text.

" + val blocks = parse(html) + + assertThat(blocks).hasSize(1) + val pBlock = blocks.first() as SemanticParagraph + + assertThat(pBlock.text).isEqualTo("This is bold and italic text.") + + // Find the range for "bold" and check its style + val boldRange = pBlock.spans.find { pBlock.text.substring(it.start, it.end) == "bold" } + assertThat(boldRange).isNotNull() + assertThat(boldRange!!.style.spanStyle.fontWeight).isEqualTo(FontWeight.Bold) + + // Find the range for "italic" and check its style + val italicRange = + pBlock.spans.find { pBlock.text.substring(it.start, it.end) == "italic" } + assertThat(italicRange).isNotNull() + assertThat(italicRange!!.style.spanStyle.fontStyle).isEqualTo(androidx.compose.ui.text.font.FontStyle.Italic) + } + + @Test + fun htmlToSemanticBlocks_imageWithExistingPath_createsSemanticImageWithCorrectPath() { + // SETUP + val imageRelativeSrc = "../images/test.jpg" + val chapterParentDir = File(defaultChapterPath).parent ?: "" + val imageFile = File(File(defaultExtractionPath, chapterParentDir), imageRelativeSrc).canonicalFile + imageFile.parentFile?.mkdirs() + imageFile.createNewFile() + imageFile.deleteOnExit() + + // ACTION + val blocks = parse("\"A") + + // ASSERT + assertThat(blocks).hasSize(1) + val block = blocks.first() + assertThat(block).isInstanceOf(SemanticImage::class.java) + + val imageBlock = block as SemanticImage + assertThat(imageBlock.path).isEqualTo(imageFile.absolutePath) + assertThat(imageBlock.altText).isEqualTo("A test image") + } + + @Test + fun htmlToSemanticBlocks_pseudoElements_areIgnoredByTheParser() { + val css = "p::before { content: \"Note: \"; }" + val cssRules = CssParser.parse(css, null, 16f, 1f, defaultConstraints, isDarkTheme = false).rules + val blocks = parse("

This is a test.

", cssRules = cssRules) + + // The parser now ignores pseudo-elements, so only the paragraph content should be parsed. + assertThat(blocks).hasSize(1) + val pBlock = blocks[0] as SemanticParagraph + assertThat(pBlock.text).isEqualTo("This is a test.") + } + + @Test + fun htmlToSemanticBlocks_hrWithPseudoElement_ignoresPseudoElement() { + val css = "hr.fancy::after { content: ''; display: block; border-bottom: 2px solid blue; }" + val cssRules = CssParser.parse(css, null, 16f, 1f, defaultConstraints, isDarkTheme = false).rules + val blocks = parse("
", cssRules = cssRules) + + // The pseudo-element is ignored, so only the spacer from
is created. + assertThat(blocks).hasSize(1) + assertThat(blocks[0]).isInstanceOf(SemanticSpacer::class.java) + } + + @Test + fun htmlToSemanticBlocks_inlineSvg_createsSemanticMathWithCorrectContent() { + val svg = """ + + My SVG + + Hello + +""".trimIndent() + val blocks = parse(svg) + + assertThat(blocks).hasSize(1) + val block = blocks.first() + assertThat(block).isInstanceOf(SemanticMath::class.java) + + val mathBlock = block as SemanticMath + assertThat(mathBlock.altText).isEqualTo("My SVG") + // The parser now passes the SVG content through as-is. + assertThat(mathBlock.svgContent).contains("""Hello""") + } + + @Test + fun htmlToSemanticBlocks_imgTagWithSvgSource_createsSemanticMath() { + // SETUP + val svgContent = """""" + val svgRelativeSrc = "images/test.svg" + val chapterParentDir = File(defaultChapterPath).parent ?: "" + val svgFile = File(File(defaultExtractionPath, chapterParentDir), svgRelativeSrc).canonicalFile + svgFile.parentFile?.mkdirs() + svgFile.writeText(svgContent) + svgFile.deleteOnExit() + + // ACTION + val blocks = parse("") + + // ASSERT + assertThat(blocks).hasSize(1) + val block = blocks.first() + assertThat(block).isInstanceOf(SemanticMath::class.java) + val mathBlock = block as SemanticMath + assertThat(mathBlock.svgContent).contains("""", + mathSvgCache = cache + ) + + assertThat(blocks).hasSize(1) + val block = blocks.first() as SemanticMath + assertThat(block.svgContent).isEqualTo(svgContent) + assertThat(block.altText).isEqualTo("An equation") + assertThat(block.isFromMathJax).isTrue() + } + + @Test + fun htmlToSemanticBlocks_displayFlex_createsSemanticFlexContainer() { + val html = """ +
+

One

+

Two

+
+""".trimIndent() + val blocks = parse(html) + + assertThat(blocks).hasSize(1) + val block = blocks.first() + assertThat(block).isInstanceOf(SemanticFlexContainer::class.java) + + val flexBlock = block as SemanticFlexContainer + assertThat(flexBlock.children).hasSize(2) + assertThat(flexBlock.children[0]).isInstanceOf(SemanticParagraph::class.java) + assertThat((flexBlock.children[0] as SemanticParagraph).text).isEqualTo("One") + } + + @Test + fun htmlToSemanticBlocks_brTagInParagraph_createsNewlineCharacter() { + val blocks = parse("

Line one.
Line two.

") + + assertThat(blocks).hasSize(1) + val pBlock = blocks.first() as SemanticParagraph + assertThat(pBlock.text).isEqualTo("Line one.\nLine two.") + } + + @Test + fun htmlToSemanticBlocks_imageWithRootRelativePath_resolvesCorrectly() { + // SETUP + val imageRootRelativeSrc = "images/test.jpg" + val imageFile = File(defaultExtractionPath, imageRootRelativeSrc).canonicalFile + imageFile.parentFile?.mkdirs() + imageFile.createNewFile() + imageFile.deleteOnExit() + + // ACTION + val blocks = parse("\"A") + + // ASSERT + assertThat(blocks).hasSize(1) + val block = blocks.first() + assertThat(block).isInstanceOf(SemanticImage::class.java) + + val imageBlock = block as SemanticImage + assertThat(imageBlock.path).isEqualTo(imageFile.absolutePath) + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/paginatedreader/MainDispatcherRule.kt b/app/src/androidTest/java/com/aryan/reader/paginatedreader/MainDispatcherRule.kt new file mode 100644 index 0000000..a6d31f8 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/paginatedreader/MainDispatcherRule.kt @@ -0,0 +1,35 @@ +// MainDispatcherRule.kt +package com.aryan.reader.paginatedreader + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain +import org.junit.rules.TestRule +import org.junit.runner.Description +import org.junit.runners.model.Statement + +/** + * A JUnit TestRule that sets the Main dispatcher to a TestDispatcher for the duration of a test. + * This allows tests to execute coroutines on the Main dispatcher without needing a real Android environment. + */ +@OptIn(ExperimentalCoroutinesApi::class) +class MainDispatcherRule( + val testDispatcher: TestDispatcher = UnconfinedTestDispatcher() +) : TestRule { + override fun apply(base: Statement, description: Description): Statement { + return object : Statement() { + @Throws(Throwable::class) + override fun evaluate() { + Dispatchers.setMain(testDispatcher) + try { + base.evaluate() + } finally { + Dispatchers.resetMain() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/paginatedreader/PaginatedReaderDataTest.kt b/app/src/androidTest/java/com/aryan/reader/paginatedreader/PaginatedReaderDataTest.kt new file mode 100644 index 0000000..dd56c8e --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/paginatedreader/PaginatedReaderDataTest.kt @@ -0,0 +1,120 @@ +// PaginatedReaderDataTest.kt +package com.aryan.reader.paginatedreader + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.text.ParagraphStyle +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.font.FontStyle +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import com.google.common.truth.Truth.assertThat +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class PaginatedReaderDataTest { + + @Test + fun cssStyle_mergeCorrectlyCombinesStyles() { + val baseStyle = CssStyle( + spanStyle = SpanStyle(color = Color.Black, fontWeight = FontWeight.Normal, fontSize = 16.sp), + paragraphStyle = ParagraphStyle(textAlign = TextAlign.Start), + fontFamilies = listOf("serif"), + display = "block" + ) + + val overrideStyle = CssStyle( + spanStyle = SpanStyle(color = Color.Red, fontStyle = FontStyle.Italic), + paragraphStyle = ParagraphStyle(textAlign = TextAlign.Center), + fontFamilies = listOf("sans-serif"), + textTransform = "uppercase" + ) + + val merged = baseStyle.merge(overrideStyle) + + // Overridden properties + assertThat(merged.spanStyle.color).isEqualTo(Color.Red) + assertThat(merged.spanStyle.fontStyle).isEqualTo(FontStyle.Italic) + assertThat(merged.paragraphStyle.textAlign).isEqualTo(TextAlign.Center) + assertThat(merged.fontFamilies).containsExactly("sans-serif") + assertThat(merged.textTransform).isEqualTo("uppercase") + + // Inherited properties + assertThat(merged.spanStyle.fontWeight).isEqualTo(FontWeight.Normal) + assertThat(merged.spanStyle.fontSize).isEqualTo(16.sp) + assertThat(merged.display).isEqualTo("block") + } + + @Test + fun cssStyle_mergeWithEmptyOverrideDoesNotChangeBase() { + val baseStyle = CssStyle( + spanStyle = SpanStyle(color = Color.Black, fontWeight = FontWeight.Normal), + fontFamilies = listOf("serif") + ) + val overrideStyle = CssStyle() + + val merged = baseStyle.merge(overrideStyle) + + assertThat(merged).isEqualTo(baseStyle) + } + + @Test + fun blockStyle_mergeUsesOverrideProperties() { + val baseStyle = BlockStyle( + padding = BoxBorders(top = 10.dp, left = 10.dp), + margin = BoxBorders(top = 5.dp, bottom = 5.dp), + width = 100.dp, + backgroundColor = Color.White + ) + + val overrideStyle = BlockStyle( + padding = BoxBorders(top = 5.dp, right = 5.dp), + margin = BoxBorders(bottom = 10.dp, left = 10.dp), + width = 200.dp, + backgroundColor = Color.Black, + border = BorderStyle(width = 1.dp, color = Color.Red) + ) + + val merged = baseStyle.merge(overrideStyle) + + // Padding should be from override, not additive + assertThat(merged.padding.top).isEqualTo(5.dp) + assertThat(merged.padding.left).isEqualTo(10.dp) // from base + assertThat(merged.padding.right).isEqualTo(5.dp) + assertThat(merged.padding.bottom).isEqualTo(0.dp) // from base + + // Margin should be from override + assertThat(merged.margin.top).isEqualTo(5.dp) // from base + assertThat(merged.margin.bottom).isEqualTo(10.dp) + assertThat(merged.margin.left).isEqualTo(10.dp) + assertThat(merged.margin.right).isEqualTo(0.dp) // from base + + // Other properties + assertThat(merged.width).isEqualTo(200.dp) + assertThat(merged.backgroundColor).isEqualTo(Color.Black) + assertThat(merged.border).isNotNull() + assertThat(merged.border?.width).isEqualTo(1.dp) + } + + @Test + fun blockStyle_mergeWithEmptyOverrideDoesNotChangeBase() { + val baseStyle = BlockStyle( + padding = BoxBorders(10.dp, 10.dp, 10.dp, 10.dp), + margin = BoxBorders(5.dp, 5.dp, 5.dp, 5.dp), + width = 100.dp, + backgroundColor = Color.White + ) + val overrideStyle = BlockStyle() + + val merged = baseStyle.merge(overrideStyle) + + assertThat(merged.padding.top).isEqualTo(10.dp) + assertThat(merged.margin.top).isEqualTo(5.dp) + assertThat(merged.width).isEqualTo(100.dp) + assertThat(merged.backgroundColor).isEqualTo(Color.White) + assertThat(merged.border).isNull() + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/paginatedreader/PaginatedReaderViewModelTest.kt b/app/src/androidTest/java/com/aryan/reader/paginatedreader/PaginatedReaderViewModelTest.kt new file mode 100644 index 0000000..c839650 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/paginatedreader/PaginatedReaderViewModelTest.kt @@ -0,0 +1,304 @@ +// PaginatedReaderViewModelTest.kt +package com.aryan.reader.paginatedreader + +import android.content.Context +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.compose.runtime.snapshots.Snapshot +import androidx.compose.ui.text.TextMeasurer +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.unit.Constraints +import androidx.compose.ui.unit.Density +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.aryan.reader.SearchResult +import com.aryan.reader.epub.EpubBook +import com.aryan.reader.epub.EpubChapter +import com.aryan.reader.paginatedreader.data.BookCacheDao +import com.aryan.reader.paginatedreader.data.BookCacheDatabase +import com.aryan.reader.paginatedreader.data.BookProcessingWorker +import com.google.common.truth.Truth.assertThat +import io.mockk.coEvery +import io.mockk.every +import io.mockk.mockk +import io.mockk.mockkObject +import io.mockk.unmockkAll +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.emptyFlow +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +private class FakePaginator( + initiallyLoading: Boolean, + initialPageCount: Int, + initialGeneration: Int +) : IPaginator { + override var isLoading by mutableStateOf(initiallyLoading) + override var totalPageCount by mutableIntStateOf(initialPageCount) + override var generation by mutableIntStateOf(initialGeneration) + override val pageShiftRequest: Flow = emptyFlow() + + var lastNavigatedHref: String? = null + var lastNavigatedChapter: String? = null + + override fun getPageContent(pageIndex: Int): Page? = null + override fun getChapterPathForPage(pageIndex: Int): String? = null + override fun getPlainTextForChapter(chapterIndex: Int): String? = null + + override fun navigateToHref( + currentChapterAbsPath: String, + href: String, + onNavigationComplete: (pageIndex: Int) -> Unit + ) { + lastNavigatedChapter = currentChapterAbsPath + lastNavigatedHref = href + } + + override fun findPageForSearchResult( + result: SearchResult, + onResult: (Int) -> Unit + ) = Unit + + // Add stubs for the other missing interface members + override fun findPageForCfi(chapterIndex: Int, cfi: String, onResult: (Int) -> Unit) = Unit + override fun findPageForCfiAndOffset( + chapterIndex: Int, + cfi: String, + charOffset: Int + ): Int? { + return null + } + + override fun findChapterIndexForPage(pageIndex: Int): Int? = null + override fun getCfiForPage(pageIndex: Int): String? = null + override fun onUserScrolledTo(pageIndex: Int) = Unit +} + +@OptIn(ExperimentalCoroutinesApi::class) +@RunWith(AndroidJUnit4::class) +class PaginatedReaderViewModelTest { + + @get:Rule + val mainDispatcherRule = MainDispatcherRule() + + private lateinit var viewModel: PaginatedReaderViewModel + private lateinit var fakePaginator: FakePaginator + + @Before + fun setUp() { + viewModel = PaginatedReaderViewModel() + fakePaginator = FakePaginator( + initiallyLoading = true, + initialPageCount = 0, + initialGeneration = 0 + ) + viewModel.setPaginatorForTest(fakePaginator) + } + + @After + fun tearDown() { + unmockkAll() + } + + @Test + fun uiState_reflectsPaginatorInitialState() = runTest { + val initialState = viewModel.uiState.value + assertThat(initialState.isLoading).isTrue() + assertThat(initialState.totalPageCount).isEqualTo(0) + assertThat(initialState.generation).isEqualTo(0) + } + + @Test + fun uiState_updatesWhenPaginatorIsLoadingChanges() = runTest { + assertThat(viewModel.uiState.value.isLoading).isTrue() + + fakePaginator.isLoading = false + Snapshot.sendApplyNotifications() + advanceUntilIdle() + + assertThat(viewModel.uiState.value.isLoading).isFalse() + } + + @Test + fun uiState_updatesWhenPaginatorTotalPageCountChanges() = runTest { + assertThat(viewModel.uiState.value.totalPageCount).isEqualTo(0) + + fakePaginator.totalPageCount = 123 + Snapshot.sendApplyNotifications() + advanceUntilIdle() + + assertThat(viewModel.uiState.value.totalPageCount).isEqualTo(123) + } + + @Test + fun uiState_updatesWhenPaginatorGenerationChanges() = runTest { + assertThat(viewModel.uiState.value.generation).isEqualTo(0) + + fakePaginator.generation = 5 + Snapshot.sendApplyNotifications() + advanceUntilIdle() + + assertThat(viewModel.uiState.value.generation).isEqualTo(5) + } + + @Test + fun onLinkClick_callsPaginatorNavigateToHrefWithCorrectArguments() { + val currentChapter = "chapter1.xhtml" + val href = "#section2" + + viewModel.onLinkClick(currentChapter, href) {} + + assertThat(fakePaginator.lastNavigatedChapter).isEqualTo(currentChapter) + assertThat(fakePaginator.lastNavigatedHref).isEqualTo(href) + } + @Test + fun initialize_createsARealPaginatorAndUpdateState() = runTest { + // Arrange + val viewModel = PaginatedReaderViewModel() // Create a fresh ViewModel + val context = ApplicationProvider.getApplicationContext() + val textMeasurer = mockk(relaxed = true) + val constraints = Constraints(maxWidth = 1080, maxHeight = 1920) + val textStyle = TextStyle.Default + val density = Density(1f) + val mathMLRenderer = mockk(relaxed = true) + val testBook = EpubBook( + fileName = "test.epub", + title = "Test Book", + author = "Test Author", + language = "en", + coverImage = null, + chapters = listOf( + EpubChapter( + chapterId = "ch1", + title = "Chapter 1", + htmlFilePath = "ch1.html", + absPath = "/ops/ch1.html", + htmlContent = "

Some content

", + plainTextContent = "Some content" + ) + ), + css = mapOf("/ops/style.css" to "p {color: red;}"), + extractionBasePath = "" + ) + + // Mock dependencies for BookPaginator + val mockDao = mockk(relaxed = true) + coEvery { mockDao.getProcessedBook(any()) } returns null // Simulate cache miss + + val mockDb = mockk() + every { mockDb.bookCacheDao() } returns mockDao + + mockkObject(BookCacheDatabase.Companion) + every { BookCacheDatabase.getDatabase(any()) } returns mockDb + + mockkObject(BookProcessingWorker.Companion) + every { BookProcessingWorker.enqueue(any(), any(), any(), any(), any(), any()) } returns Unit + + // Pre-condition check + assertThat(viewModel.uiState.value.isLoading).isTrue() + assertThat(viewModel.paginator).isNull() + + // Act + viewModel.initialize( + book = testBook, + textMeasurer = textMeasurer, + textConstraints = constraints, + textStyle = textStyle, + density = density, + isDarkTheme = false, + context = context, + initialChapterToPaginate = 0, + mathMLRenderer = mathMLRenderer + ) + advanceUntilIdle() // Allow coroutines to complete + + // Assert + assertThat(viewModel.paginator).isInstanceOf(BookPaginator::class.java) + assertThat(viewModel.uiState.value.isLoading).isFalse() + assertThat(viewModel.uiState.value.totalPageCount).isGreaterThan(0) + } + + @Test + fun initialize_isIdempotent() = runTest { + // Arrange + val viewModel = PaginatedReaderViewModel() + val context = ApplicationProvider.getApplicationContext() + val textMeasurer = mockk(relaxed = true) + val constraints = Constraints(maxWidth = 1080, maxHeight = 1920) + val textStyle = TextStyle.Default + val density = Density(1f) + val mathMLRenderer = mockk(relaxed = true) + val testBook = EpubBook( + fileName = "test.epub", + title = "Test Book", + author = "Test Author", + language = "en", + coverImage = null, + chapters = listOf( + EpubChapter( + chapterId = "ch1", + title = "Chapter 1", + htmlFilePath = "ch1.html", + absPath = "/ops/ch1.html", + htmlContent = "

Some content

", + plainTextContent = "Some content" + ) + ), + css = mapOf("/ops/style.css" to "p {color: red;}"), + extractionBasePath = "" + ) + + // Mock dependencies + val mockDao = mockk(relaxed = true) + coEvery { mockDao.getProcessedBook(any()) } returns null + val mockDb = mockk() + every { mockDb.bookCacheDao() } returns mockDao + mockkObject(BookCacheDatabase.Companion) + every { BookCacheDatabase.getDatabase(any()) } returns mockDb + mockkObject(BookProcessingWorker.Companion) + every { BookProcessingWorker.enqueue(any(), any(), any(), any(), any(), any()) } returns Unit + + // Act + viewModel.initialize( + book = testBook, + textMeasurer = textMeasurer, + textConstraints = constraints, + textStyle = textStyle, + density = density, + isDarkTheme = false, + context = context, + initialChapterToPaginate = 0, + mathMLRenderer = mathMLRenderer + ) + advanceUntilIdle() + + val firstPaginator = viewModel.paginator + assertThat(firstPaginator).isNotNull() + + // Act again + viewModel.initialize( + book = testBook, + textMeasurer = textMeasurer, + textConstraints = constraints, + textStyle = textStyle, + density = density, + isDarkTheme = false, + context = context, + initialChapterToPaginate = 0, + mathMLRenderer = mathMLRenderer + ) + advanceUntilIdle() + + // Assert + val secondPaginator = viewModel.paginator + assertThat(secondPaginator).isSameInstanceAs(firstPaginator) + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/paginatedreader/PaginatorTest.kt b/app/src/androidTest/java/com/aryan/reader/paginatedreader/PaginatorTest.kt new file mode 100644 index 0000000..b04283f --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/paginatedreader/PaginatorTest.kt @@ -0,0 +1,278 @@ +// PaginatorTest.kt +package com.aryan.reader.paginatedreader + +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.dp +import com.google.common.truth.Truth.assertThat +import androidx.test.ext.junit.runners.AndroidJUnit4 +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith + +class FakeSplittableMeasurementProvider( + private val heights: Map, + private val splittableParagraphs: Map> = emptyMap(), + private val splittableWrappers: Map>> = emptyMap() +) : BlockMeasurementProvider { + override suspend fun measure(block: ContentBlock): Int { + // Provide a more helpful error message if a block's height is not defined. + return heights[block] ?: error("No height specified for block: $block") + } + + override suspend fun split(block: ParagraphBlock, availableHeight: Int): Pair? { + val splitPair = splittableParagraphs[block] + if (splitPair != null) { + val part1Height = heights[splitPair.first] ?: 0 + // Only return the split pair if the first part actually fits in the available height. + if (part1Height <= availableHeight) { + return splitPair + } + } + return null + } + + override suspend fun split(block: WrappingContentBlock, availableHeight: Int): Pair>? { + val splitPair = splittableWrappers[block] + if (splitPair != null) { + val part1Height = heights[splitPair.first] ?: 0 + if (part1Height <= availableHeight) { + return splitPair + } + } + return null + } +} + +@RunWith(AndroidJUnit4::class) +class PaginatorTest { + + private val testDensity = Density(density = 1f, fontScale = 1f) + private val pageHeight = 1000 + + @Test + fun paginate_givenEmptyBlocks_createsZeroPages() = runTest { + val pages = paginate(emptyList(), pageHeight, FakeSplittableMeasurementProvider(emptyMap()), testDensity) + assertThat(pages).isEmpty() + } + + @Test + fun paginate_givenBlocksThatFit_createsOnePage() = runTest { + val block1 = ParagraphBlock(content = AnnotatedString("Block 1"), blockIndex = 0) + val block2 = ParagraphBlock(content = AnnotatedString("Block 2"), blockIndex = 1) + val blocks = listOf(block1, block2) + + val measurementProvider = FakeSplittableMeasurementProvider( + heights = mapOf(block1 to 200, block2 to 300) + ) + + val pages = paginate(blocks, pageHeight, measurementProvider, testDensity) + + assertThat(pages).hasSize(1) + assertThat(pages.first().content).hasSize(2) + } + + @Test + fun paginate_givenBlockThatOverflows_createsTwoPages() = runTest { + val block1 = ParagraphBlock(content = AnnotatedString("Block 1"), blockIndex = 0) // Height: 600 + val block2 = ParagraphBlock(content = AnnotatedString("Block 2"), blockIndex = 1) // Height: 500 + val blocks = listOf(block1, block2) + + val measurementProvider = FakeSplittableMeasurementProvider( + heights = mapOf(block1 to 600, block2 to 500) + ) + + val pages = paginate(blocks, pageHeight, measurementProvider, testDensity) + + assertThat(pages).hasSize(2) + assertThat(pages[0].content).containsExactly(block1) + assertThat(pages[1].content).containsExactly(block2) + } + + @Test + fun paginate_correctlySplitsAParagraphBlock() = runTest { + val block1 = ParagraphBlock(content = AnnotatedString("First block"), blockIndex = 0) + val originalParagraph = ParagraphBlock(content = AnnotatedString("Long text to be split"), blockIndex = 1) + val part1 = ParagraphBlock(content = AnnotatedString("Long text"), blockIndex = 1) + val part2 = ParagraphBlock(content = AnnotatedString("to be split"), blockIndex = 1) + val blocks = listOf(block1, originalParagraph) + + val measurementProvider = FakeSplittableMeasurementProvider( + heights = mapOf( + block1 to 500, + originalParagraph to 800, + part1 to 450, // Fits in the remaining 500 + part2 to 350 + ), + splittableParagraphs = mapOf(originalParagraph to (part1 to part2)) + ) + + val pages = paginate(blocks, pageHeight, measurementProvider, testDensity) + + assertThat(pages).hasSize(2) + assertThat(pages[0].content).containsExactly(block1, part1).inOrder() + assertThat(pages[1].content).containsExactly(part2) + } + + @Test + fun paginate_correctlySplitsAWrappingContentBlock() = runTest { + val image = ImageBlock("image.png", null, 100f, 300f, blockIndex = 0) + val para1 = ParagraphBlock(content = AnnotatedString("Para 1"), blockIndex = 1) + val para2 = ParagraphBlock(content = AnnotatedString("Para 2"), blockIndex = 2) + val originalWrapper = WrappingContentBlock(floatedImage = image, paragraphsToWrap = listOf(para1, para2), blockIndex = 3) + + val splitWrapper = WrappingContentBlock(floatedImage = image, paragraphsToWrap = listOf(para1), blockIndex = 3) + val remainingBlocks = listOf(para2) + + val measurementProvider = FakeSplittableMeasurementProvider( + heights = mapOf( + originalWrapper to 1500, + splitWrapper to 300, + para2 to 200 + ), + splittableWrappers = mapOf(originalWrapper to (splitWrapper to remainingBlocks)) + ) + + val pages = paginate(listOf(originalWrapper), pageHeight, measurementProvider, testDensity) + + assertThat(pages).hasSize(2) + assertThat(pages[0].content).containsExactly(splitWrapper) + assertThat(pages[1].content).containsExactly(para2) + } + + + @Test + fun paginate_respectsPageBreakInsideAvoid() = runTest { + val block1 = ParagraphBlock(content = AnnotatedString("First block"), blockIndex = 0) // Height 800 + val unsplittableBlock = ParagraphBlock( + content = AnnotatedString("Can't split me"), + style = BlockStyle(pageBreakInsideAvoid = true), + blockIndex = 1 + ) // Height 300 + val blocks = listOf(block1, unsplittableBlock) + + val measurementProvider = FakeSplittableMeasurementProvider( + heights = mapOf(block1 to 800, unsplittableBlock to 300) + ) + + val pages = paginate(blocks, pageHeight, measurementProvider, testDensity) + + assertThat(pages).hasSize(2) + assertThat(pages[0].content).containsExactly(block1) + assertThat(pages[1].content).containsExactly(unsplittableBlock) + } + + @Test + fun paginate_oversizedUnsplittableBlockGetsItsOwnPage() = runTest { + val oversizedBlock = ImageBlock(path = "test.jpg", altText = null, blockIndex = 0) // Height 1200 + val blocks = listOf(oversizedBlock) + + val measurementProvider = FakeSplittableMeasurementProvider(heights = mapOf(oversizedBlock to 1200)) + + val pages = paginate(blocks, pageHeight, measurementProvider, testDensity) + + assertThat(pages).hasSize(1) + assertThat(pages[0].content).containsExactly(oversizedBlock) + } + + @Test + fun paginate_collapsesVerticalMarginsBetweenBlocks() = runTest { + val block1 = ParagraphBlock( + content = AnnotatedString("Block 1"), + style = BlockStyle(margin = BoxBorders(bottom = 50.dp)), // 50px margin + blockIndex = 0 + ) + val block2 = ParagraphBlock( + content = AnnotatedString("Block 2"), + style = BlockStyle(margin = BoxBorders(top = 80.dp)), // 80px margin + blockIndex = 1 + ) + val blocks = listOf(block1, block2) + val measurementProvider = FakeSplittableMeasurementProvider( + heights = mapOf(block1 to 100, block2 to 100) + ) + + val pages = paginate(blocks, pageHeight, measurementProvider, testDensity) + + assertThat(pages).hasSize(1) + val pageContent = pages.first().content + assertThat(pageContent).hasSize(2) + // The paginator logic sets the bottom margin of the previous block to 0 + // and sets the top margin of the current block to the collapsed value. + assertThat(pageContent[0].style.margin.bottom).isEqualTo(0.dp) + assertThat(pageContent[1].style.margin.top).isEqualTo(80.dp) // max(50, 80) is 80 + } + + @Test + fun paginate_preservesTopMarginOfTheFirstBlockOnANewPage() = runTest { + val block1 = ParagraphBlock( + content = AnnotatedString("Block 1"), + style = BlockStyle(margin = BoxBorders(top = 30.dp)), + blockIndex = 0 + ) + val block2 = ParagraphBlock(content = AnnotatedString("Block 2"), blockIndex = 1) + val blocks = listOf(block1, block2) + val measurementProvider = FakeSplittableMeasurementProvider( + heights = mapOf(block1 to 980, block2 to 100) + ) + + val pages = paginate(blocks, pageHeight, measurementProvider, testDensity) + assertThat(pages).hasSize(2) + + // First block on page 1 should have its top margin preserved. + val page1Block1 = pages[0].content.first() + assertThat(page1Block1.style.margin.top).isEqualTo(30.dp) + + // First block on page 2 should also have its top margin preserved. + val page2Block1 = pages[1].content.first() + assertThat(page2Block1.style.margin.top).isEqualTo(0.dp) // The default is 0.dp + } + + @Test + fun paginate_blockPushedToNextPageWhenNotEnoughSpaceForSplitting() = runTest { + val block1 = ParagraphBlock(content = AnnotatedString("Block 1"), blockIndex = 0) + val splittableBlock = ParagraphBlock(content = AnnotatedString("Splittable"), blockIndex = 1) + val part1 = ParagraphBlock(content = AnnotatedString("Split"), blockIndex = 1) + val part2 = ParagraphBlock(content = AnnotatedString("table"), blockIndex = 1) + val blocks = listOf(block1, splittableBlock) + + val measurementProvider = FakeSplittableMeasurementProvider( + heights = mapOf( + block1 to 960, // Leaves 40px remaining, which is < 50, so no split should occur + splittableBlock to 100, + part1 to 30, + part2 to 70 + ), + splittableParagraphs = mapOf(splittableBlock to (part1 to part2)) + ) + + val pages = paginate(blocks, pageHeight, measurementProvider, testDensity) + assertThat(pages).hasSize(2) + assertThat(pages[0].content).containsExactly(block1) + assertThat(pages[1].content).containsExactly(splittableBlock) // Was not split + } + + @Test + fun paginate_doesNotAddEmptyPart1AfterSplitting() = runTest { + val originalBlock = ParagraphBlock(content = AnnotatedString("Some text"), blockIndex = 0) + val part1 = ParagraphBlock(content = AnnotatedString(""), blockIndex = 0) // Empty part 1 + val part2 = ParagraphBlock(content = AnnotatedString("Some text"), blockIndex = 0) + val blocks = listOf(originalBlock) + + val measurementProvider = FakeSplittableMeasurementProvider( + heights = mapOf( + originalBlock to 200, + part1 to 0, + part2 to 200 + ), + splittableParagraphs = mapOf(originalBlock to (part1 to part2)) + ) + + // Set page height so that a split is attempted. + val pages = paginate(blocks, 150, measurementProvider, testDensity) + assertThat(pages).hasSize(1) + // The page should be empty because part1 was empty, and the original block was re-added + // to the remaining list. The next page then contains the full block. + assertThat(pages[0].content).containsExactly(part2) + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/paginatedreader/StyleUtilsTest.kt b/app/src/androidTest/java/com/aryan/reader/paginatedreader/StyleUtilsTest.kt new file mode 100644 index 0000000..9fddc60 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/paginatedreader/StyleUtilsTest.kt @@ -0,0 +1,115 @@ +// StyleUtilsTest.kt +package com.aryan.reader.paginatedreader + +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.isUnspecified +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import androidx.test.ext.junit.runners.AndroidJUnit4 +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class StyleUtilsTest { + + private val baseFontSizeSp = 16f + private val density = 2.0f + private val containerWidthPx = 1000 + + @Test + fun parseCssSizeToDp_handlesPxValues() { + assertThat(parseCssSizeToDp("100px", baseFontSizeSp, density, containerWidthPx)).isEqualTo(50.dp) + } + + @Test + fun parseCssSizeToDp_handlesEmValues() { + assertThat(parseCssSizeToDp("1.5em", baseFontSizeSp, density, containerWidthPx)).isEqualTo(24.dp) + } + + @Test + fun parseCssSizeToDp_handlesRemValues() { + assertThat(parseCssSizeToDp("2rem", baseFontSizeSp, density, containerWidthPx)).isEqualTo(32.dp) + } + + @Test + fun parseCssSizeToDp_handlesPtValues() { + assertThat(parseCssSizeToDp("12pt", baseFontSizeSp, density, containerWidthPx).value).isWithin(0.01f).of(8.0f) + } + + @Test + fun parseCssSizeToDp_handlesPercentageValues() { + // 50% of 1000px = 500px. 500px / 2.0 density = 250dp + assertThat(parseCssSizeToDp("50%", baseFontSizeSp, density, containerWidthPx)).isEqualTo(250.dp) + } + + @Test + fun parseCssSizeToDp_returns0ForInvalidInput() { + assertThat(parseCssSizeToDp("invalid", baseFontSizeSp, density, containerWidthPx)).isEqualTo(0.dp) + } + + @Test + fun parseCssSizeToDp_handlesZeroDensity() { + assertThat(parseCssSizeToDp("100px", baseFontSizeSp, 0f, containerWidthPx)).isEqualTo(0.dp) + } + + @Test + fun parseCssSizeToDp_handlesZeroContainerWidthForPercentage() { + assertThat(parseCssSizeToDp("50%", baseFontSizeSp, density, 0)).isEqualTo(0.dp) + } + + @Test + fun parseCssSizeToDp_handlesValuesWithWhitespace() { + assertThat(parseCssSizeToDp(" 1.5em ", baseFontSizeSp, density, containerWidthPx)).isEqualTo(24.dp) + } + + + @Test + fun parseCssDimensionToTextUnit_handlesPxValues() { + val result = parseCssDimensionToTextUnit("100px", containerWidthPx, density) + assertThat(result.isSp).isTrue() + assertThat(result.value).isWithin(0.01f).of(50f) + } + + @Test + fun parseCssDimensionToTextUnit_handlesEmValues() { + val result = parseCssDimensionToTextUnit("1.5em", containerWidthPx, density) + assertThat(result.isEm).isTrue() + assertThat(result.value).isEqualTo(1.5f) + } + + @Test + fun parseCssDimensionToTextUnit_handlesRemValues() { + // rem is treated as em + val result = parseCssDimensionToTextUnit("2rem", containerWidthPx, density) + assertThat(result.isEm).isTrue() + assertThat(result.value).isEqualTo(2f) + } + + @Test + fun parseCssDimensionToTextUnit_handlesPtValues() { + val result = parseCssDimensionToTextUnit("12pt", containerWidthPx, density) + assertThat(result.isSp).isTrue() + assertThat(result.value).isWithin(0.01f).of(8.0f) + } + + @Test + fun parseCssDimensionToTextUnit_handlesPercentageValues() { + val result = parseCssDimensionToTextUnit("50%", containerWidthPx, density) + assertThat(result.isSp).isTrue() + assertThat(result.value).isWithin(0.01f).of(250f) + } + + @Test + fun parseCssDimensionToTextUnit_returnsUnspecifiedForInvalidInput() { + assertThat(parseCssDimensionToTextUnit("invalid", containerWidthPx, density).isUnspecified).isTrue() + } + + @Test + fun parseCssDimensionToTextUnit_handlesZeroDensity() { + assertThat(parseCssDimensionToTextUnit("100px", containerWidthPx, 0f).isUnspecified).isTrue() + } + + @Test + fun parseCssDimensionToTextUnit_handlesZeroContainerWidthForPercentage() { + assertThat(parseCssDimensionToTextUnit("50%", 0, density).isUnspecified).isTrue() + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/pdf/MainDispatcherRule.kt b/app/src/androidTest/java/com/aryan/reader/pdf/MainDispatcherRule.kt new file mode 100644 index 0000000..afbbc75 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/pdf/MainDispatcherRule.kt @@ -0,0 +1,35 @@ +// MainDispatcherRule.kt +package com.aryan.reader.pdf + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain +import org.junit.rules.TestRule +import org.junit.runner.Description +import org.junit.runners.model.Statement + +/** + * A JUnit TestRule that sets the Main dispatcher to a TestDispatcher for the duration of a test. + * This allows tests to execute coroutines on the Main dispatcher without needing a real Android environment. + */ +@OptIn(ExperimentalCoroutinesApi::class) +class MainDispatcherRule( + val testDispatcher: TestDispatcher = UnconfinedTestDispatcher() +) : TestRule { + override fun apply(base: Statement, description: Description): Statement { + return object : Statement() { + @Throws(Throwable::class) + override fun evaluate() { + Dispatchers.setMain(testDispatcher) + try { + base.evaluate() + } finally { + Dispatchers.resetMain() + } + } + } + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/pdf/PdfAnnotationTest.kt b/app/src/androidTest/java/com/aryan/reader/pdf/PdfAnnotationTest.kt new file mode 100644 index 0000000..894d567 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/pdf/PdfAnnotationTest.kt @@ -0,0 +1,297 @@ +// PdfAnnotationTest.kt +package com.aryan.reader.pdf + +import android.content.Context +import android.content.Intent +import android.net.Uri +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertIsEnabled +import androidx.compose.ui.test.assertIsNotEnabled +import androidx.compose.ui.test.assertIsSelected +import androidx.compose.ui.test.assertIsNotSelected +import androidx.compose.ui.test.click +import androidx.compose.ui.test.junit4.createEmptyComposeRule +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performTouchInput +import androidx.core.content.FileProvider +import androidx.test.core.app.ActivityScenario +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.aryan.reader.MainActivity +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import java.io.File +import java.util.UUID + +@RunWith(AndroidJUnit4::class) +class PdfAnnotationTest { + + @get:Rule + val composeTestRule = createEmptyComposeRule() + + private val context: Context = ApplicationProvider.getApplicationContext() + private var currentPdfFile: File? = null + private var scenario: ActivityScenario? = null + private val samplePdfUri: Uri by lazy { copyAssetToCache(context, "sample.pdf") } + + private fun createPdfViewIntent(context: Context, uri: Uri): Intent { + return Intent(context, MainActivity::class.java).apply { + action = Intent.ACTION_VIEW + data = uri + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + } + } + + @Before + fun setup() { + // Clear settings to ensure fresh state for every test + context.getSharedPreferences("annotation_settings_global", Context.MODE_PRIVATE) + .edit().clear().commit() + context.getSharedPreferences("epub_reader_settings", Context.MODE_PRIVATE) + .edit().clear().commit() + + scenario = ActivityScenario.launch(createPdfViewIntent(context, samplePdfUri)) + waitForDocumentLoad() + } + + @After + fun tearDown() { + scenario?.close() + currentPdfFile?.let { if (it.exists()) it.delete() } + } + + private fun waitForDocumentLoad() { + composeTestRule.waitUntil(timeoutMillis = 15_000) { + runCatching { + composeTestRule.onNodeWithTag("PageNumberIndicator").assertIsDisplayed() + true + }.getOrDefault(false) + } + } + + private fun enterEditMode() { + composeTestRule.onNodeWithContentDescription("Toggle Drawing Mode") + .assertIsDisplayed() + .performClick() + composeTestRule.waitForIdle() + composeTestRule.onNodeWithContentDescription("Close Edit Mode").assertIsDisplayed() + } + + private fun tapOutsidePopup() { + // Taps the center of the PDF viewer to dismiss popups + composeTestRule.onNodeWithTag("PdfVerticalScroll").performTouchInput { + click(center) + } + composeTestRule.waitForIdle() + } + + @Suppress("SameParameterValue") + private fun copyAssetToCache(context: Context, assetName: String): Uri { + val uniqueName = "${UUID.randomUUID()}_$assetName" + val file = File(context.cacheDir, uniqueName) + currentPdfFile = file + if (file.exists()) file.delete() + context.assets.open(assetName).use { inputStream -> + file.outputStream().use { outputStream -> + inputStream.copyTo(outputStream) + } + } + return FileProvider.getUriForFile(context, "${context.packageName}.provider", file) + } + + // --- BASIC UI TESTS --- + + @Test + fun testEnterAndExitEditMode() { + enterEditMode() + + // Verify Dock Items exist using new Tags + composeTestRule.onNodeWithTag("DockItem_Pen").assertIsDisplayed() + composeTestRule.onNodeWithTag("DockItem_Highlighter").assertIsDisplayed() + composeTestRule.onNodeWithTag("DockItem_Eraser").assertIsDisplayed() + + composeTestRule.onNodeWithContentDescription("Close Edit Mode").performClick() + composeTestRule.waitForIdle() + composeTestRule.onNodeWithContentDescription("Toggle Drawing Mode").assertIsDisplayed() + } + + // --- TOOL LOGIC TESTS --- + + @Test + fun testToolPersistence() { + enterEditMode() + + // 1. Select Highlighter + composeTestRule.onNodeWithTag("DockItem_Highlighter").performClick() + composeTestRule.waitForIdle() + + // 2. Verify selection state + composeTestRule.onNodeWithTag("DockItem_Highlighter").assertIsSelected() + composeTestRule.onNodeWithTag("DockItem_Pen").assertIsNotSelected() + + // 3. Exit Edit Mode + composeTestRule.onNodeWithContentDescription("Close Edit Mode").performClick() + composeTestRule.waitForIdle() + + // 4. Re-enter Edit Mode + enterEditMode() + + // 5. Verify Highlighter is STILL selected (Persistence) + composeTestRule.onNodeWithTag("DockItem_Highlighter").assertIsSelected() + } + + @Test + fun testEraserHasNoPopup() { + enterEditMode() + + // Select Eraser + composeTestRule.onNodeWithTag("DockItem_Eraser").performClick() + composeTestRule.waitForIdle() + composeTestRule.onNodeWithTag("DockItem_Eraser").assertIsSelected() + + // Click Eraser AGAIN (Should NOT open popup) + composeTestRule.onNodeWithTag("DockItem_Eraser").performClick() + composeTestRule.waitForIdle() + + composeTestRule.onNodeWithTag("ToolSettingsPopup").assertDoesNotExist() + } + + // --- SETTINGS POPUP TESTS --- + + @Test + fun testSettingsPopupInteractions() { + enterEditMode() + + // 1. Pen is default. Click Pen ONCE to open Settings. + // (Clicking twice would toggle it off, which caused previous failures) + composeTestRule.onNodeWithTag("DockItem_Pen").performClick() + composeTestRule.waitForIdle() + + // 2. Verify Popup Displayed + composeTestRule.onNodeWithTag("ToolSettingsPopup").assertIsDisplayed() + + // 3. Verify Pen Types exist + composeTestRule.onNodeWithTag("SettingsItem_FOUNTAIN_PEN").assertIsDisplayed() + composeTestRule.onNodeWithTag("SettingsItem_MARKER").assertIsDisplayed() + + // 4. Switch internal Pen Type + composeTestRule.onNodeWithTag("SettingsItem_PENCIL").performClick() + composeTestRule.waitForIdle() + composeTestRule.onNodeWithTag("SettingsItem_PENCIL").assertIsSelected() + + // 5. Dismiss Settings + tapOutsidePopup() + composeTestRule.onNodeWithTag("ToolSettingsPopup").assertDoesNotExist() + } + + @Test + fun testColorPaletteAndThickness() { + enterEditMode() + + // Open Settings for Pen (Default selected, so one click opens settings) + composeTestRule.onNodeWithTag("DockItem_Pen").performClick() + composeTestRule.waitForIdle() + + // Test Palette Click (Index 1) + composeTestRule.onNodeWithTag("Palette_Item_1").assertIsDisplayed().performClick() + + // Test Thickness Buttons + composeTestRule.onNodeWithTag("Property_Plus").performClick() + composeTestRule.onNodeWithTag("Property_Plus").performClick() + composeTestRule.onNodeWithTag("Property_Minus").performClick() + + tapOutsidePopup() + + // Quick verification that settings didn't crash app + composeTestRule.onNodeWithTag("DockItem_Pen").assertIsDisplayed() + } + + // --- UNDO/REDO TESTS --- + + @Test + fun testDrawingEnablesUndo() { + enterEditMode() + + composeTestRule.onNodeWithContentDescription("Undo") + .assertIsDisplayed() + .assertIsNotEnabled() + + // Draw a single DOT stroke to ensure exactly one action is recorded + composeTestRule.onNodeWithTag("PdfVerticalScroll").performTouchInput { + click(center) + } + composeTestRule.waitForIdle() + + composeTestRule.onNodeWithContentDescription("Undo").assertIsEnabled() + } + + @Test + fun testUndoRedoLogic() { + enterEditMode() + + // Draw 1 stroke (click = dot) to ensure stack size is exactly 1 + composeTestRule.onNodeWithTag("PdfVerticalScroll").performTouchInput { + click(center) + } + composeTestRule.waitForIdle() + + val undoNode = composeTestRule.onNodeWithContentDescription("Undo") + val redoNode = composeTestRule.onNodeWithContentDescription("Redo") + + undoNode.assertIsEnabled() + redoNode.assertIsNotEnabled() + + // Perform Undo + undoNode.performClick() + composeTestRule.waitForIdle() + + undoNode.assertIsNotEnabled() + redoNode.assertIsEnabled() + + // Perform Redo + redoNode.performClick() + composeTestRule.waitForIdle() + + undoNode.assertIsEnabled() + redoNode.assertIsNotEnabled() + } + + // --- DOCK INTERACTIONS TESTS --- + + @Test + fun testDockMinimization() { + enterEditMode() + + // 1. Drag Dock to make it floating (using Pen icon as handle) + composeTestRule.onNodeWithTag("DockItem_Pen").performTouchInput { + down(center) + advanceEventTime(600) // Long press + // Drag UP significantly + moveBy(androidx.compose.ui.geometry.Offset(0f, -600f), delayMillis = 1000) + up() + } + composeTestRule.waitForIdle() + + // 2. Minimize (Eye icon) + composeTestRule.onNodeWithContentDescription("Toggle Visibility").performClick() + composeTestRule.waitForIdle() + + // 3. Verify Dock items are hidden + composeTestRule.onNodeWithTag("DockItem_Pen").assertDoesNotExist() + + // 4. Verify "Show Dock" floating button is visible + composeTestRule.onNodeWithContentDescription("Show Dock").assertIsDisplayed() + + // 5. Restore + composeTestRule.onNodeWithContentDescription("Show Dock").performClick() + composeTestRule.waitForIdle() + + // 6. Verify Dock items return + composeTestRule.onNodeWithTag("DockItem_Pen").assertIsDisplayed() + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/pdf/PdfCoverGeneratorTest.kt b/app/src/androidTest/java/com/aryan/reader/pdf/PdfCoverGeneratorTest.kt new file mode 100644 index 0000000..137dad8 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/pdf/PdfCoverGeneratorTest.kt @@ -0,0 +1,82 @@ +// app/src/androidTest/java/com/aryan/reader/pdf/PdfCoverGeneratorTest.kt +package com.aryan.reader.pdf + +import android.content.Context +import android.net.Uri +import androidx.core.content.FileProvider +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.test.runTest +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import java.io.File +import java.io.IOException + +@RunWith(AndroidJUnit4::class) +class PdfCoverGeneratorTest { + + @get:Rule + val mainDispatcherRule = MainDispatcherRule() + + private lateinit var context: Context + private lateinit var coverGenerator: PdfCoverGenerator + private var samplePdfUri: Uri? = null + + @Before + fun setUp() { + context = ApplicationProvider.getApplicationContext() + coverGenerator = PdfCoverGenerator(context) + try { + samplePdfUri = copyAssetToCache(context, "sample.pdf") + } catch (_: IOException) { + println("Could not copy sample.pdf from assets. Skipping PdfCoverGenerator tests.") + samplePdfUri = null + } + } + + @After + fun tearDown() { + val cacheFile = File(context.cacheDir, "sample.pdf") + if (cacheFile.exists()) { + cacheFile.delete() + } + } + + @Test + fun generateCover_returnsBitmapForValidPdf() = runTest { + val uri = samplePdfUri ?: return@runTest + + val targetHeight = 600 + val cover = coverGenerator.generateCover(uri, targetHeight) + + assertThat(cover).isNotNull() + assertThat(cover!!.height).isEqualTo(targetHeight) + assertThat(cover.width).isGreaterThan(0) + } + + @Test + fun generateCover_returnsNullForInvalidUri() = runTest { + val invalidUri = Uri.fromFile(File("nonexistent/file.pdf")) + val cover = coverGenerator.generateCover(invalidUri) + assertThat(cover).isNull() + } + + private fun copyAssetToCache(context: Context, @Suppress("SameParameterValue") assetName: String): Uri { + val file = File(context.cacheDir, assetName) + if (file.exists()) file.delete() + context.assets.open(assetName).use { inputStream -> + file.outputStream().use { outputStream -> + inputStream.copyTo(outputStream) + } + } + return FileProvider.getUriForFile( + context, + "${context.packageName}.provider", + file + ) + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/pdf/PdfHelperTest.kt b/app/src/androidTest/java/com/aryan/reader/pdf/PdfHelperTest.kt new file mode 100644 index 0000000..376c1d1 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/pdf/PdfHelperTest.kt @@ -0,0 +1,85 @@ +// app/src/androidTest/java/com/aryan/reader/pdf/PdfHelperTest.kt +package com.aryan.reader.pdf + +import android.graphics.Rect +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class PdfHelperTest { + + @Test + fun mergeRectsIntoLines_mergesHorizontallyAdjacentRects() { + val rects = listOf( + Rect(0, 0, 10, 10), + Rect(11, 0, 20, 10) + ) + val merged = mergeRectsIntoLines(rects) + assertThat(merged).hasSize(1) + assertThat(merged.first()).isEqualTo(Rect(0, 0, 20, 10)) + } + + @Test + fun mergeRectsIntoLines_doesNotMergeVerticallySeparatedRects() { + val rects = listOf( + Rect(0, 0, 10, 10), + Rect(0, 11, 10, 20) + ) + val merged = mergeRectsIntoLines(rects) + assertThat(merged).hasSize(2) + } + + @Test + fun mergeRectsIntoLines_handlesMultipleLines() { + val rects = listOf( + Rect(0, 0, 10, 10), // line 1 + Rect(11, 0, 20, 10), // line 1 + Rect(0, 15, 10, 25), // line 2 + Rect(11, 15, 20, 25) // line 2 + ) + val merged = mergeRectsIntoLines(rects) + assertThat(merged).hasSize(2) + assertThat(merged).containsExactly( + Rect(0, 0, 20, 10), + Rect(0, 15, 20, 25) + ) + } + + @Test + fun mergeRectsIntoLines_handlesEmptyList() { + val merged = mergeRectsIntoLines(emptyList()) + assertThat(merged).isEmpty() + } + + @Test + fun preprocessTextForTts_replacesNewlineWithSpaceForSoftBreak() { + val raw = "Hello\nWorld" + val processed = preprocessTextForTts(raw) + assertThat(processed.cleanText).isEqualTo("Hello World") + } + + @Test + fun preprocessTextForTts_handlesNewlineAfterPunctuation() { + // Based on the current implementation, a newline after a sentence-ending punctuation + // results in the words being concatenated without a space. This test verifies that behavior. + val raw = "Hello.\nWorld" + val processed = preprocessTextForTts(raw) + assertThat(processed.cleanText).isEqualTo("Hello.World") + } + + @Test + fun preprocessTextForTts_handlesCarriageReturn() { + val raw = "Hello\r\nWorld" + val processed = preprocessTextForTts(raw) + assertThat(processed.cleanText).isEqualTo("Hello World") + } + + @Test + fun preprocessTextForTts_trimsResult() { + val raw = " Hello World \n" + val processed = preprocessTextForTts(raw) + assertThat(processed.cleanText).isEqualTo("Hello World") + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/pdf/PdfViewerScreenTest.kt b/app/src/androidTest/java/com/aryan/reader/pdf/PdfViewerScreenTest.kt new file mode 100644 index 0000000..2c1cf34 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/pdf/PdfViewerScreenTest.kt @@ -0,0 +1,313 @@ +package com.aryan.reader.pdf + +import android.Manifest +import android.content.Context +import android.content.Intent +import android.net.Uri +import androidx.compose.ui.test.assert +import androidx.compose.ui.test.assertIsDisplayed +import androidx.compose.ui.test.assertTextContains +import androidx.compose.ui.test.hasTestTag +import androidx.compose.ui.test.hasText +import androidx.compose.ui.test.junit4.createEmptyComposeRule +import androidx.compose.ui.test.onAllNodesWithText +import androidx.compose.ui.test.onNodeWithContentDescription +import androidx.compose.ui.test.onNodeWithTag +import androidx.compose.ui.test.onNodeWithText +import androidx.compose.ui.test.onRoot +import androidx.compose.ui.test.performClick +import androidx.compose.ui.test.performTextInput +import androidx.compose.ui.test.performTouchInput +import androidx.compose.ui.test.swipe +import androidx.core.content.FileProvider +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.rules.ActivityScenarioRule +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.rule.GrantPermissionRule +import com.aryan.reader.MainActivity +import org.junit.After +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import java.io.File +import java.util.UUID + +@RunWith(AndroidJUnit4::class) +class PdfViewerScreenTest { + + @get:Rule + val composeTestRule = createEmptyComposeRule() + + @get:Rule + val grantPermissionRule: GrantPermissionRule = GrantPermissionRule.grant(Manifest.permission.POST_NOTIFICATIONS) + + @org.junit.Before + fun setup() { + val context = ApplicationProvider.getApplicationContext() + context.getSharedPreferences("epub_reader_settings", Context.MODE_PRIVATE) + .edit() + .clear() + .commit() + } + + private fun createPdfViewIntent(context: Context, uri: Uri): Intent { + return Intent(context, MainActivity::class.java).apply { + action = Intent.ACTION_VIEW + data = uri + addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + } + } + + private val context: Context = ApplicationProvider.getApplicationContext() + + private var currentPdfFile: File? = null + + private val samplePdfUri: Uri by lazy { copyAssetToCache(context, "sample.pdf") } + + @get:Rule + val activityRule = ActivityScenarioRule(createPdfViewIntent(context, samplePdfUri)) + + @After + fun tearDown() { + currentPdfFile?.let { + if (it.exists()) it.delete() + } + } + + private fun waitForDocumentLoad(pageText: String = "Page 1 of 4") { + composeTestRule.waitUntil(timeoutMillis = 15_000) { + composeTestRule + .onAllNodesWithText(pageText) + .fetchSemanticsNodes().size == 1 + } + } + + private fun ensurePaginationMode() { + composeTestRule.onNodeWithContentDescription("More Options").performClick() + composeTestRule.onNodeWithText("Reading Mode: Paginated").performClick() + composeTestRule.waitForIdle() + } + + @Test + fun documentLoadsAndDisplaysCorrectPageCount() { + waitForDocumentLoad() + composeTestRule.onNodeWithTag("PageNumberIndicator") + .assertIsDisplayed() + } + + @Test + fun tableOfContents_displaysEmptyState() { + waitForDocumentLoad() + + composeTestRule.onNodeWithTag("TocButton").performClick() + + composeTestRule.onNodeWithText("Chapters are not available for this book.").assertIsDisplayed() + } + + @Suppress("SameParameterValue") + private fun copyAssetToCache(context: Context, assetName: String): Uri { + val uniqueName = "${UUID.randomUUID()}_$assetName" + val file = File(context.cacheDir, uniqueName) + + currentPdfFile = file + + if (file.exists()) file.delete() + context.assets.open(assetName).use { inputStream -> + file.outputStream().use { outputStream -> + inputStream.copyTo(outputStream) + } + } + return FileProvider.getUriForFile( + context, + "${context.packageName}.provider", + file + ) + } + + @Test + fun bookmarkFunctionality_addNavigateAndDelete() { + waitForDocumentLoad() + + ensurePaginationMode() + + composeTestRule.onNodeWithText("Page 1 of 4").assertIsDisplayed() + + try { + composeTestRule.onRoot().performTouchInput { swipe(start = this.centerRight, end = this.centerLeft, durationMillis = 300) } + composeTestRule.onRoot().performClick() + composeTestRule.waitUntil(5_000) { + composeTestRule.onAllNodesWithText("Page 2 of 4").fetchSemanticsNodes().isNotEmpty() + } + composeTestRule.onNodeWithText("Page 2 of 4").assertIsDisplayed() + } catch (e: Exception) { + throw e + } + + try { + composeTestRule.onNodeWithContentDescription("More Options").performClick() + composeTestRule.onNodeWithText("Bookmark this page").performClick() + composeTestRule.waitForIdle() + } catch (e: Exception) { + throw e + } + + try { + composeTestRule.onRoot().performTouchInput { swipe(start = this.centerRight, end = this.centerLeft, durationMillis = 300) } + composeTestRule.onRoot().performClick() + composeTestRule.waitUntil(5_000) { + composeTestRule.onAllNodesWithText("Page 3 of 4").fetchSemanticsNodes().isNotEmpty() + } + composeTestRule.onNodeWithText("Page 3 of 4").assertIsDisplayed() + } catch (e: Exception) { + throw e + } + + try { + composeTestRule.onNodeWithTag("TocButton").performClick() + composeTestRule.onNodeWithTag("BookmarksTab").performClick() + composeTestRule.waitForIdle() + composeTestRule.onNodeWithTag("BookmarkItem_1").assertIsDisplayed() + .assert(hasText("Page 2", substring = true)) + } catch (e: Exception) { + throw e + } + + try { + composeTestRule.onNodeWithTag("BookmarkItem_1").performClick() + composeTestRule.waitForIdle() + composeTestRule.waitUntil(5_000) { + composeTestRule.onAllNodes(hasTestTag("PageNumberIndicator").and(hasText("Page 2 of 4"))).fetchSemanticsNodes().size == 1 + } + composeTestRule.onNode(hasTestTag("PageNumberIndicator").and(hasText("Page 2 of 4"))).assertIsDisplayed() + + } catch (e: Exception) { + throw e + } + + try { + composeTestRule.onNodeWithTag("TocButton").performClick() + composeTestRule.onNodeWithTag("BookmarksTab").performClick() + composeTestRule.waitForIdle() + } catch (e: Exception) { + throw e + } + + try { + composeTestRule.onNodeWithContentDescription("More options for bookmark").performClick() + composeTestRule.onNodeWithText("Delete").performClick() + } catch (e: Exception) { + throw e + } + + try { + composeTestRule.onNodeWithText("Delete", useUnmergedTree = true).performClick() + } catch (e: Exception) { + throw e + } + + try { + composeTestRule.onNodeWithTag("BookmarkItem_1").assertDoesNotExist() + composeTestRule.onNodeWithText("You haven't added any bookmarks yet.").assertIsDisplayed() + } catch (e: Exception) { + throw e + } + } + + @Test + fun sliderNavigation_opensAndDisplaysCorrectly() { + waitForDocumentLoad() + + composeTestRule.onNodeWithContentDescription("Navigate with slider").performClick() + composeTestRule.onNodeWithContentDescription("Exit slider navigation").assertIsDisplayed() + composeTestRule.onNodeWithText("1 / 4").assertIsDisplayed() + } + + @Test + fun displayMode_switchesToVerticalScroll() { + waitForDocumentLoad() + + // Ensure we are in Pagination mode first to test the switch + ensurePaginationMode() + + // Verify Vertical Scroll component is NOT displayed initially + composeTestRule.onNodeWithTag("PdfVerticalScroll").assertDoesNotExist() + + // Switch to Vertical Scroll + composeTestRule.onNodeWithContentDescription("More Options").performClick() + composeTestRule.onNodeWithText("Reading Mode: Vertical scroll").performClick() + + composeTestRule.waitForIdle() + + // Verify Vertical Scroll component IS displayed + composeTestRule.onNodeWithTag("PdfVerticalScroll").assertIsDisplayed() + + // Switch back to Pagination + ensurePaginationMode() + + // Verify Vertical Scroll component is gone + composeTestRule.onNodeWithTag("PdfVerticalScroll").assertDoesNotExist() + } + + @Test + fun search_uiOpensAndAcceptsQuery() { + waitForDocumentLoad() + + // Click search button + composeTestRule.onNodeWithTag("SearchButton").performClick() + + composeTestRule.onNodeWithText("English, Spanish, French, etc.").performClick() + + // Verify text field appears + composeTestRule.onNodeWithTag("SearchTextField").assertIsDisplayed() + + // Enter text + composeTestRule.onNodeWithTag("SearchTextField").performTextInput("test query") + + // Verify text exists in the field + composeTestRule.onNodeWithTag("SearchTextField").assertTextContains("test query") + + // Close search + composeTestRule.onNodeWithContentDescription("Close Search").performClick() + + // Verify text field is gone + composeTestRule.onNodeWithTag("SearchTextField").assertDoesNotExist() + } + + @Test + fun fullScreen_togglesVisibility() { + waitForDocumentLoad() + + // Click enter full screen button + composeTestRule.onNodeWithContentDescription("Enter Full Screen").performClick() + + // Verify exit full screen button appears + composeTestRule.onNodeWithContentDescription("Exit Full Screen").assertIsDisplayed() + + // Click exit full screen + composeTestRule.onNodeWithContentDescription("Exit Full Screen").performClick() + + // Verify exit button is gone and enter button returns + composeTestRule.onNodeWithContentDescription("Exit Full Screen").assertDoesNotExist() + composeTestRule.onNodeWithContentDescription("Enter Full Screen").assertIsDisplayed() + } + + @Test + fun darkMode_togglesState() { + waitForDocumentLoad() + + // Initial state: Light mode (default from cleared prefs), so button says "Enable Dark Mode" + composeTestRule.onNodeWithContentDescription("Enable Dark Mode").assertIsDisplayed() + + // Toggle On + composeTestRule.onNodeWithContentDescription("Enable Dark Mode").performClick() + + // State changed: Now button says "Disable Dark Mode" + composeTestRule.onNodeWithContentDescription("Disable Dark Mode").assertIsDisplayed() + + // Toggle Off + composeTestRule.onNodeWithContentDescription("Disable Dark Mode").performClick() + + // State changed back + composeTestRule.onNodeWithContentDescription("Enable Dark Mode").assertIsDisplayed() + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/tts/BaseTtsSynthesizerTest.kt b/app/src/androidTest/java/com/aryan/reader/tts/BaseTtsSynthesizerTest.kt new file mode 100644 index 0000000..9b97fdc --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/tts/BaseTtsSynthesizerTest.kt @@ -0,0 +1,105 @@ +// BaseTtsSynthesizerTest.kt +package com.aryan.reader.tts + +import android.speech.tts.TextToSpeech +import androidx.test.core.app.ApplicationProvider +import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.withTimeout +import org.junit.After +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith + +@RunWith(AndroidJUnit4::class) +class BaseTtsSynthesizerTest { + + @get:Rule + val mainDispatcherRule = MainDispatcherRule() + + private lateinit var synthesizer: BaseTtsSynthesizer + private var ttsEngineAvailable = false + + @Before + fun setUp() { + // Ensure TTS is available on the device/emulator before running tests + val tts = TextToSpeech(ApplicationProvider.getApplicationContext(), null) + if (tts.engines.isNotEmpty()) { + ttsEngineAvailable = true + synthesizer = BaseTtsSynthesizer(ApplicationProvider.getApplicationContext()) + } + tts.shutdown() + } + + @After + fun tearDown() { + if (this::synthesizer.isInitialized) { + synthesizer.shutdown() + } + } + + @Test + fun initialize_initializesTtsEngineSuccessfully() { + if (!ttsEngineAvailable) return + + runBlocking { + // This will throw if it fails + withTimeout(10000L) { + synthesizer.initialize() + } + // No assertion needed, success is not throwing an exception. + } + } + + @Test + fun synthesizeToFile_withValidText_createsAudioFile() { + if (!ttsEngineAvailable) return + + runBlocking { + withTimeout(15000L) { + synthesizer.initialize() + val (file, returnedText) = synthesizer.synthesizeToFile("This is a test.") + + assertThat(file).isNotNull() + assertThat(file?.exists()).isTrue() + assertThat(file?.length()).isGreaterThan(0L) + assertThat(returnedText).isEqualTo("This is a test.") + + file?.delete() + } + } + } + + @Test + fun synthesizeToFile_withBlankText_returnsNullFile() { + if (!ttsEngineAvailable) return + + runBlocking { + synthesizer.initialize() + val (file, returnedText) = synthesizer.synthesizeToFile(" ") + + assertThat(file).isNull() + assertThat(returnedText).isEqualTo(" ") + } + } + + @Test + fun synthesizeToFile_withoutInitializingFirst_initializesAndSucceeds() { + if (!ttsEngineAvailable) return + + runBlocking { + withTimeout(15000L) { + val (file, returnedText) = synthesizer.synthesizeToFile("This should work.") + + assertThat(file).isNotNull() + assertThat(file?.exists()).isTrue() + assertThat(file?.length()).isGreaterThan(0L) + assertThat(returnedText).isEqualTo("This should work.") + + file?.delete() + } + } + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/tts/MainDispatcherRule.kt b/app/src/androidTest/java/com/aryan/reader/tts/MainDispatcherRule.kt new file mode 100644 index 0000000..1b2d937 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/tts/MainDispatcherRule.kt @@ -0,0 +1,27 @@ +package com.aryan.reader.tts + +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestDispatcher +import kotlinx.coroutines.test.UnconfinedTestDispatcher +import kotlinx.coroutines.test.resetMain +import kotlinx.coroutines.test.setMain +import org.junit.rules.TestWatcher +import org.junit.runner.Description + +/** + * A JUnit TestRule that sets the Main dispatcher to a TestDispatcher for the duration of a test. + * This allows tests to execute coroutines on the Main dispatcher without needing a real Android environment. + */ +@OptIn(ExperimentalCoroutinesApi::class) +class MainDispatcherRule( + private val testDispatcher: TestDispatcher = UnconfinedTestDispatcher() +) : TestWatcher() { + override fun starting(description: Description) { + Dispatchers.setMain(testDispatcher) + } + + override fun finished(description: Description) { + Dispatchers.resetMain() + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/aryan/reader/tts/TtsUtilsTest.kt b/app/src/androidTest/java/com/aryan/reader/tts/TtsUtilsTest.kt new file mode 100644 index 0000000..a338488 --- /dev/null +++ b/app/src/androidTest/java/com/aryan/reader/tts/TtsUtilsTest.kt @@ -0,0 +1,71 @@ +// TtsUtilsTest.kt +package com.aryan.reader.tts + +import com.google.common.truth.Truth.assertThat +import org.junit.Test +import org.junit.runner.RunWith +import androidx.test.ext.junit.runners.AndroidJUnit4 + +@RunWith(AndroidJUnit4::class) +class TtsUtilsTest { + + @Test + fun splitTextIntoChunks_withShortText_returnsSingleChunk() { + val text = "This is a short sentence." + val chunks = splitTextIntoChunks(text, 100) + assertThat(chunks).containsExactly("This is a short sentence.") + } + + @Test + fun splitTextIntoChunks_withMultipleSentences_splitsCorrectly() { + val text = "First sentence. Second sentence! Third sentence? And a fourth." + val chunks = splitTextIntoChunks(text, 20) + assertThat(chunks).containsExactly( + "First sentence.", + "Second sentence!", + "Third sentence?", + "And a fourth." + ).inOrder() + } + + @Test + fun splitTextIntoChunks_combinesShortSentences() { + val text = "First. Second. Third. Fourth." + val chunks = splitTextIntoChunks(text, maxLengthPerChunk = 20) + assertThat(chunks).containsExactly( + "First. Second.", + "Third. Fourth." + ).inOrder() + } + + @Test + fun splitTextIntoChunks_withLongSentence_doesNotSplitSentence() { + val text = "This is a very long sentence that exceeds the maximum chunk length but has no punctuation to split on." + val chunks = splitTextIntoChunks(text, 50) + assertThat(chunks).containsExactly(text) + } + + @Test + fun splitTextIntoChunks_withEmptyText_returnsEmptyList() { + val text = "" + val chunks = splitTextIntoChunks(text, 100) + assertThat(chunks).isEmpty() + } + + @Test + fun splitTextIntoChunks_withBlankText_returnsEmptyList() { + val text = " " + val chunks = splitTextIntoChunks(text, 100) + assertThat(chunks).isEmpty() + } + + @Test + fun splitTextIntoChunks_handlesAbbreviations() { + val text = "Mr. Smith went to Washington. Dr. Jones followed." + val chunks = splitTextIntoChunks(text, 40) + assertThat(chunks).containsExactly( + "Mr. Smith went to Washington.", + "Dr. Jones followed." + ).inOrder() + } +} \ No newline at end of file diff --git a/app/src/debug/java/com/aryan/reader/epubreader/EpubTestActivity.kt b/app/src/debug/java/com/aryan/reader/epubreader/EpubTestActivity.kt new file mode 100644 index 0000000..48808bc --- /dev/null +++ b/app/src/debug/java/com/aryan/reader/epubreader/EpubTestActivity.kt @@ -0,0 +1,40 @@ +package com.aryan.reader.epubreader + +import android.os.Build +import android.os.Bundle +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.annotation.RequiresApi +import com.aryan.reader.RenderMode +import com.aryan.reader.epub.EpubBook +import kotlinx.serialization.json.Json + +class EpubTestActivity : ComponentActivity() { + @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val bookJson = intent.getStringExtra("epubBookJson") + val book = Json.decodeFromString(bookJson!!) + + setContent { + EpubReaderScreen( + epubBook = book, + renderMode = RenderMode.VERTICAL_SCROLL, + initialLocator = null, + initialCfi = null, + initialBookmarksJson = null, + isProUser = false, + pendingSyncUpdate = null, + onClearPendingSyncUpdate = {}, + onNavigateBack = {}, + onSavePosition = { _, _, _ -> }, + onBookmarksChanged = {}, + onNavigateToPro = {}, + coverImagePath = null, + onRenderModeChange = {}, + customFonts = TODO(), + onImportFont = TODO() + ) + } + } +} \ No newline at end of file diff --git a/app/src/debug/java/com/aryan/reader/epubreader/HiltTestActivity.kt b/app/src/debug/java/com/aryan/reader/epubreader/HiltTestActivity.kt new file mode 100644 index 0000000..99f56ed --- /dev/null +++ b/app/src/debug/java/com/aryan/reader/epubreader/HiltTestActivity.kt @@ -0,0 +1,12 @@ +package com.aryan.reader.epubreader + +import androidx.activity.ComponentActivity + +/** + * A simple, empty activity used as a host for Compose UI tests. + * It allows tests to launch a Compose view without needing the app's full + * navigation or main activity setup. It should be placed in the `debug` + * source set (`app/src/debug/java/...`) to ensure it is not included + * in the release build of your app. + */ +class HiltTestActivity : ComponentActivity() \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..c921208 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/MathML-template.html b/app/src/main/assets/MathML-template.html new file mode 100644 index 0000000..49808db --- /dev/null +++ b/app/src/main/assets/MathML-template.html @@ -0,0 +1,35 @@ + + + + + + + + +
+ + \ No newline at end of file diff --git a/app/src/main/assets/demo_art.svg b/app/src/main/assets/demo_art.svg new file mode 100644 index 0000000..9ce63d0 --- /dev/null +++ b/app/src/main/assets/demo_art.svg @@ -0,0 +1,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/assets/epub_reader.js b/app/src/main/assets/epub_reader.js new file mode 100644 index 0000000..e949697 --- /dev/null +++ b/app/src/main/assets/epub_reader.js @@ -0,0 +1,1775 @@ +// epub_reader.js +(function () { + function applyMobileOptimizationsAndSelection() { + var viewport = document.querySelector("meta[name=viewport]"); + if (!viewport) { + viewport = document.createElement('meta'); + viewport.setAttribute('name', 'viewport'); + document.head.appendChild(viewport); + } + viewport.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.5, user-scalable=yes'); + + var style = document.getElementById('customMobileStyle'); + if (!style) { + style = document.createElement('style'); + style.setAttribute('id', 'customMobileStyle'); + document.head.appendChild(style); + } + + // CHANGED: Colors now use rgba() with 0.5 opacity for blending + style.innerHTML = ` + html { margin: 0; padding: 0; height: 100%; overflow-y: scroll; } + body { + margin: 0; padding: 0px !important; + word-wrap: break-word; overflow-wrap: break-word; + word-break: break-word; -webkit-text-size-adjust: 100%; + text-rendering: optimizeLegibility; -webkit-user-select: none; + -moz-user-select: none; -ms-user-select: none; user-select: none; + } + p, div, li, td, th, span { font-size: 1em; line-height: inherit; } + p, ul, ol { margin-top: 0.5em; margin-bottom: 0.5em; } + li { margin-bottom: 0.25em; } + h1, h2, h3, h4, h5, h6 { line-height: 1.3; margin-top: 1em; margin-bottom: 0.5em; font-weight: bold; } + h1 { font-size: 2em; } h2 { font-size: 1.75em; } h3 { font-size: 1.5em; } + h4 { font-size: 1.25em; } h5 { font-size: 1.1em; } h6 { font-size: 1em; } + img, svg, video, canvas { max-width: 100%; width: 100%; height: auto; display: block; margin-left: auto; margin-right: auto; background-color: transparent; object-fit: contain; } + + figure img { height: auto !important; } + div:has(> img:only-child), p:has(> img:only-child) { height: auto !important; line-height: normal !important; } + + .tts-highlight { + background-color: rgba(255, 236, 179, 0.8); /* Semi-transparent Gold */ + color: black !important; + padding: 0.1em 0; + border-radius: 3px; + } + html.dark-theme span.tts-highlight { + background-color: rgba(160, 140, 90, 0.8) !important; + color: #E0E0E0 !important; + } + + /* User Highlights - NOW USING RGBA FOR BLENDING */ + .user-highlight-yellow { background-color: rgba(255, 235, 59, 0.5); cursor: pointer; } + .user-highlight-green { background-color: rgba(56, 142, 60, 0.5); cursor: pointer; } + .user-highlight-blue { background-color: rgba(25, 118, 210, 0.5); cursor: pointer; } + .user-highlight-red { background-color: rgba(211, 47, 47, 0.5); cursor: pointer; } + + /* Atomic Interaction Feedback */ + .user-highlight-yellow:active { background-color: rgba(253, 216, 53, 0.8); } + .user-highlight-green:active { background-color: rgba(165, 214, 167, 0.8); } + .user-highlight-blue:active { background-color: rgba(144, 202, 249, 0.8); } + .user-highlight-red:active { background-color: rgba(239, 154, 154, 0.8); } + + /* Dark Theme Overrides - Adjust alpha for visibility against dark bg */ + html.dark-theme .user-highlight-yellow { background-color: rgba(251, 192, 45, 0.6); color: inherit; } + html.dark-theme .user-highlight-green { background-color: rgba(56, 142, 60, 0.6); color: inherit; } + html.dark-theme .user-highlight-blue { background-color: rgba(25, 118, 210, 0.6); color: inherit; } + html.dark-theme .user-highlight-red { background-color: rgba(211, 47, 47, 0.6); color: inherit; } + `; + + style.innerHTML += ` + mark.search-highlight { + background-color: rgba(160, 207, 241, 0.8); + color: black; + border-radius: 3px; + } + html.dark-theme mark.search-highlight { + background-color: rgba(0, 90, 156, 0.8); + color: #E0E0E0; + } + `; + + window.setTextSelectionEnabled = function (enabled) { + var selectStyle = enabled ? 'auto' : 'none'; + if (document.body) { + document.body.style.webkitUserSelect = selectStyle; + document.body.style.mozUserSelect = selectStyle; + document.body.style.msUserSelect = selectStyle; + document.body.style.userSelect = selectStyle; + } + }; + window.setTextSelectionEnabled(true); + } + + window.VIEWPORT_PADDING_TOP = 0; + window.VIEWPORT_PADDING_BOTTOM = 0; + window.setViewportPadding = function (top, bottom) { + window.VIEWPORT_PADDING_TOP = top || 0; + window.VIEWPORT_PADDING_BOTTOM = bottom || 0; + }; + + window.applyReaderTheme = function (isDark) { + var styleId = 'readerThemeStyle'; + var themeStyleElement = document.getElementById(styleId); + if (!themeStyleElement) { + themeStyleElement = document.createElement('style'); + themeStyleElement.setAttribute('id', styleId); + document.head.appendChild(themeStyleElement); + } + + // Set a class on the root element for theme state + var themeClassName = isDark ? 'dark-theme' : 'light-theme'; + var oppositeThemeClassName = isDark ? 'light-theme' : 'dark-theme'; + document.documentElement.classList.remove(oppositeThemeClassName); + document.documentElement.classList.add(themeClassName); + + var css = ""; + if (isDark) { + css = ` + html.dark-theme, html.dark-theme body { + background-color: #121212 !important; + color: #E0E0E0 !important; + } + + html.dark-theme a { + color: #BB86FC !important; + } + + html.dark-theme a p, + html.dark-theme a div, + html.dark-theme a span, + html.dark-theme a li, + html.dark-theme a h1, + html.dark-theme a h2, + html.dark-theme a h3, + html.dark-theme a h4, + html.dark-theme a h5, + html.dark-theme a h6 { + color: #E0E0E0 !important; + background-color: transparent !important; + } + + html.dark-theme blockquote, html.dark-theme pre, + html.dark-theme figcaption, html.dark-theme caption, + html.dark-theme label, html.dark-theme dt, html.dark-theme dd { + color: inherit !important; + background-color: transparent !important; + } + + html.dark-theme hr { + border-color: #444444 !important; + background-color: #444444 !important; + } + + html.dark-theme table, html.dark-theme tr, html.dark-theme td, html.dark-theme th { + background-color: transparent !important; + border-color: #555 !important; + } + `; + } else { + css = ` + html.light-theme { + background-color: #FFFFFF; + } + `; + } + themeStyleElement.innerHTML = css; + }; + + function handleHighlightInteraction(e) { + var target = e.target; + var highlightSpan = null; + + while (target && target !== document.body) { + if (target.nodeType === Node.ELEMENT_NODE && target.classList && + (target.classList.contains('user-highlight-yellow') || + target.classList.contains('user-highlight-green') || + target.classList.contains('user-highlight-blue') || + target.classList.contains('user-highlight-red'))) { + highlightSpan = target; + break; + } + target = target.parentNode; + } + + if (highlightSpan) { + e.preventDefault(); + e.stopPropagation(); + e.stopImmediatePropagation(); + + if (window.getSelection) { + window.getSelection().removeAllRanges(); + } + + var text = highlightSpan.textContent; + var rect = highlightSpan.getBoundingClientRect(); + var rawCfi = highlightSpan.getAttribute('data-cfi'); + + if (!rawCfi) { + var cfiResult = window.getCfiPathForElement(highlightSpan, 0); + rawCfi = cfiResult.cfi; + } + + var cfiToReport = rawCfi; + if (rawCfi && rawCfi.includes('|')) { + var cfiParts = rawCfi.split('|'); + cfiToReport = cfiParts[cfiParts.length - 1]; + console.log("HandleInteraction: Multi-CFI detected on single span. Reporting top layer: " + cfiToReport); + } + + if (window.HighlightBridge) { + window.HighlightBridge.onHighlightClicked( + cfiToReport, + text, + rect.left, + rect.top, + rect.right, + rect.bottom + ); + } + return true; + } + return false; + } + + // 1. Handle Taps (Click) + document.addEventListener('click', function (e) { + handleHighlightInteraction(e); + }, true); + + // 2. Handle Long Press (Context Menu) - "Atomic" Behavior + // This prevents the native Android selection handles from appearing inside the highlight + document.addEventListener('contextmenu', function (e) { + if (handleHighlightInteraction(e)) { + e.preventDefault(); // Ensure menu doesn't show + return false; + } + }, true); + + window.updateReaderStyles = function (fontSizeEm, lineHeight, fontFamily, textAlign) { + var logTag = "ReaderFontDiagnosis"; + console.log(logTag + ": updateReaderStyles called. Size: " + fontSizeEm + ", LineHeight: " + lineHeight + ", Font: '" + fontFamily + "', Align: '" + textAlign + "'"); + + var dynamicStyleId = 'dynamicReaderStyles'; + var dynamicStyleElement = document.getElementById(dynamicStyleId); + if (!dynamicStyleElement) { + dynamicStyleElement = document.createElement('style'); + dynamicStyleElement.setAttribute('id', dynamicStyleId); + document.head.appendChild(dynamicStyleElement); + } + + var newFontSize = parseFloat(fontSizeEm); + var newLineHeight = parseFloat(lineHeight); + + if (isNaN(newFontSize) || newFontSize < 0.5 || newFontSize > 5.0) newFontSize = 1.0; + if (isNaN(newLineHeight) || newLineHeight < 1.0 || newLineHeight > 3.0) newLineHeight = 1.6; + + var fontCss = ""; + var selector = "body"; + + if (fontFamily && fontFamily !== "Original" && fontFamily !== "") { + var fallback = "sans-serif"; + if (fontFamily === "Merriweather" || fontFamily === "Lora") { + fallback = "serif"; + } else if (fontFamily === "Roboto Mono") { + fallback = "monospace"; + } + + selector = "body, p, span, div, li, a, h1, h2, h3, h4, h5, h6, blockquote, td, th"; + fontCss = "font-family: '" + fontFamily + "', " + fallback + " !important;"; + } + + // --- ALIGNMENT LOGIC --- + var alignCss = ""; + var alignSelector = "body, p, li, div, h1, h2, h3, h4, h5, h6"; + + if (textAlign === "left") { + alignCss = ` + ` + alignSelector + ` { + text-align: left !important; + } + `; + } else if (textAlign === "justify") { + alignCss = ` + ` + alignSelector + ` { + text-align: justify !important; + -webkit-hyphens: auto !important; + hyphens: auto !important; + } + `; + } + + dynamicStyleElement.innerHTML = ` + body { + font-size: ` + newFontSize + `em !important; + line-height: ` + newLineHeight + ` !important; + } + ` + selector + ` { + ` + fontCss + ` + } + ` + alignCss + ` + `; + + setTimeout(function () { + var computedBody = window.getComputedStyle(document.body).fontFamily; + console.log(logTag + ": [BODY] Computed font-family: " + computedBody); + + var firstPara = document.querySelector('p'); + if (firstPara) { + var computedPara = window.getComputedStyle(firstPara).fontFamily; + var computedAlign = window.getComputedStyle(firstPara).textAlign; + console.log(logTag + ": [PARAGRAPH] Computed font-family: " + computedPara); + console.log(logTag + ": [PARAGRAPH] Inner Text Sample: " + firstPara.innerText.substring(0, 20)); + } else { + console.log(logTag + ": [PARAGRAPH] No

tag found to check."); + } + + if (fontFamily && fontFamily !== "") { + var isCheckAvailable = (document.fonts && document.fonts.check); + if (isCheckAvailable) { + var loaded = document.fonts.check("12px '" + fontFamily + "'"); + console.log(logTag + ": Font Loading Status -> document.fonts.check('" + fontFamily + "') = " + loaded); + } else { + console.log(logTag + ": document.fonts API not available."); + } + } + }, 300); + + if (window.reportScrollState) { + setTimeout(window.reportScrollState, 60); + } + }; + + window.TOC_FRAGMENTS = window.TOC_FRAGMENTS || []; + + window.setTocFragments = function(jsonArray) { + console.log("FRAG_NAV_DEBUG: window.setTocFragments called with " + jsonArray.length + " items."); + window.TOC_FRAGMENTS = jsonArray; + // Immediate audit and report + window.auditTocFragments(); + window.reportScrollState(); + }; + + + window.reportScrollState = function () { + if (typeof PageInfoReporter !== 'undefined' && PageInfoReporter.updateScrollState) { + var scrollY = Math.round(window.scrollY || window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0); + var scrollHeight = Math.round(Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)); + var clientHeight = Math.round(document.documentElement.clientHeight || window.innerHeight || 0); + + if (clientHeight === 0) return; + + var activeFragment = null; + var hasFoundAnyElementInDom = false; + + if (window.TOC_FRAGMENTS && window.TOC_FRAGMENTS.length > 0) { + // Adjust threshold to be slightly more forgiving (padding + 60px) + var threshold = window.VIEWPORT_PADDING_TOP + 60; + + for (var i = 0; i < window.TOC_FRAGMENTS.length; i++) { + var id = window.TOC_FRAGMENTS[i]; + // FIX: Look for both 'id' and 'name' attributes + var el = document.getElementById(id) || document.querySelector('[name="' + id + '"]'); + + if (el) { + hasFoundVisible = true; + var rect = el.getBoundingClientRect(); + + // Log individual element positions so we can see them in your FRAG_NAV_DEBUG filter + console.log("FRAG_NAV_DEBUG: Checking #" + id + " | rect.top: " + Math.round(rect.top) + " | threshold: " + threshold); + + if (rect.top <= threshold) { + activeFragment = id; + } else { + break; + } + } else { + if (!hasFoundVisible) { + activeFragment = id; + } + } + } + } + + // Fallback for the very start of the chapter + if (activeFragment === null && scrollY < 50 && window.TOC_FRAGMENTS && window.TOC_FRAGMENTS.length > 0) { + activeFragment = window.TOC_FRAGMENTS[0]; + } + + PageInfoReporter.updateScrollState(scrollY, scrollHeight, clientHeight, activeFragment); + } + window.reportTopChunk(); + }; + + // ADD THIS NEW DIAGNOSTIC FUNCTION + window.auditTocFragments = function() { + console.log("FRAG_NAV_DEBUG: --- Starting DOM Audit ---"); + if (!window.TOC_FRAGMENTS || window.TOC_FRAGMENTS.length === 0) { + console.log("FRAG_NAV_DEBUG: Audit failed - window.TOC_FRAGMENTS is empty."); + return; + } + + var foundCount = 0; + window.TOC_FRAGMENTS.forEach(id => { + var el = document.getElementById(id); + if (el) { + foundCount++; + console.log("FRAG_NAV_DEBUG: [FOUND] ID: " + id + " | Tag: " + el.tagName + " | OffsetTop: " + el.offsetTop); + } else { + console.log("FRAG_NAV_DEBUG: [MISSING] ID: " + id + " - Not in DOM."); + } + }); + console.log("FRAG_NAV_DEBUG: Audit complete. Found " + foundCount + "/" + window.TOC_FRAGMENTS.length); + + // Also log some random IDs from the DOM to see what's actually there + var allWithId = document.querySelectorAll('[id]'); + console.log("FRAG_NAV_DEBUG: Sample IDs existing in DOM: " + + Array.from(allWithId).slice(0, 5).map(el => el.id).join(", ")); + }; + + window.addEventListener('scroll', window.reportScrollState, { passive: true }); + window.addEventListener('resize', window.reportScrollState); + + window.triggerInitialScrollStateReport = function () { + var attempts = 0; var maxAttempts = 7; var baseInterval = 100; + function tryReport() { + attempts++; window.reportScrollState(); + var currentClientHeight = document.documentElement.clientHeight || window.innerHeight || 0; + if (currentClientHeight > 0) { setTimeout(window.reportScrollState, 50); return; } + if (attempts < maxAttempts) { var retryDelay = baseInterval + (attempts * 50); setTimeout(tryReport, retryDelay); } + } + setTimeout(tryReport, baseInterval); + }; + + window.scrollToChapterStart = function () { + requestAnimationFrame(function () { + window.scrollTo(0, 0); + setTimeout(function () { window.reportScrollState(); }, 100); + }); + }; + + window.scrollToChapterEnd = function () { + requestAnimationFrame(function () { + var targetScrollY = (document.body.scrollHeight || document.documentElement.scrollHeight) - (window.innerHeight || document.documentElement.clientHeight); + if (targetScrollY < 0) targetScrollY = 0; + window.scrollTo(0, targetScrollY); + setTimeout(function () { window.reportScrollState(); }, 100); + }); + }; + + window.scrollToSpecificY = function (yPosition) { + if (typeof yPosition === 'number' && yPosition >= 0) { + window.scrollTo(0, yPosition); + setTimeout(function () { window.reportScrollState(); }, 100); + } else { + setTimeout(function () { window.reportScrollState(); }, 100); + } + }; + + function initializeReaderContent() { + applyMobileOptimizationsAndSelection(); + } + + if (document.readyState === 'complete' || document.readyState === 'interactive') { + initializeReaderContent(); + } else { + document.addEventListener('DOMContentLoaded', initializeReaderContent); + } + + window.clearSearchHighlights = function () { + document.querySelectorAll('mark.search-highlight').forEach(function (el) { + var parent = el.parentNode; + if (parent) { + while (el.firstChild) { + parent.insertBefore(el.firstChild, el); + } + parent.removeChild(el); + parent.normalize(); + } + }); + return "JS: Search highlights cleared."; + }; + + window.highlightAllOccurrences = function (query) { + window.clearSearchHighlights(); + if (!query || query.length < 2) return "JS: Query too short for highlighting."; + + var walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false); + var nodesToModify = []; + while (node = walker.nextNode()) { + if (node.nodeValue.toLowerCase().includes(query.toLowerCase())) { + nodesToModify.push(node); + } + } + + var regex = new RegExp('(' + query.replace(/[-\/\^$*+?.()|[\]{}]/g, '\$&') + ')', 'gi'); + nodesToModify.forEach(function (textNode) { + if (textNode.parentNode && textNode.parentNode.tagName !== 'SCRIPT' && textNode.parentNode.tagName !== 'STYLE') { + var tempDiv = document.createElement('div'); + tempDiv.innerHTML = textNode.nodeValue.replace(regex, '$1'); + + var parent = textNode.parentNode; + while (tempDiv.firstChild) { + parent.insertBefore(tempDiv.firstChild, textNode); + } + parent.removeChild(textNode); + } + }); + + return "JS: Highlighted " + document.querySelectorAll('mark.search-highlight').length + " occurrences."; + }; + + window.scrollToOccurrence = function (index) { + var highlights = document.querySelectorAll('mark.search-highlight'); + if (highlights && index >= 0 && index < highlights.length) { + var element = highlights[index]; + element.scrollIntoView({ behavior: 'auto', block: 'center', inline: 'nearest' }); + return "JS: Scrolled to occurrence " + index; + } + return "JS: Occurrence " + index + " not found."; + }; + + window.removeHighlight = function () { + var highlightNode; + var removedCount = 0; + while ((highlightNode = document.querySelector('.tts-highlight')) !== null) { + var parent = highlightNode.parentNode; + if (parent) { + try { + while (highlightNode.firstChild) { + parent.insertBefore(highlightNode.firstChild, highlightNode); + } + parent.removeChild(highlightNode); + parent.normalize(); + removedCount++; + } catch (e) { + if (highlightNode.parentNode) { // Check if it wasn't already removed by a concurrent process + highlightNode.remove(); // Fallback removal + } + break; // Exit loop on error to prevent infinite loop on a problematic node + } + } else { + try { + highlightNode.remove(); + removedCount++; + } catch (e_orphan) { + // console.error("JS: Error removing orphaned highlight node: " + e_orphan.message, highlightNode); + } + break; + } + } + }; + + const TTS_HIGHLIGHT_LOG_TAG = "TTS_HIGHLIGHT_DIAGNOSIS"; + window.highlightFromCfi = function (cfi, textToHighlight, startOffset) { + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: highlightFromCfi called. CFI='${cfi}', Offset=${startOffset}, Text='${textToHighlight.substring(0, 50)}...'`); + window.removeHighlight(); + if (!cfi || !textToHighlight) { + const errorMsg = "JS: CFI or text missing."; + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: ${errorMsg}`); + return errorMsg; + } + + try { + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: Resolving CFI to node...`); + const location = window.getNodeAndOffsetFromCfi(cfi); + if (!location || !location.node) { + const errorMsg = "JS: Could not find node for CFI."; + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: ${errorMsg}`); + return errorMsg; + } + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: Node found for CFI. Node type: ${location.node.nodeName}, Text content: '${(location.node.textContent || "").substring(0, 50)}...'`); + + + const baseNode = location.node; + let remainingOffset = startOffset; + + const treeWalker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false); + treeWalker.currentNode = baseNode; + + let currentNode = (baseNode.nodeType === Node.TEXT_NODE) ? baseNode : treeWalker.nextNode(); + + // 1. Find the starting text node and character position + while (currentNode && remainingOffset >= currentNode.nodeValue.length) { + remainingOffset -= currentNode.nodeValue.length; + currentNode = treeWalker.nextNode(); + } + if (!currentNode) { + const errorMsg = "JS: Text offset is out of bounds for the CFI node."; + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: ${errorMsg}`); + return errorMsg; + } + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: Start node for range found. Node: '${currentNode.nodeValue.substring(0, 50)}...', calculated offset: ${remainingOffset}`); + + const range = document.createRange(); + range.setStart(currentNode, remainingOffset); + + // 2. Find the ending text node and character position + let remainingTextLength = textToHighlight.length; + let endNode = currentNode; + let endOffset = remainingOffset; + let sanityCheck = 0; + + while (remainingTextLength > 0 && endNode && sanityCheck < 50) { + const availableLength = endNode.nodeValue.length - endOffset; + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: Finding end range. Remaining text: ${remainingTextLength}, Current node: '${endNode.nodeValue.substring(0, 50)}...', available length: ${availableLength}`); + if (availableLength >= remainingTextLength) { + endOffset += remainingTextLength; + remainingTextLength = 0; + } else { + remainingTextLength -= availableLength; + // Important: We need a fresh walker starting from the endNode to find the *next* text node reliably + const nextNodeWalker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false); + nextNodeWalker.currentNode = endNode; + endNode = nextNodeWalker.nextNode(); + endOffset = 0; // Start from the beginning of the next node + } + sanityCheck++; + } + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: End node for range found. End node: '${endNode ? endNode.nodeValue.substring(0, 50) : "null"}', End offset: ${endOffset}`); + + + if (remainingTextLength > 0) { + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: Text to highlight was longer than found text nodes. Highlighting to end of last found node.`); + if (endNode) { + range.setEnd(endNode, endNode.nodeValue.length); + } else { + const lastKnownGoodNode = range.endContainer; + range.setEnd(lastKnownGoodNode, lastKnownGoodNode.nodeValue.length); + } + } else { + range.setEnd(endNode, endOffset); + } + + const highlightSpan = document.createElement('span'); + highlightSpan.className = 'tts-highlight'; + try { + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: Attempting to surround content with highlight span.`); + range.surroundContents(highlightSpan); + } catch (e) { + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: surroundContents failed, using fallback. Error: ${e.message}`); + const contents = range.extractContents(); + highlightSpan.appendChild(contents); + range.insertNode(highlightSpan); + } + + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: Highlight successful. Scrolling into view.`); + highlightSpan.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'nearest' }); + return "JS: Highlight successful."; + + } catch (e) { + const errorMsg = "JS: Error during highlightFromCfi: " + e.message; + console.log(`${TTS_HIGHLIGHT_LOG_TAG}: ${errorMsg}`); + return errorMsg; + } + }; + + window.extractTextWithCfiFromTop = function () { + try { + // 1. Find the element at the top of the viewport. + const viewportX = window.innerWidth / 2; + const viewportY = window.VIEWPORT_PADDING_TOP + 20; // A bit down from the very top edge + let topElement = document.elementFromPoint(viewportX, viewportY); + + if (!topElement) { + // Fallback if nothing is found (e.g., blank space between elements) + topElement = document.body.querySelector('p, h1, h2, h3, h4, img, svg, table, li'); + if (!topElement) return "[]"; // Chapter seems empty + } + + // 2. Find its containing block-level element that we use for TTS. + const ttsNodeSelector = 'p, h1, h2, h3, h4, h5, h6, li, blockquote'; + let startBlock = topElement.closest(ttsNodeSelector); + + if (!startBlock) { + // If the element itself isn't in a TTS block, fall back to the start of the chapter. + console.log("Could not find a starting TTS block. Falling back to full chapter."); + return window.extractTextWithCfi(); + } + + // 3. Get all potential TTS nodes. + const allContentNodes = Array.from(document.body.querySelectorAll(ttsNodeSelector)); + + // 4. Find the index of our starting block. + const startIndex = allContentNodes.findIndex(node => node === startBlock); + + if (startIndex === -1) { + // Should be rare if startBlock was found, but as a safeguard: + console.log("Could not find the start block in the node list. Falling back to full chapter."); + return window.extractTextWithCfi(); + } + + // 5. Slice the array and process it. + const nodesToProcess = allContentNodes.slice(startIndex); + const results = []; + + nodesToProcess.forEach(node => { + const text = node.innerText ? node.innerText.trim() : ""; + if (text.length > 0 && node.offsetParent !== null) { + try { + const cfi = getCfiPathForElement(node, 0); + if (cfi) { + results.push({ cfi: cfi, text: text }); + } + } catch (e) { + // ignore CFI generation errors for a single node + } + } + }); + + return JSON.stringify(results); + + } catch (e) { + // On any error, fall back to extracting everything to not break TTS completely. + return window.extractTextWithCfi(); + } + }; + + window.extractTextWithCfi = function () { + const results = []; + const contentNodes = document.body.querySelectorAll('p, h1, h2, h3, h4, h5, h6, li, blockquote'); + + contentNodes.forEach(node => { + const text = node.innerText ? node.innerText.trim() : ""; + if (text.length > 0 && node.offsetParent !== null) { + try { + const cfi = getCfiPathForElement(node, 0); + if (cfi) { + results.push({ cfi: cfi, text: text }); + } + } catch (e) { + } + } + }); + const jsonResult = JSON.stringify(results); + return jsonResult; + }; + + window.TtsBridgeHelper = { + extractAndRelayText: function () { + try { + const structuredTextJson = window.extractTextWithCfiFromTop(); + if (typeof TtsBridge !== 'undefined' && TtsBridge.onStructuredTextExtracted) { + TtsBridge.onStructuredTextExtracted(structuredTextJson); + } + } catch (e) { + if (typeof TtsBridge !== 'undefined' && TtsBridge.onStructuredTextExtracted) { + TtsBridge.onStructuredTextExtracted("[]"); + } + } + } + }; + + window.reportTopChunk = function () { + if (typeof ProgressReporter === 'undefined' || typeof ProgressReporter.updateTopChunk === 'undefined') return; + + const topElement = document.elementFromPoint(window.innerWidth / 2, window.VIEWPORT_PADDING_TOP + 1); + if (topElement) { + const chunkContainer = topElement.closest('[data-chunk-index]'); + if (chunkContainer) { + const chunkIndex = parseInt(chunkContainer.dataset.chunkIndex, 10); + if (!isNaN(chunkIndex)) { + ProgressReporter.updateTopChunk(chunkIndex); + } + } else { + ProgressReporter.updateTopChunk(0); + } + } + }; + + window.AiBridgeHelper = { + extractAndRelayTextForSummarization: function () { + var textContent = ""; + try { + var mainElement = document.querySelector('article, [role="main"], main, body'); + if (mainElement) { + textContent = mainElement.innerText || mainElement.textContent || ""; + } else { + textContent = document.body.innerText || document.body.textContent || ""; + } + if (typeof AiBridge !== 'undefined' && AiBridge.onContentExtractedForSummarization) { + AiBridge.onContentExtractedForSummarization(textContent.trim()); + } + } catch (e) { + if (typeof AiBridge !== 'undefined' && AiBridge.onContentExtractedForSummarization) { + AiBridge.onContentExtractedForSummarization(""); + } + } + } + }; + + window.checkImagesForDiagnosis = function () { + const images = document.querySelectorAll('img, image'); // 'image' for SVG images + const logTag = "ImageDiagnosis"; + console.log(logTag + ": JS checkImagesForDiagnosis called. Found " + images.length + " image elements."); + images.forEach((img, index) => { + const src = img.src || img.getAttribute('xlink:href'); + console.log(logTag + ": Image #" + index + " | src: '" + src + "'"); + + function processImage() { + console.log(logTag + ": Processing Image #" + index + " (complete=" + img.complete + ")"); + console.log(logTag + ": Image #" + index + " | clientWidth: " + img.clientWidth + ", clientHeight: " + img.clientHeight); + console.log(logTag + ": Image #" + index + " | naturalWidth: " + img.naturalWidth + ", naturalHeight: " + img.naturalHeight); + console.log(logTag + ": Image #" + index + " | is visible (offsetParent): " + (img.offsetParent !== null)); + + const style = window.getComputedStyle(img); + console.log(logTag + ": Image #" + index + " | computed display: '" + style.display + "', visibility: '" + style.visibility + "', opacity: '" + style.opacity + "'"); + + // FIX: If height has collapsed, manually calculate and set it forcefully. + if (img.complete && img.naturalWidth > 0 && img.clientWidth > 0 && img.clientHeight === 0) { + console.log(logTag + ": CORRECTING GEOMETRY for Image #" + index); + const parent = img.parentElement; + if (parent) { + const parentStyle = window.getComputedStyle(parent); + console.log(logTag + ": Parent <" + parent.tagName + "> computed height: " + parentStyle.height + ", overflow: " + parentStyle.overflow); + // Force the parent's height to be determined by its content. This is crucial. + parent.style.setProperty('height', 'auto', 'important'); + } + const aspectRatio = img.naturalHeight / img.naturalWidth; + const correctHeight = img.clientWidth * aspectRatio; + + // Remove the conflicting max-height property and then set the explicit height. + img.style.setProperty('max-height', 'none', 'important'); + img.style.setProperty('height', correctHeight + 'px', 'important'); + + console.log(logTag + ": Corrective styles applied to Image #" + index + ". Verifying height after a short delay for reflow..."); + + // After applying styles, wait a moment for the browser to reflow the layout + // before reporting the new height and updating the scroll state. + setTimeout(function () { + console.log(logTag + ": Verified height for Image #" + index + ": " + img.clientHeight + "px"); + window.reportScrollState(); // Update scroll metrics now that the image has height + }, 150); + } + + img.onerror = function () { + console.log(logTag + ": ERROR: Image #" + index + " FAILED to load. Src was: '" + src + "'"); + }; + if (img.complete && img.naturalWidth === 0) { + console.log(logTag + ": WARNING: Image #" + index + " is complete but has 0 naturalWidth, may indicate loading error. Src: '" + src + "'"); + } + } + + if (img.complete) { + processImage(); + } else { + img.onload = processImage; + } + }); + }; + + const CFI_LOG_TAG = "CFI_DIAGNOSIS"; + function log(message) { + console.log(`${CFI_LOG_TAG}: ${message}`); + } + + function resolveCfiPath(rootElement, path) { + log(`Attempting to resolve path '${path}' from root <${rootElement.tagName}>`); + let currentNode = rootElement; + const steps = path.substring(1).split('/').map(Number); + + for (let i = 0; i < steps.length; i++) { + const cfiIndex = steps[i]; + if (!currentNode) { + log(`Traversal failed: currentNode became null before step ${i} (CFI index ${cfiIndex}).`); + return null; + } + + const elementChildren = Array.from(currentNode.childNodes).filter(node => node.nodeType === Node.ELEMENT_NODE); + const childNodeIndex = (cfiIndex - 2) / 2; + + if (childNodeIndex >= 0 && childNodeIndex < elementChildren.length) { + currentNode = elementChildren[childNodeIndex]; + } else { + const childrenTags = elementChildren.map(node => `<${node.tagName || "TEXT"}>`).join(', '); + log(`Step ${i}: FAILED. CFI index ${cfiIndex} (child index ${childNodeIndex}) is out of bounds for ${elementChildren.length} element children: [${childrenTags}]`); + log(`Parent Node HTML at failure point (<${currentNode.tagName}>): ${currentNode.innerHTML.substring(0, 300)}...`); // ADD THIS LINE + return null; // Path is invalid from this root + } + } + return currentNode; + } + + window.getNodeAndOffsetFromCfi = function (cfi) { + log(`getNodeAndOffsetFromCfi called with: ${cfi}`); + try { + var pathParts = cfi.split(':'); + var nodePath = pathParts[0]; + var charOffset = pathParts.length > 1 ? parseInt(pathParts[1], 10) : 0; + + log(`Parsed CFI: path=${nodePath}, offset=${charOffset}`); + + let cfiRoot = document.getElementById('content-container') || document.body; + let pathToResolve = nodePath; + + const firstChunk = cfiRoot.querySelector('[data-chunk-index]'); + if (firstChunk && pathToResolve.startsWith('/4/')) { + log(`Paginator CFI detected. Adjusting root to first chunk and stripping '/4' from path.`); + cfiRoot = firstChunk; + pathToResolve = '/' + pathToResolve.substring(3); + } + + log(`CFI Root is <${cfiRoot.tagName}>, Path to resolve is ${pathToResolve}`); + + let resolvedNode = resolveCfiPath(cfiRoot, pathToResolve); + log(`Resolution attempt #1 (from CFI root) result: ${resolvedNode ? resolvedNode.tagName : 'null'}`); + + if (!resolvedNode) { + log("Resolution failed from all roots."); + return null; + } + + let currentNode = resolvedNode; + log(`Successfully resolved containing element: <${currentNode.tagName || 'TEXT_NODE'}>`); + if (currentNode.nodeType === Node.ELEMENT_NODE) { + const treeWalker = document.createTreeWalker(currentNode, NodeFilter.SHOW_TEXT, null, false); + const firstTextNode = treeWalker.nextNode(); + if (firstTextNode) { + log(`Found first text node inside element to apply offset.`); + currentNode = firstTextNode; + } else { + log(`Could not find a text node inside the target element. Using the element itself.`); + } + } + return { node: currentNode, offset: charOffset }; + } catch (e) { + log(`ERROR in getNodeAndOffsetFromCfi: ${e.message}`); + return null; + } + }; + + window.getCfiPathForElement = function (element, charOffset) { + const logStack = []; + try { + var path = []; + var currentNode = element; + + if (currentNode.nodeType === Node.TEXT_NODE) { + logStack.push(`Initial node is a TEXT_NODE. Calculating cumulative offset.`); + + // --- FIX: Accumulate offsets from previous siblings --- + var accumulatedOffset = charOffset || 0; + var sibling = currentNode.previousSibling; + + while (sibling) { + if (sibling.nodeType === Node.TEXT_NODE) { + accumulatedOffset += sibling.nodeValue.length; + } else if (sibling.nodeType === Node.ELEMENT_NODE) { + // Elements like , contribute text content to the flow + accumulatedOffset += (sibling.textContent || "").length; + } + sibling = sibling.previousSibling; + } + + logStack.push(`Original offset: ${charOffset}, Cumulative offset: ${accumulatedOffset}`); + charOffset = accumulatedOffset; + // ----------------------------------------------------- + + logStack.push(`Using its parent <${currentNode.parentNode.tagName}> for path generation.`); + currentNode = currentNode.parentNode; + } + + const root = document.getElementById('content-container') || document.body; + + logStack.push(`Using <${root.tagName} id='${root.id}' class='${root.className}'> as the consistent CFI root.`); + + while (currentNode && currentNode !== root && currentNode.parentNode) { + const parentNode = currentNode.parentNode; + const elementSiblings = Array.from(parentNode.childNodes).filter(node => node.nodeType === Node.ELEMENT_NODE); + const nodeIndex = elementSiblings.indexOf(currentNode); + + if (nodeIndex === -1) { + currentNode = parentNode; + continue; + } + + const cfiIndex = (nodeIndex * 2) + 2; + path.unshift(cfiIndex); + + const childrenTags = elementSiblings.map(node => `<${node.tagName || "TEXT"}>`).join(', '); + logStack.push(`GENERATION: Parent <${parentNode.tagName}> has ${elementSiblings.length} element children: [${childrenTags}]. Current node <${currentNode.tagName}> is at index ${nodeIndex}, becoming CFI step ${cfiIndex}. Path: /${path.join('/')}`); + + currentNode = parentNode; + } + + var cfi = `/` + path.join('/'); + if (charOffset !== undefined && charOffset > 0) { + cfi += ':' + charOffset; + } + logStack.push(`Final CFI generated: ${cfi}`); + return { cfi: cfi, log: logStack }; + } catch (e) { + logStack.push(`ERROR in getCfiPathForElement: ${e.message}`); + return { cfi: `/2`, log: logStack }; + } + }; + + window.getCurrentCfi = function () { + const debugLog = []; + let finalCfi = "/2"; + try { + const viewportX = window.innerWidth / 2; + const viewportY = window.VIEWPORT_PADDING_TOP + 5; + debugLog.push(`Probing for CFI at coordinates: x=${viewportX}, y=${viewportY} (padding top: ${window.VIEWPORT_PADDING_TOP})`); + + let topElement = document.elementFromPoint(viewportX, viewportY); + if (!topElement) { + debugLog.push("elementFromPoint returned null. Trying to find the first element in the body as a fallback."); + topElement = document.body.querySelector('p, h1, h2, h3, h4, img, svg, table, li'); + if (!topElement) { + debugLog.push("No meaningful elements found in body. Aborting."); + return JSON.stringify({ cfi: finalCfi, log: debugLog }); + } + } + debugLog.push(`Initial element found: <${topElement.tagName} id='${topElement.id}' class='${topElement.className}'>`); + debugLog.push(`Element's text content (first 50 chars): '${(topElement.textContent || "").trim().substring(0, 50)}'`); + + // Ensure we are inside our content root, not on the body or html itself + const contentRoot = document.getElementById('content-container') || document.body; + if (!contentRoot.contains(topElement)) { + topElement = contentRoot.querySelector('p, h1, h2, h3, h4, img, svg, table, li') || contentRoot.firstElementChild; + debugLog.push(`Initial element was outside content root. Switched to first meaningful child: <${topElement ? topElement.tagName : 'null'}>`); + } + + let range = document.caretRangeFromPoint ? document.caretRangeFromPoint(viewportX, viewportY) : null; + let nodeForCfi; + let offsetForCfi = 0; + + if (range && range.startContainer && range.startContainer.nodeType === Node.TEXT_NODE && range.startContainer.textContent.trim().length > 0) { + nodeForCfi = range.startContainer; + offsetForCfi = range.startOffset; + debugLog.push(`Success with caretRangeFromPoint. Node: "${nodeForCfi.nodeValue.substring(0, 30)}...", Offset: ${offsetForCfi}`); + } else { + debugLog.push("caretRangeFromPoint failed or found non-text/empty node. Using element-based CFI."); + const treeWalker = document.createTreeWalker(topElement, NodeFilter.SHOW_TEXT, null, false); + let firstTextNode = treeWalker.nextNode(); + nodeForCfi = (firstTextNode && firstTextNode.textContent.trim().length > 0) ? firstTextNode : topElement; + offsetForCfi = 0; + debugLog.push(`Using fallback node for CFI generation: <${nodeForCfi.tagName || 'TEXT_NODE'}>`); + } + + const cfiResult = getCfiPathForElement(nodeForCfi, offsetForCfi); + finalCfi = cfiResult.cfi; + debugLog.push(...cfiResult.log); + + } catch (e) { + debugLog.push(`FATAL ERROR in getCurrentCfi: ${e.message}`); + } + + return JSON.stringify({ cfi: finalCfi, log: debugLog }); + }; + + window.scrollToCfi = function (cfi) { + log(`scrollToCfi called with: ${cfi}`); + let cleanCfi = cfi; + if (cfi && cfi.includes('@')) { + log("Old CFI format detected. Stripping prefix."); + cleanCfi = cfi.substring(cfi.indexOf('@') + 1); + log(`Cleaned CFI is now: ${cleanCfi}`); + } + + if (!cleanCfi || !cleanCfi.startsWith('/')) { + log("CFI is null or has invalid format, not scrolling."); + return; + } + + setTimeout(() => { + log(`Executing scroll for CFI '${cleanCfi}' after delay.`); + try { + const location = window.getNodeAndOffsetFromCfi(cleanCfi); + if (location && location.node) { + log(`Successfully found location for CFI. Node Type: ${location.node.nodeType}, Node Name: ${location.node.nodeName}`); + + if (location.node.nodeType === Node.TEXT_NODE && location.offset > 0) { + try { + const range = document.createRange(); + const validOffset = Math.min(location.offset, location.node.nodeValue.length); + range.setStart(location.node, validOffset); + range.collapse(true); + + const rect = range.getBoundingClientRect(); + if (rect.top !== 0 || rect.left !== 0) { + const currentScrollY = window.scrollY; + const targetScrollY = currentScrollY + rect.top - window.VIEWPORT_PADDING_TOP; + + log(`Precise scroll calculated. Rect top: ${rect.top}, Current scrollY: ${currentScrollY}, Target scrollY: ${targetScrollY}`); + window.scrollTo({ top: targetScrollY, behavior: 'auto' }); + + setTimeout(window.reportScrollState, 150); + return; + } else { + log("Range rect.top was 0, indicating an issue or the element is already at the top. Falling back to element scroll."); + } + } catch (rangeError) { + log(`Error during precise scroll calculation: ${rangeError.message}. Falling back.`); + } + } + + const targetElement = (location.node.nodeType === Node.TEXT_NODE) ? location.node.parentNode : location.node; + log(`Using fallback scrollIntoView for element: <${targetElement.tagName}>`); + targetElement.scrollIntoView({ behavior: 'auto', block: 'start', inline: 'nearest' }); + + setTimeout(() => { + const newScrollY = window.scrollY; + log(`ScrollY AFTER fallback scroll: ${newScrollY}`); + window.reportScrollState(); + }, 150); + + } else { + log("FAILED to find the target node for CFI: " + cleanCfi); + } + } catch (e) { + log("FATAL ERROR during scrollToCfi: " + e.message); + } + }, 250); + }; + + window.getElementByCfi = function (cfi) { + var TAG_DIAG = "BookmarkDiagnosis"; + console.log(TAG_DIAG + ": getElementByCfi called with CFI: " + cfi); + try { + var pathParts = cfi.split('!')[0].split(':')[0]; + var steps = pathParts.substring(1).split('/').map(Number); + console.log(TAG_DIAG + ": Parsed steps: " + JSON.stringify(steps)); + var currentNode = document.body; + + for (var i = 1; i < steps.length; i++) { + if (!currentNode) { + console.log(TAG_DIAG + ": Traversal failed. currentNode became null at step " + i); + return null; + } + var cfiIndex = steps[i]; + + const children = Array.from(currentNode.childNodes).filter(node => { + return node.nodeType === Node.ELEMENT_NODE || (node.nodeType === Node.TEXT_NODE && node.textContent.trim() !== ''); + }); + + var childNodeIndex = (cfiIndex - 2) / 2; + console.log(TAG_DIAG + ": Step " + i + " (CFI index " + cfiIndex + "): Looking for child at index " + childNodeIndex + " among " + children.length + " children."); + + + if (childNodeIndex < 0 || childNodeIndex >= children.length) { + console.log(TAG_DIAG + ": Path is invalid. Child index " + childNodeIndex + " is out of bounds."); + return null; // Path is invalid for this document + } + currentNode = children[childNodeIndex]; + if (currentNode) { + console.log(TAG_DIAG + ": Found node for step " + i + ": " + (currentNode.tagName || "TEXT_NODE")); + } + } + + if (!currentNode) { + console.log(TAG_DIAG + ": Final currentNode is null."); + return null; + } + + var resultNode = (currentNode.nodeType === Node.TEXT_NODE) ? currentNode.parentNode : currentNode; + console.log(TAG_DIAG + ": Successfully found element: " + (resultNode ? resultNode.tagName : "null")); + return resultNode; + + } catch (e) { + console.log(TAG_DIAG + ": Error during getElementByCfi: " + e.message); + return null; + } + }; + + window.isElementInViewport = function (el) { + if (!el || typeof el.getBoundingClientRect !== 'function') return false; + const rect = el.getBoundingClientRect(); + const viewportHeight = window.innerHeight || document.documentElement.clientHeight; + return ( + rect.top >= 0 && + rect.top <= viewportHeight + ); + }; + + window.getSnippetForCfi = function (cfi) { + var TAG_DIAG = "BookmarkDiagnosis"; + console.log(TAG_DIAG + ": getSnippetForCfi called with CFI: " + cfi); + const location = window.getNodeAndOffsetFromCfi(cfi); + + if (location && location.node) { + let textNode = location.node.nodeType === Node.TEXT_NODE ? location.node : null; + let offset = location.offset; + + if (!textNode) { + const treeWalker = document.createTreeWalker(location.node, NodeFilter.SHOW_TEXT, null, false); + textNode = treeWalker.nextNode(); + offset = 0; + } + + if (textNode) { + const fullText = textNode.textContent; + const lastSpace = fullText.lastIndexOf(' ', offset); + const startIndex = (lastSpace === -1) ? 0 : lastSpace + 1; + + let snippet = fullText.substring(startIndex); + + const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false); + walker.currentNode = textNode; + + while (snippet.length < 160) { + const nextNode = walker.nextNode(); + if (nextNode) { + snippet += " " + nextNode.textContent; + } else { + break; + } + } + const finalSnippet = snippet.trim().replace(/\s+/g, ' ').substring(0, 150); + console.log(TAG_DIAG + ": Snippet generated: '" + finalSnippet + "'"); + return finalSnippet; + } + } + console.log(TAG_DIAG + ": No usable text found for CFI. Returning empty snippet."); + return ""; + }; + + window.findFirstVisibleCfi = function (cfiArray) { + + if (!Array.isArray(cfiArray)) { + return null; + } + const viewportHeight = window.innerHeight || document.documentElement.clientHeight; + const activationZoneEnd = window.VIEWPORT_PADDING_TOP + ((viewportHeight - window.VIEWPORT_PADDING_TOP) * 0.6); + + for (const cfi of cfiArray) { + const location = window.getNodeAndOffsetFromCfi(cfi); + + if (location && location.node) { + try { + const node = location.node; + // Use the element's rect for stability, not a potentially zero-height range rect. + const elementForRect = (node.nodeType === Node.TEXT_NODE) ? node.parentNode : node; + const rect = elementForRect.getBoundingClientRect(); + const nodeName = elementForRect.nodeName; + + // The element is "active" if: + // 1. It's positioned at the top of the content, even if under the padding. + const isAtContentTop = rect.top >= 0 && rect.top < window.VIEWPORT_PADDING_TOP; + // 2. Any part of it overlaps with the main "reading zone" below the padding. + const isInReadingZone = rect.bottom > window.VIEWPORT_PADDING_TOP && rect.top < activationZoneEnd; + + if ((isAtContentTop && rect.height > 0) || isInReadingZone) { + return cfi; + } + } catch (e) { + console.log(TAG + ": Error processing CFI " + cfi + ": " + e.message); + } + } else { + console.log(TAG + ": No node found for CFI: " + cfi); + } + } + console.log(TAG + ": No visible bookmarked element found in viewport. Returning null."); + return null; + }; + +})(); + +(function () { + // --- VIRTUALIZATION LOGIC --- + if (window.virtualization) return; + + let currentBottomChunkIndex = 0; + let totalChunks = 0; + let isLoading = false; + let observer; + + window.virtualization = { + totalChunks: 0, + chunksData: [], + chunkHeights:[], + observer: null, + + init: function (initialChunkIndex, total) { + console.log(`Virtualization: Init with ${total} chunks. Anchor: ${initialChunkIndex}`); + this.totalChunks = total; + this.chunksData = new Array(total).fill(null); + this.chunkHeights = new Array(total).fill(0); + + const container = document.getElementById('content-container'); + if (container) { + container.querySelectorAll('.chunk-container').forEach(div => { + let idx = parseInt(div.dataset.chunkIndex, 10); + let content = div.innerHTML.trim(); + if (content.length > 0) { + this.chunksData = content; + this.chunkHeights = div.getBoundingClientRect().height; + } + }); + } + + this.setupObserver(); + }, + + setupObserver: function () { + if (this.observer) this.observer.disconnect(); + + this.observer = new IntersectionObserver((entries) => { + let scrollAdjust = 0; + + entries.forEach(entry => { + let div = entry.target; + let idx = parseInt(div.dataset.chunkIndex, 10); + + if (entry.isIntersecting) { + if (!this.chunksData) { + if (window.ContentBridge && window.ContentBridge.requestChunk) { + window.ContentBridge.requestChunk(idx); + } + } else if (div.innerHTML === '') { + let oldHeight = div.getBoundingClientRect().height; + div.innerHTML = this.chunksData; + div.style.height = ''; + let newHeight = div.getBoundingClientRect().height; + this.chunkHeights = newHeight; + + if (div.getBoundingClientRect().top < 0) { + scrollAdjust += (newHeight - oldHeight); + } + } + } else { + if (div.innerHTML !== '') { + let oldHeight = div.getBoundingClientRect().height; + this.chunkHeights = oldHeight; + div.style.height = oldHeight + 'px'; + div.innerHTML = ''; + } + } + }); + + if (scrollAdjust !== 0) { + window.scrollBy(0, scrollAdjust); + } + + }, { + rootMargin: '2500px 0px' + }); + + document.querySelectorAll('.chunk-container').forEach(div => { + this.observer.observe(div); + }); + }, + + appendChunk: function (index, htmlContent) { + console.log(`Virtualization: Receiving chunk ${index} from Kotlin`); + this.chunksData = htmlContent; + + let div = document.querySelector(`.chunk-container`); + if (div && div.innerHTML === '') { + let oldHeight = div.getBoundingClientRect().height; + div.innerHTML = htmlContent; + div.style.height = ''; + let newHeight = div.getBoundingClientRect().height; + this.chunkHeights = newHeight; + + if (div.getBoundingClientRect().top < 0) { + window.scrollBy(0, newHeight - oldHeight); + } + } + + if (window.checkImagesForDiagnosis) { + setTimeout(window.checkImagesForDiagnosis, 100); + } + } + }; + + const HL_LOG_TAG = "HIGHLIGHT_DEBUG"; + + window.HighlightBridgeHelper = { + + updateHighlightStyle: function (cfi, newColorClass, colorId) { + console.log(`${HL_LOG_TAG}: updateHighlightStyle called. CFI: ${cfi}, Class: ${newColorClass}`); + var allSpans = document.querySelectorAll('span[class^="user-highlight-"]'); + allSpans.forEach(span => { + var cfis = (span.getAttribute('data-cfi') || "").split('|'); + if (cfis.includes(cfi)) { + if (cfis.length === 1) { + span.className = newColorClass; + } else { + span.classList.add(newColorClass); + } + } + }); + + if (window.HighlightBridge) { + var sampleSpan = document.querySelector(`span[data-cfi*='${cfi}']`); + var text = sampleSpan ? sampleSpan.textContent : ""; + window.HighlightBridge.onHighlightCreated(cfi, text, colorId); + } + }, + + createUserHighlight: function (colorClass, colorId) { + console.log(`${HL_LOG_TAG}: createUserHighlight. Class: ${colorClass}`); + var selection = window.getSelection(); + if (!selection || selection.rangeCount === 0 || selection.toString().trim() === "") { + return; + } + + try { + var range = selection.getRangeAt(0); + var text = range.toString(); + + var safeStartNode = range.startContainer; + var safeStartOffset = range.startOffset; + var safeEndNode = range.endContainer; + var safeEndOffset = range.endOffset; + + console.log(`${HL_LOG_TAG}: [CREATE] Raw Selection - Text: '${text}'`); + console.log(`${HL_LOG_TAG}: [CREATE] StartContainer Type: ${safeStartNode.nodeType}, Name: ${safeStartNode.nodeName}`); + + var startResult = getCfiPathForElement(safeStartNode, safeStartOffset); + var startCfi = startResult.cfi; + + var endResult = getCfiPathForElement(safeEndNode, safeEndOffset); + var endCfi = endResult.cfi; + + var finalCfi = startCfi; + if (startCfi !== endCfi) { + finalCfi = startCfi + "|" + endCfi; + console.log(`${HL_LOG_TAG}: [CREATE] Range CFI Detected. Start: ${startCfi}, End: ${endCfi}`); + } + + console.log(`${HL_LOG_TAG}: [CREATE] Final CFI: ${finalCfi}`); + + range = this.normalizeRangeBoundaries(range); + this.highlightRangeSafe(range, colorClass, finalCfi); + + selection.removeAllRanges(); + + if (window.HighlightBridge) { + window.HighlightBridge.onHighlightCreated(finalCfi, text, colorId); + } + } catch (e) { + console.log(`${HL_LOG_TAG}: Create Error: ` + e.message); + } + }, + + normalizeRangeBoundaries: function (range) { + var startContainer = range.startContainer; + var startOffset = range.startOffset; + var endContainer = range.endContainer; + var endOffset = range.endOffset; + + if (startContainer.nodeType === Node.TEXT_NODE && startOffset > 0 && startOffset < startContainer.length) { + var newStartNode = startContainer.splitText(startOffset); + range.setStart(newStartNode, 0); + if (endContainer === startContainer) { + endContainer = newStartNode; + endOffset = endOffset - startOffset; + } + } + + if (endContainer.nodeType === Node.TEXT_NODE && endOffset > 0 && endOffset < endContainer.length) { + endContainer.splitText(endOffset); + range.setEnd(endContainer, endOffset); + } + + return range; + }, + + highlightRangeSafe: function (range, className, newCfi) { + var nodes = this.getTextNodesInRange(range); + nodes.forEach(node => { + var parent = node.parentNode; + if (parent && parent.tagName === 'SPAN' && parent.classList.contains(className)) { + var currentCfi = parent.getAttribute('data-cfi') || ""; + var cfiList = currentCfi.split('|'); + if (!cfiList.includes(newCfi)) { + parent.setAttribute('data-cfi', currentCfi + "|" + newCfi); + } + } else { + if (node.nodeValue.trim().length === 0) return; + var span = document.createElement('span'); + span.className = className; + span.setAttribute('data-cfi', newCfi); + node.parentNode.insertBefore(span, node); + span.appendChild(node); + } + }); + }, + + getTextNodesInRange: function (range) { + var textNodes = []; + var container = range.commonAncestorContainer; + var root = (container.nodeType === Node.TEXT_NODE) ? container.parentNode : container; + var walker = document.createTreeWalker( + root, + NodeFilter.SHOW_TEXT, + { + acceptNode: function (node) { + return range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT; + } + }, + false + ); + while (walker.nextNode()) { + textNodes.push(walker.currentNode); + } + return textNodes; + }, + + removeHighlightByCfi: function (cfiToRemove, optionalCssClass) { + console.log(`${HL_LOG_TAG}: removeHighlightByCfi called.`); + console.log(`${HL_LOG_TAG}: -> Target CFI: '${cfiToRemove}'`); + console.log(`${HL_LOG_TAG}: -> Optional Class: '${optionalCssClass}'`); + + // 1. Select all highlight spans manually to avoid selector syntax errors + var allSpans = document.querySelectorAll('span[data-cfi]'); + console.log(`${HL_LOG_TAG}: Total highlight spans found in DOM: ${allSpans.length}`); + + var foundCount = 0; + var removedCount = 0; + var updatedCount = 0; + + allSpans.forEach(span => { + var currentCfiAttr = span.getAttribute('data-cfi') || ""; + var cfiList = currentCfiAttr.split('|'); + + // Detailed check for match + if (cfiList.includes(cfiToRemove)) { + foundCount++; + console.log(`${HL_LOG_TAG}: Match found on span. Current CFIs: [${currentCfiAttr}]`); + + var newCfiList = cfiList.filter(c => c !== cfiToRemove); + + if (newCfiList.length === 0) { + // CASE 1: No other highlights on this span -> Remove entirely + console.log(`${HL_LOG_TAG}: -> Removing span entirely (no remaining CFIs).`); + var parent = span.parentNode; + while (span.firstChild) parent.insertBefore(span.firstChild, span); + parent.removeChild(span); + parent.normalize(); + removedCount++; + } else { + // CASE 2: Overlapping highlight -> Update data-cfi + console.log(`${HL_LOG_TAG}: -> Updating span (remaining CFIs: ${newCfiList.join('|')}).`); + span.setAttribute('data-cfi', newCfiList.join('|')); + + if (optionalCssClass) { + console.log(`${HL_LOG_TAG}: -> Removing CSS class: ${optionalCssClass}`); + span.classList.remove(optionalCssClass); + } else { + console.log(`${HL_LOG_TAG}: -> Warning: No CSS class provided to remove. Visual style might persist if classes are mixed.`); + } + updatedCount++; + } + } + }); + + console.log(`${HL_LOG_TAG}: Removal Summary -> Matched: ${foundCount}, Removed: ${removedCount}, Updated: ${updatedCount}`); + + if (foundCount === 0) { + console.log(`${HL_LOG_TAG}: No exact matches found. Attempting legacy fallback.`); + this.removeHighlightByCfiLegacy(cfiToRemove); + } + }, + + removeHighlightByCfiLegacy: function (cfi) { + try { + var location = window.getNodeAndOffsetFromCfi(cfi); + if (location && location.node) { + var target = location.node; + if (target.nodeType === Node.TEXT_NODE) target = target.parentNode; + if (target.tagName === 'SPAN' && target.className.startsWith('user-highlight-')) { + var parent = target.parentNode; + while (target.firstChild) parent.insertBefore(target.firstChild, target); + parent.removeChild(target); + parent.normalize(); + } + } + } catch (e) { } + }, + + restoreHighlights: function (jsonArrayString) { + try { + var highlights = JSON.parse(jsonArrayString); + var self = this; + highlights.forEach(function (h) { + self.applyHighlight(h.cfi, h.text, h.cssClass); + }); + } catch (e) { + console.log(`${HL_LOG_TAG}: Error restoring: ` + e.message); + } + }, + + applyHighlight: function (cfi, text, cssClass) { + // "Healed" Apply Logic: Checks text equality before applying + try { + if (document.querySelector(`span[data-cfi='${cfi}']`)) return; + + const location = window.getNodeAndOffsetFromCfi(cfi); + if (!location || !location.node) return; + + let startNode = location.node; + let startOffset = location.offset; + + if (startNode.nodeType === Node.TEXT_NODE) { + const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false); + walker.currentNode = startNode; + + while (startNode && startOffset >= startNode.nodeValue.length) { + if (startOffset === startNode.nodeValue.length) { + const next = walker.nextNode(); + if (next) { + startOffset -= startNode.nodeValue.length; + startNode = next; + } else { + break; + } + } else { + startOffset -= startNode.nodeValue.length; + startNode = walker.nextNode(); + } + } + } + + // 1. Text Verification / Healing + if (text && text.length > 0 && startNode && startNode.nodeType === Node.TEXT_NODE) { + const nodeVal = startNode.nodeValue; + // Check if text matches at exact offset + const substring = nodeVal.substring(startOffset, startOffset + text.length); + + // Allow for some whitespace looseness (trim comparison) + if (substring !== text && substring.trim() !== text.trim()) { + console.log(`${HL_LOG_TAG}: Text mismatch at CFI. Searching nearby... Expected: '${text.substring(0, 10)}...', Found: '${substring.substring(0, 10)}...'`); + + // Try finding the text in the whole node + const foundIndex = nodeVal.indexOf(text); + if (foundIndex !== -1) { + console.log(`${HL_LOG_TAG}: Found text elsewhere in node. Adjusting offset from ${startOffset} to ${foundIndex}.`); + startOffset = foundIndex; + } else { + // Simple fuzzy: Try finding first 20 chars + const partial = text.substring(0, Math.min(text.length, 20)); + const partialIndex = nodeVal.indexOf(partial); + if (partialIndex !== -1) { + console.log(`${HL_LOG_TAG}: Found partial match. Adjusting offset.`); + startOffset = partialIndex; + } + } + } + } + + if (!startNode) return; + + const range = document.createRange(); + + // Set Start + if (startNode.nodeType === Node.TEXT_NODE) { + // Ensure offset is valid + if (startOffset > startNode.nodeValue.length) { + startOffset = Math.max(0, startNode.nodeValue.length - 1); + } + } + range.setStart(startNode, startOffset); + + const treeWalker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false); + treeWalker.currentNode = startNode; + + let currentNode = treeWalker.currentNode; + let remainingOffset = startOffset; + let remainingLen = text.length; + let endNode = currentNode; + let endOffset = startOffset; + + while (remainingLen > 0 && endNode) { + let avail = endNode.nodeValue.length - endOffset; + if (avail >= remainingLen) { + endOffset += remainingLen; + remainingLen = 0; + } else { + remainingLen -= avail; + endNode = treeWalker.nextNode(); + endOffset = 0; + } + } + + if (endNode) { + range.setEnd(endNode, endOffset); + var normalizedRange = this.normalizeRangeBoundaries(range); + this.highlightRangeSafe(normalizedRange, cssClass, cfi); + } + } catch (e) { console.log(e); } + } + }; +})(); + +(function() { + const TAG_AUTO_SCROLL = "AutoScrollDiagnosis"; // Define the tag + + window.autoScroll = { + active: false, + speed: 1.0, + accumulator: 0.0, + animationId: null, + + start: function(speed) { + console.log(`${TAG_AUTO_SCROLL}: Starting auto-scroll. Speed: ${speed}`); + this.active = true; + this.speed = speed || this.speed; + this.accumulator = 0.0; + if (this.animationId) cancelAnimationFrame(this.animationId); + this.loop(); + }, + + stop: function() { + console.log(`${TAG_AUTO_SCROLL}: Stopping auto-scroll.`); + this.active = false; + const container = document.getElementById('content-container') || document.body; + if(container) container.style.transform = 'none'; + + if (this.animationId) { + cancelAnimationFrame(this.animationId); + this.animationId = null; + } + }, + + updateSpeed: function(newSpeed) { + console.log(`${TAG_AUTO_SCROLL}: Speed updated to ${newSpeed}`); + this.speed = newSpeed; + }, + + loop: function() { + if (!this.active) return; + + this.accumulator += this.speed; + + const pixelsToScroll = Math.floor(this.accumulator); + const subPixelRemainder = this.accumulator - pixelsToScroll; + + if (pixelsToScroll >= 1) { + const prevScrollY = window.scrollY; + window.scrollBy(0, pixelsToScroll); + this.accumulator -= pixelsToScroll; + + // Calculation logic + const innerH = window.innerHeight; + const scrollY = window.scrollY; + const docHeight = document.documentElement.scrollHeight; // Usually more reliable than body.scrollHeight + + const currentScrollPos = scrollY + innerH; + + // Relaxed threshold slightly (from 2 to 3) to account for sub-pixel rendering differences + const isAtBottom = currentScrollPos >= (docHeight - 3); + const isStuck = (scrollY === prevScrollY); + + // Log only when we are very close to the bottom or stuck, to avoid spamming + if (isAtBottom || isStuck || (docHeight - currentScrollPos < 50)) { + console.log(`${TAG_AUTO_SCROLL}: Loop Status -> ScrollY: ${Math.round(scrollY)}, InnerH: ${innerH}, Pos: ${Math.round(currentScrollPos)}, DocH: ${docHeight}`); + console.log(`${TAG_AUTO_SCROLL}: Check -> AtBottom: ${isAtBottom}, Stuck: ${isStuck}`); + } + + if (isAtBottom || isStuck) { + console.log(`${TAG_AUTO_SCROLL}: End of chapter detected. Calling Bridge.`); + this.stop(); + const container = document.getElementById('content-container') || document.body; + container.style.transform = 'none'; + if (window.AutoScrollBridge && window.AutoScrollBridge.onChapterEnd) { + window.AutoScrollBridge.onChapterEnd(); + } else { + console.log(`${TAG_AUTO_SCROLL}: AutoScrollBridge not found!`); + } + return; + } + } + + const container = document.getElementById('content-container') || document.body; + if (container) { + container.style.transform = `translateY(-${subPixelRemainder}px)`; + } + + this.animationId = requestAnimationFrame(this.loop.bind(this)); + }, + }; +})(); \ No newline at end of file diff --git a/app/src/main/assets/fonts/lato.ttf b/app/src/main/assets/fonts/lato.ttf new file mode 100644 index 0000000..bb2e887 Binary files /dev/null and b/app/src/main/assets/fonts/lato.ttf differ diff --git a/app/src/main/assets/fonts/lexend.ttf b/app/src/main/assets/fonts/lexend.ttf new file mode 100644 index 0000000..b869458 Binary files /dev/null and b/app/src/main/assets/fonts/lexend.ttf differ diff --git a/app/src/main/assets/fonts/lora.ttf b/app/src/main/assets/fonts/lora.ttf new file mode 100644 index 0000000..dc751db Binary files /dev/null and b/app/src/main/assets/fonts/lora.ttf differ diff --git a/app/src/main/assets/fonts/merriweather.ttf b/app/src/main/assets/fonts/merriweather.ttf new file mode 100644 index 0000000..87fc630 Binary files /dev/null and b/app/src/main/assets/fonts/merriweather.ttf differ diff --git a/app/src/main/assets/fonts/roboto_mono.ttf b/app/src/main/assets/fonts/roboto_mono.ttf new file mode 100644 index 0000000..3806bfb Binary files /dev/null and b/app/src/main/assets/fonts/roboto_mono.ttf differ diff --git a/app/src/main/assets/mathjax/tex-mml-chtml.js b/app/src/main/assets/mathjax/tex-mml-chtml.js new file mode 100644 index 0000000..b7da2e5 --- /dev/null +++ b/app/src/main/assets/mathjax/tex-mml-chtml.js @@ -0,0 +1 @@ +(function(){"use strict";var __webpack_modules__={351:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AssistiveMmlHandler=e.AssistiveMmlMathDocumentMixin=e.AssistiveMmlMathItemMixin=e.LimitedMmlVisitor=void 0;var c=r(4474),u=r(9259),p=r(7233),h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getAttributes=function(e){return t.prototype.getAttributes.call(this,e).replace(/ ?id=".*?"/,"")},e}(u.SerializedMmlVisitor);function f(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.assistiveMml=function(t,e){if(void 0===e&&(e=!1),!(this.state()>=c.STATE.ASSISTIVEMML)){if(!this.isEscaped&&(t.options.enableAssistiveMml||e)){var r=t.adaptor,n=t.toMML(this.root).replace(/\n */g,"").replace(//g,""),o=r.firstChild(r.body(r.parse(n,"text/html"))),i=r.node("mjx-assistive-mml",{unselectable:"on",display:this.display?"block":"inline"},[o]);r.setAttribute(r.firstChild(this.typesetRoot),"aria-hidden","true"),r.setStyle(this.typesetRoot,"position","relative"),r.append(this.typesetRoot,i)}this.state(c.STATE.ASSISTIVEMML)}},e}(t)}function d(t){var e;return e=function(t){function e(){for(var e=[],r=0;r0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLAdaptor=void 0;var s=function(t){function e(e){var r=t.call(this,e.document)||this;return r.window=e,r.parser=new e.DOMParser,r}return o(e,t),e.prototype.parse=function(t,e){return void 0===e&&(e="text/html"),this.parser.parseFromString(t,e)},e.prototype.create=function(t,e){return e?this.document.createElementNS(e,t):this.document.createElement(t)},e.prototype.text=function(t){return this.document.createTextNode(t)},e.prototype.head=function(t){return t.head||t},e.prototype.body=function(t){return t.body||t},e.prototype.root=function(t){return t.documentElement||t},e.prototype.doctype=function(t){return t.doctype?""):""},e.prototype.tags=function(t,e,r){void 0===r&&(r=null);var n=r?t.getElementsByTagNameNS(r,e):t.getElementsByTagName(e);return Array.from(n)},e.prototype.getElements=function(t,e){var r,n,o=[];try{for(var s=i(t),a=s.next();!a.done;a=s.next()){var l=a.value;"string"==typeof l?o=o.concat(Array.from(this.document.querySelectorAll(l))):Array.isArray(l)||l instanceof this.window.NodeList||l instanceof this.window.HTMLCollection?o=o.concat(Array.from(l)):o.push(l)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return o},e.prototype.contains=function(t,e){return t.contains(e)},e.prototype.parent=function(t){return t.parentNode},e.prototype.append=function(t,e){return t.appendChild(e)},e.prototype.insert=function(t,e){return this.parent(e).insertBefore(t,e)},e.prototype.remove=function(t){return this.parent(t).removeChild(t)},e.prototype.replace=function(t,e){return this.parent(e).replaceChild(t,e)},e.prototype.clone=function(t){return t.cloneNode(!0)},e.prototype.split=function(t,e){return t.splitText(e)},e.prototype.next=function(t){return t.nextSibling},e.prototype.previous=function(t){return t.previousSibling},e.prototype.firstChild=function(t){return t.firstChild},e.prototype.lastChild=function(t){return t.lastChild},e.prototype.childNodes=function(t){return Array.from(t.childNodes)},e.prototype.childNode=function(t,e){return t.childNodes[e]},e.prototype.kind=function(t){var e=t.nodeType;return 1===e||3===e||8===e?t.nodeName.toLowerCase():""},e.prototype.value=function(t){return t.nodeValue||""},e.prototype.textContent=function(t){return t.textContent},e.prototype.innerHTML=function(t){return t.innerHTML},e.prototype.outerHTML=function(t){return t.outerHTML},e.prototype.serializeXML=function(t){return(new this.window.XMLSerializer).serializeToString(t)},e.prototype.setAttribute=function(t,e,r,n){return void 0===n&&(n=null),n?(e=n.replace(/.*\//,"")+":"+e.replace(/^.*:/,""),t.setAttributeNS(n,e,r)):t.setAttribute(e,r)},e.prototype.getAttribute=function(t,e){return t.getAttribute(e)},e.prototype.removeAttribute=function(t,e){return t.removeAttribute(e)},e.prototype.hasAttribute=function(t,e){return t.hasAttribute(e)},e.prototype.allAttributes=function(t){return Array.from(t.attributes).map((function(t){return{name:t.name,value:t.value}}))},e.prototype.addClass=function(t,e){t.classList?t.classList.add(e):t.className=(t.className+" "+e).trim()},e.prototype.removeClass=function(t,e){t.classList?t.classList.remove(e):t.className=t.className.split(/ /).filter((function(t){return t!==e})).join(" ")},e.prototype.hasClass=function(t,e){return t.classList?t.classList.contains(e):t.className.split(/ /).indexOf(e)>=0},e.prototype.setStyle=function(t,e,r){t.style[e]=r},e.prototype.getStyle=function(t,e){return t.style[e]},e.prototype.allStyles=function(t){return t.style.cssText},e.prototype.insertRules=function(t,e){var r,n;try{for(var o=i(e.reverse()),s=o.next();!s.done;s=o.next()){var a=s.value;try{t.sheet.insertRule(a,0)}catch(t){console.warn("MathJax: can't insert css rule '".concat(a,"': ").concat(t.message))}}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.fontSize=function(t){var e=this.window.getComputedStyle(t);return parseFloat(e.fontSize)},e.prototype.fontFamily=function(t){return this.window.getComputedStyle(t).fontFamily||""},e.prototype.nodeSize=function(t,e,r){if(void 0===e&&(e=1),void 0===r&&(r=!1),r&&t.getBBox){var n=t.getBBox();return[n.width/e,n.height/e]}return[t.offsetWidth/e,t.offsetHeight/e]},e.prototype.nodeBBox=function(t){var e=t.getBoundingClientRect();return{left:e.left,right:e.right,top:e.top,bottom:e.bottom}},e}(r(5009).AbstractDOMAdaptor);e.HTMLAdaptor=s},6191:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.browserAdaptor=void 0;var n=r(444);e.browserAdaptor=function(){return new n.HTMLAdaptor(window)}},9515:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MathJax=e.combineWithMathJax=e.combineDefaults=e.combineConfig=e.isObject=void 0;var o=r(3282);function i(t){return"object"==typeof t&&null!==t}function s(t,e){var r,o;try{for(var a=n(Object.keys(e)),l=a.next();!l.done;l=a.next()){var c=l.value;"__esModule"!==c&&(!i(t[c])||!i(e[c])||e[c]instanceof Promise?null!==e[c]&&void 0!==e[c]&&(t[c]=e[c]):s(t[c],e[c]))}}catch(t){r={error:t}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(r)throw r.error}}return t}e.isObject=i,e.combineConfig=s,e.combineDefaults=function t(e,r,o){var s,a;e[r]||(e[r]={}),e=e[r];try{for(var l=n(Object.keys(o)),c=l.next();!c.done;c=l.next()){var u=c.value;i(e[u])&&i(o[u])?t(e,u,o[u]):null==e[u]&&null!=o[u]&&(e[u]=o[u])}}catch(t){s={error:t}}finally{try{c&&!c.done&&(a=l.return)&&a.call(l)}finally{if(s)throw s.error}}return e},e.combineWithMathJax=function(t){return s(e.MathJax,t)},void 0===r.g.MathJax&&(r.g.MathJax={}),r.g.MathJax.version||(r.g.MathJax={version:o.VERSION,_:{},config:r.g.MathJax}),e.MathJax=r.g.MathJax},235:function(t,e,r){var n,o,i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CONFIG=e.MathJax=e.Loader=e.PathFilters=e.PackageError=e.Package=void 0;var s=r(9515),a=r(265),l=r(265);Object.defineProperty(e,"Package",{enumerable:!0,get:function(){return l.Package}}),Object.defineProperty(e,"PackageError",{enumerable:!0,get:function(){return l.PackageError}});var c,u=r(7525);if(e.PathFilters={source:function(t){return e.CONFIG.source.hasOwnProperty(t.name)&&(t.name=e.CONFIG.source[t.name]),!0},normalize:function(t){var e=t.name;return e.match(/^(?:[a-z]+:\/)?\/|[a-z]:\\|\[/i)||(t.name="[mathjax]/"+e.replace(/^\.\//,"")),t.addExtension&&!e.match(/\.[^\/]+$/)&&(t.name+=".js"),!0},prefix:function(t){for(var r;(r=t.name.match(/^\[([^\]]*)\]/))&&e.CONFIG.paths.hasOwnProperty(r[1]);)t.name=e.CONFIG.paths[r[1]]+t.name.substr(r[0].length);return!0}},function(t){var r=s.MathJax.version;t.versions=new Map,t.ready=function(){for(var t,e,r=[],n=0;n=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractDOMAdaptor=void 0;var n=function(){function t(t){void 0===t&&(t=null),this.document=t}return t.prototype.node=function(t,e,n,o){var i,s;void 0===e&&(e={}),void 0===n&&(n=[]);var a=this.create(t,o);this.setAttributes(a,e);try{for(var l=r(n),c=l.next();!c.done;c=l.next()){var u=c.value;this.append(a,u)}}catch(t){i={error:t}}finally{try{c&&!c.done&&(s=l.return)&&s.call(l)}finally{if(i)throw i.error}}return a},t.prototype.setAttributes=function(t,e){var n,o,i,s,a,l;if(e.style&&"string"!=typeof e.style)try{for(var c=r(Object.keys(e.style)),u=c.next();!u.done;u=c.next()){var p=u.value;this.setStyle(t,p.replace(/-([a-z])/g,(function(t,e){return e.toUpperCase()})),e.style[p])}}catch(t){n={error:t}}finally{try{u&&!u.done&&(o=c.return)&&o.call(c)}finally{if(n)throw n.error}}if(e.properties)try{for(var h=r(Object.keys(e.properties)),f=h.next();!f.done;f=h.next()){t[p=f.value]=e.properties[p]}}catch(t){i={error:t}}finally{try{f&&!f.done&&(s=h.return)&&s.call(h)}finally{if(i)throw i.error}}try{for(var d=r(Object.keys(e)),m=d.next();!m.done;m=d.next()){"style"===(p=m.value)&&"string"!=typeof e.style||"properties"===p||this.setAttribute(t,p,e[p])}}catch(t){a={error:t}}finally{try{m&&!m.done&&(l=d.return)&&l.call(d)}finally{if(a)throw a.error}}},t.prototype.replace=function(t,e){return this.insert(t,e),this.remove(e),e},t.prototype.childNode=function(t,e){return this.childNodes(t)[e]},t.prototype.allClasses=function(t){var e=this.getAttribute(t,"class");return e?e.replace(/ +/g," ").replace(/^ /,"").replace(/ $/,"").split(/ /):[]},t}();e.AbstractDOMAdaptor=n},3494:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractFindMath=void 0;var n=r(7233),o=function(){function t(t){var e=this.constructor;this.options=(0,n.userOptions)((0,n.defaultOptions)({},e.OPTIONS),t)}return t.OPTIONS={},t}();e.AbstractFindMath=o},3670:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractHandler=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(r(5722).AbstractMathDocument),s=function(){function t(t,e){void 0===e&&(e=5),this.documentClass=i,this.adaptor=t,this.priority=e}return Object.defineProperty(t.prototype,"name",{get:function(){return this.constructor.NAME},enumerable:!1,configurable:!0}),t.prototype.handlesDocument=function(t){return!1},t.prototype.create=function(t,e){return new this.documentClass(t,this.adaptor,e)},t.NAME="generic",t}();e.AbstractHandler=s},805:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.HandlerList=void 0;var s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.register=function(t){return this.add(t,t.priority)},e.prototype.unregister=function(t){this.remove(t)},e.prototype.handlesDocument=function(t){var e,r;try{for(var n=i(this),o=n.next();!o.done;o=n.next()){var s=o.value.item;if(s.handlesDocument(t))return s}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}throw new Error("Can't find handler for document")},e.prototype.document=function(t,e){return void 0===e&&(e=null),this.handlesDocument(t).create(t,e)},e}(r(8666).PrioritizedList);e.HandlerList=s},9206:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractInputJax=void 0;var n=r(7233),o=r(7525),i=function(){function t(t){void 0===t&&(t={}),this.adaptor=null,this.mmlFactory=null;var e=this.constructor;this.options=(0,n.userOptions)((0,n.defaultOptions)({},e.OPTIONS),t),this.preFilters=new o.FunctionList,this.postFilters=new o.FunctionList}return Object.defineProperty(t.prototype,"name",{get:function(){return this.constructor.NAME},enumerable:!1,configurable:!0}),t.prototype.setAdaptor=function(t){this.adaptor=t},t.prototype.setMmlFactory=function(t){this.mmlFactory=t},t.prototype.initialize=function(){},t.prototype.reset=function(){for(var t=[],e=0;e=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=e&&a.item.renderDoc(t))return}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.renderMath=function(t,e,r){var n,o;void 0===r&&(r=h.STATE.UNPROCESSED);try{for(var s=i(this.items),a=s.next();!a.done;a=s.next()){var l=a.value;if(l.priority>=r&&l.item.renderMath(t,e))return}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(n)throw n.error}}},e.prototype.renderConvert=function(t,e,r){var n,o;void 0===r&&(r=h.STATE.LAST);try{for(var s=i(this.items),a=s.next();!a.done;a=s.next()){var l=a.value;if(l.priority>r)return;if(l.item.convert&&l.item.renderMath(t,e))return}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(n)throw n.error}}},e.prototype.findID=function(t){var e,r;try{for(var n=i(this.items),o=n.next();!o.done;o=n.next()){var s=o.value;if(s.item.id===t)return s.item}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return null},e}(r(8666).PrioritizedList);e.RenderList=m,e.resetOptions={all:!1,processed:!1,inputJax:null,outputJax:null},e.resetAllOptions={all:!0,processed:!0,inputJax:[],outputJax:[]};var y=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.compile=function(t){return null},e}(c.AbstractInputJax),g=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.typeset=function(t,e){return void 0===e&&(e=null),null},e.prototype.escaped=function(t,e){return null},e}(u.AbstractOutputJax),b=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(p.AbstractMathList),v=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(h.AbstractMathItem),_=function(){function t(e,r,n){var o=this,i=this.constructor;this.document=e,this.options=(0,l.userOptions)((0,l.defaultOptions)({},i.OPTIONS),n),this.math=new(this.options.MathList||b),this.renderActions=m.create(this.options.renderActions),this.processed=new t.ProcessBits,this.outputJax=this.options.OutputJax||new g;var s=this.options.InputJax||[new y];Array.isArray(s)||(s=[s]),this.inputJax=s,this.adaptor=r,this.outputJax.setAdaptor(r),this.inputJax.map((function(t){return t.setAdaptor(r)})),this.mmlFactory=this.options.MmlFactory||new f.MmlFactory,this.inputJax.map((function(t){return t.setMmlFactory(o.mmlFactory)})),this.outputJax.initialize(),this.inputJax.map((function(t){return t.initialize()}))}return Object.defineProperty(t.prototype,"kind",{get:function(){return this.constructor.KIND},enumerable:!1,configurable:!0}),t.prototype.addRenderAction=function(t){for(var e=[],r=1;r=r&&this.state(r-1),t.renderActions.renderMath(this,t,r)},t.prototype.convert=function(t,r){void 0===r&&(r=e.STATE.LAST),t.renderActions.renderConvert(this,t,r)},t.prototype.compile=function(t){this.state()=e.STATE.INSERTED&&this.removeFromDocument(r),t=e.STATE.TYPESET&&(this.outputData={}),t=e.STATE.COMPILED&&(this.inputData={}),this._state=t),this._state},t.prototype.reset=function(t){void 0===t&&(t=!1),this.state(e.STATE.UNPROCESSED,t)},t}();e.AbstractMathItem=r,e.STATE={UNPROCESSED:0,FINDMATH:10,COMPILED:20,CONVERT:100,METRICS:110,RERENDER:125,TYPESET:150,INSERTED:200,LAST:1e4},e.newState=function(t,r){if(t in e.STATE)throw Error("State "+t+" already exists");e.STATE[t]=r}},9e3:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractMathList=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.isBefore=function(t,e){return t.start.i=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.Attributes=e.INHERIT=void 0,e.INHERIT="_inherit_";var n=function(){function t(t,e){this.global=e,this.defaults=Object.create(e),this.inherited=Object.create(this.defaults),this.attributes=Object.create(this.inherited),Object.assign(this.defaults,t)}return t.prototype.set=function(t,e){this.attributes[t]=e},t.prototype.setList=function(t){Object.assign(this.attributes,t)},t.prototype.get=function(t){var r=this.attributes[t];return r===e.INHERIT&&(r=this.global[t]),r},t.prototype.getExplicit=function(t){if(this.attributes.hasOwnProperty(t))return this.attributes[t]},t.prototype.getList=function(){for(var t,e,n=[],o=0;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MathMLVisitor=void 0;var s=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.document=null,e}return o(e,t),e.prototype.visitTree=function(t,e){this.document=e;var r=e.createElement("top");return this.visitNode(t,r),this.document=null,r.firstChild},e.prototype.visitTextNode=function(t,e){e.appendChild(this.document.createTextNode(t.getText()))},e.prototype.visitXMLNode=function(t,e){e.appendChild(t.getXML().cloneNode(!0))},e.prototype.visitInferredMrowNode=function(t,e){var r,n;try{for(var o=i(t.childNodes),s=o.next();!s.done;s=o.next()){var a=s.value;this.visitNode(a,e)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.visitDefault=function(t,e){var r,n,o=this.document.createElement(t.kind);this.addAttributes(t,o);try{for(var s=i(t.childNodes),a=s.next();!a.done;a=s.next()){var l=a.value;this.visitNode(l,o)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}e.appendChild(o)},e.prototype.addAttributes=function(t,e){var r,n,o=t.attributes,s=o.getExplicitNames();try{for(var a=i(s),l=a.next();!l.done;l=a.next()){var c=l.value;e.setAttribute(c,o.getExplicit(c).toString())}}catch(t){r={error:t}}finally{try{l&&!l.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}},e}(r(6325).MmlVisitor);e.MathMLVisitor=s},3909:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.MmlFactory=void 0;var i=r(7860),s=r(6336),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"MML",{get:function(){return this.node},enumerable:!1,configurable:!0}),e.defaultNodes=s.MML,e}(i.AbstractNodeFactory);e.MmlFactory=a},9007:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.XMLNode=e.TextNode=e.AbstractMmlEmptyNode=e.AbstractMmlBaseNode=e.AbstractMmlLayoutNode=e.AbstractMmlTokenNode=e.AbstractMmlNode=e.indentAttributes=e.TEXCLASSNAMES=e.TEXCLASS=void 0;var l=r(91),c=r(4596);e.TEXCLASS={ORD:0,OP:1,BIN:2,REL:3,OPEN:4,CLOSE:5,PUNCT:6,INNER:7,VCENTER:8,NONE:-1},e.TEXCLASSNAMES=["ORD","OP","BIN","REL","OPEN","CLOSE","PUNCT","INNER","VCENTER"];var u=["","thinmathspace","mediummathspace","thickmathspace"],p=[[0,-1,2,3,0,0,0,1],[-1,-1,0,3,0,0,0,1],[2,2,0,0,2,0,0,2],[3,3,0,0,3,0,0,3],[0,0,0,0,0,0,0,0],[0,-1,2,3,0,0,0,1],[1,1,0,1,1,1,1,1],[1,-1,2,3,1,0,1,1]];e.indentAttributes=["indentalign","indentalignfirst","indentshift","indentshiftfirst"];var h=function(t){function r(e,r,n){void 0===r&&(r={}),void 0===n&&(n=[]);var o=t.call(this,e)||this;return o.prevClass=null,o.prevLevel=null,o.texclass=null,o.arity<0&&(o.childNodes=[e.create("inferredMrow")],o.childNodes[0].parent=o),o.setChildren(n),o.attributes=new l.Attributes(e.getNodeClass(o.kind).defaults,e.getNodeClass("math").defaults),o.attributes.setList(r),o}return o(r,t),r.prototype.copy=function(t){var e,r,n,o;void 0===t&&(t=!1);var a=this.factory.create(this.kind);if(a.properties=i({},this.properties),this.attributes){var l=this.attributes.getAllAttributes();try{for(var c=s(Object.keys(l)),u=c.next();!u.done;u=c.next()){var p=u.value;("id"!==p||t)&&a.attributes.set(p,l[p])}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=c.return)&&r.call(c)}finally{if(e)throw e.error}}}if(this.childNodes&&this.childNodes.length){var h=this.childNodes;1===h.length&&h[0].isInferred&&(h=h[0].childNodes);try{for(var f=s(h),d=f.next();!d.done;d=f.next()){var m=d.value;m?a.appendChild(m.copy()):a.childNodes.push(null)}}catch(t){n={error:t}}finally{try{d&&!d.done&&(o=f.return)&&o.call(f)}finally{if(n)throw n.error}}}return a},Object.defineProperty(r.prototype,"texClass",{get:function(){return this.texclass},set:function(t){this.texclass=t},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isToken",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isEmbellished",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isSpacelike",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"linebreakContainer",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"hasNewLine",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"arity",{get:function(){return 1/0},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isInferred",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"Parent",{get:function(){for(var t=this.parent;t&&t.notParent;)t=t.Parent;return t},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"notParent",{get:function(){return!1},enumerable:!1,configurable:!0}),r.prototype.setChildren=function(e){return this.arity<0?this.childNodes[0].setChildren(e):t.prototype.setChildren.call(this,e)},r.prototype.appendChild=function(e){var r,n,o=this;if(this.arity<0)return this.childNodes[0].appendChild(e),e;if(e.isInferred){if(this.arity===1/0)return e.childNodes.forEach((function(e){return t.prototype.appendChild.call(o,e)})),e;var i=e;(e=this.factory.create("mrow")).setChildren(i.childNodes),e.attributes=i.attributes;try{for(var a=s(i.getPropertyNames()),l=a.next();!l.done;l=a.next()){var c=l.value;e.setProperty(c,i.getProperty(c))}}catch(t){r={error:t}}finally{try{l&&!l.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}}return t.prototype.appendChild.call(this,e)},r.prototype.replaceChild=function(e,r){return this.arity<0?(this.childNodes[0].replaceChild(e,r),e):t.prototype.replaceChild.call(this,e,r)},r.prototype.core=function(){return this},r.prototype.coreMO=function(){return this},r.prototype.coreIndex=function(){return 0},r.prototype.childPosition=function(){for(var t,e,r=this,n=r.parent;n&&n.notParent;)r=n,n=n.parent;if(n){var o=0;try{for(var i=s(n.childNodes),a=i.next();!a.done;a=i.next()){if(a.value===r)return o;o++}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=i.return)&&e.call(i)}finally{if(t)throw t.error}}}return null},r.prototype.setTeXclass=function(t){return this.getPrevClass(t),null!=this.texClass?this:t},r.prototype.updateTeXclass=function(t){t&&(this.prevClass=t.prevClass,this.prevLevel=t.prevLevel,t.prevClass=t.prevLevel=null,this.texClass=t.texClass)},r.prototype.getPrevClass=function(t){t&&(this.prevClass=t.texClass,this.prevLevel=t.attributes.get("scriptlevel"))},r.prototype.texSpacing=function(){var t=null!=this.prevClass?this.prevClass:e.TEXCLASS.NONE,r=this.texClass||e.TEXCLASS.ORD;if(t===e.TEXCLASS.NONE||r===e.TEXCLASS.NONE)return"";t===e.TEXCLASS.VCENTER&&(t=e.TEXCLASS.ORD),r===e.TEXCLASS.VCENTER&&(r=e.TEXCLASS.ORD);var n=p[t][r];return(this.prevLevel>0||this.attributes.get("scriptlevel")>0)&&n>=0?"":u[Math.abs(n)]},r.prototype.hasSpacingAttributes=function(){return this.isEmbellished&&this.coreMO().hasSpacingAttributes()},r.prototype.setInheritedAttributes=function(t,e,n,o){var i,l;void 0===t&&(t={}),void 0===e&&(e=!1),void 0===n&&(n=0),void 0===o&&(o=!1);var c=this.attributes.getAllDefaults();try{for(var u=s(Object.keys(t)),p=u.next();!p.done;p=u.next()){var h=p.value;if(c.hasOwnProperty(h)||r.alwaysInherit.hasOwnProperty(h)){var f=a(t[h],2),d=f[0],m=f[1];((r.noInherit[d]||{})[this.kind]||{})[h]||this.attributes.setInherited(h,m)}}}catch(t){i={error:t}}finally{try{p&&!p.done&&(l=u.return)&&l.call(u)}finally{if(i)throw i.error}}void 0===this.attributes.getExplicit("displaystyle")&&this.attributes.setInherited("displaystyle",e),void 0===this.attributes.getExplicit("scriptlevel")&&this.attributes.setInherited("scriptlevel",n),o&&this.setProperty("texprimestyle",o);var y=this.arity;if(y>=0&&y!==1/0&&(1===y&&0===this.childNodes.length||1!==y&&this.childNodes.length!==y))if(y=0&&e!==1/0&&(1===e&&0===this.childNodes.length||1!==e&&this.childNodes.length!==e)&&this.mError('Wrong number of children for "'+this.kind+'" node',t,!0),this.verifyChildren(t)}},r.prototype.verifyAttributes=function(t){var e,r;if(t.checkAttributes){var n=this.attributes,o=[];try{for(var i=s(n.getExplicitNames()),a=i.next();!a.done;a=i.next()){var l=a.value;"data-"===l.substr(0,5)||void 0!==n.getDefault(l)||l.match(/^(?:class|style|id|(?:xlink:)?href)$/)||o.push(l)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}o.length&&this.mError("Unknown attributes for "+this.kind+" node: "+o.join(", "),t)}},r.prototype.verifyChildren=function(t){var e,r;try{for(var n=s(this.childNodes),o=n.next();!o.done;o=n.next()){o.value.verifyTree(t)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}},r.prototype.mError=function(t,e,r){if(void 0===r&&(r=!1),this.parent&&this.parent.isKind("merror"))return null;var n=this.factory.create("merror");if(n.attributes.set("data-mjx-message",t),e.fullErrors||r){var o=this.factory.create("mtext"),i=this.factory.create("text");i.setText(e.fullErrors?t:this.kind),o.appendChild(i),n.appendChild(o),this.parent.replaceChild(n,this)}else this.parent.replaceChild(n,this),n.appendChild(this);return n},r.defaults={mathbackground:l.INHERIT,mathcolor:l.INHERIT,mathsize:l.INHERIT,dir:l.INHERIT},r.noInherit={mstyle:{mpadded:{width:!0,height:!0,depth:!0,lspace:!0,voffset:!0},mtable:{width:!0,height:!0,depth:!0,align:!0}},maligngroup:{mrow:{groupalign:!0},mtable:{groupalign:!0}}},r.alwaysInherit={scriptminsize:!0,scriptsizemultiplier:!0},r.verifyDefaults={checkArity:!0,checkAttributes:!1,fullErrors:!1,fixMmultiscripts:!0,fixMtables:!0},r}(c.AbstractNode);e.AbstractMmlNode=h;var f=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"isToken",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.getText=function(){var t,e,r="";try{for(var n=s(this.childNodes),o=n.next();!o.done;o=n.next()){var i=o.value;i instanceof g&&(r+=i.getText())}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return r},e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o,i;try{for(var a=s(this.childNodes),l=a.next();!l.done;l=a.next()){var c=l.value;c instanceof h&&c.setInheritedAttributes(t,e,r,n)}}catch(t){o={error:t}}finally{try{l&&!l.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}},e.prototype.walkTree=function(t,e){var r,n;t(this,e);try{for(var o=s(this.childNodes),i=o.next();!i.done;i=o.next()){var a=i.value;a instanceof h&&a.walkTree(t,e)}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return e},e.defaults=i(i({},h.defaults),{mathvariant:"normal",mathsize:l.INHERIT}),e}(h);e.AbstractMmlTokenNode=f;var d=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"isSpacelike",{get:function(){return this.childNodes[0].isSpacelike},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isEmbellished",{get:function(){return this.childNodes[0].isEmbellished},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return-1},enumerable:!1,configurable:!0}),e.prototype.core=function(){return this.childNodes[0]},e.prototype.coreMO=function(){return this.childNodes[0].coreMO()},e.prototype.setTeXclass=function(t){return t=this.childNodes[0].setTeXclass(t),this.updateTeXclass(this.childNodes[0]),t},e.defaults=h.defaults,e}(h);e.AbstractMmlLayoutNode=d;var m=function(t){function r(){return null!==t&&t.apply(this,arguments)||this}return o(r,t),Object.defineProperty(r.prototype,"isEmbellished",{get:function(){return this.childNodes[0].isEmbellished},enumerable:!1,configurable:!0}),r.prototype.core=function(){return this.childNodes[0]},r.prototype.coreMO=function(){return this.childNodes[0].coreMO()},r.prototype.setTeXclass=function(t){var r,n;this.getPrevClass(t),this.texClass=e.TEXCLASS.ORD;var o=this.childNodes[0];o?this.isEmbellished||o.isKind("mi")?(t=o.setTeXclass(t),this.updateTeXclass(this.core())):(o.setTeXclass(null),t=this):t=this;try{for(var i=s(this.childNodes.slice(1)),a=i.next();!a.done;a=i.next()){var l=a.value;l&&l.setTeXclass(null)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return t},r.defaults=h.defaults,r}(h);e.AbstractMmlBaseNode=m;var y=function(t){function r(){return null!==t&&t.apply(this,arguments)||this}return o(r,t),Object.defineProperty(r.prototype,"isToken",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isEmbellished",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isSpacelike",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"linebreakContainer",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"hasNewLine",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"arity",{get:function(){return 0},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isInferred",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"notParent",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"Parent",{get:function(){return this.parent},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"texClass",{get:function(){return e.TEXCLASS.NONE},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"prevClass",{get:function(){return e.TEXCLASS.NONE},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"prevLevel",{get:function(){return 0},enumerable:!1,configurable:!0}),r.prototype.hasSpacingAttributes=function(){return!1},Object.defineProperty(r.prototype,"attributes",{get:function(){return null},enumerable:!1,configurable:!0}),r.prototype.core=function(){return this},r.prototype.coreMO=function(){return this},r.prototype.coreIndex=function(){return 0},r.prototype.childPosition=function(){return 0},r.prototype.setTeXclass=function(t){return t},r.prototype.texSpacing=function(){return""},r.prototype.setInheritedAttributes=function(t,e,r,n){},r.prototype.inheritAttributesFrom=function(t){},r.prototype.verifyTree=function(t){},r.prototype.mError=function(t,e,r){return void 0===r&&(r=!1),null},r}(c.AbstractEmptyNode);e.AbstractMmlEmptyNode=y;var g=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.text="",e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"text"},enumerable:!1,configurable:!0}),e.prototype.getText=function(){return this.text},e.prototype.setText=function(t){return this.text=t,this},e.prototype.copy=function(){return this.factory.create(this.kind).setText(this.getText())},e.prototype.toString=function(){return this.text},e}(y);e.TextNode=g;var b=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.xml=null,e.adaptor=null,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"XML"},enumerable:!1,configurable:!0}),e.prototype.getXML=function(){return this.xml},e.prototype.setXML=function(t,e){return void 0===e&&(e=null),this.xml=t,this.adaptor=e,this},e.prototype.getSerializedXML=function(){return this.adaptor.serializeXML(this.xml)},e.prototype.copy=function(){return this.factory.create(this.kind).setXML(this.adaptor.clone(this.xml))},e.prototype.toString=function(){return"XML data"},e}(y);e.XMLNode=b},3948:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;rthis.childNodes.length&&(t=1),this.attributes.set("selection",t)},e.defaults=i(i({},s.AbstractMmlNode.defaults),{actiontype:"toggle",selection:1}),e}(s.AbstractMmlNode);e.MmlMaction=a},142:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMfenced=void 0;var a=r(9007),l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=a.TEXCLASS.INNER,e.separators=[],e.open=null,e.close=null,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mfenced"},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){this.getPrevClass(t),this.open&&(t=this.open.setTeXclass(t)),this.childNodes[0]&&(t=this.childNodes[0].setTeXclass(t));for(var e=1,r=this.childNodes.length;e=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMfrac=void 0;var a=r(9007),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mfrac"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 2},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){var e,r;this.getPrevClass(t);try{for(var n=s(this.childNodes),o=n.next();!o.done;o=n.next()){o.value.setTeXclass(null)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return this},e.prototype.setChildInheritedAttributes=function(t,e,r,n){(!e||r>0)&&r++,this.childNodes[0].setInheritedAttributes(t,!1,r,n),this.childNodes[1].setInheritedAttributes(t,!1,r,!0)},e.defaults=i(i({},a.AbstractMmlBaseNode.defaults),{linethickness:"medium",numalign:"center",denomalign:"center",bevelled:!1}),e}(a.AbstractMmlBaseNode);e.MmlMfrac=l},3985:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r1&&r.match(e.operatorName)&&"normal"===this.attributes.get("mathvariant")&&void 0===this.getProperty("autoOP")&&void 0===this.getProperty("texClass")&&(this.texClass=s.TEXCLASS.OP,this.setProperty("autoOP",!0)),this},e.defaults=i({},s.AbstractMmlTokenNode.defaults),e.operatorName=/^[a-z][a-z0-9]*$/i,e.singleCharacter=/^[\uD800-\uDBFF]?.[\u0300-\u036F\u1AB0-\u1ABE\u1DC0-\u1DFF\u20D0-\u20EF]*$/,e}(s.AbstractMmlTokenNode);e.MmlMi=a},6405:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMo=void 0;var l=r(9007),c=r(4082),u=r(505),p=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._texClass=null,e.lspace=5/18,e.rspace=5/18,e}return o(e,t),Object.defineProperty(e.prototype,"texClass",{get:function(){if(null===this._texClass){var t=this.getText(),e=s(this.handleExplicitForm(this.getForms()),3),r=e[0],n=e[1],o=e[2],i=this.constructor.OPTABLE,a=i[r][t]||i[n][t]||i[o][t];return a?a[2]:l.TEXCLASS.REL}return this._texClass},set:function(t){this._texClass=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"kind",{get:function(){return"mo"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isEmbellished",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasNewLine",{get:function(){return"newline"===this.attributes.get("linebreak")},enumerable:!1,configurable:!0}),e.prototype.coreParent=function(){for(var t=this,e=this,r=this.factory.getNodeClass("math");e&&e.isEmbellished&&e.coreMO()===this&&!(e instanceof r);)t=e,e=e.parent;return t},e.prototype.coreText=function(t){if(!t)return"";if(t.isEmbellished)return t.coreMO().getText();for(;((t.isKind("mrow")||t.isKind("TeXAtom")&&t.texClass!==l.TEXCLASS.VCENTER||t.isKind("mstyle")||t.isKind("mphantom"))&&1===t.childNodes.length||t.isKind("munderover"))&&t.childNodes[0];)t=t.childNodes[0];return t.isToken?t.getText():""},e.prototype.hasSpacingAttributes=function(){return this.attributes.isSet("lspace")||this.attributes.isSet("rspace")},Object.defineProperty(e.prototype,"isAccent",{get:function(){var t=!1,e=this.coreParent().parent;if(e){var r=e.isKind("mover")?e.childNodes[e.over].coreMO()?"accent":"":e.isKind("munder")?e.childNodes[e.under].coreMO()?"accentunder":"":e.isKind("munderover")?this===e.childNodes[e.over].coreMO()?"accent":this===e.childNodes[e.under].coreMO()?"accentunder":"":"";if(r)t=void 0!==e.attributes.getExplicit(r)?t:this.attributes.get("accent")}return t},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){var e=this.attributes.getList("form","fence"),r=e.form,n=e.fence;return void 0===this.getProperty("texClass")&&(this.attributes.isSet("lspace")||this.attributes.isSet("rspace"))?null:(n&&this.texClass===l.TEXCLASS.REL&&("prefix"===r&&(this.texClass=l.TEXCLASS.OPEN),"postfix"===r&&(this.texClass=l.TEXCLASS.CLOSE)),this.adjustTeXclass(t))},e.prototype.adjustTeXclass=function(t){var e=this.texClass,r=this.prevClass;if(e===l.TEXCLASS.NONE)return t;if(t?(!t.getProperty("autoOP")||e!==l.TEXCLASS.BIN&&e!==l.TEXCLASS.REL||(r=t.texClass=l.TEXCLASS.ORD),r=this.prevClass=t.texClass||l.TEXCLASS.ORD,this.prevLevel=this.attributes.getInherited("scriptlevel")):r=this.prevClass=l.TEXCLASS.NONE,e!==l.TEXCLASS.BIN||r!==l.TEXCLASS.NONE&&r!==l.TEXCLASS.BIN&&r!==l.TEXCLASS.OP&&r!==l.TEXCLASS.REL&&r!==l.TEXCLASS.OPEN&&r!==l.TEXCLASS.PUNCT)if(r!==l.TEXCLASS.BIN||e!==l.TEXCLASS.REL&&e!==l.TEXCLASS.CLOSE&&e!==l.TEXCLASS.PUNCT){if(e===l.TEXCLASS.BIN){for(var n=this,o=this.parent;o&&o.parent&&o.isEmbellished&&(1===o.childNodes.length||!o.isKind("mrow")&&o.core()===n);)n=o,o=o.parent;o.childNodes[o.childNodes.length-1]===n&&(this.texClass=l.TEXCLASS.ORD)}}else t.texClass=this.prevClass=l.TEXCLASS.ORD;else this.texClass=l.TEXCLASS.ORD;return this},e.prototype.setInheritedAttributes=function(e,r,n,o){void 0===e&&(e={}),void 0===r&&(r=!1),void 0===n&&(n=0),void 0===o&&(o=!1),t.prototype.setInheritedAttributes.call(this,e,r,n,o);var i=this.getText();this.checkOperatorTable(i),this.checkPseudoScripts(i),this.checkPrimes(i),this.checkMathAccent(i)},e.prototype.checkOperatorTable=function(t){var e,r,n=s(this.handleExplicitForm(this.getForms()),3),o=n[0],i=n[1],l=n[2];this.attributes.setInherited("form",o);var u=this.constructor.OPTABLE,p=u[o][t]||u[i][t]||u[l][t];if(p){void 0===this.getProperty("texClass")&&(this.texClass=p[2]);try{for(var h=a(Object.keys(p[3]||{})),f=h.next();!f.done;f=h.next()){var d=f.value;this.attributes.setInherited(d,p[3][d])}}catch(t){e={error:t}}finally{try{f&&!f.done&&(r=h.return)&&r.call(h)}finally{if(e)throw e.error}}this.lspace=(p[0]+1)/18,this.rspace=(p[1]+1)/18}else{var m=(0,c.getRange)(t);if(m){void 0===this.getProperty("texClass")&&(this.texClass=m[2]);var y=this.constructor.MMLSPACING[m[2]];this.lspace=(y[0]+1)/18,this.rspace=(y[1]+1)/18}}},e.prototype.getForms=function(){for(var t=this,e=this.parent,r=this.Parent;r&&r.isEmbellished;)t=e,e=r.parent,r=r.Parent;if(e&&e.isKind("mrow")&&1!==e.nonSpaceLength()){if(e.firstNonSpace()===t)return["prefix","infix","postfix"];if(e.lastNonSpace()===t)return["postfix","infix","prefix"]}return["infix","prefix","postfix"]},e.prototype.handleExplicitForm=function(t){if(this.attributes.isSet("form")){var e=this.attributes.get("form");t=[e].concat(t.filter((function(t){return t!==e})))}return t},e.prototype.checkPseudoScripts=function(t){var e=this.constructor.pseudoScripts;if(t.match(e)){var r=this.coreParent().Parent,n=!r||!(r.isKind("msubsup")&&!r.isKind("msub"));this.setProperty("pseudoscript",n),n&&(this.attributes.setInherited("lspace",0),this.attributes.setInherited("rspace",0))}},e.prototype.checkPrimes=function(t){var e=this.constructor.primes;if(t.match(e)){var r=this.constructor.remapPrimes,n=(0,u.unicodeString)((0,u.unicodeChars)(t).map((function(t){return r[t]})));this.setProperty("primes",n)}},e.prototype.checkMathAccent=function(t){var e=this.Parent;if(void 0===this.getProperty("mathaccent")&&e&&e.isKind("munderover")){var r=e.childNodes[0];if(!r.isEmbellished||r.coreMO()!==this){var n=this.constructor.mathaccents;t.match(n)&&this.setProperty("mathaccent",!0)}}},e.defaults=i(i({},l.AbstractMmlTokenNode.defaults),{form:"infix",fence:!1,separator:!1,lspace:"thickmathspace",rspace:"thickmathspace",stretchy:!1,symmetric:!1,maxsize:"infinity",minsize:"0em",largeop:!1,movablelimits:!1,accent:!1,linebreak:"auto",lineleading:"1ex",linebreakstyle:"before",indentalign:"auto",indentshift:"0",indenttarget:"",indentalignfirst:"indentalign",indentshiftfirst:"indentshift",indentalignlast:"indentalign",indentshiftlast:"indentshift"}),e.MMLSPACING=c.MMLSPACING,e.OPTABLE=c.OPTABLE,e.pseudoScripts=new RegExp(["^[\"'*`","\xaa","\xb0","\xb2-\xb4","\xb9","\xba","\u2018-\u201f","\u2032-\u2037\u2057","\u2070\u2071","\u2074-\u207f","\u2080-\u208e","]+$"].join("")),e.primes=new RegExp(["^[\"'`","\u2018-\u201f","]+$"].join("")),e.remapPrimes={34:8243,39:8242,96:8245,8216:8245,8217:8242,8218:8242,8219:8245,8220:8246,8221:8243,8222:8243,8223:8246},e.mathaccents=new RegExp(["^[","\xb4\u0301\u02ca","`\u0300\u02cb","\xa8\u0308","~\u0303\u02dc","\xaf\u0304\u02c9","\u02d8\u0306","\u02c7\u030c","^\u0302\u02c6","\u2192\u20d7","\u02d9\u0307","\u02da\u030a","\u20db","\u20dc","]$"].join("")),e}(l.AbstractMmlTokenNode);e.MmlMo=p},7238:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlInferredMrow=e.MmlMrow=void 0;var a=r(9007),l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._core=null,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mrow"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isSpacelike",{get:function(){var t,e;try{for(var r=s(this.childNodes),n=r.next();!n.done;n=r.next()){if(!n.value.isSpacelike)return!1}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isEmbellished",{get:function(){var t,e,r=!1,n=0;try{for(var o=s(this.childNodes),i=o.next();!i.done;i=o.next()){var a=i.value;if(a)if(a.isEmbellished){if(r)return!1;r=!0,this._core=n}else if(!a.isSpacelike)return!1;n++}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return r},enumerable:!1,configurable:!0}),e.prototype.core=function(){return this.isEmbellished&&null!=this._core?this.childNodes[this._core]:this},e.prototype.coreMO=function(){return this.isEmbellished&&null!=this._core?this.childNodes[this._core].coreMO():this},e.prototype.nonSpaceLength=function(){var t,e,r=0;try{for(var n=s(this.childNodes),o=n.next();!o.done;o=n.next()){var i=o.value;i&&!i.isSpacelike&&r++}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return r},e.prototype.firstNonSpace=function(){var t,e;try{for(var r=s(this.childNodes),n=r.next();!n.done;n=r.next()){var o=n.value;if(o&&!o.isSpacelike)return o}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}return null},e.prototype.lastNonSpace=function(){for(var t=this.childNodes.length;--t>=0;){var e=this.childNodes[t];if(e&&!e.isSpacelike)return e}return null},e.prototype.setTeXclass=function(t){var e,r,n,o;if(null!=this.getProperty("open")||null!=this.getProperty("close")){this.getPrevClass(t),t=null;try{for(var i=s(this.childNodes),l=i.next();!l.done;l=i.next()){t=l.value.setTeXclass(t)}}catch(t){e={error:t}}finally{try{l&&!l.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}null==this.texClass&&(this.texClass=a.TEXCLASS.INNER)}else{try{for(var c=s(this.childNodes),u=c.next();!u.done;u=c.next()){t=u.value.setTeXclass(t)}}catch(t){n={error:t}}finally{try{u&&!u.done&&(o=c.return)&&o.call(c)}finally{if(n)throw n.error}}this.childNodes[0]&&this.updateTeXclass(this.childNodes[0])}return t},e.defaults=i({},a.AbstractMmlNode.defaults),e}(a.AbstractMmlNode);e.MmlMrow=l;var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"inferredMrow"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isInferred",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"notParent",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return"["+this.childNodes.join(",")+"]"},e.defaults=l.defaults,e}(l);e.MmlInferredMrow=c},7265:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtable=void 0;var a=r(9007),l=r(505),c=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.properties={useHeight:!0},e.texclass=a.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mtable"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setInheritedAttributes=function(e,r,n,o){var i,l;try{for(var c=s(a.indentAttributes),u=c.next();!u.done;u=c.next()){var p=u.value;e[p]&&this.attributes.setInherited(p,e[p][1]),void 0!==this.attributes.getExplicit(p)&&delete this.attributes.getAllAttributes()[p]}}catch(t){i={error:t}}finally{try{u&&!u.done&&(l=c.return)&&l.call(c)}finally{if(i)throw i.error}}t.prototype.setInheritedAttributes.call(this,e,r,n,o)},e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o,i,a,c;try{for(var u=s(this.childNodes),p=u.next();!p.done;p=u.next()){(y=p.value).isKind("mtr")||this.replaceChild(this.factory.create("mtr"),y).appendChild(y)}}catch(t){o={error:t}}finally{try{p&&!p.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}r=this.getProperty("scriptlevel")||r,e=!(!this.attributes.getExplicit("displaystyle")&&!this.attributes.getDefault("displaystyle")),t=this.addInheritedAttributes(t,{columnalign:this.attributes.get("columnalign"),rowalign:"center"});var h=this.attributes.getExplicit("data-cramped"),f=(0,l.split)(this.attributes.get("rowalign"));try{for(var d=s(this.childNodes),m=d.next();!m.done;m=d.next()){var y=m.value;t.rowalign[1]=f.shift()||t.rowalign[1],y.setInheritedAttributes(t,e,r,!!h)}}catch(t){a={error:t}}finally{try{m&&!m.done&&(c=d.return)&&c.call(d)}finally{if(a)throw a.error}}},e.prototype.verifyChildren=function(e){for(var r=null,n=this.factory,o=0;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMlabeledtr=e.MmlMtr=void 0;var a=r(9007),l=r(91),c=r(505),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mtr"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o,i,a,l;try{for(var u=s(this.childNodes),p=u.next();!p.done;p=u.next()){(m=p.value).isKind("mtd")||this.replaceChild(this.factory.create("mtd"),m).appendChild(m)}}catch(t){o={error:t}}finally{try{p&&!p.done&&(i=u.return)&&i.call(u)}finally{if(o)throw o.error}}var h=(0,c.split)(this.attributes.get("columnalign"));1===this.arity&&h.unshift(this.parent.attributes.get("side")),t=this.addInheritedAttributes(t,{rowalign:this.attributes.get("rowalign"),columnalign:"center"});try{for(var f=s(this.childNodes),d=f.next();!d.done;d=f.next()){var m=d.value;t.columnalign[1]=h.shift()||t.columnalign[1],m.setInheritedAttributes(t,e,r,n)}}catch(t){a={error:t}}finally{try{d&&!d.done&&(l=f.return)&&l.call(f)}finally{if(a)throw a.error}}},e.prototype.verifyChildren=function(e){var r,n;if(!this.parent||this.parent.isKind("mtable")){try{for(var o=s(this.childNodes),i=o.next();!i.done;i=o.next()){var a=i.value;if(!a.isKind("mtd"))this.replaceChild(this.factory.create("mtd"),a).appendChild(a),e.fixMtables||a.mError("Children of "+this.kind+" must be mtd",e)}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}t.prototype.verifyChildren.call(this,e)}else this.mError(this.kind+" can only be a child of an mtable",e,!0)},e.prototype.setTeXclass=function(t){var e,r;this.getPrevClass(t);try{for(var n=s(this.childNodes),o=n.next();!o.done;o=n.next()){o.value.setTeXclass(null)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return this},e.defaults=i(i({},a.AbstractMmlNode.defaults),{rowalign:l.INHERIT,columnalign:l.INHERIT,groupalign:l.INHERIT}),e}(a.AbstractMmlNode);e.MmlMtr=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mlabeledtr"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 1},enumerable:!1,configurable:!0}),e}(u);e.MmlMlabeledtr=p},5184:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.OPTABLE=e.MMLSPACING=e.getRange=e.RANGES=e.MO=e.OPDEF=void 0;var o=r(9007);function i(t,e,r,n){return void 0===r&&(r=o.TEXCLASS.BIN),void 0===n&&(n=null),[t,e,r,n]}e.OPDEF=i,e.MO={ORD:i(0,0,o.TEXCLASS.ORD),ORD11:i(1,1,o.TEXCLASS.ORD),ORD21:i(2,1,o.TEXCLASS.ORD),ORD02:i(0,2,o.TEXCLASS.ORD),ORD55:i(5,5,o.TEXCLASS.ORD),NONE:i(0,0,o.TEXCLASS.NONE),OP:i(1,2,o.TEXCLASS.OP,{largeop:!0,movablelimits:!0,symmetric:!0}),OPFIXED:i(1,2,o.TEXCLASS.OP,{largeop:!0,movablelimits:!0}),INTEGRAL:i(0,1,o.TEXCLASS.OP,{largeop:!0,symmetric:!0}),INTEGRAL2:i(1,2,o.TEXCLASS.OP,{largeop:!0,symmetric:!0}),BIN3:i(3,3,o.TEXCLASS.BIN),BIN4:i(4,4,o.TEXCLASS.BIN),BIN01:i(0,1,o.TEXCLASS.BIN),BIN5:i(5,5,o.TEXCLASS.BIN),TALLBIN:i(4,4,o.TEXCLASS.BIN,{stretchy:!0}),BINOP:i(4,4,o.TEXCLASS.BIN,{largeop:!0,movablelimits:!0}),REL:i(5,5,o.TEXCLASS.REL),REL1:i(1,1,o.TEXCLASS.REL,{stretchy:!0}),REL4:i(4,4,o.TEXCLASS.REL),RELSTRETCH:i(5,5,o.TEXCLASS.REL,{stretchy:!0}),RELACCENT:i(5,5,o.TEXCLASS.REL,{accent:!0}),WIDEREL:i(5,5,o.TEXCLASS.REL,{accent:!0,stretchy:!0}),OPEN:i(0,0,o.TEXCLASS.OPEN,{fence:!0,stretchy:!0,symmetric:!0}),CLOSE:i(0,0,o.TEXCLASS.CLOSE,{fence:!0,stretchy:!0,symmetric:!0}),INNER:i(0,0,o.TEXCLASS.INNER),PUNCT:i(0,3,o.TEXCLASS.PUNCT),ACCENT:i(0,0,o.TEXCLASS.ORD,{accent:!0}),WIDEACCENT:i(0,0,o.TEXCLASS.ORD,{accent:!0,stretchy:!0})},e.RANGES=[[32,127,o.TEXCLASS.REL,"mo"],[160,191,o.TEXCLASS.ORD,"mo"],[192,591,o.TEXCLASS.ORD,"mi"],[688,879,o.TEXCLASS.ORD,"mo"],[880,6688,o.TEXCLASS.ORD,"mi"],[6832,6911,o.TEXCLASS.ORD,"mo"],[6912,7615,o.TEXCLASS.ORD,"mi"],[7616,7679,o.TEXCLASS.ORD,"mo"],[7680,8191,o.TEXCLASS.ORD,"mi"],[8192,8303,o.TEXCLASS.ORD,"mo"],[8304,8351,o.TEXCLASS.ORD,"mo"],[8448,8527,o.TEXCLASS.ORD,"mi"],[8528,8591,o.TEXCLASS.ORD,"mn"],[8592,8703,o.TEXCLASS.REL,"mo"],[8704,8959,o.TEXCLASS.BIN,"mo"],[8960,9215,o.TEXCLASS.ORD,"mo"],[9312,9471,o.TEXCLASS.ORD,"mn"],[9472,10223,o.TEXCLASS.ORD,"mo"],[10224,10239,o.TEXCLASS.REL,"mo"],[10240,10495,o.TEXCLASS.ORD,"mtext"],[10496,10623,o.TEXCLASS.REL,"mo"],[10624,10751,o.TEXCLASS.ORD,"mo"],[10752,11007,o.TEXCLASS.BIN,"mo"],[11008,11055,o.TEXCLASS.ORD,"mo"],[11056,11087,o.TEXCLASS.REL,"mo"],[11088,11263,o.TEXCLASS.ORD,"mo"],[11264,11744,o.TEXCLASS.ORD,"mi"],[11776,11903,o.TEXCLASS.ORD,"mo"],[11904,12255,o.TEXCLASS.ORD,"mi","normal"],[12272,12351,o.TEXCLASS.ORD,"mo"],[12352,42143,o.TEXCLASS.ORD,"mi","normal"],[42192,43055,o.TEXCLASS.ORD,"mi"],[43056,43071,o.TEXCLASS.ORD,"mn"],[43072,55295,o.TEXCLASS.ORD,"mi"],[63744,64255,o.TEXCLASS.ORD,"mi","normal"],[64256,65023,o.TEXCLASS.ORD,"mi"],[65024,65135,o.TEXCLASS.ORD,"mo"],[65136,65791,o.TEXCLASS.ORD,"mi"],[65792,65935,o.TEXCLASS.ORD,"mn"],[65936,74751,o.TEXCLASS.ORD,"mi","normal"],[74752,74879,o.TEXCLASS.ORD,"mn"],[74880,113823,o.TEXCLASS.ORD,"mi","normal"],[113824,119391,o.TEXCLASS.ORD,"mo"],[119648,119679,o.TEXCLASS.ORD,"mn"],[119808,120781,o.TEXCLASS.ORD,"mi"],[120782,120831,o.TEXCLASS.ORD,"mn"],[122624,129023,o.TEXCLASS.ORD,"mo"],[129024,129279,o.TEXCLASS.REL,"mo"],[129280,129535,o.TEXCLASS.ORD,"mo"],[131072,195103,o.TEXCLASS.ORD,"mi","normnal"]],e.getRange=function(t){var r,o,i=t.codePointAt(0);try{for(var s=n(e.RANGES),a=s.next();!a.done;a=s.next()){var l=a.value;if(i<=l[1]){if(i>=l[0])return l;break}}}catch(t){r={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(r)throw r.error}}return null},e.MMLSPACING=[[0,0],[1,2],[3,3],[4,4],[0,0],[0,0],[0,3]],e.OPTABLE={prefix:{"(":e.MO.OPEN,"+":e.MO.BIN01,"-":e.MO.BIN01,"[":e.MO.OPEN,"{":e.MO.OPEN,"|":e.MO.OPEN,"||":[0,0,o.TEXCLASS.BIN,{fence:!0,stretchy:!0,symmetric:!0}],"|||":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"\xac":e.MO.ORD21,"\xb1":e.MO.BIN01,"\u2016":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2018":[0,0,o.TEXCLASS.OPEN,{fence:!0}],"\u201c":[0,0,o.TEXCLASS.OPEN,{fence:!0}],"\u2145":e.MO.ORD21,"\u2146":i(2,0,o.TEXCLASS.ORD),"\u2200":e.MO.ORD21,"\u2202":e.MO.ORD21,"\u2203":e.MO.ORD21,"\u2204":e.MO.ORD21,"\u2207":e.MO.ORD21,"\u220f":e.MO.OP,"\u2210":e.MO.OP,"\u2211":e.MO.OP,"\u2212":e.MO.BIN01,"\u2213":e.MO.BIN01,"\u221a":[1,1,o.TEXCLASS.ORD,{stretchy:!0}],"\u221b":e.MO.ORD11,"\u221c":e.MO.ORD11,"\u2220":e.MO.ORD,"\u2221":e.MO.ORD,"\u2222":e.MO.ORD,"\u222b":e.MO.INTEGRAL,"\u222c":e.MO.INTEGRAL,"\u222d":e.MO.INTEGRAL,"\u222e":e.MO.INTEGRAL,"\u222f":e.MO.INTEGRAL,"\u2230":e.MO.INTEGRAL,"\u2231":e.MO.INTEGRAL,"\u2232":e.MO.INTEGRAL,"\u2233":e.MO.INTEGRAL,"\u22c0":e.MO.OP,"\u22c1":e.MO.OP,"\u22c2":e.MO.OP,"\u22c3":e.MO.OP,"\u2308":e.MO.OPEN,"\u230a":e.MO.OPEN,"\u2329":e.MO.OPEN,"\u2772":e.MO.OPEN,"\u27e6":e.MO.OPEN,"\u27e8":e.MO.OPEN,"\u27ea":e.MO.OPEN,"\u27ec":e.MO.OPEN,"\u27ee":e.MO.OPEN,"\u2980":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2983":e.MO.OPEN,"\u2985":e.MO.OPEN,"\u2987":e.MO.OPEN,"\u2989":e.MO.OPEN,"\u298b":e.MO.OPEN,"\u298d":e.MO.OPEN,"\u298f":e.MO.OPEN,"\u2991":e.MO.OPEN,"\u2993":e.MO.OPEN,"\u2995":e.MO.OPEN,"\u2997":e.MO.OPEN,"\u29fc":e.MO.OPEN,"\u2a00":e.MO.OP,"\u2a01":e.MO.OP,"\u2a02":e.MO.OP,"\u2a03":e.MO.OP,"\u2a04":e.MO.OP,"\u2a05":e.MO.OP,"\u2a06":e.MO.OP,"\u2a07":e.MO.OP,"\u2a08":e.MO.OP,"\u2a09":e.MO.OP,"\u2a0a":e.MO.OP,"\u2a0b":e.MO.INTEGRAL2,"\u2a0c":e.MO.INTEGRAL,"\u2a0d":e.MO.INTEGRAL2,"\u2a0e":e.MO.INTEGRAL2,"\u2a0f":e.MO.INTEGRAL2,"\u2a10":e.MO.OP,"\u2a11":e.MO.OP,"\u2a12":e.MO.OP,"\u2a13":e.MO.OP,"\u2a14":e.MO.OP,"\u2a15":e.MO.INTEGRAL2,"\u2a16":e.MO.INTEGRAL2,"\u2a17":e.MO.INTEGRAL2,"\u2a18":e.MO.INTEGRAL2,"\u2a19":e.MO.INTEGRAL2,"\u2a1a":e.MO.INTEGRAL2,"\u2a1b":e.MO.INTEGRAL2,"\u2a1c":e.MO.INTEGRAL2,"\u2afc":e.MO.OP,"\u2aff":e.MO.OP},postfix:{"!!":i(1,0),"!":[1,0,o.TEXCLASS.CLOSE,null],'"':e.MO.ACCENT,"&":e.MO.ORD,")":e.MO.CLOSE,"++":i(0,0),"--":i(0,0),"..":i(0,0),"...":e.MO.ORD,"'":e.MO.ACCENT,"]":e.MO.CLOSE,"^":e.MO.WIDEACCENT,_:e.MO.WIDEACCENT,"`":e.MO.ACCENT,"|":e.MO.CLOSE,"}":e.MO.CLOSE,"~":e.MO.WIDEACCENT,"||":[0,0,o.TEXCLASS.BIN,{fence:!0,stretchy:!0,symmetric:!0}],"|||":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"\xa8":e.MO.ACCENT,"\xaa":e.MO.ACCENT,"\xaf":e.MO.WIDEACCENT,"\xb0":e.MO.ORD,"\xb2":e.MO.ACCENT,"\xb3":e.MO.ACCENT,"\xb4":e.MO.ACCENT,"\xb8":e.MO.ACCENT,"\xb9":e.MO.ACCENT,"\xba":e.MO.ACCENT,"\u02c6":e.MO.WIDEACCENT,"\u02c7":e.MO.WIDEACCENT,"\u02c9":e.MO.WIDEACCENT,"\u02ca":e.MO.ACCENT,"\u02cb":e.MO.ACCENT,"\u02cd":e.MO.WIDEACCENT,"\u02d8":e.MO.ACCENT,"\u02d9":e.MO.ACCENT,"\u02da":e.MO.ACCENT,"\u02dc":e.MO.WIDEACCENT,"\u02dd":e.MO.ACCENT,"\u02f7":e.MO.WIDEACCENT,"\u0302":e.MO.WIDEACCENT,"\u0311":e.MO.ACCENT,"\u03f6":e.MO.REL,"\u2016":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2019":[0,0,o.TEXCLASS.CLOSE,{fence:!0}],"\u201a":e.MO.ACCENT,"\u201b":e.MO.ACCENT,"\u201d":[0,0,o.TEXCLASS.CLOSE,{fence:!0}],"\u201e":e.MO.ACCENT,"\u201f":e.MO.ACCENT,"\u2032":e.MO.ORD,"\u2033":e.MO.ACCENT,"\u2034":e.MO.ACCENT,"\u2035":e.MO.ACCENT,"\u2036":e.MO.ACCENT,"\u2037":e.MO.ACCENT,"\u203e":e.MO.WIDEACCENT,"\u2057":e.MO.ACCENT,"\u20db":e.MO.ACCENT,"\u20dc":e.MO.ACCENT,"\u2309":e.MO.CLOSE,"\u230b":e.MO.CLOSE,"\u232a":e.MO.CLOSE,"\u23b4":e.MO.WIDEACCENT,"\u23b5":e.MO.WIDEACCENT,"\u23dc":e.MO.WIDEACCENT,"\u23dd":e.MO.WIDEACCENT,"\u23de":e.MO.WIDEACCENT,"\u23df":e.MO.WIDEACCENT,"\u23e0":e.MO.WIDEACCENT,"\u23e1":e.MO.WIDEACCENT,"\u25a0":e.MO.BIN3,"\u25a1":e.MO.BIN3,"\u25aa":e.MO.BIN3,"\u25ab":e.MO.BIN3,"\u25ad":e.MO.BIN3,"\u25ae":e.MO.BIN3,"\u25af":e.MO.BIN3,"\u25b0":e.MO.BIN3,"\u25b1":e.MO.BIN3,"\u25b2":e.MO.BIN4,"\u25b4":e.MO.BIN4,"\u25b6":e.MO.BIN4,"\u25b7":e.MO.BIN4,"\u25b8":e.MO.BIN4,"\u25bc":e.MO.BIN4,"\u25be":e.MO.BIN4,"\u25c0":e.MO.BIN4,"\u25c1":e.MO.BIN4,"\u25c2":e.MO.BIN4,"\u25c4":e.MO.BIN4,"\u25c5":e.MO.BIN4,"\u25c6":e.MO.BIN4,"\u25c7":e.MO.BIN4,"\u25c8":e.MO.BIN4,"\u25c9":e.MO.BIN4,"\u25cc":e.MO.BIN4,"\u25cd":e.MO.BIN4,"\u25ce":e.MO.BIN4,"\u25cf":e.MO.BIN4,"\u25d6":e.MO.BIN4,"\u25d7":e.MO.BIN4,"\u25e6":e.MO.BIN4,"\u266d":e.MO.ORD02,"\u266e":e.MO.ORD02,"\u266f":e.MO.ORD02,"\u2773":e.MO.CLOSE,"\u27e7":e.MO.CLOSE,"\u27e9":e.MO.CLOSE,"\u27eb":e.MO.CLOSE,"\u27ed":e.MO.CLOSE,"\u27ef":e.MO.CLOSE,"\u2980":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2984":e.MO.CLOSE,"\u2986":e.MO.CLOSE,"\u2988":e.MO.CLOSE,"\u298a":e.MO.CLOSE,"\u298c":e.MO.CLOSE,"\u298e":e.MO.CLOSE,"\u2990":e.MO.CLOSE,"\u2992":e.MO.CLOSE,"\u2994":e.MO.CLOSE,"\u2996":e.MO.CLOSE,"\u2998":e.MO.CLOSE,"\u29fd":e.MO.CLOSE},infix:{"!=":e.MO.BIN4,"#":e.MO.ORD,$:e.MO.ORD,"%":[3,3,o.TEXCLASS.ORD,null],"&&":e.MO.BIN4,"":e.MO.ORD,"*":e.MO.BIN3,"**":i(1,1),"*=":e.MO.BIN4,"+":e.MO.BIN4,"+=":e.MO.BIN4,",":[0,3,o.TEXCLASS.PUNCT,{linebreakstyle:"after",separator:!0}],"-":e.MO.BIN4,"-=":e.MO.BIN4,"->":e.MO.BIN5,".":[0,3,o.TEXCLASS.PUNCT,{separator:!0}],"/":e.MO.ORD11,"//":i(1,1),"/=":e.MO.BIN4,":":[1,2,o.TEXCLASS.REL,null],":=":e.MO.BIN4,";":[0,3,o.TEXCLASS.PUNCT,{linebreakstyle:"after",separator:!0}],"<":e.MO.REL,"<=":e.MO.BIN5,"<>":i(1,1),"=":e.MO.REL,"==":e.MO.BIN4,">":e.MO.REL,">=":e.MO.BIN5,"?":[1,1,o.TEXCLASS.CLOSE,null],"@":e.MO.ORD11,"\\":e.MO.ORD,"^":e.MO.ORD11,_:e.MO.ORD11,"|":[2,2,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"||":[2,2,o.TEXCLASS.BIN,{fence:!0,stretchy:!0,symmetric:!0}],"|||":[2,2,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"\xb1":e.MO.BIN4,"\xb7":e.MO.BIN4,"\xd7":e.MO.BIN4,"\xf7":e.MO.BIN4,"\u02b9":e.MO.ORD,"\u0300":e.MO.ACCENT,"\u0301":e.MO.ACCENT,"\u0303":e.MO.WIDEACCENT,"\u0304":e.MO.ACCENT,"\u0306":e.MO.ACCENT,"\u0307":e.MO.ACCENT,"\u0308":e.MO.ACCENT,"\u030c":e.MO.ACCENT,"\u0332":e.MO.WIDEACCENT,"\u0338":e.MO.REL4,"\u2015":[0,0,o.TEXCLASS.ORD,{stretchy:!0}],"\u2017":[0,0,o.TEXCLASS.ORD,{stretchy:!0}],"\u2020":e.MO.BIN3,"\u2021":e.MO.BIN3,"\u2022":e.MO.BIN4,"\u2026":e.MO.INNER,"\u2043":e.MO.BIN4,"\u2044":e.MO.TALLBIN,"\u2061":e.MO.NONE,"\u2062":e.MO.NONE,"\u2063":[0,0,o.TEXCLASS.NONE,{linebreakstyle:"after",separator:!0}],"\u2064":e.MO.NONE,"\u20d7":e.MO.ACCENT,"\u2111":e.MO.ORD,"\u2113":e.MO.ORD,"\u2118":e.MO.ORD,"\u211c":e.MO.ORD,"\u2190":e.MO.WIDEREL,"\u2191":e.MO.RELSTRETCH,"\u2192":e.MO.WIDEREL,"\u2193":e.MO.RELSTRETCH,"\u2194":e.MO.WIDEREL,"\u2195":e.MO.RELSTRETCH,"\u2196":e.MO.RELSTRETCH,"\u2197":e.MO.RELSTRETCH,"\u2198":e.MO.RELSTRETCH,"\u2199":e.MO.RELSTRETCH,"\u219a":e.MO.RELACCENT,"\u219b":e.MO.RELACCENT,"\u219c":e.MO.WIDEREL,"\u219d":e.MO.WIDEREL,"\u219e":e.MO.WIDEREL,"\u219f":e.MO.WIDEREL,"\u21a0":e.MO.WIDEREL,"\u21a1":e.MO.RELSTRETCH,"\u21a2":e.MO.WIDEREL,"\u21a3":e.MO.WIDEREL,"\u21a4":e.MO.WIDEREL,"\u21a5":e.MO.RELSTRETCH,"\u21a6":e.MO.WIDEREL,"\u21a7":e.MO.RELSTRETCH,"\u21a8":e.MO.RELSTRETCH,"\u21a9":e.MO.WIDEREL,"\u21aa":e.MO.WIDEREL,"\u21ab":e.MO.WIDEREL,"\u21ac":e.MO.WIDEREL,"\u21ad":e.MO.WIDEREL,"\u21ae":e.MO.RELACCENT,"\u21af":e.MO.RELSTRETCH,"\u21b0":e.MO.RELSTRETCH,"\u21b1":e.MO.RELSTRETCH,"\u21b2":e.MO.RELSTRETCH,"\u21b3":e.MO.RELSTRETCH,"\u21b4":e.MO.RELSTRETCH,"\u21b5":e.MO.RELSTRETCH,"\u21b6":e.MO.RELACCENT,"\u21b7":e.MO.RELACCENT,"\u21b8":e.MO.REL,"\u21b9":e.MO.WIDEREL,"\u21ba":e.MO.REL,"\u21bb":e.MO.REL,"\u21bc":e.MO.WIDEREL,"\u21bd":e.MO.WIDEREL,"\u21be":e.MO.RELSTRETCH,"\u21bf":e.MO.RELSTRETCH,"\u21c0":e.MO.WIDEREL,"\u21c1":e.MO.WIDEREL,"\u21c2":e.MO.RELSTRETCH,"\u21c3":e.MO.RELSTRETCH,"\u21c4":e.MO.WIDEREL,"\u21c5":e.MO.RELSTRETCH,"\u21c6":e.MO.WIDEREL,"\u21c7":e.MO.WIDEREL,"\u21c8":e.MO.RELSTRETCH,"\u21c9":e.MO.WIDEREL,"\u21ca":e.MO.RELSTRETCH,"\u21cb":e.MO.WIDEREL,"\u21cc":e.MO.WIDEREL,"\u21cd":e.MO.RELACCENT,"\u21ce":e.MO.RELACCENT,"\u21cf":e.MO.RELACCENT,"\u21d0":e.MO.WIDEREL,"\u21d1":e.MO.RELSTRETCH,"\u21d2":e.MO.WIDEREL,"\u21d3":e.MO.RELSTRETCH,"\u21d4":e.MO.WIDEREL,"\u21d5":e.MO.RELSTRETCH,"\u21d6":e.MO.RELSTRETCH,"\u21d7":e.MO.RELSTRETCH,"\u21d8":e.MO.RELSTRETCH,"\u21d9":e.MO.RELSTRETCH,"\u21da":e.MO.WIDEREL,"\u21db":e.MO.WIDEREL,"\u21dc":e.MO.WIDEREL,"\u21dd":e.MO.WIDEREL,"\u21de":e.MO.REL,"\u21df":e.MO.REL,"\u21e0":e.MO.WIDEREL,"\u21e1":e.MO.RELSTRETCH,"\u21e2":e.MO.WIDEREL,"\u21e3":e.MO.RELSTRETCH,"\u21e4":e.MO.WIDEREL,"\u21e5":e.MO.WIDEREL,"\u21e6":e.MO.WIDEREL,"\u21e7":e.MO.RELSTRETCH,"\u21e8":e.MO.WIDEREL,"\u21e9":e.MO.RELSTRETCH,"\u21ea":e.MO.RELSTRETCH,"\u21eb":e.MO.RELSTRETCH,"\u21ec":e.MO.RELSTRETCH,"\u21ed":e.MO.RELSTRETCH,"\u21ee":e.MO.RELSTRETCH,"\u21ef":e.MO.RELSTRETCH,"\u21f0":e.MO.WIDEREL,"\u21f1":e.MO.REL,"\u21f2":e.MO.REL,"\u21f3":e.MO.RELSTRETCH,"\u21f4":e.MO.RELACCENT,"\u21f5":e.MO.RELSTRETCH,"\u21f6":e.MO.WIDEREL,"\u21f7":e.MO.RELACCENT,"\u21f8":e.MO.RELACCENT,"\u21f9":e.MO.RELACCENT,"\u21fa":e.MO.RELACCENT,"\u21fb":e.MO.RELACCENT,"\u21fc":e.MO.RELACCENT,"\u21fd":e.MO.WIDEREL,"\u21fe":e.MO.WIDEREL,"\u21ff":e.MO.WIDEREL,"\u2201":i(1,2,o.TEXCLASS.ORD),"\u2205":e.MO.ORD,"\u2206":e.MO.BIN3,"\u2208":e.MO.REL,"\u2209":e.MO.REL,"\u220a":e.MO.REL,"\u220b":e.MO.REL,"\u220c":e.MO.REL,"\u220d":e.MO.REL,"\u220e":e.MO.BIN3,"\u2212":e.MO.BIN4,"\u2213":e.MO.BIN4,"\u2214":e.MO.BIN4,"\u2215":e.MO.TALLBIN,"\u2216":e.MO.BIN4,"\u2217":e.MO.BIN4,"\u2218":e.MO.BIN4,"\u2219":e.MO.BIN4,"\u221d":e.MO.REL,"\u221e":e.MO.ORD,"\u221f":e.MO.REL,"\u2223":e.MO.REL,"\u2224":e.MO.REL,"\u2225":e.MO.REL,"\u2226":e.MO.REL,"\u2227":e.MO.BIN4,"\u2228":e.MO.BIN4,"\u2229":e.MO.BIN4,"\u222a":e.MO.BIN4,"\u2234":e.MO.REL,"\u2235":e.MO.REL,"\u2236":e.MO.REL,"\u2237":e.MO.REL,"\u2238":e.MO.BIN4,"\u2239":e.MO.REL,"\u223a":e.MO.BIN4,"\u223b":e.MO.REL,"\u223c":e.MO.REL,"\u223d":e.MO.REL,"\u223d\u0331":e.MO.BIN3,"\u223e":e.MO.REL,"\u223f":e.MO.BIN3,"\u2240":e.MO.BIN4,"\u2241":e.MO.REL,"\u2242":e.MO.REL,"\u2242\u0338":e.MO.REL,"\u2243":e.MO.REL,"\u2244":e.MO.REL,"\u2245":e.MO.REL,"\u2246":e.MO.REL,"\u2247":e.MO.REL,"\u2248":e.MO.REL,"\u2249":e.MO.REL,"\u224a":e.MO.REL,"\u224b":e.MO.REL,"\u224c":e.MO.REL,"\u224d":e.MO.REL,"\u224e":e.MO.REL,"\u224e\u0338":e.MO.REL,"\u224f":e.MO.REL,"\u224f\u0338":e.MO.REL,"\u2250":e.MO.REL,"\u2251":e.MO.REL,"\u2252":e.MO.REL,"\u2253":e.MO.REL,"\u2254":e.MO.REL,"\u2255":e.MO.REL,"\u2256":e.MO.REL,"\u2257":e.MO.REL,"\u2258":e.MO.REL,"\u2259":e.MO.REL,"\u225a":e.MO.REL,"\u225b":e.MO.REL,"\u225c":e.MO.REL,"\u225d":e.MO.REL,"\u225e":e.MO.REL,"\u225f":e.MO.REL,"\u2260":e.MO.REL,"\u2261":e.MO.REL,"\u2262":e.MO.REL,"\u2263":e.MO.REL,"\u2264":e.MO.REL,"\u2265":e.MO.REL,"\u2266":e.MO.REL,"\u2266\u0338":e.MO.REL,"\u2267":e.MO.REL,"\u2268":e.MO.REL,"\u2269":e.MO.REL,"\u226a":e.MO.REL,"\u226a\u0338":e.MO.REL,"\u226b":e.MO.REL,"\u226b\u0338":e.MO.REL,"\u226c":e.MO.REL,"\u226d":e.MO.REL,"\u226e":e.MO.REL,"\u226f":e.MO.REL,"\u2270":e.MO.REL,"\u2271":e.MO.REL,"\u2272":e.MO.REL,"\u2273":e.MO.REL,"\u2274":e.MO.REL,"\u2275":e.MO.REL,"\u2276":e.MO.REL,"\u2277":e.MO.REL,"\u2278":e.MO.REL,"\u2279":e.MO.REL,"\u227a":e.MO.REL,"\u227b":e.MO.REL,"\u227c":e.MO.REL,"\u227d":e.MO.REL,"\u227e":e.MO.REL,"\u227f":e.MO.REL,"\u227f\u0338":e.MO.REL,"\u2280":e.MO.REL,"\u2281":e.MO.REL,"\u2282":e.MO.REL,"\u2282\u20d2":e.MO.REL,"\u2283":e.MO.REL,"\u2283\u20d2":e.MO.REL,"\u2284":e.MO.REL,"\u2285":e.MO.REL,"\u2286":e.MO.REL,"\u2287":e.MO.REL,"\u2288":e.MO.REL,"\u2289":e.MO.REL,"\u228a":e.MO.REL,"\u228b":e.MO.REL,"\u228c":e.MO.BIN4,"\u228d":e.MO.BIN4,"\u228e":e.MO.BIN4,"\u228f":e.MO.REL,"\u228f\u0338":e.MO.REL,"\u2290":e.MO.REL,"\u2290\u0338":e.MO.REL,"\u2291":e.MO.REL,"\u2292":e.MO.REL,"\u2293":e.MO.BIN4,"\u2294":e.MO.BIN4,"\u2295":e.MO.BIN4,"\u2296":e.MO.BIN4,"\u2297":e.MO.BIN4,"\u2298":e.MO.BIN4,"\u2299":e.MO.BIN4,"\u229a":e.MO.BIN4,"\u229b":e.MO.BIN4,"\u229c":e.MO.BIN4,"\u229d":e.MO.BIN4,"\u229e":e.MO.BIN4,"\u229f":e.MO.BIN4,"\u22a0":e.MO.BIN4,"\u22a1":e.MO.BIN4,"\u22a2":e.MO.REL,"\u22a3":e.MO.REL,"\u22a4":e.MO.ORD55,"\u22a5":e.MO.REL,"\u22a6":e.MO.REL,"\u22a7":e.MO.REL,"\u22a8":e.MO.REL,"\u22a9":e.MO.REL,"\u22aa":e.MO.REL,"\u22ab":e.MO.REL,"\u22ac":e.MO.REL,"\u22ad":e.MO.REL,"\u22ae":e.MO.REL,"\u22af":e.MO.REL,"\u22b0":e.MO.REL,"\u22b1":e.MO.REL,"\u22b2":e.MO.REL,"\u22b3":e.MO.REL,"\u22b4":e.MO.REL,"\u22b5":e.MO.REL,"\u22b6":e.MO.REL,"\u22b7":e.MO.REL,"\u22b8":e.MO.REL,"\u22b9":e.MO.REL,"\u22ba":e.MO.BIN4,"\u22bb":e.MO.BIN4,"\u22bc":e.MO.BIN4,"\u22bd":e.MO.BIN4,"\u22be":e.MO.BIN3,"\u22bf":e.MO.BIN3,"\u22c4":e.MO.BIN4,"\u22c5":e.MO.BIN4,"\u22c6":e.MO.BIN4,"\u22c7":e.MO.BIN4,"\u22c8":e.MO.REL,"\u22c9":e.MO.BIN4,"\u22ca":e.MO.BIN4,"\u22cb":e.MO.BIN4,"\u22cc":e.MO.BIN4,"\u22cd":e.MO.REL,"\u22ce":e.MO.BIN4,"\u22cf":e.MO.BIN4,"\u22d0":e.MO.REL,"\u22d1":e.MO.REL,"\u22d2":e.MO.BIN4,"\u22d3":e.MO.BIN4,"\u22d4":e.MO.REL,"\u22d5":e.MO.REL,"\u22d6":e.MO.REL,"\u22d7":e.MO.REL,"\u22d8":e.MO.REL,"\u22d9":e.MO.REL,"\u22da":e.MO.REL,"\u22db":e.MO.REL,"\u22dc":e.MO.REL,"\u22dd":e.MO.REL,"\u22de":e.MO.REL,"\u22df":e.MO.REL,"\u22e0":e.MO.REL,"\u22e1":e.MO.REL,"\u22e2":e.MO.REL,"\u22e3":e.MO.REL,"\u22e4":e.MO.REL,"\u22e5":e.MO.REL,"\u22e6":e.MO.REL,"\u22e7":e.MO.REL,"\u22e8":e.MO.REL,"\u22e9":e.MO.REL,"\u22ea":e.MO.REL,"\u22eb":e.MO.REL,"\u22ec":e.MO.REL,"\u22ed":e.MO.REL,"\u22ee":e.MO.ORD55,"\u22ef":e.MO.INNER,"\u22f0":e.MO.REL,"\u22f1":[5,5,o.TEXCLASS.INNER,null],"\u22f2":e.MO.REL,"\u22f3":e.MO.REL,"\u22f4":e.MO.REL,"\u22f5":e.MO.REL,"\u22f6":e.MO.REL,"\u22f7":e.MO.REL,"\u22f8":e.MO.REL,"\u22f9":e.MO.REL,"\u22fa":e.MO.REL,"\u22fb":e.MO.REL,"\u22fc":e.MO.REL,"\u22fd":e.MO.REL,"\u22fe":e.MO.REL,"\u22ff":e.MO.REL,"\u2305":e.MO.BIN3,"\u2306":e.MO.BIN3,"\u2322":e.MO.REL4,"\u2323":e.MO.REL4,"\u2329":e.MO.OPEN,"\u232a":e.MO.CLOSE,"\u23aa":e.MO.ORD,"\u23af":[0,0,o.TEXCLASS.ORD,{stretchy:!0}],"\u23b0":e.MO.OPEN,"\u23b1":e.MO.CLOSE,"\u2500":e.MO.ORD,"\u25b3":e.MO.BIN4,"\u25b5":e.MO.BIN4,"\u25b9":e.MO.BIN4,"\u25bd":e.MO.BIN4,"\u25bf":e.MO.BIN4,"\u25c3":e.MO.BIN4,"\u25ef":e.MO.BIN3,"\u2660":e.MO.ORD,"\u2661":e.MO.ORD,"\u2662":e.MO.ORD,"\u2663":e.MO.ORD,"\u2758":e.MO.REL,"\u27f0":e.MO.RELSTRETCH,"\u27f1":e.MO.RELSTRETCH,"\u27f5":e.MO.WIDEREL,"\u27f6":e.MO.WIDEREL,"\u27f7":e.MO.WIDEREL,"\u27f8":e.MO.WIDEREL,"\u27f9":e.MO.WIDEREL,"\u27fa":e.MO.WIDEREL,"\u27fb":e.MO.WIDEREL,"\u27fc":e.MO.WIDEREL,"\u27fd":e.MO.WIDEREL,"\u27fe":e.MO.WIDEREL,"\u27ff":e.MO.WIDEREL,"\u2900":e.MO.RELACCENT,"\u2901":e.MO.RELACCENT,"\u2902":e.MO.RELACCENT,"\u2903":e.MO.RELACCENT,"\u2904":e.MO.RELACCENT,"\u2905":e.MO.RELACCENT,"\u2906":e.MO.RELACCENT,"\u2907":e.MO.RELACCENT,"\u2908":e.MO.REL,"\u2909":e.MO.REL,"\u290a":e.MO.RELSTRETCH,"\u290b":e.MO.RELSTRETCH,"\u290c":e.MO.WIDEREL,"\u290d":e.MO.WIDEREL,"\u290e":e.MO.WIDEREL,"\u290f":e.MO.WIDEREL,"\u2910":e.MO.WIDEREL,"\u2911":e.MO.RELACCENT,"\u2912":e.MO.RELSTRETCH,"\u2913":e.MO.RELSTRETCH,"\u2914":e.MO.RELACCENT,"\u2915":e.MO.RELACCENT,"\u2916":e.MO.RELACCENT,"\u2917":e.MO.RELACCENT,"\u2918":e.MO.RELACCENT,"\u2919":e.MO.RELACCENT,"\u291a":e.MO.RELACCENT,"\u291b":e.MO.RELACCENT,"\u291c":e.MO.RELACCENT,"\u291d":e.MO.RELACCENT,"\u291e":e.MO.RELACCENT,"\u291f":e.MO.RELACCENT,"\u2920":e.MO.RELACCENT,"\u2921":e.MO.RELSTRETCH,"\u2922":e.MO.RELSTRETCH,"\u2923":e.MO.REL,"\u2924":e.MO.REL,"\u2925":e.MO.REL,"\u2926":e.MO.REL,"\u2927":e.MO.REL,"\u2928":e.MO.REL,"\u2929":e.MO.REL,"\u292a":e.MO.REL,"\u292b":e.MO.REL,"\u292c":e.MO.REL,"\u292d":e.MO.REL,"\u292e":e.MO.REL,"\u292f":e.MO.REL,"\u2930":e.MO.REL,"\u2931":e.MO.REL,"\u2932":e.MO.REL,"\u2933":e.MO.RELACCENT,"\u2934":e.MO.REL,"\u2935":e.MO.REL,"\u2936":e.MO.REL,"\u2937":e.MO.REL,"\u2938":e.MO.REL,"\u2939":e.MO.REL,"\u293a":e.MO.RELACCENT,"\u293b":e.MO.RELACCENT,"\u293c":e.MO.RELACCENT,"\u293d":e.MO.RELACCENT,"\u293e":e.MO.REL,"\u293f":e.MO.REL,"\u2940":e.MO.REL,"\u2941":e.MO.REL,"\u2942":e.MO.RELACCENT,"\u2943":e.MO.RELACCENT,"\u2944":e.MO.RELACCENT,"\u2945":e.MO.RELACCENT,"\u2946":e.MO.RELACCENT,"\u2947":e.MO.RELACCENT,"\u2948":e.MO.RELACCENT,"\u2949":e.MO.REL,"\u294a":e.MO.RELACCENT,"\u294b":e.MO.RELACCENT,"\u294c":e.MO.REL,"\u294d":e.MO.REL,"\u294e":e.MO.WIDEREL,"\u294f":e.MO.RELSTRETCH,"\u2950":e.MO.WIDEREL,"\u2951":e.MO.RELSTRETCH,"\u2952":e.MO.WIDEREL,"\u2953":e.MO.WIDEREL,"\u2954":e.MO.RELSTRETCH,"\u2955":e.MO.RELSTRETCH,"\u2956":e.MO.RELSTRETCH,"\u2957":e.MO.RELSTRETCH,"\u2958":e.MO.RELSTRETCH,"\u2959":e.MO.RELSTRETCH,"\u295a":e.MO.WIDEREL,"\u295b":e.MO.WIDEREL,"\u295c":e.MO.RELSTRETCH,"\u295d":e.MO.RELSTRETCH,"\u295e":e.MO.WIDEREL,"\u295f":e.MO.WIDEREL,"\u2960":e.MO.RELSTRETCH,"\u2961":e.MO.RELSTRETCH,"\u2962":e.MO.RELACCENT,"\u2963":e.MO.REL,"\u2964":e.MO.RELACCENT,"\u2965":e.MO.REL,"\u2966":e.MO.RELACCENT,"\u2967":e.MO.RELACCENT,"\u2968":e.MO.RELACCENT,"\u2969":e.MO.RELACCENT,"\u296a":e.MO.RELACCENT,"\u296b":e.MO.RELACCENT,"\u296c":e.MO.RELACCENT,"\u296d":e.MO.RELACCENT,"\u296e":e.MO.RELSTRETCH,"\u296f":e.MO.RELSTRETCH,"\u2970":e.MO.RELACCENT,"\u2971":e.MO.RELACCENT,"\u2972":e.MO.RELACCENT,"\u2973":e.MO.RELACCENT,"\u2974":e.MO.RELACCENT,"\u2975":e.MO.RELACCENT,"\u2976":e.MO.RELACCENT,"\u2977":e.MO.RELACCENT,"\u2978":e.MO.RELACCENT,"\u2979":e.MO.RELACCENT,"\u297a":e.MO.RELACCENT,"\u297b":e.MO.RELACCENT,"\u297c":e.MO.RELACCENT,"\u297d":e.MO.RELACCENT,"\u297e":e.MO.REL,"\u297f":e.MO.REL,"\u2981":e.MO.BIN3,"\u2982":e.MO.BIN3,"\u2999":e.MO.BIN3,"\u299a":e.MO.BIN3,"\u299b":e.MO.BIN3,"\u299c":e.MO.BIN3,"\u299d":e.MO.BIN3,"\u299e":e.MO.BIN3,"\u299f":e.MO.BIN3,"\u29a0":e.MO.BIN3,"\u29a1":e.MO.BIN3,"\u29a2":e.MO.BIN3,"\u29a3":e.MO.BIN3,"\u29a4":e.MO.BIN3,"\u29a5":e.MO.BIN3,"\u29a6":e.MO.BIN3,"\u29a7":e.MO.BIN3,"\u29a8":e.MO.BIN3,"\u29a9":e.MO.BIN3,"\u29aa":e.MO.BIN3,"\u29ab":e.MO.BIN3,"\u29ac":e.MO.BIN3,"\u29ad":e.MO.BIN3,"\u29ae":e.MO.BIN3,"\u29af":e.MO.BIN3,"\u29b0":e.MO.BIN3,"\u29b1":e.MO.BIN3,"\u29b2":e.MO.BIN3,"\u29b3":e.MO.BIN3,"\u29b4":e.MO.BIN3,"\u29b5":e.MO.BIN3,"\u29b6":e.MO.BIN4,"\u29b7":e.MO.BIN4,"\u29b8":e.MO.BIN4,"\u29b9":e.MO.BIN4,"\u29ba":e.MO.BIN4,"\u29bb":e.MO.BIN4,"\u29bc":e.MO.BIN4,"\u29bd":e.MO.BIN4,"\u29be":e.MO.BIN4,"\u29bf":e.MO.BIN4,"\u29c0":e.MO.REL,"\u29c1":e.MO.REL,"\u29c2":e.MO.BIN3,"\u29c3":e.MO.BIN3,"\u29c4":e.MO.BIN4,"\u29c5":e.MO.BIN4,"\u29c6":e.MO.BIN4,"\u29c7":e.MO.BIN4,"\u29c8":e.MO.BIN4,"\u29c9":e.MO.BIN3,"\u29ca":e.MO.BIN3,"\u29cb":e.MO.BIN3,"\u29cc":e.MO.BIN3,"\u29cd":e.MO.BIN3,"\u29ce":e.MO.REL,"\u29cf":e.MO.REL,"\u29cf\u0338":e.MO.REL,"\u29d0":e.MO.REL,"\u29d0\u0338":e.MO.REL,"\u29d1":e.MO.REL,"\u29d2":e.MO.REL,"\u29d3":e.MO.REL,"\u29d4":e.MO.REL,"\u29d5":e.MO.REL,"\u29d6":e.MO.BIN4,"\u29d7":e.MO.BIN4,"\u29d8":e.MO.BIN3,"\u29d9":e.MO.BIN3,"\u29db":e.MO.BIN3,"\u29dc":e.MO.BIN3,"\u29dd":e.MO.BIN3,"\u29de":e.MO.REL,"\u29df":e.MO.BIN3,"\u29e0":e.MO.BIN3,"\u29e1":e.MO.REL,"\u29e2":e.MO.BIN4,"\u29e3":e.MO.REL,"\u29e4":e.MO.REL,"\u29e5":e.MO.REL,"\u29e6":e.MO.REL,"\u29e7":e.MO.BIN3,"\u29e8":e.MO.BIN3,"\u29e9":e.MO.BIN3,"\u29ea":e.MO.BIN3,"\u29eb":e.MO.BIN3,"\u29ec":e.MO.BIN3,"\u29ed":e.MO.BIN3,"\u29ee":e.MO.BIN3,"\u29ef":e.MO.BIN3,"\u29f0":e.MO.BIN3,"\u29f1":e.MO.BIN3,"\u29f2":e.MO.BIN3,"\u29f3":e.MO.BIN3,"\u29f4":e.MO.REL,"\u29f5":e.MO.BIN4,"\u29f6":e.MO.BIN4,"\u29f7":e.MO.BIN4,"\u29f8":e.MO.BIN3,"\u29f9":e.MO.BIN3,"\u29fa":e.MO.BIN3,"\u29fb":e.MO.BIN3,"\u29fe":e.MO.BIN4,"\u29ff":e.MO.BIN4,"\u2a1d":e.MO.BIN3,"\u2a1e":e.MO.BIN3,"\u2a1f":e.MO.BIN3,"\u2a20":e.MO.BIN3,"\u2a21":e.MO.BIN3,"\u2a22":e.MO.BIN4,"\u2a23":e.MO.BIN4,"\u2a24":e.MO.BIN4,"\u2a25":e.MO.BIN4,"\u2a26":e.MO.BIN4,"\u2a27":e.MO.BIN4,"\u2a28":e.MO.BIN4,"\u2a29":e.MO.BIN4,"\u2a2a":e.MO.BIN4,"\u2a2b":e.MO.BIN4,"\u2a2c":e.MO.BIN4,"\u2a2d":e.MO.BIN4,"\u2a2e":e.MO.BIN4,"\u2a2f":e.MO.BIN4,"\u2a30":e.MO.BIN4,"\u2a31":e.MO.BIN4,"\u2a32":e.MO.BIN4,"\u2a33":e.MO.BIN4,"\u2a34":e.MO.BIN4,"\u2a35":e.MO.BIN4,"\u2a36":e.MO.BIN4,"\u2a37":e.MO.BIN4,"\u2a38":e.MO.BIN4,"\u2a39":e.MO.BIN4,"\u2a3a":e.MO.BIN4,"\u2a3b":e.MO.BIN4,"\u2a3c":e.MO.BIN4,"\u2a3d":e.MO.BIN4,"\u2a3e":e.MO.BIN4,"\u2a3f":e.MO.BIN4,"\u2a40":e.MO.BIN4,"\u2a41":e.MO.BIN4,"\u2a42":e.MO.BIN4,"\u2a43":e.MO.BIN4,"\u2a44":e.MO.BIN4,"\u2a45":e.MO.BIN4,"\u2a46":e.MO.BIN4,"\u2a47":e.MO.BIN4,"\u2a48":e.MO.BIN4,"\u2a49":e.MO.BIN4,"\u2a4a":e.MO.BIN4,"\u2a4b":e.MO.BIN4,"\u2a4c":e.MO.BIN4,"\u2a4d":e.MO.BIN4,"\u2a4e":e.MO.BIN4,"\u2a4f":e.MO.BIN4,"\u2a50":e.MO.BIN4,"\u2a51":e.MO.BIN4,"\u2a52":e.MO.BIN4,"\u2a53":e.MO.BIN4,"\u2a54":e.MO.BIN4,"\u2a55":e.MO.BIN4,"\u2a56":e.MO.BIN4,"\u2a57":e.MO.BIN4,"\u2a58":e.MO.BIN4,"\u2a59":e.MO.REL,"\u2a5a":e.MO.BIN4,"\u2a5b":e.MO.BIN4,"\u2a5c":e.MO.BIN4,"\u2a5d":e.MO.BIN4,"\u2a5e":e.MO.BIN4,"\u2a5f":e.MO.BIN4,"\u2a60":e.MO.BIN4,"\u2a61":e.MO.BIN4,"\u2a62":e.MO.BIN4,"\u2a63":e.MO.BIN4,"\u2a64":e.MO.BIN4,"\u2a65":e.MO.BIN4,"\u2a66":e.MO.REL,"\u2a67":e.MO.REL,"\u2a68":e.MO.REL,"\u2a69":e.MO.REL,"\u2a6a":e.MO.REL,"\u2a6b":e.MO.REL,"\u2a6c":e.MO.REL,"\u2a6d":e.MO.REL,"\u2a6e":e.MO.REL,"\u2a6f":e.MO.REL,"\u2a70":e.MO.REL,"\u2a71":e.MO.BIN4,"\u2a72":e.MO.BIN4,"\u2a73":e.MO.REL,"\u2a74":e.MO.REL,"\u2a75":e.MO.REL,"\u2a76":e.MO.REL,"\u2a77":e.MO.REL,"\u2a78":e.MO.REL,"\u2a79":e.MO.REL,"\u2a7a":e.MO.REL,"\u2a7b":e.MO.REL,"\u2a7c":e.MO.REL,"\u2a7d":e.MO.REL,"\u2a7d\u0338":e.MO.REL,"\u2a7e":e.MO.REL,"\u2a7e\u0338":e.MO.REL,"\u2a7f":e.MO.REL,"\u2a80":e.MO.REL,"\u2a81":e.MO.REL,"\u2a82":e.MO.REL,"\u2a83":e.MO.REL,"\u2a84":e.MO.REL,"\u2a85":e.MO.REL,"\u2a86":e.MO.REL,"\u2a87":e.MO.REL,"\u2a88":e.MO.REL,"\u2a89":e.MO.REL,"\u2a8a":e.MO.REL,"\u2a8b":e.MO.REL,"\u2a8c":e.MO.REL,"\u2a8d":e.MO.REL,"\u2a8e":e.MO.REL,"\u2a8f":e.MO.REL,"\u2a90":e.MO.REL,"\u2a91":e.MO.REL,"\u2a92":e.MO.REL,"\u2a93":e.MO.REL,"\u2a94":e.MO.REL,"\u2a95":e.MO.REL,"\u2a96":e.MO.REL,"\u2a97":e.MO.REL,"\u2a98":e.MO.REL,"\u2a99":e.MO.REL,"\u2a9a":e.MO.REL,"\u2a9b":e.MO.REL,"\u2a9c":e.MO.REL,"\u2a9d":e.MO.REL,"\u2a9e":e.MO.REL,"\u2a9f":e.MO.REL,"\u2aa0":e.MO.REL,"\u2aa1":e.MO.REL,"\u2aa1\u0338":e.MO.REL,"\u2aa2":e.MO.REL,"\u2aa2\u0338":e.MO.REL,"\u2aa3":e.MO.REL,"\u2aa4":e.MO.REL,"\u2aa5":e.MO.REL,"\u2aa6":e.MO.REL,"\u2aa7":e.MO.REL,"\u2aa8":e.MO.REL,"\u2aa9":e.MO.REL,"\u2aaa":e.MO.REL,"\u2aab":e.MO.REL,"\u2aac":e.MO.REL,"\u2aad":e.MO.REL,"\u2aae":e.MO.REL,"\u2aaf":e.MO.REL,"\u2aaf\u0338":e.MO.REL,"\u2ab0":e.MO.REL,"\u2ab0\u0338":e.MO.REL,"\u2ab1":e.MO.REL,"\u2ab2":e.MO.REL,"\u2ab3":e.MO.REL,"\u2ab4":e.MO.REL,"\u2ab5":e.MO.REL,"\u2ab6":e.MO.REL,"\u2ab7":e.MO.REL,"\u2ab8":e.MO.REL,"\u2ab9":e.MO.REL,"\u2aba":e.MO.REL,"\u2abb":e.MO.REL,"\u2abc":e.MO.REL,"\u2abd":e.MO.REL,"\u2abe":e.MO.REL,"\u2abf":e.MO.REL,"\u2ac0":e.MO.REL,"\u2ac1":e.MO.REL,"\u2ac2":e.MO.REL,"\u2ac3":e.MO.REL,"\u2ac4":e.MO.REL,"\u2ac5":e.MO.REL,"\u2ac6":e.MO.REL,"\u2ac7":e.MO.REL,"\u2ac8":e.MO.REL,"\u2ac9":e.MO.REL,"\u2aca":e.MO.REL,"\u2acb":e.MO.REL,"\u2acc":e.MO.REL,"\u2acd":e.MO.REL,"\u2ace":e.MO.REL,"\u2acf":e.MO.REL,"\u2ad0":e.MO.REL,"\u2ad1":e.MO.REL,"\u2ad2":e.MO.REL,"\u2ad3":e.MO.REL,"\u2ad4":e.MO.REL,"\u2ad5":e.MO.REL,"\u2ad6":e.MO.REL,"\u2ad7":e.MO.REL,"\u2ad8":e.MO.REL,"\u2ad9":e.MO.REL,"\u2ada":e.MO.REL,"\u2adb":e.MO.REL,"\u2add":e.MO.REL,"\u2add\u0338":e.MO.REL,"\u2ade":e.MO.REL,"\u2adf":e.MO.REL,"\u2ae0":e.MO.REL,"\u2ae1":e.MO.REL,"\u2ae2":e.MO.REL,"\u2ae3":e.MO.REL,"\u2ae4":e.MO.REL,"\u2ae5":e.MO.REL,"\u2ae6":e.MO.REL,"\u2ae7":e.MO.REL,"\u2ae8":e.MO.REL,"\u2ae9":e.MO.REL,"\u2aea":e.MO.REL,"\u2aeb":e.MO.REL,"\u2aec":e.MO.REL,"\u2aed":e.MO.REL,"\u2aee":e.MO.REL,"\u2aef":e.MO.REL,"\u2af0":e.MO.REL,"\u2af1":e.MO.REL,"\u2af2":e.MO.REL,"\u2af3":e.MO.REL,"\u2af4":e.MO.BIN4,"\u2af5":e.MO.BIN4,"\u2af6":e.MO.BIN4,"\u2af7":e.MO.REL,"\u2af8":e.MO.REL,"\u2af9":e.MO.REL,"\u2afa":e.MO.REL,"\u2afb":e.MO.BIN4,"\u2afd":e.MO.BIN4,"\u2afe":e.MO.BIN3,"\u2b45":e.MO.RELSTRETCH,"\u2b46":e.MO.RELSTRETCH,"\u3008":e.MO.OPEN,"\u3009":e.MO.CLOSE,"\ufe37":e.MO.WIDEACCENT,"\ufe38":e.MO.WIDEACCENT}},e.OPTABLE.infix["^"]=e.MO.WIDEREL,e.OPTABLE.infix._=e.MO.WIDEREL,e.OPTABLE.infix["\u2adc"]=e.MO.REL},9259:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.SerializedMmlVisitor=e.toEntity=e.DATAMJX=void 0;var a=r(6325),l=r(9007),c=r(450);e.DATAMJX="data-mjx-";e.toEntity=function(t){return"&#x"+t.codePointAt(0).toString(16).toUpperCase()+";"};var u=function(t){function r(){return null!==t&&t.apply(this,arguments)||this}return o(r,t),r.prototype.visitTree=function(t){return this.visitNode(t,"")},r.prototype.visitTextNode=function(t,e){return this.quoteHTML(t.getText())},r.prototype.visitXMLNode=function(t,e){return e+t.getSerializedXML()},r.prototype.visitInferredMrowNode=function(t,e){var r,n,o=[];try{for(var s=i(t.childNodes),a=s.next();!a.done;a=s.next()){var l=a.value;o.push(this.visitNode(l,e))}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return o.join("\n")},r.prototype.visitTeXAtomNode=function(t,e){var r=this.childNodeMml(t,e+" ","\n");return e+""+(r.match(/\S/)?"\n"+r+e:"")+""},r.prototype.visitAnnotationNode=function(t,e){return e+""+this.childNodeMml(t,"","")+""},r.prototype.visitDefault=function(t,e){var r=t.kind,n=s(t.isToken||0===t.childNodes.length?["",""]:["\n",e],2),o=n[0],i=n[1],a=this.childNodeMml(t,e+" ",o);return e+"<"+r+this.getAttributes(t)+">"+(a.match(/\S/)?o+a+i:"")+""},r.prototype.childNodeMml=function(t,e,r){var n,o,s="";try{for(var a=i(t.childNodes),l=a.next();!l.done;l=a.next()){var c=l.value;s+=this.visitNode(c,e)+r}}catch(t){n={error:t}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}return s},r.prototype.getAttributes=function(t){var e,r,n=[],o=this.constructor.defaultAttributes[t.kind]||{},s=Object.assign({},o,this.getDataAttributes(t),t.attributes.getAllAttributes()),a=this.constructor.variants;s.hasOwnProperty("mathvariant")&&a.hasOwnProperty(s.mathvariant)&&(s.mathvariant=a[s.mathvariant]);try{for(var l=i(Object.keys(s)),c=l.next();!c.done;c=l.next()){var u=c.value,p=String(s[u]);void 0!==p&&n.push(u+'="'+this.quoteHTML(p)+'"')}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(e)throw e.error}}return n.length?" "+n.join(" "):""},r.prototype.getDataAttributes=function(t){var e={},r=t.attributes.getExplicit("mathvariant"),n=this.constructor.variants;r&&n.hasOwnProperty(r)&&this.setDataAttribute(e,"variant",r),t.getProperty("variantForm")&&this.setDataAttribute(e,"alternate","1"),t.getProperty("pseudoscript")&&this.setDataAttribute(e,"pseudoscript","true"),!1===t.getProperty("autoOP")&&this.setDataAttribute(e,"auto-op","false");var o=t.getProperty("scriptalign");o&&this.setDataAttribute(e,"script-align",o);var i=t.getProperty("texClass");if(void 0!==i){var s=!0;if(i===l.TEXCLASS.OP&&t.isKind("mi")){var a=t.getText();s=!(a.length>1&&a.match(c.MmlMi.operatorName))}s&&this.setDataAttribute(e,"texclass",i<0?"NONE":l.TEXCLASSNAMES[i])}return t.getProperty("scriptlevel")&&!1===t.getProperty("useHeight")&&this.setDataAttribute(e,"smallmatrix","true"),e},r.prototype.setDataAttribute=function(t,r,n){t[e.DATAMJX+r]=n},r.prototype.quoteHTML=function(t){return t.replace(/&/g,"&").replace(//g,">").replace(/\"/g,""").replace(/[\uD800-\uDBFF]./g,e.toEntity).replace(/[\u0080-\uD7FF\uE000-\uFFFF]/g,e.toEntity)},r.variants={"-tex-calligraphic":"script","-tex-bold-calligraphic":"bold-script","-tex-oldstyle":"normal","-tex-bold-oldstyle":"bold","-tex-mathit":"italic"},r.defaultAttributes={math:{xmlns:"http://www.w3.org/1998/Math/MathML"}},r}(a.MmlVisitor);e.SerializedMmlVisitor=u},2975:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractOutputJax=void 0;var n=r(7233),o=r(7525),i=function(){function t(t){void 0===t&&(t={}),this.adaptor=null;var e=this.constructor;this.options=(0,n.userOptions)((0,n.defaultOptions)({},e.OPTIONS),t),this.postFilters=new o.FunctionList}return Object.defineProperty(t.prototype,"name",{get:function(){return this.constructor.NAME},enumerable:!1,configurable:!0}),t.prototype.setAdaptor=function(t){this.adaptor=t},t.prototype.initialize=function(){},t.prototype.reset=function(){for(var t=[],e=0;e=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEmptyNode=e.AbstractNode=void 0;var s=function(){function t(t,e,r){var n,o;void 0===e&&(e={}),void 0===r&&(r=[]),this.factory=t,this.parent=null,this.properties={},this.childNodes=[];try{for(var s=i(Object.keys(e)),a=s.next();!a.done;a=s.next()){var l=a.value;this.setProperty(l,e[l])}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(n)throw n.error}}r.length&&this.setChildren(r)}return Object.defineProperty(t.prototype,"kind",{get:function(){return"unknown"},enumerable:!1,configurable:!0}),t.prototype.setProperty=function(t,e){this.properties[t]=e},t.prototype.getProperty=function(t){return this.properties[t]},t.prototype.getPropertyNames=function(){return Object.keys(this.properties)},t.prototype.getAllProperties=function(){return this.properties},t.prototype.removeProperty=function(){for(var t,e,r=[],n=0;n=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLDocument=void 0;var l=r(5722),c=r(7233),u=r(3363),p=r(3335),h=r(5138),f=r(4474),d=function(t){function e(e,r,n){var o=this,i=s((0,c.separateOptions)(n,h.HTMLDomStrings.OPTIONS),2),a=i[0],l=i[1];return(o=t.call(this,e,r,a)||this).domStrings=o.options.DomStrings||new h.HTMLDomStrings(l),o.domStrings.adaptor=r,o.styles=[],o}return o(e,t),e.prototype.findPosition=function(t,e,r,n){var o,i,l=this.adaptor;try{for(var c=a(n[t]),u=c.next();!u.done;u=c.next()){var p=u.value,h=s(p,2),f=h[0],d=h[1];if(e<=d&&"#text"===l.kind(f))return{node:f,n:Math.max(e,0),delim:r};e-=d}}catch(t){o={error:t}}finally{try{u&&!u.done&&(i=c.return)&&i.call(c)}finally{if(o)throw o.error}}return{node:null,n:0,delim:r}},e.prototype.mathItem=function(t,e,r){var n=t.math,o=this.findPosition(t.n,t.start.n,t.open,r),i=this.findPosition(t.n,t.end.n,t.close,r);return new this.options.MathItem(n,e,t.display,o,i)},e.prototype.findMath=function(t){var e,r,n,o,i,l,u,p,h;if(!this.processed.isSet("findMath")){this.adaptor.document=this.document,t=(0,c.userOptions)({elements:this.options.elements||[this.adaptor.body(this.document)]},t);try{for(var f=a(this.adaptor.getElements(t.elements,this.document)),d=f.next();!d.done;d=f.next()){var m=d.value,y=s([null,null],2),g=y[0],b=y[1];try{for(var v=(n=void 0,a(this.inputJax)),_=v.next();!_.done;_=v.next()){var S=_.value,M=new this.options.MathList;if(S.processStrings){null===g&&(g=(i=s(this.domStrings.find(m),2))[0],b=i[1]);try{for(var O=(l=void 0,a(S.findMath(g))),x=O.next();!x.done;x=O.next()){var E=x.value;M.push(this.mathItem(E,S,b))}}catch(t){l={error:t}}finally{try{x&&!x.done&&(u=O.return)&&u.call(O)}finally{if(l)throw l.error}}}else try{for(var A=(p=void 0,a(S.findMath(m))),C=A.next();!C.done;C=A.next()){E=C.value;var T=new this.options.MathItem(E.math,S,E.display,E.start,E.end);M.push(T)}}catch(t){p={error:t}}finally{try{C&&!C.done&&(h=A.return)&&h.call(A)}finally{if(p)throw p.error}}this.math.merge(M)}}catch(t){n={error:t}}finally{try{_&&!_.done&&(o=v.return)&&o.call(v)}finally{if(n)throw n.error}}}}catch(t){e={error:t}}finally{try{d&&!d.done&&(r=f.return)&&r.call(f)}finally{if(e)throw e.error}}this.processed.set("findMath")}return this},e.prototype.updateDocument=function(){return this.processed.isSet("updateDocument")||(this.addPageElements(),this.addStyleSheet(),t.prototype.updateDocument.call(this),this.processed.set("updateDocument")),this},e.prototype.addPageElements=function(){var t=this.adaptor.body(this.document),e=this.documentPageElements();e&&this.adaptor.append(t,e)},e.prototype.addStyleSheet=function(){var t=this.documentStyleSheet(),e=this.adaptor;if(t&&!e.parent(t)){var r=e.head(this.document),n=this.findSheet(r,e.getAttribute(t,"id"));n?e.replace(t,n):e.append(r,t)}},e.prototype.findSheet=function(t,e){var r,n;if(e)try{for(var o=a(this.adaptor.tags(t,"style")),i=o.next();!i.done;i=o.next()){var s=i.value;if(this.adaptor.getAttribute(s,"id")===e)return s}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return null},e.prototype.removeFromDocument=function(t){var e,r;if(void 0===t&&(t=!1),this.processed.isSet("updateDocument"))try{for(var n=a(this.math),o=n.next();!o.done;o=n.next()){var i=o.value;i.state()>=f.STATE.INSERTED&&i.state(f.STATE.TYPESET,t)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return this.processed.clear("updateDocument"),this},e.prototype.documentStyleSheet=function(){return this.outputJax.styleSheet(this)},e.prototype.documentPageElements=function(){return this.outputJax.pageElements(this)},e.prototype.addStyles=function(t){this.styles.push(t)},e.prototype.getStyles=function(){return this.styles},e.KIND="HTML",e.OPTIONS=i(i({},l.AbstractMathDocument.OPTIONS),{renderActions:(0,c.expandable)(i(i({},l.AbstractMathDocument.OPTIONS.renderActions),{styles:[f.STATE.INSERTED+1,"","updateStyleSheet",!1]})),MathList:p.HTMLMathList,MathItem:u.HTMLMathItem,DomStrings:null}),e}(l.AbstractMathDocument);e.HTMLDocument=d},5138:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLDomStrings=void 0;var o=r(7233),i=function(){function t(t){void 0===t&&(t=null);var e=this.constructor;this.options=(0,o.userOptions)((0,o.defaultOptions)({},e.OPTIONS),t),this.init(),this.getPatterns()}return t.prototype.init=function(){this.strings=[],this.string="",this.snodes=[],this.nodes=[],this.stack=[]},t.prototype.getPatterns=function(){var t=(0,o.makeArray)(this.options.skipHtmlTags),e=(0,o.makeArray)(this.options.ignoreHtmlClass),r=(0,o.makeArray)(this.options.processHtmlClass);this.skipHtmlTags=new RegExp("^(?:"+t.join("|")+")$","i"),this.ignoreHtmlClass=new RegExp("(?:^| )(?:"+e.join("|")+")(?: |$)"),this.processHtmlClass=new RegExp("(?:^| )(?:"+r+")(?: |$)")},t.prototype.pushString=function(){this.string.match(/\S/)&&(this.strings.push(this.string),this.nodes.push(this.snodes)),this.string="",this.snodes=[]},t.prototype.extendString=function(t,e){this.snodes.push([t,e.length]),this.string+=e},t.prototype.handleText=function(t,e){return e||this.extendString(t,this.adaptor.value(t)),this.adaptor.next(t)},t.prototype.handleTag=function(t,e){if(!e){var r=this.options.includeHtmlTags[this.adaptor.kind(t)];this.extendString(t,r)}return this.adaptor.next(t)},t.prototype.handleContainer=function(t,e){this.pushString();var r=this.adaptor.getAttribute(t,"class")||"",n=this.adaptor.kind(t)||"",o=this.processHtmlClass.exec(r),i=t;return!this.adaptor.firstChild(t)||this.adaptor.getAttribute(t,"data-MJX")||!o&&this.skipHtmlTags.exec(n)?i=this.adaptor.next(t):(this.adaptor.next(t)&&this.stack.push([this.adaptor.next(t),e]),i=this.adaptor.firstChild(t),e=(e||this.ignoreHtmlClass.exec(r))&&!o),[i,e]},t.prototype.handleOther=function(t,e){return this.pushString(),this.adaptor.next(t)},t.prototype.find=function(t){var e,r;this.init();for(var o=this.adaptor.next(t),i=!1,s=this.options.includeHtmlTags;t&&t!==o;){var a=this.adaptor.kind(t);"#text"===a?t=this.handleText(t,i):s.hasOwnProperty(a)?t=this.handleTag(t,i):a?(t=(e=n(this.handleContainer(t,i),2))[0],i=e[1]):t=this.handleOther(t,i),!t&&this.stack.length&&(this.pushString(),t=(r=n(this.stack.pop(),2))[0],i=r[1])}this.pushString();var l=[this.strings,this.nodes];return this.init(),l},t.OPTIONS={skipHtmlTags:["script","noscript","style","textarea","pre","code","annotation","annotation-xml"],includeHtmlTags:{br:"\n",wbr:"","#comment":""},ignoreHtmlClass:"mathjax_ignore",processHtmlClass:"mathjax_process"},t}();e.HTMLDomStrings=i},3726:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLHandler=void 0;var i=r(3670),s=r(3683),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.documentClass=s.HTMLDocument,e}return o(e,t),e.prototype.handlesDocument=function(t){var e=this.adaptor;if("string"==typeof t)try{t=e.parse(t,"text/html")}catch(t){}return t instanceof e.window.Document||t instanceof e.window.HTMLElement||t instanceof e.window.DocumentFragment},e.prototype.create=function(e,r){var n=this.adaptor;if("string"==typeof e)e=n.parse(e,"text/html");else if(e instanceof n.window.HTMLElement||e instanceof n.window.DocumentFragment){var o=e;e=n.parse("","text/html"),n.append(n.body(e),o)}return t.prototype.create.call(this,e,r)},e}(i.AbstractHandler);e.HTMLHandler=a},3363:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLMathItem=void 0;var i=r(4474),s=function(t){function e(e,r,n,o,i){return void 0===n&&(n=!0),void 0===o&&(o={node:null,n:0,delim:""}),void 0===i&&(i={node:null,n:0,delim:""}),t.call(this,e,r,n,o,i)||this}return o(e,t),Object.defineProperty(e.prototype,"adaptor",{get:function(){return this.inputJax.adaptor},enumerable:!1,configurable:!0}),e.prototype.updateDocument=function(t){if(this.state()=i.STATE.TYPESET){var e=this.adaptor,r=this.start.node,n=e.text("");if(t){var o=this.start.delim+this.math+this.end.delim;if(this.inputJax.processStrings)n=e.text(o);else{var s=e.parse(o,"text/html");n=e.firstChild(e.body(s))}}e.parent(r)&&e.replace(n,r),this.start.node=this.end.node=n,this.start.n=this.end.n=0}},e}(i.AbstractMathItem);e.HTMLMathItem=s},3335:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLMathList=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(r(9e3).AbstractMathList);e.HTMLMathList=i},2892:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.MathML=void 0;var s=r(9206),a=r(7233),l=r(7525),c=r(625),u=r(2769),p=function(t){function e(e){void 0===e&&(e={});var r=this,n=i((0,a.separateOptions)(e,c.FindMathML.OPTIONS,u.MathMLCompile.OPTIONS),3),o=n[0],s=n[1],p=n[2];return(r=t.call(this,o)||this).findMathML=r.options.FindMathML||new c.FindMathML(s),r.mathml=r.options.MathMLCompile||new u.MathMLCompile(p),r.mmlFilters=new l.FunctionList,r}return o(e,t),e.prototype.setAdaptor=function(e){t.prototype.setAdaptor.call(this,e),this.findMathML.adaptor=e,this.mathml.adaptor=e},e.prototype.setMmlFactory=function(e){t.prototype.setMmlFactory.call(this,e),this.mathml.setMmlFactory(e)},Object.defineProperty(e.prototype,"processStrings",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.compile=function(t,e){var r=t.start.node;if(!r||!t.end.node||this.options.forceReparse||"#text"===this.adaptor.kind(r)){var n=this.executeFilters(this.preFilters,t,e,(t.math||"").trim()),o=this.checkForErrors(this.adaptor.parse(n,"text/"+this.options.parseAs)),i=this.adaptor.body(o);1!==this.adaptor.childNodes(i).length&&this.error("MathML must consist of a single element"),r=this.adaptor.remove(this.adaptor.firstChild(i)),"math"!==this.adaptor.kind(r).replace(/^[a-z]+:/,"")&&this.error("MathML must be formed by a element, not <"+this.adaptor.kind(r)+">")}return r=this.executeFilters(this.mmlFilters,t,e,r),this.executeFilters(this.postFilters,t,e,this.mathml.compile(r))},e.prototype.checkForErrors=function(t){var e=this.adaptor.tags(this.adaptor.body(t),"parsererror")[0];return e&&(""===this.adaptor.textContent(e)&&this.error("Error processing MathML"),this.options.parseError.call(this,e)),t},e.prototype.error=function(t){throw new Error(t)},e.prototype.findMath=function(t){return this.findMathML.findMath(t)},e.NAME="MathML",e.OPTIONS=(0,a.defaultOptions)({parseAs:"html",forceReparse:!1,FindMathML:null,MathMLCompile:null,parseError:function(t){this.error(this.adaptor.textContent(t).replace(/\n.*/g,""))}},s.AbstractInputJax.OPTIONS),e}(s.AbstractInputJax);e.MathML=p},625:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.FindMathML=void 0;var s=r(3494),a="http://www.w3.org/1998/Math/MathML",l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.findMath=function(t){var e=new Set;this.findMathNodes(t,e),this.findMathPrefixed(t,e);var r=this.adaptor.root(this.adaptor.document);return"html"===this.adaptor.kind(r)&&0===e.size&&this.findMathNS(t,e),this.processMath(e)},e.prototype.findMathNodes=function(t,e){var r,n;try{for(var o=i(this.adaptor.tags(t,"math")),s=o.next();!s.done;s=o.next()){var a=s.value;e.add(a)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.findMathPrefixed=function(t,e){var r,n,o,s,l=this.adaptor.root(this.adaptor.document);try{for(var c=i(this.adaptor.allAttributes(l)),u=c.next();!u.done;u=c.next()){var p=u.value;if("xmlns:"===p.name.substr(0,6)&&p.value===a){var h=p.name.substr(6);try{for(var f=(o=void 0,i(this.adaptor.tags(t,h+":math"))),d=f.next();!d.done;d=f.next()){var m=d.value;e.add(m)}}catch(t){o={error:t}}finally{try{d&&!d.done&&(s=f.return)&&s.call(f)}finally{if(o)throw o.error}}}}}catch(t){r={error:t}}finally{try{u&&!u.done&&(n=c.return)&&n.call(c)}finally{if(r)throw r.error}}},e.prototype.findMathNS=function(t,e){var r,n;try{for(var o=i(this.adaptor.tags(t,"math",a)),s=o.next();!s.done;s=o.next()){var l=s.value;e.add(l)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.processMath=function(t){var e,r,n=[];try{for(var o=i(Array.from(t)),s=o.next();!s.done;s=o.next()){var a=s.value,l="block"===this.adaptor.getAttribute(a,"display")||"display"===this.adaptor.getAttribute(a,"mode"),c={node:a,n:0,delim:""},u={node:a,n:0,delim:""};n.push({math:this.adaptor.outerHTML(a),start:c,end:u,display:l})}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return n},e.OPTIONS={},e}(s.AbstractFindMath);e.FindMathML=l},2769:function(t,e,r){var n=this&&this.__assign||function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MathMLCompile=void 0;var l=r(9007),c=r(7233),u=s(r(5368)),p=function(){function t(t){void 0===t&&(t={});var e=this.constructor;this.options=(0,c.userOptions)((0,c.defaultOptions)({},e.OPTIONS),t)}return t.prototype.setMmlFactory=function(t){this.factory=t},t.prototype.compile=function(t){var e=this.makeNode(t);return e.verifyTree(this.options.verify),e.setInheritedAttributes({},!1,0,!1),e.walkTree(this.markMrows),e},t.prototype.makeNode=function(t){var e,r,n=this.adaptor,o=!1,i=n.kind(t).replace(/^.*:/,""),s=n.getAttribute(t,"data-mjx-texclass")||"";s&&(s=this.filterAttribute("data-mjx-texclass",s)||"");var c=s&&"mrow"===i?"TeXAtom":i;try{for(var u=a(this.filterClassList(n.allClasses(t))),p=u.next();!p.done;p=u.next()){var h=p.value;h.match(/^MJX-TeXAtom-/)&&"mrow"===i?(s=h.substr(12),c="TeXAtom"):"MJX-fixedlimits"===h&&(o=!0)}}catch(t){e={error:t}}finally{try{p&&!p.done&&(r=u.return)&&r.call(u)}finally{if(e)throw e.error}}this.factory.getNodeClass(c)||this.error('Unknown node type "'+c+'"');var f=this.factory.create(c);return"TeXAtom"!==c||"OP"!==s||o||(f.setProperty("movesupsub",!0),f.attributes.setInherited("movablelimits",!0)),s&&(f.texClass=l.TEXCLASS[s],f.setProperty("texClass",f.texClass)),this.addAttributes(f,t),this.checkClass(f,t),this.addChildren(f,t),f},t.prototype.addAttributes=function(t,e){var r,n,o=!1;try{for(var i=a(this.adaptor.allAttributes(e)),s=i.next();!s.done;s=i.next()){var l=s.value,c=l.name,u=this.filterAttribute(c,l.value);if(null!==u&&"xmlns"!==c)if("data-mjx-"===c.substr(0,9))switch(c.substr(9)){case"alternate":t.setProperty("variantForm",!0);break;case"variant":t.attributes.set("mathvariant",u),o=!0;break;case"smallmatrix":t.setProperty("scriptlevel",1),t.setProperty("useHeight",!1);break;case"accent":t.setProperty("mathaccent","true"===u);break;case"auto-op":t.setProperty("autoOP","true"===u);break;case"script-align":t.setProperty("scriptalign",u)}else if("class"!==c){var p=u.toLowerCase();"true"===p||"false"===p?t.attributes.set(c,"true"===p):o&&"mathvariant"===c||t.attributes.set(c,u)}}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}},t.prototype.filterAttribute=function(t,e){return e},t.prototype.filterClassList=function(t){return t},t.prototype.addChildren=function(t,e){var r,n;if(0!==t.arity){var o=this.adaptor;try{for(var i=a(o.childNodes(e)),s=i.next();!s.done;s=i.next()){var l=s.value,c=o.kind(l);if("#comment"!==c)if("#text"===c)this.addText(t,l);else if(t.isKind("annotation-xml"))t.appendChild(this.factory.create("XML").setXML(l,o));else{var u=t.appendChild(this.makeNode(l));0===u.arity&&o.childNodes(l).length&&(this.options.fixMisplacedChildren?this.addChildren(t,l):u.mError("There should not be children for "+u.kind+" nodes",this.options.verify,!0))}}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}}},t.prototype.addText=function(t,e){var r=this.adaptor.value(e);(t.isToken||t.getProperty("isChars"))&&t.arity?(t.isToken&&(r=u.translate(r),r=this.trimSpace(r)),t.appendChild(this.factory.create("text").setText(r))):r.match(/\S/)&&this.error('Unexpected text node "'+r+'"')},t.prototype.checkClass=function(t,e){var r,n,o=[];try{for(var i=a(this.filterClassList(this.adaptor.allClasses(e))),s=i.next();!s.done;s=i.next()){var l=s.value;"MJX-"===l.substr(0,4)?"MJX-variant"===l?t.setProperty("variantForm",!0):"MJX-TeXAtom"!==l.substr(0,11)&&t.attributes.set("mathvariant",this.fixCalligraphic(l.substr(3))):o.push(l)}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}o.length&&t.attributes.set("class",o.join(" "))},t.prototype.fixCalligraphic=function(t){return t.replace(/caligraphic/,"calligraphic")},t.prototype.markMrows=function(t){if(t.isKind("mrow")&&!t.isInferred&&t.childNodes.length>=2){var e=t.childNodes[0],r=t.childNodes[t.childNodes.length-1];e.isKind("mo")&&e.attributes.get("fence")&&e.attributes.get("stretchy")&&r.isKind("mo")&&r.attributes.get("fence")&&r.attributes.get("stretchy")&&(e.childNodes.length&&t.setProperty("open",e.getText()),r.childNodes.length&&t.setProperty("close",r.getText()))}},t.prototype.trimSpace=function(t){return t.replace(/[\t\n\r]/g," ").replace(/^ +/,"").replace(/ +$/,"").replace(/ +/g," ")},t.prototype.error=function(t){throw new Error(t)},t.OPTIONS={MmlFactory:null,fixMisplacedChildren:!0,verify:n({},l.AbstractMmlNode.verifyDefaults),translateEntities:!0},t}();e.MathMLCompile=p},8462:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.TeX=void 0;var l=r(9206),c=r(7233),u=r(7073),p=a(r(4676)),h=a(r(1256)),f=a(r(8417)),d=a(r(3971)),m=a(r(8562)),y=r(6521),g=r(9899);r(2942);var b=function(t){function e(r){void 0===r&&(r={});var n=this,o=s((0,c.separateOptions)(r,e.OPTIONS,u.FindTeX.OPTIONS),3),i=o[0],a=o[1],l=o[2];(n=t.call(this,a)||this).findTeX=n.options.FindTeX||new u.FindTeX(l);var h=n.options.packages,f=n.configuration=e.configure(h),d=n._parseOptions=new m.default(f,[n.options,y.TagsFactory.OPTIONS]);return(0,c.userOptions)(d.options,i),f.config(n),e.tags(d,f),n.postFilters.add(p.default.cleanSubSup,-6),n.postFilters.add(p.default.setInherited,-5),n.postFilters.add(p.default.moveLimits,-4),n.postFilters.add(p.default.cleanStretchy,-3),n.postFilters.add(p.default.cleanAttributes,-2),n.postFilters.add(p.default.combineRelations,-1),n}return o(e,t),e.configure=function(t){var e=new g.ParserConfiguration(t,["tex"]);return e.init(),e},e.tags=function(t,e){y.TagsFactory.addTags(e.tags),y.TagsFactory.setDefault(t.options.tags),t.tags=y.TagsFactory.getDefault(),t.tags.configuration=t},e.prototype.setMmlFactory=function(e){t.prototype.setMmlFactory.call(this,e),this._parseOptions.nodeFactory.setMmlFactory(e)},Object.defineProperty(e.prototype,"parseOptions",{get:function(){return this._parseOptions},enumerable:!1,configurable:!0}),e.prototype.reset=function(t){void 0===t&&(t=0),this.parseOptions.tags.reset(t)},e.prototype.compile=function(t,e){this.parseOptions.clear(),this.executeFilters(this.preFilters,t,e,this.parseOptions);var r,n,o=t.display;this.latex=t.math,this.parseOptions.tags.startEquation(t);try{var i=new f.default(this.latex,{display:o,isInner:!1},this.parseOptions);r=i.mml(),n=i.stack.global}catch(t){if(!(t instanceof d.default))throw t;this.parseOptions.error=!0,r=this.options.formatError(this,t)}return r=this.parseOptions.nodeFactory.create("node","math",[r]),(null==n?void 0:n.indentalign)&&h.default.setAttribute(r,"indentalign",n.indentalign),o&&h.default.setAttribute(r,"display","block"),this.parseOptions.tags.finishEquation(t),this.parseOptions.root=r,this.executeFilters(this.postFilters,t,e,this.parseOptions),this.mathNode=this.parseOptions.root,this.mathNode},e.prototype.findMath=function(t){return this.findTeX.findMath(t)},e.prototype.formatError=function(t){var e=t.message.replace(/\n.*/,"");return this.parseOptions.nodeFactory.create("error",e,t.id,this.latex)},e.NAME="TeX",e.OPTIONS=i(i({},l.AbstractInputJax.OPTIONS),{FindTeX:null,packages:["base"],digits:/^(?:[0-9]+(?:\{,\}[0-9]{3})*(?:\.[0-9]*)?|\.[0-9]+)/,maxBuffer:5120,formatError:function(t,e){return t.formatError(e)}}),e}(l.AbstractInputJax);e.TeX=b},9899:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.ParserConfiguration=e.ConfigurationHandler=e.Configuration=void 0;var i,s=r(7233),a=r(2947),l=r(7525),c=r(8666),u=r(6521),p=function(){function t(t,e,r,n,o,i,s,a,l,c,u,p,h){void 0===e&&(e={}),void 0===r&&(r={}),void 0===n&&(n={}),void 0===o&&(o={}),void 0===i&&(i={}),void 0===s&&(s={}),void 0===a&&(a=[]),void 0===l&&(l=[]),void 0===c&&(c=null),void 0===u&&(u=null),this.name=t,this.handler=e,this.fallback=r,this.items=n,this.tags=o,this.options=i,this.nodes=s,this.preprocessors=a,this.postprocessors=l,this.initMethod=c,this.configMethod=u,this.priority=p,this.parser=h,this.handler=Object.assign({character:[],delimiter:[],macro:[],environment:[]},e)}return t.makeProcessor=function(t,e){return Array.isArray(t)?t:[t,e]},t._create=function(e,r){var n=this;void 0===r&&(r={});var o=r.priority||c.PrioritizedList.DEFAULTPRIORITY,i=r.init?this.makeProcessor(r.init,o):null,s=r.config?this.makeProcessor(r.config,o):null,a=(r.preprocessors||[]).map((function(t){return n.makeProcessor(t,o)})),l=(r.postprocessors||[]).map((function(t){return n.makeProcessor(t,o)})),u=r.parser||"tex";return new t(e,r.handler||{},r.fallback||{},r.items||{},r.tags||{},r.options||{},r.nodes||{},a,l,i,s,o,u)},t.create=function(e,r){void 0===r&&(r={});var n=t._create(e,r);return i.set(e,n),n},t.local=function(e){return void 0===e&&(e={}),t._create("",e)},Object.defineProperty(t.prototype,"init",{get:function(){return this.initMethod?this.initMethod[0]:null},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"config",{get:function(){return this.configMethod?this.configMethod[0]:null},enumerable:!1,configurable:!0}),t}();e.Configuration=p,function(t){var e=new Map;t.set=function(t,r){e.set(t,r)},t.get=function(t){return e.get(t)},t.keys=function(){return e.keys()}}(i=e.ConfigurationHandler||(e.ConfigurationHandler={}));var h=function(){function t(t,e){var r,o,i,s;void 0===e&&(e=["tex"]),this.initMethod=new l.FunctionList,this.configMethod=new l.FunctionList,this.configurations=new c.PrioritizedList,this.parsers=[],this.handlers=new a.SubHandlers,this.items={},this.tags={},this.options={},this.nodes={},this.parsers=e;try{for(var u=n(t.slice().reverse()),p=u.next();!p.done;p=u.next()){var h=p.value;this.addPackage(h)}}catch(t){r={error:t}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(r)throw r.error}}try{for(var f=n(this.configurations),d=f.next();!d.done;d=f.next()){var m=d.value,y=m.item,g=m.priority;this.append(y,g)}}catch(t){i={error:t}}finally{try{d&&!d.done&&(s=f.return)&&s.call(f)}finally{if(i)throw i.error}}}return t.prototype.init=function(){this.initMethod.execute(this)},t.prototype.config=function(t){var e,r;this.configMethod.execute(this,t);try{for(var o=n(this.configurations),i=o.next();!i.done;i=o.next()){var s=i.value;this.addFilters(t,s.item)}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},t.prototype.addPackage=function(t){var e="string"==typeof t?t:t[0],r=this.getPackage(e);r&&this.configurations.add(r,"string"==typeof t?r.priority:t[1])},t.prototype.add=function(t,e,r){var o,i;void 0===r&&(r={});var a=this.getPackage(t);this.append(a),this.configurations.add(a,a.priority),this.init();var l=e.parseOptions;l.nodeFactory.setCreators(a.nodes);try{for(var c=n(Object.keys(a.items)),p=c.next();!p.done;p=c.next()){var h=p.value;l.itemFactory.setNodeClass(h,a.items[h])}}catch(t){o={error:t}}finally{try{p&&!p.done&&(i=c.return)&&i.call(c)}finally{if(o)throw o.error}}u.TagsFactory.addTags(a.tags),(0,s.defaultOptions)(l.options,a.options),(0,s.userOptions)(l.options,r),this.addFilters(e,a),a.config&&a.config(this,e)},t.prototype.getPackage=function(t){var e=i.get(t);if(e&&this.parsers.indexOf(e.parser)<0)throw Error("Package ".concat(t," doesn't target the proper parser"));return e},t.prototype.append=function(t,e){e=e||t.priority,t.initMethod&&this.initMethod.add(t.initMethod[0],t.initMethod[1]),t.configMethod&&this.configMethod.add(t.configMethod[0],t.configMethod[1]),this.handlers.add(t.handler,t.fallback,e),Object.assign(this.items,t.items),Object.assign(this.tags,t.tags),(0,s.defaultOptions)(this.options,t.options),Object.assign(this.nodes,t.nodes)},t.prototype.addFilters=function(t,e){var r,i,s,a;try{for(var l=n(e.preprocessors),c=l.next();!c.done;c=l.next()){var u=o(c.value,2),p=u[0],h=u[1];t.preFilters.add(p,h)}}catch(t){r={error:t}}finally{try{c&&!c.done&&(i=l.return)&&i.call(l)}finally{if(r)throw r.error}}try{for(var f=n(e.postprocessors),d=f.next();!d.done;d=f.next()){var m=o(d.value,2),y=m[0];h=m[1];t.postFilters.add(y,h)}}catch(t){s={error:t}}finally{try{d&&!d.done&&(a=f.return)&&a.call(f)}finally{if(s)throw s.error}}},t}();e.ParserConfiguration=h},4676:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var i,s=r(9007),a=o(r(1256));!function(t){t.cleanStretchy=function(t){var e,r,o=t.data;try{for(var i=n(o.getList("fixStretchy")),s=i.next();!s.done;s=i.next()){var l=s.value;if(a.default.getProperty(l,"fixStretchy")){var c=a.default.getForm(l);c&&c[3]&&c[3].stretchy&&a.default.setAttribute(l,"stretchy",!1);var u=l.parent;if(!(a.default.getTexClass(l)||c&&c[2])){var p=o.nodeFactory.create("node","TeXAtom",[l]);u.replaceChild(p,l),p.inheritAttributesFrom(l)}a.default.removeProperties(l,"fixStretchy")}}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},t.cleanAttributes=function(t){t.data.root.walkTree((function(t,e){var r,o,i=t.attributes;if(i){var s=new Set((i.get("mjx-keep-attrs")||"").split(/ /));delete i.getAllAttributes()["mjx-keep-attrs"];try{for(var a=n(i.getExplicitNames()),l=a.next();!l.done;l=a.next()){var c=l.value;s.has(c)||i.attributes[c]!==t.attributes.getInherited(c)||delete i.attributes[c]}}catch(t){r={error:t}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(r)throw r.error}}}}),{})},t.combineRelations=function(t){var o,i,l,c,u=[];try{for(var p=n(t.data.getList("mo")),h=p.next();!h.done;h=p.next()){var f=h.value;if(!f.getProperty("relationsCombined")&&f.parent&&(!f.parent||a.default.isType(f.parent,"mrow"))&&a.default.getTexClass(f)===s.TEXCLASS.REL){for(var d=f.parent,m=void 0,y=d.childNodes,g=y.indexOf(f)+1,b=a.default.getProperty(f,"variantForm");g0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.FindTeX=void 0;var s=r(3494),a=r(505),l=r(4474),c=function(t){function e(e){var r=t.call(this,e)||this;return r.getPatterns(),r}return o(e,t),e.prototype.getPatterns=function(){var t=this,e=this.options,r=[],n=[],o=[];this.end={},this.env=this.sub=0;var i=1;e.inlineMath.forEach((function(e){return t.addPattern(r,e,!1)})),e.displayMath.forEach((function(e){return t.addPattern(r,e,!0)})),r.length&&n.push(r.sort(a.sortLength).join("|")),e.processEnvironments&&(n.push("\\\\begin\\s*\\{([^}]*)\\}"),this.env=i,i++),e.processEscapes&&o.push("\\\\([\\\\$])"),e.processRefs&&o.push("(\\\\(?:eq)?ref\\s*\\{[^}]*\\})"),o.length&&(n.push("("+o.join("|")+")"),this.sub=i),this.start=new RegExp(n.join("|"),"g"),this.hasPatterns=n.length>0},e.prototype.addPattern=function(t,e,r){var n=i(e,2),o=n[0],s=n[1];t.push((0,a.quotePattern)(o)),this.end[o]=[s,r,this.endPattern(s)]},e.prototype.endPattern=function(t,e){return new RegExp((e||(0,a.quotePattern)(t))+"|\\\\(?:[a-zA-Z]|.)|[{}]","g")},e.prototype.findEnd=function(t,e,r,n){for(var o,s=i(n,3),a=s[0],c=s[1],u=s[2],p=u.lastIndex=r.index+r[0].length,h=0;o=u.exec(t);){if((o[1]||o[0])===a&&0===h)return(0,l.protoItem)(r[0],t.substr(p,o.index-p),o[0],e,r.index,o.index+o[0].length,c);"{"===o[0]?h++:"}"===o[0]&&h&&h--}return null},e.prototype.findMathInString=function(t,e,r){var n,o;for(this.start.lastIndex=0;n=this.start.exec(r);){if(void 0!==n[this.env]&&this.env){var i="\\\\end\\s*(\\{"+(0,a.quotePattern)(n[this.env])+"\\})";(o=this.findEnd(r,e,n,["{"+n[this.env]+"}",!0,this.endPattern(null,i)]))&&(o.math=o.open+o.math+o.close,o.open=o.close="")}else if(void 0!==n[this.sub]&&this.sub){var s=n[this.sub];i=n.index+n[this.sub].length;o=2===s.length?(0,l.protoItem)("",s.substr(1),"",e,n.index,i):(0,l.protoItem)("",s,"",e,n.index,i,!1)}else o=this.findEnd(r,e,n,this.end[n[0]]);o&&(t.push(o),this.start.lastIndex=o.end.n)}},e.prototype.findMath=function(t){var e=[];if(this.hasPatterns)for(var r=0,n=t.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.SubHandlers=e.SubHandler=e.MapHandler=void 0;var i,s=r(8666),a=r(7525);!function(t){var e=new Map;t.register=function(t){e.set(t.name,t)},t.getMap=function(t){return e.get(t)}}(i=e.MapHandler||(e.MapHandler={}));var l=function(){function t(){this._configuration=new s.PrioritizedList,this._fallback=new a.FunctionList}return t.prototype.add=function(t,e,r){var o,a;void 0===r&&(r=s.PrioritizedList.DEFAULTPRIORITY);try{for(var l=n(t.slice().reverse()),c=l.next();!c.done;c=l.next()){var u=c.value,p=i.getMap(u);if(!p)return void this.warn("Configuration "+u+" not found! Omitted.");this._configuration.add(p,r)}}catch(t){o={error:t}}finally{try{c&&!c.done&&(a=l.return)&&a.call(l)}finally{if(o)throw o.error}}e&&this._fallback.add(e,r)},t.prototype.parse=function(t){var e,r;try{for(var i=n(this._configuration),s=i.next();!s.done;s=i.next()){var a=s.value.item.parse(t);if(a)return a}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}var l=o(t,2),c=l[0],u=l[1];Array.from(this._fallback)[0].item(c,u)},t.prototype.lookup=function(t){var e=this.applicable(t);return e?e.lookup(t):null},t.prototype.contains=function(t){return!!this.applicable(t)},t.prototype.toString=function(){var t,e,r=[];try{for(var o=n(this._configuration),i=o.next();!i.done;i=o.next()){var s=i.value.item;r.push(s.name)}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return r.join(", ")},t.prototype.applicable=function(t){var e,r;try{for(var o=n(this._configuration),i=o.next();!i.done;i=o.next()){var s=i.value.item;if(s.contains(t))return s}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},t.prototype.retrieve=function(t){var e,r;try{for(var o=n(this._configuration),i=o.next();!i.done;i=o.next()){var s=i.value.item;if(s.name===t)return s}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},t.prototype.warn=function(t){console.log("TexParser Warning: "+t)},t}();e.SubHandler=l;var c=function(){function t(){this.map=new Map}return t.prototype.add=function(t,e,r){var o,i;void 0===r&&(r=s.PrioritizedList.DEFAULTPRIORITY);try{for(var a=n(Object.keys(t)),c=a.next();!c.done;c=a.next()){var u=c.value,p=this.get(u);p||(p=new l,this.set(u,p)),p.add(t[u],e[u],r)}}catch(t){o={error:t}}finally{try{c&&!c.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}},t.prototype.set=function(t,e){this.map.set(t,e)},t.prototype.get=function(t){return this.map.get(t)},t.prototype.retrieve=function(t){var e,r;try{for(var o=n(this.map.values()),i=o.next();!i.done;i=o.next()){var s=i.value.retrieve(t);if(s)return s}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},t.prototype.keys=function(){return this.map.keys()},t}();e.SubHandlers=c},8929:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o1&&(r.autoOP=!1));var o=t.create("token","mi",r,e);t.Push(o)},t.digit=function(t,e){var r,n=t.configuration.options.digits,o=t.string.slice(t.i-1).match(n),i=c.default.getFontDef(t);o?(r=t.create("token","mn",i,o[0].replace(/[{}]/g,"")),t.i+=o[0].length-1):r=t.create("token","mo",i,e),t.Push(r)},t.controlSequence=function(t,e){var r=t.GetCS();t.parse("macro",[t,r])},t.mathchar0mi=function(t,e){var r=e.attributes||{mathvariant:l.TexConstant.Variant.ITALIC},n=t.create("token","mi",r,e.char);t.Push(n)},t.mathchar0mo=function(t,e){var r=e.attributes||{};r.stretchy=!1;var n=t.create("token","mo",r,e.char);a.default.setProperty(n,"fixStretchy",!0),t.configuration.addNode("fixStretchy",n),t.Push(n)},t.mathchar7=function(t,e){var r=e.attributes||{mathvariant:l.TexConstant.Variant.NORMAL};t.stack.env.font&&(r.mathvariant=t.stack.env.font);var n=t.create("token","mi",r,e.char);t.Push(n)},t.delimiter=function(t,e){var r=e.attributes||{};r=Object.assign({fence:!1,stretchy:!1},r);var n=t.create("token","mo",r,e.char);t.Push(n)},t.environment=function(t,e,r,i){var s=i[0],a=t.itemFactory.create("begin").setProperties({name:e,end:s});a=r.apply(void 0,o([t,a],n(i.slice(1)),!1)),t.Push(a)}}(s||(s={})),e.default=s},8562:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var a=s(r(5453)),l=r(8929),c=s(r(1256)),u=r(7233),p=function(){function t(t,e){void 0===e&&(e=[]),this.options={},this.packageData=new Map,this.parsers=[],this.root=null,this.nodeLists={},this.error=!1,this.handlers=t.handlers,this.nodeFactory=new l.NodeFactory,this.nodeFactory.configuration=this,this.nodeFactory.setCreators(t.nodes),this.itemFactory=new a.default(t.items),this.itemFactory.configuration=this,u.defaultOptions.apply(void 0,o([this.options],n(e),!1)),(0,u.defaultOptions)(this.options,t.options)}return t.prototype.pushParser=function(t){this.parsers.unshift(t)},t.prototype.popParser=function(){this.parsers.shift()},Object.defineProperty(t.prototype,"parser",{get:function(){return this.parsers[0]},enumerable:!1,configurable:!0}),t.prototype.clear=function(){this.parsers=[],this.root=null,this.nodeLists={},this.error=!1,this.tags.resetTag()},t.prototype.addNode=function(t,e){var r=this.nodeLists[t];if(r||(r=this.nodeLists[t]=[]),r.push(e),e.kind!==t){var n=c.default.getProperty(e,"in-lists")||"",o=(n?n.split(/,/):[]).concat(t).join(",");c.default.setProperty(e,"in-lists",o)}},t.prototype.getList=function(t){var e,r,n=this.nodeLists[t]||[],o=[];try{for(var s=i(n),a=s.next();!a.done;a=s.next()){var l=a.value;this.inTree(l)&&o.push(l)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}return this.nodeLists[t]=o,o},t.prototype.removeFromList=function(t,e){var r,n,o=this.nodeLists[t]||[];try{for(var s=i(e),a=s.next();!a.done;a=s.next()){var l=a.value,c=o.indexOf(l);c>=0&&o.splice(c,1)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}},t.prototype.inTree=function(t){for(;t&&t!==this.root;)t=t.parent;return!!t},t}();e.default=p},1130:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var s,a=r(9007),l=i(r(1256)),c=i(r(8417)),u=i(r(3971)),p=r(5368);!function(t){var e=7.2,r={em:function(t){return t},ex:function(t){return.43*t},pt:function(t){return t/10},pc:function(t){return 1.2*t},px:function(t){return t*e/72},in:function(t){return t*e},cm:function(t){return t*e/2.54},mm:function(t){return t*e/25.4},mu:function(t){return t/18}},i="([-+]?([.,]\\d+|\\d+([.,]\\d*)?))",s="(pt|em|ex|mu|px|mm|cm|in|pc)",h=RegExp("^\\s*"+i+"\\s*"+s+"\\s*$"),f=RegExp("^\\s*"+i+"\\s*"+s+" ?");function d(t,e){void 0===e&&(e=!1);var o=t.match(e?f:h);return o?function(t){var e=n(t,3),o=e[0],i=e[1],s=e[2];if("mu"!==i)return[o,i,s];return[m(r[i](parseFloat(o||"1"))).slice(0,-2),"em",s]}([o[1].replace(/,/,"."),o[4],o[0].length]):[null,null,0]}function m(t){return Math.abs(t)<6e-4?"0em":t.toFixed(3).replace(/\.?0+$/,"")+"em"}function y(t,e,r){"{"!==e&&"}"!==e||(e="\\"+e);var n="{\\bigg"+r+" "+e+"}",o="{\\big"+r+" "+e+"}";return new c.default("\\mathchoice"+n+o+o+o,{},t).mml()}function g(t,e,r){e=e.replace(/^\s+/,p.entities.nbsp).replace(/\s+$/,p.entities.nbsp);var n=t.create("text",e);return t.create("node","mtext",[],r,n)}function b(t,e,r){if(r.match(/^[a-z]/i)&&e.match(/(^|[^\\])(\\\\)*\\[a-z]+$/i)&&(e+=" "),e.length+r.length>t.configuration.options.maxBuffer)throw new u.default("MaxBufferSize","MathJax internal buffer size exceeded; is there a recursive macro call?");return e+r}function v(t,e){for(;e>0;)t=t.trim().slice(1,-1),e--;return t.trim()}function _(t,e){for(var r=t.length,n=0,o="",i=0,s=0,a=!0,l=!1;in&&(s=n)),n++;break;case"}":n&&n--,(a||l)&&(s--,l=!0),a=!1;break;default:if(!n&&-1!==e.indexOf(c))return[l?"true":v(o,s),c,t.slice(i)];a=!1,l=!1}o+=c}if(n)throw new u.default("ExtraOpenMissingClose","Extra open brace or missing close brace");return[l?"true":v(o,s),"",t.slice(i)]}t.matchDimen=d,t.dimen2em=function(t){var e=n(d(t),2),o=e[0],i=e[1],s=parseFloat(o||"1"),a=r[i];return a?a(s):0},t.Em=m,t.cols=function(){for(var t=[],e=0;e1&&(l=[t.create("node","mrow",l)]),l},t.internalText=g,t.underOver=function(e,r,n,o,i){if(t.checkMovableLimits(r),l.default.isType(r,"munderover")&&l.default.isEmbellished(r)){l.default.setProperties(l.default.getCoreMO(r),{lspace:0,rspace:0});var s=e.create("node","mo",[],{rspace:0});r=e.create("node","mrow",[s,r])}var c=e.create("node","munderover",[r]);l.default.setChild(c,"over"===o?c.over:c.under,n);var u=c;return i&&(u=e.create("node","TeXAtom",[c],{texClass:a.TEXCLASS.OP,movesupsub:!0})),l.default.setProperty(u,"subsupOK",!0),u},t.checkMovableLimits=function(t){var e=l.default.isType(t,"mo")?l.default.getForm(t):null;(l.default.getProperty(t,"movablelimits")||e&&e[3]&&e[3].movablelimits)&&l.default.setProperties(t,{movablelimits:!1})},t.trimSpaces=function(t){if("string"!=typeof t)return t;var e=t.trim();return e.match(/\\$/)&&t.match(/ $/)&&(e+=" "),e},t.setArrayAlign=function(e,r){return"t"===(r=t.trimSpaces(r||""))?e.arraydef.align="baseline 1":"b"===r?e.arraydef.align="baseline -1":"c"===r?e.arraydef.align="axis":r&&(e.arraydef.align=r),e},t.substituteArgs=function(t,e,r){for(var n="",o="",i=0;ie.length)throw new u.default("IllegalMacroParam","Illegal macro parameter reference");o=b(t,b(t,o,n),e[parseInt(s,10)-1]),n=""}else n+=s}return b(t,o,n)},t.addArgs=b,t.checkMaxMacros=function(t,e){if(void 0===e&&(e=!0),!(++t.macroCount<=t.configuration.options.maxMacros))throw e?new u.default("MaxMacroSub1","MathJax maximum macro substitution count exceeded; is here a recursive macro call?"):new u.default("MaxMacroSub2","MathJax maximum substitution count exceeded; is there a recursive latex environment?")},t.checkEqnEnv=function(t){if(t.stack.global.eqnenv)throw new u.default("ErroneousNestingEq","Erroneous nesting of equation structures");t.stack.global.eqnenv=!0},t.copyNode=function(t,e){var r=t.copy(),n=e.configuration;return r.walkTree((function(t){var e,r;n.addNode(t.kind,t);var i=(t.getProperty("in-lists")||"").split(/,/);try{for(var s=o(i),a=s.next();!a.done;a=s.next()){var l=a.value;l&&n.addNode(l,t)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}})),r},t.MmlFilterAttribute=function(t,e,r){return r},t.getFontDef=function(t){var e=t.stack.env.font;return e?{mathvariant:e}:{}},t.keyvalOptions=function(t,e,r){var i,s;void 0===e&&(e=null),void 0===r&&(r=!1);var a=function(t){var e,r,o,i,s,a={},l=t;for(;l;)i=(e=n(_(l,["=",","]),3))[0],o=e[1],l=e[2],"="===o?(s=(r=n(_(l,[","]),3))[0],o=r[1],l=r[2],s="false"===s||"true"===s?JSON.parse(s):s,a[i]=s):i&&(a[i]=!0);return a}(t);if(e)try{for(var l=o(Object.keys(a)),c=l.next();!c.done;c=l.next()){var p=c.value;if(!e.hasOwnProperty(p)){if(r)throw new u.default("InvalidOption","Invalid option: %1",p);delete a[p]}}}catch(t){i={error:t}}finally{try{c&&!c.done&&(s=l.return)&&s.call(l)}finally{if(i)throw i.error}}return a}}(s||(s={})),e.default=s},9497:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.BaseItem=e.MmlStack=void 0;var c=l(r(3971)),u=function(){function t(t){this._nodes=t}return Object.defineProperty(t.prototype,"nodes",{get:function(){return this._nodes},enumerable:!1,configurable:!0}),t.prototype.Push=function(){for(var t,e=[],r=0;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.TagsFactory=e.AllTags=e.NoTags=e.AbstractTags=e.TagInfo=e.Label=void 0;var a=s(r(8417)),l=function(t,e){void 0===t&&(t="???"),void 0===e&&(e=""),this.tag=t,this.id=e};e.Label=l;var c=function(t,e,r,n,o,i,s,a){void 0===t&&(t=""),void 0===e&&(e=!1),void 0===r&&(r=!1),void 0===n&&(n=null),void 0===o&&(o=""),void 0===i&&(i=""),void 0===s&&(s=!1),void 0===a&&(a=""),this.env=t,this.taggable=e,this.defaultTags=r,this.tag=n,this.tagId=o,this.tagFormat=i,this.noTag=s,this.labelId=a};e.TagInfo=c;var u=function(){function t(){this.counter=0,this.allCounter=0,this.configuration=null,this.ids={},this.allIds={},this.labels={},this.allLabels={},this.redo=!1,this.refUpdate=!1,this.currentTag=new c,this.history=[],this.stack=[],this.enTag=function(t,e){var r=this.configuration.nodeFactory,n=r.create("node","mtd",[t]),o=r.create("node","mlabeledtr",[e,n]);return r.create("node","mtable",[o],{side:this.configuration.options.tagSide,minlabelspacing:this.configuration.options.tagIndent,displaystyle:!0})}}return t.prototype.start=function(t,e,r){this.currentTag&&this.stack.push(this.currentTag),this.currentTag=new c(t,e,r)},Object.defineProperty(t.prototype,"env",{get:function(){return this.currentTag.env},enumerable:!1,configurable:!0}),t.prototype.end=function(){this.history.push(this.currentTag),this.currentTag=this.stack.pop()},t.prototype.tag=function(t,e){this.currentTag.tag=t,this.currentTag.tagFormat=e?t:this.formatTag(t),this.currentTag.noTag=!1},t.prototype.notag=function(){this.tag("",!0),this.currentTag.noTag=!0},Object.defineProperty(t.prototype,"noTag",{get:function(){return this.currentTag.noTag},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"label",{get:function(){return this.currentTag.labelId},set:function(t){this.currentTag.labelId=t},enumerable:!1,configurable:!0}),t.prototype.formatUrl=function(t,e){return e+"#"+encodeURIComponent(t)},t.prototype.formatTag=function(t){return"("+t+")"},t.prototype.formatId=function(t){return"mjx-eqn:"+t.replace(/\s/g,"_")},t.prototype.formatNumber=function(t){return t.toString()},t.prototype.autoTag=function(){null==this.currentTag.tag&&(this.counter++,this.tag(this.formatNumber(this.counter),!1))},t.prototype.clearTag=function(){this.label="",this.tag(null,!0),this.currentTag.tagId=""},t.prototype.getTag=function(t){if(void 0===t&&(t=!1),t)return this.autoTag(),this.makeTag();var e=this.currentTag;return e.taggable&&!e.noTag&&(e.defaultTags&&this.autoTag(),e.tag)?this.makeTag():null},t.prototype.resetTag=function(){this.history=[],this.redo=!1,this.refUpdate=!1,this.clearTag()},t.prototype.reset=function(t){void 0===t&&(t=0),this.resetTag(),this.counter=this.allCounter=t,this.allLabels={},this.allIds={}},t.prototype.startEquation=function(t){this.history=[],this.stack=[],this.clearTag(),this.currentTag=new c("",void 0,void 0),this.labels={},this.ids={},this.counter=this.allCounter,this.redo=!1;var e=t.inputData.recompile;e&&(this.refUpdate=!0,this.counter=e.counter)},t.prototype.finishEquation=function(t){this.redo&&(t.inputData.recompile={state:t.state(),counter:this.allCounter}),this.refUpdate||(this.allCounter=this.counter),Object.assign(this.allIds,this.ids),Object.assign(this.allLabels,this.labels)},t.prototype.finalize=function(t,e){if(!e.display||this.currentTag.env||null==this.currentTag.tag)return t;var r=this.makeTag();return this.enTag(t,r)},t.prototype.makeId=function(){this.currentTag.tagId=this.formatId(this.configuration.options.useLabelIds&&this.label||this.currentTag.tag)},t.prototype.makeTag=function(){this.makeId(),this.label&&(this.labels[this.label]=new l(this.currentTag.tag,this.currentTag.tagId));var t=new a.default("\\text{"+this.currentTag.tagFormat+"}",{},this.configuration).mml();return this.configuration.nodeFactory.create("node","mtd",[t],{id:this.currentTag.tagId})},t}();e.AbstractTags=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.autoTag=function(){},e.prototype.getTag=function(){return this.currentTag.tag?t.prototype.getTag.call(this):null},e}(u);e.NoTags=p;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.finalize=function(t,e){if(!e.display||this.history.find((function(t){return t.taggable})))return t;var r=this.getTag(!0);return this.enTag(t,r)},e}(u);e.AllTags=h,function(t){var e=new Map([["none",p],["all",h]]),r="none";t.OPTIONS={tags:r,tagSide:"right",tagIndent:"0.8em",useLabelIds:!0,ignoreDuplicateLabels:!1},t.add=function(t,r){e.set(t,r)},t.addTags=function(e){var r,n;try{for(var o=i(Object.keys(e)),s=o.next();!s.done;s=o.next()){var a=s.value;t.add(a,e[a])}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},t.create=function(t){var n=e.get(t)||e.get(r);if(!n)throw Error("Unknown tags class");return new n},t.setDefault=function(t){r=t},t.getDefault=function(){return t.create(r)}}(e.TagsFactory||(e.TagsFactory={}))},8317:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.TexConstant=void 0,function(t){t.Variant={NORMAL:"normal",BOLD:"bold",ITALIC:"italic",BOLDITALIC:"bold-italic",DOUBLESTRUCK:"double-struck",FRAKTUR:"fraktur",BOLDFRAKTUR:"bold-fraktur",SCRIPT:"script",BOLDSCRIPT:"bold-script",SANSSERIF:"sans-serif",BOLDSANSSERIF:"bold-sans-serif",SANSSERIFITALIC:"sans-serif-italic",SANSSERIFBOLDITALIC:"sans-serif-bold-italic",MONOSPACE:"monospace",INITIAL:"inital",TAILED:"tailed",LOOPED:"looped",STRETCHED:"stretched",CALLIGRAPHIC:"-tex-calligraphic",BOLDCALLIGRAPHIC:"-tex-bold-calligraphic",OLDSTYLE:"-tex-oldstyle",BOLDOLDSTYLE:"-tex-bold-oldstyle",MATHITALIC:"-tex-mathit"},t.Form={PREFIX:"prefix",INFIX:"infix",POSTFIX:"postfix"},t.LineBreak={AUTO:"auto",NEWLINE:"newline",NOBREAK:"nobreak",GOODBREAK:"goodbreak",BADBREAK:"badbreak"},t.LineBreakStyle={BEFORE:"before",AFTER:"after",DUPLICATE:"duplicate",INFIXLINBREAKSTYLE:"infixlinebreakstyle"},t.IndentAlign={LEFT:"left",CENTER:"center",RIGHT:"right",AUTO:"auto",ID:"id",INDENTALIGN:"indentalign"},t.IndentShift={INDENTSHIFT:"indentshift"},t.LineThickness={THIN:"thin",MEDIUM:"medium",THICK:"thick"},t.Notation={LONGDIV:"longdiv",ACTUARIAL:"actuarial",PHASORANGLE:"phasorangle",RADICAL:"radical",BOX:"box",ROUNDEDBOX:"roundedbox",CIRCLE:"circle",LEFT:"left",RIGHT:"right",TOP:"top",BOTTOM:"bottom",UPDIAGONALSTRIKE:"updiagonalstrike",DOWNDIAGONALSTRIKE:"downdiagonalstrike",VERTICALSTRIKE:"verticalstrike",HORIZONTALSTRIKE:"horizontalstrike",NORTHEASTARROW:"northeastarrow",MADRUWB:"madruwb",UPDIAGONALARROW:"updiagonalarrow"},t.Align={TOP:"top",BOTTOM:"bottom",CENTER:"center",BASELINE:"baseline",AXIS:"axis",LEFT:"left",RIGHT:"right"},t.Lines={NONE:"none",SOLID:"solid",DASHED:"dashed"},t.Side={LEFT:"left",RIGHT:"right",LEFTOVERLAP:"leftoverlap",RIGHTOVERLAP:"rightoverlap"},t.Width={AUTO:"auto",FIT:"fit"},t.Actiontype={TOGGLE:"toggle",STATUSLINE:"statusline",TOOLTIP:"tooltip",INPUT:"input"},t.Overflow={LINBREAK:"linebreak",SCROLL:"scroll",ELIDE:"elide",TRUNCATE:"truncate",SCALE:"scale"},t.Unit={EM:"em",EX:"ex",PX:"px",IN:"in",CM:"cm",MM:"mm",PT:"pt",PC:"pc"}}(e.TexConstant||(e.TexConstant={}))},3971:function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(e,r){for(var n=[],o=2;o="0"&&s<="9")n[o]=r[parseInt(n[o],10)-1],"number"==typeof n[o]&&(n[o]=n[o].toString());else if("{"===s){if((s=n[o].substr(1))>="0"&&s<="9")n[o]=r[parseInt(n[o].substr(1,n[o].length-2),10)-1],"number"==typeof n[o]&&(n[o]=n[o].toString());else n[o].match(/^\{([a-z]+):%(\d+)\|(.*)\}$/)&&(n[o]="%"+n[o])}null==n[o]&&(n[o]="???")}return n.join("")},t.pattern=/%(\d+|\{\d+\}|\{[a-z]+:\%\d+(?:\|(?:%\{\d+\}|%.|[^\}])*)+\}|.)/g,t}();e.default=r},8417:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;oe)throw new u.default("XalignOverflow","Extra %1 in row of %2","&",this.name)},e.prototype.EndRow=function(){for(var e,r=this.row,n=this.getProperty("xalignat");r.lengththis.maxrow&&(this.maxrow=this.row.length),t.prototype.EndRow.call(this);var o=this.table[this.table.length-1];if(this.getProperty("zeroWidthLabel")&&o.isKind("mlabeledtr")){var s=c.default.getChildren(o)[0],a=this.factory.configuration.options.tagSide,l=i({width:0},"right"===a?{lspace:"-1width"}:{}),u=this.create("node","mpadded",c.default.getChildren(s),l);s.setChildren([u])}},e.prototype.EndTable=function(){(t.prototype.EndTable.call(this),this.center)&&(this.maxrow<=2&&(delete this.arraydef.width,delete this.global.indentalign))},e}(a.EqnArrayItem);e.FlalignItem=f},7379:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return o(e,t),e},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var a=r(4387),l=i(r(9140)),c=r(8317),u=s(r(5450)),p=s(r(1130)),h=r(9007),f=r(6010);new l.CharacterMap("AMSmath-mathchar0mo",u.default.mathchar0mo,{iiiint:["\u2a0c",{texClass:h.TEXCLASS.OP}]}),new l.RegExpMap("AMSmath-operatorLetter",a.AmsMethods.operatorLetter,/[-*]/i),new l.CommandMap("AMSmath-macros",{mathring:["Accent","02DA"],nobreakspace:"Tilde",negmedspace:["Spacer",f.MATHSPACE.negativemediummathspace],negthickspace:["Spacer",f.MATHSPACE.negativethickmathspace],idotsint:["MultiIntegral","\\int\\cdots\\int"],dddot:["Accent","20DB"],ddddot:["Accent","20DC"],sideset:"SideSet",boxed:["Macro","\\fbox{$\\displaystyle{#1}$}",1],tag:"HandleTag",notag:"HandleNoTag",eqref:["HandleRef",!0],substack:["Macro","\\begin{subarray}{c}#1\\end{subarray}",1],injlim:["NamedOp","inj lim"],projlim:["NamedOp","proj lim"],varliminf:["Macro","\\mathop{\\underline{\\mmlToken{mi}{lim}}}"],varlimsup:["Macro","\\mathop{\\overline{\\mmlToken{mi}{lim}}}"],varinjlim:["Macro","\\mathop{\\underrightarrow{\\mmlToken{mi}{lim}}}"],varprojlim:["Macro","\\mathop{\\underleftarrow{\\mmlToken{mi}{lim}}}"],DeclareMathOperator:"HandleDeclareOp",operatorname:"HandleOperatorName",genfrac:"Genfrac",frac:["Genfrac","","","",""],tfrac:["Genfrac","","","","1"],dfrac:["Genfrac","","","","0"],binom:["Genfrac","(",")","0",""],tbinom:["Genfrac","(",")","0","1"],dbinom:["Genfrac","(",")","0","0"],cfrac:"CFrac",shoveleft:["HandleShove",c.TexConstant.Align.LEFT],shoveright:["HandleShove",c.TexConstant.Align.RIGHT],xrightarrow:["xArrow",8594,5,10],xleftarrow:["xArrow",8592,10,5]},a.AmsMethods),new l.EnvironmentMap("AMSmath-environment",u.default.environment,{"equation*":["Equation",null,!1],"eqnarray*":["EqnArray",null,!1,!0,"rcl",p.default.cols(0,f.MATHSPACE.thickmathspace),".5em"],align:["EqnArray",null,!0,!0,"rl",p.default.cols(0,2)],"align*":["EqnArray",null,!1,!0,"rl",p.default.cols(0,2)],multline:["Multline",null,!0],"multline*":["Multline",null,!1],split:["EqnArray",null,!1,!1,"rl",p.default.cols(0)],gather:["EqnArray",null,!0,!0,"c"],"gather*":["EqnArray",null,!1,!0,"c"],alignat:["AlignAt",null,!0,!0],"alignat*":["AlignAt",null,!1,!0],alignedat:["AlignAt",null,!1,!1],aligned:["AmsEqnArray",null,null,null,"rl",p.default.cols(0,2),".5em","D"],gathered:["AmsEqnArray",null,null,null,"c",null,".5em","D"],xalignat:["XalignAt",null,!0,!0],"xalignat*":["XalignAt",null,!1,!0],xxalignat:["XalignAt",null,!1,!1],flalign:["FlalignArray",null,!0,!1,!0,"rlc","auto auto fit"],"flalign*":["FlalignArray",null,!1,!1,!0,"rlc","auto auto fit"],subarray:["Array",null,null,null,null,p.default.cols(0),"0.1em","S",1],smallmatrix:["Array",null,null,null,"c",p.default.cols(1/3),".2em","S",1],matrix:["Array",null,null,null,"c"],pmatrix:["Array",null,"(",")","c"],bmatrix:["Array",null,"[","]","c"],Bmatrix:["Array",null,"\\{","\\}","c"],vmatrix:["Array",null,"\\vert","\\vert","c"],Vmatrix:["Array",null,"\\Vert","\\Vert","c"],cases:["Array",null,"\\{",".","ll",null,".2em","T"]},a.AmsMethods),new l.DelimiterMap("AMSmath-delimiter",u.default.delimiter,{"\\lvert":["|",{texClass:h.TEXCLASS.OPEN}],"\\rvert":["|",{texClass:h.TEXCLASS.CLOSE}],"\\lVert":["\u2016",{texClass:h.TEXCLASS.OPEN}],"\\rVert":["\u2016",{texClass:h.TEXCLASS.CLOSE}]}),new l.CharacterMap("AMSsymbols-mathchar0mi",u.default.mathchar0mi,{digamma:"\u03dd",varkappa:"\u03f0",varGamma:["\u0393",{mathvariant:c.TexConstant.Variant.ITALIC}],varDelta:["\u0394",{mathvariant:c.TexConstant.Variant.ITALIC}],varTheta:["\u0398",{mathvariant:c.TexConstant.Variant.ITALIC}],varLambda:["\u039b",{mathvariant:c.TexConstant.Variant.ITALIC}],varXi:["\u039e",{mathvariant:c.TexConstant.Variant.ITALIC}],varPi:["\u03a0",{mathvariant:c.TexConstant.Variant.ITALIC}],varSigma:["\u03a3",{mathvariant:c.TexConstant.Variant.ITALIC}],varUpsilon:["\u03a5",{mathvariant:c.TexConstant.Variant.ITALIC}],varPhi:["\u03a6",{mathvariant:c.TexConstant.Variant.ITALIC}],varPsi:["\u03a8",{mathvariant:c.TexConstant.Variant.ITALIC}],varOmega:["\u03a9",{mathvariant:c.TexConstant.Variant.ITALIC}],beth:"\u2136",gimel:"\u2137",daleth:"\u2138",backprime:["\u2035",{variantForm:!0}],hslash:"\u210f",varnothing:["\u2205",{variantForm:!0}],blacktriangle:"\u25b4",triangledown:["\u25bd",{variantForm:!0}],blacktriangledown:"\u25be",square:"\u25fb",Box:"\u25fb",blacksquare:"\u25fc",lozenge:"\u25ca",Diamond:"\u25ca",blacklozenge:"\u29eb",circledS:["\u24c8",{mathvariant:c.TexConstant.Variant.NORMAL}],bigstar:"\u2605",sphericalangle:"\u2222",measuredangle:"\u2221",nexists:"\u2204",complement:"\u2201",mho:"\u2127",eth:["\xf0",{mathvariant:c.TexConstant.Variant.NORMAL}],Finv:"\u2132",diagup:"\u2571",Game:"\u2141",diagdown:"\u2572",Bbbk:["k",{mathvariant:c.TexConstant.Variant.DOUBLESTRUCK}],yen:"\xa5",circledR:"\xae",checkmark:"\u2713",maltese:"\u2720"}),new l.CharacterMap("AMSsymbols-mathchar0mo",u.default.mathchar0mo,{dotplus:"\u2214",ltimes:"\u22c9",smallsetminus:["\u2216",{variantForm:!0}],rtimes:"\u22ca",Cap:"\u22d2",doublecap:"\u22d2",leftthreetimes:"\u22cb",Cup:"\u22d3",doublecup:"\u22d3",rightthreetimes:"\u22cc",barwedge:"\u22bc",curlywedge:"\u22cf",veebar:"\u22bb",curlyvee:"\u22ce",doublebarwedge:"\u2a5e",boxminus:"\u229f",circleddash:"\u229d",boxtimes:"\u22a0",circledast:"\u229b",boxdot:"\u22a1",circledcirc:"\u229a",boxplus:"\u229e",centerdot:["\u22c5",{variantForm:!0}],divideontimes:"\u22c7",intercal:"\u22ba",leqq:"\u2266",geqq:"\u2267",leqslant:"\u2a7d",geqslant:"\u2a7e",eqslantless:"\u2a95",eqslantgtr:"\u2a96",lesssim:"\u2272",gtrsim:"\u2273",lessapprox:"\u2a85",gtrapprox:"\u2a86",approxeq:"\u224a",lessdot:"\u22d6",gtrdot:"\u22d7",lll:"\u22d8",llless:"\u22d8",ggg:"\u22d9",gggtr:"\u22d9",lessgtr:"\u2276",gtrless:"\u2277",lesseqgtr:"\u22da",gtreqless:"\u22db",lesseqqgtr:"\u2a8b",gtreqqless:"\u2a8c",doteqdot:"\u2251",Doteq:"\u2251",eqcirc:"\u2256",risingdotseq:"\u2253",circeq:"\u2257",fallingdotseq:"\u2252",triangleq:"\u225c",backsim:"\u223d",thicksim:["\u223c",{variantForm:!0}],backsimeq:"\u22cd",thickapprox:["\u2248",{variantForm:!0}],subseteqq:"\u2ac5",supseteqq:"\u2ac6",Subset:"\u22d0",Supset:"\u22d1",sqsubset:"\u228f",sqsupset:"\u2290",preccurlyeq:"\u227c",succcurlyeq:"\u227d",curlyeqprec:"\u22de",curlyeqsucc:"\u22df",precsim:"\u227e",succsim:"\u227f",precapprox:"\u2ab7",succapprox:"\u2ab8",vartriangleleft:"\u22b2",lhd:"\u22b2",vartriangleright:"\u22b3",rhd:"\u22b3",trianglelefteq:"\u22b4",unlhd:"\u22b4",trianglerighteq:"\u22b5",unrhd:"\u22b5",vDash:["\u22a8",{variantForm:!0}],Vdash:"\u22a9",Vvdash:"\u22aa",smallsmile:["\u2323",{variantForm:!0}],shortmid:["\u2223",{variantForm:!0}],smallfrown:["\u2322",{variantForm:!0}],shortparallel:["\u2225",{variantForm:!0}],bumpeq:"\u224f",between:"\u226c",Bumpeq:"\u224e",pitchfork:"\u22d4",varpropto:["\u221d",{variantForm:!0}],backepsilon:"\u220d",blacktriangleleft:"\u25c2",blacktriangleright:"\u25b8",therefore:"\u2234",because:"\u2235",eqsim:"\u2242",vartriangle:["\u25b3",{variantForm:!0}],Join:"\u22c8",nless:"\u226e",ngtr:"\u226f",nleq:"\u2270",ngeq:"\u2271",nleqslant:["\u2a87",{variantForm:!0}],ngeqslant:["\u2a88",{variantForm:!0}],nleqq:["\u2270",{variantForm:!0}],ngeqq:["\u2271",{variantForm:!0}],lneq:"\u2a87",gneq:"\u2a88",lneqq:"\u2268",gneqq:"\u2269",lvertneqq:["\u2268",{variantForm:!0}],gvertneqq:["\u2269",{variantForm:!0}],lnsim:"\u22e6",gnsim:"\u22e7",lnapprox:"\u2a89",gnapprox:"\u2a8a",nprec:"\u2280",nsucc:"\u2281",npreceq:["\u22e0",{variantForm:!0}],nsucceq:["\u22e1",{variantForm:!0}],precneqq:"\u2ab5",succneqq:"\u2ab6",precnsim:"\u22e8",succnsim:"\u22e9",precnapprox:"\u2ab9",succnapprox:"\u2aba",nsim:"\u2241",ncong:"\u2247",nshortmid:["\u2224",{variantForm:!0}],nshortparallel:["\u2226",{variantForm:!0}],nmid:"\u2224",nparallel:"\u2226",nvdash:"\u22ac",nvDash:"\u22ad",nVdash:"\u22ae",nVDash:"\u22af",ntriangleleft:"\u22ea",ntriangleright:"\u22eb",ntrianglelefteq:"\u22ec",ntrianglerighteq:"\u22ed",nsubseteq:"\u2288",nsupseteq:"\u2289",nsubseteqq:["\u2288",{variantForm:!0}],nsupseteqq:["\u2289",{variantForm:!0}],subsetneq:"\u228a",supsetneq:"\u228b",varsubsetneq:["\u228a",{variantForm:!0}],varsupsetneq:["\u228b",{variantForm:!0}],subsetneqq:"\u2acb",supsetneqq:"\u2acc",varsubsetneqq:["\u2acb",{variantForm:!0}],varsupsetneqq:["\u2acc",{variantForm:!0}],leftleftarrows:"\u21c7",rightrightarrows:"\u21c9",leftrightarrows:"\u21c6",rightleftarrows:"\u21c4",Lleftarrow:"\u21da",Rrightarrow:"\u21db",twoheadleftarrow:"\u219e",twoheadrightarrow:"\u21a0",leftarrowtail:"\u21a2",rightarrowtail:"\u21a3",looparrowleft:"\u21ab",looparrowright:"\u21ac",leftrightharpoons:"\u21cb",rightleftharpoons:["\u21cc",{variantForm:!0}],curvearrowleft:"\u21b6",curvearrowright:"\u21b7",circlearrowleft:"\u21ba",circlearrowright:"\u21bb",Lsh:"\u21b0",Rsh:"\u21b1",upuparrows:"\u21c8",downdownarrows:"\u21ca",upharpoonleft:"\u21bf",upharpoonright:"\u21be",downharpoonleft:"\u21c3",restriction:"\u21be",multimap:"\u22b8",downharpoonright:"\u21c2",leftrightsquigarrow:"\u21ad",rightsquigarrow:"\u21dd",leadsto:"\u21dd",dashrightarrow:"\u21e2",dashleftarrow:"\u21e0",nleftarrow:"\u219a",nrightarrow:"\u219b",nLeftarrow:"\u21cd",nRightarrow:"\u21cf",nleftrightarrow:"\u21ae",nLeftrightarrow:"\u21ce"}),new l.DelimiterMap("AMSsymbols-delimiter",u.default.delimiter,{"\\ulcorner":"\u231c","\\urcorner":"\u231d","\\llcorner":"\u231e","\\lrcorner":"\u231f"}),new l.CommandMap("AMSsymbols-macros",{implies:["Macro","\\;\\Longrightarrow\\;"],impliedby:["Macro","\\;\\Longleftarrow\\;"]},a.AmsMethods)},4387:function(t,e,r){var n=this&&this.__assign||function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.NEW_OPS=e.AmsMethods=void 0;var s=i(r(1130)),a=i(r(5450)),l=i(r(1256)),c=r(8317),u=i(r(8417)),p=i(r(3971)),h=r(8803),f=i(r(7693)),d=r(9007);function m(t){if(!t||t.isInferred&&0===t.childNodes.length)return[null,null];if(t.isKind("msubsup")&&y(t))return[t,null];var e=l.default.getChildAt(t,0);return t.isInferred&&e&&y(e)?(t.childNodes.splice(0,1),[e,t]):[null,t]}function y(t){var e=t.childNodes[0];return e&&e.isKind("mi")&&""===e.getText()}e.AmsMethods={},e.AmsMethods.AmsEqnArray=function(t,e,r,n,o,i,a){var l=t.GetBrackets("\\begin{"+e.getName()+"}"),c=f.default.EqnArray(t,e,r,n,o,i,a);return s.default.setArrayAlign(c,l)},e.AmsMethods.AlignAt=function(t,r,n,o){var i,a,l=r.getName(),c="",u=[];if(o||(a=t.GetBrackets("\\begin{"+l+"}")),(i=t.GetArgument("\\begin{"+l+"}")).match(/[^0-9]/))throw new p.default("PositiveIntegerArg","Argument to %1 must me a positive integer","\\begin{"+l+"}");for(var h=parseInt(i,10);h>0;)c+="rl",u.push("0em 0em"),h--;var f=u.join(" ");if(o)return e.AmsMethods.EqnArray(t,r,n,o,c,f);var d=e.AmsMethods.EqnArray(t,r,n,o,c,f);return s.default.setArrayAlign(d,a)},e.AmsMethods.Multline=function(t,e,r){t.Push(e),s.default.checkEqnEnv(t);var n=t.itemFactory.create("multline",r,t.stack);return n.arraydef={displaystyle:!0,rowspacing:".5em",columnspacing:"100%",width:t.options.ams.multlineWidth,side:t.options.tagSide,minlabelspacing:t.options.tagIndent,framespacing:t.options.ams.multlineIndent+" 0",frame:"","data-width-includes-label":!0},n},e.AmsMethods.XalignAt=function(t,r,n,o){var i=t.GetArgument("\\begin{"+r.getName()+"}");if(i.match(/[^0-9]/))throw new p.default("PositiveIntegerArg","Argument to %1 must me a positive integer","\\begin{"+r.getName()+"}");var s=o?"crl":"rlc",a=o?"fit auto auto":"auto auto fit",l=e.AmsMethods.FlalignArray(t,r,n,o,!1,s,a,!0);return l.setProperty("xalignat",2*parseInt(i)),l},e.AmsMethods.FlalignArray=function(t,e,r,n,o,i,a,l){void 0===l&&(l=!1),t.Push(e),s.default.checkEqnEnv(t),i=i.split("").join(" ").replace(/r/g,"right").replace(/l/g,"left").replace(/c/g,"center");var c=t.itemFactory.create("flalign",e.getName(),r,n,o,t.stack);return c.arraydef={width:"100%",displaystyle:!0,columnalign:i,columnspacing:"0em",columnwidth:a,rowspacing:"3pt",side:t.options.tagSide,minlabelspacing:l?"0":t.options.tagIndent,"data-width-includes-label":!0},c.setProperty("zeroWidthLabel",l),c},e.NEW_OPS="ams-declare-ops",e.AmsMethods.HandleDeclareOp=function(t,r){var n=t.GetStar()?"*":"",o=s.default.trimSpaces(t.GetArgument(r));"\\"===o.charAt(0)&&(o=o.substr(1));var i=t.GetArgument(r);t.configuration.handlers.retrieve(e.NEW_OPS).add(o,new h.Macro(o,e.AmsMethods.Macro,["\\operatorname".concat(n,"{").concat(i,"}")]))},e.AmsMethods.HandleOperatorName=function(t,e){var r=t.GetStar(),o=s.default.trimSpaces(t.GetArgument(e)),i=new u.default(o,n(n({},t.stack.env),{font:c.TexConstant.Variant.NORMAL,multiLetterIdentifiers:/^[-*a-z]+/i,operatorLetters:!0}),t.configuration).mml();if(i.isKind("mi")||(i=t.create("node","TeXAtom",[i])),l.default.setProperties(i,{movesupsub:r,movablelimits:!0,texClass:d.TEXCLASS.OP}),!r){var a=t.GetNext(),p=t.i;"\\"===a&&++t.i&&"limits"!==t.GetCS()&&(t.i=p)}t.Push(i)},e.AmsMethods.SideSet=function(t,e){var r=o(m(t.ParseArg(e)),2),n=r[0],i=r[1],a=o(m(t.ParseArg(e)),2),c=a[0],u=a[1],p=t.ParseArg(e),h=p;n&&(i?n.replaceChild(t.create("node","mphantom",[t.create("node","mpadded",[s.default.copyNode(p,t)],{width:0})]),l.default.getChildAt(n,0)):(h=t.create("node","mmultiscripts",[p]),c&&l.default.appendChildren(h,[l.default.getChildAt(c,1)||t.create("node","none"),l.default.getChildAt(c,2)||t.create("node","none")]),l.default.setProperty(h,"scriptalign","left"),l.default.appendChildren(h,[t.create("node","mprescripts"),l.default.getChildAt(n,1)||t.create("node","none"),l.default.getChildAt(n,2)||t.create("node","none")]))),c&&h===p&&(c.replaceChild(p,l.default.getChildAt(c,0)),h=c);var f=t.create("node","TeXAtom",[],{texClass:d.TEXCLASS.OP,movesupsub:!0,movablelimits:!0});i&&(n&&f.appendChild(n),f.appendChild(i)),f.appendChild(h),u&&f.appendChild(u),t.Push(f)},e.AmsMethods.operatorLetter=function(t,e){return!!t.stack.env.operatorLetters&&a.default.variable(t,e)},e.AmsMethods.MultiIntegral=function(t,e,r){var n=t.GetNext();if("\\"===n){var o=t.i;n=t.GetArgument(e),t.i=o,"\\limits"===n&&(r="\\idotsint"===e?"\\!\\!\\mathop{\\,\\,"+r+"}":"\\!\\!\\!\\mathop{\\,\\,\\,"+r+"}")}t.string=r+" "+t.string.slice(t.i),t.i=0},e.AmsMethods.xArrow=function(t,e,r,n,o){var i={width:"+"+s.default.Em((n+o)/18),lspace:s.default.Em(n/18)},a=t.GetBrackets(e),c=t.ParseArg(e),p=t.create("node","mspace",[],{depth:".25em"}),h=t.create("token","mo",{stretchy:!0,texClass:d.TEXCLASS.REL},String.fromCodePoint(r));h=t.create("node","mstyle",[h],{scriptlevel:0});var f=t.create("node","munderover",[h]),m=t.create("node","mpadded",[c,p],i);if(l.default.setAttribute(m,"voffset","-.2em"),l.default.setAttribute(m,"height","-.2em"),l.default.setChild(f,f.over,m),a){var y=new u.default(a,t.stack.env,t.configuration).mml(),g=t.create("node","mspace",[],{height:".75em"});m=t.create("node","mpadded",[y,g],i),l.default.setAttribute(m,"voffset",".15em"),l.default.setAttribute(m,"depth","-.15em"),l.default.setChild(f,f.under,m)}l.default.setProperty(f,"subsupOK",!0),t.Push(f)},e.AmsMethods.HandleShove=function(t,e,r){var n=t.stack.Top();if("multline"!==n.kind)throw new p.default("CommandOnlyAllowedInEnv","%1 only allowed in %2 environment",t.currentCS,"multline");if(n.Size())throw new p.default("CommandAtTheBeginingOfLine","%1 must come at the beginning of the line",t.currentCS);n.setProperty("shove",r)},e.AmsMethods.CFrac=function(t,e){var r=s.default.trimSpaces(t.GetBrackets(e,"")),n=t.GetArgument(e),o=t.GetArgument(e),i={l:c.TexConstant.Align.LEFT,r:c.TexConstant.Align.RIGHT,"":""},a=new u.default("\\strut\\textstyle{"+n+"}",t.stack.env,t.configuration).mml(),h=new u.default("\\strut\\textstyle{"+o+"}",t.stack.env,t.configuration).mml(),f=t.create("node","mfrac",[a,h]);if(null==(r=i[r]))throw new p.default("IllegalAlign","Illegal alignment specified in %1",t.currentCS);r&&l.default.setProperties(f,{numalign:r,denomalign:r}),t.Push(f)},e.AmsMethods.Genfrac=function(t,e,r,n,o,i){null==r&&(r=t.GetDelimiterArg(e)),null==n&&(n=t.GetDelimiterArg(e)),null==o&&(o=t.GetArgument(e)),null==i&&(i=s.default.trimSpaces(t.GetArgument(e)));var a=t.ParseArg(e),c=t.ParseArg(e),u=t.create("node","mfrac",[a,c]);if(""!==o&&l.default.setAttribute(u,"linethickness",o),(r||n)&&(l.default.setProperty(u,"withDelims",!0),u=s.default.fixedFence(t.configuration,r,u,n)),""!==i){var h=parseInt(i,10),f=["D","T","S","SS"][h];if(null==f)throw new p.default("BadMathStyleFor","Bad math style for %1",t.currentCS);u=t.create("node","mstyle",[u]),"D"===f?l.default.setProperties(u,{displaystyle:!0,scriptlevel:0}):l.default.setProperties(u,{displaystyle:!1,scriptlevel:h-1})}t.Push(u)},e.AmsMethods.HandleTag=function(t,e){if(!t.tags.currentTag.taggable&&t.tags.env)throw new p.default("CommandNotAllowedInEnv","%1 not allowed in %2 environment",t.currentCS,t.tags.env);if(t.tags.currentTag.tag)throw new p.default("MultipleCommand","Multiple %1",t.currentCS);var r=t.GetStar(),n=s.default.trimSpaces(t.GetArgument(e));t.tags.tag(n,r)},e.AmsMethods.HandleNoTag=f.default.HandleNoTag,e.AmsMethods.HandleRef=f.default.HandleRef,e.AmsMethods.Macro=f.default.Macro,e.AmsMethods.Accent=f.default.Accent,e.AmsMethods.Tilde=f.default.Tilde,e.AmsMethods.Array=f.default.Array,e.AmsMethods.Spacer=f.default.Spacer,e.AmsMethods.NamedOp=f.default.NamedOp,e.AmsMethods.EqnArray=f.default.EqnArray,e.AmsMethods.Equation=f.default.Equation},1275:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AutoloadConfiguration=void 0;var i=r(9899),s=r(9140),a=r(8803),l=r(7741),c=r(265),u=r(7233);function p(t,e,r,i){var s,a,u,p;if(c.Package.packages.has(t.options.require.prefix+r)){var d=t.options.autoload[r],m=n(2===d.length&&Array.isArray(d[0])?d:[d,[]],2),y=m[0],g=m[1];try{for(var b=o(y),v=b.next();!v.done;v=b.next()){var _=v.value;h.remove(_)}}catch(t){s={error:t}}finally{try{v&&!v.done&&(a=b.return)&&a.call(b)}finally{if(s)throw s.error}}try{for(var S=o(g),M=S.next();!M.done;M=S.next()){var O=M.value;f.remove(O)}}catch(t){u={error:t}}finally{try{M&&!M.done&&(p=S.return)&&p.call(S)}finally{if(u)throw u.error}}t.string=(i?e+" ":"\\begin{"+e.slice(1)+"}")+t.string.slice(t.i),t.i=0}(0,l.RequireLoad)(t,r)}var h=new s.CommandMap("autoload-macros",{},{}),f=new s.CommandMap("autoload-environments",{},{});e.AutoloadConfiguration=i.Configuration.create("autoload",{handler:{macro:["autoload-macros"],environment:["autoload-environments"]},options:{autoload:(0,u.expandable)({action:["toggle","mathtip","texttip"],amscd:[[],["CD"]],bbox:["bbox"],boldsymbol:["boldsymbol"],braket:["bra","ket","braket","set","Bra","Ket","Braket","Set","ketbra","Ketbra"],bussproofs:[[],["prooftree"]],cancel:["cancel","bcancel","xcancel","cancelto"],color:["color","definecolor","textcolor","colorbox","fcolorbox"],enclose:["enclose"],extpfeil:["xtwoheadrightarrow","xtwoheadleftarrow","xmapsto","xlongequal","xtofrom","Newextarrow"],html:["href","class","style","cssId"],mhchem:["ce","pu"],newcommand:["newcommand","renewcommand","newenvironment","renewenvironment","def","let"],unicode:["unicode"],verb:["verb"]})},config:function(t,e){var r,i,s,c,u,d,m=e.parseOptions,y=m.handlers.get("macro"),g=m.handlers.get("environment"),b=m.options.autoload;m.packageData.set("autoload",{Autoload:p});try{for(var v=o(Object.keys(b)),_=v.next();!_.done;_=v.next()){var S=_.value,M=b[S],O=n(2===M.length&&Array.isArray(M[0])?M:[M,[]],2),x=O[0],E=O[1];try{for(var A=(s=void 0,o(x)),C=A.next();!C.done;C=A.next()){var T=C.value;y.lookup(T)&&"color"!==T||h.add(T,new a.Macro(T,p,[S,!0]))}}catch(t){s={error:t}}finally{try{C&&!C.done&&(c=A.return)&&c.call(A)}finally{if(s)throw s.error}}try{for(var N=(u=void 0,o(E)),w=N.next();!w.done;w=N.next()){var L=w.value;g.lookup(L)||f.add(L,new a.Macro(L,p,[S,!1]))}}catch(t){u={error:t}}finally{try{w&&!w.done&&(d=N.return)&&d.call(N)}finally{if(u)throw u.error}}}}catch(t){r={error:t}}finally{try{_&&!_.done&&(i=v.return)&&i.call(v)}finally{if(r)throw r.error}}m.packageData.get("require")||l.RequireConfiguration.config(t,e)},init:function(t){t.options.require||(0,u.defaultOptions)(t.options,l.RequireConfiguration.options)},priority:10})},2942:function(t,e,r){var n,o,i=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),s=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),a=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),l=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&s(e,t,r);return a(e,t),e},c=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},u=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.BaseConfiguration=e.BaseTags=e.Other=void 0;var p=r(9899),h=r(2947),f=u(r(3971)),d=u(r(1256)),m=r(9140),y=l(r(1181)),g=r(6521);r(1267);var b=r(4082);function v(t,e){var r=t.stack.env.font?{mathvariant:t.stack.env.font}:{},n=h.MapHandler.getMap("remap").lookup(e),o=(0,b.getRange)(e),i=o?o[3]:"mo",s=t.create("token",i,r,n?n.char:e);o[4]&&s.attributes.set("mathvariant",o[4]),"mo"===i&&(d.default.setProperty(s,"fixStretchy",!0),t.configuration.addNode("fixStretchy",s)),t.Push(s)}new m.CharacterMap("remap",null,{"-":"\u2212","*":"\u2217","`":"\u2018"}),e.Other=v;var _=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e}(g.AbstractTags);e.BaseTags=_,e.BaseConfiguration=p.Configuration.create("base",{handler:{character:["command","special","letter","digit"],delimiter:["delimiter"],macro:["delimiter","macros","mathchar0mi","mathchar0mo","mathchar7"],environment:["environment"]},fallback:{character:v,macro:function(t,e){throw new f.default("UndefinedControlSequence","Undefined control sequence %1","\\"+e)},environment:function(t,e){throw new f.default("UnknownEnv","Unknown environment '%1'",e)}},items:(o={},o[y.StartItem.prototype.kind]=y.StartItem,o[y.StopItem.prototype.kind]=y.StopItem,o[y.OpenItem.prototype.kind]=y.OpenItem,o[y.CloseItem.prototype.kind]=y.CloseItem,o[y.PrimeItem.prototype.kind]=y.PrimeItem,o[y.SubsupItem.prototype.kind]=y.SubsupItem,o[y.OverItem.prototype.kind]=y.OverItem,o[y.LeftItem.prototype.kind]=y.LeftItem,o[y.Middle.prototype.kind]=y.Middle,o[y.RightItem.prototype.kind]=y.RightItem,o[y.BeginItem.prototype.kind]=y.BeginItem,o[y.EndItem.prototype.kind]=y.EndItem,o[y.StyleItem.prototype.kind]=y.StyleItem,o[y.PositionItem.prototype.kind]=y.PositionItem,o[y.CellItem.prototype.kind]=y.CellItem,o[y.MmlItem.prototype.kind]=y.MmlItem,o[y.FnItem.prototype.kind]=y.FnItem,o[y.NotItem.prototype.kind]=y.NotItem,o[y.NonscriptItem.prototype.kind]=y.NonscriptItem,o[y.DotsItem.prototype.kind]=y.DotsItem,o[y.ArrayItem.prototype.kind]=y.ArrayItem,o[y.EqnArrayItem.prototype.kind]=y.EqnArrayItem,o[y.EquationItem.prototype.kind]=y.EquationItem,o),options:{maxMacros:1e3,baseURL:"undefined"==typeof document||0===document.getElementsByTagName("base").length?"":String(document.location).replace(/#.*$/,"")},tags:{base:_},postprocessors:[[function(t){var e,r,n=t.data;try{for(var o=c(n.getList("nonscript")),i=o.next();!i.done;i=o.next()){var s=i.value;if(s.attributes.get("scriptlevel")>0){var a=s.parent;if(a.childNodes.splice(a.childIndex(s),1),n.removeFromList(s.kind,[s]),s.isKind("mrow")){var l=s.childNodes[0];n.removeFromList("mstyle",[l]),n.removeFromList("mspace",l.childNodes[0].childNodes)}}else s.isKind("mrow")&&(s.parent.replaceChild(s.childNodes[0],s),n.removeFromList("mrow",[s]))}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},-4]]})},1181:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;othis.maxrow&&(this.maxrow=this.row.length);var t="mtr",e=this.factory.configuration.tags.getTag();e&&(this.row=[e].concat(this.row),t="mlabeledtr"),this.factory.configuration.tags.clearTag();var r=this.create("node",t,this.row);this.table.push(r),this.row=[]},e.prototype.EndTable=function(){t.prototype.EndTable.call(this),this.factory.configuration.tags.end(),this.extendArray("columnalign",this.maxrow),this.extendArray("columnwidth",this.maxrow),this.extendArray("columnspacing",this.maxrow-1)},e.prototype.extendArray=function(t,e){if(this.arraydef[t]){var r=this.arraydef[t].split(/ /),n=s([],i(r),!1);if(n.length>1){for(;n.length",succ:"\u227b",prec:"\u227a",approx:"\u2248",succeq:"\u2ab0",preceq:"\u2aaf",supset:"\u2283",subset:"\u2282",supseteq:"\u2287",subseteq:"\u2286",in:"\u2208",ni:"\u220b",notin:"\u2209",owns:"\u220b",gg:"\u226b",ll:"\u226a",sim:"\u223c",simeq:"\u2243",perp:"\u22a5",equiv:"\u2261",asymp:"\u224d",smile:"\u2323",frown:"\u2322",ne:"\u2260",neq:"\u2260",cong:"\u2245",doteq:"\u2250",bowtie:"\u22c8",models:"\u22a8",notChar:"\u29f8",Leftrightarrow:"\u21d4",Leftarrow:"\u21d0",Rightarrow:"\u21d2",leftrightarrow:"\u2194",leftarrow:"\u2190",gets:"\u2190",rightarrow:"\u2192",to:["\u2192",{accent:!1}],mapsto:"\u21a6",leftharpoonup:"\u21bc",leftharpoondown:"\u21bd",rightharpoonup:"\u21c0",rightharpoondown:"\u21c1",nearrow:"\u2197",searrow:"\u2198",nwarrow:"\u2196",swarrow:"\u2199",rightleftharpoons:"\u21cc",hookrightarrow:"\u21aa",hookleftarrow:"\u21a9",longleftarrow:"\u27f5",Longleftarrow:"\u27f8",longrightarrow:"\u27f6",Longrightarrow:"\u27f9",Longleftrightarrow:"\u27fa",longleftrightarrow:"\u27f7",longmapsto:"\u27fc",ldots:"\u2026",cdots:"\u22ef",vdots:"\u22ee",ddots:"\u22f1",dotsc:"\u2026",dotsb:"\u22ef",dotsm:"\u22ef",dotsi:"\u22ef",dotso:"\u2026",ldotp:[".",{texClass:h.TEXCLASS.PUNCT}],cdotp:["\u22c5",{texClass:h.TEXCLASS.PUNCT}],colon:[":",{texClass:h.TEXCLASS.PUNCT}]}),new a.CharacterMap("mathchar7",u.default.mathchar7,{Gamma:"\u0393",Delta:"\u0394",Theta:"\u0398",Lambda:"\u039b",Xi:"\u039e",Pi:"\u03a0",Sigma:"\u03a3",Upsilon:"\u03a5",Phi:"\u03a6",Psi:"\u03a8",Omega:"\u03a9",_:"_","#":"#",$:"$","%":"%","&":"&",And:"&"}),new a.DelimiterMap("delimiter",u.default.delimiter,{"(":"(",")":")","[":"[","]":"]","<":"\u27e8",">":"\u27e9","\\lt":"\u27e8","\\gt":"\u27e9","/":"/","|":["|",{texClass:h.TEXCLASS.ORD}],".":"","\\\\":"\\","\\lmoustache":"\u23b0","\\rmoustache":"\u23b1","\\lgroup":"\u27ee","\\rgroup":"\u27ef","\\arrowvert":"\u23d0","\\Arrowvert":"\u2016","\\bracevert":"\u23aa","\\Vert":["\u2016",{texClass:h.TEXCLASS.ORD}],"\\|":["\u2016",{texClass:h.TEXCLASS.ORD}],"\\vert":["|",{texClass:h.TEXCLASS.ORD}],"\\uparrow":"\u2191","\\downarrow":"\u2193","\\updownarrow":"\u2195","\\Uparrow":"\u21d1","\\Downarrow":"\u21d3","\\Updownarrow":"\u21d5","\\backslash":"\\","\\rangle":"\u27e9","\\langle":"\u27e8","\\rbrace":"}","\\lbrace":"{","\\}":"}","\\{":"{","\\rceil":"\u2309","\\lceil":"\u2308","\\rfloor":"\u230b","\\lfloor":"\u230a","\\lbrack":"[","\\rbrack":"]"}),new a.CommandMap("macros",{displaystyle:["SetStyle","D",!0,0],textstyle:["SetStyle","T",!1,0],scriptstyle:["SetStyle","S",!1,1],scriptscriptstyle:["SetStyle","SS",!1,2],rm:["SetFont",l.TexConstant.Variant.NORMAL],mit:["SetFont",l.TexConstant.Variant.ITALIC],oldstyle:["SetFont",l.TexConstant.Variant.OLDSTYLE],cal:["SetFont",l.TexConstant.Variant.CALLIGRAPHIC],it:["SetFont",l.TexConstant.Variant.MATHITALIC],bf:["SetFont",l.TexConstant.Variant.BOLD],bbFont:["SetFont",l.TexConstant.Variant.DOUBLESTRUCK],scr:["SetFont",l.TexConstant.Variant.SCRIPT],frak:["SetFont",l.TexConstant.Variant.FRAKTUR],sf:["SetFont",l.TexConstant.Variant.SANSSERIF],tt:["SetFont",l.TexConstant.Variant.MONOSPACE],mathrm:["MathFont",l.TexConstant.Variant.NORMAL],mathup:["MathFont",l.TexConstant.Variant.NORMAL],mathnormal:["MathFont",""],mathbf:["MathFont",l.TexConstant.Variant.BOLD],mathbfup:["MathFont",l.TexConstant.Variant.BOLD],mathit:["MathFont",l.TexConstant.Variant.MATHITALIC],mathbfit:["MathFont",l.TexConstant.Variant.BOLDITALIC],mathbb:["MathFont",l.TexConstant.Variant.DOUBLESTRUCK],Bbb:["MathFont",l.TexConstant.Variant.DOUBLESTRUCK],mathfrak:["MathFont",l.TexConstant.Variant.FRAKTUR],mathbffrak:["MathFont",l.TexConstant.Variant.BOLDFRAKTUR],mathscr:["MathFont",l.TexConstant.Variant.SCRIPT],mathbfscr:["MathFont",l.TexConstant.Variant.BOLDSCRIPT],mathsf:["MathFont",l.TexConstant.Variant.SANSSERIF],mathsfup:["MathFont",l.TexConstant.Variant.SANSSERIF],mathbfsf:["MathFont",l.TexConstant.Variant.BOLDSANSSERIF],mathbfsfup:["MathFont",l.TexConstant.Variant.BOLDSANSSERIF],mathsfit:["MathFont",l.TexConstant.Variant.SANSSERIFITALIC],mathbfsfit:["MathFont",l.TexConstant.Variant.SANSSERIFBOLDITALIC],mathtt:["MathFont",l.TexConstant.Variant.MONOSPACE],mathcal:["MathFont",l.TexConstant.Variant.CALLIGRAPHIC],mathbfcal:["MathFont",l.TexConstant.Variant.BOLDCALLIGRAPHIC],symrm:["MathFont",l.TexConstant.Variant.NORMAL],symup:["MathFont",l.TexConstant.Variant.NORMAL],symnormal:["MathFont",""],symbf:["MathFont",l.TexConstant.Variant.BOLD],symbfup:["MathFont",l.TexConstant.Variant.BOLD],symit:["MathFont",l.TexConstant.Variant.ITALIC],symbfit:["MathFont",l.TexConstant.Variant.BOLDITALIC],symbb:["MathFont",l.TexConstant.Variant.DOUBLESTRUCK],symfrak:["MathFont",l.TexConstant.Variant.FRAKTUR],symbffrak:["MathFont",l.TexConstant.Variant.BOLDFRAKTUR],symscr:["MathFont",l.TexConstant.Variant.SCRIPT],symbfscr:["MathFont",l.TexConstant.Variant.BOLDSCRIPT],symsf:["MathFont",l.TexConstant.Variant.SANSSERIF],symsfup:["MathFont",l.TexConstant.Variant.SANSSERIF],symbfsf:["MathFont",l.TexConstant.Variant.BOLDSANSSERIF],symbfsfup:["MathFont",l.TexConstant.Variant.BOLDSANSSERIF],symsfit:["MathFont",l.TexConstant.Variant.SANSSERIFITALIC],symbfsfit:["MathFont",l.TexConstant.Variant.SANSSERIFBOLDITALIC],symtt:["MathFont",l.TexConstant.Variant.MONOSPACE],symcal:["MathFont",l.TexConstant.Variant.CALLIGRAPHIC],symbfcal:["MathFont",l.TexConstant.Variant.BOLDCALLIGRAPHIC],textrm:["HBox",null,l.TexConstant.Variant.NORMAL],textup:["HBox",null,l.TexConstant.Variant.NORMAL],textnormal:["HBox"],textit:["HBox",null,l.TexConstant.Variant.ITALIC],textbf:["HBox",null,l.TexConstant.Variant.BOLD],textsf:["HBox",null,l.TexConstant.Variant.SANSSERIF],texttt:["HBox",null,l.TexConstant.Variant.MONOSPACE],tiny:["SetSize",.5],Tiny:["SetSize",.6],scriptsize:["SetSize",.7],small:["SetSize",.85],normalsize:["SetSize",1],large:["SetSize",1.2],Large:["SetSize",1.44],LARGE:["SetSize",1.73],huge:["SetSize",2.07],Huge:["SetSize",2.49],arcsin:"NamedFn",arccos:"NamedFn",arctan:"NamedFn",arg:"NamedFn",cos:"NamedFn",cosh:"NamedFn",cot:"NamedFn",coth:"NamedFn",csc:"NamedFn",deg:"NamedFn",det:"NamedOp",dim:"NamedFn",exp:"NamedFn",gcd:"NamedOp",hom:"NamedFn",inf:"NamedOp",ker:"NamedFn",lg:"NamedFn",lim:"NamedOp",liminf:["NamedOp","lim inf"],limsup:["NamedOp","lim sup"],ln:"NamedFn",log:"NamedFn",max:"NamedOp",min:"NamedOp",Pr:"NamedOp",sec:"NamedFn",sin:"NamedFn",sinh:"NamedFn",sup:"NamedOp",tan:"NamedFn",tanh:"NamedFn",limits:["Limits",1],nolimits:["Limits",0],overline:["UnderOver","2015"],underline:["UnderOver","2015"],overbrace:["UnderOver","23DE",1],underbrace:["UnderOver","23DF",1],overparen:["UnderOver","23DC"],underparen:["UnderOver","23DD"],overrightarrow:["UnderOver","2192"],underrightarrow:["UnderOver","2192"],overleftarrow:["UnderOver","2190"],underleftarrow:["UnderOver","2190"],overleftrightarrow:["UnderOver","2194"],underleftrightarrow:["UnderOver","2194"],overset:"Overset",underset:"Underset",overunderset:"Overunderset",stackrel:["Macro","\\mathrel{\\mathop{#2}\\limits^{#1}}",2],stackbin:["Macro","\\mathbin{\\mathop{#2}\\limits^{#1}}",2],over:"Over",overwithdelims:"Over",atop:"Over",atopwithdelims:"Over",above:"Over",abovewithdelims:"Over",brace:["Over","{","}"],brack:["Over","[","]"],choose:["Over","(",")"],frac:"Frac",sqrt:"Sqrt",root:"Root",uproot:["MoveRoot","upRoot"],leftroot:["MoveRoot","leftRoot"],left:"LeftRight",right:"LeftRight",middle:"LeftRight",llap:"Lap",rlap:"Lap",raise:"RaiseLower",lower:"RaiseLower",moveleft:"MoveLeftRight",moveright:"MoveLeftRight",",":["Spacer",f.MATHSPACE.thinmathspace],":":["Spacer",f.MATHSPACE.mediummathspace],">":["Spacer",f.MATHSPACE.mediummathspace],";":["Spacer",f.MATHSPACE.thickmathspace],"!":["Spacer",f.MATHSPACE.negativethinmathspace],enspace:["Spacer",.5],quad:["Spacer",1],qquad:["Spacer",2],thinspace:["Spacer",f.MATHSPACE.thinmathspace],negthinspace:["Spacer",f.MATHSPACE.negativethinmathspace],hskip:"Hskip",hspace:"Hskip",kern:"Hskip",mskip:"Hskip",mspace:"Hskip",mkern:"Hskip",rule:"rule",Rule:["Rule"],Space:["Rule","blank"],nonscript:"Nonscript",big:["MakeBig",h.TEXCLASS.ORD,.85],Big:["MakeBig",h.TEXCLASS.ORD,1.15],bigg:["MakeBig",h.TEXCLASS.ORD,1.45],Bigg:["MakeBig",h.TEXCLASS.ORD,1.75],bigl:["MakeBig",h.TEXCLASS.OPEN,.85],Bigl:["MakeBig",h.TEXCLASS.OPEN,1.15],biggl:["MakeBig",h.TEXCLASS.OPEN,1.45],Biggl:["MakeBig",h.TEXCLASS.OPEN,1.75],bigr:["MakeBig",h.TEXCLASS.CLOSE,.85],Bigr:["MakeBig",h.TEXCLASS.CLOSE,1.15],biggr:["MakeBig",h.TEXCLASS.CLOSE,1.45],Biggr:["MakeBig",h.TEXCLASS.CLOSE,1.75],bigm:["MakeBig",h.TEXCLASS.REL,.85],Bigm:["MakeBig",h.TEXCLASS.REL,1.15],biggm:["MakeBig",h.TEXCLASS.REL,1.45],Biggm:["MakeBig",h.TEXCLASS.REL,1.75],mathord:["TeXAtom",h.TEXCLASS.ORD],mathop:["TeXAtom",h.TEXCLASS.OP],mathopen:["TeXAtom",h.TEXCLASS.OPEN],mathclose:["TeXAtom",h.TEXCLASS.CLOSE],mathbin:["TeXAtom",h.TEXCLASS.BIN],mathrel:["TeXAtom",h.TEXCLASS.REL],mathpunct:["TeXAtom",h.TEXCLASS.PUNCT],mathinner:["TeXAtom",h.TEXCLASS.INNER],vcenter:["TeXAtom",h.TEXCLASS.VCENTER],buildrel:"BuildRel",hbox:["HBox",0],text:"HBox",mbox:["HBox",0],fbox:"FBox",boxed:["Macro","\\fbox{$\\displaystyle{#1}$}",1],framebox:"FrameBox",strut:"Strut",mathstrut:["Macro","\\vphantom{(}"],phantom:"Phantom",vphantom:["Phantom",1,0],hphantom:["Phantom",0,1],smash:"Smash",acute:["Accent","00B4"],grave:["Accent","0060"],ddot:["Accent","00A8"],tilde:["Accent","007E"],bar:["Accent","00AF"],breve:["Accent","02D8"],check:["Accent","02C7"],hat:["Accent","005E"],vec:["Accent","2192"],dot:["Accent","02D9"],widetilde:["Accent","007E",1],widehat:["Accent","005E",1],matrix:"Matrix",array:"Matrix",pmatrix:["Matrix","(",")"],cases:["Matrix","{","","left left",null,".1em",null,!0],eqalign:["Matrix",null,null,"right left",(0,f.em)(f.MATHSPACE.thickmathspace),".5em","D"],displaylines:["Matrix",null,null,"center",null,".5em","D"],cr:"Cr","\\":"CrLaTeX",newline:["CrLaTeX",!0],hline:["HLine","solid"],hdashline:["HLine","dashed"],eqalignno:["Matrix",null,null,"right left",(0,f.em)(f.MATHSPACE.thickmathspace),".5em","D",null,"right"],leqalignno:["Matrix",null,null,"right left",(0,f.em)(f.MATHSPACE.thickmathspace),".5em","D",null,"left"],hfill:"HFill",hfil:"HFill",hfilll:"HFill",bmod:["Macro",'\\mmlToken{mo}[lspace="thickmathspace" rspace="thickmathspace"]{mod}'],pmod:["Macro","\\pod{\\mmlToken{mi}{mod}\\kern 6mu #1}",1],mod:["Macro","\\mathchoice{\\kern18mu}{\\kern12mu}{\\kern12mu}{\\kern12mu}\\mmlToken{mi}{mod}\\,\\,#1",1],pod:["Macro","\\mathchoice{\\kern18mu}{\\kern8mu}{\\kern8mu}{\\kern8mu}(#1)",1],iff:["Macro","\\;\\Longleftrightarrow\\;"],skew:["Macro","{{#2{#3\\mkern#1mu}\\mkern-#1mu}{}}",3],pmb:["Macro","\\rlap{#1}\\kern1px{#1}",1],TeX:["Macro","T\\kern-.14em\\lower.5ex{E}\\kern-.115em X"],LaTeX:["Macro","L\\kern-.325em\\raise.21em{\\scriptstyle{A}}\\kern-.17em\\TeX"]," ":["Macro","\\text{ }"],not:"Not",dots:"Dots",space:"Tilde","\xa0":"Tilde",begin:"BeginEnd",end:"BeginEnd",label:"HandleLabel",ref:"HandleRef",nonumber:"HandleNoTag",mathchoice:"MathChoice",mmlToken:"MmlToken"},c.default),new a.EnvironmentMap("environment",u.default.environment,{array:["AlignedArray"],equation:["Equation",null,!0],eqnarray:["EqnArray",null,!0,!0,"rcl",p.default.cols(0,f.MATHSPACE.thickmathspace),".5em"]},c.default),new a.CharacterMap("not_remap",null,{"\u2190":"\u219a","\u2192":"\u219b","\u2194":"\u21ae","\u21d0":"\u21cd","\u21d2":"\u21cf","\u21d4":"\u21ce","\u2208":"\u2209","\u220b":"\u220c","\u2223":"\u2224","\u2225":"\u2226","\u223c":"\u2241","~":"\u2241","\u2243":"\u2244","\u2245":"\u2247","\u2248":"\u2249","\u224d":"\u226d","=":"\u2260","\u2261":"\u2262","<":"\u226e",">":"\u226f","\u2264":"\u2270","\u2265":"\u2271","\u2272":"\u2274","\u2273":"\u2275","\u2276":"\u2278","\u2277":"\u2279","\u227a":"\u2280","\u227b":"\u2281","\u2282":"\u2284","\u2283":"\u2285","\u2286":"\u2288","\u2287":"\u2289","\u22a2":"\u22ac","\u22a8":"\u22ad","\u22a9":"\u22ae","\u22ab":"\u22af","\u227c":"\u22e0","\u227d":"\u22e1","\u2291":"\u22e2","\u2292":"\u22e3","\u22b2":"\u22ea","\u22b3":"\u22eb","\u22b4":"\u22ec","\u22b5":"\u22ed","\u2203":"\u2204"})},7693:function(t,e,r){var n=this&&this.__assign||function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var c=s(r(1181)),u=l(r(1256)),p=l(r(3971)),h=l(r(8417)),f=r(8317),d=l(r(1130)),m=r(9007),y=r(6521),g=r(6010),b=r(5368),v=r(7233),_={},S={fontfamily:1,fontsize:1,fontweight:1,fontstyle:1,color:1,background:1,id:1,class:1,href:1,style:1};function M(t,e){var r=t.stack.env,n=r.inRoot;r.inRoot=!0;var o=new h.default(e,r,t.configuration),i=o.mml(),s=o.stack.global;if(s.leftRoot||s.upRoot){var a={};s.leftRoot&&(a.width=s.leftRoot),s.upRoot&&(a.voffset=s.upRoot,a.height=s.upRoot),i=t.create("node","mpadded",[i],a)}return r.inRoot=n,i}_.Open=function(t,e){t.Push(t.itemFactory.create("open"))},_.Close=function(t,e){t.Push(t.itemFactory.create("close"))},_.Tilde=function(t,e){t.Push(t.create("token","mtext",{},b.entities.nbsp))},_.Space=function(t,e){},_.Superscript=function(t,e){var r,n,o;t.GetNext().match(/\d/)&&(t.string=t.string.substr(0,t.i+1)+" "+t.string.substr(t.i+1));var i=t.stack.Top();i.isKind("prime")?(o=(r=a(i.Peek(2),2))[0],n=r[1],t.stack.Pop()):(o=t.stack.Prev())||(o=t.create("token","mi",{},""));var s=u.default.getProperty(o,"movesupsub"),l=u.default.isType(o,"msubsup")?o.sup:o.over;if(u.default.isType(o,"msubsup")&&!u.default.isType(o,"msup")&&u.default.getChildAt(o,o.sup)||u.default.isType(o,"munderover")&&!u.default.isType(o,"mover")&&u.default.getChildAt(o,o.over)&&!u.default.getProperty(o,"subsupOK"))throw new p.default("DoubleExponent","Double exponent: use braces to clarify");u.default.isType(o,"msubsup")&&!u.default.isType(o,"msup")||(s?((!u.default.isType(o,"munderover")||u.default.isType(o,"mover")||u.default.getChildAt(o,o.over))&&(o=t.create("node","munderover",[o],{movesupsub:!0})),l=o.over):l=(o=t.create("node","msubsup",[o])).sup),t.Push(t.itemFactory.create("subsup",o).setProperties({position:l,primes:n,movesupsub:s}))},_.Subscript=function(t,e){var r,n,o;t.GetNext().match(/\d/)&&(t.string=t.string.substr(0,t.i+1)+" "+t.string.substr(t.i+1));var i=t.stack.Top();i.isKind("prime")?(o=(r=a(i.Peek(2),2))[0],n=r[1],t.stack.Pop()):(o=t.stack.Prev())||(o=t.create("token","mi",{},""));var s=u.default.getProperty(o,"movesupsub"),l=u.default.isType(o,"msubsup")?o.sub:o.under;if(u.default.isType(o,"msubsup")&&!u.default.isType(o,"msup")&&u.default.getChildAt(o,o.sub)||u.default.isType(o,"munderover")&&!u.default.isType(o,"mover")&&u.default.getChildAt(o,o.under)&&!u.default.getProperty(o,"subsupOK"))throw new p.default("DoubleSubscripts","Double subscripts: use braces to clarify");u.default.isType(o,"msubsup")&&!u.default.isType(o,"msup")||(s?((!u.default.isType(o,"munderover")||u.default.isType(o,"mover")||u.default.getChildAt(o,o.under))&&(o=t.create("node","munderover",[o],{movesupsub:!0})),l=o.under):l=(o=t.create("node","msubsup",[o])).sub),t.Push(t.itemFactory.create("subsup",o).setProperties({position:l,primes:n,movesupsub:s}))},_.Prime=function(t,e){var r=t.stack.Prev();if(r||(r=t.create("node","mi")),u.default.isType(r,"msubsup")&&!u.default.isType(r,"msup")&&u.default.getChildAt(r,r.sup))throw new p.default("DoubleExponentPrime","Prime causes double exponent: use braces to clarify");var n="";t.i--;do{n+=b.entities.prime,t.i++,e=t.GetNext()}while("'"===e||e===b.entities.rsquo);n=["","\u2032","\u2033","\u2034","\u2057"][n.length]||n;var o=t.create("token","mo",{variantForm:!0},n);t.Push(t.itemFactory.create("prime",r,o))},_.Comment=function(t,e){for(;t.i=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.ConfigMacrosConfiguration=void 0;var s=r(9899),a=r(7233),l=r(9140),c=i(r(5450)),u=r(8803),p=i(r(1110)),h=r(6793),f="configmacros-map",d="configmacros-env-map";e.ConfigMacrosConfiguration=s.Configuration.create("configmacros",{init:function(t){new l.CommandMap(f,{},{}),new l.EnvironmentMap(d,c.default.environment,{},{}),t.append(s.Configuration.local({handler:{macro:[f],environment:[d]},priority:3}))},config:function(t,e){!function(t){var e,r,n=t.parseOptions.handlers.retrieve(f),i=t.parseOptions.options.macros;try{for(var s=o(Object.keys(i)),a=s.next();!a.done;a=s.next()){var l=a.value,c="string"==typeof i[l]?[i[l]]:i[l],h=Array.isArray(c[2])?new u.Macro(l,p.default.MacroWithTemplate,c.slice(0,2).concat(c[2])):new u.Macro(l,p.default.Macro,c);n.add(l,h)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}}(e),function(t){var e,r,n=t.parseOptions.handlers.retrieve(d),i=t.parseOptions.options.environments;try{for(var s=o(Object.keys(i)),a=s.next();!a.done;a=s.next()){var l=a.value;n.add(l,new u.Macro(l,p.default.BeginEnv,[!0].concat(i[l])))}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}}(e)},items:(n={},n[h.BeginEnvItem.prototype.kind]=h.BeginEnvItem,n),options:{macros:(0,a.expandable)({}),environments:(0,a.expandable)({})}})},1496:function(t,e,r){var n,o=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),i=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&o(e,t,r);return i(e,t),e},a=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.NewcommandConfiguration=void 0;var l=r(9899),c=r(6793),u=a(r(5579));r(5117);var p=a(r(5450)),h=s(r(9140));e.NewcommandConfiguration=l.Configuration.create("newcommand",{handler:{macro:["Newcommand-macros"]},items:(n={},n[c.BeginEnvItem.prototype.kind]=c.BeginEnvItem,n),options:{maxMacros:1e3},init:function(t){new h.DelimiterMap(u.default.NEW_DELIMITER,p.default.delimiter,{}),new h.CommandMap(u.default.NEW_COMMAND,{},{}),new h.EnvironmentMap(u.default.NEW_ENVIRONMENT,p.default.environment,{},{}),t.append(l.Configuration.local({handler:{character:[],delimiter:[u.default.NEW_DELIMITER],macro:[u.default.NEW_DELIMITER,u.default.NEW_COMMAND],environment:[u.default.NEW_ENVIRONMENT]},priority:-1}))}})},6793:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.BeginEnvItem=void 0;var s=i(r(3971)),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"beginEnv"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isOpen",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isKind("end")){if(e.getName()!==this.getName())throw new s.default("EnvBadEnd","\\begin{%1} ended with \\end{%2}",this.getName(),e.getName());return[[this.factory.create("mml",this.toMml())],!0]}if(e.isKind("stop"))throw new s.default("EnvMissingEnd","Missing \\end{%1}",this.getName());return t.prototype.checkItem.call(this,e)},e}(r(8292).BaseItem);e.BeginEnvItem=a},5117:function(t,e,r){var n=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var o=n(r(1110));new(r(9140).CommandMap)("Newcommand-macros",{newcommand:"NewCommand",renewcommand:"NewCommand",newenvironment:"NewEnvironment",renewenvironment:"NewEnvironment",def:"MacroDef",let:"Let"},o.default)},1110:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return o(e,t),e},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var a=s(r(3971)),l=i(r(9140)),c=s(r(7693)),u=s(r(1130)),p=s(r(5579)),h={NewCommand:function(t,e){var r=p.default.GetCsNameArgument(t,e),n=p.default.GetArgCount(t,e),o=t.GetBrackets(e),i=t.GetArgument(e);p.default.addMacro(t,r,h.Macro,[i,n,o])},NewEnvironment:function(t,e){var r=u.default.trimSpaces(t.GetArgument(e)),n=p.default.GetArgCount(t,e),o=t.GetBrackets(e),i=t.GetArgument(e),s=t.GetArgument(e);p.default.addEnvironment(t,r,h.BeginEnv,[!0,i,s,n,o])},MacroDef:function(t,e){var r=p.default.GetCSname(t,e),n=p.default.GetTemplate(t,e,"\\"+r),o=t.GetArgument(e);n instanceof Array?p.default.addMacro(t,r,h.MacroWithTemplate,[o].concat(n)):p.default.addMacro(t,r,h.Macro,[o,n])},Let:function(t,e){var r=p.default.GetCSname(t,e),n=t.GetNext();"="===n&&(t.i++,n=t.GetNext());var o=t.configuration.handlers;if("\\"!==n){t.i++;var i=o.get("delimiter").lookup(n);i?p.default.addDelimiter(t,"\\"+r,i.char,i.attributes):p.default.addMacro(t,r,h.Macro,[n])}else{e=p.default.GetCSname(t,e);var s=o.get("delimiter").lookup("\\"+e);if(s)return void p.default.addDelimiter(t,"\\"+r,s.char,s.attributes);var a=o.get("macro").applicable(e);if(!a)return;if(a instanceof l.MacroMap){var c=a.lookup(e);return void p.default.addMacro(t,r,c.func,c.args,c.symbol)}s=a.lookup(e);var u=p.default.disassembleSymbol(r,s);p.default.addMacro(t,r,(function(t,e){for(var r=[],n=2;n0?[i.toString()].concat(o):i;t.i++}throw new s.default("MissingReplacementString","Missing replacement string for definition of %1",e)},t.GetParameter=function(t,r,n){if(null==n)return t.GetArgument(r);for(var o=t.i,i=0,a=0;t.i=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.NoUndefinedConfiguration=void 0;var o=r(9899);e.NoUndefinedConfiguration=o.Configuration.create("noundefined",{fallback:{macro:function(t,e){var r,o,i=t.create("text","\\"+e),s=t.options.noundefined||{},a={};try{for(var l=n(["color","background","size"]),c=l.next();!c.done;c=l.next()){var u=c.value;s[u]&&(a["math"+u]=s[u])}}catch(t){r={error:t}}finally{try{c&&!c.done&&(o=l.return)&&o.call(l)}finally{if(r)throw r.error}}t.Push(t.create("node","mtext",[],a,i))}},options:{noundefined:{color:"red",background:"",size:""}},priority:3})},7741:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTML=void 0;var u=r(3055),p=r(4139),h=r(9261),f=r(6797),d=r(2760),m=l(r(6010)),y=r(505),g=function(t){function e(e){void 0===e&&(e=null);var r=t.call(this,e,h.CHTMLWrapperFactory,d.TeXFont)||this;return r.chtmlStyles=null,r.font.adaptiveCSS(r.options.adaptiveCSS),r.wrapperUsage=new f.Usage,r}return o(e,t),e.prototype.escaped=function(t,e){return this.setDocument(e),this.html("span",{},[this.text(t.math)])},e.prototype.styleSheet=function(r){if(this.chtmlStyles){if(this.options.adaptiveCSS){var n=new p.CssStyles;this.addWrapperStyles(n),this.updateFontStyles(n),this.adaptor.insertRules(this.chtmlStyles,n.getStyleRules())}return this.chtmlStyles}var o=this.chtmlStyles=t.prototype.styleSheet.call(this,r);return this.adaptor.setAttribute(o,"id",e.STYLESHEETID),this.wrapperUsage.update(),o},e.prototype.updateFontStyles=function(t){t.addStyles(this.font.updateStyles({}))},e.prototype.addWrapperStyles=function(e){var r,n;if(this.options.adaptiveCSS)try{for(var o=c(this.wrapperUsage.update()),i=o.next();!i.done;i=o.next()){var s=i.value,a=this.factory.getNodeClass(s);a&&this.addClassStyles(a,e)}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}else t.prototype.addWrapperStyles.call(this,e)},e.prototype.addClassStyles=function(e,r){var n,o=e;o.autoStyle&&"unknown"!==o.kind&&r.addStyles(((n={})["mjx-"+o.kind]={display:"inline-block","text-align":"left"},n)),this.wrapperUsage.add(o.kind),t.prototype.addClassStyles.call(this,e,r)},e.prototype.processMath=function(t,e){this.factory.wrap(t).toCHTML(e)},e.prototype.clearCache=function(){this.cssStyles.clear(),this.font.clearCache(),this.wrapperUsage.clear(),this.chtmlStyles=null},e.prototype.reset=function(){this.clearCache()},e.prototype.unknownText=function(t,e,r){void 0===r&&(r=null);var n={},o=100/this.math.metrics.scale;if(100!==o&&(n["font-size"]=this.fixed(o,1)+"%",n.padding=m.em(75/o)+" 0 "+m.em(20/o)+" 0"),"-explicitFont"!==e){var i=(0,y.unicodeChars)(t);(1!==i.length||i[0]<119808||i[0]>120831)&&this.cssFontStyles(this.font.getCssFont(e),n)}if(null!==r){var s=this.math.metrics;n.width=Math.round(r*s.em*s.scale)+"px"}return this.html("mjx-utext",{variant:e,style:n},[this.text(t)])},e.prototype.measureTextNode=function(t){var e=this.adaptor,r=e.clone(t);e.setStyle(r,"font-family",e.getStyle(r,"font-family").replace(/MJXZERO, /g,""));var n=this.html("mjx-measure-text",{style:{position:"absolute","white-space":"nowrap"}},[r]);e.append(e.parent(this.math.start.node),this.container),e.append(this.container,n);var o=e.nodeSize(r,this.math.metrics.em)[0]/this.math.metrics.scale;return e.remove(this.container),e.remove(n),{w:o,h:.75,d:.2}},e.NAME="CHTML",e.OPTIONS=i(i({},u.CommonOutputJax.OPTIONS),{adaptiveCSS:!0,matchFontHeight:!0}),e.commonStyles={'mjx-container[jax="CHTML"]':{"line-height":0},'mjx-container [space="1"]':{"margin-left":".111em"},'mjx-container [space="2"]':{"margin-left":".167em"},'mjx-container [space="3"]':{"margin-left":".222em"},'mjx-container [space="4"]':{"margin-left":".278em"},'mjx-container [space="5"]':{"margin-left":".333em"},'mjx-container [rspace="1"]':{"margin-right":".111em"},'mjx-container [rspace="2"]':{"margin-right":".167em"},'mjx-container [rspace="3"]':{"margin-right":".222em"},'mjx-container [rspace="4"]':{"margin-right":".278em"},'mjx-container [rspace="5"]':{"margin-right":".333em"},'mjx-container [size="s"]':{"font-size":"70.7%"},'mjx-container [size="ss"]':{"font-size":"50%"},'mjx-container [size="Tn"]':{"font-size":"60%"},'mjx-container [size="sm"]':{"font-size":"85%"},'mjx-container [size="lg"]':{"font-size":"120%"},'mjx-container [size="Lg"]':{"font-size":"144%"},'mjx-container [size="LG"]':{"font-size":"173%"},'mjx-container [size="hg"]':{"font-size":"207%"},'mjx-container [size="HG"]':{"font-size":"249%"},'mjx-container [width="full"]':{width:"100%"},"mjx-box":{display:"inline-block"},"mjx-block":{display:"block"},"mjx-itable":{display:"inline-table"},"mjx-row":{display:"table-row"},"mjx-row > *":{display:"table-cell"},"mjx-mtext":{display:"inline-block"},"mjx-mstyle":{display:"inline-block"},"mjx-merror":{display:"inline-block",color:"red","background-color":"yellow"},"mjx-mphantom":{visibility:"hidden"},"_::-webkit-full-page-media, _:future, :root mjx-container":{"will-change":"opacity"}},e.STYLESHEETID="MJX-CHTML-styles",e}(u.CommonOutputJax);e.CHTML=g},8042:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},c=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.AddCSS=e.CHTMLFontData=void 0;var u=r(5884),p=r(6797),h=r(6010);a(r(5884),e);var f=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.charUsage=new p.Usage,e.delimUsage=new p.Usage,e}return o(e,t),e.charOptions=function(e,r){return t.charOptions.call(this,e,r)},e.prototype.adaptiveCSS=function(t){this.options.adaptiveCSS=t},e.prototype.clearCache=function(){this.options.adaptiveCSS&&(this.charUsage.clear(),this.delimUsage.clear())},e.prototype.createVariant=function(e,r,n){void 0===r&&(r=null),void 0===n&&(n=null),t.prototype.createVariant.call(this,e,r,n);var o=this.constructor;this.variant[e].classes=o.defaultVariantClasses[e],this.variant[e].letter=o.defaultVariantLetters[e]},e.prototype.defineChars=function(r,n){var o,i;t.prototype.defineChars.call(this,r,n);var s=this.variant[r].letter;try{for(var a=l(Object.keys(n)),c=a.next();!c.done;c=a.next()){var u=c.value,p=e.charOptions(n,parseInt(u));void 0===p.f&&(p.f=s)}}catch(t){o={error:t}}finally{try{c&&!c.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}},Object.defineProperty(e.prototype,"styles",{get:function(){var t=this.constructor,e=i({},t.defaultStyles);return this.addFontURLs(e,t.defaultFonts,this.options.fontURL),this.options.adaptiveCSS?this.updateStyles(e):this.allStyles(e),e},enumerable:!1,configurable:!0}),e.prototype.updateStyles=function(t){var e,r,n,o;try{for(var i=l(this.delimUsage.update()),s=i.next();!s.done;s=i.next()){var a=s.value;this.addDelimiterStyles(t,a,this.delimiters[a])}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}try{for(var u=l(this.charUsage.update()),p=u.next();!p.done;p=u.next()){var h=c(p.value,2),f=h[0],d=(a=h[1],this.variant[f]);this.addCharStyles(t,d.letter,a,d.chars[a])}}catch(t){n={error:t}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(n)throw n.error}}return t},e.prototype.allStyles=function(t){var e,r,n,o,i,s;try{for(var a=l(Object.keys(this.delimiters)),c=a.next();!c.done;c=a.next()){var u=c.value,p=parseInt(u);this.addDelimiterStyles(t,p,this.delimiters[p])}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(e)throw e.error}}try{for(var h=l(Object.keys(this.variant)),f=h.next();!f.done;f=h.next()){var d=f.value,m=this.variant[d],y=m.letter;try{for(var g=(i=void 0,l(Object.keys(m.chars))),b=g.next();!b.done;b=g.next()){u=b.value,p=parseInt(u);var v=m.chars[p];(v[3]||{}).smp||(v.length<4&&(v[3]={}),this.addCharStyles(t,y,p,v))}}catch(t){i={error:t}}finally{try{b&&!b.done&&(s=g.return)&&s.call(g)}finally{if(i)throw i.error}}}}catch(t){n={error:t}}finally{try{f&&!f.done&&(o=h.return)&&o.call(h)}finally{if(n)throw n.error}}},e.prototype.addFontURLs=function(t,e,r){var n,o;try{for(var s=l(Object.keys(e)),a=s.next();!a.done;a=s.next()){var c=a.value,u=i({},e[c]);u.src=u.src.replace(/%%URL%%/,r),t[c]=u}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(n)throw n.error}}},e.prototype.addDelimiterStyles=function(t,e,r){var n=this.charSelector(e);r.c&&r.c!==e&&(t[".mjx-stretched mjx-c"+(n=this.charSelector(r.c))+"::before"]={content:this.charContent(r.c)}),r.stretch&&(1===r.dir?this.addDelimiterVStyles(t,n,r):this.addDelimiterHStyles(t,n,r))},e.prototype.addDelimiterVStyles=function(t,e,r){var n=r.HDW,o=c(r.stretch,4),i=o[0],s=o[1],a=o[2],l=o[3],u=this.addDelimiterVPart(t,e,"beg",i,n);this.addDelimiterVPart(t,e,"ext",s,n);var p=this.addDelimiterVPart(t,e,"end",a,n),h={};if(l){var f=this.addDelimiterVPart(t,e,"mid",l,n);h.height="50%",t["mjx-stretchy-v"+e+" > mjx-mid"]={"margin-top":this.em(-f/2),"margin-bottom":this.em(-f/2)}}u&&(h["border-top-width"]=this.em0(u-.03)),p&&(h["border-bottom-width"]=this.em0(p-.03),t["mjx-stretchy-v"+e+" > mjx-end"]={"margin-top":this.em(-p)}),Object.keys(h).length&&(t["mjx-stretchy-v"+e+" > mjx-ext"]=h)},e.prototype.addDelimiterVPart=function(t,e,r,n,o){if(!n)return 0;var i=this.getDelimiterData(n),s=(o[2]-i[2])/2,a={content:this.charContent(n)};return"ext"!==r?a.padding=this.padding(i,s):(a.width=this.em0(o[2]),s&&(a["padding-left"]=this.em0(s))),t["mjx-stretchy-v"+e+" mjx-"+r+" mjx-c::before"]=a,i[0]+i[1]},e.prototype.addDelimiterHStyles=function(t,e,r){var n=c(r.stretch,4),o=n[0],i=n[1],s=n[2],a=n[3],l=r.HDW;this.addDelimiterHPart(t,e,"beg",o,l),this.addDelimiterHPart(t,e,"ext",i,l),this.addDelimiterHPart(t,e,"end",s,l),a&&(this.addDelimiterHPart(t,e,"mid",a,l),t["mjx-stretchy-h"+e+" > mjx-ext"]={width:"50%"})},e.prototype.addDelimiterHPart=function(t,e,r,n,o){if(n){var i=this.getDelimiterData(n)[3],s={content:i&&i.c?'"'+i.c+'"':this.charContent(n)};s.padding=this.padding(o,0,-o[2]),t["mjx-stretchy-h"+e+" mjx-"+r+" mjx-c::before"]=s}},e.prototype.addCharStyles=function(t,e,r,n){var o=n[3],i=void 0!==o.f?o.f:e;t["mjx-c"+this.charSelector(r)+(i?".TEX-"+i:"")+"::before"]={padding:this.padding(n,0,o.ic||0),content:null!=o.c?'"'+o.c+'"':this.charContent(r)}},e.prototype.getDelimiterData=function(t){return this.getChar("-smallop",t)},e.prototype.em=function(t){return(0,h.em)(t)},e.prototype.em0=function(t){return(0,h.em)(Math.max(0,t))},e.prototype.padding=function(t,e,r){var n=c(t,3),o=n[0],i=n[1];return void 0===e&&(e=0),void 0===r&&(r=0),[o,n[2]+r,i,e].map(this.em0).join(" ")},e.prototype.charContent=function(t){return'"'+(t>=32&&t<=126&&34!==t&&39!==t&&92!==t?String.fromCharCode(t):"\\"+t.toString(16).toUpperCase())+'"'},e.prototype.charSelector=function(t){return".mjx-c"+t.toString(16).toUpperCase()},e.OPTIONS=i(i({},u.FontData.OPTIONS),{fontURL:"js/output/chtml/fonts/tex-woff-v2"}),e.JAX="CHTML",e.defaultVariantClasses={},e.defaultVariantLetters={},e.defaultStyles={"mjx-c::before":{display:"block",width:0}},e.defaultFonts={"@font-face /* 0 */":{"font-family":"MJXZERO",src:'url("%%URL%%/MathJax_Zero.woff") format("woff")'}},e}(u.FontData);e.CHTMLFontData=f,e.AddCSS=function(t,e){var r,n;try{for(var o=l(Object.keys(e)),i=o.next();!i.done;i=o.next()){var s=i.value,a=parseInt(s);Object.assign(u.FontData.charOptions(t,a),e[a])}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return t}},8270:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return o(e,t),e},s=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||n(e,t,r)},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.Arrow=e.DiagonalArrow=e.DiagonalStrike=e.Border2=e.Border=e.RenderElement=void 0;var l=i(r(5552));s(r(5552),e);e.RenderElement=function(t,e){return void 0===e&&(e=""),function(r,n){var o=r.adjustBorder(r.html("mjx-"+t));if(e){var i=r.getOffset(e);if(r.thickness!==l.THICKNESS||i){var s="translate".concat(e,"(").concat(r.em(r.thickness/2-i),")");r.adaptor.setStyle(o,"transform",s)}}r.adaptor.append(r.chtml,o)}};e.Border=function(t){return l.CommonBorder((function(e,r){e.adaptor.setStyle(r,"border-"+t,e.em(e.thickness)+" solid")}))(t)};e.Border2=function(t,e,r){return l.CommonBorder2((function(t,n){var o=t.em(t.thickness)+" solid";t.adaptor.setStyle(n,"border-"+e,o),t.adaptor.setStyle(n,"border-"+r,o)}))(t,e,r)};e.DiagonalStrike=function(t,e){return l.CommonDiagonalStrike((function(t){return function(r,n){var o=r.getBBox(),i=o.w,s=o.h,l=o.d,c=a(r.getArgMod(i,s+l),2),u=c[0],p=c[1],h=e*r.thickness/2,f=r.adjustBorder(r.html(t,{style:{width:r.em(p),transform:"rotate("+r.fixed(-e*u)+"rad) translateY("+h+"em)"}}));r.adaptor.append(r.chtml,f)}}))(t)};e.DiagonalArrow=function(t){return l.CommonDiagonalArrow((function(t,e){t.adaptor.append(t.chtml,e)}))(t)};e.Arrow=function(t){return l.CommonArrow((function(t,e){t.adaptor.append(t.chtml,e)}))(t)}},6797:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Usage=void 0;var r=function(){function t(){this.used=new Set,this.needsUpdate=[]}return t.prototype.add=function(t){var e=JSON.stringify(t);this.used.has(e)||this.needsUpdate.push(t),this.used.add(e)},t.prototype.has=function(t){return this.used.has(JSON.stringify(t))},t.prototype.clear=function(){this.used.clear(),this.needsUpdate=[]},t.prototype.update=function(){var t=this.needsUpdate;return this.needsUpdate=[],t},t}();e.Usage=r},5355:function(t,e,r){var n,o,i=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),s=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),a=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),l=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&s(e,t,r);return a(e,t),e},c=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},u=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLWrapper=e.SPACE=e.FONTSIZE=void 0;var p=l(r(6010)),h=r(7519),f=r(6469);e.FONTSIZE={"70.7%":"s","70%":"s","50%":"ss","60%":"Tn","85%":"sm","120%":"lg","144%":"Lg","173%":"LG","207%":"hg","249%":"HG"},e.SPACE=((o={})[p.em(2/18)]="1",o[p.em(3/18)]="2",o[p.em(4/18)]="3",o[p.em(5/18)]="4",o[p.em(6/18)]="5",o);var d=function(t){function r(){var e=null!==t&&t.apply(this,arguments)||this;return e.chtml=null,e}return i(r,t),r.prototype.toCHTML=function(t){var e,r,n=this.standardCHTMLnode(t);try{for(var o=c(this.childNodes),i=o.next();!i.done;i=o.next()){i.value.toCHTML(n)}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},r.prototype.standardCHTMLnode=function(t){this.markUsed();var e=this.createCHTMLnode(t);return this.handleStyles(),this.handleVariant(),this.handleScale(),this.handleColor(),this.handleSpace(),this.handleAttributes(),this.handlePWidth(),e},r.prototype.markUsed=function(){this.jax.wrapperUsage.add(this.kind)},r.prototype.createCHTMLnode=function(t){var e=this.node.attributes.get("href");return e&&(t=this.adaptor.append(t,this.html("a",{href:e}))),this.chtml=this.adaptor.append(t,this.html("mjx-"+this.node.kind)),this.chtml},r.prototype.handleStyles=function(){if(this.styles){var t=this.styles.cssText;if(t){this.adaptor.setAttribute(this.chtml,"style",t);var e=this.styles.get("font-family");e&&this.adaptor.setStyle(this.chtml,"font-family","MJXZERO, "+e)}}},r.prototype.handleVariant=function(){this.node.isToken&&"-explicitFont"!==this.variant&&this.adaptor.setAttribute(this.chtml,"class",(this.font.getVariant(this.variant)||this.font.getVariant("normal")).classes)},r.prototype.handleScale=function(){this.setScale(this.chtml,this.bbox.rscale)},r.prototype.setScale=function(t,r){var n=Math.abs(r-1)<.001?1:r;if(t&&1!==n){var o=this.percent(n);e.FONTSIZE[o]?this.adaptor.setAttribute(t,"size",e.FONTSIZE[o]):this.adaptor.setStyle(t,"fontSize",o)}return t},r.prototype.handleSpace=function(){var t,r;try{for(var n=c([[this.bbox.L,"space","marginLeft"],[this.bbox.R,"rspace","marginRight"]]),o=n.next();!o.done;o=n.next()){var i=o.value,s=u(i,3),a=s[0],l=s[1],p=s[2];if(a){var h=this.em(a);e.SPACE[h]?this.adaptor.setAttribute(this.chtml,l,e.SPACE[h]):this.adaptor.setStyle(this.chtml,p,h)}}}catch(e){t={error:e}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},r.prototype.handleColor=function(){var t=this.node.attributes,e=t.getExplicit("mathcolor"),r=t.getExplicit("color"),n=t.getExplicit("mathbackground"),o=t.getExplicit("background");(e||r)&&this.adaptor.setStyle(this.chtml,"color",e||r),(n||o)&&this.adaptor.setStyle(this.chtml,"backgroundColor",n||o)},r.prototype.handleAttributes=function(){var t,e,n,o,i=this.node.attributes,s=i.getAllDefaults(),a=r.skipAttributes;try{for(var l=c(i.getExplicitNames()),u=l.next();!u.done;u=l.next()){var p=u.value;!1!==a[p]&&(p in s||a[p]||this.adaptor.hasAttribute(this.chtml,p))||this.adaptor.setAttribute(this.chtml,p,i.getExplicit(p))}}catch(e){t={error:e}}finally{try{u&&!u.done&&(e=l.return)&&e.call(l)}finally{if(t)throw t.error}}if(i.get("class")){var h=i.get("class").trim().split(/ +/);try{for(var f=c(h),d=f.next();!d.done;d=f.next()){var m=d.value;this.adaptor.addClass(this.chtml,m)}}catch(t){n={error:t}}finally{try{d&&!d.done&&(o=f.return)&&o.call(f)}finally{if(n)throw n.error}}}},r.prototype.handlePWidth=function(){this.bbox.pwidth&&(this.bbox.pwidth===f.BBox.fullWidth?this.adaptor.setAttribute(this.chtml,"width","full"):this.adaptor.setStyle(this.chtml,"width",this.bbox.pwidth))},r.prototype.setIndent=function(t,e,r){var n=this.adaptor;if("center"===e||"left"===e){var o=this.getBBox().L;n.setStyle(t,"margin-left",this.em(r+o))}if("center"===e||"right"===e){var i=this.getBBox().R;n.setStyle(t,"margin-right",this.em(-r+i))}},r.prototype.drawBBox=function(){var t=this.getBBox(),e=t.w,r=t.h,n=t.d,o=t.R,i=this.html("mjx-box",{style:{opacity:.25,"margin-left":this.em(-e-o)}},[this.html("mjx-box",{style:{height:this.em(r),width:this.em(e),"background-color":"red"}}),this.html("mjx-box",{style:{height:this.em(n),width:this.em(e),"margin-left":this.em(-e),"vertical-align":this.em(-n),"background-color":"green"}})]),s=this.chtml||this.parent.chtml,a=this.adaptor.getAttribute(s,"size");a&&this.adaptor.setAttribute(i,"size",a);var l=this.adaptor.getStyle(s,"fontSize");l&&this.adaptor.setStyle(i,"fontSize",l),this.adaptor.append(this.adaptor.parent(s),i),this.adaptor.setStyle(s,"backgroundColor","#FFEE00")},r.prototype.html=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.jax.html(t,e,r)},r.prototype.text=function(t){return this.jax.text(t)},r.prototype.char=function(t){return this.font.charSelector(t).substr(1)},r.kind="unknown",r.autoStyle=!0,r}(h.CommonWrapper);e.CHTMLWrapper=d},9261:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLWrapperFactory=void 0;var i=r(4420),s=r(9086),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.defaultNodes=s.CHTMLWrappers,e}(i.CommonWrapperFactory);e.CHTMLWrapperFactory=a},9086:function(t,e,r){var n;Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLWrappers=void 0;var o=r(5355),i=r(804),s=r(1653),a=r(6287),l=r(6460),c=r(4597),u=r(1259),p=r(2970),h=r(5964),f=r(8147),d=r(4798),m=r(2275),y=r(9063),g=r(5610),b=r(8776),v=r(4300),_=r(6590),S=r(6781),M=r(8002),O=r(3571),x=r(7056),E=r(8102),A=r(6911),C=r(421),T=r(95),N=r(1148);e.CHTMLWrappers=((n={})[i.CHTMLmath.kind]=i.CHTMLmath,n[d.CHTMLmrow.kind]=d.CHTMLmrow,n[d.CHTMLinferredMrow.kind]=d.CHTMLinferredMrow,n[s.CHTMLmi.kind]=s.CHTMLmi,n[a.CHTMLmo.kind]=a.CHTMLmo,n[l.CHTMLmn.kind]=l.CHTMLmn,n[c.CHTMLms.kind]=c.CHTMLms,n[u.CHTMLmtext.kind]=u.CHTMLmtext,n[p.CHTMLmspace.kind]=p.CHTMLmspace,n[h.CHTMLmpadded.kind]=h.CHTMLmpadded,n[f.CHTMLmenclose.kind]=f.CHTMLmenclose,n[y.CHTMLmfrac.kind]=y.CHTMLmfrac,n[g.CHTMLmsqrt.kind]=g.CHTMLmsqrt,n[b.CHTMLmroot.kind]=b.CHTMLmroot,n[v.CHTMLmsub.kind]=v.CHTMLmsub,n[v.CHTMLmsup.kind]=v.CHTMLmsup,n[v.CHTMLmsubsup.kind]=v.CHTMLmsubsup,n[_.CHTMLmunder.kind]=_.CHTMLmunder,n[_.CHTMLmover.kind]=_.CHTMLmover,n[_.CHTMLmunderover.kind]=_.CHTMLmunderover,n[S.CHTMLmmultiscripts.kind]=S.CHTMLmmultiscripts,n[m.CHTMLmfenced.kind]=m.CHTMLmfenced,n[M.CHTMLmtable.kind]=M.CHTMLmtable,n[O.CHTMLmtr.kind]=O.CHTMLmtr,n[O.CHTMLmlabeledtr.kind]=O.CHTMLmlabeledtr,n[x.CHTMLmtd.kind]=x.CHTMLmtd,n[E.CHTMLmaction.kind]=E.CHTMLmaction,n[A.CHTMLmglyph.kind]=A.CHTMLmglyph,n[C.CHTMLsemantics.kind]=C.CHTMLsemantics,n[C.CHTMLannotation.kind]=C.CHTMLannotation,n[C.CHTMLannotationXML.kind]=C.CHTMLannotationXML,n[C.CHTMLxml.kind]=C.CHTMLxml,n[T.CHTMLTeXAtom.kind]=T.CHTMLTeXAtom,n[N.CHTMLTextNode.kind]=N.CHTMLTextNode,n[o.CHTMLWrapper.kind]=o.CHTMLWrapper,n)},95:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLTeXAtom=void 0;var i=r(5355),s=r(9800),a=r(3948),l=r(9007),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){if(t.prototype.toCHTML.call(this,e),this.adaptor.setAttribute(this.chtml,"texclass",l.TEXCLASSNAMES[this.node.texClass]),this.node.texClass===l.TEXCLASS.VCENTER){var r=this.childNodes[0].getBBox(),n=r.h,o=(n+r.d)/2+this.font.params.axis_height-n;this.adaptor.setStyle(this.chtml,"verticalAlign",this.em(o))}},e.kind=a.TeXAtom.prototype.kind,e}((0,s.CommonTeXAtomMixin)(i.CHTMLWrapper));e.CHTMLTeXAtom=c},1148:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLTextNode=void 0;var s=r(9007),a=r(5355),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r;this.markUsed();var n=this.adaptor,o=this.parent.variant,s=this.node.getText();if(0!==s.length)if("-explicitFont"===o)n.append(t,this.jax.unknownText(s,o,this.getBBox().w));else{var a=this.remappedText(s,o);try{for(var l=i(a),c=l.next();!c.done;c=l.next()){var u=c.value,p=this.getVariantChar(o,u)[3],h=p.f?" TEX-"+p.f:"",f=p.unknown?this.jax.unknownText(String.fromCodePoint(u),o):this.html("mjx-c",{class:this.char(u)+h});n.append(t,f),!p.unknown&&this.font.charUsage.add([o,u])}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(e)throw e.error}}}},e.kind=s.TextNode.prototype.kind,e.autoStyle=!1,e.styles={"mjx-c":{display:"inline-block"},"mjx-utext":{display:"inline-block",padding:".75em 0 .2em 0"}},e}((0,r(1160).CommonTextNodeMixin)(a.CHTMLWrapper));e.CHTMLTextNode=l},8102:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmaction=void 0;var i=r(5355),s=r(1956),a=r(1956),l=r(9145),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t);this.selected.toCHTML(e),this.action(this,this.data)},e.prototype.setEventHandler=function(t,e){this.chtml.addEventListener(t,e)},e.kind=l.MmlMaction.prototype.kind,e.styles={"mjx-maction":{position:"relative"},"mjx-maction > mjx-tool":{display:"none",position:"absolute",bottom:0,right:0,width:0,height:0,"z-index":500},"mjx-tool > mjx-tip":{display:"inline-block",padding:".2em",border:"1px solid #888","font-size":"70%","background-color":"#F8F8F8",color:"black","box-shadow":"2px 2px 5px #AAAAAA"},"mjx-maction[toggle]":{cursor:"pointer"},"mjx-status":{display:"block",position:"fixed",left:"1em",bottom:"1em","min-width":"25%",padding:".2em .4em",border:"1px solid #888","font-size":"90%","background-color":"#F8F8F8",color:"black"}},e.actions=new Map([["toggle",[function(t,e){t.adaptor.setAttribute(t.chtml,"toggle",t.node.attributes.get("selection"));var r=t.factory.jax.math,n=t.factory.jax.document,o=t.node;t.setEventHandler("click",(function(t){r.end.node||(r.start.node=r.end.node=r.typesetRoot,r.start.n=r.end.n=0),o.nextToggleSelection(),r.rerender(n),t.stopPropagation()}))},{}]],["tooltip",[function(t,e){var r=t.childNodes[1];if(r)if(r.node.isKind("mtext")){var n=r.node.getText();t.adaptor.setAttribute(t.chtml,"title",n)}else{var o=t.adaptor,i=o.append(t.chtml,t.html("mjx-tool",{style:{bottom:t.em(-t.dy),right:t.em(-t.dx)}},[t.html("mjx-tip")]));r.toCHTML(o.firstChild(i)),t.setEventHandler("mouseover",(function(r){e.stopTimers(t,e);var n=setTimeout((function(){return o.setStyle(i,"display","block")}),e.postDelay);e.hoverTimer.set(t,n),r.stopPropagation()})),t.setEventHandler("mouseout",(function(r){e.stopTimers(t,e);var n=setTimeout((function(){return o.setStyle(i,"display","")}),e.clearDelay);e.clearTimer.set(t,n),r.stopPropagation()}))}},a.TooltipData]],["statusline",[function(t,e){var r=t.childNodes[1];if(r&&r.node.isKind("mtext")){var n=t.adaptor,o=r.node.getText();n.setAttribute(t.chtml,"statusline",o),t.setEventHandler("mouseover",(function(r){if(null===e.status){var i=n.body(n.document);e.status=n.append(i,t.html("mjx-status",{},[t.text(o)]))}r.stopPropagation()})),t.setEventHandler("mouseout",(function(t){e.status&&(n.remove(e.status),e.status=null),t.stopPropagation()}))}},{status:null}]]]),e}((0,s.CommonMactionMixin)(i.CHTMLWrapper));e.CHTMLmaction=c},804:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmath=void 0;var s=r(5355),a=r(7490),l=r(3233),c=r(6469),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.chtml,n=this.adaptor;"block"===this.node.attributes.get("display")?(n.setAttribute(r,"display","true"),n.setAttribute(e,"display","true"),this.handleDisplay(e)):this.handleInline(e),n.addClass(r,"MJX-TEX")},e.prototype.handleDisplay=function(t){var e=this.adaptor,r=i(this.getAlignShift(),2),n=r[0],o=r[1];if("center"!==n&&e.setAttribute(t,"justify",n),this.bbox.pwidth===c.BBox.fullWidth){if(e.setAttribute(t,"width","full"),this.jax.table){var s=this.jax.table.getOuterBBox(),a=s.L,l=s.w,u=s.R;"right"===n?u=Math.max(u||-o,-o):"left"===n?a=Math.max(a||o,o):"center"===n&&(l+=2*Math.abs(o));var p=this.em(Math.max(0,a+l+u));e.setStyle(t,"min-width",p),e.setStyle(this.jax.table.chtml,"min-width",p)}}else this.setIndent(this.chtml,n,o)},e.prototype.handleInline=function(t){var e=this.adaptor,r=e.getStyle(this.chtml,"margin-right");r&&(e.setStyle(this.chtml,"margin-right",""),e.setStyle(t,"margin-right",r),e.setStyle(t,"width","0"))},e.prototype.setChildPWidths=function(e,r,n){return void 0===r&&(r=null),void 0===n&&(n=!0),!!this.parent&&t.prototype.setChildPWidths.call(this,e,r,n)},e.kind=l.MmlMath.prototype.kind,e.styles={"mjx-math":{"line-height":0,"text-align":"left","text-indent":0,"font-style":"normal","font-weight":"normal","font-size":"100%","font-size-adjust":"none","letter-spacing":"normal","border-collapse":"collapse","word-wrap":"normal","word-spacing":"normal","white-space":"nowrap",direction:"ltr",padding:"1px 0"},'mjx-container[jax="CHTML"][display="true"]':{display:"block","text-align":"center",margin:"1em 0"},'mjx-container[jax="CHTML"][display="true"][width="full"]':{display:"flex"},'mjx-container[jax="CHTML"][display="true"] mjx-math':{padding:0},'mjx-container[jax="CHTML"][justify="left"]':{"text-align":"left"},'mjx-container[jax="CHTML"][justify="right"]':{"text-align":"right"}},e}((0,a.CommonMathMixin)(s.CHTMLWrapper));e.CHTMLmath=u},8147:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),s=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),a=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&i(e,t,r);return s(e,t),e},l=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},c=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmenclose=void 0;var u=r(5355),p=r(7313),h=a(r(8270)),f=r(6661),d=r(6010);function m(t,e){return Math.atan2(t,e).toFixed(3).replace(/\.?0+$/,"")}var y=m(h.ARROWDX,h.ARROWY),g=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r,n,o,i=this.adaptor,s=this.standardCHTMLnode(t),a=i.append(s,this.html("mjx-box"));this.renderChild?this.renderChild(this,a):this.childNodes[0].toCHTML(a);try{for(var c=l(Object.keys(this.notations)),u=c.next();!u.done;u=c.next()){var p=u.value,f=this.notations[p];!f.renderChild&&f.renderer(this,a)}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=c.return)&&r.call(c)}finally{if(e)throw e.error}}var d=this.getPadding();try{for(var m=l(h.sideNames),y=m.next();!y.done;y=m.next()){var g=y.value,b=h.sideIndex[g];d[b]>0&&i.setStyle(a,"padding-"+g,this.em(d[b]))}}catch(t){n={error:t}}finally{try{y&&!y.done&&(o=m.return)&&o.call(m)}finally{if(n)throw n.error}}},e.prototype.arrow=function(t,e,r,n,o){void 0===n&&(n=""),void 0===o&&(o=0);var i=this.getBBox().w,s={width:this.em(t)};i!==t&&(s.left=this.em((i-t)/2)),e&&(s.transform="rotate("+this.fixed(e)+"rad)");var a=this.html("mjx-arrow",{style:s},[this.html("mjx-aline"),this.html("mjx-rthead"),this.html("mjx-rbhead")]);return r&&(this.adaptor.append(a,this.html("mjx-lthead")),this.adaptor.append(a,this.html("mjx-lbhead")),this.adaptor.setAttribute(a,"double","true")),this.adjustArrow(a,r),this.moveArrow(a,n,o),a},e.prototype.adjustArrow=function(t,e){var r=this,n=this.thickness,o=this.arrowhead;if(o.x!==h.ARROWX||o.y!==h.ARROWY||o.dx!==h.ARROWDX||n!==h.THICKNESS){var i=c([n*o.x,n*o.y].map((function(t){return r.em(t)})),2),s=i[0],a=i[1],l=m(o.dx,o.y),u=c(this.adaptor.childNodes(t),5),p=u[0],f=u[1],d=u[2],y=u[3],g=u[4];this.adjustHead(f,[a,"0","1px",s],l),this.adjustHead(d,["1px","0",a,s],"-"+l),this.adjustHead(y,[a,s,"1px","0"],"-"+l),this.adjustHead(g,["1px",s,a,"0"],l),this.adjustLine(p,n,o.x,e)}},e.prototype.adjustHead=function(t,e,r){t&&(this.adaptor.setStyle(t,"border-width",e.join(" ")),this.adaptor.setStyle(t,"transform","skewX("+r+"rad)"))},e.prototype.adjustLine=function(t,e,r,n){this.adaptor.setStyle(t,"borderTop",this.em(e)+" solid"),this.adaptor.setStyle(t,"top",this.em(-e/2)),this.adaptor.setStyle(t,"right",this.em(e*(r-1))),n&&this.adaptor.setStyle(t,"left",this.em(e*(r-1)))},e.prototype.moveArrow=function(t,e,r){if(r){var n=this.adaptor.getStyle(t,"transform");this.adaptor.setStyle(t,"transform","translate".concat(e,"(").concat(this.em(-r),")").concat(n?" "+n:""))}},e.prototype.adjustBorder=function(t){return this.thickness!==h.THICKNESS&&this.adaptor.setStyle(t,"borderWidth",this.em(this.thickness)),t},e.prototype.adjustThickness=function(t){return this.thickness!==h.THICKNESS&&this.adaptor.setStyle(t,"strokeWidth",this.fixed(this.thickness)),t},e.prototype.fixed=function(t,e){return void 0===e&&(e=3),Math.abs(t)<6e-4?"0":t.toFixed(e).replace(/\.?0+$/,"")},e.prototype.em=function(e){return t.prototype.em.call(this,e)},e.kind=f.MmlMenclose.prototype.kind,e.styles={"mjx-menclose":{position:"relative"},"mjx-menclose > mjx-dstrike":{display:"inline-block",left:0,top:0,position:"absolute","border-top":h.SOLID,"transform-origin":"top left"},"mjx-menclose > mjx-ustrike":{display:"inline-block",left:0,bottom:0,position:"absolute","border-top":h.SOLID,"transform-origin":"bottom left"},"mjx-menclose > mjx-hstrike":{"border-top":h.SOLID,position:"absolute",left:0,right:0,bottom:"50%",transform:"translateY("+(0,d.em)(h.THICKNESS/2)+")"},"mjx-menclose > mjx-vstrike":{"border-left":h.SOLID,position:"absolute",top:0,bottom:0,right:"50%",transform:"translateX("+(0,d.em)(h.THICKNESS/2)+")"},"mjx-menclose > mjx-rbox":{position:"absolute",top:0,bottom:0,right:0,left:0,border:h.SOLID,"border-radius":(0,d.em)(h.THICKNESS+h.PADDING)},"mjx-menclose > mjx-cbox":{position:"absolute",top:0,bottom:0,right:0,left:0,border:h.SOLID,"border-radius":"50%"},"mjx-menclose > mjx-arrow":{position:"absolute",left:0,bottom:"50%",height:0,width:0},"mjx-menclose > mjx-arrow > *":{display:"block",position:"absolute","transform-origin":"bottom","border-left":(0,d.em)(h.THICKNESS*h.ARROWX)+" solid","border-right":0,"box-sizing":"border-box"},"mjx-menclose > mjx-arrow > mjx-aline":{left:0,top:(0,d.em)(-h.THICKNESS/2),right:(0,d.em)(h.THICKNESS*(h.ARROWX-1)),height:0,"border-top":(0,d.em)(h.THICKNESS)+" solid","border-left":0},"mjx-menclose > mjx-arrow[double] > mjx-aline":{left:(0,d.em)(h.THICKNESS*(h.ARROWX-1)),height:0},"mjx-menclose > mjx-arrow > mjx-rthead":{transform:"skewX("+y+"rad)",right:0,bottom:"-1px","border-bottom":"1px solid transparent","border-top":(0,d.em)(h.THICKNESS*h.ARROWY)+" solid transparent"},"mjx-menclose > mjx-arrow > mjx-rbhead":{transform:"skewX(-"+y+"rad)","transform-origin":"top",right:0,top:"-1px","border-top":"1px solid transparent","border-bottom":(0,d.em)(h.THICKNESS*h.ARROWY)+" solid transparent"},"mjx-menclose > mjx-arrow > mjx-lthead":{transform:"skewX(-"+y+"rad)",left:0,bottom:"-1px","border-left":0,"border-right":(0,d.em)(h.THICKNESS*h.ARROWX)+" solid","border-bottom":"1px solid transparent","border-top":(0,d.em)(h.THICKNESS*h.ARROWY)+" solid transparent"},"mjx-menclose > mjx-arrow > mjx-lbhead":{transform:"skewX("+y+"rad)","transform-origin":"top",left:0,top:"-1px","border-left":0,"border-right":(0,d.em)(h.THICKNESS*h.ARROWX)+" solid","border-top":"1px solid transparent","border-bottom":(0,d.em)(h.THICKNESS*h.ARROWY)+" solid transparent"},"mjx-menclose > dbox":{position:"absolute",top:0,bottom:0,left:(0,d.em)(-1.5*h.PADDING),width:(0,d.em)(3*h.PADDING),border:(0,d.em)(h.THICKNESS)+" solid","border-radius":"50%","clip-path":"inset(0 0 0 "+(0,d.em)(1.5*h.PADDING)+")","box-sizing":"border-box"}},e.notations=new Map([h.Border("top"),h.Border("right"),h.Border("bottom"),h.Border("left"),h.Border2("actuarial","top","right"),h.Border2("madruwb","bottom","right"),h.DiagonalStrike("up",1),h.DiagonalStrike("down",-1),["horizontalstrike",{renderer:h.RenderElement("hstrike","Y"),bbox:function(t){return[0,t.padding,0,t.padding]}}],["verticalstrike",{renderer:h.RenderElement("vstrike","X"),bbox:function(t){return[t.padding,0,t.padding,0]}}],["box",{renderer:function(t,e){t.adaptor.setStyle(e,"border",t.em(t.thickness)+" solid")},bbox:h.fullBBox,border:h.fullBorder,remove:"left right top bottom"}],["roundedbox",{renderer:h.RenderElement("rbox"),bbox:h.fullBBox}],["circle",{renderer:h.RenderElement("cbox"),bbox:h.fullBBox}],["phasorangle",{renderer:function(t,e){var r=t.getBBox(),n=r.h,o=r.d,i=c(t.getArgMod(1.75*t.padding,n+o),2),s=i[0],a=i[1],l=t.thickness*Math.sin(s)*.9;t.adaptor.setStyle(e,"border-bottom",t.em(t.thickness)+" solid");var u=t.adjustBorder(t.html("mjx-ustrike",{style:{width:t.em(a),transform:"translateX("+t.em(l)+") rotate("+t.fixed(-s)+"rad)"}}));t.adaptor.append(t.chtml,u)},bbox:function(t){var e=t.padding/2,r=t.thickness;return[2*e,e,e+r,3*e+r]},border:function(t){return[0,0,t.thickness,0]},remove:"bottom"}],h.Arrow("up"),h.Arrow("down"),h.Arrow("left"),h.Arrow("right"),h.Arrow("updown"),h.Arrow("leftright"),h.DiagonalArrow("updiagonal"),h.DiagonalArrow("northeast"),h.DiagonalArrow("southeast"),h.DiagonalArrow("northwest"),h.DiagonalArrow("southwest"),h.DiagonalArrow("northeastsouthwest"),h.DiagonalArrow("northwestsoutheast"),["longdiv",{renderer:function(t,e){var r=t.adaptor;r.setStyle(e,"border-top",t.em(t.thickness)+" solid");var n=r.append(t.chtml,t.html("dbox")),o=t.thickness,i=t.padding;o!==h.THICKNESS&&r.setStyle(n,"border-width",t.em(o)),i!==h.PADDING&&(r.setStyle(n,"left",t.em(-1.5*i)),r.setStyle(n,"width",t.em(3*i)),r.setStyle(n,"clip-path","inset(0 0 0 "+t.em(1.5*i)+")"))},bbox:function(t){var e=t.padding,r=t.thickness;return[e+r,e,e,2*e+r/2]}}],["radical",{renderer:function(t,e){t.msqrt.toCHTML(e);var r=t.sqrtTRBL();t.adaptor.setStyle(t.msqrt.chtml,"margin",r.map((function(e){return t.em(-e)})).join(" "))},init:function(t){t.msqrt=t.createMsqrt(t.childNodes[0])},bbox:function(t){return t.sqrtTRBL()},renderChild:!0}]]),e}((0,p.CommonMencloseMixin)(u.CHTMLWrapper));e.CHTMLmenclose=g},2275:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmfenced=void 0;var i=r(5355),s=r(7555),a=r(5410),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t);this.mrow.toCHTML(e)},e.kind=a.MmlMfenced.prototype.kind,e}((0,s.CommonMfencedMixin)(i.CHTMLWrapper));e.CHTMLmfenced=l},9063:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r *":{"font-size":"2000%"},"mjx-dbox":{display:"block","font-size":"5%"},"mjx-num":{display:"block","text-align":"center"},"mjx-den":{display:"block","text-align":"center"},"mjx-mfrac[bevelled] > mjx-num":{display:"inline-block"},"mjx-mfrac[bevelled] > mjx-den":{display:"inline-block"},'mjx-den[align="right"], mjx-num[align="right"]':{"text-align":"right"},'mjx-den[align="left"], mjx-num[align="left"]':{"text-align":"left"},"mjx-nstrut":{display:"inline-block",height:".054em",width:0,"vertical-align":"-.054em"},'mjx-nstrut[type="d"]':{height:".217em","vertical-align":"-.217em"},"mjx-dstrut":{display:"inline-block",height:".505em",width:0},'mjx-dstrut[type="d"]':{height:".726em"},"mjx-line":{display:"block","box-sizing":"border-box","min-height":"1px",height:".06em","border-top":".06em solid",margin:".06em -.1em",overflow:"hidden"},'mjx-line[type="d"]':{margin:".18em -.1em"}},e}((0,a.CommonMfracMixin)(s.CHTMLWrapper));e.CHTMLmfrac=c},6911:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmglyph=void 0;var i=r(5355),s=r(5636),a=r(3985),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t);if(this.charWrapper)this.charWrapper.toCHTML(e);else{var r=this.node.attributes.getList("src","alt"),n=r.src,o=r.alt,i={width:this.em(this.width),height:this.em(this.height)};this.valign&&(i.verticalAlign=this.em(this.valign));var s=this.html("img",{src:n,style:i,alt:o,title:o});this.adaptor.append(e,s)}},e.kind=a.MmlMglyph.prototype.kind,e.styles={"mjx-mglyph > img":{display:"inline-block",border:0,padding:0}},e}((0,s.CommonMglyphMixin)(i.CHTMLWrapper));e.CHTMLmglyph=l},1653:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmi=void 0;var i=r(5355),s=r(5723),a=r(450),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=a.MmlMi.prototype.kind,e}((0,s.CommonMiMixin)(i.CHTMLWrapper));e.CHTMLmi=l},6781:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmmultiscripts=void 0;var s=r(4300),a=r(8009),l=r(6405),c=r(505),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t),r=this.scriptData,n=this.node.getProperty("scriptalign")||"right left",o=i((0,c.split)(n+" "+n),2),s=o[0],a=o[1],l=this.combinePrePost(r.sub,r.psub),u=this.combinePrePost(r.sup,r.psup),p=i(this.getUVQ(l,u),2),h=p[0],f=p[1];if(r.numPrescripts){var d=this.addScripts(h,-f,!0,r.psub,r.psup,this.firstPrescript,r.numPrescripts);"right"!==s&&this.adaptor.setAttribute(d,"script-align",s)}if(this.childNodes[0].toCHTML(e),r.numScripts){d=this.addScripts(h,-f,!1,r.sub,r.sup,1,r.numScripts);"left"!==a&&this.adaptor.setAttribute(d,"script-align",a)}},e.prototype.addScripts=function(t,e,r,n,o,i,s){for(var a=this.adaptor,l=t-o.d+(e-n.h),c=t<0&&0===e?n.h+t:t,u=l>0?{style:{height:this.em(l)}}:{},p=c?{style:{"vertical-align":this.em(c)}}:{},h=this.html("mjx-row"),f=this.html("mjx-row",u),d=this.html("mjx-row"),m="mjx-"+(r?"pre":"")+"scripts",y=i+2*s;i mjx-row > mjx-cell":{"text-align":"right"},'[script-align="left"] > mjx-row > mjx-cell':{"text-align":"left"},'[script-align="center"] > mjx-row > mjx-cell':{"text-align":"center"},'[script-align="right"] > mjx-row > mjx-cell':{"text-align":"right"}},e}((0,a.CommonMmultiscriptsMixin)(s.CHTMLmsubsup));e.CHTMLmmultiscripts=u},6460:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmn=void 0;var i=r(5355),s=r(5023),a=r(3050),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=a.MmlMn.prototype.kind,e}((0,s.CommonMnMixin)(i.CHTMLWrapper));e.CHTMLmn=l},6287:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmo=void 0;var s=r(5355),a=r(7096),l=r(2756),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r,n=this.node.attributes,o=n.get("symmetric")&&2!==this.stretch.dir,s=0!==this.stretch.dir;s&&null===this.size&&this.getStretchedVariant([]);var a=this.standardCHTMLnode(t);if(s&&this.size<0)this.stretchHTML(a);else{if(o||n.get("largeop")){var l=this.em(this.getCenterOffset());"0"!==l&&this.adaptor.setStyle(a,"verticalAlign",l)}this.node.getProperty("mathaccent")&&(this.adaptor.setStyle(a,"width","0"),this.adaptor.setStyle(a,"margin-left",this.em(this.getAccentOffset())));try{for(var c=i(this.childNodes),u=c.next();!u.done;u=c.next()){u.value.toCHTML(a)}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=c.return)&&r.call(c)}finally{if(e)throw e.error}}}},e.prototype.stretchHTML=function(t){var e=this.getText().codePointAt(0);this.font.delimUsage.add(e),this.childNodes[0].markUsed();var r=this.stretch,n=r.stretch,o=[];n[0]&&o.push(this.html("mjx-beg",{},[this.html("mjx-c")])),o.push(this.html("mjx-ext",{},[this.html("mjx-c")])),4===n.length&&o.push(this.html("mjx-mid",{},[this.html("mjx-c")]),this.html("mjx-ext",{},[this.html("mjx-c")])),n[2]&&o.push(this.html("mjx-end",{},[this.html("mjx-c")]));var i={},s=this.bbox,l=s.h,c=s.d,u=s.w;1===r.dir?(o.push(this.html("mjx-mark")),i.height=this.em(l+c),i.verticalAlign=this.em(-c)):i.width=this.em(u);var p=a.DirectionVH[r.dir],h={class:this.char(r.c||e),style:i},f=this.html("mjx-stretchy-"+p,h,o);this.adaptor.append(t,f)},e.kind=l.MmlMo.prototype.kind,e.styles={"mjx-stretchy-h":{display:"inline-table",width:"100%"},"mjx-stretchy-h > *":{display:"table-cell",width:0},"mjx-stretchy-h > * > mjx-c":{display:"inline-block",transform:"scalex(1.0000001)"},"mjx-stretchy-h > * > mjx-c::before":{display:"inline-block",width:"initial"},"mjx-stretchy-h > mjx-ext":{"/* IE */ overflow":"hidden","/* others */ overflow":"clip visible",width:"100%"},"mjx-stretchy-h > mjx-ext > mjx-c::before":{transform:"scalex(500)"},"mjx-stretchy-h > mjx-ext > mjx-c":{width:0},"mjx-stretchy-h > mjx-beg > mjx-c":{"margin-right":"-.1em"},"mjx-stretchy-h > mjx-end > mjx-c":{"margin-left":"-.1em"},"mjx-stretchy-v":{display:"inline-block"},"mjx-stretchy-v > *":{display:"block"},"mjx-stretchy-v > mjx-beg":{height:0},"mjx-stretchy-v > mjx-end > mjx-c":{display:"block"},"mjx-stretchy-v > * > mjx-c":{transform:"scaley(1.0000001)","transform-origin":"left center",overflow:"hidden"},"mjx-stretchy-v > mjx-ext":{display:"block",height:"100%","box-sizing":"border-box",border:"0px solid transparent","/* IE */ overflow":"hidden","/* others */ overflow":"visible clip"},"mjx-stretchy-v > mjx-ext > mjx-c::before":{width:"initial","box-sizing":"border-box"},"mjx-stretchy-v > mjx-ext > mjx-c":{transform:"scaleY(500) translateY(.075em)",overflow:"visible"},"mjx-mark":{display:"inline-block",height:"0px"}},e}((0,a.CommonMoMixin)(s.CHTMLWrapper));e.CHTMLmo=c},5964:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmpadded=void 0;var a=r(5355),l=r(6898),c=r(7238),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r,n=this.standardCHTMLnode(t),o=[],a={},l=i(this.getDimens(),9),c=l[2],u=l[3],p=l[4],h=l[5],f=l[6],d=l[7],m=l[8];if(h&&(a.width=this.em(c+h)),(u||p)&&(a.margin=this.em(u)+" 0 "+this.em(p)),f+m||d){a.position="relative";var y=this.html("mjx-rbox",{style:{left:this.em(f+m),top:this.em(-d),"max-width":a.width}});f+m&&this.childNodes[0].getBBox().pwidth&&(this.adaptor.setAttribute(y,"width","full"),this.adaptor.setStyle(y,"left",this.em(f))),o.push(y)}n=this.adaptor.append(n,this.html("mjx-block",{style:a},o));try{for(var g=s(this.childNodes),b=g.next();!b.done;b=g.next()){b.value.toCHTML(o[0]||n)}}catch(t){e={error:t}}finally{try{b&&!b.done&&(r=g.return)&&r.call(g)}finally{if(e)throw e.error}}},e.kind=c.MmlMpadded.prototype.kind,e.styles={"mjx-mpadded":{display:"inline-block"},"mjx-rbox":{display:"inline-block",position:"relative"}},e}((0,l.CommonMpaddedMixin)(a.CHTMLWrapper));e.CHTMLmpadded=u},8776:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmroot=void 0;var s=r(5610),a=r(6991),l=r(6145),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addRoot=function(t,e,r,n){e.toCHTML(t);var o=i(this.getRootDimens(r,n),3),s=o[0],a=o[1],l=o[2];this.adaptor.setStyle(t,"verticalAlign",this.em(a)),this.adaptor.setStyle(t,"width",this.em(s)),l&&this.adaptor.setStyle(this.adaptor.firstChild(t),"paddingLeft",this.em(l))},e.kind=l.MmlMroot.prototype.kind,e}((0,a.CommonMrootMixin)(s.CHTMLmsqrt));e.CHTMLmroot=c},4798:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLinferredMrow=e.CHTMLmrow=void 0;var s=r(5355),a=r(8411),l=r(8411),c=r(9878),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r,n=this.node.isInferred?this.chtml=t:this.standardCHTMLnode(t),o=!1;try{for(var s=i(this.childNodes),a=s.next();!a.done;a=s.next()){var l=a.value;l.toCHTML(n),l.bbox.w<0&&(o=!0)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}if(o){var c=this.getBBox().w;c&&(this.adaptor.setStyle(n,"width",this.em(Math.max(0,c))),c<0&&this.adaptor.setStyle(n,"marginRight",this.em(c)))}},e.kind=c.MmlMrow.prototype.kind,e}((0,a.CommonMrowMixin)(s.CHTMLWrapper));e.CHTMLmrow=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=c.MmlInferredMrow.prototype.kind,e}((0,l.CommonInferredMrowMixin)(u));e.CHTMLinferredMrow=p},4597:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLms=void 0;var i=r(5355),s=r(4126),a=r(7265),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=a.MmlMs.prototype.kind,e}((0,s.CommonMsMixin)(i.CHTMLWrapper));e.CHTMLms=l},2970:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmspace=void 0;var i=r(5355),s=r(258),a=r(6030),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.standardCHTMLnode(t),r=this.getBBox(),n=r.w,o=r.h,i=r.d;n<0&&(this.adaptor.setStyle(e,"marginRight",this.em(n)),n=0),n&&this.adaptor.setStyle(e,"width",this.em(n)),(o=Math.max(0,o+i))&&this.adaptor.setStyle(e,"height",this.em(Math.max(0,o))),i&&this.adaptor.setStyle(e,"verticalAlign",this.em(-i))},e.kind=a.MmlMspace.prototype.kind,e}((0,s.CommonMspaceMixin)(i.CHTMLWrapper));e.CHTMLmspace=l},5610:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmsqrt=void 0;var s=r(5355),a=r(4093),l=r(7131),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e,r,n,o,s=this.childNodes[this.surd],a=this.childNodes[this.base],l=s.getBBox(),c=a.getOuterBBox(),u=i(this.getPQ(l),2)[1],p=this.font.params.rule_thickness,h=c.h+u+p,f=this.standardCHTMLnode(t);null!=this.root&&(n=this.adaptor.append(f,this.html("mjx-root")),o=this.childNodes[this.root]);var d=this.adaptor.append(f,this.html("mjx-sqrt",{},[e=this.html("mjx-surd"),r=this.html("mjx-box",{style:{paddingTop:this.em(u)}})]));this.addRoot(n,o,l,h),s.toCHTML(e),a.toCHTML(r),s.size<0&&this.adaptor.addClass(d,"mjx-tall")},e.prototype.addRoot=function(t,e,r,n){},e.kind=l.MmlMsqrt.prototype.kind,e.styles={"mjx-root":{display:"inline-block","white-space":"nowrap"},"mjx-surd":{display:"inline-block","vertical-align":"top"},"mjx-sqrt":{display:"inline-block","padding-top":".07em"},"mjx-sqrt > mjx-box":{"border-top":".07em solid"},"mjx-sqrt.mjx-tall > mjx-box":{"padding-left":".3em","margin-left":"-.3em"}},e}((0,a.CommonMsqrtMixin)(s.CHTMLWrapper));e.CHTMLmsqrt=c},4300:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmsubsup=e.CHTMLmsup=e.CHTMLmsub=void 0;var s=r(8650),a=r(905),l=r(905),c=r(905),u=r(4461),p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=u.MmlMsub.prototype.kind,e}((0,a.CommonMsubMixin)(s.CHTMLscriptbase));e.CHTMLmsub=p;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=u.MmlMsup.prototype.kind,e}((0,l.CommonMsupMixin)(s.CHTMLscriptbase));e.CHTMLmsup=h;var f=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){var e=this.adaptor,r=this.standardCHTMLnode(t),n=i([this.baseChild,this.supChild,this.subChild],3),o=n[0],s=n[1],a=n[2],l=i(this.getUVQ(),3),c=l[1],u=l[2],p={"vertical-align":this.em(c)};o.toCHTML(r);var h=e.append(r,this.html("mjx-script",{style:p}));s.toCHTML(h),e.append(h,this.html("mjx-spacer",{style:{"margin-top":this.em(u)}})),a.toCHTML(h);var f=this.getAdjustedIc();f&&e.setStyle(s.chtml,"marginLeft",this.em(f/s.bbox.rscale)),this.baseRemoveIc&&e.setStyle(h,"marginLeft",this.em(-this.baseIc))},e.kind=u.MmlMsubsup.prototype.kind,e.styles={"mjx-script":{display:"inline-block","padding-right":".05em","padding-left":".033em"},"mjx-script > mjx-spacer":{display:"block"}},e}((0,c.CommonMsubsupMixin)(s.CHTMLscriptbase));e.CHTMLmsubsup=f},8002:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmtable=void 0;var a=r(5355),l=r(6237),c=r(1349),u=r(505),p=function(t){function e(e,r,n){void 0===n&&(n=null);var o=t.call(this,e,r,n)||this;return o.itable=o.html("mjx-itable"),o.labels=o.html("mjx-itable"),o}return o(e,t),e.prototype.getAlignShift=function(){var e=t.prototype.getAlignShift.call(this);return this.isTop||(e[1]=0),e},e.prototype.toCHTML=function(t){var e,r,n=this.standardCHTMLnode(t);this.adaptor.append(n,this.html("mjx-table",{},[this.itable]));try{for(var o=i(this.childNodes),s=o.next();!s.done;s=o.next()){s.value.toCHTML(this.itable)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}this.padRows(),this.handleColumnSpacing(),this.handleColumnLines(),this.handleColumnWidths(),this.handleRowSpacing(),this.handleRowLines(),this.handleRowHeights(),this.handleFrame(),this.handleWidth(),this.handleLabels(),this.handleAlign(),this.handleJustify(),this.shiftColor()},e.prototype.shiftColor=function(){var t=this.adaptor,e=t.getStyle(this.chtml,"backgroundColor");e&&(t.setStyle(this.chtml,"backgroundColor",""),t.setStyle(this.itable,"backgroundColor",e))},e.prototype.padRows=function(){var t,e,r=this.adaptor;try{for(var n=i(r.childNodes(this.itable)),o=n.next();!o.done;o=n.next())for(var s=o.value;r.childNodes(s).length1&&"0.4em"!==m||a&&1===p)&&this.adaptor.setStyle(g,"paddingLeft",m),(p1&&"0.215em"!==h||a&&1===l)&&this.adaptor.setStyle(y.chtml,"paddingTop",h),(l mjx-itable":{"vertical-align":"middle","text-align":"left","box-sizing":"border-box"},"mjx-labels > mjx-itable":{position:"absolute",top:0},'mjx-mtable[justify="left"]':{"text-align":"left"},'mjx-mtable[justify="right"]':{"text-align":"right"},'mjx-mtable[justify="left"][side="left"]':{"padding-right":"0 ! important"},'mjx-mtable[justify="left"][side="right"]':{"padding-left":"0 ! important"},'mjx-mtable[justify="right"][side="left"]':{"padding-right":"0 ! important"},'mjx-mtable[justify="right"][side="right"]':{"padding-left":"0 ! important"},"mjx-mtable[align]":{"vertical-align":"baseline"},'mjx-mtable[align="top"] > mjx-table':{"vertical-align":"top"},'mjx-mtable[align="bottom"] > mjx-table':{"vertical-align":"bottom"},'mjx-mtable[side="right"] mjx-labels':{"min-width":"100%"}},e}((0,l.CommonMtableMixin)(a.CHTMLWrapper));e.CHTMLmtable=p},7056:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmtd=void 0;var i=r(5355),s=r(5164),a=r(4359),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.node.attributes.get("rowalign"),n=this.node.attributes.get("columnalign");r!==this.parent.node.attributes.get("rowalign")&&this.adaptor.setAttribute(this.chtml,"rowalign",r),"center"===n||"mlabeledtr"===this.parent.kind&&this===this.parent.childNodes[0]&&n===this.parent.parent.node.attributes.get("side")||this.adaptor.setStyle(this.chtml,"textAlign",n),this.parent.parent.node.getProperty("useHeight")&&this.adaptor.append(this.chtml,this.html("mjx-tstrut"))},e.kind=a.MmlMtd.prototype.kind,e.styles={"mjx-mtd":{display:"table-cell","text-align":"center",padding:".215em .4em"},"mjx-mtd:first-child":{"padding-left":0},"mjx-mtd:last-child":{"padding-right":0},"mjx-mtable > * > mjx-itable > *:first-child > mjx-mtd":{"padding-top":0},"mjx-mtable > * > mjx-itable > *:last-child > mjx-mtd":{"padding-bottom":0},"mjx-tstrut":{display:"inline-block",height:"1em","vertical-align":"-.25em"},'mjx-labels[align="left"] > mjx-mtr > mjx-mtd':{"text-align":"left"},'mjx-labels[align="right"] > mjx-mtr > mjx-mtd':{"text-align":"right"},"mjx-mtd[extra]":{padding:0},'mjx-mtd[rowalign="top"]':{"vertical-align":"top"},'mjx-mtd[rowalign="center"]':{"vertical-align":"middle"},'mjx-mtd[rowalign="bottom"]':{"vertical-align":"bottom"},'mjx-mtd[rowalign="baseline"]':{"vertical-align":"baseline"},'mjx-mtd[rowalign="axis"]':{"vertical-align":".25em"}},e}((0,s.CommonMtdMixin)(i.CHTMLWrapper));e.CHTMLmtd=l},1259:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmtext=void 0;var i=r(5355),s=r(6319),a=r(4770),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=a.MmlMtext.prototype.kind,e}((0,s.CommonMtextMixin)(i.CHTMLWrapper));e.CHTMLmtext=l},3571:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmlabeledtr=e.CHTMLmtr=void 0;var i=r(5355),s=r(5766),a=r(5766),l=r(5022),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.node.attributes.get("rowalign");"baseline"!==r&&this.adaptor.setAttribute(this.chtml,"rowalign",r)},e.kind=l.MmlMtr.prototype.kind,e.styles={"mjx-mtr":{display:"table-row"},'mjx-mtr[rowalign="top"] > mjx-mtd':{"vertical-align":"top"},'mjx-mtr[rowalign="center"] > mjx-mtd':{"vertical-align":"middle"},'mjx-mtr[rowalign="bottom"] > mjx-mtd':{"vertical-align":"bottom"},'mjx-mtr[rowalign="baseline"] > mjx-mtd':{"vertical-align":"baseline"},'mjx-mtr[rowalign="axis"] > mjx-mtd':{"vertical-align":".25em"}},e}((0,s.CommonMtrMixin)(i.CHTMLWrapper));e.CHTMLmtr=c;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){t.prototype.toCHTML.call(this,e);var r=this.adaptor.firstChild(this.chtml);if(r){this.adaptor.remove(r);var n=this.node.attributes.get("rowalign"),o="baseline"!==n&&"axis"!==n?{rowalign:n}:{},i=this.html("mjx-mtr",o,[r]);this.adaptor.append(this.parent.labels,i)}},e.prototype.markUsed=function(){t.prototype.markUsed.call(this),this.jax.wrapperUsage.add(c.kind)},e.kind=l.MmlMlabeledtr.prototype.kind,e.styles={"mjx-mlabeledtr":{display:"table-row"},'mjx-mlabeledtr[rowalign="top"] > mjx-mtd':{"vertical-align":"top"},'mjx-mlabeledtr[rowalign="center"] > mjx-mtd':{"vertical-align":"middle"},'mjx-mlabeledtr[rowalign="bottom"] > mjx-mtd':{"vertical-align":"bottom"},'mjx-mlabeledtr[rowalign="baseline"] > mjx-mtd':{"vertical-align":"baseline"},'mjx-mlabeledtr[rowalign="axis"] > mjx-mtd':{"vertical-align":".25em"}},e}((0,a.CommonMlabeledtrMixin)(c));e.CHTMLmlabeledtr=u},6590:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLmunderover=e.CHTMLmover=e.CHTMLmunder=void 0;var i=r(4300),s=r(1971),a=r(1971),l=r(1971),c=r(5184),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){if(this.hasMovableLimits())return t.prototype.toCHTML.call(this,e),void this.adaptor.setAttribute(this.chtml,"limits","false");this.chtml=this.standardCHTMLnode(e);var r=this.adaptor.append(this.adaptor.append(this.chtml,this.html("mjx-row")),this.html("mjx-base")),n=this.adaptor.append(this.adaptor.append(this.chtml,this.html("mjx-row")),this.html("mjx-under"));this.baseChild.toCHTML(r),this.scriptChild.toCHTML(n);var o=this.baseChild.getOuterBBox(),i=this.scriptChild.getOuterBBox(),s=this.getUnderKV(o,i)[0],a=this.isLineBelow?0:this.getDelta(!0);this.adaptor.setStyle(n,"paddingTop",this.em(s)),this.setDeltaW([r,n],this.getDeltaW([o,i],[0,-a])),this.adjustUnderDepth(n,i)},e.kind=c.MmlMunder.prototype.kind,e.styles={"mjx-over":{"text-align":"left"},'mjx-munder:not([limits="false"])':{display:"inline-table"},"mjx-munder > mjx-row":{"text-align":"left"},"mjx-under":{"padding-bottom":".1em"}},e}((0,s.CommonMunderMixin)(i.CHTMLmsub));e.CHTMLmunder=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){if(this.hasMovableLimits())return t.prototype.toCHTML.call(this,e),void this.adaptor.setAttribute(this.chtml,"limits","false");this.chtml=this.standardCHTMLnode(e);var r=this.adaptor.append(this.chtml,this.html("mjx-over")),n=this.adaptor.append(this.chtml,this.html("mjx-base"));this.scriptChild.toCHTML(r),this.baseChild.toCHTML(n);var o=this.scriptChild.getOuterBBox(),i=this.baseChild.getOuterBBox();this.adjustBaseHeight(n,i);var s=this.getOverKU(i,o)[0],a=this.isLineAbove?0:this.getDelta();this.adaptor.setStyle(r,"paddingBottom",this.em(s)),this.setDeltaW([n,r],this.getDeltaW([i,o],[0,a])),this.adjustOverDepth(r,o)},e.kind=c.MmlMover.prototype.kind,e.styles={'mjx-mover:not([limits="false"])':{"padding-top":".1em"},'mjx-mover:not([limits="false"]) > *':{display:"block","text-align":"left"}},e}((0,a.CommonMoverMixin)(i.CHTMLmsup));e.CHTMLmover=p;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(e){if(this.hasMovableLimits())return t.prototype.toCHTML.call(this,e),void this.adaptor.setAttribute(this.chtml,"limits","false");this.chtml=this.standardCHTMLnode(e);var r=this.adaptor.append(this.chtml,this.html("mjx-over")),n=this.adaptor.append(this.adaptor.append(this.chtml,this.html("mjx-box")),this.html("mjx-munder")),o=this.adaptor.append(this.adaptor.append(n,this.html("mjx-row")),this.html("mjx-base")),i=this.adaptor.append(this.adaptor.append(n,this.html("mjx-row")),this.html("mjx-under"));this.overChild.toCHTML(r),this.baseChild.toCHTML(o),this.underChild.toCHTML(i);var s=this.overChild.getOuterBBox(),a=this.baseChild.getOuterBBox(),l=this.underChild.getOuterBBox();this.adjustBaseHeight(o,a);var c=this.getOverKU(a,s)[0],u=this.getUnderKV(a,l)[0],p=this.getDelta();this.adaptor.setStyle(r,"paddingBottom",this.em(c)),this.adaptor.setStyle(i,"paddingTop",this.em(u)),this.setDeltaW([o,i,r],this.getDeltaW([a,l,s],[0,this.isLineBelow?0:-p,this.isLineAbove?0:p])),this.adjustOverDepth(r,s),this.adjustUnderDepth(i,l)},e.prototype.markUsed=function(){t.prototype.markUsed.call(this),this.jax.wrapperUsage.add(i.CHTMLmsubsup.kind)},e.kind=c.MmlMunderover.prototype.kind,e.styles={'mjx-munderover:not([limits="false"])':{"padding-top":".1em"},'mjx-munderover:not([limits="false"]) > *':{display:"block"}},e}((0,l.CommonMunderoverMixin)(i.CHTMLmsubsup));e.CHTMLmunderover=h},8650:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CHTMLscriptbase=void 0;var a=r(5355),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toCHTML=function(t){this.chtml=this.standardCHTMLnode(t);var e=i(this.getOffset(),2),r=e[0],n=e[1],o=r-(this.baseRemoveIc?this.baseIc:0),s={"vertical-align":this.em(n)};o&&(s["margin-left"]=this.em(o)),this.baseChild.toCHTML(this.chtml),this.scriptChild.toCHTML(this.adaptor.append(this.chtml,this.html("mjx-script",{style:s})))},e.prototype.setDeltaW=function(t,e){for(var r=0;r=0||this.adaptor.setStyle(t,"marginBottom",this.em(e.d*e.rscale))},e.prototype.adjustUnderDepth=function(t,e){var r,n;if(!(e.d>=0)){var o=this.adaptor,i=this.em(e.d),a=this.html("mjx-box",{style:{"margin-bottom":i,"vertical-align":i}});try{for(var l=s(o.childNodes(o.firstChild(t))),c=l.next();!c.done;c=l.next()){var u=c.value;o.append(a,u)}}catch(t){r={error:t}}finally{try{c&&!c.done&&(n=l.return)&&n.call(l)}finally{if(r)throw r.error}}o.append(o.firstChild(t),a)}},e.prototype.adjustBaseHeight=function(t,e){if(this.node.attributes.get("accent")){var r=this.font.params.x_height*e.scale;e.h\\338"},8816:{c:"\\2264\\338"},8817:{c:"\\2265\\338"},8832:{c:"\\227A\\338"},8833:{c:"\\227B\\338"},8836:{c:"\\2282\\338"},8837:{c:"\\2283\\338"},8840:{c:"\\2286\\338"},8841:{c:"\\2287\\338"},8876:{c:"\\22A2\\338"},8877:{c:"\\22A8\\338"},8930:{c:"\\2291\\338"},8931:{c:"\\2292\\338"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},9653:{c:"\\25B3"},9663:{c:"\\25BD"},10072:{c:"\\2223"},10744:{c:"/",f:"BI"},10799:{c:"\\D7"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},4515:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.doubleStruck=void 0;var n=r(6001);Object.defineProperty(e,"doubleStruck",{enumerable:!0,get:function(){return n.doubleStruck}})},6555:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.frakturBold=void 0;var n=r(8042),o=r(3696);e.frakturBold=(0,n.AddCSS)(o.frakturBold,{8260:{c:"/"}})},2183:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.fraktur=void 0;var n=r(8042),o=r(9587);e.fraktur=(0,n.AddCSS)(o.fraktur,{8260:{c:"/"}})},3490:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.italic=void 0;var n=r(8042),o=r(8348);e.italic=(0,n.AddCSS)(o.italic,{47:{f:"I"},989:{c:"\\E008",f:"A"},8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/",f:"I"},8710:{c:"\\394",f:"I"},10744:{c:"/",f:"I"}})},9056:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.largeop=void 0;var n=r(8042),o=r(1376);e.largeop=(0,n.AddCSS)(o.largeop,{8214:{f:"S1"},8260:{c:"/"},8593:{f:"S1"},8595:{f:"S1"},8657:{f:"S1"},8659:{f:"S1"},8739:{f:"S1"},8741:{f:"S1"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},9168:{f:"S1"},10072:{c:"\\2223",f:"S1"},10764:{c:"\\222C\\222C"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},3019:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.monospace=void 0;var n=r(8042),o=r(1439);e.monospace=(0,n.AddCSS)(o.monospace,{697:{c:"\\2032"},913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8215:{c:"_"},8243:{c:"\\2032\\2032"},8244:{c:"\\2032\\2032\\2032"},8260:{c:"/"},8279:{c:"\\2032\\2032\\2032\\2032"},8710:{c:"\\394"}})},2713:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.normal=void 0;var n=r(8042),o=r(331);e.normal=(0,n.AddCSS)(o.normal,{163:{f:"MI"},165:{f:"A"},174:{f:"A"},183:{c:"\\22C5"},240:{f:"A"},697:{c:"\\2032"},913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8192:{c:""},8193:{c:""},8194:{c:""},8195:{c:""},8196:{c:""},8197:{c:""},8198:{c:""},8201:{c:""},8202:{c:""},8203:{c:""},8204:{c:""},8213:{c:"\\2014"},8214:{c:"\\2225"},8215:{c:"_"},8226:{c:"\\2219"},8243:{c:"\\2032\\2032"},8244:{c:"\\2032\\2032\\2032"},8245:{f:"A"},8246:{c:"\\2035\\2035",f:"A"},8247:{c:"\\2035\\2035\\2035",f:"A"},8254:{c:"\\2C9"},8260:{c:"/"},8279:{c:"\\2032\\2032\\2032\\2032"},8288:{c:""},8289:{c:""},8290:{c:""},8291:{c:""},8292:{c:""},8407:{c:"\\2192",f:"V"},8450:{c:"C",f:"A"},8459:{c:"H",f:"SC"},8460:{c:"H",f:"FR"},8461:{c:"H",f:"A"},8462:{c:"h",f:"I"},8463:{f:"A"},8464:{c:"I",f:"SC"},8465:{c:"I",f:"FR"},8466:{c:"L",f:"SC"},8469:{c:"N",f:"A"},8473:{c:"P",f:"A"},8474:{c:"Q",f:"A"},8475:{c:"R",f:"SC"},8476:{c:"R",f:"FR"},8477:{c:"R",f:"A"},8484:{c:"Z",f:"A"},8486:{c:"\\3A9"},8487:{f:"A"},8488:{c:"Z",f:"FR"},8492:{c:"B",f:"SC"},8493:{c:"C",f:"FR"},8496:{c:"E",f:"SC"},8497:{c:"F",f:"SC"},8498:{f:"A"},8499:{c:"M",f:"SC"},8502:{f:"A"},8503:{f:"A"},8504:{f:"A"},8513:{f:"A"},8602:{f:"A"},8603:{f:"A"},8606:{f:"A"},8608:{f:"A"},8610:{f:"A"},8611:{f:"A"},8619:{f:"A"},8620:{f:"A"},8621:{f:"A"},8622:{f:"A"},8624:{f:"A"},8625:{f:"A"},8630:{f:"A"},8631:{f:"A"},8634:{f:"A"},8635:{f:"A"},8638:{f:"A"},8639:{f:"A"},8642:{f:"A"},8643:{f:"A"},8644:{f:"A"},8646:{f:"A"},8647:{f:"A"},8648:{f:"A"},8649:{f:"A"},8650:{f:"A"},8651:{f:"A"},8653:{f:"A"},8654:{f:"A"},8655:{f:"A"},8666:{f:"A"},8667:{f:"A"},8669:{f:"A"},8672:{f:"A"},8674:{f:"A"},8705:{f:"A"},8708:{c:"\\2203\\338"},8710:{c:"\\394"},8716:{c:"\\220B\\338"},8717:{f:"A"},8719:{f:"S1"},8720:{f:"S1"},8721:{f:"S1"},8724:{f:"A"},8737:{f:"A"},8738:{f:"A"},8740:{f:"A"},8742:{f:"A"},8748:{f:"S1"},8749:{f:"S1"},8750:{f:"S1"},8756:{f:"A"},8757:{f:"A"},8765:{f:"A"},8769:{f:"A"},8770:{f:"A"},8772:{c:"\\2243\\338"},8775:{c:"\\2246",f:"A"},8777:{c:"\\2248\\338"},8778:{f:"A"},8782:{f:"A"},8783:{f:"A"},8785:{f:"A"},8786:{f:"A"},8787:{f:"A"},8790:{f:"A"},8791:{f:"A"},8796:{f:"A"},8802:{c:"\\2261\\338"},8806:{f:"A"},8807:{f:"A"},8808:{f:"A"},8809:{f:"A"},8812:{f:"A"},8813:{c:"\\224D\\338"},8814:{f:"A"},8815:{f:"A"},8816:{f:"A"},8817:{f:"A"},8818:{f:"A"},8819:{f:"A"},8820:{c:"\\2272\\338"},8821:{c:"\\2273\\338"},8822:{f:"A"},8823:{f:"A"},8824:{c:"\\2276\\338"},8825:{c:"\\2277\\338"},8828:{f:"A"},8829:{f:"A"},8830:{f:"A"},8831:{f:"A"},8832:{f:"A"},8833:{f:"A"},8836:{c:"\\2282\\338"},8837:{c:"\\2283\\338"},8840:{f:"A"},8841:{f:"A"},8842:{f:"A"},8843:{f:"A"},8847:{f:"A"},8848:{f:"A"},8858:{f:"A"},8859:{f:"A"},8861:{f:"A"},8862:{f:"A"},8863:{f:"A"},8864:{f:"A"},8865:{f:"A"},8873:{f:"A"},8874:{f:"A"},8876:{f:"A"},8877:{f:"A"},8878:{f:"A"},8879:{f:"A"},8882:{f:"A"},8883:{f:"A"},8884:{f:"A"},8885:{f:"A"},8888:{f:"A"},8890:{f:"A"},8891:{f:"A"},8892:{f:"A"},8896:{f:"S1"},8897:{f:"S1"},8898:{f:"S1"},8899:{f:"S1"},8903:{f:"A"},8905:{f:"A"},8906:{f:"A"},8907:{f:"A"},8908:{f:"A"},8909:{f:"A"},8910:{f:"A"},8911:{f:"A"},8912:{f:"A"},8913:{f:"A"},8914:{f:"A"},8915:{f:"A"},8916:{f:"A"},8918:{f:"A"},8919:{f:"A"},8920:{f:"A"},8921:{f:"A"},8922:{f:"A"},8923:{f:"A"},8926:{f:"A"},8927:{f:"A"},8928:{f:"A"},8929:{f:"A"},8930:{c:"\\2291\\338"},8931:{c:"\\2292\\338"},8934:{f:"A"},8935:{f:"A"},8936:{f:"A"},8937:{f:"A"},8938:{f:"A"},8939:{f:"A"},8940:{f:"A"},8941:{f:"A"},8965:{c:"\\22BC",f:"A"},8966:{c:"\\2A5E",f:"A"},8988:{c:"\\250C",f:"A"},8989:{c:"\\2510",f:"A"},8990:{c:"\\2514",f:"A"},8991:{c:"\\2518",f:"A"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},9168:{f:"S1"},9416:{f:"A"},9484:{f:"A"},9488:{f:"A"},9492:{f:"A"},9496:{f:"A"},9585:{f:"A"},9586:{f:"A"},9632:{f:"A"},9633:{f:"A"},9642:{c:"\\25A0",f:"A"},9650:{f:"A"},9652:{c:"\\25B2",f:"A"},9653:{c:"\\25B3"},9654:{f:"A"},9656:{c:"\\25B6",f:"A"},9660:{f:"A"},9662:{c:"\\25BC",f:"A"},9663:{c:"\\25BD"},9664:{f:"A"},9666:{c:"\\25C0",f:"A"},9674:{f:"A"},9723:{c:"\\25A1",f:"A"},9724:{c:"\\25A0",f:"A"},9733:{f:"A"},10003:{f:"A"},10016:{f:"A"},10072:{c:"\\2223"},10731:{f:"A"},10744:{c:"/",f:"I"},10752:{f:"S1"},10753:{f:"S1"},10754:{f:"S1"},10756:{f:"S1"},10758:{f:"S1"},10764:{c:"\\222C\\222C",f:"S1"},10799:{c:"\\D7"},10846:{f:"A"},10877:{f:"A"},10878:{f:"A"},10885:{f:"A"},10886:{f:"A"},10887:{f:"A"},10888:{f:"A"},10889:{f:"A"},10890:{f:"A"},10891:{f:"A"},10892:{f:"A"},10901:{f:"A"},10902:{f:"A"},10933:{f:"A"},10934:{f:"A"},10935:{f:"A"},10936:{f:"A"},10937:{f:"A"},10938:{f:"A"},10949:{f:"A"},10950:{f:"A"},10955:{f:"A"},10956:{f:"A"},12296:{c:"\\27E8"},12297:{c:"\\27E9"},57350:{f:"A"},57351:{f:"A"},57352:{f:"A"},57353:{f:"A"},57356:{f:"A"},57357:{f:"A"},57358:{f:"A"},57359:{f:"A"},57360:{f:"A"},57361:{f:"A"},57366:{f:"A"},57367:{f:"A"},57368:{f:"A"},57369:{f:"A"},57370:{f:"A"},57371:{f:"A"},119808:{c:"A",f:"B"},119809:{c:"B",f:"B"},119810:{c:"C",f:"B"},119811:{c:"D",f:"B"},119812:{c:"E",f:"B"},119813:{c:"F",f:"B"},119814:{c:"G",f:"B"},119815:{c:"H",f:"B"},119816:{c:"I",f:"B"},119817:{c:"J",f:"B"},119818:{c:"K",f:"B"},119819:{c:"L",f:"B"},119820:{c:"M",f:"B"},119821:{c:"N",f:"B"},119822:{c:"O",f:"B"},119823:{c:"P",f:"B"},119824:{c:"Q",f:"B"},119825:{c:"R",f:"B"},119826:{c:"S",f:"B"},119827:{c:"T",f:"B"},119828:{c:"U",f:"B"},119829:{c:"V",f:"B"},119830:{c:"W",f:"B"},119831:{c:"X",f:"B"},119832:{c:"Y",f:"B"},119833:{c:"Z",f:"B"},119834:{c:"a",f:"B"},119835:{c:"b",f:"B"},119836:{c:"c",f:"B"},119837:{c:"d",f:"B"},119838:{c:"e",f:"B"},119839:{c:"f",f:"B"},119840:{c:"g",f:"B"},119841:{c:"h",f:"B"},119842:{c:"i",f:"B"},119843:{c:"j",f:"B"},119844:{c:"k",f:"B"},119845:{c:"l",f:"B"},119846:{c:"m",f:"B"},119847:{c:"n",f:"B"},119848:{c:"o",f:"B"},119849:{c:"p",f:"B"},119850:{c:"q",f:"B"},119851:{c:"r",f:"B"},119852:{c:"s",f:"B"},119853:{c:"t",f:"B"},119854:{c:"u",f:"B"},119855:{c:"v",f:"B"},119856:{c:"w",f:"B"},119857:{c:"x",f:"B"},119858:{c:"y",f:"B"},119859:{c:"z",f:"B"},119860:{c:"A",f:"I"},119861:{c:"B",f:"I"},119862:{c:"C",f:"I"},119863:{c:"D",f:"I"},119864:{c:"E",f:"I"},119865:{c:"F",f:"I"},119866:{c:"G",f:"I"},119867:{c:"H",f:"I"},119868:{c:"I",f:"I"},119869:{c:"J",f:"I"},119870:{c:"K",f:"I"},119871:{c:"L",f:"I"},119872:{c:"M",f:"I"},119873:{c:"N",f:"I"},119874:{c:"O",f:"I"},119875:{c:"P",f:"I"},119876:{c:"Q",f:"I"},119877:{c:"R",f:"I"},119878:{c:"S",f:"I"},119879:{c:"T",f:"I"},119880:{c:"U",f:"I"},119881:{c:"V",f:"I"},119882:{c:"W",f:"I"},119883:{c:"X",f:"I"},119884:{c:"Y",f:"I"},119885:{c:"Z",f:"I"},119886:{c:"a",f:"I"},119887:{c:"b",f:"I"},119888:{c:"c",f:"I"},119889:{c:"d",f:"I"},119890:{c:"e",f:"I"},119891:{c:"f",f:"I"},119892:{c:"g",f:"I"},119894:{c:"i",f:"I"},119895:{c:"j",f:"I"},119896:{c:"k",f:"I"},119897:{c:"l",f:"I"},119898:{c:"m",f:"I"},119899:{c:"n",f:"I"},119900:{c:"o",f:"I"},119901:{c:"p",f:"I"},119902:{c:"q",f:"I"},119903:{c:"r",f:"I"},119904:{c:"s",f:"I"},119905:{c:"t",f:"I"},119906:{c:"u",f:"I"},119907:{c:"v",f:"I"},119908:{c:"w",f:"I"},119909:{c:"x",f:"I"},119910:{c:"y",f:"I"},119911:{c:"z",f:"I"},119912:{c:"A",f:"BI"},119913:{c:"B",f:"BI"},119914:{c:"C",f:"BI"},119915:{c:"D",f:"BI"},119916:{c:"E",f:"BI"},119917:{c:"F",f:"BI"},119918:{c:"G",f:"BI"},119919:{c:"H",f:"BI"},119920:{c:"I",f:"BI"},119921:{c:"J",f:"BI"},119922:{c:"K",f:"BI"},119923:{c:"L",f:"BI"},119924:{c:"M",f:"BI"},119925:{c:"N",f:"BI"},119926:{c:"O",f:"BI"},119927:{c:"P",f:"BI"},119928:{c:"Q",f:"BI"},119929:{c:"R",f:"BI"},119930:{c:"S",f:"BI"},119931:{c:"T",f:"BI"},119932:{c:"U",f:"BI"},119933:{c:"V",f:"BI"},119934:{c:"W",f:"BI"},119935:{c:"X",f:"BI"},119936:{c:"Y",f:"BI"},119937:{c:"Z",f:"BI"},119938:{c:"a",f:"BI"},119939:{c:"b",f:"BI"},119940:{c:"c",f:"BI"},119941:{c:"d",f:"BI"},119942:{c:"e",f:"BI"},119943:{c:"f",f:"BI"},119944:{c:"g",f:"BI"},119945:{c:"h",f:"BI"},119946:{c:"i",f:"BI"},119947:{c:"j",f:"BI"},119948:{c:"k",f:"BI"},119949:{c:"l",f:"BI"},119950:{c:"m",f:"BI"},119951:{c:"n",f:"BI"},119952:{c:"o",f:"BI"},119953:{c:"p",f:"BI"},119954:{c:"q",f:"BI"},119955:{c:"r",f:"BI"},119956:{c:"s",f:"BI"},119957:{c:"t",f:"BI"},119958:{c:"u",f:"BI"},119959:{c:"v",f:"BI"},119960:{c:"w",f:"BI"},119961:{c:"x",f:"BI"},119962:{c:"y",f:"BI"},119963:{c:"z",f:"BI"},119964:{c:"A",f:"SC"},119966:{c:"C",f:"SC"},119967:{c:"D",f:"SC"},119970:{c:"G",f:"SC"},119973:{c:"J",f:"SC"},119974:{c:"K",f:"SC"},119977:{c:"N",f:"SC"},119978:{c:"O",f:"SC"},119979:{c:"P",f:"SC"},119980:{c:"Q",f:"SC"},119982:{c:"S",f:"SC"},119983:{c:"T",f:"SC"},119984:{c:"U",f:"SC"},119985:{c:"V",f:"SC"},119986:{c:"W",f:"SC"},119987:{c:"X",f:"SC"},119988:{c:"Y",f:"SC"},119989:{c:"Z",f:"SC"},120068:{c:"A",f:"FR"},120069:{c:"B",f:"FR"},120071:{c:"D",f:"FR"},120072:{c:"E",f:"FR"},120073:{c:"F",f:"FR"},120074:{c:"G",f:"FR"},120077:{c:"J",f:"FR"},120078:{c:"K",f:"FR"},120079:{c:"L",f:"FR"},120080:{c:"M",f:"FR"},120081:{c:"N",f:"FR"},120082:{c:"O",f:"FR"},120083:{c:"P",f:"FR"},120084:{c:"Q",f:"FR"},120086:{c:"S",f:"FR"},120087:{c:"T",f:"FR"},120088:{c:"U",f:"FR"},120089:{c:"V",f:"FR"},120090:{c:"W",f:"FR"},120091:{c:"X",f:"FR"},120092:{c:"Y",f:"FR"},120094:{c:"a",f:"FR"},120095:{c:"b",f:"FR"},120096:{c:"c",f:"FR"},120097:{c:"d",f:"FR"},120098:{c:"e",f:"FR"},120099:{c:"f",f:"FR"},120100:{c:"g",f:"FR"},120101:{c:"h",f:"FR"},120102:{c:"i",f:"FR"},120103:{c:"j",f:"FR"},120104:{c:"k",f:"FR"},120105:{c:"l",f:"FR"},120106:{c:"m",f:"FR"},120107:{c:"n",f:"FR"},120108:{c:"o",f:"FR"},120109:{c:"p",f:"FR"},120110:{c:"q",f:"FR"},120111:{c:"r",f:"FR"},120112:{c:"s",f:"FR"},120113:{c:"t",f:"FR"},120114:{c:"u",f:"FR"},120115:{c:"v",f:"FR"},120116:{c:"w",f:"FR"},120117:{c:"x",f:"FR"},120118:{c:"y",f:"FR"},120119:{c:"z",f:"FR"},120120:{c:"A",f:"A"},120121:{c:"B",f:"A"},120123:{c:"D",f:"A"},120124:{c:"E",f:"A"},120125:{c:"F",f:"A"},120126:{c:"G",f:"A"},120128:{c:"I",f:"A"},120129:{c:"J",f:"A"},120130:{c:"K",f:"A"},120131:{c:"L",f:"A"},120132:{c:"M",f:"A"},120134:{c:"O",f:"A"},120138:{c:"S",f:"A"},120139:{c:"T",f:"A"},120140:{c:"U",f:"A"},120141:{c:"V",f:"A"},120142:{c:"W",f:"A"},120143:{c:"X",f:"A"},120144:{c:"Y",f:"A"},120172:{c:"A",f:"FRB"},120173:{c:"B",f:"FRB"},120174:{c:"C",f:"FRB"},120175:{c:"D",f:"FRB"},120176:{c:"E",f:"FRB"},120177:{c:"F",f:"FRB"},120178:{c:"G",f:"FRB"},120179:{c:"H",f:"FRB"},120180:{c:"I",f:"FRB"},120181:{c:"J",f:"FRB"},120182:{c:"K",f:"FRB"},120183:{c:"L",f:"FRB"},120184:{c:"M",f:"FRB"},120185:{c:"N",f:"FRB"},120186:{c:"O",f:"FRB"},120187:{c:"P",f:"FRB"},120188:{c:"Q",f:"FRB"},120189:{c:"R",f:"FRB"},120190:{c:"S",f:"FRB"},120191:{c:"T",f:"FRB"},120192:{c:"U",f:"FRB"},120193:{c:"V",f:"FRB"},120194:{c:"W",f:"FRB"},120195:{c:"X",f:"FRB"},120196:{c:"Y",f:"FRB"},120197:{c:"Z",f:"FRB"},120198:{c:"a",f:"FRB"},120199:{c:"b",f:"FRB"},120200:{c:"c",f:"FRB"},120201:{c:"d",f:"FRB"},120202:{c:"e",f:"FRB"},120203:{c:"f",f:"FRB"},120204:{c:"g",f:"FRB"},120205:{c:"h",f:"FRB"},120206:{c:"i",f:"FRB"},120207:{c:"j",f:"FRB"},120208:{c:"k",f:"FRB"},120209:{c:"l",f:"FRB"},120210:{c:"m",f:"FRB"},120211:{c:"n",f:"FRB"},120212:{c:"o",f:"FRB"},120213:{c:"p",f:"FRB"},120214:{c:"q",f:"FRB"},120215:{c:"r",f:"FRB"},120216:{c:"s",f:"FRB"},120217:{c:"t",f:"FRB"},120218:{c:"u",f:"FRB"},120219:{c:"v",f:"FRB"},120220:{c:"w",f:"FRB"},120221:{c:"x",f:"FRB"},120222:{c:"y",f:"FRB"},120223:{c:"z",f:"FRB"},120224:{c:"A",f:"SS"},120225:{c:"B",f:"SS"},120226:{c:"C",f:"SS"},120227:{c:"D",f:"SS"},120228:{c:"E",f:"SS"},120229:{c:"F",f:"SS"},120230:{c:"G",f:"SS"},120231:{c:"H",f:"SS"},120232:{c:"I",f:"SS"},120233:{c:"J",f:"SS"},120234:{c:"K",f:"SS"},120235:{c:"L",f:"SS"},120236:{c:"M",f:"SS"},120237:{c:"N",f:"SS"},120238:{c:"O",f:"SS"},120239:{c:"P",f:"SS"},120240:{c:"Q",f:"SS"},120241:{c:"R",f:"SS"},120242:{c:"S",f:"SS"},120243:{c:"T",f:"SS"},120244:{c:"U",f:"SS"},120245:{c:"V",f:"SS"},120246:{c:"W",f:"SS"},120247:{c:"X",f:"SS"},120248:{c:"Y",f:"SS"},120249:{c:"Z",f:"SS"},120250:{c:"a",f:"SS"},120251:{c:"b",f:"SS"},120252:{c:"c",f:"SS"},120253:{c:"d",f:"SS"},120254:{c:"e",f:"SS"},120255:{c:"f",f:"SS"},120256:{c:"g",f:"SS"},120257:{c:"h",f:"SS"},120258:{c:"i",f:"SS"},120259:{c:"j",f:"SS"},120260:{c:"k",f:"SS"},120261:{c:"l",f:"SS"},120262:{c:"m",f:"SS"},120263:{c:"n",f:"SS"},120264:{c:"o",f:"SS"},120265:{c:"p",f:"SS"},120266:{c:"q",f:"SS"},120267:{c:"r",f:"SS"},120268:{c:"s",f:"SS"},120269:{c:"t",f:"SS"},120270:{c:"u",f:"SS"},120271:{c:"v",f:"SS"},120272:{c:"w",f:"SS"},120273:{c:"x",f:"SS"},120274:{c:"y",f:"SS"},120275:{c:"z",f:"SS"},120276:{c:"A",f:"SSB"},120277:{c:"B",f:"SSB"},120278:{c:"C",f:"SSB"},120279:{c:"D",f:"SSB"},120280:{c:"E",f:"SSB"},120281:{c:"F",f:"SSB"},120282:{c:"G",f:"SSB"},120283:{c:"H",f:"SSB"},120284:{c:"I",f:"SSB"},120285:{c:"J",f:"SSB"},120286:{c:"K",f:"SSB"},120287:{c:"L",f:"SSB"},120288:{c:"M",f:"SSB"},120289:{c:"N",f:"SSB"},120290:{c:"O",f:"SSB"},120291:{c:"P",f:"SSB"},120292:{c:"Q",f:"SSB"},120293:{c:"R",f:"SSB"},120294:{c:"S",f:"SSB"},120295:{c:"T",f:"SSB"},120296:{c:"U",f:"SSB"},120297:{c:"V",f:"SSB"},120298:{c:"W",f:"SSB"},120299:{c:"X",f:"SSB"},120300:{c:"Y",f:"SSB"},120301:{c:"Z",f:"SSB"},120302:{c:"a",f:"SSB"},120303:{c:"b",f:"SSB"},120304:{c:"c",f:"SSB"},120305:{c:"d",f:"SSB"},120306:{c:"e",f:"SSB"},120307:{c:"f",f:"SSB"},120308:{c:"g",f:"SSB"},120309:{c:"h",f:"SSB"},120310:{c:"i",f:"SSB"},120311:{c:"j",f:"SSB"},120312:{c:"k",f:"SSB"},120313:{c:"l",f:"SSB"},120314:{c:"m",f:"SSB"},120315:{c:"n",f:"SSB"},120316:{c:"o",f:"SSB"},120317:{c:"p",f:"SSB"},120318:{c:"q",f:"SSB"},120319:{c:"r",f:"SSB"},120320:{c:"s",f:"SSB"},120321:{c:"t",f:"SSB"},120322:{c:"u",f:"SSB"},120323:{c:"v",f:"SSB"},120324:{c:"w",f:"SSB"},120325:{c:"x",f:"SSB"},120326:{c:"y",f:"SSB"},120327:{c:"z",f:"SSB"},120328:{c:"A",f:"SSI"},120329:{c:"B",f:"SSI"},120330:{c:"C",f:"SSI"},120331:{c:"D",f:"SSI"},120332:{c:"E",f:"SSI"},120333:{c:"F",f:"SSI"},120334:{c:"G",f:"SSI"},120335:{c:"H",f:"SSI"},120336:{c:"I",f:"SSI"},120337:{c:"J",f:"SSI"},120338:{c:"K",f:"SSI"},120339:{c:"L",f:"SSI"},120340:{c:"M",f:"SSI"},120341:{c:"N",f:"SSI"},120342:{c:"O",f:"SSI"},120343:{c:"P",f:"SSI"},120344:{c:"Q",f:"SSI"},120345:{c:"R",f:"SSI"},120346:{c:"S",f:"SSI"},120347:{c:"T",f:"SSI"},120348:{c:"U",f:"SSI"},120349:{c:"V",f:"SSI"},120350:{c:"W",f:"SSI"},120351:{c:"X",f:"SSI"},120352:{c:"Y",f:"SSI"},120353:{c:"Z",f:"SSI"},120354:{c:"a",f:"SSI"},120355:{c:"b",f:"SSI"},120356:{c:"c",f:"SSI"},120357:{c:"d",f:"SSI"},120358:{c:"e",f:"SSI"},120359:{c:"f",f:"SSI"},120360:{c:"g",f:"SSI"},120361:{c:"h",f:"SSI"},120362:{c:"i",f:"SSI"},120363:{c:"j",f:"SSI"},120364:{c:"k",f:"SSI"},120365:{c:"l",f:"SSI"},120366:{c:"m",f:"SSI"},120367:{c:"n",f:"SSI"},120368:{c:"o",f:"SSI"},120369:{c:"p",f:"SSI"},120370:{c:"q",f:"SSI"},120371:{c:"r",f:"SSI"},120372:{c:"s",f:"SSI"},120373:{c:"t",f:"SSI"},120374:{c:"u",f:"SSI"},120375:{c:"v",f:"SSI"},120376:{c:"w",f:"SSI"},120377:{c:"x",f:"SSI"},120378:{c:"y",f:"SSI"},120379:{c:"z",f:"SSI"},120432:{c:"A",f:"T"},120433:{c:"B",f:"T"},120434:{c:"C",f:"T"},120435:{c:"D",f:"T"},120436:{c:"E",f:"T"},120437:{c:"F",f:"T"},120438:{c:"G",f:"T"},120439:{c:"H",f:"T"},120440:{c:"I",f:"T"},120441:{c:"J",f:"T"},120442:{c:"K",f:"T"},120443:{c:"L",f:"T"},120444:{c:"M",f:"T"},120445:{c:"N",f:"T"},120446:{c:"O",f:"T"},120447:{c:"P",f:"T"},120448:{c:"Q",f:"T"},120449:{c:"R",f:"T"},120450:{c:"S",f:"T"},120451:{c:"T",f:"T"},120452:{c:"U",f:"T"},120453:{c:"V",f:"T"},120454:{c:"W",f:"T"},120455:{c:"X",f:"T"},120456:{c:"Y",f:"T"},120457:{c:"Z",f:"T"},120458:{c:"a",f:"T"},120459:{c:"b",f:"T"},120460:{c:"c",f:"T"},120461:{c:"d",f:"T"},120462:{c:"e",f:"T"},120463:{c:"f",f:"T"},120464:{c:"g",f:"T"},120465:{c:"h",f:"T"},120466:{c:"i",f:"T"},120467:{c:"j",f:"T"},120468:{c:"k",f:"T"},120469:{c:"l",f:"T"},120470:{c:"m",f:"T"},120471:{c:"n",f:"T"},120472:{c:"o",f:"T"},120473:{c:"p",f:"T"},120474:{c:"q",f:"T"},120475:{c:"r",f:"T"},120476:{c:"s",f:"T"},120477:{c:"t",f:"T"},120478:{c:"u",f:"T"},120479:{c:"v",f:"T"},120480:{c:"w",f:"T"},120481:{c:"x",f:"T"},120482:{c:"y",f:"T"},120483:{c:"z",f:"T"},120488:{c:"A",f:"B"},120489:{c:"B",f:"B"},120490:{c:"\\393",f:"B"},120491:{c:"\\394",f:"B"},120492:{c:"E",f:"B"},120493:{c:"Z",f:"B"},120494:{c:"H",f:"B"},120495:{c:"\\398",f:"B"},120496:{c:"I",f:"B"},120497:{c:"K",f:"B"},120498:{c:"\\39B",f:"B"},120499:{c:"M",f:"B"},120500:{c:"N",f:"B"},120501:{c:"\\39E",f:"B"},120502:{c:"O",f:"B"},120503:{c:"\\3A0",f:"B"},120504:{c:"P",f:"B"},120506:{c:"\\3A3",f:"B"},120507:{c:"T",f:"B"},120508:{c:"\\3A5",f:"B"},120509:{c:"\\3A6",f:"B"},120510:{c:"X",f:"B"},120511:{c:"\\3A8",f:"B"},120512:{c:"\\3A9",f:"B"},120513:{c:"\\2207",f:"B"},120546:{c:"A",f:"I"},120547:{c:"B",f:"I"},120548:{c:"\\393",f:"I"},120549:{c:"\\394",f:"I"},120550:{c:"E",f:"I"},120551:{c:"Z",f:"I"},120552:{c:"H",f:"I"},120553:{c:"\\398",f:"I"},120554:{c:"I",f:"I"},120555:{c:"K",f:"I"},120556:{c:"\\39B",f:"I"},120557:{c:"M",f:"I"},120558:{c:"N",f:"I"},120559:{c:"\\39E",f:"I"},120560:{c:"O",f:"I"},120561:{c:"\\3A0",f:"I"},120562:{c:"P",f:"I"},120564:{c:"\\3A3",f:"I"},120565:{c:"T",f:"I"},120566:{c:"\\3A5",f:"I"},120567:{c:"\\3A6",f:"I"},120568:{c:"X",f:"I"},120569:{c:"\\3A8",f:"I"},120570:{c:"\\3A9",f:"I"},120572:{c:"\\3B1",f:"I"},120573:{c:"\\3B2",f:"I"},120574:{c:"\\3B3",f:"I"},120575:{c:"\\3B4",f:"I"},120576:{c:"\\3B5",f:"I"},120577:{c:"\\3B6",f:"I"},120578:{c:"\\3B7",f:"I"},120579:{c:"\\3B8",f:"I"},120580:{c:"\\3B9",f:"I"},120581:{c:"\\3BA",f:"I"},120582:{c:"\\3BB",f:"I"},120583:{c:"\\3BC",f:"I"},120584:{c:"\\3BD",f:"I"},120585:{c:"\\3BE",f:"I"},120586:{c:"\\3BF",f:"I"},120587:{c:"\\3C0",f:"I"},120588:{c:"\\3C1",f:"I"},120589:{c:"\\3C2",f:"I"},120590:{c:"\\3C3",f:"I"},120591:{c:"\\3C4",f:"I"},120592:{c:"\\3C5",f:"I"},120593:{c:"\\3C6",f:"I"},120594:{c:"\\3C7",f:"I"},120595:{c:"\\3C8",f:"I"},120596:{c:"\\3C9",f:"I"},120597:{c:"\\2202"},120598:{c:"\\3F5",f:"I"},120599:{c:"\\3D1",f:"I"},120600:{c:"\\E009",f:"A"},120601:{c:"\\3D5",f:"I"},120602:{c:"\\3F1",f:"I"},120603:{c:"\\3D6",f:"I"},120604:{c:"A",f:"BI"},120605:{c:"B",f:"BI"},120606:{c:"\\393",f:"BI"},120607:{c:"\\394",f:"BI"},120608:{c:"E",f:"BI"},120609:{c:"Z",f:"BI"},120610:{c:"H",f:"BI"},120611:{c:"\\398",f:"BI"},120612:{c:"I",f:"BI"},120613:{c:"K",f:"BI"},120614:{c:"\\39B",f:"BI"},120615:{c:"M",f:"BI"},120616:{c:"N",f:"BI"},120617:{c:"\\39E",f:"BI"},120618:{c:"O",f:"BI"},120619:{c:"\\3A0",f:"BI"},120620:{c:"P",f:"BI"},120622:{c:"\\3A3",f:"BI"},120623:{c:"T",f:"BI"},120624:{c:"\\3A5",f:"BI"},120625:{c:"\\3A6",f:"BI"},120626:{c:"X",f:"BI"},120627:{c:"\\3A8",f:"BI"},120628:{c:"\\3A9",f:"BI"},120630:{c:"\\3B1",f:"BI"},120631:{c:"\\3B2",f:"BI"},120632:{c:"\\3B3",f:"BI"},120633:{c:"\\3B4",f:"BI"},120634:{c:"\\3B5",f:"BI"},120635:{c:"\\3B6",f:"BI"},120636:{c:"\\3B7",f:"BI"},120637:{c:"\\3B8",f:"BI"},120638:{c:"\\3B9",f:"BI"},120639:{c:"\\3BA",f:"BI"},120640:{c:"\\3BB",f:"BI"},120641:{c:"\\3BC",f:"BI"},120642:{c:"\\3BD",f:"BI"},120643:{c:"\\3BE",f:"BI"},120644:{c:"\\3BF",f:"BI"},120645:{c:"\\3C0",f:"BI"},120646:{c:"\\3C1",f:"BI"},120647:{c:"\\3C2",f:"BI"},120648:{c:"\\3C3",f:"BI"},120649:{c:"\\3C4",f:"BI"},120650:{c:"\\3C5",f:"BI"},120651:{c:"\\3C6",f:"BI"},120652:{c:"\\3C7",f:"BI"},120653:{c:"\\3C8",f:"BI"},120654:{c:"\\3C9",f:"BI"},120655:{c:"\\2202",f:"B"},120656:{c:"\\3F5",f:"BI"},120657:{c:"\\3D1",f:"BI"},120658:{c:"\\E009",f:"A"},120659:{c:"\\3D5",f:"BI"},120660:{c:"\\3F1",f:"BI"},120661:{c:"\\3D6",f:"BI"},120662:{c:"A",f:"SSB"},120663:{c:"B",f:"SSB"},120664:{c:"\\393",f:"SSB"},120665:{c:"\\394",f:"SSB"},120666:{c:"E",f:"SSB"},120667:{c:"Z",f:"SSB"},120668:{c:"H",f:"SSB"},120669:{c:"\\398",f:"SSB"},120670:{c:"I",f:"SSB"},120671:{c:"K",f:"SSB"},120672:{c:"\\39B",f:"SSB"},120673:{c:"M",f:"SSB"},120674:{c:"N",f:"SSB"},120675:{c:"\\39E",f:"SSB"},120676:{c:"O",f:"SSB"},120677:{c:"\\3A0",f:"SSB"},120678:{c:"P",f:"SSB"},120680:{c:"\\3A3",f:"SSB"},120681:{c:"T",f:"SSB"},120682:{c:"\\3A5",f:"SSB"},120683:{c:"\\3A6",f:"SSB"},120684:{c:"X",f:"SSB"},120685:{c:"\\3A8",f:"SSB"},120686:{c:"\\3A9",f:"SSB"},120782:{c:"0",f:"B"},120783:{c:"1",f:"B"},120784:{c:"2",f:"B"},120785:{c:"3",f:"B"},120786:{c:"4",f:"B"},120787:{c:"5",f:"B"},120788:{c:"6",f:"B"},120789:{c:"7",f:"B"},120790:{c:"8",f:"B"},120791:{c:"9",f:"B"},120802:{c:"0",f:"SS"},120803:{c:"1",f:"SS"},120804:{c:"2",f:"SS"},120805:{c:"3",f:"SS"},120806:{c:"4",f:"SS"},120807:{c:"5",f:"SS"},120808:{c:"6",f:"SS"},120809:{c:"7",f:"SS"},120810:{c:"8",f:"SS"},120811:{c:"9",f:"SS"},120812:{c:"0",f:"SSB"},120813:{c:"1",f:"SSB"},120814:{c:"2",f:"SSB"},120815:{c:"3",f:"SSB"},120816:{c:"4",f:"SSB"},120817:{c:"5",f:"SSB"},120818:{c:"6",f:"SSB"},120819:{c:"7",f:"SSB"},120820:{c:"8",f:"SSB"},120821:{c:"9",f:"SSB"},120822:{c:"0",f:"T"},120823:{c:"1",f:"T"},120824:{c:"2",f:"T"},120825:{c:"3",f:"T"},120826:{c:"4",f:"T"},120827:{c:"5",f:"T"},120828:{c:"6",f:"T"},120829:{c:"7",f:"T"},120830:{c:"8",f:"T"},120831:{c:"9",f:"T"}})},7517:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifBoldItalic=void 0;var n=r(8042),o=r(4886);e.sansSerifBoldItalic=(0,n.AddCSS)(o.sansSerifBoldItalic,{305:{f:"SSB"},567:{f:"SSB"}})},4182:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifBold=void 0;var n=r(8042),o=r(4471);e.sansSerifBold=(0,n.AddCSS)(o.sansSerifBold,{8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/"},8710:{c:"\\394"}})},2679:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifItalic=void 0;var n=r(8042),o=r(5181);e.sansSerifItalic=(0,n.AddCSS)(o.sansSerifItalic,{913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/"},8710:{c:"\\394"}})},5469:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerif=void 0;var n=r(8042),o=r(3526);e.sansSerif=(0,n.AddCSS)(o.sansSerif,{913:{c:"A"},914:{c:"B"},917:{c:"E"},918:{c:"Z"},919:{c:"H"},921:{c:"I"},922:{c:"K"},924:{c:"M"},925:{c:"N"},927:{c:"O"},929:{c:"P"},932:{c:"T"},935:{c:"X"},8213:{c:"\\2014"},8215:{c:"_"},8260:{c:"/"},8710:{c:"\\394"}})},7563:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.scriptBold=void 0;var n=r(5649);Object.defineProperty(e,"scriptBold",{enumerable:!0,get:function(){return n.scriptBold}})},9409:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.script=void 0;var n=r(7153);Object.defineProperty(e,"script",{enumerable:!0,get:function(){return n.script}})},775:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.smallop=void 0;var n=r(8042),o=r(5745);e.smallop=(0,n.AddCSS)(o.smallop,{8260:{c:"/"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},10072:{c:"\\2223"},10764:{c:"\\222C\\222C"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},9551:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texCalligraphicBold=void 0;var n=r(8042),o=r(1411);e.texCalligraphicBold=(0,n.AddCSS)(o.texCalligraphicBold,{305:{f:"B"},567:{f:"B"}})},7907:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texCalligraphic=void 0;var n=r(6384);Object.defineProperty(e,"texCalligraphic",{enumerable:!0,get:function(){return n.texCalligraphic}})},9659:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texMathit=void 0;var n=r(6041);Object.defineProperty(e,"texMathit",{enumerable:!0,get:function(){return n.texMathit}})},98:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texOldstyleBold=void 0;var n=r(8199);Object.defineProperty(e,"texOldstyleBold",{enumerable:!0,get:function(){return n.texOldstyleBold}})},6275:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texOldstyle=void 0;var n=r(9848);Object.defineProperty(e,"texOldstyle",{enumerable:!0,get:function(){return n.texOldstyle}})},6530:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texSize3=void 0;var n=r(8042),o=r(7906);e.texSize3=(0,n.AddCSS)(o.texSize3,{8260:{c:"/"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},12296:{c:"\\27E8"},12297:{c:"\\27E9"}})},4409:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texSize4=void 0;var n=r(8042),o=r(2644);e.texSize4=(0,n.AddCSS)(o.texSize4,{8260:{c:"/"},9001:{c:"\\27E8"},9002:{c:"\\27E9"},12296:{c:"\\27E8"},12297:{c:"\\27E9"},57685:{c:"\\E153\\E152"},57686:{c:"\\E151\\E150"}})},5292:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texVariant=void 0;var n=r(8042),o=r(4926);e.texVariant=(0,n.AddCSS)(o.texVariant,{1008:{c:"\\E009"},8463:{f:""},8740:{c:"\\E006"},8742:{c:"\\E007"},8808:{c:"\\E00C"},8809:{c:"\\E00D"},8816:{c:"\\E011"},8817:{c:"\\E00E"},8840:{c:"\\E016"},8841:{c:"\\E018"},8842:{c:"\\E01A"},8843:{c:"\\E01B"},10887:{c:"\\E010"},10888:{c:"\\E00F"},10955:{c:"\\E017"},10956:{c:"\\E019"}})},5884:function(t,e,r){var n=this&&this.__assign||function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.FontData=e.NOSTRETCH=e.H=e.V=void 0;var a=r(7233);e.V=1,e.H=2,e.NOSTRETCH={dir:0};var l=function(){function t(t){var e,r,l,c;void 0===t&&(t=null),this.variant={},this.delimiters={},this.cssFontMap={},this.remapChars={},this.skewIcFactor=.75;var u=this.constructor;this.options=(0,a.userOptions)((0,a.defaultOptions)({},u.OPTIONS),t),this.params=n({},u.defaultParams),this.sizeVariants=i([],o(u.defaultSizeVariants),!1),this.stretchVariants=i([],o(u.defaultStretchVariants),!1),this.cssFontMap=n({},u.defaultCssFonts);try{for(var p=s(Object.keys(this.cssFontMap)),h=p.next();!h.done;h=p.next()){var f=h.value;"unknown"===this.cssFontMap[f][0]&&(this.cssFontMap[f][0]=this.options.unknownFamily)}}catch(t){e={error:t}}finally{try{h&&!h.done&&(r=p.return)&&r.call(p)}finally{if(e)throw e.error}}this.cssFamilyPrefix=u.defaultCssFamilyPrefix,this.createVariants(u.defaultVariants),this.defineDelimiters(u.defaultDelimiters);try{for(var d=s(Object.keys(u.defaultChars)),m=d.next();!m.done;m=d.next()){var y=m.value;this.defineChars(y,u.defaultChars[y])}}catch(t){l={error:t}}finally{try{m&&!m.done&&(c=d.return)&&c.call(d)}finally{if(l)throw l.error}}this.defineRemap("accent",u.defaultAccentMap),this.defineRemap("mo",u.defaultMoMap),this.defineRemap("mn",u.defaultMnMap)}return t.charOptions=function(t,e){var r=t[e];return 3===r.length&&(r[3]={}),r[3]},Object.defineProperty(t.prototype,"styles",{get:function(){return this._styles},set:function(t){this._styles=t},enumerable:!1,configurable:!0}),t.prototype.createVariant=function(t,e,r){void 0===e&&(e=null),void 0===r&&(r=null);var n={linked:[],chars:e?Object.create(this.variant[e].chars):{}};r&&this.variant[r]&&(Object.assign(n.chars,this.variant[r].chars),this.variant[r].linked.push(n.chars),n.chars=Object.create(n.chars)),this.remapSmpChars(n.chars,t),this.variant[t]=n},t.prototype.remapSmpChars=function(t,e){var r,n,i,a,l=this.constructor;if(l.VariantSmp[e]){var c=l.SmpRemap,u=[null,null,l.SmpRemapGreekU,l.SmpRemapGreekL];try{for(var p=s(l.SmpRanges),h=p.next();!h.done;h=p.next()){var f=o(h.value,3),d=f[0],m=f[1],y=f[2],g=l.VariantSmp[e][d];if(g){for(var b=m;b<=y;b++)if(930!==b){var v=g+b-m;t[b]=this.smpChar(c[v]||v)}if(u[d])try{for(var _=(i=void 0,s(Object.keys(u[d]).map((function(t){return parseInt(t)})))),S=_.next();!S.done;S=_.next()){t[b=S.value]=this.smpChar(g+u[d][b])}}catch(t){i={error:t}}finally{try{S&&!S.done&&(a=_.return)&&a.call(_)}finally{if(i)throw i.error}}}}}catch(t){r={error:t}}finally{try{h&&!h.done&&(n=p.return)&&n.call(p)}finally{if(r)throw r.error}}}"bold"===e&&(t[988]=this.smpChar(120778),t[989]=this.smpChar(120779))},t.prototype.smpChar=function(t){return[,,,{smp:t}]},t.prototype.createVariants=function(t){var e,r;try{for(var n=s(t),o=n.next();!o.done;o=n.next()){var i=o.value;this.createVariant(i[0],i[1],i[2])}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}},t.prototype.defineChars=function(t,e){var r,n,o=this.variant[t];Object.assign(o.chars,e);try{for(var i=s(o.linked),a=i.next();!a.done;a=i.next()){var l=a.value;Object.assign(l,e)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}},t.prototype.defineDelimiters=function(t){Object.assign(this.delimiters,t)},t.prototype.defineRemap=function(t,e){this.remapChars.hasOwnProperty(t)||(this.remapChars[t]={}),Object.assign(this.remapChars[t],e)},t.prototype.getDelimiter=function(t){return this.delimiters[t]},t.prototype.getSizeVariant=function(t,e){return this.delimiters[t].variants&&(e=this.delimiters[t].variants[e]),this.sizeVariants[e]},t.prototype.getStretchVariant=function(t,e){return this.stretchVariants[this.delimiters[t].stretchv?this.delimiters[t].stretchv[e]:0]},t.prototype.getChar=function(t,e){return this.variant[t].chars[e]},t.prototype.getVariant=function(t){return this.variant[t]},t.prototype.getCssFont=function(t){return this.cssFontMap[t]||["serif",!1,!1]},t.prototype.getFamily=function(t){return this.cssFamilyPrefix?this.cssFamilyPrefix+", "+t:t},t.prototype.getRemappedChar=function(t,e){return(this.remapChars[t]||{})[e]},t.OPTIONS={unknownFamily:"serif"},t.JAX="common",t.NAME="",t.defaultVariants=[["normal"],["bold","normal"],["italic","normal"],["bold-italic","italic","bold"],["double-struck","bold"],["fraktur","normal"],["bold-fraktur","bold","fraktur"],["script","italic"],["bold-script","bold-italic","script"],["sans-serif","normal"],["bold-sans-serif","bold","sans-serif"],["sans-serif-italic","italic","sans-serif"],["sans-serif-bold-italic","bold-italic","bold-sans-serif"],["monospace","normal"]],t.defaultCssFonts={normal:["unknown",!1,!1],bold:["unknown",!1,!0],italic:["unknown",!0,!1],"bold-italic":["unknown",!0,!0],"double-struck":["unknown",!1,!0],fraktur:["unknown",!1,!1],"bold-fraktur":["unknown",!1,!0],script:["cursive",!1,!1],"bold-script":["cursive",!1,!0],"sans-serif":["sans-serif",!1,!1],"bold-sans-serif":["sans-serif",!1,!0],"sans-serif-italic":["sans-serif",!0,!1],"sans-serif-bold-italic":["sans-serif",!0,!0],monospace:["monospace",!1,!1]},t.defaultCssFamilyPrefix="",t.VariantSmp={bold:[119808,119834,120488,120514,120782],italic:[119860,119886,120546,120572],"bold-italic":[119912,119938,120604,120630],script:[119964,119990],"bold-script":[120016,120042],fraktur:[120068,120094],"double-struck":[120120,120146,,,120792],"bold-fraktur":[120172,120198],"sans-serif":[120224,120250,,,120802],"bold-sans-serif":[120276,120302,120662,120688,120812],"sans-serif-italic":[120328,120354],"sans-serif-bold-italic":[120380,120406,120720,120746],monospace:[120432,120458,,,120822]},t.SmpRanges=[[0,65,90],[1,97,122],[2,913,937],[3,945,969],[4,48,57]],t.SmpRemap={119893:8462,119965:8492,119968:8496,119969:8497,119971:8459,119972:8464,119975:8466,119976:8499,119981:8475,119994:8495,119996:8458,120004:8500,120070:8493,120075:8460,120076:8465,120085:8476,120093:8488,120122:8450,120127:8461,120133:8469,120135:8473,120136:8474,120137:8477,120145:8484},t.SmpRemapGreekU={8711:25,1012:17},t.SmpRemapGreekL={977:27,981:29,982:31,1008:28,1009:30,1013:26,8706:25},t.defaultAccentMap={768:"\u02cb",769:"\u02ca",770:"\u02c6",771:"\u02dc",772:"\u02c9",774:"\u02d8",775:"\u02d9",776:"\xa8",778:"\u02da",780:"\u02c7",8594:"\u20d7",8242:"'",8243:"''",8244:"'''",8245:"`",8246:"``",8247:"```",8279:"''''",8400:"\u21bc",8401:"\u21c0",8406:"\u2190",8417:"\u2194",8432:"*",8411:"...",8412:"....",8428:"\u21c1",8429:"\u21bd",8430:"\u2190",8431:"\u2192"},t.defaultMoMap={45:"\u2212"},t.defaultMnMap={45:"\u2212"},t.defaultParams={x_height:.442,quad:1,num1:.676,num2:.394,num3:.444,denom1:.686,denom2:.345,sup1:.413,sup2:.363,sup3:.289,sub1:.15,sub2:.247,sup_drop:.386,sub_drop:.05,delim1:2.39,delim2:1,axis_height:.25,rule_thickness:.06,big_op_spacing1:.111,big_op_spacing2:.167,big_op_spacing3:.2,big_op_spacing4:.6,big_op_spacing5:.1,surd_height:.075,scriptspace:.05,nulldelimiterspace:.12,delimiterfactor:901,delimitershortfall:.3,min_rule_thickness:1.25,separation_factor:1.75,extra_ic:.033},t.defaultDelimiters={},t.defaultChars={},t.defaultSizeVariants=[],t.defaultStretchVariants=[],t}();e.FontData=l},5552:function(t,e){var r=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonArrow=e.CommonDiagonalArrow=e.CommonDiagonalStrike=e.CommonBorder2=e.CommonBorder=e.arrowBBox=e.diagonalArrowDef=e.arrowDef=e.arrowBBoxW=e.arrowBBoxHD=e.arrowHead=e.fullBorder=e.fullPadding=e.fullBBox=e.sideNames=e.sideIndex=e.SOLID=e.PADDING=e.THICKNESS=e.ARROWY=e.ARROWDX=e.ARROWX=void 0,e.ARROWX=4,e.ARROWDX=1,e.ARROWY=2,e.THICKNESS=.067,e.PADDING=.2,e.SOLID=e.THICKNESS+"em solid",e.sideIndex={top:0,right:1,bottom:2,left:3},e.sideNames=Object.keys(e.sideIndex),e.fullBBox=function(t){return new Array(4).fill(t.thickness+t.padding)},e.fullPadding=function(t){return new Array(4).fill(t.padding)},e.fullBorder=function(t){return new Array(4).fill(t.thickness)};e.arrowHead=function(t){return Math.max(t.padding,t.thickness*(t.arrowhead.x+t.arrowhead.dx+1))};e.arrowBBoxHD=function(t,e){if(t.childNodes[0]){var r=t.childNodes[0].getBBox(),n=r.h,o=r.d;e[0]=e[2]=Math.max(0,t.thickness*t.arrowhead.y-(n+o)/2)}return e};e.arrowBBoxW=function(t,e){if(t.childNodes[0]){var r=t.childNodes[0].getBBox().w;e[1]=e[3]=Math.max(0,t.thickness*t.arrowhead.y-r/2)}return e},e.arrowDef={up:[-Math.PI/2,!1,!0,"verticalstrike"],down:[Math.PI/2,!1,!0,"verticakstrike"],right:[0,!1,!1,"horizontalstrike"],left:[Math.PI,!1,!1,"horizontalstrike"],updown:[Math.PI/2,!0,!0,"verticalstrike uparrow downarrow"],leftright:[0,!0,!1,"horizontalstrike leftarrow rightarrow"]},e.diagonalArrowDef={updiagonal:[-1,0,!1,"updiagonalstrike northeastarrow"],northeast:[-1,0,!1,"updiagonalstrike updiagonalarrow"],southeast:[1,0,!1,"downdiagonalstrike"],northwest:[1,Math.PI,!1,"downdiagonalstrike"],southwest:[-1,Math.PI,!1,"updiagonalstrike"],northeastsouthwest:[-1,0,!0,"updiagonalstrike northeastarrow updiagonalarrow southwestarrow"],northwestsoutheast:[1,0,!0,"downdiagonalstrike northwestarrow southeastarrow"]},e.arrowBBox={up:function(t){return(0,e.arrowBBoxW)(t,[(0,e.arrowHead)(t),0,t.padding,0])},down:function(t){return(0,e.arrowBBoxW)(t,[t.padding,0,(0,e.arrowHead)(t),0])},right:function(t){return(0,e.arrowBBoxHD)(t,[0,(0,e.arrowHead)(t),0,t.padding])},left:function(t){return(0,e.arrowBBoxHD)(t,[0,t.padding,0,(0,e.arrowHead)(t)])},updown:function(t){return(0,e.arrowBBoxW)(t,[(0,e.arrowHead)(t),0,(0,e.arrowHead)(t),0])},leftright:function(t){return(0,e.arrowBBoxHD)(t,[0,(0,e.arrowHead)(t),0,(0,e.arrowHead)(t)])}};e.CommonBorder=function(t){return function(r){var n=e.sideIndex[r];return[r,{renderer:t,bbox:function(t){var e=[0,0,0,0];return e[n]=t.thickness+t.padding,e},border:function(t){var e=[0,0,0,0];return e[n]=t.thickness,e}}]}};e.CommonBorder2=function(t){return function(r,n,o){var i=e.sideIndex[n],s=e.sideIndex[o];return[r,{renderer:t,bbox:function(t){var e=t.thickness+t.padding,r=[0,0,0,0];return r[i]=r[s]=e,r},border:function(t){var e=[0,0,0,0];return e[i]=e[s]=t.thickness,e},remove:n+" "+o}]}};e.CommonDiagonalStrike=function(t){return function(r){var n="mjx-"+r.charAt(0)+"strike";return[r+"diagonalstrike",{renderer:t(n),bbox:e.fullBBox}]}};e.CommonDiagonalArrow=function(t){return function(n){var o=r(e.diagonalArrowDef[n],4),i=o[0],s=o[1],a=o[2];return[n+"arrow",{renderer:function(e,n){var o=r(e.arrowAW(),2),l=o[0],c=o[1],u=e.arrow(c,i*(l-s),a);t(e,u)},bbox:function(t){var e=t.arrowData(),n=e.a,o=e.x,i=e.y,s=r([t.arrowhead.x,t.arrowhead.y,t.arrowhead.dx],3),a=s[0],l=s[1],c=s[2],u=r(t.getArgMod(a+c,l),2),p=u[0],h=u[1],f=i+(p>n?t.thickness*h*Math.sin(p-n):0),d=o+(p>Math.PI/2-n?t.thickness*h*Math.sin(p+n-Math.PI/2):0);return[f,d,f,d]},remove:o[3]}]}};e.CommonArrow=function(t){return function(n){var o=r(e.arrowDef[n],4),i=o[0],s=o[1],a=o[2],l=o[3];return[n+"arrow",{renderer:function(e,n){var o=e.getBBox(),l=o.w,c=o.h,u=o.d,p=r(a?[c+u,"X"]:[l,"Y"],2),h=p[0],f=p[1],d=e.getOffset(f),m=e.arrow(h,i,s,f,d);t(e,m)},bbox:e.arrowBBox[n],remove:l}]}}},3055:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonOutputJax=void 0;var l=r(2975),c=r(4474),u=r(7233),p=r(6010),h=r(8054),f=r(4139),d=function(t){function e(e,r,n){void 0===e&&(e=null),void 0===r&&(r=null),void 0===n&&(n=null);var o=this,i=s((0,u.separateOptions)(e,n.OPTIONS),2),a=i[0],l=i[1];return(o=t.call(this,a)||this).factory=o.options.wrapperFactory||new r,o.factory.jax=o,o.cssStyles=o.options.cssStyles||new f.CssStyles,o.font=o.options.font||new n(l),o.unknownCache=new Map,o}return o(e,t),e.prototype.typeset=function(t,e){this.setDocument(e);var r=this.createNode();return this.toDOM(t,r,e),r},e.prototype.createNode=function(){var t=this.constructor.NAME;return this.html("mjx-container",{class:"MathJax",jax:t})},e.prototype.setScale=function(t){var e=this.math.metrics.scale*this.options.scale;1!==e&&this.adaptor.setStyle(t,"fontSize",(0,p.percent)(e))},e.prototype.toDOM=function(t,e,r){void 0===r&&(r=null),this.setDocument(r),this.math=t,this.pxPerEm=t.metrics.ex/this.font.params.x_height,t.root.setTeXclass(null),this.setScale(e),this.nodeMap=new Map,this.container=e,this.processMath(t.root,e),this.nodeMap=null,this.executeFilters(this.postFilters,t,r,e)},e.prototype.getBBox=function(t,e){this.setDocument(e),this.math=t,t.root.setTeXclass(null),this.nodeMap=new Map;var r=this.factory.wrap(t.root).getOuterBBox();return this.nodeMap=null,r},e.prototype.getMetrics=function(t){var e,r;this.setDocument(t);var n=this.adaptor,o=this.getMetricMaps(t);try{for(var i=a(t.math),s=i.next();!s.done;s=i.next()){var l=s.value,u=n.parent(l.start.node);if(l.state()=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},c=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},u=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o600?"bold":"normal"),n.family?r=this.explicitVariant(n.family,n.weight,n.style):(this.node.getProperty("variantForm")&&(r="-tex-variant"),r=(e.BOLDVARIANTS[n.weight]||{})[r]||r,r=(e.ITALICVARIANTS[n.style]||{})[r]||r)}this.variant=r}},e.prototype.explicitVariant=function(t,e,r){var n=this.styles;return n||(n=this.styles=new m.Styles),n.set("fontFamily",t),e&&n.set("fontWeight",e),r&&n.set("fontStyle",r),"-explicitFont"},e.prototype.getScale=function(){var t=1,e=this.parent,r=e?e.bbox.scale:1,n=this.node.attributes,o=Math.min(n.get("scriptlevel"),2),i=n.get("fontsize"),s=this.node.isToken||this.node.isKind("mstyle")?n.get("mathsize"):n.getInherited("mathsize");if(0!==o){t=Math.pow(n.get("scriptsizemultiplier"),o);var a=this.length2em(n.get("scriptminsize"),.8,1);t0;this.bbox.L=n.isSet("lspace")?Math.max(0,this.length2em(n.get("lspace"))):v(o,t.lspace),this.bbox.R=n.isSet("rspace")?Math.max(0,this.length2em(n.get("rspace"))):v(o,t.rspace);var i=r.childIndex(e);if(0!==i){var s=r.childNodes[i-1];if(s.isEmbellished){var a=this.jax.nodeMap.get(s).getBBox();a.R&&(this.bbox.L=Math.max(0,this.bbox.L-a.R))}}}},e.prototype.getTeXSpacing=function(t,e){if(!e){var r=this.node.texSpacing();r&&(this.bbox.L=this.length2em(r))}if(t||e){var n=this.node.coreMO().attributes;n.isSet("lspace")&&(this.bbox.L=Math.max(0,this.length2em(n.get("lspace")))),n.isSet("rspace")&&(this.bbox.R=Math.max(0,this.length2em(n.get("rspace"))))}},e.prototype.isTopEmbellished=function(){return this.node.isEmbellished&&!(this.node.parent&&this.node.parent.isEmbellished)},e.prototype.core=function(){return this.jax.nodeMap.get(this.node.core())},e.prototype.coreMO=function(){return this.jax.nodeMap.get(this.node.coreMO())},e.prototype.getText=function(){var t,e,r="";if(this.node.isToken)try{for(var n=l(this.node.childNodes),o=n.next();!o.done;o=n.next()){var i=o.value;i instanceof h.TextNode&&(r+=i.getText())}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return r},e.prototype.canStretch=function(t){if(this.stretch=g.NOSTRETCH,this.node.isEmbellished){var e=this.core();e&&e.node!==this.node&&e.canStretch(t)&&(this.stretch=e.stretch)}return 0!==this.stretch.dir},e.prototype.getAlignShift=function(){var t,e=(t=this.node.attributes).getList.apply(t,u([],c(h.indentAttributes),!1)),r=e.indentalign,n=e.indentshift,o=e.indentalignfirst,i=e.indentshiftfirst;return"indentalign"!==o&&(r=o),"auto"===r&&(r=this.jax.options.displayAlign),"indentshift"!==i&&(n=i),"auto"===n&&(n=this.jax.options.displayIndent,"right"!==r||n.match(/^\s*0[a-z]*\s*$/)||(n=("-"+n.trim()).replace(/^--/,""))),[r,this.length2em(n,this.metrics.containerWidth)]},e.prototype.getAlignX=function(t,e,r){return"right"===r?t-(e.w+e.R)*e.rscale:"left"===r?e.L*e.rscale:(t-e.w*e.rscale)/2},e.prototype.getAlignY=function(t,e,r,n,o){return"top"===o?t-r:"bottom"===o?n-e:"center"===o?(t-r-(e-n))/2:0},e.prototype.getWrapWidth=function(t){return this.childNodes[t].getBBox().w},e.prototype.getChildAlign=function(t){return"left"},e.prototype.percent=function(t){return d.percent(t)},e.prototype.em=function(t){return d.em(t)},e.prototype.px=function(t,e){return void 0===e&&(e=-d.BIGDIMEN),d.px(t,e,this.metrics.em)},e.prototype.length2em=function(t,e,r){return void 0===e&&(e=1),void 0===r&&(r=null),null===r&&(r=this.bbox.scale),d.length2em(t,e,r,this.jax.pxPerEm)},e.prototype.unicodeChars=function(t,e){void 0===e&&(e=this.variant);var r=(0,f.unicodeChars)(t),n=this.font.getVariant(e);if(n&&n.chars){var o=n.chars;r=r.map((function(t){return((o[t]||[])[3]||{}).smp||t}))}return r},e.prototype.remapChars=function(t){return t},e.prototype.mmlText=function(t){return this.node.factory.create("text").setText(t)},e.prototype.mmlNode=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.node.factory.create(t,e,r)},e.prototype.createMo=function(t){var e=this.node.factory,r=e.create("text").setText(t),n=e.create("mo",{stretchy:!0},[r]);n.inheritAttributesFrom(this.node);var o=this.wrap(n);return o.parent=this,o},e.prototype.getVariantChar=function(t,e){var r=this.font.getChar(t,e)||[0,0,0,{unknown:!0}];return 3===r.length&&(r[3]={}),r},e.kind="unknown",e.styles={},e.removeStyles=["fontSize","fontFamily","fontWeight","fontStyle","fontVariant","font"],e.skipAttributes={fontfamily:!0,fontsize:!0,fontweight:!0,fontstyle:!0,color:!0,background:!0,class:!0,href:!0,style:!0,xmlns:!0},e.BOLDVARIANTS={bold:{normal:"bold",italic:"bold-italic",fraktur:"bold-fraktur",script:"bold-script","sans-serif":"bold-sans-serif","sans-serif-italic":"sans-serif-bold-italic"},normal:{bold:"normal","bold-italic":"italic","bold-fraktur":"fraktur","bold-script":"script","bold-sans-serif":"sans-serif","sans-serif-bold-italic":"sans-serif-italic"}},e.ITALICVARIANTS={italic:{normal:"italic",bold:"bold-italic","sans-serif":"sans-serif-italic","bold-sans-serif":"sans-serif-bold-italic"},normal:{italic:"normal","bold-italic":"bold","sans-serif-italic":"sans-serif","sans-serif-bold-italic":"bold-sans-serif"}},e}(p.AbstractWrapper);e.CommonWrapper=_},4420:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonWrapperFactory=void 0;var i=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.jax=null,e}return o(e,t),Object.defineProperty(e.prototype,"Wrappers",{get:function(){return this.node},enumerable:!1,configurable:!0}),e.defaultNodes={},e}(r(3811).AbstractWrapperFactory);e.CommonWrapperFactory=i},9800:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonTeXAtomMixin=void 0;var i=r(9007);e.CommonTeXAtomMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.computeBBox=function(e,r){if(void 0===r&&(r=!1),t.prototype.computeBBox.call(this,e,r),this.childNodes[0]&&this.childNodes[0].bbox.ic&&(e.ic=this.childNodes[0].bbox.ic),this.node.texClass===i.TEXCLASS.VCENTER){var n=e.h,o=(n+e.d)/2+this.font.params.axis_height-n;e.h+=o,e.d-=o}},e}(t)}},1160:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonTextNodeMixin=void 0,e.CommonTextNodeMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.computeBBox=function(t,e){var r,n;void 0===e&&(e=!1);var s=this.parent.variant,a=this.node.getText();if("-explicitFont"===s){var l=this.jax.getFontData(this.parent.styles),c=this.jax.measureText(a,s,l),u=c.w,p=c.h,h=c.d;t.h=p,t.d=h,t.w=u}else{var f=this.remappedText(a,s);t.empty();try{for(var d=o(f),m=d.next();!m.done;m=d.next()){var y=m.value,g=i(this.getVariantChar(s,y),4),b=(p=g[0],h=g[1],u=g[2],g[3]);if(b.unknown){var v=this.jax.measureText(String.fromCodePoint(y),s);u=v.w,p=v.h,h=v.d}t.w+=u,p>t.h&&(t.h=p),h>t.d&&(t.d=h),t.ic=b.ic||0,t.sk=b.sk||0,t.dx=b.dx||0}}catch(t){r={error:t}}finally{try{m&&!m.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}f.length>1&&(t.sk=0),t.clean()}},e.prototype.remappedText=function(t,e){var r=this.parent.stretch.c;return r?[r]:this.parent.remapChars(this.unicodeChars(t,e))},e.prototype.getStyles=function(){},e.prototype.getVariant=function(){},e.prototype.getScale=function(){},e.prototype.getSpace=function(){},e}(t)}},1956:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},c=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMencloseMixin=void 0;var p=a(r(5552)),h=r(505);e.CommonMencloseMixin=function(t){return function(t){function e(){for(var e=[],r=0;r.001?s:0},e.prototype.getArgMod=function(t,e){return[Math.atan2(e,t),Math.sqrt(t*t+e*e)]},e.prototype.arrow=function(t,e,r,n,o){return void 0===n&&(n=""),void 0===o&&(o=0),null},e.prototype.arrowData=function(){var t=l([this.padding,this.thickness],2),e=t[0],r=t[1]*(this.arrowhead.x+Math.max(1,this.arrowhead.dx)),n=this.childNodes[0].getBBox(),o=n.h,i=n.d,s=n.w,a=o+i,c=Math.sqrt(a*a+s*s),u=Math.max(e,r*s/c),p=Math.max(e,r*a/c),h=l(this.getArgMod(s+2*u,a+2*p),2);return{a:h[0],W:h[1],x:u,y:p}},e.prototype.arrowAW=function(){var t=this.childNodes[0].getBBox(),e=t.h,r=t.d,n=t.w,o=l(this.TRBL,4),i=o[0],s=o[1],a=o[2],c=o[3];return this.getArgMod(c+n+s,i+e+r+a)},e.prototype.createMsqrt=function(t){var e=this.node.factory.create("msqrt");e.inheritAttributesFrom(this.node),e.childNodes[0]=t.node;var r=this.wrap(e);return r.parent=this,r},e.prototype.sqrtTRBL=function(){var t=this.msqrt.getBBox(),e=this.msqrt.childNodes[0].getBBox();return[t.h-e.h,0,t.d-e.d,t.w-e.w]},e}(t)}},7555:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMfencedMixin=void 0,e.CommonMfencedMixin=function(t){return function(t){function e(){for(var e=[],r=0;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMmultiscriptsMixin=e.ScriptNames=e.NextScript=void 0;var l=r(6469);e.NextScript={base:"subList",subList:"supList",supList:"subList",psubList:"psupList",psupList:"psubList"},e.ScriptNames=["sup","sup","psup","psub"],e.CommonMmultiscriptsMixin=function(t){return function(t){function r(){for(var e=[],r=0;re.length&&e.push(l.BBox.empty())},r.prototype.combineBBoxLists=function(t,e,r,n){for(var o=0;ot.h&&(t.h=l),c>t.d&&(t.d=c),h>e.h&&(e.h=h),f>e.d&&(e.d=f)}},r.prototype.getScaledWHD=function(t){var e=t.w,r=t.h,n=t.d,o=t.rscale;return[e*o,r*o,n*o]},r.prototype.getUVQ=function(e,r){var n;if(!this.UVQ){var o=i([0,0,0],3),s=o[0],a=o[1],l=o[2];0===e.h&&0===e.d?s=this.getU():0===r.h&&0===r.d?s=-this.getV():(s=(n=i(t.prototype.getUVQ.call(this,e,r),3))[0],a=n[1],l=n[2]),this.UVQ=[s,a,l]}return this.UVQ},r}(t)}},5023:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMnMixin=void 0,e.CommonMnMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.remapChars=function(t){if(t.length){var e=this.font.getRemappedChar("mn",t[0]);if(e){var r=this.unicodeChars(e,this.variant);1===r.length?t[0]=r[0]:t=r.concat(t.slice(1))}}return t},e}(t)}},7096:function(t,e,r){var n,o,i=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),s=this&&this.__assign||function(){return s=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},l=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMoMixin=e.DirectionVH=void 0;var u=r(6469),p=r(505),h=r(5884);e.DirectionVH=((o={})[1]="v",o[2]="h",o),e.CommonMoMixin=function(t){return function(t){function e(){for(var e=[],r=0;r=0)&&(t.w=0)},e.prototype.protoBBox=function(e){var r=0!==this.stretch.dir;r&&null===this.size&&this.getStretchedVariant([0]),r&&this.size<0||(t.prototype.computeBBox.call(this,e),this.copySkewIC(e))},e.prototype.getAccentOffset=function(){var t=u.BBox.empty();return this.protoBBox(t),-t.w/2},e.prototype.getCenterOffset=function(e){return void 0===e&&(e=null),e||(e=u.BBox.empty(),t.prototype.computeBBox.call(this,e)),(e.h+e.d)/2+this.font.params.axis_height-e.h},e.prototype.getVariant=function(){this.node.attributes.get("largeop")?this.variant=this.node.attributes.get("displaystyle")?"-largeop":"-smallop":this.node.attributes.getExplicit("mathvariant")||!1!==this.node.getProperty("pseudoscript")?t.prototype.getVariant.call(this):this.variant="-tex-variant"},e.prototype.canStretch=function(t){if(0!==this.stretch.dir)return this.stretch.dir===t;if(!this.node.attributes.get("stretchy"))return!1;var e=this.getText();if(1!==Array.from(e).length)return!1;var r=this.font.getDelimiter(e.codePointAt(0));return this.stretch=r&&r.dir===t?r:h.NOSTRETCH,0!==this.stretch.dir},e.prototype.getStretchedVariant=function(t,e){var r,n;if(void 0===e&&(e=!1),0!==this.stretch.dir){var o=this.getWH(t),i=this.getSize("minsize",0),a=this.getSize("maxsize",1/0),l=this.node.getProperty("mathaccent");o=Math.max(i,Math.min(a,o));var u=this.font.params.delimiterfactor/1e3,p=this.font.params.delimitershortfall,h=i||e?o:l?Math.min(o/u,o+p):Math.max(o*u,o-p),f=this.stretch,d=f.c||this.getText().codePointAt(0),m=0;if(f.sizes)try{for(var y=c(f.sizes),g=y.next();!g.done;g=y.next()){if(g.value>=h)return l&&m&&m--,this.variant=this.font.getSizeVariant(d,m),this.size=m,void(f.schar&&f.schar[m]&&(this.stretch=s(s({},this.stretch),{c:f.schar[m]})));m++}}catch(t){r={error:t}}finally{try{g&&!g.done&&(n=y.return)&&n.call(y)}finally{if(r)throw r.error}}f.stretch?(this.size=-1,this.invalidateBBox(),this.getStretchBBox(t,this.checkExtendedHeight(o,f),f)):(this.variant=this.font.getSizeVariant(d,m-1),this.size=m-1)}},e.prototype.getSize=function(t,e){var r=this.node.attributes;return r.isSet(t)&&(e=this.length2em(r.get(t),1,1)),e},e.prototype.getWH=function(t){if(0===t.length)return 0;if(1===t.length)return t[0];var e=a(t,2),r=e[0],n=e[1],o=this.font.params.axis_height;return this.node.attributes.get("symmetric")?2*Math.max(r-o,n+o):r+n},e.prototype.getStretchBBox=function(t,e,r){var n;r.hasOwnProperty("min")&&r.min>e&&(e=r.min);var o=a(r.HDW,3),i=o[0],s=o[1],l=o[2];1===this.stretch.dir?(i=(n=a(this.getBaseline(t,e,r),2))[0],s=n[1]):l=e,this.bbox.h=i,this.bbox.d=s,this.bbox.w=l},e.prototype.getBaseline=function(t,e,r){var n=2===t.length&&t[0]+t[1]===e,o=this.node.attributes.get("symmetric"),i=a(n?t:[e,0],2),s=i[0],l=i[1],c=a([s+l,0],2),u=c[0],p=c[1];if(o){var h=this.font.params.axis_height;n&&(u=2*Math.max(s-h,l+h)),p=u/2-h}else if(n)p=l;else{var f=a(r.HDW||[.75,.25],2),d=f[0],m=f[1];p=m*(u/(d+m))}return[u-p,p]},e.prototype.checkExtendedHeight=function(t,e){if(e.fullExt){var r=a(e.fullExt,2),n=r[0],o=r[1];t=o+Math.ceil(Math.max(0,t-o)/n)*n}return t},e.prototype.remapChars=function(t){var e=this.node.getProperty("primes");if(e)return(0,p.unicodeChars)(e);if(1===t.length){var r=this.node.coreParent().parent,n=this.isAccent&&!r.isKind("mrow")?"accent":"mo",o=this.font.getRemappedChar(n,t[0]);o&&(t=this.unicodeChars(o,this.variant))}return t},e}(t)}},6898:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMpaddedMixin=void 0,e.CommonMpaddedMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getDimens=function(){var t=this.node.attributes.getList("width","height","depth","lspace","voffset"),e=this.childNodes[0].getBBox(),r=e.w,n=e.h,o=e.d,i=r,s=n,a=o,l=0,c=0,u=0;""!==t.width&&(r=this.dimen(t.width,e,"w",0)),""!==t.height&&(n=this.dimen(t.height,e,"h",0)),""!==t.depth&&(o=this.dimen(t.depth,e,"d",0)),""!==t.voffset&&(c=this.dimen(t.voffset,e)),""!==t.lspace&&(l=this.dimen(t.lspace,e));var p=this.node.attributes.get("data-align");return p&&(u=this.getAlignX(r,e,p)),[s,a,i,n-s,o-a,r-i,l,c,u]},e.prototype.dimen=function(t,e,r,n){void 0===r&&(r=""),void 0===n&&(n=null);var o=(t=String(t)).match(/width|height|depth/),i=o?e[o[0].charAt(0)]:r?e[r]:0,s=this.length2em(t,i)||0;return t.match(/^[-+]/)&&r&&(s+=i),null!=n&&(s=Math.max(n,s)),s},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=o(this.getDimens(),6),n=r[0],i=r[1],s=r[2],a=r[3],l=r[4],c=r[5];t.w=s+c,t.h=n+a,t.d=i+l,this.setChildPWidths(e,t.w)},e.prototype.getWrapWidth=function(t){return this.getBBox().w},e.prototype.getChildAlign=function(t){return this.node.attributes.get("data-align")||"left"},e}(t)}},6991:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMrootMixin=void 0,e.CommonMrootMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"surd",{get:function(){return 2},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"root",{get:function(){return 1},enumerable:!1,configurable:!0}),e.prototype.combineRootBBox=function(t,e,r){var n=this.childNodes[this.root].getOuterBBox(),o=this.getRootDimens(e,r)[1];t.combine(n,0,o)},e.prototype.getRootDimens=function(t,e){var r=this.childNodes[this.surd],n=this.childNodes[this.root].getOuterBBox(),o=(r.size<0?.5:.6)*t.w,i=n.w,s=n.rscale,a=Math.max(i,o/s),l=Math.max(0,a-i);return[a*s-o,this.rootHeight(n,t,r.size,e),l]},e.prototype.rootHeight=function(t,e,r,n){var o=e.h+e.d;return(r<0?1.9:.55*o)-(o-n)+Math.max(0,t.d*t.rscale)},e}(t)}},8411:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonInferredMrowMixin=e.CommonMrowMixin=void 0;var l=r(6469);e.CommonMrowMixin=function(t){return function(t){function e(){for(var e,r,n=[],o=0;o1){var h=0,f=0,d=u>1&&u===p;try{for(var m=a(this.childNodes),y=m.next();!y.done;y=m.next()){var g=0===(x=y.value).stretch.dir;if(d||g){var b=x.getOuterBBox(g),v=b.h,_=b.d,S=b.rscale;(v*=S)>h&&(h=v),(_*=S)>f&&(f=_)}}}catch(t){r={error:t}}finally{try{y&&!y.done&&(n=m.return)&&n.call(m)}finally{if(r)throw r.error}}try{for(var M=a(s),O=M.next();!O.done;O=M.next()){var x;(x=O.value).coreMO().getStretchedVariant([h,f])}}catch(t){o={error:t}}finally{try{O&&!O.done&&(i=M.return)&&i.call(M)}finally{if(o)throw o.error}}}},e}(t)},e.CommonInferredMrowMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getScale=function(){this.bbox.scale=this.parent.bbox.scale,this.bbox.rscale=1},e}(t)}},4126:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;othis.surdH?(t.h+t.d-(this.surdH-2*e-r/2))/2:e+r/4]},e.prototype.getRootDimens=function(t,e){return[0,0,0,0]},e}(t)}},905:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMsubsupMixin=e.CommonMsupMixin=e.CommonMsubMixin=void 0,e.CommonMsubMixin=function(t){var e;return e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.sub]},enumerable:!1,configurable:!0}),e.prototype.getOffset=function(){return[0,-this.getV()]},e}(t),e.useIC=!1,e},e.CommonMsupMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.sup]},enumerable:!1,configurable:!0}),e.prototype.getOffset=function(){return[this.getAdjustedIc()-(this.baseRemoveIc?0:this.baseIc),this.getU()]},e}(t)},e.CommonMsubsupMixin=function(t){var e;return e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.UVQ=null,e}return n(e,t),Object.defineProperty(e.prototype,"subChild",{get:function(){return this.childNodes[this.node.sub]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"supChild",{get:function(){return this.childNodes[this.node.sup]},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.baseChild.getOuterBBox(),n=o([this.subChild.getOuterBBox(),this.supChild.getOuterBBox()],2),i=n[0],s=n[1];t.empty(),t.append(r);var a=this.getBaseWidth(),l=this.getAdjustedIc(),c=o(this.getUVQ(),2),u=c[0],p=c[1];t.combine(i,a,p),t.combine(s,a+l,u),t.w+=this.font.params.scriptspace,t.clean(),this.setChildPWidths(e)},e.prototype.getUVQ=function(t,e){void 0===t&&(t=this.subChild.getOuterBBox()),void 0===e&&(e=this.supChild.getOuterBBox());var r=this.baseCore.getOuterBBox();if(this.UVQ)return this.UVQ;var n=this.font.params,i=3*n.rule_thickness,s=this.length2em(this.node.attributes.get("subscriptshift"),n.sub2),a=this.baseCharZero(r.d*this.baseScale+n.sub_drop*t.rscale),l=o([this.getU(),Math.max(a,s)],2),c=l[0],u=l[1],p=c-e.d*e.rscale-(t.h*t.rscale-u);if(p0&&(c+=h,u-=h)}return c=Math.max(this.length2em(this.node.attributes.get("superscriptshift"),c),c),u=Math.max(this.length2em(this.node.attributes.get("subscriptshift"),u),u),p=c-e.d*e.rscale-(t.h*t.rscale-u),this.UVQ=[c,-u,p],this.UVQ},e}(t),e.useIC=!1,e}},6237:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtableMixin=void 0;var l=r(6469),c=r(505),u=r(7875);e.CommonMtableMixin=function(t){return function(t){function e(){for(var e=[],r=0;r1){if(null===e){e=0;var d=h>1&&h===f;try{for(var m=a(this.tableRows),y=m.next();!y.done;y=m.next()){var g;if(g=y.value.getChild(t)){var b=0===(M=g.childNodes[0]).stretch.dir;if(d||b){var v=M.getBBox(b).w;v>e&&(e=v)}}}}catch(t){o={error:t}}finally{try{y&&!y.done&&(i=m.return)&&i.call(m)}finally{if(o)throw o.error}}}try{for(var _=a(c),S=_.next();!S.done;S=_.next()){var M;(M=S.value).coreMO().getStretchedVariant([e])}}catch(t){s={error:t}}finally{try{S&&!S.done&&(l=_.return)&&l.call(_)}finally{if(s)throw s.error}}}},e.prototype.getTableData=function(){if(this.data)return this.data;for(var t=new Array(this.numRows).fill(0),e=new Array(this.numRows).fill(0),r=new Array(this.numCols).fill(0),n=new Array(this.numRows),o=new Array(this.numRows),i=[0],s=this.tableRows,a=0;ao[r]&&(o[r]=c),u>i[r]&&(i[r]=u),f>a&&(a=f),s&&p>s[e]&&(s[e]=p),a},e.prototype.extendHD=function(t,e,r,n){var o=(n-(e[t]+r[t]))/2;o<1e-5||(e[t]+=o,r[t]+=o)},e.prototype.recordPWidthCell=function(t,e){t.childNodes[0]&&t.childNodes[0].getBBox().pwidth&&this.pwidthCells.push([t,e])},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r,n,o=this.getTableData(),s=o.H,a=o.D;if(this.node.attributes.get("equalrows")){var l=this.getEqualRowHeight();r=(0,u.sum)([].concat(this.rLines,this.rSpace))+l*this.numRows}else r=(0,u.sum)(s.concat(a,this.rLines,this.rSpace));r+=2*(this.fLine+this.fSpace[1]);var p=this.getComputedWidths();n=(0,u.sum)(p.concat(this.cLines,this.cSpace))+2*(this.fLine+this.fSpace[0]);var h=this.node.attributes.get("width");"auto"!==h&&(n=Math.max(this.length2em(h,0)+2*this.fLine,n));var f=i(this.getBBoxHD(r),2),d=f[0],m=f[1];t.h=d,t.d=m,t.w=n;var y=i(this.getBBoxLR(),2),g=y[0],b=y[1];t.L=g,t.R=b,(0,c.isPercent)(h)||this.setColumnPWidths()},e.prototype.setChildPWidths=function(t,e,r){var n=this.node.attributes.get("width");if(!(0,c.isPercent)(n))return!1;this.hasLabels||(this.bbox.pwidth="",this.container.bbox.pwidth="");var o=this.bbox,i=o.w,s=o.L,a=o.R,l=this.node.attributes.get("data-width-includes-label"),p=Math.max(i,this.length2em(n,Math.max(e,s+i+a)))-(l?s+a:0),h=this.node.attributes.get("equalcolumns")?Array(this.numCols).fill(this.percent(1/Math.max(1,this.numCols))):this.getColumnAttributes("columnwidth",0);this.cWidths=this.getColumnWidthsFixed(h,p);var f=this.getComputedWidths();return this.pWidth=(0,u.sum)(f.concat(this.cLines,this.cSpace))+2*(this.fLine+this.fSpace[0]),this.isTop&&(this.bbox.w=this.pWidth),this.setColumnPWidths(),this.pWidth!==i&&this.parent.invalidateBBox(),this.pWidth!==i},e.prototype.setColumnPWidths=function(){var t,e,r=this.cWidths;try{for(var n=a(this.pwidthCells),o=n.next();!o.done;o=n.next()){var s=i(o.value,2),l=s[0],c=s[1];l.setChildPWidths(!1,r[c])&&(l.invalidateBBox(),l.getBBox())}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.getBBoxHD=function(t){var e=i(this.getAlignmentRow(),2),r=e[0],n=e[1];if(null===n){var o=this.font.params.axis_height,s=t/2;return{top:[0,t],center:[s,s],bottom:[t,0],baseline:[s,s],axis:[s+o,s-o]}[r]||[s,s]}var a=this.getVerticalPosition(n,r);return[a,t-a]},e.prototype.getBBoxLR=function(){if(this.hasLabels){var t=this.node.attributes,e=t.get("side"),r=i(this.getPadAlignShift(e),2),n=r[0],o=r[1],s=this.hasLabels&&!!t.get("data-width-includes-label");return s&&this.frame&&this.fSpace[0]&&(n-=this.fSpace[0]),"center"!==o||s?"left"===e?[n,0]:[0,n]:[n,n]}return[0,0]},e.prototype.getPadAlignShift=function(t){var e=this.getTableData().L+this.length2em(this.node.attributes.get("minlabelspacing")),r=i(null==this.styles?["",""]:[this.styles.get("padding-left"),this.styles.get("padding-right")],2),n=r[0],o=r[1];(n||o)&&(e=Math.max(e,this.length2em(n||"0"),this.length2em(o||"0")));var s=i(this.getAlignShift(),2),a=s[0],l=s[1];return a===t&&(l="left"===t?Math.max(e,l)-e:Math.min(-e,l)+e),[e,a,l]},e.prototype.getAlignShift=function(){return this.isTop?t.prototype.getAlignShift.call(this):[this.container.getChildAlign(this.containerI),0]},e.prototype.getWidth=function(){return this.pWidth||this.getBBox().w},e.prototype.getEqualRowHeight=function(){var t=this.getTableData(),e=t.H,r=t.D,n=Array.from(e.keys()).map((function(t){return e[t]+r[t]}));return Math.max.apply(Math,n)},e.prototype.getComputedWidths=function(){var t=this,e=this.getTableData().W,r=Array.from(e.keys()).map((function(r){return"number"==typeof t.cWidths[r]?t.cWidths[r]:e[r]}));return this.node.attributes.get("equalcolumns")&&(r=Array(r.length).fill((0,u.max)(r))),r},e.prototype.getColumnWidths=function(){var t=this.node.attributes.get("width");if(this.node.attributes.get("equalcolumns"))return this.getEqualColumns(t);var e=this.getColumnAttributes("columnwidth",0);return"auto"===t?this.getColumnWidthsAuto(e):(0,c.isPercent)(t)?this.getColumnWidthsPercent(e):this.getColumnWidthsFixed(e,this.length2em(t))},e.prototype.getEqualColumns=function(t){var e,r=Math.max(1,this.numCols);if("auto"===t){var n=this.getTableData().W;e=(0,u.max)(n)}else if((0,c.isPercent)(t))e=this.percent(1/r);else{var o=(0,u.sum)([].concat(this.cLines,this.cSpace))+2*this.fSpace[0];e=Math.max(0,this.length2em(t)-o)/r}return Array(this.numCols).fill(e)},e.prototype.getColumnWidthsAuto=function(t){var e=this;return t.map((function(t){return"auto"===t||"fit"===t?null:(0,c.isPercent)(t)?t:e.length2em(t)}))},e.prototype.getColumnWidthsPercent=function(t){var e=this,r=t.indexOf("fit")>=0,n=(r?this.getTableData():{W:null}).W;return Array.from(t.keys()).map((function(o){var i=t[o];return"fit"===i?null:"auto"===i?r?n[o]:null:(0,c.isPercent)(i)?i:e.length2em(i)}))},e.prototype.getColumnWidthsFixed=function(t,e){var r=this,n=Array.from(t.keys()),o=n.filter((function(e){return"fit"===t[e]})),i=n.filter((function(e){return"auto"===t[e]})),s=o.length||i.length,a=(s?this.getTableData():{W:null}).W,l=e-(0,u.sum)([].concat(this.cLines,this.cSpace))-2*this.fSpace[0],c=l;n.forEach((function(e){var n=t[e];c-="fit"===n||"auto"===n?a[e]:r.length2em(n,l)}));var p=s&&c>0?c/s:0;return n.map((function(e){var n=t[e];return"fit"===n?a[e]+p:"auto"===n?a[e]+(0===o.length?p:0):r.length2em(n,l)}))},e.prototype.getVerticalPosition=function(t,e){for(var r=this.node.attributes.get("equalrows"),n=this.getTableData(),o=n.H,s=n.D,a=r?this.getEqualRowHeight():0,l=this.getRowHalfSpacing(),c=this.fLine,u=0;uthis.numRows?null:n-1]},e.prototype.getColumnAttributes=function(t,e){void 0===e&&(e=1);var r=this.numCols-e,n=this.getAttributeArray(t);if(0===n.length)return null;for(;n.lengthr&&n.splice(r),n},e.prototype.getRowAttributes=function(t,e){void 0===e&&(e=1);var r=this.numRows-e,n=this.getAttributeArray(t);if(0===n.length)return null;for(;n.lengthr&&n.splice(r),n},e.prototype.getAttributeArray=function(t){var e=this.node.attributes.get(t);return e?(0,c.split)(e):[this.node.attributes.getDefault(t)]},e.prototype.addEm=function(t,e){var r=this;return void 0===e&&(e=1),t?t.map((function(t){return r.em(t/e)})):null},e.prototype.convertLengths=function(t){var e=this;return t?t.map((function(t){return e.length2em(t)})):null},e}(t)}},5164:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtdMixin=void 0,e.CommonMtdMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.invalidateBBox=function(){this.bboxComputed=!1},e.prototype.getWrapWidth=function(t){var e=this.parent.parent,r=this.parent,n=this.node.childPosition()-(r.labeled?1:0);return"number"==typeof e.cWidths[n]?e.cWidths[n]:e.getTableData().W[n]},e.prototype.getChildAlign=function(t){return this.node.attributes.get("columnalign")},e}(t)}},6319:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtextMixin=void 0,e.CommonMtextMixin=function(t){var e;return e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getVariant=function(){var e=this.jax.options,r=this.jax.math.outputData,n=(!!r.merrorFamily||!!e.merrorFont)&&this.node.Parent.isKind("merror");if(r.mtextFamily||e.mtextFont||n){var o=this.node.attributes.get("mathvariant"),i=this.constructor.INHERITFONTS[o]||this.jax.font.getCssFont(o),s=i[0]||(n?r.merrorFamily||e.merrorFont:r.mtextFamily||e.mtextFont);this.variant=this.explicitVariant(s,i[2]?"bold":"",i[1]?"italic":"")}else t.prototype.getVariant.call(this)},e}(t),e.INHERITFONTS={normal:["",!1,!1],bold:["",!1,!0],italic:["",!0,!1],"bold-italic":["",!0,!0]},e}},5766:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMlabeledtrMixin=e.CommonMtrMixin=void 0,e.CommonMtrMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"numCells",{get:function(){return this.childNodes.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"labeled",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tableCells",{get:function(){return this.childNodes},enumerable:!1,configurable:!0}),e.prototype.getChild=function(t){return this.childNodes[t]},e.prototype.getChildBBoxes=function(){return this.childNodes.map((function(t){return t.getBBox()}))},e.prototype.stretchChildren=function(t){var e,r,n,i,s,a;void 0===t&&(t=null);var l=[],c=this.labeled?this.childNodes.slice(1):this.childNodes;try{for(var u=o(c),p=u.next();!p.done;p=u.next()){(E=p.value.childNodes[0]).canStretch(1)&&l.push(E)}}catch(t){e={error:t}}finally{try{p&&!p.done&&(r=u.return)&&r.call(u)}finally{if(e)throw e.error}}var h=l.length,f=this.childNodes.length;if(h&&f>1){if(null===t){var d=0,m=0,y=h>1&&h===f;try{for(var g=o(c),b=g.next();!b.done;b=g.next()){var v=0===(E=b.value.childNodes[0]).stretch.dir;if(y||v){var _=E.getBBox(v),S=_.h,M=_.d;S>d&&(d=S),M>m&&(m=M)}}}catch(t){n={error:t}}finally{try{b&&!b.done&&(i=g.return)&&i.call(g)}finally{if(n)throw n.error}}t=[d,m]}try{for(var O=o(l),x=O.next();!x.done;x=O.next()){var E;(E=x.value).coreMO().getStretchedVariant(t)}}catch(t){s={error:t}}finally{try{x&&!x.done&&(a=O.return)&&a.call(O)}finally{if(s)throw s.error}}}},e}(t)},e.CommonMlabeledtrMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"numCells",{get:function(){return Math.max(0,this.childNodes.length-1)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"labeled",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tableCells",{get:function(){return this.childNodes.slice(1)},enumerable:!1,configurable:!0}),e.prototype.getChild=function(t){return this.childNodes[t+1]},e.prototype.getChildBBoxes=function(){return this.childNodes.slice(1).map((function(t){return t.getBBox()}))},e}(t)}},1971:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonScriptbaseMixin=void 0;var l=r(9007);e.CommonScriptbaseMixin=function(t){var e;return e=function(t){function e(){for(var e=[],r=0;r1){var h=0,f=u>1&&u===p;try{for(var d=a(this.childNodes),m=d.next();!m.done;m=d.next()){var y=0===(M=m.value).stretch.dir;if(f||y){var g=M.getOuterBBox(y),b=g.w,v=g.rscale;b*v>h&&(h=b*v)}}}catch(t){r={error:t}}finally{try{m&&!m.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}try{for(var _=a(s),S=_.next();!S.done;S=_.next()){var M;(M=S.value).coreMO().getStretchedVariant([h/M.bbox.rscale])}}catch(t){o={error:t}}finally{try{S&&!S.done&&(i=_.return)&&i.call(_)}finally{if(o)throw o.error}}}},e}(t),e.useIC=!0,e}},5806:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonSemanticsMixin=void 0,e.CommonSemanticsMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.computeBBox=function(t,e){if(void 0===e&&(e=!1),this.childNodes.length){var r=this.childNodes[0].getBBox(),n=r.w,o=r.h,i=r.d;t.w=n,t.h=o,t.d=i}},e}(t)}},5920:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__assign||function(){return o=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.MJContextMenu=void 0;var a=r(5073),l=r(6186),c=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.mathItem=null,e.annotation="",e.annotationTypes={},e}return o(e,t),e.prototype.post=function(e,r){if(this.mathItem){if(void 0!==r){var n=this.mathItem.inputJax.name,o=this.findID("Show","Original");o.content="MathML"===n?"Original MathML":n+" Commands",this.findID("Copy","Original").content=o.content;var i=this.findID("Settings","semantics");"MathML"===n?i.disable():i.enable(),this.getAnnotationMenu(),this.dynamicSubmenus()}t.prototype.post.call(this,e,r)}},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.mathItem=null},e.prototype.findID=function(){for(var t,e,r=[],n=0;n=0)return a}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},e.prototype.createAnnotationMenu=function(t,e,r){var n=this,o=this.findID(t,"Annotation");o.submenu=this.factory.get("subMenu")(this.factory,{items:e.map((function(t){var e=s(t,2),o=e[0],i=e[1];return{type:"command",id:o,content:o,action:function(){n.annotation=i,r()}}})),id:"annotations"},o),e.length?o.enable():o.disable()},e.prototype.dynamicSubmenus=function(){var t,r;try{for(var n=i(e.DynamicSubmenus),o=n.next();!o.done;o=n.next()){var a=s(o.value,2),l=a[0],c=a[1],u=this.find(l);if(u){var p=c(this,u);u.submenu=p,p.items.length?u.enable():u.disable()}}}catch(e){t={error:e}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},e.DynamicSubmenus=new Map,e}(a.ContextMenu);e.MJContextMenu=c},8310:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Menu=void 0;var s=r(5713),a=r(4474),l=r(9515),c=r(7233),u=r(5865),p=r(473),h=r(4414),f=r(4922),d=r(6914),m=r(3463),y=r(7309),g=i(r(5445)),b=l.MathJax,v="undefined"!=typeof window&&window.navigator&&"Mac"===window.navigator.platform.substr(0,3),_=function(){function t(t,e){void 0===e&&(e={});var r=this;this.settings=null,this.defaultSettings=null,this.menu=null,this.MmlVisitor=new p.MmlVisitor,this.jax={CHTML:null,SVG:null},this.rerenderStart=a.STATE.LAST,this.about=new f.Info('MathJax v'+s.mathjax.version,(function(){var t=[];return t.push("Input Jax: "+r.document.inputJax.map((function(t){return t.name})).join(", ")),t.push("Output Jax: "+r.document.outputJax.name),t.push("Document Type: "+r.document.kind),t.join("
")}),'www.mathjax.org'),this.help=new f.Info("MathJax Help",(function(){return["

MathJax is a JavaScript library that allows page"," authors to include mathematics within their web pages."," As a reader, you don't need to do anything to make that happen.

","

Browsers: MathJax works with all modern browsers including"," Edge, Firefox, Chrome, Safari, Opera, and most mobile browsers.

","

Math Menu: MathJax adds a contextual menu to equations."," Right-click or CTRL-click on any mathematics to access the menu.

",'
',"

Show Math As: These options allow you to view the formula's"," source markup (as MathML or in its original format).

","

Copy to Clipboard: These options copy the formula's source markup,"," as MathML or in its original format, to the clipboard"," (in browsers that support that).

","

Math Settings: These give you control over features of MathJax,"," such the size of the mathematics, and the mechanism used"," to display equations.

","

Accessibility: MathJax can work with screen"," readers to make mathematics accessible to the visually impaired."," Turn on the explorer to enable generation of speech strings"," and the ability to investigate expressions interactively.

","

Language: This menu lets you select the language used by MathJax"," for its menus and warning messages. (Not yet implemented in version 3.)

","
","

Math Zoom: If you are having difficulty reading an"," equation, MathJax can enlarge it to help you see it better, or"," you can scall all the math on the page to make it larger."," Turn these features on in the Math Settings menu.

","

Preferences: MathJax uses your browser's localStorage database"," to save the preferences set via this menu locally in your browser. These"," are not used to track you, and are not transferred or used remotely by"," MathJax in any way.

"].join("\n")}),'www.mathjax.org'),this.mathmlCode=new h.SelectableInfo("MathJax MathML Expression",(function(){if(!r.menu.mathItem)return"";var t=r.toMML(r.menu.mathItem);return"
"+r.formatSource(t)+"
"}),""),this.originalText=new h.SelectableInfo("MathJax Original Source",(function(){if(!r.menu.mathItem)return"";var t=r.menu.mathItem.math;return'
'+r.formatSource(t)+"
"}),""),this.annotationText=new h.SelectableInfo("MathJax Annotation Text",(function(){if(!r.menu.mathItem)return"";var t=r.menu.annotation;return'
'+r.formatSource(t)+"
"}),""),this.zoomBox=new f.Info("MathJax Zoomed Expression",(function(){if(!r.menu.mathItem)return"";var t=r.menu.mathItem.typesetRoot.cloneNode(!0);return t.style.margin="0",'
'+t.outerHTML+"
"}),""),this.document=t,this.options=(0,c.userOptions)((0,c.defaultOptions)({},this.constructor.OPTIONS),e),this.initSettings(),this.mergeUserSettings(),this.initMenu(),this.applySettings()}return Object.defineProperty(t.prototype,"isLoading",{get:function(){return t.loading>0},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"loadingPromise",{get:function(){return this.isLoading?(t._loadingPromise||(t._loadingPromise=new Promise((function(e,r){t._loadingOK=e,t._loadingFailed=r}))),t._loadingPromise):Promise.resolve()},enumerable:!1,configurable:!0}),t.prototype.initSettings=function(){this.settings=this.options.settings,this.jax=this.options.jax;var t=this.document.outputJax;this.jax[t.name]=t,this.settings.renderer=t.name,b._.a11y&&b._.a11y.explorer&&Object.assign(this.settings,this.document.options.a11y),this.settings.scale=t.options.scale,this.defaultSettings=Object.assign({},this.settings)},t.prototype.initMenu=function(){var t=this,e=new d.Parser([["contextMenu",u.MJContextMenu.fromJson.bind(u.MJContextMenu)]]);this.menu=e.parse({type:"contextMenu",id:"MathJax_Menu",pool:[this.variable("texHints"),this.variable("semantics"),this.variable("zoom"),this.variable("zscale"),this.variable("renderer",(function(e){return t.setRenderer(e)})),this.variable("alt"),this.variable("cmd"),this.variable("ctrl"),this.variable("shift"),this.variable("scale",(function(e){return t.setScale(e)})),this.variable("explorer",(function(e){return t.setExplorer(e)})),this.a11yVar("highlight"),this.a11yVar("backgroundColor"),this.a11yVar("backgroundOpacity"),this.a11yVar("foregroundColor"),this.a11yVar("foregroundOpacity"),this.a11yVar("speech"),this.a11yVar("subtitles"),this.a11yVar("braille"),this.a11yVar("viewBraille"),this.a11yVar("locale",(function(t){return g.default.setupEngine({locale:t})})),this.a11yVar("speechRules",(function(e){var r=n(e.split("-"),2),o=r[0],i=r[1];t.document.options.sre.domain=o,t.document.options.sre.style=i})),this.a11yVar("magnification"),this.a11yVar("magnify"),this.a11yVar("treeColoring"),this.a11yVar("infoType"),this.a11yVar("infoRole"),this.a11yVar("infoPrefix"),this.variable("autocollapse"),this.variable("collapsible",(function(e){return t.setCollapsible(e)})),this.variable("inTabOrder",(function(e){return t.setTabOrder(e)})),this.variable("assistiveMml",(function(e){return t.setAssistiveMml(e)}))],items:[this.submenu("Show","Show Math As",[this.command("MathMLcode","MathML Code",(function(){return t.mathmlCode.post()})),this.command("Original","Original Form",(function(){return t.originalText.post()})),this.submenu("Annotation","Annotation")]),this.submenu("Copy","Copy to Clipboard",[this.command("MathMLcode","MathML Code",(function(){return t.copyMathML()})),this.command("Original","Original Form",(function(){return t.copyOriginal()})),this.submenu("Annotation","Annotation")]),this.rule(),this.submenu("Settings","Math Settings",[this.submenu("Renderer","Math Renderer",this.radioGroup("renderer",[["CHTML"],["SVG"]])),this.rule(),this.submenu("ZoomTrigger","Zoom Trigger",[this.command("ZoomNow","Zoom Once Now",(function(){return t.zoom(null,"",t.menu.mathItem)})),this.rule(),this.radioGroup("zoom",[["Click"],["DoubleClick","Double-Click"],["NoZoom","No Zoom"]]),this.rule(),this.label("TriggerRequires","Trigger Requires:"),this.checkbox(v?"Option":"Alt",v?"Option":"Alt","alt"),this.checkbox("Command","Command","cmd",{hidden:!v}),this.checkbox("Control","Control","ctrl",{hiddne:v}),this.checkbox("Shift","Shift","shift")]),this.submenu("ZoomFactor","Zoom Factor",this.radioGroup("zscale",[["150%"],["175%"],["200%"],["250%"],["300%"],["400%"]])),this.rule(),this.command("Scale","Scale All Math...",(function(){return t.scaleAllMath()})),this.rule(),this.checkbox("texHints","Add TeX hints to MathML","texHints"),this.checkbox("semantics","Add original as annotation","semantics"),this.rule(),this.command("Reset","Reset to defaults",(function(){return t.resetDefaults()}))]),this.submenu("Accessibility","Accessibility",[this.checkbox("Activate","Activate","explorer"),this.submenu("Speech","Speech",[this.checkbox("Speech","Speech Output","speech"),this.checkbox("Subtitles","Speech Subtitles","subtitles"),this.checkbox("Braille","Braille Output","braille"),this.checkbox("View Braille","Braille Subtitles","viewBraille"),this.rule(),this.submenu("A11yLanguage","Language"),this.rule(),this.submenu("Mathspeak","Mathspeak Rules",this.radioGroup("speechRules",[["mathspeak-default","Verbose"],["mathspeak-brief","Brief"],["mathspeak-sbrief","Superbrief"]])),this.submenu("Clearspeak","Clearspeak Rules",this.radioGroup("speechRules",[["clearspeak-default","Auto"]])),this.submenu("ChromeVox","ChromeVox Rules",this.radioGroup("speechRules",[["chromevox-default","Standard"],["chromevox-alternative","Alternative"]]))]),this.submenu("Highlight","Highlight",[this.submenu("Background","Background",this.radioGroup("backgroundColor",[["Blue"],["Red"],["Green"],["Yellow"],["Cyan"],["Magenta"],["White"],["Black"]])),{type:"slider",variable:"backgroundOpacity",content:" "},this.submenu("Foreground","Foreground",this.radioGroup("foregroundColor",[["Black"],["White"],["Magenta"],["Cyan"],["Yellow"],["Green"],["Red"],["Blue"]])),{type:"slider",variable:"foregroundOpacity",content:" "},this.rule(),this.radioGroup("highlight",[["None"],["Hover"],["Flame"]]),this.rule(),this.checkbox("TreeColoring","Tree Coloring","treeColoring")]),this.submenu("Magnification","Magnification",[this.radioGroup("magnification",[["None"],["Keyboard"],["Mouse"]]),this.rule(),this.radioGroup("magnify",[["200%"],["300%"],["400%"],["500%"]])]),this.submenu("Semantic Info","Semantic Info",[this.checkbox("Type","Type","infoType"),this.checkbox("Role","Role","infoRole"),this.checkbox("Prefix","Prefix","infoPrefix")],!0),this.rule(),this.checkbox("Collapsible","Collapsible Math","collapsible"),this.checkbox("AutoCollapse","Auto Collapse","autocollapse",{disabled:!0}),this.rule(),this.checkbox("InTabOrder","Include in Tab Order","inTabOrder"),this.checkbox("AssistiveMml","Include Hidden MathML","assistiveMml")]),this.submenu("Language","Language"),this.rule(),this.command("About","About MathJax",(function(){return t.about.post()})),this.command("Help","MathJax Help",(function(){return t.help.post()}))]});var r=this.menu;this.about.attachMenu(r),this.help.attachMenu(r),this.originalText.attachMenu(r),this.annotationText.attachMenu(r),this.mathmlCode.attachMenu(r),this.zoomBox.attachMenu(r),this.checkLoadableItems(),this.enableExplorerItems(this.settings.explorer),r.showAnnotation=this.annotationText,r.copyAnnotation=this.copyAnnotation.bind(this),r.annotationTypes=this.options.annotationTypes,y.CssStyles.addInfoStyles(this.document.document),y.CssStyles.addMenuStyles(this.document.document)},t.prototype.checkLoadableItems=function(){var t,e;if(b&&b._&&b.loader&&b.startup)!this.settings.collapsible||b._.a11y&&b._.a11y.complexity||this.loadA11y("complexity"),!this.settings.explorer||b._.a11y&&b._.a11y.explorer||this.loadA11y("explorer"),!this.settings.assistiveMml||b._.a11y&&b._.a11y["assistive-mml"]||this.loadA11y("assistive-mml");else{var r=this.menu;try{for(var n=o(Object.keys(this.jax)),i=n.next();!i.done;i=n.next()){var s=i.value;this.jax[s]||r.findID("Settings","Renderer",s).disable()}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}r.findID("Accessibility","Activate").disable(),r.findID("Accessibility","AutoCollapse").disable(),r.findID("Accessibility","Collapsible").disable()}},t.prototype.enableExplorerItems=function(t){var e,r,n=this.menu.findID("Accessibility","Activate").menu;try{for(var i=o(n.items.slice(1)),s=i.next();!s.done;s=i.next()){var a=s.value;if(a instanceof m.Rule)break;t?a.enable():a.disable()}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},t.prototype.mergeUserSettings=function(){try{var e=localStorage.getItem(t.MENU_STORAGE);if(!e)return;Object.assign(this.settings,JSON.parse(e)),this.setA11y(this.settings)}catch(t){console.log("MathJax localStorage error: "+t.message)}},t.prototype.saveUserSettings=function(){var e,r,n={};try{for(var i=o(Object.keys(this.settings)),s=i.next();!s.done;s=i.next()){var a=s.value;this.settings[a]!==this.defaultSettings[a]&&(n[a]=this.settings[a])}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}try{Object.keys(n).length?localStorage.setItem(t.MENU_STORAGE,JSON.stringify(n)):localStorage.removeItem(t.MENU_STORAGE)}catch(t){console.log("MathJax localStorage error: "+t.message)}},t.prototype.setA11y=function(t){b._.a11y&&b._.a11y.explorer&&b._.a11y.explorer_ts.setA11yOptions(this.document,t)},t.prototype.getA11y=function(t){if(b._.a11y&&b._.a11y.explorer)return void 0!==this.document.options.a11y[t]?this.document.options.a11y[t]:this.document.options.sre[t]},t.prototype.applySettings=function(){this.setTabOrder(this.settings.inTabOrder),this.document.options.enableAssistiveMml=this.settings.assistiveMml,this.document.outputJax.options.scale=parseFloat(this.settings.scale),this.settings.renderer!==this.defaultSettings.renderer&&this.setRenderer(this.settings.renderer)},t.prototype.setScale=function(t){this.document.outputJax.options.scale=parseFloat(t),this.document.rerender()},t.prototype.setRenderer=function(t){var e=this;if(this.jax[t])this.setOutputJax(t);else{var r=t.toLowerCase();this.loadComponent("output/"+r,(function(){var n=b.startup;r in n.constructors&&(n.useOutput(r,!0),n.output=n.getOutputJax(),e.jax[t]=n.output,e.setOutputJax(t))}))}},t.prototype.setOutputJax=function(t){this.jax[t].setAdaptor(this.document.adaptor),this.document.outputJax=this.jax[t],this.rerender()},t.prototype.setTabOrder=function(t){this.menu.store.inTaborder(t)},t.prototype.setAssistiveMml=function(t){this.document.options.enableAssistiveMml=t,!t||b._.a11y&&b._.a11y["assistive-mml"]?this.rerender():this.loadA11y("assistive-mml")},t.prototype.setExplorer=function(t){this.enableExplorerItems(t),this.document.options.enableExplorer=t,!t||b._.a11y&&b._.a11y.explorer?this.rerender(this.settings.collapsible?a.STATE.RERENDER:a.STATE.COMPILED):this.loadA11y("explorer")},t.prototype.setCollapsible=function(t){this.document.options.enableComplexity=t,!t||b._.a11y&&b._.a11y.complexity?this.rerender(a.STATE.COMPILED):this.loadA11y("complexity")},t.prototype.scaleAllMath=function(){var t=(100*parseFloat(this.settings.scale)).toFixed(1).replace(/.0$/,""),e=prompt("Scale all mathematics (compared to surrounding text) by",t+"%");if(e)if(e.match(/^\s*\d+(\.\d*)?\s*%?\s*$/)){var r=parseFloat(e)/100;r?this.menu.pool.lookup("scale").setValue(String(r)):alert("The scale should not be zero")}else alert("The scale should be a percentage (e.g., 120%)")},t.prototype.resetDefaults=function(){var e,r;t.loading++;var n=this.menu.pool,i=this.defaultSettings;try{for(var s=o(Object.keys(this.settings)),l=s.next();!l.done;l=s.next()){var c=l.value,u=n.lookup(c);if(u){u.setValue(i[c]);var p=u.items[0];p&&p.executeCallbacks_()}else this.settings[c]=i[c]}}catch(t){e={error:t}}finally{try{l&&!l.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}t.loading--,this.rerender(a.STATE.COMPILED)},t.prototype.checkComponent=function(e){var r=t.loadingPromises.get(e);r&&s.mathjax.retryAfter(r)},t.prototype.loadComponent=function(e,r){if(!t.loadingPromises.has(e)){var n=b.loader;if(n){t.loading++;var o=n.load(e).then((function(){t.loading--,t.loadingPromises.delete(e),r(),0===t.loading&&t._loadingPromise&&(t._loadingPromise=null,t._loadingOK())})).catch((function(e){t._loadingPromise?(t._loadingPromise=null,t._loadingFailed(e)):console.log(e)}));t.loadingPromises.set(e,o)}}},t.prototype.loadA11y=function(e){var r=this,n=!a.STATE.ENRICHED;this.loadComponent("a11y/"+e,(function(){var o=b.startup;s.mathjax.handlers.unregister(o.handler),o.handler=o.getHandler(),s.mathjax.handlers.register(o.handler);var i=r.document;r.document=o.document=o.getDocument(),r.document.menu=r,r.document.outputJax.reset(),r.transferMathList(i),r.document.processed=i.processed,t._loadingPromise||(r.document.outputJax.reset(),r.rerender("complexity"===e||n?a.STATE.COMPILED:a.STATE.TYPESET))}))},t.prototype.transferMathList=function(t){var e,r,n=this.document.options.MathItem;try{for(var i=o(t.math),s=i.next();!s.done;s=i.next()){var a=s.value,l=new n;Object.assign(l,a),this.document.math.push(l)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},t.prototype.formatSource=function(t){return t.trim().replace(/&/g,"&").replace(//g,">")},t.prototype.toMML=function(t){return this.MmlVisitor.visitTree(t.root,t,{texHints:this.settings.texHints,semantics:this.settings.semantics&&"MathML"!==t.inputJax.name})},t.prototype.zoom=function(t,e,r){t&&!this.isZoomEvent(t,e)||(this.menu.mathItem=r,t&&this.menu.post(t),this.zoomBox.post())},t.prototype.isZoomEvent=function(t,e){return this.settings.zoom===e&&(!this.settings.alt||t.altKey)&&(!this.settings.ctrl||t.ctrlKey)&&(!this.settings.cmd||t.metaKey)&&(!this.settings.shift||t.shiftKey)},t.prototype.rerender=function(e){void 0===e&&(e=a.STATE.TYPESET),this.rerenderStart=Math.min(e,this.rerenderStart),t.loading||(this.rerenderStart<=a.STATE.COMPILED&&this.document.reset({inputJax:[]}),this.document.rerender(this.rerenderStart),this.rerenderStart=a.STATE.LAST)},t.prototype.copyMathML=function(){this.copyToClipboard(this.toMML(this.menu.mathItem))},t.prototype.copyOriginal=function(){this.copyToClipboard(this.menu.mathItem.math.trim())},t.prototype.copyAnnotation=function(){this.copyToClipboard(this.menu.annotation.trim())},t.prototype.copyToClipboard=function(t){var e=document.createElement("textarea");e.value=t,e.setAttribute("readonly",""),e.style.cssText="height: 1px; width: 1px; padding: 1px; position: absolute; left: -10px",document.body.appendChild(e),e.select();try{document.execCommand("copy")}catch(t){alert("Can't copy to clipboard: "+t.message)}document.body.removeChild(e)},t.prototype.addMenu=function(t){var e=this,r=t.typesetRoot;r.addEventListener("contextmenu",(function(){return e.menu.mathItem=t}),!0),r.addEventListener("keydown",(function(){return e.menu.mathItem=t}),!0),r.addEventListener("click",(function(r){return e.zoom(r,"Click",t)}),!0),r.addEventListener("dblclick",(function(r){return e.zoom(r,"DoubleClick",t)}),!0),this.menu.store.insert(r)},t.prototype.clear=function(){this.menu.store.clear()},t.prototype.variable=function(t,e){var r=this;return{name:t,getter:function(){return r.settings[t]},setter:function(n){r.settings[t]=n,e&&e(n),r.saveUserSettings()}}},t.prototype.a11yVar=function(t,e){var r=this;return{name:t,getter:function(){return r.getA11y(t)},setter:function(n){r.settings[t]=n;var o={};o[t]=n,r.setA11y(o),e&&e(n),r.saveUserSettings()}}},t.prototype.submenu=function(t,e,r,n){var i,s;void 0===r&&(r=[]),void 0===n&&(n=!1);var a=[];try{for(var l=o(r),c=l.next();!c.done;c=l.next()){var u=c.value;Array.isArray(u)?a=a.concat(u):a.push(u)}}catch(t){i={error:t}}finally{try{c&&!c.done&&(s=l.return)&&s.call(l)}finally{if(i)throw i.error}}return{type:"submenu",id:t,content:e,menu:{items:a},disabled:0===a.length||n}},t.prototype.command=function(t,e,r,n){return void 0===n&&(n={}),Object.assign({type:"command",id:t,content:e,action:r},n)},t.prototype.checkbox=function(t,e,r,n){return void 0===n&&(n={}),Object.assign({type:"checkbox",id:t,content:e,variable:r},n)},t.prototype.radioGroup=function(t,e){var r=this;return e.map((function(e){return r.radio(e[0],e[1]||e[0],t)}))},t.prototype.radio=function(t,e,r,n){return void 0===n&&(n={}),Object.assign({type:"radio",id:t,content:e,variable:r},n)},t.prototype.label=function(t,e){return{type:"label",id:t,content:e}},t.prototype.rule=function(){return{type:"rule"}},t.MENU_STORAGE="MathJax-Menu-Settings",t.OPTIONS={settings:{texHints:!0,semantics:!1,zoom:"NoZoom",zscale:"200%",renderer:"CHTML",alt:!1,cmd:!1,ctrl:!1,shift:!1,scale:1,autocollapse:!1,collapsible:!1,inTabOrder:!0,assistiveMml:!0,explorer:!1},jax:{CHTML:null,SVG:null},annotationTypes:(0,c.expandable)({TeX:["TeX","LaTeX","application/x-tex"],StarMath:["StarMath 5.0"],Maple:["Maple"],ContentMathML:["MathML-Content","application/mathml-content+xml"],OpenMath:["OpenMath"]})},t.loading=0,t.loadingPromises=new Map,t._loadingPromise=null,t._loadingOK=null,t._loadingFailed=null,t}();e.Menu=_},4001:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MenuHandler=e.MenuMathDocumentMixin=e.MenuMathItemMixin=void 0;var c=r(5713),u=r(4474),p=r(7233),h=r(8310);function f(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addMenu=function(t,e){void 0===e&&(e=!1),this.state()>=u.STATE.CONTEXT_MENU||(this.isEscaped||!t.options.enableMenu&&!e||t.menu.addMenu(this),this.state(u.STATE.CONTEXT_MENU))},e.prototype.checkLoading=function(t){t.checkLoading()},e}(t)}function d(t){var e;return e=function(t){function e(){for(var e=[],r=0;r\n"+this.childNodeMml(e,r+" ","\n")+r+""},e.prototype.visitMathNode=function(e,r){if(!this.options.semantics||"TeX"!==this.mathItem.inputJax.name)return t.prototype.visitDefault.call(this,e,r);var n=e.childNodes.length&&e.childNodes[0].childNodes.length>1;return r+"\n"+r+" \n"+(n?r+" \n":"")+this.childNodeMml(e,r+(n?" ":" "),"\n")+(n?r+" \n":"")+r+' '+this.mathItem.math+"\n"+r+" \n"+r+""},e}(i.SerializedMmlVisitor);e.MmlVisitor=a},4414:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SelectableInfo=void 0;var i=r(4922),s=r(2165),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addEvents=function(t){var e=this;t.addEventListener("keypress",(function(t){"a"===t.key&&(t.ctrlKey||t.metaKey)&&(e.selectAll(),e.stop(t))}))},e.prototype.selectAll=function(){document.getSelection().selectAllChildren(this.html.querySelector("pre"))},e.prototype.copyToClipboard=function(){this.selectAll();try{document.execCommand("copy")}catch(t){alert("Can't copy to clipboard: "+t.message)}document.getSelection().removeAllRanges()},e.prototype.generateHtml=function(){var e=this;t.prototype.generateHtml.call(this);var r=this.html.querySelector("span."+s.HtmlClasses.INFOSIGNATURE).appendChild(document.createElement("input"));r.type="button",r.value="Copy to Clipboard",r.addEventListener("click",(function(t){return e.copyToClipboard()}))},e}(i.Info);e.SelectableInfo=a},9923:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.asyncLoad=void 0;var n=r(5713);e.asyncLoad=function(t){return n.mathjax.asyncLoad?new Promise((function(e,r){var o=n.mathjax.asyncLoad(t);o instanceof Promise?o.then((function(t){return e(t)})).catch((function(t){return r(t)})):e(o)})):Promise.reject("Can't load '".concat(t,"': No asyncLoad method specified"))}},6469:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.BBox=void 0;var n=r(6010),o=function(){function t(t){void 0===t&&(t={w:0,h:-n.BIGDIMEN,d:-n.BIGDIMEN}),this.w=t.w||0,this.h="h"in t?t.h:-n.BIGDIMEN,this.d="d"in t?t.d:-n.BIGDIMEN,this.L=this.R=this.ic=this.sk=this.dx=0,this.scale=this.rscale=1,this.pwidth=""}return t.zero=function(){return new t({h:0,d:0,w:0})},t.empty=function(){return new t},t.prototype.empty=function(){return this.w=0,this.h=this.d=-n.BIGDIMEN,this},t.prototype.clean=function(){this.w===-n.BIGDIMEN&&(this.w=0),this.h===-n.BIGDIMEN&&(this.h=0),this.d===-n.BIGDIMEN&&(this.d=0)},t.prototype.rescale=function(t){this.w*=t,this.h*=t,this.d*=t},t.prototype.combine=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=0);var n=t.rscale,o=e+n*(t.w+t.L+t.R),i=r+n*t.h,s=n*t.d-r;o>this.w&&(this.w=o),i>this.h&&(this.h=i),s>this.d&&(this.d=s)},t.prototype.append=function(t){var e=t.rscale;this.w+=e*(t.w+t.L+t.R),e*t.h>this.h&&(this.h=e*t.h),e*t.d>this.d&&(this.d=e*t.d)},t.prototype.updateFrom=function(t){this.h=t.h,this.d=t.d,this.w=t.w,t.pwidth&&(this.pwidth=t.pwidth)},t.fullWidth="100%",t.StyleAdjust=[["borderTopWidth","h"],["borderRightWidth","w"],["borderBottomWidth","d"],["borderLeftWidth","w",0],["paddingTop","h"],["paddingRight","w"],["paddingBottom","d"],["paddingLeft","w",0]],t}();e.BBox=o},6751:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o",gtdot:"\u22d7",harrw:"\u21ad",hbar:"\u210f",hellip:"\u2026",hookleftarrow:"\u21a9",hookrightarrow:"\u21aa",imath:"\u0131",infin:"\u221e",intcal:"\u22ba",iota:"\u03b9",jmath:"\u0237",kappa:"\u03ba",kappav:"\u03f0",lEg:"\u2a8b",lambda:"\u03bb",lap:"\u2a85",larrlp:"\u21ab",larrtl:"\u21a2",lbrace:"{",lbrack:"[",le:"\u2264",leftleftarrows:"\u21c7",leftthreetimes:"\u22cb",lessdot:"\u22d6",lmoust:"\u23b0",lnE:"\u2268",lnap:"\u2a89",lne:"\u2a87",lnsim:"\u22e6",longmapsto:"\u27fc",looparrowright:"\u21ac",lowast:"\u2217",loz:"\u25ca",lt:"<",ltimes:"\u22c9",ltri:"\u25c3",macr:"\xaf",malt:"\u2720",mho:"\u2127",mu:"\u03bc",multimap:"\u22b8",nLeftarrow:"\u21cd",nLeftrightarrow:"\u21ce",nRightarrow:"\u21cf",nVDash:"\u22af",nVdash:"\u22ae",natur:"\u266e",nearr:"\u2197",nharr:"\u21ae",nlarr:"\u219a",not:"\xac",nrarr:"\u219b",nu:"\u03bd",nvDash:"\u22ad",nvdash:"\u22ac",nwarr:"\u2196",omega:"\u03c9",omicron:"\u03bf",or:"\u2228",osol:"\u2298",period:".",phi:"\u03c6",phiv:"\u03d5",pi:"\u03c0",piv:"\u03d6",prap:"\u2ab7",precnapprox:"\u2ab9",precneqq:"\u2ab5",precnsim:"\u22e8",prime:"\u2032",psi:"\u03c8",quot:'"',rarrtl:"\u21a3",rbrace:"}",rbrack:"]",rho:"\u03c1",rhov:"\u03f1",rightrightarrows:"\u21c9",rightthreetimes:"\u22cc",ring:"\u02da",rmoust:"\u23b1",rtimes:"\u22ca",rtri:"\u25b9",scap:"\u2ab8",scnE:"\u2ab6",scnap:"\u2aba",scnsim:"\u22e9",sdot:"\u22c5",searr:"\u2198",sect:"\xa7",sharp:"\u266f",sigma:"\u03c3",sigmav:"\u03c2",simne:"\u2246",smile:"\u2323",spades:"\u2660",sub:"\u2282",subE:"\u2ac5",subnE:"\u2acb",subne:"\u228a",supE:"\u2ac6",supnE:"\u2acc",supne:"\u228b",swarr:"\u2199",tau:"\u03c4",theta:"\u03b8",thetav:"\u03d1",tilde:"\u02dc",times:"\xd7",triangle:"\u25b5",triangleq:"\u225c",upsi:"\u03c5",upuparrows:"\u21c8",veebar:"\u22bb",vellip:"\u22ee",weierp:"\u2118",xi:"\u03be",yen:"\xa5",zeta:"\u03b6",zigrarr:"\u21dd",nbsp:"\xa0",rsquo:"\u2019",lsquo:"\u2018"};var i={};function s(t,r){if("#"===r.charAt(0))return a(r.slice(1));if(e.entities[r])return e.entities[r];if(e.options.loadMissingEntities){var s=r.match(/^[a-zA-Z](fr|scr|opf)$/)?RegExp.$1:r.charAt(0).toLowerCase();i[s]||(i[s]=!0,(0,n.retryAfter)((0,o.asyncLoad)("./util/entities/"+s+".js")))}return t}function a(t){var e="x"===t.charAt(0)?parseInt(t.slice(1),16):parseInt(t);return String.fromCodePoint(e)}e.add=function(t,r){Object.assign(e.entities,t),i[r]=!0},e.remove=function(t){delete e.entities[t]},e.translate=function(t){return t.replace(/&([a-z][a-z0-9]*|#(?:[0-9]+|x[0-9a-f]+));/gi,s)},e.numeric=a},7525:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.LinkedList=e.ListItem=e.END=void 0,e.END=Symbol();var s=function(t){void 0===t&&(t=null),this.next=null,this.prev=null,this.data=t};e.ListItem=s;var a=function(){function t(){for(var t=[],r=0;r1;){var c=o.shift(),u=o.shift();c.merge(u,e),o.push(c)}return o.length&&(this.list=o[0].list),this},t.prototype.merge=function(t,r){var o,i,s,a,l;void 0===r&&(r=null),null===r&&(r=this.isBefore.bind(this));for(var c=this.list.next,u=t.list.next;c.data!==e.END&&u.data!==e.END;)r(u.data,c.data)?(o=n([c,u],2),u.prev.next=o[0],c.prev.next=o[1],i=n([c.prev,u.prev],2),u.prev=i[0],c.prev=i[1],s=n([t.list,this.list],2),this.list.prev.next=s[0],t.list.prev.next=s[1],a=n([t.list.prev,this.list.prev],2),this.list.prev=a[0],t.list.prev=a[1],c=(l=n([u.next,c],2))[0],u=l[1]):c=c.next;return u.data!==e.END&&(this.list.prev.next=t.list.next,t.list.next.prev=this.list.prev,t.list.prev.next=this.list,this.list.prev=t.list.prev,t.list.next=t.list.prev=t.list),this},t}();e.LinkedList=a},7233:function(t,e){var r=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;oe.length}}}},t.prototype.add=function(e,r){void 0===r&&(r=t.DEFAULTPRIORITY);var n=this.items.length;do{n--}while(n>=0&&r=0&&this.items[e].item!==t);e>=0&&this.items.splice(e,1)},t.DEFAULTPRIORITY=5,t}();e.PrioritizedList=r},4542:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.retryAfter=e.handleRetriesFor=void 0,e.handleRetriesFor=function(t){return new Promise((function e(r,n){try{r(t())}catch(t){t.retry&&t.retry instanceof Promise?t.retry.then((function(){return e(r,n)})).catch((function(t){return n(t)})):t.restart&&t.restart.isCallback?MathJax.Callback.After((function(){return e(r,n)}),t.restart):n(t)}}))},e.retryAfter=function(t){var e=new Error("MathJax retry");throw e.retry=t,e}},4139:function(t,e){var r=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CssStyles=void 0;var n=function(){function t(t){void 0===t&&(t=null),this.styles={},this.addStyles(t)}return Object.defineProperty(t.prototype,"cssText",{get:function(){return this.getStyleString()},enumerable:!1,configurable:!0}),t.prototype.addStyles=function(t){var e,n;if(t)try{for(var o=r(Object.keys(t)),i=o.next();!i.done;i=o.next()){var s=i.value;this.styles[s]||(this.styles[s]={}),Object.assign(this.styles[s],t[s])}}catch(t){e={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(e)throw e.error}}},t.prototype.removeStyles=function(){for(var t,e,n=[],o=0;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),s=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o1;)e.shift(),r.push(e.shift());return r}function l(t){var e,n,o=a(this.styles[t]);0===o.length&&o.push(""),1===o.length&&o.push(o[0]),2===o.length&&o.push(o[0]),3===o.length&&o.push(o[1]);try{for(var i=r(v.connect[t].children),s=i.next();!s.done;s=i.next()){var l=s.value;this.setStyle(this.childName(t,l),o.shift())}}catch(t){e={error:t}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}}function c(t){var e,n,o=v.connect[t].children,i=[];try{for(var s=r(o),a=s.next();!a.done;a=s.next()){var l=a.value,c=this.styles[t+"-"+l];if(!c)return void delete this.styles[t];i.push(c)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(e)throw e.error}}i[3]===i[1]&&(i.pop(),i[2]===i[0]&&(i.pop(),i[1]===i[0]&&i.pop())),this.styles[t]=i.join(" ")}function u(t){var e,n;try{for(var o=r(v.connect[t].children),i=o.next();!i.done;i=o.next()){var s=i.value;this.setStyle(this.childName(t,s),this.styles[t])}}catch(t){e={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(e)throw e.error}}}function p(t){var e,i,s=o([],n(v.connect[t].children),!1),a=this.styles[this.childName(t,s.shift())];try{for(var l=r(s),c=l.next();!c.done;c=l.next()){var u=c.value;if(this.styles[this.childName(t,u)]!==a)return void delete this.styles[t]}}catch(t){e={error:t}}finally{try{c&&!c.done&&(i=l.return)&&i.call(l)}finally{if(e)throw e.error}}this.styles[t]=a}var h=/^(?:[\d.]+(?:[a-z]+)|thin|medium|thick|inherit|initial|unset)$/,f=/^(?:none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset|inherit|initial|unset)$/;function d(t){var e,n,o,i,s={width:"",style:"",color:""};try{for(var l=r(a(this.styles[t])),c=l.next();!c.done;c=l.next()){var u=c.value;u.match(h)&&""===s.width?s.width=u:u.match(f)&&""===s.style?s.style=u:s.color=u}}catch(t){e={error:t}}finally{try{c&&!c.done&&(n=l.return)&&n.call(l)}finally{if(e)throw e.error}}try{for(var p=r(v.connect[t].children),d=p.next();!d.done;d=p.next()){var m=d.value;this.setStyle(this.childName(t,m),s[m])}}catch(t){o={error:t}}finally{try{d&&!d.done&&(i=p.return)&&i.call(p)}finally{if(o)throw o.error}}}function m(t){var e,n,o=[];try{for(var i=r(v.connect[t].children),s=i.next();!s.done;s=i.next()){var a=s.value,l=this.styles[this.childName(t,a)];l&&o.push(l)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}o.length?this.styles[t]=o.join(" "):delete this.styles[t]}var y={style:/^(?:normal|italic|oblique|inherit|initial|unset)$/,variant:new RegExp("^(?:"+["normal|none","inherit|initial|unset","common-ligatures|no-common-ligatures","discretionary-ligatures|no-discretionary-ligatures","historical-ligatures|no-historical-ligatures","contextual|no-contextual","(?:stylistic|character-variant|swash|ornaments|annotation)\\([^)]*\\)","small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps","lining-nums|oldstyle-nums|proportional-nums|tabular-nums","diagonal-fractions|stacked-fractions","ordinal|slashed-zero","jis78|jis83|jis90|jis04|simplified|traditional","full-width|proportional-width","ruby"].join("|")+")$"),weight:/^(?:normal|bold|bolder|lighter|[1-9]00|inherit|initial|unset)$/,stretch:new RegExp("^(?:"+["normal","(?:(?:ultra|extra|semi)-)?condensed","(?:(?:semi|extra|ulta)-)?expanded","inherit|initial|unset"].join("|")+")$"),size:new RegExp("^(?:"+["xx-small|x-small|small|medium|large|x-large|xx-large|larger|smaller","[d.]+%|[d.]+[a-z]+","inherit|initial|unset"].join("|")+")(?:/(?:normal|[d.+](?:%|[a-z]+)?))?$")};function g(t){var e,o,i,s,l=a(this.styles[t]),c={style:"",variant:[],weight:"",stretch:"",size:"",family:"","line-height":""};try{for(var u=r(l),p=u.next();!p.done;p=u.next()){var h=p.value;c.family=h;try{for(var f=(i=void 0,r(Object.keys(y))),d=f.next();!d.done;d=f.next()){var m=d.value;if((Array.isArray(c[m])||""===c[m])&&h.match(y[m]))if("size"===m){var g=n(h.split(/\//),2),b=g[0],_=g[1];c[m]=b,_&&(c["line-height"]=_)}else""===c.size&&(Array.isArray(c[m])?c[m].push(h):c[m]=h)}}catch(t){i={error:t}}finally{try{d&&!d.done&&(s=f.return)&&s.call(f)}finally{if(i)throw i.error}}}}catch(t){e={error:t}}finally{try{p&&!p.done&&(o=u.return)&&o.call(u)}finally{if(e)throw e.error}}!function(t,e){var n,o;try{for(var i=r(v.connect[t].children),s=i.next();!s.done;s=i.next()){var a=s.value,l=this.childName(t,a);if(Array.isArray(e[a])){var c=e[a];c.length&&(this.styles[l]=c.join(" "))}else""!==e[a]&&(this.styles[l]=e[a])}}catch(t){n={error:t}}finally{try{s&&!s.done&&(o=i.return)&&o.call(i)}finally{if(n)throw n.error}}}(t,c),delete this.styles[t]}function b(t){}var v=function(){function t(t){void 0===t&&(t=""),this.parse(t)}return Object.defineProperty(t.prototype,"cssText",{get:function(){var t,e,n=[];try{for(var o=r(Object.keys(this.styles)),i=o.next();!i.done;i=o.next()){var s=i.value,a=this.parentName(s);this.styles[a]||n.push(s+": "+this.styles[s]+";")}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return n.join(" ")},enumerable:!1,configurable:!0}),t.prototype.set=function(e,r){for(e=this.normalizeName(e),this.setStyle(e,r),t.connect[e]&&!t.connect[e].combine&&(this.combineChildren(e),delete this.styles[e]);e.match(/-/)&&(e=this.parentName(e),t.connect[e]);)t.connect[e].combine.call(this,e)},t.prototype.get=function(t){return t=this.normalizeName(t),this.styles.hasOwnProperty(t)?this.styles[t]:""},t.prototype.setStyle=function(e,r){this.styles[e]=r,t.connect[e]&&t.connect[e].children&&t.connect[e].split.call(this,e),""===r&&delete this.styles[e]},t.prototype.combineChildren=function(e){var n,o,i=this.parentName(e);try{for(var s=r(t.connect[e].children),a=s.next();!a.done;a=s.next()){var l=a.value,c=this.childName(i,l);t.connect[c].combine.call(this,c)}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(n)throw n.error}}},t.prototype.parentName=function(t){var e=t.replace(/-[^-]*$/,"");return t===e?"":e},t.prototype.childName=function(e,r){return r.match(/-/)?r:(t.connect[e]&&!t.connect[e].combine&&(r+=e.replace(/.*-/,"-"),e=this.parentName(e)),e+"-"+r)},t.prototype.normalizeName=function(t){return t.replace(/[A-Z]/g,(function(t){return"-"+t.toLowerCase()}))},t.prototype.parse=function(t){void 0===t&&(t="");var e=this.constructor.pattern;this.styles={};for(var r=t.replace(e.comment,"").split(e.style);r.length>1;){var o=n(r.splice(0,3),3),i=o[0],s=o[1],a=o[2];if(i.match(/[^\s\n]/))return;this.set(s,a)}},t.pattern={style:/([-a-z]+)[\s\n]*:[\s\n]*((?:'[^']*'|"[^"]*"|\n|.)*?)[\s\n]*(?:;|$)/g,comment:/\/\*[^]*?\*\//g},t.connect={padding:{children:i,split:l,combine:c},border:{children:i,split:u,combine:p},"border-top":{children:s,split:d,combine:m},"border-right":{children:s,split:d,combine:m},"border-bottom":{children:s,split:d,combine:m},"border-left":{children:s,split:d,combine:m},"border-width":{children:i,split:l,combine:null},"border-style":{children:i,split:l,combine:null},"border-color":{children:i,split:l,combine:null},font:{children:["style","variant","weight","stretch","line-height","size","family"],split:g,combine:b}},t}();e.Styles=v},6010:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.px=e.emRounded=e.em=e.percent=e.length2em=e.MATHSPACE=e.RELUNITS=e.UNITS=e.BIGDIMEN=void 0,e.BIGDIMEN=1e6,e.UNITS={px:1,in:96,cm:96/2.54,mm:96/25.4},e.RELUNITS={em:1,ex:.431,pt:.1,pc:1.2,mu:1/18},e.MATHSPACE={veryverythinmathspace:1/18,verythinmathspace:2/18,thinmathspace:3/18,mediummathspace:4/18,thickmathspace:5/18,verythickmathspace:6/18,veryverythickmathspace:7/18,negativeveryverythinmathspace:-1/18,negativeverythinmathspace:-2/18,negativethinmathspace:-3/18,negativemediummathspace:-4/18,negativethickmathspace:-5/18,negativeverythickmathspace:-6/18,negativeveryverythickmathspace:-7/18,thin:.04,medium:.06,thick:.1,normal:1,big:2,small:1/Math.sqrt(2),infinity:e.BIGDIMEN},e.length2em=function(t,r,n,o){if(void 0===r&&(r=0),void 0===n&&(n=1),void 0===o&&(o=16),"string"!=typeof t&&(t=String(t)),""===t||null==t)return r;if(e.MATHSPACE[t])return e.MATHSPACE[t];var i=t.match(/^\s*([-+]?(?:\.\d+|\d+(?:\.\d*)?))?(pt|em|ex|mu|px|pc|in|mm|cm|%)?/);if(!i)return r;var s=parseFloat(i[1]||"1"),a=i[2];return e.UNITS.hasOwnProperty(a)?s*e.UNITS[a]/o/n:e.RELUNITS.hasOwnProperty(a)?s*e.RELUNITS[a]:"%"===a?s/100*r:s*r},e.percent=function(t){return(100*t).toFixed(1).replace(/\.?0+$/,"")+"%"},e.em=function(t){return Math.abs(t)<.001?"0":t.toFixed(3).replace(/\.?0+$/,"")+"em"},e.emRounded=function(t,e){return void 0===e&&(e=16),t=(Math.round(t*e)+.05)/e,Math.abs(t)<.001?"0em":t.toFixed(3).replace(/\.?0+$/,"")+"em"},e.px=function(t,r,n){return void 0===r&&(r=-e.BIGDIMEN),void 0===n&&(n=16),t*=n,r&&t0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},n=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractItem=void 0;var s=r(9329),a=r(2556),l=r(2165),c=function(t){function e(e,r,n,o){var i=t.call(this,e,r)||this;return i._content=n,i.disabled=!1,i.callbacks=[],i._id=o||n,i}return o(e,t),Object.defineProperty(e.prototype,"content",{get:function(){return this._content},set:function(t){this._content=t,this.generateHtml(),this.menu&&this.menu.generateHtml()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!1,configurable:!0}),e.prototype.press=function(){this.disabled||(this.executeAction(),this.executeCallbacks_())},e.prototype.executeAction=function(){},e.prototype.registerCallback=function(t){-1===this.callbacks.indexOf(t)&&this.callbacks.push(t)},e.prototype.unregisterCallback=function(t){var e=this.callbacks.indexOf(t);-1!==e&&this.callbacks.splice(e,1)},e.prototype.mousedown=function(t){this.press(),this.stop(t)},e.prototype.mouseover=function(t){this.focus(),this.stop(t)},e.prototype.mouseout=function(t){this.deactivate(),this.stop(t)},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;e.setAttribute("aria-disabled","false"),e.textContent=this.content},e.prototype.activate=function(){this.disabled||this.html.classList.add(l.HtmlClasses.MENUACTIVE)},e.prototype.deactivate=function(){this.html.classList.remove(l.HtmlClasses.MENUACTIVE)},e.prototype.focus=function(){this.menu.focused=this,t.prototype.focus.call(this),this.activate()},e.prototype.unfocus=function(){this.deactivate(),t.prototype.unfocus.call(this)},e.prototype.escape=function(t){a.MenuUtil.close(this)},e.prototype.up=function(t){this.menu.up(t)},e.prototype.down=function(t){this.menu.down(t)},e.prototype.left=function(t){this.menu.left(t)},e.prototype.right=function(t){this.menu.right(t)},e.prototype.space=function(t){this.press()},e.prototype.disable=function(){this.disabled=!0;var t=this.html;t.classList.add(l.HtmlClasses.MENUDISABLED),t.setAttribute("aria-disabled","true")},e.prototype.enable=function(){this.disabled=!1;var t=this.html;t.classList.remove(l.HtmlClasses.MENUDISABLED),t.removeAttribute("aria-disabled")},e.prototype.executeCallbacks_=function(){var t,e;try{for(var r=i(this.callbacks),n=r.next();!n.done;n=r.next()){var o=n.value;try{o(this)}catch(t){a.MenuUtil.error(t,"Callback for menu entry "+this.id+" failed.")}}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}},e}(s.AbstractEntry);e.AbstractItem=c},1484:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractMenu=void 0;var s=r(8372),a=r(1340),l=r(2165),c=r(6186),u=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.className=l.HtmlClasses.CONTEXTMENU,e.role="menu",e._items=[],e._baseMenu=null,e}return o(e,t),Object.defineProperty(e.prototype,"baseMenu",{get:function(){return this._baseMenu},set:function(t){this._baseMenu=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"items",{get:function(){return this._items},set:function(t){this._items=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"pool",{get:function(){return this.variablePool},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"focused",{get:function(){return this._focused},set:function(t){if(this._focused!==t){this._focused||this.unfocus();var e=this._focused;this._focused=t,e&&e.unfocus()}},enumerable:!1,configurable:!0}),e.prototype.up=function(t){var e=this.items.filter((function(t){return t instanceof a.AbstractItem&&!t.isHidden()}));if(0!==e.length)if(this.focused){var r=e.indexOf(this.focused);-1!==r&&e[r=r?--r:e.length-1].focus()}else e[e.length-1].focus()},e.prototype.down=function(t){var e=this.items.filter((function(t){return t instanceof a.AbstractItem&&!t.isHidden()}));if(0!==e.length)if(this.focused){var r=e.indexOf(this.focused);-1!==r&&e[r=++r===e.length?0:r].focus()}else e[0].focus()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.generateMenu()},e.prototype.generateMenu=function(){var t,e,r=this.html;r.classList.add(l.HtmlClasses.MENU);try{for(var n=i(this.items),o=n.next();!o.done;o=n.next()){var s=o.value;if(s.isHidden()){var a=s.html;a.parentNode&&a.parentNode.removeChild(a)}else r.appendChild(s.html)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.post=function(e,r){this.variablePool.update(),t.prototype.post.call(this,e,r)},e.prototype.unpostSubmenus=function(){var t,e,r=this.items.filter((function(t){return t instanceof c.Submenu}));try{for(var n=i(r),o=n.next();!o.done;o=n.next()){var s=o.value;s.submenu.unpost(),s!==this.focused&&s.unfocus()}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.unpostSubmenus(),this.focused=null},e.prototype.find=function(t){var e,r;try{for(var n=i(this.items),o=n.next();!o.done;o=n.next()){var s=o.value;if("rule"!==s.type){if(s.id===t)return s;if("submenu"===s.type){var a=s.submenu.find(t);if(a)return a}}}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return null},e}(s.AbstractPostable);e.AbstractMenu=u},2868:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractNavigatable=void 0;var n=r(3205),o=r(8853),i=function(){function t(){this.bubble=!1}return t.prototype.bubbleKey=function(){this.bubble=!0},t.prototype.keydown=function(t){switch(t.keyCode){case n.KEY.ESCAPE:this.escape(t);break;case n.KEY.RIGHT:this.right(t);break;case n.KEY.LEFT:this.left(t);break;case n.KEY.UP:this.up(t);break;case n.KEY.DOWN:this.down(t);break;case n.KEY.RETURN:case n.KEY.SPACE:this.space(t);break;default:return}this.bubble?this.bubble=!1:this.stop(t)},t.prototype.escape=function(t){},t.prototype.space=function(t){},t.prototype.left=function(t){},t.prototype.right=function(t){},t.prototype.up=function(t){},t.prototype.down=function(t){},t.prototype.stop=function(t){t&&(t.stopPropagation(),t.preventDefault(),t.cancelBubble=!0)},t.prototype.mousedown=function(t){return this.stop(t)},t.prototype.mouseup=function(t){return this.stop(t)},t.prototype.mouseover=function(t){return this.stop(t)},t.prototype.mouseout=function(t){return this.stop(t)},t.prototype.click=function(t){return this.stop(t)},t.prototype.addEvents=function(t){t.addEventListener(o.MOUSE.DOWN,this.mousedown.bind(this)),t.addEventListener(o.MOUSE.UP,this.mouseup.bind(this)),t.addEventListener(o.MOUSE.OVER,this.mouseover.bind(this)),t.addEventListener(o.MOUSE.OUT,this.mouseout.bind(this)),t.addEventListener(o.MOUSE.CLICK,this.click.bind(this)),t.addEventListener("keydown",this.keydown.bind(this)),t.addEventListener("dragstart",this.stop.bind(this)),t.addEventListener(o.MOUSE.SELECTSTART,this.stop.bind(this)),t.addEventListener("contextmenu",this.stop.bind(this)),t.addEventListener(o.MOUSE.DBLCLICK,this.stop.bind(this))},t}();e.AbstractNavigatable=i},8372:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractPostable=void 0;var i=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.posted=!1,e}return o(e,t),e.prototype.isPosted=function(){return this.posted},e.prototype.post=function(t,e){this.posted||(void 0!==t&&void 0!==e&&this.html.setAttribute("style","left: "+t+"px; top: "+e+"px;"),this.display(),this.posted=!0)},e.prototype.unpost=function(){if(this.posted){var t=this.html;t.parentNode&&t.parentNode.removeChild(t),this.posted=!1}},e}(r(9328).MenuElement);e.AbstractPostable=i},6765:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractVariableItem=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;this.span||this.generateSpan(),e.appendChild(this.span),this.update()},e.prototype.register=function(){this.variable.register(this)},e.prototype.unregister=function(){this.variable.unregister(this)},e.prototype.update=function(){this.updateAria(),this.span&&this.updateSpan()},e}(r(1340).AbstractItem);e.AbstractVariableItem=i},5179:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CloseButton=void 0;var i=r(8372),s=r(2165),a=function(t){function e(e){var r=t.call(this)||this;return r.element=e,r.className=s.HtmlClasses.MENUCLOSE,r.role="button",r}return o(e,t),e.prototype.generateHtml=function(){var t=document.createElement("span");t.classList.add(this.className),t.setAttribute("role",this.role),t.setAttribute("tabindex","0");var e=document.createElement("span");e.textContent="\xd7",t.appendChild(e),this.html=t},e.prototype.display=function(){},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.element.unpost()},e.prototype.keydown=function(e){this.bubbleKey(),t.prototype.keydown.call(this,e)},e.prototype.space=function(t){this.unpost(),this.stop(t)},e.prototype.mousedown=function(t){this.unpost(),this.stop(t)},e}(i.AbstractPostable);e.CloseButton=a},5073:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenu=void 0;var i=r(1484),s=r(2165),a=r(1932),l=r(2358),c=function(t){function e(e){var r=t.call(this)||this;return r.factory=e,r.id="",r.moving=!1,r._store=new a.MenuStore(r),r.widgets=[],r.variablePool=new l.VariablePool,r}return o(e,t),e.fromJson=function(t,e){var r=e.pool,n=e.items,o=e.id,i=void 0===o?"":o,s=new this(t);s.id=i;var a=t.get("variable");r.forEach((function(e){return a(t,e,s.pool)}));var l=t.get("items")(t,n,s);return s.items=l,s},e.prototype.generateHtml=function(){this.isPosted()&&this.unpost(),t.prototype.generateHtml.call(this),this._frame=document.createElement("div"),this._frame.classList.add(s.HtmlClasses.MENUFRAME);var e="left: 0px; top: 0px; z-index: 200; width: 100%; height: 100%; border: 0px; padding: 0px; margin: 0px;";this._frame.setAttribute("style","position: absolute; "+e);var r=document.createElement("div");r.setAttribute("style","position: fixed; "+e),this._frame.appendChild(r),r.addEventListener("mousedown",function(t){this.unpost(),this.unpostWidgets(),this.stop(t)}.bind(this))},e.prototype.display=function(){document.body.appendChild(this.frame),this.frame.appendChild(this.html),this.focus()},e.prototype.escape=function(t){this.unpost(),this.unpostWidgets()},e.prototype.unpost=function(){if(t.prototype.unpost.call(this),!(this.widgets.length>0)){this.frame.parentNode.removeChild(this.frame);var e=this.store;this.moving||e.insertTaborder(),e.active.focus()}},e.prototype.left=function(t){this.move_(this.store.previous())},e.prototype.right=function(t){this.move_(this.store.next())},Object.defineProperty(e.prototype,"frame",{get:function(){return this._frame},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"store",{get:function(){return this._store},enumerable:!1,configurable:!0}),e.prototype.post=function(e,r){if(void 0!==r)return this.moving||this.store.removeTaborder(),void t.prototype.post.call(this,e,r);var n,o,i,s=e;if(s instanceof Event?(n=s.target,this.stop(s)):n=s,s instanceof MouseEvent&&(o=s.pageX,i=s.pageY,o||i||!s.clientX||(o=s.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,i=s.clientY+document.body.scrollTop+document.documentElement.scrollTop)),!o&&!i&&n){var a=window.pageXOffset||document.documentElement.scrollLeft,l=window.pageYOffset||document.documentElement.scrollTop,c=n.getBoundingClientRect();o=(c.right+c.left)/2+a,i=(c.bottom+c.top)/2+l}this.store.active=n,this.anchor=this.store.active;var u=this.html;o+u.offsetWidth>document.body.offsetWidth-5&&(o=document.body.offsetWidth-u.offsetWidth-5),this.post(o,i)},e.prototype.registerWidget=function(t){this.widgets.push(t)},e.prototype.unregisterWidget=function(t){var e=this.widgets.indexOf(t);e>-1&&this.widgets.splice(e,1),0===this.widgets.length&&this.unpost()},e.prototype.unpostWidgets=function(){this.widgets.forEach((function(t){return t.unpost()}))},e.prototype.toJson=function(){return{type:""}},e.prototype.move_=function(t){this.anchor&&t!==this.anchor&&(this.moving=!0,this.unpost(),this.post(t),this.moving=!1)},e}(i.AbstractMenu);e.ContextMenu=c},7309:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CssStyles=void 0;var n=r(2165);!function(t){function e(t){return"."+(n.HtmlClasses[t]||t)}var r={};r[e("INFOCLOSE")]="{ top:.2em; right:.2em;}",r[e("INFOCONTENT")]="{ overflow:auto; text-align:left; font-size:80%; padding:.4em .6em; border:1px inset; margin:1em 0px; max-height:20em; max-width:30em; background-color:#EEEEEE; white-space:normal;}",r[e("INFO")+e("MOUSEPOST")]="{outline:none;}",r[e("INFO")]='{ position:fixed; left:50%; width:auto; text-align:center; border:3px outset; padding:1em 2em; background-color:#DDDDDD; color:black; cursor:default; font-family:message-box; font-size:120%; font-style:normal; text-indent:0; text-transform:none; line-height:normal; letter-spacing:normal; word-spacing:normal; word-wrap:normal; white-space:nowrap; float:none; z-index:201; border-radius: 15px; /* Opera 10.5 and IE9 */ -webkit-border-radius:15px; /* Safari and Chrome */ -moz-border-radius:15px; /* Firefox */ -khtml-border-radius:15px; /* Konqueror */ box-shadow:0px 10px 20px #808080; /* Opera 10.5 and IE9 */ -webkit-box-shadow:0px 10px 20px #808080; /* Safari 3 & Chrome */ -moz-box-shadow:0px 10px 20px #808080; /* Forefox 3.5 */ -khtml-box-shadow:0px 10px 20px #808080; /* Konqueror */ filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color="gray", Positive="true"); /* IE */}';var o={};o[e("MENU")]="{ position:absolute; background-color:white; color:black; width:auto; padding:5px 0px; border:1px solid #CCCCCC; margin:0; cursor:default; font: menu; text-align:left; text-indent:0; text-transform:none; line-height:normal; letter-spacing:normal; word-spacing:normal; word-wrap:normal; white-space:nowrap; float:none; z-index:201; border-radius: 5px; /* Opera 10.5 and IE9 */ -webkit-border-radius: 5px; /* Safari and Chrome */ -moz-border-radius: 5px; /* Firefox */ -khtml-border-radius: 5px; /* Konqueror */ box-shadow:0px 10px 20px #808080; /* Opera 10.5 and IE9 */ -webkit-box-shadow:0px 10px 20px #808080; /* Safari 3 & Chrome */ -moz-box-shadow:0px 10px 20px #808080; /* Forefox 3.5 */ -khtml-box-shadow:0px 10px 20px #808080; /* Konqueror */}",o[e("MENUITEM")]="{ padding: 1px 2em; background:transparent;}",o[e("MENUARROW")]="{ position:absolute; right:.5em; padding-top:.25em; color:#666666; font-family: null; font-size: .75em}",o[e("MENUACTIVE")+" "+e("MENUARROW")]="{color:white}",o[e("MENUARROW")+e("RTL")]="{left:.5em; right:auto}",o[e("MENUCHECK")]="{ position:absolute; left:.7em; font-family: null}",o[e("MENUCHECK")+e("RTL")]="{ right:.7em; left:auto }",o[e("MENURADIOCHECK")]="{ position:absolute; left: .7em;}",o[e("MENURADIOCHECK")+e("RTL")]="{ right: .7em; left:auto}",o[e("MENUINPUTBOX")]="{ padding-left: 1em; right:.5em; color:#666666; font-family: null;}",o[e("MENUINPUTBOX")+e("RTL")]="{ left: .1em;}",o[e("MENUCOMBOBOX")]="{ left:.1em; padding-bottom:.5em;}",o[e("MENUSLIDER")]="{ left: .1em;}",o[e("SLIDERVALUE")]="{ position:absolute; right:.1em; padding-top:.25em; color:#333333; font-size: .75em}",o[e("SLIDERBAR")]="{ outline: none; background: #d3d3d3}",o[e("MENULABEL")]="{ padding: 1px 2em 3px 1.33em; font-style:italic}",o[e("MENURULE")]="{ border-top: 1px solid #DDDDDD; margin: 4px 3px;}",o[e("MENUDISABLED")]="{ color:GrayText}",o[e("MENUACTIVE")]="{ background-color: #606872; color: white;}",o[e("MENUDISABLED")+":focus"]="{ background-color: #E8E8E8}",o[e("MENULABEL")+":focus"]="{ background-color: #E8E8E8}",o[e("CONTEXTMENU")+":focus"]="{ outline:none}",o[e("CONTEXTMENU")+" "+e("MENUITEM")+":focus"]="{ outline:none}",o[e("SELECTIONMENU")]="{ position:relative; float:left; border-bottom: none; -webkit-box-shadow:none; -webkit-border-radius:0px; }",o[e("SELECTIONITEM")]="{ padding-right: 1em;}",o[e("SELECTION")]="{ right: 40%; width:50%; }",o[e("SELECTIONBOX")]="{ padding: 0em; max-height:20em; max-width: none; background-color:#FFFFFF;}",o[e("SELECTIONDIVIDER")]="{ clear: both; border-top: 2px solid #000000;}",o[e("MENU")+" "+e("MENUCLOSE")]="{ top:-10px; left:-10px}";var i={};i[e("MENUCLOSE")]='{ position:absolute; cursor:pointer; display:inline-block; border:2px solid #AAA; border-radius:18px; -webkit-border-radius: 18px; /* Safari and Chrome */ -moz-border-radius: 18px; /* Firefox */ -khtml-border-radius: 18px; /* Konqueror */ font-family: "Courier New", Courier; font-size:24px; color:#F0F0F0}',i[e("MENUCLOSE")+" span"]="{ display:block; background-color:#AAA; border:1.5px solid; border-radius:18px; -webkit-border-radius: 18px; /* Safari and Chrome */ -moz-border-radius: 18px; /* Firefox */ -khtml-border-radius: 18px; /* Konqueror */ line-height:0; padding:8px 0 6px /* may need to be browser-specific */}",i[e("MENUCLOSE")+":hover"]="{ color:white!important; border:2px solid #CCC!important}",i[e("MENUCLOSE")+":hover span"]="{ background-color:#CCC!important}",i[e("MENUCLOSE")+":hover:focus"]="{ outline:none}";var s=!1,a=!1,l=!1;function c(t){l||(u(i,t),l=!0)}function u(t,e){var r=e||document,n=r.createElement("style");n.type="text/css";var o="";for(var i in t)o+=i,o+=" ",o+=t[i],o+="\n";n.innerHTML=o,r.head.appendChild(n)}t.addMenuStyles=function(t){a||(u(o,t),a=!0,c(t))},t.addInfoStyles=function(t){s||(u(r,t),s=!0,c(t))}}(e.CssStyles||(e.CssStyles={}))},2165:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.HtmlAttrs=e.HtmlClasses=void 0;function r(t){return"CtxtMenu_"+t}function n(t){return r(t)}function o(t){return r(t)}e.HtmlClasses={ATTACHED:n("Attached"),CONTEXTMENU:n("ContextMenu"),MENU:n("Menu"),MENUARROW:n("MenuArrow"),MENUACTIVE:n("MenuActive"),MENUCHECK:n("MenuCheck"),MENUCLOSE:n("MenuClose"),MENUCOMBOBOX:n("MenuComboBox"),MENUDISABLED:n("MenuDisabled"),MENUFRAME:n("MenuFrame"),MENUITEM:n("MenuItem"),MENULABEL:n("MenuLabel"),MENURADIOCHECK:n("MenuRadioCheck"),MENUINPUTBOX:n("MenuInputBox"),MENURULE:n("MenuRule"),MENUSLIDER:n("MenuSlider"),MOUSEPOST:n("MousePost"),RTL:n("RTL"),INFO:n("Info"),INFOCLOSE:n("InfoClose"),INFOCONTENT:n("InfoContent"),INFOSIGNATURE:n("InfoSignature"),INFOTITLE:n("InfoTitle"),SLIDERVALUE:n("SliderValue"),SLIDERBAR:n("SliderBar"),SELECTION:n("Selection"),SELECTIONBOX:n("SelectionBox"),SELECTIONMENU:n("SelectionMenu"),SELECTIONDIVIDER:n("SelectionDivider"),SELECTIONITEM:n("SelectionItem")},e.HtmlAttrs={COUNTER:o("Counter"),KEYDOWNFUNC:o("keydownFunc"),CONTEXTMENUFUNC:o("contextmenuFunc"),OLDTAB:o("Oldtabindex"),TOUCHFUNC:o("TouchFunc")}},4922:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Info=void 0;var i=r(5179),s=r(2165),a=function(t){function e(e,r,n){var o=t.call(this)||this;return o.title=e,o.signature=n,o.className=s.HtmlClasses.INFO,o.role="dialog",o.contentDiv=o.generateContent(),o.close=o.generateClose(),o.content=r||function(){return""},o}return o(e,t),e.prototype.attachMenu=function(t){this.menu=t},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;e.appendChild(this.generateTitle()),e.appendChild(this.contentDiv),e.appendChild(this.generateSignature()),e.appendChild(this.close.html),e.setAttribute("tabindex","0")},e.prototype.post=function(){t.prototype.post.call(this);var e=document.documentElement,r=this.html,n=window.innerHeight||e.clientHeight||e.scrollHeight||0,o=Math.floor(-r.offsetWidth/2),i=Math.floor((n-r.offsetHeight)/3);r.setAttribute("style","margin-left: "+o+"px; top: "+i+"px;"),window.event instanceof MouseEvent&&r.classList.add(s.HtmlClasses.MOUSEPOST),r.focus()},e.prototype.display=function(){this.menu.registerWidget(this),this.contentDiv.innerHTML=this.content();var t=this.menu.html;t.parentNode&&t.parentNode.removeChild(t),this.menu.frame.appendChild(this.html)},e.prototype.click=function(t){},e.prototype.keydown=function(e){this.bubbleKey(),t.prototype.keydown.call(this,e)},e.prototype.escape=function(t){this.unpost()},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.html.classList.remove(s.HtmlClasses.MOUSEPOST),this.menu.unregisterWidget(this)},e.prototype.generateClose=function(){var t=new i.CloseButton(this),e=t.html;return e.classList.add(s.HtmlClasses.INFOCLOSE),e.setAttribute("aria-label","Close Dialog Box"),t},e.prototype.generateTitle=function(){var t=document.createElement("span");return t.innerHTML=this.title,t.classList.add(s.HtmlClasses.INFOTITLE),t},e.prototype.generateContent=function(){var t=document.createElement("div");return t.classList.add(s.HtmlClasses.INFOCONTENT),t.setAttribute("tabindex","0"),t},e.prototype.generateSignature=function(){var t=document.createElement("span");return t.innerHTML=this.signature,t.classList.add(s.HtmlClasses.INFOSIGNATURE),t},e.prototype.toJson=function(){return{type:""}},e}(r(8372).AbstractPostable);e.Info=a},1409:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Checkbox=void 0;var i=r(6765),s=r(2556),a=r(2165),l=function(t){function e(e,r,n,o){var i=t.call(this,e,"checkbox",r,o)||this;return i.role="menuitemcheckbox",i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(!this.variable.getValue()),s.MenuUtil.close(this)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.span.textContent="\u2713",this.span.classList.add(a.HtmlClasses.MENUCHECK)},e.prototype.updateAria=function(){this.html.setAttribute("aria-checked",this.variable.getValue()?"true":"false")},e.prototype.updateSpan=function(){this.span.style.display=this.variable.getValue()?"":"none"},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Checkbox=l},9886:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Combo=void 0;var i=r(6765),s=r(2556),a=r(2165),l=r(3205),c=function(t){function e(e,r,n,o){var i=t.call(this,e,"combobox",r,o)||this;return i.role="combobox",i.inputEvent=!1,i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(this.input.value,s.MenuUtil.getActiveElement(this))},e.prototype.space=function(e){t.prototype.space.call(this,e),s.MenuUtil.close(this)},e.prototype.focus=function(){t.prototype.focus.call(this),this.input.focus()},e.prototype.unfocus=function(){t.prototype.unfocus.call(this),this.updateSpan()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.html.classList.add(a.HtmlClasses.MENUCOMBOBOX)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.span.classList.add(a.HtmlClasses.MENUINPUTBOX),this.input=document.createElement("input"),this.input.addEventListener("keydown",this.inputKey.bind(this)),this.input.setAttribute("size","10em"),this.input.setAttribute("type","text"),this.input.setAttribute("tabindex","-1"),this.span.appendChild(this.input)},e.prototype.inputKey=function(t){this.bubbleKey(),this.inputEvent=!0},e.prototype.keydown=function(e){if(this.inputEvent&&e.keyCode!==l.KEY.ESCAPE&&e.keyCode!==l.KEY.RETURN)return this.inputEvent=!1,void e.stopPropagation();t.prototype.keydown.call(this,e),e.stopPropagation()},e.prototype.updateAria=function(){},e.prototype.updateSpan=function(){var t;try{t=this.variable.getValue(s.MenuUtil.getActiveElement(this))}catch(e){t=""}this.input.value=t},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Combo=c},3467:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Command=void 0;var i=r(1340),s=r(2556),a=function(t){function e(e,r,n,o){var i=t.call(this,e,"command",r,o)||this;return i.command=n,i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.action,e.id)},e.prototype.executeAction=function(){try{this.command(s.MenuUtil.getActiveElement(this))}catch(t){s.MenuUtil.error(t,"Illegal command callback.")}s.MenuUtil.close(this)},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractItem);e.Command=a},2965:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Label=void 0;var i=r(1340),s=r(2165),a=function(t){function e(e,r,n){return t.call(this,e,"label",r,n)||this}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.id)},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.html.classList.add(s.HtmlClasses.MENULABEL)},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractItem);e.Label=a},385:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Radio=void 0;var i=r(6765),s=r(2556),a=r(2165),l=function(t){function e(e,r,n,o){var i=t.call(this,e,"radio",r,o)||this;return i.role="menuitemradio",i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(this.id),s.MenuUtil.close(this)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.span.textContent="\u2713",this.span.classList.add(a.HtmlClasses.MENURADIOCHECK)},e.prototype.updateAria=function(){this.html.setAttribute("aria-checked",this.variable.getValue()===this.id?"true":"false")},e.prototype.updateSpan=function(){this.span.style.display=this.variable.getValue()===this.id?"":"none"},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Radio=l},3463:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Rule=void 0;var i=r(9329),s=r(2165),a=function(t){function e(e){var r=t.call(this,e,"rule")||this;return r.className=s.HtmlClasses.MENUITEM,r.role="separator",r}return o(e,t),e.fromJson=function(t,e,r){return new this(r)},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;e.classList.add(s.HtmlClasses.MENURULE),e.setAttribute("aria-orientation","vertical")},e.prototype.addEvents=function(t){},e.prototype.toJson=function(){return{type:"rule"}},e}(i.AbstractEntry);e.Rule=a},7625:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Slider=void 0;var i=r(6765),s=r(2556),a=r(2165),l=r(3205),c=function(t){function e(e,r,n,o){var i=t.call(this,e,"slider",r,o)||this;return i.role="slider",i.labelId="ctx_slideLabel"+s.MenuUtil.counter(),i.valueId="ctx_slideValue"+s.MenuUtil.counter(),i.inputEvent=!1,i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(this.input.value,s.MenuUtil.getActiveElement(this)),this.update()},e.prototype.space=function(e){t.prototype.space.call(this,e),s.MenuUtil.close(this)},e.prototype.focus=function(){t.prototype.focus.call(this),this.input.focus()},e.prototype.unfocus=function(){t.prototype.unfocus.call(this),this.updateSpan()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.html.classList.add(a.HtmlClasses.MENUSLIDER),this.valueSpan=document.createElement("span"),this.valueSpan.setAttribute("id",this.valueId),this.valueSpan.classList.add(a.HtmlClasses.SLIDERVALUE),this.html.appendChild(this.valueSpan)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.labelSpan=document.createElement("span"),this.labelSpan.setAttribute("id",this.labelId),this.labelSpan.appendChild(this.html.childNodes[0]),this.html.appendChild(this.labelSpan),this.input=document.createElement("input"),this.input.setAttribute("type","range"),this.input.setAttribute("min","0"),this.input.setAttribute("max","100"),this.input.setAttribute("aria-valuemin","0"),this.input.setAttribute("aria-valuemax","100"),this.input.setAttribute("aria-labelledby",this.labelId),this.input.addEventListener("keydown",this.inputKey.bind(this)),this.input.addEventListener("input",this.executeAction.bind(this)),this.input.classList.add(a.HtmlClasses.SLIDERBAR),this.span.appendChild(this.input)},e.prototype.inputKey=function(t){this.inputEvent=!0},e.prototype.mousedown=function(t){t.stopPropagation()},e.prototype.mouseup=function(t){event.stopPropagation()},e.prototype.keydown=function(e){var r=e.keyCode;return r===l.KEY.UP||r===l.KEY.DOWN?(e.preventDefault(),void t.prototype.keydown.call(this,e)):this.inputEvent&&r!==l.KEY.ESCAPE&&r!==l.KEY.RETURN?(this.inputEvent=!1,void e.stopPropagation()):(t.prototype.keydown.call(this,e),void e.stopPropagation())},e.prototype.updateAria=function(){var t=this.variable.getValue();t&&this.input&&(this.input.setAttribute("aria-valuenow",t),this.input.setAttribute("aria-valuetext",t+"%"))},e.prototype.updateSpan=function(){var t;try{t=this.variable.getValue(s.MenuUtil.getActiveElement(this)),this.valueSpan.innerHTML=t+"%"}catch(e){t=""}this.input.value=t},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Slider=c},6186:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Submenu=void 0;var i=r(1340),s=r(2165),a=function(t){function e(e,r,n){var o=t.call(this,e,"submenu",r,n)||this;return o._submenu=null,o}return o(e,t),e.fromJson=function(t,e,r){var n=e.content,o=e.menu,i=new this(r,n,e.id),s=t.get("subMenu")(t,o,i);return i.submenu=s,i},Object.defineProperty(e.prototype,"submenu",{get:function(){return this._submenu},set:function(t){this._submenu=t},enumerable:!1,configurable:!0}),e.prototype.mouseover=function(t){this.focus(),this.stop(t)},e.prototype.mouseout=function(t){this.stop(t)},e.prototype.unfocus=function(){if(this.submenu.isPosted()){if(this.menu.focused!==this)return t.prototype.unfocus.call(this),void this.menu.unpostSubmenus();this.html.setAttribute("tabindex","-1"),this.html.blur()}else t.prototype.unfocus.call(this)},e.prototype.focus=function(){t.prototype.focus.call(this),this.submenu.isPosted()||this.disabled||this.submenu.post()},e.prototype.executeAction=function(){this.submenu.isPosted()?this.submenu.unpost():this.submenu.post()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;this.span=document.createElement("span"),this.span.textContent="\u25ba",this.span.classList.add(s.HtmlClasses.MENUARROW),e.appendChild(this.span),e.setAttribute("aria-haspopup","true")},e.prototype.left=function(e){this.submenu.isPosted()?this.submenu.unpost():t.prototype.left.call(this,e)},e.prototype.right=function(t){this.submenu.isPosted()?this.submenu.down(t):this.submenu.post()},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractItem);e.Submenu=a},3205:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.KEY=void 0,function(t){t[t.RETURN=13]="RETURN",t[t.ESCAPE=27]="ESCAPE",t[t.SPACE=32]="SPACE",t[t.LEFT=37]="LEFT",t[t.UP=38]="UP",t[t.RIGHT=39]="RIGHT",t[t.DOWN=40]="DOWN"}(e.KEY||(e.KEY={}))},9328:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.MenuElement=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addAttributes=function(t){for(var e in t)this.html.setAttribute(e,t[e])},Object.defineProperty(e.prototype,"html",{get:function(){return this._html||this.generateHtml(),this._html},set:function(t){this._html=t,this.addEvents(t)},enumerable:!1,configurable:!0}),e.prototype.generateHtml=function(){var t=document.createElement("div");t.classList.add(this.className),t.setAttribute("role",this.role),this.html=t},e.prototype.focus=function(){var t=this.html;t.setAttribute("tabindex","0"),t.focus()},e.prototype.unfocus=function(){var t=this.html;t.hasAttribute("tabindex")&&t.setAttribute("tabindex","-1");try{t.blur()}catch(t){}t.blur()},e}(r(2868).AbstractNavigatable);e.MenuElement=i},1932:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MenuStore=void 0;var o=r(2556),i=r(2165),s=r(3205),a=function(){function t(t){this.menu=t,this.store=[],this._active=null,this.counter=0,this.attachedClass=i.HtmlClasses.ATTACHED+"_"+o.MenuUtil.counter(),this.taborder=!0,this.attrMap={}}return Object.defineProperty(t.prototype,"active",{get:function(){return this._active},set:function(t){do{if(-1!==this.store.indexOf(t)){this._active=t;break}t=t.parentNode}while(t)},enumerable:!1,configurable:!0}),t.prototype.next=function(){var t=this.store.length;if(0===t)return this.active=null,null;var e=this.store.indexOf(this.active);return e=-1===e?0:e0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s},i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__spread||function(){for(var t=[],e=0;e0)&&!(n=i.next()).done;)s.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return s};Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionBox=e.SelectionMenu=void 0;var s=r(2556),a=r(2165),l=r(1484),c=r(4922),u=function(t){function e(e){var r=t.call(this)||this;return r.anchor=e,r.className=a.HtmlClasses.SELECTIONMENU,r.variablePool=r.anchor.menu.pool,r.baseMenu=r.anchor.menu,r}return o(e,t),e.fromJson=function(t,e,r){var n=e.title,o=e.values,i=e.variable,s=new this(r),a=t.get("label")(t,{content:n||"",id:n||"id"},s),l=t.get("rule")(t,{},s),c=o.map((function(e){return t.get("radio")(t,{content:e,variable:i,id:e},s)})),u=[a,l].concat(c);return s.items=u,s},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.items.forEach((function(t){return t.html.classList.add(a.HtmlClasses.SELECTIONITEM)}))},e.prototype.display=function(){},e.prototype.right=function(t){this.anchor.right(t)},e.prototype.left=function(t){this.anchor.left(t)},e}(l.AbstractMenu);e.SelectionMenu=u;var p=function(t){function e(e,r,n,o){void 0===n&&(n="none"),void 0===o&&(o="vertical");var i=t.call(this,e,null,r)||this;return i.style=n,i.grid=o,i._selections=[],i.prefix="ctxt-selection",i._balanced=!0,i}return o(e,t),e.fromJson=function(t,e,r){var n=e.title,o=e.signature,i=e.selections,s=new this(n,o,e.order,e.grid);s.attachMenu(r);var a=i.map((function(e){return t.get("selectionMenu")(t,e,s)}));return s.selections=a,s},e.prototype.attachMenu=function(t){this.menu=t},Object.defineProperty(e.prototype,"selections",{get:function(){return this._selections},set:function(t){var e=this;this._selections=[],t.forEach((function(t){return e.addSelection(t)}))},enumerable:!1,configurable:!0}),e.prototype.addSelection=function(t){t.anchor=this,this._selections.push(t)},e.prototype.rowDiv=function(t){var e=this,r=document.createElement("div");this.contentDiv.appendChild(r);var n=t.map((function(t){return r.appendChild(t.html),t.html.id||(t.html.id=e.prefix+s.MenuUtil.counter()),t.html.getBoundingClientRect()})),o=n.map((function(t){return t.width})),i=o.reduce((function(t,e){return t+e}),0),l=n.reduce((function(t,e){return Math.max(t,e.height)}),0);return r.classList.add(a.HtmlClasses.SELECTIONDIVIDER),r.setAttribute("style","height: "+l+"px;"),[r,i,l,o]},e.prototype.display=function(){if(t.prototype.display.call(this),this.order(),this.selections.length){for(var e=[],r=0,n=[],o=this.getChunkSize(this.selections.length),s=function(t){var s=a.selections.slice(t,t+o),l=i(a.rowDiv(s),4),c=l[0],u=l[1],p=l[2],h=l[3];e.push(c),r=Math.max(r,u),s.forEach((function(t){return t.html.style.height=p+"px"})),n=a.combineColumn(n,h)},a=this,l=0;ldocument.body.offsetWidth-5&&(i=Math.max(5,i-o-r.offsetWidth+6)),t.prototype.post.call(this,i,s)}},e.prototype.display=function(){this.baseMenu.frame.appendChild(this.html)},e.prototype.setBaseMenu=function(){var t=this;do{t=t.anchor.menu}while(t instanceof e);this.baseMenu=t},e.prototype.left=function(t){this.focused=null,this.anchor.focus()},e.prototype.toJson=function(){return{type:""}},e}(r(1484).AbstractMenu);e.SubMenu=i},3737:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Variable=void 0;var n=r(2556),o=function(){function t(t,e,r){this._name=t,this.getter=e,this.setter=r,this.items=[]}return t.fromJson=function(t,e,r){var n=new this(e.name,e.getter,e.setter);r.insert(n)},Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),t.prototype.getValue=function(t){try{return this.getter(t)}catch(t){return n.MenuUtil.error(t,"Command of variable "+this.name+" failed."),null}},t.prototype.setValue=function(t,e){try{this.setter(t,e)}catch(t){n.MenuUtil.error(t,"Command of variable "+this.name+" failed.")}this.update()},t.prototype.register=function(t){-1===this.items.indexOf(t)&&this.items.push(t)},t.prototype.unregister=function(t){var e=this.items.indexOf(t);-1!==e&&this.items.splice(e,1)},t.prototype.update=function(){this.items.forEach((function(t){return t.update()}))},t.prototype.registerCallback=function(t){this.items.forEach((function(e){return e.registerCallback(t)}))},t.prototype.unregisterCallback=function(t){this.items.forEach((function(e){return e.unregisterCallback(t)}))},t.prototype.toJson=function(){return{type:"variable",name:this.name,getter:this.getter.toString(),setter:this.setter.toString()}},t}();e.Variable=o},2358:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.VariablePool=void 0;var r=function(){function t(){this.pool={}}return t.prototype.insert=function(t){this.pool[t.name]=t},t.prototype.lookup=function(t){return this.pool[t]},t.prototype.remove=function(t){delete this.pool[t]},t.prototype.update=function(){for(var t in this.pool)this.pool[t].update()},t}();e.VariablePool=r},3921:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractAudioRenderer=void 0;const n=r(5897);e.AbstractAudioRenderer=class{constructor(){this.separator_=" "}setSeparator(t){this.separator_=t}getSeparator(){return"braille"===n.default.getInstance().modality?"":this.separator_}error(t){return null}merge(t){let e="";const r=t.length-1;for(let n,o=0;n=t[o];o++)if(e+=n.speech,odelete t[e])),e.open.forEach((r=>t[r]=e[r]));const r=Object.keys(t);t.open=r},e.sortClose=function(t,e){if(t.length<=1)return t;const r=[];for(let n,o=0;n=e[o],t.length;o++)n.close&&n.close.length&&n.close.forEach((function(e){const n=t.indexOf(e);-1!==n&&(r.unshift(e),t.splice(n,1))}));return r};let a={},l=[];function c(t,e){const r=t[t.length-1];if(r){if(f(e)&&f(r)){if(void 0===r.join)return void(r.span=r.span.concat(e.span));const t=r.span.pop(),n=e.span.shift();return r.span.push(t+r.join+n),r.span=r.span.concat(e.span),void(r.join=e.join)}h(e)&&h(r)?r.pause=s(r.pause,e.pause):t.push(e)}else t.push(e)}function u(t,e){t.rate&&(e.rate=t.rate),t.pitch&&(e.pitch=t.pitch),t.volume&&(e.volume=t.volume)}function p(t){return"object"==typeof t&&t.open}function h(t){return"object"==typeof t&&1===Object.keys(t).length&&Object.keys(t)[0]===o.personalityProps.PAUSE}function f(t){const e=Object.keys(t);return"object"==typeof t&&(1===e.length&&"span"===e[0]||2===e.length&&("span"===e[0]&&"join"===e[1]||"span"===e[1]&&"join"===e[0]))}function d(t,e,r,n,a,l=!1){if(l){const l=t[t.length-1];let c;if(l&&(c=l[o.personalityProps.JOIN]),l&&!e.speech&&a&&h(l)){const t=o.personalityProps.PAUSE;l[t]=s(l[t],a[t]),a=null}if(l&&e.speech&&0===Object.keys(r).length&&f(l)){if(void 0!==c){const t=l.span.pop();e=new i.Span(t.speech+c+e.speech,t.attributes)}l.span.push(e),e=new i.Span("",{}),l[o.personalityProps.JOIN]=n}}0!==Object.keys(r).length&&t.push(r),e.speech&&t.push({span:[e],join:n}),a&&t.push(a)}function m(t,e){if(!e)return t;const r={};for(const n of o.personalityPropList){const o=t[n],i=e[n];if(!o&&!i||o&&i&&o===i)continue;const s=o||0;p(r)||(r.open=[],r.close=[]),o||r.close.push(n),i||r.open.push(n),i&&o&&(r.close.push(n),r.open.push(n)),e[n]=s,r[n]=s,a[n]?a[n].push(s):a[n]=[s]}if(p(r)){let t=r.close.slice();for(;t.length>0;){let o=l.pop();const i=(0,n.setdifference)(o,t);if(t=(0,n.setdifference)(t,o),o=i,0!==t.length){if(0!==o.length){r.close=r.close.concat(o),r.open=r.open.concat(o);for(let t,n=0;t=o[n];n++)r[t]=e[t]}}else 0!==o.length&&l.push(o)}l.push(r.open)}return r}e.personalityMarkup=function(t){a={},l=[];let e=[];const r={};for(let n,i=0;n=t[i];i++){let t=null;const i=n.descriptionSpan(),s=n.personality,a=s[o.personalityProps.JOIN];delete s[o.personalityProps.JOIN],void 0!==s[o.personalityProps.PAUSE]&&(t={[o.personalityProps.PAUSE]:s[o.personalityProps.PAUSE]},delete s[o.personalityProps.PAUSE]);d(e,i,m(s,r),a,t,!0)}return e=e.concat(function(){const t=[];for(let e=l.length-1;e>=0;e--){const r=l[e];if(r.length){const e={open:[],close:[]};for(let t=0;t"string"==typeof t?new c.Span(t,{}):t)),r=m.get(n.default.getInstance().markup);return r?r.merge(e):t.join()},e.finalize=function(t){const e=m.get(n.default.getInstance().markup);return e?e.finalize(t):t},e.error=function(t){const e=m.get(n.default.getInstance().markup);return e?e.error(t):""},e.registerRenderer=function(t,e){m.set(t,e)},e.isXml=function(){return m.get(n.default.getInstance().markup)instanceof f.XmlRenderer}},8639:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.LayoutRenderer=void 0;const n=r(2057),o=r(5740),i=r(4440),s=r(3706),a=r(2456);class l extends a.XmlRenderer{finalize(t){return function(t){c="";const e=o.parseInput(`${t}`);return n.Debugger.getInstance().output(o.formatXml(e.toString())),c=f(e),c}(t)}pause(t){return""}prosodyElement(t,e){return t===i.personalityProps.LAYOUT?`<${e}>`:""}closeTag(t){return``}markup(t){const e=[];let r=[];for(const n of t){if(!n.layout){r.push(n);continue}e.push(this.processContent(r)),r=[];const t=n.layout;t.match(/^begin/)?e.push("<"+t.replace(/^begin/,"")+">"):t.match(/^end/)?e.push(""):console.warn("Something went wrong with layout markup: "+t)}return e.push(this.processContent(r)),e.join("")}processContent(t){const e=[],r=s.personalityMarkup(t);for(let t,n=0;t=r[n];n++)t.span?e.push(this.merge(t.span)):s.isPauseElement(t);return e.join("")}}e.LayoutRenderer=l;let c="";const u={TABLE:function(t){let e=g(t);e.forEach((t=>{t.cells=t.cells.slice(1).slice(0,-1),t.width=t.width.slice(1).slice(0,-1)}));const[r,n]=b(e);return e=v(e,n),_(e,r)},CASES:function(t){let e=g(t);e.forEach((t=>{t.cells=t.cells.slice(0,-1),t.width=t.width.slice(0,-1)}));const[r,n]=b(e);return e=v(e,n),_(e,r)},CAYLEY:function(t){let e=g(t);e.forEach((t=>{t.cells=t.cells.slice(1).slice(0,-1),t.width=t.width.slice(1).slice(0,-1),t.sep=t.sep+t.sep}));const[r,n]=b(e),o={lfence:"",rfence:"",cells:n.map((t=>"\u2810"+new Array(t).join("\u2812"))),width:n,height:1,sep:e[0].sep};return e.splice(1,0,o),e=v(e,n),_(e,r)},MATRIX:function(t){let e=g(t);const[r,n]=b(e);return e=v(e,n),_(e,r)},CELL:f,FENCE:f,ROW:f,FRACTION:function(t){const[e,r,,n,o]=Array.from(t.childNodes),i=p(r),s=p(n),a=m(i),l=m(s);let c=Math.max(a,l);const u=e+new Array(c+1).join("\u2812")+o;return c=u.length,`${x(i,c)}\n${u}\n${x(s,c)}`},NUMERATOR:E,DENOMINATOR:E};function p(t){const e=o.tagName(t),r=u[e];return r?r(t):t.textContent}function h(t,e){if(!t||!e)return t+e;const r=d(t),n=d(e),o=r-n;t=o<0?y(t,n,m(t)):t,e=o>0?y(e,r,m(e)):e;const i=t.split(/\r\n|\r|\n/),s=e.split(/\r\n|\r|\n/),a=[];for(let t=0;tMath.max(e.length,t)),0)}function y(t,e,r){return t=function(t,e){const r=e-d(t);return t+(r>0?new Array(r+1).join("\n"):"")}(t,e),function(t,e){const r=t.split(/\r\n|\r|\n/),n=[];for(const t of r){const r=e-t.length;n.push(t+(r>0?new Array(r+1).join("\u2800"):""))}return n.join("\n")}(t,r)}function g(t){const e=Array.from(t.childNodes),r=[];for(const t of e)t.nodeType===o.NodeType.ELEMENT_NODE&&r.push(O(t));return r}function b(t){const e=t.reduce(((t,e)=>Math.max(e.height,t)),0),r=[];for(let e=0;et.width[e])).reduce(((t,e)=>Math.max(t,e)),0));return[e,r]}function v(t,e){const r=[];for(const n of t){if(0===n.height)continue;const t=[];for(let r=0;rt.lfence+t.cells.join(t.sep)+t.rfence)).join("\n");const r=[];for(const e of t){const t=S(e.sep,e.height);let n=e.cells.shift();for(;e.cells.length;)n=h(n,t),n=h(n,e.cells.shift());n=h(S(e.lfence,e.height),n),n=h(n,S(e.rfence,e.height)),r.push(n),r.push(e.lfence+new Array(m(n)-3).join(e.sep)+e.rfence)}return r.slice(0,-1).join("\n")}function S(t,e){let r="";for(;e;)r+=t+"\n",e--;return r.slice(0,-1)}function M(t){return t.nodeType===o.NodeType.ELEMENT_NODE&&"FENCE"===o.tagName(t)?p(t):""}function O(t){const e=Array.from(t.childNodes),r=M(e[0]),n=M(e[e.length-1]);r&&e.shift(),n&&e.pop();let i="";const s=[];for(const t of e){if(t.nodeType===o.NodeType.TEXT_NODE){i=t.textContent;continue}const e=p(t);s.push(e)}return{lfence:r,rfence:n,sep:i,cells:s,height:s.reduce(((t,e)=>Math.max(d(e),t)),0),width:s.map(m)}}function x(t,e){const r=(e-m(t))/2,[n,o]=Math.floor(r)===r?[r,r]:[Math.floor(r),Math.ceil(r)],i=t.split(/\r\n|\r|\n/),s=[],[a,l]=[new Array(n+1).join("\u2800"),new Array(o+1).join("\u2800")];for(const t of i)s.push(a+t+l);return s.join("\n")}function E(t){const e=t.firstChild,r=f(t);if(e&&e.nodeType===o.NodeType.ELEMENT_NODE){if("ENGLISH"===o.tagName(e))return"\u2830"+r;if("NUMBER"===o.tagName(e))return"\u283c"+r}return r}},182:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MarkupRenderer=void 0;const n=r(4440),o=r(3921);class i extends o.AbstractAudioRenderer{constructor(){super(...arguments),this.ignoreElements=[n.personalityProps.LAYOUT],this.scaleFunction=null}setScaleFunction(t,e,r,n,o=0){this.scaleFunction=i=>{const s=(i-t)/(e-t),a=r*(1-s)+n*s;return+(Math.round(a+"e+"+o)+"e-"+o)}}applyScaleFunction(t){return this.scaleFunction?this.scaleFunction(t):t}ignoreElement(t){return-1!==this.ignoreElements.indexOf(t)}}e.MarkupRenderer=i},8990:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.PunctuationRenderer=void 0;const n=r(4440),o=r(3921),i=r(3706);class s extends o.AbstractAudioRenderer{markup(t){const e=i.personalityMarkup(t);let r="",o=null,s=!1;for(let t,a=0;t=e[a];a++)i.isMarkupElement(t)||(i.isPauseElement(t)?s&&(o=i.mergePause(o,t,Math.max)):(o&&(r+=this.pause(o[n.personalityProps.PAUSE]),o=null),r+=(s?this.getSeparator():"")+this.merge(t.span),s=!0));return r}pause(t){let e;return e="number"==typeof t?t<=250?"short":t<=500?"medium":"long":t,s.PAUSE_PUNCTUATION.get(e)||""}}e.PunctuationRenderer=s,s.PAUSE_PUNCTUATION=new Map([["short",","],["medium",";"],["long","."]])},6660:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SableRenderer=void 0;const n=r(4440),o=r(2456);class i extends o.XmlRenderer{finalize(t){return''+this.getSeparator()+t+this.getSeparator()+""}pause(t){return''}prosodyElement(t,e){switch(e=this.applyScaleFunction(e),t){case n.personalityProps.PITCH:return'';case n.personalityProps.RATE:return'';case n.personalityProps.VOLUME:return'';default:return"<"+t.toUpperCase()+' VALUE="'+e+'">'}}closeTag(t){return""}}e.SableRenderer=i},9536:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Span=void 0;e.Span=class{constructor(t,e){this.speech=t,this.attributes=e}}},7504:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SsmlRenderer=void 0;const n=r(5897),o=r(4440),i=r(2456);class s extends i.XmlRenderer{finalize(t){return''+this.getSeparator()+t+this.getSeparator()+""}pause(t){return''}prosodyElement(t,e){const r=(e=Math.floor(this.applyScaleFunction(e)))<0?e.toString():"+"+e.toString();return"":'%">')}closeTag(t){return""}}e.SsmlRenderer=s},3757:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SsmlStepRenderer=void 0;const n=r(7504);class o extends n.SsmlRenderer{markup(t){return o.MARKS={},super.markup(t)}merge(t){const e=[];for(let r=0;r'),o.MARKS[i]=!0),1===n.speech.length&&n.speech.match(/[a-zA-Z]/)?e.push(''+n.speech+""):e.push(n.speech)}return e.join(this.getSeparator())}}e.SsmlStepRenderer=o,o.CHARACTER_ATTR="character",o.MARKS={}},4032:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.StringRenderer=void 0;const n=r(3921),o=r(3706);class i extends n.AbstractAudioRenderer{markup(t){let e="";const r=(0,o.personalityMarkup)(t).filter((t=>t.span));if(!r.length)return e;const n=r.length-1;for(let t,o=0;t=r[o];o++){if(t.span&&(e+=this.merge(t.span)),o>=n)continue;const r=t.join;e+=void 0===r?this.getSeparator():r}return e}}e.StringRenderer=i},2456:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.XmlRenderer=void 0;const n=r(5897),o=r(3706),i=r(182);class s extends i.MarkupRenderer{markup(t){this.setScaleFunction(-2,2,-100,100,2);const e=o.personalityMarkup(t),r=[],i=[];for(let t,s=0;t=e[s];s++)if(t.span)r.push(this.merge(t.span));else if(o.isPauseElement(t))r.push(this.pause(t));else{if(t.close.length)for(let e=0;e{r.push(this.prosodyElement(e,t[e])),i.push(e)}))}}return r.join(" ")}}e.XmlRenderer=s},707:function(t,e){function r(t,e){return t?e?t.filter((t=>e.indexOf(t)<0)):t:[]}Object.defineProperty(e,"__esModule",{value:!0}),e.union=e.setdifference=e.interleaveLists=e.removeEmpty=void 0,e.removeEmpty=function(t){return t.filter((t=>t))},e.interleaveLists=function(t,e){const r=[];for(;t.length||e.length;)t.length&&r.push(t.shift()),e.length&&r.push(e.shift());return r},e.setdifference=r,e.union=function(t,e){return t&&e?t.concat(r(e,t)):t||e||[]}},2139:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.loadScript=e.loadMapsForIE_=e.installWGXpath_=e.loadWGXpath_=e.mapsForIE=e.detectEdge=e.detectIE=void 0;const n=r(2315),o=r(5274);function i(t){l(n.default.WGXpath),s(t)}function s(t,e){let r=e||1;"undefined"==typeof wgxpath&&r<10?setTimeout((function(){s(t,r++)}),200):r>=10||(n.default.wgxpath=wgxpath,t?n.default.wgxpath.install({document:document}):n.default.wgxpath.install(),o.xpath.evaluate=document.evaluate,o.xpath.result=XPathResult,o.xpath.createNSResolver=document.createNSResolver)}function a(){l(n.default.mathmapsIePath)}function l(t){const e=n.default.document.createElement("script");e.type="text/javascript",e.src=t,n.default.document.head?n.default.document.head.appendChild(e):n.default.document.body.appendChild(e)}e.detectIE=function(){return"undefined"!=typeof window&&"ActiveXObject"in window&&"clipboardData"in window&&(a(),i(),!0)},e.detectEdge=function(){var t;return"undefined"!=typeof window&&"MSGestureEvent"in window&&null===(null===(t=window.chrome)||void 0===t?void 0:t.loadTimes)&&(document.evaluate=null,i(!0),!0)},e.mapsForIE=null,e.loadWGXpath_=i,e.installWGXpath_=s,e.loadMapsForIE_=a,e.loadScript=l},2057:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Debugger=void 0;const n=r(2315);class o{constructor(){this.isActive_=!1,this.outputFunction_=console.info,this.stream_=null}static getInstance(){return o.instance=o.instance||new o,o.instance}init(t){t&&this.startDebugFile_(t),this.isActive_=!0}output(...t){this.isActive_&&this.output_(t)}generateOutput(t){this.isActive_&&this.output_(t.apply(t,[]))}exit(t=(()=>{})){this.isActive_&&this.stream_&&this.stream_.end("","",t)}startDebugFile_(t){this.stream_=n.default.fs.createWriteStream(t),this.outputFunction_=function(...t){this.stream_.write(t.join(" ")),this.stream_.write("\n")}.bind(this),this.stream_.on("error",function(t){console.info("Invalid log file. Debug information sent to console."),this.outputFunction_=console.info}.bind(this)),this.stream_.on("finish",(function(){console.info("Finalizing debug file.")}))}output_(t){this.outputFunction_.apply(console.info===this.outputFunction_?console:this.outputFunction_,["Speech Rule Engine Debugger:"].concat(t))}}e.Debugger=o},5740:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.serializeXml=e.cloneNode=e.tagName=e.querySelectorAll=e.querySelectorAllByAttrValue=e.querySelectorAllByAttr=e.formatXml=e.createTextNode=e.createElementNS=e.createElement=e.replaceNode=e.NodeType=e.parseInput=e.XML_ENTITIES=e.trimInput_=e.toArray=void 0;const n=r(5897),o=r(4440),i=r(2315),s=r(5274);function a(t){const e=[];for(let r=0,n=t.length;r[ \f\n\r\t\v\u200b]+<").trim()}function c(t,e){if(!e)return[!1,""];const r=t.match(/^<([^> ]+).*>/),n=e.match(/^<\/([^>]+)>(.*)/);return r&&n&&r[1]===n[1]?[!0,n[2]]:[!1,""]}e.toArray=a,e.trimInput_=l,e.XML_ENTITIES={"<":!0,">":!0,"&":!0,""":!0,"'":!0},e.parseInput=function(t){const e=new i.default.xmldom.DOMParser,r=l(t),a=!!r.match(/&(?!lt|gt|amp|quot|apos)\w+;/g);if(!r)throw new Error("Empty input!");try{const t=e.parseFromString(r,a?"text/html":"text/xml");return n.default.getInstance().mode===o.Mode.HTTP?(s.xpath.currentDocument=t,a?t.body.childNodes[0]:t.documentElement):t.documentElement}catch(t){throw new n.SREError("Illegal input: "+t.message)}},function(t){t[t.ELEMENT_NODE=1]="ELEMENT_NODE",t[t.ATTRIBUTE_NODE=2]="ATTRIBUTE_NODE",t[t.TEXT_NODE=3]="TEXT_NODE",t[t.CDATA_SECTION_NODE=4]="CDATA_SECTION_NODE",t[t.ENTITY_REFERENCE_NODE=5]="ENTITY_REFERENCE_NODE",t[t.ENTITY_NODE=6]="ENTITY_NODE",t[t.PROCESSING_INSTRUCTION_NODE=7]="PROCESSING_INSTRUCTION_NODE",t[t.COMMENT_NODE=8]="COMMENT_NODE",t[t.DOCUMENT_NODE=9]="DOCUMENT_NODE",t[t.DOCUMENT_TYPE_NODE=10]="DOCUMENT_TYPE_NODE",t[t.DOCUMENT_FRAGMENT_NODE=11]="DOCUMENT_FRAGMENT_NODE",t[t.NOTATION_NODE=12]="NOTATION_NODE"}(e.NodeType||(e.NodeType={})),e.replaceNode=function(t,e){t.parentNode&&(t.parentNode.insertBefore(e,t),t.parentNode.removeChild(t))},e.createElement=function(t){return i.default.document.createElement(t)},e.createElementNS=function(t,e){return i.default.document.createElementNS(t,e)},e.createTextNode=function(t){return i.default.document.createTextNode(t)},e.formatXml=function(t){let e="",r=/(>)(<)(\/*)/g,n=0,o=(t=t.replace(r,"$1\r\n$2$3")).split("\r\n");for(r=/(\.)*(<)(\/*)/g,o=o.map((t=>t.replace(r,"$1\r\n$2$3").split("\r\n"))).reduce(((t,e)=>t.concat(e)),[]);o.length;){let t=o.shift();if(!t)continue;let r=0;if(t.match(/^<\w[^>/]*>[^>]+$/)){const e=c(t,o[0]);e[0]?e[1]?(t+=o.shift().slice(0,-e[1].length),e[1].trim()&&o.unshift(e[1])):t+=o.shift():r=1}else if(t.match(/^<\/\w/))0!==n&&(n-=1);else if(t.match(/^<\w[^>]*[^/]>.*$/))r=1;else if(t.match(/^<\w[^>]*\/>.+$/)){const e=t.indexOf(">")+1;t.slice(e).trim()&&o.unshift(),t=t.slice(0,e)}else r=0;e+=new Array(n+1).join(" ")+t+"\r\n",n+=r}return e},e.querySelectorAllByAttr=function(t,e){return t.querySelectorAll?a(t.querySelectorAll(`[${e}]`)):s.evalXPath(`.//*[@${e}]`,t)},e.querySelectorAllByAttrValue=function(t,e,r){return t.querySelectorAll?a(t.querySelectorAll(`[${e}="${r}"]`)):s.evalXPath(`.//*[@${e}="${r}"]`,t)},e.querySelectorAll=function(t,e){return t.querySelectorAll?a(t.querySelectorAll(e)):s.evalXPath(`.//${e}`,t)},e.tagName=function(t){return t.tagName.toUpperCase()},e.cloneNode=function(t){return t.cloneNode(!0)},e.serializeXml=function(t){return(new i.default.xmldom.XMLSerializer).serializeToString(t)}},5897:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.EnginePromise=e.SREError=void 0;const n=r(1676),o=r(4440),i=r(2057),s=r(1377);class a extends Error{constructor(t=""){super(),this.message=t,this.name="SRE Error"}}e.SREError=a;class l{constructor(){this.customLoader=null,this.parsers={},this.comparator=null,this.mode=o.Mode.SYNC,this.init=!0,this.delay=!1,this.comparators={},this.domain="mathspeak",this.style=n.DynamicCstr.DEFAULT_VALUES[n.Axis.STYLE],this._defaultLocale=n.DynamicCstr.DEFAULT_VALUES[n.Axis.LOCALE],this.locale=this.defaultLocale,this.subiso="",this.modality=n.DynamicCstr.DEFAULT_VALUES[n.Axis.MODALITY],this.speech=o.Speech.NONE,this.markup=o.Markup.NONE,this.walker="Table",this.structure=!1,this.ruleSets=[],this.strict=!1,this.isIE=!1,this.isEdge=!1,this.rate="100",this.pprint=!1,this.config=!1,this.rules="",this.prune="",this.evaluator=l.defaultEvaluator,this.defaultParser=new n.DynamicCstrParser(n.DynamicCstr.DEFAULT_ORDER),this.parser=this.defaultParser,this.dynamicCstr=n.DynamicCstr.defaultCstr()}set defaultLocale(t){this._defaultLocale=s.Variables.ensureLocale(t,this._defaultLocale)}get defaultLocale(){return this._defaultLocale}static getInstance(){return l.instance=l.instance||new l,l.instance}static defaultEvaluator(t,e){return t}static evaluateNode(t){return l.nodeEvaluator(t)}getRate(){const t=parseInt(this.rate,10);return isNaN(t)?100:t}setDynamicCstr(t){if(this.defaultLocale&&(n.DynamicCstr.DEFAULT_VALUES[n.Axis.LOCALE]=this.defaultLocale),t){const e=Object.keys(t);for(let r=0;r{void 0!==t[r]&&(e[r]=t[r])};return r("mode"),e.configurate(t),a.default.BINARY_FEATURES.forEach((r=>{void 0!==t[r]&&(e[r]=!!t[r])})),a.default.STRING_FEATURES.forEach(r),t.json&&(c.default.jsonPath=l.makePath(t.json)),t.xpath&&(c.default.WGXpath=t.xpath),e.setCustomLoader(t.custom),function(t){t.isIE=s.detectIE(),t.isEdge=s.detectEdge()}(e),o.setLocale(),e.setDynamicCstr(),e.init?(a.EnginePromise.promises.init=new Promise(((t,e)=>{setTimeout((()=>{t("init")}),10)})),e.init=!1,a.EnginePromise.get()):e.delay?(e.delay=!1,a.EnginePromise.get()):i.loadLocale()}))}},8496:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Event=e.EventType=e.Move=e.KeyCode=void 0,function(t){t[t.ENTER=13]="ENTER",t[t.ESC=27]="ESC",t[t.SPACE=32]="SPACE",t[t.PAGE_UP=33]="PAGE_UP",t[t.PAGE_DOWN=34]="PAGE_DOWN",t[t.END=35]="END",t[t.HOME=36]="HOME",t[t.LEFT=37]="LEFT",t[t.UP=38]="UP",t[t.RIGHT=39]="RIGHT",t[t.DOWN=40]="DOWN",t[t.TAB=9]="TAB",t[t.LESS=188]="LESS",t[t.GREATER=190]="GREATER",t[t.DASH=189]="DASH",t[t.ZERO=48]="ZERO",t[t.ONE=49]="ONE",t[t.TWO=50]="TWO",t[t.THREE=51]="THREE",t[t.FOUR=52]="FOUR",t[t.FIVE=53]="FIVE",t[t.SIX=54]="SIX",t[t.SEVEN=55]="SEVEN",t[t.EIGHT=56]="EIGHT",t[t.NINE=57]="NINE",t[t.A=65]="A",t[t.B=66]="B",t[t.C=67]="C",t[t.D=68]="D",t[t.E=69]="E",t[t.F=70]="F",t[t.G=71]="G",t[t.H=72]="H",t[t.I=73]="I",t[t.J=74]="J",t[t.K=75]="K",t[t.L=76]="L",t[t.M=77]="M",t[t.N=78]="N",t[t.O=79]="O",t[t.P=80]="P",t[t.Q=81]="Q",t[t.R=82]="R",t[t.S=83]="S",t[t.T=84]="T",t[t.U=85]="U",t[t.V=86]="V",t[t.W=87]="W",t[t.X=88]="X",t[t.Y=89]="Y",t[t.Z=90]="Z"}(e.KeyCode||(e.KeyCode={})),e.Move=new Map([[13,"ENTER"],[27,"ESC"],[32,"SPACE"],[33,"PAGE_UP"],[34,"PAGE_DOWN"],[35,"END"],[36,"HOME"],[37,"LEFT"],[38,"UP"],[39,"RIGHT"],[40,"DOWN"],[9,"TAB"],[188,"LESS"],[190,"GREATER"],[189,"DASH"],[48,"ZERO"],[49,"ONE"],[50,"TWO"],[51,"THREE"],[52,"FOUR"],[53,"FIVE"],[54,"SIX"],[55,"SEVEN"],[56,"EIGHT"],[57,"NINE"],[65,"A"],[66,"B"],[67,"C"],[68,"D"],[69,"E"],[70,"F"],[71,"G"],[72,"H"],[73,"I"],[74,"J"],[75,"K"],[76,"L"],[77,"M"],[78,"N"],[79,"O"],[80,"P"],[81,"Q"],[82,"R"],[83,"S"],[84,"T"],[85,"U"],[86,"V"],[87,"W"],[88,"X"],[89,"Y"],[90,"Z"]]),function(t){t.CLICK="click",t.DBLCLICK="dblclick",t.MOUSEDOWN="mousedown",t.MOUSEUP="mouseup",t.MOUSEOVER="mouseover",t.MOUSEOUT="mouseout",t.MOUSEMOVE="mousemove",t.SELECTSTART="selectstart",t.KEYPRESS="keypress",t.KEYDOWN="keydown",t.KEYUP="keyup",t.TOUCHSTART="touchstart",t.TOUCHMOVE="touchmove",t.TOUCHEND="touchend",t.TOUCHCANCEL="touchcancel"}(e.EventType||(e.EventType={}));e.Event=class{constructor(t,e,r){this.src=t,this.type=e,this.callback=r}add(){this.src.addEventListener(this.type,this.callback)}remove(){this.src.removeEventListener(this.type,this.callback)}}},7248:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.localePath=e.makePath=void 0;const n=r(2315);function o(t){return t.match("/$")?t:t+"/"}e.makePath=o,e.localePath=function(t,e="json"){return o(n.default.jsonPath)+t+(e.match(/^\./)?e:"."+e)}},3769:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.KeyProcessor=e.Processor=void 0;const n=r(8496);class o{constructor(t,e){this.name=t,this.process=e.processor,this.postprocess=e.postprocessor||((t,e)=>t),this.processor=this.postprocess?function(t){return this.postprocess(this.process(t),t)}:this.process,this.print=e.print||o.stringify_,this.pprint=e.pprint||this.print}static stringify_(t){return t?t.toString():t}}e.Processor=o,o.LocalState={walker:null,speechGenerator:null,highlighter:null};class i extends o{constructor(t,e){super(t,e),this.key=e.key||i.getKey_}static getKey_(t){return"string"==typeof t?n.KeyCode[t.toUpperCase()]:t}}e.KeyProcessor=i},6499:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.keypress=e.output=e.print=e.process=e.set=void 0;const n=r(8290),o=r(5714),i=r(3090),s=r(4356),a=r(1414),l=r(9552),c=r(9543),u=r(3362),p=r(1204),h=r(5740),f=r(5897),d=r(4440),m=r(3769),y=r(5274),g=new Map;function b(t){g.set(t.name,t)}function v(t){const e=g.get(t);if(!e)throw new f.SREError("Unknown processor "+t);return e}function _(t,e){const r=v(t);try{return r.processor(e)}catch(t){throw new f.SREError("Processing error for expression "+e)}}function S(t,e){const r=v(t);return f.default.getInstance().pprint?r.pprint(e):r.print(e)}e.set=b,e.process=_,e.print=S,e.output=function(t,e){const r=v(t);try{const t=r.processor(e);return f.default.getInstance().pprint?r.pprint(t):r.print(t)}catch(t){throw new f.SREError("Processing error for expression "+e)}},e.keypress=function(t,e){const r=v(t),n=r instanceof m.KeyProcessor?r.key(e):e,o=r.processor(n);return f.default.getInstance().pprint?r.pprint(o):r.print(o)},b(new m.Processor("semantic",{processor:function(t){const e=h.parseInput(t);return a.xmlTree(e)},postprocessor:function(t,e){const r=f.default.getInstance().speech;if(r===d.Speech.NONE)return t;const o=h.cloneNode(t);let i=c.computeMarkup(o);if(r===d.Speech.SHALLOW)return t.setAttribute("speech",n.finalize(i)),t;const s=y.evalXPath(".//*[@id]",t),a=y.evalXPath(".//*[@id]",o);for(let t,e,r=0;t=s[r],e=a[r];r++)i=c.computeMarkup(e),t.setAttribute("speech",n.finalize(i));return t},pprint:function(t){return h.formatXml(t.toString())}})),b(new m.Processor("speech",{processor:function(t){const e=h.parseInput(t),r=a.xmlTree(e),o=c.computeSpeech(r);return n.finalize(n.markup(o))},pprint:function(t){const e=t.toString();return n.isXml()?h.formatXml(e):e}})),b(new m.Processor("json",{processor:function(t){const e=h.parseInput(t);return a.getTree(e).toJson()},postprocessor:function(t,e){const r=f.default.getInstance().speech;if(r===d.Speech.NONE)return t;const o=h.parseInput(e),i=a.xmlTree(o),s=c.computeMarkup(i);if(r===d.Speech.SHALLOW)return t.stree.speech=n.finalize(s),t;const l=t=>{const e=y.evalXPath(`.//*[@id=${t.id}]`,i)[0],r=c.computeMarkup(e);t.speech=n.finalize(r),t.children&&t.children.forEach(l)};return l(t.stree),t},print:function(t){return JSON.stringify(t)},pprint:function(t){return JSON.stringify(t,null,2)}})),b(new m.Processor("description",{processor:function(t){const e=h.parseInput(t),r=a.xmlTree(e);return c.computeSpeech(r)},print:function(t){return JSON.stringify(t)},pprint:function(t){return JSON.stringify(t,null,2)}})),b(new m.Processor("enriched",{processor:function(t){return o.semanticMathmlSync(t)},postprocessor:function(t,e){const r=p.getSemanticRoot(t);let n;switch(f.default.getInstance().speech){case d.Speech.NONE:break;case d.Speech.SHALLOW:n=l.generator("Adhoc"),n.getSpeech(r,t);break;case d.Speech.DEEP:n=l.generator("Tree"),n.getSpeech(t,t)}return t},pprint:function(t){return h.formatXml(t.toString())}})),b(new m.Processor("walker",{processor:function(t){const e=l.generator("Node");m.Processor.LocalState.speechGenerator=e,e.setOptions({modality:f.default.getInstance().modality,locale:f.default.getInstance().locale,domain:f.default.getInstance().domain,style:f.default.getInstance().style}),m.Processor.LocalState.highlighter=i.highlighter({color:"black"},{color:"white"},{renderer:"NativeMML"});const r=_("enriched",t),n=S("enriched",r);return m.Processor.LocalState.walker=u.walker(f.default.getInstance().walker,r,e,m.Processor.LocalState.highlighter,n),m.Processor.LocalState.walker},print:function(t){return m.Processor.LocalState.walker.speech()}})),b(new m.KeyProcessor("move",{processor:function(t){if(!m.Processor.LocalState.walker)return null;return!1===m.Processor.LocalState.walker.move(t)?n.error(t):m.Processor.LocalState.walker.speech()}})),b(new m.Processor("number",{processor:function(t){const e=parseInt(t,10);return isNaN(e)?"":s.LOCALE.NUMBERS.numberToWords(e)}})),b(new m.Processor("ordinal",{processor:function(t){const e=parseInt(t,10);return isNaN(e)?"":s.LOCALE.NUMBERS.wordOrdinal(e)}})),b(new m.Processor("numericOrdinal",{processor:function(t){const e=parseInt(t,10);return isNaN(e)?"":s.LOCALE.NUMBERS.numericOrdinal(e)}})),b(new m.Processor("vulgar",{processor:function(t){const[e,r]=t.split("/").map((t=>parseInt(t,10)));return isNaN(e)||isNaN(r)?"":_("speech",`${e}${r}`)}}))},2998:function(t,e,r){var n=this&&this.__awaiter||function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function s(t){try{l(n.next(t))}catch(t){i(t)}}function a(t){try{l(n.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}l((n=n.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.localePath=e.exit=e.move=e.walk=e.processFile=e.file=e.vulgar=e.numericOrdinal=e.ordinal=e.number=e.toEnriched=e.toDescription=e.toJson=e.toSemantic=e.toSpeech=e.localeLoader=e.engineReady=e.engineSetup=e.setupEngine=e.version=void 0;const o=r(5897),i=r(6828),s=r(4440),a=r(7248),l=r(6499),c=r(2315),u=r(1377),p=r(6141);function h(t){return n(this,void 0,void 0,(function*(){return(0,i.setup)(t)}))}function f(t,e){return l.process(t,e)}function d(t,e,r){switch(o.default.getInstance().mode){case s.Mode.ASYNC:return function(t,e,r){return n(this,void 0,void 0,(function*(){const n=yield c.default.fs.promises.readFile(e,{encoding:"utf8"}),i=l.output(t,n);if(r)try{c.default.fs.promises.writeFile(r,i)}catch(t){throw new o.SREError("Can not write to file: "+r)}return i}))}(t,e,r);case s.Mode.SYNC:return function(t,e,r){const n=function(t){let e;try{e=c.default.fs.readFileSync(t,{encoding:"utf8"})}catch(e){throw new o.SREError("Can not open file: "+t)}return e}(e),i=l.output(t,n);if(r)try{c.default.fs.writeFileSync(r,i)}catch(t){throw new o.SREError("Can not write to file: "+r)}return i}(t,e,r);default:throw new o.SREError(`Can process files in ${o.default.getInstance().mode} mode`)}}e.version=u.Variables.VERSION,e.setupEngine=h,e.engineSetup=function(){const t=["mode"].concat(o.default.STRING_FEATURES,o.default.BINARY_FEATURES),e=o.default.getInstance(),r={};return t.forEach((function(t){r[t]=e[t]})),r.json=c.default.jsonPath,r.xpath=c.default.WGXpath,r.rules=e.ruleSets.slice(),r},e.engineReady=function(){return n(this,void 0,void 0,(function*(){return h({}).then((()=>o.EnginePromise.getall()))}))},e.localeLoader=p.standardLoader,e.toSpeech=function(t){return f("speech",t)},e.toSemantic=function(t){return f("semantic",t)},e.toJson=function(t){return f("json",t)},e.toDescription=function(t){return f("description",t)},e.toEnriched=function(t){return f("enriched",t)},e.number=function(t){return f("number",t)},e.ordinal=function(t){return f("ordinal",t)},e.numericOrdinal=function(t){return f("numericOrdinal",t)},e.vulgar=function(t){return f("vulgar",t)},e.file={},e.file.toSpeech=function(t,e){return d("speech",t,e)},e.file.toSemantic=function(t,e){return d("semantic",t,e)},e.file.toJson=function(t,e){return d("json",t,e)},e.file.toDescription=function(t,e){return d("description",t,e)},e.file.toEnriched=function(t,e){return d("enriched",t,e)},e.processFile=d,e.walk=function(t){return l.output("walker",t)},e.move=function(t){return l.keypress("move",t)},e.exit=function(t){const e=t||0;o.EnginePromise.getall().then((()=>process.exit(e)))},e.localePath=a.localePath,c.default.documentSupported?h({mode:s.Mode.HTTP}).then((()=>h({}))):h({mode:s.Mode.SYNC}).then((()=>h({mode:s.Mode.ASYNC})))},2315:function(__unused_webpack_module,exports,__webpack_require__){var __dirname="/";Object.defineProperty(exports,"__esModule",{value:!0});const variables_1=__webpack_require__(1377);class SystemExternal{static extRequire(library){if("undefined"!=typeof process){const nodeRequire=eval("require");return nodeRequire(library)}return null}}exports.default=SystemExternal,SystemExternal.windowSupported=!("undefined"==typeof window),SystemExternal.documentSupported=SystemExternal.windowSupported&&!(void 0===window.document),SystemExternal.xmldom=SystemExternal.documentSupported?window:SystemExternal.extRequire("xmldom-sre"),SystemExternal.document=SystemExternal.documentSupported?window.document:(new SystemExternal.xmldom.DOMImplementation).createDocument("","",0),SystemExternal.xpath=SystemExternal.documentSupported?document:function(){const t={document:{},XPathResult:{}};return SystemExternal.extRequire("wicked-good-xpath").install(t),t.document.XPathResult=t.XPathResult,t.document}(),SystemExternal.mathmapsIePath="https://cdn.jsdelivr.net/npm/sre-mathmaps-ie@"+variables_1.Variables.VERSION+"mathmaps_ie.js",SystemExternal.commander=SystemExternal.documentSupported?null:SystemExternal.extRequire("commander"),SystemExternal.fs=SystemExternal.documentSupported?null:SystemExternal.extRequire("fs"),SystemExternal.url=variables_1.Variables.url,SystemExternal.jsonPath=(SystemExternal.documentSupported?SystemExternal.url:process.env.SRE_JSON_PATH||__webpack_require__.g.SRE_JSON_PATH||__dirname+"/mathmaps")+"/",SystemExternal.WGXpath=variables_1.Variables.WGXpath,SystemExternal.wgxpath=null},1377:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Variables=void 0;class r{static ensureLocale(t,e){return r.LOCALES.get(t)?t:(console.error(`Locale ${t} does not exist! Using ${r.LOCALES.get(e)} instead.`),e)}}e.Variables=r,r.VERSION="4.0.6",r.LOCALES=new Map([["ca","Catalan"],["da","Danish"],["de","German"],["en","English"],["es","Spanish"],["fr","French"],["hi","Hindi"],["it","Italian"],["nb","Bokm\xe5l"],["nn","Nynorsk"],["sv","Swedish"],["nemeth","Nemeth"]]),r.mathjaxVersion="3.2.1",r.url="https://cdn.jsdelivr.net/npm/speech-rule-engine@"+r.VERSION+"/lib/mathmaps",r.WGXpath="https://cdn.jsdelivr.net/npm/wicked-good-xpath@1.3.0/dist/wgxpath.install.js"},5274:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.updateEvaluator=e.evaluateString=e.evaluateBoolean=e.getLeafNodes=e.evalXPath=e.resolveNameSpace=e.xpath=void 0;const n=r(5897),o=r(4440),i=r(2315);function s(){return"undefined"!=typeof XPathResult}e.xpath={currentDocument:null,evaluate:s()?document.evaluate:i.default.xpath.evaluate,result:s()?XPathResult:i.default.xpath.XPathResult,createNSResolver:s()?document.createNSResolver:i.default.xpath.createNSResolver};const a={xhtml:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",mml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function l(t){return a[t]||null}e.resolveNameSpace=l;class c{constructor(){this.lookupNamespaceURI=l}}function u(t,r,i){return n.default.getInstance().mode!==o.Mode.HTTP||n.default.getInstance().isIE||n.default.getInstance().isEdge?e.xpath.evaluate(t,r,new c,i,null):e.xpath.currentDocument.evaluate(t,r,l,i,null)}function p(t,r){let n;try{n=u(t,r,e.xpath.result.ORDERED_NODE_ITERATOR_TYPE)}catch(t){return[]}const o=[];for(let t=n.iterateNext();t;t=n.iterateNext())o.push(t);return o}e.evalXPath=p,e.getLeafNodes=function(t){return p(".//*[count(*)=0]",t)},e.evaluateBoolean=function(t,r){let n;try{n=u(t,r,e.xpath.result.BOOLEAN_TYPE)}catch(t){return!1}return n.booleanValue},e.evaluateString=function(t,r){let n;try{n=u(t,r,e.xpath.result.STRING_TYPE)}catch(t){return""}return n.stringValue},e.updateEvaluator=function(t){if(n.default.getInstance().mode!==o.Mode.HTTP)return;let r=t;for(;r&&!r.evaluate;)r=r.parentNode;r&&r.evaluate?e.xpath.currentDocument=r:t.ownerDocument&&(e.xpath.currentDocument=t.ownerDocument)}},9268:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEnrichCase=void 0;e.AbstractEnrichCase=class{constructor(t){this.semantic=t}}},6061:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseBinomial=void 0;const n=r(5740),o=r(9268),i=r(5452),s=r(2298);class a extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return!t.mathmlTree&&"line"===t.type&&"binomial"===t.role}getMathml(){if(!this.semantic.childNodes.length)return this.mml;const t=this.semantic.childNodes[0];if(this.mml=(0,i.walkTree)(t),this.mml.hasAttribute(s.Attribute.TYPE)){const t=n.createElement("mrow");t.setAttribute(s.Attribute.ADDED,"true"),n.replaceNode(this.mml,t),t.appendChild(this.mml),this.mml=t}return(0,s.setAttributes)(this.mml,this.semantic),this.mml}}e.CaseBinomial=a},5765:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseDoubleScript=void 0;const n=r(5740),o=r(9268),i=r(5452),s=r(2298);class a extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){if(!t.mathmlTree||!t.childNodes.length)return!1;const e=n.tagName(t.mathmlTree),r=t.childNodes[0].role;return"MSUBSUP"===e&&"subsup"===r||"MUNDEROVER"===e&&"underover"===r}getMathml(){const t=this.semantic.childNodes[0],e=t.childNodes[0],r=this.semantic.childNodes[1],n=t.childNodes[1],o=i.walkTree(r),a=i.walkTree(e),l=i.walkTree(n);return(0,s.setAttributes)(this.mml,this.semantic),this.mml.setAttribute(s.Attribute.CHILDREN,(0,s.makeIdList)([e,n,r])),[a,l,o].forEach((t=>i.getInnerNode(t).setAttribute(s.Attribute.PARENT,this.mml.getAttribute(s.Attribute.ID)))),this.mml.setAttribute(s.Attribute.TYPE,t.role),i.addCollapsedAttribute(this.mml,[this.semantic.id,[t.id,e.id,n.id],r.id]),this.mml}}e.CaseDoubleScript=a},7251:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseEmbellished=void 0;const n=r(5740),o=r(5952),i=r(9268),s=r(5765),a=r(7014),l=r(6887),c=r(5452),u=r(2298);class p extends i.AbstractEnrichCase{constructor(t){super(t),this.fenced=null,this.fencedMml=null,this.fencedMmlNodes=[],this.ofence=null,this.ofenceMml=null,this.ofenceMap={},this.cfence=null,this.cfenceMml=null,this.cfenceMap={},this.parentCleanup=[]}static test(t){return!(!t.mathmlTree||!t.fencePointer||t.mathmlTree.getAttribute("data-semantic-type"))}static makeEmptyNode_(t){const e=n.createElement("mrow"),r=new o.SemanticNode(t);return r.type="empty",r.mathmlTree=e,r}static fencedMap_(t,e){e[t.id]=t.mathmlTree,t.embellished&&p.fencedMap_(t.childNodes[0],e)}getMathml(){this.getFenced_(),this.fencedMml=c.walkTree(this.fenced),this.getFencesMml_(),"empty"!==this.fenced.type||this.fencedMml.parentNode||(this.fencedMml.setAttribute(u.Attribute.ADDED,"true"),this.cfenceMml.parentNode.insertBefore(this.fencedMml,this.cfenceMml)),this.getFencedMml_();return this.rewrite_()}fencedElement(t){return"fenced"===t.type||"matrix"===t.type||"vector"===t.type}getFenced_(){let t=this.semantic;for(;!this.fencedElement(t);)t=t.childNodes[0];this.fenced=t.childNodes[0],this.ofence=t.contentNodes[0],this.cfence=t.contentNodes[1],p.fencedMap_(this.ofence,this.ofenceMap),p.fencedMap_(this.cfence,this.cfenceMap)}getFencedMml_(){let t=this.ofenceMml.nextSibling;for(t=t===this.fencedMml?t:this.fencedMml;t&&t!==this.cfenceMml;)this.fencedMmlNodes.push(t),t=t.nextSibling}getFencesMml_(){let t=this.semantic;const e=Object.keys(this.ofenceMap),r=Object.keys(this.cfenceMap);for(;!(this.ofenceMml&&this.cfenceMml||t===this.fenced);)-1===e.indexOf(t.fencePointer)||this.ofenceMml||(this.ofenceMml=t.mathmlTree),-1===r.indexOf(t.fencePointer)||this.cfenceMml||(this.cfenceMml=t.mathmlTree),t=t.childNodes[0];this.ofenceMml||(this.ofenceMml=this.ofence.mathmlTree),this.cfenceMml||(this.cfenceMml=this.cfence.mathmlTree),this.ofenceMml&&(this.ofenceMml=c.ascendNewNode(this.ofenceMml)),this.cfenceMml&&(this.cfenceMml=c.ascendNewNode(this.cfenceMml))}rewrite_(){let t=this.semantic,e=null;const r=this.introduceNewLayer_();for((0,u.setAttributes)(r,this.fenced.parent);!this.fencedElement(t);){const o=t.mathmlTree,i=this.specialCase_(t,o);if(i)t=i;else{(0,u.setAttributes)(o,t);const e=[];for(let r,n=1;r=t.childNodes[n];n++)e.push(c.walkTree(r));t=t.childNodes[0]}const s=n.createElement("dummy"),a=o.childNodes[0];n.replaceNode(o,s),n.replaceNode(r,o),n.replaceNode(o.childNodes[0],r),n.replaceNode(s,a),e||(e=o)}return c.walkTree(this.ofence),c.walkTree(this.cfence),this.cleanupParents_(),e||r}specialCase_(t,e){const r=n.tagName(e);let o,i=null;if("MSUBSUP"===r?(i=t.childNodes[0],o=s.CaseDoubleScript):"MMULTISCRIPTS"===r&&("superscript"===t.type||"subscript"===t.type?o=a.CaseMultiscripts:"tensor"===t.type&&(o=l.CaseTensor),i=o&&t.childNodes[0]&&"subsup"===t.childNodes[0].role?t.childNodes[0]:t),!i)return null;const c=i.childNodes[0],u=p.makeEmptyNode_(c.id);return i.childNodes[0]=u,e=new o(t).getMathml(),i.childNodes[0]=c,this.parentCleanup.push(e),i.childNodes[0]}introduceNewLayer_(){const t=this.fullFence(this.ofenceMml),e=this.fullFence(this.cfenceMml);let r=n.createElement("mrow");if(n.replaceNode(this.fencedMml,r),this.fencedMmlNodes.forEach((t=>r.appendChild(t))),r.insertBefore(t,this.fencedMml),r.appendChild(e),!r.parentNode){const t=n.createElement("mrow");for(;r.childNodes.length>0;)t.appendChild(r.childNodes[0]);r.appendChild(t),r=t}return r}fullFence(t){const e=this.fencedMml.parentNode;let r=t;for(;r.parentNode&&r.parentNode!==e;)r=r.parentNode;return r}cleanupParents_(){this.parentCleanup.forEach((function(t){const e=t.childNodes[1].getAttribute(u.Attribute.PARENT);t.childNodes[0].setAttribute(u.Attribute.PARENT,e)}))}}e.CaseEmbellished=p},6265:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseLimit=void 0;const n=r(5740),o=r(9268),i=r(5452),s=r(2298);class a extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){if(!t.mathmlTree||!t.childNodes.length)return!1;const e=n.tagName(t.mathmlTree),r=t.type;return("limupper"===r||"limlower"===r)&&("MSUBSUP"===e||"MUNDEROVER"===e)||"limboth"===r&&("MSUB"===e||"MUNDER"===e||"MSUP"===e||"MOVER"===e)}static walkTree_(t){t&&i.walkTree(t)}getMathml(){const t=this.semantic.childNodes;return"limboth"!==this.semantic.type&&this.mml.childNodes.length>=3&&(this.mml=i.introduceNewLayer([this.mml],this.semantic)),(0,s.setAttributes)(this.mml,this.semantic),t[0].mathmlTree||(t[0].mathmlTree=this.semantic.mathmlTree),t.forEach(a.walkTree_),this.mml}}e.CaseLimit=a},6514:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseLine=void 0;const n=r(9268),o=r(5452),i=r(2298);class s extends n.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return!!t.mathmlTree&&"line"===t.type}getMathml(){return this.semantic.contentNodes.length&&o.walkTree(this.semantic.contentNodes[0]),this.semantic.childNodes.length&&o.walkTree(this.semantic.childNodes[0]),(0,i.setAttributes)(this.mml,this.semantic),this.mml}}e.CaseLine=s},6839:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseMultiindex=void 0;const n=r(5740),o=r(9268),i=r(5452),s=r(2298);class a extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static multiscriptIndex(t){return"punctuated"===t.type&&"dummy"===t.contentNodes[0].role?i.collapsePunctuated(t):(i.walkTree(t),t.id)}static createNone_(t){const e=n.createElement("none");return t&&(0,s.setAttributes)(e,t),e.setAttribute(s.Attribute.ADDED,"true"),e}completeMultiscript(t,e){const r=n.toArray(this.mml.childNodes).slice(1);let o=0;const l=t=>{for(let e,n=0;e=t[n];n++){const t=r[o];if(t&&e===parseInt(i.getInnerNode(t).getAttribute(s.Attribute.ID)))i.getInnerNode(t).setAttribute(s.Attribute.PARENT,this.semantic.id.toString()),o++;else{const r=this.semantic.querySelectorAll((t=>t.id===e));this.mml.insertBefore(a.createNone_(r[0]),t||null)}}};l(t),r[o]&&"MPRESCRIPTS"!==n.tagName(r[o])?this.mml.insertBefore(r[o],n.createElement("mprescripts")):o++,l(e)}}e.CaseMultiindex=a},7014:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseMultiscripts=void 0;const n=r(5740),o=r(5656),i=r(6839),s=r(5452),a=r(2298);class l extends i.CaseMultiindex{static test(t){if(!t.mathmlTree)return!1;return"MMULTISCRIPTS"===n.tagName(t.mathmlTree)&&("superscript"===t.type||"subscript"===t.type)}constructor(t){super(t)}getMathml(){let t,e,r;if((0,a.setAttributes)(this.mml,this.semantic),this.semantic.childNodes[0]&&"subsup"===this.semantic.childNodes[0].role){const n=this.semantic.childNodes[0];t=n.childNodes[0],e=i.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[1]),r=i.CaseMultiindex.multiscriptIndex(n.childNodes[1]);const l=[this.semantic.id,[n.id,t.id,r],e];s.addCollapsedAttribute(this.mml,l),this.mml.setAttribute(a.Attribute.TYPE,n.role),this.completeMultiscript(o.SemanticSkeleton.interleaveIds(r,e),[])}else{t=this.semantic.childNodes[0],e=i.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[1]);const r=[this.semantic.id,t.id,e];s.addCollapsedAttribute(this.mml,r)}const n=o.SemanticSkeleton.collapsedLeafs(r||[],e),l=s.walkTree(t);return s.getInnerNode(l).setAttribute(a.Attribute.PARENT,this.semantic.id.toString()),n.unshift(t.id),this.mml.setAttribute(a.Attribute.CHILDREN,n.join(",")),this.mml}}e.CaseMultiscripts=l},3416:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseProof=void 0;const n=r(9268),o=r(5452),i=r(2298);class s extends n.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return!!t.mathmlTree&&("inference"===t.type||"premises"===t.type)}getMathml(){return this.semantic.childNodes.length?(this.semantic.contentNodes.forEach((function(t){o.walkTree(t),(0,i.setAttributes)(t.mathmlTree,t)})),this.semantic.childNodes.forEach((function(t){o.walkTree(t)})),(0,i.setAttributes)(this.mml,this.semantic),this.mml.getAttribute("data-semantic-id")===this.mml.getAttribute("data-semantic-parent")&&this.mml.removeAttribute("data-semantic-parent"),this.mml):this.mml}}e.CaseProof=s},5699:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseTable=void 0;const n=r(5740),o=r(9268),i=r(5452),s=r(2298);class a extends o.AbstractEnrichCase{constructor(t){super(t),this.inner=[],this.mml=t.mathmlTree}static test(t){return"matrix"===t.type||"vector"===t.type||"cases"===t.type}getMathml(){const t=i.cloneContentNode(this.semantic.contentNodes[0]),e=this.semantic.contentNodes[1]?i.cloneContentNode(this.semantic.contentNodes[1]):null;if(this.inner=this.semantic.childNodes.map(i.walkTree),this.mml)if("MFENCED"===n.tagName(this.mml)){const r=this.mml.childNodes;this.mml.insertBefore(t,r[0]||null),e&&this.mml.appendChild(e),this.mml=i.rewriteMfenced(this.mml)}else{const r=[t,this.mml];e&&r.push(e),this.mml=i.introduceNewLayer(r,this.semantic)}else this.mml=i.introduceNewLayer([t].concat(this.inner,[e]),this.semantic);return(0,s.setAttributes)(this.mml,this.semantic),this.mml}}e.CaseTable=a},6887:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseTensor=void 0;const n=r(5656),o=r(6839),i=r(5452),s=r(2298);class a extends o.CaseMultiindex{static test(t){return!!t.mathmlTree&&"tensor"===t.type}constructor(t){super(t)}getMathml(){i.walkTree(this.semantic.childNodes[0]);const t=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[1]),e=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[2]),r=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[3]),a=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[4]);(0,s.setAttributes)(this.mml,this.semantic);const l=[this.semantic.id,this.semantic.childNodes[0].id,t,e,r,a];i.addCollapsedAttribute(this.mml,l);const c=n.SemanticSkeleton.collapsedLeafs(t,e,r,a);return c.unshift(this.semantic.childNodes[0].id),this.mml.setAttribute(s.Attribute.CHILDREN,c.join(",")),this.completeMultiscript(n.SemanticSkeleton.interleaveIds(r,a),n.SemanticSkeleton.interleaveIds(t,e)),this.mml}}e.CaseTensor=a},9236:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseText=void 0;const n=r(9268),o=r(5452),i=r(2298);class s extends n.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return"punctuated"===t.type&&("text"===t.role||t.contentNodes.every((t=>"dummy"===t.role)))}getMathml(){const t=[],e=o.collapsePunctuated(this.semantic,t);return this.mml=o.introduceNewLayer(t,this.semantic),(0,i.setAttributes)(this.mml,this.semantic),this.mml.removeAttribute(i.Attribute.CONTENT),o.addCollapsedAttribute(this.mml,e),this.mml}}e.CaseText=s},5714:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.prepareMmlString=e.testTranslation__=e.semanticMathml=e.semanticMathmlSync=e.semanticMathmlNode=void 0;const n=r(2057),o=r(5740),i=r(5897),s=r(1414),a=r(5452),l=r(2298);function c(t){const e=o.cloneNode(t),r=s.getTree(e);return a.enrich(e,r)}function u(t){return c(o.parseInput(t))}function p(t){return t.match(/^$/)||(t+=""),t}r(1513),e.semanticMathmlNode=c,e.semanticMathmlSync=u,e.semanticMathml=function(t,e){i.EnginePromise.getall().then((()=>{const r=o.parseInput(t);e(c(r))}))},e.testTranslation__=function(t){n.Debugger.getInstance().init();const e=u(p(t)).toString();return(0,l.removeAttributePrefix)(e),n.Debugger.getInstance().exit(),e},e.prepareMmlString=p},2298:function(t,e){var r;function n(t){return t.map((function(t){return t.id})).join(",")}function o(t,e){const n=[];"mglyph"===e.role&&n.push("image"),e.attributes.href&&n.push("link"),n.length&&t.setAttribute(r.POSTFIX,n.join(" "))}Object.defineProperty(e,"__esModule",{value:!0}),e.addPrefix=e.removeAttributePrefix=e.setPostfix=e.setAttributes=e.makeIdList=e.EnrichAttributes=e.Attribute=e.Prefix=void 0,e.Prefix="data-semantic-",function(t){t.ADDED="data-semantic-added",t.ALTERNATIVE="data-semantic-alternative",t.CHILDREN="data-semantic-children",t.COLLAPSED="data-semantic-collapsed",t.CONTENT="data-semantic-content",t.EMBELLISHED="data-semantic-embellished",t.FENCEPOINTER="data-semantic-fencepointer",t.FONT="data-semantic-font",t.ID="data-semantic-id",t.ANNOTATION="data-semantic-annotation",t.OPERATOR="data-semantic-operator",t.OWNS="data-semantic-owns",t.PARENT="data-semantic-parent",t.POSTFIX="data-semantic-postfix",t.PREFIX="data-semantic-prefix",t.ROLE="data-semantic-role",t.SPEECH="data-semantic-speech",t.STRUCTURE="data-semantic-structure",t.TYPE="data-semantic-type"}(r=e.Attribute||(e.Attribute={})),e.EnrichAttributes=[r.ADDED,r.ALTERNATIVE,r.CHILDREN,r.COLLAPSED,r.CONTENT,r.EMBELLISHED,r.FENCEPOINTER,r.FONT,r.ID,r.ANNOTATION,r.OPERATOR,r.OWNS,r.PARENT,r.POSTFIX,r.PREFIX,r.ROLE,r.SPEECH,r.STRUCTURE,r.TYPE],e.makeIdList=n,e.setAttributes=function(t,i){t.setAttribute(r.TYPE,i.type);const s=i.allAttributes();for(let r,n=0;r=s[n];n++)t.setAttribute(e.Prefix+r[0].toLowerCase(),r[1]);i.childNodes.length&&t.setAttribute(r.CHILDREN,n(i.childNodes)),i.contentNodes.length&&t.setAttribute(r.CONTENT,n(i.contentNodes)),i.parent&&t.setAttribute(r.PARENT,i.parent.id.toString()),o(t,i)},e.setPostfix=o,e.removeAttributePrefix=function(t){return t.toString().replace(new RegExp(e.Prefix,"g"),"")},e.addPrefix=function(t){return e.Prefix+t}},3532:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.factory=e.getCase=void 0,e.getCase=function(t){for(let r,n=0;r=e.factory[n];n++)if(r.test(t))return r.constr(t);return null},e.factory=[]},1513:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(6061),o=r(5765),i=r(7251),s=r(6265),a=r(6514),l=r(7014),c=r(3416),u=r(5699),p=r(6887),h=r(9236);r(3532).factory.push({test:s.CaseLimit.test,constr:t=>new s.CaseLimit(t)},{test:i.CaseEmbellished.test,constr:t=>new i.CaseEmbellished(t)},{test:o.CaseDoubleScript.test,constr:t=>new o.CaseDoubleScript(t)},{test:p.CaseTensor.test,constr:t=>new p.CaseTensor(t)},{test:l.CaseMultiscripts.test,constr:t=>new l.CaseMultiscripts(t)},{test:a.CaseLine.test,constr:t=>new a.CaseLine(t)},{test:n.CaseBinomial.test,constr:t=>new n.CaseBinomial(t)},{test:c.CaseProof.test,constr:t=>new c.CaseProof(t)},{test:u.CaseTable.test,constr:t=>new u.CaseTable(t)},{test:h.CaseText.test,constr:t=>new h.CaseText(t)})},5452:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.printNodeList__=e.collapsePunctuated=e.formattedOutput_=e.formattedOutput=e.getInnerNode=e.setOperatorAttribute_=e.createInvisibleOperator_=e.rewriteMfenced=e.cloneContentNode=e.addCollapsedAttribute=e.parentNode_=e.isIgnorable_=e.unitChild_=e.descendNode_=e.ascendNewNode=e.validLca_=e.pathToRoot_=e.attachedElement_=e.prunePath_=e.mathmlLca_=e.lcaType=e.functionApplication_=e.isDescendant_=e.insertNewChild_=e.mergeChildren_=e.collectChildNodes_=e.collateChildNodes_=e.childrenSubset_=e.moveSemanticAttributes_=e.introduceLayerAboveLca=e.introduceNewLayer=e.walkTree=e.enrich=e.SETTINGS=void 0;const n=r(2057),o=r(5740),i=r(5897),s=r(3588),a=r(7516),l=r(5656),c=r(4795),u=r(2298),p=r(3532);function h(t){const e=(0,p.getCase)(t);let r;if(e)return r=e.getMathml(),N(r);if(1===t.mathml.length)return n.Debugger.getInstance().output("Walktree Case 0"),r=t.mathml[0],u.setAttributes(r,t),t.childNodes.length&&(n.Debugger.getInstance().output("Walktree Case 0.1"),t.childNodes.forEach((function(t){"empty"===t.type&&r.appendChild(h(t))}))),N(r);const o=t.contentNodes.map(R);B(t,o);const i=t.childNodes.map(h),s=l.SemanticSkeleton.combineContentChildren(t,o,i);if(r=t.mathmlTree,null===r)n.Debugger.getInstance().output("Walktree Case 1"),r=f(s,t);else{const t=A(s);n.Debugger.getInstance().output("Walktree Case 2"),t?(n.Debugger.getInstance().output("Walktree Case 2.1"),r=t.parentNode):(n.Debugger.getInstance().output("Walktree Case 2.2"),r=D(r))}return r=k(r),v(r,s,t),u.setAttributes(r,t),N(r)}function f(t,e){const r=x(t);let i=r.node;const s=r.type;if(s!==O.VALID||!c.hasEmptyTag(i))if(n.Debugger.getInstance().output("Walktree Case 1.1"),i=o.createElement("mrow"),s===O.PRUNED)n.Debugger.getInstance().output("Walktree Case 1.1.0"),i=d(i,r.node,t);else if(t[0]){n.Debugger.getInstance().output("Walktree Case 1.1.1");const e=A(t),r=y(e.parentNode,t);o.replaceNode(e,i),r.forEach((function(t){i.appendChild(t)}))}return e.mathmlTree||(e.mathmlTree=i),i}function d(t,e,r){let i=w(e);if(c.hasMathTag(i)){n.Debugger.getInstance().output("Walktree Case 1.1.0.0"),m(i,t),o.toArray(i.childNodes).forEach((function(e){t.appendChild(e)}));const e=t;t=i,i=e}const s=r.indexOf(e);return r[s]=i,o.replaceNode(i,t),t.appendChild(i),r.forEach((function(e){t.appendChild(e)})),t}function m(t,e){for(const r of u.EnrichAttributes)t.hasAttribute(r)&&(e.setAttribute(r,t.getAttribute(r)),t.removeAttribute(r))}function y(t,e){const r=o.toArray(t.childNodes);let n=1/0,i=-1/0;return e.forEach((function(t){const e=r.indexOf(t);-1!==e&&(n=Math.min(n,e),i=Math.max(i,e))})),r.slice(n,i+1)}function g(t,e,r){const n=[];let i=o.toArray(t.childNodes),s=!1;for(;i.length;){const t=i.shift();if(t.hasAttribute(u.Attribute.TYPE)){n.push(t);continue}const e=b(t);0!==e.length&&(1!==e.length?(s?t.setAttribute("AuxiliaryImplicit",!0):s=!0,i=e.concat(i)):n.push(t))}const a=[],l=r.childNodes.map((function(t){return t.mathmlTree}));for(;l.length;){const t=l.pop();if(t){if(-1!==n.indexOf(t))break;-1!==e.indexOf(t)&&a.unshift(t)}}return n.concat(a)}function b(t){const e=[];let r=o.toArray(t.childNodes);for(;r.length;){const t=r.shift();t.nodeType===o.NodeType.ELEMENT_NODE&&(t.hasAttribute(u.Attribute.TYPE)?e.push(t):r=o.toArray(t.childNodes).concat(r))}return e}function v(t,e,r){const n="implicit"===r.role&&a.flags.combine_juxtaposition?g(t,e,r):o.toArray(t.childNodes);if(!n.length)return void e.forEach((function(e){t.appendChild(e)}));let i=0;for(;e.length;){const r=e[0];n[i]===r||M(n[i],r)?(e.shift(),i++):n[i]&&-1===e.indexOf(n[i])?i++:(S(r,t)||_(t,n[i],r),e.shift())}}function _(t,e,r){if(!e)return void t.insertBefore(r,null);let n=e,o=P(n);for(;o&&o.firstChild===n&&!n.hasAttribute("AuxiliaryImplicit")&&o!==t;)n=o,o=P(n);o&&(o.insertBefore(r,n),n.removeAttribute("AuxiliaryImplicit"))}function S(t,e){if(!t)return!1;do{if((t=t.parentNode)===e)return!0}while(t);return!1}function M(t,e){const r=s.functionApplication();if(t&&e&&t.textContent&&e.textContent&&t.textContent===r&&e.textContent===r&&"true"===e.getAttribute(u.Attribute.ADDED)){for(let r,n=0;r=t.attributes[n];n++)e.hasAttribute(r.nodeName)||e.setAttribute(r.nodeName,r.nodeValue);return o.replaceNode(t,e),!0}return!1}var O;function x(t){const e=A(t);if(!e)return{type:O.INVALID,node:null};const r=A(t.slice().reverse());if(e===r)return{type:O.VALID,node:e};const n=C(e),o=E(n,t),i=C(r,(function(t){return-1!==o.indexOf(t)})),s=i[0],a=o.indexOf(s);return-1===a?{type:O.INVALID,node:null}:{type:o.length!==n.length?O.PRUNED:T(o[a+1],i[1])?O.VALID:O.INVALID,node:s}}function E(t,e){let r=0;for(;t[r]&&-1===e.indexOf(t[r]);)r++;return t.slice(0,r+1)}function A(t){let e=0,r=null;for(;!r&&e!1),n=[t];for(;!r(t)&&!c.hasMathTag(t)&&t.parentNode;)t=P(t),n.unshift(t);return n}function T(t,e){return!(!t||!e||t.previousSibling||e.nextSibling)}function N(t){for(;!c.hasMathTag(t)&&L(t);)t=P(t);return t}function w(t){const e=o.toArray(t.childNodes);if(!e)return t;const r=e.filter((function(t){return t.nodeType===o.NodeType.ELEMENT_NODE&&!c.hasIgnoreTag(t)}));return 1===r.length&&c.hasEmptyTag(r[0])&&!r[0].hasAttribute(u.Attribute.TYPE)?w(r[0]):t}function L(t){const e=P(t);return!(!e||!c.hasEmptyTag(e))&&o.toArray(e.childNodes).every((function(e){return e===t||I(e)}))}function I(t){if(t.nodeType!==o.NodeType.ELEMENT_NODE)return!0;if(!t||c.hasIgnoreTag(t))return!0;const e=o.toArray(t.childNodes);return!(!c.hasEmptyTag(t)&&e.length||c.hasDisplayTag(t)||t.hasAttribute(u.Attribute.TYPE)||c.isOrphanedGlyph(t))&&o.toArray(t.childNodes).every(I)}function P(t){return t.parentNode}function R(t){if(t.mathml.length)return h(t);const r=e.SETTINGS.implicit?j(t):o.createElement("mrow");return t.mathml=[r],r}function k(t){if("MFENCED"!==o.tagName(t))return t;const e=o.createElement("mrow");for(let r,n=0;r=t.attributes[n];n++)-1===["open","close","separators"].indexOf(r.name)&&e.setAttribute(r.name,r.value);return o.toArray(t.childNodes).forEach((function(t){e.appendChild(t)})),o.replaceNode(t,e),e}function j(t){const e=o.createElement("mo"),r=o.createTextNode(t.textContent);return e.appendChild(r),u.setAttributes(e,t),e.setAttribute(u.Attribute.ADDED,"true"),e}function B(t,e){const r=t.type+(t.textContent?","+t.textContent:"");e.forEach((function(t){D(t).setAttribute(u.Attribute.OPERATOR,r)}))}function D(t){const e=o.toArray(t.childNodes);if(!e)return t;const r=e.filter((function(t){return!I(t)})),n=[];for(let t,e=0;t=r[e];e++)if(c.hasEmptyTag(t)){const e=D(t);e&&e!==t&&n.push(e)}else n.push(t);return 1===n.length?n[0]:t}function F(t,e,r,n){const o=n||!1;H(t,"Original MathML",o),H(r,"Semantic Tree",o),H(e,"Semantically enriched MathML",o)}function H(t,e,r){const n=o.formatXml(t.toString());r?console.info(e+":\n```html\n"+u.removeAttributePrefix(n)+"\n```\n"):console.info(n)}e.SETTINGS={collapsed:!0,implicit:!0},e.enrich=function(t,e){const r=o.cloneNode(t);return h(e.root),i.default.getInstance().structure&&t.setAttribute(u.Attribute.STRUCTURE,l.SemanticSkeleton.fromStructure(t,e).toString()),n.Debugger.getInstance().generateOutput((function(){return F(r,t,e,!0),[]})),t},e.walkTree=h,e.introduceNewLayer=f,e.introduceLayerAboveLca=d,e.moveSemanticAttributes_=m,e.childrenSubset_=y,e.collateChildNodes_=g,e.collectChildNodes_=b,e.mergeChildren_=v,e.insertNewChild_=_,e.isDescendant_=S,e.functionApplication_=M,function(t){t.VALID="valid",t.INVALID="invalid",t.PRUNED="pruned"}(O=e.lcaType||(e.lcaType={})),e.mathmlLca_=x,e.prunePath_=E,e.attachedElement_=A,e.pathToRoot_=C,e.validLca_=T,e.ascendNewNode=N,e.descendNode_=w,e.unitChild_=L,e.isIgnorable_=I,e.parentNode_=P,e.addCollapsedAttribute=function(t,e){const r=new l.SemanticSkeleton(e);t.setAttribute(u.Attribute.COLLAPSED,r.toString())},e.cloneContentNode=R,e.rewriteMfenced=k,e.createInvisibleOperator_=j,e.setOperatorAttribute_=B,e.getInnerNode=D,e.formattedOutput=F,e.formattedOutput_=H,e.collapsePunctuated=function(t,e){const r=!!e,n=e||[],o=t.parent,i=t.contentNodes.map((function(t){return t.id}));i.unshift("c");const s=[t.id,i];for(let e,i=0;e=t.childNodes[i];i++){const t=h(e);n.push(t);const i=D(t);o&&!r&&i.setAttribute(u.Attribute.PARENT,o.id.toString()),s.push(e.id)}return s},e.printNodeList__=function(t,e){console.info(t),o.toArray(e).forEach((function(t){console.info(t.toString())})),console.info("<<<<<<<<<<<<<<<<<")}},5105:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractHighlighter=void 0;const n=r(5274),o=r(2298);class i{constructor(){this.color=null,this.mactionName="",this.currentHighlights=[]}highlight(t){this.currentHighlights.push(t.map((t=>{const e=this.highlightNode(t);return this.setHighlighted(t),e})))}highlightAll(t){const e=this.getMactionNodes(t);for(let t,r=0;t=e[r];r++)this.highlight([t])}unhighlight(){const t=this.currentHighlights.pop();t&&t.forEach((t=>{this.isHighlighted(t.node)&&(this.unhighlightNode(t),this.unsetHighlighted(t.node))}))}unhighlightAll(){for(;this.currentHighlights.length>0;)this.unhighlight()}setColor(t){this.color=t}colorString(){return this.color.rgba()}addEvents(t,e){const r=this.getMactionNodes(t);for(let t,n=0;t=r[n];n++)for(const r in e)t.addEventListener(r,e[r])}getMactionNodes(t){return Array.from(t.getElementsByClassName(this.mactionName))}isMactionNode(t){const e=t.className||t.getAttribute("class");return!!e&&!!e.match(new RegExp(this.mactionName))}isHighlighted(t){return t.hasAttribute(i.ATTR)}setHighlighted(t){t.setAttribute(i.ATTR,"true")}unsetHighlighted(t){t.removeAttribute(i.ATTR)}colorizeAll(t){n.evalXPath(`.//*[@${o.Attribute.ID}]`,t).forEach((t=>this.colorize(t)))}uncolorizeAll(t){n.evalXPath(`.//*[@${o.Attribute.ID}]`,t).forEach((t=>this.uncolorize(t)))}colorize(t){const e=(0,o.addPrefix)("foreground");t.hasAttribute(e)&&(t.setAttribute(e+"-old",t.style.color),t.style.color=t.getAttribute(e))}uncolorize(t){const e=(0,o.addPrefix)("foreground")+"-old";t.hasAttribute(e)&&(t.style.color=t.getAttribute(e))}}e.AbstractHighlighter=i,i.ATTR="sre-highlight"},6937:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ChtmlHighlighter=void 0;const n=r(933);class o extends n.CssHighlighter{constructor(){super()}isMactionNode(t){return t.tagName.toUpperCase()===this.mactionName.toUpperCase()}getMactionNodes(t){return Array.from(t.getElementsByTagName(this.mactionName))}}e.ChtmlHighlighter=o},8396:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.ContrastPicker=e.ColorPicker=void 0;const r={red:{red:255,green:0,blue:0},green:{red:0,green:255,blue:0},blue:{red:0,green:0,blue:255},yellow:{red:255,green:255,blue:0},cyan:{red:0,green:255,blue:255},magenta:{red:255,green:0,blue:255},white:{red:255,green:255,blue:255},black:{red:0,green:0,blue:0}};function n(t,e){const n=t||{color:e};let o=Object.prototype.hasOwnProperty.call(n,"color")?r[n.color]:n;return o||(o=r[e]),o.alpha=Object.prototype.hasOwnProperty.call(n,"alpha")?n.alpha:1,function(t){const e=t=>(t=Math.max(t,0),t=Math.min(255,t),Math.round(t));return t.red=e(t.red),t.green=e(t.green),t.blue=e(t.blue),t.alpha=Math.max(t.alpha,0),t.alpha=Math.min(1,t.alpha),t}(o)}class o{constructor(t,e){this.foreground=n(e,o.DEFAULT_FOREGROUND_),this.background=n(t,o.DEFAULT_BACKGROUND_)}static toHex(t){const e=t.toString(16);return 1===e.length?"0"+e:e}rgba(){const t=function(t){return"rgba("+t.red+","+t.green+","+t.blue+","+t.alpha+")"};return{background:t(this.background),foreground:t(this.foreground)}}rgb(){const t=function(t){return"rgb("+t.red+","+t.green+","+t.blue+")"};return{background:t(this.background),alphaback:this.background.alpha.toString(),foreground:t(this.foreground),alphafore:this.foreground.alpha.toString()}}hex(){const t=function(t){return"#"+o.toHex(t.red)+o.toHex(t.green)+o.toHex(t.blue)};return{background:t(this.background),alphaback:this.background.alpha.toString(),foreground:t(this.foreground),alphafore:this.foreground.alpha.toString()}}}e.ColorPicker=o,o.DEFAULT_BACKGROUND_="blue",o.DEFAULT_FOREGROUND_="black";e.ContrastPicker=class{constructor(){this.hue=10,this.sat=100,this.light=50,this.incr=50}generate(){return e=function(t,e,r){e=e>1?e/100:e,r=r>1?r/100:r;const n=(1-Math.abs(2*r-1))*e,o=n*(1-Math.abs(t/60%2-1)),i=r-n/2;let s=0,a=0,l=0;return 0<=t&&t<60?[s,a,l]=[n,o,0]:60<=t&&t<120?[s,a,l]=[o,n,0]:120<=t&&t<180?[s,a,l]=[0,n,o]:180<=t&&t<240?[s,a,l]=[0,o,n]:240<=t&&t<300?[s,a,l]=[o,0,n]:300<=t&&t<360&&([s,a,l]=[n,0,o]),{red:s+i,green:a+i,blue:l+i}}(this.hue,this.sat,this.light),"rgb("+(t={red:Math.round(255*e.red),green:Math.round(255*e.green),blue:Math.round(255*e.blue)}).red+","+t.green+","+t.blue+")";var t,e}increment(){this.hue=(this.hue+this.incr)%360}}},933:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CssHighlighter=void 0;const n=r(5105);class o extends n.AbstractHighlighter{constructor(){super(),this.mactionName="mjx-maction"}highlightNode(t){const e={node:t,background:t.style.backgroundColor,foreground:t.style.color},r=this.colorString();return t.style.backgroundColor=r.background,t.style.color=r.foreground,e}unhighlightNode(t){t.node.style.backgroundColor=t.background,t.node.style.color=t.foreground}}e.CssHighlighter=o},3090:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.highlighterMapping_=e.addEvents=e.highlighter=void 0;const n=r(6937),o=r(8396),i=r(933),s=r(2598),a=r(4500),l=r(7071),c=r(4346),u=r(2222);e.highlighter=function(t,r,n){const i=new o.ColorPicker(t,r),s="NativeMML"===n.renderer&&"Safari"===n.browser?"MML-CSS":"SVG"===n.renderer&&"v3"===n.browser?"SVG-V3":n.renderer,a=new(e.highlighterMapping_[s]||e.highlighterMapping_.NativeMML);return a.setColor(i),a},e.addEvents=function(t,r,n){const o=e.highlighterMapping_[n.renderer];o&&(new o).addEvents(t,r)},e.highlighterMapping_={SVG:c.SvgHighlighter,"SVG-V3":u.SvgV3Highlighter,NativeMML:l.MmlHighlighter,"HTML-CSS":s.HtmlHighlighter,"MML-CSS":a.MmlCssHighlighter,CommonHTML:i.CssHighlighter,CHTML:n.ChtmlHighlighter}},2598:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.HtmlHighlighter=void 0;const n=r(5740),o=r(5105);class i extends o.AbstractHighlighter{constructor(){super(),this.mactionName="maction"}highlightNode(t){const e={node:t,foreground:t.style.color,position:t.style.position},r=this.color.rgb();t.style.color=r.foreground,t.style.position="relative";const o=t.bbox;if(o&&o.w){const i=.05,s=0,a=n.createElement("span"),l=parseFloat(t.style.paddingLeft||"0");a.style.backgroundColor=r.background,a.style.opacity=r.alphaback.toString(),a.style.display="inline-block",a.style.height=o.h+o.d+2*i+"em",a.style.verticalAlign=-o.d+"em",a.style.marginTop=a.style.marginBottom=-i+"em",a.style.width=o.w+2*s+"em",a.style.marginLeft=l-s+"em",a.style.marginRight=-o.w-s-l+"em",t.parentNode.insertBefore(a,t),e.box=a}return e}unhighlightNode(t){const e=t.node;e.style.color=t.foreground,e.style.position=t.position,t.box&&t.box.parentNode.removeChild(t.box)}}e.HtmlHighlighter=i},4500:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlCssHighlighter=void 0;const n=r(933);class o extends n.CssHighlighter{constructor(){super(),this.mactionName="maction"}getMactionNodes(t){return Array.from(t.getElementsByTagName(this.mactionName))}isMactionNode(t){return t.tagName===this.mactionName}}e.MmlCssHighlighter=o},7071:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlHighlighter=void 0;const n=r(5105);class o extends n.AbstractHighlighter{constructor(){super(),this.mactionName="maction"}highlightNode(t){let e=t.getAttribute("style");return e+=";background-color: "+this.colorString().background,e+=";color: "+this.colorString().foreground,t.setAttribute("style",e),{node:t}}unhighlightNode(t){let e=t.node.getAttribute("style");e=e.replace(";background-color: "+this.colorString().background,""),e=e.replace(";color: "+this.colorString().foreground,""),t.node.setAttribute("style",e)}colorString(){return this.color.rgba()}getMactionNodes(t){return Array.from(t.getElementsByTagName(this.mactionName))}isMactionNode(t){return t.tagName===this.mactionName}}e.MmlHighlighter=o},4346:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SvgHighlighter=void 0;const n=r(5740),o=r(5105);class i extends o.AbstractHighlighter{constructor(){super(),this.mactionName="mjx-svg-maction"}highlightNode(t){let e;if(this.isHighlighted(t))return e={node:t.previousSibling||t,background:t.style.backgroundColor,foreground:t.style.color},e;if("svg"===t.tagName){const e={node:t,background:t.style.backgroundColor,foreground:t.style.color};return t.style.backgroundColor=this.colorString().background,t.style.color=this.colorString().foreground,e}const r=n.createElementNS("http://www.w3.org/2000/svg","rect");let i;if("use"===t.nodeName){const e=n.createElementNS("http://www.w3.org/2000/svg","g");t.parentNode.insertBefore(e,t),e.appendChild(t),i=e.getBBox(),e.parentNode.replaceChild(t,e)}else i=t.getBBox();r.setAttribute("x",(i.x-40).toString()),r.setAttribute("y",(i.y-40).toString()),r.setAttribute("width",(i.width+80).toString()),r.setAttribute("height",(i.height+80).toString());const s=t.getAttribute("transform");return s&&r.setAttribute("transform",s),r.setAttribute("fill",this.colorString().background),r.setAttribute(o.AbstractHighlighter.ATTR,"true"),t.parentNode.insertBefore(r,t),e={node:r,foreground:t.getAttribute("fill")},t.setAttribute("fill",this.colorString().foreground),e}setHighlighted(t){"svg"===t.tagName&&super.setHighlighted(t)}unhighlightNode(t){if("background"in t)return t.node.style.backgroundColor=t.background,void(t.node.style.color=t.foreground);t.foreground?t.node.nextSibling.setAttribute("fill",t.foreground):t.node.nextSibling.removeAttribute("fill"),t.node.parentNode.removeChild(t.node)}isMactionNode(t){let e=t.className||t.getAttribute("class");return e=void 0!==e.baseVal?e.baseVal:e,!!e&&!!e.match(new RegExp(this.mactionName))}}e.SvgHighlighter=i},2222:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SvgV3Highlighter=void 0;const n=r(5740),o=r(5274),i=r(5105),s=r(8396),a=r(4346);class l extends a.SvgHighlighter{constructor(){super(),this.mactionName="maction"}highlightNode(t){let e;if(this.isHighlighted(t))return e={node:t,background:this.colorString().background,foreground:this.colorString().foreground},e;if("svg"===t.tagName||"MJX-CONTAINER"===t.tagName)return e={node:t,background:t.style.backgroundColor,foreground:t.style.color},t.style.backgroundColor=this.colorString().background,t.style.color=this.colorString().foreground,e;const r=n.createElementNS("http://www.w3.org/2000/svg","rect");r.setAttribute("sre-highlighter-added","true");const o=t.getBBox();r.setAttribute("x",(o.x-40).toString()),r.setAttribute("y",(o.y-40).toString()),r.setAttribute("width",(o.width+80).toString()),r.setAttribute("height",(o.height+80).toString());const a=t.getAttribute("transform");if(a&&r.setAttribute("transform",a),r.setAttribute("fill",this.colorString().background),t.setAttribute(i.AbstractHighlighter.ATTR,"true"),t.parentNode.insertBefore(r,t),e={node:t,foreground:t.getAttribute("fill")},"rect"===t.nodeName){const e=new s.ColorPicker({alpha:0,color:"black"});t.setAttribute("fill",e.rgba().foreground)}else t.setAttribute("fill",this.colorString().foreground);return e}unhighlightNode(t){const e=t.node.previousSibling;if(e&&e.hasAttribute("sre-highlighter-added"))return t.foreground?t.node.setAttribute("fill",t.foreground):t.node.removeAttribute("fill"),void t.node.parentNode.removeChild(e);t.node.style.backgroundColor=t.background,t.node.style.color=t.foreground}isMactionNode(t){return t.getAttribute("data-mml-node")===this.mactionName}getMactionNodes(t){return Array.from(o.evalXPath(`.//*[@data-mml-node="${this.mactionName}"]`,t))}}e.SvgV3Highlighter=l},7222:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.StaticTrieNode=e.AbstractTrieNode=void 0;const n=r(2057),o=r(4391);class i{constructor(t,e){this.constraint=t,this.test=e,this.children_={},this.kind=o.TrieNodeKind.ROOT}getConstraint(){return this.constraint}getKind(){return this.kind}applyTest(t){return this.test(t)}addChild(t){const e=t.getConstraint(),r=this.children_[e];return this.children_[e]=t,r}getChild(t){return this.children_[t]}getChildren(){const t=[];for(const e in this.children_)t.push(this.children_[e]);return t}findChildren(t){const e=[];for(const r in this.children_){const n=this.children_[r];n.applyTest(t)&&e.push(n)}return e}removeChild(t){delete this.children_[t]}toString(){return this.constraint}}e.AbstractTrieNode=i;e.StaticTrieNode=class extends i{constructor(t,e){super(t,e),this.rule_=null,this.kind=o.TrieNodeKind.STATIC}getRule(){return this.rule_}setRule(t){this.rule_&&n.Debugger.getInstance().output("Replacing rule "+this.rule_+" with "+t),this.rule_=t}toString(){return this.getRule()?this.constraint+"\n==> "+this.getRule().action:this.constraint}}},4508:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Trie=void 0;const n=r(4391),o=r(9701);class i{constructor(){this.root=(0,o.getNode)(n.TrieNodeKind.ROOT,"",null)}static collectRules_(t){const e=[];let r=[t];for(;r.length;){const t=r.shift();if(t.getKind()===n.TrieNodeKind.QUERY||t.getKind()===n.TrieNodeKind.BOOLEAN){const r=t.getRule();r&&e.unshift(r)}r=r.concat(t.getChildren())}return e}static printWithDepth_(t,e,r){r+=new Array(e+2).join(e.toString())+": "+t.toString()+"\n";const n=t.getChildren();for(let t,o=0;t=n[o];o++)r=i.printWithDepth_(t,e+1,r);return r}static order_(t){const e=t.getChildren();if(!e.length)return 0;const r=Math.max.apply(null,e.map(i.order_));return Math.max(e.length,r)}addRule(t){let e=this.root;const r=t.context,o=t.dynamicCstr.getValues();for(let t=0,i=o.length;t{e.getKind()===n.TrieNodeKind.DYNAMIC&&-1===t.indexOf(e.getConstraint())||o.push(e)}))}r=o.slice()}for(;r.length;){const e=r.shift();if(e.getRule){const t=e.getRule();t&&o.push(t)}const n=e.findChildren(t);r=r.concat(n)}return o}hasSubtrie(t){let e=this.root;for(let r=0,n=t.length;r!0)),this.kind=c.TrieNodeKind.ROOT}}e.RootTrieNode=u;class p extends a.AbstractTrieNode{constructor(t){super(t,(e=>e===t)),this.kind=c.TrieNodeKind.DYNAMIC}}e.DynamicTrieNode=p;const h={"=":(t,e)=>t===e,"!=":(t,e)=>t!==e,"<":(t,e)=>t":(t,e)=>t>e,"<=":(t,e)=>t<=e,">=":(t,e)=>t>=e};function f(t){if(t.match(/^self::\*$/))return t=>!0;if(t.match(/^self::\w+$/)){const e=t.slice(6).toUpperCase();return t=>t.tagName&&n.tagName(t)===e}if(t.match(/^self::\w+:\w+$/)){const e=t.split(":"),r=o.resolveNameSpace(e[2]);if(!r)return null;const n=e[3].toUpperCase();return t=>t.localName&&t.localName.toUpperCase()===n&&t.namespaceURI===r}if(t.match(/^@\w+$/)){const e=t.slice(1);return t=>t.hasAttribute&&t.hasAttribute(e)}if(t.match(/^@\w+="[\w\d ]+"$/)){const e=t.split("="),r=e[0].slice(1),n=e[1].slice(1,-1);return t=>t.hasAttribute&&t.hasAttribute(r)&&t.getAttribute(r)===n}if(t.match(/^@\w+!="[\w\d ]+"$/)){const e=t.split("!="),r=e[0].slice(1),n=e[1].slice(1,-1);return t=>!t.hasAttribute||!t.hasAttribute(r)||t.getAttribute(r)!==n}if(t.match(/^contains\(\s*@grammar\s*,\s*"[\w\d ]+"\s*\)$/)){const e=t.split('"')[1];return t=>!!i.Grammar.getInstance().getParameter(e)}if(t.match(/^not\(\s*contains\(\s*@grammar\s*,\s*"[\w\d ]+"\s*\)\s*\)$/)){const e=t.split('"')[1];return t=>!i.Grammar.getInstance().getParameter(e)}if(t.match(/^name\(\.\.\/\.\.\)="\w+"$/)){const e=t.split('"')[1].toUpperCase();return t=>{var r,o;return(null===(o=null===(r=t.parentNode)||void 0===r?void 0:r.parentNode)||void 0===o?void 0:o.tagName)&&n.tagName(t.parentNode.parentNode)===e}}if(t.match(/^count\(preceding-sibling::\*\)=\d+$/)){const e=t.split("="),r=parseInt(e[1],10);return t=>{var e;return(null===(e=t.parentNode)||void 0===e?void 0:e.childNodes[r])===t}}if(t.match(/^.+\[@category!?=".+"\]$/)){let[,e,r,n]=t.match(/^(.+)\[@category(!?=)"(.+)"\]$/);const i=n.match(/^unit:(.+)$/);let a="";return i&&(n=i[1],a=":unit"),t=>{const i=o.evalXPath(e,t)[0];if(i){const t=s.lookupCategory(i.textContent+a);return"="===r?t===n:t!==n}return!1}}if(t.match(/^string-length\(.+\)\W+\d+/)){const[,e,r,n]=t.match(/^string-length\((.+)\)(\W+)(\d+)/),i=h[r]||h["="],s=parseInt(n,10);return t=>{const r=o.evalXPath(e,t)[0];return!!r&&i(Array.from(r.textContent).length,s)}}return null}e.constraintTest_=f;class d extends l.StaticTrieNode{constructor(t,e){super(t,f(t)),this.context=e,this.kind=c.TrieNodeKind.QUERY}applyTest(t){return this.test?this.test(t):this.context.applyQuery(t,this.constraint)===t}}e.QueryTrieNode=d;class m extends l.StaticTrieNode{constructor(t,e){super(t,f(t)),this.context=e,this.kind=c.TrieNodeKind.BOOLEAN}applyTest(t){return this.test?this.test(t):this.context.applyConstraint(t,this.constraint)}}e.BooleanTrieNode=m},7491:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.completeLocale=e.getLocale=e.setLocale=e.locales=void 0;const n=r(5897),o=r(1377),i=r(2105),s=r(4249),a=r(8657),l=r(173),c=r(9393),u=r(7978),p=r(5540),h=r(5218),f=r(3887),d=r(8384),m=r(7206),y=r(7734),g=r(7264),b=r(4356);function v(){const t=o.Variables.ensureLocale(n.default.getInstance().locale,n.default.getInstance().defaultLocale);return n.default.getInstance().locale=t,e.locales[t]()}e.locales={ca:s.ca,da:a.da,de:l.de,en:c.en,es:u.es,fr:p.fr,hi:h.hi,it:f.it,nb:d.nb,nn:y.nn,sv:g.sv,nemeth:m.nemeth},e.setLocale=function(){const t=v();if(function(t){const e=n.default.getInstance().subiso;-1===t.SUBISO.all.indexOf(e)&&(n.default.getInstance().subiso=t.SUBISO.default);t.SUBISO.current=n.default.getInstance().subiso}(t),t){for(const e of Object.getOwnPropertyNames(t))b.LOCALE[e]=t[e];for(const[e,r]of Object.entries(t.CORRECTIONS))i.Grammar.getInstance().setCorrection(e,r)}},e.getLocale=v,e.completeLocale=function(t){const r=e.locales[t.locale];if(!r)return void console.error("Locale "+t.locale+" does not exist!");const n=t.kind.toUpperCase(),o=t.messages;if(!o)return;const i=r();for(const[t,e]of Object.entries(o))i[n][t]=e}},4356:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.createLocale=e.LOCALE=void 0;const n=r(7549);function o(){return{FUNCTIONS:(0,n.FUNCTIONS)(),MESSAGES:(0,n.MESSAGES)(),ALPHABETS:(0,n.ALPHABETS)(),NUMBERS:(0,n.NUMBERS)(),COMBINERS:{},CORRECTIONS:{},SUBISO:(0,n.SUBISO)()}}e.LOCALE=o(),e.createLocale=o},2536:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.localeFontCombiner=e.extractString=e.localEnclose=e.localRole=e.localFont=e.combinePostfixIndex=e.nestingToString=void 0;const n=r(4356),o=r(4977);function i(t,e){return void 0===t?e:"string"==typeof t?t:t[0]}e.nestingToString=function(t){switch(t){case 1:return n.LOCALE.MESSAGES.MS.ONCE||"";case 2:return n.LOCALE.MESSAGES.MS.TWICE;default:return t.toString()}},e.combinePostfixIndex=function(t,e){return t===n.LOCALE.MESSAGES.MS.ROOTINDEX||t===n.LOCALE.MESSAGES.MS.INDEX?t:t+" "+e},e.localFont=function(t){return i(n.LOCALE.MESSAGES.font[t],t)},e.localRole=function(t){return i(n.LOCALE.MESSAGES.role[t],t)},e.localEnclose=function(t){return i(n.LOCALE.MESSAGES.enclose[t],t)},e.extractString=i,e.localeFontCombiner=function(t){return"string"==typeof t?{font:t,combiner:n.LOCALE.ALPHABETS.combiner}:{font:t[0],combiner:n.LOCALE.COMBINERS[t[1]]||o.Combiners[t[1]]||n.LOCALE.ALPHABETS.combiner}}},4249:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ca=void 0;const n=r(4356),o=r(2536),i=r(614),s=r(4977),a=function(t,e,r){return t="sans serif "+(r?r+" "+t:t),e?t+" "+e:t};let l=null;e.ca=function(){return l||(l=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.COMBINERS.sansserif=a,t.FUNCTIONS.fracNestDepth=t=>!1,t.FUNCTIONS.combineRootIndex=o.combinePostfixIndex,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>t+r,t.FUNCTIONS.fontRegexp=t=>RegExp("^"+t+" "),t.FUNCTIONS.plural=t=>/.*os$/.test(t)?t+"sos":/.*s$/.test(t)?t+"os":/.*ga$/.test(t)?t.slice(0,-2)+"gues":/.*\xe7a$/.test(t)?t.slice(0,-2)+"ces":/.*ca$/.test(t)?t.slice(0,-2)+"ques":/.*ja$/.test(t)?t.slice(0,-2)+"ges":/.*qua$/.test(t)?t.slice(0,-3)+"q\xfces":/.*a$/.test(t)?t.slice(0,-1)+"es":/.*(e|i)$/.test(t)?t+"ns":/.*\xed$/.test(t)?t.slice(0,-1)+"ins":t+"s",t.FUNCTIONS.si=(t,e)=>(e.match(/^metre/)&&(t=t.replace(/a$/,"\xe0").replace(/o$/,"\xf2").replace(/i$/,"\xed")),t+e),t.ALPHABETS.combiner=s.Combiners.prefixCombiner,t}()),l}},8657:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.da=void 0;const n=r(4356),o=r(2536),i=r(3866),s=r(4977);let a=null;e.da=function(){return a||(a=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t.FUNCTIONS.fontRegexp=e=>e===t.ALPHABETS.capPrefix.default?RegExp("^"+e+" "):RegExp(" "+e+"$"),t.ALPHABETS.combiner=s.Combiners.postfixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t}()),a}},173:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.de=void 0;const n=r(2105),o=r(2536),i=r(4356),s=r(1435),a=function(t,e,r){return"s"===r&&(e=e.split(" ").map((function(t){return t.replace(/s$/,"")})).join(" "),r=""),t=r?r+" "+t:t,e?e+" "+t:t},l=function(t,e,r){return t=r&&"s"!==r?r+" "+t:t,e?t+" "+e:t};let c=null;e.de=function(){return c||(c=function(){const t=(0,i.createLocale)();return t.NUMBERS=s.default,t.COMBINERS.germanPostfix=l,t.ALPHABETS.combiner=a,t.FUNCTIONS.radicalNestDepth=e=>e>1?t.NUMBERS.numberToWords(e)+"fach":"",t.FUNCTIONS.combineRootIndex=(t,e)=>{const r=e?e+"wurzel":"";return t.replace("Wurzel",r)},t.FUNCTIONS.combineNestedRadical=(t,e,r)=>{const n=(e?e+" ":"")+(t=r.match(/exponent$/)?t+"r":t);return r.match(/ /)?r.replace(/ /," "+n+" "):n+" "+r},t.FUNCTIONS.fontRegexp=function(t){return t=t.split(" ").map((function(t){return t.replace(/s$/,"(|s)")})).join(" "),new RegExp("((^"+t+" )|( "+t+"$))")},t.CORRECTIONS.correctOne=t=>t.replace(/^eins$/,"ein"),t.CORRECTIONS.localFontNumber=t=>(0,o.localFont)(t).split(" ").map((function(t){return t.replace(/s$/,"")})).join(" "),t.CORRECTIONS.lowercase=t=>t.toLowerCase(),t.CORRECTIONS.article=t=>{const e=n.Grammar.getInstance().getParameter("case"),r=n.Grammar.getInstance().getParameter("plural");return"dative"===e?{der:"dem",die:r?"den":"der",das:"dem"}[t]:t},t.CORRECTIONS.masculine=t=>"dative"===n.Grammar.getInstance().getParameter("case")?t+"n":t,t}()),c}},9393:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.en=void 0;const n=r(2105),o=r(4356),i=r(2536),s=r(310),a=r(4977);let l=null;e.en=function(){return l||(l=function(){const t=(0,o.createLocale)();return t.NUMBERS=s.default,t.FUNCTIONS.radicalNestDepth=i.nestingToString,t.FUNCTIONS.plural=t=>/.*s$/.test(t)?t:t+"s",t.ALPHABETS.combiner=a.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=s.default.numberToWords,t.CORRECTIONS.article=t=>n.Grammar.getInstance().getParameter("noArticle")?"":t,t}()),l}},7978:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.es=void 0;const n=r(4356),o=r(2536),i=r(4634),s=r(4977),a=function(t,e,r){return t="sans serif "+(r?r+" "+t:t),e?t+" "+e:t};let l=null;e.es=function(){return l||(l=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.COMBINERS.sansserif=a,t.FUNCTIONS.fracNestDepth=t=>!1,t.FUNCTIONS.combineRootIndex=o.combinePostfixIndex,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>t+r,t.FUNCTIONS.fontRegexp=t=>RegExp("^"+t+" "),t.FUNCTIONS.plural=t=>/.*(a|e|i|o|u)$/.test(t)?t+"s":/.*z$/.test(t)?t.slice(0,-1)+"ces":/.*c$/.test(t)?t.slice(0,-1)+"ques":/.*g$/.test(t)?t+"ues":/.*\u00f3n$/.test(t)?t.slice(0,-2)+"ones":t+"es",t.FUNCTIONS.si=(t,e)=>(e.match(/^metro/)&&(t=t.replace(/a$/,"\xe1").replace(/o$/,"\xf3").replace(/i$/,"\xed")),t+e),t.ALPHABETS.combiner=s.Combiners.prefixCombiner,t}()),l}},5540:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.fr=void 0;const n=r(2105),o=r(4356),i=r(2536),s=r(2350),a=r(4977);let l=null;e.fr=function(){return l||(l=function(){const t=(0,o.createLocale)();return t.NUMBERS=s.default,t.FUNCTIONS.radicalNestDepth=i.nestingToString,t.FUNCTIONS.combineRootIndex=i.combinePostfixIndex,t.FUNCTIONS.combineNestedFraction=(t,e,r)=>r.replace(/ $/g,"")+e+t,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>r+" "+t,t.FUNCTIONS.fontRegexp=t=>RegExp(" (en |)"+t+"$"),t.FUNCTIONS.plural=t=>/.*s$/.test(t)?t:t+"s",t.CORRECTIONS.article=t=>n.Grammar.getInstance().getParameter("noArticle")?"":t,t.ALPHABETS.combiner=a.Combiners.romanceCombiner,t.SUBISO={default:"fr",current:"fr",all:["fr","be","ch"]},t}()),l}},5218:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.hi=void 0;const n=r(4356),o=r(4438),i=r(4977),s=r(2536);let a=null;e.hi=function(){return a||(a=function(){const t=(0,n.createLocale)();return t.NUMBERS=o.default,t.ALPHABETS.combiner=i.Combiners.prefixCombiner,t.FUNCTIONS.radicalNestDepth=s.nestingToString,t}()),a}},3887:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.it=void 0;const n=r(2536),o=r(4356),i=r(8825),s=r(4977),a=function(t,e,r){return t.match(/^[a-zA-Z]$/)&&(e=e.replace("cerchiato","cerchiata")),t=r?t+" "+r:t,e?t+" "+e:t};let l=null;e.it=function(){return l||(l=function(){const t=(0,o.createLocale)();return t.NUMBERS=i.default,t.COMBINERS.italianPostfix=a,t.FUNCTIONS.radicalNestDepth=n.nestingToString,t.FUNCTIONS.combineRootIndex=n.combinePostfixIndex,t.FUNCTIONS.combineNestedFraction=(t,e,r)=>r.replace(/ $/g,"")+e+t,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>r+" "+t,t.FUNCTIONS.fontRegexp=t=>RegExp(" (en |)"+t+"$"),t.ALPHABETS.combiner=s.Combiners.romanceCombiner,t}()),l}},8384:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.nb=void 0;const n=r(4356),o=r(2536),i=r(8274),s=r(4977);let a=null;e.nb=function(){return a||(a=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.ALPHABETS.combiner=s.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t}()),a}},7206:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.nemeth=void 0;const n=r(4356),o=r(3720),i=r(4977),s=function(t){return t.match(RegExp("^"+h.ALPHABETS.languagePrefix.english))?t.slice(1):t},a=function(t,e,r){return t=s(t),e?t+e:t},l=function(t,e,r){return e+s(t)},c=function(t,e,r){return e+(r||"")+(t=s(t))+"\u283b"},u=function(t,e,r){return e+(r||"")+(t=s(t))+"\u283b\u283b"},p=function(t,e,r){return e+(t=s(t))+"\u283e"};let h=null;e.nemeth=function(){return h||(h=function(){const t=(0,n.createLocale)();return t.NUMBERS=o.default,t.COMBINERS={postfixCombiner:a,germanCombiner:l,embellishCombiner:c,doubleEmbellishCombiner:u,parensCombiner:p},t.FUNCTIONS.fracNestDepth=t=>!1,t.FUNCTIONS.fontRegexp=t=>RegExp("^"+t),t.FUNCTIONS.si=i.identityTransformer,t.ALPHABETS.combiner=(t,e,r)=>e?e+r+t:s(t),t.ALPHABETS.digitTrans={default:o.default.numberToWords},t}()),h}},7734:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.nn=void 0;const n=r(4356),o=r(2536),i=r(8274),s=r(4977);let a=null;e.nn=function(){return a||(a=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.ALPHABETS.combiner=s.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t.SUBISO={default:"",current:"",all:["","alt"]},t}()),a}},7264:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sv=void 0;const n=r(4356),o=r(2536),i=r(3898),s=r(4977);let a=null;e.sv=function(){return a||(a=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t.FUNCTIONS.fontRegexp=function(t){return new RegExp("((^"+t+" )|( "+t+"$))")},t.ALPHABETS.combiner=s.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t.CORRECTIONS.correctOne=t=>t.replace(/^ett$/,"en"),t}()),a}},7549:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SUBISO=e.FUNCTIONS=e.ALPHABETS=e.NUMBERS=e.MESSAGES=void 0;const n=r(4977);e.MESSAGES=function(){return{MS:{},MSroots:{},font:{},embellish:{},role:{},enclose:{},navigate:{},regexp:{},unitTimes:""}},e.NUMBERS=function(){return{zero:"zero",ones:[],tens:[],large:[],special:{},wordOrdinal:n.identityTransformer,numericOrdinal:n.identityTransformer,numberToWords:n.identityTransformer,numberToOrdinal:n.pluralCase,vulgarSep:" ",numSep:" "}},e.ALPHABETS=function(){return{latinSmall:[],latinCap:[],greekSmall:[],greekCap:[],capPrefix:{default:""},smallPrefix:{default:""},digitPrefix:{default:""},languagePrefix:{},digitTrans:{default:n.identityTransformer,mathspeak:n.identityTransformer,clearspeak:n.identityTransformer},letterTrans:{default:n.identityTransformer},combiner:(t,e,r)=>t}},e.FUNCTIONS=function(){return{fracNestDepth:t=>n.vulgarFractionSmall(t,10,100),radicalNestDepth:t=>"",combineRootIndex:function(t,e){return t},combineNestedFraction:n.Combiners.identityCombiner,combineNestedRadical:n.Combiners.identityCombiner,fontRegexp:function(t){return new RegExp("^"+t.split(/ |-/).join("( |-)")+"( |-)")},si:n.siCombiner,plural:n.identityTransformer}},e.SUBISO=function(){return{default:"",current:"",all:[]}}},614:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){const e=t%1e3,r=Math.floor(e/100),n=r?1===r?"cent":a.ones[r]+"-cents":"",o=function(t){const e=t%100;if(e<20)return a.ones[e];const r=Math.floor(e/10),n=a.tens[r],o=a.ones[e%10];return n&&o?n+(2===r?"-i-":"-")+o:n||o}(e%100);return n&&o?n+a.numSep+o:n||o}function i(t){if(0===t)return a.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){const n=t%(e>1?1e6:1e3);if(n){let t=a.large[e];if(e)if(1===e)r=(1===n?"":o(n)+a.numSep)+t+(r?a.numSep+r:"");else{const e=i(n);t=1===n?t:t.replace(/\u00f3$/,"ons"),r=e+a.numSep+t+(r?a.numSep+r:"")}else r=o(n)}t=Math.floor(t/(e>1?1e6:1e3)),e++}return r}function s(t){const e=n.Grammar.getInstance().getParameter("gender");return t.toString()+("f"===e?"a":"n")}const a=(0,r(7549).NUMBERS)();a.numericOrdinal=s,a.numberToWords=i,a.numberToOrdinal=function(t,e){if(t>1999)return s(t);if(t<=10)return a.special.onesOrdinals[t-1];const r=i(t);return r.match(/mil$/)?r.replace(/mil$/,"mil\xb7l\xe8sima"):r.match(/u$/)?r.replace(/u$/,"vena"):r.match(/a$/)?r.replace(/a$/,"ena"):r+(r.match(/e$/)?"na":"ena")},e.default=a},3866:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t,e=!1){return t===a.ones[1]?e?"et":"en":t}function o(t,e=!1){let r=t%1e3,o="",i=a.ones[Math.floor(r/100)];if(o+=i?n(i,!0)+" hundrede":"",r%=100,r)if(o+=o?" og ":"",i=e?a.special.smallOrdinals[r]:a.ones[r],i)o+=i;else{const t=e?a.special.tensOrdinals[Math.floor(r/10)]:a.tens[Math.floor(r/10)];i=a.ones[r%10],o+=i?n(i)+"og"+t:t}return o}function i(t,e=!1){if(0===t)return a.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,i="";for(;t>0;){const s=t%1e3;if(s){const t=o(s,e&&!r);if(r){const e=a.large[r],o=s>1?"er":"";i=n(t,r<=1)+" "+e+o+(i?" og ":"")+i}else i=n(t)+i}t=Math.floor(t/1e3),r++}return i}function s(t){if(t%100)return i(t,!0);const e=i(t);return e.match(/e$/)?e:e+"e"}const a=(0,r(7549).NUMBERS)();a.wordOrdinal=s,a.numericOrdinal=function(t){return t.toString()+"."},a.numberToWords=i,a.numberToOrdinal=function(t,e){return 1===t?e?"hel":"hele":2===t?e?"halv":"halve":s(t)+(e?"dele":"del")},e.default=a},1435:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t,e=!1){return t===a.ones[1]?e?"eine":"ein":t}function o(t){let e=t%1e3,r="",o=a.ones[Math.floor(e/100)];if(r+=o?n(o)+"hundert":"",e%=100,e)if(r+=r?a.numSep:"",o=a.ones[e],o)r+=o;else{const t=a.tens[Math.floor(e/10)];o=a.ones[e%10],r+=o?n(o)+"und"+t:t}return r}function i(t){if(0===t)return a.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){const i=t%1e3;if(i){const s=o(t%1e3);if(e){const t=a.large[e],o=e>1&&i>1?t.match(/e$/)?"n":"en":"";r=n(s,e>1)+t+o+r}else r=n(s,e>1)+r}t=Math.floor(t/1e3),e++}return r.replace(/ein$/,"eins")}function s(t){if(1===t)return"erste";if(3===t)return"dritte";if(7===t)return"siebte";if(8===t)return"achte";return i(t)+(t<19?"te":"ste")}const a=(0,r(7549).NUMBERS)();a.wordOrdinal=s,a.numericOrdinal=function(t){return t.toString()+"."},a.numberToWords=i,a.numberToOrdinal=function(t,e){return 1===t?"eintel":2===t?e?"halbe":"halb":s(t)+"l"},e.default=a},310:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t){let e=t%1e3,r="";return r+=s.ones[Math.floor(e/100)]?s.ones[Math.floor(e/100)]+s.numSep+"hundred":"",e%=100,e&&(r+=r?s.numSep:"",r+=s.ones[e]||s.tens[Math.floor(e/10)]+(e%10?s.numSep+s.ones[e%10]:"")),r}function o(t){if(0===t)return s.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){t%1e3&&(r=n(t%1e3)+(e?"-"+s.large[e]+"-":"")+r),t=Math.floor(t/1e3),e++}return r.replace(/-$/,"")}function i(t){let e=o(t);return e.match(/one$/)?e=e.slice(0,-3)+"first":e.match(/two$/)?e=e.slice(0,-3)+"second":e.match(/three$/)?e=e.slice(0,-5)+"third":e.match(/five$/)?e=e.slice(0,-4)+"fifth":e.match(/eight$/)?e=e.slice(0,-5)+"eighth":e.match(/nine$/)?e=e.slice(0,-4)+"ninth":e.match(/twelve$/)?e=e.slice(0,-6)+"twelfth":e.match(/ty$/)?e=e.slice(0,-2)+"tieth":e+="th",e}const s=(0,r(7549).NUMBERS)();s.wordOrdinal=i,s.numericOrdinal=function(t){const e=t%100,r=t.toString();if(e>10&&e<20)return r+"th";switch(t%10){case 1:return r+"st";case 2:return r+"nd";case 3:return r+"rd";default:return r+"th"}},s.numberToWords=o,s.numberToOrdinal=function(t,e){if(1===t)return e?"oneths":"oneth";if(2===t)return e?"halves":"half";const r=i(t);return e?r+"s":r},e.default=s},4634:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){const e=t%1e3,r=Math.floor(e/100),n=i.special.hundreds[r],o=function(t){const e=t%100;if(e<30)return i.ones[e];const r=i.tens[Math.floor(e/10)],n=i.ones[e%10];return r&&n?r+" y "+n:r||n}(e%100);return 1===r?o?n+"to "+o:n:n&&o?n+" "+o:n||o}const i=(0,r(7549).NUMBERS)();i.numericOrdinal=function(t){const e=n.Grammar.getInstance().getParameter("gender");return t.toString()+("f"===e?"a":"o")},i.numberToWords=function(t){if(0===t)return i.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){const n=t%1e3;if(n){let t=i.large[e];const s=o(n);e?1===n?(t=t.match("/^mil( |$)/")?t:"un "+t,r=t+(r?" "+r:"")):(t=t.replace(/\u00f3n$/,"ones"),r=o(n)+" "+t+(r?" "+r:"")):r=s}t=Math.floor(t/1e3),e++}return r},i.numberToOrdinal=function(t,e){if(t>1999)return t.toString()+"a";if(t<=12)return i.special.onesOrdinals[t-1];const r=[];if(t>=1e3&&(t-=1e3,r.push("mil\xe9sima")),!t)return r.join(" ");let n=0;return n=Math.floor(t/100),n>0&&(r.push(i.special.hundredsOrdinals[n-1]),t%=100),t<=12?r.push(i.special.onesOrdinals[t-1]):(n=Math.floor(t/10),n>0&&(r.push(i.special.tensOrdinals[n-1]),t%=10),t>0&&r.push(i.special.onesOrdinals[t-1])),r.join(" ")},e.default=i},2350:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(5897),o=r(2105),i=r(7549);function s(t){let e=t%1e3,r="";if(r+=u.ones[Math.floor(e/100)]?u.ones[Math.floor(e/100)]+"-cent":"",e%=100,e){r+=r?"-":"";let t=u.ones[e];if(t)r+=t;else{const n=u.tens[Math.floor(e/10)];n.match(/-dix$/)?(t=u.ones[e%10+10],r+=n.replace(/-dix$/,"")+"-"+t):r+=n+(e%10?"-"+u.ones[e%10]:"")}}const n=r.match(/s-\w+$/);return n?r.replace(/s-\w+$/,n[0].slice(1)):r.replace(/-un$/,"-et-un")}function a(t){if(0===t)return u.zero;if(t>=Math.pow(10,36))return t.toString();u.special["tens-"+n.default.getInstance().subiso]&&(u.tens=u.special["tens-"+n.default.getInstance().subiso]);let e=0,r="";for(;t>0;){const n=t%1e3;if(n){let t=u.large[e];const o=s(n);if(t&&t.match(/^mille /)){const n=t.replace(/^mille /,"");r=r.match(RegExp(n))?o+(e?"-mille-":"")+r:r.match(RegExp(n.replace(/s$/,"")))?o+(e?"-mille-":"")+r.replace(n.replace(/s$/,""),n):o+(e?"-"+t+"-":"")+r}else t=1===n&&t?t.replace(/s$/,""):t,r=o+(e?"-"+t+"-":"")+r}t=Math.floor(t/1e3),e++}return r.replace(/-$/,"")}const l={1:"uni\xe8me",2:"demi",3:"tiers",4:"quart"};function c(t){if(1===t)return"premi\xe8re";let e=a(t);return e.match(/^neuf$/)?e=e.slice(0,-1)+"v":e.match(/cinq$/)?e+="u":e.match(/trois$/)?e+="":(e.match(/e$/)||e.match(/s$/))&&(e=e.slice(0,-1)),e+="i\xe8me",e}const u=(0,i.NUMBERS)();u.wordOrdinal=c,u.numericOrdinal=function(t){const e=o.Grammar.getInstance().getParameter("gender");return 1===t?t.toString()+("m"===e?"er":"re"):t.toString()+"e"},u.numberToWords=a,u.numberToOrdinal=function(t,e){const r=l[t]||c(t);return 3===t?r:e?r+"s":r},e.default=u},4438:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){if(0===t)return s.zero;if(t>=Math.pow(10,32))return t.toString();let e=0,r="";const n=function(t){let e=t%1e3,r="";return r+=s.ones[Math.floor(e/100)]?s.ones[Math.floor(e/100)]+s.numSep+s.special.hundred:"",e%=100,e&&(r+=r?s.numSep:"",r+=s.ones[e]),r}(t%1e3);if(!(t=Math.floor(t/1e3)))return n;for(;t>0;){const n=t%100;n&&(r=s.ones[n]+s.numSep+s.large[e]+(r?s.numSep+r:"")),t=Math.floor(t/100),e++}return n?r+s.numSep+n:r}function i(t){const e=n.Grammar.getInstance().getParameter("gender");if(t<=0)return t.toString();if(t<10)return"f"===e?s.special.ordinalsFeminine[t]:s.special.ordinalsMasculine[t];return o(t)+("f"===e?"\u0935\u0940\u0902":"\u0935\u093e\u0901")}const s=(0,r(7549).NUMBERS)();s.wordOrdinal=i,s.numericOrdinal=function(t){const e=n.Grammar.getInstance().getParameter("gender");return t>0&&t<10?"f"===e?s.special.simpleSmallOrdinalsFeminine[t]:s.special.simpleSmallOrdinalsMasculine[t]:t.toString().split("").map((function(t){const e=parseInt(t,10);return isNaN(e)?"":s.special.simpleNumbers[e]})).join("")+("f"===e?"\u0935\u0940\u0902":"\u0935\u093e\u0901")},s.numberToWords=o,s.numberToOrdinal=function(t,e){return t<=10?s.special.smallDenominators[t]:i(t)+" \u0905\u0902\u0936"},e.default=s},8825:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){let e=t%1e3,r="";if(r+=a.ones[Math.floor(e/100)]?a.ones[Math.floor(e/100)]+a.numSep+"cento":"",e%=100,e){r+=r?a.numSep:"";const t=a.ones[e];if(t)r+=t;else{let t=a.tens[Math.floor(e/10)];const n=e%10;1!==n&&8!==n||(t=t.slice(0,-1)),r+=t,r+=n?a.numSep+a.ones[e%10]:""}}return r}function i(t){if(0===t)return a.zero;if(t>=Math.pow(10,36))return t.toString();if(1===t&&n.Grammar.getInstance().getParameter("fraction"))return"un";let e=0,r="";for(;t>0;){t%1e3&&(r=o(t%1e3)+(e?"-"+a.large[e]+"-":"")+r),t=Math.floor(t/1e3),e++}return r.replace(/-$/,"")}function s(t){const e="m"===n.Grammar.getInstance().getParameter("gender")?"o":"a";let r=a.special.onesOrdinals[t];return r?r.slice(0,-1)+e:(r=i(t),r.slice(0,-1)+"esim"+e)}const a=(0,r(7549).NUMBERS)();a.wordOrdinal=s,a.numericOrdinal=function(t){const e=n.Grammar.getInstance().getParameter("gender");return t.toString()+("m"===e?"o":"a")},a.numberToWords=i,a.numberToOrdinal=function(t,e){if(2===t)return e?"mezzi":"mezzo";const r=s(t);if(!e)return r;const n=r.match(/o$/)?"i":"e";return r.slice(0,-1)+n},e.default=a},3720:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t){return t.toString().split("").map((function(t){return o.ones[parseInt(t,10)]})).join("")}const o=(0,r(7549).NUMBERS)();o.numberToWords=n,o.numberToOrdinal=n,e.default=o},8274:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(5897);function o(t,e=!1){let r=t%1e3,n="";const o=Math.floor(r/100),s=a.ones[o];if(n+=s?(1===o?"":s)+"hundre":"",r%=100,r){if(n+=n?"og":"",e){const t=a.special.smallOrdinals[r];if(t)return n+t;if(r%10)return n+a.tens[Math.floor(r/10)]+a.special.smallOrdinals[r%10]}n+=a.ones[r]||a.tens[Math.floor(r/10)]+(r%10?a.ones[r%10]:"")}return e?i(n):n}function i(t){const e=a.special.endOrdinal[0];return"a"===e&&t.match(/en$/)?t.slice(0,-2)+a.special.endOrdinal:t.match(/(d|n)$/)||t.match(/hundre$/)?t+"de":t.match(/i$/)?t+a.special.endOrdinal:"a"===e&&t.match(/e$/)?t.slice(0,-1)+a.special.endOrdinal:(t.match(/e$/),t+"nde")}function s(t){return u(t,!0)}const a=(0,r(7549).NUMBERS)();function l(t,e=!1){return t===a.ones[1]?"ein"===t?"eitt ":e?"et":"ett":t}function c(t,e=!1){let r=t%1e3,n="",o=a.ones[Math.floor(r/100)];if(n+=o?l(o)+"hundre":"",r%=100,r){if(n+=n?"og":"",e){const t=a.special.smallOrdinals[r];if(t)return n+t}if(o=a.ones[r],o)n+=o;else{const t=a.tens[Math.floor(r/10)];o=a.ones[r%10],n+=o?o+"og"+t:t}}return e?i(n):n}function u(t,e=!1){const r="alt"===n.default.getInstance().subiso?function(t,e=!1){if(0===t)return e?a.special.smallOrdinals[0]:a.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,n="";for(;t>0;){const o=t%1e3;if(o){const i=c(t%1e3,!r&&e);!r&&e&&(e=!e),n=(1===r?l(i,!0):i)+(r>1?a.numSep:"")+(r?a.large[r]+(r>1&&o>1?"er":""):"")+(r>1&&n?a.numSep:"")+n}t=Math.floor(t/1e3),r++}return e?n+(n.match(/tusen$/)?"de":"te"):n}(t,e):function(t,e=!1){if(0===t)return e?a.special.smallOrdinals[0]:a.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,n="";for(;t>0;){const i=t%1e3;if(i){const s=o(t%1e3,!r&&e);!r&&e&&(e=!e),n=s+(r?" "+a.large[r]+(r>1&&i>1?"er":"")+(n?" ":""):"")+n}t=Math.floor(t/1e3),r++}return e?n+(n.match(/tusen$/)?"de":"te"):n}(t,e);return r}a.wordOrdinal=s,a.numericOrdinal=function(t){return t.toString()+"."},a.numberToWords=u,a.numberToOrdinal=function(t,e){return s(t)},e.default=a},3898:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t){let e=t%1e3,r="";const n=Math.floor(e/100);return r+=s.ones[n]?(1===n?"":s.ones[n]+s.numSep)+"hundra":"",e%=100,e&&(r+=r?s.numSep:"",r+=s.ones[e]||s.tens[Math.floor(e/10)]+(e%10?s.numSep+s.ones[e%10]:"")),r}function o(t,e=!1){if(0===t)return s.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,o="";for(;t>0;){const i=t%1e3;if(i){const a=s.large[r],l=i>1&&r>1&&!e?"er":"";o=(1===r&&1===i?"":(r>1&&1===i?"en":n(t%1e3))+(r>1?" ":""))+(r?a+l+(r>1?" ":""):"")+o}t=Math.floor(t/1e3),r++}return o.replace(/ $/,"")}function i(t){let e=o(t,!0);return e.match(/^noll$/)?e="nollte":e.match(/ett$/)?e=e.replace(/ett$/,"f\xf6rsta"):e.match(/tv\xe5$/)?e=e.replace(/tv\xe5$/,"andra"):e.match(/tre$/)?e=e.replace(/tre$/,"tredje"):e.match(/fyra$/)?e=e.replace(/fyra$/,"fj\xe4rde"):e.match(/fem$/)?e=e.replace(/fem$/,"femte"):e.match(/sex$/)?e=e.replace(/sex$/,"sj\xe4tte"):e.match(/sju$/)?e=e.replace(/sju$/,"sjunde"):e.match(/\xe5tta$/)?e=e.replace(/\xe5tta$/,"\xe5ttonde"):e.match(/nio$/)?e=e.replace(/nio$/,"nionde"):e.match(/tio$/)?e=e.replace(/tio$/,"tionde"):e.match(/elva$/)?e=e.replace(/elva$/,"elfte"):e.match(/tolv$/)?e=e.replace(/tolv$/,"tolfte"):e.match(/tusen$/)?e=e.replace(/tusen$/,"tusonde"):e.match(/jard$/)||e.match(/jon$/)?e+="te":e+="de",e}const s=(0,r(7549).NUMBERS)();s.wordOrdinal=i,s.numericOrdinal=function(t){const e=t.toString();return e.match(/11$|12$/)?e+":e":e+(e.match(/1$|2$/)?":a":":e")},s.numberToWords=o,s.numberToOrdinal=function(t,e){if(1===t)return"hel";if(2===t)return e?"halva":"halv";let r=i(t);return r=r.match(/de$/)?r.replace(/de$/,""):r,r+(e?"delar":"del")},e.default=s},4977:function(t,e){function r(t,e=""){if(!t.childNodes||!t.childNodes[0]||!t.childNodes[0].childNodes||t.childNodes[0].childNodes.length<2||"number"!==t.childNodes[0].childNodes[0].tagName||"integer"!==t.childNodes[0].childNodes[0].getAttribute("role")||"number"!==t.childNodes[0].childNodes[1].tagName||"integer"!==t.childNodes[0].childNodes[1].getAttribute("role"))return{convertible:!1,content:t.textContent};const r=t.childNodes[0].childNodes[1].textContent,n=t.childNodes[0].childNodes[0].textContent,o=Number(r),i=Number(n);return isNaN(o)||isNaN(i)?{convertible:!1,content:`${n} ${e} ${r}`}:{convertible:!0,enumerator:i,denominator:o}}Object.defineProperty(e,"__esModule",{value:!0}),e.vulgarFractionSmall=e.convertVulgarFraction=e.Combiners=e.siCombiner=e.identityTransformer=e.pluralCase=void 0,e.pluralCase=function(t,e){return t.toString()},e.identityTransformer=function(t){return t.toString()},e.siCombiner=function(t,e){return t+e.toLowerCase()},e.Combiners={},e.Combiners.identityCombiner=function(t,e,r){return t+e+r},e.Combiners.prefixCombiner=function(t,e,r){return t=r?r+" "+t:t,e?e+" "+t:t},e.Combiners.postfixCombiner=function(t,e,r){return t=r?r+" "+t:t,e?t+" "+e:t},e.Combiners.romanceCombiner=function(t,e,r){return t=r?t+" "+r:t,e?t+" "+e:t},e.convertVulgarFraction=r,e.vulgarFractionSmall=function(t,e,n){const o=r(t);if(o.convertible){const t=o.enumerator,r=o.denominator;return t>0&&t0&&r{const s=this.parseCstr(e.toString().replace(o,""));this.addRule(new i.SpeechRule(t,s,n,r))}))}getFullPreconditions(t){const e=this.preconditions.get(t);return e||!this.inherits?e:this.inherits.getFullPreconditions(t)}definePrecondition(t,e,r,...n){const o=this.parsePrecondition(r,n),i=this.parseCstr(e);o&&i?(o.rank=this.rank++,this.preconditions.set(t,new l(i,o))):console.error(`Precondition Error: ${r}, (${e})`)}inheritRules(){if(!this.inherits||!this.inherits.getSpeechRules().length)return;const t=new RegExp("^\\w+\\.\\w+\\."+(this.domain?"\\w+\\.":""));this.inherits.getSpeechRules().forEach((e=>{const r=this.parseCstr(e.dynamicCstr.toString().replace(t,""));this.addRule(new i.SpeechRule(e.name,r,e.precondition,e.action))}))}ignoreRules(t,...e){let r=this.findAllRules((e=>e.name===t));if(!e.length)return void r.forEach(this.deleteRule.bind(this));let n=[];for(const t of e){const e=this.parseCstr(t);for(const t of r)e.equal(t.dynamicCstr)?this.deleteRule(t):n.push(t);r=n,n=[]}}parsePrecondition_(t){const e=this.context.customGenerators.lookup(t);return e?e():[t]}}e.BaseRuleStore=a;class l{constructor(t,e){this.base=t,this._conditions=[],this.constraints=[],this.allCstr={},this.constraints.push(t),this.addCondition(t,e)}get conditions(){return this._conditions}addConstraint(t){if(this.constraints.filter((e=>e.equal(t))).length)return;this.constraints.push(t);const e=[];for(const[r,n]of this.conditions)this.base.equal(r)&&e.push([t,n]);this._conditions=this._conditions.concat(e)}addBaseCondition(t){this.addCondition(this.base,t)}addFullCondition(t){this.constraints.forEach((e=>this.addCondition(e,t)))}addCondition(t,e){const r=t.toString()+" "+e.toString();this.allCstr.condStr||(this.allCstr[r]=!0,this._conditions.push([t,e]))}}e.Condition=l},2469:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.BrailleStore=void 0;const n=r(7630),o=r(9935);class i extends o.MathStore{constructor(){super(...arguments),this.modality="braille",this.customTranscriptions={"\u22ca":"\u2808\u2821\u2833"}}evaluateString(t){const e=[],r=Array.from(t);for(let t=0;tt.push(this.getProperty(e).slice()))),t}toString(){const t=[];return this.order.forEach((e=>t.push(e+": "+this.getProperty(e).toString()))),t.join("\n")}}e.DynamicProperties=n;class o extends n{constructor(t,e){const r={};for(const[e,n]of Object.entries(t))r[e]=[n];super(r,e),this.components=t}static createCstr(...t){const e=o.DEFAULT_ORDER,r={};for(let n=0,o=t.length,i=e.length;n{const r=e.indexOf(t);return-1!==r&&e.splice(r,1)}))}getComponents(){return this.components}getValue(t){return this.components[t]}getValues(){return this.order.map((t=>this.getValue(t)))}allProperties(){const t=super.allProperties();for(let e,r,n=0;e=t[n],r=this.order[n];n++){const t=this.getValue(r);-1===e.indexOf(t)&&e.unshift(t)}return t}toString(){return this.getValues().join(".")}equal(t){const e=t.getAxes();if(this.order.length!==e.length)return!1;for(let r,n=0;r=e[n];n++){const e=this.getValue(r);if(!e||t.getValue(r)!==e)return!1}return!0}}e.DynamicCstr=o,o.DEFAULT_ORDER=[r.LOCALE,r.MODALITY,r.DOMAIN,r.STYLE,r.TOPIC],o.BASE_LOCALE="base",o.DEFAULT_VALUE="default",o.DEFAULT_VALUES={[r.LOCALE]:"en",[r.DOMAIN]:o.DEFAULT_VALUE,[r.STYLE]:o.DEFAULT_VALUE,[r.TOPIC]:o.DEFAULT_VALUE,[r.MODALITY]:"speech"};e.DynamicCstrParser=class{constructor(t){this.order=t}parse(t){const e=t.split("."),r={};if(e.length>this.order.length)throw new Error("Invalid dynamic constraint: "+r);let n=0;for(let t,o=0;t=this.order[o],e.length;o++,n++){const n=e.shift();r[t]=n}return new o(r,this.order.slice(0,n))}};e.DefaultComparator=class{constructor(t,e=new n(t.getProperties(),t.getOrder())){this.reference=t,this.fallback=e,this.order=this.reference.getOrder()}getReference(){return this.reference}setReference(t,e){this.reference=t,this.fallback=e||new n(t.getProperties(),t.getOrder()),this.order=this.reference.getOrder()}match(t){const e=t.getAxes();return e.length===this.reference.getAxes().length&&e.every((e=>{const r=t.getValue(e);return r===this.reference.getValue(e)||-1!==this.fallback.getProperty(e).indexOf(r)}))}compare(t,e){let r=!1;for(let n,o=0;n=this.order[o];o++){const o=t.getValue(n),i=e.getValue(n);if(!r){const t=this.reference.getValue(n);if(t===o&&t!==i)return-1;if(t===i&&t!==o)return 1;if(t===o&&t===i)continue;t!==o&&t!==i&&(r=!0)}const s=this.fallback.getProperty(n),a=s.indexOf(o),l=s.indexOf(i);if(a!h.equal(t.cstr))),l.push(m),this.rules.set(e,l),f.setReference(d)}lookupRule(t,e){let r=this.getRules(e.getValue(o.Axis.LOCALE));return r=r.filter((function(t){return i.testDynamicConstraints_(e,t)})),1===r.length?r[0]:r.length?r.sort(((t,e)=>n.default.getInstance().comparator.compare(t.cstr,e.cstr)))[0]:null}}e.MathSimpleStore=i},9935:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MathStore=void 0;const n=r(707),o=r(4356),i=r(7630),s=r(4504),a=r(4650);class l extends s.BaseRuleStore{constructor(){super(),this.annotators=[],this.parseMethods.Alias=this.defineAlias,this.parseMethods.SpecializedRule=this.defineSpecializedRule,this.parseMethods.Specialized=this.defineSpecialized}initialize(){this.initialized||(this.annotations(),this.initialized=!0)}annotations(){for(let t,e=0;t=this.annotators[e];e++)(0,i.activate)(this.domain,t)}defineAlias(t,e,...r){const n=this.parsePrecondition(e,r);if(!n)return void console.error(`Precondition Error: ${e} ${r}`);const o=this.preconditions.get(t);o?o.addFullCondition(n):console.error(`Alias Error: No precondition by the name of ${t}`)}defineRulesAlias(t,e,...r){const n=this.findAllRules((function(e){return e.name===t}));if(0===n.length)throw new a.OutputError("Rule with name "+t+" does not exist.");const o=[];n.forEach((t=>{(t=>{const e=t.dynamicCstr.toString(),r=t.action.toString();for(let t,n=0;t=o[n];n++)if(t.action===r&&t.cstr===e)return!1;return o.push({cstr:e,action:r}),!0})(t)&&this.addAlias_(t,e,r)}))}defineSpecializedRule(t,e,r,n){const o=this.parseCstr(e),i=this.findRule((e=>e.name===t&&o.equal(e.dynamicCstr))),s=this.parseCstr(r);if(!i&&n)throw new a.OutputError("Rule named "+t+" with style "+e+" does not exist.");const l=n?a.Action.fromString(n):i.action,c=new a.SpeechRule(i.name,s,i.precondition,l);this.addRule(c)}defineSpecialized(t,e,r){const n=this.parseCstr(r);if(!n)return void console.error(`Dynamic Constraint Error: ${r}`);const o=this.preconditions.get(t);o?o.addConstraint(n):console.error(`Alias Error: No precondition by the name of ${t}`)}evaluateString(t){const e=[];if(t.match(/^\s+$/))return e;let r=this.matchNumber_(t);if(r&&r.length===t.length)return e.push(this.evaluateCharacter(r.number)),e;const i=n.removeEmpty(t.replace(/\s/g," ").split(" "));for(let t,n=0;t=i[n];n++)if(1===t.length)e.push(this.evaluateCharacter(t));else if(t.match(new RegExp("^["+o.LOCALE.MESSAGES.regexp.TEXT+"]+$")))e.push(this.evaluateCharacter(t));else{let n=t;for(;n;){r=this.matchNumber_(n);const t=n.match(new RegExp("^["+o.LOCALE.MESSAGES.regexp.TEXT+"]+"));if(r)e.push(this.evaluateCharacter(r.number)),n=n.substring(r.length);else if(t)e.push(this.evaluateCharacter(t[0])),n=n.substring(t[0].length);else{const t=Array.from(n),r=t[0];e.push(this.evaluateCharacter(r)),n=t.slice(1).join("")}}}return e}parse(t){super.parse(t),this.annotators=t.annotators||[]}addAlias_(t,e,r){const n=this.parsePrecondition(e,r),o=new a.SpeechRule(t.name,t.dynamicCstr,n,t.action);o.name=t.name,this.addRule(o)}matchNumber_(t){const e=t.match(new RegExp("^"+o.LOCALE.MESSAGES.regexp.NUMBER)),r=t.match(new RegExp("^"+l.regexp.NUMBER));if(!e&&!r)return null;const n=r&&r[0]===t;if(e&&e[0]===t||!n)return e?{number:e[0],length:e[0].length}:null;return{number:r[0].replace(new RegExp(l.regexp.DIGIT_GROUP,"g"),"X").replace(new RegExp(l.regexp.DECIMAL_MARK,"g"),o.LOCALE.MESSAGES.regexp.DECIMAL_MARK).replace(/X/g,o.LOCALE.MESSAGES.regexp.DIGIT_GROUP.replace(/\\/g,"")),length:r[0].length}}}e.MathStore=l,l.regexp={NUMBER:"((\\d{1,3})(?=(,| ))((,| )\\d{3})*(\\.\\d+)?)|^\\d*\\.\\d+|^\\d+",DECIMAL_MARK:"\\.",DIGIT_GROUP:","}},4650:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.OutputError=e.Precondition=e.Action=e.Component=e.ActionType=e.SpeechRule=void 0;const n=r(5897),o=r(2105);var i;function s(t){switch(t){case"[n]":return i.NODE;case"[m]":return i.MULTI;case"[t]":return i.TEXT;case"[p]":return i.PERSONALITY;default:throw"Parse error: "+t}}e.SpeechRule=class{constructor(t,e,r,n){this.name=t,this.dynamicCstr=e,this.precondition=r,this.action=n,this.context=null}toString(){return this.name+" | "+this.dynamicCstr.toString()+" | "+this.precondition.toString()+" ==> "+this.action.toString()}},function(t){t.NODE="NODE",t.MULTI="MULTI",t.TEXT="TEXT",t.PERSONALITY="PERSONALITY"}(i=e.ActionType||(e.ActionType={}));class a{constructor({type:t,content:e,attributes:r,grammar:n}){this.type=t,this.content=e,this.attributes=r,this.grammar=n}static grammarFromString(t){return o.Grammar.parseInput(t)}static fromString(t){const e={type:s(t.substring(0,3))};let r=t.slice(3).trim();if(!r)throw new u("Missing content.");switch(e.type){case i.TEXT:if('"'===r[0]){const t=p(r,"\\(")[0].trim();if('"'!==t.slice(-1))throw new u("Invalid string syntax.");e.content=t,r=r.slice(t.length).trim(),-1===r.indexOf("(")&&(r="");break}case i.NODE:case i.MULTI:{const t=r.indexOf(" (");if(-1===t){e.content=r.trim(),r="";break}e.content=r.substring(0,t).trim(),r=r.slice(t).trim()}}if(r){const t=a.attributesFromString(r);t.grammar&&(e.grammar=t.grammar,delete t.grammar),Object.keys(t).length&&(e.attributes=t)}return new a(e)}static attributesFromString(t){if("("!==t[0]||")"!==t.slice(-1))throw new u("Invalid attribute expression: "+t);const e={},r=p(t.slice(1,-1),",");for(let t=0,n=r.length;t0?"("+t.join(", ")+")":""}getAttributes(){const t=[];for(const e in this.attributes){const r=this.attributes[e];"true"===r?t.push(e):t.push(e+":"+r)}return t}}e.Component=a;class l{constructor(t){this.components=t}static fromString(t){const e=p(t,";").filter((function(t){return t.match(/\S/)})).map((function(t){return t.trim()})),r=[];for(let t=0,n=e.length;t0?r[0]:null}applyConstraint(t,e){return!!this.applyQuery(t,e)||n.evaluateBoolean(e,t)}constructString(t,e){if(!e)return"";if('"'===e.charAt(0))return e.slice(1,-1);const r=this.customStrings.lookup(e);return r?r(t):n.evaluateString(e,t)}parse(t){const e=Array.isArray(t)?t:Object.entries(t);for(let t,r=0;t=e[r];r++){switch(t[0].slice(0,3)){case"CQF":this.customQueries.add(t[0],t[1]);break;case"CSF":this.customStrings.add(t[0],t[1]);break;case"CTF":this.contextFunctions.add(t[0],t[1]);break;case"CGF":this.customGenerators.add(t[0],t[1]);break;default:console.error("FunctionError: Invalid function name "+t[0])}}}}},2362:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.storeFactory=e.SpeechRuleEngine=void 0;const n=r(7052),o=r(2057),i=r(5740),s=r(5897),a=r(4440),l=r(5274),c=r(7283),u=r(7599),p=r(2469),h=r(1676),f=r(2105),d=r(9935),m=r(4650),y=r(4508);class g{constructor(){this.trie=null,this.evaluators_={},this.trie=new y.Trie}static getInstance(){return g.instance=g.instance||new g,g.instance}static debugSpeechRule(t,e){const r=t.precondition,n=t.context.applyQuery(e,r.query);o.Debugger.getInstance().output(r.query,n?n.toString():n),r.constraints.forEach((r=>o.Debugger.getInstance().output(r,t.context.applyConstraint(e,r))))}static debugNamedSpeechRule(t,e){const r=g.getInstance().trie.collectRules().filter((e=>e.name==t));for(let n,i=0;n=r[i];i++)o.Debugger.getInstance().output("Rule",t,"DynamicCstr:",n.dynamicCstr.toString(),"number",i),g.debugSpeechRule(n,e)}evaluateNode(t){(0,l.updateEvaluator)(t);const e=(new Date).getTime();let r=[];try{r=this.evaluateNode_(t)}catch(t){console.error("Something went wrong computing speech."),o.Debugger.getInstance().output(t)}const n=(new Date).getTime();return o.Debugger.getInstance().output("Time:",n-e),r}toString(){return this.trie.collectRules().map((t=>t.toString())).join("\n")}runInSetting(t,e){const r=s.default.getInstance(),n={};for(const e in t)n[e]=r[e],r[e]=t[e];r.setDynamicCstr();const o=e();for(const t in n)r[t]=n[t];return r.setDynamicCstr(),o}addStore(t){const e=v(t);"abstract"!==e.kind&&e.getSpeechRules().forEach((t=>this.trie.addRule(t))),this.addEvaluator(e)}processGrammar(t,e,r){const n={};for(const o in r){const i=r[o];n[o]="string"==typeof i?t.constructString(e,i):i}f.Grammar.getInstance().pushState(n)}addEvaluator(t){const e=t.evaluateDefault.bind(t),r=this.evaluators_[t.locale];if(r)return void(r[t.modality]=e);const n={};n[t.modality]=e,this.evaluators_[t.locale]=n}getEvaluator(t,e){const r=this.evaluators_[t]||this.evaluators_[h.DynamicCstr.DEFAULT_VALUES[h.Axis.LOCALE]];return r[e]||r[h.DynamicCstr.DEFAULT_VALUES[h.Axis.MODALITY]]}enumerate(t){return this.trie.enumerate(t)}evaluateNode_(t){return t?(this.updateConstraint_(),this.evaluateTree_(t)):[]}evaluateTree_(t){const e=s.default.getInstance();let r;o.Debugger.getInstance().output(e.mode!==a.Mode.HTTP?t.toString():t),f.Grammar.getInstance().setAttribute(t);const i=this.lookupRule(t,e.dynamicCstr);if(!i)return e.strict?[]:(r=this.getEvaluator(e.locale,e.modality)(t),t.attributes&&this.addPersonality_(r,{},!1,t),r);o.Debugger.getInstance().generateOutput((()=>["Apply Rule:",i.name,i.dynamicCstr.toString(),(e.mode,a.Mode.HTTP,t).toString()]));const c=i.context,u=i.action.components;r=[];for(let e,o=0;e=u[o];o++){let o=[];const i=e.content||"",a=e.attributes||{};let u=!1;e.grammar&&this.processGrammar(c,t,e.grammar);let p=null;if(a.engine){p=s.default.getInstance().dynamicCstr.getComponents();const t=f.Grammar.parseInput(a.engine);s.default.getInstance().setDynamicCstr(t)}switch(e.type){case m.ActionType.NODE:{const e=c.applyQuery(t,i);e&&(o=this.evaluateTree_(e))}break;case m.ActionType.MULTI:{u=!0;const e=c.applySelector(t,i);e.length>0&&(o=this.evaluateNodeList_(c,e,a.sepFunc,c.constructString(t,a.separator),a.ctxtFunc,c.constructString(t,a.context)))}break;case m.ActionType.TEXT:{const e=a.span,r={};if(e){const n=(0,l.evalXPath)(e,t);n.length&&(r.extid=n[0].getAttribute("extid"))}const s=c.constructString(t,i);(s||""===s)&&(o=Array.isArray(s)?s.map((function(t){return n.AuditoryDescription.create({text:t.speech,attributes:t.attributes},{adjust:!0})})):[n.AuditoryDescription.create({text:s,attributes:r},{adjust:!0})])}break;case m.ActionType.PERSONALITY:default:o=[n.AuditoryDescription.create({text:i})]}o[0]&&!u&&(a.context&&(o[0].context=c.constructString(t,a.context)+(o[0].context||"")),a.annotation&&(o[0].annotation=a.annotation)),this.addLayout(o,a,u),e.grammar&&f.Grammar.getInstance().popState(),r=r.concat(this.addPersonality_(o,a,u,t)),p&&s.default.getInstance().setDynamicCstr(p)}return r}evaluateNodeList_(t,e,r,o,i,s){if(!e.length)return[];const a=o||"",l=s||"",c=t.contextFunctions.lookup(i),u=c?c(e,l):function(){return l},p=t.contextFunctions.lookup(r),h=p?p(e,a):function(){return[n.AuditoryDescription.create({text:a},{translate:!0})]};let f=[];for(let t,r=0;t=e[r];r++){const n=this.evaluateTree_(t);if(n.length>0&&(n[0].context=u()+(n[0].context||""),f=f.concat(n),r=0;e--){const n=r[e].name;!t.attributes[n]&&n.match(/^ext/)&&(t.attributes[n]=r[e].value)}}}addRelativePersonality_(t,e){if(!t.personality)return t.personality=e,t;const r=t.personality;for(const t in e)r[t]&&"number"==typeof r[t]&&"number"==typeof e[t]?r[t]=r[t]+e[t]:r[t]||(r[t]=e[t]);return t}updateConstraint_(){const t=s.default.getInstance().dynamicCstr,e=s.default.getInstance().strict,r=this.trie,n={};let o=t.getValue(h.Axis.LOCALE),i=t.getValue(h.Axis.MODALITY),a=t.getValue(h.Axis.DOMAIN);r.hasSubtrie([o,i,a])||(a=h.DynamicCstr.DEFAULT_VALUES[h.Axis.DOMAIN],r.hasSubtrie([o,i,a])||(i=h.DynamicCstr.DEFAULT_VALUES[h.Axis.MODALITY],r.hasSubtrie([o,i,a])||(o=h.DynamicCstr.DEFAULT_VALUES[h.Axis.LOCALE]))),n[h.Axis.LOCALE]=[o],n[h.Axis.MODALITY]=["summary"!==i?i:h.DynamicCstr.DEFAULT_VALUES[h.Axis.MODALITY]],n[h.Axis.DOMAIN]=["speech"!==i?h.DynamicCstr.DEFAULT_VALUES[h.Axis.DOMAIN]:a];const l=t.getOrder();for(let r,o=0;r=l[o];o++)if(!n[r]){const o=t.getValue(r),i=this.makeSet_(o,t.preference),s=h.DynamicCstr.DEFAULT_VALUES[r];e||o===s||i.push(s),n[r]=i}t.updateProperties(n)}makeSet_(t,e){return e&&Object.keys(e).length?t.split(":"):[t]}lookupRule(t,e){if(!t||t.nodeType!==i.NodeType.ELEMENT_NODE&&t.nodeType!==i.NodeType.TEXT_NODE)return null;const r=this.lookupRules(t,e);return r.length>0?this.pickMostConstraint_(e,r):null}lookupRules(t,e){return this.trie.lookupRules(t,e.allProperties())}pickMostConstraint_(t,e){const r=s.default.getInstance().comparator;return e.sort((function(t,e){return r.compare(t.dynamicCstr,e.dynamicCstr)||e.precondition.priority-t.precondition.priority||e.precondition.constraints.length-t.precondition.constraints.length||e.precondition.rank-t.precondition.rank})),o.Debugger.getInstance().generateOutput((()=>e.map((t=>t.name+"("+t.dynamicCstr.toString()+")"))).bind(this)),e[0]}}e.SpeechRuleEngine=g;const b=new Map;function v(t){const e=`${t.locale}.${t.modality}.${t.domain}`;if("actions"===t.kind){const r=b.get(e);return r.parse(t),r}u.init(),t&&!t.functions&&(t.functions=c.getStore(t.locale,t.modality,t.domain));const r="braille"===t.modality?new p.BrailleStore:new d.MathStore;return b.set(e,r),t.inherits&&(r.inherits=b.get(`${t.inherits}.${t.modality}.${t.domain}`)),r.parse(t),r.initialize(),r}e.storeFactory=v,s.default.nodeEvaluator=g.getInstance().evaluateNode.bind(g.getInstance())},5662:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.CustomGenerators=e.ContextFunctions=e.CustomStrings=e.CustomQueries=void 0;class r{constructor(t,e){this.prefix=t,this.store=e}add(t,e){this.checkCustomFunctionSyntax_(t)&&(this.store[t]=e)}addStore(t){const e=Object.keys(t.store);for(let r,n=0;r=e[n];n++)this.add(r,t.store[r])}lookup(t){return this.store[t]}checkCustomFunctionSyntax_(t){const e=new RegExp("^"+this.prefix);return!!t.match(e)||(console.error("FunctionError: Invalid function name. Expected prefix "+this.prefix),!1)}}e.CustomQueries=class extends r{constructor(){super("CQF",{})}};e.CustomStrings=class extends r{constructor(){super("CSF",{})}};e.ContextFunctions=class extends r{constructor(){super("CTF",{})}};e.CustomGenerators=class extends r{constructor(){super("CGF",{})}}},365:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.contentIterator=e.pauseSeparator=e.nodeCounter=void 0;const n=r(7052),o=r(5274),i=r(5897);e.nodeCounter=function(t,e){const r=t.length;let n=0,o=e;return e||(o=""),function(){return n0?o.evalXPath("../../content/*",t[0]):[],function(){const t=r.shift(),o=e?[n.AuditoryDescription.create({text:e},{translate:!0})]:[];if(!t)return o;const s=i.default.evaluateNode(t);return o.concat(s)}}},1414:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.getTreeFromString=e.getTree=e.xmlTree=void 0;const n=r(5740),o=r(7075);function i(t){return new o.SemanticTree(t)}e.xmlTree=function(t){return i(t).xml()},e.getTree=i,e.getTreeFromString=function(t){return i(n.parseInput(t))}},7630:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.annotate=e.activate=e.register=e.visitors=e.annotators=void 0;const n=r(9265);e.annotators=new Map,e.visitors=new Map,e.register=function(t){const r=t.domain+":"+t.name;t instanceof n.SemanticAnnotator?e.annotators.set(r,t):e.visitors.set(r,t)},e.activate=function(t,r){const n=t+":"+r,o=e.annotators.get(n)||e.visitors.get(n);o&&(o.active=!0)},e.annotate=function(t){for(const r of e.annotators.values())r.active&&r.annotate(t);for(const r of e.visitors.values())r.active&&r.visit(t,Object.assign({},r.def))}},9265:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticVisitor=e.SemanticAnnotator=void 0;e.SemanticAnnotator=class{constructor(t,e,r){this.domain=t,this.name=e,this.func=r,this.active=!1}annotate(t){t.childNodes.forEach(this.annotate.bind(this)),t.addAnnotation(this.domain,this.func(t))}};e.SemanticVisitor=class{constructor(t,e,r,n={}){this.domain=t,this.name=e,this.func=r,this.def=n,this.active=!1}visit(t,e){let r=this.func(t,e);t.addAnnotation(this.domain,r[0]);for(let e,n=0;e=t.childNodes[n];n++)r=this.visit(e,r[1]);return r}}},3588:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.lookupSecondary=e.isEmbellishedType=e.isMatchingFence=e.functionApplication=e.invisibleComma=e.invisiblePlus=e.invisibleTimes=e.lookupMeaning=e.lookupRole=e.lookupType=e.equal=e.allLettersRegExp=void 0;const r=String.fromCodePoint(8291),n=["\uff0c","\ufe50",",",r],o=["\xaf","\u2012","\u2013","\u2014","\u2015","\ufe58","-","\u207b","\u208b","\u2212","\u2796","\ufe63","\uff0d","\u2010","\u2011","\u203e","_"],i=["~","\u0303","\u223c","\u02dc","\u223d","\u02f7","\u0334","\u0330"],s={"(":")","[":"]","{":"}","\u2045":"\u2046","\u2329":"\u232a","\u2768":"\u2769","\u276a":"\u276b","\u276c":"\u276d","\u276e":"\u276f","\u2770":"\u2771","\u2772":"\u2773","\u2774":"\u2775","\u27c5":"\u27c6","\u27e6":"\u27e7","\u27e8":"\u27e9","\u27ea":"\u27eb","\u27ec":"\u27ed","\u27ee":"\u27ef","\u2983":"\u2984","\u2985":"\u2986","\u2987":"\u2988","\u2989":"\u298a","\u298b":"\u298c","\u298d":"\u298e","\u298f":"\u2990","\u2991":"\u2992","\u2993":"\u2994","\u2995":"\u2996","\u2997":"\u2998","\u29d8":"\u29d9","\u29da":"\u29db","\u29fc":"\u29fd","\u2e22":"\u2e23","\u2e24":"\u2e25","\u2e26":"\u2e27","\u2e28":"\u2e29","\u3008":"\u3009","\u300a":"\u300b","\u300c":"\u300d","\u300e":"\u300f","\u3010":"\u3011","\u3014":"\u3015","\u3016":"\u3017","\u3018":"\u3019","\u301a":"\u301b","\u301d":"\u301e","\ufd3e":"\ufd3f","\ufe17":"\ufe18","\ufe59":"\ufe5a","\ufe5b":"\ufe5c","\ufe5d":"\ufe5e","\uff08":"\uff09","\uff3b":"\uff3d","\uff5b":"\uff5d","\uff5f":"\uff60","\uff62":"\uff63","\u2308":"\u2309","\u230a":"\u230b","\u230c":"\u230d","\u230e":"\u230f","\u231c":"\u231d","\u231e":"\u231f","\u239b":"\u239e","\u239c":"\u239f","\u239d":"\u23a0","\u23a1":"\u23a4","\u23a2":"\u23a5","\u23a3":"\u23a6","\u23a7":"\u23ab","\u23a8":"\u23ac","\u23a9":"\u23ad","\u23b0":"\u23b1","\u23b8":"\u23b9"},a={"\u23b4":"\u23b5","\u23dc":"\u23dd","\u23de":"\u23df","\u23e0":"\u23e1","\ufe35":"\ufe36","\ufe37":"\ufe38","\ufe39":"\ufe3a","\ufe3b":"\ufe3c","\ufe3d":"\ufe3e","\ufe3f":"\ufe40","\ufe41":"\ufe42","\ufe43":"\ufe44","\ufe47":"\ufe48"},l=Object.keys(s),c=Object.values(s);c.push("\u301f");const u=Object.keys(a),p=Object.values(a),h=["|","\xa6","\u2223","\u23d0","\u23b8","\u23b9","\u2758","\uff5c","\uffe4","\ufe31","\ufe32"],f=["\u2016","\u2225","\u2980","\u2af4"],d=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],m=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","\u0131","\u0237"],y=["\uff21","\uff22","\uff23","\uff24","\uff25","\uff26","\uff27","\uff28","\uff29","\uff2a","\uff2b","\uff2c","\uff2d","\uff2e","\uff2f","\uff30","\uff31","\uff32","\uff33","\uff34","\uff35","\uff36","\uff37","\uff38","\uff39","\uff3a"],g=["\uff41","\uff42","\uff43","\uff44","\uff45","\uff46","\uff47","\uff48","\uff49","\uff4a","\uff4b","\uff4c","\uff4d","\uff4e","\uff4f","\uff50","\uff51","\uff52","\uff53","\uff54","\uff55","\uff56","\uff57","\uff58","\uff59","\uff5a"],b=["\ud835\udc00","\ud835\udc01","\ud835\udc02","\ud835\udc03","\ud835\udc04","\ud835\udc05","\ud835\udc06","\ud835\udc07","\ud835\udc08","\ud835\udc09","\ud835\udc0a","\ud835\udc0b","\ud835\udc0c","\ud835\udc0d","\ud835\udc0e","\ud835\udc0f","\ud835\udc10","\ud835\udc11","\ud835\udc12","\ud835\udc13","\ud835\udc14","\ud835\udc15","\ud835\udc16","\ud835\udc17","\ud835\udc18","\ud835\udc19"],v=["\ud835\udc1a","\ud835\udc1b","\ud835\udc1c","\ud835\udc1d","\ud835\udc1e","\ud835\udc1f","\ud835\udc20","\ud835\udc21","\ud835\udc22","\ud835\udc23","\ud835\udc24","\ud835\udc25","\ud835\udc26","\ud835\udc27","\ud835\udc28","\ud835\udc29","\ud835\udc2a","\ud835\udc2b","\ud835\udc2c","\ud835\udc2d","\ud835\udc2e","\ud835\udc2f","\ud835\udc30","\ud835\udc31","\ud835\udc32","\ud835\udc33"],_=["\ud835\udc34","\ud835\udc35","\ud835\udc36","\ud835\udc37","\ud835\udc38","\ud835\udc39","\ud835\udc3a","\ud835\udc3b","\ud835\udc3c","\ud835\udc3d","\ud835\udc3e","\ud835\udc3f","\ud835\udc40","\ud835\udc41","\ud835\udc42","\ud835\udc43","\ud835\udc44","\ud835\udc45","\ud835\udc46","\ud835\udc47","\ud835\udc48","\ud835\udc49","\ud835\udc4a","\ud835\udc4b","\ud835\udc4c","\ud835\udc4d"],S=["\ud835\udc4e","\ud835\udc4f","\ud835\udc50","\ud835\udc51","\ud835\udc52","\ud835\udc53","\ud835\udc54","\u210e","\ud835\udc56","\ud835\udc57","\ud835\udc58","\ud835\udc59","\ud835\udc5a","\ud835\udc5b","\ud835\udc5c","\ud835\udc5d","\ud835\udc5e","\ud835\udc5f","\ud835\udc60","\ud835\udc61","\ud835\udc62","\ud835\udc63","\ud835\udc64","\ud835\udc65","\ud835\udc66","\ud835\udc67","\ud835\udea4","\ud835\udea5"],M=["\ud835\udc68","\ud835\udc69","\ud835\udc6a","\ud835\udc6b","\ud835\udc6c","\ud835\udc6d","\ud835\udc6e","\ud835\udc6f","\ud835\udc70","\ud835\udc71","\ud835\udc72","\ud835\udc73","\ud835\udc74","\ud835\udc75","\ud835\udc76","\ud835\udc77","\ud835\udc78","\ud835\udc79","\ud835\udc7a","\ud835\udc7b","\ud835\udc7c","\ud835\udc7d","\ud835\udc7e","\ud835\udc7f","\ud835\udc80","\ud835\udc81"],O=["\ud835\udc82","\ud835\udc83","\ud835\udc84","\ud835\udc85","\ud835\udc86","\ud835\udc87","\ud835\udc88","\ud835\udc89","\ud835\udc8a","\ud835\udc8b","\ud835\udc8c","\ud835\udc8d","\ud835\udc8e","\ud835\udc8f","\ud835\udc90","\ud835\udc91","\ud835\udc92","\ud835\udc93","\ud835\udc94","\ud835\udc95","\ud835\udc96","\ud835\udc97","\ud835\udc98","\ud835\udc99","\ud835\udc9a","\ud835\udc9b"],x=["\ud835\udc9c","\u212c","\ud835\udc9e","\ud835\udc9f","\u2130","\u2131","\ud835\udca2","\u210b","\u2110","\ud835\udca5","\ud835\udca6","\u2112","\u2133","\ud835\udca9","\ud835\udcaa","\ud835\udcab","\ud835\udcac","\u211b","\ud835\udcae","\ud835\udcaf","\ud835\udcb0","\ud835\udcb1","\ud835\udcb2","\ud835\udcb3","\ud835\udcb4","\ud835\udcb5","\u2118"],E=["\ud835\udcb6","\ud835\udcb7","\ud835\udcb8","\ud835\udcb9","\u212f","\ud835\udcbb","\u210a","\ud835\udcbd","\ud835\udcbe","\ud835\udcbf","\ud835\udcc0","\ud835\udcc1","\ud835\udcc2","\ud835\udcc3","\u2134","\ud835\udcc5","\ud835\udcc6","\ud835\udcc7","\ud835\udcc8","\ud835\udcc9","\ud835\udcca","\ud835\udccb","\ud835\udccc","\ud835\udccd","\ud835\udcce","\ud835\udccf","\u2113"],A=["\ud835\udcd0","\ud835\udcd1","\ud835\udcd2","\ud835\udcd3","\ud835\udcd4","\ud835\udcd5","\ud835\udcd6","\ud835\udcd7","\ud835\udcd8","\ud835\udcd9","\ud835\udcda","\ud835\udcdb","\ud835\udcdc","\ud835\udcdd","\ud835\udcde","\ud835\udcdf","\ud835\udce0","\ud835\udce1","\ud835\udce2","\ud835\udce3","\ud835\udce4","\ud835\udce5","\ud835\udce6","\ud835\udce7","\ud835\udce8","\ud835\udce9"],C=["\ud835\udcea","\ud835\udceb","\ud835\udcec","\ud835\udced","\ud835\udcee","\ud835\udcef","\ud835\udcf0","\ud835\udcf1","\ud835\udcf2","\ud835\udcf3","\ud835\udcf4","\ud835\udcf5","\ud835\udcf6","\ud835\udcf7","\ud835\udcf8","\ud835\udcf9","\ud835\udcfa","\ud835\udcfb","\ud835\udcfc","\ud835\udcfd","\ud835\udcfe","\ud835\udcff","\ud835\udd00","\ud835\udd01","\ud835\udd02","\ud835\udd03"],T=["\ud835\udd04","\ud835\udd05","\u212d","\ud835\udd07","\ud835\udd08","\ud835\udd09","\ud835\udd0a","\u210c","\u2111","\ud835\udd0d","\ud835\udd0e","\ud835\udd0f","\ud835\udd10","\ud835\udd11","\ud835\udd12","\ud835\udd13","\ud835\udd14","\u211c","\ud835\udd16","\ud835\udd17","\ud835\udd18","\ud835\udd19","\ud835\udd1a","\ud835\udd1b","\ud835\udd1c","\u2128"],N=["\ud835\udd1e","\ud835\udd1f","\ud835\udd20","\ud835\udd21","\ud835\udd22","\ud835\udd23","\ud835\udd24","\ud835\udd25","\ud835\udd26","\ud835\udd27","\ud835\udd28","\ud835\udd29","\ud835\udd2a","\ud835\udd2b","\ud835\udd2c","\ud835\udd2d","\ud835\udd2e","\ud835\udd2f","\ud835\udd30","\ud835\udd31","\ud835\udd32","\ud835\udd33","\ud835\udd34","\ud835\udd35","\ud835\udd36","\ud835\udd37"],w=["\ud835\udd38","\ud835\udd39","\u2102","\ud835\udd3b","\ud835\udd3c","\ud835\udd3d","\ud835\udd3e","\u210d","\ud835\udd40","\ud835\udd41","\ud835\udd42","\ud835\udd43","\ud835\udd44","\u2115","\ud835\udd46","\u2119","\u211a","\u211d","\ud835\udd4a","\ud835\udd4b","\ud835\udd4c","\ud835\udd4d","\ud835\udd4e","\ud835\udd4f","\ud835\udd50","\u2124"],L=["\ud835\udd52","\ud835\udd53","\ud835\udd54","\ud835\udd55","\ud835\udd56","\ud835\udd57","\ud835\udd58","\ud835\udd59","\ud835\udd5a","\ud835\udd5b","\ud835\udd5c","\ud835\udd5d","\ud835\udd5e","\ud835\udd5f","\ud835\udd60","\ud835\udd61","\ud835\udd62","\ud835\udd63","\ud835\udd64","\ud835\udd65","\ud835\udd66","\ud835\udd67","\ud835\udd68","\ud835\udd69","\ud835\udd6a","\ud835\udd6b"],I=["\ud835\udd6c","\ud835\udd6d","\ud835\udd6e","\ud835\udd6f","\ud835\udd70","\ud835\udd71","\ud835\udd72","\ud835\udd73","\ud835\udd74","\ud835\udd75","\ud835\udd76","\ud835\udd77","\ud835\udd78","\ud835\udd79","\ud835\udd7a","\ud835\udd7b","\ud835\udd7c","\ud835\udd7d","\ud835\udd7e","\ud835\udd7f","\ud835\udd80","\ud835\udd81","\ud835\udd82","\ud835\udd83","\ud835\udd84","\ud835\udd85"],P=["\ud835\udd86","\ud835\udd87","\ud835\udd88","\ud835\udd89","\ud835\udd8a","\ud835\udd8b","\ud835\udd8c","\ud835\udd8d","\ud835\udd8e","\ud835\udd8f","\ud835\udd90","\ud835\udd91","\ud835\udd92","\ud835\udd93","\ud835\udd94","\ud835\udd95","\ud835\udd96","\ud835\udd97","\ud835\udd98","\ud835\udd99","\ud835\udd9a","\ud835\udd9b","\ud835\udd9c","\ud835\udd9d","\ud835\udd9e","\ud835\udd9f"],R=["\ud835\udda0","\ud835\udda1","\ud835\udda2","\ud835\udda3","\ud835\udda4","\ud835\udda5","\ud835\udda6","\ud835\udda7","\ud835\udda8","\ud835\udda9","\ud835\uddaa","\ud835\uddab","\ud835\uddac","\ud835\uddad","\ud835\uddae","\ud835\uddaf","\ud835\uddb0","\ud835\uddb1","\ud835\uddb2","\ud835\uddb3","\ud835\uddb4","\ud835\uddb5","\ud835\uddb6","\ud835\uddb7","\ud835\uddb8","\ud835\uddb9"],k=["\ud835\uddba","\ud835\uddbb","\ud835\uddbc","\ud835\uddbd","\ud835\uddbe","\ud835\uddbf","\ud835\uddc0","\ud835\uddc1","\ud835\uddc2","\ud835\uddc3","\ud835\uddc4","\ud835\uddc5","\ud835\uddc6","\ud835\uddc7","\ud835\uddc8","\ud835\uddc9","\ud835\uddca","\ud835\uddcb","\ud835\uddcc","\ud835\uddcd","\ud835\uddce","\ud835\uddcf","\ud835\uddd0","\ud835\uddd1","\ud835\uddd2","\ud835\uddd3"],j=["\ud835\uddd4","\ud835\uddd5","\ud835\uddd6","\ud835\uddd7","\ud835\uddd8","\ud835\uddd9","\ud835\uddda","\ud835\udddb","\ud835\udddc","\ud835\udddd","\ud835\uddde","\ud835\udddf","\ud835\udde0","\ud835\udde1","\ud835\udde2","\ud835\udde3","\ud835\udde4","\ud835\udde5","\ud835\udde6","\ud835\udde7","\ud835\udde8","\ud835\udde9","\ud835\uddea","\ud835\uddeb","\ud835\uddec","\ud835\udded"],B=["\ud835\uddee","\ud835\uddef","\ud835\uddf0","\ud835\uddf1","\ud835\uddf2","\ud835\uddf3","\ud835\uddf4","\ud835\uddf5","\ud835\uddf6","\ud835\uddf7","\ud835\uddf8","\ud835\uddf9","\ud835\uddfa","\ud835\uddfb","\ud835\uddfc","\ud835\uddfd","\ud835\uddfe","\ud835\uddff","\ud835\ude00","\ud835\ude01","\ud835\ude02","\ud835\ude03","\ud835\ude04","\ud835\ude05","\ud835\ude06","\ud835\ude07"],D=["\ud835\ude08","\ud835\ude09","\ud835\ude0a","\ud835\ude0b","\ud835\ude0c","\ud835\ude0d","\ud835\ude0e","\ud835\ude0f","\ud835\ude10","\ud835\ude11","\ud835\ude12","\ud835\ude13","\ud835\ude14","\ud835\ude15","\ud835\ude16","\ud835\ude17","\ud835\ude18","\ud835\ude19","\ud835\ude1a","\ud835\ude1b","\ud835\ude1c","\ud835\ude1d","\ud835\ude1e","\ud835\ude1f","\ud835\ude20","\ud835\ude21"],F=["\ud835\ude22","\ud835\ude23","\ud835\ude24","\ud835\ude25","\ud835\ude26","\ud835\ude27","\ud835\ude28","\ud835\ude29","\ud835\ude2a","\ud835\ude2b","\ud835\ude2c","\ud835\ude2d","\ud835\ude2e","\ud835\ude2f","\ud835\ude30","\ud835\ude31","\ud835\ude32","\ud835\ude33","\ud835\ude34","\ud835\ude35","\ud835\ude36","\ud835\ude37","\ud835\ude38","\ud835\ude39","\ud835\ude3a","\ud835\ude3b"],H=["\ud835\ude3c","\ud835\ude3d","\ud835\ude3e","\ud835\ude3f","\ud835\ude40","\ud835\ude41","\ud835\ude42","\ud835\ude43","\ud835\ude44","\ud835\ude45","\ud835\ude46","\ud835\ude47","\ud835\ude48","\ud835\ude49","\ud835\ude4a","\ud835\ude4b","\ud835\ude4c","\ud835\ude4d","\ud835\ude4e","\ud835\ude4f","\ud835\ude50","\ud835\ude51","\ud835\ude52","\ud835\ude53","\ud835\ude54","\ud835\ude55"],U=["\ud835\ude56","\ud835\ude57","\ud835\ude58","\ud835\ude59","\ud835\ude5a","\ud835\ude5b","\ud835\ude5c","\ud835\ude5d","\ud835\ude5e","\ud835\ude5f","\ud835\ude60","\ud835\ude61","\ud835\ude62","\ud835\ude63","\ud835\ude64","\ud835\ude65","\ud835\ude66","\ud835\ude67","\ud835\ude68","\ud835\ude69","\ud835\ude6a","\ud835\ude6b","\ud835\ude6c","\ud835\ude6d","\ud835\ude6e","\ud835\ude6f"],X=["\ud835\ude70","\ud835\ude71","\ud835\ude72","\ud835\ude73","\ud835\ude74","\ud835\ude75","\ud835\ude76","\ud835\ude77","\ud835\ude78","\ud835\ude79","\ud835\ude7a","\ud835\ude7b","\ud835\ude7c","\ud835\ude7d","\ud835\ude7e","\ud835\ude7f","\ud835\ude80","\ud835\ude81","\ud835\ude82","\ud835\ude83","\ud835\ude84","\ud835\ude85","\ud835\ude86","\ud835\ude87","\ud835\ude88","\ud835\ude89"],V=["\ud835\ude8a","\ud835\ude8b","\ud835\ude8c","\ud835\ude8d","\ud835\ude8e","\ud835\ude8f","\ud835\ude90","\ud835\ude91","\ud835\ude92","\ud835\ude93","\ud835\ude94","\ud835\ude95","\ud835\ude96","\ud835\ude97","\ud835\ude98","\ud835\ude99","\ud835\ude9a","\ud835\ude9b","\ud835\ude9c","\ud835\ude9d","\ud835\ude9e","\ud835\ude9f","\ud835\udea0","\ud835\udea1","\ud835\udea2","\ud835\udea3"],q=["\u2145","\u2146","\u2147","\u2148","\u2149"],W=["\u0391","\u0392","\u0393","\u0394","\u0395","\u0396","\u0397","\u0398","\u0399","\u039a","\u039b","\u039c","\u039d","\u039e","\u039f","\u03a0","\u03a1","\u03a3","\u03a4","\u03a5","\u03a6","\u03a7","\u03a8","\u03a9"],G=["\u03b1","\u03b2","\u03b3","\u03b4","\u03b5","\u03b6","\u03b7","\u03b8","\u03b9","\u03ba","\u03bb","\u03bc","\u03bd","\u03be","\u03bf","\u03c0","\u03c1","\u03c2","\u03c3","\u03c4","\u03c5","\u03c6","\u03c7","\u03c8","\u03c9"],z=["\ud835\udea8","\ud835\udea9","\ud835\udeaa","\ud835\udeab","\ud835\udeac","\ud835\udead","\ud835\udeae","\ud835\udeaf","\ud835\udeb0","\ud835\udeb1","\ud835\udeb2","\ud835\udeb3","\ud835\udeb4","\ud835\udeb5","\ud835\udeb6","\ud835\udeb7","\ud835\udeb8","\ud835\udeba","\ud835\udebb","\ud835\udebc","\ud835\udebd","\ud835\udebe","\ud835\udebf","\ud835\udec0"],J=["\ud835\udec2","\ud835\udec3","\ud835\udec4","\ud835\udec5","\ud835\udec6","\ud835\udec7","\ud835\udec8","\ud835\udec9","\ud835\udeca","\ud835\udecb","\ud835\udecc","\ud835\udecd","\ud835\udece","\ud835\udecf","\ud835\uded0","\ud835\uded1","\ud835\uded2","\ud835\uded3","\ud835\uded4","\ud835\uded5","\ud835\uded6","\ud835\uded7","\ud835\uded8","\ud835\uded9","\ud835\udeda"],K=["\ud835\udee2","\ud835\udee3","\ud835\udee4","\ud835\udee5","\ud835\udee6","\ud835\udee7","\ud835\udee8","\ud835\udee9","\ud835\udeea","\ud835\udeeb","\ud835\udeec","\ud835\udeed","\ud835\udeee","\ud835\udeef","\ud835\udef0","\ud835\udef1","\ud835\udef2","\ud835\udef4","\ud835\udef5","\ud835\udef6","\ud835\udef7","\ud835\udef8","\ud835\udef9","\ud835\udefa"],$=["\ud835\udefc","\ud835\udefd","\ud835\udefe","\ud835\udeff","\ud835\udf00","\ud835\udf01","\ud835\udf02","\ud835\udf03","\ud835\udf04","\ud835\udf05","\ud835\udf06","\ud835\udf07","\ud835\udf08","\ud835\udf09","\ud835\udf0a","\ud835\udf0b","\ud835\udf0c","\ud835\udf0d","\ud835\udf0e","\ud835\udf0f","\ud835\udf10","\ud835\udf11","\ud835\udf12","\ud835\udf13","\ud835\udf14"],Y=["\ud835\udf1c","\ud835\udf1d","\ud835\udf1e","\ud835\udf1f","\ud835\udf20","\ud835\udf21","\ud835\udf22","\ud835\udf23","\ud835\udf24","\ud835\udf25","\ud835\udf26","\ud835\udf27","\ud835\udf28","\ud835\udf29","\ud835\udf2a","\ud835\udf2b","\ud835\udf2c","\ud835\udf2e","\ud835\udf2f","\ud835\udf30","\ud835\udf31","\ud835\udf32","\ud835\udf33","\ud835\udf34"],Z=["\ud835\udf36","\ud835\udf37","\ud835\udf38","\ud835\udf39","\ud835\udf3a","\ud835\udf3b","\ud835\udf3c","\ud835\udf3d","\ud835\udf3e","\ud835\udf3f","\ud835\udf40","\ud835\udf41","\ud835\udf42","\ud835\udf43","\ud835\udf44","\ud835\udf45","\ud835\udf46","\ud835\udf47","\ud835\udf48","\ud835\udf49","\ud835\udf4a","\ud835\udf4b","\ud835\udf4c","\ud835\udf4d","\ud835\udf4e"],Q=["\ud835\udf56","\ud835\udf57","\ud835\udf58","\ud835\udf59","\ud835\udf5a","\ud835\udf5b","\ud835\udf5c","\ud835\udf5d","\ud835\udf5e","\ud835\udf5f","\ud835\udf60","\ud835\udf61","\ud835\udf62","\ud835\udf63","\ud835\udf64","\ud835\udf65","\ud835\udf66","\ud835\udf68","\ud835\udf69","\ud835\udf6a","\ud835\udf6b","\ud835\udf6c","\ud835\udf6d","\ud835\udf6e"],tt=["\ud835\udf70","\ud835\udf71","\ud835\udf72","\ud835\udf73","\ud835\udf74","\ud835\udf75","\ud835\udf76","\ud835\udf77","\ud835\udf78","\ud835\udf79","\ud835\udf7a","\ud835\udf7b","\ud835\udf7c","\ud835\udf7d","\ud835\udf7e","\ud835\udf7f","\ud835\udf80","\ud835\udf81","\ud835\udf82","\ud835\udf83","\ud835\udf84","\ud835\udf85","\ud835\udf86","\ud835\udf87","\ud835\udf88"],et=["\ud835\udf90","\ud835\udf91","\ud835\udf92","\ud835\udf93","\ud835\udf94","\ud835\udf95","\ud835\udf96","\ud835\udf97","\ud835\udf98","\ud835\udf99","\ud835\udf9a","\ud835\udf9b","\ud835\udf9c","\ud835\udf9d","\ud835\udf9e","\ud835\udf9f","\ud835\udfa0","\ud835\udfa2","\ud835\udfa3","\ud835\udfa4","\ud835\udfa5","\ud835\udfa6","\ud835\udfa7","\ud835\udfa8"],rt=["\ud835\udfaa","\ud835\udfab","\ud835\udfac","\ud835\udfad","\ud835\udfae","\ud835\udfaf","\ud835\udfb0","\ud835\udfb1","\ud835\udfb2","\ud835\udfb3","\ud835\udfb4","\ud835\udfb5","\ud835\udfb6","\ud835\udfb7","\ud835\udfb8","\ud835\udfb9","\ud835\udfba","\ud835\udfbb","\ud835\udfbc","\ud835\udfbd","\ud835\udfbe","\ud835\udfbf","\ud835\udfc0","\ud835\udfc1","\ud835\udfc2"],nt=["\u213c","\u213d","\u213e","\u213f"],ot=["\u03d0","\u03d1","\u03d5","\u03d6","\u03d7","\u03f0","\u03f1","\u03f5","\u03f6","\u03f4"],it=["\ud835\udedc","\ud835\udedd","\ud835\udede","\ud835\udedf","\ud835\udee0","\ud835\udee1"],st=["\ud835\udf16","\ud835\udf17","\ud835\udf18","\ud835\udf19","\ud835\udf1a","\ud835\udf1b"],at=["\ud835\udf8a","\ud835\udf8b","\ud835\udf8c","\ud835\udf8d","\ud835\udf8e","\ud835\udf8f"],lt=["\u2135","\u2136","\u2137","\u2138"],ct=d.concat(m,y,g,b,v,_,M,O,S,x,E,A,C,T,N,w,L,I,P,R,k,j,B,D,F,H,U,X,V,q,W,G,z,J,K,$,Y,Z,Q,tt,nt,ot,et,rt,it,st,at,lt);e.allLettersRegExp=new RegExp(ct.join("|"));const ut=["+","\xb1","\u2213","\u2214","\u2227","\u2228","\u2229","\u222a","\u228c","\u228d","\u228e","\u2293","\u2294","\u229d","\u229e","\u22a4","\u22a5","\u22ba","\u22bb","\u22bc","\u22c4","\u22ce","\u22cf","\u22d2","\u22d3","\u2a5e","\u2295","\u22d4"],pt=String.fromCodePoint(8292);ut.push(pt);const ht=["\u2020","\u2021","\u2210","\u2217","\u2218","\u2219","\u2240","\u229a","\u229b","\u22a0","\u22a1","\u22c5","\u22c6","\u22c7","\u22c8","\u22c9","\u22ca","\u22cb","\u22cc","\u25cb","\xb7","*","\u2297","\u2299"],ft=String.fromCodePoint(8290);ht.push(ft);const dt=String.fromCodePoint(8289),mt=["\xbc","\xbd","\xbe","\u2150","\u2151","\u2152","\u2153","\u2154","\u2155","\u2156","\u2157","\u2158","\u2159","\u215a","\u215b","\u215c","\u215d","\u215e","\u215f","\u2189"],yt=["\xb2","\xb3","\xb9","\u2070","\u2074","\u2075","\u2076","\u2077","\u2078","\u2079"].concat(["\u2080","\u2081","\u2082","\u2083","\u2084","\u2085","\u2086","\u2087","\u2088","\u2089"],["\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246a","\u246b","\u246c","\u246d","\u246e","\u246f","\u2470","\u2471","\u2472","\u2473","\u24ea","\u24eb","\u24ec","\u24ed","\u24ee","\u24ef","\u24f0","\u24f1","\u24f2","\u24f3","\u24f4","\u24f5","\u24f6","\u24f7","\u24f8","\u24f9","\u24fa","\u24fb","\u24fc","\u24fd","\u24fe","\u24ff","\u2776","\u2777","\u2778","\u2779","\u277a","\u277b","\u277c","\u277d","\u277e","\u277f","\u2780","\u2781","\u2782","\u2783","\u2784","\u2785","\u2786","\u2787","\u2788","\u2789","\u278a","\u278b","\u278c","\u278d","\u278e","\u278f","\u2790","\u2791","\u2792","\u2793","\u3248","\u3249","\u324a","\u324b","\u324c","\u324d","\u324e","\u324f","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325a","\u325b","\u325c","\u325d","\u325e","\u325f","\u32b1","\u32b2","\u32b3","\u32b4","\u32b5","\u32b6","\u32b7","\u32b8","\u32b9","\u32ba","\u32bb","\u32bc","\u32bd","\u32be","\u32bf"],["\u2474","\u2475","\u2476","\u2477","\u2478","\u2479","\u247a","\u247b","\u247c","\u247d","\u247e","\u247f","\u2480","\u2481","\u2482","\u2483","\u2484","\u2485","\u2486","\u2487"],["\u2488","\u2489","\u248a","\u248b","\u248c","\u248d","\u248e","\u248f","\u2490","\u2491","\u2492","\u2493","\u2494","\u2495","\u2496","\u2497","\u2498","\u2499","\u249a","\u249b","\ud83c\udd00","\ud83c\udd01","\ud83c\udd02","\ud83c\udd03","\ud83c\udd04","\ud83c\udd05","\ud83c\udd06","\ud83c\udd07","\ud83c\udd08","\ud83c\udd09","\ud83c\udd0a"]),gt=["cos","cot","csc","sec","sin","tan","arccos","arccot","arccsc","arcsec","arcsin","arctan","arc cos","arc cot","arc csc","arc sec","arc sin","arc tan"].concat(["cosh","coth","csch","sech","sinh","tanh","arcosh","arcoth","arcsch","arsech","arsinh","artanh","arccosh","arccoth","arccsch","arcsech","arcsinh","arctanh"],["deg","det","dim","hom","ker","Tr","tr"],["log","ln","lg","exp","expt","gcd","gcd","arg","im","re","Pr"]),bt=[{set:["!",'"',"#","%","&",";","?","@","\\","\xa1","\xa7","\xb6","\xbf","\u2017","\u2020","\u2021","\u2022","\u2023","\u2024","\u2025","\u2027","\u2030","\u2031","\u2038","\u203b","\u203c","\u203d","\u203e","\u2041","\u2042","\u2043","\u2047","\u2048","\u2049","\u204b","\u204c","\u204d","\u204e","\u204f","\u2050","\u2051","\u2053","\u2055","\u2056","\u2058","\u2059","\u205a","\u205b","\u205c","\u205d","\u205e","\ufe10","\ufe14","\ufe15","\ufe16","\ufe30","\ufe45","\ufe46","\ufe49","\ufe4a","\ufe4b","\ufe4c","\ufe54","\ufe56","\ufe57","\ufe5f","\ufe60","\ufe61","\ufe68","\ufe6a","\ufe6b","\uff01","\uff02","\uff03","\uff05","\uff06","\uff07","\uff0a","\uff0f","\uff1b","\uff1f","\uff20","\uff3c"],type:"punctuation",role:"unknown"},{set:["\ufe13",":","\uff1a","\ufe55"],type:"punctuation",role:"colon"},{set:n,type:"punctuation",role:"comma"},{set:["\u2026","\u22ee","\u22ef","\u22f0","\u22f1","\ufe19"],type:"punctuation",role:"ellipsis"},{set:[".","\ufe52","\uff0e"],type:"punctuation",role:"fullstop"},{set:o,type:"operator",role:"dash"},{set:i,type:"operator",role:"tilde"},{set:["'","\u2032","\u2033","\u2034","\u2035","\u2036","\u2037","\u2057","\u02b9","\u02ba"],type:"punctuation",role:"prime"},{set:["\xb0"],type:"punctuation",role:"degree"},{set:l,type:"fence",role:"open"},{set:c,type:"fence",role:"close"},{set:u,type:"fence",role:"top"},{set:p,type:"fence",role:"bottom"},{set:h,type:"fence",role:"neutral"},{set:f,type:"fence",role:"metric"},{set:m,type:"identifier",role:"latinletter",font:"normal"},{set:d,type:"identifier",role:"latinletter",font:"normal"},{set:g,type:"identifier",role:"latinletter",font:"normal"},{set:y,type:"identifier",role:"latinletter",font:"normal"},{set:v,type:"identifier",role:"latinletter",font:"bold"},{set:b,type:"identifier",role:"latinletter",font:"bold"},{set:S,type:"identifier",role:"latinletter",font:"italic"},{set:_,type:"identifier",role:"latinletter",font:"italic"},{set:O,type:"identifier",role:"latinletter",font:"bold-italic"},{set:M,type:"identifier",role:"latinletter",font:"bold-italic"},{set:E,type:"identifier",role:"latinletter",font:"script"},{set:x,type:"identifier",role:"latinletter",font:"script"},{set:C,type:"identifier",role:"latinletter",font:"bold-script"},{set:A,type:"identifier",role:"latinletter",font:"bold-script"},{set:N,type:"identifier",role:"latinletter",font:"fraktur"},{set:T,type:"identifier",role:"latinletter",font:"fraktur"},{set:L,type:"identifier",role:"latinletter",font:"double-struck"},{set:w,type:"identifier",role:"latinletter",font:"double-struck"},{set:P,type:"identifier",role:"latinletter",font:"bold-fraktur"},{set:I,type:"identifier",role:"latinletter",font:"bold-fraktur"},{set:k,type:"identifier",role:"latinletter",font:"sans-serif"},{set:R,type:"identifier",role:"latinletter",font:"sans-serif"},{set:B,type:"identifier",role:"latinletter",font:"sans-serif-bold"},{set:j,type:"identifier",role:"latinletter",font:"sans-serif-bold"},{set:F,type:"identifier",role:"latinletter",font:"sans-serif-italic"},{set:D,type:"identifier",role:"latinletter",font:"sans-serif-italic"},{set:U,type:"identifier",role:"latinletter",font:"sans-serif-bold-italic"},{set:H,type:"identifier",role:"latinletter",font:"sans-serif-bold-italic"},{set:V,type:"identifier",role:"latinletter",font:"monospace"},{set:X,type:"identifier",role:"latinletter",font:"monospace"},{set:q,type:"identifier",role:"latinletter",font:"double-struck-italic"},{set:G,type:"identifier",role:"greekletter",font:"normal"},{set:W,type:"identifier",role:"greekletter",font:"normal"},{set:J,type:"identifier",role:"greekletter",font:"bold"},{set:z,type:"identifier",role:"greekletter",font:"bold"},{set:$,type:"identifier",role:"greekletter",font:"italic"},{set:K,type:"identifier",role:"greekletter",font:"italic"},{set:Z,type:"identifier",role:"greekletter",font:"bold-italic"},{set:Y,type:"identifier",role:"greekletter",font:"bold-italic"},{set:tt,type:"identifier",role:"greekletter",font:"sans-serif-bold"},{set:Q,type:"identifier",role:"greekletter",font:"sans-serif-bold"},{set:et,type:"identifier",role:"greekletter",font:"sans-serif-bold-italic"},{set:rt,type:"identifier",role:"greekletter",font:"sans-serif-bold-italic"},{set:nt,type:"identifier",role:"greekletter",font:"double-struck"},{set:ot,type:"identifier",role:"greekletter",font:"normal"},{set:it,type:"identifier",role:"greekletter",font:"bold"},{set:st,type:"identifier",role:"greekletter",font:"italic"},{set:at,type:"identifier",role:"greekletter",font:"sans-serif-bold"},{set:lt,type:"identifier",role:"otherletter",font:"normal"},{set:["0","1","2","3","4","5","6","7","8","9"],type:"number",role:"integer",font:"normal"},{set:["\uff10","\uff11","\uff12","\uff13","\uff14","\uff15","\uff16","\uff17","\uff18","\uff19"],type:"number",role:"integer",font:"normal"},{set:["\ud835\udfce","\ud835\udfcf","\ud835\udfd0","\ud835\udfd1","\ud835\udfd2","\ud835\udfd3","\ud835\udfd4","\ud835\udfd5","\ud835\udfd6","\ud835\udfd7"],type:"number",role:"integer",font:"bold"},{set:["\ud835\udfd8","\ud835\udfd9","\ud835\udfda","\ud835\udfdb","\ud835\udfdc","\ud835\udfdd","\ud835\udfde","\ud835\udfdf","\ud835\udfe0","\ud835\udfe1"],type:"number",role:"integer",font:"double-struck"},{set:["\ud835\udfe2","\ud835\udfe3","\ud835\udfe4","\ud835\udfe5","\ud835\udfe6","\ud835\udfe7","\ud835\udfe8","\ud835\udfe9","\ud835\udfea","\ud835\udfeb"],type:"number",role:"integer",font:"sans-serif"},{set:["\ud835\udfec","\ud835\udfed","\ud835\udfee","\ud835\udfef","\ud835\udff0","\ud835\udff1","\ud835\udff2","\ud835\udff3","\ud835\udff4","\ud835\udff5"],type:"number",role:"integer",font:"sans-serif-bold"},{set:["\ud835\udff6","\ud835\udff7","\ud835\udff8","\ud835\udff9","\ud835\udffa","\ud835\udffb","\ud835\udffc","\ud835\udffd","\ud835\udffe","\ud835\udfff"],type:"number",role:"integer",font:"monospace"},{set:mt,type:"number",role:"float"},{set:yt,type:"number",role:"othernumber"},{set:ut,type:"operator",role:"addition"},{set:ht,type:"operator",role:"multiplication"},{set:["\xaf","-","\u2052","\u207b","\u208b","\u2212","\u2216","\u2238","\u2242","\u2296","\u229f","\u2796","\u2a29","\u2a2a","\u2a2b","\u2a2c","\u2a3a","\u2a41","\ufe63","\uff0d","\u2010","\u2011"],type:"operator",role:"subtraction"},{set:["/","\xf7","\u2044","\u2215","\u2298","\u27cc","\u29bc","\u2a38"],type:"operator",role:"division"},{set:["\u2200","\u2203","\u2206","\u2207","\u2202","\u2201","\u2204"],type:"operator",role:"prefix operator"},{set:["\ud835\udec1","\ud835\udedb","\ud835\udfca","\ud835\udfcb"],type:"operator",role:"prefix operator",font:"bold"},{set:["\ud835\udefb","\ud835\udf15"],type:"operator",role:"prefix operator",font:"italic"},{set:["\ud835\udf6f","\ud835\udf89"],type:"operator",role:"prefix operator",font:"sans-serif-bold"},{set:["=","~","\u207c","\u208c","\u223c","\u223d","\u2243","\u2245","\u2248","\u224a","\u224b","\u224c","\u224d","\u224e","\u2251","\u2252","\u2253","\u2254","\u2255","\u2256","\u2257","\u2258","\u2259","\u225a","\u225b","\u225c","\u225d","\u225e","\u225f","\u2261","\u2263","\u29e4","\u2a66","\u2a6e","\u2a6f","\u2a70","\u2a71","\u2a72","\u2a73","\u2a74","\u2a75","\u2a76","\u2a77","\u2a78","\u22d5","\u2a6d","\u2a6a","\u2a6b","\u2a6c","\ufe66","\uff1d","\u2a6c","\u229c","\u2237"],type:"relation",role:"equality"},{set:["<",">","\u2241","\u2242","\u2244","\u2246","\u2247","\u2249","\u224f","\u2250","\u2260","\u2262","\u2264","\u2265","\u2266","\u2267","\u2268","\u2269","\u226a","\u226b","\u226c","\u226d","\u226e","\u226f","\u2270","\u2271","\u2272","\u2273","\u2274","\u2275","\u2276","\u2277","\u2278","\u2279","\u227a","\u227b","\u227c","\u227d","\u227e","\u227f","\u2280","\u2281","\u22d6","\u22d7","\u22d8","\u22d9","\u22da","\u22db","\u22dc","\u22dd","\u22de","\u22df","\u22e0","\u22e1","\u22e6","\u22e7","\u22e8","\u22e9","\u2a79","\u2a7a","\u2a7b","\u2a7c","\u2a7d","\u2a7e","\u2a7f","\u2a80","\u2a81","\u2a82","\u2a83","\u2a84","\u2a85","\u2a86","\u2a87","\u2a88","\u2a89","\u2a8a","\u2a8b","\u2a8c","\u2a8d","\u2a8e","\u2a8f","\u2a90","\u2a91","\u2a92","\u2a93","\u2a94","\u2a95","\u2a96","\u2a97","\u2a98","\u2a99","\u2a9a","\u2a9b","\u2a9c","\u2a9d","\u2a9e","\u2a9f","\u2aa0","\u2aa1","\u2aa2","\u2aa3","\u2aa4","\u2aa5","\u2aa6","\u2aa7","\u2aa8","\u2aa9","\u2aaa","\u2aab","\u2aac","\u2aad","\u2aae","\u2aaf","\u2ab0","\u2ab1","\u2ab2","\u2ab3","\u2ab4","\u2ab5","\u2ab6","\u2ab7","\u2ab8","\u2ab9","\u2aba","\u2abb","\u2abc","\u2af7","\u2af8","\u2af9","\u2afa","\u29c0","\u29c1","\ufe64","\ufe65","\uff1c","\uff1e"],type:"relation",role:"inequality"},{set:["\u22e2","\u22e3","\u22e4","\u22e5","\u2282","\u2283","\u2284","\u2285","\u2286","\u2287","\u2288","\u2289","\u228a","\u228b","\u228f","\u2290","\u2291","\u2292","\u2abd","\u2abe","\u2abf","\u2ac0","\u2ac1","\u2ac2","\u2ac3","\u2ac4","\u2ac5","\u2ac6","\u2ac7","\u2ac8","\u2ac9","\u2aca","\u2acb","\u2acc","\u2acd","\u2ace","\u2acf","\u2ad0","\u2ad1","\u2ad2","\u2ad3","\u2ad4","\u2ad5","\u2ad6","\u2ad7","\u2ad8","\u22d0","\u22d1","\u22ea","\u22eb","\u22ec","\u22ed","\u22b2","\u22b3","\u22b4","\u22b5"],type:"relation",role:"set"},{set:["\u22a2","\u22a3","\u22a6","\u22a7","\u22a8","\u22a9","\u22aa","\u22ab","\u22ac","\u22ad","\u22ae","\u22af","\u2ade","\u2adf","\u2ae0","\u2ae1","\u2ae2","\u2ae3","\u2ae4","\u2ae5","\u2ae6","\u2ae7","\u2ae8","\u2ae9","\u2aea","\u2aeb","\u2aec","\u2aed"],type:"relation",role:"unknown"},{set:["\u2190","\u2191","\u2192","\u2193","\u2194","\u2195","\u2196","\u2197","\u2198","\u2199","\u219a","\u219b","\u219c","\u219d","\u219e","\u219f","\u21a0","\u21a1","\u21a2","\u21a3","\u21a4","\u21a5","\u21a6","\u21a7","\u21a8","\u21a9","\u21aa","\u21ab","\u21ac","\u21ad","\u21ae","\u21af","\u21b0","\u21b1","\u21b2","\u21b3","\u21b4","\u21b5","\u21b6","\u21b7","\u21b8","\u21b9","\u21ba","\u21bb","\u21c4","\u21c5","\u21c6","\u21c7","\u21c8","\u21c9","\u21ca","\u21cd","\u21ce","\u21cf","\u21d0","\u21d1","\u21d2","\u21d3","\u21d4","\u21d5","\u21d6","\u21d7","\u21d8","\u21d9","\u21da","\u21db","\u21dc","\u21dd","\u21de","\u21df","\u21e0","\u21e1","\u21e2","\u21e3","\u21e4","\u21e5","\u21e6","\u21e7","\u21e8","\u21e9","\u21ea","\u21eb","\u21ec","\u21ed","\u21ee","\u21ef","\u21f0","\u21f1","\u21f2","\u21f3","\u21f4","\u21f5","\u21f6","\u21f7","\u21f8","\u21f9","\u21fa","\u21fb","\u21fc","\u21fd","\u21fe","\u21ff","\u2301","\u2303","\u2304","\u2324","\u238b","\u2794","\u2798","\u2799","\u279a","\u279b","\u279c","\u279d","\u279e","\u279f","\u27a0","\u27a1","\u27a2","\u27a3","\u27a4","\u27a5","\u27a6","\u27a7","\u27a8","\u27a9","\u27aa","\u27ab","\u27ac","\u27ad","\u27ae","\u27af","\u27b1","\u27b2","\u27b3","\u27b4","\u27b5","\u27b6","\u27b7","\u27b8","\u27b9","\u27ba","\u27bb","\u27bc","\u27bd","\u27be","\u27f0","\u27f1","\u27f2","\u27f3","\u27f4","\u27f5","\u27f6","\u27f7","\u27f8","\u27f9","\u27fa","\u27fb","\u27fc","\u27fd","\u27fe","\u27ff","\u2900","\u2901","\u2902","\u2903","\u2904","\u2905","\u2906","\u2907","\u2908","\u2909","\u290a","\u290b","\u290c","\u290d","\u290e","\u290f","\u2910","\u2911","\u2912","\u2913","\u2914","\u2915","\u2916","\u2917","\u2918","\u2919","\u291a","\u291b","\u291c","\u291d","\u291e","\u291f","\u2920","\u2921","\u2922","\u2923","\u2924","\u2925","\u2926","\u2927","\u2928","\u2929","\u292a","\u292d","\u292e","\u292f","\u2930","\u2931","\u2932","\u2933","\u2934","\u2935","\u2936","\u2937","\u2938","\u2939","\u293a","\u293b","\u293c","\u293d","\u293e","\u293f","\u2940","\u2941","\u2942","\u2943","\u2944","\u2945","\u2946","\u2947","\u2948","\u2949","\u2970","\u2971","\u2972","\u2973","\u2974","\u2975","\u2976","\u2977","\u2978","\u2979","\u297a","\u297b","\u29b3","\u29b4","\u29bd","\u29ea","\u29ec","\u29ed","\u2a17","\u2b00","\u2b01","\u2b02","\u2b03","\u2b04","\u2b05","\u2b06","\u2b07","\u2b08","\u2b09","\u2b0a","\u2b0b","\u2b0c","\u2b0d","\u2b0e","\u2b0f","\u2b10","\u2b11","\u2b30","\u2b31","\u2b32","\u2b33","\u2b34","\u2b35","\u2b36","\u2b37","\u2b38","\u2b39","\u2b3a","\u2b3b","\u2b3c","\u2b3d","\u2b3e","\u2b3f","\u2b40","\u2b41","\u2b42","\u2b43","\u2b44","\u2b45","\u2b46","\u2b47","\u2b48","\u2b49","\u2b4a","\u2b4b","\u2b4c","\uffe9","\uffea","\uffeb","\uffec","\u21bc","\u21bd","\u21be","\u21bf","\u21c0","\u21c1","\u21c2","\u21c3","\u21cb","\u21cc","\u294a","\u294b","\u294c","\u294d","\u294e","\u294f","\u2950","\u2951","\u2952","\u2953","\u2954","\u2955","\u2956","\u2957","\u2958","\u2959","\u295a","\u295b","\u295c","\u295d","\u295e","\u295f","\u2960","\u2961","\u2962","\u2963","\u2964","\u2965","\u2966","\u2967","\u2968","\u2969","\u296a","\u296b","\u296c","\u296d","\u296e","\u296f","\u297c","\u297d","\u297e","\u297f"],type:"relation",role:"arrow"},{set:["\u2208","\u220a","\u22f2","\u22f3","\u22f4","\u22f5","\u22f6","\u22f7","\u22f8","\u22f9","\u22ff"],type:"operator",role:"element"},{set:["\u2209"],type:"operator",role:"nonelement"},{set:["\u220b","\u220d","\u22fa","\u22fb","\u22fc","\u22fd","\u22fe"],type:"operator",role:"reelement"},{set:["\u220c"],type:"operator",role:"renonelement"},{set:["\u2140","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a03","\u2a04","\u2a05","\u2a06","\u2a07","\u2a08","\u2a09","\u2a0a","\u2a0b","\u2afc","\u2aff"],type:"largeop",role:"sum"},{set:["\u222b","\u222c","\u222d","\u222e","\u222f","\u2230","\u2231","\u2232","\u2233","\u2a0c","\u2a0d","\u2a0e","\u2a0f","\u2a10","\u2a11","\u2a12","\u2a13","\u2a14","\u2a15","\u2a16","\u2a17","\u2a18","\u2a19","\u2a1a","\u2a1b","\u2a1c"],type:"largeop",role:"integral"},{set:["\u221f","\u2220","\u2221","\u2222","\u22be","\u22bf","\u25b3","\u25b7","\u25bd","\u25c1"],type:"operator",role:"geometry"},{set:["inf","lim","liminf","limsup","max","min","sup","injlim","projlim","inj lim","proj lim"],type:"function",role:"limit function"},{set:gt,type:"function",role:"prefix function"},{set:["mod","rem"],type:"operator",role:"prefix function"}],vt=function(){const t={};for(let e,r=0;e=bt[r];r++)e.set.forEach((function(r){t[r]={role:e.role||"unknown",type:e.type||"unknown",font:e.font||"unknown"}}));return t}();e.equal=function(t,e){return t.type===e.type&&t.role===e.role&&t.font===e.font},e.lookupType=function(t){var e;return(null===(e=vt[t])||void 0===e?void 0:e.type)||"unknown"},e.lookupRole=function(t){var e;return(null===(e=vt[t])||void 0===e?void 0:e.role)||"unknown"},e.lookupMeaning=function(t){return vt[t]||{role:"unknown",type:"unknown",font:"unknown"}},e.invisibleTimes=function(){return ft},e.invisiblePlus=function(){return pt},e.invisibleComma=function(){return r},e.functionApplication=function(){return dt},e.isMatchingFence=function(t,e){return-1!==h.indexOf(t)||-1!==f.indexOf(t)?t===e:s[t]===e||a[t]===e},e.isEmbellishedType=function(t){return"operator"===t||"relation"===t||"fence"===t||"punctuation"===t};const _t=new Map;function St(t,e){return`${t} ${e}`}function Mt(t,e,r=""){for(const n of e)_t.set(St(t,n),r||t)}Mt("d",["d","\u2146","\uff44","\ud835\udc1d","\ud835\udc51","\ud835\udcb9","\ud835\udced","\ud835\udd21","\ud835\udd55","\ud835\udd89","\ud835\uddbd","\ud835\uddf1","\ud835\ude25","\ud835\ude8d"]),Mt("bar",o),Mt("tilde",i),e.lookupSecondary=function(t,e){return _t.get(St(t,e))}},8158:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticMeaningCollator=e.SemanticNodeCollator=e.SemanticDefault=void 0;const n=r(3588),o=r(3882);class i{constructor(){this.map={}}static key(t,e){return e?t+":"+e:t}add(t,e){this.map[i.key(t,e.font)]=e}addNode(t){this.add(t.textContent,t.meaning())}retrieve(t,e){return this.map[i.key(t,e)]}retrieveNode(t){return this.retrieve(t.textContent,t.font)}size(){return Object.keys(this.map).length}}e.SemanticDefault=i;class s{constructor(){this.map={}}add(t,e){const r=this.map[t];r?r.push(e):this.map[t]=[e]}retrieve(t,e){return this.map[i.key(t,e)]}retrieveNode(t){return this.retrieve(t.textContent,t.font)}copy(){const t=this.copyCollator();for(const e in this.map)t.map[e]=this.map[e];return t}minimize(){for(const t in this.map)1===this.map[t].length&&delete this.map[t]}minimalCollator(){const t=this.copy();for(const e in t.map)1===t.map[e].length&&delete t.map[e];return t}isMultiValued(){for(const t in this.map)if(this.map[t].length>1)return!0;return!1}isEmpty(){return!Object.keys(this.map).length}}class a extends s{copyCollator(){return new a}add(t,e){const r=i.key(t,e.font);super.add(r,e)}addNode(t){this.add(t.textContent,t)}toString(){const t=[];for(const e in this.map){const r=Array(e.length+3).join(" "),n=this.map[e],o=[];for(let t,e=0;t=n[e];e++)o.push(t.toString());t.push(e+": "+o.join("\n"+r))}return t.join("\n")}collateMeaning(){const t=new l;for(const e in this.map)t.map[e]=this.map[e].map((function(t){return t.meaning()}));return t}}e.SemanticNodeCollator=a;class l extends s{copyCollator(){return new l}add(t,e){const r=this.retrieve(t,e.font);if(!r||!r.find((function(t){return n.equal(t,e)}))){const r=i.key(t,e.font);super.add(r,e)}}addNode(t){this.add(t.textContent,t.meaning())}toString(){const t=[];for(const e in this.map){const r=Array(e.length+3).join(" "),n=this.map[e],o=[];for(let t,e=0;t=n[e];e++)o.push("{type: "+t.type+", role: "+t.role+", font: "+t.font+"}");t.push(e+": "+o.join("\n"+r))}return t.join("\n")}reduce(){for(const t in this.map)1!==this.map[t].length&&(this.map[t]=(0,o.reduce)(this.map[t]))}default(){const t=new i;for(const e in this.map)1===this.map[e].length&&(t.map[e]=this.map[e][0]);return t}newDefault(){const t=this.default();this.reduce();const e=this.default();return t.size()!==e.size()?e:null}}e.SemanticMeaningCollator=l},9911:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticMultiHeuristic=e.SemanticTreeHeuristic=e.SemanticAbstractHeuristic=void 0;class r{constructor(t,e,r=(t=>!1)){this.name=t,this.apply=e,this.applicable=r}}e.SemanticAbstractHeuristic=r;e.SemanticTreeHeuristic=class extends r{};e.SemanticMultiHeuristic=class extends r{}},7516:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.lookup=e.run=e.add=e.blacklist=e.flags=e.updateFactory=e.factory=void 0,e.factory=null,e.updateFactory=function(t){e.factory=t};const r=new Map;function n(t){return r.get(t)}e.flags={combine_juxtaposition:!0,convert_juxtaposition:!0,multioperator:!0},e.blacklist={},e.add=function(t){const n=t.name;r.set(n,t),e.flags[n]||(e.flags[n]=!1)},e.run=function(t,r,o){const i=n(t);return i&&!e.blacklist[t]&&(e.flags[t]||i.applicable(r))?i.apply(r):o?o(r):r},e.lookup=n},94:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2057),o=r(5897),i=r(3588),s=r(7516),a=r(9911),l=r(5609),c=r(3308),u=r(4795);function p(t,e,r){let n=null;if(!t.length)return n;const o=r[r.length-1],i=o&&o.length,s=e&&e.length,a=c.default.getInstance();if(i&&s){if("infixop"===e[0].type&&"implicit"===e[0].role)return n=t.pop(),o.push(a.postfixNode_(o.pop(),t)),n;n=t.shift();const r=a.prefixNode_(e.shift(),t);return e.unshift(r),n}return i?(o.push(a.postfixNode_(o.pop(),t)),n):(s&&e.unshift(a.prefixNode_(e.shift(),t)),n)}function h(t,e,r){if(!e.length)return t;const o=t.pop(),i=e.shift(),a=r.shift();if(l.isImplicitOp(i)){n.Debugger.getInstance().output("Juxta Heuristic Case 2");const s=(o?[o,i]:[i]).concat(a);return h(t.concat(s),e,r)}if(!o)return n.Debugger.getInstance().output("Juxta Heuristic Case 3"),h([i].concat(a),e,r);const c=a.shift();if(!c){n.Debugger.getInstance().output("Juxta Heuristic Case 9");const a=s.factory.makeBranchNode("infixop",[o,e.shift()],[i],i.textContent);return a.role="implicit",s.run("combine_juxtaposition",a),e.unshift(a),h(t,e,r)}if(l.isOperator(o)||l.isOperator(c))return n.Debugger.getInstance().output("Juxta Heuristic Case 4"),h(t.concat([o,i,c]).concat(a),e,r);let u=null;return l.isImplicitOp(o)&&l.isImplicitOp(c)?(n.Debugger.getInstance().output("Juxta Heuristic Case 5"),o.contentNodes.push(i),o.contentNodes=o.contentNodes.concat(c.contentNodes),o.childNodes.push(c),o.childNodes=o.childNodes.concat(c.childNodes),c.childNodes.forEach((t=>t.parent=o)),i.parent=o,o.addMathmlNodes(i.mathml),o.addMathmlNodes(c.mathml),u=o):l.isImplicitOp(o)?(n.Debugger.getInstance().output("Juxta Heuristic Case 6"),o.contentNodes.push(i),o.childNodes.push(c),c.parent=o,i.parent=o,o.addMathmlNodes(i.mathml),o.addMathmlNodes(c.mathml),u=o):l.isImplicitOp(c)?(n.Debugger.getInstance().output("Juxta Heuristic Case 7"),c.contentNodes.unshift(i),c.childNodes.unshift(o),o.parent=c,i.parent=c,c.addMathmlNodes(i.mathml),c.addMathmlNodes(o.mathml),u=c):(n.Debugger.getInstance().output("Juxta Heuristic Case 8"),u=s.factory.makeBranchNode("infixop",[o,c],[i],i.textContent),u.role="implicit"),t.push(u),h(t.concat(a),e,r)}s.add(new a.SemanticTreeHeuristic("combine_juxtaposition",(function(t){for(let e,r=t.childNodes.length-1;e=t.childNodes[r];r--)l.isImplicitOp(e)&&!e.nobreaking&&(t.childNodes.splice(r,1,...e.childNodes),t.contentNodes.splice(r,0,...e.contentNodes),e.childNodes.concat(e.contentNodes).forEach((function(e){e.parent=t})),t.addMathmlNodes(e.mathml));return t}))),s.add(new a.SemanticTreeHeuristic("propagateSimpleFunction",(t=>("infixop"!==t.type&&"fraction"!==t.type||!t.childNodes.every(l.isSimpleFunction)||(t.role="composed function"),t)),(t=>"clearspeak"===o.default.getInstance().domain))),s.add(new a.SemanticTreeHeuristic("simpleNamedFunction",(t=>("unit"!==t.role&&-1!==["f","g","h","F","G","H"].indexOf(t.textContent)&&(t.role="simple function"),t)),(t=>"clearspeak"===o.default.getInstance().domain))),s.add(new a.SemanticTreeHeuristic("propagateComposedFunction",(t=>("fenced"===t.type&&"composed function"===t.childNodes[0].role&&(t.role="composed function"),t)),(t=>"clearspeak"===o.default.getInstance().domain))),s.add(new a.SemanticTreeHeuristic("multioperator",(t=>{if("unknown"!==t.role||t.textContent.length<=1)return;const e=[...t.textContent].map(i.lookupMeaning).reduce((function(t,e){return t&&e.role&&"unknown"!==e.role&&e.role!==t?"unknown"===t?e.role:null:t}),"unknown");e&&(t.role=e)}))),s.add(new a.SemanticMultiHeuristic("convert_juxtaposition",(t=>{let e=u.partitionNodes(t,(function(t){return t.textContent===i.invisibleTimes()&&"operator"===t.type}));e=e.rel.length?function(t){const e=[],r=[];let n=t.comp.shift(),o=null,i=[];for(;t.comp.length;)if(i=[],n.length)o&&e.push(o),r.push(n),o=t.rel.shift(),n=t.comp.shift();else{for(o&&i.push(o);!n.length&&t.comp.length;)n=t.comp.shift(),i.push(t.rel.shift());o=p(i,n,r)}i.length||n.length?(e.push(o),r.push(n)):(i.push(o),p(i,n,r));return{rel:e,comp:r}}(e):e,t=e.comp[0];for(let r,n,o=1;r=e.comp[o],n=e.rel[o-1];o++)t.push(n),t=t.concat(r);return e=u.partitionNodes(t,(function(t){return t.textContent===i.invisibleTimes()&&("operator"===t.type||"infixop"===t.type)})),e.rel.length?h(e.comp.shift(),e.rel,e.comp):t}))),s.add(new a.SemanticTreeHeuristic("simple2prefix",(t=>(t.textContent.length>1&&!t.textContent[0].match(/[A-Z]/)&&(t.role="prefix function"),t)),(t=>"braille"===o.default.getInstance().modality&&"identifier"===t.type))),s.add(new a.SemanticTreeHeuristic("detect_cycle",(t=>{t.type="matrix",t.role="cycle";const e=t.childNodes[0];return e.type="row",e.role="cycle",e.textContent="",e.contentNodes=[],t}),(t=>"fenced"===t.type&&"infixop"===t.childNodes[0].type&&"implicit"===t.childNodes[0].role&&t.childNodes[0].childNodes.every((function(t){return"number"===t.type}))&&t.childNodes[0].contentNodes.every((function(t){return"space"===t.role})))))},7228:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticMathml=void 0;const n=r(5740),o=r(5250),i=r(5609),s=r(3308),a=r(4795);class l extends o.SemanticAbstractParser{constructor(){super("MathML"),this.parseMap_={SEMANTICS:this.semantics_.bind(this),MATH:this.rows_.bind(this),MROW:this.rows_.bind(this),MPADDED:this.rows_.bind(this),MSTYLE:this.rows_.bind(this),MFRAC:this.fraction_.bind(this),MSUB:this.limits_.bind(this),MSUP:this.limits_.bind(this),MSUBSUP:this.limits_.bind(this),MOVER:this.limits_.bind(this),MUNDER:this.limits_.bind(this),MUNDEROVER:this.limits_.bind(this),MROOT:this.root_.bind(this),MSQRT:this.sqrt_.bind(this),MTABLE:this.table_.bind(this),MLABELEDTR:this.tableLabeledRow_.bind(this),MTR:this.tableRow_.bind(this),MTD:this.tableCell_.bind(this),MS:this.text_.bind(this),MTEXT:this.text_.bind(this),MSPACE:this.space_.bind(this),"ANNOTATION-XML":this.text_.bind(this),MI:this.identifier_.bind(this),MN:this.number_.bind(this),MO:this.operator_.bind(this),MFENCED:this.fenced_.bind(this),MENCLOSE:this.enclosed_.bind(this),MMULTISCRIPTS:this.multiscripts_.bind(this),ANNOTATION:this.empty_.bind(this),NONE:this.empty_.bind(this),MACTION:this.action_.bind(this)};const t={type:"identifier",role:"numbersetletter",font:"double-struck"};["C","H","N","P","Q","R","Z","\u2102","\u210d","\u2115","\u2119","\u211a","\u211d","\u2124"].forEach((e=>this.getFactory().defaultMap.add(e,t)).bind(this))}static getAttribute_(t,e,r){if(!t.hasAttribute(e))return r;const n=t.getAttribute(e);return n.match(/^\s*$/)?null:n}parse(t){s.default.getInstance().setNodeFactory(this.getFactory());const e=n.toArray(t.childNodes),r=n.tagName(t),o=this.parseMap_[r],i=(o||this.dummy_.bind(this))(t,e);return a.addAttributes(i,t),-1!==["MATH","MROW","MPADDED","MSTYLE","SEMANTICS"].indexOf(r)||(i.mathml.unshift(t),i.mathmlTree=t),i}semantics_(t,e){return e.length?this.parse(e[0]):this.getFactory().makeEmptyNode()}rows_(t,e){const r=t.getAttribute("semantics");if(r&&r.match("bspr_"))return s.default.proof(t,r,this.parseList.bind(this));let n;return 1===(e=a.purgeNodes(e)).length?(n=this.parse(e[0]),"empty"!==n.type||n.mathmlTree||(n.mathmlTree=t)):n=s.default.getInstance().row(this.parseList(e)),n.mathml.unshift(t),n}fraction_(t,e){if(!e.length)return this.getFactory().makeEmptyNode();const r=this.parse(e[0]),n=e[1]?this.parse(e[1]):this.getFactory().makeEmptyNode();return s.default.getInstance().fractionLikeNode(r,n,t.getAttribute("linethickness"),"true"===t.getAttribute("bevelled"))}limits_(t,e){return s.default.getInstance().limitNode(n.tagName(t),this.parseList(e))}root_(t,e){return e[1]?this.getFactory().makeBranchNode("root",[this.parse(e[1]),this.parse(e[0])],[]):this.sqrt_(t,e)}sqrt_(t,e){const r=this.parseList(a.purgeNodes(e));return this.getFactory().makeBranchNode("sqrt",[s.default.getInstance().row(r)],[])}table_(t,e){const r=t.getAttribute("semantics");if(r&&r.match("bspr_"))return s.default.proof(t,r,this.parseList.bind(this));const n=this.getFactory().makeBranchNode("table",this.parseList(e),[]);return n.mathmlTree=t,s.default.tableToMultiline(n),n}tableRow_(t,e){const r=this.getFactory().makeBranchNode("row",this.parseList(e),[]);return r.role="table",r}tableLabeledRow_(t,e){if(!e.length)return this.tableRow_(t,e);const r=this.parse(e[0]);r.role="label";const n=this.getFactory().makeBranchNode("row",this.parseList(e.slice(1)),[r]);return n.role="table",n}tableCell_(t,e){const r=this.parseList(a.purgeNodes(e));let n;n=r.length?1===r.length&&i.isType(r[0],"empty")?r:[s.default.getInstance().row(r)]:[];const o=this.getFactory().makeBranchNode("cell",n,[]);return o.role="table",o}space_(t,e){const r=t.getAttribute("width"),o=r&&r.match(/[a-z]*$/);if(!o)return this.empty_(t,e);const i=o[0],a=parseFloat(r.slice(0,o.index)),l={cm:.4,pc:.5,em:.5,ex:1,in:.15,pt:5,mm:5}[i];if(!l||isNaN(a)||a1?this.parse(e[1]):this.getFactory().makeUnprocessed(t)}dummy_(t,e){const r=this.getFactory().makeUnprocessed(t);return r.role=t.tagName,r.textContent=t.textContent,r}leaf_(t,e){if(1===e.length&&e[0].nodeType!==n.NodeType.TEXT_NODE){const r=this.getFactory().makeUnprocessed(t);return r.role=e[0].tagName,a.addAttributes(r,e[0]),r}return this.getFactory().makeLeafNode(t.textContent,s.default.getInstance().font(t.getAttribute("mathvariant")))}}e.SemanticMathml=l},5952:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticNode=void 0;const n=r(5740),o=r(3588),i=r(4795);class s{constructor(t){this.id=t,this.mathml=[],this.parent=null,this.type="unknown",this.role="unknown",this.font="unknown",this.embellished=null,this.fencePointer="",this.childNodes=[],this.textContent="",this.mathmlTree=null,this.contentNodes=[],this.annotation={},this.attributes={},this.nobreaking=!1}static fromXml(t){const e=parseInt(t.getAttribute("id"),10),r=new s(e);return r.type=t.tagName,s.setAttribute(r,t,"role"),s.setAttribute(r,t,"font"),s.setAttribute(r,t,"embellished"),s.setAttribute(r,t,"fencepointer","fencePointer"),t.getAttribute("annotation")&&r.parseAnnotation(t.getAttribute("annotation")),i.addAttributes(r,t),s.processChildren(r,t),r}static setAttribute(t,e,r,n){n=n||r;const o=e.getAttribute(r);o&&(t[n]=o)}static processChildren(t,e){for(const r of n.toArray(e.childNodes)){if(r.nodeType===n.NodeType.TEXT_NODE){t.textContent=r.textContent;continue}const e=n.toArray(r.childNodes).map(s.fromXml);e.forEach((e=>e.parent=t)),"CONTENT"===n.tagName(r)?t.contentNodes=e:t.childNodes=e}}querySelectorAll(t){let e=[];for(let r,n=0;r=this.childNodes[n];n++)e=e.concat(r.querySelectorAll(t));for(let r,n=0;r=this.contentNodes[n];n++)e=e.concat(r.querySelectorAll(t));return t(this)&&e.unshift(this),e}xml(t,e){const r=function(r,n){const o=n.map((function(r){return r.xml(t,e)})),i=t.createElementNS("",r);for(let t,e=0;t=o[e];e++)i.appendChild(t);return i},n=t.createElementNS("",this.type);return e||this.xmlAttributes(n),n.textContent=this.textContent,this.contentNodes.length>0&&n.appendChild(r("content",this.contentNodes)),this.childNodes.length>0&&n.appendChild(r("children",this.childNodes)),n}toString(t=!1){const e=n.parseInput("");return n.serializeXml(this.xml(e,t))}allAttributes(){const t=[];return t.push(["role",this.role]),"unknown"!==this.font&&t.push(["font",this.font]),Object.keys(this.annotation).length&&t.push(["annotation",this.xmlAnnotation()]),this.embellished&&t.push(["embellished",this.embellished]),this.fencePointer&&t.push(["fencepointer",this.fencePointer]),t.push(["id",this.id.toString()]),t}xmlAnnotation(){const t=[];for(const e in this.annotation)this.annotation[e].forEach((function(r){t.push(e+":"+r)}));return t.join(";")}toJson(){const t={};t.type=this.type;const e=this.allAttributes();for(let r,n=0;r=e[n];n++)t[r[0]]=r[1].toString();return this.textContent&&(t.$t=this.textContent),this.childNodes.length&&(t.children=this.childNodes.map((function(t){return t.toJson()}))),this.contentNodes.length&&(t.content=this.contentNodes.map((function(t){return t.toJson()}))),t}updateContent(t,e){const r=e?t.replace(/^[ \f\n\r\t\v\u200b]*/,"").replace(/[ \f\n\r\t\v\u200b]*$/,""):t.trim();if(t=t&&!r?t:r,this.textContent===t)return;const n=(0,o.lookupMeaning)(t);this.textContent=t,this.role=n.role,this.type=n.type,this.font=n.font}addMathmlNodes(t){for(let e,r=0;e=t[r];r++)-1===this.mathml.indexOf(e)&&this.mathml.push(e)}appendChild(t){this.childNodes.push(t),this.addMathmlNodes(t.mathml),t.parent=this}replaceChild(t,e){const r=this.childNodes.indexOf(t);if(-1===r)return;t.parent=null,e.parent=this,this.childNodes[r]=e;const n=t.mathml.filter((function(t){return-1===e.mathml.indexOf(t)})),o=e.mathml.filter((function(e){return-1===t.mathml.indexOf(e)}));this.removeMathmlNodes(n),this.addMathmlNodes(o)}appendContentNode(t){t&&(this.contentNodes.push(t),this.addMathmlNodes(t.mathml),t.parent=this)}removeContentNode(t){if(t){const e=this.contentNodes.indexOf(t);-1!==e&&this.contentNodes.slice(e,1)}}equals(t){if(!t)return!1;if(this.type!==t.type||this.role!==t.role||this.textContent!==t.textContent||this.childNodes.length!==t.childNodes.length||this.contentNodes.length!==t.contentNodes.length)return!1;for(let e,r,n=0;e=this.childNodes[n],r=t.childNodes[n];n++)if(!e.equals(r))return!1;for(let e,r,n=0;e=this.contentNodes[n],r=t.contentNodes[n];n++)if(!e.equals(r))return!1;return!0}displayTree(){console.info(this.displayTree_(0))}addAnnotation(t,e){e&&this.addAnnotation_(t,e)}getAnnotation(t){const e=this.annotation[t];return e||[]}hasAnnotation(t,e){const r=this.annotation[t];return!!r&&-1!==r.indexOf(e)}parseAnnotation(t){const e=t.split(";");for(let t=0,r=e.length;t1)return!1;const r=e[0];if("infixop"===r.type){if("implicit"!==r.role)return!1;if(r.childNodes.some((t=>i(t,"infixop"))))return!1}return!0},e.isPrefixFunctionBoundary=function(t){return c(t)&&!a(t,"division")||i(t,"appl")||l(t)},e.isBigOpBoundary=function(t){return c(t)||l(t)},e.isIntegralDxBoundary=function(t,e){return!!e&&i(e,"identifier")&&n.lookupSecondary("d",t.textContent)},e.isIntegralDxBoundarySingle=function(t){if(i(t,"identifier")){const e=t.textContent[0];return e&&t.textContent[1]&&n.lookupSecondary("d",e)}return!1},e.isGeneralFunctionBoundary=l,e.isEmbellished=function(t){return t.embellished?t.embellished:n.isEmbellishedType(t.type)?t.type:null},e.isOperator=c,e.isRelation=u,e.isPunctuation=p,e.isFence=h,e.isElligibleEmbellishedFence=function(t){return!(!t||!h(t))&&(!t.embellished||f(t))},e.isTableOrMultiline=d,e.tableIsMatrixOrVector=function(t){return!!t&&m(t)&&d(t.childNodes[0])},e.isFencedElement=m,e.tableIsCases=function(t,e){return e.length>0&&a(e[e.length-1],"openfence")},e.tableIsMultiline=function(t){return t.childNodes.every((function(t){return t.childNodes.length<=1}))},e.lineIsLabelled=function(t){return i(t,"line")&&t.contentNodes.length&&a(t.contentNodes[0],"label")},e.isBinomial=function(t){return 2===t.childNodes.length},e.isLimitBase=function t(e){return i(e,"largeop")||i(e,"limboth")||i(e,"limlower")||i(e,"limupper")||i(e,"function")&&a(e,"limit function")||(i(e,"overscore")||i(e,"underscore"))&&t(e.childNodes[0])},e.isSimpleFunctionHead=function(t){return"identifier"===t.type||"latinletter"===t.role||"greekletter"===t.role||"otherletter"===t.role},e.singlePunctAtPosition=function(t,e,r){return 1===e.length&&("punctuation"===t[r].type||"punctuation"===t[r].embellished)&&t[r]===e[0]},e.isSimpleFunction=function(t){return i(t,"identifier")&&a(t,"simple function")},e.isLeftBrace=y,e.isRightBrace=g,e.isSetNode=function(t){return y(t.contentNodes[0])&&g(t.contentNodes[1])},e.illegalSingleton_=["punctuation","punctuated","relseq","multirel","table","multiline","cases","inference"],e.scriptedElement_=["limupper","limlower","limboth","subscript","superscript","underscore","overscore","tensor"],e.isSingletonSetContent=function t(r){const n=r.type;return-1===e.illegalSingleton_.indexOf(n)&&("infixop"!==n||"implicit"===r.role)&&("fenced"===n?"leftright"!==r.role||t(r.childNodes[0]):-1===e.scriptedElement_.indexOf(n)||t(r.childNodes[0]))},e.isNumber=b,e.isUnitCounter=function(t){return b(t)||"vulgar"===t.role||"mixed"===t.role},e.isPureUnit=function(t){const e=t.childNodes;return"unit"===t.role&&(!e.length||"unit"===e[0].role)},e.isImplicit=function(t){return"implicit"===t.role||"unit"===t.role&&!!t.contentNodes.length&&t.contentNodes[0].textContent===n.invisibleTimes()},e.isImplicitOp=function(t){return"infixop"===t.type&&"implicit"===t.role},e.isNeutralFence=v,e.compareNeutralFences=function(t,e){return v(t)&&v(e)&&(0,o.getEmbellishedInner)(t).textContent===(0,o.getEmbellishedInner)(e).textContent},e.elligibleLeftNeutral=function(t){return!!v(t)&&(!t.embellished||"superscript"!==t.type&&"subscript"!==t.type&&("tensor"!==t.type||"empty"===t.childNodes[3].type&&"empty"===t.childNodes[4].type))},e.elligibleRightNeutral=function(t){return!!v(t)&&(!t.embellished||("tensor"!==t.type||"empty"===t.childNodes[1].type&&"empty"===t.childNodes[2].type))},e.isMembership=function(t){return["element","nonelement","reelement","renonelement"].includes(t.role)}},3308:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(5740),o=r(3588),i=r(7516),s=r(6537),a=r(5609),l=r(4795);class c{constructor(){this.funcAppls={},this.factory_=new s.SemanticNodeFactory,i.updateFactory(this.factory_)}static getInstance(){return c.instance=c.instance||new c,c.instance}static tableToMultiline(t){if(a.tableIsMultiline(t)){t.type="multiline";for(let e,r=0;e=t.childNodes[r];r++)c.rowToLine_(e,"multiline");1===t.childNodes.length&&!a.lineIsLabelled(t.childNodes[0])&&a.isFencedElement(t.childNodes[0].childNodes[0])&&c.tableToMatrixOrVector_(c.rewriteFencedLine_(t)),c.binomialForm_(t),c.classifyMultiline(t)}else c.classifyTable(t)}static number(t){"unknown"!==t.type&&"identifier"!==t.type||(t.type="number"),c.numberRole_(t),c.exprFont_(t)}static classifyMultiline(t){let e=0;const r=t.childNodes.length;let n;for(;e=r)return;const o=n.childNodes[0].role;"unknown"!==o&&t.childNodes.every((function(t){const e=t.childNodes[0];return!e||e.role===o&&(a.isType(e,"relation")||a.isType(e,"relseq"))}))&&(t.role=o)}static classifyTable(t){const e=c.computeColumns_(t);c.classifyByColumns_(t,e,"equality")||c.classifyByColumns_(t,e,"inequality",["equality"])||c.classifyByColumns_(t,e,"arrow")||c.detectCaleyTable(t)}static detectCaleyTable(t){if(!t.mathmlTree)return!1;const e=t.mathmlTree,r=e.getAttribute("columnlines"),n=e.getAttribute("rowlines");return!(!r||!n)&&(!(!c.cayleySpacing(r)||!c.cayleySpacing(n))&&(t.role="cayley",!0))}static cayleySpacing(t){const e=t.split(" ");return("solid"===e[0]||"dashed"===e[0])&&e.slice(1).every((t=>"none"===t))}static proof(t,e,r){const n=c.separateSemantics(e);return c.getInstance().proof(t,n,r)}static findSemantics(t,e,r){const n=null==r?null:r,o=c.getSemantics(t);return!!o&&(!!o[e]&&(null==n||o[e]===n))}static getSemantics(t){const e=t.getAttribute("semantics");return e?c.separateSemantics(e):null}static removePrefix(t){const[,...e]=t.split("_");return e.join("_")}static separateSemantics(t){const e={};return t.split(";").forEach((function(t){const[r,n]=t.split(":");e[c.removePrefix(r)]=n})),e}static matchSpaces_(t,e){for(let r,n=0;r=e[n];n++){const e=t[n].mathmlTree,o=t[n+1].mathmlTree;if(!e||!o)continue;const i=e.nextSibling;if(!i||i===o)continue;const s=c.getSpacer_(i);s&&(r.mathml.push(s),r.mathmlTree=s,r.role="space")}}static getSpacer_(t){if("MSPACE"===n.tagName(t))return t;for(;l.hasEmptyTag(t)&&1===t.childNodes.length;)if(t=t.childNodes[0],"MSPACE"===n.tagName(t))return t;return null}static fenceToPunct_(t){const e=c.FENCE_TO_PUNCT_[t.role];if(e){for(;t.embellished;)t.embellished="punctuation",a.isRole(t,"subsup")||a.isRole(t,"underover")||(t.role=e),t=t.childNodes[0];t.type="punctuation",t.role=e}}static classifyFunction_(t,e){if("appl"===t.type||"bigop"===t.type||"integral"===t.type)return"";if(e[0]&&e[0].textContent===o.functionApplication()){c.getInstance().funcAppls[t.id]=e.shift();let r="simple function";return i.run("simple2prefix",t),"prefix function"!==t.role&&"limit function"!==t.role||(r=t.role),c.propagateFunctionRole_(t,r),"prefix"}const r=c.CLASSIFY_FUNCTION_[t.role];return r||(a.isSimpleFunctionHead(t)?"simple":"")}static propagateFunctionRole_(t,e){if(t){if("infixop"===t.type)return;a.isRole(t,"subsup")||a.isRole(t,"underover")||(t.role=e),c.propagateFunctionRole_(t.childNodes[0],e)}}static getFunctionOp_(t,e){if(e(t))return t;for(let r,n=0;r=t.childNodes[n];n++){const t=c.getFunctionOp_(r,e);if(t)return t}return null}static tableToMatrixOrVector_(t){const e=t.childNodes[0];a.isType(e,"multiline")?c.tableToVector_(t):c.tableToMatrix_(t),t.contentNodes.forEach(e.appendContentNode.bind(e));for(let t,r=0;t=e.childNodes[r];r++)c.assignRoleToRow_(t,c.getComponentRoles_(e));return e.parent=null,e}static tableToVector_(t){const e=t.childNodes[0];e.type="vector",1!==e.childNodes.length?c.binomialForm_(e):c.tableToSquare_(t)}static binomialForm_(t){a.isBinomial(t)&&(t.role="binomial",t.childNodes[0].role="binomial",t.childNodes[1].role="binomial")}static tableToMatrix_(t){const e=t.childNodes[0];e.type="matrix",e.childNodes&&e.childNodes.length>0&&e.childNodes[0].childNodes&&e.childNodes.length===e.childNodes[0].childNodes.length?c.tableToSquare_(t):e.childNodes&&1===e.childNodes.length&&(e.role="rowvector")}static tableToSquare_(t){const e=t.childNodes[0];a.isNeutralFence(t)?e.role="determinant":e.role="squarematrix"}static getComponentRoles_(t){const e=t.role;return e&&"unknown"!==e?e:t.type.toLowerCase()||"unknown"}static tableToCases_(t,e){for(let e,r=0;e=t.childNodes[r];r++)c.assignRoleToRow_(e,"cases");return t.type="cases",t.appendContentNode(e),a.tableIsMultiline(t)&&c.binomialForm_(t),t}static rewriteFencedLine_(t){const e=t.childNodes[0],r=t.childNodes[0].childNodes[0],n=t.childNodes[0].childNodes[0].childNodes[0];return r.parent=t.parent,t.parent=r,n.parent=e,r.childNodes=[t],e.childNodes=[n],r}static rowToLine_(t,e){const r=e||"unknown";a.isType(t,"row")&&(t.type="line",t.role=r,1===t.childNodes.length&&a.isType(t.childNodes[0],"cell")&&(t.childNodes=t.childNodes[0].childNodes,t.childNodes.forEach((function(e){e.parent=t}))))}static assignRoleToRow_(t,e){a.isType(t,"line")?t.role=e:a.isType(t,"row")&&(t.role=e,t.childNodes.forEach((function(t){a.isType(t,"cell")&&(t.role=e)})))}static nextSeparatorFunction_(t){let e;if(t){if(t.match(/^\s+$/))return null;e=t.replace(/\s/g,"").split("").filter((function(t){return t}))}else e=[","];return function(){return e.length>1?e.shift():e[0]}}static numberRole_(t){if("unknown"!==t.role)return;const e=[...t.textContent].filter((t=>t.match(/[^\s]/))),r=e.map(o.lookupMeaning);if(r.every((function(t){return"number"===t.type&&"integer"===t.role||"punctuation"===t.type&&"comma"===t.role})))return t.role="integer",void("0"===e[0]&&t.addAnnotation("general","basenumber"));r.every((function(t){return"number"===t.type&&"integer"===t.role||"punctuation"===t.type}))?t.role="float":t.role="othernumber"}static exprFont_(t){if("unknown"!==t.font)return;const e=[...t.textContent].map(o.lookupMeaning).reduce((function(t,e){return t&&e.font&&"unknown"!==e.font&&e.font!==t?"unknown"===t?e.font:null:t}),"unknown");e&&(t.font=e)}static purgeFences_(t){const e=t.rel,r=t.comp,n=[],o=[];for(;e.length>0;){const t=e.shift();let i=r.shift();a.isElligibleEmbellishedFence(t)?(n.push(t),o.push(i)):(c.fenceToPunct_(t),i.push(t),i=i.concat(r.shift()),r.unshift(i))}return o.push(r.shift()),{rel:n,comp:o}}static rewriteFencedNode_(t){const e=t.contentNodes[0],r=t.contentNodes[1];let n=c.rewriteFence_(t,e);return t.contentNodes[0]=n.fence,n=c.rewriteFence_(n.node,r),t.contentNodes[1]=n.fence,t.contentNodes[0].parent=t,t.contentNodes[1].parent=t,n.node.parent=null,n.node}static rewriteFence_(t,e){if(!e.embellished)return{node:t,fence:e};const r=e.childNodes[0],n=c.rewriteFence_(t,r);return a.isType(e,"superscript")||a.isType(e,"subscript")||a.isType(e,"tensor")?(a.isRole(e,"subsup")||(e.role=t.role),r!==n.node&&(e.replaceChild(r,n.node),r.parent=t),c.propagateFencePointer_(e,r),{node:e,fence:n.fence}):(e.replaceChild(r,n.fence),e.mathmlTree&&-1===e.mathml.indexOf(e.mathmlTree)&&e.mathml.push(e.mathmlTree),{node:n.node,fence:e})}static propagateFencePointer_(t,e){t.fencePointer=e.fencePointer||e.id.toString(),t.embellished=null}static classifyByColumns_(t,e,r,n){return!!(3===e.length&&c.testColumns_(e,1,(t=>c.isPureRelation_(t,r)))||2===e.length&&(c.testColumns_(e,1,(t=>c.isEndRelation_(t,r)||c.isPureRelation_(t,r)))||c.testColumns_(e,0,(t=>c.isEndRelation_(t,r,!0)||c.isPureRelation_(t,r)))))&&(t.role=r,!0)}static isEndRelation_(t,e,r){const n=r?t.childNodes.length-1:0;return a.isType(t,"relseq")&&a.isRole(t,e)&&a.isType(t.childNodes[n],"empty")}static isPureRelation_(t,e){return a.isType(t,"relation")&&a.isRole(t,e)}static computeColumns_(t){const e=[];for(let r,n=0;r=t.childNodes[n];n++)for(let t,n=0;t=r.childNodes[n];n++){e[n]?e[n].push(t):e[n]=[t]}return e}static testColumns_(t,e,r){const n=t[e];return!!n&&(n.some((function(t){return t.childNodes.length&&r(t.childNodes[0])}))&&n.every((function(t){return!t.childNodes.length||r(t.childNodes[0])})))}setNodeFactory(t){c.getInstance().factory_=t,i.updateFactory(c.getInstance().factory_)}getNodeFactory(){return c.getInstance().factory_}identifierNode(t,e,r){if("MathML-Unit"===r)t.type="identifier",t.role="unit";else if(!e&&1===t.textContent.length&&("integer"===t.role||"latinletter"===t.role||"greekletter"===t.role)&&"normal"===t.font)return t.font="italic",i.run("simpleNamedFunction",t);return"unknown"===t.type&&(t.type="identifier"),c.exprFont_(t),i.run("simpleNamedFunction",t)}implicitNode(t){if(t=c.getInstance().getMixedNumbers_(t),1===(t=c.getInstance().combineUnits_(t)).length)return t[0];const e=c.getInstance().implicitNode_(t);return i.run("combine_juxtaposition",e)}text(t,e){return c.exprFont_(t),t.type="text","MS"===e?(t.role="string",t):"MSPACE"===e||t.textContent.match(/^\s*$/)?(t.role="space",t):t}row(t){return 0===(t=t.filter((function(t){return!a.isType(t,"empty")}))).length?c.getInstance().factory_.makeEmptyNode():(t=c.getInstance().getFencesInRow_(t),t=c.getInstance().tablesInRow(t),t=c.getInstance().getPunctuationInRow_(t),t=c.getInstance().getTextInRow_(t),t=c.getInstance().getFunctionsInRow_(t),c.getInstance().relationsInRow_(t))}limitNode(t,e){if(!e.length)return c.getInstance().factory_.makeEmptyNode();let r,n=e[0],o="unknown";if(!e[1])return n;if(a.isLimitBase(n)){r=c.MML_TO_LIMIT_[t];const i=r.length;if(o=r.type,e=e.slice(0,r.length+1),1===i&&a.isAccent(e[1])||2===i&&a.isAccent(e[1])&&a.isAccent(e[2]))return r=c.MML_TO_BOUNDS_[t],c.getInstance().accentNode_(n,e,r.type,r.length,r.accent);if(2===i){if(a.isAccent(e[1]))return n=c.getInstance().accentNode_(n,[n,e[1]],{MSUBSUP:"subscript",MUNDEROVER:"underscore"}[t],1,!0),e[2]?c.getInstance().makeLimitNode_(n,[n,e[2]],null,"limupper"):n;if(e[2]&&a.isAccent(e[2]))return n=c.getInstance().accentNode_(n,[n,e[2]],{MSUBSUP:"superscript",MUNDEROVER:"overscore"}[t],1,!0),c.getInstance().makeLimitNode_(n,[n,e[1]],null,"limlower");e[i]||(o="limlower")}return c.getInstance().makeLimitNode_(n,e,null,o)}return r=c.MML_TO_BOUNDS_[t],c.getInstance().accentNode_(n,e,r.type,r.length,r.accent)}tablesInRow(t){let e=l.partitionNodes(t,a.tableIsMatrixOrVector),r=[];for(let t,n=0;t=e.rel[n];n++)r=r.concat(e.comp.shift()),r.push(c.tableToMatrixOrVector_(t));r=r.concat(e.comp.shift()),e=l.partitionNodes(r,a.isTableOrMultiline),r=[];for(let t,n=0;t=e.rel[n];n++){const n=e.comp.shift();a.tableIsCases(t,n)&&c.tableToCases_(t,n.pop()),r=r.concat(n),r.push(t)}return r.concat(e.comp.shift())}mfenced(t,e,r,n){if(r&&n.length>0){const t=c.nextSeparatorFunction_(r),e=[n.shift()];n.forEach((r=>{e.push(c.getInstance().factory_.makeContentNode(t())),e.push(r)})),n=e}return t&&e?c.getInstance().horizontalFencedNode_(c.getInstance().factory_.makeContentNode(t),c.getInstance().factory_.makeContentNode(e),n):(t&&n.unshift(c.getInstance().factory_.makeContentNode(t)),e&&n.push(c.getInstance().factory_.makeContentNode(e)),c.getInstance().row(n))}fractionLikeNode(t,e,r,n){let o;if(!n&&l.isZeroLength(r)){const r=c.getInstance().factory_.makeBranchNode("line",[t],[]),n=c.getInstance().factory_.makeBranchNode("line",[e],[]);return o=c.getInstance().factory_.makeBranchNode("multiline",[r,n],[]),c.binomialForm_(o),c.classifyMultiline(o),o}return o=c.getInstance().fractionNode_(t,e),n&&o.addAnnotation("general","bevelled"),o}tensor(t,e,r,n,o){const i=c.getInstance().factory_.makeBranchNode("tensor",[t,c.getInstance().scriptNode_(e,"leftsub"),c.getInstance().scriptNode_(r,"leftsuper"),c.getInstance().scriptNode_(n,"rightsub"),c.getInstance().scriptNode_(o,"rightsuper")],[]);return i.role=t.role,i.embellished=a.isEmbellished(t),i}pseudoTensor(t,e,r){const n=t=>!a.isType(t,"empty"),o=e.filter(n).length,i=r.filter(n).length;if(!o&&!i)return t;const s=o?i?"MSUBSUP":"MSUB":"MSUP",l=[t];return o&&l.push(c.getInstance().scriptNode_(e,"rightsub",!0)),i&&l.push(c.getInstance().scriptNode_(r,"rightsuper",!0)),c.getInstance().limitNode(s,l)}font(t){const e=c.MATHJAX_FONTS[t];return e||t}proof(t,e,r){if(e.inference||e.axiom||console.log("Noise"),e.axiom){const e=c.getInstance().cleanInference(t.childNodes),n=e.length?c.getInstance().factory_.makeBranchNode("inference",r(e),[]):c.getInstance().factory_.makeEmptyNode();return n.role="axiom",n.mathmlTree=t,n}const n=c.getInstance().inference(t,e,r);return e.proof&&(n.role="proof",n.childNodes[0].role="final"),n}inference(t,e,r){if(e.inferenceRule){const e=c.getInstance().getFormulas(t,[],r);return c.getInstance().factory_.makeBranchNode("inference",[e.conclusion,e.premises],[])}const o=e.labelledRule,i=n.toArray(t.childNodes),s=[];"left"!==o&&"both"!==o||s.push(c.getInstance().getLabel(t,i,r,"left")),"right"!==o&&"both"!==o||s.push(c.getInstance().getLabel(t,i,r,"right"));const a=c.getInstance().getFormulas(t,i,r),l=c.getInstance().factory_.makeBranchNode("inference",[a.conclusion,a.premises],s);return l.mathmlTree=t,l}getLabel(t,e,r,o){const i=c.getInstance().findNestedRow(e,"prooflabel",o),s=c.getInstance().factory_.makeBranchNode("rulelabel",r(n.toArray(i.childNodes)),[]);return s.role=o,s.mathmlTree=i,s}getFormulas(t,e,r){const o=e.length?c.getInstance().findNestedRow(e,"inferenceRule"):t,i="up"===c.getSemantics(o).inferenceRule,s=i?o.childNodes[1]:o.childNodes[0],a=i?o.childNodes[0]:o.childNodes[1],l=s.childNodes[0].childNodes[0],u=n.toArray(l.childNodes[0].childNodes),p=[];let h=1;for(const t of u)h%2&&p.push(t.childNodes[0]),h++;const f=r(p),d=r(n.toArray(a.childNodes[0].childNodes))[0],m=c.getInstance().factory_.makeBranchNode("premises",f,[]);m.mathmlTree=l;const y=c.getInstance().factory_.makeBranchNode("conclusion",[d],[]);return y.mathmlTree=a.childNodes[0].childNodes[0],{conclusion:y,premises:m}}findNestedRow(t,e,r){return c.getInstance().findNestedRow_(t,e,0,r)}cleanInference(t){return n.toArray(t).filter((function(t){return"MSPACE"!==n.tagName(t)}))}operatorNode(t){return"unknown"===t.type&&(t.type="operator"),i.run("multioperator",t)}implicitNode_(t){const e=c.getInstance().factory_.makeMultipleContentNodes(t.length-1,o.invisibleTimes());c.matchSpaces_(t,e);const r=c.getInstance().infixNode_(t,e[0]);return r.role="implicit",e.forEach((function(t){t.parent=r})),r.contentNodes=e,r}infixNode_(t,e){const r=c.getInstance().factory_.makeBranchNode("infixop",t,[e],l.getEmbellishedInner(e).textContent);return r.role=e.role,i.run("propagateSimpleFunction",r)}explicitMixed_(t){const e=l.partitionNodes(t,(function(t){return t.textContent===o.invisiblePlus()}));if(!e.rel.length)return t;let r=[];for(let t,n=0;t=e.rel[n];n++){const o=e.comp[n],i=e.comp[n+1],s=o.length-1;if(o[s]&&i[0]&&a.isType(o[s],"number")&&!a.isRole(o[s],"mixed")&&a.isType(i[0],"fraction")){const t=c.getInstance().factory_.makeBranchNode("number",[o[s],i[0]],[]);t.role="mixed",r=r.concat(o.slice(0,s)),r.push(t),i.shift()}else r=r.concat(o),r.push(t)}return r.concat(e.comp[e.comp.length-1])}concatNode_(t,e,r){if(0===e.length)return t;const n=e.map((function(t){return l.getEmbellishedInner(t).textContent})).join(" "),o=c.getInstance().factory_.makeBranchNode(r,[t],e,n);return e.length>1&&(o.role="multiop"),o}prefixNode_(t,e){const r=l.partitionNodes(e,(t=>a.isRole(t,"subtraction")));let n=c.getInstance().concatNode_(t,r.comp.pop(),"prefixop");for(1===n.contentNodes.length&&"addition"===n.contentNodes[0].role&&"+"===n.contentNodes[0].textContent&&(n.role="positive");r.rel.length>0;)n=c.getInstance().concatNode_(n,[r.rel.pop()],"prefixop"),n.role="negative",n=c.getInstance().concatNode_(n,r.comp.pop(),"prefixop");return n}postfixNode_(t,e){return e.length?c.getInstance().concatNode_(t,e,"postfixop"):t}combineUnits_(t){const e=l.partitionNodes(t,(function(t){return!a.isRole(t,"unit")}));if(t.length===e.rel.length)return e.rel;const r=[];let n,o;do{const t=e.comp.shift();n=e.rel.shift();let i=null;o=r.pop(),o&&(t.length&&a.isUnitCounter(o)?t.unshift(o):r.push(o)),1===t.length&&(i=t.pop()),t.length>1&&(i=c.getInstance().implicitNode_(t),i.role="unit"),i&&r.push(i),n&&r.push(n)}while(n);return r}getMixedNumbers_(t){const e=l.partitionNodes(t,(function(t){return a.isType(t,"fraction")&&a.isRole(t,"vulgar")}));if(!e.rel.length)return t;let r=[];for(let t,n=0;t=e.rel[n];n++){const o=e.comp[n],i=o.length-1;if(o[i]&&a.isType(o[i],"number")&&(a.isRole(o[i],"integer")||a.isRole(o[i],"float"))){const e=c.getInstance().factory_.makeBranchNode("number",[o[i],t],[]);e.role="mixed",r=r.concat(o.slice(0,i)),r.push(e)}else r=r.concat(o),r.push(t)}return r.concat(e.comp[e.comp.length-1])}getTextInRow_(t){if(t.length<=1)return t;const e=l.partitionNodes(t,(t=>a.isType(t,"text")));if(0===e.rel.length)return t;const r=[];let n=e.comp[0];n.length>0&&r.push(c.getInstance().row(n));for(let t,o=0;t=e.rel[o];o++)r.push(t),n=e.comp[o+1],n.length>0&&r.push(c.getInstance().row(n));return[c.getInstance().dummyNode_(r)]}relationsInRow_(t){const e=l.partitionNodes(t,a.isRelation),r=e.rel[0];if(!r)return c.getInstance().operationsInRow_(t);if(1===t.length)return t[0];const n=e.comp.map(c.getInstance().operationsInRow_);let o;return e.rel.some((function(t){return!t.equals(r)}))?(o=c.getInstance().factory_.makeBranchNode("multirel",n,e.rel),e.rel.every((function(t){return t.role===r.role}))&&(o.role=r.role),o):(o=c.getInstance().factory_.makeBranchNode("relseq",n,e.rel,l.getEmbellishedInner(r).textContent),o.role=r.role,o)}operationsInRow_(t){if(0===t.length)return c.getInstance().factory_.makeEmptyNode();if(1===(t=c.getInstance().explicitMixed_(t)).length)return t[0];const e=[];for(;t.length>0&&a.isOperator(t[0]);)e.push(t.shift());if(0===t.length)return c.getInstance().prefixNode_(e.pop(),e);if(1===t.length)return c.getInstance().prefixNode_(t[0],e);t=i.run("convert_juxtaposition",t);const r=l.sliceNodes(t,a.isOperator),n=c.getInstance().prefixNode_(c.getInstance().implicitNode(r.head),e);return r.div?c.getInstance().operationsTree_(r.tail,n,r.div):n}operationsTree_(t,e,r,n){const o=n||[];if(0===t.length){if(o.unshift(r),"infixop"===e.type){const t=c.getInstance().postfixNode_(e.childNodes.pop(),o);return e.appendChild(t),e}return c.getInstance().postfixNode_(e,o)}const i=l.sliceNodes(t,a.isOperator);if(0===i.head.length)return o.push(i.div),c.getInstance().operationsTree_(i.tail,e,r,o);const s=c.getInstance().prefixNode_(c.getInstance().implicitNode(i.head),o),u=c.getInstance().appendOperand_(e,r,s);return i.div?c.getInstance().operationsTree_(i.tail,u,i.div,[]):u}appendOperand_(t,e,r){if("infixop"!==t.type)return c.getInstance().infixNode_([t,r],e);const n=c.getInstance().appendDivisionOp_(t,e,r);return n||(c.getInstance().appendExistingOperator_(t,e,r)?t:"multiplication"===e.role?c.getInstance().appendMultiplicativeOp_(t,e,r):c.getInstance().appendAdditiveOp_(t,e,r))}appendDivisionOp_(t,e,r){return"division"===e.role?a.isImplicit(t)?c.getInstance().infixNode_([t,r],e):c.getInstance().appendLastOperand_(t,e,r):"division"===t.role?c.getInstance().infixNode_([t,r],e):null}appendLastOperand_(t,e,r){let n=t,o=t.childNodes[t.childNodes.length-1];for(;o&&"infixop"===o.type&&!a.isImplicit(o);)n=o,o=n.childNodes[t.childNodes.length-1];const i=c.getInstance().infixNode_([n.childNodes.pop(),r],e);return n.appendChild(i),t}appendMultiplicativeOp_(t,e,r){if(a.isImplicit(t))return c.getInstance().infixNode_([t,r],e);let n=t,o=t.childNodes[t.childNodes.length-1];for(;o&&"infixop"===o.type&&!a.isImplicit(o);)n=o,o=n.childNodes[t.childNodes.length-1];const i=c.getInstance().infixNode_([n.childNodes.pop(),r],e);return n.appendChild(i),t}appendAdditiveOp_(t,e,r){return c.getInstance().infixNode_([t,r],e)}appendExistingOperator_(t,e,r){return!(!t||"infixop"!==t.type||a.isImplicit(t))&&(t.contentNodes[0].equals(e)?(t.appendContentNode(e),t.appendChild(r),!0):c.getInstance().appendExistingOperator_(t.childNodes[t.childNodes.length-1],e,r))}getFencesInRow_(t){let e=l.partitionNodes(t,a.isFence);e=c.purgeFences_(e);const r=e.comp.shift();return c.getInstance().fences_(e.rel,e.comp,[],[r])}fences_(t,e,r,n){if(0===t.length&&0===r.length)return n[0];const o=t=>a.isRole(t,"open");if(0===t.length){const t=n.shift();for(;r.length>0;){if(o(r[0])){const e=r.shift();c.fenceToPunct_(e),t.push(e)}else{const e=l.sliceNodes(r,o),i=e.head.length-1,s=c.getInstance().neutralFences_(e.head,n.slice(0,i));n=n.slice(i),t.push(...s),e.div&&e.tail.unshift(e.div),r=e.tail}t.push(...n.shift())}return t}const i=r[r.length-1],s=t[0].role;if("open"===s||a.isNeutralFence(t[0])&&(!i||!a.compareNeutralFences(t[0],i))){r.push(t.shift());const o=e.shift();return o&&n.push(o),c.getInstance().fences_(t,e,r,n)}if(i&&"close"===s&&"open"===i.role){const o=c.getInstance().horizontalFencedNode_(r.pop(),t.shift(),n.pop());return n.push(n.pop().concat([o],e.shift())),c.getInstance().fences_(t,e,r,n)}if(i&&a.compareNeutralFences(t[0],i)){if(!a.elligibleLeftNeutral(i)||!a.elligibleRightNeutral(t[0])){r.push(t.shift());const o=e.shift();return o&&n.push(o),c.getInstance().fences_(t,e,r,n)}const o=c.getInstance().horizontalFencedNode_(r.pop(),t.shift(),n.pop());return n.push(n.pop().concat([o],e.shift())),c.getInstance().fences_(t,e,r,n)}if(i&&"close"===s&&a.isNeutralFence(i)&&r.some(o)){const i=l.sliceNodes(r,o,!0),s=n.pop(),a=n.length-i.tail.length+1,u=c.getInstance().neutralFences_(i.tail,n.slice(a));n=n.slice(0,a);const p=c.getInstance().horizontalFencedNode_(i.div,t.shift(),n.pop().concat(u,s));return n.push(n.pop().concat([p],e.shift())),c.getInstance().fences_(t,e,i.head,n)}const u=t.shift();return c.fenceToPunct_(u),n.push(n.pop().concat([u],e.shift())),c.getInstance().fences_(t,e,r,n)}neutralFences_(t,e){if(0===t.length)return t;if(1===t.length)return c.fenceToPunct_(t[0]),t;const r=t.shift();if(!a.elligibleLeftNeutral(r)){c.fenceToPunct_(r);const n=e.shift();return n.unshift(r),n.concat(c.getInstance().neutralFences_(t,e))}const n=l.sliceNodes(t,(function(t){return a.compareNeutralFences(t,r)}));if(!n.div){c.fenceToPunct_(r);const n=e.shift();return n.unshift(r),n.concat(c.getInstance().neutralFences_(t,e))}if(!a.elligibleRightNeutral(n.div))return c.fenceToPunct_(n.div),t.unshift(r),c.getInstance().neutralFences_(t,e);const o=c.getInstance().combineFencedContent_(r,n.div,n.head,e);if(n.tail.length>0){const t=o.shift(),e=c.getInstance().neutralFences_(n.tail,o);return t.concat(e)}return o[0]}combineFencedContent_(t,e,r,n){if(0===r.length){const r=c.getInstance().horizontalFencedNode_(t,e,n.shift());return n.length>0?n[0].unshift(r):n=[[r]],n}const o=n.shift(),i=r.length-1,s=n.slice(0,i),a=(n=n.slice(i)).shift(),l=c.getInstance().neutralFences_(r,s);o.push(...l),o.push(...a);const u=c.getInstance().horizontalFencedNode_(t,e,o);return n.length>0?n[0].unshift(u):n=[[u]],n}horizontalFencedNode_(t,e,r){const n=c.getInstance().row(r);let o=c.getInstance().factory_.makeBranchNode("fenced",[n],[t,e]);return"open"===t.role?(c.getInstance().classifyHorizontalFence_(o),o=i.run("propagateComposedFunction",o)):o.role=t.role,o=i.run("detect_cycle",o),c.rewriteFencedNode_(o)}classifyHorizontalFence_(t){t.role="leftright";const e=t.childNodes;if(!a.isSetNode(t)||e.length>1)return;if(0===e.length||"empty"===e[0].type)return void(t.role="set empty");const r=e[0].type;if(1===e.length&&a.isSingletonSetContent(e[0]))return void(t.role="set singleton");const n=e[0].role;if("punctuated"===r&&"sequence"===n){if("comma"!==e[0].contentNodes[0].role)return 1!==e[0].contentNodes.length||"vbar"!==e[0].contentNodes[0].role&&"colon"!==e[0].contentNodes[0].role?void 0:(t.role="set extended",void c.getInstance().setExtension_(t));t.role="set collection"}}setExtension_(t){const e=t.childNodes[0].childNodes[0];e&&"infixop"===e.type&&1===e.contentNodes.length&&a.isMembership(e.contentNodes[0])&&(e.addAnnotation("set","intensional"),e.contentNodes[0].addAnnotation("set","intensional"))}getPunctuationInRow_(t){if(t.length<=1)return t;const e=t=>{const e=t.type;return"punctuation"===e||"text"===e||"operator"===e||"relation"===e},r=l.partitionNodes(t,(function(r){if(!a.isPunctuation(r))return!1;if(a.isPunctuation(r)&&!a.isRole(r,"ellipsis"))return!0;const n=t.indexOf(r);if(0===n)return!t[1]||!e(t[1]);const o=t[n-1];if(n===t.length-1)return!e(o);const i=t[n+1];return!e(o)||!e(i)}));if(0===r.rel.length)return t;const n=[];let o=r.comp.shift();o.length>0&&n.push(c.getInstance().row(o));let i=0;for(;r.comp.length>0;)n.push(r.rel[i++]),o=r.comp.shift(),o.length>0&&n.push(c.getInstance().row(o));return[c.getInstance().punctuatedNode_(n,r.rel)]}punctuatedNode_(t,e){const r=c.getInstance().factory_.makeBranchNode("punctuated",t,e);if(e.length===t.length){const t=e[0].role;if("unknown"!==t&&e.every((function(e){return e.role===t})))return r.role=t,r}return a.singlePunctAtPosition(t,e,0)?r.role="startpunct":a.singlePunctAtPosition(t,e,t.length-1)?r.role="endpunct":e.every((t=>a.isRole(t,"dummy")))?r.role="text":e.every((t=>a.isRole(t,"space")))?r.role="space":r.role="sequence",r}dummyNode_(t){const e=c.getInstance().factory_.makeMultipleContentNodes(t.length-1,o.invisibleComma());return e.forEach((function(t){t.role="dummy"})),c.getInstance().punctuatedNode_(t,e)}accentRole_(t,e){if(!a.isAccent(t))return!1;const r=t.textContent,n=o.lookupSecondary("bar",r)||o.lookupSecondary("tilde",r)||t.role;return t.role="underscore"===e?"underaccent":"overaccent",t.addAnnotation("accent",n),!0}accentNode_(t,e,r,n,o){const i=(e=e.slice(0,n+1))[1],s=e[2];let a;if(!o&&s&&(a=c.getInstance().factory_.makeBranchNode("subscript",[t,i],[]),a.role="subsup",e=[a,s],r="superscript"),o){const n=c.getInstance().accentRole_(i,r);if(s){c.getInstance().accentRole_(s,"overscore")&&!n?(a=c.getInstance().factory_.makeBranchNode("overscore",[t,s],[]),e=[a,i],r="underscore"):(a=c.getInstance().factory_.makeBranchNode("underscore",[t,i],[]),e=[a,s],r="overscore"),a.role="underover"}}return c.getInstance().makeLimitNode_(t,e,a,r)}makeLimitNode_(t,e,r,n){if("limupper"===n&&"limlower"===t.type)return t.childNodes.push(e[1]),e[1].parent=t,t.type="limboth",t;if("limlower"===n&&"limupper"===t.type)return t.childNodes.splice(1,-1,e[1]),e[1].parent=t,t.type="limboth",t;const o=c.getInstance().factory_.makeBranchNode(n,e,[]),i=a.isEmbellished(t);return r&&(r.embellished=i),o.embellished=i,o.role=t.role,o}getFunctionsInRow_(t,e){const r=e||[];if(0===t.length)return r;const n=t.shift(),o=c.classifyFunction_(n,t);if(!o)return r.push(n),c.getInstance().getFunctionsInRow_(t,r);const i=c.getInstance().getFunctionsInRow_(t,[]),s=c.getInstance().getFunctionArgs_(n,i,o);return r.concat(s)}getFunctionArgs_(t,e,r){let n,o,i;switch(r){case"integral":{const r=c.getInstance().getIntegralArgs_(e);if(!r.intvar&&!r.integrand.length)return r.rest.unshift(t),r.rest;const n=c.getInstance().row(r.integrand);return i=c.getInstance().integralNode_(t,n,r.intvar),r.rest.unshift(i),r.rest}case"prefix":if(e[0]&&"fenced"===e[0].type){const r=e.shift();return a.isNeutralFence(r)||(r.role="leftright"),i=c.getInstance().functionNode_(t,r),e.unshift(i),e}if(n=l.sliceNodes(e,a.isPrefixFunctionBoundary),n.head.length)o=c.getInstance().row(n.head),n.div&&n.tail.unshift(n.div);else{if(!n.div||!a.isType(n.div,"appl"))return e.unshift(t),e;o=n.div}return i=c.getInstance().functionNode_(t,o),n.tail.unshift(i),n.tail;case"bigop":return n=l.sliceNodes(e,a.isBigOpBoundary),n.head.length?(o=c.getInstance().row(n.head),i=c.getInstance().bigOpNode_(t,o),n.div&&n.tail.unshift(n.div),n.tail.unshift(i),n.tail):(e.unshift(t),e);default:{if(0===e.length)return[t];const r=e[0];return"fenced"===r.type&&!a.isNeutralFence(r)&&a.isSimpleFunctionScope(r)?(r.role="leftright",c.propagateFunctionRole_(t,"simple function"),i=c.getInstance().functionNode_(t,e.shift()),e.unshift(i),e):(e.unshift(t),e)}}}getIntegralArgs_(t,e=[]){if(0===t.length)return{integrand:e,intvar:null,rest:t};const r=t[0];if(a.isGeneralFunctionBoundary(r))return{integrand:e,intvar:null,rest:t};if(a.isIntegralDxBoundarySingle(r))return r.role="integral",{integrand:e,intvar:r,rest:t.slice(1)};if(t[1]&&a.isIntegralDxBoundary(r,t[1])){const n=c.getInstance().prefixNode_(t[1],[r]);return n.role="integral",{integrand:e,intvar:n,rest:t.slice(2)}}return e.push(t.shift()),c.getInstance().getIntegralArgs_(t,e)}functionNode_(t,e){const r=c.getInstance().factory_.makeContentNode(o.functionApplication()),n=c.getInstance().funcAppls[t.id];n&&(r.mathmlTree=n.mathmlTree,r.mathml=n.mathml,r.annotation=n.annotation,r.attributes=n.attributes,delete c.getInstance().funcAppls[t.id]),r.type="punctuation",r.role="application";const i=c.getFunctionOp_(t,(function(t){return a.isType(t,"function")||a.isType(t,"identifier")&&a.isRole(t,"simple function")}));return c.getInstance().functionalNode_("appl",[t,e],i,[r])}bigOpNode_(t,e){const r=c.getFunctionOp_(t,(t=>a.isType(t,"largeop")));return c.getInstance().functionalNode_("bigop",[t,e],r,[])}integralNode_(t,e,r){e=e||c.getInstance().factory_.makeEmptyNode(),r=r||c.getInstance().factory_.makeEmptyNode();const n=c.getFunctionOp_(t,(t=>a.isType(t,"largeop")));return c.getInstance().functionalNode_("integral",[t,e,r],n,[])}functionalNode_(t,e,r,n){const o=e[0];let i;r&&(i=r.parent,n.push(r));const s=c.getInstance().factory_.makeBranchNode(t,e,n);return s.role=o.role,i&&(r.parent=i),s}fractionNode_(t,e){const r=c.getInstance().factory_.makeBranchNode("fraction",[t,e],[]);return r.role=r.childNodes.every((function(t){return a.isType(t,"number")&&a.isRole(t,"integer")}))?"vulgar":r.childNodes.every(a.isPureUnit)?"unit":"division",i.run("propagateSimpleFunction",r)}scriptNode_(t,e,r){let n;switch(t.length){case 0:n=c.getInstance().factory_.makeEmptyNode();break;case 1:if(n=t[0],r)return n;break;default:n=c.getInstance().dummyNode_(t)}return n.role=e,n}findNestedRow_(t,e,r,o){if(r>3)return null;for(let i,s=0;i=t[s];s++){const t=n.tagName(i);if("MSPACE"!==t){if("MROW"===t)return c.getInstance().findNestedRow_(n.toArray(i.childNodes),e,r+1,o);if(c.findSemantics(i,e,o))return i}}return null}}e.default=c,c.FENCE_TO_PUNCT_={metric:"metric",neutral:"vbar",open:"openfence",close:"closefence"},c.MML_TO_LIMIT_={MSUB:{type:"limlower",length:1},MUNDER:{type:"limlower",length:1},MSUP:{type:"limupper",length:1},MOVER:{type:"limupper",length:1},MSUBSUP:{type:"limboth",length:2},MUNDEROVER:{type:"limboth",length:2}},c.MML_TO_BOUNDS_={MSUB:{type:"subscript",length:1,accent:!1},MSUP:{type:"superscript",length:1,accent:!1},MSUBSUP:{type:"subscript",length:2,accent:!1},MUNDER:{type:"underscore",length:1,accent:!0},MOVER:{type:"overscore",length:1,accent:!0},MUNDEROVER:{type:"underscore",length:2,accent:!0}},c.CLASSIFY_FUNCTION_={integral:"integral",sum:"bigop","prefix function":"prefix","limit function":"prefix","simple function":"prefix","composed function":"prefix"},c.MATHJAX_FONTS={"-tex-caligraphic":"caligraphic","-tex-caligraphic-bold":"caligraphic-bold","-tex-calligraphic":"caligraphic","-tex-calligraphic-bold":"caligraphic-bold","-tex-oldstyle":"oldstyle","-tex-oldstyle-bold":"oldstyle-bold","-tex-mathit":"italic"}},5656:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticSkeleton=void 0;const n=r(707),o=r(5274),i=r(2298);class s{constructor(t){this.parents=null,this.levelsMap=null,t=0===t?t:t||[],this.array=t}static fromTree(t){return s.fromNode(t.root)}static fromNode(t){return new s(s.fromNode_(t))}static fromString(t){return new s(s.fromString_(t))}static simpleCollapseStructure(t){return"number"==typeof t}static contentCollapseStructure(t){return!!t&&!s.simpleCollapseStructure(t)&&"c"===t[0]}static interleaveIds(t,e){return n.interleaveLists(s.collapsedLeafs(t),s.collapsedLeafs(e))}static collapsedLeafs(...t){return t.reduce(((t,e)=>{return t.concat((r=e,s.simpleCollapseStructure(r)?[r]:(r=r,s.contentCollapseStructure(r[1])?r.slice(2):r.slice(1))));var r}),[])}static fromStructure(t,e){return new s(s.tree_(t,e.root))}static combineContentChildren(t,e,r){switch(t.type){case"relseq":case"infixop":case"multirel":return n.interleaveLists(r,e);case"prefixop":return e.concat(r);case"postfixop":return r.concat(e);case"fenced":return r.unshift(e[0]),r.push(e[1]),r;case"appl":return[r[0],e[0],r[1]];case"root":return[r[1],r[0]];case"row":case"line":return e.length&&r.unshift(e[0]),r;default:return r}}static makeSexp_(t){return s.simpleCollapseStructure(t)?t.toString():s.contentCollapseStructure(t)?"(c "+t.slice(1).map(s.makeSexp_).join(" ")+")":"("+t.map(s.makeSexp_).join(" ")+")"}static fromString_(t){let e=t.replace(/\(/g,"[");return e=e.replace(/\)/g,"]"),e=e.replace(/ /g,","),e=e.replace(/c/g,'"c"'),JSON.parse(e)}static fromNode_(t){if(!t)return[];const e=t.contentNodes;let r;e.length&&(r=e.map(s.fromNode_),r.unshift("c"));const n=t.childNodes;if(!n.length)return e.length?[t.id,r]:t.id;const o=n.map(s.fromNode_);return e.length&&o.unshift(r),o.unshift(t.id),o}static tree_(t,e){if(!e)return[];if(!e.childNodes.length)return e.id;const r=e.id,n=[r],a=o.evalXPath(`.//self::*[@${i.Attribute.ID}=${r}]`,t)[0],l=s.combineContentChildren(e,e.contentNodes.map((function(t){return t})),e.childNodes.map((function(t){return t})));a&&s.addOwns_(a,l);for(let e,r=0;e=l[r];r++)n.push(s.tree_(t,e));return n}static addOwns_(t,e){const r=t.getAttribute(i.Attribute.COLLAPSED),n=r?s.realLeafs_(s.fromString(r).array):e.map((t=>t.id));t.setAttribute(i.Attribute.OWNS,n.join(" "))}static realLeafs_(t){if(s.simpleCollapseStructure(t))return[t];if(s.contentCollapseStructure(t))return[];t=t;let e=[];for(let r=1;rs.simpleCollapseStructure(t)?t:s.contentCollapseStructure(t)?t[1]:t[0]))}subtreeNodes(t){if(!this.isRoot(t))return[];const e=(t,r)=>{s.simpleCollapseStructure(t)?r.push(t):(t=t,s.contentCollapseStructure(t)&&(t=t.slice(1)),t.forEach((t=>e(t,r))))},r=this.levelsMap[t],n=[];return e(r.slice(1),n),n}}e.SemanticSkeleton=s},7075:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticTree=void 0;const n=r(5740),o=r(7630),i=r(9265),s=r(7228),a=r(5952),l=r(5609);r(94);class c{constructor(t){this.mathml=t,this.parser=new s.SemanticMathml,this.root=this.parser.parse(t),this.collator=this.parser.getFactory().leafMap.collateMeaning();const e=this.collator.newDefault();e&&(this.parser=new s.SemanticMathml,this.parser.getFactory().defaultMap=e,this.root=this.parser.parse(t)),u.visit(this.root,{}),(0,o.annotate)(this.root)}static empty(){const t=n.parseInput(""),e=new c(t);return e.mathml=t,e}static fromNode(t,e){const r=c.empty();return r.root=t,e&&(r.mathml=e),r}static fromRoot(t,e){let r=t;for(;r.parent;)r=r.parent;const n=c.fromNode(r);return e&&(n.mathml=e),n}static fromXml(t){const e=c.empty();return t.childNodes[0]&&(e.root=a.SemanticNode.fromXml(t.childNodes[0])),e}xml(t){const e=n.parseInput(""),r=this.root.xml(e.ownerDocument,t);return e.appendChild(r),e}toString(t){return n.serializeXml(this.xml(t))}formatXml(t){const e=this.toString(t);return n.formatXml(e)}displayTree(){this.root.displayTree()}replaceNode(t,e){const r=t.parent;r?r.replaceChild(t,e):this.root=e}toJson(){const t={};return t.stree=this.root.toJson(),t}}e.SemanticTree=c;const u=new i.SemanticVisitor("general","unit",((t,e)=>{if("infixop"===t.type&&("multiplication"===t.role||"implicit"===t.role)){const e=t.childNodes;e.length&&(l.isPureUnit(e[0])||l.isUnitCounter(e[0]))&&t.childNodes.slice(1).every(l.isPureUnit)&&(t.role="unit")}return!1}))},4795:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.partitionNodes=e.sliceNodes=e.getEmbellishedInner=e.addAttributes=e.isZeroLength=e.purgeNodes=e.isOrphanedGlyph=e.hasDisplayTag=e.hasEmptyTag=e.hasIgnoreTag=e.hasLeafTag=e.hasMathTag=e.directSpeechKeys=e.DISPLAYTAGS=e.EMPTYTAGS=e.IGNORETAGS=e.LEAFTAGS=void 0;const n=r(5740);function o(t){return!!t&&-1!==e.LEAFTAGS.indexOf(n.tagName(t))}function i(t,e,r){r&&t.reverse();const n=[];for(let o,i=0;o=t[i];i++){if(e(o))return r?{head:t.slice(i+1).reverse(),div:o,tail:n.reverse()}:{head:n,div:o,tail:t.slice(i+1)};n.push(o)}return r?{head:[],div:null,tail:n.reverse()}:{head:n,div:null,tail:[]}}e.LEAFTAGS=["MO","MI","MN","MTEXT","MS","MSPACE"],e.IGNORETAGS=["MERROR","MPHANTOM","MALIGNGROUP","MALIGNMARK","MPRESCRIPTS","ANNOTATION","ANNOTATION-XML"],e.EMPTYTAGS=["MATH","MROW","MPADDED","MACTION","NONE","MSTYLE","SEMANTICS"],e.DISPLAYTAGS=["MROOT","MSQRT"],e.directSpeechKeys=["aria-label","exact-speech","alt"],e.hasMathTag=function(t){return!!t&&"MATH"===n.tagName(t)},e.hasLeafTag=o,e.hasIgnoreTag=function(t){return!!t&&-1!==e.IGNORETAGS.indexOf(n.tagName(t))},e.hasEmptyTag=function(t){return!!t&&-1!==e.EMPTYTAGS.indexOf(n.tagName(t))},e.hasDisplayTag=function(t){return!!t&&-1!==e.DISPLAYTAGS.indexOf(n.tagName(t))},e.isOrphanedGlyph=function(t){return!!t&&"MGLYPH"===n.tagName(t)&&!o(t.parentNode)},e.purgeNodes=function(t){const r=[];for(let o,i=0;o=t[i];i++){if(o.nodeType!==n.NodeType.ELEMENT_NODE)continue;const t=n.tagName(o);-1===e.IGNORETAGS.indexOf(t)&&(-1!==e.EMPTYTAGS.indexOf(t)&&0===o.childNodes.length||r.push(o))}return r},e.isZeroLength=function(t){if(!t)return!1;if(-1!==["negativeveryverythinmathspace","negativeverythinmathspace","negativethinmathspace","negativemediummathspace","negativethickmathspace","negativeverythickmathspace","negativeveryverythickmathspace"].indexOf(t))return!0;const e=t.match(/[0-9.]+/);return!!e&&0===parseFloat(e[0])},e.addAttributes=function(t,r){if(r.hasAttributes()){const n=r.attributes;for(let r=n.length-1;r>=0;r--){const o=n[r].name;o.match(/^ext/)&&(t.attributes[o]=n[r].value,t.nobreaking=!0),-1!==e.directSpeechKeys.indexOf(o)&&(t.attributes["ext-speech"]=n[r].value,t.nobreaking=!0),o.match(/texclass$/)&&(t.attributes.texclass=n[r].value),"href"===o&&(t.attributes.href=n[r].value,t.nobreaking=!0)}}},e.getEmbellishedInner=function t(e){return e&&e.embellished&&e.childNodes.length>0?t(e.childNodes[0]):e},e.sliceNodes=i,e.partitionNodes=function(t,e){let r=t;const n=[],o=[];let s=null;do{s=i(r,e),o.push(s.head),n.push(s.div),r=s.tail}while(s.div);return n.pop(),{rel:n,comp:o}}},6278:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractSpeechGenerator=void 0;const n=r(6828),o=r(2298),i=r(1214),s=r(9543);e.AbstractSpeechGenerator=class{constructor(){this.modality=o.addPrefix("speech"),this.rebuilt_=null,this.options_={}}getRebuilt(){return this.rebuilt_}setRebuilt(t){this.rebuilt_=t}setOptions(t){this.options_=t||{},this.modality=o.addPrefix(this.options_.modality||"speech")}getOptions(){return this.options_}start(){}end(){}generateSpeech(t,e){return this.rebuilt_||(this.rebuilt_=new i.RebuildStree(e)),(0,n.setup)(this.options_),s.computeMarkup(this.getRebuilt().xml)}}},1452:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AdhocSpeechGenerator=void 0;const n=r(6278);class o extends n.AbstractSpeechGenerator{getSpeech(t,e){const r=this.generateSpeech(t,e);return t.setAttribute(this.modality,r),r}}e.AdhocSpeechGenerator=o},5152:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ColorGenerator=void 0;const n=r(2298),o=r(8396),i=r(1214),s=r(1204),a=r(6278);class l extends a.AbstractSpeechGenerator{constructor(){super(...arguments),this.modality=(0,n.addPrefix)("foreground"),this.contrast=new o.ContrastPicker}static visitStree_(t,e,r){if(t.childNodes.length){if(t.contentNodes.length&&("punctuated"===t.type&&t.contentNodes.forEach((t=>r[t.id]=!0)),"implicit"!==t.role&&e.push(t.contentNodes.map((t=>t.id)))),t.childNodes.length){if("implicit"===t.role){const n=[];let o=[];for(const e of t.childNodes){const t=[];l.visitStree_(e,t,r),t.length<=2&&n.push(t.shift()),o=o.concat(t)}return e.push(n),void o.forEach((t=>e.push(t)))}t.childNodes.forEach((t=>l.visitStree_(t,e,r)))}}else r[t.id]||e.push(t.id)}getSpeech(t,e){return s.getAttribute(t,this.modality)}generateSpeech(t,e){return this.getRebuilt()||this.setRebuilt(new i.RebuildStree(t)),this.colorLeaves_(t),s.getAttribute(t,this.modality)}colorLeaves_(t){const e=[];l.visitStree_(this.getRebuilt().streeRoot,e,{});for(const r of e){const e=this.contrast.generate();let n=!1;n=Array.isArray(r)?r.map((r=>this.colorLeave_(t,r,e))).reduce(((t,e)=>t||e),!1):this.colorLeave_(t,r.toString(),e),n&&this.contrast.increment()}}colorLeave_(t,e,r){const n=s.getBySemanticId(t,e);return!!n&&(n.setAttribute(this.modality,r),!0)}}e.ColorGenerator=l},6604:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DirectSpeechGenerator=void 0;const n=r(1204),o=r(6278);class i extends o.AbstractSpeechGenerator{getSpeech(t,e){return n.getAttribute(t,this.modality)}}e.DirectSpeechGenerator=i},3123:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DummySpeechGenerator=void 0;const n=r(6278);class o extends n.AbstractSpeechGenerator{getSpeech(t,e){return""}}e.DummySpeechGenerator=o},5858:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.NodeSpeechGenerator=void 0;const n=r(1204),o=r(4598);class i extends o.TreeSpeechGenerator{getSpeech(t,e){return super.getSpeech(t,e),n.getAttribute(t,this.modality)}}e.NodeSpeechGenerator=i},9552:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.generatorMapping_=e.generator=void 0;const n=r(1452),o=r(5152),i=r(6604),s=r(3123),a=r(5858),l=r(597),c=r(4598);e.generator=function(t){return(e.generatorMapping_[t]||e.generatorMapping_.Direct)()},e.generatorMapping_={Adhoc:()=>new n.AdhocSpeechGenerator,Color:()=>new o.ColorGenerator,Direct:()=>new i.DirectSpeechGenerator,Dummy:()=>new s.DummySpeechGenerator,Node:()=>new a.NodeSpeechGenerator,Summary:()=>new l.SummarySpeechGenerator,Tree:()=>new c.TreeSpeechGenerator}},9543:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.computeSummary_=e.retrieveSummary=e.connectAllMactions=e.connectMactions=e.nodeAtPosition_=e.computePrefix_=e.retrievePrefix=e.addPrefix=e.addModality=e.addSpeech=e.recomputeMarkup=e.computeMarkup=e.recomputeSpeech=e.computeSpeech=void 0;const n=r(8290),o=r(5740),i=r(5274),s=r(2298),a=r(2362),l=r(7075),c=r(1204);function u(t){return a.SpeechRuleEngine.getInstance().evaluateNode(t)}function p(t){return u(l.SemanticTree.fromNode(t).xml())}function h(t){const e=p(t);return n.markup(e)}function f(t){const e=d(t);return n.markup(e)}function d(t){const e=l.SemanticTree.fromRoot(t),r=i.evalXPath('.//*[@id="'+t.id+'"]',e.xml());let n=r[0];return r.length>1&&(n=m(t,r)||n),n?a.SpeechRuleEngine.getInstance().runInSetting({modality:"prefix",domain:"default",style:"default",strict:!0,speech:!0},(function(){return a.SpeechRuleEngine.getInstance().evaluateNode(n)})):[]}function m(t,e){const r=e[0];if(!t.parent)return r;const n=[];for(;t;)n.push(t.id),t=t.parent;const o=function(t,e){for(;e.length&&e.shift().toString()===t.getAttribute("id")&&t.parentNode&&t.parentNode.parentNode;)t=t.parentNode.parentNode;return!e.length};for(let t,r=0;t=e[r];r++)if(o(t,n.slice()))return t;return r}function y(t){return t?a.SpeechRuleEngine.getInstance().runInSetting({modality:"summary",strict:!1,speech:!0},(function(){return a.SpeechRuleEngine.getInstance().evaluateNode(t)})):[]}e.computeSpeech=u,e.recomputeSpeech=p,e.computeMarkup=function(t){const e=u(t);return n.markup(e)},e.recomputeMarkup=h,e.addSpeech=function(t,e,r){const i=o.querySelectorAllByAttrValue(r,"id",e.id.toString())[0],a=i?n.markup(u(i)):h(e);t.setAttribute(s.Attribute.SPEECH,a)},e.addModality=function(t,e,r){const n=h(e);t.setAttribute(r,n)},e.addPrefix=function(t,e){const r=f(e);r&&t.setAttribute(s.Attribute.PREFIX,r)},e.retrievePrefix=f,e.computePrefix_=d,e.nodeAtPosition_=m,e.connectMactions=function(t,e,r){const n=o.querySelectorAll(e,"maction");for(let e,i=0;e=n[i];i++){const n=e.getAttribute("id"),i=o.querySelectorAllByAttrValue(t,"id",n)[0];if(!i)continue;const a=e.childNodes[1],l=a.getAttribute(s.Attribute.ID);let u=c.getBySemanticId(t,l);if(u&&"dummy"!==u.getAttribute(s.Attribute.TYPE))continue;if(u=i.childNodes[0],u.getAttribute("sre-highlighter-added"))continue;const p=a.getAttribute(s.Attribute.PARENT);p&&u.setAttribute(s.Attribute.PARENT,p),u.setAttribute(s.Attribute.TYPE,"dummy"),u.setAttribute(s.Attribute.ID,l);o.querySelectorAllByAttrValue(r,"id",l)[0].setAttribute("alternative",l)}},e.connectAllMactions=function(t,e){const r=o.querySelectorAll(t,"maction");for(let t,n=0;t=r[n];n++){const r=t.childNodes[1].getAttribute(s.Attribute.ID);o.querySelectorAllByAttrValue(e,"id",r)[0].setAttribute("alternative",r)}},e.retrieveSummary=function(t){const e=y(t);return n.markup(e)},e.computeSummary_=y},597:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SummarySpeechGenerator=void 0;const n=r(6278),o=r(9543);class i extends n.AbstractSpeechGenerator{getSpeech(t,e){return o.connectAllMactions(e,this.getRebuilt().xml),this.generateSpeech(t,e)}}e.SummarySpeechGenerator=i},4598:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.TreeSpeechGenerator=void 0;const n=r(2298),o=r(1204),i=r(6278),s=r(9543);class a extends i.AbstractSpeechGenerator{getSpeech(t,e){const r=this.generateSpeech(t,e),i=this.getRebuilt().nodeDict;for(const r in i){const a=i[r],l=o.getBySemanticId(e,r),c=o.getBySemanticId(t,r);l&&c&&(this.modality&&this.modality!==n.Attribute.SPEECH?s.addModality(c,a,this.modality):s.addSpeech(c,a,this.getRebuilt().xml),this.modality===n.Attribute.SPEECH&&s.addPrefix(c,a))}return r}}e.TreeSpeechGenerator=a},313:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.INTERVALS=e.makeLetter=e.numberRules=e.alphabetRules=e.getFont=e.makeInterval=e.generate=e.makeDomains_=e.Domains_=e.Base=e.Embellish=e.Font=void 0;const n=r(5897),o=r(7491),i=r(4356),s=r(2536),a=r(2780);var l,c,u;function p(){const t=i.LOCALE.ALPHABETS,r=(t,e)=>{const r={};return Object.keys(t).forEach((t=>r[t]=!0)),Object.keys(e).forEach((t=>r[t]=!0)),Object.keys(r)};e.Domains_.small=r(t.smallPrefix,t.letterTrans),e.Domains_.capital=r(t.capPrefix,t.letterTrans),e.Domains_.digit=r(t.digitPrefix,t.digitTrans)}function h(t){const e=t.toString(16).toUpperCase();return e.length>3?e:("000"+e).slice(-4)}function f([t,e],r){const n=parseInt(t,16),o=parseInt(e,16),i=[];for(let t=n;t<=o;t++){let e=h(t);!1!==r[e]&&(e=r[e]||e,i.push(e))}return i}function d(t){const e="normal"===t||"fullwidth"===t?"":i.LOCALE.MESSAGES.font[t]||i.LOCALE.MESSAGES.embellish[t]||"";return(0,s.localeFontCombiner)(e)}function m(t,r,n,o,s,a){const l=d(o);for(let o,c,u,p=0;o=t[p],c=r[p],u=n[p];p++){const t=a?i.LOCALE.ALPHABETS.capPrefix:i.LOCALE.ALPHABETS.smallPrefix,r=a?e.Domains_.capital:e.Domains_.small;g(l.combiner,o,c,u,l.font,t,s,i.LOCALE.ALPHABETS.letterTrans,r)}}function y(t,r,n,o,s){const a=d(n);for(let n,l,c=0;n=t[c],l=r[c];c++){const t=i.LOCALE.ALPHABETS.digitPrefix,r=c+s;g(a.combiner,n,l,r,a.font,t,o,i.LOCALE.ALPHABETS.digitTrans,e.Domains_.digit)}}function g(t,e,r,n,o,i,s,l,c){for(let u,p=0;u=c[p];p++){const c=u in l?l[u]:l.default,p=u in i?i[u]:i.default;a.defineRule(e.toString(),u,"default",s,r,t(c(n),o,p))}}!function(t){t.BOLD="bold",t.BOLDFRAKTUR="bold-fraktur",t.BOLDITALIC="bold-italic",t.BOLDSCRIPT="bold-script",t.DOUBLESTRUCK="double-struck",t.FULLWIDTH="fullwidth",t.FRAKTUR="fraktur",t.ITALIC="italic",t.MONOSPACE="monospace",t.NORMAL="normal",t.SCRIPT="script",t.SANSSERIF="sans-serif",t.SANSSERIFITALIC="sans-serif-italic",t.SANSSERIFBOLD="sans-serif-bold",t.SANSSERIFBOLDITALIC="sans-serif-bold-italic"}(l=e.Font||(e.Font={})),function(t){t.SUPER="super",t.SUB="sub",t.CIRCLED="circled",t.PARENTHESIZED="parenthesized",t.PERIOD="period",t.NEGATIVECIRCLED="negative-circled",t.DOUBLECIRCLED="double-circled",t.CIRCLEDSANSSERIF="circled-sans-serif",t.NEGATIVECIRCLEDSANSSERIF="negative-circled-sans-serif",t.COMMA="comma",t.SQUARED="squared",t.NEGATIVESQUARED="negative-squared"}(c=e.Embellish||(e.Embellish={})),function(t){t.LATINCAP="latinCap",t.LATINSMALL="latinSmall",t.GREEKCAP="greekCap",t.GREEKSMALL="greekSmall",t.DIGIT="digit"}(u=e.Base||(e.Base={})),e.Domains_={small:["default"],capital:["default"],digit:["default"]},e.makeDomains_=p,e.generate=function(t){const r=n.default.getInstance().locale;n.default.getInstance().locale=t,o.setLocale(),a.addSymbolRules({locale:t}),p();const s=e.INTERVALS;for(let t,e=0;t=s[e];e++){const e=f(t.interval,t.subst),r=e.map((function(t){return String.fromCodePoint(parseInt(t,16))}));if("offset"in t)y(e,r,t.font,t.category,t.offset||0);else{m(e,r,i.LOCALE.ALPHABETS[t.base],t.font,t.category,!!t.capital)}}n.default.getInstance().locale=r,o.setLocale()},e.makeInterval=f,e.getFont=d,e.alphabetRules=m,e.numberRules=y,e.makeLetter=g,e.INTERVALS=[{interval:["1D400","1D419"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.BOLD},{interval:["1D41A","1D433"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLD},{interval:["1D56C","1D585"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.BOLDFRAKTUR},{interval:["1D586","1D59F"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLDFRAKTUR},{interval:["1D468","1D481"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.BOLDITALIC},{interval:["1D482","1D49B"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLDITALIC},{interval:["1D4D0","1D4E9"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.BOLDSCRIPT},{interval:["1D4EA","1D503"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLDSCRIPT},{interval:["1D538","1D551"],base:u.LATINCAP,subst:{"1D53A":"2102","1D53F":"210D","1D545":"2115","1D547":"2119","1D548":"211A","1D549":"211D","1D551":"2124"},capital:!0,category:"Lu",font:l.DOUBLESTRUCK},{interval:["1D552","1D56B"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.DOUBLESTRUCK},{interval:["1D504","1D51D"],base:u.LATINCAP,subst:{"1D506":"212D","1D50B":"210C","1D50C":"2111","1D515":"211C","1D51D":"2128"},capital:!0,category:"Lu",font:l.FRAKTUR},{interval:["1D51E","1D537"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.FRAKTUR},{interval:["FF21","FF3A"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.FULLWIDTH},{interval:["FF41","FF5A"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.FULLWIDTH},{interval:["1D434","1D44D"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.ITALIC},{interval:["1D44E","1D467"],base:u.LATINSMALL,subst:{"1D455":"210E"},capital:!1,category:"Ll",font:l.ITALIC},{interval:["1D670","1D689"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.MONOSPACE},{interval:["1D68A","1D6A3"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.MONOSPACE},{interval:["0041","005A"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.NORMAL},{interval:["0061","007A"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.NORMAL},{interval:["1D49C","1D4B5"],base:u.LATINCAP,subst:{"1D49D":"212C","1D4A0":"2130","1D4A1":"2131","1D4A3":"210B","1D4A4":"2110","1D4A7":"2112","1D4A8":"2133","1D4AD":"211B"},capital:!0,category:"Lu",font:l.SCRIPT},{interval:["1D4B6","1D4CF"],base:u.LATINSMALL,subst:{"1D4BA":"212F","1D4BC":"210A","1D4C4":"2134"},capital:!1,category:"Ll",font:l.SCRIPT},{interval:["1D5A0","1D5B9"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIF},{interval:["1D5BA","1D5D3"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIF},{interval:["1D608","1D621"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIFITALIC},{interval:["1D622","1D63B"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIFITALIC},{interval:["1D5D4","1D5ED"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIFBOLD},{interval:["1D5EE","1D607"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIFBOLD},{interval:["1D63C","1D655"],base:u.LATINCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIFBOLDITALIC},{interval:["1D656","1D66F"],base:u.LATINSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIFBOLDITALIC},{interval:["0391","03A9"],base:u.GREEKCAP,subst:{"03A2":"03F4"},capital:!0,category:"Lu",font:l.NORMAL},{interval:["03B0","03D0"],base:u.GREEKSMALL,subst:{"03B0":"2207","03CA":"2202","03CB":"03F5","03CC":"03D1","03CD":"03F0","03CE":"03D5","03CF":"03F1","03D0":"03D6"},capital:!1,category:"Ll",font:l.NORMAL},{interval:["1D6A8","1D6C0"],base:u.GREEKCAP,subst:{},capital:!0,category:"Lu",font:l.BOLD},{interval:["1D6C1","1D6E1"],base:u.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLD},{interval:["1D6E2","1D6FA"],base:u.GREEKCAP,subst:{},capital:!0,category:"Lu",font:l.ITALIC},{interval:["1D6FB","1D71B"],base:u.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:l.ITALIC},{interval:["1D71C","1D734"],base:u.GREEKCAP,subst:{},capital:!0,category:"Lu",font:l.BOLDITALIC},{interval:["1D735","1D755"],base:u.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:l.BOLDITALIC},{interval:["1D756","1D76E"],base:u.GREEKCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIFBOLD},{interval:["1D76F","1D78F"],base:u.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIFBOLD},{interval:["1D790","1D7A8"],base:u.GREEKCAP,subst:{},capital:!0,category:"Lu",font:l.SANSSERIFBOLDITALIC},{interval:["1D7A9","1D7C9"],base:u.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:l.SANSSERIFBOLDITALIC},{interval:["0030","0039"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.NORMAL},{interval:["2070","2079"],base:u.DIGIT,subst:{2071:"00B9",2072:"00B2",2073:"00B3"},offset:0,category:"No",font:c.SUPER},{interval:["2080","2089"],base:u.DIGIT,subst:{},offset:0,category:"No",font:c.SUB},{interval:["245F","2473"],base:u.DIGIT,subst:{"245F":"24EA"},offset:0,category:"No",font:c.CIRCLED},{interval:["3251","325F"],base:u.DIGIT,subst:{},offset:21,category:"No",font:c.CIRCLED},{interval:["32B1","32BF"],base:u.DIGIT,subst:{},offset:36,category:"No",font:c.CIRCLED},{interval:["2474","2487"],base:u.DIGIT,subst:{},offset:1,category:"No",font:c.PARENTHESIZED},{interval:["2487","249B"],base:u.DIGIT,subst:{2487:"1F100"},offset:0,category:"No",font:c.PERIOD},{interval:["2775","277F"],base:u.DIGIT,subst:{2775:"24FF"},offset:0,category:"No",font:c.NEGATIVECIRCLED},{interval:["24EB","24F4"],base:u.DIGIT,subst:{},offset:11,category:"No",font:c.NEGATIVECIRCLED},{interval:["24F5","24FE"],base:u.DIGIT,subst:{},offset:1,category:"No",font:c.DOUBLECIRCLED},{interval:["277F","2789"],base:u.DIGIT,subst:{"277F":"1F10B"},offset:0,category:"No",font:c.CIRCLEDSANSSERIF},{interval:["2789","2793"],base:u.DIGIT,subst:{2789:"1F10C"},offset:0,category:"No",font:c.NEGATIVECIRCLEDSANSSERIF},{interval:["FF10","FF19"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.FULLWIDTH},{interval:["1D7CE","1D7D7"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.BOLD},{interval:["1D7D8","1D7E1"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.DOUBLESTRUCK},{interval:["1D7E2","1D7EB"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.SANSSERIF},{interval:["1D7EC","1D7F5"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.SANSSERIFBOLD},{interval:["1D7F6","1D7FF"],base:u.DIGIT,subst:{},offset:0,category:"Nd",font:l.MONOSPACE},{interval:["1F101","1F10A"],base:u.DIGIT,subst:{},offset:0,category:"No",font:c.COMMA},{interval:["24B6","24CF"],base:u.LATINCAP,subst:{},capital:!0,category:"So",font:c.CIRCLED},{interval:["24D0","24E9"],base:u.LATINSMALL,subst:{},capital:!1,category:"So",font:c.CIRCLED},{interval:["1F110","1F129"],base:u.LATINCAP,subst:{},capital:!0,category:"So",font:c.PARENTHESIZED},{interval:["249C","24B5"],base:u.LATINSMALL,subst:{},capital:!1,category:"So",font:c.PARENTHESIZED},{interval:["1F130","1F149"],base:u.LATINCAP,subst:{},capital:!0,category:"So",font:c.SQUARED},{interval:["1F170","1F189"],base:u.LATINCAP,subst:{},capital:!0,category:"So",font:c.NEGATIVESQUARED},{interval:["1F150","1F169"],base:u.LATINCAP,subst:{},capital:!0,category:"So",font:c.NEGATIVECIRCLED}]},8504:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Parser=e.Comparator=e.ClearspeakPreferences=void 0;const n=r(5897),o=r(4440),i=r(1676),s=r(1676),a=r(2780),l=r(2362);class c extends i.DynamicCstr{constructor(t,e){super(t),this.preference=e}static comparator(){return new p(n.default.getInstance().dynamicCstr,s.DynamicProperties.createProp([i.DynamicCstr.DEFAULT_VALUES[s.Axis.LOCALE]],[i.DynamicCstr.DEFAULT_VALUES[s.Axis.MODALITY]],[i.DynamicCstr.DEFAULT_VALUES[s.Axis.DOMAIN]],[i.DynamicCstr.DEFAULT_VALUES[s.Axis.STYLE]]))}static fromPreference(t){const e=t.split(":"),r={},n=u.getProperties(),o=Object.keys(n);for(let t,i=0;t=e[i];i++){const e=t.split("_");if(-1===o.indexOf(e[0]))continue;const i=e[1];i&&i!==c.AUTO&&-1!==n[e[0]].indexOf(i)&&(r[e[0]]=e[1])}return r}static toPreference(t){const e=Object.keys(t),r=[];for(let n=0;ns?-1:i0&&e<20&&r>0&&r<11}function O(t){return o.default.getInstance().style===t}function x(t){if(!t.hasAttribute("annotation"))return!1;const e=t.getAttribute("annotation");return!!/clearspeak:simple$|clearspeak:simple;/.exec(e)}function E(t){if(x(t))return!0;if("subscript"!==t.tagName)return!1;const e=t.childNodes[0].childNodes,r=e[1];return"identifier"===e[0].tagName&&(A(r)||"infixop"===r.tagName&&r.hasAttribute("role")&&"implicit"===r.getAttribute("role")&&C(r))}function A(t){return"number"===t.tagName&&t.hasAttribute("role")&&"integer"===t.getAttribute("role")}function C(t){return i.evalXPath("children/*",t).every((t=>A(t)||"identifier"===t.tagName))}function T(t){return"text"===t.type||"punctuated"===t.type&&"text"===t.role&&_(t.childNodes[0])&&N(t.childNodes.slice(1))||"identifier"===t.type&&"unit"===t.role||"infixop"===t.type&&("implicit"===t.role||"unit"===t.role)}function N(t){for(let e=0;e10?s.LOCALE.NUMBERS.numericOrdinal(e):s.LOCALE.NUMBERS.wordOrdinal(e)},e.NESTING_DEPTH=null,e.nestingDepth=function(t){let r=0;const n=t.textContent,o="open"===t.getAttribute("role")?0:1;let i=t.parentNode;for(;i;)"fenced"===i.tagName&&i.childNodes[0].childNodes[o].textContent===n&&r++,i=i.parentNode;return e.NESTING_DEPTH=r>1?s.LOCALE.NUMBERS.wordOrdinal(r):"",e.NESTING_DEPTH},e.matchingFences=function(t){const e=t.previousSibling;let r,n;return e?(r=e,n=t):(r=t,n=t.nextSibling),n&&(0,h.isMatchingFence)(r.textContent,n.textContent)?[t]:[]},e.insertNesting=w,l.Grammar.getInstance().setCorrection("insertNesting",w),e.fencedArguments=function(t){const e=n.toArray(t.parentNode.childNodes),r=i.evalXPath("../../children/*",t),o=e.indexOf(t);return I(r[o])||I(r[o+1])?[t]:[]},e.simpleArguments=function(t){const e=n.toArray(t.parentNode.childNodes),r=i.evalXPath("../../children/*",t),o=e.indexOf(t);return L(r[o])&&r[o+1]&&(L(r[o+1])||"root"===r[o+1].tagName||"sqrt"===r[o+1].tagName||"superscript"===r[o+1].tagName&&r[o+1].childNodes[0].childNodes[0]&&("number"===r[o+1].childNodes[0].childNodes[0].tagName||"identifier"===r[o+1].childNodes[0].childNodes[0].tagName)&&("2"===r[o+1].childNodes[0].childNodes[1].textContent||"3"===r[o+1].childNodes[0].childNodes[1].textContent))?[t]:[]},e.simpleFactor_=L,e.fencedFactor_=I,e.layoutFactor_=P,e.wordOrdinal=function(t){return s.LOCALE.NUMBERS.wordOrdinal(parseInt(t.textContent,10))}},6141:function(t,e,r){var n=this&&this.__awaiter||function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function s(t){try{l(n.next(t))}catch(t){i(t)}}function a(t){try{l(n.throw(t))}catch(t){i(t)}}function l(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(s,a)}l((n=n.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.loadAjax=e.loadFileSync=e.loadFile=e.parseMaps=e.retrieveFiles=e.standardLoader=e.loadLocale=e.store=void 0;const o=r(2139),i=r(5897),s=r(4440),a=r(7248),l=r(2315),c=r(1676),u=r(2780),p=r(2362),h=r(7491),f=r(313);e.store=u;const d={functions:u.addFunctionRules,symbols:u.addSymbolRules,units:u.addUnitRules,si:u.setSiPrefixes};let m=!1;function y(t=i.default.getInstance().locale){i.EnginePromise.loaded[t]||(i.EnginePromise.loaded[t]=[!1,!1],function(t){if(i.default.getInstance().isIE&&i.default.getInstance().mode===s.Mode.HTTP)return void S(t);b(t)}(t))}function g(){switch(i.default.getInstance().mode){case s.Mode.ASYNC:return M;case s.Mode.HTTP:return x;case s.Mode.SYNC:default:return O}}function b(t){const e=i.default.getInstance().customLoader?i.default.getInstance().customLoader:g(),r=new Promise((r=>{e(t).then((e=>{v(e),i.EnginePromise.loaded[t]=[!0,!0],r(t)}),(e=>{i.EnginePromise.loaded[t]=[!0,!1],console.error(`Unable to load locale: ${t}`),i.default.getInstance().locale=i.default.getInstance().defaultLocale,r(t)}))}));i.EnginePromise.promises[t]=r}function v(t){_(JSON.parse(t))}function _(t,e){let r=!0;for(let n,o=0;n=Object.keys(t)[o];o++){const o=n.split("/");e&&e!==o[0]||("rules"===o[1]?p.SpeechRuleEngine.getInstance().addStore(t[n]):"messages"===o[1]?(0,h.completeLocale)(t[n]):(r&&(f.generate(o[0]),r=!1),t[n].forEach(d[o[1]])))}}function S(t,e){let r=e||1;o.mapsForIE?_(o.mapsForIE,t):r<=5&&setTimeout((()=>S(t,r++)).bind(this),300)}function M(t){const e=a.localePath(t);return new Promise(((t,r)=>{l.default.fs.readFile(e,"utf8",((e,n)=>{if(e)return r(e);t(n)}))}))}function O(t){const e=a.localePath(t);return new Promise(((t,r)=>{let n="{}";try{n=l.default.fs.readFileSync(e,"utf8")}catch(t){return r(t)}t(n)}))}function x(t){const e=a.localePath(t),r=new XMLHttpRequest;return new Promise(((t,n)=>{r.onreadystatechange=function(){if(4===r.readyState){const e=r.status;0===e||e>=200&&e<400?t(r.responseText):n(e)}},r.open("GET",e,!0),r.send()}))}e.loadLocale=function(t=i.default.getInstance().locale){return n(this,void 0,void 0,(function*(){return m||(y(c.DynamicCstr.BASE_LOCALE),m=!0),i.EnginePromise.promises[c.DynamicCstr.BASE_LOCALE].then((()=>n(this,void 0,void 0,(function*(){const e=i.default.getInstance().defaultLocale;return e?(y(e),i.EnginePromise.promises[e].then((()=>n(this,void 0,void 0,(function*(){return y(t),i.EnginePromise.promises[t]}))))):(y(t),i.EnginePromise.promises[t])}))))}))},e.standardLoader=g,e.retrieveFiles=b,e.parseMaps=v,e.loadFile=M,e.loadFileSync=O,e.loadAjax=x},7088:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.leftSubscriptBrief=e.leftSuperscriptBrief=e.leftSubscriptVerbose=e.leftSuperscriptVerbose=e.baselineBrief=e.baselineVerbose=void 0;const n=r(1378);e.baselineVerbose=function(t){return n.baselineVerbose(t).replace(/-$/,"")},e.baselineBrief=function(t){return n.baselineBrief(t).replace(/-$/,"")},e.leftSuperscriptVerbose=function(t){return n.superscriptVerbose(t).replace(/^exposant/,"exposant gauche")},e.leftSubscriptVerbose=function(t){return n.subscriptVerbose(t).replace(/^indice/,"indice gauche")},e.leftSuperscriptBrief=function(t){return n.superscriptBrief(t).replace(/^sup/,"sup gauche")},e.leftSubscriptBrief=function(t){return n.subscriptBrief(t).replace(/^sub/,"sub gauche")}},9577:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MathspeakRules=void 0;const n=r(1676),o=r(365),i=r(7088),s=r(1378),a=r(8437),l=r(7283),c=r(7598);e.MathspeakRules=function(){l.addStore(n.DynamicCstr.BASE_LOCALE+".speech.mathspeak","",{CQFspaceoutNumber:s.spaceoutNumber,CQFspaceoutIdentifier:s.spaceoutIdentifier,CSFspaceoutText:s.spaceoutText,CSFopenFracVerbose:s.openingFractionVerbose,CSFcloseFracVerbose:s.closingFractionVerbose,CSFoverFracVerbose:s.overFractionVerbose,CSFopenFracBrief:s.openingFractionBrief,CSFcloseFracBrief:s.closingFractionBrief,CSFopenFracSbrief:s.openingFractionSbrief,CSFcloseFracSbrief:s.closingFractionSbrief,CSFoverFracSbrief:s.overFractionSbrief,CSFvulgarFraction:a.vulgarFraction,CQFvulgarFractionSmall:s.isSmallVulgarFraction,CSFopenRadicalVerbose:s.openingRadicalVerbose,CSFcloseRadicalVerbose:s.closingRadicalVerbose,CSFindexRadicalVerbose:s.indexRadicalVerbose,CSFopenRadicalBrief:s.openingRadicalBrief,CSFcloseRadicalBrief:s.closingRadicalBrief,CSFindexRadicalBrief:s.indexRadicalBrief,CSFopenRadicalSbrief:s.openingRadicalSbrief,CSFindexRadicalSbrief:s.indexRadicalSbrief,CQFisSmallRoot:s.smallRoot,CSFsuperscriptVerbose:s.superscriptVerbose,CSFsuperscriptBrief:s.superscriptBrief,CSFsubscriptVerbose:s.subscriptVerbose,CSFsubscriptBrief:s.subscriptBrief,CSFbaselineVerbose:s.baselineVerbose,CSFbaselineBrief:s.baselineBrief,CSFleftsuperscriptVerbose:s.superscriptVerbose,CSFleftsubscriptVerbose:s.subscriptVerbose,CSFrightsuperscriptVerbose:s.superscriptVerbose,CSFrightsubscriptVerbose:s.subscriptVerbose,CSFleftsuperscriptBrief:s.superscriptBrief,CSFleftsubscriptBrief:s.subscriptBrief,CSFrightsuperscriptBrief:s.superscriptBrief,CSFrightsubscriptBrief:s.subscriptBrief,CSFunderscript:s.nestedUnderscript,CSFoverscript:s.nestedOverscript,CSFendscripts:s.endscripts,CTFordinalCounter:a.ordinalCounter,CTFwordCounter:a.wordCounter,CTFcontentIterator:o.contentIterator,CQFdetIsSimple:s.determinantIsSimple,CSFRemoveParens:s.removeParens,CQFresetNesting:s.resetNestingDepth,CGFbaselineConstraint:s.generateBaselineConstraint,CGFtensorRules:s.generateTensorRules}),l.addStore("es.speech.mathspeak",n.DynamicCstr.BASE_LOCALE+".speech.mathspeak",{CTFunitMultipliers:c.unitMultipliers,CQFoneLeft:c.oneLeft}),l.addStore("fr.speech.mathspeak",n.DynamicCstr.BASE_LOCALE+".speech.mathspeak",{CSFbaselineVerbose:i.baselineVerbose,CSFbaselineBrief:i.baselineBrief,CSFleftsuperscriptVerbose:i.leftSuperscriptVerbose,CSFleftsubscriptVerbose:i.leftSubscriptVerbose,CSFleftsuperscriptBrief:i.leftSuperscriptBrief,CSFleftsubscriptBrief:i.leftSubscriptBrief})}},1378:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.smallRoot=e.generateTensorRules=e.removeParens=e.generateBaselineConstraint=e.determinantIsSimple=e.nestedOverscript=e.endscripts=e.overscoreNestingDepth=e.nestedUnderscript=e.underscoreNestingDepth=e.indexRadicalSbrief=e.openingRadicalSbrief=e.indexRadicalBrief=e.closingRadicalBrief=e.openingRadicalBrief=e.indexRadicalVerbose=e.closingRadicalVerbose=e.openingRadicalVerbose=e.getRootIndex=e.nestedRadical=e.radicalNestingDepth=e.baselineBrief=e.baselineVerbose=e.superscriptBrief=e.superscriptVerbose=e.subscriptBrief=e.subscriptVerbose=e.nestedSubSuper=e.isSmallVulgarFraction=e.overFractionSbrief=e.closingFractionSbrief=e.openingFractionSbrief=e.closingFractionBrief=e.openingFractionBrief=e.overFractionVerbose=e.closingFractionVerbose=e.openingFractionVerbose=e.nestedFraction=e.fractionNestingDepth=e.computeNestingDepth_=e.containsAttr=e.getNestingDepth=e.resetNestingDepth=e.nestingBarriers=e.spaceoutIdentifier=e.spaceoutNumber=e.spaceoutNodes=e.spaceoutText=void 0;const n=r(707),o=r(5740),i=r(5274),s=r(4356),a=r(3308);let l={};function c(t,e){const r=Array.from(t.textContent),n=[],o=a.default.getInstance(),i=t.ownerDocument;for(let t,s=0;t=r[s];s++){const r=o.getNodeFactory().makeLeafNode(t,"unknown"),s=o.identifierNode(r,"unknown","");e(s),n.push(s.xml(i))}return n}function u(t,r,i,s,a,c){s=s||e.nestingBarriers,a=a||{},c=c||function(t){return!1};const u=o.serializeXml(r);if(l[t]||(l[t]={}),l[t][u])return l[t][u];if(c(r)||i.indexOf(r.tagName)<0)return 0;const p=h(r,i,n.setdifference(s,i),a,c,0);return l[t][u]=p,p}function p(t,e){if(!t.attributes)return!1;const r=o.toArray(t.attributes);for(let t,n=0;t=r[n];n++)if(e[t.nodeName]===t.nodeValue)return!0;return!1}function h(t,e,r,n,i,s){if(i(t)||r.indexOf(t.tagName)>-1||p(t,n))return s;if(e.indexOf(t.tagName)>-1&&s++,!t.childNodes||0===t.childNodes.length)return s;const a=o.toArray(t.childNodes);return Math.max.apply(null,a.map((function(t){return h(t,e,r,n,i,s)})))}function f(t){return u("fraction",t,["fraction"],e.nestingBarriers,{},s.LOCALE.FUNCTIONS.fracNestDepth)}function d(t,e,r){const n=f(t),o=Array(n).fill(e);return r&&o.push(r),o.join(s.LOCALE.MESSAGES.regexp.JOINER_FRAC)}function m(t,e,r){for(;t.parentNode;){const n=t.parentNode,o=n.parentNode;if(!o)break;const i=t.getAttribute&&t.getAttribute("role");("subscript"===o.tagName&&t===n.childNodes[1]||"tensor"===o.tagName&&i&&("leftsub"===i||"rightsub"===i))&&(e=r.sub+s.LOCALE.MESSAGES.regexp.JOINER_SUBSUPER+e),("superscript"===o.tagName&&t===n.childNodes[1]||"tensor"===o.tagName&&i&&("leftsuper"===i||"rightsuper"===i))&&(e=r.sup+s.LOCALE.MESSAGES.regexp.JOINER_SUBSUPER+e),t=o}return e.trim()}function y(t){return u("radical",t,["sqrt","root"],e.nestingBarriers,{})}function g(t,e,r){const n=y(t),o=b(t);return r=o?s.LOCALE.FUNCTIONS.combineRootIndex(r,o):r,1===n?r:s.LOCALE.FUNCTIONS.combineNestedRadical(e,s.LOCALE.FUNCTIONS.radicalNestDepth(n-1),r)}function b(t){const e="sqrt"===t.tagName?"2":i.evalXPath("children/*[1]",t)[0].textContent.trim();return s.LOCALE.MESSAGES.MSroots[e]||""}function v(t){return u("underscore",t,["underscore"],e.nestingBarriers,{},(function(t){return t.tagName&&"underscore"===t.tagName&&"underaccent"===t.childNodes[0].childNodes[1].getAttribute("role")}))}function _(t){return u("overscore",t,["overscore"],e.nestingBarriers,{},(function(t){return t.tagName&&"overscore"===t.tagName&&"overaccent"===t.childNodes[0].childNodes[1].getAttribute("role")}))}e.spaceoutText=function(t){return Array.from(t.textContent).join(" ")},e.spaceoutNodes=c,e.spaceoutNumber=function(t){return c(t,(function(t){t.textContent.match(/\W/)||(t.type="number")}))},e.spaceoutIdentifier=function(t){return c(t,(function(t){t.font="unknown",t.type="identifier"}))},e.nestingBarriers=["cases","cell","integral","line","matrix","multiline","overscore","root","row","sqrt","subscript","superscript","table","underscore","vector"],e.resetNestingDepth=function(t){return l={},[t]},e.getNestingDepth=u,e.containsAttr=p,e.computeNestingDepth_=h,e.fractionNestingDepth=f,e.nestedFraction=d,e.openingFractionVerbose=function(t){return d(t,s.LOCALE.MESSAGES.MS.START,s.LOCALE.MESSAGES.MS.FRAC_V)},e.closingFractionVerbose=function(t){return d(t,s.LOCALE.MESSAGES.MS.END,s.LOCALE.MESSAGES.MS.FRAC_V)},e.overFractionVerbose=function(t){return d(t,s.LOCALE.MESSAGES.MS.FRAC_OVER)},e.openingFractionBrief=function(t){return d(t,s.LOCALE.MESSAGES.MS.START,s.LOCALE.MESSAGES.MS.FRAC_B)},e.closingFractionBrief=function(t){return d(t,s.LOCALE.MESSAGES.MS.END,s.LOCALE.MESSAGES.MS.FRAC_B)},e.openingFractionSbrief=function(t){const e=f(t);return 1===e?s.LOCALE.MESSAGES.MS.FRAC_S:s.LOCALE.FUNCTIONS.combineNestedFraction(s.LOCALE.MESSAGES.MS.NEST_FRAC,s.LOCALE.FUNCTIONS.radicalNestDepth(e-1),s.LOCALE.MESSAGES.MS.FRAC_S)},e.closingFractionSbrief=function(t){const e=f(t);return 1===e?s.LOCALE.MESSAGES.MS.ENDFRAC:s.LOCALE.FUNCTIONS.combineNestedFraction(s.LOCALE.MESSAGES.MS.NEST_FRAC,s.LOCALE.FUNCTIONS.radicalNestDepth(e-1),s.LOCALE.MESSAGES.MS.ENDFRAC)},e.overFractionSbrief=function(t){const e=f(t);return 1===e?s.LOCALE.MESSAGES.MS.FRAC_OVER:s.LOCALE.FUNCTIONS.combineNestedFraction(s.LOCALE.MESSAGES.MS.NEST_FRAC,s.LOCALE.FUNCTIONS.radicalNestDepth(e-1),s.LOCALE.MESSAGES.MS.FRAC_OVER)},e.isSmallVulgarFraction=function(t){return s.LOCALE.FUNCTIONS.fracNestDepth(t)?[t]:[]},e.nestedSubSuper=m,e.subscriptVerbose=function(t){return m(t,s.LOCALE.MESSAGES.MS.SUBSCRIPT,{sup:s.LOCALE.MESSAGES.MS.SUPER,sub:s.LOCALE.MESSAGES.MS.SUB})},e.subscriptBrief=function(t){return m(t,s.LOCALE.MESSAGES.MS.SUB,{sup:s.LOCALE.MESSAGES.MS.SUP,sub:s.LOCALE.MESSAGES.MS.SUB})},e.superscriptVerbose=function(t){return m(t,s.LOCALE.MESSAGES.MS.SUPERSCRIPT,{sup:s.LOCALE.MESSAGES.MS.SUPER,sub:s.LOCALE.MESSAGES.MS.SUB})},e.superscriptBrief=function(t){return m(t,s.LOCALE.MESSAGES.MS.SUP,{sup:s.LOCALE.MESSAGES.MS.SUP,sub:s.LOCALE.MESSAGES.MS.SUB})},e.baselineVerbose=function(t){const e=m(t,"",{sup:s.LOCALE.MESSAGES.MS.SUPER,sub:s.LOCALE.MESSAGES.MS.SUB});return e?e.replace(new RegExp(s.LOCALE.MESSAGES.MS.SUB+"$"),s.LOCALE.MESSAGES.MS.SUBSCRIPT).replace(new RegExp(s.LOCALE.MESSAGES.MS.SUPER+"$"),s.LOCALE.MESSAGES.MS.SUPERSCRIPT):s.LOCALE.MESSAGES.MS.BASELINE},e.baselineBrief=function(t){return m(t,"",{sup:s.LOCALE.MESSAGES.MS.SUP,sub:s.LOCALE.MESSAGES.MS.SUB})||s.LOCALE.MESSAGES.MS.BASE},e.radicalNestingDepth=y,e.nestedRadical=g,e.getRootIndex=b,e.openingRadicalVerbose=function(t){return g(t,s.LOCALE.MESSAGES.MS.NESTED,s.LOCALE.MESSAGES.MS.STARTROOT)},e.closingRadicalVerbose=function(t){return g(t,s.LOCALE.MESSAGES.MS.NESTED,s.LOCALE.MESSAGES.MS.ENDROOT)},e.indexRadicalVerbose=function(t){return g(t,s.LOCALE.MESSAGES.MS.NESTED,s.LOCALE.MESSAGES.MS.ROOTINDEX)},e.openingRadicalBrief=function(t){return g(t,s.LOCALE.MESSAGES.MS.NEST_ROOT,s.LOCALE.MESSAGES.MS.STARTROOT)},e.closingRadicalBrief=function(t){return g(t,s.LOCALE.MESSAGES.MS.NEST_ROOT,s.LOCALE.MESSAGES.MS.ENDROOT)},e.indexRadicalBrief=function(t){return g(t,s.LOCALE.MESSAGES.MS.NEST_ROOT,s.LOCALE.MESSAGES.MS.ROOTINDEX)},e.openingRadicalSbrief=function(t){return g(t,s.LOCALE.MESSAGES.MS.NEST_ROOT,s.LOCALE.MESSAGES.MS.ROOT)},e.indexRadicalSbrief=function(t){return g(t,s.LOCALE.MESSAGES.MS.NEST_ROOT,s.LOCALE.MESSAGES.MS.INDEX)},e.underscoreNestingDepth=v,e.nestedUnderscript=function(t){const e=v(t);return Array(e).join(s.LOCALE.MESSAGES.MS.UNDER)+s.LOCALE.MESSAGES.MS.UNDERSCRIPT},e.overscoreNestingDepth=_,e.endscripts=function(t){return s.LOCALE.MESSAGES.MS.ENDSCRIPTS},e.nestedOverscript=function(t){const e=_(t);return Array(e).join(s.LOCALE.MESSAGES.MS.OVER)+s.LOCALE.MESSAGES.MS.OVERSCRIPT},e.determinantIsSimple=function(t){if("matrix"!==t.tagName||"determinant"!==t.getAttribute("role"))return[];const e=i.evalXPath("children/row/children/cell/children/*",t);for(let t,r=0;t=e[r];r++)if("number"!==t.tagName){if("identifier"===t.tagName){const e=t.getAttribute("role");if("latinletter"===e||"greekletter"===e||"otherletter"===e)continue}return[]}return[t]},e.generateBaselineConstraint=function(){const t=t=>t.map((t=>"ancestor::"+t)),e=t=>"not("+t+")",r=e(t(["subscript","superscript","tensor"]).join(" or ")),n=t(["relseq","multrel"]),o=t(["fraction","punctuation","fenced","sqrt","root"]);let i=[];for(let t,e=0;t=o[e];e++)i=i.concat(n.map((function(e){return t+"/"+e})));return[["ancestor::*/following-sibling::*",r,e(i.join(" | "))].join(" and ")]},e.removeParens=function(t){if(!t.childNodes.length||!t.childNodes[0].childNodes.length||!t.childNodes[0].childNodes[0].childNodes.length)return"";const e=t.childNodes[0].childNodes[0].childNodes[0].textContent;return e.match(/^\(.+\)$/)?e.slice(1,-1):e};const S=new Map([[3,"CSFleftsuperscript"],[4,"CSFleftsubscript"],[2,"CSFbaseline"],[1,"CSFrightsubscript"],[0,"CSFrightsuperscript"]]),M=new Map([[4,2],[3,3],[2,1],[1,4],[0,5]]);function O(t){const e=[];let r="",n="",o=parseInt(t,2);for(let t=0;t<5;t++){const i="children/*["+M.get(t)+"]";if(1&o){const e=S.get(t%5);r="[t] "+e+"Verbose; [n] "+i+";"+r,n="[t] "+e+"Brief; [n] "+i+";"+n}else e.unshift("name("+i+')="empty"');o>>=1}return[e,r,n]}e.generateTensorRules=function(t,e=!0){const r=["11111","11110","11101","11100","10111","10110","10101","10100","01111","01110","01101","01100"];for(let n,o=0;n=r[o];o++){let r="tensor"+n,[o,i,s]=O(n);t.defineRule(r,"default",i,"self::tensor",...o),e&&(t.defineRule(r,"brief",s,"self::tensor",...o),t.defineRule(r,"sbrief",s,"self::tensor",...o));const a=S.get(2);i+="; [t]"+a+"Verbose",s+="; [t]"+a+"Brief",r+="-baseline";const l="((.//*[not(*)])[last()]/@id)!=(((.//ancestor::fraction|ancestor::root|ancestor::sqrt|ancestor::cell|ancestor::line|ancestor::stree)[1]//*[not(*)])[last()]/@id)";t.defineRule(r,"default",i,"self::tensor",l,...o),e&&(t.defineRule(r,"brief",s,"self::tensor",l,...o),t.defineRule(r,"sbrief",s,"self::tensor",l,...o))}},e.smallRoot=function(t){let e=Object.keys(s.LOCALE.MESSAGES.MSroots).length;if(!e)return[];if(e++,!t.childNodes||0===t.childNodes.length||!t.childNodes[0].childNodes)return[];const r=t.childNodes[0].childNodes[0].textContent;if(!/^\d+$/.test(r))return[];const n=parseInt(r,10);return n>1&&n<=e?[t]:[]}},6922:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.implicitIterator=e.relationIterator=e.propagateNumber=e.checkParent_=e.NUMBER_INHIBITORS_=e.NUMBER_PROPAGATORS_=e.enlargeFence=e.indexRadical=e.closingRadical=e.openingRadical=e.radicalNestingDepth=e.nestedRadical=e.overBevelledFraction=e.overFraction=e.closingFraction=e.openingFraction=void 0;const n=r(7052),o=r(5740),i=r(5274),s=r(2105),a=r(5897),l=r(7630),c=r(9265),u=r(4356),p=r(1378);function h(t,e){const r=f(t);return 1===r?e:new Array(r).join(u.LOCALE.MESSAGES.MS.NESTED)+e}function f(t,e){const r=e||0;return t.parentNode?f(t.parentNode,"root"===t.tagName||"sqrt"===t.tagName?r+1:r):r}function d(t){const e="\u2820";if(1===t.length)return e+t;const r=t.split("");return r.every((function(t){return"\u2833"===t}))?e+r.join(e):t.slice(0,-1)+e+t.slice(-1)}function m(t,r){const n=t.parent;if(!n)return!1;const o=n.type;return-1!==e.NUMBER_PROPAGATORS_.indexOf(o)||"prefixop"===o&&"negative"===n.role&&!r.script||"prefixop"===o&&"geometry"===n.role||!("punctuated"!==o||r.enclosed&&"text"!==n.role)}function y(t,r){return t.childNodes.length?(-1!==e.NUMBER_INHIBITORS_.indexOf(t.type)&&(r.script=!0),"fenced"===t.type?(r.number=!1,r.enclosed=!0,["",r]):(m(t,r)&&(r.number=!0,r.enclosed=!1),["",r])):(m(t,r)&&(r.number=!0,r.script=!1,r.enclosed=!1),[r.number?"number":"",{number:!1,enclosed:r.enclosed,script:r.script}])}e.openingFraction=function(t){const e=p.fractionNestingDepth(t);return new Array(e).join(u.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+u.LOCALE.MESSAGES.MS.FRACTION_START},e.closingFraction=function(t){const e=p.fractionNestingDepth(t);return new Array(e).join(u.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+u.LOCALE.MESSAGES.MS.FRACTION_END},e.overFraction=function(t){const e=p.fractionNestingDepth(t);return new Array(e).join(u.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+u.LOCALE.MESSAGES.MS.FRACTION_OVER},e.overBevelledFraction=function(t){const e=p.fractionNestingDepth(t);return new Array(e).join(u.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+"\u2838"+u.LOCALE.MESSAGES.MS.FRACTION_OVER},e.nestedRadical=h,e.radicalNestingDepth=f,e.openingRadical=function(t){return h(t,u.LOCALE.MESSAGES.MS.STARTROOT)},e.closingRadical=function(t){return h(t,u.LOCALE.MESSAGES.MS.ENDROOT)},e.indexRadical=function(t){return h(t,u.LOCALE.MESSAGES.MS.ROOTINDEX)},e.enlargeFence=d,s.Grammar.getInstance().setCorrection("enlargeFence",d),e.NUMBER_PROPAGATORS_=["multirel","relseq","appl","row","line"],e.NUMBER_INHIBITORS_=["subscript","superscript","overscore","underscore"],e.checkParent_=m,e.propagateNumber=y,(0,l.register)(new c.SemanticVisitor("nemeth","number",y,{number:!0})),e.relationIterator=function(t,e){const r=t.slice(0);let s,l=!0;return s=t.length>0?i.evalXPath("../../content/*",t[0]):[],function(){const t=s.shift(),i=r.shift(),c=r[0],h=e?[n.AuditoryDescription.create({text:e},{translate:!0})]:[];if(!t)return h;const f=i?p.nestedSubSuper(i,"",{sup:u.LOCALE.MESSAGES.MS.SUPER,sub:u.LOCALE.MESSAGES.MS.SUB}):"",d=i&&"EMPTY"!==o.tagName(i)||l&&t.parentNode.parentNode&&t.parentNode.parentNode.previousSibling?[n.AuditoryDescription.create({text:"\u2800"+f},{})]:[],m=c&&"EMPTY"!==o.tagName(c)||!s.length&&t.parentNode.parentNode&&t.parentNode.parentNode.nextSibling?[n.AuditoryDescription.create({text:"\u2800"},{})]:[],y=a.default.evaluateNode(t);return l=!1,h.concat(d,y,m)}},e.implicitIterator=function(t,e){const r=t.slice(0);let s;return s=t.length>0?i.evalXPath("../../content/*",t[0]):[],function(){const t=r.shift(),i=r[0],a=s.shift(),l=e?[n.AuditoryDescription.create({text:e},{translate:!0})]:[];if(!a)return l;const c=t&&"NUMBER"===o.tagName(t),u=i&&"NUMBER"===o.tagName(i);return l.concat(c&&u&&"space"===a.getAttribute("role")?[n.AuditoryDescription.create({text:"\u2800"},{})]:[])}}},8437:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ordinalPosition=e.vulgarFraction=e.wordCounter=e.ordinalCounter=void 0;const n=r(9536),o=r(5740),i=r(4356),s=r(4977);e.ordinalCounter=function(t,e){let r=0;return function(){return i.LOCALE.NUMBERS.numericOrdinal(++r)+" "+e}},e.wordCounter=function(t,e){let r=0;return function(){return i.LOCALE.NUMBERS.numberToOrdinal(++r,!1)+" "+e}},e.vulgarFraction=function(t){const e=(0,s.convertVulgarFraction)(t,i.LOCALE.MESSAGES.MS.FRAC_OVER);return e.convertible&&e.enumerator&&e.denominator?[new n.Span(i.LOCALE.NUMBERS.numberToWords(e.enumerator),{extid:t.childNodes[0].childNodes[0].getAttribute("extid"),separator:""}),new n.Span(i.LOCALE.NUMBERS.vulgarSep,{separator:""}),new n.Span(i.LOCALE.NUMBERS.numberToOrdinal(e.denominator,1!==e.enumerator),{extid:t.childNodes[0].childNodes[1].getAttribute("extid")})]:[new n.Span(e.content||"",{extid:t.getAttribute("extid")})]},e.ordinalPosition=function(t){const e=o.toArray(t.parentNode.childNodes);return i.LOCALE.NUMBERS.numericOrdinal(e.indexOf(t)+1).toString()}},9284:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.BrailleRules=e.OtherRules=e.PrefixRules=void 0;const n=r(1676),o=r(365),i=r(1378),s=r(6922),a=r(8437),l=r(7283);e.PrefixRules=function(){l.addStore("en.prefix.default","",{CSFordinalPosition:a.ordinalPosition})},e.OtherRules=function(){l.addStore("en.speech.chromevox","",{CTFnodeCounter:o.nodeCounter,CTFcontentIterator:o.contentIterator}),l.addStore("en.speech.emacspeak","en.speech.chromevox",{CQFvulgarFractionSmall:i.isSmallVulgarFraction,CSFvulgarFraction:a.vulgarFraction})},e.BrailleRules=function(){l.addStore("nemeth.braille.default",n.DynamicCstr.BASE_LOCALE+".speech.mathspeak",{CSFopenFraction:s.openingFraction,CSFcloseFraction:s.closingFraction,CSFoverFraction:s.overFraction,CSFoverBevFraction:s.overBevelledFraction,CSFopenRadical:s.openingRadical,CSFcloseRadical:s.closingRadical,CSFindexRadical:s.indexRadical,CSFsubscript:i.subscriptVerbose,CSFsuperscript:i.superscriptVerbose,CSFbaseline:i.baselineVerbose,CGFtensorRules:t=>i.generateTensorRules(t,!1),CTFrelationIterator:s.relationIterator,CTFimplicitIterator:s.implicitIterator})}},7599:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.init=e.INIT_=void 0;const n=r(5425),o=r(9577),i=r(9284);e.INIT_=!1,e.init=function(){e.INIT_||((0,o.MathspeakRules)(),(0,n.ClearspeakRules)(),(0,i.PrefixRules)(),(0,i.OtherRules)(),(0,i.BrailleRules)(),e.INIT_=!0)}},7283:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.getStore=e.addStore=e.funcStore=void 0;const n=r(1676);e.funcStore=new Map,e.addStore=function(t,r,n){const o={};if(r){const t=e.funcStore.get(r)||{};Object.assign(o,t)}e.funcStore.set(t,Object.assign(o,n))},e.getStore=function(t,r,o){return e.funcStore.get([t,r,o].join("."))||e.funcStore.get([n.DynamicCstr.DEFAULT_VALUES[n.Axis.LOCALE],r,o].join("."))||e.funcStore.get([n.DynamicCstr.BASE_LOCALE,r,o].join("."))||{}}},7598:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.oneLeft=e.leftMostUnit=e.rightMostUnit=e.unitMultipliers=void 0;const n=r(7052),o=r(5274),i=r(4356);e.unitMultipliers=function(t,e){const r=t;let o=0;return function(){const t=n.AuditoryDescription.create({text:a(r[o])&&l(r[o+1])?i.LOCALE.MESSAGES.unitTimes:""},{});return o++,[t]}};const s=["superscript","subscript","overscore","underscore"];function a(t){for(;t;){if("unit"===t.getAttribute("role"))return!0;const e=t.tagName,r=o.evalXPath("children/*",t);t=-1!==s.indexOf(e)?r[0]:r[r.length-1]}return!1}function l(t){for(;t;){if("unit"===t.getAttribute("role"))return!0;t=o.evalXPath("children/*",t)[0]}return!1}e.rightMostUnit=a,e.leftMostUnit=l,e.oneLeft=function(t){for(;t;){if("number"===t.tagName&&"1"===t.textContent)return[t];if("infixop"!==t.tagName||"multiplication"!==t.getAttribute("role")&&"implicit"!==t.getAttribute("role"))return[];t=o.evalXPath("children/*",t)[0]}return[]}},3284:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractWalker=void 0;const n=r(7052),o=r(8290),i=r(5740),s=r(4440),a=r(6828),l=r(8496),c=r(2298),u=r(4356),p=r(2105),h=r(5656),f=r(9552),d=r(9543),m=r(8504),y=r(7730),g=r(1214),b=r(179),v=r(1204),_=r(5274);class S{constructor(t,e,r,n){this.node=t,this.generator=e,this.highlighter=r,this.modifier=!1,this.keyMapping=new Map([[l.KeyCode.UP,this.up.bind(this)],[l.KeyCode.DOWN,this.down.bind(this)],[l.KeyCode.RIGHT,this.right.bind(this)],[l.KeyCode.LEFT,this.left.bind(this)],[l.KeyCode.TAB,this.repeat.bind(this)],[l.KeyCode.DASH,this.expand.bind(this)],[l.KeyCode.SPACE,this.depth.bind(this)],[l.KeyCode.HOME,this.home.bind(this)],[l.KeyCode.X,this.summary.bind(this)],[l.KeyCode.Z,this.detail.bind(this)],[l.KeyCode.V,this.virtualize.bind(this)],[l.KeyCode.P,this.previous.bind(this)],[l.KeyCode.U,this.undo.bind(this)],[l.KeyCode.LESS,this.previousRules.bind(this)],[l.KeyCode.GREATER,this.nextRules.bind(this)]]),this.cursors=[],this.xml_=null,this.rebuilt_=null,this.focus_=null,this.active_=!1,this.node.id?this.id=this.node.id:this.node.hasAttribute(S.SRE_ID_ATTR)?this.id=this.node.getAttribute(S.SRE_ID_ATTR):(this.node.setAttribute(S.SRE_ID_ATTR,S.ID_COUNTER.toString()),this.id=S.ID_COUNTER++),this.rootNode=v.getSemanticRoot(t),this.rootId=this.rootNode.getAttribute(c.Attribute.ID),this.xmlString_=n,this.moved=b.WalkerMoves.ENTER}getXml(){return this.xml_||(this.xml_=i.parseInput(this.xmlString_)),this.xml_}getRebuilt(){return this.rebuilt_||this.rebuildStree(),this.rebuilt_}isActive(){return this.active_}activate(){this.isActive()||(this.generator.start(),this.toggleActive_())}deactivate(){this.isActive()&&(b.WalkerState.setState(this.id,this.primaryId()),this.generator.end(),this.toggleActive_())}getFocus(t=!1){return this.focus_||(this.focus_=this.singletonFocus(this.rootId)),t&&this.updateFocus(),this.focus_}setFocus(t){this.focus_=t}getDepth(){return this.levels.depth()-1}isSpeech(){return this.generator.modality===c.Attribute.SPEECH}focusDomNodes(){return this.getFocus().getDomNodes()}focusSemanticNodes(){return this.getFocus().getSemanticNodes()}speech(){const t=this.focusDomNodes();if(!t.length)return"";const e=this.specialMove();if(null!==e)return e;switch(this.moved){case b.WalkerMoves.DEPTH:return this.depth_();case b.WalkerMoves.SUMMARY:return this.summary_();case b.WalkerMoves.DETAIL:return this.detail_();default:{const e=[],r=this.focusSemanticNodes();for(let n=0,o=t.length;n0}restoreState(){if(!this.highlighter)return;const t=b.WalkerState.getState(this.id);if(!t)return;let e=this.getRebuilt().nodeDict[t];const r=[];for(;e;)r.push(e.id),e=e.parent;for(r.pop();r.length>0;){this.down();const t=r.pop(),e=this.findFocusOnLevel(t);if(!e)break;this.setFocus(e)}this.moved=b.WalkerMoves.ENTER}updateFocus(){this.setFocus(y.Focus.factory(this.getFocus().getSemanticPrimary().id.toString(),this.getFocus().getSemanticNodes().map((t=>t.id.toString())),this.getRebuilt(),this.node))}rebuildStree(){this.rebuilt_=new g.RebuildStree(this.getXml()),this.rootId=this.rebuilt_.stree.root.id.toString(),this.generator.setRebuilt(this.rebuilt_),this.skeleton=h.SemanticSkeleton.fromTree(this.rebuilt_.stree),this.skeleton.populate(),this.focus_=this.singletonFocus(this.rootId),this.levels=this.initLevels(),d.connectMactions(this.node,this.getXml(),this.rebuilt_.xml)}previousLevel(){const t=this.getFocus().getDomPrimary();return t?v.getAttribute(t,c.Attribute.PARENT):this.getFocus().getSemanticPrimary().parent.id.toString()}nextLevel(){const t=this.getFocus().getDomPrimary();let e,r;if(t){e=v.splitAttribute(v.getAttribute(t,c.Attribute.CHILDREN)),r=v.splitAttribute(v.getAttribute(t,c.Attribute.CONTENT));const n=v.getAttribute(t,c.Attribute.TYPE),o=v.getAttribute(t,c.Attribute.ROLE);return this.combineContentChildren(n,o,r,e)}const n=t=>t.id.toString(),o=this.getRebuilt().nodeDict[this.primaryId()];return e=o.childNodes.map(n),r=o.contentNodes.map(n),0===e.length?[]:this.combineContentChildren(o.type,o.role,r,e)}singletonFocus(t){this.getRebuilt();const e=this.retrieveVisuals(t);return this.focusFromId(t,e)}retrieveVisuals(t){if(!this.skeleton)return[t];const e=parseInt(t,10),r=this.skeleton.subtreeNodes(e);if(!r.length)return[t];r.unshift(e);const n={},o=[];_.updateEvaluator(this.getXml());for(const t of r)n[t]||(o.push(t.toString()),n[t]=!0,this.subtreeIds(t,n));return o}subtreeIds(t,e){const r=_.evalXPath(`//*[@data-semantic-id="${t}"]`,this.getXml());_.evalXPath("*//@data-semantic-id",r[0]).forEach((t=>e[parseInt(t.textContent,10)]=!0))}focusFromId(t,e){return y.Focus.factory(t,e,this.getRebuilt(),this.node)}summary(){return this.moved=this.isSpeech()?b.WalkerMoves.SUMMARY:b.WalkerMoves.REPEAT,this.getFocus().clone()}detail(){return this.moved=this.isSpeech()?b.WalkerMoves.DETAIL:b.WalkerMoves.REPEAT,this.getFocus().clone()}specialMove(){return null}virtualize(t){return this.cursors.push({focus:this.getFocus(),levels:this.levels,undo:t||!this.cursors.length}),this.levels=this.levels.clone(),this.getFocus().clone()}previous(){const t=this.cursors.pop();return t?(this.levels=t.levels,t.focus):this.getFocus()}undo(){let t;do{t=this.cursors.pop()}while(t&&!t.undo);return t?(this.levels=t.levels,t.focus):this.getFocus()}update(t){this.generator.setOptions(t),(0,a.setup)(t).then((()=>f.generator("Tree").getSpeech(this.node,this.getXml())))}nextRules(){const t=this.generator.getOptions();return"speech"!==t.modality?this.getFocus():(s.DOMAIN_TO_STYLES[t.domain]=t.style,t.domain="mathspeak"===t.domain?"clearspeak":"mathspeak",t.style=s.DOMAIN_TO_STYLES[t.domain],this.update(t),this.moved=b.WalkerMoves.REPEAT,this.getFocus().clone())}nextStyle(t,e){if("mathspeak"===t){const t=["default","brief","sbrief"],r=t.indexOf(e);return-1===r?e:r>=t.length-1?t[0]:t[r+1]}if("clearspeak"===t){const t=m.ClearspeakPreferences.getLocalePreferences().en;if(!t)return"default";const r=m.ClearspeakPreferences.relevantPreferences(this.getFocus().getSemanticPrimary()),n=m.ClearspeakPreferences.findPreference(e,r),o=t[r].map((function(t){return t.split("_")[1]})),i=o.indexOf(n);if(-1===i)return e;const s=i>=o.length-1?o[0]:o[i+1];return m.ClearspeakPreferences.addPreference(e,r,s)}return e}previousRules(){const t=this.generator.getOptions();return"speech"!==t.modality?this.getFocus():(t.style=this.nextStyle(t.domain,t.style),this.update(t),this.moved=b.WalkerMoves.REPEAT,this.getFocus().clone())}refocus(){let t,e=this.getFocus();for(;!e.getNodes().length;){t=this.levels.peek();const r=this.up();if(!r)break;this.setFocus(r),e=this.getFocus(!0)}this.levels.push(t),this.setFocus(e)}toggleActive_(){this.active_=!this.active_}mergePrefix_(t,e=[]){const r=this.isSpeech()?this.prefix_():"";r&&t.unshift(r);const n=this.isSpeech()?this.postfix_():"";return n&&t.push(n),o.finalize(o.merge(e.concat(t)))}prefix_(){const t=this.getFocus().getDomNodes(),e=this.getFocus().getSemanticNodes();return t[0]?v.getAttribute(t[0],c.Attribute.PREFIX):d.retrievePrefix(e[0])}postfix_(){const t=this.getFocus().getDomNodes();return t[0]?v.getAttribute(t[0],c.Attribute.POSTFIX):""}depth_(){const t=p.Grammar.getInstance().getParameter("depth");p.Grammar.getInstance().setParameter("depth",!0);const e=this.getFocus().getDomPrimary(),r=this.expandable(e)?u.LOCALE.MESSAGES.navigate.EXPANDABLE:this.collapsible(e)?u.LOCALE.MESSAGES.navigate.COLLAPSIBLE:"",i=u.LOCALE.MESSAGES.navigate.LEVEL+" "+this.getDepth(),s=this.getFocus().getSemanticNodes(),a=d.retrievePrefix(s[0]),l=[new n.AuditoryDescription({text:i,personality:{}}),new n.AuditoryDescription({text:a,personality:{}}),new n.AuditoryDescription({text:r,personality:{}})];return p.Grammar.getInstance().setParameter("depth",t),o.finalize(o.markup(l))}actionable_(t){const e=null==t?void 0:t.parentNode;return e&&this.highlighter.isMactionNode(e)?e:null}summary_(){const t=this.getFocus().getSemanticPrimary().id.toString(),e=this.getRebuilt().xml.getAttribute("id")===t?this.getRebuilt().xml:i.querySelectorAllByAttrValue(this.getRebuilt().xml,"id",t)[0],r=d.retrieveSummary(e);return this.mergePrefix_([r])}detail_(){const t=this.getFocus().getSemanticPrimary().id.toString(),e=this.getRebuilt().xml.getAttribute("id")===t?this.getRebuilt().xml:i.querySelectorAllByAttrValue(this.getRebuilt().xml,"id",t)[0],r=e.getAttribute("alternative");e.removeAttribute("alternative");const n=d.computeMarkup(e),o=this.mergePrefix_([n]);return e.setAttribute("alternative",r),o}}e.AbstractWalker=S,S.ID_COUNTER=0,S.SRE_ID_ATTR="sre-explorer-id"},162:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DummyWalker=void 0;const n=r(3284);class o extends n.AbstractWalker{up(){return null}down(){return null}left(){return null}right(){return null}repeat(){return null}depth(){return null}home(){return null}getDepth(){return 0}initLevels(){return null}combineContentChildren(t,e,r,n){return[]}findFocusOnLevel(t){return null}}e.DummyWalker=o},7730:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Focus=void 0;const n=r(1204);class o{constructor(t,e){this.nodes=t,this.primary=e,this.domNodes=[],this.domPrimary_=null,this.allNodes=[]}static factory(t,e,r,i){const s=t=>n.getBySemanticId(i,t),a=r.nodeDict,l=s(t),c=e.map(s),u=e.map((function(t){return a[t]})),p=new o(u,a[t]);return p.domNodes=c,p.domPrimary_=l,p.allNodes=o.generateAllVisibleNodes_(e,c,a,i),p}static generateAllVisibleNodes_(t,e,r,i){const s=t=>n.getBySemanticId(i,t);let a=[];for(let n=0,l=t.length;n=e.length?null:e[t]}depth(){return this.level_.length}clone(){const t=new r;return t.level_=this.level_.slice(0),t}toString(){let t="";for(let e,r=0;e=this.level_[r];r++)t+="\n"+e.map((function(t){return t.toString()}));return t}}e.Levels=r},1214:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.RebuildStree=void 0;const n=r(5740),o=r(2298),i=r(3588),s=r(6537),a=r(3308),l=r(5656),c=r(7075),u=r(4795),p=r(1204);class h{constructor(t){this.mathml=t,this.factory=new s.SemanticNodeFactory,this.nodeDict={},this.mmlRoot=p.getSemanticRoot(t),this.streeRoot=this.assembleTree(this.mmlRoot),this.stree=c.SemanticTree.fromNode(this.streeRoot,this.mathml),this.xml=this.stree.xml(),a.default.getInstance().setNodeFactory(this.factory)}static addAttributes(t,e,r){r&&1===e.childNodes.length&&e.childNodes[0].nodeType!==n.NodeType.TEXT_NODE&&u.addAttributes(t,e.childNodes[0]),u.addAttributes(t,e)}static textContent(t,e,r){if(!r&&e.textContent)return void(t.textContent=e.textContent);const n=p.splitAttribute(p.getAttribute(e,o.Attribute.OPERATOR));n.length>1&&(t.textContent=n[1])}static isPunctuated(t){return!l.SemanticSkeleton.simpleCollapseStructure(t)&&t[1]&&l.SemanticSkeleton.contentCollapseStructure(t[1])}getTree(){return this.stree}assembleTree(t){const e=this.makeNode(t),r=p.splitAttribute(p.getAttribute(t,o.Attribute.CHILDREN)),n=p.splitAttribute(p.getAttribute(t,o.Attribute.CONTENT));if(h.addAttributes(e,t,!(r.length||n.length)),0===n.length&&0===r.length)return h.textContent(e,t),e;if(n.length>0){const t=p.getBySemanticId(this.mathml,n[0]);t&&h.textContent(e,t,!0)}e.contentNodes=n.map((t=>this.setParent(t,e))),e.childNodes=r.map((t=>this.setParent(t,e)));const i=p.getAttribute(t,o.Attribute.COLLAPSED);return i?this.postProcess(e,i):e}makeNode(t){const e=p.getAttribute(t,o.Attribute.TYPE),r=p.getAttribute(t,o.Attribute.ROLE),n=p.getAttribute(t,o.Attribute.FONT),i=p.getAttribute(t,o.Attribute.ANNOTATION)||"",s=p.getAttribute(t,o.Attribute.ID),a=p.getAttribute(t,o.Attribute.EMBELLISHED),l=p.getAttribute(t,o.Attribute.FENCEPOINTER),c=this.createNode(parseInt(s,10));return c.type=e,c.role=r,c.font=n||"unknown",c.parseAnnotation(i),l&&(c.fencePointer=l),a&&(c.embellished=a),c}makePunctuation(t){const e=this.createNode(t);return e.updateContent((0,i.invisibleComma)()),e.role="dummy",e}makePunctuated(t,e,r){const n=this.createNode(e[0]);n.type="punctuated",n.embellished=t.embellished,n.fencePointer=t.fencePointer,n.role=r;const o=e.splice(1,1)[0].slice(1);n.contentNodes=o.map(this.makePunctuation.bind(this)),this.collapsedChildren_(e)}makeEmpty(t,e,r){const n=this.createNode(e);n.type="empty",n.embellished=t.embellished,n.fencePointer=t.fencePointer,n.role=r}makeIndex(t,e,r){if(h.isPunctuated(e))return this.makePunctuated(t,e,r),void(e=e[0]);l.SemanticSkeleton.simpleCollapseStructure(e)&&!this.nodeDict[e.toString()]&&this.makeEmpty(t,e,r)}postProcess(t,e){const r=l.SemanticSkeleton.fromString(e).array;if("subsup"===t.type){const e=this.createNode(r[1][0]);return e.type="subscript",e.role="subsup",t.type="superscript",e.embellished=t.embellished,e.fencePointer=t.fencePointer,this.makeIndex(t,r[1][2],"rightsub"),this.makeIndex(t,r[2],"rightsuper"),this.collapsedChildren_(r),t}if("subscript"===t.type)return this.makeIndex(t,r[2],"rightsub"),this.collapsedChildren_(r),t;if("superscript"===t.type)return this.makeIndex(t,r[2],"rightsuper"),this.collapsedChildren_(r),t;if("tensor"===t.type)return this.makeIndex(t,r[2],"leftsub"),this.makeIndex(t,r[3],"leftsuper"),this.makeIndex(t,r[4],"rightsub"),this.makeIndex(t,r[5],"rightsuper"),this.collapsedChildren_(r),t;if("punctuated"===t.type){if(h.isPunctuated(r)){const e=r.splice(1,1)[0].slice(1);t.contentNodes=e.map(this.makePunctuation.bind(this))}return t}if("underover"===t.type){const e=this.createNode(r[1][0]);return"overaccent"===t.childNodes[1].role?(e.type="overscore",t.type="underscore"):(e.type="underscore",t.type="overscore"),e.role="underover",e.embellished=t.embellished,e.fencePointer=t.fencePointer,this.collapsedChildren_(r),t}return t}createNode(t){const e=this.factory.makeNode(t);return this.nodeDict[t.toString()]=e,e}collapsedChildren_(t){const e=t=>{const r=this.nodeDict[t[0]];r.childNodes=[];for(let n=1,o=t.length;ne.getSemanticPrimary().id===t))}}e.SemanticWalker=i},9806:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SyntaxWalker=void 0;const n=r(707),o=r(3284),i=r(9797);class s extends o.AbstractWalker{constructor(t,e,r,n){super(t,e,r,n),this.node=t,this.generator=e,this.highlighter=r,this.levels=null,this.restoreState()}initLevels(){const t=new i.Levels;return t.push([this.primaryId()]),t}up(){super.up();const t=this.previousLevel();return t?(this.levels.pop(),this.singletonFocus(t)):null}down(){super.down();const t=this.nextLevel();if(0===t.length)return null;const e=this.singletonFocus(t[0]);return e&&this.levels.push(t),e}combineContentChildren(t,e,r,o){switch(t){case"relseq":case"infixop":case"multirel":return(0,n.interleaveLists)(o,r);case"prefixop":return r.concat(o);case"postfixop":return o.concat(r);case"matrix":case"vector":case"fenced":return o.unshift(r[0]),o.push(r[1]),o;case"cases":return o.unshift(r[0]),o;case"punctuated":return"text"===e?(0,n.interleaveLists)(o,r):o;case"appl":return[o[0],r[0],o[1]];case"root":return[o[1],o[0]];default:return o}}left(){super.left();const t=this.levels.indexOf(this.primaryId());if(null===t)return null;const e=this.levels.get(t-1);return e?this.singletonFocus(e):null}right(){super.right();const t=this.levels.indexOf(this.primaryId());if(null===t)return null;const e=this.levels.get(t+1);return e?this.singletonFocus(e):null}findFocusOnLevel(t){return this.singletonFocus(t.toString())}focusDomNodes(){return[this.getFocus().getDomPrimary()]}focusSemanticNodes(){return[this.getFocus().getSemanticPrimary()]}}e.SyntaxWalker=s},1799:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.TableWalker=void 0;const n=r(5740),o=r(8496),i=r(9806),s=r(179);class a extends i.SyntaxWalker{constructor(t,e,r,n){super(t,e,r,n),this.node=t,this.generator=e,this.highlighter=r,this.firstJump=null,this.key_=null,this.row_=0,this.currentTable_=null,this.keyMapping.set(o.KeyCode.ZERO,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.ONE,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.TWO,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.THREE,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.FOUR,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.FIVE,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.SIX,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.SEVEN,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.EIGHT,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.NINE,this.jumpCell.bind(this))}move(t){this.key_=t;const e=super.move(t);return this.modifier=!1,e}up(){return this.moved=s.WalkerMoves.UP,this.eligibleCell_()?this.verticalMove_(!1):super.up()}down(){return this.moved=s.WalkerMoves.DOWN,this.eligibleCell_()?this.verticalMove_(!0):super.down()}jumpCell(){if(!this.isInTable_()||null===this.key_)return this.getFocus();if(this.moved===s.WalkerMoves.ROW){this.moved=s.WalkerMoves.CELL;const t=this.key_-o.KeyCode.ZERO;return this.isLegalJump_(this.row_,t)?this.jumpCell_(this.row_,t):this.getFocus()}const t=this.key_-o.KeyCode.ZERO;return t>this.currentTable_.childNodes.length?this.getFocus():(this.row_=t,this.moved=s.WalkerMoves.ROW,this.getFocus().clone())}undo(){const t=super.undo();return t===this.firstJump&&(this.firstJump=null),t}eligibleCell_(){const t=this.getFocus().getSemanticPrimary();return this.modifier&&"cell"===t.type&&-1!==a.ELIGIBLE_CELL_ROLES.indexOf(t.role)}verticalMove_(t){const e=this.previousLevel();if(!e)return null;const r=this.getFocus(),n=this.levels.indexOf(this.primaryId()),o=this.levels.pop(),i=this.levels.indexOf(e),s=this.levels.get(t?i+1:i-1);if(!s)return this.levels.push(o),null;this.setFocus(this.singletonFocus(s));const a=this.nextLevel();return a[n]?(this.levels.push(a),this.singletonFocus(a[n])):(this.setFocus(r),this.levels.push(o),null)}jumpCell_(t,e){this.firstJump?this.virtualize(!1):(this.firstJump=this.getFocus(),this.virtualize(!0));const r=this.currentTable_.id.toString();let n;do{n=this.levels.pop()}while(-1===n.indexOf(r));this.levels.push(n),this.setFocus(this.singletonFocus(r)),this.levels.push(this.nextLevel());const o=this.currentTable_.childNodes[t-1];return this.setFocus(this.singletonFocus(o.id.toString())),this.levels.push(this.nextLevel()),this.singletonFocus(o.childNodes[e-1].id.toString())}isLegalJump_(t,e){const r=n.querySelectorAllByAttrValue(this.getRebuilt().xml,"id",this.currentTable_.id.toString())[0];if(!r||r.hasAttribute("alternative"))return!1;const o=this.currentTable_.childNodes[t-1];if(!o)return!1;const i=n.querySelectorAllByAttrValue(r,"id",o.id.toString())[0];return!(!i||i.hasAttribute("alternative"))&&!(!o||!o.childNodes[e-1])}isInTable_(){let t=this.getFocus().getSemanticPrimary();for(;t;){if(-1!==a.ELIGIBLE_TABLE_TYPES.indexOf(t.type))return this.currentTable_=t,!0;t=t.parent}return!1}}e.TableWalker=a,a.ELIGIBLE_CELL_ROLES=["determinant","rowvector","binomial","squarematrix","multiline","matrix","vector","cases","table"],a.ELIGIBLE_TABLE_TYPES=["multiline","matrix","vector","cases","table"]},179:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.WalkerState=e.WalkerMoves=void 0,function(t){t.UP="up",t.DOWN="down",t.LEFT="left",t.RIGHT="right",t.REPEAT="repeat",t.DEPTH="depth",t.ENTER="enter",t.EXPAND="expand",t.HOME="home",t.SUMMARY="summary",t.DETAIL="detail",t.ROW="row",t.CELL="cell"}(e.WalkerMoves||(e.WalkerMoves={}));class r{static resetState(t){delete r.STATE[t]}static setState(t,e){r.STATE[t]=e}static getState(t){return r.STATE[t]}}e.WalkerState=r,r.STATE={}},3362:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.walkerMapping_=e.walker=void 0;const n=r(162),o=r(6295),i=r(9806),s=r(1799);e.walker=function(t,r,n,o,i){return(e.walkerMapping_[t.toLowerCase()]||e.walkerMapping_.dummy)(r,n,o,i)},e.walkerMapping_={dummy:(t,e,r,o)=>new n.DummyWalker(t,e,r,o),semantic:(t,e,r,n)=>new o.SemanticWalker(t,e,r,n),syntax:(t,e,r,n)=>new i.SyntaxWalker(t,e,r,n),table:(t,e,r,n)=>new s.TableWalker(t,e,r,n)}},1204:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.getBySemanticId=e.getSemanticRoot=e.getAttribute=e.splitAttribute=void 0;const n=r(5740),o=r(2298);e.splitAttribute=function(t){return t?t.split(/,/):[]},e.getAttribute=function(t,e){return t.getAttribute(e)},e.getSemanticRoot=function(t){if(t.hasAttribute(o.Attribute.TYPE)&&!t.hasAttribute(o.Attribute.PARENT))return t;const e=n.querySelectorAllByAttr(t,o.Attribute.TYPE);for(let t,r=0;t=e[r];r++)if(!t.hasAttribute(o.Attribute.PARENT))return t;return t},e.getBySemanticId=function(t,e){return t.getAttribute(o.Attribute.ID)===e?t:n.querySelectorAllByAttrValue(t,o.Attribute.ID,e)[0]}}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var r=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t].call(r.exports,r,r.exports,__webpack_require__),r.exports}__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var __webpack_exports__={};!function(){var t=__webpack_require__(9515),e=__webpack_require__(3282),r=__webpack_require__(235),n=__webpack_require__(265),o=__webpack_require__(2388);function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0&&void 0!==arguments[0]?arguments[0]:[],e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(MathJax.startup){e&&(MathJax.startup.registerConstructor("tex",MathJax._.input.tex_ts.TeX),MathJax.startup.useInput("tex")),MathJax.config.tex||(MathJax.config.tex={});var r=MathJax.config.tex.packages;MathJax.config.tex.packages=t,r&&(0,xt.insert)(MathJax.config.tex,{packages:r})}}(["base","ams","newcommand","noundefined","require","autoload","configmacros"]);var pe=__webpack_require__(2892),he=__webpack_require__(625),fe=__webpack_require__(2769);MathJax.loader&&MathJax.loader.checkVersion("input/mml",e.VERSION,"input"),(0,t.combineWithMathJax)({_:{input:{mathml_ts:pe,mathml:{FindMathML:he,MathMLCompile:fe}}}}),MathJax.startup&&(MathJax.startup.registerConstructor("mml",pe.MathML),MathJax.startup.useInput("mml")),MathJax.loader&&MathJax.loader.pathFilters.add((function(t){return t.name=t.name.replace(/\/util\/entities\/.*?\.js/,"/input/mml/entities.js"),!0}));var de=__webpack_require__(50),me=__webpack_require__(8042),ye=__webpack_require__(8270),ge=__webpack_require__(6797),be=__webpack_require__(5355),ve=__webpack_require__(9261),_e=__webpack_require__(9086),Se=__webpack_require__(95),Me=__webpack_require__(1148),Oe=__webpack_require__(8102),xe=__webpack_require__(804),Ee=__webpack_require__(8147),Ae=__webpack_require__(2275),Ce=__webpack_require__(9063),Te=__webpack_require__(6911),Ne=__webpack_require__(1653),we=__webpack_require__(6781),Le=__webpack_require__(6460),Ie=__webpack_require__(6287),Pe=__webpack_require__(5964),Re=__webpack_require__(8776),ke=__webpack_require__(4798),je=__webpack_require__(4597),Be=__webpack_require__(2970),De=__webpack_require__(5610),Fe=__webpack_require__(4300),He=__webpack_require__(8002),Ue=__webpack_require__(7056),Xe=__webpack_require__(1259),Ve=__webpack_require__(3571),qe=__webpack_require__(6590),We=__webpack_require__(8650),Ge=__webpack_require__(421),ze=__webpack_require__(5884),Je=__webpack_require__(5552),Ke=__webpack_require__(3055),$e=__webpack_require__(7519),Ye=__webpack_require__(4420),Ze=__webpack_require__(9800),Qe=__webpack_require__(1160),tr=__webpack_require__(1956),er=__webpack_require__(7490),rr=__webpack_require__(7313),nr=__webpack_require__(7555),or=__webpack_require__(2688),ir=__webpack_require__(5636),sr=__webpack_require__(5723),ar=__webpack_require__(8009),lr=__webpack_require__(5023),cr=__webpack_require__(7096),ur=__webpack_require__(6898),pr=__webpack_require__(6991),hr=__webpack_require__(8411),fr=__webpack_require__(4126),dr=__webpack_require__(258),mr=__webpack_require__(4093),yr=__webpack_require__(905),gr=__webpack_require__(6237),br=__webpack_require__(5164),vr=__webpack_require__(6319),_r=__webpack_require__(5766),Sr=__webpack_require__(1971),Mr=__webpack_require__(167),Or=__webpack_require__(5806);MathJax.loader&&MathJax.loader.checkVersion("output/chtml",e.VERSION,"output"),(0,t.combineWithMathJax)({_:{output:{chtml_ts:de,chtml:{FontData:me,Notation:ye,Usage:ge,Wrapper:be,WrapperFactory:ve,Wrappers_ts:_e,Wrappers:{TeXAtom:Se,TextNode:Me,maction:Oe,math:xe,menclose:Ee,mfenced:Ae,mfrac:Ce,mglyph:Te,mi:Ne,mmultiscripts:we,mn:Le,mo:Ie,mpadded:Pe,mroot:Re,mrow:ke,ms:je,mspace:Be,msqrt:De,msubsup:Fe,mtable:He,mtd:Ue,mtext:Xe,mtr:Ve,munderover:qe,scriptbase:We,semantics:Ge}},common:{FontData:ze,Notation:Je,OutputJax:Ke,Wrapper:$e,WrapperFactory:Ye,Wrappers:{TeXAtom:Ze,TextNode:Qe,maction:tr,math:er,menclose:rr,mfenced:nr,mfrac:or,mglyph:ir,mi:sr,mmultiscripts:ar,mn:lr,mo:cr,mpadded:ur,mroot:pr,mrow:hr,ms:fr,mspace:dr,msqrt:mr,msubsup:yr,mtable:gr,mtd:br,mtext:vr,mtr:_r,munderover:Sr,scriptbase:Mr,semantics:Or}}}}}),MathJax.loader&&(0,t.combineDefaults)(MathJax.config.loader,"output/chtml",{checkReady:function(){return MathJax.loader.load("output/chtml/fonts/tex")}}),MathJax.startup&&(MathJax.startup.registerConstructor("chtml",de.CHTML),MathJax.startup.useOutput("chtml"));var xr=__webpack_require__(2760),Er=__webpack_require__(4005),Ar=__webpack_require__(1015),Cr=__webpack_require__(6555),Tr=__webpack_require__(2183),Nr=__webpack_require__(3490),wr=__webpack_require__(9056),Lr=__webpack_require__(3019),Ir=__webpack_require__(2713),Pr=__webpack_require__(7517),Rr=__webpack_require__(4182),kr=__webpack_require__(2679),jr=__webpack_require__(5469),Br=__webpack_require__(775),Dr=__webpack_require__(9551),Fr=__webpack_require__(6530),Hr=__webpack_require__(4409),Ur=__webpack_require__(5292),Xr=__webpack_require__(3980),Vr=__webpack_require__(1103),qr=__webpack_require__(9124),Wr=__webpack_require__(6001),Gr=__webpack_require__(3696),zr=__webpack_require__(9587),Jr=__webpack_require__(8348),Kr=__webpack_require__(1376),$r=__webpack_require__(1439),Yr=__webpack_require__(331),Zr=__webpack_require__(4886),Qr=__webpack_require__(4471),tn=__webpack_require__(5181),en=__webpack_require__(3526),rn=__webpack_require__(5649),nn=__webpack_require__(7153),on=__webpack_require__(5745),sn=__webpack_require__(1411),an=__webpack_require__(6384),ln=__webpack_require__(6041),cn=__webpack_require__(8199),un=__webpack_require__(9848),pn=__webpack_require__(7906),hn=__webpack_require__(2644),fn=__webpack_require__(4926);if(MathJax.loader&&MathJax.loader.checkVersion("output/chtml/fonts/tex",e.VERSION,"chtml-font"),(0,t.combineWithMathJax)({_:{output:{chtml:{fonts:{tex_ts:xr,tex:{"bold-italic":Er,bold:Ar,"fraktur-bold":Cr,fraktur:Tr,italic:Nr,largeop:wr,monospace:Lr,normal:Ir,"sans-serif-bold-italic":Pr,"sans-serif-bold":Rr,"sans-serif-italic":kr,"sans-serif":jr,smallop:Br,"tex-calligraphic-bold":Dr,"tex-size3":Fr,"tex-size4":Hr,"tex-variant":Ur}}},common:{fonts:{tex:{"bold-italic":Xr,bold:Vr,delimiters:qr,"double-struck":Wr,"fraktur-bold":Gr,fraktur:zr,italic:Jr,largeop:Kr,monospace:$r,normal:Yr,"sans-serif-bold-italic":Zr,"sans-serif-bold":Qr,"sans-serif-italic":tn,"sans-serif":en,"script-bold":rn,script:nn,smallop:on,"tex-calligraphic-bold":sn,"tex-calligraphic":an,"tex-mathit":ln,"tex-oldstyle-bold":cn,"tex-oldstyle":un,"tex-size3":pn,"tex-size4":hn,"tex-variant":fn}}}}}}),MathJax.startup){(0,t.combineDefaults)(MathJax.config,"chtml",{fontURL:n.Package.resolvePath("output/chtml/fonts/woff-v2",!1)});var dn=(0,xt.selectOptionsFromKeys)(MathJax.config.chtml||{},xr.TeXFont.OPTIONS);(0,t.combineDefaults)(MathJax.config,"chtml",{font:new xr.TeXFont(dn)})}var mn=__webpack_require__(5865),yn=__webpack_require__(8310),gn=__webpack_require__(4001),bn=__webpack_require__(473),vn=__webpack_require__(4414);MathJax.loader&&MathJax.loader.checkVersion("ui/menu",e.VERSION,"ui"),(0,t.combineWithMathJax)({_:{ui:{menu:{MJContextMenu:mn,Menu:yn,MenuHandler:gn,MmlVisitor:bn,SelectableInfo:vn}}}}),MathJax.startup&&"undefined"!=typeof window&&MathJax.startup.extendHandler((function(t){return(0,gn.MenuHandler)(t)}),20);var _n=__webpack_require__(351);function Sn(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},T=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AssistiveMmlHandler=e.AssistiveMmlMathDocumentMixin=e.AssistiveMmlMathItemMixin=e.LimitedMmlVisitor=void 0;var a=r(4474),l=r(9259),c=r(7233),u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getAttributes=function(e){return t.prototype.getAttributes.call(this,e).replace(/ ?id=".*?"/,"")},e}(l.SerializedMmlVisitor);function p(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.assistiveMml=function(t,e){if(void 0===e&&(e=!1),!(this.state()>=a.STATE.ASSISTIVEMML)){if(!this.isEscaped&&(t.options.enableAssistiveMml||e)){var r=t.adaptor,n=t.toMML(this.root).replace(/\n */g,"").replace(//g,""),o=r.firstChild(r.body(r.parse(n,"text/html"))),i=r.node("mjx-assistive-mml",{unselectable:"on",display:this.display?"block":"inline"},[o]);r.setAttribute(r.firstChild(this.typesetRoot),"aria-hidden","true"),r.setStyle(this.typesetRoot,"position","relative"),r.append(this.typesetRoot,i)}this.state(a.STATE.ASSISTIVEMML)}},e}(t)}function h(t){var e;return e=function(t){function e(){for(var e=[],r=0;r0&&o[o.length-1])||6!==i[0]&&2!==i[0])){Q=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLAdaptor=void 0;var Q=function(t){function e(e){var r=t.call(this,e.document)||this;return r.window=e,r.parser=new e.DOMParser,r}return o(e,t),e.prototype.parse=function(t,e){return void 0===e&&(e="text/html"),this.parser.parseFromString(t,e)},e.prototype.create=function(t,e){return e?this.document.createElementNS(e,t):this.document.createElement(t)},e.prototype.text=function(t){return this.document.createTextNode(t)},e.prototype.head=function(t){return t.head||t},e.prototype.body=function(t){return t.body||t},e.prototype.root=function(t){return t.documentElement||t},e.prototype.doctype=function(t){return t.doctype?""):""},e.prototype.tags=function(t,e,r){void 0===r&&(r=null);var n=r?t.getElementsByTagNameNS(r,e):t.getElementsByTagName(e);return Array.from(n)},e.prototype.getElements=function(t,e){var r,n,o=[];try{for(var Q=i(t),T=Q.next();!T.done;T=Q.next()){var s=T.value;"string"==typeof s?o=o.concat(Array.from(this.document.querySelectorAll(s))):Array.isArray(s)||s instanceof this.window.NodeList||s instanceof this.window.HTMLCollection?o=o.concat(Array.from(s)):o.push(s)}}catch(t){r={error:t}}finally{try{T&&!T.done&&(n=Q.return)&&n.call(Q)}finally{if(r)throw r.error}}return o},e.prototype.contains=function(t,e){return t.contains(e)},e.prototype.parent=function(t){return t.parentNode},e.prototype.append=function(t,e){return t.appendChild(e)},e.prototype.insert=function(t,e){return this.parent(e).insertBefore(t,e)},e.prototype.remove=function(t){return this.parent(t).removeChild(t)},e.prototype.replace=function(t,e){return this.parent(e).replaceChild(t,e)},e.prototype.clone=function(t){return t.cloneNode(!0)},e.prototype.split=function(t,e){return t.splitText(e)},e.prototype.next=function(t){return t.nextSibling},e.prototype.previous=function(t){return t.previousSibling},e.prototype.firstChild=function(t){return t.firstChild},e.prototype.lastChild=function(t){return t.lastChild},e.prototype.childNodes=function(t){return Array.from(t.childNodes)},e.prototype.childNode=function(t,e){return t.childNodes[e]},e.prototype.kind=function(t){var e=t.nodeType;return 1===e||3===e||8===e?t.nodeName.toLowerCase():""},e.prototype.value=function(t){return t.nodeValue||""},e.prototype.textContent=function(t){return t.textContent},e.prototype.innerHTML=function(t){return t.innerHTML},e.prototype.outerHTML=function(t){return t.outerHTML},e.prototype.serializeXML=function(t){return(new this.window.XMLSerializer).serializeToString(t)},e.prototype.setAttribute=function(t,e,r,n){return void 0===n&&(n=null),n?(e=n.replace(/.*\//,"")+":"+e.replace(/^.*:/,""),t.setAttributeNS(n,e,r)):t.setAttribute(e,r)},e.prototype.getAttribute=function(t,e){return t.getAttribute(e)},e.prototype.removeAttribute=function(t,e){return t.removeAttribute(e)},e.prototype.hasAttribute=function(t,e){return t.hasAttribute(e)},e.prototype.allAttributes=function(t){return Array.from(t.attributes).map((function(t){return{name:t.name,value:t.value}}))},e.prototype.addClass=function(t,e){t.classList?t.classList.add(e):t.className=(t.className+" "+e).trim()},e.prototype.removeClass=function(t,e){t.classList?t.classList.remove(e):t.className=t.className.split(/ /).filter((function(t){return t!==e})).join(" ")},e.prototype.hasClass=function(t,e){return t.classList?t.classList.contains(e):t.className.split(/ /).indexOf(e)>=0},e.prototype.setStyle=function(t,e,r){t.style[e]=r},e.prototype.getStyle=function(t,e){return t.style[e]},e.prototype.allStyles=function(t){return t.style.cssText},e.prototype.insertRules=function(t,e){var r,n;try{for(var o=i(e.reverse()),Q=o.next();!Q.done;Q=o.next()){var T=Q.value;try{t.sheet.insertRule(T,0)}catch(t){console.warn("MathJax: can't insert css rule '".concat(T,"': ").concat(t.message))}}}catch(t){r={error:t}}finally{try{Q&&!Q.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.fontSize=function(t){var e=this.window.getComputedStyle(t);return parseFloat(e.fontSize)},e.prototype.fontFamily=function(t){return this.window.getComputedStyle(t).fontFamily||""},e.prototype.nodeSize=function(t,e,r){if(void 0===e&&(e=1),void 0===r&&(r=!1),r&&t.getBBox){var n=t.getBBox();return[n.width/e,n.height/e]}return[t.offsetWidth/e,t.offsetHeight/e]},e.prototype.nodeBBox=function(t){var e=t.getBoundingClientRect();return{left:e.left,right:e.right,top:e.top,bottom:e.bottom}},e}(r(5009).AbstractDOMAdaptor);e.HTMLAdaptor=Q},6191:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.browserAdaptor=void 0;var n=r(444);e.browserAdaptor=function(){return new n.HTMLAdaptor(window)}},9515:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MathJax=e.combineWithMathJax=e.combineDefaults=e.combineConfig=e.isObject=void 0;var o=r(3282);function i(t){return"object"==typeof t&&null!==t}function Q(t,e){var r,o;try{for(var T=n(Object.keys(e)),s=T.next();!s.done;s=T.next()){var a=s.value;"__esModule"!==a&&(!i(t[a])||!i(e[a])||e[a]instanceof Promise?null!==e[a]&&void 0!==e[a]&&(t[a]=e[a]):Q(t[a],e[a]))}}catch(t){r={error:t}}finally{try{s&&!s.done&&(o=T.return)&&o.call(T)}finally{if(r)throw r.error}}return t}e.isObject=i,e.combineConfig=Q,e.combineDefaults=function t(e,r,o){var Q,T;e[r]||(e[r]={}),e=e[r];try{for(var s=n(Object.keys(o)),a=s.next();!a.done;a=s.next()){var l=a.value;i(e[l])&&i(o[l])?t(e,l,o[l]):null==e[l]&&null!=o[l]&&(e[l]=o[l])}}catch(t){Q={error:t}}finally{try{a&&!a.done&&(T=s.return)&&T.call(s)}finally{if(Q)throw Q.error}}return e},e.combineWithMathJax=function(t){return Q(e.MathJax,t)},void 0===r.g.MathJax&&(r.g.MathJax={}),r.g.MathJax.version||(r.g.MathJax={version:o.VERSION,_:{},config:r.g.MathJax}),e.MathJax=r.g.MathJax},235:function(t,e,r){var n,o,i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CONFIG=e.MathJax=e.Loader=e.PathFilters=e.PackageError=e.Package=void 0;var Q=r(9515),T=r(265),s=r(265);Object.defineProperty(e,"Package",{enumerable:!0,get:function(){return s.Package}}),Object.defineProperty(e,"PackageError",{enumerable:!0,get:function(){return s.PackageError}});var a,l=r(7525);if(e.PathFilters={source:function(t){return e.CONFIG.source.hasOwnProperty(t.name)&&(t.name=e.CONFIG.source[t.name]),!0},normalize:function(t){var e=t.name;return e.match(/^(?:[a-z]+:\/)?\/|[a-z]:\\|\[/i)||(t.name="[mathjax]/"+e.replace(/^\.\//,"")),t.addExtension&&!e.match(/\.[^\/]+$/)&&(t.name+=".js"),!0},prefix:function(t){for(var r;(r=t.name.match(/^\[([^\]]*)\]/))&&e.CONFIG.paths.hasOwnProperty(r[1]);)t.name=e.CONFIG.paths[r[1]]+t.name.substr(r[0].length);return!0}},function(t){var r=Q.MathJax.version;t.versions=new Map,t.ready=function(){for(var t,e,r=[],n=0;n=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},Q=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},T=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractDOMAdaptor=void 0;var n=function(){function t(t){void 0===t&&(t=null),this.document=t}return t.prototype.node=function(t,e,n,o){var i,Q;void 0===e&&(e={}),void 0===n&&(n=[]);var T=this.create(t,o);this.setAttributes(T,e);try{for(var s=r(n),a=s.next();!a.done;a=s.next()){var l=a.value;this.append(T,l)}}catch(t){i={error:t}}finally{try{a&&!a.done&&(Q=s.return)&&Q.call(s)}finally{if(i)throw i.error}}return T},t.prototype.setAttributes=function(t,e){var n,o,i,Q,T,s;if(e.style&&"string"!=typeof e.style)try{for(var a=r(Object.keys(e.style)),l=a.next();!l.done;l=a.next()){var c=l.value;this.setStyle(t,c.replace(/-([a-z])/g,(function(t,e){return e.toUpperCase()})),e.style[c])}}catch(t){n={error:t}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}if(e.properties)try{for(var u=r(Object.keys(e.properties)),p=u.next();!p.done;p=u.next()){t[c=p.value]=e.properties[c]}}catch(t){i={error:t}}finally{try{p&&!p.done&&(Q=u.return)&&Q.call(u)}finally{if(i)throw i.error}}try{for(var h=r(Object.keys(e)),d=h.next();!d.done;d=h.next()){"style"===(c=d.value)&&"string"!=typeof e.style||"properties"===c||this.setAttribute(t,c,e[c])}}catch(t){T={error:t}}finally{try{d&&!d.done&&(s=h.return)&&s.call(h)}finally{if(T)throw T.error}}},t.prototype.replace=function(t,e){return this.insert(t,e),this.remove(e),e},t.prototype.childNode=function(t,e){return this.childNodes(t)[e]},t.prototype.allClasses=function(t){var e=this.getAttribute(t,"class");return e?e.replace(/ +/g," ").replace(/^ /,"").replace(/ $/,"").split(/ /):[]},t}();e.AbstractDOMAdaptor=n},3494:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractFindMath=void 0;var n=r(7233),o=function(){function t(t){var e=this.constructor;this.options=(0,n.userOptions)((0,n.defaultOptions)({},e.OPTIONS),t)}return t.OPTIONS={},t}();e.AbstractFindMath=o},3670:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractHandler=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(r(5722).AbstractMathDocument),Q=function(){function t(t,e){void 0===e&&(e=5),this.documentClass=i,this.adaptor=t,this.priority=e}return Object.defineProperty(t.prototype,"name",{get:function(){return this.constructor.NAME},enumerable:!1,configurable:!0}),t.prototype.handlesDocument=function(t){return!1},t.prototype.create=function(t,e){return new this.documentClass(t,this.adaptor,e)},t.NAME="generic",t}();e.AbstractHandler=Q},805:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.HandlerList=void 0;var Q=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.register=function(t){return this.add(t,t.priority)},e.prototype.unregister=function(t){this.remove(t)},e.prototype.handlesDocument=function(t){var e,r;try{for(var n=i(this),o=n.next();!o.done;o=n.next()){var Q=o.value.item;if(Q.handlesDocument(t))return Q}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}throw new Error("Can't find handler for document")},e.prototype.document=function(t,e){return void 0===e&&(e=null),this.handlesDocument(t).create(t,e)},e}(r(8666).PrioritizedList);e.HandlerList=Q},9206:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractInputJax=void 0;var n=r(7233),o=r(7525),i=function(){function t(t){void 0===t&&(t={}),this.adaptor=null,this.mmlFactory=null;var e=this.constructor;this.options=(0,n.userOptions)((0,n.defaultOptions)({},e.OPTIONS),t),this.preFilters=new o.FunctionList,this.postFilters=new o.FunctionList}return Object.defineProperty(t.prototype,"name",{get:function(){return this.constructor.NAME},enumerable:!1,configurable:!0}),t.prototype.setAdaptor=function(t){this.adaptor=t},t.prototype.setMmlFactory=function(t){this.mmlFactory=t},t.prototype.initialize=function(){},t.prototype.reset=function(){for(var t=[],e=0;e=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},Q=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},T=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=e&&T.item.renderDoc(t))return}}catch(t){r={error:t}}finally{try{Q&&!Q.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.renderMath=function(t,e,r){var n,o;void 0===r&&(r=u.STATE.UNPROCESSED);try{for(var Q=i(this.items),T=Q.next();!T.done;T=Q.next()){var s=T.value;if(s.priority>=r&&s.item.renderMath(t,e))return}}catch(t){n={error:t}}finally{try{T&&!T.done&&(o=Q.return)&&o.call(Q)}finally{if(n)throw n.error}}},e.prototype.renderConvert=function(t,e,r){var n,o;void 0===r&&(r=u.STATE.LAST);try{for(var Q=i(this.items),T=Q.next();!T.done;T=Q.next()){var s=T.value;if(s.priority>r)return;if(s.item.convert&&s.item.renderMath(t,e))return}}catch(t){n={error:t}}finally{try{T&&!T.done&&(o=Q.return)&&o.call(Q)}finally{if(n)throw n.error}}},e.prototype.findID=function(t){var e,r;try{for(var n=i(this.items),o=n.next();!o.done;o=n.next()){var Q=o.value;if(Q.item.id===t)return Q.item}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return null},e}(r(8666).PrioritizedList);e.RenderList=d,e.resetOptions={all:!1,processed:!1,inputJax:null,outputJax:null},e.resetAllOptions={all:!0,processed:!0,inputJax:[],outputJax:[]};var f=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.compile=function(t){return null},e}(a.AbstractInputJax),L=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.typeset=function(t,e){return void 0===e&&(e=null),null},e.prototype.escaped=function(t,e){return null},e}(l.AbstractOutputJax),m=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(c.AbstractMathList),y=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(u.AbstractMathItem),g=function(){function t(e,r,n){var o=this,i=this.constructor;this.document=e,this.options=(0,s.userOptions)((0,s.defaultOptions)({},i.OPTIONS),n),this.math=new(this.options.MathList||m),this.renderActions=d.create(this.options.renderActions),this.processed=new t.ProcessBits,this.outputJax=this.options.OutputJax||new L;var Q=this.options.InputJax||[new f];Array.isArray(Q)||(Q=[Q]),this.inputJax=Q,this.adaptor=r,this.outputJax.setAdaptor(r),this.inputJax.map((function(t){return t.setAdaptor(r)})),this.mmlFactory=this.options.MmlFactory||new p.MmlFactory,this.inputJax.map((function(t){return t.setMmlFactory(o.mmlFactory)})),this.outputJax.initialize(),this.inputJax.map((function(t){return t.initialize()}))}return Object.defineProperty(t.prototype,"kind",{get:function(){return this.constructor.KIND},enumerable:!1,configurable:!0}),t.prototype.addRenderAction=function(t){for(var e=[],r=1;r=r&&this.state(r-1),t.renderActions.renderMath(this,t,r)},t.prototype.convert=function(t,r){void 0===r&&(r=e.STATE.LAST),t.renderActions.renderConvert(this,t,r)},t.prototype.compile=function(t){this.state()=e.STATE.INSERTED&&this.removeFromDocument(r),t=e.STATE.TYPESET&&(this.outputData={}),t=e.STATE.COMPILED&&(this.inputData={}),this._state=t),this._state},t.prototype.reset=function(t){void 0===t&&(t=!1),this.state(e.STATE.UNPROCESSED,t)},t}();e.AbstractMathItem=r,e.STATE={UNPROCESSED:0,FINDMATH:10,COMPILED:20,CONVERT:100,METRICS:110,RERENDER:125,TYPESET:150,INSERTED:200,LAST:1e4},e.newState=function(t,r){if(t in e.STATE)throw Error("State "+t+" already exists");e.STATE[t]=r}},9e3:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractMathList=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.isBefore=function(t,e){return t.start.i=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.Attributes=e.INHERIT=void 0,e.INHERIT="_inherit_";var n=function(){function t(t,e){this.global=e,this.defaults=Object.create(e),this.inherited=Object.create(this.defaults),this.attributes=Object.create(this.inherited),Object.assign(this.defaults,t)}return t.prototype.set=function(t,e){this.attributes[t]=e},t.prototype.setList=function(t){Object.assign(this.attributes,t)},t.prototype.get=function(t){var r=this.attributes[t];return r===e.INHERIT&&(r=this.global[t]),r},t.prototype.getExplicit=function(t){if(this.attributes.hasOwnProperty(t))return this.attributes[t]},t.prototype.getList=function(){for(var t,e,n=[],o=0;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MathMLVisitor=void 0;var Q=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.document=null,e}return o(e,t),e.prototype.visitTree=function(t,e){this.document=e;var r=e.createElement("top");return this.visitNode(t,r),this.document=null,r.firstChild},e.prototype.visitTextNode=function(t,e){e.appendChild(this.document.createTextNode(t.getText()))},e.prototype.visitXMLNode=function(t,e){e.appendChild(t.getXML().cloneNode(!0))},e.prototype.visitInferredMrowNode=function(t,e){var r,n;try{for(var o=i(t.childNodes),Q=o.next();!Q.done;Q=o.next()){var T=Q.value;this.visitNode(T,e)}}catch(t){r={error:t}}finally{try{Q&&!Q.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.visitDefault=function(t,e){var r,n,o=this.document.createElement(t.kind);this.addAttributes(t,o);try{for(var Q=i(t.childNodes),T=Q.next();!T.done;T=Q.next()){var s=T.value;this.visitNode(s,o)}}catch(t){r={error:t}}finally{try{T&&!T.done&&(n=Q.return)&&n.call(Q)}finally{if(r)throw r.error}}e.appendChild(o)},e.prototype.addAttributes=function(t,e){var r,n,o=t.attributes,Q=o.getExplicitNames();try{for(var T=i(Q),s=T.next();!s.done;s=T.next()){var a=s.value;e.setAttribute(a,o.getExplicit(a).toString())}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=T.return)&&n.call(T)}finally{if(r)throw r.error}}},e}(r(6325).MmlVisitor);e.MathMLVisitor=Q},3909:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.MmlFactory=void 0;var i=r(7860),Q=r(6336),T=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"MML",{get:function(){return this.node},enumerable:!1,configurable:!0}),e.defaultNodes=Q.MML,e}(i.AbstractNodeFactory);e.MmlFactory=T},9007:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},T=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.XMLNode=e.TextNode=e.AbstractMmlEmptyNode=e.AbstractMmlBaseNode=e.AbstractMmlLayoutNode=e.AbstractMmlTokenNode=e.AbstractMmlNode=e.indentAttributes=e.TEXCLASSNAMES=e.TEXCLASS=void 0;var s=r(91),a=r(4596);e.TEXCLASS={ORD:0,OP:1,BIN:2,REL:3,OPEN:4,CLOSE:5,PUNCT:6,INNER:7,VCENTER:8,NONE:-1},e.TEXCLASSNAMES=["ORD","OP","BIN","REL","OPEN","CLOSE","PUNCT","INNER","VCENTER"];var l=["","thinmathspace","mediummathspace","thickmathspace"],c=[[0,-1,2,3,0,0,0,1],[-1,-1,0,3,0,0,0,1],[2,2,0,0,2,0,0,2],[3,3,0,0,3,0,0,3],[0,0,0,0,0,0,0,0],[0,-1,2,3,0,0,0,1],[1,1,0,1,1,1,1,1],[1,-1,2,3,1,0,1,1]];e.indentAttributes=["indentalign","indentalignfirst","indentshift","indentshiftfirst"];var u=function(t){function r(e,r,n){void 0===r&&(r={}),void 0===n&&(n=[]);var o=t.call(this,e)||this;return o.prevClass=null,o.prevLevel=null,o.texclass=null,o.arity<0&&(o.childNodes=[e.create("inferredMrow")],o.childNodes[0].parent=o),o.setChildren(n),o.attributes=new s.Attributes(e.getNodeClass(o.kind).defaults,e.getNodeClass("math").defaults),o.attributes.setList(r),o}return o(r,t),r.prototype.copy=function(t){var e,r,n,o;void 0===t&&(t=!1);var T=this.factory.create(this.kind);if(T.properties=i({},this.properties),this.attributes){var s=this.attributes.getAllAttributes();try{for(var a=Q(Object.keys(s)),l=a.next();!l.done;l=a.next()){var c=l.value;("id"!==c||t)&&T.attributes.set(c,s[c])}}catch(t){e={error:t}}finally{try{l&&!l.done&&(r=a.return)&&r.call(a)}finally{if(e)throw e.error}}}if(this.childNodes&&this.childNodes.length){var u=this.childNodes;1===u.length&&u[0].isInferred&&(u=u[0].childNodes);try{for(var p=Q(u),h=p.next();!h.done;h=p.next()){var d=h.value;d?T.appendChild(d.copy()):T.childNodes.push(null)}}catch(t){n={error:t}}finally{try{h&&!h.done&&(o=p.return)&&o.call(p)}finally{if(n)throw n.error}}}return T},Object.defineProperty(r.prototype,"texClass",{get:function(){return this.texclass},set:function(t){this.texclass=t},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isToken",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isEmbellished",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isSpacelike",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"linebreakContainer",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"hasNewLine",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"arity",{get:function(){return 1/0},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isInferred",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"Parent",{get:function(){for(var t=this.parent;t&&t.notParent;)t=t.Parent;return t},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"notParent",{get:function(){return!1},enumerable:!1,configurable:!0}),r.prototype.setChildren=function(e){return this.arity<0?this.childNodes[0].setChildren(e):t.prototype.setChildren.call(this,e)},r.prototype.appendChild=function(e){var r,n,o=this;if(this.arity<0)return this.childNodes[0].appendChild(e),e;if(e.isInferred){if(this.arity===1/0)return e.childNodes.forEach((function(e){return t.prototype.appendChild.call(o,e)})),e;var i=e;(e=this.factory.create("mrow")).setChildren(i.childNodes),e.attributes=i.attributes;try{for(var T=Q(i.getPropertyNames()),s=T.next();!s.done;s=T.next()){var a=s.value;e.setProperty(a,i.getProperty(a))}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=T.return)&&n.call(T)}finally{if(r)throw r.error}}}return t.prototype.appendChild.call(this,e)},r.prototype.replaceChild=function(e,r){return this.arity<0?(this.childNodes[0].replaceChild(e,r),e):t.prototype.replaceChild.call(this,e,r)},r.prototype.core=function(){return this},r.prototype.coreMO=function(){return this},r.prototype.coreIndex=function(){return 0},r.prototype.childPosition=function(){for(var t,e,r=this,n=r.parent;n&&n.notParent;)r=n,n=n.parent;if(n){var o=0;try{for(var i=Q(n.childNodes),T=i.next();!T.done;T=i.next()){if(T.value===r)return o;o++}}catch(e){t={error:e}}finally{try{T&&!T.done&&(e=i.return)&&e.call(i)}finally{if(t)throw t.error}}}return null},r.prototype.setTeXclass=function(t){return this.getPrevClass(t),null!=this.texClass?this:t},r.prototype.updateTeXclass=function(t){t&&(this.prevClass=t.prevClass,this.prevLevel=t.prevLevel,t.prevClass=t.prevLevel=null,this.texClass=t.texClass)},r.prototype.getPrevClass=function(t){t&&(this.prevClass=t.texClass,this.prevLevel=t.attributes.get("scriptlevel"))},r.prototype.texSpacing=function(){var t=null!=this.prevClass?this.prevClass:e.TEXCLASS.NONE,r=this.texClass||e.TEXCLASS.ORD;if(t===e.TEXCLASS.NONE||r===e.TEXCLASS.NONE)return"";t===e.TEXCLASS.VCENTER&&(t=e.TEXCLASS.ORD),r===e.TEXCLASS.VCENTER&&(r=e.TEXCLASS.ORD);var n=c[t][r];return(this.prevLevel>0||this.attributes.get("scriptlevel")>0)&&n>=0?"":l[Math.abs(n)]},r.prototype.hasSpacingAttributes=function(){return this.isEmbellished&&this.coreMO().hasSpacingAttributes()},r.prototype.setInheritedAttributes=function(t,e,n,o){var i,s;void 0===t&&(t={}),void 0===e&&(e=!1),void 0===n&&(n=0),void 0===o&&(o=!1);var a=this.attributes.getAllDefaults();try{for(var l=Q(Object.keys(t)),c=l.next();!c.done;c=l.next()){var u=c.value;if(a.hasOwnProperty(u)||r.alwaysInherit.hasOwnProperty(u)){var p=T(t[u],2),h=p[0],d=p[1];((r.noInherit[h]||{})[this.kind]||{})[u]||this.attributes.setInherited(u,d)}}}catch(t){i={error:t}}finally{try{c&&!c.done&&(s=l.return)&&s.call(l)}finally{if(i)throw i.error}}void 0===this.attributes.getExplicit("displaystyle")&&this.attributes.setInherited("displaystyle",e),void 0===this.attributes.getExplicit("scriptlevel")&&this.attributes.setInherited("scriptlevel",n),o&&this.setProperty("texprimestyle",o);var f=this.arity;if(f>=0&&f!==1/0&&(1===f&&0===this.childNodes.length||1!==f&&this.childNodes.length!==f))if(f=0&&e!==1/0&&(1===e&&0===this.childNodes.length||1!==e&&this.childNodes.length!==e)&&this.mError('Wrong number of children for "'+this.kind+'" node',t,!0),this.verifyChildren(t)}},r.prototype.verifyAttributes=function(t){var e,r;if(t.checkAttributes){var n=this.attributes,o=[];try{for(var i=Q(n.getExplicitNames()),T=i.next();!T.done;T=i.next()){var s=T.value;"data-"===s.substr(0,5)||void 0!==n.getDefault(s)||s.match(/^(?:class|style|id|(?:xlink:)?href)$/)||o.push(s)}}catch(t){e={error:t}}finally{try{T&&!T.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}o.length&&this.mError("Unknown attributes for "+this.kind+" node: "+o.join(", "),t)}},r.prototype.verifyChildren=function(t){var e,r;try{for(var n=Q(this.childNodes),o=n.next();!o.done;o=n.next()){o.value.verifyTree(t)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}},r.prototype.mError=function(t,e,r){if(void 0===r&&(r=!1),this.parent&&this.parent.isKind("merror"))return null;var n=this.factory.create("merror");if(n.attributes.set("data-mjx-message",t),e.fullErrors||r){var o=this.factory.create("mtext"),i=this.factory.create("text");i.setText(e.fullErrors?t:this.kind),o.appendChild(i),n.appendChild(o),this.parent.replaceChild(n,this)}else this.parent.replaceChild(n,this),n.appendChild(this);return n},r.defaults={mathbackground:s.INHERIT,mathcolor:s.INHERIT,mathsize:s.INHERIT,dir:s.INHERIT},r.noInherit={mstyle:{mpadded:{width:!0,height:!0,depth:!0,lspace:!0,voffset:!0},mtable:{width:!0,height:!0,depth:!0,align:!0}},maligngroup:{mrow:{groupalign:!0},mtable:{groupalign:!0}}},r.alwaysInherit={scriptminsize:!0,scriptsizemultiplier:!0},r.verifyDefaults={checkArity:!0,checkAttributes:!1,fullErrors:!1,fixMmultiscripts:!0,fixMtables:!0},r}(a.AbstractNode);e.AbstractMmlNode=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"isToken",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.getText=function(){var t,e,r="";try{for(var n=Q(this.childNodes),o=n.next();!o.done;o=n.next()){var i=o.value;i instanceof L&&(r+=i.getText())}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return r},e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o,i;try{for(var T=Q(this.childNodes),s=T.next();!s.done;s=T.next()){var a=s.value;a instanceof u&&a.setInheritedAttributes(t,e,r,n)}}catch(t){o={error:t}}finally{try{s&&!s.done&&(i=T.return)&&i.call(T)}finally{if(o)throw o.error}}},e.prototype.walkTree=function(t,e){var r,n;t(this,e);try{for(var o=Q(this.childNodes),i=o.next();!i.done;i=o.next()){var T=i.value;T instanceof u&&T.walkTree(t,e)}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return e},e.defaults=i(i({},u.defaults),{mathvariant:"normal",mathsize:s.INHERIT}),e}(u);e.AbstractMmlTokenNode=p;var h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"isSpacelike",{get:function(){return this.childNodes[0].isSpacelike},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isEmbellished",{get:function(){return this.childNodes[0].isEmbellished},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return-1},enumerable:!1,configurable:!0}),e.prototype.core=function(){return this.childNodes[0]},e.prototype.coreMO=function(){return this.childNodes[0].coreMO()},e.prototype.setTeXclass=function(t){return t=this.childNodes[0].setTeXclass(t),this.updateTeXclass(this.childNodes[0]),t},e.defaults=u.defaults,e}(u);e.AbstractMmlLayoutNode=h;var d=function(t){function r(){return null!==t&&t.apply(this,arguments)||this}return o(r,t),Object.defineProperty(r.prototype,"isEmbellished",{get:function(){return this.childNodes[0].isEmbellished},enumerable:!1,configurable:!0}),r.prototype.core=function(){return this.childNodes[0]},r.prototype.coreMO=function(){return this.childNodes[0].coreMO()},r.prototype.setTeXclass=function(t){var r,n;this.getPrevClass(t),this.texClass=e.TEXCLASS.ORD;var o=this.childNodes[0];o?this.isEmbellished||o.isKind("mi")?(t=o.setTeXclass(t),this.updateTeXclass(this.core())):(o.setTeXclass(null),t=this):t=this;try{for(var i=Q(this.childNodes.slice(1)),T=i.next();!T.done;T=i.next()){var s=T.value;s&&s.setTeXclass(null)}}catch(t){r={error:t}}finally{try{T&&!T.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return t},r.defaults=u.defaults,r}(u);e.AbstractMmlBaseNode=d;var f=function(t){function r(){return null!==t&&t.apply(this,arguments)||this}return o(r,t),Object.defineProperty(r.prototype,"isToken",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isEmbellished",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isSpacelike",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"linebreakContainer",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"hasNewLine",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"arity",{get:function(){return 0},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"isInferred",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"notParent",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"Parent",{get:function(){return this.parent},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"texClass",{get:function(){return e.TEXCLASS.NONE},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"prevClass",{get:function(){return e.TEXCLASS.NONE},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"prevLevel",{get:function(){return 0},enumerable:!1,configurable:!0}),r.prototype.hasSpacingAttributes=function(){return!1},Object.defineProperty(r.prototype,"attributes",{get:function(){return null},enumerable:!1,configurable:!0}),r.prototype.core=function(){return this},r.prototype.coreMO=function(){return this},r.prototype.coreIndex=function(){return 0},r.prototype.childPosition=function(){return 0},r.prototype.setTeXclass=function(t){return t},r.prototype.texSpacing=function(){return""},r.prototype.setInheritedAttributes=function(t,e,r,n){},r.prototype.inheritAttributesFrom=function(t){},r.prototype.verifyTree=function(t){},r.prototype.mError=function(t,e,r){return void 0===r&&(r=!1),null},r}(a.AbstractEmptyNode);e.AbstractMmlEmptyNode=f;var L=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.text="",e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"text"},enumerable:!1,configurable:!0}),e.prototype.getText=function(){return this.text},e.prototype.setText=function(t){return this.text=t,this},e.prototype.copy=function(){return this.factory.create(this.kind).setText(this.getText())},e.prototype.toString=function(){return this.text},e}(f);e.TextNode=L;var m=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.xml=null,e.adaptor=null,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"XML"},enumerable:!1,configurable:!0}),e.prototype.getXML=function(){return this.xml},e.prototype.setXML=function(t,e){return void 0===e&&(e=null),this.xml=t,this.adaptor=e,this},e.prototype.getSerializedXML=function(){return this.adaptor.serializeXML(this.xml)},e.prototype.copy=function(){return this.factory.create(this.kind).setXML(this.adaptor.clone(this.xml))},e.prototype.toString=function(){return"XML data"},e}(f);e.XMLNode=m},3948:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;rthis.childNodes.length&&(t=1),this.attributes.set("selection",t)},e.defaults=i(i({},Q.AbstractMmlNode.defaults),{actiontype:"toggle",selection:1}),e}(Q.AbstractMmlNode);e.MmlMaction=T},142:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMfenced=void 0;var T=r(9007),s=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.texclass=T.TEXCLASS.INNER,e.separators=[],e.open=null,e.close=null,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mfenced"},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){this.getPrevClass(t),this.open&&(t=this.open.setTeXclass(t)),this.childNodes[0]&&(t=this.childNodes[0].setTeXclass(t));for(var e=1,r=this.childNodes.length;e=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMfrac=void 0;var T=r(9007),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mfrac"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 2},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){var e,r;this.getPrevClass(t);try{for(var n=Q(this.childNodes),o=n.next();!o.done;o=n.next()){o.value.setTeXclass(null)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return this},e.prototype.setChildInheritedAttributes=function(t,e,r,n){(!e||r>0)&&r++,this.childNodes[0].setInheritedAttributes(t,!1,r,n),this.childNodes[1].setInheritedAttributes(t,!1,r,!0)},e.defaults=i(i({},T.AbstractMmlBaseNode.defaults),{linethickness:"medium",numalign:"center",denomalign:"center",bevelled:!1}),e}(T.AbstractMmlBaseNode);e.MmlMfrac=s},3985:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r1&&r.match(e.operatorName)&&"normal"===this.attributes.get("mathvariant")&&void 0===this.getProperty("autoOP")&&void 0===this.getProperty("texClass")&&(this.texClass=Q.TEXCLASS.OP,this.setProperty("autoOP",!0)),this},e.defaults=i({},Q.AbstractMmlTokenNode.defaults),e.operatorName=/^[a-z][a-z0-9]*$/i,e.singleCharacter=/^[\uD800-\uDBFF]?.[\u0300-\u036F\u1AB0-\u1ABE\u1DC0-\u1DFF\u20D0-\u20EF]*$/,e}(Q.AbstractMmlTokenNode);e.MmlMi=T},6405:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},T=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMo=void 0;var s=r(9007),a=r(4082),l=r(505),c=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._texClass=null,e.lspace=5/18,e.rspace=5/18,e}return o(e,t),Object.defineProperty(e.prototype,"texClass",{get:function(){if(null===this._texClass){var t=this.getText(),e=Q(this.handleExplicitForm(this.getForms()),3),r=e[0],n=e[1],o=e[2],i=this.constructor.OPTABLE,T=i[r][t]||i[n][t]||i[o][t];return T?T[2]:s.TEXCLASS.REL}return this._texClass},set:function(t){this._texClass=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"kind",{get:function(){return"mo"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isEmbellished",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"hasNewLine",{get:function(){return"newline"===this.attributes.get("linebreak")},enumerable:!1,configurable:!0}),e.prototype.coreParent=function(){for(var t=this,e=this,r=this.factory.getNodeClass("math");e&&e.isEmbellished&&e.coreMO()===this&&!(e instanceof r);)t=e,e=e.parent;return t},e.prototype.coreText=function(t){if(!t)return"";if(t.isEmbellished)return t.coreMO().getText();for(;((t.isKind("mrow")||t.isKind("TeXAtom")&&t.texClass!==s.TEXCLASS.VCENTER||t.isKind("mstyle")||t.isKind("mphantom"))&&1===t.childNodes.length||t.isKind("munderover"))&&t.childNodes[0];)t=t.childNodes[0];return t.isToken?t.getText():""},e.prototype.hasSpacingAttributes=function(){return this.attributes.isSet("lspace")||this.attributes.isSet("rspace")},Object.defineProperty(e.prototype,"isAccent",{get:function(){var t=!1,e=this.coreParent().parent;if(e){var r=e.isKind("mover")?e.childNodes[e.over].coreMO()?"accent":"":e.isKind("munder")?e.childNodes[e.under].coreMO()?"accentunder":"":e.isKind("munderover")?this===e.childNodes[e.over].coreMO()?"accent":this===e.childNodes[e.under].coreMO()?"accentunder":"":"";if(r)t=void 0!==e.attributes.getExplicit(r)?t:this.attributes.get("accent")}return t},enumerable:!1,configurable:!0}),e.prototype.setTeXclass=function(t){var e=this.attributes.getList("form","fence"),r=e.form,n=e.fence;return void 0===this.getProperty("texClass")&&(this.attributes.isSet("lspace")||this.attributes.isSet("rspace"))?null:(n&&this.texClass===s.TEXCLASS.REL&&("prefix"===r&&(this.texClass=s.TEXCLASS.OPEN),"postfix"===r&&(this.texClass=s.TEXCLASS.CLOSE)),this.adjustTeXclass(t))},e.prototype.adjustTeXclass=function(t){var e=this.texClass,r=this.prevClass;if(e===s.TEXCLASS.NONE)return t;if(t?(!t.getProperty("autoOP")||e!==s.TEXCLASS.BIN&&e!==s.TEXCLASS.REL||(r=t.texClass=s.TEXCLASS.ORD),r=this.prevClass=t.texClass||s.TEXCLASS.ORD,this.prevLevel=this.attributes.getInherited("scriptlevel")):r=this.prevClass=s.TEXCLASS.NONE,e!==s.TEXCLASS.BIN||r!==s.TEXCLASS.NONE&&r!==s.TEXCLASS.BIN&&r!==s.TEXCLASS.OP&&r!==s.TEXCLASS.REL&&r!==s.TEXCLASS.OPEN&&r!==s.TEXCLASS.PUNCT)if(r!==s.TEXCLASS.BIN||e!==s.TEXCLASS.REL&&e!==s.TEXCLASS.CLOSE&&e!==s.TEXCLASS.PUNCT){if(e===s.TEXCLASS.BIN){for(var n=this,o=this.parent;o&&o.parent&&o.isEmbellished&&(1===o.childNodes.length||!o.isKind("mrow")&&o.core()===n);)n=o,o=o.parent;o.childNodes[o.childNodes.length-1]===n&&(this.texClass=s.TEXCLASS.ORD)}}else t.texClass=this.prevClass=s.TEXCLASS.ORD;else this.texClass=s.TEXCLASS.ORD;return this},e.prototype.setInheritedAttributes=function(e,r,n,o){void 0===e&&(e={}),void 0===r&&(r=!1),void 0===n&&(n=0),void 0===o&&(o=!1),t.prototype.setInheritedAttributes.call(this,e,r,n,o);var i=this.getText();this.checkOperatorTable(i),this.checkPseudoScripts(i),this.checkPrimes(i),this.checkMathAccent(i)},e.prototype.checkOperatorTable=function(t){var e,r,n=Q(this.handleExplicitForm(this.getForms()),3),o=n[0],i=n[1],s=n[2];this.attributes.setInherited("form",o);var l=this.constructor.OPTABLE,c=l[o][t]||l[i][t]||l[s][t];if(c){void 0===this.getProperty("texClass")&&(this.texClass=c[2]);try{for(var u=T(Object.keys(c[3]||{})),p=u.next();!p.done;p=u.next()){var h=p.value;this.attributes.setInherited(h,c[3][h])}}catch(t){e={error:t}}finally{try{p&&!p.done&&(r=u.return)&&r.call(u)}finally{if(e)throw e.error}}this.lspace=(c[0]+1)/18,this.rspace=(c[1]+1)/18}else{var d=(0,a.getRange)(t);if(d){void 0===this.getProperty("texClass")&&(this.texClass=d[2]);var f=this.constructor.MMLSPACING[d[2]];this.lspace=(f[0]+1)/18,this.rspace=(f[1]+1)/18}}},e.prototype.getForms=function(){for(var t=this,e=this.parent,r=this.Parent;r&&r.isEmbellished;)t=e,e=r.parent,r=r.Parent;if(e&&e.isKind("mrow")&&1!==e.nonSpaceLength()){if(e.firstNonSpace()===t)return["prefix","infix","postfix"];if(e.lastNonSpace()===t)return["postfix","infix","prefix"]}return["infix","prefix","postfix"]},e.prototype.handleExplicitForm=function(t){if(this.attributes.isSet("form")){var e=this.attributes.get("form");t=[e].concat(t.filter((function(t){return t!==e})))}return t},e.prototype.checkPseudoScripts=function(t){var e=this.constructor.pseudoScripts;if(t.match(e)){var r=this.coreParent().Parent,n=!r||!(r.isKind("msubsup")&&!r.isKind("msub"));this.setProperty("pseudoscript",n),n&&(this.attributes.setInherited("lspace",0),this.attributes.setInherited("rspace",0))}},e.prototype.checkPrimes=function(t){var e=this.constructor.primes;if(t.match(e)){var r=this.constructor.remapPrimes,n=(0,l.unicodeString)((0,l.unicodeChars)(t).map((function(t){return r[t]})));this.setProperty("primes",n)}},e.prototype.checkMathAccent=function(t){var e=this.Parent;if(void 0===this.getProperty("mathaccent")&&e&&e.isKind("munderover")){var r=e.childNodes[0];if(!r.isEmbellished||r.coreMO()!==this){var n=this.constructor.mathaccents;t.match(n)&&this.setProperty("mathaccent",!0)}}},e.defaults=i(i({},s.AbstractMmlTokenNode.defaults),{form:"infix",fence:!1,separator:!1,lspace:"thickmathspace",rspace:"thickmathspace",stretchy:!1,symmetric:!1,maxsize:"infinity",minsize:"0em",largeop:!1,movablelimits:!1,accent:!1,linebreak:"auto",lineleading:"1ex",linebreakstyle:"before",indentalign:"auto",indentshift:"0",indenttarget:"",indentalignfirst:"indentalign",indentshiftfirst:"indentshift",indentalignlast:"indentalign",indentshiftlast:"indentshift"}),e.MMLSPACING=a.MMLSPACING,e.OPTABLE=a.OPTABLE,e.pseudoScripts=new RegExp(["^[\"'*`","\xaa","\xb0","\xb2-\xb4","\xb9","\xba","\u2018-\u201f","\u2032-\u2037\u2057","\u2070\u2071","\u2074-\u207f","\u2080-\u208e","]+$"].join("")),e.primes=new RegExp(["^[\"'`","\u2018-\u201f","]+$"].join("")),e.remapPrimes={34:8243,39:8242,96:8245,8216:8245,8217:8242,8218:8242,8219:8245,8220:8246,8221:8243,8222:8243,8223:8246},e.mathaccents=new RegExp(["^[","\xb4\u0301\u02ca","`\u0300\u02cb","\xa8\u0308","~\u0303\u02dc","\xaf\u0304\u02c9","\u02d8\u0306","\u02c7\u030c","^\u0302\u02c6","\u2192\u20d7","\u02d9\u0307","\u02da\u030a","\u20db","\u20dc","]$"].join("")),e}(s.AbstractMmlTokenNode);e.MmlMo=c},7238:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlInferredMrow=e.MmlMrow=void 0;var T=r(9007),s=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e._core=null,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mrow"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isSpacelike",{get:function(){var t,e;try{for(var r=Q(this.childNodes),n=r.next();!n.done;n=r.next()){if(!n.value.isSpacelike)return!1}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isEmbellished",{get:function(){var t,e,r=!1,n=0;try{for(var o=Q(this.childNodes),i=o.next();!i.done;i=o.next()){var T=i.value;if(T)if(T.isEmbellished){if(r)return!1;r=!0,this._core=n}else if(!T.isSpacelike)return!1;n++}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return r},enumerable:!1,configurable:!0}),e.prototype.core=function(){return this.isEmbellished&&null!=this._core?this.childNodes[this._core]:this},e.prototype.coreMO=function(){return this.isEmbellished&&null!=this._core?this.childNodes[this._core].coreMO():this},e.prototype.nonSpaceLength=function(){var t,e,r=0;try{for(var n=Q(this.childNodes),o=n.next();!o.done;o=n.next()){var i=o.value;i&&!i.isSpacelike&&r++}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return r},e.prototype.firstNonSpace=function(){var t,e;try{for(var r=Q(this.childNodes),n=r.next();!n.done;n=r.next()){var o=n.value;if(o&&!o.isSpacelike)return o}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}return null},e.prototype.lastNonSpace=function(){for(var t=this.childNodes.length;--t>=0;){var e=this.childNodes[t];if(e&&!e.isSpacelike)return e}return null},e.prototype.setTeXclass=function(t){var e,r,n,o;if(null!=this.getProperty("open")||null!=this.getProperty("close")){this.getPrevClass(t),t=null;try{for(var i=Q(this.childNodes),s=i.next();!s.done;s=i.next()){t=s.value.setTeXclass(t)}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}null==this.texClass&&(this.texClass=T.TEXCLASS.INNER)}else{try{for(var a=Q(this.childNodes),l=a.next();!l.done;l=a.next()){t=l.value.setTeXclass(t)}}catch(t){n={error:t}}finally{try{l&&!l.done&&(o=a.return)&&o.call(a)}finally{if(n)throw n.error}}this.childNodes[0]&&this.updateTeXclass(this.childNodes[0])}return t},e.defaults=i({},T.AbstractMmlNode.defaults),e}(T.AbstractMmlNode);e.MmlMrow=s;var a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"inferredMrow"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isInferred",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"notParent",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.toString=function(){return"["+this.childNodes.join(",")+"]"},e.defaults=s.defaults,e}(s);e.MmlInferredMrow=a},7265:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMtable=void 0;var T=r(9007),s=r(505),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.properties={useHeight:!0},e.texclass=T.TEXCLASS.ORD,e}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mtable"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setInheritedAttributes=function(e,r,n,o){var i,s;try{for(var a=Q(T.indentAttributes),l=a.next();!l.done;l=a.next()){var c=l.value;e[c]&&this.attributes.setInherited(c,e[c][1]),void 0!==this.attributes.getExplicit(c)&&delete this.attributes.getAllAttributes()[c]}}catch(t){i={error:t}}finally{try{l&&!l.done&&(s=a.return)&&s.call(a)}finally{if(i)throw i.error}}t.prototype.setInheritedAttributes.call(this,e,r,n,o)},e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o,i,T,a;try{for(var l=Q(this.childNodes),c=l.next();!c.done;c=l.next()){(f=c.value).isKind("mtr")||this.replaceChild(this.factory.create("mtr"),f).appendChild(f)}}catch(t){o={error:t}}finally{try{c&&!c.done&&(i=l.return)&&i.call(l)}finally{if(o)throw o.error}}r=this.getProperty("scriptlevel")||r,e=!(!this.attributes.getExplicit("displaystyle")&&!this.attributes.getDefault("displaystyle")),t=this.addInheritedAttributes(t,{columnalign:this.attributes.get("columnalign"),rowalign:"center"});var u=this.attributes.getExplicit("data-cramped"),p=(0,s.split)(this.attributes.get("rowalign"));try{for(var h=Q(this.childNodes),d=h.next();!d.done;d=h.next()){var f=d.value;t.rowalign[1]=p.shift()||t.rowalign[1],f.setInheritedAttributes(t,e,r,!!u)}}catch(t){T={error:t}}finally{try{d&&!d.done&&(a=h.return)&&a.call(h)}finally{if(T)throw T.error}}},e.prototype.verifyChildren=function(e){for(var r=null,n=this.factory,o=0;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MmlMlabeledtr=e.MmlMtr=void 0;var T=r(9007),s=r(91),a=r(505),l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mtr"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"linebreakContainer",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.setChildInheritedAttributes=function(t,e,r,n){var o,i,T,s;try{for(var l=Q(this.childNodes),c=l.next();!c.done;c=l.next()){(d=c.value).isKind("mtd")||this.replaceChild(this.factory.create("mtd"),d).appendChild(d)}}catch(t){o={error:t}}finally{try{c&&!c.done&&(i=l.return)&&i.call(l)}finally{if(o)throw o.error}}var u=(0,a.split)(this.attributes.get("columnalign"));1===this.arity&&u.unshift(this.parent.attributes.get("side")),t=this.addInheritedAttributes(t,{rowalign:this.attributes.get("rowalign"),columnalign:"center"});try{for(var p=Q(this.childNodes),h=p.next();!h.done;h=p.next()){var d=h.value;t.columnalign[1]=u.shift()||t.columnalign[1],d.setInheritedAttributes(t,e,r,n)}}catch(t){T={error:t}}finally{try{h&&!h.done&&(s=p.return)&&s.call(p)}finally{if(T)throw T.error}}},e.prototype.verifyChildren=function(e){var r,n;if(!this.parent||this.parent.isKind("mtable")){try{for(var o=Q(this.childNodes),i=o.next();!i.done;i=o.next()){var T=i.value;if(!T.isKind("mtd"))this.replaceChild(this.factory.create("mtd"),T).appendChild(T),e.fixMtables||T.mError("Children of "+this.kind+" must be mtd",e)}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}t.prototype.verifyChildren.call(this,e)}else this.mError(this.kind+" can only be a child of an mtable",e,!0)},e.prototype.setTeXclass=function(t){var e,r;this.getPrevClass(t);try{for(var n=Q(this.childNodes),o=n.next();!o.done;o=n.next()){o.value.setTeXclass(null)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return this},e.defaults=i(i({},T.AbstractMmlNode.defaults),{rowalign:s.INHERIT,columnalign:s.INHERIT,groupalign:s.INHERIT}),e}(T.AbstractMmlNode);e.MmlMtr=l;var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"mlabeledtr"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"arity",{get:function(){return 1},enumerable:!1,configurable:!0}),e}(l);e.MmlMlabeledtr=c},5184:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.OPTABLE=e.MMLSPACING=e.getRange=e.RANGES=e.MO=e.OPDEF=void 0;var o=r(9007);function i(t,e,r,n){return void 0===r&&(r=o.TEXCLASS.BIN),void 0===n&&(n=null),[t,e,r,n]}e.OPDEF=i,e.MO={ORD:i(0,0,o.TEXCLASS.ORD),ORD11:i(1,1,o.TEXCLASS.ORD),ORD21:i(2,1,o.TEXCLASS.ORD),ORD02:i(0,2,o.TEXCLASS.ORD),ORD55:i(5,5,o.TEXCLASS.ORD),NONE:i(0,0,o.TEXCLASS.NONE),OP:i(1,2,o.TEXCLASS.OP,{largeop:!0,movablelimits:!0,symmetric:!0}),OPFIXED:i(1,2,o.TEXCLASS.OP,{largeop:!0,movablelimits:!0}),INTEGRAL:i(0,1,o.TEXCLASS.OP,{largeop:!0,symmetric:!0}),INTEGRAL2:i(1,2,o.TEXCLASS.OP,{largeop:!0,symmetric:!0}),BIN3:i(3,3,o.TEXCLASS.BIN),BIN4:i(4,4,o.TEXCLASS.BIN),BIN01:i(0,1,o.TEXCLASS.BIN),BIN5:i(5,5,o.TEXCLASS.BIN),TALLBIN:i(4,4,o.TEXCLASS.BIN,{stretchy:!0}),BINOP:i(4,4,o.TEXCLASS.BIN,{largeop:!0,movablelimits:!0}),REL:i(5,5,o.TEXCLASS.REL),REL1:i(1,1,o.TEXCLASS.REL,{stretchy:!0}),REL4:i(4,4,o.TEXCLASS.REL),RELSTRETCH:i(5,5,o.TEXCLASS.REL,{stretchy:!0}),RELACCENT:i(5,5,o.TEXCLASS.REL,{accent:!0}),WIDEREL:i(5,5,o.TEXCLASS.REL,{accent:!0,stretchy:!0}),OPEN:i(0,0,o.TEXCLASS.OPEN,{fence:!0,stretchy:!0,symmetric:!0}),CLOSE:i(0,0,o.TEXCLASS.CLOSE,{fence:!0,stretchy:!0,symmetric:!0}),INNER:i(0,0,o.TEXCLASS.INNER),PUNCT:i(0,3,o.TEXCLASS.PUNCT),ACCENT:i(0,0,o.TEXCLASS.ORD,{accent:!0}),WIDEACCENT:i(0,0,o.TEXCLASS.ORD,{accent:!0,stretchy:!0})},e.RANGES=[[32,127,o.TEXCLASS.REL,"mo"],[160,191,o.TEXCLASS.ORD,"mo"],[192,591,o.TEXCLASS.ORD,"mi"],[688,879,o.TEXCLASS.ORD,"mo"],[880,6688,o.TEXCLASS.ORD,"mi"],[6832,6911,o.TEXCLASS.ORD,"mo"],[6912,7615,o.TEXCLASS.ORD,"mi"],[7616,7679,o.TEXCLASS.ORD,"mo"],[7680,8191,o.TEXCLASS.ORD,"mi"],[8192,8303,o.TEXCLASS.ORD,"mo"],[8304,8351,o.TEXCLASS.ORD,"mo"],[8448,8527,o.TEXCLASS.ORD,"mi"],[8528,8591,o.TEXCLASS.ORD,"mn"],[8592,8703,o.TEXCLASS.REL,"mo"],[8704,8959,o.TEXCLASS.BIN,"mo"],[8960,9215,o.TEXCLASS.ORD,"mo"],[9312,9471,o.TEXCLASS.ORD,"mn"],[9472,10223,o.TEXCLASS.ORD,"mo"],[10224,10239,o.TEXCLASS.REL,"mo"],[10240,10495,o.TEXCLASS.ORD,"mtext"],[10496,10623,o.TEXCLASS.REL,"mo"],[10624,10751,o.TEXCLASS.ORD,"mo"],[10752,11007,o.TEXCLASS.BIN,"mo"],[11008,11055,o.TEXCLASS.ORD,"mo"],[11056,11087,o.TEXCLASS.REL,"mo"],[11088,11263,o.TEXCLASS.ORD,"mo"],[11264,11744,o.TEXCLASS.ORD,"mi"],[11776,11903,o.TEXCLASS.ORD,"mo"],[11904,12255,o.TEXCLASS.ORD,"mi","normal"],[12272,12351,o.TEXCLASS.ORD,"mo"],[12352,42143,o.TEXCLASS.ORD,"mi","normal"],[42192,43055,o.TEXCLASS.ORD,"mi"],[43056,43071,o.TEXCLASS.ORD,"mn"],[43072,55295,o.TEXCLASS.ORD,"mi"],[63744,64255,o.TEXCLASS.ORD,"mi","normal"],[64256,65023,o.TEXCLASS.ORD,"mi"],[65024,65135,o.TEXCLASS.ORD,"mo"],[65136,65791,o.TEXCLASS.ORD,"mi"],[65792,65935,o.TEXCLASS.ORD,"mn"],[65936,74751,o.TEXCLASS.ORD,"mi","normal"],[74752,74879,o.TEXCLASS.ORD,"mn"],[74880,113823,o.TEXCLASS.ORD,"mi","normal"],[113824,119391,o.TEXCLASS.ORD,"mo"],[119648,119679,o.TEXCLASS.ORD,"mn"],[119808,120781,o.TEXCLASS.ORD,"mi"],[120782,120831,o.TEXCLASS.ORD,"mn"],[122624,129023,o.TEXCLASS.ORD,"mo"],[129024,129279,o.TEXCLASS.REL,"mo"],[129280,129535,o.TEXCLASS.ORD,"mo"],[131072,195103,o.TEXCLASS.ORD,"mi","normnal"]],e.getRange=function(t){var r,o,i=t.codePointAt(0);try{for(var Q=n(e.RANGES),T=Q.next();!T.done;T=Q.next()){var s=T.value;if(i<=s[1]){if(i>=s[0])return s;break}}}catch(t){r={error:t}}finally{try{T&&!T.done&&(o=Q.return)&&o.call(Q)}finally{if(r)throw r.error}}return null},e.MMLSPACING=[[0,0],[1,2],[3,3],[4,4],[0,0],[0,0],[0,3]],e.OPTABLE={prefix:{"(":e.MO.OPEN,"+":e.MO.BIN01,"-":e.MO.BIN01,"[":e.MO.OPEN,"{":e.MO.OPEN,"|":e.MO.OPEN,"||":[0,0,o.TEXCLASS.BIN,{fence:!0,stretchy:!0,symmetric:!0}],"|||":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"\xac":e.MO.ORD21,"\xb1":e.MO.BIN01,"\u2016":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2018":[0,0,o.TEXCLASS.OPEN,{fence:!0}],"\u201c":[0,0,o.TEXCLASS.OPEN,{fence:!0}],"\u2145":e.MO.ORD21,"\u2146":i(2,0,o.TEXCLASS.ORD),"\u2200":e.MO.ORD21,"\u2202":e.MO.ORD21,"\u2203":e.MO.ORD21,"\u2204":e.MO.ORD21,"\u2207":e.MO.ORD21,"\u220f":e.MO.OP,"\u2210":e.MO.OP,"\u2211":e.MO.OP,"\u2212":e.MO.BIN01,"\u2213":e.MO.BIN01,"\u221a":[1,1,o.TEXCLASS.ORD,{stretchy:!0}],"\u221b":e.MO.ORD11,"\u221c":e.MO.ORD11,"\u2220":e.MO.ORD,"\u2221":e.MO.ORD,"\u2222":e.MO.ORD,"\u222b":e.MO.INTEGRAL,"\u222c":e.MO.INTEGRAL,"\u222d":e.MO.INTEGRAL,"\u222e":e.MO.INTEGRAL,"\u222f":e.MO.INTEGRAL,"\u2230":e.MO.INTEGRAL,"\u2231":e.MO.INTEGRAL,"\u2232":e.MO.INTEGRAL,"\u2233":e.MO.INTEGRAL,"\u22c0":e.MO.OP,"\u22c1":e.MO.OP,"\u22c2":e.MO.OP,"\u22c3":e.MO.OP,"\u2308":e.MO.OPEN,"\u230a":e.MO.OPEN,"\u2329":e.MO.OPEN,"\u2772":e.MO.OPEN,"\u27e6":e.MO.OPEN,"\u27e8":e.MO.OPEN,"\u27ea":e.MO.OPEN,"\u27ec":e.MO.OPEN,"\u27ee":e.MO.OPEN,"\u2980":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2983":e.MO.OPEN,"\u2985":e.MO.OPEN,"\u2987":e.MO.OPEN,"\u2989":e.MO.OPEN,"\u298b":e.MO.OPEN,"\u298d":e.MO.OPEN,"\u298f":e.MO.OPEN,"\u2991":e.MO.OPEN,"\u2993":e.MO.OPEN,"\u2995":e.MO.OPEN,"\u2997":e.MO.OPEN,"\u29fc":e.MO.OPEN,"\u2a00":e.MO.OP,"\u2a01":e.MO.OP,"\u2a02":e.MO.OP,"\u2a03":e.MO.OP,"\u2a04":e.MO.OP,"\u2a05":e.MO.OP,"\u2a06":e.MO.OP,"\u2a07":e.MO.OP,"\u2a08":e.MO.OP,"\u2a09":e.MO.OP,"\u2a0a":e.MO.OP,"\u2a0b":e.MO.INTEGRAL2,"\u2a0c":e.MO.INTEGRAL,"\u2a0d":e.MO.INTEGRAL2,"\u2a0e":e.MO.INTEGRAL2,"\u2a0f":e.MO.INTEGRAL2,"\u2a10":e.MO.OP,"\u2a11":e.MO.OP,"\u2a12":e.MO.OP,"\u2a13":e.MO.OP,"\u2a14":e.MO.OP,"\u2a15":e.MO.INTEGRAL2,"\u2a16":e.MO.INTEGRAL2,"\u2a17":e.MO.INTEGRAL2,"\u2a18":e.MO.INTEGRAL2,"\u2a19":e.MO.INTEGRAL2,"\u2a1a":e.MO.INTEGRAL2,"\u2a1b":e.MO.INTEGRAL2,"\u2a1c":e.MO.INTEGRAL2,"\u2afc":e.MO.OP,"\u2aff":e.MO.OP},postfix:{"!!":i(1,0),"!":[1,0,o.TEXCLASS.CLOSE,null],'"':e.MO.ACCENT,"&":e.MO.ORD,")":e.MO.CLOSE,"++":i(0,0),"--":i(0,0),"..":i(0,0),"...":e.MO.ORD,"'":e.MO.ACCENT,"]":e.MO.CLOSE,"^":e.MO.WIDEACCENT,_:e.MO.WIDEACCENT,"`":e.MO.ACCENT,"|":e.MO.CLOSE,"}":e.MO.CLOSE,"~":e.MO.WIDEACCENT,"||":[0,0,o.TEXCLASS.BIN,{fence:!0,stretchy:!0,symmetric:!0}],"|||":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"\xa8":e.MO.ACCENT,"\xaa":e.MO.ACCENT,"\xaf":e.MO.WIDEACCENT,"\xb0":e.MO.ORD,"\xb2":e.MO.ACCENT,"\xb3":e.MO.ACCENT,"\xb4":e.MO.ACCENT,"\xb8":e.MO.ACCENT,"\xb9":e.MO.ACCENT,"\xba":e.MO.ACCENT,"\u02c6":e.MO.WIDEACCENT,"\u02c7":e.MO.WIDEACCENT,"\u02c9":e.MO.WIDEACCENT,"\u02ca":e.MO.ACCENT,"\u02cb":e.MO.ACCENT,"\u02cd":e.MO.WIDEACCENT,"\u02d8":e.MO.ACCENT,"\u02d9":e.MO.ACCENT,"\u02da":e.MO.ACCENT,"\u02dc":e.MO.WIDEACCENT,"\u02dd":e.MO.ACCENT,"\u02f7":e.MO.WIDEACCENT,"\u0302":e.MO.WIDEACCENT,"\u0311":e.MO.ACCENT,"\u03f6":e.MO.REL,"\u2016":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2019":[0,0,o.TEXCLASS.CLOSE,{fence:!0}],"\u201a":e.MO.ACCENT,"\u201b":e.MO.ACCENT,"\u201d":[0,0,o.TEXCLASS.CLOSE,{fence:!0}],"\u201e":e.MO.ACCENT,"\u201f":e.MO.ACCENT,"\u2032":e.MO.ORD,"\u2033":e.MO.ACCENT,"\u2034":e.MO.ACCENT,"\u2035":e.MO.ACCENT,"\u2036":e.MO.ACCENT,"\u2037":e.MO.ACCENT,"\u203e":e.MO.WIDEACCENT,"\u2057":e.MO.ACCENT,"\u20db":e.MO.ACCENT,"\u20dc":e.MO.ACCENT,"\u2309":e.MO.CLOSE,"\u230b":e.MO.CLOSE,"\u232a":e.MO.CLOSE,"\u23b4":e.MO.WIDEACCENT,"\u23b5":e.MO.WIDEACCENT,"\u23dc":e.MO.WIDEACCENT,"\u23dd":e.MO.WIDEACCENT,"\u23de":e.MO.WIDEACCENT,"\u23df":e.MO.WIDEACCENT,"\u23e0":e.MO.WIDEACCENT,"\u23e1":e.MO.WIDEACCENT,"\u25a0":e.MO.BIN3,"\u25a1":e.MO.BIN3,"\u25aa":e.MO.BIN3,"\u25ab":e.MO.BIN3,"\u25ad":e.MO.BIN3,"\u25ae":e.MO.BIN3,"\u25af":e.MO.BIN3,"\u25b0":e.MO.BIN3,"\u25b1":e.MO.BIN3,"\u25b2":e.MO.BIN4,"\u25b4":e.MO.BIN4,"\u25b6":e.MO.BIN4,"\u25b7":e.MO.BIN4,"\u25b8":e.MO.BIN4,"\u25bc":e.MO.BIN4,"\u25be":e.MO.BIN4,"\u25c0":e.MO.BIN4,"\u25c1":e.MO.BIN4,"\u25c2":e.MO.BIN4,"\u25c4":e.MO.BIN4,"\u25c5":e.MO.BIN4,"\u25c6":e.MO.BIN4,"\u25c7":e.MO.BIN4,"\u25c8":e.MO.BIN4,"\u25c9":e.MO.BIN4,"\u25cc":e.MO.BIN4,"\u25cd":e.MO.BIN4,"\u25ce":e.MO.BIN4,"\u25cf":e.MO.BIN4,"\u25d6":e.MO.BIN4,"\u25d7":e.MO.BIN4,"\u25e6":e.MO.BIN4,"\u266d":e.MO.ORD02,"\u266e":e.MO.ORD02,"\u266f":e.MO.ORD02,"\u2773":e.MO.CLOSE,"\u27e7":e.MO.CLOSE,"\u27e9":e.MO.CLOSE,"\u27eb":e.MO.CLOSE,"\u27ed":e.MO.CLOSE,"\u27ef":e.MO.CLOSE,"\u2980":[0,0,o.TEXCLASS.ORD,{fence:!0,stretchy:!0}],"\u2984":e.MO.CLOSE,"\u2986":e.MO.CLOSE,"\u2988":e.MO.CLOSE,"\u298a":e.MO.CLOSE,"\u298c":e.MO.CLOSE,"\u298e":e.MO.CLOSE,"\u2990":e.MO.CLOSE,"\u2992":e.MO.CLOSE,"\u2994":e.MO.CLOSE,"\u2996":e.MO.CLOSE,"\u2998":e.MO.CLOSE,"\u29fd":e.MO.CLOSE},infix:{"!=":e.MO.BIN4,"#":e.MO.ORD,$:e.MO.ORD,"%":[3,3,o.TEXCLASS.ORD,null],"&&":e.MO.BIN4,"":e.MO.ORD,"*":e.MO.BIN3,"**":i(1,1),"*=":e.MO.BIN4,"+":e.MO.BIN4,"+=":e.MO.BIN4,",":[0,3,o.TEXCLASS.PUNCT,{linebreakstyle:"after",separator:!0}],"-":e.MO.BIN4,"-=":e.MO.BIN4,"->":e.MO.BIN5,".":[0,3,o.TEXCLASS.PUNCT,{separator:!0}],"/":e.MO.ORD11,"//":i(1,1),"/=":e.MO.BIN4,":":[1,2,o.TEXCLASS.REL,null],":=":e.MO.BIN4,";":[0,3,o.TEXCLASS.PUNCT,{linebreakstyle:"after",separator:!0}],"<":e.MO.REL,"<=":e.MO.BIN5,"<>":i(1,1),"=":e.MO.REL,"==":e.MO.BIN4,">":e.MO.REL,">=":e.MO.BIN5,"?":[1,1,o.TEXCLASS.CLOSE,null],"@":e.MO.ORD11,"\\":e.MO.ORD,"^":e.MO.ORD11,_:e.MO.ORD11,"|":[2,2,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"||":[2,2,o.TEXCLASS.BIN,{fence:!0,stretchy:!0,symmetric:!0}],"|||":[2,2,o.TEXCLASS.ORD,{fence:!0,stretchy:!0,symmetric:!0}],"\xb1":e.MO.BIN4,"\xb7":e.MO.BIN4,"\xd7":e.MO.BIN4,"\xf7":e.MO.BIN4,"\u02b9":e.MO.ORD,"\u0300":e.MO.ACCENT,"\u0301":e.MO.ACCENT,"\u0303":e.MO.WIDEACCENT,"\u0304":e.MO.ACCENT,"\u0306":e.MO.ACCENT,"\u0307":e.MO.ACCENT,"\u0308":e.MO.ACCENT,"\u030c":e.MO.ACCENT,"\u0332":e.MO.WIDEACCENT,"\u0338":e.MO.REL4,"\u2015":[0,0,o.TEXCLASS.ORD,{stretchy:!0}],"\u2017":[0,0,o.TEXCLASS.ORD,{stretchy:!0}],"\u2020":e.MO.BIN3,"\u2021":e.MO.BIN3,"\u2022":e.MO.BIN4,"\u2026":e.MO.INNER,"\u2043":e.MO.BIN4,"\u2044":e.MO.TALLBIN,"\u2061":e.MO.NONE,"\u2062":e.MO.NONE,"\u2063":[0,0,o.TEXCLASS.NONE,{linebreakstyle:"after",separator:!0}],"\u2064":e.MO.NONE,"\u20d7":e.MO.ACCENT,"\u2111":e.MO.ORD,"\u2113":e.MO.ORD,"\u2118":e.MO.ORD,"\u211c":e.MO.ORD,"\u2190":e.MO.WIDEREL,"\u2191":e.MO.RELSTRETCH,"\u2192":e.MO.WIDEREL,"\u2193":e.MO.RELSTRETCH,"\u2194":e.MO.WIDEREL,"\u2195":e.MO.RELSTRETCH,"\u2196":e.MO.RELSTRETCH,"\u2197":e.MO.RELSTRETCH,"\u2198":e.MO.RELSTRETCH,"\u2199":e.MO.RELSTRETCH,"\u219a":e.MO.RELACCENT,"\u219b":e.MO.RELACCENT,"\u219c":e.MO.WIDEREL,"\u219d":e.MO.WIDEREL,"\u219e":e.MO.WIDEREL,"\u219f":e.MO.WIDEREL,"\u21a0":e.MO.WIDEREL,"\u21a1":e.MO.RELSTRETCH,"\u21a2":e.MO.WIDEREL,"\u21a3":e.MO.WIDEREL,"\u21a4":e.MO.WIDEREL,"\u21a5":e.MO.RELSTRETCH,"\u21a6":e.MO.WIDEREL,"\u21a7":e.MO.RELSTRETCH,"\u21a8":e.MO.RELSTRETCH,"\u21a9":e.MO.WIDEREL,"\u21aa":e.MO.WIDEREL,"\u21ab":e.MO.WIDEREL,"\u21ac":e.MO.WIDEREL,"\u21ad":e.MO.WIDEREL,"\u21ae":e.MO.RELACCENT,"\u21af":e.MO.RELSTRETCH,"\u21b0":e.MO.RELSTRETCH,"\u21b1":e.MO.RELSTRETCH,"\u21b2":e.MO.RELSTRETCH,"\u21b3":e.MO.RELSTRETCH,"\u21b4":e.MO.RELSTRETCH,"\u21b5":e.MO.RELSTRETCH,"\u21b6":e.MO.RELACCENT,"\u21b7":e.MO.RELACCENT,"\u21b8":e.MO.REL,"\u21b9":e.MO.WIDEREL,"\u21ba":e.MO.REL,"\u21bb":e.MO.REL,"\u21bc":e.MO.WIDEREL,"\u21bd":e.MO.WIDEREL,"\u21be":e.MO.RELSTRETCH,"\u21bf":e.MO.RELSTRETCH,"\u21c0":e.MO.WIDEREL,"\u21c1":e.MO.WIDEREL,"\u21c2":e.MO.RELSTRETCH,"\u21c3":e.MO.RELSTRETCH,"\u21c4":e.MO.WIDEREL,"\u21c5":e.MO.RELSTRETCH,"\u21c6":e.MO.WIDEREL,"\u21c7":e.MO.WIDEREL,"\u21c8":e.MO.RELSTRETCH,"\u21c9":e.MO.WIDEREL,"\u21ca":e.MO.RELSTRETCH,"\u21cb":e.MO.WIDEREL,"\u21cc":e.MO.WIDEREL,"\u21cd":e.MO.RELACCENT,"\u21ce":e.MO.RELACCENT,"\u21cf":e.MO.RELACCENT,"\u21d0":e.MO.WIDEREL,"\u21d1":e.MO.RELSTRETCH,"\u21d2":e.MO.WIDEREL,"\u21d3":e.MO.RELSTRETCH,"\u21d4":e.MO.WIDEREL,"\u21d5":e.MO.RELSTRETCH,"\u21d6":e.MO.RELSTRETCH,"\u21d7":e.MO.RELSTRETCH,"\u21d8":e.MO.RELSTRETCH,"\u21d9":e.MO.RELSTRETCH,"\u21da":e.MO.WIDEREL,"\u21db":e.MO.WIDEREL,"\u21dc":e.MO.WIDEREL,"\u21dd":e.MO.WIDEREL,"\u21de":e.MO.REL,"\u21df":e.MO.REL,"\u21e0":e.MO.WIDEREL,"\u21e1":e.MO.RELSTRETCH,"\u21e2":e.MO.WIDEREL,"\u21e3":e.MO.RELSTRETCH,"\u21e4":e.MO.WIDEREL,"\u21e5":e.MO.WIDEREL,"\u21e6":e.MO.WIDEREL,"\u21e7":e.MO.RELSTRETCH,"\u21e8":e.MO.WIDEREL,"\u21e9":e.MO.RELSTRETCH,"\u21ea":e.MO.RELSTRETCH,"\u21eb":e.MO.RELSTRETCH,"\u21ec":e.MO.RELSTRETCH,"\u21ed":e.MO.RELSTRETCH,"\u21ee":e.MO.RELSTRETCH,"\u21ef":e.MO.RELSTRETCH,"\u21f0":e.MO.WIDEREL,"\u21f1":e.MO.REL,"\u21f2":e.MO.REL,"\u21f3":e.MO.RELSTRETCH,"\u21f4":e.MO.RELACCENT,"\u21f5":e.MO.RELSTRETCH,"\u21f6":e.MO.WIDEREL,"\u21f7":e.MO.RELACCENT,"\u21f8":e.MO.RELACCENT,"\u21f9":e.MO.RELACCENT,"\u21fa":e.MO.RELACCENT,"\u21fb":e.MO.RELACCENT,"\u21fc":e.MO.RELACCENT,"\u21fd":e.MO.WIDEREL,"\u21fe":e.MO.WIDEREL,"\u21ff":e.MO.WIDEREL,"\u2201":i(1,2,o.TEXCLASS.ORD),"\u2205":e.MO.ORD,"\u2206":e.MO.BIN3,"\u2208":e.MO.REL,"\u2209":e.MO.REL,"\u220a":e.MO.REL,"\u220b":e.MO.REL,"\u220c":e.MO.REL,"\u220d":e.MO.REL,"\u220e":e.MO.BIN3,"\u2212":e.MO.BIN4,"\u2213":e.MO.BIN4,"\u2214":e.MO.BIN4,"\u2215":e.MO.TALLBIN,"\u2216":e.MO.BIN4,"\u2217":e.MO.BIN4,"\u2218":e.MO.BIN4,"\u2219":e.MO.BIN4,"\u221d":e.MO.REL,"\u221e":e.MO.ORD,"\u221f":e.MO.REL,"\u2223":e.MO.REL,"\u2224":e.MO.REL,"\u2225":e.MO.REL,"\u2226":e.MO.REL,"\u2227":e.MO.BIN4,"\u2228":e.MO.BIN4,"\u2229":e.MO.BIN4,"\u222a":e.MO.BIN4,"\u2234":e.MO.REL,"\u2235":e.MO.REL,"\u2236":e.MO.REL,"\u2237":e.MO.REL,"\u2238":e.MO.BIN4,"\u2239":e.MO.REL,"\u223a":e.MO.BIN4,"\u223b":e.MO.REL,"\u223c":e.MO.REL,"\u223d":e.MO.REL,"\u223d\u0331":e.MO.BIN3,"\u223e":e.MO.REL,"\u223f":e.MO.BIN3,"\u2240":e.MO.BIN4,"\u2241":e.MO.REL,"\u2242":e.MO.REL,"\u2242\u0338":e.MO.REL,"\u2243":e.MO.REL,"\u2244":e.MO.REL,"\u2245":e.MO.REL,"\u2246":e.MO.REL,"\u2247":e.MO.REL,"\u2248":e.MO.REL,"\u2249":e.MO.REL,"\u224a":e.MO.REL,"\u224b":e.MO.REL,"\u224c":e.MO.REL,"\u224d":e.MO.REL,"\u224e":e.MO.REL,"\u224e\u0338":e.MO.REL,"\u224f":e.MO.REL,"\u224f\u0338":e.MO.REL,"\u2250":e.MO.REL,"\u2251":e.MO.REL,"\u2252":e.MO.REL,"\u2253":e.MO.REL,"\u2254":e.MO.REL,"\u2255":e.MO.REL,"\u2256":e.MO.REL,"\u2257":e.MO.REL,"\u2258":e.MO.REL,"\u2259":e.MO.REL,"\u225a":e.MO.REL,"\u225b":e.MO.REL,"\u225c":e.MO.REL,"\u225d":e.MO.REL,"\u225e":e.MO.REL,"\u225f":e.MO.REL,"\u2260":e.MO.REL,"\u2261":e.MO.REL,"\u2262":e.MO.REL,"\u2263":e.MO.REL,"\u2264":e.MO.REL,"\u2265":e.MO.REL,"\u2266":e.MO.REL,"\u2266\u0338":e.MO.REL,"\u2267":e.MO.REL,"\u2268":e.MO.REL,"\u2269":e.MO.REL,"\u226a":e.MO.REL,"\u226a\u0338":e.MO.REL,"\u226b":e.MO.REL,"\u226b\u0338":e.MO.REL,"\u226c":e.MO.REL,"\u226d":e.MO.REL,"\u226e":e.MO.REL,"\u226f":e.MO.REL,"\u2270":e.MO.REL,"\u2271":e.MO.REL,"\u2272":e.MO.REL,"\u2273":e.MO.REL,"\u2274":e.MO.REL,"\u2275":e.MO.REL,"\u2276":e.MO.REL,"\u2277":e.MO.REL,"\u2278":e.MO.REL,"\u2279":e.MO.REL,"\u227a":e.MO.REL,"\u227b":e.MO.REL,"\u227c":e.MO.REL,"\u227d":e.MO.REL,"\u227e":e.MO.REL,"\u227f":e.MO.REL,"\u227f\u0338":e.MO.REL,"\u2280":e.MO.REL,"\u2281":e.MO.REL,"\u2282":e.MO.REL,"\u2282\u20d2":e.MO.REL,"\u2283":e.MO.REL,"\u2283\u20d2":e.MO.REL,"\u2284":e.MO.REL,"\u2285":e.MO.REL,"\u2286":e.MO.REL,"\u2287":e.MO.REL,"\u2288":e.MO.REL,"\u2289":e.MO.REL,"\u228a":e.MO.REL,"\u228b":e.MO.REL,"\u228c":e.MO.BIN4,"\u228d":e.MO.BIN4,"\u228e":e.MO.BIN4,"\u228f":e.MO.REL,"\u228f\u0338":e.MO.REL,"\u2290":e.MO.REL,"\u2290\u0338":e.MO.REL,"\u2291":e.MO.REL,"\u2292":e.MO.REL,"\u2293":e.MO.BIN4,"\u2294":e.MO.BIN4,"\u2295":e.MO.BIN4,"\u2296":e.MO.BIN4,"\u2297":e.MO.BIN4,"\u2298":e.MO.BIN4,"\u2299":e.MO.BIN4,"\u229a":e.MO.BIN4,"\u229b":e.MO.BIN4,"\u229c":e.MO.BIN4,"\u229d":e.MO.BIN4,"\u229e":e.MO.BIN4,"\u229f":e.MO.BIN4,"\u22a0":e.MO.BIN4,"\u22a1":e.MO.BIN4,"\u22a2":e.MO.REL,"\u22a3":e.MO.REL,"\u22a4":e.MO.ORD55,"\u22a5":e.MO.REL,"\u22a6":e.MO.REL,"\u22a7":e.MO.REL,"\u22a8":e.MO.REL,"\u22a9":e.MO.REL,"\u22aa":e.MO.REL,"\u22ab":e.MO.REL,"\u22ac":e.MO.REL,"\u22ad":e.MO.REL,"\u22ae":e.MO.REL,"\u22af":e.MO.REL,"\u22b0":e.MO.REL,"\u22b1":e.MO.REL,"\u22b2":e.MO.REL,"\u22b3":e.MO.REL,"\u22b4":e.MO.REL,"\u22b5":e.MO.REL,"\u22b6":e.MO.REL,"\u22b7":e.MO.REL,"\u22b8":e.MO.REL,"\u22b9":e.MO.REL,"\u22ba":e.MO.BIN4,"\u22bb":e.MO.BIN4,"\u22bc":e.MO.BIN4,"\u22bd":e.MO.BIN4,"\u22be":e.MO.BIN3,"\u22bf":e.MO.BIN3,"\u22c4":e.MO.BIN4,"\u22c5":e.MO.BIN4,"\u22c6":e.MO.BIN4,"\u22c7":e.MO.BIN4,"\u22c8":e.MO.REL,"\u22c9":e.MO.BIN4,"\u22ca":e.MO.BIN4,"\u22cb":e.MO.BIN4,"\u22cc":e.MO.BIN4,"\u22cd":e.MO.REL,"\u22ce":e.MO.BIN4,"\u22cf":e.MO.BIN4,"\u22d0":e.MO.REL,"\u22d1":e.MO.REL,"\u22d2":e.MO.BIN4,"\u22d3":e.MO.BIN4,"\u22d4":e.MO.REL,"\u22d5":e.MO.REL,"\u22d6":e.MO.REL,"\u22d7":e.MO.REL,"\u22d8":e.MO.REL,"\u22d9":e.MO.REL,"\u22da":e.MO.REL,"\u22db":e.MO.REL,"\u22dc":e.MO.REL,"\u22dd":e.MO.REL,"\u22de":e.MO.REL,"\u22df":e.MO.REL,"\u22e0":e.MO.REL,"\u22e1":e.MO.REL,"\u22e2":e.MO.REL,"\u22e3":e.MO.REL,"\u22e4":e.MO.REL,"\u22e5":e.MO.REL,"\u22e6":e.MO.REL,"\u22e7":e.MO.REL,"\u22e8":e.MO.REL,"\u22e9":e.MO.REL,"\u22ea":e.MO.REL,"\u22eb":e.MO.REL,"\u22ec":e.MO.REL,"\u22ed":e.MO.REL,"\u22ee":e.MO.ORD55,"\u22ef":e.MO.INNER,"\u22f0":e.MO.REL,"\u22f1":[5,5,o.TEXCLASS.INNER,null],"\u22f2":e.MO.REL,"\u22f3":e.MO.REL,"\u22f4":e.MO.REL,"\u22f5":e.MO.REL,"\u22f6":e.MO.REL,"\u22f7":e.MO.REL,"\u22f8":e.MO.REL,"\u22f9":e.MO.REL,"\u22fa":e.MO.REL,"\u22fb":e.MO.REL,"\u22fc":e.MO.REL,"\u22fd":e.MO.REL,"\u22fe":e.MO.REL,"\u22ff":e.MO.REL,"\u2305":e.MO.BIN3,"\u2306":e.MO.BIN3,"\u2322":e.MO.REL4,"\u2323":e.MO.REL4,"\u2329":e.MO.OPEN,"\u232a":e.MO.CLOSE,"\u23aa":e.MO.ORD,"\u23af":[0,0,o.TEXCLASS.ORD,{stretchy:!0}],"\u23b0":e.MO.OPEN,"\u23b1":e.MO.CLOSE,"\u2500":e.MO.ORD,"\u25b3":e.MO.BIN4,"\u25b5":e.MO.BIN4,"\u25b9":e.MO.BIN4,"\u25bd":e.MO.BIN4,"\u25bf":e.MO.BIN4,"\u25c3":e.MO.BIN4,"\u25ef":e.MO.BIN3,"\u2660":e.MO.ORD,"\u2661":e.MO.ORD,"\u2662":e.MO.ORD,"\u2663":e.MO.ORD,"\u2758":e.MO.REL,"\u27f0":e.MO.RELSTRETCH,"\u27f1":e.MO.RELSTRETCH,"\u27f5":e.MO.WIDEREL,"\u27f6":e.MO.WIDEREL,"\u27f7":e.MO.WIDEREL,"\u27f8":e.MO.WIDEREL,"\u27f9":e.MO.WIDEREL,"\u27fa":e.MO.WIDEREL,"\u27fb":e.MO.WIDEREL,"\u27fc":e.MO.WIDEREL,"\u27fd":e.MO.WIDEREL,"\u27fe":e.MO.WIDEREL,"\u27ff":e.MO.WIDEREL,"\u2900":e.MO.RELACCENT,"\u2901":e.MO.RELACCENT,"\u2902":e.MO.RELACCENT,"\u2903":e.MO.RELACCENT,"\u2904":e.MO.RELACCENT,"\u2905":e.MO.RELACCENT,"\u2906":e.MO.RELACCENT,"\u2907":e.MO.RELACCENT,"\u2908":e.MO.REL,"\u2909":e.MO.REL,"\u290a":e.MO.RELSTRETCH,"\u290b":e.MO.RELSTRETCH,"\u290c":e.MO.WIDEREL,"\u290d":e.MO.WIDEREL,"\u290e":e.MO.WIDEREL,"\u290f":e.MO.WIDEREL,"\u2910":e.MO.WIDEREL,"\u2911":e.MO.RELACCENT,"\u2912":e.MO.RELSTRETCH,"\u2913":e.MO.RELSTRETCH,"\u2914":e.MO.RELACCENT,"\u2915":e.MO.RELACCENT,"\u2916":e.MO.RELACCENT,"\u2917":e.MO.RELACCENT,"\u2918":e.MO.RELACCENT,"\u2919":e.MO.RELACCENT,"\u291a":e.MO.RELACCENT,"\u291b":e.MO.RELACCENT,"\u291c":e.MO.RELACCENT,"\u291d":e.MO.RELACCENT,"\u291e":e.MO.RELACCENT,"\u291f":e.MO.RELACCENT,"\u2920":e.MO.RELACCENT,"\u2921":e.MO.RELSTRETCH,"\u2922":e.MO.RELSTRETCH,"\u2923":e.MO.REL,"\u2924":e.MO.REL,"\u2925":e.MO.REL,"\u2926":e.MO.REL,"\u2927":e.MO.REL,"\u2928":e.MO.REL,"\u2929":e.MO.REL,"\u292a":e.MO.REL,"\u292b":e.MO.REL,"\u292c":e.MO.REL,"\u292d":e.MO.REL,"\u292e":e.MO.REL,"\u292f":e.MO.REL,"\u2930":e.MO.REL,"\u2931":e.MO.REL,"\u2932":e.MO.REL,"\u2933":e.MO.RELACCENT,"\u2934":e.MO.REL,"\u2935":e.MO.REL,"\u2936":e.MO.REL,"\u2937":e.MO.REL,"\u2938":e.MO.REL,"\u2939":e.MO.REL,"\u293a":e.MO.RELACCENT,"\u293b":e.MO.RELACCENT,"\u293c":e.MO.RELACCENT,"\u293d":e.MO.RELACCENT,"\u293e":e.MO.REL,"\u293f":e.MO.REL,"\u2940":e.MO.REL,"\u2941":e.MO.REL,"\u2942":e.MO.RELACCENT,"\u2943":e.MO.RELACCENT,"\u2944":e.MO.RELACCENT,"\u2945":e.MO.RELACCENT,"\u2946":e.MO.RELACCENT,"\u2947":e.MO.RELACCENT,"\u2948":e.MO.RELACCENT,"\u2949":e.MO.REL,"\u294a":e.MO.RELACCENT,"\u294b":e.MO.RELACCENT,"\u294c":e.MO.REL,"\u294d":e.MO.REL,"\u294e":e.MO.WIDEREL,"\u294f":e.MO.RELSTRETCH,"\u2950":e.MO.WIDEREL,"\u2951":e.MO.RELSTRETCH,"\u2952":e.MO.WIDEREL,"\u2953":e.MO.WIDEREL,"\u2954":e.MO.RELSTRETCH,"\u2955":e.MO.RELSTRETCH,"\u2956":e.MO.RELSTRETCH,"\u2957":e.MO.RELSTRETCH,"\u2958":e.MO.RELSTRETCH,"\u2959":e.MO.RELSTRETCH,"\u295a":e.MO.WIDEREL,"\u295b":e.MO.WIDEREL,"\u295c":e.MO.RELSTRETCH,"\u295d":e.MO.RELSTRETCH,"\u295e":e.MO.WIDEREL,"\u295f":e.MO.WIDEREL,"\u2960":e.MO.RELSTRETCH,"\u2961":e.MO.RELSTRETCH,"\u2962":e.MO.RELACCENT,"\u2963":e.MO.REL,"\u2964":e.MO.RELACCENT,"\u2965":e.MO.REL,"\u2966":e.MO.RELACCENT,"\u2967":e.MO.RELACCENT,"\u2968":e.MO.RELACCENT,"\u2969":e.MO.RELACCENT,"\u296a":e.MO.RELACCENT,"\u296b":e.MO.RELACCENT,"\u296c":e.MO.RELACCENT,"\u296d":e.MO.RELACCENT,"\u296e":e.MO.RELSTRETCH,"\u296f":e.MO.RELSTRETCH,"\u2970":e.MO.RELACCENT,"\u2971":e.MO.RELACCENT,"\u2972":e.MO.RELACCENT,"\u2973":e.MO.RELACCENT,"\u2974":e.MO.RELACCENT,"\u2975":e.MO.RELACCENT,"\u2976":e.MO.RELACCENT,"\u2977":e.MO.RELACCENT,"\u2978":e.MO.RELACCENT,"\u2979":e.MO.RELACCENT,"\u297a":e.MO.RELACCENT,"\u297b":e.MO.RELACCENT,"\u297c":e.MO.RELACCENT,"\u297d":e.MO.RELACCENT,"\u297e":e.MO.REL,"\u297f":e.MO.REL,"\u2981":e.MO.BIN3,"\u2982":e.MO.BIN3,"\u2999":e.MO.BIN3,"\u299a":e.MO.BIN3,"\u299b":e.MO.BIN3,"\u299c":e.MO.BIN3,"\u299d":e.MO.BIN3,"\u299e":e.MO.BIN3,"\u299f":e.MO.BIN3,"\u29a0":e.MO.BIN3,"\u29a1":e.MO.BIN3,"\u29a2":e.MO.BIN3,"\u29a3":e.MO.BIN3,"\u29a4":e.MO.BIN3,"\u29a5":e.MO.BIN3,"\u29a6":e.MO.BIN3,"\u29a7":e.MO.BIN3,"\u29a8":e.MO.BIN3,"\u29a9":e.MO.BIN3,"\u29aa":e.MO.BIN3,"\u29ab":e.MO.BIN3,"\u29ac":e.MO.BIN3,"\u29ad":e.MO.BIN3,"\u29ae":e.MO.BIN3,"\u29af":e.MO.BIN3,"\u29b0":e.MO.BIN3,"\u29b1":e.MO.BIN3,"\u29b2":e.MO.BIN3,"\u29b3":e.MO.BIN3,"\u29b4":e.MO.BIN3,"\u29b5":e.MO.BIN3,"\u29b6":e.MO.BIN4,"\u29b7":e.MO.BIN4,"\u29b8":e.MO.BIN4,"\u29b9":e.MO.BIN4,"\u29ba":e.MO.BIN4,"\u29bb":e.MO.BIN4,"\u29bc":e.MO.BIN4,"\u29bd":e.MO.BIN4,"\u29be":e.MO.BIN4,"\u29bf":e.MO.BIN4,"\u29c0":e.MO.REL,"\u29c1":e.MO.REL,"\u29c2":e.MO.BIN3,"\u29c3":e.MO.BIN3,"\u29c4":e.MO.BIN4,"\u29c5":e.MO.BIN4,"\u29c6":e.MO.BIN4,"\u29c7":e.MO.BIN4,"\u29c8":e.MO.BIN4,"\u29c9":e.MO.BIN3,"\u29ca":e.MO.BIN3,"\u29cb":e.MO.BIN3,"\u29cc":e.MO.BIN3,"\u29cd":e.MO.BIN3,"\u29ce":e.MO.REL,"\u29cf":e.MO.REL,"\u29cf\u0338":e.MO.REL,"\u29d0":e.MO.REL,"\u29d0\u0338":e.MO.REL,"\u29d1":e.MO.REL,"\u29d2":e.MO.REL,"\u29d3":e.MO.REL,"\u29d4":e.MO.REL,"\u29d5":e.MO.REL,"\u29d6":e.MO.BIN4,"\u29d7":e.MO.BIN4,"\u29d8":e.MO.BIN3,"\u29d9":e.MO.BIN3,"\u29db":e.MO.BIN3,"\u29dc":e.MO.BIN3,"\u29dd":e.MO.BIN3,"\u29de":e.MO.REL,"\u29df":e.MO.BIN3,"\u29e0":e.MO.BIN3,"\u29e1":e.MO.REL,"\u29e2":e.MO.BIN4,"\u29e3":e.MO.REL,"\u29e4":e.MO.REL,"\u29e5":e.MO.REL,"\u29e6":e.MO.REL,"\u29e7":e.MO.BIN3,"\u29e8":e.MO.BIN3,"\u29e9":e.MO.BIN3,"\u29ea":e.MO.BIN3,"\u29eb":e.MO.BIN3,"\u29ec":e.MO.BIN3,"\u29ed":e.MO.BIN3,"\u29ee":e.MO.BIN3,"\u29ef":e.MO.BIN3,"\u29f0":e.MO.BIN3,"\u29f1":e.MO.BIN3,"\u29f2":e.MO.BIN3,"\u29f3":e.MO.BIN3,"\u29f4":e.MO.REL,"\u29f5":e.MO.BIN4,"\u29f6":e.MO.BIN4,"\u29f7":e.MO.BIN4,"\u29f8":e.MO.BIN3,"\u29f9":e.MO.BIN3,"\u29fa":e.MO.BIN3,"\u29fb":e.MO.BIN3,"\u29fe":e.MO.BIN4,"\u29ff":e.MO.BIN4,"\u2a1d":e.MO.BIN3,"\u2a1e":e.MO.BIN3,"\u2a1f":e.MO.BIN3,"\u2a20":e.MO.BIN3,"\u2a21":e.MO.BIN3,"\u2a22":e.MO.BIN4,"\u2a23":e.MO.BIN4,"\u2a24":e.MO.BIN4,"\u2a25":e.MO.BIN4,"\u2a26":e.MO.BIN4,"\u2a27":e.MO.BIN4,"\u2a28":e.MO.BIN4,"\u2a29":e.MO.BIN4,"\u2a2a":e.MO.BIN4,"\u2a2b":e.MO.BIN4,"\u2a2c":e.MO.BIN4,"\u2a2d":e.MO.BIN4,"\u2a2e":e.MO.BIN4,"\u2a2f":e.MO.BIN4,"\u2a30":e.MO.BIN4,"\u2a31":e.MO.BIN4,"\u2a32":e.MO.BIN4,"\u2a33":e.MO.BIN4,"\u2a34":e.MO.BIN4,"\u2a35":e.MO.BIN4,"\u2a36":e.MO.BIN4,"\u2a37":e.MO.BIN4,"\u2a38":e.MO.BIN4,"\u2a39":e.MO.BIN4,"\u2a3a":e.MO.BIN4,"\u2a3b":e.MO.BIN4,"\u2a3c":e.MO.BIN4,"\u2a3d":e.MO.BIN4,"\u2a3e":e.MO.BIN4,"\u2a3f":e.MO.BIN4,"\u2a40":e.MO.BIN4,"\u2a41":e.MO.BIN4,"\u2a42":e.MO.BIN4,"\u2a43":e.MO.BIN4,"\u2a44":e.MO.BIN4,"\u2a45":e.MO.BIN4,"\u2a46":e.MO.BIN4,"\u2a47":e.MO.BIN4,"\u2a48":e.MO.BIN4,"\u2a49":e.MO.BIN4,"\u2a4a":e.MO.BIN4,"\u2a4b":e.MO.BIN4,"\u2a4c":e.MO.BIN4,"\u2a4d":e.MO.BIN4,"\u2a4e":e.MO.BIN4,"\u2a4f":e.MO.BIN4,"\u2a50":e.MO.BIN4,"\u2a51":e.MO.BIN4,"\u2a52":e.MO.BIN4,"\u2a53":e.MO.BIN4,"\u2a54":e.MO.BIN4,"\u2a55":e.MO.BIN4,"\u2a56":e.MO.BIN4,"\u2a57":e.MO.BIN4,"\u2a58":e.MO.BIN4,"\u2a59":e.MO.REL,"\u2a5a":e.MO.BIN4,"\u2a5b":e.MO.BIN4,"\u2a5c":e.MO.BIN4,"\u2a5d":e.MO.BIN4,"\u2a5e":e.MO.BIN4,"\u2a5f":e.MO.BIN4,"\u2a60":e.MO.BIN4,"\u2a61":e.MO.BIN4,"\u2a62":e.MO.BIN4,"\u2a63":e.MO.BIN4,"\u2a64":e.MO.BIN4,"\u2a65":e.MO.BIN4,"\u2a66":e.MO.REL,"\u2a67":e.MO.REL,"\u2a68":e.MO.REL,"\u2a69":e.MO.REL,"\u2a6a":e.MO.REL,"\u2a6b":e.MO.REL,"\u2a6c":e.MO.REL,"\u2a6d":e.MO.REL,"\u2a6e":e.MO.REL,"\u2a6f":e.MO.REL,"\u2a70":e.MO.REL,"\u2a71":e.MO.BIN4,"\u2a72":e.MO.BIN4,"\u2a73":e.MO.REL,"\u2a74":e.MO.REL,"\u2a75":e.MO.REL,"\u2a76":e.MO.REL,"\u2a77":e.MO.REL,"\u2a78":e.MO.REL,"\u2a79":e.MO.REL,"\u2a7a":e.MO.REL,"\u2a7b":e.MO.REL,"\u2a7c":e.MO.REL,"\u2a7d":e.MO.REL,"\u2a7d\u0338":e.MO.REL,"\u2a7e":e.MO.REL,"\u2a7e\u0338":e.MO.REL,"\u2a7f":e.MO.REL,"\u2a80":e.MO.REL,"\u2a81":e.MO.REL,"\u2a82":e.MO.REL,"\u2a83":e.MO.REL,"\u2a84":e.MO.REL,"\u2a85":e.MO.REL,"\u2a86":e.MO.REL,"\u2a87":e.MO.REL,"\u2a88":e.MO.REL,"\u2a89":e.MO.REL,"\u2a8a":e.MO.REL,"\u2a8b":e.MO.REL,"\u2a8c":e.MO.REL,"\u2a8d":e.MO.REL,"\u2a8e":e.MO.REL,"\u2a8f":e.MO.REL,"\u2a90":e.MO.REL,"\u2a91":e.MO.REL,"\u2a92":e.MO.REL,"\u2a93":e.MO.REL,"\u2a94":e.MO.REL,"\u2a95":e.MO.REL,"\u2a96":e.MO.REL,"\u2a97":e.MO.REL,"\u2a98":e.MO.REL,"\u2a99":e.MO.REL,"\u2a9a":e.MO.REL,"\u2a9b":e.MO.REL,"\u2a9c":e.MO.REL,"\u2a9d":e.MO.REL,"\u2a9e":e.MO.REL,"\u2a9f":e.MO.REL,"\u2aa0":e.MO.REL,"\u2aa1":e.MO.REL,"\u2aa1\u0338":e.MO.REL,"\u2aa2":e.MO.REL,"\u2aa2\u0338":e.MO.REL,"\u2aa3":e.MO.REL,"\u2aa4":e.MO.REL,"\u2aa5":e.MO.REL,"\u2aa6":e.MO.REL,"\u2aa7":e.MO.REL,"\u2aa8":e.MO.REL,"\u2aa9":e.MO.REL,"\u2aaa":e.MO.REL,"\u2aab":e.MO.REL,"\u2aac":e.MO.REL,"\u2aad":e.MO.REL,"\u2aae":e.MO.REL,"\u2aaf":e.MO.REL,"\u2aaf\u0338":e.MO.REL,"\u2ab0":e.MO.REL,"\u2ab0\u0338":e.MO.REL,"\u2ab1":e.MO.REL,"\u2ab2":e.MO.REL,"\u2ab3":e.MO.REL,"\u2ab4":e.MO.REL,"\u2ab5":e.MO.REL,"\u2ab6":e.MO.REL,"\u2ab7":e.MO.REL,"\u2ab8":e.MO.REL,"\u2ab9":e.MO.REL,"\u2aba":e.MO.REL,"\u2abb":e.MO.REL,"\u2abc":e.MO.REL,"\u2abd":e.MO.REL,"\u2abe":e.MO.REL,"\u2abf":e.MO.REL,"\u2ac0":e.MO.REL,"\u2ac1":e.MO.REL,"\u2ac2":e.MO.REL,"\u2ac3":e.MO.REL,"\u2ac4":e.MO.REL,"\u2ac5":e.MO.REL,"\u2ac6":e.MO.REL,"\u2ac7":e.MO.REL,"\u2ac8":e.MO.REL,"\u2ac9":e.MO.REL,"\u2aca":e.MO.REL,"\u2acb":e.MO.REL,"\u2acc":e.MO.REL,"\u2acd":e.MO.REL,"\u2ace":e.MO.REL,"\u2acf":e.MO.REL,"\u2ad0":e.MO.REL,"\u2ad1":e.MO.REL,"\u2ad2":e.MO.REL,"\u2ad3":e.MO.REL,"\u2ad4":e.MO.REL,"\u2ad5":e.MO.REL,"\u2ad6":e.MO.REL,"\u2ad7":e.MO.REL,"\u2ad8":e.MO.REL,"\u2ad9":e.MO.REL,"\u2ada":e.MO.REL,"\u2adb":e.MO.REL,"\u2add":e.MO.REL,"\u2add\u0338":e.MO.REL,"\u2ade":e.MO.REL,"\u2adf":e.MO.REL,"\u2ae0":e.MO.REL,"\u2ae1":e.MO.REL,"\u2ae2":e.MO.REL,"\u2ae3":e.MO.REL,"\u2ae4":e.MO.REL,"\u2ae5":e.MO.REL,"\u2ae6":e.MO.REL,"\u2ae7":e.MO.REL,"\u2ae8":e.MO.REL,"\u2ae9":e.MO.REL,"\u2aea":e.MO.REL,"\u2aeb":e.MO.REL,"\u2aec":e.MO.REL,"\u2aed":e.MO.REL,"\u2aee":e.MO.REL,"\u2aef":e.MO.REL,"\u2af0":e.MO.REL,"\u2af1":e.MO.REL,"\u2af2":e.MO.REL,"\u2af3":e.MO.REL,"\u2af4":e.MO.BIN4,"\u2af5":e.MO.BIN4,"\u2af6":e.MO.BIN4,"\u2af7":e.MO.REL,"\u2af8":e.MO.REL,"\u2af9":e.MO.REL,"\u2afa":e.MO.REL,"\u2afb":e.MO.BIN4,"\u2afd":e.MO.BIN4,"\u2afe":e.MO.BIN3,"\u2b45":e.MO.RELSTRETCH,"\u2b46":e.MO.RELSTRETCH,"\u3008":e.MO.OPEN,"\u3009":e.MO.CLOSE,"\ufe37":e.MO.WIDEACCENT,"\ufe38":e.MO.WIDEACCENT}},e.OPTABLE.infix["^"]=e.MO.WIDEREL,e.OPTABLE.infix._=e.MO.WIDEREL,e.OPTABLE.infix["\u2adc"]=e.MO.REL},9259:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},Q=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SerializedMmlVisitor=e.toEntity=e.DATAMJX=void 0;var T=r(6325),s=r(9007),a=r(450);e.DATAMJX="data-mjx-";e.toEntity=function(t){return"&#x"+t.codePointAt(0).toString(16).toUpperCase()+";"};var l=function(t){function r(){return null!==t&&t.apply(this,arguments)||this}return o(r,t),r.prototype.visitTree=function(t){return this.visitNode(t,"")},r.prototype.visitTextNode=function(t,e){return this.quoteHTML(t.getText())},r.prototype.visitXMLNode=function(t,e){return e+t.getSerializedXML()},r.prototype.visitInferredMrowNode=function(t,e){var r,n,o=[];try{for(var Q=i(t.childNodes),T=Q.next();!T.done;T=Q.next()){var s=T.value;o.push(this.visitNode(s,e))}}catch(t){r={error:t}}finally{try{T&&!T.done&&(n=Q.return)&&n.call(Q)}finally{if(r)throw r.error}}return o.join("\n")},r.prototype.visitTeXAtomNode=function(t,e){var r=this.childNodeMml(t,e+" ","\n");return e+""+(r.match(/\S/)?"\n"+r+e:"")+""},r.prototype.visitAnnotationNode=function(t,e){return e+""+this.childNodeMml(t,"","")+""},r.prototype.visitDefault=function(t,e){var r=t.kind,n=Q(t.isToken||0===t.childNodes.length?["",""]:["\n",e],2),o=n[0],i=n[1],T=this.childNodeMml(t,e+" ",o);return e+"<"+r+this.getAttributes(t)+">"+(T.match(/\S/)?o+T+i:"")+""},r.prototype.childNodeMml=function(t,e,r){var n,o,Q="";try{for(var T=i(t.childNodes),s=T.next();!s.done;s=T.next()){var a=s.value;Q+=this.visitNode(a,e)+r}}catch(t){n={error:t}}finally{try{s&&!s.done&&(o=T.return)&&o.call(T)}finally{if(n)throw n.error}}return Q},r.prototype.getAttributes=function(t){var e,r,n=[],o=this.constructor.defaultAttributes[t.kind]||{},Q=Object.assign({},o,this.getDataAttributes(t),t.attributes.getAllAttributes()),T=this.constructor.variants;Q.hasOwnProperty("mathvariant")&&T.hasOwnProperty(Q.mathvariant)&&(Q.mathvariant=T[Q.mathvariant]);try{for(var s=i(Object.keys(Q)),a=s.next();!a.done;a=s.next()){var l=a.value,c=String(Q[l]);void 0!==c&&n.push(l+'="'+this.quoteHTML(c)+'"')}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}return n.length?" "+n.join(" "):""},r.prototype.getDataAttributes=function(t){var e={},r=t.attributes.getExplicit("mathvariant"),n=this.constructor.variants;r&&n.hasOwnProperty(r)&&this.setDataAttribute(e,"variant",r),t.getProperty("variantForm")&&this.setDataAttribute(e,"alternate","1"),t.getProperty("pseudoscript")&&this.setDataAttribute(e,"pseudoscript","true"),!1===t.getProperty("autoOP")&&this.setDataAttribute(e,"auto-op","false");var o=t.getProperty("scriptalign");o&&this.setDataAttribute(e,"script-align",o);var i=t.getProperty("texClass");if(void 0!==i){var Q=!0;if(i===s.TEXCLASS.OP&&t.isKind("mi")){var T=t.getText();Q=!(T.length>1&&T.match(a.MmlMi.operatorName))}Q&&this.setDataAttribute(e,"texclass",i<0?"NONE":s.TEXCLASSNAMES[i])}return t.getProperty("scriptlevel")&&!1===t.getProperty("useHeight")&&this.setDataAttribute(e,"smallmatrix","true"),e},r.prototype.setDataAttribute=function(t,r,n){t[e.DATAMJX+r]=n},r.prototype.quoteHTML=function(t){return t.replace(/&/g,"&").replace(//g,">").replace(/\"/g,""").replace(/[\uD800-\uDBFF]./g,e.toEntity).replace(/[\u0080-\uD7FF\uE000-\uFFFF]/g,e.toEntity)},r.variants={"-tex-calligraphic":"script","-tex-bold-calligraphic":"bold-script","-tex-oldstyle":"normal","-tex-bold-oldstyle":"bold","-tex-mathit":"italic"},r.defaultAttributes={math:{xmlns:"http://www.w3.org/1998/Math/MathML"}},r}(T.MmlVisitor);e.SerializedMmlVisitor=l},2975:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractOutputJax=void 0;var n=r(7233),o=r(7525),i=function(){function t(t){void 0===t&&(t={}),this.adaptor=null;var e=this.constructor;this.options=(0,n.userOptions)((0,n.defaultOptions)({},e.OPTIONS),t),this.postFilters=new o.FunctionList}return Object.defineProperty(t.prototype,"name",{get:function(){return this.constructor.NAME},enumerable:!1,configurable:!0}),t.prototype.setAdaptor=function(t){this.adaptor=t},t.prototype.initialize=function(){},t.prototype.reset=function(){for(var t=[],e=0;e=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEmptyNode=e.AbstractNode=void 0;var Q=function(){function t(t,e,r){var n,o;void 0===e&&(e={}),void 0===r&&(r=[]),this.factory=t,this.parent=null,this.properties={},this.childNodes=[];try{for(var Q=i(Object.keys(e)),T=Q.next();!T.done;T=Q.next()){var s=T.value;this.setProperty(s,e[s])}}catch(t){n={error:t}}finally{try{T&&!T.done&&(o=Q.return)&&o.call(Q)}finally{if(n)throw n.error}}r.length&&this.setChildren(r)}return Object.defineProperty(t.prototype,"kind",{get:function(){return"unknown"},enumerable:!1,configurable:!0}),t.prototype.setProperty=function(t,e){this.properties[t]=e},t.prototype.getProperty=function(t){return this.properties[t]},t.prototype.getPropertyNames=function(){return Object.keys(this.properties)},t.prototype.getAllProperties=function(){return this.properties},t.prototype.removeProperty=function(){for(var t,e,r=[],n=0;n=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},T=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLDocument=void 0;var s=r(5722),a=r(7233),l=r(3363),c=r(3335),u=r(5138),p=r(4474),h=function(t){function e(e,r,n){var o=this,i=Q((0,a.separateOptions)(n,u.HTMLDomStrings.OPTIONS),2),T=i[0],s=i[1];return(o=t.call(this,e,r,T)||this).domStrings=o.options.DomStrings||new u.HTMLDomStrings(s),o.domStrings.adaptor=r,o.styles=[],o}return o(e,t),e.prototype.findPosition=function(t,e,r,n){var o,i,s=this.adaptor;try{for(var a=T(n[t]),l=a.next();!l.done;l=a.next()){var c=l.value,u=Q(c,2),p=u[0],h=u[1];if(e<=h&&"#text"===s.kind(p))return{node:p,n:Math.max(e,0),delim:r};e-=h}}catch(t){o={error:t}}finally{try{l&&!l.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}return{node:null,n:0,delim:r}},e.prototype.mathItem=function(t,e,r){var n=t.math,o=this.findPosition(t.n,t.start.n,t.open,r),i=this.findPosition(t.n,t.end.n,t.close,r);return new this.options.MathItem(n,e,t.display,o,i)},e.prototype.findMath=function(t){var e,r,n,o,i,s,l,c,u;if(!this.processed.isSet("findMath")){this.adaptor.document=this.document,t=(0,a.userOptions)({elements:this.options.elements||[this.adaptor.body(this.document)]},t);try{for(var p=T(this.adaptor.getElements(t.elements,this.document)),h=p.next();!h.done;h=p.next()){var d=h.value,f=Q([null,null],2),L=f[0],m=f[1];try{for(var y=(n=void 0,T(this.inputJax)),g=y.next();!g.done;g=y.next()){var H=g.value,b=new this.options.MathList;if(H.processStrings){null===L&&(L=(i=Q(this.domStrings.find(d),2))[0],m=i[1]);try{for(var v=(s=void 0,T(H.findMath(L))),M=v.next();!M.done;M=v.next()){var _=M.value;b.push(this.mathItem(_,H,m))}}catch(t){s={error:t}}finally{try{M&&!M.done&&(l=v.return)&&l.call(v)}finally{if(s)throw s.error}}}else try{for(var O=(c=void 0,T(H.findMath(d))),V=O.next();!V.done;V=O.next()){_=V.value;var S=new this.options.MathItem(_.math,H,_.display,_.start,_.end);b.push(S)}}catch(t){c={error:t}}finally{try{V&&!V.done&&(u=O.return)&&u.call(O)}finally{if(c)throw c.error}}this.math.merge(b)}}catch(t){n={error:t}}finally{try{g&&!g.done&&(o=y.return)&&o.call(y)}finally{if(n)throw n.error}}}}catch(t){e={error:t}}finally{try{h&&!h.done&&(r=p.return)&&r.call(p)}finally{if(e)throw e.error}}this.processed.set("findMath")}return this},e.prototype.updateDocument=function(){return this.processed.isSet("updateDocument")||(this.addPageElements(),this.addStyleSheet(),t.prototype.updateDocument.call(this),this.processed.set("updateDocument")),this},e.prototype.addPageElements=function(){var t=this.adaptor.body(this.document),e=this.documentPageElements();e&&this.adaptor.append(t,e)},e.prototype.addStyleSheet=function(){var t=this.documentStyleSheet(),e=this.adaptor;if(t&&!e.parent(t)){var r=e.head(this.document),n=this.findSheet(r,e.getAttribute(t,"id"));n?e.replace(t,n):e.append(r,t)}},e.prototype.findSheet=function(t,e){var r,n;if(e)try{for(var o=T(this.adaptor.tags(t,"style")),i=o.next();!i.done;i=o.next()){var Q=i.value;if(this.adaptor.getAttribute(Q,"id")===e)return Q}}catch(t){r={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}return null},e.prototype.removeFromDocument=function(t){var e,r;if(void 0===t&&(t=!1),this.processed.isSet("updateDocument"))try{for(var n=T(this.math),o=n.next();!o.done;o=n.next()){var i=o.value;i.state()>=p.STATE.INSERTED&&i.state(p.STATE.TYPESET,t)}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return this.processed.clear("updateDocument"),this},e.prototype.documentStyleSheet=function(){return this.outputJax.styleSheet(this)},e.prototype.documentPageElements=function(){return this.outputJax.pageElements(this)},e.prototype.addStyles=function(t){this.styles.push(t)},e.prototype.getStyles=function(){return this.styles},e.KIND="HTML",e.OPTIONS=i(i({},s.AbstractMathDocument.OPTIONS),{renderActions:(0,a.expandable)(i(i({},s.AbstractMathDocument.OPTIONS.renderActions),{styles:[p.STATE.INSERTED+1,"","updateStyleSheet",!1]})),MathList:c.HTMLMathList,MathItem:l.HTMLMathItem,DomStrings:null}),e}(s.AbstractMathDocument);e.HTMLDocument=h},5138:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLDomStrings=void 0;var o=r(7233),i=function(){function t(t){void 0===t&&(t=null);var e=this.constructor;this.options=(0,o.userOptions)((0,o.defaultOptions)({},e.OPTIONS),t),this.init(),this.getPatterns()}return t.prototype.init=function(){this.strings=[],this.string="",this.snodes=[],this.nodes=[],this.stack=[]},t.prototype.getPatterns=function(){var t=(0,o.makeArray)(this.options.skipHtmlTags),e=(0,o.makeArray)(this.options.ignoreHtmlClass),r=(0,o.makeArray)(this.options.processHtmlClass);this.skipHtmlTags=new RegExp("^(?:"+t.join("|")+")$","i"),this.ignoreHtmlClass=new RegExp("(?:^| )(?:"+e.join("|")+")(?: |$)"),this.processHtmlClass=new RegExp("(?:^| )(?:"+r+")(?: |$)")},t.prototype.pushString=function(){this.string.match(/\S/)&&(this.strings.push(this.string),this.nodes.push(this.snodes)),this.string="",this.snodes=[]},t.prototype.extendString=function(t,e){this.snodes.push([t,e.length]),this.string+=e},t.prototype.handleText=function(t,e){return e||this.extendString(t,this.adaptor.value(t)),this.adaptor.next(t)},t.prototype.handleTag=function(t,e){if(!e){var r=this.options.includeHtmlTags[this.adaptor.kind(t)];this.extendString(t,r)}return this.adaptor.next(t)},t.prototype.handleContainer=function(t,e){this.pushString();var r=this.adaptor.getAttribute(t,"class")||"",n=this.adaptor.kind(t)||"",o=this.processHtmlClass.exec(r),i=t;return!this.adaptor.firstChild(t)||this.adaptor.getAttribute(t,"data-MJX")||!o&&this.skipHtmlTags.exec(n)?i=this.adaptor.next(t):(this.adaptor.next(t)&&this.stack.push([this.adaptor.next(t),e]),i=this.adaptor.firstChild(t),e=(e||this.ignoreHtmlClass.exec(r))&&!o),[i,e]},t.prototype.handleOther=function(t,e){return this.pushString(),this.adaptor.next(t)},t.prototype.find=function(t){var e,r;this.init();for(var o=this.adaptor.next(t),i=!1,Q=this.options.includeHtmlTags;t&&t!==o;){var T=this.adaptor.kind(t);"#text"===T?t=this.handleText(t,i):Q.hasOwnProperty(T)?t=this.handleTag(t,i):T?(t=(e=n(this.handleContainer(t,i),2))[0],i=e[1]):t=this.handleOther(t,i),!t&&this.stack.length&&(this.pushString(),t=(r=n(this.stack.pop(),2))[0],i=r[1])}this.pushString();var s=[this.strings,this.nodes];return this.init(),s},t.OPTIONS={skipHtmlTags:["script","noscript","style","textarea","pre","code","annotation","annotation-xml"],includeHtmlTags:{br:"\n",wbr:"","#comment":""},ignoreHtmlClass:"mathjax_ignore",processHtmlClass:"mathjax_process"},t}();e.HTMLDomStrings=i},3726:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLHandler=void 0;var i=r(3670),Q=r(3683),T=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.documentClass=Q.HTMLDocument,e}return o(e,t),e.prototype.handlesDocument=function(t){var e=this.adaptor;if("string"==typeof t)try{t=e.parse(t,"text/html")}catch(t){}return t instanceof e.window.Document||t instanceof e.window.HTMLElement||t instanceof e.window.DocumentFragment},e.prototype.create=function(e,r){var n=this.adaptor;if("string"==typeof e)e=n.parse(e,"text/html");else if(e instanceof n.window.HTMLElement||e instanceof n.window.DocumentFragment){var o=e;e=n.parse("","text/html"),n.append(n.body(e),o)}return t.prototype.create.call(this,e,r)},e}(i.AbstractHandler);e.HTMLHandler=T},3363:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLMathItem=void 0;var i=r(4474),Q=function(t){function e(e,r,n,o,i){return void 0===n&&(n=!0),void 0===o&&(o={node:null,n:0,delim:""}),void 0===i&&(i={node:null,n:0,delim:""}),t.call(this,e,r,n,o,i)||this}return o(e,t),Object.defineProperty(e.prototype,"adaptor",{get:function(){return this.inputJax.adaptor},enumerable:!1,configurable:!0}),e.prototype.updateDocument=function(t){if(this.state()=i.STATE.TYPESET){var e=this.adaptor,r=this.start.node,n=e.text("");if(t){var o=this.start.delim+this.math+this.end.delim;if(this.inputJax.processStrings)n=e.text(o);else{var Q=e.parse(o,"text/html");n=e.firstChild(e.body(Q))}}e.parent(r)&&e.replace(n,r),this.start.node=this.end.node=n,this.start.n=this.end.n=0}},e}(i.AbstractMathItem);e.HTMLMathItem=Q},3335:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.HTMLMathList=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e}(r(9e3).AbstractMathList);e.HTMLMathList=i},2892:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.MathML=void 0;var Q=r(9206),T=r(7233),s=r(7525),a=r(625),l=r(2769),c=function(t){function e(e){void 0===e&&(e={});var r=this,n=i((0,T.separateOptions)(e,a.FindMathML.OPTIONS,l.MathMLCompile.OPTIONS),3),o=n[0],Q=n[1],c=n[2];return(r=t.call(this,o)||this).findMathML=r.options.FindMathML||new a.FindMathML(Q),r.mathml=r.options.MathMLCompile||new l.MathMLCompile(c),r.mmlFilters=new s.FunctionList,r}return o(e,t),e.prototype.setAdaptor=function(e){t.prototype.setAdaptor.call(this,e),this.findMathML.adaptor=e,this.mathml.adaptor=e},e.prototype.setMmlFactory=function(e){t.prototype.setMmlFactory.call(this,e),this.mathml.setMmlFactory(e)},Object.defineProperty(e.prototype,"processStrings",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.compile=function(t,e){var r=t.start.node;if(!r||!t.end.node||this.options.forceReparse||"#text"===this.adaptor.kind(r)){var n=this.executeFilters(this.preFilters,t,e,(t.math||"").trim()),o=this.checkForErrors(this.adaptor.parse(n,"text/"+this.options.parseAs)),i=this.adaptor.body(o);1!==this.adaptor.childNodes(i).length&&this.error("MathML must consist of a single element"),r=this.adaptor.remove(this.adaptor.firstChild(i)),"math"!==this.adaptor.kind(r).replace(/^[a-z]+:/,"")&&this.error("MathML must be formed by a element, not <"+this.adaptor.kind(r)+">")}return r=this.executeFilters(this.mmlFilters,t,e,r),this.executeFilters(this.postFilters,t,e,this.mathml.compile(r))},e.prototype.checkForErrors=function(t){var e=this.adaptor.tags(this.adaptor.body(t),"parsererror")[0];return e&&(""===this.adaptor.textContent(e)&&this.error("Error processing MathML"),this.options.parseError.call(this,e)),t},e.prototype.error=function(t){throw new Error(t)},e.prototype.findMath=function(t){return this.findMathML.findMath(t)},e.NAME="MathML",e.OPTIONS=(0,T.defaultOptions)({parseAs:"html",forceReparse:!1,FindMathML:null,MathMLCompile:null,parseError:function(t){this.error(this.adaptor.textContent(t).replace(/\n.*/g,""))}},Q.AbstractInputJax.OPTIONS),e}(Q.AbstractInputJax);e.MathML=c},625:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.FindMathML=void 0;var Q=r(3494),T="http://www.w3.org/1998/Math/MathML",s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.findMath=function(t){var e=new Set;this.findMathNodes(t,e),this.findMathPrefixed(t,e);var r=this.adaptor.root(this.adaptor.document);return"html"===this.adaptor.kind(r)&&0===e.size&&this.findMathNS(t,e),this.processMath(e)},e.prototype.findMathNodes=function(t,e){var r,n;try{for(var o=i(this.adaptor.tags(t,"math")),Q=o.next();!Q.done;Q=o.next()){var T=Q.value;e.add(T)}}catch(t){r={error:t}}finally{try{Q&&!Q.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.findMathPrefixed=function(t,e){var r,n,o,Q,s=this.adaptor.root(this.adaptor.document);try{for(var a=i(this.adaptor.allAttributes(s)),l=a.next();!l.done;l=a.next()){var c=l.value;if("xmlns:"===c.name.substr(0,6)&&c.value===T){var u=c.name.substr(6);try{for(var p=(o=void 0,i(this.adaptor.tags(t,u+":math"))),h=p.next();!h.done;h=p.next()){var d=h.value;e.add(d)}}catch(t){o={error:t}}finally{try{h&&!h.done&&(Q=p.return)&&Q.call(p)}finally{if(o)throw o.error}}}}}catch(t){r={error:t}}finally{try{l&&!l.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}},e.prototype.findMathNS=function(t,e){var r,n;try{for(var o=i(this.adaptor.tags(t,"math",T)),Q=o.next();!Q.done;Q=o.next()){var s=Q.value;e.add(s)}}catch(t){r={error:t}}finally{try{Q&&!Q.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},e.prototype.processMath=function(t){var e,r,n=[];try{for(var o=i(Array.from(t)),Q=o.next();!Q.done;Q=o.next()){var T=Q.value,s="block"===this.adaptor.getAttribute(T,"display")||"display"===this.adaptor.getAttribute(T,"mode"),a={node:T,n:0,delim:""},l={node:T,n:0,delim:""};n.push({math:this.adaptor.outerHTML(T),start:a,end:l,display:s})}}catch(t){e={error:t}}finally{try{Q&&!Q.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return n},e.OPTIONS={},e}(Q.AbstractFindMath);e.FindMathML=s},2769:function(t,e,r){var n=this&&this.__assign||function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MathMLCompile=void 0;var s=r(9007),a=r(7233),l=Q(r(5368)),c=function(){function t(t){void 0===t&&(t={});var e=this.constructor;this.options=(0,a.userOptions)((0,a.defaultOptions)({},e.OPTIONS),t)}return t.prototype.setMmlFactory=function(t){this.factory=t},t.prototype.compile=function(t){var e=this.makeNode(t);return e.verifyTree(this.options.verify),e.setInheritedAttributes({},!1,0,!1),e.walkTree(this.markMrows),e},t.prototype.makeNode=function(t){var e,r,n=this.adaptor,o=!1,i=n.kind(t).replace(/^.*:/,""),Q=n.getAttribute(t,"data-mjx-texclass")||"";Q&&(Q=this.filterAttribute("data-mjx-texclass",Q)||"");var a=Q&&"mrow"===i?"TeXAtom":i;try{for(var l=T(this.filterClassList(n.allClasses(t))),c=l.next();!c.done;c=l.next()){var u=c.value;u.match(/^MJX-TeXAtom-/)&&"mrow"===i?(Q=u.substr(12),a="TeXAtom"):"MJX-fixedlimits"===u&&(o=!0)}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(e)throw e.error}}this.factory.getNodeClass(a)||this.error('Unknown node type "'+a+'"');var p=this.factory.create(a);return"TeXAtom"!==a||"OP"!==Q||o||(p.setProperty("movesupsub",!0),p.attributes.setInherited("movablelimits",!0)),Q&&(p.texClass=s.TEXCLASS[Q],p.setProperty("texClass",p.texClass)),this.addAttributes(p,t),this.checkClass(p,t),this.addChildren(p,t),p},t.prototype.addAttributes=function(t,e){var r,n,o=!1;try{for(var i=T(this.adaptor.allAttributes(e)),Q=i.next();!Q.done;Q=i.next()){var s=Q.value,a=s.name,l=this.filterAttribute(a,s.value);if(null!==l&&"xmlns"!==a)if("data-mjx-"===a.substr(0,9))switch(a.substr(9)){case"alternate":t.setProperty("variantForm",!0);break;case"variant":t.attributes.set("mathvariant",l),o=!0;break;case"smallmatrix":t.setProperty("scriptlevel",1),t.setProperty("useHeight",!1);break;case"accent":t.setProperty("mathaccent","true"===l);break;case"auto-op":t.setProperty("autoOP","true"===l);break;case"script-align":t.setProperty("scriptalign",l)}else if("class"!==a){var c=l.toLowerCase();"true"===c||"false"===c?t.attributes.set(a,"true"===c):o&&"mathvariant"===a||t.attributes.set(a,l)}}}catch(t){r={error:t}}finally{try{Q&&!Q.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}},t.prototype.filterAttribute=function(t,e){return e},t.prototype.filterClassList=function(t){return t},t.prototype.addChildren=function(t,e){var r,n;if(0!==t.arity){var o=this.adaptor;try{for(var i=T(o.childNodes(e)),Q=i.next();!Q.done;Q=i.next()){var s=Q.value,a=o.kind(s);if("#comment"!==a)if("#text"===a)this.addText(t,s);else if(t.isKind("annotation-xml"))t.appendChild(this.factory.create("XML").setXML(s,o));else{var l=t.appendChild(this.makeNode(s));0===l.arity&&o.childNodes(s).length&&(this.options.fixMisplacedChildren?this.addChildren(t,s):l.mError("There should not be children for "+l.kind+" nodes",this.options.verify,!0))}}}catch(t){r={error:t}}finally{try{Q&&!Q.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}}},t.prototype.addText=function(t,e){var r=this.adaptor.value(e);(t.isToken||t.getProperty("isChars"))&&t.arity?(t.isToken&&(r=l.translate(r),r=this.trimSpace(r)),t.appendChild(this.factory.create("text").setText(r))):r.match(/\S/)&&this.error('Unexpected text node "'+r+'"')},t.prototype.checkClass=function(t,e){var r,n,o=[];try{for(var i=T(this.filterClassList(this.adaptor.allClasses(e))),Q=i.next();!Q.done;Q=i.next()){var s=Q.value;"MJX-"===s.substr(0,4)?"MJX-variant"===s?t.setProperty("variantForm",!0):"MJX-TeXAtom"!==s.substr(0,11)&&t.attributes.set("mathvariant",this.fixCalligraphic(s.substr(3))):o.push(s)}}catch(t){r={error:t}}finally{try{Q&&!Q.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}o.length&&t.attributes.set("class",o.join(" "))},t.prototype.fixCalligraphic=function(t){return t.replace(/caligraphic/,"calligraphic")},t.prototype.markMrows=function(t){if(t.isKind("mrow")&&!t.isInferred&&t.childNodes.length>=2){var e=t.childNodes[0],r=t.childNodes[t.childNodes.length-1];e.isKind("mo")&&e.attributes.get("fence")&&e.attributes.get("stretchy")&&r.isKind("mo")&&r.attributes.get("fence")&&r.attributes.get("stretchy")&&(e.childNodes.length&&t.setProperty("open",e.getText()),r.childNodes.length&&t.setProperty("close",r.getText()))}},t.prototype.trimSpace=function(t){return t.replace(/[\t\n\r]/g," ").replace(/^ +/,"").replace(/ +$/,"").replace(/ +/g," ")},t.prototype.error=function(t){throw new Error(t)},t.OPTIONS={MmlFactory:null,fixMisplacedChildren:!0,verify:n({},s.AbstractMmlNode.verifyDefaults),translateEntities:!0},t}();e.MathMLCompile=c},8462:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},T=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.TeX=void 0;var s=r(9206),a=r(7233),l=r(7073),c=T(r(4676)),u=T(r(1256)),p=T(r(8417)),h=T(r(3971)),d=T(r(8562)),f=r(6521),L=r(9899);r(2942);var m=function(t){function e(r){void 0===r&&(r={});var n=this,o=Q((0,a.separateOptions)(r,e.OPTIONS,l.FindTeX.OPTIONS),3),i=o[0],T=o[1],s=o[2];(n=t.call(this,T)||this).findTeX=n.options.FindTeX||new l.FindTeX(s);var u=n.options.packages,p=n.configuration=e.configure(u),h=n._parseOptions=new d.default(p,[n.options,f.TagsFactory.OPTIONS]);return(0,a.userOptions)(h.options,i),p.config(n),e.tags(h,p),n.postFilters.add(c.default.cleanSubSup,-6),n.postFilters.add(c.default.setInherited,-5),n.postFilters.add(c.default.moveLimits,-4),n.postFilters.add(c.default.cleanStretchy,-3),n.postFilters.add(c.default.cleanAttributes,-2),n.postFilters.add(c.default.combineRelations,-1),n}return o(e,t),e.configure=function(t){var e=new L.ParserConfiguration(t,["tex"]);return e.init(),e},e.tags=function(t,e){f.TagsFactory.addTags(e.tags),f.TagsFactory.setDefault(t.options.tags),t.tags=f.TagsFactory.getDefault(),t.tags.configuration=t},e.prototype.setMmlFactory=function(e){t.prototype.setMmlFactory.call(this,e),this._parseOptions.nodeFactory.setMmlFactory(e)},Object.defineProperty(e.prototype,"parseOptions",{get:function(){return this._parseOptions},enumerable:!1,configurable:!0}),e.prototype.reset=function(t){void 0===t&&(t=0),this.parseOptions.tags.reset(t)},e.prototype.compile=function(t,e){this.parseOptions.clear(),this.executeFilters(this.preFilters,t,e,this.parseOptions);var r,n,o=t.display;this.latex=t.math,this.parseOptions.tags.startEquation(t);try{var i=new p.default(this.latex,{display:o,isInner:!1},this.parseOptions);r=i.mml(),n=i.stack.global}catch(t){if(!(t instanceof h.default))throw t;this.parseOptions.error=!0,r=this.options.formatError(this,t)}return r=this.parseOptions.nodeFactory.create("node","math",[r]),(null==n?void 0:n.indentalign)&&u.default.setAttribute(r,"indentalign",n.indentalign),o&&u.default.setAttribute(r,"display","block"),this.parseOptions.tags.finishEquation(t),this.parseOptions.root=r,this.executeFilters(this.postFilters,t,e,this.parseOptions),this.mathNode=this.parseOptions.root,this.mathNode},e.prototype.findMath=function(t){return this.findTeX.findMath(t)},e.prototype.formatError=function(t){var e=t.message.replace(/\n.*/,"");return this.parseOptions.nodeFactory.create("error",e,t.id,this.latex)},e.NAME="TeX",e.OPTIONS=i(i({},s.AbstractInputJax.OPTIONS),{FindTeX:null,packages:["base"],digits:/^(?:[0-9]+(?:\{,\}[0-9]{3})*(?:\.[0-9]*)?|\.[0-9]+)/,maxBuffer:5120,formatError:function(t,e){return t.formatError(e)}}),e}(s.AbstractInputJax);e.TeX=m},9899:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.ParserConfiguration=e.ConfigurationHandler=e.Configuration=void 0;var i,Q=r(7233),T=r(2947),s=r(7525),a=r(8666),l=r(6521),c=function(){function t(t,e,r,n,o,i,Q,T,s,a,l,c,u){void 0===e&&(e={}),void 0===r&&(r={}),void 0===n&&(n={}),void 0===o&&(o={}),void 0===i&&(i={}),void 0===Q&&(Q={}),void 0===T&&(T=[]),void 0===s&&(s=[]),void 0===a&&(a=null),void 0===l&&(l=null),this.name=t,this.handler=e,this.fallback=r,this.items=n,this.tags=o,this.options=i,this.nodes=Q,this.preprocessors=T,this.postprocessors=s,this.initMethod=a,this.configMethod=l,this.priority=c,this.parser=u,this.handler=Object.assign({character:[],delimiter:[],macro:[],environment:[]},e)}return t.makeProcessor=function(t,e){return Array.isArray(t)?t:[t,e]},t._create=function(e,r){var n=this;void 0===r&&(r={});var o=r.priority||a.PrioritizedList.DEFAULTPRIORITY,i=r.init?this.makeProcessor(r.init,o):null,Q=r.config?this.makeProcessor(r.config,o):null,T=(r.preprocessors||[]).map((function(t){return n.makeProcessor(t,o)})),s=(r.postprocessors||[]).map((function(t){return n.makeProcessor(t,o)})),l=r.parser||"tex";return new t(e,r.handler||{},r.fallback||{},r.items||{},r.tags||{},r.options||{},r.nodes||{},T,s,i,Q,o,l)},t.create=function(e,r){void 0===r&&(r={});var n=t._create(e,r);return i.set(e,n),n},t.local=function(e){return void 0===e&&(e={}),t._create("",e)},Object.defineProperty(t.prototype,"init",{get:function(){return this.initMethod?this.initMethod[0]:null},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"config",{get:function(){return this.configMethod?this.configMethod[0]:null},enumerable:!1,configurable:!0}),t}();e.Configuration=c,function(t){var e=new Map;t.set=function(t,r){e.set(t,r)},t.get=function(t){return e.get(t)},t.keys=function(){return e.keys()}}(i=e.ConfigurationHandler||(e.ConfigurationHandler={}));var u=function(){function t(t,e){var r,o,i,Q;void 0===e&&(e=["tex"]),this.initMethod=new s.FunctionList,this.configMethod=new s.FunctionList,this.configurations=new a.PrioritizedList,this.parsers=[],this.handlers=new T.SubHandlers,this.items={},this.tags={},this.options={},this.nodes={},this.parsers=e;try{for(var l=n(t.slice().reverse()),c=l.next();!c.done;c=l.next()){var u=c.value;this.addPackage(u)}}catch(t){r={error:t}}finally{try{c&&!c.done&&(o=l.return)&&o.call(l)}finally{if(r)throw r.error}}try{for(var p=n(this.configurations),h=p.next();!h.done;h=p.next()){var d=h.value,f=d.item,L=d.priority;this.append(f,L)}}catch(t){i={error:t}}finally{try{h&&!h.done&&(Q=p.return)&&Q.call(p)}finally{if(i)throw i.error}}}return t.prototype.init=function(){this.initMethod.execute(this)},t.prototype.config=function(t){var e,r;this.configMethod.execute(this,t);try{for(var o=n(this.configurations),i=o.next();!i.done;i=o.next()){var Q=i.value;this.addFilters(t,Q.item)}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},t.prototype.addPackage=function(t){var e="string"==typeof t?t:t[0],r=this.getPackage(e);r&&this.configurations.add(r,"string"==typeof t?r.priority:t[1])},t.prototype.add=function(t,e,r){var o,i;void 0===r&&(r={});var T=this.getPackage(t);this.append(T),this.configurations.add(T,T.priority),this.init();var s=e.parseOptions;s.nodeFactory.setCreators(T.nodes);try{for(var a=n(Object.keys(T.items)),c=a.next();!c.done;c=a.next()){var u=c.value;s.itemFactory.setNodeClass(u,T.items[u])}}catch(t){o={error:t}}finally{try{c&&!c.done&&(i=a.return)&&i.call(a)}finally{if(o)throw o.error}}l.TagsFactory.addTags(T.tags),(0,Q.defaultOptions)(s.options,T.options),(0,Q.userOptions)(s.options,r),this.addFilters(e,T),T.config&&T.config(this,e)},t.prototype.getPackage=function(t){var e=i.get(t);if(e&&this.parsers.indexOf(e.parser)<0)throw Error("Package ".concat(t," doesn't target the proper parser"));return e},t.prototype.append=function(t,e){e=e||t.priority,t.initMethod&&this.initMethod.add(t.initMethod[0],t.initMethod[1]),t.configMethod&&this.configMethod.add(t.configMethod[0],t.configMethod[1]),this.handlers.add(t.handler,t.fallback,e),Object.assign(this.items,t.items),Object.assign(this.tags,t.tags),(0,Q.defaultOptions)(this.options,t.options),Object.assign(this.nodes,t.nodes)},t.prototype.addFilters=function(t,e){var r,i,Q,T;try{for(var s=n(e.preprocessors),a=s.next();!a.done;a=s.next()){var l=o(a.value,2),c=l[0],u=l[1];t.preFilters.add(c,u)}}catch(t){r={error:t}}finally{try{a&&!a.done&&(i=s.return)&&i.call(s)}finally{if(r)throw r.error}}try{for(var p=n(e.postprocessors),h=p.next();!h.done;h=p.next()){var d=o(h.value,2),f=d[0];u=d[1];t.postFilters.add(f,u)}}catch(t){Q={error:t}}finally{try{h&&!h.done&&(T=p.return)&&T.call(p)}finally{if(Q)throw Q.error}}},t}();e.ParserConfiguration=u},4676:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var i,Q=r(9007),T=o(r(1256));!function(t){t.cleanStretchy=function(t){var e,r,o=t.data;try{for(var i=n(o.getList("fixStretchy")),Q=i.next();!Q.done;Q=i.next()){var s=Q.value;if(T.default.getProperty(s,"fixStretchy")){var a=T.default.getForm(s);a&&a[3]&&a[3].stretchy&&T.default.setAttribute(s,"stretchy",!1);var l=s.parent;if(!(T.default.getTexClass(s)||a&&a[2])){var c=o.nodeFactory.create("node","TeXAtom",[s]);l.replaceChild(c,s),c.inheritAttributesFrom(s)}T.default.removeProperties(s,"fixStretchy")}}}catch(t){e={error:t}}finally{try{Q&&!Q.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},t.cleanAttributes=function(t){t.data.root.walkTree((function(t,e){var r,o,i=t.attributes;if(i){var Q=new Set((i.get("mjx-keep-attrs")||"").split(/ /));delete i.getAllAttributes()["mjx-keep-attrs"];try{for(var T=n(i.getExplicitNames()),s=T.next();!s.done;s=T.next()){var a=s.value;Q.has(a)||i.attributes[a]!==t.attributes.getInherited(a)||delete i.attributes[a]}}catch(t){r={error:t}}finally{try{s&&!s.done&&(o=T.return)&&o.call(T)}finally{if(r)throw r.error}}}}),{})},t.combineRelations=function(t){var o,i,s,a,l=[];try{for(var c=n(t.data.getList("mo")),u=c.next();!u.done;u=c.next()){var p=u.value;if(!p.getProperty("relationsCombined")&&p.parent&&(!p.parent||T.default.isType(p.parent,"mrow"))&&T.default.getTexClass(p)===Q.TEXCLASS.REL){for(var h=p.parent,d=void 0,f=h.childNodes,L=f.indexOf(p)+1,m=T.default.getProperty(p,"variantForm");L0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.FindTeX=void 0;var Q=r(3494),T=r(505),s=r(4474),a=function(t){function e(e){var r=t.call(this,e)||this;return r.getPatterns(),r}return o(e,t),e.prototype.getPatterns=function(){var t=this,e=this.options,r=[],n=[],o=[];this.end={},this.env=this.sub=0;var i=1;e.inlineMath.forEach((function(e){return t.addPattern(r,e,!1)})),e.displayMath.forEach((function(e){return t.addPattern(r,e,!0)})),r.length&&n.push(r.sort(T.sortLength).join("|")),e.processEnvironments&&(n.push("\\\\begin\\s*\\{([^}]*)\\}"),this.env=i,i++),e.processEscapes&&o.push("\\\\([\\\\$])"),e.processRefs&&o.push("(\\\\(?:eq)?ref\\s*\\{[^}]*\\})"),o.length&&(n.push("("+o.join("|")+")"),this.sub=i),this.start=new RegExp(n.join("|"),"g"),this.hasPatterns=n.length>0},e.prototype.addPattern=function(t,e,r){var n=i(e,2),o=n[0],Q=n[1];t.push((0,T.quotePattern)(o)),this.end[o]=[Q,r,this.endPattern(Q)]},e.prototype.endPattern=function(t,e){return new RegExp((e||(0,T.quotePattern)(t))+"|\\\\(?:[a-zA-Z]|.)|[{}]","g")},e.prototype.findEnd=function(t,e,r,n){for(var o,Q=i(n,3),T=Q[0],a=Q[1],l=Q[2],c=l.lastIndex=r.index+r[0].length,u=0;o=l.exec(t);){if((o[1]||o[0])===T&&0===u)return(0,s.protoItem)(r[0],t.substr(c,o.index-c),o[0],e,r.index,o.index+o[0].length,a);"{"===o[0]?u++:"}"===o[0]&&u&&u--}return null},e.prototype.findMathInString=function(t,e,r){var n,o;for(this.start.lastIndex=0;n=this.start.exec(r);){if(void 0!==n[this.env]&&this.env){var i="\\\\end\\s*(\\{"+(0,T.quotePattern)(n[this.env])+"\\})";(o=this.findEnd(r,e,n,["{"+n[this.env]+"}",!0,this.endPattern(null,i)]))&&(o.math=o.open+o.math+o.close,o.open=o.close="")}else if(void 0!==n[this.sub]&&this.sub){var Q=n[this.sub];i=n.index+n[this.sub].length;o=2===Q.length?(0,s.protoItem)("",Q.substr(1),"",e,n.index,i):(0,s.protoItem)("",Q,"",e,n.index,i,!1)}else o=this.findEnd(r,e,n,this.end[n[0]]);o&&(t.push(o),this.start.lastIndex=o.end.n)}},e.prototype.findMath=function(t){var e=[];if(this.hasPatterns)for(var r=0,n=t.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SubHandlers=e.SubHandler=e.MapHandler=void 0;var i,Q=r(8666),T=r(7525);!function(t){var e=new Map;t.register=function(t){e.set(t.name,t)},t.getMap=function(t){return e.get(t)}}(i=e.MapHandler||(e.MapHandler={}));var s=function(){function t(){this._configuration=new Q.PrioritizedList,this._fallback=new T.FunctionList}return t.prototype.add=function(t,e,r){var o,T;void 0===r&&(r=Q.PrioritizedList.DEFAULTPRIORITY);try{for(var s=n(t.slice().reverse()),a=s.next();!a.done;a=s.next()){var l=a.value,c=i.getMap(l);if(!c)return void this.warn("Configuration "+l+" not found! Omitted.");this._configuration.add(c,r)}}catch(t){o={error:t}}finally{try{a&&!a.done&&(T=s.return)&&T.call(s)}finally{if(o)throw o.error}}e&&this._fallback.add(e,r)},t.prototype.parse=function(t){var e,r;try{for(var i=n(this._configuration),Q=i.next();!Q.done;Q=i.next()){var T=Q.value.item.parse(t);if(T)return T}}catch(t){e={error:t}}finally{try{Q&&!Q.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}var s=o(t,2),a=s[0],l=s[1];Array.from(this._fallback)[0].item(a,l)},t.prototype.lookup=function(t){var e=this.applicable(t);return e?e.lookup(t):null},t.prototype.contains=function(t){return!!this.applicable(t)},t.prototype.toString=function(){var t,e,r=[];try{for(var o=n(this._configuration),i=o.next();!i.done;i=o.next()){var Q=i.value.item;r.push(Q.name)}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return r.join(", ")},t.prototype.applicable=function(t){var e,r;try{for(var o=n(this._configuration),i=o.next();!i.done;i=o.next()){var Q=i.value.item;if(Q.contains(t))return Q}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},t.prototype.retrieve=function(t){var e,r;try{for(var o=n(this._configuration),i=o.next();!i.done;i=o.next()){var Q=i.value.item;if(Q.name===t)return Q}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},t.prototype.warn=function(t){console.log("TexParser Warning: "+t)},t}();e.SubHandler=s;var a=function(){function t(){this.map=new Map}return t.prototype.add=function(t,e,r){var o,i;void 0===r&&(r=Q.PrioritizedList.DEFAULTPRIORITY);try{for(var T=n(Object.keys(t)),a=T.next();!a.done;a=T.next()){var l=a.value,c=this.get(l);c||(c=new s,this.set(l,c)),c.add(t[l],e[l],r)}}catch(t){o={error:t}}finally{try{a&&!a.done&&(i=T.return)&&i.call(T)}finally{if(o)throw o.error}}},t.prototype.set=function(t,e){this.map.set(t,e)},t.prototype.get=function(t){return this.map.get(t)},t.prototype.retrieve=function(t){var e,r;try{for(var o=n(this.map.values()),i=o.next();!i.done;i=o.next()){var Q=i.value.retrieve(t);if(Q)return Q}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},t.prototype.keys=function(){return this.map.keys()},t}();e.SubHandlers=a},8929:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o1&&(r.autoOP=!1));var o=t.create("token","mi",r,e);t.Push(o)},t.digit=function(t,e){var r,n=t.configuration.options.digits,o=t.string.slice(t.i-1).match(n),i=a.default.getFontDef(t);o?(r=t.create("token","mn",i,o[0].replace(/[{}]/g,"")),t.i+=o[0].length-1):r=t.create("token","mo",i,e),t.Push(r)},t.controlSequence=function(t,e){var r=t.GetCS();t.parse("macro",[t,r])},t.mathchar0mi=function(t,e){var r=e.attributes||{mathvariant:s.TexConstant.Variant.ITALIC},n=t.create("token","mi",r,e.char);t.Push(n)},t.mathchar0mo=function(t,e){var r=e.attributes||{};r.stretchy=!1;var n=t.create("token","mo",r,e.char);T.default.setProperty(n,"fixStretchy",!0),t.configuration.addNode("fixStretchy",n),t.Push(n)},t.mathchar7=function(t,e){var r=e.attributes||{mathvariant:s.TexConstant.Variant.NORMAL};t.stack.env.font&&(r.mathvariant=t.stack.env.font);var n=t.create("token","mi",r,e.char);t.Push(n)},t.delimiter=function(t,e){var r=e.attributes||{};r=Object.assign({fence:!1,stretchy:!1},r);var n=t.create("token","mo",r,e.char);t.Push(n)},t.environment=function(t,e,r,i){var Q=i[0],T=t.itemFactory.create("begin").setProperties({name:e,end:Q});T=r.apply(void 0,o([t,T],n(i.slice(1)),!1)),t.Push(T)}}(Q||(Q={})),e.default=Q},8562:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},Q=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var T=Q(r(5453)),s=r(8929),a=Q(r(1256)),l=r(7233),c=function(){function t(t,e){void 0===e&&(e=[]),this.options={},this.packageData=new Map,this.parsers=[],this.root=null,this.nodeLists={},this.error=!1,this.handlers=t.handlers,this.nodeFactory=new s.NodeFactory,this.nodeFactory.configuration=this,this.nodeFactory.setCreators(t.nodes),this.itemFactory=new T.default(t.items),this.itemFactory.configuration=this,l.defaultOptions.apply(void 0,o([this.options],n(e),!1)),(0,l.defaultOptions)(this.options,t.options)}return t.prototype.pushParser=function(t){this.parsers.unshift(t)},t.prototype.popParser=function(){this.parsers.shift()},Object.defineProperty(t.prototype,"parser",{get:function(){return this.parsers[0]},enumerable:!1,configurable:!0}),t.prototype.clear=function(){this.parsers=[],this.root=null,this.nodeLists={},this.error=!1,this.tags.resetTag()},t.prototype.addNode=function(t,e){var r=this.nodeLists[t];if(r||(r=this.nodeLists[t]=[]),r.push(e),e.kind!==t){var n=a.default.getProperty(e,"in-lists")||"",o=(n?n.split(/,/):[]).concat(t).join(",");a.default.setProperty(e,"in-lists",o)}},t.prototype.getList=function(t){var e,r,n=this.nodeLists[t]||[],o=[];try{for(var Q=i(n),T=Q.next();!T.done;T=Q.next()){var s=T.value;this.inTree(s)&&o.push(s)}}catch(t){e={error:t}}finally{try{T&&!T.done&&(r=Q.return)&&r.call(Q)}finally{if(e)throw e.error}}return this.nodeLists[t]=o,o},t.prototype.removeFromList=function(t,e){var r,n,o=this.nodeLists[t]||[];try{for(var Q=i(e),T=Q.next();!T.done;T=Q.next()){var s=T.value,a=o.indexOf(s);a>=0&&o.splice(a,1)}}catch(t){r={error:t}}finally{try{T&&!T.done&&(n=Q.return)&&n.call(Q)}finally{if(r)throw r.error}}},t.prototype.inTree=function(t){for(;t&&t!==this.root;)t=t.parent;return!!t},t}();e.default=c},1130:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var Q,T=r(9007),s=i(r(1256)),a=i(r(8417)),l=i(r(3971)),c=r(5368);!function(t){var e=7.2,r={em:function(t){return t},ex:function(t){return.43*t},pt:function(t){return t/10},pc:function(t){return 1.2*t},px:function(t){return t*e/72},in:function(t){return t*e},cm:function(t){return t*e/2.54},mm:function(t){return t*e/25.4},mu:function(t){return t/18}},i="([-+]?([.,]\\d+|\\d+([.,]\\d*)?))",Q="(pt|em|ex|mu|px|mm|cm|in|pc)",u=RegExp("^\\s*"+i+"\\s*"+Q+"\\s*$"),p=RegExp("^\\s*"+i+"\\s*"+Q+" ?");function h(t,e){void 0===e&&(e=!1);var o=t.match(e?p:u);return o?function(t){var e=n(t,3),o=e[0],i=e[1],Q=e[2];if("mu"!==i)return[o,i,Q];return[d(r[i](parseFloat(o||"1"))).slice(0,-2),"em",Q]}([o[1].replace(/,/,"."),o[4],o[0].length]):[null,null,0]}function d(t){return Math.abs(t)<6e-4?"0em":t.toFixed(3).replace(/\.?0+$/,"")+"em"}function f(t,e,r){"{"!==e&&"}"!==e||(e="\\"+e);var n="{\\bigg"+r+" "+e+"}",o="{\\big"+r+" "+e+"}";return new a.default("\\mathchoice"+n+o+o+o,{},t).mml()}function L(t,e,r){e=e.replace(/^\s+/,c.entities.nbsp).replace(/\s+$/,c.entities.nbsp);var n=t.create("text",e);return t.create("node","mtext",[],r,n)}function m(t,e,r){if(r.match(/^[a-z]/i)&&e.match(/(^|[^\\])(\\\\)*\\[a-z]+$/i)&&(e+=" "),e.length+r.length>t.configuration.options.maxBuffer)throw new l.default("MaxBufferSize","MathJax internal buffer size exceeded; is there a recursive macro call?");return e+r}function y(t,e){for(;e>0;)t=t.trim().slice(1,-1),e--;return t.trim()}function g(t,e){for(var r=t.length,n=0,o="",i=0,Q=0,T=!0,s=!1;in&&(Q=n)),n++;break;case"}":n&&n--,(T||s)&&(Q--,s=!0),T=!1;break;default:if(!n&&-1!==e.indexOf(a))return[s?"true":y(o,Q),a,t.slice(i)];T=!1,s=!1}o+=a}if(n)throw new l.default("ExtraOpenMissingClose","Extra open brace or missing close brace");return[s?"true":y(o,Q),"",t.slice(i)]}t.matchDimen=h,t.dimen2em=function(t){var e=n(h(t),2),o=e[0],i=e[1],Q=parseFloat(o||"1"),T=r[i];return T?T(Q):0},t.Em=d,t.cols=function(){for(var t=[],e=0;e1&&(s=[t.create("node","mrow",s)]),s},t.internalText=L,t.underOver=function(e,r,n,o,i){if(t.checkMovableLimits(r),s.default.isType(r,"munderover")&&s.default.isEmbellished(r)){s.default.setProperties(s.default.getCoreMO(r),{lspace:0,rspace:0});var Q=e.create("node","mo",[],{rspace:0});r=e.create("node","mrow",[Q,r])}var a=e.create("node","munderover",[r]);s.default.setChild(a,"over"===o?a.over:a.under,n);var l=a;return i&&(l=e.create("node","TeXAtom",[a],{texClass:T.TEXCLASS.OP,movesupsub:!0})),s.default.setProperty(l,"subsupOK",!0),l},t.checkMovableLimits=function(t){var e=s.default.isType(t,"mo")?s.default.getForm(t):null;(s.default.getProperty(t,"movablelimits")||e&&e[3]&&e[3].movablelimits)&&s.default.setProperties(t,{movablelimits:!1})},t.trimSpaces=function(t){if("string"!=typeof t)return t;var e=t.trim();return e.match(/\\$/)&&t.match(/ $/)&&(e+=" "),e},t.setArrayAlign=function(e,r){return"t"===(r=t.trimSpaces(r||""))?e.arraydef.align="baseline 1":"b"===r?e.arraydef.align="baseline -1":"c"===r?e.arraydef.align="axis":r&&(e.arraydef.align=r),e},t.substituteArgs=function(t,e,r){for(var n="",o="",i=0;ie.length)throw new l.default("IllegalMacroParam","Illegal macro parameter reference");o=m(t,m(t,o,n),e[parseInt(Q,10)-1]),n=""}else n+=Q}return m(t,o,n)},t.addArgs=m,t.checkMaxMacros=function(t,e){if(void 0===e&&(e=!0),!(++t.macroCount<=t.configuration.options.maxMacros))throw e?new l.default("MaxMacroSub1","MathJax maximum macro substitution count exceeded; is here a recursive macro call?"):new l.default("MaxMacroSub2","MathJax maximum substitution count exceeded; is there a recursive latex environment?")},t.checkEqnEnv=function(t){if(t.stack.global.eqnenv)throw new l.default("ErroneousNestingEq","Erroneous nesting of equation structures");t.stack.global.eqnenv=!0},t.copyNode=function(t,e){var r=t.copy(),n=e.configuration;return r.walkTree((function(t){var e,r;n.addNode(t.kind,t);var i=(t.getProperty("in-lists")||"").split(/,/);try{for(var Q=o(i),T=Q.next();!T.done;T=Q.next()){var s=T.value;s&&n.addNode(s,t)}}catch(t){e={error:t}}finally{try{T&&!T.done&&(r=Q.return)&&r.call(Q)}finally{if(e)throw e.error}}})),r},t.MmlFilterAttribute=function(t,e,r){return r},t.getFontDef=function(t){var e=t.stack.env.font;return e?{mathvariant:e}:{}},t.keyvalOptions=function(t,e,r){var i,Q;void 0===e&&(e=null),void 0===r&&(r=!1);var T=function(t){var e,r,o,i,Q,T={},s=t;for(;s;)i=(e=n(g(s,["=",","]),3))[0],o=e[1],s=e[2],"="===o?(Q=(r=n(g(s,[","]),3))[0],o=r[1],s=r[2],Q="false"===Q||"true"===Q?JSON.parse(Q):Q,T[i]=Q):i&&(T[i]=!0);return T}(t);if(e)try{for(var s=o(Object.keys(T)),a=s.next();!a.done;a=s.next()){var c=a.value;if(!e.hasOwnProperty(c)){if(r)throw new l.default("InvalidOption","Invalid option: %1",c);delete T[c]}}}catch(t){i={error:t}}finally{try{a&&!a.done&&(Q=s.return)&&Q.call(s)}finally{if(i)throw i.error}}return T}}(Q||(Q={})),e.default=Q},9497:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.BaseItem=e.MmlStack=void 0;var a=s(r(3971)),l=function(){function t(t){this._nodes=t}return Object.defineProperty(t.prototype,"nodes",{get:function(){return this._nodes},enumerable:!1,configurable:!0}),t.prototype.Push=function(){for(var t,e=[],r=0;r0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},T=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},Q=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.TagsFactory=e.AllTags=e.NoTags=e.AbstractTags=e.TagInfo=e.Label=void 0;var T=Q(r(8417)),s=function(t,e){void 0===t&&(t="???"),void 0===e&&(e=""),this.tag=t,this.id=e};e.Label=s;var a=function(t,e,r,n,o,i,Q,T){void 0===t&&(t=""),void 0===e&&(e=!1),void 0===r&&(r=!1),void 0===n&&(n=null),void 0===o&&(o=""),void 0===i&&(i=""),void 0===Q&&(Q=!1),void 0===T&&(T=""),this.env=t,this.taggable=e,this.defaultTags=r,this.tag=n,this.tagId=o,this.tagFormat=i,this.noTag=Q,this.labelId=T};e.TagInfo=a;var l=function(){function t(){this.counter=0,this.allCounter=0,this.configuration=null,this.ids={},this.allIds={},this.labels={},this.allLabels={},this.redo=!1,this.refUpdate=!1,this.currentTag=new a,this.history=[],this.stack=[],this.enTag=function(t,e){var r=this.configuration.nodeFactory,n=r.create("node","mtd",[t]),o=r.create("node","mlabeledtr",[e,n]);return r.create("node","mtable",[o],{side:this.configuration.options.tagSide,minlabelspacing:this.configuration.options.tagIndent,displaystyle:!0})}}return t.prototype.start=function(t,e,r){this.currentTag&&this.stack.push(this.currentTag),this.currentTag=new a(t,e,r)},Object.defineProperty(t.prototype,"env",{get:function(){return this.currentTag.env},enumerable:!1,configurable:!0}),t.prototype.end=function(){this.history.push(this.currentTag),this.currentTag=this.stack.pop()},t.prototype.tag=function(t,e){this.currentTag.tag=t,this.currentTag.tagFormat=e?t:this.formatTag(t),this.currentTag.noTag=!1},t.prototype.notag=function(){this.tag("",!0),this.currentTag.noTag=!0},Object.defineProperty(t.prototype,"noTag",{get:function(){return this.currentTag.noTag},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"label",{get:function(){return this.currentTag.labelId},set:function(t){this.currentTag.labelId=t},enumerable:!1,configurable:!0}),t.prototype.formatUrl=function(t,e){return e+"#"+encodeURIComponent(t)},t.prototype.formatTag=function(t){return"("+t+")"},t.prototype.formatId=function(t){return"mjx-eqn:"+t.replace(/\s/g,"_")},t.prototype.formatNumber=function(t){return t.toString()},t.prototype.autoTag=function(){null==this.currentTag.tag&&(this.counter++,this.tag(this.formatNumber(this.counter),!1))},t.prototype.clearTag=function(){this.label="",this.tag(null,!0),this.currentTag.tagId=""},t.prototype.getTag=function(t){if(void 0===t&&(t=!1),t)return this.autoTag(),this.makeTag();var e=this.currentTag;return e.taggable&&!e.noTag&&(e.defaultTags&&this.autoTag(),e.tag)?this.makeTag():null},t.prototype.resetTag=function(){this.history=[],this.redo=!1,this.refUpdate=!1,this.clearTag()},t.prototype.reset=function(t){void 0===t&&(t=0),this.resetTag(),this.counter=this.allCounter=t,this.allLabels={},this.allIds={}},t.prototype.startEquation=function(t){this.history=[],this.stack=[],this.clearTag(),this.currentTag=new a("",void 0,void 0),this.labels={},this.ids={},this.counter=this.allCounter,this.redo=!1;var e=t.inputData.recompile;e&&(this.refUpdate=!0,this.counter=e.counter)},t.prototype.finishEquation=function(t){this.redo&&(t.inputData.recompile={state:t.state(),counter:this.allCounter}),this.refUpdate||(this.allCounter=this.counter),Object.assign(this.allIds,this.ids),Object.assign(this.allLabels,this.labels)},t.prototype.finalize=function(t,e){if(!e.display||this.currentTag.env||null==this.currentTag.tag)return t;var r=this.makeTag();return this.enTag(t,r)},t.prototype.makeId=function(){this.currentTag.tagId=this.formatId(this.configuration.options.useLabelIds&&this.label||this.currentTag.tag)},t.prototype.makeTag=function(){this.makeId(),this.label&&(this.labels[this.label]=new s(this.currentTag.tag,this.currentTag.tagId));var t=new T.default("\\text{"+this.currentTag.tagFormat+"}",{},this.configuration).mml();return this.configuration.nodeFactory.create("node","mtd",[t],{id:this.currentTag.tagId})},t}();e.AbstractTags=l;var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.autoTag=function(){},e.prototype.getTag=function(){return this.currentTag.tag?t.prototype.getTag.call(this):null},e}(l);e.NoTags=c;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.finalize=function(t,e){if(!e.display||this.history.find((function(t){return t.taggable})))return t;var r=this.getTag(!0);return this.enTag(t,r)},e}(l);e.AllTags=u,function(t){var e=new Map([["none",c],["all",u]]),r="none";t.OPTIONS={tags:r,tagSide:"right",tagIndent:"0.8em",useLabelIds:!0,ignoreDuplicateLabels:!1},t.add=function(t,r){e.set(t,r)},t.addTags=function(e){var r,n;try{for(var o=i(Object.keys(e)),Q=o.next();!Q.done;Q=o.next()){var T=Q.value;t.add(T,e[T])}}catch(t){r={error:t}}finally{try{Q&&!Q.done&&(n=o.return)&&n.call(o)}finally{if(r)throw r.error}}},t.create=function(t){var n=e.get(t)||e.get(r);if(!n)throw Error("Unknown tags class");return new n},t.setDefault=function(t){r=t},t.getDefault=function(){return t.create(r)}}(e.TagsFactory||(e.TagsFactory={}))},8317:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.TexConstant=void 0,function(t){t.Variant={NORMAL:"normal",BOLD:"bold",ITALIC:"italic",BOLDITALIC:"bold-italic",DOUBLESTRUCK:"double-struck",FRAKTUR:"fraktur",BOLDFRAKTUR:"bold-fraktur",SCRIPT:"script",BOLDSCRIPT:"bold-script",SANSSERIF:"sans-serif",BOLDSANSSERIF:"bold-sans-serif",SANSSERIFITALIC:"sans-serif-italic",SANSSERIFBOLDITALIC:"sans-serif-bold-italic",MONOSPACE:"monospace",INITIAL:"inital",TAILED:"tailed",LOOPED:"looped",STRETCHED:"stretched",CALLIGRAPHIC:"-tex-calligraphic",BOLDCALLIGRAPHIC:"-tex-bold-calligraphic",OLDSTYLE:"-tex-oldstyle",BOLDOLDSTYLE:"-tex-bold-oldstyle",MATHITALIC:"-tex-mathit"},t.Form={PREFIX:"prefix",INFIX:"infix",POSTFIX:"postfix"},t.LineBreak={AUTO:"auto",NEWLINE:"newline",NOBREAK:"nobreak",GOODBREAK:"goodbreak",BADBREAK:"badbreak"},t.LineBreakStyle={BEFORE:"before",AFTER:"after",DUPLICATE:"duplicate",INFIXLINBREAKSTYLE:"infixlinebreakstyle"},t.IndentAlign={LEFT:"left",CENTER:"center",RIGHT:"right",AUTO:"auto",ID:"id",INDENTALIGN:"indentalign"},t.IndentShift={INDENTSHIFT:"indentshift"},t.LineThickness={THIN:"thin",MEDIUM:"medium",THICK:"thick"},t.Notation={LONGDIV:"longdiv",ACTUARIAL:"actuarial",PHASORANGLE:"phasorangle",RADICAL:"radical",BOX:"box",ROUNDEDBOX:"roundedbox",CIRCLE:"circle",LEFT:"left",RIGHT:"right",TOP:"top",BOTTOM:"bottom",UPDIAGONALSTRIKE:"updiagonalstrike",DOWNDIAGONALSTRIKE:"downdiagonalstrike",VERTICALSTRIKE:"verticalstrike",HORIZONTALSTRIKE:"horizontalstrike",NORTHEASTARROW:"northeastarrow",MADRUWB:"madruwb",UPDIAGONALARROW:"updiagonalarrow"},t.Align={TOP:"top",BOTTOM:"bottom",CENTER:"center",BASELINE:"baseline",AXIS:"axis",LEFT:"left",RIGHT:"right"},t.Lines={NONE:"none",SOLID:"solid",DASHED:"dashed"},t.Side={LEFT:"left",RIGHT:"right",LEFTOVERLAP:"leftoverlap",RIGHTOVERLAP:"rightoverlap"},t.Width={AUTO:"auto",FIT:"fit"},t.Actiontype={TOGGLE:"toggle",STATUSLINE:"statusline",TOOLTIP:"tooltip",INPUT:"input"},t.Overflow={LINBREAK:"linebreak",SCROLL:"scroll",ELIDE:"elide",TRUNCATE:"truncate",SCALE:"scale"},t.Unit={EM:"em",EX:"ex",PX:"px",IN:"in",CM:"cm",MM:"mm",PT:"pt",PC:"pc"}}(e.TexConstant||(e.TexConstant={}))},3971:function(t,e){Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(e,r){for(var n=[],o=2;o="0"&&Q<="9")n[o]=r[parseInt(n[o],10)-1],"number"==typeof n[o]&&(n[o]=n[o].toString());else if("{"===Q){if((Q=n[o].substr(1))>="0"&&Q<="9")n[o]=r[parseInt(n[o].substr(1,n[o].length-2),10)-1],"number"==typeof n[o]&&(n[o]=n[o].toString());else n[o].match(/^\{([a-z]+):%(\d+)\|(.*)\}$/)&&(n[o]="%"+n[o])}null==n[o]&&(n[o]="???")}return n.join("")},t.pattern=/%(\d+|\{\d+\}|\{[a-z]+:\%\d+(?:\|(?:%\{\d+\}|%.|[^\}])*)+\}|.)/g,t}();e.default=r},8417:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;oe)throw new l.default("XalignOverflow","Extra %1 in row of %2","&",this.name)},e.prototype.EndRow=function(){for(var e,r=this.row,n=this.getProperty("xalignat");r.lengththis.maxrow&&(this.maxrow=this.row.length),t.prototype.EndRow.call(this);var o=this.table[this.table.length-1];if(this.getProperty("zeroWidthLabel")&&o.isKind("mlabeledtr")){var Q=a.default.getChildren(o)[0],T=this.factory.configuration.options.tagSide,s=i({width:0},"right"===T?{lspace:"-1width"}:{}),l=this.create("node","mpadded",a.default.getChildren(Q),s);Q.setChildren([l])}},e.prototype.EndTable=function(){(t.prototype.EndTable.call(this),this.center)&&(this.maxrow<=2&&(delete this.arraydef.width,delete this.global.indentalign))},e}(T.EqnArrayItem);e.FlalignItem=p},7379:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return o(e,t),e},Q=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var T=r(4387),s=i(r(9140)),a=r(8317),l=Q(r(5450)),c=Q(r(1130)),u=r(9007),p=r(6010);new s.CharacterMap("AMSmath-mathchar0mo",l.default.mathchar0mo,{iiiint:["\u2a0c",{texClass:u.TEXCLASS.OP}]}),new s.RegExpMap("AMSmath-operatorLetter",T.AmsMethods.operatorLetter,/[-*]/i),new s.CommandMap("AMSmath-macros",{mathring:["Accent","02DA"],nobreakspace:"Tilde",negmedspace:["Spacer",p.MATHSPACE.negativemediummathspace],negthickspace:["Spacer",p.MATHSPACE.negativethickmathspace],idotsint:["MultiIntegral","\\int\\cdots\\int"],dddot:["Accent","20DB"],ddddot:["Accent","20DC"],sideset:"SideSet",boxed:["Macro","\\fbox{$\\displaystyle{#1}$}",1],tag:"HandleTag",notag:"HandleNoTag",eqref:["HandleRef",!0],substack:["Macro","\\begin{subarray}{c}#1\\end{subarray}",1],injlim:["NamedOp","inj lim"],projlim:["NamedOp","proj lim"],varliminf:["Macro","\\mathop{\\underline{\\mmlToken{mi}{lim}}}"],varlimsup:["Macro","\\mathop{\\overline{\\mmlToken{mi}{lim}}}"],varinjlim:["Macro","\\mathop{\\underrightarrow{\\mmlToken{mi}{lim}}}"],varprojlim:["Macro","\\mathop{\\underleftarrow{\\mmlToken{mi}{lim}}}"],DeclareMathOperator:"HandleDeclareOp",operatorname:"HandleOperatorName",genfrac:"Genfrac",frac:["Genfrac","","","",""],tfrac:["Genfrac","","","","1"],dfrac:["Genfrac","","","","0"],binom:["Genfrac","(",")","0",""],tbinom:["Genfrac","(",")","0","1"],dbinom:["Genfrac","(",")","0","0"],cfrac:"CFrac",shoveleft:["HandleShove",a.TexConstant.Align.LEFT],shoveright:["HandleShove",a.TexConstant.Align.RIGHT],xrightarrow:["xArrow",8594,5,10],xleftarrow:["xArrow",8592,10,5]},T.AmsMethods),new s.EnvironmentMap("AMSmath-environment",l.default.environment,{"equation*":["Equation",null,!1],"eqnarray*":["EqnArray",null,!1,!0,"rcl",c.default.cols(0,p.MATHSPACE.thickmathspace),".5em"],align:["EqnArray",null,!0,!0,"rl",c.default.cols(0,2)],"align*":["EqnArray",null,!1,!0,"rl",c.default.cols(0,2)],multline:["Multline",null,!0],"multline*":["Multline",null,!1],split:["EqnArray",null,!1,!1,"rl",c.default.cols(0)],gather:["EqnArray",null,!0,!0,"c"],"gather*":["EqnArray",null,!1,!0,"c"],alignat:["AlignAt",null,!0,!0],"alignat*":["AlignAt",null,!1,!0],alignedat:["AlignAt",null,!1,!1],aligned:["AmsEqnArray",null,null,null,"rl",c.default.cols(0,2),".5em","D"],gathered:["AmsEqnArray",null,null,null,"c",null,".5em","D"],xalignat:["XalignAt",null,!0,!0],"xalignat*":["XalignAt",null,!1,!0],xxalignat:["XalignAt",null,!1,!1],flalign:["FlalignArray",null,!0,!1,!0,"rlc","auto auto fit"],"flalign*":["FlalignArray",null,!1,!1,!0,"rlc","auto auto fit"],subarray:["Array",null,null,null,null,c.default.cols(0),"0.1em","S",1],smallmatrix:["Array",null,null,null,"c",c.default.cols(1/3),".2em","S",1],matrix:["Array",null,null,null,"c"],pmatrix:["Array",null,"(",")","c"],bmatrix:["Array",null,"[","]","c"],Bmatrix:["Array",null,"\\{","\\}","c"],vmatrix:["Array",null,"\\vert","\\vert","c"],Vmatrix:["Array",null,"\\Vert","\\Vert","c"],cases:["Array",null,"\\{",".","ll",null,".2em","T"]},T.AmsMethods),new s.DelimiterMap("AMSmath-delimiter",l.default.delimiter,{"\\lvert":["|",{texClass:u.TEXCLASS.OPEN}],"\\rvert":["|",{texClass:u.TEXCLASS.CLOSE}],"\\lVert":["\u2016",{texClass:u.TEXCLASS.OPEN}],"\\rVert":["\u2016",{texClass:u.TEXCLASS.CLOSE}]}),new s.CharacterMap("AMSsymbols-mathchar0mi",l.default.mathchar0mi,{digamma:"\u03dd",varkappa:"\u03f0",varGamma:["\u0393",{mathvariant:a.TexConstant.Variant.ITALIC}],varDelta:["\u0394",{mathvariant:a.TexConstant.Variant.ITALIC}],varTheta:["\u0398",{mathvariant:a.TexConstant.Variant.ITALIC}],varLambda:["\u039b",{mathvariant:a.TexConstant.Variant.ITALIC}],varXi:["\u039e",{mathvariant:a.TexConstant.Variant.ITALIC}],varPi:["\u03a0",{mathvariant:a.TexConstant.Variant.ITALIC}],varSigma:["\u03a3",{mathvariant:a.TexConstant.Variant.ITALIC}],varUpsilon:["\u03a5",{mathvariant:a.TexConstant.Variant.ITALIC}],varPhi:["\u03a6",{mathvariant:a.TexConstant.Variant.ITALIC}],varPsi:["\u03a8",{mathvariant:a.TexConstant.Variant.ITALIC}],varOmega:["\u03a9",{mathvariant:a.TexConstant.Variant.ITALIC}],beth:"\u2136",gimel:"\u2137",daleth:"\u2138",backprime:["\u2035",{variantForm:!0}],hslash:"\u210f",varnothing:["\u2205",{variantForm:!0}],blacktriangle:"\u25b4",triangledown:["\u25bd",{variantForm:!0}],blacktriangledown:"\u25be",square:"\u25fb",Box:"\u25fb",blacksquare:"\u25fc",lozenge:"\u25ca",Diamond:"\u25ca",blacklozenge:"\u29eb",circledS:["\u24c8",{mathvariant:a.TexConstant.Variant.NORMAL}],bigstar:"\u2605",sphericalangle:"\u2222",measuredangle:"\u2221",nexists:"\u2204",complement:"\u2201",mho:"\u2127",eth:["\xf0",{mathvariant:a.TexConstant.Variant.NORMAL}],Finv:"\u2132",diagup:"\u2571",Game:"\u2141",diagdown:"\u2572",Bbbk:["k",{mathvariant:a.TexConstant.Variant.DOUBLESTRUCK}],yen:"\xa5",circledR:"\xae",checkmark:"\u2713",maltese:"\u2720"}),new s.CharacterMap("AMSsymbols-mathchar0mo",l.default.mathchar0mo,{dotplus:"\u2214",ltimes:"\u22c9",smallsetminus:["\u2216",{variantForm:!0}],rtimes:"\u22ca",Cap:"\u22d2",doublecap:"\u22d2",leftthreetimes:"\u22cb",Cup:"\u22d3",doublecup:"\u22d3",rightthreetimes:"\u22cc",barwedge:"\u22bc",curlywedge:"\u22cf",veebar:"\u22bb",curlyvee:"\u22ce",doublebarwedge:"\u2a5e",boxminus:"\u229f",circleddash:"\u229d",boxtimes:"\u22a0",circledast:"\u229b",boxdot:"\u22a1",circledcirc:"\u229a",boxplus:"\u229e",centerdot:["\u22c5",{variantForm:!0}],divideontimes:"\u22c7",intercal:"\u22ba",leqq:"\u2266",geqq:"\u2267",leqslant:"\u2a7d",geqslant:"\u2a7e",eqslantless:"\u2a95",eqslantgtr:"\u2a96",lesssim:"\u2272",gtrsim:"\u2273",lessapprox:"\u2a85",gtrapprox:"\u2a86",approxeq:"\u224a",lessdot:"\u22d6",gtrdot:"\u22d7",lll:"\u22d8",llless:"\u22d8",ggg:"\u22d9",gggtr:"\u22d9",lessgtr:"\u2276",gtrless:"\u2277",lesseqgtr:"\u22da",gtreqless:"\u22db",lesseqqgtr:"\u2a8b",gtreqqless:"\u2a8c",doteqdot:"\u2251",Doteq:"\u2251",eqcirc:"\u2256",risingdotseq:"\u2253",circeq:"\u2257",fallingdotseq:"\u2252",triangleq:"\u225c",backsim:"\u223d",thicksim:["\u223c",{variantForm:!0}],backsimeq:"\u22cd",thickapprox:["\u2248",{variantForm:!0}],subseteqq:"\u2ac5",supseteqq:"\u2ac6",Subset:"\u22d0",Supset:"\u22d1",sqsubset:"\u228f",sqsupset:"\u2290",preccurlyeq:"\u227c",succcurlyeq:"\u227d",curlyeqprec:"\u22de",curlyeqsucc:"\u22df",precsim:"\u227e",succsim:"\u227f",precapprox:"\u2ab7",succapprox:"\u2ab8",vartriangleleft:"\u22b2",lhd:"\u22b2",vartriangleright:"\u22b3",rhd:"\u22b3",trianglelefteq:"\u22b4",unlhd:"\u22b4",trianglerighteq:"\u22b5",unrhd:"\u22b5",vDash:["\u22a8",{variantForm:!0}],Vdash:"\u22a9",Vvdash:"\u22aa",smallsmile:["\u2323",{variantForm:!0}],shortmid:["\u2223",{variantForm:!0}],smallfrown:["\u2322",{variantForm:!0}],shortparallel:["\u2225",{variantForm:!0}],bumpeq:"\u224f",between:"\u226c",Bumpeq:"\u224e",pitchfork:"\u22d4",varpropto:["\u221d",{variantForm:!0}],backepsilon:"\u220d",blacktriangleleft:"\u25c2",blacktriangleright:"\u25b8",therefore:"\u2234",because:"\u2235",eqsim:"\u2242",vartriangle:["\u25b3",{variantForm:!0}],Join:"\u22c8",nless:"\u226e",ngtr:"\u226f",nleq:"\u2270",ngeq:"\u2271",nleqslant:["\u2a87",{variantForm:!0}],ngeqslant:["\u2a88",{variantForm:!0}],nleqq:["\u2270",{variantForm:!0}],ngeqq:["\u2271",{variantForm:!0}],lneq:"\u2a87",gneq:"\u2a88",lneqq:"\u2268",gneqq:"\u2269",lvertneqq:["\u2268",{variantForm:!0}],gvertneqq:["\u2269",{variantForm:!0}],lnsim:"\u22e6",gnsim:"\u22e7",lnapprox:"\u2a89",gnapprox:"\u2a8a",nprec:"\u2280",nsucc:"\u2281",npreceq:["\u22e0",{variantForm:!0}],nsucceq:["\u22e1",{variantForm:!0}],precneqq:"\u2ab5",succneqq:"\u2ab6",precnsim:"\u22e8",succnsim:"\u22e9",precnapprox:"\u2ab9",succnapprox:"\u2aba",nsim:"\u2241",ncong:"\u2247",nshortmid:["\u2224",{variantForm:!0}],nshortparallel:["\u2226",{variantForm:!0}],nmid:"\u2224",nparallel:"\u2226",nvdash:"\u22ac",nvDash:"\u22ad",nVdash:"\u22ae",nVDash:"\u22af",ntriangleleft:"\u22ea",ntriangleright:"\u22eb",ntrianglelefteq:"\u22ec",ntrianglerighteq:"\u22ed",nsubseteq:"\u2288",nsupseteq:"\u2289",nsubseteqq:["\u2288",{variantForm:!0}],nsupseteqq:["\u2289",{variantForm:!0}],subsetneq:"\u228a",supsetneq:"\u228b",varsubsetneq:["\u228a",{variantForm:!0}],varsupsetneq:["\u228b",{variantForm:!0}],subsetneqq:"\u2acb",supsetneqq:"\u2acc",varsubsetneqq:["\u2acb",{variantForm:!0}],varsupsetneqq:["\u2acc",{variantForm:!0}],leftleftarrows:"\u21c7",rightrightarrows:"\u21c9",leftrightarrows:"\u21c6",rightleftarrows:"\u21c4",Lleftarrow:"\u21da",Rrightarrow:"\u21db",twoheadleftarrow:"\u219e",twoheadrightarrow:"\u21a0",leftarrowtail:"\u21a2",rightarrowtail:"\u21a3",looparrowleft:"\u21ab",looparrowright:"\u21ac",leftrightharpoons:"\u21cb",rightleftharpoons:["\u21cc",{variantForm:!0}],curvearrowleft:"\u21b6",curvearrowright:"\u21b7",circlearrowleft:"\u21ba",circlearrowright:"\u21bb",Lsh:"\u21b0",Rsh:"\u21b1",upuparrows:"\u21c8",downdownarrows:"\u21ca",upharpoonleft:"\u21bf",upharpoonright:"\u21be",downharpoonleft:"\u21c3",restriction:"\u21be",multimap:"\u22b8",downharpoonright:"\u21c2",leftrightsquigarrow:"\u21ad",rightsquigarrow:"\u21dd",leadsto:"\u21dd",dashrightarrow:"\u21e2",dashleftarrow:"\u21e0",nleftarrow:"\u219a",nrightarrow:"\u219b",nLeftarrow:"\u21cd",nRightarrow:"\u21cf",nleftrightarrow:"\u21ae",nLeftrightarrow:"\u21ce"}),new s.DelimiterMap("AMSsymbols-delimiter",l.default.delimiter,{"\\ulcorner":"\u231c","\\urcorner":"\u231d","\\llcorner":"\u231e","\\lrcorner":"\u231f"}),new s.CommandMap("AMSsymbols-macros",{implies:["Macro","\\;\\Longrightarrow\\;"],impliedby:["Macro","\\;\\Longleftarrow\\;"]},T.AmsMethods)},4387:function(t,e,r){var n=this&&this.__assign||function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.NEW_OPS=e.AmsMethods=void 0;var Q=i(r(1130)),T=i(r(5450)),s=i(r(1256)),a=r(8317),l=i(r(8417)),c=i(r(3971)),u=r(8803),p=i(r(7693)),h=r(9007);function d(t){if(!t||t.isInferred&&0===t.childNodes.length)return[null,null];if(t.isKind("msubsup")&&f(t))return[t,null];var e=s.default.getChildAt(t,0);return t.isInferred&&e&&f(e)?(t.childNodes.splice(0,1),[e,t]):[null,t]}function f(t){var e=t.childNodes[0];return e&&e.isKind("mi")&&""===e.getText()}e.AmsMethods={},e.AmsMethods.AmsEqnArray=function(t,e,r,n,o,i,T){var s=t.GetBrackets("\\begin{"+e.getName()+"}"),a=p.default.EqnArray(t,e,r,n,o,i,T);return Q.default.setArrayAlign(a,s)},e.AmsMethods.AlignAt=function(t,r,n,o){var i,T,s=r.getName(),a="",l=[];if(o||(T=t.GetBrackets("\\begin{"+s+"}")),(i=t.GetArgument("\\begin{"+s+"}")).match(/[^0-9]/))throw new c.default("PositiveIntegerArg","Argument to %1 must me a positive integer","\\begin{"+s+"}");for(var u=parseInt(i,10);u>0;)a+="rl",l.push("0em 0em"),u--;var p=l.join(" ");if(o)return e.AmsMethods.EqnArray(t,r,n,o,a,p);var h=e.AmsMethods.EqnArray(t,r,n,o,a,p);return Q.default.setArrayAlign(h,T)},e.AmsMethods.Multline=function(t,e,r){t.Push(e),Q.default.checkEqnEnv(t);var n=t.itemFactory.create("multline",r,t.stack);return n.arraydef={displaystyle:!0,rowspacing:".5em",columnspacing:"100%",width:t.options.ams.multlineWidth,side:t.options.tagSide,minlabelspacing:t.options.tagIndent,framespacing:t.options.ams.multlineIndent+" 0",frame:"","data-width-includes-label":!0},n},e.AmsMethods.XalignAt=function(t,r,n,o){var i=t.GetArgument("\\begin{"+r.getName()+"}");if(i.match(/[^0-9]/))throw new c.default("PositiveIntegerArg","Argument to %1 must me a positive integer","\\begin{"+r.getName()+"}");var Q=o?"crl":"rlc",T=o?"fit auto auto":"auto auto fit",s=e.AmsMethods.FlalignArray(t,r,n,o,!1,Q,T,!0);return s.setProperty("xalignat",2*parseInt(i)),s},e.AmsMethods.FlalignArray=function(t,e,r,n,o,i,T,s){void 0===s&&(s=!1),t.Push(e),Q.default.checkEqnEnv(t),i=i.split("").join(" ").replace(/r/g,"right").replace(/l/g,"left").replace(/c/g,"center");var a=t.itemFactory.create("flalign",e.getName(),r,n,o,t.stack);return a.arraydef={width:"100%",displaystyle:!0,columnalign:i,columnspacing:"0em",columnwidth:T,rowspacing:"3pt",side:t.options.tagSide,minlabelspacing:s?"0":t.options.tagIndent,"data-width-includes-label":!0},a.setProperty("zeroWidthLabel",s),a},e.NEW_OPS="ams-declare-ops",e.AmsMethods.HandleDeclareOp=function(t,r){var n=t.GetStar()?"*":"",o=Q.default.trimSpaces(t.GetArgument(r));"\\"===o.charAt(0)&&(o=o.substr(1));var i=t.GetArgument(r);t.configuration.handlers.retrieve(e.NEW_OPS).add(o,new u.Macro(o,e.AmsMethods.Macro,["\\operatorname".concat(n,"{").concat(i,"}")]))},e.AmsMethods.HandleOperatorName=function(t,e){var r=t.GetStar(),o=Q.default.trimSpaces(t.GetArgument(e)),i=new l.default(o,n(n({},t.stack.env),{font:a.TexConstant.Variant.NORMAL,multiLetterIdentifiers:/^[-*a-z]+/i,operatorLetters:!0}),t.configuration).mml();if(i.isKind("mi")||(i=t.create("node","TeXAtom",[i])),s.default.setProperties(i,{movesupsub:r,movablelimits:!0,texClass:h.TEXCLASS.OP}),!r){var T=t.GetNext(),c=t.i;"\\"===T&&++t.i&&"limits"!==t.GetCS()&&(t.i=c)}t.Push(i)},e.AmsMethods.SideSet=function(t,e){var r=o(d(t.ParseArg(e)),2),n=r[0],i=r[1],T=o(d(t.ParseArg(e)),2),a=T[0],l=T[1],c=t.ParseArg(e),u=c;n&&(i?n.replaceChild(t.create("node","mphantom",[t.create("node","mpadded",[Q.default.copyNode(c,t)],{width:0})]),s.default.getChildAt(n,0)):(u=t.create("node","mmultiscripts",[c]),a&&s.default.appendChildren(u,[s.default.getChildAt(a,1)||t.create("node","none"),s.default.getChildAt(a,2)||t.create("node","none")]),s.default.setProperty(u,"scriptalign","left"),s.default.appendChildren(u,[t.create("node","mprescripts"),s.default.getChildAt(n,1)||t.create("node","none"),s.default.getChildAt(n,2)||t.create("node","none")]))),a&&u===c&&(a.replaceChild(c,s.default.getChildAt(a,0)),u=a);var p=t.create("node","TeXAtom",[],{texClass:h.TEXCLASS.OP,movesupsub:!0,movablelimits:!0});i&&(n&&p.appendChild(n),p.appendChild(i)),p.appendChild(u),l&&p.appendChild(l),t.Push(p)},e.AmsMethods.operatorLetter=function(t,e){return!!t.stack.env.operatorLetters&&T.default.variable(t,e)},e.AmsMethods.MultiIntegral=function(t,e,r){var n=t.GetNext();if("\\"===n){var o=t.i;n=t.GetArgument(e),t.i=o,"\\limits"===n&&(r="\\idotsint"===e?"\\!\\!\\mathop{\\,\\,"+r+"}":"\\!\\!\\!\\mathop{\\,\\,\\,"+r+"}")}t.string=r+" "+t.string.slice(t.i),t.i=0},e.AmsMethods.xArrow=function(t,e,r,n,o){var i={width:"+"+Q.default.Em((n+o)/18),lspace:Q.default.Em(n/18)},T=t.GetBrackets(e),a=t.ParseArg(e),c=t.create("node","mspace",[],{depth:".25em"}),u=t.create("token","mo",{stretchy:!0,texClass:h.TEXCLASS.REL},String.fromCodePoint(r));u=t.create("node","mstyle",[u],{scriptlevel:0});var p=t.create("node","munderover",[u]),d=t.create("node","mpadded",[a,c],i);if(s.default.setAttribute(d,"voffset","-.2em"),s.default.setAttribute(d,"height","-.2em"),s.default.setChild(p,p.over,d),T){var f=new l.default(T,t.stack.env,t.configuration).mml(),L=t.create("node","mspace",[],{height:".75em"});d=t.create("node","mpadded",[f,L],i),s.default.setAttribute(d,"voffset",".15em"),s.default.setAttribute(d,"depth","-.15em"),s.default.setChild(p,p.under,d)}s.default.setProperty(p,"subsupOK",!0),t.Push(p)},e.AmsMethods.HandleShove=function(t,e,r){var n=t.stack.Top();if("multline"!==n.kind)throw new c.default("CommandOnlyAllowedInEnv","%1 only allowed in %2 environment",t.currentCS,"multline");if(n.Size())throw new c.default("CommandAtTheBeginingOfLine","%1 must come at the beginning of the line",t.currentCS);n.setProperty("shove",r)},e.AmsMethods.CFrac=function(t,e){var r=Q.default.trimSpaces(t.GetBrackets(e,"")),n=t.GetArgument(e),o=t.GetArgument(e),i={l:a.TexConstant.Align.LEFT,r:a.TexConstant.Align.RIGHT,"":""},T=new l.default("\\strut\\textstyle{"+n+"}",t.stack.env,t.configuration).mml(),u=new l.default("\\strut\\textstyle{"+o+"}",t.stack.env,t.configuration).mml(),p=t.create("node","mfrac",[T,u]);if(null==(r=i[r]))throw new c.default("IllegalAlign","Illegal alignment specified in %1",t.currentCS);r&&s.default.setProperties(p,{numalign:r,denomalign:r}),t.Push(p)},e.AmsMethods.Genfrac=function(t,e,r,n,o,i){null==r&&(r=t.GetDelimiterArg(e)),null==n&&(n=t.GetDelimiterArg(e)),null==o&&(o=t.GetArgument(e)),null==i&&(i=Q.default.trimSpaces(t.GetArgument(e)));var T=t.ParseArg(e),a=t.ParseArg(e),l=t.create("node","mfrac",[T,a]);if(""!==o&&s.default.setAttribute(l,"linethickness",o),(r||n)&&(s.default.setProperty(l,"withDelims",!0),l=Q.default.fixedFence(t.configuration,r,l,n)),""!==i){var u=parseInt(i,10),p=["D","T","S","SS"][u];if(null==p)throw new c.default("BadMathStyleFor","Bad math style for %1",t.currentCS);l=t.create("node","mstyle",[l]),"D"===p?s.default.setProperties(l,{displaystyle:!0,scriptlevel:0}):s.default.setProperties(l,{displaystyle:!1,scriptlevel:u-1})}t.Push(l)},e.AmsMethods.HandleTag=function(t,e){if(!t.tags.currentTag.taggable&&t.tags.env)throw new c.default("CommandNotAllowedInEnv","%1 not allowed in %2 environment",t.currentCS,t.tags.env);if(t.tags.currentTag.tag)throw new c.default("MultipleCommand","Multiple %1",t.currentCS);var r=t.GetStar(),n=Q.default.trimSpaces(t.GetArgument(e));t.tags.tag(n,r)},e.AmsMethods.HandleNoTag=p.default.HandleNoTag,e.AmsMethods.HandleRef=p.default.HandleRef,e.AmsMethods.Macro=p.default.Macro,e.AmsMethods.Accent=p.default.Accent,e.AmsMethods.Tilde=p.default.Tilde,e.AmsMethods.Array=p.default.Array,e.AmsMethods.Spacer=p.default.Spacer,e.AmsMethods.NamedOp=p.default.NamedOp,e.AmsMethods.EqnArray=p.default.EqnArray,e.AmsMethods.Equation=p.default.Equation},1275:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AutoloadConfiguration=void 0;var i=r(9899),Q=r(9140),T=r(8803),s=r(7741),a=r(265),l=r(7233);function c(t,e,r,i){var Q,T,l,c;if(a.Package.packages.has(t.options.require.prefix+r)){var h=t.options.autoload[r],d=n(2===h.length&&Array.isArray(h[0])?h:[h,[]],2),f=d[0],L=d[1];try{for(var m=o(f),y=m.next();!y.done;y=m.next()){var g=y.value;u.remove(g)}}catch(t){Q={error:t}}finally{try{y&&!y.done&&(T=m.return)&&T.call(m)}finally{if(Q)throw Q.error}}try{for(var H=o(L),b=H.next();!b.done;b=H.next()){var v=b.value;p.remove(v)}}catch(t){l={error:t}}finally{try{b&&!b.done&&(c=H.return)&&c.call(H)}finally{if(l)throw l.error}}t.string=(i?e+" ":"\\begin{"+e.slice(1)+"}")+t.string.slice(t.i),t.i=0}(0,s.RequireLoad)(t,r)}var u=new Q.CommandMap("autoload-macros",{},{}),p=new Q.CommandMap("autoload-environments",{},{});e.AutoloadConfiguration=i.Configuration.create("autoload",{handler:{macro:["autoload-macros"],environment:["autoload-environments"]},options:{autoload:(0,l.expandable)({action:["toggle","mathtip","texttip"],amscd:[[],["CD"]],bbox:["bbox"],boldsymbol:["boldsymbol"],braket:["bra","ket","braket","set","Bra","Ket","Braket","Set","ketbra","Ketbra"],bussproofs:[[],["prooftree"]],cancel:["cancel","bcancel","xcancel","cancelto"],color:["color","definecolor","textcolor","colorbox","fcolorbox"],enclose:["enclose"],extpfeil:["xtwoheadrightarrow","xtwoheadleftarrow","xmapsto","xlongequal","xtofrom","Newextarrow"],html:["href","class","style","cssId"],mhchem:["ce","pu"],newcommand:["newcommand","renewcommand","newenvironment","renewenvironment","def","let"],unicode:["unicode"],verb:["verb"]})},config:function(t,e){var r,i,Q,a,l,h,d=e.parseOptions,f=d.handlers.get("macro"),L=d.handlers.get("environment"),m=d.options.autoload;d.packageData.set("autoload",{Autoload:c});try{for(var y=o(Object.keys(m)),g=y.next();!g.done;g=y.next()){var H=g.value,b=m[H],v=n(2===b.length&&Array.isArray(b[0])?b:[b,[]],2),M=v[0],_=v[1];try{for(var O=(Q=void 0,o(M)),V=O.next();!V.done;V=O.next()){var S=V.value;f.lookup(S)&&"color"!==S||u.add(S,new T.Macro(S,c,[H,!0]))}}catch(t){Q={error:t}}finally{try{V&&!V.done&&(a=O.return)&&a.call(O)}finally{if(Q)throw Q.error}}try{for(var x=(l=void 0,o(_)),E=x.next();!E.done;E=x.next()){var A=E.value;L.lookup(A)||p.add(A,new T.Macro(A,c,[H,!1]))}}catch(t){l={error:t}}finally{try{E&&!E.done&&(h=x.return)&&h.call(x)}finally{if(l)throw l.error}}}}catch(t){r={error:t}}finally{try{g&&!g.done&&(i=y.return)&&i.call(y)}finally{if(r)throw r.error}}d.packageData.get("require")||s.RequireConfiguration.config(t,e)},init:function(t){t.options.require||(0,l.defaultOptions)(t.options,s.RequireConfiguration.options)},priority:10})},2942:function(t,e,r){var n,o,i=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),Q=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),T=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),s=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&Q(e,t,r);return T(e,t),e},a=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},l=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.BaseConfiguration=e.BaseTags=e.Other=void 0;var c=r(9899),u=r(2947),p=l(r(3971)),h=l(r(1256)),d=r(9140),f=s(r(1181)),L=r(6521);r(1267);var m=r(4082);function y(t,e){var r=t.stack.env.font?{mathvariant:t.stack.env.font}:{},n=u.MapHandler.getMap("remap").lookup(e),o=(0,m.getRange)(e),i=o?o[3]:"mo",Q=t.create("token",i,r,n?n.char:e);o[4]&&Q.attributes.set("mathvariant",o[4]),"mo"===i&&(h.default.setProperty(Q,"fixStretchy",!0),t.configuration.addNode("fixStretchy",Q)),t.Push(Q)}new d.CharacterMap("remap",null,{"-":"\u2212","*":"\u2217","`":"\u2018"}),e.Other=y;var g=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return i(e,t),e}(L.AbstractTags);e.BaseTags=g,e.BaseConfiguration=c.Configuration.create("base",{handler:{character:["command","special","letter","digit"],delimiter:["delimiter"],macro:["delimiter","macros","mathchar0mi","mathchar0mo","mathchar7"],environment:["environment"]},fallback:{character:y,macro:function(t,e){throw new p.default("UndefinedControlSequence","Undefined control sequence %1","\\"+e)},environment:function(t,e){throw new p.default("UnknownEnv","Unknown environment '%1'",e)}},items:(o={},o[f.StartItem.prototype.kind]=f.StartItem,o[f.StopItem.prototype.kind]=f.StopItem,o[f.OpenItem.prototype.kind]=f.OpenItem,o[f.CloseItem.prototype.kind]=f.CloseItem,o[f.PrimeItem.prototype.kind]=f.PrimeItem,o[f.SubsupItem.prototype.kind]=f.SubsupItem,o[f.OverItem.prototype.kind]=f.OverItem,o[f.LeftItem.prototype.kind]=f.LeftItem,o[f.Middle.prototype.kind]=f.Middle,o[f.RightItem.prototype.kind]=f.RightItem,o[f.BeginItem.prototype.kind]=f.BeginItem,o[f.EndItem.prototype.kind]=f.EndItem,o[f.StyleItem.prototype.kind]=f.StyleItem,o[f.PositionItem.prototype.kind]=f.PositionItem,o[f.CellItem.prototype.kind]=f.CellItem,o[f.MmlItem.prototype.kind]=f.MmlItem,o[f.FnItem.prototype.kind]=f.FnItem,o[f.NotItem.prototype.kind]=f.NotItem,o[f.NonscriptItem.prototype.kind]=f.NonscriptItem,o[f.DotsItem.prototype.kind]=f.DotsItem,o[f.ArrayItem.prototype.kind]=f.ArrayItem,o[f.EqnArrayItem.prototype.kind]=f.EqnArrayItem,o[f.EquationItem.prototype.kind]=f.EquationItem,o),options:{maxMacros:1e3,baseURL:"undefined"==typeof document||0===document.getElementsByTagName("base").length?"":String(document.location).replace(/#.*$/,"")},tags:{base:g},postprocessors:[[function(t){var e,r,n=t.data;try{for(var o=a(n.getList("nonscript")),i=o.next();!i.done;i=o.next()){var Q=i.value;if(Q.attributes.get("scriptlevel")>0){var T=Q.parent;if(T.childNodes.splice(T.childIndex(Q),1),n.removeFromList(Q.kind,[Q]),Q.isKind("mrow")){var s=Q.childNodes[0];n.removeFromList("mstyle",[s]),n.removeFromList("mspace",s.childNodes[0].childNodes)}}else Q.isKind("mrow")&&(Q.parent.replaceChild(Q.childNodes[0],Q),n.removeFromList("mrow",[Q]))}}catch(t){e={error:t}}finally{try{i&&!i.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},-4]]})},1181:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;othis.maxrow&&(this.maxrow=this.row.length);var t="mtr",e=this.factory.configuration.tags.getTag();e&&(this.row=[e].concat(this.row),t="mlabeledtr"),this.factory.configuration.tags.clearTag();var r=this.create("node",t,this.row);this.table.push(r),this.row=[]},e.prototype.EndTable=function(){t.prototype.EndTable.call(this),this.factory.configuration.tags.end(),this.extendArray("columnalign",this.maxrow),this.extendArray("columnwidth",this.maxrow),this.extendArray("columnspacing",this.maxrow-1)},e.prototype.extendArray=function(t,e){if(this.arraydef[t]){var r=this.arraydef[t].split(/ /),n=Q([],i(r),!1);if(n.length>1){for(;n.length",succ:"\u227b",prec:"\u227a",approx:"\u2248",succeq:"\u2ab0",preceq:"\u2aaf",supset:"\u2283",subset:"\u2282",supseteq:"\u2287",subseteq:"\u2286",in:"\u2208",ni:"\u220b",notin:"\u2209",owns:"\u220b",gg:"\u226b",ll:"\u226a",sim:"\u223c",simeq:"\u2243",perp:"\u22a5",equiv:"\u2261",asymp:"\u224d",smile:"\u2323",frown:"\u2322",ne:"\u2260",neq:"\u2260",cong:"\u2245",doteq:"\u2250",bowtie:"\u22c8",models:"\u22a8",notChar:"\u29f8",Leftrightarrow:"\u21d4",Leftarrow:"\u21d0",Rightarrow:"\u21d2",leftrightarrow:"\u2194",leftarrow:"\u2190",gets:"\u2190",rightarrow:"\u2192",to:["\u2192",{accent:!1}],mapsto:"\u21a6",leftharpoonup:"\u21bc",leftharpoondown:"\u21bd",rightharpoonup:"\u21c0",rightharpoondown:"\u21c1",nearrow:"\u2197",searrow:"\u2198",nwarrow:"\u2196",swarrow:"\u2199",rightleftharpoons:"\u21cc",hookrightarrow:"\u21aa",hookleftarrow:"\u21a9",longleftarrow:"\u27f5",Longleftarrow:"\u27f8",longrightarrow:"\u27f6",Longrightarrow:"\u27f9",Longleftrightarrow:"\u27fa",longleftrightarrow:"\u27f7",longmapsto:"\u27fc",ldots:"\u2026",cdots:"\u22ef",vdots:"\u22ee",ddots:"\u22f1",dotsc:"\u2026",dotsb:"\u22ef",dotsm:"\u22ef",dotsi:"\u22ef",dotso:"\u2026",ldotp:[".",{texClass:u.TEXCLASS.PUNCT}],cdotp:["\u22c5",{texClass:u.TEXCLASS.PUNCT}],colon:[":",{texClass:u.TEXCLASS.PUNCT}]}),new T.CharacterMap("mathchar7",l.default.mathchar7,{Gamma:"\u0393",Delta:"\u0394",Theta:"\u0398",Lambda:"\u039b",Xi:"\u039e",Pi:"\u03a0",Sigma:"\u03a3",Upsilon:"\u03a5",Phi:"\u03a6",Psi:"\u03a8",Omega:"\u03a9",_:"_","#":"#",$:"$","%":"%","&":"&",And:"&"}),new T.DelimiterMap("delimiter",l.default.delimiter,{"(":"(",")":")","[":"[","]":"]","<":"\u27e8",">":"\u27e9","\\lt":"\u27e8","\\gt":"\u27e9","/":"/","|":["|",{texClass:u.TEXCLASS.ORD}],".":"","\\\\":"\\","\\lmoustache":"\u23b0","\\rmoustache":"\u23b1","\\lgroup":"\u27ee","\\rgroup":"\u27ef","\\arrowvert":"\u23d0","\\Arrowvert":"\u2016","\\bracevert":"\u23aa","\\Vert":["\u2016",{texClass:u.TEXCLASS.ORD}],"\\|":["\u2016",{texClass:u.TEXCLASS.ORD}],"\\vert":["|",{texClass:u.TEXCLASS.ORD}],"\\uparrow":"\u2191","\\downarrow":"\u2193","\\updownarrow":"\u2195","\\Uparrow":"\u21d1","\\Downarrow":"\u21d3","\\Updownarrow":"\u21d5","\\backslash":"\\","\\rangle":"\u27e9","\\langle":"\u27e8","\\rbrace":"}","\\lbrace":"{","\\}":"}","\\{":"{","\\rceil":"\u2309","\\lceil":"\u2308","\\rfloor":"\u230b","\\lfloor":"\u230a","\\lbrack":"[","\\rbrack":"]"}),new T.CommandMap("macros",{displaystyle:["SetStyle","D",!0,0],textstyle:["SetStyle","T",!1,0],scriptstyle:["SetStyle","S",!1,1],scriptscriptstyle:["SetStyle","SS",!1,2],rm:["SetFont",s.TexConstant.Variant.NORMAL],mit:["SetFont",s.TexConstant.Variant.ITALIC],oldstyle:["SetFont",s.TexConstant.Variant.OLDSTYLE],cal:["SetFont",s.TexConstant.Variant.CALLIGRAPHIC],it:["SetFont",s.TexConstant.Variant.MATHITALIC],bf:["SetFont",s.TexConstant.Variant.BOLD],bbFont:["SetFont",s.TexConstant.Variant.DOUBLESTRUCK],scr:["SetFont",s.TexConstant.Variant.SCRIPT],frak:["SetFont",s.TexConstant.Variant.FRAKTUR],sf:["SetFont",s.TexConstant.Variant.SANSSERIF],tt:["SetFont",s.TexConstant.Variant.MONOSPACE],mathrm:["MathFont",s.TexConstant.Variant.NORMAL],mathup:["MathFont",s.TexConstant.Variant.NORMAL],mathnormal:["MathFont",""],mathbf:["MathFont",s.TexConstant.Variant.BOLD],mathbfup:["MathFont",s.TexConstant.Variant.BOLD],mathit:["MathFont",s.TexConstant.Variant.MATHITALIC],mathbfit:["MathFont",s.TexConstant.Variant.BOLDITALIC],mathbb:["MathFont",s.TexConstant.Variant.DOUBLESTRUCK],Bbb:["MathFont",s.TexConstant.Variant.DOUBLESTRUCK],mathfrak:["MathFont",s.TexConstant.Variant.FRAKTUR],mathbffrak:["MathFont",s.TexConstant.Variant.BOLDFRAKTUR],mathscr:["MathFont",s.TexConstant.Variant.SCRIPT],mathbfscr:["MathFont",s.TexConstant.Variant.BOLDSCRIPT],mathsf:["MathFont",s.TexConstant.Variant.SANSSERIF],mathsfup:["MathFont",s.TexConstant.Variant.SANSSERIF],mathbfsf:["MathFont",s.TexConstant.Variant.BOLDSANSSERIF],mathbfsfup:["MathFont",s.TexConstant.Variant.BOLDSANSSERIF],mathsfit:["MathFont",s.TexConstant.Variant.SANSSERIFITALIC],mathbfsfit:["MathFont",s.TexConstant.Variant.SANSSERIFBOLDITALIC],mathtt:["MathFont",s.TexConstant.Variant.MONOSPACE],mathcal:["MathFont",s.TexConstant.Variant.CALLIGRAPHIC],mathbfcal:["MathFont",s.TexConstant.Variant.BOLDCALLIGRAPHIC],symrm:["MathFont",s.TexConstant.Variant.NORMAL],symup:["MathFont",s.TexConstant.Variant.NORMAL],symnormal:["MathFont",""],symbf:["MathFont",s.TexConstant.Variant.BOLD],symbfup:["MathFont",s.TexConstant.Variant.BOLD],symit:["MathFont",s.TexConstant.Variant.ITALIC],symbfit:["MathFont",s.TexConstant.Variant.BOLDITALIC],symbb:["MathFont",s.TexConstant.Variant.DOUBLESTRUCK],symfrak:["MathFont",s.TexConstant.Variant.FRAKTUR],symbffrak:["MathFont",s.TexConstant.Variant.BOLDFRAKTUR],symscr:["MathFont",s.TexConstant.Variant.SCRIPT],symbfscr:["MathFont",s.TexConstant.Variant.BOLDSCRIPT],symsf:["MathFont",s.TexConstant.Variant.SANSSERIF],symsfup:["MathFont",s.TexConstant.Variant.SANSSERIF],symbfsf:["MathFont",s.TexConstant.Variant.BOLDSANSSERIF],symbfsfup:["MathFont",s.TexConstant.Variant.BOLDSANSSERIF],symsfit:["MathFont",s.TexConstant.Variant.SANSSERIFITALIC],symbfsfit:["MathFont",s.TexConstant.Variant.SANSSERIFBOLDITALIC],symtt:["MathFont",s.TexConstant.Variant.MONOSPACE],symcal:["MathFont",s.TexConstant.Variant.CALLIGRAPHIC],symbfcal:["MathFont",s.TexConstant.Variant.BOLDCALLIGRAPHIC],textrm:["HBox",null,s.TexConstant.Variant.NORMAL],textup:["HBox",null,s.TexConstant.Variant.NORMAL],textnormal:["HBox"],textit:["HBox",null,s.TexConstant.Variant.ITALIC],textbf:["HBox",null,s.TexConstant.Variant.BOLD],textsf:["HBox",null,s.TexConstant.Variant.SANSSERIF],texttt:["HBox",null,s.TexConstant.Variant.MONOSPACE],tiny:["SetSize",.5],Tiny:["SetSize",.6],scriptsize:["SetSize",.7],small:["SetSize",.85],normalsize:["SetSize",1],large:["SetSize",1.2],Large:["SetSize",1.44],LARGE:["SetSize",1.73],huge:["SetSize",2.07],Huge:["SetSize",2.49],arcsin:"NamedFn",arccos:"NamedFn",arctan:"NamedFn",arg:"NamedFn",cos:"NamedFn",cosh:"NamedFn",cot:"NamedFn",coth:"NamedFn",csc:"NamedFn",deg:"NamedFn",det:"NamedOp",dim:"NamedFn",exp:"NamedFn",gcd:"NamedOp",hom:"NamedFn",inf:"NamedOp",ker:"NamedFn",lg:"NamedFn",lim:"NamedOp",liminf:["NamedOp","lim inf"],limsup:["NamedOp","lim sup"],ln:"NamedFn",log:"NamedFn",max:"NamedOp",min:"NamedOp",Pr:"NamedOp",sec:"NamedFn",sin:"NamedFn",sinh:"NamedFn",sup:"NamedOp",tan:"NamedFn",tanh:"NamedFn",limits:["Limits",1],nolimits:["Limits",0],overline:["UnderOver","2015"],underline:["UnderOver","2015"],overbrace:["UnderOver","23DE",1],underbrace:["UnderOver","23DF",1],overparen:["UnderOver","23DC"],underparen:["UnderOver","23DD"],overrightarrow:["UnderOver","2192"],underrightarrow:["UnderOver","2192"],overleftarrow:["UnderOver","2190"],underleftarrow:["UnderOver","2190"],overleftrightarrow:["UnderOver","2194"],underleftrightarrow:["UnderOver","2194"],overset:"Overset",underset:"Underset",overunderset:"Overunderset",stackrel:["Macro","\\mathrel{\\mathop{#2}\\limits^{#1}}",2],stackbin:["Macro","\\mathbin{\\mathop{#2}\\limits^{#1}}",2],over:"Over",overwithdelims:"Over",atop:"Over",atopwithdelims:"Over",above:"Over",abovewithdelims:"Over",brace:["Over","{","}"],brack:["Over","[","]"],choose:["Over","(",")"],frac:"Frac",sqrt:"Sqrt",root:"Root",uproot:["MoveRoot","upRoot"],leftroot:["MoveRoot","leftRoot"],left:"LeftRight",right:"LeftRight",middle:"LeftRight",llap:"Lap",rlap:"Lap",raise:"RaiseLower",lower:"RaiseLower",moveleft:"MoveLeftRight",moveright:"MoveLeftRight",",":["Spacer",p.MATHSPACE.thinmathspace],":":["Spacer",p.MATHSPACE.mediummathspace],">":["Spacer",p.MATHSPACE.mediummathspace],";":["Spacer",p.MATHSPACE.thickmathspace],"!":["Spacer",p.MATHSPACE.negativethinmathspace],enspace:["Spacer",.5],quad:["Spacer",1],qquad:["Spacer",2],thinspace:["Spacer",p.MATHSPACE.thinmathspace],negthinspace:["Spacer",p.MATHSPACE.negativethinmathspace],hskip:"Hskip",hspace:"Hskip",kern:"Hskip",mskip:"Hskip",mspace:"Hskip",mkern:"Hskip",rule:"rule",Rule:["Rule"],Space:["Rule","blank"],nonscript:"Nonscript",big:["MakeBig",u.TEXCLASS.ORD,.85],Big:["MakeBig",u.TEXCLASS.ORD,1.15],bigg:["MakeBig",u.TEXCLASS.ORD,1.45],Bigg:["MakeBig",u.TEXCLASS.ORD,1.75],bigl:["MakeBig",u.TEXCLASS.OPEN,.85],Bigl:["MakeBig",u.TEXCLASS.OPEN,1.15],biggl:["MakeBig",u.TEXCLASS.OPEN,1.45],Biggl:["MakeBig",u.TEXCLASS.OPEN,1.75],bigr:["MakeBig",u.TEXCLASS.CLOSE,.85],Bigr:["MakeBig",u.TEXCLASS.CLOSE,1.15],biggr:["MakeBig",u.TEXCLASS.CLOSE,1.45],Biggr:["MakeBig",u.TEXCLASS.CLOSE,1.75],bigm:["MakeBig",u.TEXCLASS.REL,.85],Bigm:["MakeBig",u.TEXCLASS.REL,1.15],biggm:["MakeBig",u.TEXCLASS.REL,1.45],Biggm:["MakeBig",u.TEXCLASS.REL,1.75],mathord:["TeXAtom",u.TEXCLASS.ORD],mathop:["TeXAtom",u.TEXCLASS.OP],mathopen:["TeXAtom",u.TEXCLASS.OPEN],mathclose:["TeXAtom",u.TEXCLASS.CLOSE],mathbin:["TeXAtom",u.TEXCLASS.BIN],mathrel:["TeXAtom",u.TEXCLASS.REL],mathpunct:["TeXAtom",u.TEXCLASS.PUNCT],mathinner:["TeXAtom",u.TEXCLASS.INNER],vcenter:["TeXAtom",u.TEXCLASS.VCENTER],buildrel:"BuildRel",hbox:["HBox",0],text:"HBox",mbox:["HBox",0],fbox:"FBox",boxed:["Macro","\\fbox{$\\displaystyle{#1}$}",1],framebox:"FrameBox",strut:"Strut",mathstrut:["Macro","\\vphantom{(}"],phantom:"Phantom",vphantom:["Phantom",1,0],hphantom:["Phantom",0,1],smash:"Smash",acute:["Accent","00B4"],grave:["Accent","0060"],ddot:["Accent","00A8"],tilde:["Accent","007E"],bar:["Accent","00AF"],breve:["Accent","02D8"],check:["Accent","02C7"],hat:["Accent","005E"],vec:["Accent","2192"],dot:["Accent","02D9"],widetilde:["Accent","007E",1],widehat:["Accent","005E",1],matrix:"Matrix",array:"Matrix",pmatrix:["Matrix","(",")"],cases:["Matrix","{","","left left",null,".1em",null,!0],eqalign:["Matrix",null,null,"right left",(0,p.em)(p.MATHSPACE.thickmathspace),".5em","D"],displaylines:["Matrix",null,null,"center",null,".5em","D"],cr:"Cr","\\":"CrLaTeX",newline:["CrLaTeX",!0],hline:["HLine","solid"],hdashline:["HLine","dashed"],eqalignno:["Matrix",null,null,"right left",(0,p.em)(p.MATHSPACE.thickmathspace),".5em","D",null,"right"],leqalignno:["Matrix",null,null,"right left",(0,p.em)(p.MATHSPACE.thickmathspace),".5em","D",null,"left"],hfill:"HFill",hfil:"HFill",hfilll:"HFill",bmod:["Macro",'\\mmlToken{mo}[lspace="thickmathspace" rspace="thickmathspace"]{mod}'],pmod:["Macro","\\pod{\\mmlToken{mi}{mod}\\kern 6mu #1}",1],mod:["Macro","\\mathchoice{\\kern18mu}{\\kern12mu}{\\kern12mu}{\\kern12mu}\\mmlToken{mi}{mod}\\,\\,#1",1],pod:["Macro","\\mathchoice{\\kern18mu}{\\kern8mu}{\\kern8mu}{\\kern8mu}(#1)",1],iff:["Macro","\\;\\Longleftrightarrow\\;"],skew:["Macro","{{#2{#3\\mkern#1mu}\\mkern-#1mu}{}}",3],pmb:["Macro","\\rlap{#1}\\kern1px{#1}",1],TeX:["Macro","T\\kern-.14em\\lower.5ex{E}\\kern-.115em X"],LaTeX:["Macro","L\\kern-.325em\\raise.21em{\\scriptstyle{A}}\\kern-.17em\\TeX"]," ":["Macro","\\text{ }"],not:"Not",dots:"Dots",space:"Tilde","\xa0":"Tilde",begin:"BeginEnd",end:"BeginEnd",label:"HandleLabel",ref:"HandleRef",nonumber:"HandleNoTag",mathchoice:"MathChoice",mmlToken:"MmlToken"},a.default),new T.EnvironmentMap("environment",l.default.environment,{array:["AlignedArray"],equation:["Equation",null,!0],eqnarray:["EqnArray",null,!0,!0,"rcl",c.default.cols(0,p.MATHSPACE.thickmathspace),".5em"]},a.default),new T.CharacterMap("not_remap",null,{"\u2190":"\u219a","\u2192":"\u219b","\u2194":"\u21ae","\u21d0":"\u21cd","\u21d2":"\u21cf","\u21d4":"\u21ce","\u2208":"\u2209","\u220b":"\u220c","\u2223":"\u2224","\u2225":"\u2226","\u223c":"\u2241","~":"\u2241","\u2243":"\u2244","\u2245":"\u2247","\u2248":"\u2249","\u224d":"\u226d","=":"\u2260","\u2261":"\u2262","<":"\u226e",">":"\u226f","\u2264":"\u2270","\u2265":"\u2271","\u2272":"\u2274","\u2273":"\u2275","\u2276":"\u2278","\u2277":"\u2279","\u227a":"\u2280","\u227b":"\u2281","\u2282":"\u2284","\u2283":"\u2285","\u2286":"\u2288","\u2287":"\u2289","\u22a2":"\u22ac","\u22a8":"\u22ad","\u22a9":"\u22ae","\u22ab":"\u22af","\u227c":"\u22e0","\u227d":"\u22e1","\u2291":"\u22e2","\u2292":"\u22e3","\u22b2":"\u22ea","\u22b3":"\u22eb","\u22b4":"\u22ec","\u22b5":"\u22ed","\u2203":"\u2204"})},7693:function(t,e,r){var n=this&&this.__assign||function(){return n=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},s=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var a=Q(r(1181)),l=s(r(1256)),c=s(r(3971)),u=s(r(8417)),p=r(8317),h=s(r(1130)),d=r(9007),f=r(6521),L=r(6010),m=r(5368),y=r(7233),g={},H={fontfamily:1,fontsize:1,fontweight:1,fontstyle:1,color:1,background:1,id:1,class:1,href:1,style:1};function b(t,e){var r=t.stack.env,n=r.inRoot;r.inRoot=!0;var o=new u.default(e,r,t.configuration),i=o.mml(),Q=o.stack.global;if(Q.leftRoot||Q.upRoot){var T={};Q.leftRoot&&(T.width=Q.leftRoot),Q.upRoot&&(T.voffset=Q.upRoot,T.height=Q.upRoot),i=t.create("node","mpadded",[i],T)}return r.inRoot=n,i}g.Open=function(t,e){t.Push(t.itemFactory.create("open"))},g.Close=function(t,e){t.Push(t.itemFactory.create("close"))},g.Tilde=function(t,e){t.Push(t.create("token","mtext",{},m.entities.nbsp))},g.Space=function(t,e){},g.Superscript=function(t,e){var r,n,o;t.GetNext().match(/\d/)&&(t.string=t.string.substr(0,t.i+1)+" "+t.string.substr(t.i+1));var i=t.stack.Top();i.isKind("prime")?(o=(r=T(i.Peek(2),2))[0],n=r[1],t.stack.Pop()):(o=t.stack.Prev())||(o=t.create("token","mi",{},""));var Q=l.default.getProperty(o,"movesupsub"),s=l.default.isType(o,"msubsup")?o.sup:o.over;if(l.default.isType(o,"msubsup")&&!l.default.isType(o,"msup")&&l.default.getChildAt(o,o.sup)||l.default.isType(o,"munderover")&&!l.default.isType(o,"mover")&&l.default.getChildAt(o,o.over)&&!l.default.getProperty(o,"subsupOK"))throw new c.default("DoubleExponent","Double exponent: use braces to clarify");l.default.isType(o,"msubsup")&&!l.default.isType(o,"msup")||(Q?((!l.default.isType(o,"munderover")||l.default.isType(o,"mover")||l.default.getChildAt(o,o.over))&&(o=t.create("node","munderover",[o],{movesupsub:!0})),s=o.over):s=(o=t.create("node","msubsup",[o])).sup),t.Push(t.itemFactory.create("subsup",o).setProperties({position:s,primes:n,movesupsub:Q}))},g.Subscript=function(t,e){var r,n,o;t.GetNext().match(/\d/)&&(t.string=t.string.substr(0,t.i+1)+" "+t.string.substr(t.i+1));var i=t.stack.Top();i.isKind("prime")?(o=(r=T(i.Peek(2),2))[0],n=r[1],t.stack.Pop()):(o=t.stack.Prev())||(o=t.create("token","mi",{},""));var Q=l.default.getProperty(o,"movesupsub"),s=l.default.isType(o,"msubsup")?o.sub:o.under;if(l.default.isType(o,"msubsup")&&!l.default.isType(o,"msup")&&l.default.getChildAt(o,o.sub)||l.default.isType(o,"munderover")&&!l.default.isType(o,"mover")&&l.default.getChildAt(o,o.under)&&!l.default.getProperty(o,"subsupOK"))throw new c.default("DoubleSubscripts","Double subscripts: use braces to clarify");l.default.isType(o,"msubsup")&&!l.default.isType(o,"msup")||(Q?((!l.default.isType(o,"munderover")||l.default.isType(o,"mover")||l.default.getChildAt(o,o.under))&&(o=t.create("node","munderover",[o],{movesupsub:!0})),s=o.under):s=(o=t.create("node","msubsup",[o])).sub),t.Push(t.itemFactory.create("subsup",o).setProperties({position:s,primes:n,movesupsub:Q}))},g.Prime=function(t,e){var r=t.stack.Prev();if(r||(r=t.create("node","mi")),l.default.isType(r,"msubsup")&&!l.default.isType(r,"msup")&&l.default.getChildAt(r,r.sup))throw new c.default("DoubleExponentPrime","Prime causes double exponent: use braces to clarify");var n="";t.i--;do{n+=m.entities.prime,t.i++,e=t.GetNext()}while("'"===e||e===m.entities.rsquo);n=["","\u2032","\u2033","\u2034","\u2057"][n.length]||n;var o=t.create("token","mo",{variantForm:!0},n);t.Push(t.itemFactory.create("prime",r,o))},g.Comment=function(t,e){for(;t.i=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.ConfigMacrosConfiguration=void 0;var Q=r(9899),T=r(7233),s=r(9140),a=i(r(5450)),l=r(8803),c=i(r(1110)),u=r(6793),p="configmacros-map",h="configmacros-env-map";e.ConfigMacrosConfiguration=Q.Configuration.create("configmacros",{init:function(t){new s.CommandMap(p,{},{}),new s.EnvironmentMap(h,a.default.environment,{},{}),t.append(Q.Configuration.local({handler:{macro:[p],environment:[h]},priority:3}))},config:function(t,e){!function(t){var e,r,n=t.parseOptions.handlers.retrieve(p),i=t.parseOptions.options.macros;try{for(var Q=o(Object.keys(i)),T=Q.next();!T.done;T=Q.next()){var s=T.value,a="string"==typeof i[s]?[i[s]]:i[s],u=Array.isArray(a[2])?new l.Macro(s,c.default.MacroWithTemplate,a.slice(0,2).concat(a[2])):new l.Macro(s,c.default.Macro,a);n.add(s,u)}}catch(t){e={error:t}}finally{try{T&&!T.done&&(r=Q.return)&&r.call(Q)}finally{if(e)throw e.error}}}(e),function(t){var e,r,n=t.parseOptions.handlers.retrieve(h),i=t.parseOptions.options.environments;try{for(var Q=o(Object.keys(i)),T=Q.next();!T.done;T=Q.next()){var s=T.value;n.add(s,new l.Macro(s,c.default.BeginEnv,[!0].concat(i[s])))}}catch(t){e={error:t}}finally{try{T&&!T.done&&(r=Q.return)&&r.call(Q)}finally{if(e)throw e.error}}}(e)},items:(n={},n[u.BeginEnvItem.prototype.kind]=u.BeginEnvItem,n),options:{macros:(0,T.expandable)({}),environments:(0,T.expandable)({})}})},1496:function(t,e,r){var n,o=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),i=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),Q=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&o(e,t,r);return i(e,t),e},T=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.NewcommandConfiguration=void 0;var s=r(9899),a=r(6793),l=T(r(5579));r(5117);var c=T(r(5450)),u=Q(r(9140));e.NewcommandConfiguration=s.Configuration.create("newcommand",{handler:{macro:["Newcommand-macros"]},items:(n={},n[a.BeginEnvItem.prototype.kind]=a.BeginEnvItem,n),options:{maxMacros:1e3},init:function(t){new u.DelimiterMap(l.default.NEW_DELIMITER,c.default.delimiter,{}),new u.CommandMap(l.default.NEW_COMMAND,{},{}),new u.EnvironmentMap(l.default.NEW_ENVIRONMENT,c.default.environment,{},{}),t.append(s.Configuration.local({handler:{character:[],delimiter:[l.default.NEW_DELIMITER],macro:[l.default.NEW_DELIMITER,l.default.NEW_COMMAND],environment:[l.default.NEW_ENVIRONMENT]},priority:-1}))}})},6793:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.BeginEnvItem=void 0;var Q=i(r(3971)),T=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),Object.defineProperty(e.prototype,"kind",{get:function(){return"beginEnv"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"isOpen",{get:function(){return!0},enumerable:!1,configurable:!0}),e.prototype.checkItem=function(e){if(e.isKind("end")){if(e.getName()!==this.getName())throw new Q.default("EnvBadEnd","\\begin{%1} ended with \\end{%2}",this.getName(),e.getName());return[[this.factory.create("mml",this.toMml())],!0]}if(e.isKind("stop"))throw new Q.default("EnvMissingEnd","Missing \\end{%1}",this.getName());return t.prototype.checkItem.call(this,e)},e}(r(8292).BaseItem);e.BeginEnvItem=T},5117:function(t,e,r){var n=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var o=n(r(1110));new(r(9140).CommandMap)("Newcommand-macros",{newcommand:"NewCommand",renewcommand:"NewCommand",newenvironment:"NewEnvironment",renewenvironment:"NewEnvironment",def:"MacroDef",let:"Let"},o.default)},1110:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return o(e,t),e},Q=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0});var T=Q(r(3971)),s=i(r(9140)),a=Q(r(7693)),l=Q(r(1130)),c=Q(r(5579)),u={NewCommand:function(t,e){var r=c.default.GetCsNameArgument(t,e),n=c.default.GetArgCount(t,e),o=t.GetBrackets(e),i=t.GetArgument(e);c.default.addMacro(t,r,u.Macro,[i,n,o])},NewEnvironment:function(t,e){var r=l.default.trimSpaces(t.GetArgument(e)),n=c.default.GetArgCount(t,e),o=t.GetBrackets(e),i=t.GetArgument(e),Q=t.GetArgument(e);c.default.addEnvironment(t,r,u.BeginEnv,[!0,i,Q,n,o])},MacroDef:function(t,e){var r=c.default.GetCSname(t,e),n=c.default.GetTemplate(t,e,"\\"+r),o=t.GetArgument(e);n instanceof Array?c.default.addMacro(t,r,u.MacroWithTemplate,[o].concat(n)):c.default.addMacro(t,r,u.Macro,[o,n])},Let:function(t,e){var r=c.default.GetCSname(t,e),n=t.GetNext();"="===n&&(t.i++,n=t.GetNext());var o=t.configuration.handlers;if("\\"!==n){t.i++;var i=o.get("delimiter").lookup(n);i?c.default.addDelimiter(t,"\\"+r,i.char,i.attributes):c.default.addMacro(t,r,u.Macro,[n])}else{e=c.default.GetCSname(t,e);var Q=o.get("delimiter").lookup("\\"+e);if(Q)return void c.default.addDelimiter(t,"\\"+r,Q.char,Q.attributes);var T=o.get("macro").applicable(e);if(!T)return;if(T instanceof s.MacroMap){var a=T.lookup(e);return void c.default.addMacro(t,r,a.func,a.args,a.symbol)}Q=T.lookup(e);var l=c.default.disassembleSymbol(r,Q);c.default.addMacro(t,r,(function(t,e){for(var r=[],n=2;n0?[i.toString()].concat(o):i;t.i++}throw new Q.default("MissingReplacementString","Missing replacement string for definition of %1",e)},t.GetParameter=function(t,r,n){if(null==n)return t.GetArgument(r);for(var o=t.i,i=0,T=0;t.i=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.NoUndefinedConfiguration=void 0;var o=r(9899);e.NoUndefinedConfiguration=o.Configuration.create("noundefined",{fallback:{macro:function(t,e){var r,o,i=t.create("text","\\"+e),Q=t.options.noundefined||{},T={};try{for(var s=n(["color","background","size"]),a=s.next();!a.done;a=s.next()){var l=a.value;Q[l]&&(T["math"+l]=Q[l])}}catch(t){r={error:t}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(r)throw r.error}}t.Push(t.create("node","mtext",[],T,i))}},options:{noundefined:{color:"red",background:"",size:""}},priority:3})},7741:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.FontData=e.NOSTRETCH=e.H=e.V=void 0;var T=r(7233);e.V=1,e.H=2,e.NOSTRETCH={dir:0};var s=function(){function t(t){var e,r,s,a;void 0===t&&(t=null),this.variant={},this.delimiters={},this.cssFontMap={},this.remapChars={},this.skewIcFactor=.75;var l=this.constructor;this.options=(0,T.userOptions)((0,T.defaultOptions)({},l.OPTIONS),t),this.params=n({},l.defaultParams),this.sizeVariants=i([],o(l.defaultSizeVariants),!1),this.stretchVariants=i([],o(l.defaultStretchVariants),!1),this.cssFontMap=n({},l.defaultCssFonts);try{for(var c=Q(Object.keys(this.cssFontMap)),u=c.next();!u.done;u=c.next()){var p=u.value;"unknown"===this.cssFontMap[p][0]&&(this.cssFontMap[p][0]=this.options.unknownFamily)}}catch(t){e={error:t}}finally{try{u&&!u.done&&(r=c.return)&&r.call(c)}finally{if(e)throw e.error}}this.cssFamilyPrefix=l.defaultCssFamilyPrefix,this.createVariants(l.defaultVariants),this.defineDelimiters(l.defaultDelimiters);try{for(var h=Q(Object.keys(l.defaultChars)),d=h.next();!d.done;d=h.next()){var f=d.value;this.defineChars(f,l.defaultChars[f])}}catch(t){s={error:t}}finally{try{d&&!d.done&&(a=h.return)&&a.call(h)}finally{if(s)throw s.error}}this.defineRemap("accent",l.defaultAccentMap),this.defineRemap("mo",l.defaultMoMap),this.defineRemap("mn",l.defaultMnMap)}return t.charOptions=function(t,e){var r=t[e];return 3===r.length&&(r[3]={}),r[3]},Object.defineProperty(t.prototype,"styles",{get:function(){return this._styles},set:function(t){this._styles=t},enumerable:!1,configurable:!0}),t.prototype.createVariant=function(t,e,r){void 0===e&&(e=null),void 0===r&&(r=null);var n={linked:[],chars:e?Object.create(this.variant[e].chars):{}};r&&this.variant[r]&&(Object.assign(n.chars,this.variant[r].chars),this.variant[r].linked.push(n.chars),n.chars=Object.create(n.chars)),this.remapSmpChars(n.chars,t),this.variant[t]=n},t.prototype.remapSmpChars=function(t,e){var r,n,i,T,s=this.constructor;if(s.VariantSmp[e]){var a=s.SmpRemap,l=[null,null,s.SmpRemapGreekU,s.SmpRemapGreekL];try{for(var c=Q(s.SmpRanges),u=c.next();!u.done;u=c.next()){var p=o(u.value,3),h=p[0],d=p[1],f=p[2],L=s.VariantSmp[e][h];if(L){for(var m=d;m<=f;m++)if(930!==m){var y=L+m-d;t[m]=this.smpChar(a[y]||y)}if(l[h])try{for(var g=(i=void 0,Q(Object.keys(l[h]).map((function(t){return parseInt(t)})))),H=g.next();!H.done;H=g.next()){t[m=H.value]=this.smpChar(L+l[h][m])}}catch(t){i={error:t}}finally{try{H&&!H.done&&(T=g.return)&&T.call(g)}finally{if(i)throw i.error}}}}}catch(t){r={error:t}}finally{try{u&&!u.done&&(n=c.return)&&n.call(c)}finally{if(r)throw r.error}}}"bold"===e&&(t[988]=this.smpChar(120778),t[989]=this.smpChar(120779))},t.prototype.smpChar=function(t){return[,,,{smp:t}]},t.prototype.createVariants=function(t){var e,r;try{for(var n=Q(t),o=n.next();!o.done;o=n.next()){var i=o.value;this.createVariant(i[0],i[1],i[2])}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}},t.prototype.defineChars=function(t,e){var r,n,o=this.variant[t];Object.assign(o.chars,e);try{for(var i=Q(o.linked),T=i.next();!T.done;T=i.next()){var s=T.value;Object.assign(s,e)}}catch(t){r={error:t}}finally{try{T&&!T.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}},t.prototype.defineDelimiters=function(t){Object.assign(this.delimiters,t)},t.prototype.defineRemap=function(t,e){this.remapChars.hasOwnProperty(t)||(this.remapChars[t]={}),Object.assign(this.remapChars[t],e)},t.prototype.getDelimiter=function(t){return this.delimiters[t]},t.prototype.getSizeVariant=function(t,e){return this.delimiters[t].variants&&(e=this.delimiters[t].variants[e]),this.sizeVariants[e]},t.prototype.getStretchVariant=function(t,e){return this.stretchVariants[this.delimiters[t].stretchv?this.delimiters[t].stretchv[e]:0]},t.prototype.getChar=function(t,e){return this.variant[t].chars[e]},t.prototype.getVariant=function(t){return this.variant[t]},t.prototype.getCssFont=function(t){return this.cssFontMap[t]||["serif",!1,!1]},t.prototype.getFamily=function(t){return this.cssFamilyPrefix?this.cssFamilyPrefix+", "+t:t},t.prototype.getRemappedChar=function(t,e){return(this.remapChars[t]||{})[e]},t.OPTIONS={unknownFamily:"serif"},t.JAX="common",t.NAME="",t.defaultVariants=[["normal"],["bold","normal"],["italic","normal"],["bold-italic","italic","bold"],["double-struck","bold"],["fraktur","normal"],["bold-fraktur","bold","fraktur"],["script","italic"],["bold-script","bold-italic","script"],["sans-serif","normal"],["bold-sans-serif","bold","sans-serif"],["sans-serif-italic","italic","sans-serif"],["sans-serif-bold-italic","bold-italic","bold-sans-serif"],["monospace","normal"]],t.defaultCssFonts={normal:["unknown",!1,!1],bold:["unknown",!1,!0],italic:["unknown",!0,!1],"bold-italic":["unknown",!0,!0],"double-struck":["unknown",!1,!0],fraktur:["unknown",!1,!1],"bold-fraktur":["unknown",!1,!0],script:["cursive",!1,!1],"bold-script":["cursive",!1,!0],"sans-serif":["sans-serif",!1,!1],"bold-sans-serif":["sans-serif",!1,!0],"sans-serif-italic":["sans-serif",!0,!1],"sans-serif-bold-italic":["sans-serif",!0,!0],monospace:["monospace",!1,!1]},t.defaultCssFamilyPrefix="",t.VariantSmp={bold:[119808,119834,120488,120514,120782],italic:[119860,119886,120546,120572],"bold-italic":[119912,119938,120604,120630],script:[119964,119990],"bold-script":[120016,120042],fraktur:[120068,120094],"double-struck":[120120,120146,,,120792],"bold-fraktur":[120172,120198],"sans-serif":[120224,120250,,,120802],"bold-sans-serif":[120276,120302,120662,120688,120812],"sans-serif-italic":[120328,120354],"sans-serif-bold-italic":[120380,120406,120720,120746],monospace:[120432,120458,,,120822]},t.SmpRanges=[[0,65,90],[1,97,122],[2,913,937],[3,945,969],[4,48,57]],t.SmpRemap={119893:8462,119965:8492,119968:8496,119969:8497,119971:8459,119972:8464,119975:8466,119976:8499,119981:8475,119994:8495,119996:8458,120004:8500,120070:8493,120075:8460,120076:8465,120085:8476,120093:8488,120122:8450,120127:8461,120133:8469,120135:8473,120136:8474,120137:8477,120145:8484},t.SmpRemapGreekU={8711:25,1012:17},t.SmpRemapGreekL={977:27,981:29,982:31,1008:28,1009:30,1013:26,8706:25},t.defaultAccentMap={768:"\u02cb",769:"\u02ca",770:"\u02c6",771:"\u02dc",772:"\u02c9",774:"\u02d8",775:"\u02d9",776:"\xa8",778:"\u02da",780:"\u02c7",8594:"\u20d7",8242:"'",8243:"''",8244:"'''",8245:"`",8246:"``",8247:"```",8279:"''''",8400:"\u21bc",8401:"\u21c0",8406:"\u2190",8417:"\u2194",8432:"*",8411:"...",8412:"....",8428:"\u21c1",8429:"\u21bd",8430:"\u2190",8431:"\u2192"},t.defaultMoMap={45:"\u2212"},t.defaultMnMap={45:"\u2212"},t.defaultParams={x_height:.442,quad:1,num1:.676,num2:.394,num3:.444,denom1:.686,denom2:.345,sup1:.413,sup2:.363,sup3:.289,sub1:.15,sub2:.247,sup_drop:.386,sub_drop:.05,delim1:2.39,delim2:1,axis_height:.25,rule_thickness:.06,big_op_spacing1:.111,big_op_spacing2:.167,big_op_spacing3:.2,big_op_spacing4:.6,big_op_spacing5:.1,surd_height:.075,scriptspace:.05,nulldelimiterspace:.12,delimiterfactor:901,delimitershortfall:.3,min_rule_thickness:1.25,separation_factor:1.75,extra_ic:.033},t.defaultDelimiters={},t.defaultChars={},t.defaultSizeVariants=[],t.defaultStretchVariants=[],t}();e.FontData=s},5552:function(t,e){var r=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonArrow=e.CommonDiagonalArrow=e.CommonDiagonalStrike=e.CommonBorder2=e.CommonBorder=e.arrowBBox=e.diagonalArrowDef=e.arrowDef=e.arrowBBoxW=e.arrowBBoxHD=e.arrowHead=e.fullBorder=e.fullPadding=e.fullBBox=e.sideNames=e.sideIndex=e.SOLID=e.PADDING=e.THICKNESS=e.ARROWY=e.ARROWDX=e.ARROWX=void 0,e.ARROWX=4,e.ARROWDX=1,e.ARROWY=2,e.THICKNESS=.067,e.PADDING=.2,e.SOLID=e.THICKNESS+"em solid",e.sideIndex={top:0,right:1,bottom:2,left:3},e.sideNames=Object.keys(e.sideIndex),e.fullBBox=function(t){return new Array(4).fill(t.thickness+t.padding)},e.fullPadding=function(t){return new Array(4).fill(t.padding)},e.fullBorder=function(t){return new Array(4).fill(t.thickness)};e.arrowHead=function(t){return Math.max(t.padding,t.thickness*(t.arrowhead.x+t.arrowhead.dx+1))};e.arrowBBoxHD=function(t,e){if(t.childNodes[0]){var r=t.childNodes[0].getBBox(),n=r.h,o=r.d;e[0]=e[2]=Math.max(0,t.thickness*t.arrowhead.y-(n+o)/2)}return e};e.arrowBBoxW=function(t,e){if(t.childNodes[0]){var r=t.childNodes[0].getBBox().w;e[1]=e[3]=Math.max(0,t.thickness*t.arrowhead.y-r/2)}return e},e.arrowDef={up:[-Math.PI/2,!1,!0,"verticalstrike"],down:[Math.PI/2,!1,!0,"verticakstrike"],right:[0,!1,!1,"horizontalstrike"],left:[Math.PI,!1,!1,"horizontalstrike"],updown:[Math.PI/2,!0,!0,"verticalstrike uparrow downarrow"],leftright:[0,!0,!1,"horizontalstrike leftarrow rightarrow"]},e.diagonalArrowDef={updiagonal:[-1,0,!1,"updiagonalstrike northeastarrow"],northeast:[-1,0,!1,"updiagonalstrike updiagonalarrow"],southeast:[1,0,!1,"downdiagonalstrike"],northwest:[1,Math.PI,!1,"downdiagonalstrike"],southwest:[-1,Math.PI,!1,"updiagonalstrike"],northeastsouthwest:[-1,0,!0,"updiagonalstrike northeastarrow updiagonalarrow southwestarrow"],northwestsoutheast:[1,0,!0,"downdiagonalstrike northwestarrow southeastarrow"]},e.arrowBBox={up:function(t){return(0,e.arrowBBoxW)(t,[(0,e.arrowHead)(t),0,t.padding,0])},down:function(t){return(0,e.arrowBBoxW)(t,[t.padding,0,(0,e.arrowHead)(t),0])},right:function(t){return(0,e.arrowBBoxHD)(t,[0,(0,e.arrowHead)(t),0,t.padding])},left:function(t){return(0,e.arrowBBoxHD)(t,[0,t.padding,0,(0,e.arrowHead)(t)])},updown:function(t){return(0,e.arrowBBoxW)(t,[(0,e.arrowHead)(t),0,(0,e.arrowHead)(t),0])},leftright:function(t){return(0,e.arrowBBoxHD)(t,[0,(0,e.arrowHead)(t),0,(0,e.arrowHead)(t)])}};e.CommonBorder=function(t){return function(r){var n=e.sideIndex[r];return[r,{renderer:t,bbox:function(t){var e=[0,0,0,0];return e[n]=t.thickness+t.padding,e},border:function(t){var e=[0,0,0,0];return e[n]=t.thickness,e}}]}};e.CommonBorder2=function(t){return function(r,n,o){var i=e.sideIndex[n],Q=e.sideIndex[o];return[r,{renderer:t,bbox:function(t){var e=t.thickness+t.padding,r=[0,0,0,0];return r[i]=r[Q]=e,r},border:function(t){var e=[0,0,0,0];return e[i]=e[Q]=t.thickness,e},remove:n+" "+o}]}};e.CommonDiagonalStrike=function(t){return function(r){var n="mjx-"+r.charAt(0)+"strike";return[r+"diagonalstrike",{renderer:t(n),bbox:e.fullBBox}]}};e.CommonDiagonalArrow=function(t){return function(n){var o=r(e.diagonalArrowDef[n],4),i=o[0],Q=o[1],T=o[2];return[n+"arrow",{renderer:function(e,n){var o=r(e.arrowAW(),2),s=o[0],a=o[1],l=e.arrow(a,i*(s-Q),T);t(e,l)},bbox:function(t){var e=t.arrowData(),n=e.a,o=e.x,i=e.y,Q=r([t.arrowhead.x,t.arrowhead.y,t.arrowhead.dx],3),T=Q[0],s=Q[1],a=Q[2],l=r(t.getArgMod(T+a,s),2),c=l[0],u=l[1],p=i+(c>n?t.thickness*u*Math.sin(c-n):0),h=o+(c>Math.PI/2-n?t.thickness*u*Math.sin(c+n-Math.PI/2):0);return[p,h,p,h]},remove:o[3]}]}};e.CommonArrow=function(t){return function(n){var o=r(e.arrowDef[n],4),i=o[0],Q=o[1],T=o[2],s=o[3];return[n+"arrow",{renderer:function(e,n){var o=e.getBBox(),s=o.w,a=o.h,l=o.d,c=r(T?[a+l,"X"]:[s,"Y"],2),u=c[0],p=c[1],h=e.getOffset(p),d=e.arrow(u,i,Q,p,h);t(e,d)},bbox:e.arrowBBox[n],remove:s}]}}},3055:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},T=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonOutputJax=void 0;var s=r(2975),a=r(4474),l=r(7233),c=r(6010),u=r(8054),p=r(4139),h=function(t){function e(e,r,n){void 0===e&&(e=null),void 0===r&&(r=null),void 0===n&&(n=null);var o=this,i=Q((0,l.separateOptions)(e,n.OPTIONS),2),T=i[0],s=i[1];return(o=t.call(this,T)||this).factory=o.options.wrapperFactory||new r,o.factory.jax=o,o.cssStyles=o.options.cssStyles||new p.CssStyles,o.font=o.options.font||new n(s),o.unknownCache=new Map,o}return o(e,t),e.prototype.typeset=function(t,e){this.setDocument(e);var r=this.createNode();return this.toDOM(t,r,e),r},e.prototype.createNode=function(){var t=this.constructor.NAME;return this.html("mjx-container",{class:"MathJax",jax:t})},e.prototype.setScale=function(t){var e=this.math.metrics.scale*this.options.scale;1!==e&&this.adaptor.setStyle(t,"fontSize",(0,c.percent)(e))},e.prototype.toDOM=function(t,e,r){void 0===r&&(r=null),this.setDocument(r),this.math=t,this.pxPerEm=t.metrics.ex/this.font.params.x_height,t.root.setTeXclass(null),this.setScale(e),this.nodeMap=new Map,this.container=e,this.processMath(t.root,e),this.nodeMap=null,this.executeFilters(this.postFilters,t,r,e)},e.prototype.getBBox=function(t,e){this.setDocument(e),this.math=t,t.root.setTeXclass(null),this.nodeMap=new Map;var r=this.factory.wrap(t.root).getOuterBBox();return this.nodeMap=null,r},e.prototype.getMetrics=function(t){var e,r;this.setDocument(t);var n=this.adaptor,o=this.getMetricMaps(t);try{for(var i=T(t.math),Q=i.next();!Q.done;Q=i.next()){var s=Q.value,l=n.parent(s.start.node);if(s.state()=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},l=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o600?"bold":"normal"),n.family?r=this.explicitVariant(n.family,n.weight,n.style):(this.node.getProperty("variantForm")&&(r="-tex-variant"),r=(e.BOLDVARIANTS[n.weight]||{})[r]||r,r=(e.ITALICVARIANTS[n.style]||{})[r]||r)}this.variant=r}},e.prototype.explicitVariant=function(t,e,r){var n=this.styles;return n||(n=this.styles=new d.Styles),n.set("fontFamily",t),e&&n.set("fontWeight",e),r&&n.set("fontStyle",r),"-explicitFont"},e.prototype.getScale=function(){var t=1,e=this.parent,r=e?e.bbox.scale:1,n=this.node.attributes,o=Math.min(n.get("scriptlevel"),2),i=n.get("fontsize"),Q=this.node.isToken||this.node.isKind("mstyle")?n.get("mathsize"):n.getInherited("mathsize");if(0!==o){t=Math.pow(n.get("scriptsizemultiplier"),o);var T=this.length2em(n.get("scriptminsize"),.8,1);t0;this.bbox.L=n.isSet("lspace")?Math.max(0,this.length2em(n.get("lspace"))):y(o,t.lspace),this.bbox.R=n.isSet("rspace")?Math.max(0,this.length2em(n.get("rspace"))):y(o,t.rspace);var i=r.childIndex(e);if(0!==i){var Q=r.childNodes[i-1];if(Q.isEmbellished){var T=this.jax.nodeMap.get(Q).getBBox();T.R&&(this.bbox.L=Math.max(0,this.bbox.L-T.R))}}}},e.prototype.getTeXSpacing=function(t,e){if(!e){var r=this.node.texSpacing();r&&(this.bbox.L=this.length2em(r))}if(t||e){var n=this.node.coreMO().attributes;n.isSet("lspace")&&(this.bbox.L=Math.max(0,this.length2em(n.get("lspace")))),n.isSet("rspace")&&(this.bbox.R=Math.max(0,this.length2em(n.get("rspace"))))}},e.prototype.isTopEmbellished=function(){return this.node.isEmbellished&&!(this.node.parent&&this.node.parent.isEmbellished)},e.prototype.core=function(){return this.jax.nodeMap.get(this.node.core())},e.prototype.coreMO=function(){return this.jax.nodeMap.get(this.node.coreMO())},e.prototype.getText=function(){var t,e,r="";if(this.node.isToken)try{for(var n=s(this.node.childNodes),o=n.next();!o.done;o=n.next()){var i=o.value;i instanceof u.TextNode&&(r+=i.getText())}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}return r},e.prototype.canStretch=function(t){if(this.stretch=L.NOSTRETCH,this.node.isEmbellished){var e=this.core();e&&e.node!==this.node&&e.canStretch(t)&&(this.stretch=e.stretch)}return 0!==this.stretch.dir},e.prototype.getAlignShift=function(){var t,e=(t=this.node.attributes).getList.apply(t,l([],a(u.indentAttributes),!1)),r=e.indentalign,n=e.indentshift,o=e.indentalignfirst,i=e.indentshiftfirst;return"indentalign"!==o&&(r=o),"auto"===r&&(r=this.jax.options.displayAlign),"indentshift"!==i&&(n=i),"auto"===n&&(n=this.jax.options.displayIndent,"right"!==r||n.match(/^\s*0[a-z]*\s*$/)||(n=("-"+n.trim()).replace(/^--/,""))),[r,this.length2em(n,this.metrics.containerWidth)]},e.prototype.getAlignX=function(t,e,r){return"right"===r?t-(e.w+e.R)*e.rscale:"left"===r?e.L*e.rscale:(t-e.w*e.rscale)/2},e.prototype.getAlignY=function(t,e,r,n,o){return"top"===o?t-r:"bottom"===o?n-e:"center"===o?(t-r-(e-n))/2:0},e.prototype.getWrapWidth=function(t){return this.childNodes[t].getBBox().w},e.prototype.getChildAlign=function(t){return"left"},e.prototype.percent=function(t){return h.percent(t)},e.prototype.em=function(t){return h.em(t)},e.prototype.px=function(t,e){return void 0===e&&(e=-h.BIGDIMEN),h.px(t,e,this.metrics.em)},e.prototype.length2em=function(t,e,r){return void 0===e&&(e=1),void 0===r&&(r=null),null===r&&(r=this.bbox.scale),h.length2em(t,e,r,this.jax.pxPerEm)},e.prototype.unicodeChars=function(t,e){void 0===e&&(e=this.variant);var r=(0,p.unicodeChars)(t),n=this.font.getVariant(e);if(n&&n.chars){var o=n.chars;r=r.map((function(t){return((o[t]||[])[3]||{}).smp||t}))}return r},e.prototype.remapChars=function(t){return t},e.prototype.mmlText=function(t){return this.node.factory.create("text").setText(t)},e.prototype.mmlNode=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.node.factory.create(t,e,r)},e.prototype.createMo=function(t){var e=this.node.factory,r=e.create("text").setText(t),n=e.create("mo",{stretchy:!0},[r]);n.inheritAttributesFrom(this.node);var o=this.wrap(n);return o.parent=this,o},e.prototype.getVariantChar=function(t,e){var r=this.font.getChar(t,e)||[0,0,0,{unknown:!0}];return 3===r.length&&(r[3]={}),r},e.kind="unknown",e.styles={},e.removeStyles=["fontSize","fontFamily","fontWeight","fontStyle","fontVariant","font"],e.skipAttributes={fontfamily:!0,fontsize:!0,fontweight:!0,fontstyle:!0,color:!0,background:!0,class:!0,href:!0,style:!0,xmlns:!0},e.BOLDVARIANTS={bold:{normal:"bold",italic:"bold-italic",fraktur:"bold-fraktur",script:"bold-script","sans-serif":"bold-sans-serif","sans-serif-italic":"sans-serif-bold-italic"},normal:{bold:"normal","bold-italic":"italic","bold-fraktur":"fraktur","bold-script":"script","bold-sans-serif":"sans-serif","sans-serif-bold-italic":"sans-serif-italic"}},e.ITALICVARIANTS={italic:{normal:"italic",bold:"bold-italic","sans-serif":"sans-serif-italic","bold-sans-serif":"sans-serif-bold-italic"},normal:{italic:"normal","bold-italic":"bold","sans-serif-italic":"sans-serif","sans-serif-bold-italic":"bold-sans-serif"}},e}(c.AbstractWrapper);e.CommonWrapper=g},4420:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonWrapperFactory=void 0;var i=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.jax=null,e}return o(e,t),Object.defineProperty(e.prototype,"Wrappers",{get:function(){return this.node},enumerable:!1,configurable:!0}),e.defaultNodes={},e}(r(3811).AbstractWrapperFactory);e.CommonWrapperFactory=i},9800:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonTeXAtomMixin=void 0;var i=r(9007);e.CommonTeXAtomMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.computeBBox=function(e,r){if(void 0===r&&(r=!1),t.prototype.computeBBox.call(this,e,r),this.childNodes[0]&&this.childNodes[0].bbox.ic&&(e.ic=this.childNodes[0].bbox.ic),this.node.texClass===i.TEXCLASS.VCENTER){var n=e.h,o=(n+e.d)/2+this.font.params.axis_height-n;e.h+=o,e.d-=o}},e}(t)}},1160:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonTextNodeMixin=void 0,e.CommonTextNodeMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.computeBBox=function(t,e){var r,n;void 0===e&&(e=!1);var Q=this.parent.variant,T=this.node.getText();if("-explicitFont"===Q){var s=this.jax.getFontData(this.parent.styles),a=this.jax.measureText(T,Q,s),l=a.w,c=a.h,u=a.d;t.h=c,t.d=u,t.w=l}else{var p=this.remappedText(T,Q);t.empty();try{for(var h=o(p),d=h.next();!d.done;d=h.next()){var f=d.value,L=i(this.getVariantChar(Q,f),4),m=(c=L[0],u=L[1],l=L[2],L[3]);if(m.unknown){var y=this.jax.measureText(String.fromCodePoint(f),Q);l=y.w,c=y.h,u=y.d}t.w+=l,c>t.h&&(t.h=c),u>t.d&&(t.d=u),t.ic=m.ic||0,t.sk=m.sk||0,t.dx=m.dx||0}}catch(t){r={error:t}}finally{try{d&&!d.done&&(n=h.return)&&n.call(h)}finally{if(r)throw r.error}}p.length>1&&(t.sk=0),t.clean()}},e.prototype.remappedText=function(t,e){var r=this.parent.stretch.c;return r?[r]:this.parent.remapChars(this.unicodeChars(t,e))},e.prototype.getStyles=function(){},e.prototype.getVariant=function(){},e.prototype.getScale=function(){},e.prototype.getSpace=function(){},e}(t)}},1956:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},a=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMencloseMixin=void 0;var c=T(r(5552)),u=r(505);e.CommonMencloseMixin=function(t){return function(t){function e(){for(var e=[],r=0;r.001?Q:0},e.prototype.getArgMod=function(t,e){return[Math.atan2(e,t),Math.sqrt(t*t+e*e)]},e.prototype.arrow=function(t,e,r,n,o){return void 0===n&&(n=""),void 0===o&&(o=0),null},e.prototype.arrowData=function(){var t=s([this.padding,this.thickness],2),e=t[0],r=t[1]*(this.arrowhead.x+Math.max(1,this.arrowhead.dx)),n=this.childNodes[0].getBBox(),o=n.h,i=n.d,Q=n.w,T=o+i,a=Math.sqrt(T*T+Q*Q),l=Math.max(e,r*Q/a),c=Math.max(e,r*T/a),u=s(this.getArgMod(Q+2*l,T+2*c),2);return{a:u[0],W:u[1],x:l,y:c}},e.prototype.arrowAW=function(){var t=this.childNodes[0].getBBox(),e=t.h,r=t.d,n=t.w,o=s(this.TRBL,4),i=o[0],Q=o[1],T=o[2],a=o[3];return this.getArgMod(a+n+Q,i+e+r+T)},e.prototype.createMsqrt=function(t){var e=this.node.factory.create("msqrt");e.inheritAttributesFrom(this.node),e.childNodes[0]=t.node;var r=this.wrap(e);return r.parent=this,r},e.prototype.sqrtTRBL=function(){var t=this.msqrt.getBBox(),e=this.msqrt.childNodes[0].getBBox();return[t.h-e.h,0,t.d-e.d,t.w-e.w]},e}(t)}},7555:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMfencedMixin=void 0,e.CommonMfencedMixin=function(t){return function(t){function e(){for(var e=[],r=0;r0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMmultiscriptsMixin=e.ScriptNames=e.NextScript=void 0;var s=r(6469);e.NextScript={base:"subList",subList:"supList",supList:"subList",psubList:"psupList",psupList:"psubList"},e.ScriptNames=["sup","sup","psup","psub"],e.CommonMmultiscriptsMixin=function(t){return function(t){function r(){for(var e=[],r=0;re.length&&e.push(s.BBox.empty())},r.prototype.combineBBoxLists=function(t,e,r,n){for(var o=0;ot.h&&(t.h=s),a>t.d&&(t.d=a),u>e.h&&(e.h=u),p>e.d&&(e.d=p)}},r.prototype.getScaledWHD=function(t){var e=t.w,r=t.h,n=t.d,o=t.rscale;return[e*o,r*o,n*o]},r.prototype.getUVQ=function(e,r){var n;if(!this.UVQ){var o=i([0,0,0],3),Q=o[0],T=o[1],s=o[2];0===e.h&&0===e.d?Q=this.getU():0===r.h&&0===r.d?Q=-this.getV():(Q=(n=i(t.prototype.getUVQ.call(this,e,r),3))[0],T=n[1],s=n[2]),this.UVQ=[Q,T,s]}return this.UVQ},r}(t)}},5023:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMnMixin=void 0,e.CommonMnMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.remapChars=function(t){if(t.length){var e=this.font.getRemappedChar("mn",t[0]);if(e){var r=this.unicodeChars(e,this.variant);1===r.length?t[0]=r[0]:t=r.concat(t.slice(1))}}return t},e}(t)}},7096:function(t,e,r){var n,o,i=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),Q=this&&this.__assign||function(){return Q=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},s=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMoMixin=e.DirectionVH=void 0;var l=r(6469),c=r(505),u=r(5884);e.DirectionVH=((o={})[1]="v",o[2]="h",o),e.CommonMoMixin=function(t){return function(t){function e(){for(var e=[],r=0;r=0)&&(t.w=0)},e.prototype.protoBBox=function(e){var r=0!==this.stretch.dir;r&&null===this.size&&this.getStretchedVariant([0]),r&&this.size<0||(t.prototype.computeBBox.call(this,e),this.copySkewIC(e))},e.prototype.getAccentOffset=function(){var t=l.BBox.empty();return this.protoBBox(t),-t.w/2},e.prototype.getCenterOffset=function(e){return void 0===e&&(e=null),e||(e=l.BBox.empty(),t.prototype.computeBBox.call(this,e)),(e.h+e.d)/2+this.font.params.axis_height-e.h},e.prototype.getVariant=function(){this.node.attributes.get("largeop")?this.variant=this.node.attributes.get("displaystyle")?"-largeop":"-smallop":this.node.attributes.getExplicit("mathvariant")||!1!==this.node.getProperty("pseudoscript")?t.prototype.getVariant.call(this):this.variant="-tex-variant"},e.prototype.canStretch=function(t){if(0!==this.stretch.dir)return this.stretch.dir===t;if(!this.node.attributes.get("stretchy"))return!1;var e=this.getText();if(1!==Array.from(e).length)return!1;var r=this.font.getDelimiter(e.codePointAt(0));return this.stretch=r&&r.dir===t?r:u.NOSTRETCH,0!==this.stretch.dir},e.prototype.getStretchedVariant=function(t,e){var r,n;if(void 0===e&&(e=!1),0!==this.stretch.dir){var o=this.getWH(t),i=this.getSize("minsize",0),T=this.getSize("maxsize",1/0),s=this.node.getProperty("mathaccent");o=Math.max(i,Math.min(T,o));var l=this.font.params.delimiterfactor/1e3,c=this.font.params.delimitershortfall,u=i||e?o:s?Math.min(o/l,o+c):Math.max(o*l,o-c),p=this.stretch,h=p.c||this.getText().codePointAt(0),d=0;if(p.sizes)try{for(var f=a(p.sizes),L=f.next();!L.done;L=f.next()){if(L.value>=u)return s&&d&&d--,this.variant=this.font.getSizeVariant(h,d),this.size=d,void(p.schar&&p.schar[d]&&(this.stretch=Q(Q({},this.stretch),{c:p.schar[d]})));d++}}catch(t){r={error:t}}finally{try{L&&!L.done&&(n=f.return)&&n.call(f)}finally{if(r)throw r.error}}p.stretch?(this.size=-1,this.invalidateBBox(),this.getStretchBBox(t,this.checkExtendedHeight(o,p),p)):(this.variant=this.font.getSizeVariant(h,d-1),this.size=d-1)}},e.prototype.getSize=function(t,e){var r=this.node.attributes;return r.isSet(t)&&(e=this.length2em(r.get(t),1,1)),e},e.prototype.getWH=function(t){if(0===t.length)return 0;if(1===t.length)return t[0];var e=T(t,2),r=e[0],n=e[1],o=this.font.params.axis_height;return this.node.attributes.get("symmetric")?2*Math.max(r-o,n+o):r+n},e.prototype.getStretchBBox=function(t,e,r){var n;r.hasOwnProperty("min")&&r.min>e&&(e=r.min);var o=T(r.HDW,3),i=o[0],Q=o[1],s=o[2];1===this.stretch.dir?(i=(n=T(this.getBaseline(t,e,r),2))[0],Q=n[1]):s=e,this.bbox.h=i,this.bbox.d=Q,this.bbox.w=s},e.prototype.getBaseline=function(t,e,r){var n=2===t.length&&t[0]+t[1]===e,o=this.node.attributes.get("symmetric"),i=T(n?t:[e,0],2),Q=i[0],s=i[1],a=T([Q+s,0],2),l=a[0],c=a[1];if(o){var u=this.font.params.axis_height;n&&(l=2*Math.max(Q-u,s+u)),c=l/2-u}else if(n)c=s;else{var p=T(r.HDW||[.75,.25],2),h=p[0],d=p[1];c=d*(l/(h+d))}return[l-c,c]},e.prototype.checkExtendedHeight=function(t,e){if(e.fullExt){var r=T(e.fullExt,2),n=r[0],o=r[1];t=o+Math.ceil(Math.max(0,t-o)/n)*n}return t},e.prototype.remapChars=function(t){var e=this.node.getProperty("primes");if(e)return(0,c.unicodeChars)(e);if(1===t.length){var r=this.node.coreParent().parent,n=this.isAccent&&!r.isKind("mrow")?"accent":"mo",o=this.font.getRemappedChar(n,t[0]);o&&(t=this.unicodeChars(o,this.variant))}return t},e}(t)}},6898:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMpaddedMixin=void 0,e.CommonMpaddedMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getDimens=function(){var t=this.node.attributes.getList("width","height","depth","lspace","voffset"),e=this.childNodes[0].getBBox(),r=e.w,n=e.h,o=e.d,i=r,Q=n,T=o,s=0,a=0,l=0;""!==t.width&&(r=this.dimen(t.width,e,"w",0)),""!==t.height&&(n=this.dimen(t.height,e,"h",0)),""!==t.depth&&(o=this.dimen(t.depth,e,"d",0)),""!==t.voffset&&(a=this.dimen(t.voffset,e)),""!==t.lspace&&(s=this.dimen(t.lspace,e));var c=this.node.attributes.get("data-align");return c&&(l=this.getAlignX(r,e,c)),[Q,T,i,n-Q,o-T,r-i,s,a,l]},e.prototype.dimen=function(t,e,r,n){void 0===r&&(r=""),void 0===n&&(n=null);var o=(t=String(t)).match(/width|height|depth/),i=o?e[o[0].charAt(0)]:r?e[r]:0,Q=this.length2em(t,i)||0;return t.match(/^[-+]/)&&r&&(Q+=i),null!=n&&(Q=Math.max(n,Q)),Q},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=o(this.getDimens(),6),n=r[0],i=r[1],Q=r[2],T=r[3],s=r[4],a=r[5];t.w=Q+a,t.h=n+T,t.d=i+s,this.setChildPWidths(e,t.w)},e.prototype.getWrapWidth=function(t){return this.getBBox().w},e.prototype.getChildAlign=function(t){return this.node.attributes.get("data-align")||"left"},e}(t)}},9086:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMrootMixin=void 0,e.CommonMrootMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"surd",{get:function(){return 2},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"root",{get:function(){return 1},enumerable:!1,configurable:!0}),e.prototype.combineRootBBox=function(t,e,r){var n=this.childNodes[this.root].getOuterBBox(),o=this.getRootDimens(e,r)[1];t.combine(n,0,o)},e.prototype.getRootDimens=function(t,e){var r=this.childNodes[this.surd],n=this.childNodes[this.root].getOuterBBox(),o=(r.size<0?.5:.6)*t.w,i=n.w,Q=n.rscale,T=Math.max(i,o/Q),s=Math.max(0,T-i);return[T*Q-o,this.rootHeight(n,t,r.size,e),s]},e.prototype.rootHeight=function(t,e,r,n){var o=e.h+e.d;return(r<0?1.9:.55*o)-(o-n)+Math.max(0,t.d*t.rscale)},e}(t)}},8411:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonInferredMrowMixin=e.CommonMrowMixin=void 0;var s=r(6469);e.CommonMrowMixin=function(t){return function(t){function e(){for(var e,r,n=[],o=0;o1){var u=0,p=0,h=l>1&&l===c;try{for(var d=T(this.childNodes),f=d.next();!f.done;f=d.next()){var L=0===(M=f.value).stretch.dir;if(h||L){var m=M.getOuterBBox(L),y=m.h,g=m.d,H=m.rscale;(y*=H)>u&&(u=y),(g*=H)>p&&(p=g)}}}catch(t){r={error:t}}finally{try{f&&!f.done&&(n=d.return)&&n.call(d)}finally{if(r)throw r.error}}try{for(var b=T(Q),v=b.next();!v.done;v=b.next()){var M;(M=v.value).coreMO().getStretchedVariant([u,p])}}catch(t){o={error:t}}finally{try{v&&!v.done&&(i=b.return)&&i.call(b)}finally{if(o)throw o.error}}}},e}(t)},e.CommonInferredMrowMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.getScale=function(){this.bbox.scale=this.parent.bbox.scale,this.bbox.rscale=1},e}(t)}},4126:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;othis.surdH?(t.h+t.d-(this.surdH-2*e-r/2))/2:e+r/4]},e.prototype.getRootDimens=function(t,e){return[0,0,0,0]},e}(t)}},905:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMsubsupMixin=e.CommonMsupMixin=e.CommonMsubMixin=void 0,e.CommonMsubMixin=function(t){var e;return e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.sub]},enumerable:!1,configurable:!0}),e.prototype.getOffset=function(){return[0,-this.getV()]},e}(t),e.useIC=!1,e},e.CommonMsupMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"scriptChild",{get:function(){return this.childNodes[this.node.sup]},enumerable:!1,configurable:!0}),e.prototype.getOffset=function(){return[this.getAdjustedIc()-(this.baseRemoveIc?0:this.baseIc),this.getU()]},e}(t)},e.CommonMsubsupMixin=function(t){var e;return e=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.UVQ=null,e}return n(e,t),Object.defineProperty(e.prototype,"subChild",{get:function(){return this.childNodes[this.node.sub]},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"supChild",{get:function(){return this.childNodes[this.node.sup]},enumerable:!1,configurable:!0}),e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.baseChild.getOuterBBox(),n=o([this.subChild.getOuterBBox(),this.supChild.getOuterBBox()],2),i=n[0],Q=n[1];t.empty(),t.append(r);var T=this.getBaseWidth(),s=this.getAdjustedIc(),a=o(this.getUVQ(),2),l=a[0],c=a[1];t.combine(i,T,c),t.combine(Q,T+s,l),t.w+=this.font.params.scriptspace,t.clean(),this.setChildPWidths(e)},e.prototype.getUVQ=function(t,e){void 0===t&&(t=this.subChild.getOuterBBox()),void 0===e&&(e=this.supChild.getOuterBBox());var r=this.baseCore.getOuterBBox();if(this.UVQ)return this.UVQ;var n=this.font.params,i=3*n.rule_thickness,Q=this.length2em(this.node.attributes.get("subscriptshift"),n.sub2),T=this.baseCharZero(r.d*this.baseScale+n.sub_drop*t.rscale),s=o([this.getU(),Math.max(T,Q)],2),a=s[0],l=s[1],c=a-e.d*e.rscale-(t.h*t.rscale-l);if(c0&&(a+=u,l-=u)}return a=Math.max(this.length2em(this.node.attributes.get("superscriptshift"),a),a),l=Math.max(this.length2em(this.node.attributes.get("subscriptshift"),l),l),c=a-e.d*e.rscale-(t.h*t.rscale-l),this.UVQ=[a,-l,c],this.UVQ},e}(t),e.useIC=!1,e}},6237:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtableMixin=void 0;var s=r(6469),a=r(505),l=r(7875);e.CommonMtableMixin=function(t){return function(t){function e(){for(var e=[],r=0;r1){if(null===e){e=0;var h=u>1&&u===p;try{for(var d=T(this.tableRows),f=d.next();!f.done;f=d.next()){var L;if(L=f.value.getChild(t)){var m=0===(b=L.childNodes[0]).stretch.dir;if(h||m){var y=b.getBBox(m).w;y>e&&(e=y)}}}}catch(t){o={error:t}}finally{try{f&&!f.done&&(i=d.return)&&i.call(d)}finally{if(o)throw o.error}}}try{for(var g=T(a),H=g.next();!H.done;H=g.next()){var b;(b=H.value).coreMO().getStretchedVariant([e])}}catch(t){Q={error:t}}finally{try{H&&!H.done&&(s=g.return)&&s.call(g)}finally{if(Q)throw Q.error}}}},e.prototype.getTableData=function(){if(this.data)return this.data;for(var t=new Array(this.numRows).fill(0),e=new Array(this.numRows).fill(0),r=new Array(this.numCols).fill(0),n=new Array(this.numRows),o=new Array(this.numRows),i=[0],Q=this.tableRows,T=0;To[r]&&(o[r]=a),l>i[r]&&(i[r]=l),p>T&&(T=p),Q&&c>Q[e]&&(Q[e]=c),T},e.prototype.extendHD=function(t,e,r,n){var o=(n-(e[t]+r[t]))/2;o<1e-5||(e[t]+=o,r[t]+=o)},e.prototype.recordPWidthCell=function(t,e){t.childNodes[0]&&t.childNodes[0].getBBox().pwidth&&this.pwidthCells.push([t,e])},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r,n,o=this.getTableData(),Q=o.H,T=o.D;if(this.node.attributes.get("equalrows")){var s=this.getEqualRowHeight();r=(0,l.sum)([].concat(this.rLines,this.rSpace))+s*this.numRows}else r=(0,l.sum)(Q.concat(T,this.rLines,this.rSpace));r+=2*(this.fLine+this.fSpace[1]);var c=this.getComputedWidths();n=(0,l.sum)(c.concat(this.cLines,this.cSpace))+2*(this.fLine+this.fSpace[0]);var u=this.node.attributes.get("width");"auto"!==u&&(n=Math.max(this.length2em(u,0)+2*this.fLine,n));var p=i(this.getBBoxHD(r),2),h=p[0],d=p[1];t.h=h,t.d=d,t.w=n;var f=i(this.getBBoxLR(),2),L=f[0],m=f[1];t.L=L,t.R=m,(0,a.isPercent)(u)||this.setColumnPWidths()},e.prototype.setChildPWidths=function(t,e,r){var n=this.node.attributes.get("width");if(!(0,a.isPercent)(n))return!1;this.hasLabels||(this.bbox.pwidth="",this.container.bbox.pwidth="");var o=this.bbox,i=o.w,Q=o.L,T=o.R,s=this.node.attributes.get("data-width-includes-label"),c=Math.max(i,this.length2em(n,Math.max(e,Q+i+T)))-(s?Q+T:0),u=this.node.attributes.get("equalcolumns")?Array(this.numCols).fill(this.percent(1/Math.max(1,this.numCols))):this.getColumnAttributes("columnwidth",0);this.cWidths=this.getColumnWidthsFixed(u,c);var p=this.getComputedWidths();return this.pWidth=(0,l.sum)(p.concat(this.cLines,this.cSpace))+2*(this.fLine+this.fSpace[0]),this.isTop&&(this.bbox.w=this.pWidth),this.setColumnPWidths(),this.pWidth!==i&&this.parent.invalidateBBox(),this.pWidth!==i},e.prototype.setColumnPWidths=function(){var t,e,r=this.cWidths;try{for(var n=T(this.pwidthCells),o=n.next();!o.done;o=n.next()){var Q=i(o.value,2),s=Q[0],a=Q[1];s.setChildPWidths(!1,r[a])&&(s.invalidateBBox(),s.getBBox())}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.getBBoxHD=function(t){var e=i(this.getAlignmentRow(),2),r=e[0],n=e[1];if(null===n){var o=this.font.params.axis_height,Q=t/2;return{top:[0,t],center:[Q,Q],bottom:[t,0],baseline:[Q,Q],axis:[Q+o,Q-o]}[r]||[Q,Q]}var T=this.getVerticalPosition(n,r);return[T,t-T]},e.prototype.getBBoxLR=function(){if(this.hasLabels){var t=this.node.attributes,e=t.get("side"),r=i(this.getPadAlignShift(e),2),n=r[0],o=r[1],Q=this.hasLabels&&!!t.get("data-width-includes-label");return Q&&this.frame&&this.fSpace[0]&&(n-=this.fSpace[0]),"center"!==o||Q?"left"===e?[n,0]:[0,n]:[n,n]}return[0,0]},e.prototype.getPadAlignShift=function(t){var e=this.getTableData().L+this.length2em(this.node.attributes.get("minlabelspacing")),r=i(null==this.styles?["",""]:[this.styles.get("padding-left"),this.styles.get("padding-right")],2),n=r[0],o=r[1];(n||o)&&(e=Math.max(e,this.length2em(n||"0"),this.length2em(o||"0")));var Q=i(this.getAlignShift(),2),T=Q[0],s=Q[1];return T===t&&(s="left"===t?Math.max(e,s)-e:Math.min(-e,s)+e),[e,T,s]},e.prototype.getAlignShift=function(){return this.isTop?t.prototype.getAlignShift.call(this):[this.container.getChildAlign(this.containerI),0]},e.prototype.getWidth=function(){return this.pWidth||this.getBBox().w},e.prototype.getEqualRowHeight=function(){var t=this.getTableData(),e=t.H,r=t.D,n=Array.from(e.keys()).map((function(t){return e[t]+r[t]}));return Math.max.apply(Math,n)},e.prototype.getComputedWidths=function(){var t=this,e=this.getTableData().W,r=Array.from(e.keys()).map((function(r){return"number"==typeof t.cWidths[r]?t.cWidths[r]:e[r]}));return this.node.attributes.get("equalcolumns")&&(r=Array(r.length).fill((0,l.max)(r))),r},e.prototype.getColumnWidths=function(){var t=this.node.attributes.get("width");if(this.node.attributes.get("equalcolumns"))return this.getEqualColumns(t);var e=this.getColumnAttributes("columnwidth",0);return"auto"===t?this.getColumnWidthsAuto(e):(0,a.isPercent)(t)?this.getColumnWidthsPercent(e):this.getColumnWidthsFixed(e,this.length2em(t))},e.prototype.getEqualColumns=function(t){var e,r=Math.max(1,this.numCols);if("auto"===t){var n=this.getTableData().W;e=(0,l.max)(n)}else if((0,a.isPercent)(t))e=this.percent(1/r);else{var o=(0,l.sum)([].concat(this.cLines,this.cSpace))+2*this.fSpace[0];e=Math.max(0,this.length2em(t)-o)/r}return Array(this.numCols).fill(e)},e.prototype.getColumnWidthsAuto=function(t){var e=this;return t.map((function(t){return"auto"===t||"fit"===t?null:(0,a.isPercent)(t)?t:e.length2em(t)}))},e.prototype.getColumnWidthsPercent=function(t){var e=this,r=t.indexOf("fit")>=0,n=(r?this.getTableData():{W:null}).W;return Array.from(t.keys()).map((function(o){var i=t[o];return"fit"===i?null:"auto"===i?r?n[o]:null:(0,a.isPercent)(i)?i:e.length2em(i)}))},e.prototype.getColumnWidthsFixed=function(t,e){var r=this,n=Array.from(t.keys()),o=n.filter((function(e){return"fit"===t[e]})),i=n.filter((function(e){return"auto"===t[e]})),Q=o.length||i.length,T=(Q?this.getTableData():{W:null}).W,s=e-(0,l.sum)([].concat(this.cLines,this.cSpace))-2*this.fSpace[0],a=s;n.forEach((function(e){var n=t[e];a-="fit"===n||"auto"===n?T[e]:r.length2em(n,s)}));var c=Q&&a>0?a/Q:0;return n.map((function(e){var n=t[e];return"fit"===n?T[e]+c:"auto"===n?T[e]+(0===o.length?c:0):r.length2em(n,s)}))},e.prototype.getVerticalPosition=function(t,e){for(var r=this.node.attributes.get("equalrows"),n=this.getTableData(),o=n.H,Q=n.D,T=r?this.getEqualRowHeight():0,s=this.getRowHalfSpacing(),a=this.fLine,l=0;lthis.numRows?null:n-1]},e.prototype.getColumnAttributes=function(t,e){void 0===e&&(e=1);var r=this.numCols-e,n=this.getAttributeArray(t);if(0===n.length)return null;for(;n.lengthr&&n.splice(r),n},e.prototype.getRowAttributes=function(t,e){void 0===e&&(e=1);var r=this.numRows-e,n=this.getAttributeArray(t);if(0===n.length)return null;for(;n.lengthr&&n.splice(r),n},e.prototype.getAttributeArray=function(t){var e=this.node.attributes.get(t);return e?(0,a.split)(e):[this.node.attributes.getDefault(t)]},e.prototype.addEm=function(t,e){var r=this;return void 0===e&&(e=1),t?t.map((function(t){return r.em(t/e)})):null},e.prototype.convertLengths=function(t){var e=this;return t?t.map((function(t){return e.length2em(t)})):null},e}(t)}},5164:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtdMixin=void 0,e.CommonMtdMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),e.prototype.invalidateBBox=function(){this.bboxComputed=!1},e.prototype.getWrapWidth=function(t){var e=this.parent.parent,r=this.parent,n=this.node.childPosition()-(r.labeled?1:0);return"number"==typeof e.cWidths[n]?e.cWidths[n]:e.getTableData().W[n]},e.prototype.getChildAlign=function(t){return this.node.attributes.get("columnalign")},e}(t)}},6319:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMtextMixin=void 0,e.CommonMtextMixin=function(t){var e;return e=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.getVariant=function(){var e=this.jax.options,r=this.jax.math.outputData,n=(!!r.merrorFamily||!!e.merrorFont)&&this.node.Parent.isKind("merror");if(r.mtextFamily||e.mtextFont||n){var o=this.node.attributes.get("mathvariant"),i=this.constructor.INHERITFONTS[o]||this.jax.font.getCssFont(o),Q=i[0]||(n?r.merrorFamily||e.merrorFont:r.mtextFamily||e.mtextFont);this.variant=this.explicitVariant(Q,i[2]?"bold":"",i[1]?"italic":"")}else t.prototype.getVariant.call(this)},e}(t),e.INHERITFONTS={normal:["",!1,!1],bold:["",!1,!0],italic:["",!0,!1],"bold-italic":["",!0,!0]},e}},5766:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonMlabeledtrMixin=e.CommonMtrMixin=void 0,e.CommonMtrMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"fixesPWidth",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"numCells",{get:function(){return this.childNodes.length},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"labeled",{get:function(){return!1},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tableCells",{get:function(){return this.childNodes},enumerable:!1,configurable:!0}),e.prototype.getChild=function(t){return this.childNodes[t]},e.prototype.getChildBBoxes=function(){return this.childNodes.map((function(t){return t.getBBox()}))},e.prototype.stretchChildren=function(t){var e,r,n,i,Q,T;void 0===t&&(t=null);var s=[],a=this.labeled?this.childNodes.slice(1):this.childNodes;try{for(var l=o(a),c=l.next();!c.done;c=l.next()){(_=c.value.childNodes[0]).canStretch(1)&&s.push(_)}}catch(t){e={error:t}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(e)throw e.error}}var u=s.length,p=this.childNodes.length;if(u&&p>1){if(null===t){var h=0,d=0,f=u>1&&u===p;try{for(var L=o(a),m=L.next();!m.done;m=L.next()){var y=0===(_=m.value.childNodes[0]).stretch.dir;if(f||y){var g=_.getBBox(y),H=g.h,b=g.d;H>h&&(h=H),b>d&&(d=b)}}}catch(t){n={error:t}}finally{try{m&&!m.done&&(i=L.return)&&i.call(L)}finally{if(n)throw n.error}}t=[h,d]}try{for(var v=o(s),M=v.next();!M.done;M=v.next()){var _;(_=M.value).coreMO().getStretchedVariant(t)}}catch(t){Q={error:t}}finally{try{M&&!M.done&&(T=v.return)&&T.call(v)}finally{if(Q)throw Q.error}}}},e}(t)},e.CommonMlabeledtrMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),Object.defineProperty(e.prototype,"numCells",{get:function(){return Math.max(0,this.childNodes.length-1)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"labeled",{get:function(){return!0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"tableCells",{get:function(){return this.childNodes.slice(1)},enumerable:!1,configurable:!0}),e.prototype.getChild=function(t){return this.childNodes[t+1]},e.prototype.getChildBBoxes=function(){return this.childNodes.slice(1).map((function(t){return t.getBBox()}))},e}(t)}},1971:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CommonScriptbaseMixin=void 0;var s=r(9007);e.CommonScriptbaseMixin=function(t){var e;return e=function(t){function e(){for(var e=[],r=0;r1){var u=0,p=l>1&&l===c;try{for(var h=T(this.childNodes),d=h.next();!d.done;d=h.next()){var f=0===(b=d.value).stretch.dir;if(p||f){var L=b.getOuterBBox(f),m=L.w,y=L.rscale;m*y>u&&(u=m*y)}}}catch(t){r={error:t}}finally{try{d&&!d.done&&(n=h.return)&&n.call(h)}finally{if(r)throw r.error}}try{for(var g=T(Q),H=g.next();!H.done;H=g.next()){var b;(b=H.value).coreMO().getStretchedVariant([u/b.bbox.rscale])}}catch(t){o={error:t}}finally{try{H&&!H.done&&(i=g.return)&&i.call(g)}finally{if(o)throw o.error}}}},e}(t),e.useIC=!0,e}},5806:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)});Object.defineProperty(e,"__esModule",{value:!0}),e.CommonSemanticsMixin=void 0,e.CommonSemanticsMixin=function(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return n(e,t),e.prototype.computeBBox=function(t,e){if(void 0===e&&(e=!1),this.childNodes.length){var r=this.childNodes[0].getBBox(),n=r.w,o=r.h,i=r.d;t.w=n,t.h=o,t.d=i}},e}(t)}},5920:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__assign||function(){return o=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SVG=e.XLINKNS=e.SVGNS=void 0;var T=r(3055),s=r(7826),a=r(42),l=r(2597),c=r(505),u=r(6010);e.SVGNS="http://www.w3.org/2000/svg",e.XLINKNS="http://www.w3.org/1999/xlink";var p=function(t){function r(e){void 0===e&&(e=null);var r=t.call(this,e,s.SVGWrapperFactory,a.TeXFont)||this;return r.minwidth=0,r.shift=0,r.container=null,r.svgStyles=null,r.fontCache=new l.FontCache(r),r}return o(r,t),r.prototype.initialize=function(){"global"===this.options.fontCache&&this.fontCache.clearCache()},r.prototype.clearFontCache=function(){this.fontCache.clearCache()},r.prototype.reset=function(){this.clearFontCache()},r.prototype.setScale=function(t){1!==this.options.scale&&this.adaptor.setStyle(t,"fontSize",(0,u.percent)(this.options.scale))},r.prototype.escaped=function(t,e){return this.setDocument(e),this.html("span",{},[this.text(t.math)])},r.prototype.styleSheet=function(e){if(this.svgStyles)return this.svgStyles;var n=this.svgStyles=t.prototype.styleSheet.call(this,e);return this.adaptor.setAttribute(n,"id",r.STYLESHEETID),n},r.prototype.pageElements=function(t){return"global"!==this.options.fontCache||this.findCache(t)?null:this.svg("svg",{id:r.FONTCACHEID,style:{display:"none"}},[this.fontCache.getCache()])},r.prototype.findCache=function(t){for(var e=this.adaptor,n=e.tags(e.body(t.document),"svg"),o=n.length-1;o>=0;o--)if(this.adaptor.getAttribute(n[o],"id")===r.FONTCACHEID)return!0;return!1},r.prototype.processMath=function(t,e){var r=this.container;this.container=e;var n=this.factory.wrap(t),o=Q(this.createRoot(n),2),i=o[0],T=o[1];this.typesetSVG(n,i,T),this.container=r},r.prototype.createRoot=function(t){var r=t.getOuterBBox(),n=r.w,o=r.h,i=r.d,Q=r.pwidth,T=t.metrics.em/1e3,s=Math.max(n,T),a=Math.max(o+i,T),l=this.svg("g",{stroke:"currentColor",fill:"currentColor","stroke-width":0,transform:"scale(1,-1)"}),c=this.adaptor,u=c.append(this.container,this.svg("svg",{xmlns:e.SVGNS,width:this.ex(s),height:this.ex(a),role:"img",focusable:!1,style:{"vertical-align":this.ex(-i)},viewBox:[0,this.fixed(1e3*-o,1),this.fixed(1e3*s,1),this.fixed(1e3*a,1)].join(" ")},[l]));if(.001===s&&(c.setAttribute(u,"preserveAspectRatio","xMidYMid slice"),n<0&&c.setStyle(this.container,"margin-right",this.ex(n))),Q){c.setStyle(u,"min-width",this.ex(s)),c.setAttribute(u,"width",Q),c.removeAttribute(u,"viewBox");var p=this.fixed(t.metrics.ex/(1e3*this.font.params.x_height),6);c.setAttribute(l,"transform","scale(".concat(p,",-").concat(p,") translate(0, ").concat(this.fixed(1e3*-o,1),")"))}return"none"!==this.options.fontCache&&c.setAttribute(u,"xmlns:xlink",e.XLINKNS),[u,l]},r.prototype.typesetSVG=function(t,e,r){var n=this.adaptor;if(this.minwidth=this.shift=0,"local"===this.options.fontCache&&(this.fontCache.clearCache(),this.fontCache.useLocalID(this.options.localID),n.insert(this.fontCache.getCache(),r)),t.toSVG(r),this.fontCache.clearLocalID(),this.minwidth)n.setStyle(e,"minWidth",this.ex(this.minwidth)),n.setStyle(this.container,"minWidth",this.ex(this.minwidth));else if(this.shift){var o=n.getAttribute(this.container,"justify")||"center";this.setIndent(e,o,this.shift)}},r.prototype.setIndent=function(t,e,r){"center"!==e&&"left"!==e||this.adaptor.setStyle(t,"margin-left",this.ex(r)),"center"!==e&&"right"!==e||this.adaptor.setStyle(t,"margin-right",this.ex(-r))},r.prototype.ex=function(t){return t/=this.font.params.x_height,Math.abs(t)<.001?"0":t.toFixed(3).replace(/\.?0+$/,"")+"ex"},r.prototype.svg=function(t,r,n){return void 0===r&&(r={}),void 0===n&&(n=[]),this.html(t,r,n,e.SVGNS)},r.prototype.unknownText=function(t,e){var r=this.math.metrics,n=this.font.params.x_height/r.ex*r.em*1e3,o=this.svg("text",{"data-variant":e,transform:"scale(1,-1)","font-size":this.fixed(n,1)+"px"},[this.text(t)]),i=this.adaptor;if("-explicitFont"!==e){var T=(0,c.unicodeChars)(t);if(1!==T.length||T[0]<119808||T[0]>120831){var s=Q(this.font.getCssFont(e),3),a=s[0],l=s[1],u=s[2];i.setAttribute(o,"font-family",a),l&&i.setAttribute(o,"font-style","italic"),u&&i.setAttribute(o,"font-weight","bold")}}return o},r.prototype.measureTextNode=function(t){var e=this.adaptor;t=e.clone(t),e.removeAttribute(t,"transform");var r=this.fixed(1e3*this.font.params.x_height,1),n=this.svg("svg",{position:"absolute",visibility:"hidden",width:"1ex",height:"1ex",viewBox:[0,0,r,r].join(" ")},[t]);e.append(e.body(e.document),n);var o=e.nodeSize(t,1e3,!0)[0];return e.remove(n),{w:o,h:.75,d:.2}},r.NAME="SVG",r.OPTIONS=i(i({},T.CommonOutputJax.OPTIONS),{internalSpeechTitles:!0,titleID:0,fontCache:"local",localID:null}),r.commonStyles={'mjx-container[jax="SVG"]':{direction:"ltr"},'mjx-container[jax="SVG"] > svg':{overflow:"visible","min-height":"1px","min-width":"1px"},'mjx-container[jax="SVG"] > svg a':{fill:"blue",stroke:"blue"}},r.FONTCACHEID="MJX-SVG-global-cache",r.STYLESHEETID="MJX-SVG-styles",r}(T.CommonOutputJax);e.SVG=p},2597:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.FontCache=void 0;var r=function(){function t(t){this.cache=new Map,this.defs=null,this.localID="",this.nextID=0,this.jax=t}return t.prototype.cachePath=function(t,e,r){var n="MJX-"+this.localID+(this.jax.font.getVariant(t).cacheID||"")+"-"+e;return this.cache.has(n)||(this.cache.set(n,r),this.jax.adaptor.append(this.defs,this.jax.svg("path",{id:n,d:r}))),n},t.prototype.clearLocalID=function(){this.localID=""},t.prototype.useLocalID=function(t){void 0===t&&(t=null),this.localID=(null==t?++this.nextID:t)+(""===t?"":"-")},t.prototype.clearCache=function(){this.cache=new Map,this.defs=this.jax.svg("defs")},t.prototype.getCache=function(){return this.defs},t}();e.FontCache=r},768:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AddPaths=e.SVGFontData=void 0;var a=r(5884);T(r(5884),e);var l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.charOptions=function(e,r){return t.charOptions.call(this,e,r)},e.OPTIONS=i(i({},a.FontData.OPTIONS),{dynamicPrefix:"./output/svg/fonts"}),e.JAX="SVG",e}(a.FontData);e.SVGFontData=l,e.AddPaths=function(t,e,r){var n,o,i,Q;try{for(var T=s(Object.keys(e)),a=T.next();!a.done;a=T.next()){var c=a.value,u=parseInt(c);l.charOptions(t,u).p=e[u]}}catch(t){n={error:t}}finally{try{a&&!a.done&&(o=T.return)&&o.call(T)}finally{if(n)throw n.error}}try{for(var p=s(Object.keys(r)),h=p.next();!h.done;h=p.next()){c=h.value,u=parseInt(c);l.charOptions(t,u).c=r[u]}}catch(t){i={error:t}}finally{try{h&&!h.done&&(Q=p.return)&&Q.call(p)}finally{if(i)throw i.error}}return t}},7620:function(t,e,r){var n=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),o=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),i=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&n(e,t,r);return o(e,t),e},Q=this&&this.__exportStar||function(t,e){for(var r in t)"default"===r||Object.prototype.hasOwnProperty.call(e,r)||n(e,t,r)};Object.defineProperty(e,"__esModule",{value:!0}),e.Arrow=e.DiagonalArrow=e.DiagonalStrike=e.Border2=e.Border=e.RenderLine=e.lineOffset=e.lineData=e.computeLineData=void 0;var T=i(r(5552));Q(r(5552),e),e.computeLineData={top:function(t,e,r,n){return[0,t-n,r,t-n]},right:function(t,e,r,n){return[r-n,-e,r-n,t]},bottom:function(t,e,r,n){return[0,n-e,r,n-e]},left:function(t,e,r,n){return[n,-e,n,t]},vertical:function(t,e,r,n){return[r/2,t,r/2,-e]},horizontal:function(t,e,r,n){return[0,(t-e)/2,r,(t-e)/2]},up:function(t,e,r,n){return[n,n-e,r-n,t-n]},down:function(t,e,r,n){return[n,t-n,r-n,n-e]}};e.lineData=function(t,r,n){void 0===n&&(n="");var o=t.getBBox(),i=o.h,Q=o.d,T=o.w,s=t.thickness/2;return(0,e.lineOffset)(e.computeLineData[r](i,Q,T,s),t,n)};e.lineOffset=function(t,e,r){if(r){var n=e.getOffset(r);n&&("X"===r?(t[0]-=n,t[2]-=n):(t[1]-=n,t[3]-=n))}return t};e.RenderLine=function(t,r){return void 0===r&&(r=""),function(n,o){var i=n.line((0,e.lineData)(n,t,r));n.adaptor.append(n.element,i)}};e.Border=function(t){return T.CommonBorder((function(r,n){r.adaptor.append(r.element,r.line((0,e.lineData)(r,t)))}))(t)};e.Border2=function(t,r,n){return T.CommonBorder2((function(t,o){t.adaptor.append(t.element,t.line((0,e.lineData)(t,r))),t.adaptor.append(t.element,t.line((0,e.lineData)(t,n)))}))(t,r,n)};e.DiagonalStrike=function(t){return T.CommonDiagonalStrike((function(r){return function(r,n){r.adaptor.append(r.element,r.line((0,e.lineData)(r,t)))}}))(t)};e.DiagonalArrow=function(t){return T.CommonDiagonalArrow((function(t,e){t.adaptor.append(t.element,e)}))(t)};e.Arrow=function(t){return T.CommonArrow((function(t,e){t.adaptor.append(t.element,e)}))(t)}},7079:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},Q=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGWrapper=void 0;var T=r(6469),s=r(7519),a=r(4097),l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.element=null,e.dx=0,e}return o(e,t),e.prototype.toSVG=function(t){this.addChildren(this.standardSVGnode(t))},e.prototype.addChildren=function(t){var e,r,n=0;try{for(var o=i(this.childNodes),Q=o.next();!Q.done;Q=o.next()){var T=Q.value;T.toSVG(t);var s=T.getOuterBBox();T.element&&T.place(n+s.L*s.rscale,0),n+=(s.L+s.w+s.R)*s.rscale}}catch(t){e={error:t}}finally{try{Q&&!Q.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}},e.prototype.standardSVGnode=function(t){var e=this.createSVGnode(t);return this.handleStyles(),this.handleScale(),this.handleBorder(),this.handleColor(),this.handleAttributes(),e},e.prototype.createSVGnode=function(t){this.element=this.svg("g",{"data-mml-node":this.node.kind});var e=this.node.attributes.get("href");if(e){t=this.adaptor.append(t,this.svg("a",{href:e}));var r=this.getOuterBBox(),n=r.h,o=r.d,i=r.w;this.adaptor.append(this.element,this.svg("rect",{"data-hitbox":!0,fill:"none",stroke:"none","pointer-events":"all",width:this.fixed(i),height:this.fixed(n+o),y:this.fixed(-o)}))}return this.adaptor.append(t,this.element),this.element},e.prototype.handleStyles=function(){var t=this;if(this.styles){var e=this.styles.cssText;e&&this.adaptor.setAttribute(this.element,"style",e),T.BBox.StyleAdjust.forEach((function(e){var r=Q(e,3),n=r[0];if(0===r[2]){var o=t.styles.get(n);o&&(t.dx+=t.length2em(o,1,t.bbox.rscale))}}))}},e.prototype.handleScale=function(){if(1!==this.bbox.rscale){var t="scale("+this.fixed(this.bbox.rscale/1e3,3)+")";this.adaptor.setAttribute(this.element,"transform",t)}},e.prototype.handleColor=function(){var t,e=this.adaptor,r=this.node.attributes,n=r.getExplicit("mathcolor"),o=r.getExplicit("color"),i=r.getExplicit("mathbackground"),Q=r.getExplicit("background"),T=(null===(t=this.styles)||void 0===t?void 0:t.get("background-color"))||"";if((n||o)&&(e.setAttribute(this.element,"fill",n||o),e.setAttribute(this.element,"stroke",n||o)),i||Q||T){var s=this.getOuterBBox(),a=s.h,l=s.d,c=s.w,u=this.svg("rect",{fill:i||Q||T,x:this.fixed(-this.dx),y:this.fixed(-l),width:this.fixed(c),height:this.fixed(a+l),"data-bgcolor":!0}),p=e.firstChild(this.element);p?e.insert(u,p):e.append(this.element,u)}},e.prototype.handleBorder=function(){var t,r,n,o;if(this.styles){var T=Array(4).fill(0),s=Array(4),a=Array(4);try{for(var l=i([["Top",0],["Right",1],["Bottom",2],["Left",3]]),c=l.next();!c.done;c=l.next()){var u=Q(c.value,2),p=u[0],h=u[1],d="border"+p,f=this.styles.get(d+"Width");f&&(T[h]=Math.max(0,this.length2em(f,1,this.bbox.rscale)),s[h]=this.styles.get(d+"Style")||"solid",a[h]=this.styles.get(d+"Color")||"currentColor")}}catch(e){t={error:e}}finally{try{c&&!c.done&&(r=l.return)&&r.call(l)}finally{if(t)throw t.error}}var L=e.borderFuzz,m=this.getOuterBBox(),y=Q([m.h+L,m.d+L,m.w+L],3),g=y[0],H=y[1],b=y[2],v=[b,g],M=[-L,g],_=[b,-H],O=[-L,-H],V=[b-T[1],g-T[0]],S=[-L+T[3],g-T[0]],x=[b-T[1],-H+T[2]],E=[-L+T[3],-H+T[2]],A=[[M,v,V,S],[_,v,V,x],[O,_,x,E],[O,M,S,E]],C=this.adaptor.firstChild(this.element);try{for(var N=i([0,1,2,3]),w=N.next();!w.done;w=N.next()){if(T[h=w.value]){var P=A[h];"dashed"===s[h]||"dotted"===s[h]?this.addBorderBroken(P,a[h],s[h],T[h],h):this.addBorderSolid(P,a[h],C)}}}catch(t){n={error:t}}finally{try{w&&!w.done&&(o=N.return)&&o.call(N)}finally{if(n)throw n.error}}}},e.prototype.addBorderSolid=function(t,e,r){var n=this,o=this.svg("polygon",{points:t.map((function(t){var e=Q(t,2),r=e[0],o=e[1];return"".concat(n.fixed(r-n.dx),",").concat(n.fixed(o))})).join(" "),stroke:"none",fill:e});r?this.adaptor.insert(o,r):this.adaptor.append(this.element,o)},e.prototype.addBorderBroken=function(t,e,r,n,o){var i="dotted"===r,T=n/2,s=Q([[T,-T,-T,-T],[-T,T,-T,-T],[T,T,-T,T],[T,T,T,-T]][o],4),a=s[0],l=s[1],c=s[2],u=s[3],p=Q(t,2),h=p[0],d=p[1],f=h[0]+a-this.dx,L=h[1]+l,m=d[0]+c-this.dx,y=d[1]+u,g=Math.abs(o%2?y-L:m-f),H=i?Math.ceil(g/(2*n)):Math.ceil((g-n)/(4*n)),b=g/(4*H+1),v=this.svg("line",{x1:this.fixed(f),y1:this.fixed(L),x2:this.fixed(m),y2:this.fixed(y),"stroke-width":this.fixed(n),stroke:e,"stroke-linecap":i?"round":"square","stroke-dasharray":i?[1,this.fixed(g/H-.002)].join(" "):[this.fixed(b),this.fixed(3*b)].join(" ")}),M=this.adaptor,_=M.firstChild(this.element);_?M.insert(v,_):M.append(this.element,v)},e.prototype.handleAttributes=function(){var t,r,n,o,Q=this.node.attributes,T=Q.getAllDefaults(),s=e.skipAttributes;try{for(var a=i(Q.getExplicitNames()),l=a.next();!l.done;l=a.next()){var c=l.value;!1!==s[c]&&(c in T||s[c]||this.adaptor.hasAttribute(this.element,c))||this.adaptor.setAttribute(this.element,c,Q.getExplicit(c))}}catch(e){t={error:e}}finally{try{l&&!l.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}if(Q.get("class")){var u=Q.get("class").trim().split(/ +/);try{for(var p=i(u),h=p.next();!h.done;h=p.next()){var d=h.value;this.adaptor.addClass(this.element,d)}}catch(t){n={error:t}}finally{try{h&&!h.done&&(o=p.return)&&o.call(p)}finally{if(n)throw n.error}}}},e.prototype.place=function(t,e,r){if(void 0===r&&(r=null),(t+=this.dx)||e){r||(r=this.element,e=this.handleId(e));var n="translate(".concat(this.fixed(t),",").concat(this.fixed(e),")"),o=this.adaptor.getAttribute(r,"transform")||"";this.adaptor.setAttribute(r,"transform",n+(o?" "+o:""))}},e.prototype.handleId=function(t){if(!this.node.attributes||!this.node.attributes.get("id"))return t;var e=this.adaptor,r=this.getBBox().h,n=e.childNodes(this.element);n.forEach((function(t){return e.remove(t)}));var o=this.svg("g",{"data-idbox":!0,transform:"translate(0,".concat(this.fixed(-r),")")},n);return e.append(this.element,this.svg("text",{"data-id-align":!0},[this.text("")])),e.append(this.element,o),t+r},e.prototype.firstChild=function(){var t=this.adaptor,e=t.firstChild(this.element);return e&&"text"===t.kind(e)&&t.getAttribute(e,"data-id-align")&&(e=t.firstChild(t.next(e))),e&&"rect"===t.kind(e)&&t.getAttribute(e,"data-hitbox")&&(e=t.next(e)),e},e.prototype.placeChar=function(t,e,r,n,o){var T,s;void 0===o&&(o=null),null===o&&(o=this.variant);var a=t.toString(16).toUpperCase(),l=Q(this.getVariantChar(o,t),4),c=l[2],u=l[3];if("p"in u){var p=u.p?"M"+u.p+"Z":"";this.place(e,r,this.adaptor.append(n,this.charNode(o,a,p)))}else if("c"in u){var h=this.adaptor.append(n,this.svg("g",{"data-c":a}));this.place(e,r,h),e=0;try{for(var d=i(this.unicodeChars(u.c,o)),f=d.next();!f.done;f=d.next()){var L=f.value;e+=this.placeChar(L,e,r,h,o)}}catch(t){T={error:t}}finally{try{f&&!f.done&&(s=d.return)&&s.call(d)}finally{if(T)throw T.error}}}else if(u.unknown){var m=String.fromCodePoint(t),y=this.adaptor.append(n,this.jax.unknownText(m,o));return this.place(e,r,y),this.jax.measureTextNodeWithCache(y,m,o).w}return c},e.prototype.charNode=function(t,e,r){return"none"!==this.jax.options.fontCache?this.useNode(t,e,r):this.pathNode(e,r)},e.prototype.pathNode=function(t,e){return this.svg("path",{"data-c":t,d:e})},e.prototype.useNode=function(t,e,r){var n=this.svg("use",{"data-c":e}),o="#"+this.jax.fontCache.cachePath(t,e,r);return this.adaptor.setAttribute(n,"href",o,a.XLINKNS),n},e.prototype.drawBBox=function(){var t=this.getBBox(),e=t.w,r=t.h,n=t.d,o=this.svg("g",{style:{opacity:.25}},[this.svg("rect",{fill:"red",height:this.fixed(r),width:this.fixed(e)}),this.svg("rect",{fill:"green",height:this.fixed(n),width:this.fixed(e),y:this.fixed(-n)})]),i=this.element||this.parent.element;this.adaptor.append(i,o)},e.prototype.html=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.jax.html(t,e,r)},e.prototype.svg=function(t,e,r){return void 0===e&&(e={}),void 0===r&&(r=[]),this.jax.svg(t,e,r)},e.prototype.text=function(t){return this.jax.text(t)},e.prototype.fixed=function(t,e){return void 0===e&&(e=1),this.jax.fixed(1e3*t,e)},e.kind="unknown",e.borderFuzz=.005,e}(s.CommonWrapper);e.SVGWrapper=l},7826:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGWrapperFactory=void 0;var i=r(4420),Q=r(6368),T=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.jax=null,e}return o(e,t),e.defaultNodes=Q.SVGWrappers,e}(i.CommonWrapperFactory);e.SVGWrapperFactory=T},6368:function(t,e,r){var n;Object.defineProperty(e,"__esModule",{value:!0}),e.SVGWrappers=void 0;var o=r(7079),i=r(2438),Q=r(3289),T=r(1618),s=r(5896),a=r(5710),l=r(3735),c=r(3365),u=r(9375),p=r(6465),h=r(7512),d=r(3572),f=r(5535),L=r(1107),m=r(7725),y=r(6670),g=r(4445),H=r(8835),b=r(9950),v=r(2558),M=r(3006),_=r(8926),O=r(988),V=r(6614),S=r(2417),x=r(9645),E=r(131),A=r(640);e.SVGWrappers=((n={})[i.SVGmath.kind]=i.SVGmath,n[Q.SVGmrow.kind]=Q.SVGmrow,n[Q.SVGinferredMrow.kind]=Q.SVGinferredMrow,n[T.SVGmi.kind]=T.SVGmi,n[s.SVGmo.kind]=s.SVGmo,n[a.SVGmn.kind]=a.SVGmn,n[l.SVGms.kind]=l.SVGms,n[c.SVGmtext.kind]=c.SVGmtext,n[u.SVGmerror.kind]=u.SVGmerror,n[p.SVGmspace.kind]=p.SVGmspace,n[h.SVGmpadded.kind]=h.SVGmpadded,n[d.SVGmphantom.kind]=d.SVGmphantom,n[f.SVGmfrac.kind]=f.SVGmfrac,n[L.SVGmsqrt.kind]=L.SVGmsqrt,n[m.SVGmroot.kind]=m.SVGmroot,n[y.SVGmfenced.kind]=y.SVGmfenced,n[g.SVGmsub.kind]=g.SVGmsub,n[g.SVGmsup.kind]=g.SVGmsup,n[g.SVGmsubsup.kind]=g.SVGmsubsup,n[H.SVGmunder.kind]=H.SVGmunder,n[H.SVGmover.kind]=H.SVGmover,n[H.SVGmunderover.kind]=H.SVGmunderover,n[b.SVGmmultiscripts.kind]=b.SVGmmultiscripts,n[v.SVGmtable.kind]=v.SVGmtable,n[M.SVGmtr.kind]=M.SVGmtr,n[M.SVGmlabeledtr.kind]=M.SVGmlabeledtr,n[_.SVGmtd.kind]=_.SVGmtd,n[O.SVGmaction.kind]=O.SVGmaction,n[V.SVGmenclose.kind]=V.SVGmenclose,n[S.SVGsemantics.kind]=S.SVGsemantics,n[S.SVGannotation.kind]=S.SVGannotation,n[S.SVGannotationXML.kind]=S.SVGannotationXML,n[S.SVGxml.kind]=S.SVGxml,n[x.SVGmglyph.kind]=x.SVGmglyph,n[E.SVGTeXAtom.kind]=E.SVGTeXAtom,n[A.SVGTextNode.kind]=A.SVGTextNode,n[o.SVGWrapper.kind]=o.SVGWrapper,n)},131:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGTeXAtom=void 0;var i=r(7079),Q=r(9800),T=r(3948),s=r(9007),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(e){if(t.prototype.toSVG.call(this,e),this.adaptor.setAttribute(this.element,"data-mjx-texclass",s.TEXCLASSNAMES[this.node.texClass]),this.node.texClass===s.TEXCLASS.VCENTER){var r=this.childNodes[0].getBBox(),n=r.h,o=(n+r.d)/2+this.font.params.axis_height-n,i="translate(0 "+this.fixed(o)+")";this.adaptor.setAttribute(this.element,"transform",i)}},e.kind=T.TeXAtom.prototype.kind,e}((0,Q.CommonTeXAtomMixin)(i.SVGWrapper));e.SVGTeXAtom=a},640:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGTextNode=void 0;var Q=r(9007),T=r(7079),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e,r,n=this.node.getText(),o=this.parent.variant;if(0!==n.length)if("-explicitFont"===o)this.element=this.adaptor.append(t,this.jax.unknownText(n,o));else{var Q=this.remappedText(n,o);this.parent.childNodes.length>1&&(t=this.element=this.adaptor.append(t,this.svg("g",{"data-mml-node":"text"})));var T=0;try{for(var s=i(Q),a=s.next();!a.done;a=s.next()){var l=a.value;T+=this.placeChar(l,T,0,t,o)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=s.return)&&r.call(s)}finally{if(e)throw e.error}}}},e.kind=Q.TextNode.prototype.kind,e.styles={'mjx-container[jax="SVG"] path[data-c], mjx-container[jax="SVG"] use[data-c]':{"stroke-width":3}},e}((0,r(1160).CommonTextNodeMixin)(T.SVGWrapper));e.SVGTextNode=s},988:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmaction=void 0;var i=r(7079),Q=r(1956),T=r(1956),s=r(9145),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t),r=this.selected,n=r.getOuterBBox(),o=n.h,i=n.d,Q=n.w;this.adaptor.append(this.element,this.svg("rect",{width:this.fixed(Q),height:this.fixed(o+i),y:this.fixed(-i),fill:"none","pointer-events":"all"})),r.toSVG(e);var T=r.getOuterBBox();r.element&&r.place(T.L*T.rscale,0),this.action(this,this.data)},e.prototype.setEventHandler=function(t,e){this.element.addEventListener(t,e)},e.kind=s.MmlMaction.prototype.kind,e.styles={'[jax="SVG"] mjx-tool':{display:"inline-block",position:"relative",width:0,height:0},'[jax="SVG"] mjx-tool > mjx-tip':{position:"absolute",top:0,left:0},"mjx-tool > mjx-tip":{display:"inline-block",padding:".2em",border:"1px solid #888","font-size":"70%","background-color":"#F8F8F8",color:"black","box-shadow":"2px 2px 5px #AAAAAA"},'g[data-mml-node="maction"][data-toggle]':{cursor:"pointer"},"mjx-status":{display:"block",position:"fixed",left:"1em",bottom:"1em","min-width":"25%",padding:".2em .4em",border:"1px solid #888","font-size":"90%","background-color":"#F8F8F8",color:"black"}},e.actions=new Map([["toggle",[function(t,e){t.adaptor.setAttribute(t.element,"data-toggle",t.node.attributes.get("selection"));var r=t.factory.jax.math,n=t.factory.jax.document,o=t.node;t.setEventHandler("click",(function(t){r.end.node||(r.start.node=r.end.node=r.typesetRoot,r.start.n=r.end.n=0),o.nextToggleSelection(),r.rerender(n),t.stopPropagation()}))},{}]],["tooltip",[function(t,e){var r=t.childNodes[1];if(r){var n=t.firstChild();if(r.node.isKind("mtext")){var o=r.node.getText();t.adaptor.insert(t.svg("title",{},[t.text(o)]),n)}else{var i=t.adaptor,Q=t.jax.container,T=t.node.factory.create("math",{},[t.childNodes[1].node]),s=t.html("mjx-tool",{},[t.html("mjx-tip")]),a=i.append(n,t.svg("foreignObject",{style:{display:"none"}},[s]));t.jax.processMath(T,i.firstChild(s)),t.childNodes[1].node.parent=t.node,t.setEventHandler("mouseover",(function(r){e.stopTimers(t,e),e.hoverTimer.set(t,setTimeout((function(){i.setStyle(s,"left","0"),i.setStyle(s,"top","0"),i.append(Q,s);var e=i.nodeBBox(s),r=i.nodeBBox(t.element),n=(r.right-e.left)/t.metrics.em+t.dx,o=(r.bottom-e.bottom)/t.metrics.em+t.dy;i.setStyle(s,"left",t.px(n)),i.setStyle(s,"top",t.px(o))}),e.postDelay)),r.stopPropagation()})),t.setEventHandler("mouseout",(function(r){e.stopTimers(t,e);var n=setTimeout((function(){return i.append(a,s)}),e.clearDelay);e.clearTimer.set(t,n),r.stopPropagation()}))}}},T.TooltipData]],["statusline",[function(t,e){var r=t.childNodes[1];if(r&&r.node.isKind("mtext")){var n=t.adaptor,o=r.node.getText();n.setAttribute(t.element,"data-statusline",o),t.setEventHandler("mouseover",(function(r){if(null===e.status){var i=n.body(n.document);e.status=n.append(i,t.html("mjx-status",{},[t.text(o)]))}r.stopPropagation()})),t.setEventHandler("mouseout",(function(t){e.status&&(n.remove(e.status),e.status=null),t.stopPropagation()}))}},{status:null}]]]),e}((0,Q.CommonMactionMixin)(i.SVGWrapper));e.SVGmaction=a},2438:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmath=void 0;var T=r(7079),s=r(7490),a=r(3233),l=r(6469),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(e){t.prototype.toSVG.call(this,e);var r=this.adaptor;"block"===this.node.attributes.get("display")&&(r.setAttribute(this.jax.container,"display","true"),this.handleDisplay()),this.jax.document.options.internalSpeechTitles&&this.handleSpeech()},e.prototype.handleDisplay=function(){var t=i(this.getAlignShift(),2),e=t[0],r=t[1];if("center"!==e&&this.adaptor.setAttribute(this.jax.container,"justify",e),this.bbox.pwidth===l.BBox.fullWidth){if(this.adaptor.setAttribute(this.jax.container,"width","full"),this.jax.table){var n=this.jax.table.getOuterBBox(),o=n.L,Q=n.w,T=n.R;"right"===e?T=Math.max(T||-r,-r):"left"===e?o=Math.max(o||r,r):"center"===e&&(Q+=2*Math.abs(r)),this.jax.minwidth=Math.max(0,o+Q+T)}}else this.jax.shift=r},e.prototype.handleSpeech=function(){var t,e,r=this.adaptor,n=this.node.attributes,o=n.get("aria-label")||n.get("data-semantic-speech");if(o){var i=this.getTitleID(),T=this.svg("title",{id:i},[this.text(o)]);r.insert(T,r.firstChild(this.element)),r.setAttribute(this.element,"aria-labeledby",i),r.removeAttribute(this.element,"aria-label");try{for(var s=Q(this.childNodes[0].childNodes),a=s.next();!a.done;a=s.next()){var l=a.value;r.setAttribute(l.element,"aria-hidden","true")}}catch(e){t={error:e}}finally{try{a&&!a.done&&(e=s.return)&&e.call(s)}finally{if(t)throw t.error}}}},e.prototype.getTitleID=function(){return"mjx-svg-title-"+String(this.jax.options.titleID++)},e.prototype.setChildPWidths=function(e,r,n){return void 0===r&&(r=null),void 0===n&&(n=!0),t.prototype.setChildPWidths.call(this,e,this.parent?r:this.metrics.containerWidth/this.jax.pxPerEm,!1)},e.kind=a.MmlMath.prototype.kind,e.styles={'mjx-container[jax="SVG"][display="true"]':{display:"block","text-align":"center",margin:"1em 0"},'mjx-container[jax="SVG"][display="true"][width="full"]':{display:"flex"},'mjx-container[jax="SVG"][justify="left"]':{"text-align":"left"},'mjx-container[jax="SVG"][justify="right"]':{"text-align":"right"}},e}((0,s.CommonMathMixin)(T.SVGWrapper));e.SVGmath=c},6614:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__createBinding||(Object.create?function(t,e,r,n){void 0===n&&(n=r);var o=Object.getOwnPropertyDescriptor(e,r);o&&!("get"in o?!e.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return e[r]}}),Object.defineProperty(t,n,o)}:function(t,e,r,n){void 0===n&&(n=r),t[n]=e[r]}),Q=this&&this.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),T=this&&this.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var r in t)"default"!==r&&Object.prototype.hasOwnProperty.call(t,r)&&i(e,t,r);return Q(e,t),e},s=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},a=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmenclose=void 0;var l=r(7079),c=r(7313),u=T(r(7620)),p=r(6661),h=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e,r,n=this.standardSVGnode(t),o=this.getBBoxExtenders()[3],i={};o>0&&(i.transform="translate("+this.fixed(o)+", 0)");var Q=this.adaptor.append(n,this.svg("g",i));this.renderChild?this.renderChild(this,Q):this.childNodes[0].toSVG(Q);try{for(var T=s(Object.keys(this.notations)),a=T.next();!a.done;a=T.next()){var l=a.value,c=this.notations[l];!c.renderChild&&c.renderer(this,n)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(r=T.return)&&r.call(T)}finally{if(e)throw e.error}}},e.prototype.arrow=function(t,e,r,n,o){void 0===n&&(n=""),void 0===o&&(o=0);var i=this.getBBox(),Q=i.w,T=(t-Q)/2,s=(i.h-i.d)/2,l=this.thickness,c=l/2,u=a([l*this.arrowhead.x,l*this.arrowhead.y,l*this.arrowhead.dx],3),p=u[0],h=u[1],d=u[2],f=r?this.fill("M",Q+T,s,"l",-(p+d),h,"l",d,c-h,"L",p-T,s+c,"l",d,h-c,"l",-(p+d),-h,"l",p+d,-h,"l",-d,h-c,"L",Q+T-p,s-c,"l",-d,c-h,"Z"):this.fill("M",Q+T,s,"l",-(p+d),h,"l",d,c-h,"L",-T,s+c,"l",0,-l,"L",Q+T-p,s-c,"l",-d,c-h,"Z"),L=[];if(o&&L.push("X"===n?"translate(".concat(this.fixed(-o)," 0)"):"translate(0 ".concat(this.fixed(o),")")),e){var m=this.jax.fixed(180*-e/Math.PI);L.push("rotate(".concat(m," ").concat(this.fixed(Q/2)," ").concat(this.fixed(s),")"))}return L.length&&this.adaptor.setAttribute(f,"transform",L.join(" ")),f},e.prototype.line=function(t){var e=a(t,4),r=e[0],n=e[1],o=e[2],i=e[3];return this.svg("line",{x1:this.fixed(r),y1:this.fixed(n),x2:this.fixed(o),y2:this.fixed(i),"stroke-width":this.fixed(this.thickness)})},e.prototype.box=function(t,e,r,n){void 0===n&&(n=0);var o=this.thickness,i={x:this.fixed(o/2),y:this.fixed(o/2-r),width:this.fixed(t-o),height:this.fixed(e+r-o),fill:"none","stroke-width":this.fixed(o)};return n&&(i.rx=this.fixed(n)),this.svg("rect",i)},e.prototype.ellipse=function(t,e,r){var n=this.thickness;return this.svg("ellipse",{rx:this.fixed((t-n)/2),ry:this.fixed((e+r-n)/2),cx:this.fixed(t/2),cy:this.fixed((e-r)/2),fill:"none","stroke-width":this.fixed(n)})},e.prototype.path=function(t){for(var e=this,r=[],n=1;n g':{fill:"red",stroke:"red"},'g[data-mml-node="merror"] > rect[data-background]':{fill:"yellow",stroke:"none"}},e}(i.SVGWrapper);e.SVGmerror=T},6670:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmfenced=void 0;var Q=r(7079),T=r(7555),s=r(5410),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t);this.setChildrenParent(this.mrow),this.mrow.toSVG(e),this.setChildrenParent(this)},e.prototype.setChildrenParent=function(t){var e,r;try{for(var n=i(this.childNodes),o=n.next();!o.done;o=n.next()){o.value.parent=t}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}},e.kind=s.MmlMfenced.prototype.kind,e}((0,T.CommonMfencedMixin)(Q.SVGWrapper));e.SVGmfenced=a},5535:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmfrac=void 0;var Q=r(7079),T=r(2688),s=r(6850),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){this.standardSVGnode(t);var e=this.node.attributes.getList("linethickness","bevelled"),r=e.linethickness,n=e.bevelled,o=this.isDisplay();if(n)this.makeBevelled(o);else{var i=this.length2em(String(r),.06);0===i?this.makeAtop(o):this.makeFraction(o,i)}},e.prototype.makeFraction=function(t,e){var r=this.element,n=this.node.attributes.getList("numalign","denomalign"),o=n.numalign,Q=n.denomalign,T=i(this.childNodes,2),s=T[0],a=T[1],l=s.getOuterBBox(),c=a.getOuterBBox(),u=this.font.params,p=u.axis_height,h=this.node.getProperty("withDelims")?0:u.nulldelimiterspace,d=Math.max((l.L+l.w+l.R)*l.rscale,(c.L+c.w+c.R)*c.rscale),f=this.getAlignX(d,l,o)+.1+h,L=this.getAlignX(d,c,Q)+.1+h,m=this.getTUV(t,e),y=m.T,g=m.u,H=m.v;s.toSVG(r),s.place(f,p+y+Math.max(l.d*l.rscale,g)),a.toSVG(r),a.place(L,p-y-Math.max(c.h*c.rscale,H)),this.adaptor.append(r,this.svg("rect",{width:this.fixed(d+.2),height:this.fixed(e),x:this.fixed(h),y:this.fixed(p-e/2)}))},e.prototype.makeAtop=function(t){var e=this.element,r=this.node.attributes.getList("numalign","denomalign"),n=r.numalign,o=r.denomalign,Q=i(this.childNodes,2),T=Q[0],s=Q[1],a=T.getOuterBBox(),l=s.getOuterBBox(),c=this.font.params,u=this.node.getProperty("withDelims")?0:c.nulldelimiterspace,p=Math.max((a.L+a.w+a.R)*a.rscale,(l.L+l.w+l.R)*l.rscale),h=this.getAlignX(p,a,n)+u,d=this.getAlignX(p,l,o)+u,f=this.getUVQ(t),L=f.u,m=f.v;T.toSVG(e),T.place(h,L),s.toSVG(e),s.place(d,-m)},e.prototype.makeBevelled=function(t){var e=this.element,r=i(this.childNodes,2),n=r[0],o=r[1],Q=this.getBevelData(t),T=Q.u,s=Q.v,a=Q.delta,l=Q.nbox,c=Q.dbox,u=(l.L+l.w+l.R)*l.rscale;n.toSVG(e),this.bevel.toSVG(e),o.toSVG(e),n.place(l.L*l.rscale,T),this.bevel.place(u-a/2,0),o.place(u+this.bevel.getOuterBBox().w+c.L*c.rscale-a,s)},e.kind=s.MmlMfrac.prototype.kind,e}((0,T.CommonMfracMixin)(Q.SVGWrapper));e.SVGmfrac=a},9645:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmglyph=void 0;var i=r(7079),Q=r(5636),T=r(3985),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t);if(this.charWrapper)this.charWrapper.toSVG(e);else{var r=this.node.attributes.getList("src","alt"),n=r.src,o=r.alt,i=this.fixed(this.height),Q={width:this.fixed(this.width),height:i,transform:"translate(0 "+this.fixed(this.height+(this.valign||0))+") matrix(1 0 0 -1 0 0)",preserveAspectRatio:"none","aria-label":o,href:n},T=this.svg("image",Q);this.adaptor.append(e,T)}},e.kind=T.MmlMglyph.prototype.kind,e}((0,Q.CommonMglyphMixin)(i.SVGWrapper));e.SVGmglyph=s},1618:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmi=void 0;var i=r(7079),Q=r(5723),T=r(450),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=T.MmlMi.prototype.kind,e}((0,Q.CommonMiMixin)(i.SVGWrapper));e.SVGmi=s},9950:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmmultiscripts=e.AlignX=void 0;var Q=r(4445),T=r(8009),s=r(6405),a=r(505);function l(t){return{left:function(t,e){return 0},center:function(t,e){return(e-t)/2},right:function(t,e){return e-t}}[t]||function(t,e){return 0}}e.AlignX=l;var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t),r=this.scriptData,n=this.node.getProperty("scriptalign")||"right left",o=i((0,a.split)(n+" "+n),2),Q=o[0],T=o[1],s=this.combinePrePost(r.sub,r.psub),l=this.combinePrePost(r.sup,r.psup),c=i(this.getUVQ(s,l),2),u=c[0],p=c[1],h=0;r.numPrescripts&&(h=this.addScripts(.05,u,p,this.firstPrescript,r.numPrescripts,Q));var d=this.baseChild;d.toSVG(e),d.place(h,0),h+=d.getOuterBBox().w,r.numScripts&&this.addScripts(h,u,p,1,r.numScripts,T)},e.prototype.addScripts=function(t,e,r,n,o,Q){var T=this.adaptor,s=l(Q),a=T.append(this.element,this.svg("g")),c=T.append(this.element,this.svg("g"));this.place(t,e,a),this.place(t,r,c);for(var u=n+2*o,p=0;n=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},Q=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmo=void 0;var T=r(7079),s=r(7096),a=r(2756),l=.1,c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e=this.node.attributes,r=e.get("symmetric")&&2!==this.stretch.dir,n=0!==this.stretch.dir;n&&null===this.size&&this.getStretchedVariant([]);var o=this.standardSVGnode(t);if(n&&this.size<0)this.stretchSVG();else{var i=r||e.get("largeop")?this.fixed(this.getCenterOffset()):"0",Q=this.node.getProperty("mathaccent")?this.fixed(this.getAccentOffset()):"0";"0"===i&&"0"===Q||this.adaptor.setAttribute(o,"transform","translate(".concat(Q," ").concat(i,")")),this.addChildren(o)}},e.prototype.stretchSVG=function(){var t=this.stretch.stretch,e=this.getStretchVariants(),r=this.getBBox();1===this.stretch.dir?this.stretchVertical(t,e,r):this.stretchHorizontal(t,e,r)},e.prototype.getStretchVariants=function(){var t,e,r=this.stretch.c||this.getText().codePointAt(0),n=[];try{for(var o=i(this.stretch.stretch.keys()),Q=o.next();!Q.done;Q=o.next()){var T=Q.value;n[T]=this.font.getStretchVariant(r,T)}}catch(e){t={error:e}}finally{try{Q&&!Q.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return n},e.prototype.stretchVertical=function(t,e,r){var n=r.h,o=r.d,i=r.w,T=this.addTop(t[0],e[0],n,i),s=this.addBot(t[2],e[2],o,i);if(4===t.length){var a=Q(this.addMidV(t[3],e[3],i),2),l=a[0],c=a[1];this.addExtV(t[1],e[1],n,0,T,l,i),this.addExtV(t[1],e[1],0,o,c,s,i)}else this.addExtV(t[1],e[1],n,o,T,s,i)},e.prototype.stretchHorizontal=function(t,e,r){var n=r.w,o=this.addLeft(t[0],e[0]),i=this.addRight(t[2],e[2],n);if(4===t.length){var T=Q(this.addMidH(t[3],e[3],n),2),s=T[0],a=T[1],l=n/2;this.addExtH(t[1],e[1],l,o,l-s),this.addExtH(t[1],e[1],l,a-l,i,l)}else this.addExtH(t[1],e[1],n,o,i)},e.prototype.getChar=function(t,e){var r=this.font.getChar(e,t)||[0,0,0,null];return[r[0],r[1],r[2],r[3]||{}]},e.prototype.addGlyph=function(t,e,r,n,o){return void 0===o&&(o=null),this.placeChar(t,r,n,o||this.element,e)},e.prototype.addTop=function(t,e,r,n){if(!t)return 0;var o=Q(this.getChar(t,e),3),i=o[0],T=o[1],s=o[2];return this.addGlyph(t,e,(n-s)/2,r-i),i+T},e.prototype.addExtV=function(t,e,r,n,o,i,T){var s=this;if(t){o=Math.max(0,o-l),i=Math.max(0,i-l);var a=this.adaptor,c=Q(this.getChar(t,e),3),u=c[0],p=c[1],h=c[2],d=r+n-o-i,f=1.5*d/(u+p),L=(f*(u-p)-d)/2;if(!(d<=0)){var m=this.svg("svg",{width:this.fixed(h),height:this.fixed(d),y:this.fixed(i-n),x:this.fixed((T-h)/2),viewBox:[0,L,h,d].map((function(t){return s.fixed(t)})).join(" ")});this.addGlyph(t,e,0,0,m);var y=a.lastChild(m);a.setAttribute(y,"transform","scale(1,".concat(this.jax.fixed(f),")")),a.append(this.element,m)}}},e.prototype.addBot=function(t,e,r,n){if(!t)return 0;var o=Q(this.getChar(t,e),3),i=o[0],T=o[1],s=o[2];return this.addGlyph(t,e,(n-s)/2,T-r),i+T},e.prototype.addMidV=function(t,e,r){if(!t)return[0,0];var n=Q(this.getChar(t,e),3),o=n[0],i=n[1],T=n[2],s=(i-o)/2+this.font.params.axis_height;return this.addGlyph(t,e,(r-T)/2,s),[o+s,i-s]},e.prototype.addLeft=function(t,e){return t?this.addGlyph(t,e,0,0):0},e.prototype.addExtH=function(t,e,r,n,o,i){var T=this;if(void 0===i&&(i=0),t){o=Math.max(0,o-.1),n=Math.max(0,n-.1);var s=this.adaptor,a=Q(this.getChar(t,e),3),c=a[0],u=a[1],p=a[2],h=r-n-o,d=c+u+.2,f=h/p*1.5,L=-(u+l);if(!(h<=0)){var m=this.svg("svg",{width:this.fixed(h),height:this.fixed(d),x:this.fixed(i+n),y:this.fixed(L),viewBox:[(f*p-h)/2,L,h,d].map((function(t){return T.fixed(t)})).join(" ")});this.addGlyph(t,e,0,0,m);var y=s.lastChild(m);s.setAttribute(y,"transform","scale("+this.jax.fixed(f)+",1)"),s.append(this.element,m)}}},e.prototype.addRight=function(t,e,r){if(!t)return 0;var n=this.getChar(t,e)[2];return this.addGlyph(t,e,r-n,0)},e.prototype.addMidH=function(t,e,r){if(!t)return[0,0];var n=this.getChar(t,e)[2];return this.addGlyph(t,e,(r-n)/2,0),[(r-n)/2,(r+n)/2]},e.kind=a.MmlMo.prototype.kind,e}((0,s.CommonMoMixin)(T.SVGWrapper));e.SVGmo=c},7512:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmpadded=void 0;var Q=r(7079),T=r(6898),s=r(7238),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t),r=i(this.getDimens(),9),n=r[5],o=r[6],Q=r[7],T=r[8],s=this.node.attributes.get("data-align")||"left",a=o+T-(n<0&&"left"!==s?"center"===s?n/2:n:0);(a||Q)&&(e=this.adaptor.append(e,this.svg("g")),this.place(a,Q,e)),this.addChildren(e)},e.kind=s.MmlMpadded.prototype.kind,e}((0,T.CommonMpaddedMixin)(Q.SVGWrapper));e.SVGmpadded=a},3572:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmphantom=void 0;var i=r(7079),Q=r(5741),T=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){this.standardSVGnode(t)},e.kind=Q.MmlMphantom.prototype.kind,e}(i.SVGWrapper);e.SVGmphantom=T},7725:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmroot=void 0;var Q=r(1107),T=r(9086),s=r(6145),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addRoot=function(t,e,r,n){e.toSVG(t);var o=i(this.getRootDimens(r,n),3),Q=o[0],T=o[1],s=o[2],a=e.getOuterBBox();e.place(s*a.rscale,T),this.dx=Q},e.kind=s.MmlMroot.prototype.kind,e}((0,T.CommonMrootMixin)(Q.SVGmsqrt));e.SVGmroot=a},3289:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGinferredMrow=e.SVGmrow=void 0;var i=r(7079),Q=r(8411),T=r(8411),s=r(9878),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e=this.node.isInferred?this.element=t:this.standardSVGnode(t);this.addChildren(e)},e.kind=s.MmlMrow.prototype.kind,e}((0,Q.CommonMrowMixin)(i.SVGWrapper));e.SVGmrow=a;var l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=s.MmlInferredMrow.prototype.kind,e}((0,T.CommonInferredMrowMixin)(a));e.SVGinferredMrow=l},3735:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGms=void 0;var i=r(7079),Q=r(4126),T=r(7265),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=T.MmlMs.prototype.kind,e}((0,Q.CommonMsMixin)(i.SVGWrapper));e.SVGms=s},6465:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmspace=void 0;var i=r(7079),Q=r(258),T=r(6030),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=T.MmlMspace.prototype.kind,e}((0,Q.CommonMspaceMixin)(i.SVGWrapper));e.SVGmspace=s},1107:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmsqrt=void 0;var i=r(7079),Q=r(4093),T=r(7131),s=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.dx=0,e}return o(e,t),e.prototype.toSVG=function(t){var e=this.childNodes[this.surd],r=this.childNodes[this.base],n=this.root?this.childNodes[this.root]:null,o=e.getBBox(),i=r.getOuterBBox(),Q=this.getPQ(o)[1],T=this.font.params.rule_thickness*this.bbox.scale,s=i.h+Q+T,a=this.standardSVGnode(t),l=this.adaptor.append(a,this.svg("g"));this.addRoot(a,n,o,s),e.toSVG(a),e.place(this.dx,s-o.h),r.toSVG(l),r.place(this.dx+o.w,0),this.adaptor.append(a,this.svg("rect",{width:this.fixed(i.w),height:this.fixed(T),x:this.fixed(this.dx+o.w),y:this.fixed(s-T)}))},e.prototype.addRoot=function(t,e,r,n){},e.kind=T.MmlMsqrt.prototype.kind,e}((0,Q.CommonMsqrtMixin)(i.SVGWrapper));e.SVGmsqrt=s},4445:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmsubsup=e.SVGmsup=e.SVGmsub=void 0;var Q=r(6369),T=r(905),s=r(905),a=r(905),l=r(4461),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=l.MmlMsub.prototype.kind,e}((0,T.CommonMsubMixin)(Q.SVGscriptbase));e.SVGmsub=c;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=l.MmlMsup.prototype.kind,e}((0,s.CommonMsupMixin)(Q.SVGscriptbase));e.SVGmsup=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t),r=i([this.baseChild,this.supChild,this.subChild],3),n=r[0],o=r[1],Q=r[2],T=this.getBaseWidth(),s=this.getAdjustedIc(),a=i(this.getUVQ(),2),l=a[0],c=a[1];n.toSVG(e),o.toSVG(e),Q.toSVG(e),Q.place(T,c),o.place(T+s,l)},e.kind=l.MmlMsubsup.prototype.kind,e}((0,a.CommonMsubsupMixin)(Q.SVGscriptbase));e.SVGmsubsup=p},2558:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;oT?T:this.pWidth),a="left"===Q?0:"right"===Q?s:s/2;if(a){var l=this.svg("g",{},this.adaptor.childNodes(t));this.place(a,0,l),this.adaptor.append(t,l)}return a},e.prototype.lineClass=function(t){return"mjx-"+t},e.prototype.makeFrame=function(t,e,r,n){var o=this.fLine;return this.svg("rect",this.setLineThickness(o,n,{"data-frame":!0,class:this.lineClass(n),width:this.fixed(t-o),height:this.fixed(e+r-o),x:this.fixed(o/2),y:this.fixed(o/2-r)}))},e.prototype.makeVLine=function(t,e,r){var n=this.getBBox(),o=n.h,i=n.d,Q="dotted"===e?r/2:0,T=this.fixed(t+r/2);return this.svg("line",this.setLineThickness(r,e,{"data-line":"v",class:this.lineClass(e),x1:T,y1:this.fixed(Q-i),x2:T,y2:this.fixed(o-Q)}))},e.prototype.makeHLine=function(t,e,r){var n=this.getBBox().w,o="dotted"===e?r/2:0,i=this.fixed(t-r/2);return this.svg("line",this.setLineThickness(r,e,{"data-line":"h",class:this.lineClass(e),x1:this.fixed(o),y1:i,x2:this.fixed(n-o),y2:i}))},e.prototype.setLineThickness=function(t,e,r){return.07!==t&&(r["stroke-thickness"]=this.fixed(t),"solid"!==e&&(r["stroke-dasharray"]=("dotted"===e?"0,":"")+this.fixed(2*t))),r},e.prototype.handleLabels=function(t,e,r){if(this.hasLabels){var n=this.labels,o=this.node.attributes.get("side");this.spaceLabels(),this.isTop?this.topTable(t,n,o):this.subTable(t,n,o,r)}},e.prototype.spaceLabels=function(){for(var t=this.adaptor,e=this.getBBox().h,r=this.getTableData().L,n=this.getRowHalfSpacing(),o=e-this.fLine,i=t.firstChild(this.labels),Q=0;Q line[data-line], svg[data-table] > g > line[data-line]':{"stroke-width":"70px",fill:"none"},'g[data-mml-node="mtable"] > rect[data-frame], svg[data-table] > g > rect[data-frame]':{"stroke-width":"70px",fill:"none"},'g[data-mml-node="mtable"] > .mjx-dashed, svg[data-table] > g > .mjx-dashed':{"stroke-dasharray":"140"},'g[data-mml-node="mtable"] > .mjx-dotted, svg[data-table] > g > .mjx-dotted':{"stroke-linecap":"round","stroke-dasharray":"0,140"},'g[data-mml-node="mtable"] > g > svg':{overflow:"visible"}},e}((0,s.CommonMtableMixin)(T.SVGWrapper));e.SVGmtable=l},8926:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmtd=void 0;var i=r(7079),Q=r(5164),T=r(4359),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.placeCell=function(t,e,r,n,o){var i=this.getBBox(),Q=Math.max(i.h,.75),T=Math.max(i.d,.25),s=this.node.attributes.get("columnalign"),a=this.node.attributes.get("rowalign"),l=this.getAlignX(r,i,s),c=this.getAlignY(n,o,Q,T,a);return this.place(t+l,e+c),[l,c]},e.prototype.placeColor=function(t,e,r,n){var o=this.adaptor,i=this.firstChild();i&&"rect"===o.kind(i)&&o.getAttribute(i,"data-bgcolor")&&(o.setAttribute(i,"x",this.fixed(t)),o.setAttribute(i,"y",this.fixed(e)),o.setAttribute(i,"width",this.fixed(r)),o.setAttribute(i,"height",this.fixed(n)))},e.kind=T.MmlMtd.prototype.kind,e}((0,Q.CommonMtdMixin)(i.SVGWrapper));e.SVGmtd=s},3365:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmtext=void 0;var i=r(7079),Q=r(6319),T=r(4770),s=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=T.MmlMtext.prototype.kind,e}((0,Q.CommonMtextMixin)(i.SVGWrapper));e.SVGmtext=s},3006:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGmunderover=e.SVGmover=e.SVGmunder=void 0;var Q=r(4445),T=r(1971),s=r(1971),a=r(1971),l=r(5184),c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(e){if(this.hasMovableLimits())t.prototype.toSVG.call(this,e);else{var r=this.standardSVGnode(e),n=i([this.baseChild,this.scriptChild],2),o=n[0],Q=n[1],T=i([o.getOuterBBox(),Q.getOuterBBox()],2),s=T[0],a=T[1];o.toSVG(r),Q.toSVG(r);var l=this.isLineBelow?0:this.getDelta(!0),c=this.getUnderKV(s,a)[1],u=i(this.getDeltaW([s,a],[0,-l]),2),p=u[0],h=u[1];o.place(p,0),Q.place(h,c)}},e.kind=l.MmlMunder.prototype.kind,e}((0,T.CommonMunderMixin)(Q.SVGmsub));e.SVGmunder=c;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(e){if(this.hasMovableLimits())t.prototype.toSVG.call(this,e);else{var r=this.standardSVGnode(e),n=i([this.baseChild,this.scriptChild],2),o=n[0],Q=n[1],T=i([o.getOuterBBox(),Q.getOuterBBox()],2),s=T[0],a=T[1];o.toSVG(r),Q.toSVG(r);var l=this.isLineAbove?0:this.getDelta(),c=this.getOverKU(s,a)[1],u=i(this.getDeltaW([s,a],[0,l]),2),p=u[0],h=u[1];o.place(p,0),Q.place(h,c)}},e.kind=l.MmlMover.prototype.kind,e}((0,s.CommonMoverMixin)(Q.SVGmsup));e.SVGmover=u;var p=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(e){if(this.hasMovableLimits())t.prototype.toSVG.call(this,e);else{var r=this.standardSVGnode(e),n=i([this.baseChild,this.overChild,this.underChild],3),o=n[0],Q=n[1],T=n[2],s=i([o.getOuterBBox(),Q.getOuterBBox(),T.getOuterBBox()],3),a=s[0],l=s[1],c=s[2];o.toSVG(r),T.toSVG(r),Q.toSVG(r);var u=this.getDelta(),p=this.getOverKU(a,l)[1],h=this.getUnderKV(a,c)[1],d=i(this.getDeltaW([a,c,l],[0,this.isLineBelow?0:-u,this.isLineAbove?0:u]),3),f=d[0],L=d[1],m=d[2];o.place(f,0),T.place(L,h),Q.place(m,p)}},e.kind=l.MmlMunderover.prototype.kind,e}((0,a.CommonMunderoverMixin)(Q.SVGmsubsup));e.SVGmunderover=p},6369:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SVGscriptbase=void 0;var Q=r(7079),T=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t),r=this.getBaseWidth(),n=i(this.getOffset(),2),o=n[0],Q=n[1];this.baseChild.toSVG(e),this.scriptChild.toSVG(e),this.scriptChild.place(r+o,Q)},e.kind="scriptbase",e}((0,r(167).CommonScriptbaseMixin)(Q.SVGWrapper));e.SVGscriptbase=T},2417:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SVGxml=e.SVGannotationXML=e.SVGannotation=e.SVGsemantics=void 0;var i=r(7079),Q=r(5806),T=r(9102),s=r(9007),a=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e=this.standardSVGnode(t);this.childNodes.length&&this.childNodes[0].toSVG(e)},e.kind=T.MmlSemantics.prototype.kind,e}((0,Q.CommonSemanticsMixin)(i.SVGWrapper));e.SVGsemantics=a;var l=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(e){t.prototype.toSVG.call(this,e)},e.prototype.computeBBox=function(){return this.bbox},e.kind=T.MmlAnnotation.prototype.kind,e}(i.SVGWrapper);e.SVGannotation=l;var c=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.kind=T.MmlAnnotationXML.prototype.kind,e.styles={"foreignObject[data-mjx-xml]":{"font-family":"initial","line-height":"normal",overflow:"visible"}},e}(i.SVGWrapper);e.SVGannotationXML=c;var u=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.toSVG=function(t){var e=this.adaptor.clone(this.node.getXML()),r=this.jax.math.metrics.em*this.jax.math.metrics.scale,n=this.fixed(1/r),o=this.getBBox(),i=o.w,Q=o.h,T=o.d;this.element=this.adaptor.append(t,this.svg("foreignObject",{"data-mjx-xml":!0,y:this.jax.fixed(-Q*r)+"px",width:this.jax.fixed(i*r)+"px",height:this.jax.fixed((Q+T)*r)+"px",transform:"scale(".concat(n,") matrix(1 0 0 -1 0 0)")},[e]))},e.prototype.computeBBox=function(t,e){void 0===e&&(e=!1);var r=this.jax.measureXMLnode(this.node.getXML()),n=r.w,o=r.h,i=r.d;t.w=n,t.h=o,t.d=i},e.prototype.getStyles=function(){},e.prototype.getScale=function(){},e.prototype.getVariant=function(){},e.kind=s.XMLNode.prototype.kind,e.autoStyle=!1,e}(i.SVGWrapper);e.SVGxml=u},42:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.TeXFont=void 0;var Q=r(768),T=r(5920),s=r(7040),a=r(2560),l=r(2810),c=r(6982),u=r(175),p=r(5735),h=r(8594),d=r(4749),f=r(9320),L=r(466),m=r(9671),y=r(3746),g=r(3240),H=r(1325),b=r(4164),v=r(8652),M=r(5667),_=r(5821),O=r(957),V=r(1044),S=r(7292),x=r(2162),E=r(9244),A=r(2675),C=r(9124),N=function(t){function e(e){var r,n;void 0===e&&(e=null);var o=t.call(this,e)||this,Q=o.constructor;try{for(var T=i(Object.keys(Q.variantCacheIds)),s=T.next();!s.done;s=T.next()){var a=s.value;o.variant[a].cacheID="TEX-"+Q.variantCacheIds[a]}}catch(t){r={error:t}}finally{try{s&&!s.done&&(n=T.return)&&n.call(T)}finally{if(r)throw r.error}}return o}return o(e,t),e.defaultDelimiters=C.delimiters,e.defaultChars={normal:f.normal,bold:a.bold,italic:p.italic,"bold-italic":s.boldItalic,"double-struck":l.doubleStruck,fraktur:u.fraktur,"bold-fraktur":c.frakturBold,script:b.script,"bold-script":H.scriptBold,"sans-serif":g.sansSerif,"bold-sans-serif":m.sansSerifBold,"sans-serif-italic":y.sansSerifItalic,"sans-serif-bold-italic":L.sansSerifBoldItalic,monospace:d.monospace,"-smallop":v.smallop,"-largeop":h.largeop,"-size3":x.texSize3,"-size4":E.texSize4,"-tex-calligraphic":_.texCalligraphic,"-tex-bold-calligraphic":M.texCalligraphicBold,"-tex-mathit":O.texMathit,"-tex-oldstyle":S.texOldstyle,"-tex-bold-oldstyle":V.texOldstyleBold,"-tex-variant":A.texVariant},e.variantCacheIds={normal:"N",bold:"B",italic:"I","bold-italic":"BI","double-struck":"D",fraktur:"F","bold-fraktur":"BF",script:"S","bold-script":"BS","sans-serif":"SS","bold-sans-serif":"BSS","sans-serif-italic":"SSI","sans-serif-bold-italic":"SSBI",monospace:"M","-smallop":"SO","-largeop":"LO","-size3":"S3","-size4":"S4","-tex-calligraphic":"C","-tex-bold-calligraphic":"BC","-tex-mathit":"MI","-tex-oldstyle":"OS","-tex-bold-oldstyle":"BOS","-tex-variant":"V"},e}((0,T.CommonTeXFontMixin)(Q.SVGFontData));e.TeXFont=N},7040:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.boldItalic=void 0;var n=r(768),o=r(3980);e.boldItalic=(0,n.AddPaths)(o.boldItalic,{47:"189 -210Q179 -210 170 -203T160 -179Q160 -171 162 -166Q164 -163 420 266T679 698Q686 711 704 711Q714 711 723 704T733 681Q733 672 730 667Q723 654 469 228T211 -201Q202 -210 189 -210",305:"24 296Q24 305 34 328T63 380T115 430T187 452Q205 452 223 448T262 435T295 406T308 360Q308 345 287 290T240 170T207 87Q202 67 202 57Q202 42 215 42Q235 42 257 64Q288 92 302 140Q307 156 310 159T330 162H336H347Q367 162 367 148Q367 140 357 117T329 65T276 14T201 -8Q158 -8 121 15T83 84Q83 104 133 229T184 358Q189 376 189 388Q189 402 177 402Q156 402 134 380Q103 352 89 304Q84 288 81 285T61 282H55H44Q24 282 24 296",567:"297 360T297 373T294 392T288 400T278 401H276Q237 398 200 363Q181 343 170 325T156 299T149 287T129 282H123H116Q102 282 97 284T92 298Q93 303 98 315T118 349T151 390T201 427T267 451H279Q357 451 388 422T420 354V339L370 138Q321 -60 317 -69Q287 -157 163 -194Q133 -201 99 -201Q39 -201 14 -178T-12 -125Q-12 -94 11 -69T68 -43Q93 -43 108 -57T123 -95Q123 -121 100 -151H104Q131 -151 155 -125T193 -60Q195 -54 244 141T294 345Q297 360 297 373",8260:"189 -210Q179 -210 170 -203T160 -179Q160 -171 162 -166Q164 -163 420 266T679 698Q686 711 704 711Q714 711 723 704T733 681Q733 672 730 667Q723 654 469 228T211 -201Q202 -210 189 -210",8710:"65 0Q59 6 59 9T61 16Q64 20 334 357T608 698Q616 706 629 710Q630 710 634 710T644 710T656 711Q686 711 694 703Q698 699 700 693Q706 674 805 345T904 14Q904 7 894 1L479 0H65ZM630 342L567 551L232 134L462 133H693Q693 137 630 342",10744:"189 -210Q179 -210 170 -203T160 -179Q160 -171 162 -166Q164 -163 420 266T679 698Q686 711 704 711Q714 711 723 704T733 681Q733 672 730 667Q723 654 469 228T211 -201Q202 -210 189 -210"},{})},2560:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.bold=void 0;var n=r(768),o=r(1103);e.bold=(0,n.AddPaths)(o.bold,{33:"89 629Q89 663 116 684T171 705Q215 705 237 681T260 634Q260 619 233 434T204 244Q201 237 175 237Q150 237 146 244Q144 248 117 433T89 629ZM90 86Q90 125 116 148T177 171Q211 169 235 146T259 86Q259 48 235 25T175 1Q138 1 114 24T90 86",34:"38 572T38 608T61 669T121 694Q167 694 196 657T225 559Q225 520 214 482T186 418T151 370T119 339T99 329T82 340T70 360Q70 365 74 369T92 385T122 414Q142 441 154 471T170 518L172 535L166 532Q160 530 148 527T122 523Q85 523 62 547ZM305 572T305 608T328 669T388 694Q434 694 463 657T492 559Q492 520 481 482T453 418T418 370T386 339T366 329T349 340T337 360Q337 365 341 369T359 385T389 414Q409 441 421 471T436 518L439 535L433 532Q427 530 415 527T389 523Q352 523 329 547",35:"64 362Q64 380 87 393H363L366 404Q379 443 390 480T409 542T424 590T435 628T443 655T451 674T458 686T467 692T478 694Q490 694 499 686T509 662Q505 643 427 395Q427 393 523 393H620L623 404Q630 426 652 498T691 624T711 681Q718 694 735 694Q748 694 757 685T766 662Q762 643 684 395Q684 393 777 393H871Q872 392 875 390T881 386T887 381T891 374T893 363Q893 345 871 333L767 332H664L660 319Q660 318 638 245T614 171Q614 169 742 169H871L877 165Q883 161 885 159T890 151T893 138Q893 120 871 109L732 108H594L590 95Q587 84 546 -46Q508 -175 505 -178Q498 -193 478 -193Q462 -193 455 -183T448 -164Q448 -156 530 106Q530 108 434 108H337L333 95Q330 84 289 -46Q251 -175 248 -178Q240 -193 222 -193Q206 -193 199 -183T191 -164Q191 -154 273 106Q273 108 180 108L87 109Q64 117 64 139Q64 156 87 169H293L321 262Q326 277 331 294T340 321L343 330Q343 332 215 332L87 333Q64 343 64 362ZM600 330Q600 332 504 332H407L403 319Q403 318 381 245T357 171Q357 169 453 169H550L578 262Q583 277 588 294T597 321L600 330",36:"64 494Q64 541 80 579T120 638T171 674T219 693T253 698H256V750H318V699H323Q355 694 380 686T433 663T480 620T506 556Q510 539 510 520Q510 480 488 463T440 445L422 447Q407 451 398 459Q370 478 370 515Q370 542 384 559T412 580L427 584Q424 589 418 596T386 617T324 636H318V434Q411 419 460 355T510 217Q510 196 507 175T492 122T461 67T404 23T318 -4V-56H256V-5H254Q252 -3 240 -3Q194 4 160 23T108 64T80 112T67 156T64 190Q64 218 81 240T134 262Q171 262 187 240T204 193T190 150T153 125Q146 125 144 123Q142 123 149 113T174 89T218 66Q247 58 255 58Q256 58 256 173V287L239 291Q160 308 112 365T64 494ZM255 636Q246 635 236 632T206 620T173 591T160 543Q160 472 256 448V542Q256 636 255 636ZM320 59Q324 59 333 61T356 70T384 89T406 120T415 167Q415 200 395 225T356 260T318 274V59H320",37:"65 549Q65 609 84 652T132 714T187 742T236 750Q265 750 296 734T355 697T431 661T541 644Q662 644 736 730Q751 749 767 749T790 739T797 719Q797 710 768 672T504 329Q212 -47 211 -48Q203 -55 191 -55Q161 -55 161 -25Q161 -17 163 -12L642 609Q608 595 542 595Q515 595 488 599T441 608T405 619T381 628L373 632Q373 630 375 619T380 589T383 548Q383 455 343 401T235 347Q217 347 198 351T154 368T110 403T78 462T65 549ZM320 549Q320 633 295 665T235 698H234Q214 698 196 674Q182 650 182 549Q182 509 183 486T190 441T207 409T238 399Q269 399 294 431T320 549ZM745 -56Q727 -56 708 -52T664 -35T620 0T588 59T575 146T588 232T620 291T663 325T708 343T747 347Q810 347 851 294T893 146Q893 89 879 48T841 -15T794 -46T745 -56ZM830 146Q830 230 805 262T745 295H744Q724 295 706 271Q692 247 692 146Q692 106 693 83T700 38T717 6T748 -4Q779 -4 804 28T830 146",38:"255 -11Q209 -11 164 4T84 56T48 146Q48 159 50 171Q57 197 72 218T99 249T152 292Q204 333 204 334L194 356Q185 379 176 421T166 511Q166 538 168 551Q182 613 226 654T332 704Q334 704 343 704T358 705Q412 702 444 661T476 565V559Q476 489 334 371L330 368L335 357Q382 272 485 165L496 154L506 163Q543 200 597 273L671 382H601V444H610L732 441Q821 441 830 444H836V382H741L709 335Q702 324 687 302T665 270T646 244T625 216T605 191T581 162T553 132L537 116Q544 109 557 98T605 69T673 51Q711 51 739 70T767 115V118H829V114Q829 70 786 30T668 -11Q570 -11 474 37L451 49L441 43Q352 -11 255 -11ZM415 564Q415 596 400 625T356 654Q329 654 310 634T285 588Q283 580 283 554Q283 475 309 417L325 431Q415 512 415 564ZM192 182Q192 126 213 89T279 51Q348 51 400 83L389 91Q362 112 338 137T295 186T264 229T240 265T227 286Q226 285 222 280T217 272T211 263T205 251T200 238T196 222T193 204T192 182",39:"74 572T74 608T97 669T157 694Q203 694 232 657T261 559Q261 520 250 482T222 418T187 370T155 339T135 329Q128 329 117 340T106 359Q106 365 117 375T144 399T176 440T203 505Q204 511 205 518T208 530V535L202 532Q196 530 184 527T158 523Q121 523 98 547",40:"103 166T103 251T121 412T165 541T225 639T287 708T341 750H356H361Q382 750 382 736Q382 732 365 714T323 661T274 576T232 439T214 250Q214 -62 381 -229Q382 -231 382 -234Q382 -249 360 -249H356H341Q314 -231 287 -207T226 -138T165 -41T121 89",41:"231 251Q231 354 214 439T173 575T123 661T81 714T64 735Q64 744 73 749H75Q77 749 79 749T84 750T90 750H105Q132 732 159 708T220 639T281 542T325 413T343 251T325 89T281 -40T221 -138T159 -207T105 -249H90Q80 -249 76 -249T68 -245T64 -234Q64 -230 81 -212T123 -160T172 -75T214 61T231 251",42:"235 706Q235 724 251 737T287 750Q306 750 322 738T339 706Q339 685 318 580V579Q429 663 436 666Q441 668 449 668Q471 668 486 650T501 612Q501 582 478 572Q476 570 414 549L354 528L414 507Q420 505 430 502T445 497T458 492T470 488T479 483T487 478T493 471T497 463T500 454T501 443Q501 423 486 406T449 388H446Q435 388 370 437Q339 461 318 477V476Q339 371 339 350Q339 332 323 319T287 306T251 319T235 350Q235 371 256 476V477Q145 393 138 390Q133 388 125 388Q103 388 88 406T73 444Q73 474 96 484Q98 486 160 507L220 528L160 549Q154 551 144 554T129 559T116 564T104 568T95 573T87 578T81 585T77 593T74 602T73 613Q73 633 88 650T125 668H128Q139 668 204 619Q235 595 256 579V580Q235 685 235 706",43:"64 232T64 250T87 281H416V444Q416 608 418 612Q426 633 446 633T475 613Q477 608 477 444V281H807Q808 280 811 278T817 274T823 269T827 262T829 251Q829 230 807 221L642 220H477V57Q477 -107 475 -112Q468 -131 446 -131Q425 -131 418 -112Q416 -107 416 57V220H251L87 221Q64 232 64 250",44:"74 85Q74 120 97 145T159 171Q200 171 226 138Q258 101 258 37Q258 -5 246 -44T218 -109T183 -155T152 -184T135 -194Q129 -194 118 -183T106 -164Q106 -157 115 -149Q121 -145 130 -137T161 -100T195 -35Q197 -28 200 -17T204 3T205 11T199 9T183 3T159 0Q120 0 97 26T74 85",45:"13 166V278H318V166H13",46:"74 85Q74 121 99 146T156 171Q200 171 222 143T245 85Q245 56 224 29T160 1Q118 1 96 27T74 85",47:"451 730Q460 750 479 750Q492 750 501 740T510 718Q508 708 318 244L122 -232Q112 -250 95 -250Q82 -250 73 -241T64 -218Q66 -205 258 261T451 730",58:"74 359Q74 394 98 419T158 444Q200 444 222 417T245 358Q245 329 224 302T160 274Q116 274 95 301T74 359ZM74 85Q74 121 99 146T156 171Q200 171 222 143T245 85Q245 56 224 29T160 1Q118 1 96 27T74 85",59:"74 359Q74 394 98 419T158 444Q200 444 222 417T245 358Q245 329 224 302T160 274Q116 274 95 301T74 359ZM74 50T74 86T97 146T158 171Q204 171 226 132T248 38Q248 -23 223 -80T171 -165T135 -194Q129 -194 118 -183T106 -164Q106 -163 106 -160L107 -158Q108 -155 121 -142T150 -107T177 -58Q189 -32 194 3Q195 6 193 6Q172 0 158 0Q121 0 98 25",60:"797 -56Q797 -68 790 -76T767 -85H759L434 70Q108 226 105 229Q96 238 96 250Q96 263 105 272Q109 276 271 354T595 508T757 585Q763 587 766 587Q780 587 788 578T797 556Q797 544 788 535Q784 531 490 391L197 251Q213 242 359 173T644 37T788 -34Q797 -43 797 -56",61:"87 333Q64 343 64 362Q64 383 84 391Q89 393 448 393H807Q808 392 811 390T817 386T823 381T827 374T829 363Q829 345 807 333H87ZM87 109Q64 118 64 139Q64 159 86 168Q89 169 448 169H807L812 166Q816 163 818 162T823 157T827 149T829 139Q829 118 807 109H87",62:"127 -85Q110 -85 103 -75T96 -55Q96 -41 106 -34Q119 -24 308 65Q361 90 411 114L696 250L427 379Q106 533 103 537Q96 545 96 557Q96 568 104 577T128 587Q137 586 460 431T788 272Q797 263 797 250Q797 238 788 229Q785 226 459 70L135 -85H127",63:"65 570Q65 628 119 664T259 700Q326 700 372 688T440 654T469 613T478 569Q478 505 412 465Q287 391 287 294V283Q287 250 284 244T263 237H256H249Q232 237 229 242T225 272V287Q227 364 253 418Q274 463 311 504Q335 530 335 575Q335 622 323 635T259 648Q231 648 209 644T179 636T170 630L172 628Q174 627 177 625T183 620T190 611T197 601T202 587T204 570Q204 539 185 519T134 499Q105 499 85 517T65 570ZM171 86Q171 125 197 148T258 171Q292 169 316 146T340 86Q340 48 316 25T256 1Q218 1 195 24T171 86",64:"64 347Q64 511 171 605T434 699Q487 699 500 698Q624 684 703 621T811 464Q828 414 828 344Q828 232 788 179T691 125Q673 125 657 127T628 132T606 140T588 148T576 156T568 162L566 164Q565 164 549 154T504 135T444 125Q349 125 284 183T218 347Q218 455 284 512T448 569Q554 569 610 479H638Q670 479 674 471Q676 468 676 340V258Q676 213 679 199T694 178Q701 174 713 177Q767 187 767 340Q767 489 678 569T446 649Q299 649 213 566T126 346Q126 307 134 269T166 189T225 116T320 65T455 45H463Q606 51 721 91L746 99H782H801Q829 99 829 85Q829 78 825 75T804 65Q800 63 797 62Q625 -6 451 -6Q271 -6 168 91T64 347ZM547 468Q526 493 504 505T444 517T377 476T346 347Q346 306 354 271T386 206T448 177Q505 177 547 226V468",91:"128 -250V750H293V689H189V-189H293V-250H128",92:"64 718Q63 731 72 740T94 750Q106 750 113 743Q118 741 122 732L318 256Q508 -208 510 -218Q511 -231 502 -240T480 -250Q460 -250 451 -230Q451 -229 259 238T64 718",93:"25 689V750H190V-250H25V-189H129V689H25",94:"207 632L287 694Q289 693 368 632T448 570T431 545T413 520Q410 520 350 559L287 597L224 559Q164 520 161 520Q160 520 143 544T126 570T207 632",95:"0 -61V-10H574V-61H0",96:"114 634Q114 663 136 684T183 706Q191 706 196 705T208 700T219 693T232 681T245 666T262 645T282 620Q332 558 337 553Q338 552 318 527L299 503L223 543Q215 547 202 553T183 563T167 571T153 580T141 587T131 595T124 603T118 612T115 622T114 634",123:"504 -207T504 -225T500 -246T476 -250H469Q257 -250 227 -145L225 -135L224 0Q224 15 224 30T224 59T224 84T224 106T223 122T223 133V137Q222 138 221 144T213 162T195 185Q171 206 141 215Q123 222 107 223T84 225T74 229T70 250T73 270T83 276T106 276T141 285Q171 294 195 315Q201 321 206 328T214 341T219 352T222 360L223 363V367Q223 371 223 378T223 394T224 415T224 441T224 470T224 501L225 636Q249 739 426 749Q428 749 443 749T466 750H473Q495 750 499 747T504 725T501 704T480 699Q381 693 357 645Q352 634 351 617T350 497V412Q350 350 338 329Q325 303 298 284T251 258T227 251Q226 251 226 250L227 249Q231 248 238 246T265 236T299 217T329 184T349 137Q350 131 350 3T352 -130Q358 -160 392 -178T480 -199Q497 -200 500 -203",124:"160 -249Q138 -249 129 -225V250Q129 725 131 729Q139 750 159 750T190 725V-225Q181 -249 160 -249",125:"70 726Q71 744 74 747T99 750H106Q323 750 349 636L350 501Q350 486 350 470T350 441T350 416T350 394T351 378T351 367V363Q352 362 353 356T361 338T379 315Q403 294 433 285Q451 278 467 277T490 275T500 271T504 250T501 230T491 224T468 224T433 215Q403 206 379 185Q373 179 368 172T360 159T355 148T352 140L351 137V133Q351 129 351 122T351 106T350 85T350 59T350 31T350 0L349 -135L347 -145Q317 -250 106 -250H99Q79 -250 75 -247T70 -226Q70 -208 73 -204T95 -199Q193 -193 217 -145Q222 -134 223 -117T224 3Q224 20 224 48T223 86Q223 145 237 175T301 232Q335 249 347 249Q348 249 348 250L347 251Q343 252 336 254T309 264T275 284T245 316T225 363Q224 369 224 497T222 631Q216 660 182 678T95 699Q77 700 74 704T70 726",126:"343 202Q320 202 278 225T215 249Q181 249 146 214L134 202L115 219Q111 222 106 226T98 234L96 236Q158 306 165 313Q199 344 230 344Q239 344 244 343Q262 339 300 318T359 297Q393 297 428 332L440 344L459 327Q463 324 468 320T476 312L478 310Q416 240 409 233Q375 202 343 202",168:"96 615Q96 650 120 672T178 695Q214 693 234 669T255 615Q255 583 232 559T176 535Q147 535 122 556T96 615ZM319 615Q319 651 343 673T399 695Q426 695 452 675T478 615Q478 578 454 557T395 535Q364 537 342 559T319 615",172:"680 371Q683 369 688 366T695 361T698 356T701 346T701 332T702 308V216Q702 196 702 168T703 130Q703 90 697 76T671 61Q650 61 643 81Q641 86 641 198V310H364L87 311Q64 319 64 341Q64 362 84 369Q89 371 385 371H680",175:"80 540V607H494V540H80",176:"160 618Q160 653 193 677T279 702H284Q381 702 407 647Q414 634 414 618Q414 607 410 596T395 570T355 546T287 536T220 545T181 568T165 594T160 618ZM352 618Q352 645 341 652T301 659H292Q286 659 278 659T268 660Q247 660 236 653T224 638T222 619Q222 591 234 585T287 578Q315 578 326 580T345 590T352 618",177:"64 328T64 346T87 377H416V542L417 707Q431 728 443 728Q467 728 475 709Q477 704 477 540V377H807Q808 376 811 374T817 370T823 365T827 358T829 347Q829 326 807 317L642 316H477V25H807Q808 24 811 22T817 18T823 13T827 6T829 -5Q829 -26 807 -35H87Q64 -24 64 -6T87 25H416V316H251L87 317Q64 328 64 346",180:"391 706Q419 706 439 683T460 634Q460 608 441 593T366 550Q356 545 351 543L275 503L256 527Q236 552 237 553Q242 558 292 620Q299 629 309 641T324 659T336 673T346 685T354 693T363 699T371 703T380 705T391 706",183:"74 251Q74 286 99 311T156 336Q200 336 222 308T245 250Q245 221 224 194T160 166T96 193T74 251",215:"168 500Q168 515 178 522T195 530H198Q207 530 218 521T282 458Q312 428 331 409L447 294L563 409Q674 520 682 525Q687 529 695 529Q711 529 718 520T726 499V498Q726 489 720 481T666 427Q631 392 606 367L490 251L606 135Q717 23 721 17T726 2Q726 -9 719 -18T695 -28H692Q685 -28 674 -18T608 47Q581 74 563 92L447 207L331 91Q217 -22 208 -27Q206 -28 203 -28H197Q168 -28 168 2Q168 13 178 24T288 135L404 250L288 366Q177 479 173 485T168 500",247:"344 495Q344 535 372 566T447 597Q490 597 519 566T548 495Q548 452 518 423T446 393Q404 393 374 423T344 495ZM87 221Q64 230 64 251T84 279Q89 281 448 281H806Q807 280 810 278T816 274T822 269T826 262T828 251Q828 230 806 221H87ZM344 -36T344 6T373 78T446 108Q487 108 517 79T548 6Q548 -35 519 -65T446 -96Q406 -96 375 -66",305:"247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247",567:"28 -163Q58 -168 64 -168Q124 -168 135 -77Q137 -65 137 141T136 353Q132 371 120 377T72 385H52V408Q52 431 54 431L58 432Q62 432 70 432T87 433T108 434T133 436Q151 437 171 438T202 441T214 442H218V184Q217 -36 217 -59T211 -98Q195 -145 153 -175T58 -205Q9 -205 -23 -179T-55 -117Q-55 -94 -40 -79T-2 -64T36 -79T52 -118Q52 -143 28 -163",697:"240 563Q278 563 304 539T331 480V473Q331 462 316 431T217 236Q199 200 174 151T136 78T123 50Q113 33 105 33Q101 33 72 45T38 60Q35 63 35 65Q35 77 101 293T171 517Q182 542 202 552T240 563",710:"207 632L287 694Q289 693 368 632T448 570T431 545T413 520Q410 520 350 559L287 597L224 559Q164 520 161 520Q160 520 143 544T126 570T207 632",711:"131 603Q130 604 136 618T150 646T158 659L223 635L287 611L351 635L416 659Q417 660 424 647T437 619T443 603Q440 601 364 558T287 515T210 558T131 603",713:"80 540V607H494V540H80",714:"391 706Q419 706 439 683T460 634Q460 608 441 593T366 550Q356 545 351 543L275 503L256 527Q236 552 237 553Q242 558 292 620Q299 629 309 641T324 659T336 673T346 685T354 693T363 699T371 703T380 705T391 706",715:"114 634Q114 663 136 684T183 706Q191 706 196 705T208 700T219 693T232 681T245 666T262 645T282 620Q332 558 337 553Q338 552 318 527L299 503L223 543Q215 547 202 553T183 563T167 571T153 580T141 587T131 595T124 603T118 612T115 622T114 634",728:"287 500Q208 500 155 558T102 689V694H153V685Q153 681 154 674T164 648T186 615T226 590T287 578Q347 578 382 611T421 685V694H472V689Q472 623 422 562T287 500",729:"202 610Q202 647 227 671T283 695Q324 695 348 669T372 610T350 551T287 525Q248 525 225 551T202 610",730:"160 618Q160 653 193 677T279 702H284Q381 702 407 647Q414 634 414 618Q414 607 410 596T395 570T355 546T287 536T220 545T181 568T165 594T160 618ZM352 618Q352 645 341 652T301 659H292Q286 659 278 659T268 660Q247 660 236 653T224 638T222 619Q222 591 234 585T287 578Q315 578 326 580T345 590T352 618",732:"343 552Q320 552 278 575T215 599Q181 599 146 564L134 552L115 569Q111 572 106 576T98 584L96 586Q158 656 165 663Q199 694 230 694Q239 694 244 693Q262 689 300 668T359 647Q393 647 428 682L440 694L459 677Q463 674 468 670T476 662L478 660Q416 590 409 583Q375 552 343 552",768:"-461 634Q-461 663 -439 684T-392 706Q-384 706 -379 705T-367 700T-356 693T-343 681T-330 666T-313 645T-293 620Q-243 558 -238 553Q-237 552 -257 527L-276 503L-352 543Q-360 547 -373 553T-392 563T-408 571T-422 580T-434 587T-444 595T-451 603T-457 612T-460 622T-461 634",769:"-184 706Q-156 706 -136 683T-115 634Q-115 608 -134 593T-209 550Q-219 545 -224 543L-300 503L-319 527Q-339 552 -338 553Q-333 558 -283 620Q-276 629 -266 641T-251 659T-239 673T-229 685T-221 693T-212 699T-204 703T-195 705T-184 706",770:"-368 632L-288 694Q-286 693 -207 632T-127 570T-144 545T-162 520Q-165 520 -225 559L-288 597L-351 559Q-411 520 -414 520Q-415 520 -432 544T-449 570T-368 632",771:"-232 552Q-255 552 -297 575T-360 599Q-394 599 -429 564L-441 552L-460 569Q-464 572 -469 576T-476 584L-479 586Q-417 656 -410 663Q-376 694 -345 694Q-336 694 -331 693Q-313 689 -275 668T-216 647Q-182 647 -147 682L-135 694L-116 677Q-112 674 -107 670T-100 662L-97 660Q-159 590 -166 583Q-200 552 -232 552",772:"-495 540V607H-81V540H-495",774:"-288 500Q-367 500 -420 558T-473 689V694H-422V685Q-422 681 -421 674T-411 648T-389 615T-349 590T-288 578Q-228 578 -193 611T-154 685V694H-103V689Q-103 623 -153 562T-288 500",775:"-373 610Q-373 647 -348 671T-292 695Q-251 695 -227 669T-203 610T-225 551T-288 525Q-327 525 -350 551T-373 610",776:"-479 615Q-479 650 -456 672T-397 695Q-361 693 -341 669T-320 615Q-320 583 -343 559T-399 535Q-428 535 -453 556T-479 615ZM-256 615Q-256 651 -232 673T-176 695Q-149 695 -123 675T-97 615Q-97 578 -121 557T-180 535Q-211 537 -233 559T-256 615",778:"-415 618Q-415 653 -382 677T-296 702H-291Q-194 702 -168 647Q-161 634 -161 618Q-161 607 -165 596T-180 570T-220 546T-288 536T-355 545T-394 568T-410 594T-415 618ZM-223 618Q-223 645 -234 652T-274 659H-283Q-289 659 -297 659T-307 660Q-328 660 -339 653T-351 638T-353 619Q-353 591 -341 585T-288 578Q-260 578 -249 580T-230 590T-223 618",779:"-389 511L-442 543Q-442 544 -424 606T-404 674Q-390 705 -361 713Q-360 713 -356 713T-349 714Q-340 714 -330 712Q-273 690 -273 644Q-273 621 -290 604L-342 554L-389 511ZM-198 511L-251 543Q-251 544 -233 606T-213 674Q-199 705 -170 713Q-169 713 -165 713T-158 714Q-127 714 -105 693T-82 647Q-82 638 -84 631T-89 618T-99 604T-112 590T-130 574T-151 554L-198 511",780:"-444 603Q-445 604 -439 618T-425 646T-417 659L-352 635L-288 611L-224 635L-159 659Q-158 660 -151 647T-138 619T-132 603Q-135 601 -211 558T-288 515T-365 558T-444 603",824:"-705 -210Q-715 -210 -724 -203T-734 -179Q-734 -171 -732 -166Q-730 -163 -474 266T-215 698Q-208 711 -190 711Q-180 711 -171 704T-161 681Q-161 672 -164 667Q-171 654 -425 228T-683 -201Q-692 -210 -705 -210",8194:"",8195:"",8196:"",8197:"",8198:"",8201:"",8202:"",8211:"0 249V300H574V249H0",8212:"0 249V300H1149V249H0",8213:"0 249V300H1149V249H0",8214:"205 -225Q201 -234 199 -237T191 -244T175 -248T161 -246Q151 -240 146 -229Q145 -224 145 251Q145 725 146 730Q156 750 176 750Q193 748 205 727V-225ZM369 727L372 732Q375 737 377 740T385 747T398 750Q406 750 413 747Q423 740 428 730Q430 720 430 251Q430 -219 428 -229Q423 -240 413 -246Q408 -248 400 -248Q393 -248 388 -247T379 -242T375 -236T371 -230L369 -225V727",8215:"0 -61V-10H574V-61H0",8216:"58 461Q58 503 70 542T99 607T134 654T165 684T184 694T201 683T213 664Q213 658 202 648T175 624T143 583T116 518Q115 512 114 505T112 493L111 488Q132 500 161 500Q198 500 221 475T245 414T222 354T161 329Q112 329 85 369T58 461",8217:"74 572T74 608T97 669T157 694Q203 694 232 657T261 559Q261 520 250 482T222 418T187 370T155 339T135 329Q128 329 117 340T106 359Q106 365 117 375T144 399T176 440T203 505Q204 511 205 518T208 530V535L202 532Q196 530 184 527T158 523Q121 523 98 547",8220:"110 461Q110 502 121 541T150 606T185 653T217 684T235 694Q242 694 254 682T266 664Q266 659 254 648T226 623T193 578T167 511Q164 500 164 494T164 487Q188 500 212 500Q251 500 274 475T297 414Q297 378 274 354T212 329Q167 329 139 367T110 461ZM377 461Q377 502 388 541T417 606T452 653T484 684T502 694Q509 694 521 682T533 664Q533 659 521 648T493 623T460 578T434 511Q431 500 431 494T431 487Q455 500 479 500Q518 500 541 475T564 414Q564 378 541 354T479 329Q434 329 406 367T377 461",8221:"38 572T38 608T61 669T121 694Q167 694 196 657T225 559Q225 520 214 482T186 418T151 370T119 339T99 329T82 340T70 360Q70 365 74 369T92 385T122 414Q142 441 154 471T170 518L172 535L166 532Q160 530 148 527T122 523Q85 523 62 547ZM305 572T305 608T328 669T388 694Q434 694 463 657T492 559Q492 520 481 482T453 418T418 370T386 339T366 329T349 340T337 360Q337 365 341 369T359 385T389 414Q409 441 421 471T436 518L439 535L433 532Q427 530 415 527T389 523Q352 523 329 547",8224:"231 470Q232 471 232 473Q232 477 213 540T193 636Q192 642 192 651T204 677T239 700Q249 702 255 702Q300 702 315 660Q317 653 317 636Q317 603 298 539T279 472V470Q280 470 318 488T383 506Q408 506 423 493T442 467T446 444T443 421T424 396T383 382Q355 382 318 400T279 418Q278 416 285 392T303 334T316 284Q318 268 318 234Q318 149 311 45T296 -127T284 -203Q279 -211 255 -211Q237 -211 233 -210T226 -203Q222 -195 214 -129T199 41T192 234V245Q192 286 212 349Q233 413 231 418Q229 418 192 400T128 382Q102 382 86 396T67 421T64 444T67 466T86 492T128 506Q155 506 192 488T231 470",8225:"193 637Q193 663 206 679T231 698T255 702T279 699T304 679T317 637Q317 605 299 557T280 504Q280 503 281 503T320 521T382 539Q410 539 428 521T446 476Q446 454 432 434T383 414H377Q358 414 320 431T281 449L280 448Q280 444 298 396T317 316Q318 310 318 301T306 275T271 252Q261 250 255 250Q210 250 195 292Q193 299 193 316Q193 347 211 395T230 448Q230 449 229 449Q227 449 196 434Q151 414 133 414H127Q102 414 87 427T68 452T64 477Q64 503 81 521T127 539Q143 539 164 532T204 515T226 504Q230 502 230 504Q230 508 212 556T193 637ZM193 184Q193 210 206 226T231 245T255 249T279 246T304 226T317 184Q317 153 299 106T280 53Q280 51 282 51T322 68T383 86Q411 86 428 69T445 24T428 -21T382 -39Q358 -39 322 -22T282 -4Q280 -3 280 -3T280 -6Q281 -13 299 -59T317 -136Q318 -142 318 -151T306 -177T271 -200Q261 -202 255 -202Q210 -202 195 -160Q193 -153 193 -136Q193 -106 211 -60T230 -6Q230 -4 228 -4T188 -21T128 -39Q100 -39 83 -22T65 24Q65 53 82 69T127 86Q150 86 187 69T228 51Q230 50 230 50T230 53Q229 58 211 105T193 184",8226:"64 251Q64 303 80 344T121 409T175 448T230 469T275 474Q277 474 283 474T292 473Q385 473 447 415T510 251Q510 149 449 89T287 28T126 88T64 251",8230:"74 85Q74 121 99 146T156 171Q200 171 222 143T245 85Q245 56 224 29T160 1Q118 1 96 27T74 85ZM562 85Q562 121 587 146T644 171Q688 171 710 143T733 85Q733 56 712 29T648 1Q606 1 584 27T562 85ZM1050 85Q1050 121 1075 146T1132 171Q1176 171 1198 143T1221 85Q1221 56 1200 29T1136 1Q1094 1 1072 27T1050 85",8242:"240 563Q278 563 304 539T331 480V473Q331 462 316 431T217 236Q199 200 174 151T136 78T123 50Q113 33 105 33Q101 33 72 45T38 60Q35 63 35 65Q35 77 101 293T171 517Q182 542 202 552T240 563",8254:"80 540V607H494V540H80",8260:"451 730Q460 750 479 750Q492 750 501 740T510 718Q508 708 318 244L122 -232Q112 -250 95 -250Q82 -250 73 -241T64 -218Q66 -205 258 261T451 730",8407:"406 694Q406 704 413 713T433 723Q448 723 454 719T467 701Q483 665 522 648Q542 637 542 619Q542 605 536 599T514 586Q468 569 431 532Q411 513 399 513Q386 513 378 522T369 543Q369 557 381 568Q385 572 387 574L400 588H228L56 589Q33 598 33 618Q33 636 56 649H426Q406 676 406 694",8463:"477 56Q477 48 479 46T490 43Q522 45 544 75T577 140Q582 156 585 159T605 162H611H622Q642 162 642 148Q642 138 632 114T602 62T550 13T478 -8Q429 -8 394 17T358 83Q358 95 395 199T433 350Q433 400 394 400H388H383Q335 400 291 363Q256 332 236 298Q233 293 202 170T169 40Q160 18 141 5T99 -8Q70 -8 58 9T45 39Q45 51 116 336L167 540H80V607H184L188 622H184Q183 622 179 622T169 623T157 624T146 624T136 624T131 625Q119 628 119 642Q119 647 123 661T129 679Q133 684 142 685T220 690Q293 694 307 694Q324 694 328 679Q328 673 311 607H494V540H294Q286 507 278 473T264 420L260 403Q260 400 269 408Q327 451 393 451H401H410Q425 451 439 450T476 442T515 424T544 391T556 337Q556 286 517 179T477 56",8467:"245 -19Q228 -19 212 -16T184 -6T162 9T143 27T129 46T118 66T111 84T106 99T102 111L101 116L69 89L36 62Q31 60 24 62Q-1 88 -1 98Q-1 101 1 105Q1 106 73 170L95 189V197Q95 242 112 317T159 476T241 624T353 701Q357 702 367 702Q428 702 444 641Q446 630 446 606Q446 454 241 246L215 220L212 203Q203 150 203 114Q203 113 203 106T204 95T205 82T209 67T214 54T223 43T236 35T253 32Q277 32 305 44T352 70T389 98T407 112Q409 113 412 113Q420 113 432 95Q445 77 443 70Q440 64 416 44T342 3T245 -19ZM387 615Q387 651 366 651Q342 651 321 604T276 470L241 331Q246 331 280 373T350 486T387 615",8472:"399 159Q410 159 421 151T433 126Q433 104 410 85Q408 84 410 78Q411 72 414 66T428 51T455 43Q483 43 506 55T543 83T568 125T584 166T594 206Q595 211 596 214Q610 273 610 301Q610 365 542 365H538Q483 365 429 344T337 292T269 229T225 175T210 150L255 99Q261 92 274 78T292 58T305 41T316 22T321 3T324 -23Q324 -87 283 -148T174 -210H171Q161 -210 152 -209T128 -201T101 -180T81 -141T72 -78Q72 -72 72 -60T73 -45Q79 4 102 65L108 81Q84 117 84 167Q84 273 140 367T269 461Q285 461 285 447Q285 440 282 431Q278 418 276 415T264 410Q228 404 201 336T174 219Q174 218 176 202L184 214Q252 303 348 360T549 417Q614 417 658 391T719 317Q726 292 726 260Q726 148 646 70T451 -8Q407 -8 377 17T346 92Q346 159 396 159H399ZM178 -160Q200 -160 216 -132T232 -75Q232 -63 228 -56T203 -26Q196 -18 192 -14Q185 -5 176 5T161 20T156 27L153 28Q151 28 146 8T137 -42T132 -89Q132 -160 178 -160",8501:"590 427Q581 427 579 433T575 450T568 470V468L532 288L541 281Q620 220 634 165L637 154V124Q637 74 628 46Q623 32 612 16T592 0Q580 0 578 19T569 69T538 121Q532 126 385 240T236 355Q234 355 231 338T225 291T222 237Q222 222 223 213T225 201T228 195T231 190Q238 179 261 160T300 119T316 73Q316 41 291 23T231 1Q226 0 149 0H98Q73 0 69 3T64 24Q64 43 67 47T85 51H89Q119 51 134 55T152 64T154 76Q154 95 125 141T96 220Q96 243 104 270T123 319T145 360T164 391T172 404T150 421T102 468T68 529L65 541V570Q65 620 74 648Q79 664 91 679T111 694Q122 694 123 675T132 625T164 573Q168 569 319 452T471 335Q471 337 486 409T502 488Q502 489 491 493T467 511T448 546V573Q448 602 452 624T462 659T474 680T486 691T493 694Q499 694 502 691T507 682T513 673Q517 667 534 651T557 630Q558 629 590 616T631 587Q638 577 638 543Q637 489 622 458T590 427",8592:"1063 281Q1084 268 1084 251Q1084 231 1063 221L649 220H235Q340 133 364 17Q368 1 368 -2Q368 -16 343 -17Q340 -17 338 -17H332Q317 -17 314 -14T305 6Q298 34 285 62T247 126T179 189T78 233Q64 237 64 251Q64 261 74 265T108 277T154 297Q212 328 251 379T305 495Q309 511 313 514T333 518H338Q363 517 367 510Q368 507 368 503Q368 500 364 484Q345 401 287 331Q254 295 235 282L649 281H1063",8593:"33 396Q14 396 14 423Q14 445 18 449T41 459Q72 466 99 478T147 505T185 537T215 571T238 604T254 635T264 661T270 678L272 685Q276 694 288 694Q298 692 300 689T307 672Q331 592 392 535T535 459Q553 454 557 450T561 423Q561 396 542 396Q531 396 501 405T418 443T329 517L319 529L318 179V-171Q307 -193 288 -193Q265 -193 258 -171L257 179V529L247 517Q209 473 158 444T76 405T33 396",8594:"65 251Q65 270 87 281H500L914 282Q881 304 842 357T785 482Q781 500 781 501Q781 512 792 517Q794 518 812 518H817Q832 518 835 515T844 495Q864 412 923 351T1065 270Q1085 263 1085 251Q1085 240 1077 236T1044 225T995 204Q937 173 898 122T844 6Q840 -10 836 -13T816 -17H811Q786 -16 782 -9Q781 -6 781 -2Q781 1 785 17Q813 138 914 220H500L87 221Q65 228 65 251",8595:"14 77Q14 104 33 104Q44 104 74 96T156 57T247 -17L257 -29V321Q257 669 259 675Q268 694 289 694Q295 693 300 691T307 686T313 679T318 672V321L319 -29L329 -17Q366 26 417 55T499 94T542 104Q561 104 561 77Q561 56 557 51T535 41Q481 28 438 0T370 -58T330 -119T308 -167T302 -187Q297 -194 288 -194Q278 -194 273 -186T265 -165T251 -127T220 -77Q151 15 41 41Q22 46 18 50T14 77",8596:"305 495Q309 511 313 514T333 518H338Q363 517 367 510Q368 507 368 503Q368 500 364 484Q345 401 287 331Q254 295 235 282L404 281H744L914 282Q880 305 839 362T785 484Q781 500 781 503Q781 517 806 518Q809 518 811 518H817Q832 518 835 515T844 495Q864 412 923 351T1065 270Q1085 263 1085 251Q1085 240 1077 236T1044 225T995 204Q937 173 898 122T844 6Q840 -10 836 -13T816 -17H811Q786 -16 782 -9Q781 -6 781 -2Q781 1 785 17Q813 138 914 220H235Q340 133 364 17Q368 1 368 -2Q368 -16 343 -17Q340 -17 338 -17H332Q317 -17 314 -14T305 6Q298 34 285 62T247 126T179 189T78 233Q64 237 64 251Q64 261 74 265T108 277T154 297Q212 328 251 379T305 495",8597:"33 469Q14 469 14 496Q14 518 18 522T41 532Q121 551 182 608T268 745Q275 767 288 767Q299 767 303 755T320 713T355 650Q424 558 535 532Q553 527 557 523T561 496Q561 469 542 469Q531 469 501 478T418 516T329 590L319 602L318 426V74L319 -102L329 -90Q366 -47 417 -18T499 21T542 31Q561 31 561 4Q561 -17 557 -22T535 -32Q454 -51 393 -108T307 -245Q300 -267 288 -267Q279 -267 274 -259T266 -238T250 -200T220 -150Q151 -58 41 -32Q22 -27 18 -23T14 4Q14 31 33 31Q44 31 74 23T156 -16T247 -90L257 -102V602L247 590Q209 546 158 517T76 478T33 469",8598:"429 724Q438 724 452 711T466 690Q466 681 452 671Q361 602 242 599H218L756 135Q832 69 913 -1T1036 -108L1077 -143Q1084 -151 1084 -163Q1084 -180 1074 -187T1054 -194H1052Q1043 -194 939 -105Q866 -42 812 5Q180 549 178 549V546Q179 542 179 539Q183 520 183 483Q183 435 172 390T149 323T130 296Q121 292 115 295Q85 312 85 328Q85 331 95 350T115 406T125 486Q125 540 110 583T79 648T64 675Q64 681 68 687T81 693Q87 693 94 690Q162 657 232 657Q296 657 349 681T420 722Q422 724 429 724",8599:"1069 693Q1076 693 1080 687T1085 675Q1085 671 1076 656T1055 621T1034 565T1024 486Q1024 442 1034 406T1054 351T1064 328Q1064 321 1057 313T1042 300L1034 295Q1030 293 1027 293Q1023 293 1020 295T1014 301T1009 308T1005 316T1001 324Q980 368 971 419Q966 442 966 484V492Q966 528 972 553Q971 553 757 368T328 -3T107 -191Q103 -193 94 -193Q78 -193 71 -184T64 -164Q64 -153 72 -143Q79 -136 382 124L934 599H909Q837 599 760 634T683 690Q683 697 696 710T722 724Q726 724 742 714T779 691T838 668T920 657Q959 657 991 666T1043 684T1069 693",8600:"65 663Q65 680 74 687T93 694H96Q104 694 118 683T204 610Q280 545 338 495Q969 -49 971 -49L970 -46Q970 -42 970 -39Q966 -20 966 18Q966 65 977 110T1001 177T1019 204Q1028 208 1034 205Q1064 188 1064 172Q1064 169 1054 150T1034 94T1024 14Q1024 -28 1033 -64T1054 -120T1075 -155T1085 -175Q1085 -181 1081 -187T1068 -193Q1062 -193 1055 -190Q987 -157 919 -157Q817 -157 739 -215Q727 -224 720 -224Q712 -224 697 -210Q683 -199 683 -190T697 -171Q788 -102 907 -99H931L393 365Q317 431 236 501T114 608L72 643Q65 651 65 663",8601:"80 -193Q73 -193 69 -187T64 -175Q64 -172 79 -150T109 -84T125 14Q125 58 115 94T95 149T85 172Q85 179 92 187T108 200L115 205Q119 207 122 207Q126 207 129 205T135 199T140 192T144 184T148 176Q169 132 178 81Q183 58 183 17Q183 -7 182 -24T178 -48L177 -53Q178 -53 389 129T816 498T1043 692Q1049 694 1054 694Q1070 694 1077 684T1085 664Q1085 653 1077 643Q1070 636 767 376L215 -98L240 -99Q312 -99 389 -134T466 -190Q466 -197 452 -210T429 -224Q422 -224 411 -215Q330 -157 229 -157Q190 -157 158 -166T106 -184T80 -193",8614:"65 426Q74 448 95 448Q112 448 125 426V281H500L914 282Q881 304 842 357T785 482Q781 500 781 501Q781 512 792 517Q794 518 812 518H817Q832 518 835 515T844 495Q864 412 923 351T1065 270Q1085 263 1085 251Q1085 240 1077 236T1044 225T995 204Q937 173 898 122T844 6Q840 -10 836 -13T816 -17H811Q786 -16 782 -9Q781 -6 781 -2Q781 1 785 17Q813 138 914 220H500L135 221Q134 221 133 221T130 220H125V76Q115 54 95 54Q73 54 65 76V426",8617:"1029 475Q1029 505 1068 505Q1129 501 1173 463T1218 363Q1218 296 1170 259T1066 221H1063L649 220H235Q340 133 364 17Q368 1 368 -2Q368 -16 343 -17Q340 -17 338 -17H332Q317 -17 314 -14T305 6Q298 34 285 62T247 126T179 189T78 233Q64 237 64 251Q64 261 74 265T108 277T154 297Q212 328 251 379T305 495Q309 511 313 514T333 518H338Q363 517 367 510Q368 507 368 503Q368 500 364 484Q345 401 287 331Q254 295 235 282L649 281H1063Q1105 284 1131 305T1158 361Q1158 385 1146 401Q1122 441 1063 444Q1029 446 1029 475",8618:"225 221H218Q159 221 112 260T65 363Q65 431 116 468T221 505Q254 503 254 474Q254 456 245 450T216 443T188 438Q152 427 137 401Q125 385 125 362Q125 334 147 310Q171 288 221 281H632L1046 282Q1013 304 974 357T917 482Q913 500 913 501Q913 512 924 517Q926 518 944 518H949Q964 518 967 515T976 495Q996 412 1055 351T1197 270Q1217 263 1217 251Q1217 240 1209 236T1176 225T1127 204Q1069 173 1030 122T976 6Q972 -10 968 -13T948 -17H943Q918 -16 914 -9Q913 -6 913 -2Q913 1 917 17Q945 138 1046 220H632L225 221",8636:"1063 281Q1084 268 1084 251Q1084 231 1063 221L572 220Q79 220 77 221Q64 225 64 244Q64 250 64 254T67 261T71 265T78 268T85 272Q142 302 189 345T258 421T296 484T315 516Q319 518 337 518Q358 518 363 512Q370 504 367 496Q360 469 319 404T219 290L209 282L636 281H1063",8637:"1063 281Q1084 268 1084 251Q1084 231 1063 221L636 220H209L219 212Q278 162 319 97T367 5Q370 -3 363 -11Q358 -17 337 -17H332Q318 -17 314 -14T302 7Q278 55 246 95T185 160T130 202T88 228L70 237Q64 243 64 257Q64 274 75 279Q78 281 571 281H1063",8640:"65 251Q65 270 87 281H513L940 282L930 290Q871 338 830 403T782 496Q779 510 791 517Q794 518 812 518H817Q831 518 835 515T847 494Q871 445 903 404T966 338T1022 298T1064 272T1083 259Q1085 255 1085 245Q1085 225 1072 221Q1070 220 578 220L87 221Q65 228 65 251",8641:"84 279Q89 281 580 281Q1070 281 1074 279Q1085 275 1085 256Q1085 245 1083 241T1066 230Q919 153 847 7Q839 -11 835 -14T817 -17H812Q791 -17 786 -11Q779 -3 782 5Q789 31 830 96T930 212L940 220H513L87 221Q64 229 64 250Q64 272 84 279",8652:"65 451Q65 470 87 481H513L940 482L930 490Q871 538 830 603T782 696Q779 710 791 717Q794 718 812 718H817Q831 718 835 715T847 694Q871 645 903 604T966 538T1022 498T1064 472T1083 459Q1085 455 1085 445Q1085 425 1072 421Q1070 420 578 420L87 421Q65 428 65 451ZM1063 281Q1084 268 1084 251Q1084 231 1063 221L636 220H209L219 212Q278 162 319 97T367 5Q370 -3 363 -11Q358 -17 337 -17H332Q318 -17 314 -14T302 7Q278 55 246 95T185 160T130 202T88 228L70 237Q64 243 64 257Q64 274 75 279Q78 281 571 281H1063",8656:"1063 169L1068 166Q1072 163 1074 162T1079 157T1083 149T1085 139Q1085 118 1063 109L733 108H404L412 99Q455 50 488 -10Q498 -27 493 -37Q487 -46 465 -46H460Q446 -46 439 -39T426 -18T399 25T344 89Q239 194 99 229Q96 230 92 231T85 232T79 234T73 235T69 237T66 240T65 244T64 250Q64 267 90 271Q197 295 286 361T430 525Q439 542 442 544T460 547H465Q487 547 492 539Q496 531 496 530Q496 521 471 482T414 405L404 394L733 393H1063Q1064 392 1069 389T1076 384T1082 375T1085 362Q1085 344 1063 333L700 332H338L324 321Q283 290 230 264L205 250Q266 224 323 180L338 170L700 169H1063",8657:"672 343Q672 326 670 320T657 313Q644 313 602 335Q577 349 557 361T527 381T509 395T499 403T495 406T494 118Q494 -166 492 -174Q484 -193 465 -193H463Q456 -193 453 -192T444 -186T433 -170V465L423 477Q407 495 394 514T367 554T351 579Q349 576 339 560T313 520T279 477L269 465V-22V-102Q269 -132 269 -145T268 -169T266 -180T260 -185T253 -191Q248 -193 239 -193H237Q218 -193 210 -174Q208 -166 208 118Q208 406 207 406L199 399Q191 392 165 374T100 335Q58 313 45 313Q35 313 33 319T30 343V349Q30 359 30 362T35 369T45 374T66 383T100 401Q267 499 333 680Q339 694 351 694Q361 694 365 687T380 652T407 597Q442 536 489 489T573 420T638 383T670 365Q672 361 672 343",8658:"64 362Q64 380 87 393H416L745 394L735 405Q708 436 681 477T654 531Q654 547 679 547H684H689Q703 547 710 540T723 519T750 475T806 411Q914 303 1059 271Q1060 271 1063 270T1068 269T1072 268T1076 266T1079 264T1082 260T1083 256T1084 250Q1084 242 1080 238T1063 231T1035 225T992 211T934 185Q797 112 719 -24Q710 -40 706 -43T689 -46H684Q653 -46 653 -31Q653 -24 661 -10Q694 50 737 99L745 108H416L87 109Q64 117 64 139Q64 156 87 169H449L812 170L826 180Q842 193 860 204T892 223T918 237T937 246L944 250L919 264Q866 290 825 321L811 332H449L87 333Q64 343 64 362",8659:"30 157Q30 174 32 180T46 187Q59 187 104 163Q154 136 198 101L207 94Q208 94 208 382Q208 666 210 674Q219 694 241 694Q254 692 262 683Q266 679 267 674Q269 658 269 522V35L279 23Q295 5 308 -14T335 -54T351 -79Q353 -76 363 -60T389 -20T423 23L433 35V671Q439 682 444 686T452 692T463 693H465Q484 693 492 674Q494 666 494 382Q494 94 495 94L504 101Q547 135 593 160T652 187Q665 191 671 177Q672 175 672 157Q672 137 669 134T636 116Q606 101 578 83T528 47T486 9T452 -30T424 -68T403 -103T387 -134T377 -159T370 -176L367 -184Q360 -194 351 -194Q345 -194 342 -192T334 -182T327 -166T315 -137T295 -97Q260 -36 213 11T129 80T63 117T32 136Q30 139 30 157",8660:"336 497Q358 541 363 544Q367 547 379 547H384Q401 547 405 545Q418 538 414 525T389 474T346 408L335 393H814L803 408Q781 436 760 474T735 525T744 545Q748 547 765 547Q771 547 774 547T780 546T786 544T790 541T794 535T799 527T805 514T813 497Q841 446 877 406T950 340T1014 301T1068 276L1096 265Q1102 259 1102 251Q1102 240 1085 232Q981 195 902 121Q835 56 798 -25Q791 -40 787 -43T765 -46T744 -44Q735 -40 735 -30Q735 -15 760 28T806 98L814 108H335L343 98Q361 75 378 46T404 -1T414 -24Q418 -37 405 -44Q401 -46 384 -46T363 -43T351 -25Q314 56 247 121Q216 150 182 173T125 206T79 226T53 237Q47 243 47 251Q47 254 47 256T49 261T52 264T57 267T61 268T66 270T71 272Q246 335 336 497ZM985 251Q932 280 882 323L871 332H278Q264 321 253 311T237 297T214 282T164 251L176 244Q221 218 278 169H871Q928 218 973 244L985 251",8661:"49 441Q30 441 30 464V471V480Q30 498 44 502Q237 573 331 750Q337 767 351 767Q360 767 368 753T400 702T460 629Q504 584 552 554T632 511T666 497Q672 493 672 471Q672 454 670 449Q664 441 653 441Q639 443 591 465T508 513L495 522L494 386V114L495 -22L508 -13Q543 12 591 34T653 59Q672 59 672 36V29V20Q672 2 658 -2Q465 -71 367 -257Q360 -267 351 -267Q343 -267 336 -257T320 -231T292 -187T242 -129Q198 -84 150 -54T70 -11T36 3Q30 7 30 29Q30 46 32 51Q38 59 49 59Q63 57 111 35T194 -13L208 -22V522L194 513Q159 488 111 466T49 441ZM422 584Q411 594 400 606T383 626T366 648T351 667Q349 665 339 652T314 620T280 584L269 573V-73L280 -84Q305 -108 351 -166Q353 -164 363 -151T389 -119T422 -84L433 -73V573L422 584",8704:"1 664Q-2 685 23 693H27Q46 693 54 680T102 578L148 475H492L533 570Q541 586 548 603T560 630T569 650T576 667T582 678T588 686T594 691T600 693T609 694Q622 694 631 684T639 662Q637 653 492 325T341 -8Q333 -16 320 -16Q306 -16 298 -8Q294 -4 147 326L1 656V664ZM464 414H319Q175 414 175 413L319 88L464 414",8707:"81 347Q81 359 84 363T104 378H513V633H300L87 634Q64 642 64 664Q64 685 84 692Q89 694 321 694H552Q571 681 574 669V25Q567 7 552 1H87Q64 12 64 30T87 61H513V317H308Q103 317 99 319Q81 328 81 347",8709:"285 711Q307 711 326 708T357 701T370 698Q371 698 375 710T383 735T389 750Q395 767 415 767Q431 767 438 757T446 738T436 701T426 670Q426 668 433 664Q468 633 489 588Q511 542 519 488T528 344Q528 286 524 243T508 150T466 63T394 6Q345 -17 287 -17Q265 -17 246 -14T216 -7T203 -4Q191 -47 183 -60T159 -73Q146 -73 137 -63T128 -44Q128 -38 138 -7L148 24L141 30Q134 35 120 49Q94 77 78 113T56 194T48 268T46 344Q46 388 47 416T56 494T78 577T122 644T194 694Q239 711 285 711ZM351 639Q350 639 346 642T337 648T325 654T306 658T283 660Q254 660 221 638T181 567Q171 513 171 375Q171 164 182 129L351 639ZM402 356Q402 516 395 555Q395 557 395 559T394 563T394 566L393 568L223 57Q252 34 286 34H288Q318 34 346 53T387 109Q402 152 402 329V356",8710:"901 12Q901 7 892 0H479Q65 0 62 2Q56 6 56 11Q56 14 242 347T433 685Q438 694 450 696Q454 698 480 698H506L523 687Q526 683 711 354T899 17Q901 13 901 12ZM653 137L427 538L202 137L315 136H540L653 137",8712:"97 251Q97 393 194 484T417 586Q418 586 436 586T482 586T538 587H648Q649 586 652 584T658 580T664 575T668 568T670 557Q670 536 648 527L534 526Q515 526 491 526T457 526T435 526T417 525T404 523T390 521T374 517Q298 498 243 447T167 324Q159 295 159 283Q159 281 403 281H648Q649 280 652 278T658 274T664 269T668 262T670 251Q670 230 648 221L403 220Q159 220 159 218Q159 206 166 182T190 122T247 50T341 -6Q380 -20 405 -22T534 -25H648Q649 -26 654 -29T661 -34T667 -43T670 -56Q670 -74 648 -85L541 -86Q419 -86 396 -82Q276 -65 187 24T97 251",8713:"126 -210Q116 -210 107 -203T97 -179Q97 -171 99 -166Q99 -165 111 -145T150 -80T203 8Q97 104 97 251Q97 393 194 484T417 586Q418 586 436 586T482 586T538 587H549Q565 614 582 643T608 685L616 698Q623 711 641 711Q651 711 660 704T670 681Q670 672 667 667Q666 666 661 657T644 627T620 587H648Q649 586 652 584T658 580T664 575T668 568T670 557Q670 536 648 527L584 526L437 281H648Q649 280 652 278T658 274T664 269T668 262T670 251Q670 230 648 221L403 220H401L283 23Q311 5 341 -6Q380 -20 405 -22T534 -25H648Q649 -26 654 -29T661 -34T667 -43T670 -56Q670 -74 648 -85L541 -86Q419 -86 396 -82Q320 -71 252 -29Q152 -197 148 -201Q139 -210 126 -210ZM235 62L330 220Q159 219 159 218Q159 196 176 150T235 62ZM366 281L513 526Q503 526 487 526T465 526T448 525T433 525T422 525T412 524T403 523T394 521T385 519T374 517Q298 498 243 447T167 324Q159 295 159 283Q159 281 366 281",8715:"96 251Q96 268 119 281H363Q607 281 607 283Q607 295 600 319T576 379T519 451T425 507Q386 521 361 523T233 526L119 527Q96 535 96 557Q96 578 116 585Q121 587 229 587Q238 587 257 587T288 588Q366 588 435 568T568 488Q670 388 670 251Q670 155 621 78T499 -39T345 -85Q336 -86 225 -86L119 -85Q96 -77 96 -55Q96 -38 119 -25H233Q356 -24 371 -21Q373 -21 393 -16Q468 3 523 55T599 177Q607 206 607 218Q607 220 363 220L119 221Q96 229 96 251",8722:"119 221Q96 230 96 251T116 279Q121 281 448 281H775Q776 280 779 278T785 274T791 269T795 262T797 251Q797 230 775 221H119",8723:"64 155Q64 172 87 185H416V476H251L87 477Q64 485 64 507Q64 528 84 535Q89 537 448 537H807Q808 536 811 534T817 530T823 525T827 518T829 507Q829 486 807 477L642 476H477V185H807Q808 184 811 182T817 178T823 173T827 166T829 155Q829 134 807 125L642 124H477V-39Q477 -203 475 -208Q466 -227 446 -227Q427 -227 417 -205L416 -41V124H251L87 125Q64 133 64 155",8725:"451 730Q460 750 479 750Q492 750 501 740T510 718Q508 708 318 244L122 -232Q112 -250 95 -250Q82 -250 73 -241T64 -218Q66 -205 258 261T451 730",8726:"64 718Q63 731 72 740T94 750Q106 750 113 743Q118 741 122 732L318 256Q508 -208 510 -218Q511 -231 502 -240T480 -250Q460 -250 451 -230Q451 -229 259 238T64 718",8727:"236 431Q237 447 251 459T287 472T323 459T338 431Q338 423 328 363L317 300Q318 300 340 317T392 356T435 387Q442 390 450 390Q470 390 485 374T501 335Q501 326 500 320T494 309T486 300T473 293T458 287T438 280T414 272L353 250L414 228Q422 225 436 221T457 214T472 208T485 201T493 192T499 181T501 166Q501 141 484 126T450 111Q447 111 445 111T441 111T437 112T433 114T428 117T422 121T414 127T404 135T391 145T374 158L317 200L328 137Q338 77 338 69Q336 52 321 40T287 28T253 40T236 69Q236 77 246 137L257 200Q256 200 234 183T182 144T139 113Q132 110 124 110Q104 110 89 126T73 165Q73 174 74 180T80 191T88 200T101 207T116 213T136 220T160 228L221 250L160 272Q152 275 138 279T117 286T102 292T89 299T81 308T75 319T73 334Q73 359 90 374T124 389Q127 389 129 389T133 389T137 388T141 386T146 383T152 379T160 373T170 365T183 355T200 342L257 300L246 363Q236 423 236 431",8728:"64 251Q64 303 80 344T121 409T175 448T230 469T275 474Q277 474 283 474T292 473Q385 473 447 415T510 251Q510 149 449 89T287 28T126 88T64 251ZM448 251Q448 325 405 369T286 413Q215 413 171 371T126 251Q126 177 168 133T287 89Q361 89 404 132T448 251",8729:"64 251Q64 303 80 344T121 409T175 448T230 469T275 474Q277 474 283 474T292 473Q385 473 447 415T510 251Q510 149 449 89T287 28T126 88T64 251",8730:"107 178Q100 178 89 188T78 207Q78 216 84 220Q85 221 124 248T207 304T260 338Q269 340 275 335Q276 334 370 156L463 -20L698 393Q928 800 935 811Q944 820 954 820Q972 820 980 811T988 789Q988 781 858 553Q776 409 718 306Q452 -166 447 -171Q439 -179 422 -180Q405 -180 400 -175Q399 -174 346 -73T241 128T187 229L151 205Q111 178 107 178",8733:"65 222Q65 282 88 329T144 401T208 438T261 451H273Q312 451 320 450Q456 431 526 330L537 316Q638 451 778 451Q813 451 830 445V388Q821 391 799 391Q758 391 721 377T660 342T618 301T592 266L584 251Q648 152 697 114Q748 74 804 74H806Q823 74 829 77Q830 77 830 38V-1L820 -3Q801 -7 786 -7H771Q699 -7 632 25T527 114L516 128Q414 -8 276 -8Q192 -8 129 56T65 222ZM256 53Q296 53 332 67T392 102T434 143T461 178L469 193Q405 292 356 330Q308 369 251 369H243Q196 369 156 328T116 221Q116 191 124 161T158 99T225 55Q234 53 256 53",8734:"65 219Q65 318 132 385T302 452Q473 452 573 331L589 312L596 320Q710 452 857 452Q948 452 1016 386T1084 225Q1084 125 1017 59T848 -8Q679 -8 576 113L560 132L553 124Q439 -8 292 -8Q200 -8 133 58T65 219ZM1033 224Q1033 291 987 340T875 389Q748 389 648 261Q641 253 642 251Q717 163 748 137Q813 81 880 81Q941 81 987 120T1033 224ZM275 56Q315 56 353 70T418 104T466 144T497 178L507 192Q507 193 474 230T441 269Q355 362 267 362Q210 362 163 324T116 221Q116 150 162 103T275 56",8736:"71 0L68 2Q65 3 63 5T58 11T55 20Q55 21 56 23V25Q55 27 55 30Q55 31 56 33V35Q55 37 55 40Q55 42 57 48Q67 63 346 381Q421 467 518 578Q607 680 623 697T647 714Q656 714 661 708T666 694V692Q676 687 676 674Q676 668 673 663Q672 662 637 622T534 503T400 350L147 61L386 60H653Q666 50 666 40V38Q676 31 676 20Q676 8 661 0H71",8739:"160 -249Q138 -249 129 -225V250Q129 725 131 729Q139 750 159 750T190 725V-225Q181 -249 160 -249",8741:"205 -225Q201 -234 199 -237T191 -244T175 -248T161 -246Q151 -240 146 -229Q145 -224 145 251Q145 725 146 730Q156 750 176 750Q193 748 205 727V-225ZM369 727L372 732Q375 737 377 740T385 747T398 750Q406 750 413 747Q423 740 428 730Q430 720 430 251Q430 -219 428 -229Q423 -240 413 -246Q408 -248 400 -248Q393 -248 388 -247T379 -242T375 -236T371 -230L369 -225V727",8743:"95 -16Q78 -16 71 -6T64 14Q64 20 65 22L212 308Q359 593 361 595Q370 604 385 604Q398 602 405 595Q407 593 554 308L701 22Q702 20 702 15Q702 1 693 -8T671 -17Q661 -17 651 -9Q647 -5 515 251L383 506L251 251Q119 -5 116 -8Q108 -16 95 -16",8744:"64 572Q64 585 72 594T94 604T116 595Q119 592 251 336L383 81L515 336Q647 592 651 596Q661 604 671 604Q684 604 693 595T702 572Q702 567 701 565L554 279Q407 -6 405 -8Q404 -9 401 -11T397 -14Q392 -16 383 -16H380Q369 -16 361 -8Q359 -6 212 279L65 565Q65 566 65 568T64 572",8745:"94 -16Q73 -16 64 8V209Q64 239 64 287Q65 418 69 432Q70 434 70 435Q84 487 125 523T216 575T299 597T354 603H372Q444 603 501 590T591 558T648 515T681 471T696 435Q696 434 697 432Q701 417 702 309Q702 303 702 287Q702 239 702 209V8Q693 -16 672 -16Q650 -16 643 3Q641 8 641 201Q641 397 640 403Q631 472 558 507T383 542Q339 542 298 535T219 511T156 468T126 403Q125 397 125 201Q125 8 123 3Q116 -16 94 -16",8746:"672 603Q693 603 702 579V378Q702 348 702 300Q701 169 697 155Q696 153 696 152Q676 78 593 31T383 -16Q265 -16 179 28T70 152Q70 153 69 155Q65 170 64 278Q64 285 64 300Q64 348 64 378Q64 579 65 583Q74 604 94 604T123 584Q125 579 125 386Q125 190 126 184Q135 115 210 80T383 44Q426 44 467 51T546 75T609 119T640 184Q641 190 641 386Q641 579 643 584Q650 603 672 603",8747:"204 -71Q204 -108 181 -124T137 -141Q132 -141 132 -142Q142 -161 154 -161Q164 -161 186 -152Q200 -145 210 -135T228 -107T241 -77T249 -38T254 -2T258 38T262 74Q282 265 334 489Q334 490 337 503T341 523T347 544T355 569T365 594T379 620T397 643T420 666T447 685T481 700Q511 711 539 711T587 696T616 656T628 612T632 573Q632 536 610 519T562 501Q534 501 513 519T492 571Q492 608 515 624T559 641Q564 641 564 642Q554 661 542 661Q532 661 510 652Q496 645 486 635T468 607T455 577T447 538T442 502T438 462T434 426Q414 235 362 11Q352 -35 347 -54T328 -101T291 -152Q235 -208 162 -211Q147 -211 136 -208T109 -196T83 -165T67 -108Q64 -94 64 -73Q64 -37 86 -19T134 -1Q162 -1 183 -19T204 -71",8764:"64 155Q64 210 84 262T150 353T257 391Q300 391 341 371T417 321T484 264T557 215T637 194Q702 194 745 244T788 367Q796 391 808 391Q815 391 821 381T828 353V342Q828 252 776 181T637 109Q594 109 552 129T476 179T409 236T336 285T256 306Q193 306 149 258T105 132Q98 109 86 109Q76 109 70 122T64 155",8768:"64 561Q64 570 76 576T108 583Q174 583 214 535T254 407Q254 368 238 324T202 248T166 173T149 92Q149 43 169 2T217 -39Q231 -40 242 -46T254 -60Q254 -69 241 -75T210 -82Q145 -82 105 -34T64 93Q64 133 80 177T116 253T152 328T169 408Q169 461 148 500T105 540Q92 540 78 545T64 561",8771:"64 295Q64 378 117 440T257 502Q298 502 339 485T416 443T486 394T560 352T637 335Q693 335 740 373T788 478Q796 502 808 502Q815 502 821 492T828 465V455Q828 365 771 308T640 250Q603 250 562 265T501 294T439 336L370 382Q308 417 256 417Q205 417 164 388T110 317Q110 316 109 304T107 286T103 270T97 255T86 250Q76 250 70 263T64 295ZM64 6T64 27T87 56H93Q99 56 110 56T137 56T173 56T217 56T267 57T323 57T383 57T448 57H807Q808 56 811 54T815 52T819 49T823 45T826 40T828 34T829 27Q829 7 807 -3H87Q64 6 64 27",8773:"64 402Q64 457 84 509T150 600T257 638Q300 638 341 618T417 569T484 511T557 462T637 441Q702 441 745 491T788 614Q796 638 808 638Q815 638 821 628T828 600V589Q828 499 776 428T637 356Q594 356 552 376T476 425T409 483T336 532T256 553Q193 553 149 505T105 379Q98 356 86 356Q76 356 70 369T64 402ZM87 197Q64 207 64 226Q64 247 84 255Q89 257 448 257H807Q808 256 811 254T817 250T823 245T827 238T829 227Q829 209 807 197H87ZM87 -27Q64 -18 64 3Q64 23 86 32Q89 33 448 33H807L812 30Q816 27 818 26T823 21T827 13T829 3Q829 -18 807 -27H87",8776:"64 345Q64 423 119 473T250 524Q301 524 356 503T451 455T542 407T636 385Q700 385 743 417T786 481Q786 493 791 508T807 524Q817 524 823 512T829 479Q829 404 776 352T638 300Q590 300 537 321T443 369T352 417T256 439Q207 439 166 417T110 359Q109 357 107 341T100 312T85 300Q77 300 71 313T64 345ZM64 77Q64 155 119 205T250 256Q302 256 357 235T451 187T541 139T636 117Q699 117 742 148T786 213Q786 231 792 243T808 256T823 242T829 208Q829 134 776 83T640 32Q591 32 537 53T443 101T352 149T256 171Q206 171 165 148T110 91Q109 89 107 73T100 44T85 32Q77 32 71 45T64 77",8781:"798 533Q812 533 820 524T829 502T819 480T769 440Q655 355 537 330Q492 322 447 322Q401 322 356 330Q289 344 219 381T118 443T73 481Q64 490 64 503Q64 517 72 525T94 533Q99 533 102 532Q107 531 138 507T209 456T314 405T446 382Q604 382 765 515Q788 533 798 533ZM95 -32Q81 -32 73 -23T64 -1Q64 10 74 21T124 61Q213 127 293 153T421 179L422 180Q424 180 426 180T432 180T441 180T452 179Q612 179 769 61Q811 29 820 19T829 -1Q829 -14 821 -23T798 -32Q788 -32 765 -14Q608 118 446 118Q287 118 128 -14Q105 -32 95 -32",8784:"87 333Q64 343 64 362Q64 383 84 391Q89 393 448 393H807Q808 392 811 390T817 386T823 381T827 374T829 363Q829 345 807 333H87ZM87 109Q64 118 64 139Q64 159 86 168Q89 169 448 169H807L812 166Q816 163 818 162T823 157T827 149T829 139Q829 118 807 109H87ZM362 635Q362 671 387 696T444 721Q488 721 510 693T533 635Q533 606 512 579T448 551Q406 551 384 577T362 635",8800:"189 -210Q179 -210 170 -203T160 -179Q160 -171 162 -166Q165 -163 327 109H87Q64 118 64 139Q64 159 86 168Q89 169 363 169L461 333H87Q64 343 64 362Q64 383 84 391Q89 393 448 393H496Q533 455 583 539T656 660T679 698Q686 711 704 711Q714 711 723 704T733 681Q733 672 730 667Q729 664 709 631T645 523T567 393H807Q808 392 811 390T817 386T823 381T827 374T829 363Q829 345 807 333H532L433 169H807L812 166Q816 163 818 162T823 157T827 149T829 139Q829 118 807 109H398Q217 -195 211 -201Q202 -210 189 -210",8801:"87 445Q64 454 64 475Q64 497 84 503Q89 505 448 505H807Q808 504 812 502T818 497T823 492T827 484T829 474Q829 456 807 445H87ZM87 221Q64 230 64 251T84 279Q89 281 448 281H807Q808 280 811 278T817 274T823 269T827 262T829 251Q829 230 807 221H87ZM64 6T64 27T87 56H93Q99 56 110 56T137 56T173 56T217 56T267 57T323 57T383 57T448 57H807Q808 56 811 54T815 52T819 49T823 45T826 40T828 34T829 27Q829 7 807 -3H87Q64 6 64 27",8804:"797 55Q797 45 790 35T767 25H759L434 180Q108 336 105 339Q96 348 96 360Q96 378 114 388Q126 394 439 544T757 695Q763 697 766 697Q780 697 788 688T797 666Q797 654 788 645Q784 641 507 509T197 361L466 232Q785 80 790 74Q797 66 797 55ZM119 -199Q96 -191 96 -169Q96 -160 102 -152T119 -140H124Q130 -140 140 -140T164 -140T197 -140T237 -140T283 -139T334 -139T389 -139T448 -139H775Q797 -153 797 -169Q797 -187 775 -199H119",8805:"127 25Q110 25 103 34T96 54Q96 66 105 75Q109 80 439 238L696 361Q113 637 105 645Q96 654 96 667Q96 679 104 688T128 697Q137 696 460 541T788 382Q797 373 797 360Q797 348 788 339Q785 336 459 180L135 25H127ZM119 -199Q96 -191 96 -169Q96 -160 102 -152T119 -140H124Q130 -140 140 -140T164 -140T197 -140T237 -140T283 -139T334 -139T389 -139T448 -139H775Q797 -153 797 -169Q797 -187 775 -199H119",8810:"734 -74T734 -86T727 -107T704 -116H702Q694 -116 584 -55Q473 7 380 58Q87 219 73 229Q64 238 64 250Q64 263 73 272Q87 282 380 443Q695 616 699 617H700Q718 617 726 607T734 588Q734 568 717 560Q705 554 435 404L157 250L439 94Q721 -61 726 -66Q734 -74 734 -86ZM1085 -74T1085 -86T1078 -107T1055 -116H1053Q1045 -116 935 -55Q824 7 731 58Q438 219 424 229Q415 238 415 250Q415 263 424 272Q438 282 731 443Q1046 616 1050 617H1051Q1069 617 1077 607T1085 588Q1085 568 1068 560Q1056 554 786 404L508 250L790 94Q1072 -61 1077 -66Q1085 -74 1085 -86",8811:"64 588Q64 600 72 609T94 618H95Q103 618 209 559Q322 496 419 443Q712 282 725 272Q734 263 734 250Q734 238 725 229Q714 220 415 55T110 -113Q103 -116 95 -116Q78 -116 71 -106T64 -86Q64 -74 72 -66Q77 -61 359 94L641 250L363 404Q277 452 173 509Q95 552 82 560T66 576V577Q64 585 64 588ZM415 588Q415 600 423 609T445 618H446Q454 618 560 559Q673 496 770 443Q1063 282 1076 272Q1085 263 1085 250Q1085 238 1076 229Q1065 220 766 55T461 -113Q454 -116 446 -116Q429 -116 422 -106T415 -86Q415 -74 423 -66Q428 -61 710 94L992 250L714 404Q628 452 524 509Q446 552 433 560T417 576V577Q415 585 415 588",8826:"797 -57Q797 -65 790 -75T766 -86Q748 -86 741 -74T733 -43T719 8T681 72Q647 112 588 141T475 185T343 207T230 216T136 219Q96 219 96 250Q96 280 132 280H136Q193 281 239 283T347 292T457 310T556 342T643 391T703 460T735 553Q741 585 763 585Q781 585 789 575T797 556Q797 540 792 513T758 434T682 345Q605 285 481 254L462 249Q483 246 526 233T633 185T733 104Q767 63 782 15T797 -57",8827:"96 556Q96 568 104 577T126 586Q152 586 158 553Q164 503 188 462T247 394T331 345T429 313T539 294T649 284T758 280H760Q797 280 797 250Q797 219 760 219H758Q627 217 529 204T347 160T216 77T158 -54Q152 -86 126 -86Q110 -86 103 -76T96 -57Q96 -41 101 -14T135 65T211 154Q288 214 412 245L431 250Q410 252 367 265T259 314T160 395Q127 435 112 483T96 556",8834:"96 251Q96 389 191 482T417 586Q418 586 428 586T456 586T496 586T546 587T601 587H775Q776 586 779 584T785 580T791 575T795 568T797 557Q797 536 775 527L597 526Q411 525 395 522Q390 521 370 516Q285 494 222 424T158 251Q158 131 246 53Q313 -9 408 -23Q417 -24 597 -25H775Q776 -26 781 -29T788 -34T794 -43T797 -56Q797 -74 775 -85H493Q407 -85 376 -79Q257 -55 177 35T96 251",8835:"96 -55Q96 -38 119 -25H296Q482 -24 498 -21Q503 -20 523 -15Q609 7 672 77T735 251T665 431T485 524Q476 525 296 526L119 527Q96 535 96 557Q96 578 116 585Q121 587 300 587Q451 586 476 585T522 579Q632 556 714 468T796 251Q796 112 695 13Q612 -65 497 -82Q473 -86 289 -86L119 -85Q96 -77 96 -55",8838:"96 361Q96 499 191 592T417 696Q418 696 428 696T456 696T496 696T546 697T601 697H775Q776 696 779 694T785 690T791 685T795 678T797 667Q797 646 775 637L597 636Q411 635 395 632Q390 631 370 626Q285 604 222 534T158 361Q158 241 246 163Q313 101 408 87Q417 86 597 85H775Q776 84 781 81T788 76T794 67T797 54Q797 36 775 25H493Q407 25 376 31Q257 55 177 145T96 361ZM149 -199Q127 -191 127 -169T149 -140H154Q160 -140 169 -140T192 -140T224 -140T262 -140T306 -139T354 -139T407 -139T463 -139H775Q776 -140 779 -142T785 -146T791 -151T795 -158T797 -169Q797 -190 775 -199H149",8839:"96 55Q96 72 119 85H296Q482 86 498 89Q503 90 523 95Q609 117 672 187T735 361T665 541T485 634Q476 635 296 636L119 637Q96 645 96 667Q96 688 116 695Q121 697 300 697Q451 696 476 695T522 689Q632 666 714 578T796 361Q796 222 695 123Q612 45 497 28Q473 24 289 24L119 25Q96 33 96 55ZM119 -199Q96 -190 96 -169T116 -141Q121 -139 433 -139H745Q766 -152 766 -170Q766 -190 745 -199H119",8846:"672 603Q693 603 702 579V378Q702 348 702 300Q701 169 697 155Q696 153 696 152Q676 78 593 31T383 -16Q265 -16 179 28T70 152Q70 153 69 155Q65 170 64 278Q64 285 64 300Q64 348 64 378Q64 579 65 583Q74 604 94 604T123 584Q125 579 125 386Q125 190 126 184Q135 115 210 80T383 44Q426 44 467 51T546 75T609 119T640 184Q641 190 641 386Q641 579 643 584Q650 603 672 603ZM353 412Q353 420 353 435T352 456Q352 483 358 495T385 507Q403 506 409 494T415 457Q415 451 415 436T414 411V341H558Q579 329 579 311Q579 289 558 281L486 280H414V136Q400 114 384 114Q363 114 354 136L353 208V280H281L209 281Q187 289 187 310Q187 328 209 341H353V412",8849:"127 25Q111 29 104 49V362L105 675Q114 693 127 696H132Q138 696 149 696T174 696T208 696T249 696T297 697T350 697T407 697T468 697H806Q828 683 828 666Q828 646 806 637L485 636H165V85H805Q806 84 809 82T813 80T817 77T821 73T824 68T826 62T827 55Q827 34 806 25H127ZM96 -190T96 -169T119 -140H125Q131 -140 141 -140T167 -140T201 -140T242 -140T290 -139T344 -139T402 -139T463 -139H805Q806 -140 809 -142T813 -144T817 -147T821 -151T824 -156T826 -162T827 -169Q827 -190 806 -199H119Q96 -190 96 -169",8850:"66 55Q66 74 89 85H728V636H408L88 637Q66 645 66 667T88 696H94Q99 696 110 696T135 696T169 696T210 696T258 697T311 697T368 697T429 697H767Q786 684 789 672V49Q782 31 767 25H88Q66 32 66 55ZM88 -199Q66 -191 66 -169Q66 -148 87 -140Q91 -139 433 -139H775Q776 -140 779 -142T783 -144T787 -147T791 -151T794 -156T796 -162T797 -169Q797 -189 775 -199H88",8851:"131 25Q121 1 100 1Q81 1 71 23L70 301Q70 579 72 583Q77 598 90 602Q95 604 385 604H674Q693 591 696 579V25Q686 1 665 1Q646 1 636 23L635 283V543H131V25",8852:"696 25Q689 7 674 1H93Q77 7 71 23L70 301Q70 579 72 583Q80 604 100 604T131 579V61H635V579Q644 603 666 603Q687 603 696 579V25",8853:"64 250Q64 350 98 426T189 546T307 610T434 632Q485 632 496 631Q572 621 635 592Q669 575 699 550T760 484T809 384T828 250Q828 77 725 -27T446 -132Q272 -132 168 -27T64 250ZM416 282V570H414Q341 564 285 535T202 475T156 397T134 332T128 287Q127 283 127 282H416ZM765 288Q760 344 743 389T700 462T647 512T589 543T538 560T499 568L483 570H478V282H766L765 288ZM416 -69V220H127Q130 195 131 189T138 155T150 115T168 76T196 35T234 0T286 -35Q337 -61 410 -69H416ZM483 -69Q554 -60 607 -33T687 21T733 93T756 156T764 209Q766 217 766 220H478V-69H483",8854:"64 250Q64 350 98 426T189 546T307 610T434 632Q485 632 496 631Q572 621 635 592Q669 575 699 550T760 484T809 384T828 250Q828 77 725 -27T446 -132Q272 -132 168 -27T64 250ZM765 288Q753 424 666 497T446 571T227 498T128 288L127 282H766L765 288ZM446 -70Q578 -70 666 4T765 213L766 220H127Q130 195 131 189T138 155T150 115T168 76T196 35T234 0T286 -35Q353 -70 446 -70",8855:"64 250Q64 350 98 426T189 546T307 610T434 632Q485 632 496 631Q572 621 635 592Q669 575 699 550T760 484T809 384T828 250Q828 77 725 -27T446 -132Q272 -132 168 -27T64 250ZM647 512Q567 571 447 571Q340 571 262 523Q237 507 237 505L342 399L447 295L657 505L647 512ZM298 356L192 461Q180 445 161 411Q126 341 126 251Q126 128 192 40L403 250L298 356ZM701 41Q704 41 719 63T750 138T767 250Q767 310 750 362T719 437T701 460L491 250L701 41ZM238 -5Q238 -8 261 -22T336 -53T447 -70Q567 -70 647 -11L657 -4L447 206L342 101Q238 -1 238 -5",8856:"64 250Q64 350 98 426T189 546T307 610T434 632Q485 632 496 631Q572 621 635 592Q669 575 699 550T760 484T809 384T828 250Q828 77 725 -27T446 -132Q272 -132 168 -27T64 250ZM657 505Q656 506 650 510T638 518T623 527T604 537T581 547T553 556T522 563T486 569T446 571Q305 571 216 487T126 251Q126 128 192 40L657 505ZM447 -70Q591 -70 679 16T767 250Q767 308 751 360T719 436T701 460L469 228Q238 -1 238 -5Q238 -8 261 -22T336 -53T447 -70",8857:"64 250Q64 350 98 426T189 546T307 610T434 632Q485 632 496 631Q572 621 635 592Q669 575 699 550T760 484T809 384T828 250Q828 77 725 -27T446 -132Q272 -132 168 -27T64 250ZM767 252Q767 395 681 483T446 571Q303 571 215 486T126 249Q126 107 212 19T446 -70Q596 -70 681 18T767 252ZM335 251Q335 297 368 329T441 361Q498 361 527 327T557 250Q557 202 525 171T446 140Q397 140 366 173T335 251",8866:"65 672Q76 693 91 693Q115 693 123 674Q125 669 125 523V378H615Q618 376 622 373T628 369T632 366T635 362T636 356T637 347Q637 328 619 319Q615 317 370 317H125V171Q125 25 123 20Q114 1 94 1Q73 1 65 23V672",8867:"64 327T64 347T89 378H577V525L578 672Q592 693 604 693Q629 693 638 669V25Q628 1 607 1Q588 1 578 23L577 170V317H88Q64 327 64 347",8868:"64 664Q64 675 71 683T87 693H93Q99 693 110 693T137 693T173 693T217 694T267 694T323 694T383 694T448 694H807Q808 693 811 691T817 687T823 682T827 675T829 664Q829 643 807 634L642 633H477V25Q467 1 446 1Q427 1 417 23L416 328V633H251L87 634Q64 643 64 664",8869:"65 31Q65 38 66 41T71 50T87 61H416V366L417 672Q431 693 443 693Q468 693 477 669V61H807Q808 60 811 58T817 54T823 49T827 42T829 31Q829 10 807 1H87Q65 10 65 31",8872:"160 -249Q138 -249 129 -225V250Q129 725 131 729Q139 750 159 750T190 725V392Q219 393 537 393H896Q897 392 900 390T906 386T912 381T916 374T918 363Q918 345 896 333H190V169H896L900 166Q905 163 907 162T912 157T916 149T918 139Q918 118 896 109H190V-225Q181 -249 160 -249",8900:"280 522Q281 523 285 523H289Q301 523 366 457Q404 420 431 393Q533 291 546 277T560 250Q560 239 548 226T431 108Q313 -10 304 -16Q297 -21 287 -21Q278 -21 275 -19Q270 -17 146 107T18 238Q15 242 15 251Q15 258 18 263Q20 268 145 392T274 519L280 522ZM388 350L288 449L188 350L89 250L288 52L487 250L388 350",8901:"74 251Q74 286 99 311T156 336Q200 336 222 308T245 250Q245 221 224 194T160 166T96 193T74 251",8902:"270 491Q274 502 287 502Q298 502 304 491Q304 486 323 396T342 303L438 314Q520 324 534 324Q540 324 545 320T550 307Q550 298 539 290T456 243Q377 198 377 197L416 111Q456 26 456 22Q457 21 457 18Q457 11 451 6T438 0H437Q432 0 415 16Q387 42 358 68L287 133L216 68Q193 47 167 23Q142 0 136 0Q129 0 123 5T117 18Q117 21 118 22Q118 26 158 111L197 197Q197 198 156 221T72 269T26 298Q24 304 24 307Q24 315 29 319T40 324Q53 324 136 314L232 303Q232 306 251 396T270 491",8904:"906 251Q906 456 905 456Q550 252 549 251Q549 250 726 148T905 45T906 251ZM967 -14Q958 -38 939 -38H937Q928 -38 923 -35Q919 -34 748 64T500 209L71 -38Q69 -39 63 -39Q42 -39 33 -16V518Q45 540 63 540H65Q72 540 174 481Q247 439 302 407L500 292Q578 339 750 438T929 539H933Q958 539 967 515V-14ZM449 251L94 456Q93 456 93 251Q93 45 94 45L106 52Q119 59 139 71T186 98T242 131T301 165T357 197T404 225T437 244L449 251",8942:"74 55Q74 91 99 116T156 141Q200 141 222 113T245 55Q245 26 224 -1T160 -29Q118 -29 96 -3T74 55ZM74 465Q74 501 99 526T156 551Q200 551 222 523T245 465Q245 436 224 409T160 381Q118 381 96 407T74 465ZM74 865Q74 901 99 926T156 951Q200 951 222 923T245 865Q245 836 224 809T160 781Q118 781 96 807T74 865",8943:"74 251Q74 286 99 311T156 336Q200 336 222 308T245 250Q245 221 224 194T160 166T96 193T74 251ZM562 251Q562 286 587 311T644 336Q688 336 710 308T733 250Q733 221 712 194T648 166T584 193T562 251ZM1050 251Q1050 286 1075 311T1132 336Q1176 336 1198 308T1221 250Q1221 221 1200 194T1136 166T1072 193T1050 251",8945:"129 785Q129 821 154 846T211 871Q255 871 277 843T300 785Q300 756 279 729T215 701Q173 701 151 727T129 785ZM576 485Q576 521 601 546T658 571Q702 571 724 543T747 485Q747 456 726 429T662 401Q620 401 598 427T576 485ZM1023 185Q1023 221 1048 246T1105 271Q1149 271 1171 243T1194 185Q1194 156 1173 129T1109 101Q1067 101 1045 127T1023 185",8968:"194 728Q199 743 216 749H220Q223 749 229 749T245 749T265 750T289 750T316 750T345 750H471Q472 749 477 746T484 741T490 732T493 719Q493 701 471 690L362 689H254V-224Q244 -248 223 -248T194 -226V728",8969:"317 -224Q307 -248 286 -248Q267 -248 257 -226L256 231V689H148L40 690Q17 698 17 720Q17 741 37 748Q42 750 169 750H295Q314 737 317 725V-224",8970:"194 728Q204 749 220 749Q245 749 254 725V-188H471Q472 -189 477 -192T484 -197T490 -206T493 -219Q493 -237 471 -248H216Q200 -242 194 -226V728",8971:"17 -219Q17 -201 40 -188H256V270L257 728Q271 749 283 749Q308 749 317 725V-224Q310 -242 295 -248H40L38 -247Q35 -246 34 -245T30 -243T25 -239T21 -234T18 -227T17 -219",8994:"95 108Q85 108 75 114T65 139Q65 159 129 227Q316 405 573 405Q654 405 729 387T854 344T950 286T1015 232T1053 191Q1078 160 1083 152Q1084 148 1084 139Q1084 121 1074 115T1054 108Q1040 108 1029 122T990 167T922 223Q819 291 680 309Q641 315 575 315Q508 315 469 309Q303 288 197 201Q168 179 148 155T118 119T95 108",8995:"1054 392Q1067 392 1076 384T1085 362Q1085 351 1079 342T1050 310Q983 243 901 200Q753 126 575 126Q494 126 420 141T298 176T205 225T140 272T100 310Q64 346 64 362Q64 370 67 374Q75 393 93 393Q107 393 124 375Q272 214 575 214Q877 214 1025 375Q1039 392 1054 392",9001:"127 243V259L223 491Q251 557 286 642Q318 719 324 732T340 748H341Q347 750 351 750Q365 750 373 740T382 723Q382 713 286 482L190 251Q190 249 286 20T382 -219Q382 -232 373 -240T352 -249Q332 -249 323 -229Q320 -220 223 10L127 243",9002:"64 720Q64 732 72 741T94 750Q106 750 113 743Q118 741 122 732L319 259V243L122 -231Q112 -249 95 -249Q83 -249 74 -240T64 -218Q64 -210 160 20L256 251L160 482Q64 715 64 720",9651:"91 1Q69 10 69 31Q69 39 81 59T168 197Q327 447 485 697Q493 711 510 711Q523 711 532 702Q536 697 743 371T951 41Q953 35 953 31Q953 12 931 1H91ZM690 340Q651 401 604 476T534 586L512 621Q511 622 507 616Q498 604 332 342L154 62L333 61H689L867 62L690 340",9653:"91 1Q69 10 69 31Q69 39 81 59T168 197Q327 447 485 697Q493 711 510 711Q523 711 532 702Q536 697 743 371T951 41Q953 35 953 31Q953 12 931 1H91ZM690 340Q651 401 604 476T534 586L512 621Q511 622 507 616Q498 604 332 342L154 62L333 61H689L867 62L690 340",9657:"33 518Q45 540 63 540H65Q72 540 174 481Q247 439 302 407Q529 276 533 272Q542 263 542 250Q542 238 533 229Q528 224 304 95T71 -38Q69 -39 63 -39Q42 -39 33 -16V518ZM449 251L94 456Q93 456 93 251Q93 45 94 45L106 52Q119 59 139 71T186 98T242 131T301 165T357 197T404 225T437 244L449 251",9661:"68 470Q68 481 75 489T91 499H93Q296 500 512 500H931Q932 499 937 496T945 490T950 482T953 469Q953 465 951 459Q950 455 743 129T532 -202Q524 -210 511 -210Q497 -210 489 -202Q486 -199 281 124T71 456Q68 462 68 470ZM154 439Q155 437 332 158T510 -122Q510 -123 533 -87T600 18T688 157Q866 437 866 438Q867 439 805 439T511 439H154",9663:"68 470Q68 481 75 489T91 499H93Q296 500 512 500H931Q932 499 937 496T945 490T950 482T953 469Q953 465 951 459Q950 455 743 129T532 -202Q524 -210 511 -210Q497 -210 489 -202Q486 -199 281 124T71 456Q68 462 68 470ZM154 439Q155 437 332 158T510 -122Q510 -123 533 -87T600 18T688 157Q866 437 866 438Q867 439 805 439T511 439H154",9667:"542 -14Q533 -38 514 -38H512Q503 -38 498 -35Q494 -34 270 95T42 229Q33 238 33 251Q33 259 35 264Q36 265 38 268T42 272Q48 278 271 407T504 539H508Q533 539 542 515V-14ZM481 251Q481 456 480 456Q125 252 124 251Q124 250 301 148T480 45T481 251",9711:"65 42T65 250T204 584T574 711Q795 711 935 594Q955 577 974 555T1022 490T1067 385T1084 250Q1084 42 945 -84T574 -211T204 -85ZM1024 250Q1024 431 903 540T578 650Q482 650 404 627T274 565T189 474T140 366T125 250Q125 123 186 31T347 -106T573 -150Q772 -150 898 -45T1024 250",9824:"675 -18Q536 -18 527 62V70H477V55Q479 14 487 -21T502 -75T509 -101Q509 -120 491 -127Q487 -129 447 -129Q446 -129 439 -129T427 -130Q384 -130 384 -101Q384 -95 391 -76T406 -21T416 55V70H366Q364 52 360 40T342 14T300 -8T230 -17H218Q110 -17 75 117Q64 163 64 209Q64 290 116 357T261 495Q363 574 414 690Q425 719 445 719Q467 719 478 693Q507 627 547 578T623 503T702 438T777 357Q829 285 829 202V197Q826 128 808 81T762 15T714 -11T675 -18",9825:"65 491Q65 602 121 656T246 710Q375 710 440 624L447 615Q519 711 638 711Q723 711 775 652T828 491Q828 390 770 313T581 129Q539 95 514 63T483 14T469 -13T446 -24Q434 -24 427 -17T416 0T400 32T371 74Q352 97 310 131T229 199T151 276T89 374T65 491ZM249 649Q188 649 157 603T125 489Q125 409 181 338T352 176Q408 131 437 87L446 73L456 87Q479 121 507 147T579 207T659 278Q768 387 768 489Q768 506 766 524T756 566T731 611T687 642Q668 649 638 649Q609 649 593 644Q547 633 516 604T478 534Q473 505 447 505H445Q420 505 416 534Q407 577 372 608T285 648Q277 649 249 649",9826:"409 686Q410 688 412 691T415 696T418 701T421 706T424 709T427 713T431 715T435 717T440 718T446 719Q455 719 460 717T472 704T488 679T516 633T563 567Q624 485 687 422T787 330T826 296T828 282Q828 270 825 265T801 245Q696 161 612 59T477 -133Q465 -154 447 -154Q439 -154 434 -152T425 -146T414 -130T399 -104T372 -62T330 -3Q270 78 207 142T107 234T70 265Q64 274 64 282Q64 296 90 317Q284 472 409 686ZM749 282Q745 286 721 307T681 343T635 388T581 446T525 516T465 601Q462 606 457 613T450 624L447 627V628Q446 628 436 611T402 561T348 489T266 396T155 292L145 282Q147 280 185 245T257 177T343 79T442 -57Q446 -64 447 -64V-63Q450 -59 475 -22T530 56T619 160T749 282",9827:"240 527Q240 611 301 665T446 719T590 665T652 527Q652 431 571 373Q578 363 584 352T593 335T597 329L604 335Q611 341 617 345T637 356T667 366Q672 366 680 367T694 368Q767 368 814 310T861 177Q861 109 819 57T713 -12Q690 -17 656 -17Q535 -13 527 62V70H477V55Q479 14 487 -21T502 -75T509 -101Q509 -120 491 -127Q487 -129 447 -129Q446 -129 439 -129T427 -130Q384 -130 384 -101Q384 -95 391 -76T406 -21T416 55V70H366V62Q356 -12 237 -17Q130 -17 71 60Q32 111 32 178Q32 251 78 309T198 368Q217 368 233 364T260 354T279 343T291 333T296 329L300 336Q304 343 310 354T322 373Q240 432 240 527",9837:"230 480Q293 480 337 440T381 330V322Q381 240 323 161Q258 71 123 -11L114 -16L97 -17Q70 -17 66 -7Q64 -3 64 366V641Q64 717 65 731T75 748Q78 750 95 750Q117 750 122 742T127 694Q127 685 127 653T126 595V454Q183 480 230 480ZM242 333Q242 405 212 405H207Q147 405 130 370L127 364L126 219Q126 77 128 77Q133 82 140 90T167 127T202 183T229 253T242 333",9838:"345 -223Q333 -223 330 -214T327 -178V-116Q327 -23 326 -23L203 -82Q90 -134 77 -140Q65 -142 59 -130Q57 -126 57 295V595Q57 643 57 667T58 704T60 719T63 724Q93 741 101 741Q113 741 116 732T119 680V597Q119 467 120 467Q121 468 180 495T301 552T369 584Q381 586 387 574Q389 570 389 187V-88Q389 -132 389 -154T388 -188T386 -202T383 -206Q353 -223 345 -223ZM327 271Q327 421 326 421L120 323L119 173V23Q120 23 223 72L327 121V271",9839:"140 628Q151 628 154 620T158 591V549V484L166 488Q175 492 192 500T223 516L288 548V622V674Q288 681 288 685T289 693T289 699T291 703T295 707T298 709T304 712T311 716Q326 724 332 724Q343 724 346 715T350 685V644V579Q358 583 364 583Q376 583 380 574Q382 570 382 514V481Q382 459 380 454T363 441L350 435V135Q358 139 364 139Q376 139 380 130Q382 126 382 70V37Q382 15 380 10T363 -3L350 -9V-76Q350 -102 348 -106T328 -119Q312 -128 306 -128Q288 -128 288 -99V-77V-40L280 -44Q271 -48 254 -56T223 -72L158 -104V-150V-180Q158 -198 155 -202T135 -216Q119 -224 114 -224Q96 -224 96 -192V-172V-135Q86 -140 81 -140Q70 -140 66 -129Q64 -126 64 -70V-54Q64 -18 66 -12T83 3L96 9V309Q86 304 81 304Q70 304 66 315Q64 318 64 374V407Q64 429 66 434T83 447L96 453V602Q99 609 100 610T118 619Q134 628 140 628ZM288 254Q288 404 287 404L158 340V40L166 44Q175 48 192 56T223 72L288 104V254",10072:"160 -249Q138 -249 129 -225V250Q129 725 131 729Q139 750 159 750T190 725V-225Q181 -249 160 -249",10216:"127 243V259L223 491Q251 557 286 642Q318 719 324 732T340 748H341Q347 750 351 750Q365 750 373 740T382 723Q382 713 286 482L190 251Q190 249 286 20T382 -219Q382 -232 373 -240T352 -249Q332 -249 323 -229Q320 -220 223 10L127 243",10217:"64 720Q64 732 72 741T94 750Q106 750 113 743Q118 741 122 732L319 259V243L122 -231Q112 -249 95 -249Q83 -249 74 -240T64 -218Q64 -210 160 20L256 251L160 482Q64 715 64 720",10229:"1063 221L649 220H235Q340 133 364 17Q368 1 368 -2Q368 -16 343 -17Q340 -17 338 -17H332Q317 -17 314 -14T305 6Q298 34 285 62T247 126T179 189T78 233Q64 237 64 251Q64 261 74 265T108 277T154 297Q212 328 251 379T305 495Q309 511 313 514T333 518H338Q363 517 367 510Q368 507 368 503Q368 500 364 484Q345 401 287 331Q254 295 235 282L649 281H1063L1065 280Q1079 281 1392 281H1719Q1720 280 1723 278T1729 274T1735 269T1739 262T1741 251Q1741 230 1719 221H1063",10230:"119 221Q96 230 96 251T116 279Q121 281 448 281H1188L1602 282Q1569 304 1530 357T1473 482Q1469 500 1469 501Q1469 512 1480 517Q1482 518 1500 518H1505Q1520 518 1523 515T1532 495Q1552 412 1611 351T1753 270Q1773 263 1773 251Q1773 240 1765 236T1732 225T1683 204Q1625 173 1586 122T1532 6Q1528 -10 1524 -13T1504 -17H1499Q1474 -16 1470 -9Q1469 -6 1469 -2Q1469 1 1473 17Q1501 138 1602 220H1188L775 221H119",10231:"1063 221L649 220H235Q340 133 364 17Q368 1 368 -2Q368 -16 343 -17Q340 -17 338 -17H332Q317 -17 314 -14T305 6Q298 34 285 62T247 126T179 189T78 233Q64 237 64 251Q64 261 74 265T108 277T154 297Q212 328 251 379T305 495Q309 511 313 514T333 518H338Q363 517 367 510Q368 507 368 503Q368 500 364 484Q345 401 287 331Q254 295 235 282L649 281H1476L1890 282Q1857 304 1818 357T1761 482Q1757 500 1757 501Q1757 512 1768 517Q1770 518 1788 518H1793Q1808 518 1811 515T1820 495Q1840 412 1899 351T2041 270Q2061 263 2061 251Q2061 240 2053 236T2020 225T1971 204Q1913 173 1874 122T1820 6Q1816 -10 1812 -13T1792 -17H1787Q1762 -16 1758 -9Q1757 -6 1757 -2Q1757 1 1761 17Q1789 138 1890 220H1476L1063 221",10232:"1063 333L700 332H338L324 321Q283 290 230 264L205 250Q266 224 323 180L338 170L700 169H1063L1064 168Q1080 169 1423 169H1782L1786 166Q1791 163 1793 162T1798 157T1802 149T1804 139Q1804 118 1782 109H1063L733 108H404L412 99Q455 50 488 -10Q498 -27 493 -37Q487 -46 465 -46H460Q446 -46 439 -39T426 -18T399 25T344 89Q239 194 99 229Q96 230 92 231T85 232T79 234T73 235T69 237T66 240T65 244T64 250Q64 267 90 271Q197 295 286 361T430 525Q439 542 442 544T460 547H465Q487 547 492 539Q496 531 496 530Q496 521 471 482T414 405L404 394L733 393H1063Q1064 392 1065 392Q1081 393 1423 393H1782Q1783 392 1786 390T1792 386T1798 381T1802 374T1804 363Q1804 345 1782 333H1063",10233:"87 109Q64 118 64 139Q64 159 86 168Q89 169 448 169H1169L1532 170L1546 180Q1562 193 1580 204T1612 223T1638 237T1657 246L1664 250L1639 264Q1586 290 1545 321L1531 332H1169L807 333H87Q64 343 64 362Q64 383 84 391Q89 393 448 393H1136L1465 394L1455 405Q1428 436 1401 477T1374 531Q1374 547 1399 547H1404H1409Q1423 547 1430 540T1443 519T1470 475T1526 411Q1634 303 1779 271Q1780 271 1783 270T1788 269T1792 268T1796 266T1799 264T1802 260T1803 256T1804 250Q1804 242 1800 238T1783 231T1755 225T1712 211T1654 185Q1517 112 1439 -24Q1430 -40 1426 -43T1409 -46H1404Q1373 -46 1373 -31Q1373 -24 1381 -10Q1414 50 1457 99L1465 108H1136L807 109H87",10234:"1063 333L700 332H338L324 321Q283 290 230 264L205 250Q266 224 323 180L338 170L700 169H1425L1788 170L1802 180Q1818 193 1836 204T1868 223T1894 237T1913 246L1920 250L1895 264Q1842 290 1801 321L1787 332H1425L1063 333ZM733 393H1392L1721 394L1711 405Q1684 436 1657 477T1630 531Q1630 547 1655 547H1660H1665Q1679 547 1686 540T1699 519T1726 475T1782 411Q1890 303 2035 271Q2036 271 2039 270T2044 269T2048 268T2052 266T2055 264T2058 260T2059 256T2060 250Q2060 242 2056 238T2039 231T2011 225T1968 211T1910 185Q1773 112 1695 -24Q1686 -40 1682 -43T1665 -46H1660Q1629 -46 1629 -31Q1629 -24 1637 -10Q1670 50 1713 99L1721 108H1392L1063 109L733 108H404L412 99Q455 50 488 -10Q498 -27 493 -37Q487 -46 465 -46H460Q446 -46 439 -39T426 -18T399 25T344 89Q239 194 99 229Q96 230 92 231T85 232T79 234T73 235T69 237T66 240T65 244T64 250Q64 267 90 271Q197 295 286 361T430 525Q439 542 442 544T460 547H465Q487 547 492 539Q496 531 496 530Q496 521 471 482T414 405L404 394L733 393",10236:"65 426Q74 448 95 448Q112 448 125 426V281H130L132 280H134Q162 281 448 281H1188L1602 282Q1569 304 1530 357T1473 482Q1469 500 1469 501Q1469 512 1480 517Q1482 518 1500 518H1505Q1520 518 1523 515T1532 495Q1552 412 1611 351T1753 270Q1773 263 1773 251Q1773 240 1765 236T1732 225T1683 204Q1625 173 1586 122T1532 6Q1528 -10 1524 -13T1504 -17H1499Q1474 -16 1470 -9Q1469 -6 1469 -2Q1469 1 1473 17Q1501 138 1602 220H1188L775 221H135Q133 220 130 220H125V76Q115 54 95 54Q73 54 65 76V426",10744:"189 -210Q179 -210 170 -203T160 -179Q160 -171 162 -166Q164 -163 420 266T679 698Q686 711 704 711Q714 711 723 704T733 681Q733 672 730 667Q723 654 469 228T211 -201Q202 -210 189 -210",10799:"168 500Q168 515 178 522T195 530H198Q207 530 218 521T282 458Q312 428 331 409L447 294L563 409Q674 520 682 525Q687 529 695 529Q711 529 718 520T726 499V498Q726 489 720 481T666 427Q631 392 606 367L490 251L606 135Q717 23 721 17T726 2Q726 -9 719 -18T695 -28H692Q685 -28 674 -18T608 47Q581 74 563 92L447 207L331 91Q217 -22 208 -27Q206 -28 203 -28H197Q168 -28 168 2Q168 13 178 24T288 135L404 250L288 366Q177 479 173 485T168 500",10815:"39 655Q39 675 43 680T69 686Q110 684 225 684Q267 684 303 684T360 685T385 686Q401 686 405 680T409 651Q409 632 403 628T367 624H348H301V62H598V624H551H532Q502 624 496 628T490 651Q490 673 494 679T514 686Q518 686 558 685T675 684T792 685T836 686Q852 686 856 680T860 651Q860 632 854 628T818 624H799H752V62H799H809Q846 62 853 59T860 36V31V21Q860 6 850 2Q846 0 450 0H156Q75 0 60 1T40 11V18Q39 26 39 31Q39 54 44 58T82 63Q84 63 90 63T100 62H147V624H100H90Q53 624 46 627T39 650V655",10927:"796 54Q796 40 788 32T767 24Q741 24 735 57Q729 107 705 148T646 216T563 264T465 297T356 316T245 326T136 330H134Q96 330 96 360Q96 391 134 391H136Q193 392 239 394T347 403T457 421T556 453T643 502T703 571T735 664Q741 696 763 696Q781 696 789 686T797 667Q797 651 792 624T758 545T682 456Q605 396 481 365L462 360Q483 357 526 344T633 296T733 215Q767 173 781 128T796 54ZM119 -199Q96 -190 96 -169T116 -141Q121 -139 448 -139H775Q776 -140 779 -142T785 -146T791 -151T795 -158T797 -169Q797 -190 775 -199H119",10928:"127 24Q115 24 106 32T97 55Q97 95 124 156T211 265Q288 325 412 356L431 361Q410 363 367 376T259 425T160 506Q127 546 112 594T96 667Q96 679 104 688T126 697Q152 697 158 664Q164 614 188 573T247 505T331 456T429 424T539 405T649 395T758 391Q797 391 797 360Q797 330 761 330H758Q701 329 655 327T547 318T437 300T337 268T251 219T190 150T158 57Q151 24 127 24ZM119 -199Q96 -190 96 -169T116 -141Q121 -139 448 -139H775Q776 -140 779 -142T785 -146T791 -151T795 -158T797 -169Q797 -190 775 -199H119",12296:"127 243V259L223 491Q251 557 286 642Q318 719 324 732T340 748H341Q347 750 351 750Q365 750 373 740T382 723Q382 713 286 482L190 251Q190 249 286 20T382 -219Q382 -232 373 -240T352 -249Q332 -249 323 -229Q320 -220 223 10L127 243",12297:"64 720Q64 732 72 741T94 750Q106 750 113 743Q118 741 122 732L319 259V243L122 -231Q112 -249 95 -249Q83 -249 74 -240T64 -218Q64 -210 160 20L256 251L160 482Q64 715 64 720"},{8243:"\u2032\u2032",8244:"\u2032\u2032\u2032",8279:"\u2032\u2032\u2032\u2032",8602:"\u2190\u0338",8603:"\u2192\u0338",8622:"\u2194\u0338",8653:"\u21d0\u0338",8654:"\u21d4\u0338",8655:"\u21d2\u0338",8708:"\u2203\u0338",8716:"\u220b\u0338",8740:"\u2223\u0338",8742:"\u2225\u0338",8769:"\u223c\u0338",8772:"\u2243\u0338",8775:"\u2245\u0338",8777:"\u2248\u0338",8802:"\u2261\u0338",8813:"\u224d\u0338",8814:"<\u0338",8815:">\u0338",8816:"\u2264\u0338",8817:"\u2265\u0338",8832:"\u227a\u0338",8833:"\u227b\u0338",8836:"\u2282\u0338",8837:"\u2283\u0338",8840:"\u2286\u0338",8841:"\u2287\u0338",8876:"\u22a2\u0338",8877:"\u22a8\u0338",8930:"\u2291\u0338",8931:"\u2292\u0338"})},2810:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.doubleStruck=void 0;var n=r(6001);Object.defineProperty(e,"doubleStruck",{enumerable:!0,get:function(){return n.doubleStruck}})},6982:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.frakturBold=void 0;var n=r(768),o=r(3696);e.frakturBold=(0,n.AddPaths)(o.frakturBold,{33:"121 621Q121 657 132 673T177 689Q223 689 223 644V635Q223 604 222 595Q221 590 210 490T187 292T175 190V186L166 185L156 184Q156 185 139 393T121 621ZM107 47Q107 70 127 87T174 104Q201 104 221 89T241 48Q241 24 222 6T174 -12Q147 -12 127 6T107 47",34:"53 695Q74 695 90 679V622L65 433L52 432H39L27 516Q10 626 10 655Q10 680 26 688Q33 693 39 693Q49 695 53 695ZM151 668Q151 691 191 691Q217 691 224 685T231 661V652Q230 634 219 531L207 433L195 432Q183 432 183 433L168 541Q151 664 151 668",38:"290 -14Q186 -14 115 41T44 185Q44 222 54 249T88 300T131 336T189 371Q216 387 216 388Q185 459 185 510Q185 563 206 601T263 659T334 687T405 696Q476 696 503 668T531 603Q531 565 513 536T450 476Q423 459 370 432L334 413L354 384Q474 212 560 139L563 137Q611 185 611 250Q611 295 577 329Q549 356 496 357Q439 357 433 354Q432 354 432 379V403L437 402Q443 402 479 401T557 400Q653 400 735 403T831 407H836Q833 352 833 351L821 352Q809 352 792 352T756 352T720 353T696 354Q680 354 680 353L681 346Q682 339 683 327T685 306Q685 283 681 260T669 218T653 182T635 152T619 129T606 114L602 109Q604 107 618 99T659 81T707 71Q742 71 767 99T804 155L815 183Q815 184 821 183T833 180T839 177Q837 169 834 156T816 110T782 52T727 5T648 -16Q569 -16 499 35H498Q496 35 466 23T387 -1T290 -14ZM418 592Q418 617 398 639T352 661T302 642T278 574Q278 545 288 514T306 465T319 444Q342 456 353 463T382 488T409 529T418 584V592ZM159 239Q159 158 222 98T364 38Q386 38 447 57L469 63L434 98Q349 185 286 275Q258 316 238 345Q233 353 232 353Q159 316 159 239",39:"80 645T80 662T93 687T123 695Q158 695 158 659Q158 649 157 643L123 437Q123 436 114 436H104Q104 442 92 538Q80 645 80 662",40:"347 719Q325 708 311 698T272 656T233 580T207 455T195 267Q195 30 247 -79Q261 -110 291 -136Q320 -163 347 -172V-179Q347 -186 344 -186Q338 -186 328 -184T287 -165T230 -123Q134 -25 134 271Q134 417 158 514T226 662T335 734L346 737Q347 737 347 728V719",41:"264 262Q264 366 253 446T226 572T186 649T145 692T105 714V725Q105 735 107 735Q108 734 121 731T154 719T196 692T242 641T284 560T314 437T326 268Q326 112 299 7Q279 -78 239 -124T116 -185L105 -187V-179L106 -171L109 -169Q130 -161 138 -158T165 -146T190 -127T210 -101T229 -64T243 -12T255 58T261 148T264 262",42:"40 516L62 529Q85 542 110 556T140 574L126 582Q112 591 104 595T80 607T40 629Q53 642 57 645L65 652L78 642Q106 620 132 603L152 589V595Q152 630 149 681V692H179V689Q178 681 174 638T171 593Q173 593 240 639L258 652Q260 652 267 643L276 633L260 625Q190 587 175 576Q173 575 180 570Q183 569 186 567Q213 549 256 527L277 515L256 495Q246 501 228 515T194 539T170 554V543Q170 486 178 449H148V456Q152 492 152 550L151 562Q150 562 102 528L53 495Q40 514 40 516",43:"422 584L471 598Q472 598 472 440V282H837Q833 273 829 263L821 244L647 243H472V-63L448 -73L423 -82Q422 -82 422 81V243H239Q56 243 56 244Q60 253 65 263L73 282H422V584",44:"118 61Q118 80 135 93T169 107Q190 107 221 65T253 -23Q253 -39 251 -49T237 -80T198 -133Q148 -191 144 -191Q142 -191 137 -182T132 -172Q143 -161 160 -131T183 -83Q185 -77 185 -62Q185 -54 184 -48T182 -38T177 -28T171 -19T162 -8T150 6Q130 28 124 38T118 61",45:"54 236L73 275H453Q833 275 833 274Q830 265 825 255L818 236H54",46:"103 23T103 44T120 83T170 102Q200 102 218 84T237 44Q237 20 216 3T168 -15Q138 -15 121 4",47:"272 270Q503 721 506 721L509 720Q512 720 518 719T529 717L550 713L91 -181L66 -182Q41 -182 41 -181L272 270",48:"238 -12Q162 -12 102 42T42 185Q42 303 130 393Q163 425 208 452T284 490L313 501Q323 499 339 495T395 472T464 426Q533 357 533 273Q533 201 483 133T364 27T238 -12ZM428 208Q428 255 402 297T342 365T280 404T241 419Q214 419 178 374T142 259Q142 206 168 164T225 99Q259 74 310 74Q326 74 337 75T366 82T396 103T417 141Q428 171 428 208",49:"95 481Q102 481 217 485T383 489Q384 489 384 485Q367 397 367 165Q367 58 369 54Q374 46 380 44T410 42H466H546V40Q547 38 547 19L548 0H54V23Q54 29 54 34T54 44L55 47Q79 47 134 46T202 45Q226 45 234 52Q240 57 241 64T245 105Q254 236 254 320V347Q254 369 252 382T240 409T211 431L97 450L96 465Q95 480 95 481",50:"307 335Q307 374 283 397T224 421Q187 421 112 387Q105 384 100 382T95 381Q90 387 86 394L77 407L86 413Q219 491 298 491Q370 491 399 460T428 388Q428 373 424 358T409 326T391 297T363 264T335 235T301 202T269 171L199 104Q194 99 205 97Q209 96 214 96Q527 105 544 105Q553 107 563 102Q563 100 557 79T545 34T537 2H377Q338 2 247 2T130 4H44V26L104 77Q185 145 212 172T267 235Q307 291 307 335",51:"102 402L108 408Q115 413 122 418T141 431T165 447T194 461T227 474T263 483T302 487H307Q413 487 452 420Q465 400 465 371Q465 334 445 303T396 253T347 225T317 213Q314 213 314 211Q316 209 316 205Q317 201 320 201Q337 201 359 198T411 184T465 156T506 109T523 39Q523 -62 436 -127T229 -193Q179 -193 130 -178T56 -150T31 -133Q31 -132 41 -122L52 -112L63 -117Q128 -148 201 -148Q282 -148 331 -104T381 20Q381 71 363 100T304 145Q243 166 149 166H137V204H146Q179 204 211 210T275 229T326 268T346 329Q346 372 314 401Q292 423 245 423Q188 423 125 383L102 402",52:"346 -196Q344 -196 335 -187L336 -148Q337 -127 337 -55V0H13V29L187 253Q362 477 362 479L368 480Q375 481 387 483T411 487T434 491T452 494L459 495Q460 495 470 482V453Q470 389 466 230T461 62Q461 61 513 61T565 60L555 29L546 -1H461V-15Q461 -48 463 -100T465 -154L457 -157Q449 -160 434 -165T405 -175Q347 -196 346 -196ZM339 265V341Q339 362 335 362Q327 362 219 217T110 65V61H337V117Q338 133 338 187T339 265",53:"232 192Q176 192 122 152L95 162V481H306Q516 481 516 479Q514 477 501 433L486 389L319 388H152V386V382Q152 379 152 374T151 365Q147 329 146 260V218H149Q211 242 284 242Q353 242 402 224T474 176T508 117T518 55Q518 -62 432 -126T220 -190Q184 -190 151 -185T96 -172T57 -157T31 -145T20 -139T19 -138Q19 -136 27 -125L35 -112L51 -120Q114 -152 174 -152Q257 -152 314 -100T371 46Q371 107 340 149T232 192",54:"48 251Q48 330 76 403T150 529T253 623T370 683T485 704Q494 704 520 701T547 695Q547 692 542 659T536 625Q531 624 524 624L512 623L502 628Q489 635 468 640Q452 645 423 645Q403 645 379 640T320 617T255 568T201 481T171 348Q170 341 170 330V325L183 333Q275 385 357 385H361Q464 385 514 312Q546 267 546 217Q546 127 457 58T262 -12Q225 -12 189 3T120 49T68 132T48 251ZM448 165Q448 228 406 274T289 320Q264 320 236 312T190 295T173 284Q173 266 176 241T189 178T214 112T259 61T326 39Q372 39 410 75T448 165",55:"57 376L87 479H591V455L584 446Q544 399 491 328T349 117T185 -169L171 -196H159Q152 -197 102 -197Q58 -197 58 -196T56 -185L54 -175L299 158L443 359Q446 367 444 370H254L71 365L57 376",56:"88 533Q88 573 120 610T194 668T268 701T307 714Q324 714 352 711T422 695T486 659Q518 625 518 585Q518 536 479 489T384 406L371 398L385 390Q387 389 400 382T420 370T442 356T466 339T489 319T510 295T526 269T538 238T542 204Q542 125 463 60T256 -5Q145 -5 92 52Q45 97 45 165Q45 204 64 237T109 290T163 324T209 345T228 353L214 364Q199 375 179 392T138 431T103 480T88 533ZM405 557Q405 568 402 581T387 612T350 644T286 663Q283 663 280 663T274 664H272Q256 664 228 636T199 572Q199 547 238 507Q268 475 320 437L334 427Q345 433 358 443T388 483T405 549V557ZM304 42Q366 42 398 76T431 155Q431 178 420 200T396 238T359 270T321 296T283 318L263 328Q262 328 230 312Q190 290 175 266T160 198Q160 132 202 87T304 42",57:"549 220Q549 23 429 -82T105 -195H84V-189Q84 -179 85 -174V-164H93Q184 -156 238 -132T334 -56Q361 -23 376 16T394 78L397 100L363 88Q329 75 291 61T244 45Q237 44 218 44Q154 44 94 97Q29 152 29 240Q29 350 108 404Q145 429 257 480Q270 487 279 487Q403 487 470 421Q549 347 549 220ZM408 217Q408 276 390 320T346 385T297 415T259 424Q218 424 185 393T151 286Q151 216 213 154Q252 115 321 115Q368 115 388 134T408 217",58:"57 398Q57 419 72 438T117 457Q154 457 174 439T194 398Q194 379 176 361T119 343Q85 343 71 362T57 398ZM62 19T62 43T77 85T115 104Q153 104 175 86T197 42Q197 14 171 1T119 -12Q96 -12 79 3",59:"56 399Q56 424 73 440T104 456Q114 458 120 458Q149 458 170 440T192 399Q192 380 174 362T120 344Q85 344 71 362T56 399ZM78 53Q78 67 84 76T90 86Q90 88 98 92T116 98Q117 98 121 98T128 99Q152 97 181 58T211 -24Q211 -77 128 -165Q124 -170 121 -173T116 -178T113 -181T110 -185T106 -190L97 -184L88 -177L95 -168Q143 -104 143 -65Q143 -51 137 -40T113 -7T81 35Q78 41 78 53",61:"559 342L549 304H22L27 319Q29 328 30 333T33 343H296Q559 343 559 342ZM559 206L549 168H22L27 183Q29 192 30 197T33 207H296Q559 207 559 206",63:"121 590Q121 575 128 562T144 542T152 533T115 512L78 491Q55 499 47 516Q40 530 40 553Q40 601 77 632Q155 697 257 697H268Q316 697 355 679Q422 646 422 576Q422 518 388 476Q383 468 376 461T358 444T340 428T316 410T290 390L230 344Q180 307 180 275Q180 261 187 248T202 227L209 219Q209 215 176 193L142 170Q114 177 100 194T84 226V239Q84 259 93 276T113 302T150 331T192 362Q203 370 219 382T247 403T267 422Q312 471 312 546Q312 593 282 623T207 653Q170 653 146 636T121 590ZM95 23T95 49T117 94T173 113Q204 113 223 96T242 54Q242 27 221 7T167 -14Q136 -14 116 4",91:"226 711T225 711T86 699V-93H89Q94 -93 157 -96T223 -100H226V-119H223Q134 -119 42 -130H36V740H42Q61 738 156 736H226V723Q226 711 225 711",93:"69 732Q116 733 146 734T184 736T197 737T206 738H208V-132Q190 -129 160 -127T99 -125T66 -124H14V-103H19Q20 -103 84 -98T152 -92H158V699H151Q148 700 85 703T18 708H14V732H69",94:"1 463T1 464T148 599T296 734Q584 486 584 485L561 472Q538 459 537 461Q296 672 293 672L161 563Q133 539 97 509T44 466L28 452Q27 452 14 457",8216:"187 456Q187 437 169 424T138 411Q114 411 84 454T53 538Q53 565 75 597Q109 648 155 697L166 708L181 694L173 681Q124 610 124 577Q124 549 155 511T187 456",8217:"125 524Q125 545 92 588T58 651Q58 661 61 667Q65 674 80 683T107 692Q131 692 162 645T193 564Q193 540 176 509T144 460T87 394L78 400L68 406L79 421Q125 489 125 524",8260:"272 270Q503 721 506 721L509 720Q512 720 518 719T529 717L550 713L91 -181L66 -182Q41 -182 41 -181L272 270",58113:"388 427Q320 485 242 524T128 563H116Q95 563 87 561L77 559Q72 563 69 566T65 570T65 572L75 576Q106 592 154 611T212 630Q230 630 262 622T358 581T492 498L508 486Q512 463 512 396Q512 246 469 112L465 102Q453 94 341 25Q252 -27 247 -27Q243 -27 174 24T97 84Q90 100 90 214Q90 285 98 345Q100 360 102 363T118 377Q175 422 262 465Q264 463 270 460L277 456Q277 455 267 447T244 428T228 414Q206 382 206 269Q206 187 214 164T259 110Q286 89 342 58Q391 131 391 313Q391 355 388 412V427",58114:"39 362L37 366L38 368L82 405H133V474Q135 563 143 589T198 658Q210 669 224 676T247 687L255 690H253Q241 690 253 692Q254 692 256 692T260 693Q263 693 262 691L261 690Q300 690 361 662L373 656L388 666Q404 675 405 675L406 674Q406 672 406 670T406 664L408 655L301 555Q300 555 287 564T254 584T221 597Q190 597 176 583T161 550Q161 525 184 495T232 440T261 405H387V399Q377 389 364 379L340 359H258V315Q258 52 228 -18L172 -120L121 -211H109Q102 -212 96 -212L109 -174Q131 -108 135 -80T139 53V76V157V362H39",58115:"41 352Q40 354 39 355T37 358L36 360H37Q48 370 61 380L84 400H108Q131 400 131 402Q121 424 104 501L100 519Q109 560 134 602T196 664Q230 681 271 681Q291 681 316 669T358 644L373 631Q373 630 304 553Q299 548 294 547Q292 547 290 546H287Q286 546 274 562T243 593T205 609Q180 609 165 596T150 562Q150 526 191 488L217 462Q248 431 253 405V400H381L384 394L349 352H251V332Q249 271 231 17L227 -37L120 -217L109 -218Q103 -219 97 -219Q97 -218 101 -206T110 -177T118 -151Q126 -129 128 -120T136 -46T141 127Q141 250 136 340V352H41",58116:"107 370Q127 384 172 409T255 454T294 473L306 468Q356 446 425 431L435 429L524 468Q528 465 531 461Q499 395 499 271V263Q499 146 509 71T519 -8Q519 -28 512 -45Q510 -50 435 -123T355 -197Q296 -212 257 -212Q209 -212 164 -196T98 -167T67 -143L133 -44H144Q167 -88 216 -111T320 -134Q371 -134 390 -118T410 -69Q410 -52 404 -12T392 60T385 92L193 -29L158 5Q124 39 110 51L96 63V71Q94 79 94 121Q94 130 94 148T93 174Q93 230 96 275T103 344T107 370ZM221 397Q200 334 200 254Q200 170 210 140Q216 126 234 109T268 81L283 71L383 119V127Q384 132 384 241L385 347L368 349Q325 357 290 369T240 389T221 397",58117:"103 453Q103 631 95 661Q95 663 102 667T110 672L114 664Q117 655 123 641T131 621L140 597L154 606Q208 641 275 673L297 684Q300 683 302 682T307 679T310 678L314 676Q283 658 256 625Q238 601 231 579T223 515L224 512L282 548Q339 583 341 583T365 548T386 509Q326 443 318 443L316 446Q314 448 311 452T304 460T294 470T283 480T272 488T260 494T248 497Q231 497 223 474Q220 468 218 440T215 407V401H345L309 360H218V314Q218 181 221 139V129L253 108Q306 73 310 73Q315 73 343 83L373 92L374 87Q375 82 375 79T375 74T360 65T308 36T229 -13L208 -27L192 -13Q149 24 90 61Q89 61 89 62L90 68Q91 73 93 87T97 125T100 191T103 291V360H33V366L34 371L85 405H94L103 404V453",58120:"602 575Q505 508 505 489Q505 488 505 482T506 463T507 432Q507 314 456 237L449 226L434 216Q420 208 325 143L316 137Q453 82 488 82Q527 82 585 127L596 136Q597 136 599 126L602 115Q578 85 511 27T428 -31Q400 -31 308 10T170 51Q143 51 123 43T92 24T54 -15L34 6L41 14Q65 41 170 129L188 144L204 145Q254 147 293 164T350 208Q378 249 378 344Q378 422 362 478T320 563T268 605T213 618Q177 618 156 600T134 561Q134 539 162 508T217 446T245 394Q245 368 213 337T85 250L62 262Q73 269 86 279T116 308T133 338T108 378T57 439T32 499Q32 556 117 617T291 679Q350 679 393 658Q415 647 433 631T462 600T480 572T490 550T494 541T499 544T516 556T547 578T603 613T689 662L720 679L730 670Q742 659 756 649T785 629T810 615T836 601T855 590Q855 587 860 536T870 419T875 312Q875 114 800 -25Q794 -35 781 -47Q584 -220 398 -220Q322 -220 278 -190Q253 -173 239 -155L244 -150Q248 -145 255 -138T271 -120T290 -100T310 -80T328 -63T341 -51T349 -46Q350 -46 351 -46T354 -47Q357 -47 357 -52Q359 -68 364 -83T383 -118T424 -151T491 -166Q559 -166 613 -129Q629 -118 641 -108T674 -68T710 1T735 107T746 260Q746 433 727 507Q727 512 685 535T615 570L602 575",58121:"351 571Q317 571 247 563T171 555Q153 555 133 563T107 584Q94 605 98 609Q101 615 138 658T190 717H207Q204 710 204 699Q204 673 231 666Q235 665 264 665Q296 665 345 667T426 669Q474 669 501 660T545 626Q553 612 553 594Q553 531 498 474T379 384Q371 379 371 378Q371 376 390 376H411H434Q520 376 602 318Q621 303 627 288T633 234Q633 59 540 -34Q465 -109 348 -130Q308 -137 235 -137Q159 -136 143 -129Q132 -125 132 -118V-53Q118 -24 90 -24Q69 -24 37 -39L27 -44L25 -42Q23 -39 21 -35T17 -30Q17 -28 40 -14T103 19T177 44Q183 45 205 45Q219 45 227 44T245 37T259 20T264 -12Q264 -33 262 -48T259 -80Q259 -93 260 -95Q271 -110 305 -110Q343 -110 383 -86T443 -33Q491 34 491 154Q491 223 467 249Q428 288 334 288H322Q288 288 237 276L222 273L206 286L262 367Q279 369 303 377T358 403T410 452T431 524Q431 531 431 533T427 545T416 558T392 566T351 571"},{})},175:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.fraktur=void 0;var n=r(768),o=r(9587);e.fraktur=(0,n.AddPaths)(o.fraktur,{33:"102 582T102 620T112 673T152 689Q190 689 190 638Q190 605 167 373L148 187L133 184Q102 582 102 620ZM91 24T91 48T107 88T148 104Q171 104 187 87T204 48Q204 22 188 5T149 -12Q124 -12 108 6",34:"33 436Q8 603 8 648Q8 663 9 671T19 687T43 695Q63 695 74 681Q76 678 76 650V623L66 532Q57 443 55 436V432H33V436ZM128 666Q128 691 162 691T196 668Q196 634 186 531Q176 441 176 432H166Q155 432 155 434L142 545Q135 603 130 647Q128 664 128 666",38:"181 520Q181 604 231 650T328 697L330 698Q333 698 335 698Q336 698 340 698T346 697Q390 697 418 670T446 604Q446 554 414 511Q384 467 300 417L283 406Q281 405 296 374T347 286T425 182Q466 135 469 135Q470 135 473 140T480 152T486 165Q509 210 509 263Q509 282 507 292Q498 317 488 332T465 352T443 359T418 361Q388 361 357 358L346 356L347 374Q347 394 348 396V399H355Q366 396 535 396Q663 396 689 398L703 399Q703 398 702 375T700 351L688 353Q655 356 601 357Q553 357 553 355Q562 332 562 294Q562 280 561 267T555 241T548 218T539 195T529 175T518 156T508 141T497 126L489 115L496 107Q549 54 596 54Q623 54 644 67T677 101T697 140T708 174L710 187Q710 188 710 188L711 190Q714 190 723 187T733 183Q733 179 732 172T726 145T714 107T694 66T665 27T623 0T569 -11Q500 -11 443 41L434 49L425 42Q348 -9 275 -9Q251 -9 233 -6Q187 -1 152 18T98 60T67 111T52 159T49 195Q49 231 60 261T96 315T141 354T197 390L208 397Q181 459 181 520ZM374 577Q374 607 356 629T311 651Q289 651 271 636Q242 614 242 559Q242 533 249 502T262 453T270 435T279 440T298 453T314 464Q374 503 374 577ZM127 217Q127 145 173 89T291 32Q318 32 347 42T393 63T409 75Q384 100 325 184T227 351Q223 366 220 366Q215 366 178 338Q127 298 127 217",39:"69 666Q69 680 79 687T104 695Q112 695 117 694T128 684T134 659L104 438Q104 436 96 436T88 438Q88 447 79 540T69 655V666",40:"293 737V719Q291 718 285 714T276 708T268 702T258 695T250 686T241 674Q164 570 164 282Q164 -37 230 -119Q273 -171 292 -171Q293 -171 293 -179V-186H289Q270 -180 259 -175Q175 -132 145 -23T114 275Q114 491 157 598T293 737",41:"223 259Q223 386 212 474T178 609T136 677T89 714V735Q121 726 139 713Q276 622 276 273Q276 98 246 -23Q225 -106 189 -139T89 -187V-170L101 -165Q148 -146 172 -110T210 13T223 259",42:"118 573Q118 575 76 602L34 629L50 647L55 652L66 642Q76 633 91 620T117 598L128 590Q128 663 125 687V692H151V689V687Q151 685 151 683T150 678T150 672Q145 628 144 605V592L219 652L232 634Q232 632 220 624Q195 610 155 582L146 575L158 567Q178 552 197 540T225 523T233 516Q233 515 226 506T217 495L152 549L143 555V530Q144 509 145 492T148 466T149 454Q149 449 142 449H125V462Q128 522 128 549V562L115 552Q88 531 59 506L45 495Q44 495 39 505T34 516L118 573",43:"357 584L399 598V282H709L702 263L696 243H399V-64L379 -73L358 -82Q357 -82 357 81V243H47L51 253Q52 256 54 263T58 272L62 282H357V584",44:"99 62Q99 82 114 94T144 107Q159 107 178 77T205 26Q213 5 213 -23Q213 -49 207 -65T181 -113Q128 -189 122 -191Q121 -191 116 -184T111 -174Q111 -173 122 -155T145 -111T156 -62Q156 -44 152 -34T127 4L104 37Q99 49 99 62",45:"46 236L62 274Q62 275 384 275H706L699 255L693 236H46",46:"87 43Q87 69 104 85T142 102Q164 102 182 86T200 44Q200 20 183 3T141 -15Q118 -15 103 2T87 43",47:"230 270Q426 721 428 721Q437 719 447 717L466 713L448 672Q78 -180 77 -181Q77 -182 55 -182L34 -181L230 270",48:"212 -13Q184 -13 156 -2T101 32T59 97T42 195Q42 311 132 396Q170 433 211 462T262 492Q272 492 301 477T366 434T429 360T456 258Q456 161 378 74T212 -13ZM381 209Q381 257 365 295T328 355T282 390T243 408T223 413Q220 413 204 403T167 376T137 341Q119 305 119 250Q119 168 159 114T263 59Q308 59 344 93T381 209",49:"123 459Q145 459 170 460T217 462T256 464T284 466L295 467Q296 467 296 467T297 468Q299 468 302 466T307 462L309 459Q307 454 304 424T299 341T297 235Q297 139 298 101T302 55T313 44Q316 43 367 43L460 46Q460 35 459 22V-1H450Q402 2 281 6Q222 6 171 4T91 1T56 -1L47 -2V43H121H170Q195 43 201 45T209 56Q212 69 212 214Q212 333 209 365T194 409Q183 417 161 423T121 430L104 432Q103 432 103 446V459H123",50:"104 384Q115 394 133 409T199 449T281 474Q321 474 351 447T385 378Q385 328 333 255T228 127T176 72Q176 67 183 65Q184 65 203 65T260 67T331 69L475 73L484 67Q484 64 472 33L460 1H60V17L107 61Q210 159 249 208Q309 283 309 331Q309 363 285 389T228 415Q212 415 184 403T134 379L114 367L104 384",51:"305 328Q305 372 279 396T214 421H211Q172 421 128 384L107 398L116 405Q151 437 191 455T251 473H260Q314 473 341 455T382 394Q384 386 384 367T382 338Q362 263 271 217L256 210L257 206L259 202Q260 202 272 201T296 198T324 192T355 179T384 157T410 123T427 75Q429 64 429 41Q429 -59 353 -120T183 -182L88 -164Q81 -162 69 -157T48 -147T39 -141Q39 -139 46 -127L53 -114L69 -122Q129 -149 171 -149Q218 -149 253 -131T305 -83T330 -26T338 29Q338 41 336 55T328 89T308 127T273 153Q228 171 162 171Q158 171 152 171T142 170H127V204H134Q232 214 275 257Q305 292 305 328",52:"299 -179Q306 -156 306 -48V0H11V7Q10 10 10 18Q10 23 154 236L298 449Q298 450 339 463L379 476Q385 473 384 470V466Q384 463 384 457T384 444T383 427T383 408Q381 328 381 248Q381 46 384 40H387Q422 40 460 44Q465 44 470 44T478 44L481 45Q481 43 478 24T473 1Q473 -1 464 -1Q462 -1 451 -1T430 0H387V-76L389 -156V-161L311 -191Q299 -181 299 -179ZM299 364H287L277 352Q234 297 186 224T112 104T79 43Q79 42 192 42H306V115Q306 300 299 359V364",53:"334 25Q334 99 296 134T207 169Q154 169 107 123L98 114L89 120L80 125V458H420Q420 456 409 418L397 379Q397 378 264 378H131Q130 377 128 376T125 374T124 371T122 368T122 363T121 356T121 345V279V190L130 186L140 190Q196 214 260 214Q311 214 348 197T404 153T431 99T440 42T433 -16T406 -76T356 -130T276 -169T163 -184H156Q110 -184 57 -163L47 -159L53 -147L58 -134Q61 -134 74 -139T110 -148T156 -153Q206 -153 243 -135T299 -87T326 -30T334 25",54:"45 240Q45 328 73 406T143 536T235 626T327 681T399 699Q400 699 404 699T411 700Q424 700 441 696T459 689Q459 671 451 637Q451 633 447 632L444 629L434 633Q413 640 384 640H377Q299 640 222 565Q182 531 156 463T129 315V306H136L149 315Q229 376 316 376H318Q393 376 432 326T471 213Q471 129 402 58T237 -13T93 59T45 240ZM391 172Q391 231 354 272T258 314Q230 314 200 302T154 279T133 262L134 249Q154 32 266 32Q315 32 353 64T391 172",55:"395 377L391 382H225Q59 382 59 383L74 423Q89 464 89 465Q90 468 94 468Q146 460 350 458H498V442L473 406Q241 75 125 -156L113 -181H40L37 -168L57 -140Q115 -58 199 70T339 287T395 377",56:"220 -10Q168 -10 131 6T75 50T48 103T40 157Q40 223 77 266Q103 295 156 328T225 375Q247 393 247 394L206 361Q205 361 193 368T164 391T131 426T102 474T90 531Q90 580 114 615Q146 660 238 698L254 705L262 704Q288 704 332 693T402 656Q434 620 434 568Q434 518 401 475T321 402L305 391L336 368Q339 366 353 356T372 343T389 330T406 316T420 301T434 283T445 265T454 244T458 222T461 195Q461 106 389 48T220 -10ZM350 545Q350 578 337 601T304 634T266 649T234 653L224 654L204 639Q196 634 191 629T182 621T176 614T173 609T170 603T168 597Q165 585 165 567Q165 497 261 424L273 415Q350 467 350 545ZM261 405L263 407Q262 407 261 405ZM258 403Q257 403 255 401L254 399L256 400Q258 402 258 403ZM252 398Q251 398 249 396L248 394L250 395Q252 397 252 398ZM245 36Q276 36 300 45T338 69T360 102T371 136T374 168Q374 211 341 255Q324 275 305 289T235 332Q231 330 215 321T193 307T173 292T153 271T138 247T127 216T123 177Q123 146 132 117T170 62T245 36",57:"353 93T352 93T320 79T251 49T201 34Q127 37 87 79Q28 138 28 234Q28 273 37 304T60 355T101 396T152 429T218 462L234 469H243Q348 461 395 417Q466 348 466 201Q466 72 397 -29T211 -163Q155 -179 91 -182H72V-154H80Q144 -154 202 -131T297 -60Q318 -31 333 7T352 68L357 92Q353 93 352 93ZM369 208Q369 240 362 272T339 339T290 394T214 415Q171 415 144 372T116 266Q116 193 154 144T238 95H249Q369 95 369 208",58:"50 377T50 400T64 440T99 457Q128 457 146 440T165 399Q165 375 146 359T102 342T64 359ZM53 19T53 43T66 86T103 105Q129 105 148 87T168 41Q168 17 147 3T102 -12Q80 -12 67 3",59:"47 399Q47 424 62 441T101 458T143 442T162 400T144 359T101 343Q78 343 63 360T47 399ZM76 86Q76 88 80 91T91 96T106 99Q119 99 131 86Q179 35 179 -25Q179 -64 146 -115T89 -189Q86 -187 83 -185T79 -182T76 -180T75 -177T77 -173T80 -168Q121 -108 121 -64Q121 -44 94 -5T66 52Q66 66 71 75T76 86",61:"725 366Q724 365 721 349T716 331V329H385Q54 329 54 331Q55 332 59 349T63 368H394Q725 368 725 366ZM725 169Q724 168 721 152T716 134V132H385Q54 132 54 134Q55 135 59 152T63 171H394Q725 171 725 169",63:"46 557Q46 613 103 653T227 693Q287 693 322 659T357 564Q357 517 326 469T259 390T191 326T160 272Q160 240 187 221Q193 217 193 216Q182 209 170 200L147 184Q127 192 113 209T98 250Q98 290 193 376Q287 454 287 542Q287 581 262 616T188 652Q143 652 126 631T108 588Q108 559 140 527L79 490Q46 515 46 557ZM108 47Q108 68 123 85T160 103Q179 103 198 90T217 46Q215 24 201 7T164 -11Q142 -11 125 6T108 47",91:"262 -119Q224 -120 191 -123T141 -128T118 -130Q117 -130 117 305V740H122Q141 737 219 736H278V723Q278 711 277 711L159 699V-93H162Q167 -93 220 -96T276 -100Q278 -100 278 -109V-119H262",93:"64 733Q89 733 110 734T143 737T158 738H160V-131H154Q101 -125 40 -124H-4V-103H1Q3 -102 57 -98T113 -92H118V700L64 703Q7 707 3 708H-4V732H21Q34 733 64 733",94:"0 464L250 734L262 722Q274 712 384 598L495 486Q483 478 467 467L456 459L248 672L154 580L23 452Q17 454 10 458T0 464",8216:"117 410Q97 410 71 455T45 539Q45 588 129 694L140 708Q142 708 153 694L147 682Q106 609 106 582V577V571Q106 548 132 511T158 455Q158 434 143 422T117 410",8217:"105 529Q105 546 77 588T49 651Q49 658 51 666Q53 672 67 682T92 692Q111 692 137 644T163 563Q163 534 143 497T99 428T74 395Q72 395 65 400T58 407Q105 476 105 523V529",8260:"230 270Q426 721 428 721Q437 719 447 717L466 713L448 672Q78 -180 77 -181Q77 -182 55 -182L34 -181L230 270",58112:"427 436Q427 434 427 425T429 398T430 362Q430 222 396 109L393 99L305 33Q218 -32 216 -32Q208 -29 142 22L91 68L78 81L77 94Q75 130 75 173Q75 245 87 347L135 385Q178 418 184 424L177 428Q174 429 170 431Q116 454 96 473T75 534Q79 608 154 683Q164 677 164 673Q164 670 157 662T144 637T137 598Q137 552 182 518T280 470T380 447T427 436ZM342 371L275 394L208 417Q203 417 192 399T168 334T156 229Q153 187 153 157Q153 141 156 135Q158 125 208 88T280 51Q306 51 326 120T346 297Q346 339 344 354T342 371",58113:"39 551L35 569L52 577Q72 586 98 595T140 610T158 616Q174 612 200 604T293 560T412 477Q414 475 417 472Q428 462 430 450T432 376Q432 223 401 124Q395 106 393 103T382 92Q351 68 281 20T206 -29Q201 -31 137 26L100 60L78 83L77 112Q76 132 76 170Q76 259 86 342L88 360L101 371Q116 386 163 422T215 459Q216 459 224 455T233 450L229 446Q225 442 218 434T203 419Q179 394 175 389T168 372Q156 334 156 262Q156 167 164 137Q168 125 196 102T252 62L278 45Q279 45 285 52T302 78T322 126T339 205T346 316Q346 367 344 389L343 406L326 423Q228 520 113 559L100 564L70 557L39 551",58114:"123 386L120 431Q116 476 116 511V520Q116 593 174 649Q207 680 236 680Q258 680 284 664T312 648Q318 648 327 656Q328 657 330 659Q337 664 337 661Q337 660 338 657Q338 652 339 648L268 566L260 574Q234 600 206 600Q182 600 164 585T145 541Q145 492 211 386L267 385H324L299 354H214V312Q214 86 193 -58L192 -69L116 -215H108Q92 -215 92 -212Q93 -211 100 -189T116 -135T128 -80Q134 -41 134 22Q134 54 130 185T125 349V354H29L59 385H91Q123 385 123 386",58115:"91 530Q91 564 116 600T164 656T194 678Q195 678 200 678T209 679Q268 679 316 639L293 593Q267 547 263 546H262Q260 546 256 553Q222 613 180 613Q160 613 146 599T132 564T170 474T210 388H318L296 356H206V322Q204 284 204 255Q202 221 202 161V99Q202 28 194 -22T160 -124Q148 -146 116 -199L101 -224L91 -220Q85 -218 84 -217T83 -215L101 -161Q116 -114 119 -73T122 108Q119 334 117 352V356H72L28 357L66 388H92Q118 388 118 389L109 433Q91 514 91 530",58116:"254 -150Q293 -150 328 -126T363 -54Q363 -38 352 29T339 98L250 34Q160 -30 159 -30L77 64V71Q74 95 74 174Q74 212 75 243T79 294T83 328T87 352T90 366L117 384Q206 446 238 464L250 471Q277 455 306 443T350 427L365 423Q367 423 405 443T443 465L449 455Q431 414 426 362T418 201Q418 135 420 121Q438 -4 438 -19Q438 -26 438 -31T434 -42T429 -51T420 -63T408 -77T391 -95T370 -119T346 -147T325 -170T309 -187T291 -200T274 -207T252 -213T225 -214Q175 -214 132 -196T70 -160L52 -143Q52 -138 90 -48Q90 -47 95 -47H101Q108 -81 146 -115T254 -150ZM341 136Q341 157 344 242T347 348V355L334 356Q299 359 262 367T203 383T179 391Q177 391 173 377T163 323T158 227Q158 164 161 128V121L174 106Q203 75 223 59L341 127V136",58117:"92 446Q92 603 82 664Q94 670 95 670L96 666Q98 661 101 651T108 633Q121 598 121 597L141 612Q247 686 250 686Q251 686 266 679Q261 674 243 659T213 632T190 597T173 546Q172 541 171 530T170 511T170 502Q171 502 222 542L273 582Q308 522 315 504L279 449L269 462Q231 506 215 506Q202 506 190 490Q164 458 164 395V390H279L266 373L254 355H167V306Q169 252 169 217Q170 195 170 147V117L200 92Q234 64 237 64Q243 64 277 81L311 99V75Q310 75 242 27L174 -20L156 -3Q88 60 81 60L79 62Q80 60 82 62Q87 67 87 290V355H57L26 356L73 390H92V446",58118:"117 531Q117 533 137 544T178 566L198 577Q200 577 204 575T208 572V570Q208 568 208 566T207 560Q197 496 197 397V392H321L295 353H199V260Q199 157 200 145V122L269 68Q271 67 274 67Q282 67 310 83T342 100Q343 100 345 92T346 83L211 -21L172 12Q117 59 117 63Q117 65 117 87T119 150T120 238V353H75L29 354L65 391H118V460Q117 498 117 531",58119:"337 91V78L324 71Q288 53 256 29T206 -8T180 -22Q174 -22 158 -9Q82 46 60 46H59L63 51Q67 56 73 68T85 96Q101 158 101 254Q101 300 95 330T83 370T66 394L53 388Q48 385 41 382T24 374Q22 376 20 378T16 381T13 383T10 385V386L119 475Q150 439 160 430L171 422V409Q173 377 173 300Q173 228 166 183T152 122T145 102Q207 81 242 58L337 104V111Q340 146 340 227Q340 320 339 351T338 408V423L422 469Q425 465 429 462L426 438Q413 354 413 251Q413 152 423 119Q426 110 435 96T452 82Q454 82 509 103Q514 98 514 89Q514 87 507 81T472 51T409 -7L395 -20Q393 -18 390 -17Q386 -14 382 -6Q380 -2 379 1Q369 24 361 40T348 62T341 73T338 84L337 91"},{})},5735:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.italic=void 0;var n=r(768),o=r(8348);e.italic=(0,n.AddPaths)(o.italic,{33:"330 716Q351 716 365 703T380 670V659L304 433Q230 207 227 204Q225 198 205 198Q184 198 184 207T220 439T260 669Q270 694 297 708Q300 709 304 710T311 713T316 714Q324 716 330 716ZM107 51Q110 83 133 102T179 121Q207 121 219 105T231 72Q231 45 209 23T156 0Q138 0 123 11T107 51",34:"214 620Q214 647 236 670T289 694Q312 694 326 677T341 633V624Q341 588 327 550T294 482T253 428T216 392T196 379Q191 379 184 388T176 401Q176 404 195 421T243 472T287 547Q299 576 299 582L295 580Q291 578 282 576T264 573Q241 573 228 585T214 620ZM411 620Q411 647 433 670T486 694Q509 694 523 677T538 633V624Q538 588 524 550T491 482T450 428T413 392T393 379Q388 379 381 388T373 401Q373 404 392 421T440 472T484 547Q496 576 496 582L492 580Q488 578 479 576T461 573Q438 573 425 585T411 620",35:"281 327H228Q186 327 175 330T164 347Q164 359 176 365Q179 367 292 367H404L563 688Q569 694 578 694T593 686T597 670Q597 667 531 535L448 367H614L773 688Q779 694 787 694Q796 694 802 688T808 674V672L807 670Q807 667 732 517L658 368L736 367H814Q828 357 828 347Q828 336 812 327H637L599 250Q561 174 561 173H662H724Q760 173 769 170T779 153T770 136T729 132Q721 132 696 132T651 133H540L380 -188Q374 -194 366 -194Q357 -194 351 -188T345 -174L346 -172V-170Q346 -167 412 -35L495 133H330L170 -188Q164 -194 156 -194Q147 -194 141 -188T135 -174L136 -172V-170Q136 -167 211 -17L285 133H207L130 134Q115 140 115 153Q115 164 131 173H306L344 250Q382 326 382 327H281ZM592 327H427L389 250Q351 174 351 173H516L554 250Q592 326 592 327",37:"301 348Q257 348 231 383T205 480Q205 553 244 629T346 736Q370 750 394 750Q416 750 429 742T458 714Q512 644 606 644Q722 644 802 732Q817 750 827 750Q835 750 841 744T847 730Q847 725 827 700T689 540Q586 421 512 335Q180 -50 176 -52Q172 -56 165 -56Q157 -56 151 -50T145 -35Q145 -29 162 -9T330 186Q392 258 430 302Q711 627 711 628L701 624Q652 607 604 607Q551 607 494 634L479 642V624Q479 544 439 467Q414 416 377 382T301 348ZM270 443Q270 385 303 385H306H308Q326 385 348 407Q384 441 409 504T434 627Q434 713 390 713Q358 713 328 663Q307 631 289 556T270 451V443ZM608 -56Q573 -56 543 -23T513 76Q513 129 536 190T604 296L627 318Q670 347 704 347Q747 347 767 310T788 222Q788 126 732 35T608 -56ZM742 222Q742 310 699 310Q677 310 655 285T620 227Q608 197 593 138T578 42V36Q578 -18 613 -18Q657 -18 699 64T742 222",38:"209 444Q209 546 278 631T424 716Q473 716 501 683T530 601Q530 554 511 535T467 515Q446 515 437 527T427 553Q427 578 446 594T481 610H483V617Q480 641 464 660T419 679Q367 679 328 603Q316 578 305 538T288 470L282 443L295 449Q308 455 330 462T371 469Q397 469 413 450T430 404Q430 363 400 329T331 295Q291 295 256 322Q255 322 246 293T227 223T217 158Q217 117 232 88T273 43T327 22T387 15Q457 15 512 37T599 93T652 169T680 248T688 317T678 380T659 423T647 437Q643 435 637 431T613 416T581 392T554 364T538 332Q540 310 541 310Q554 335 587 335Q601 335 613 327T626 300Q626 290 622 279T603 255T563 242Q532 245 512 263T491 320Q494 351 511 377T547 418T600 456T652 494Q676 512 697 539T728 582T738 601Q738 602 736 602Q732 602 726 604T714 616T707 638Q707 661 724 677T764 694Q799 694 802 660Q802 625 767 562T688 467L694 458Q700 449 702 444T711 428T720 408T727 385T733 358T735 327Q735 281 724 235T685 141T617 59T515 1T375 -22Q270 -22 199 34T127 181Q127 216 147 270T207 374L216 386Q209 421 209 444ZM386 412Q386 432 366 432Q345 432 325 418T294 390T284 375Q284 371 289 362T306 343T335 332Q355 332 367 350T383 384T386 412",39:"250 620Q250 647 272 670T325 694Q348 694 362 677T377 633V624Q377 566 343 506T275 412T231 379Q226 379 220 388T213 401T232 421T279 472T323 547Q335 573 335 582L331 580Q327 578 318 576T300 573Q277 573 264 585T250 620",40:"241 -250Q203 -212 174 -140T144 39Q144 158 180 288T296 544T481 746L487 750H499Q517 750 517 740Q517 736 495 716Q399 630 331 491T236 228T208 3Q208 -73 224 -130T255 -214T271 -244Q271 -250 252 -250H241",41:"326 497Q326 546 320 588T304 655T285 699T269 728T262 740Q262 746 267 749L272 750Q276 750 281 750H293Q331 712 360 640T390 461Q390 332 339 171T188 -116Q161 -150 121 -188T47 -250H35Q17 -250 17 -240Q17 -236 39 -216Q135 -130 203 9T298 272T326 497",42:"560 658Q569 658 576 649T584 631Q584 625 583 620T577 611T569 603T556 595T540 587T519 578T494 566L428 536Q427 535 433 531T479 502Q525 475 532 469T539 450Q538 435 525 424T497 412Q489 412 482 418T442 456Q400 497 400 494L387 420Q376 353 373 343T352 323Q345 320 336 320H331Q322 320 316 327T309 343Q309 347 334 420L359 496Q358 496 297 456T234 414Q228 411 221 411Q212 411 204 417T195 439Q198 458 209 465T283 502L353 534L300 566Q255 593 247 599T239 616Q239 631 252 644T282 658Q290 658 295 654T335 615L378 573L391 647Q393 657 395 671T398 691T400 706T404 720T408 730T414 739T423 744T434 749Q435 749 439 749T445 750Q467 748 469 728Q469 723 457 685T432 610L420 573L481 613Q548 658 560 658",43:"139 237T139 250T151 266T198 270H293H431L465 407Q469 424 476 452Q494 528 500 542T519 557Q526 557 532 552T538 538Q538 536 507 409T472 272Q472 270 604 270Q737 270 741 268Q753 261 753 250Q753 237 742 233T696 229Q687 229 655 229T599 230H462L461 226Q461 224 427 91T392 -47Q387 -57 374 -57Q367 -57 361 -51T355 -37Q355 -31 388 99L421 230H288Q267 230 238 230T199 229Q163 229 151 233",44:"106 46Q106 68 121 90T167 120Q168 120 173 120T180 121Q232 121 232 59V54Q232 18 219 -20T186 -88T145 -143T109 -181T88 -194Q84 -194 77 -185T69 -171Q69 -168 70 -166T76 -161T85 -154T101 -139T124 -114Q146 -88 162 -58T183 -12T188 7Q187 7 183 5T172 2T156 0Q129 0 118 14T106 46",45:"205 180H131Q102 180 93 181T84 190Q90 238 103 251H334Q341 244 341 241Q341 236 336 214T327 186Q325 181 312 181T205 180",46:"107 50Q107 76 129 98T181 121Q203 121 217 108T231 72Q231 47 210 24T156 0Q135 0 121 13T107 50",47:"166 -215T159 -215T147 -212T141 -204T139 -197Q139 -190 144 -183Q157 -157 378 274T602 707Q605 716 618 716Q625 716 630 712T636 703T638 696Q638 691 406 241T170 -212Q166 -215 159 -215",48:"414 665Q562 665 562 490Q562 426 534 318Q451 -21 251 -21Q222 -21 202 -15Q155 2 134 40T110 144Q110 201 127 286T187 470T287 614Q348 665 414 665ZM187 98Q187 59 208 37T260 15Q320 15 365 83Q394 128 440 312T487 547Q487 580 471 600T433 627Q428 628 408 628Q381 628 353 609T311 569Q279 526 239 364T190 143Q187 120 187 98",49:"248 491Q228 491 228 502Q228 516 236 532Q237 536 246 537T275 541T314 552Q350 567 382 595T430 644L446 664Q450 666 454 666Q468 666 468 658Q468 647 395 359Q321 63 321 59Q321 52 334 50T388 46H422Q428 37 428 35Q428 19 421 5Q416 0 405 0Q400 0 361 1T263 2Q215 2 185 2T142 1T127 0Q110 0 110 11Q110 13 113 25T118 40Q120 46 146 46Q196 46 212 49T235 61Q238 66 295 295L353 526L340 519Q328 512 302 503T248 491",50:"159 404Q159 433 176 476T222 562T297 635T395 666Q466 666 508 617T551 497Q551 473 545 446Q534 388 482 333Q441 292 355 240T264 184Q216 151 179 101L171 91Q171 90 177 90Q206 90 269 77T366 64Q385 64 390 65Q418 73 441 98T475 156Q479 168 481 170T495 173H518Q524 167 524 166T521 152Q502 86 459 32T353 -22Q315 -22 259 15T172 53Q156 53 143 36T126 1L121 -16Q119 -22 98 -22H82Q76 -16 76 -13T80 5T98 50T132 111T189 178T274 242Q327 273 364 305T420 370T447 427T460 483Q466 514 466 538Q466 586 443 607T389 629Q338 629 293 584T226 487T204 399Q204 390 204 386T209 378T222 373Q258 376 282 422T307 493Q307 506 302 517T297 531Q297 537 308 546T327 551Q329 550 333 543T340 523T344 497Q344 450 306 393T216 336Q186 336 173 355T159 396V404",51:"296 531Q296 536 307 544T322 553Q330 553 338 534T346 501Q346 468 319 440T258 412Q232 412 216 430T200 478Q200 552 281 618Q345 666 416 666Q489 666 525 625T562 530Q562 473 525 419T430 335L416 329Q479 288 479 206Q479 142 440 89T344 7T229 -22Q173 -22 135 12T96 106Q96 192 157 192Q192 192 197 157Q197 134 184 117T142 96Q153 47 180 29Q201 15 232 15Q249 15 275 22Q307 34 331 57Q363 90 379 153T396 246Q396 261 393 272T384 290T371 301T355 308T341 311T326 312H316H307Q287 312 282 313T276 320Q276 323 279 337T283 352Q284 356 290 357T325 358Q364 359 368 360Q386 365 400 372T433 397T464 448T485 527Q487 535 487 556Q487 629 414 629Q350 629 298 580T245 476Q245 450 263 450H264Q280 450 294 463T308 496Q308 508 302 518T296 531",52:"448 34Q453 34 463 22T473 5Q473 -2 457 -7Q417 -22 383 -23H366L350 -91Q348 -98 345 -111T340 -130T335 -146T330 -161T325 -172T318 -182T310 -188T299 -193T286 -194Q256 -194 253 -165Q253 -159 271 -83T292 -5Q231 29 169 29Q114 29 91 14Q72 -2 65 1Q46 20 46 28Q46 35 55 43T77 60T96 74Q306 257 396 623Q410 666 444 666Q459 666 468 657T478 634Q478 627 470 595T440 504T387 381T303 239T187 99L164 75H178Q217 75 260 59L304 43Q304 48 325 127Q342 195 346 207T358 228Q372 242 391 242Q403 242 413 235T423 214Q423 205 402 116T378 25Q378 23 387 23Q405 23 418 25T439 31T448 34",53:"196 304Q189 309 189 314Q189 317 231 487T275 660Q278 666 283 666Q287 666 302 658T346 643T413 635Q447 635 481 642T537 658T559 666Q561 666 564 663T567 658Q565 637 557 629Q528 600 474 573T359 545Q342 545 327 546T304 550T294 552L291 540Q288 529 283 507T273 465L251 379Q307 420 364 420Q415 420 456 382T497 261Q497 165 429 82T262 -20Q256 -20 247 -21T233 -22Q176 -22 141 15T106 112Q106 208 173 208Q192 208 203 197T214 169Q214 143 195 125T156 107H153V100Q155 73 174 47T239 21Q245 21 259 23Q355 46 392 200Q393 205 394 207Q412 276 412 312Q412 352 396 367T358 383Q288 383 233 314Q226 306 224 305T209 304H196",54:"377 434Q425 434 457 404T499 341T509 278Q509 243 496 194T456 105T383 27Q322 -22 256 -22Q142 -22 122 114Q120 130 120 159Q120 221 135 292T195 452T310 599Q390 665 465 665Q565 665 565 583V574Q565 543 546 524Q528 506 504 506Q491 506 478 514T465 543Q465 585 515 602Q505 626 466 626Q419 626 372 587Q334 557 305 503T266 409L255 370Q287 410 339 429Q361 434 377 434ZM424 333Q424 359 411 378T365 397Q318 397 282 356T230 257T205 157T197 94Q197 67 211 45T260 22Q313 22 341 57T386 151Q424 283 424 333",55:"466 519Q448 519 435 528T416 550T400 571T376 581Q324 581 271 540T186 437Q185 435 183 432T181 428T179 426T177 424T174 423T171 422T165 422H159Q141 422 141 423Q136 423 136 431Q136 433 190 548T247 665Q249 666 266 666H282Q288 660 288 657Q288 655 284 646T276 628L273 620Q337 666 390 666Q413 666 425 652T438 620T444 584T457 559Q460 557 470 557Q497 557 524 582T571 635T594 665Q595 666 612 666H628Q634 660 634 657Q634 653 618 629T572 556T510 441T437 269T367 43Q356 -22 304 -22Q291 -22 278 -14T263 14Q263 36 281 95T354 269T486 507Q497 524 495 524Q482 519 466 519",56:"209 449Q209 545 278 605T416 666Q482 666 517 631T553 546Q553 513 539 482T504 430T463 394T426 370L410 360L430 343Q471 309 483 278T495 211Q495 141 441 75Q363 -21 253 -21Q182 -21 141 18T99 117Q99 161 119 201T170 268T222 308T259 331L272 338L259 349Q212 389 209 449ZM492 542Q492 586 469 605T415 625Q360 625 320 587T279 505Q279 495 281 487T286 474T295 460T306 449T321 436T337 422Q379 386 380 386Q389 386 420 412T472 471Q492 513 492 542ZM163 118Q163 76 189 49T258 21Q316 21 368 64T420 170Q420 193 412 208T395 233T350 271L302 312Q298 312 284 303T249 276T209 235T177 181T163 118",57:"297 211Q258 211 230 228T189 273T169 323T163 367Q163 411 183 472T254 585Q327 656 401 665Q403 665 412 665T427 666Q458 664 481 652T518 622T539 580T550 535T553 491Q553 448 544 395T515 277T454 148T358 37Q282 -22 213 -22Q166 -22 137 -1T107 55V64Q107 88 114 104T134 127T154 136T169 138Q185 138 196 128T207 101Q207 82 196 68T172 48L161 43Q161 40 167 36T187 26T219 21Q286 21 344 99Q364 126 382 169T408 241T417 275L412 269Q406 263 395 253T370 234T337 218T297 211ZM476 552Q476 626 417 626Q368 626 330 584Q312 563 300 533T270 433Q248 341 248 312Q248 286 262 267T310 248Q353 248 387 287T440 380T467 480T476 552",58:"184 358Q184 385 206 408T258 431Q279 431 293 418T308 383Q308 354 284 332T233 310Q212 310 198 324T184 358ZM107 50Q107 76 129 98T181 121Q203 121 217 108T231 72Q231 47 210 24T156 0Q135 0 121 13T107 50",59:"184 358Q184 385 206 408T258 431Q279 431 293 418T308 383Q308 354 284 332T233 310Q212 310 198 324T184 358ZM107 47Q107 77 130 99T180 121Q226 121 226 61Q226 25 214 -14T182 -84T144 -140T109 -180T88 -194T77 -185T70 -172Q70 -169 84 -155T121 -112T161 -48Q180 -10 180 3Q180 4 174 2Q172 2 166 1T156 0Q135 0 121 13T107 47",61:"776 357T776 347T761 327H470Q180 327 176 329Q164 334 164 347Q164 359 176 365Q179 367 470 367H761Q776 357 776 347ZM116 143T116 153T131 173H422Q713 173 717 171Q728 166 728 153T717 135Q713 133 422 133H131Q116 143 116 153",63:"235 431Q217 431 206 442T195 468Q195 490 215 537T280 638T380 707Q403 716 423 716Q425 716 429 716T436 715Q485 715 518 681T551 590Q551 543 530 503T482 439Q471 428 400 375T318 310Q300 287 300 259Q300 236 315 236Q333 236 352 251T384 300Q386 306 407 306H423Q429 300 429 297Q429 272 393 235T308 198Q287 198 269 215T251 270Q251 330 293 374L374 436Q377 438 401 456T432 480T457 503T481 531T494 561T501 598Q501 614 499 626Q482 678 430 678H426Q392 678 362 660T311 615T280 571T264 540L259 528Q259 527 266 526T283 516T294 492Q294 466 276 449T235 431ZM209 51Q212 83 235 102T281 121Q309 121 321 105T333 72Q333 45 311 23T258 0Q240 0 225 11T209 51",64:"198 250Q198 155 248 91T394 26Q514 26 640 80L650 84H675H683Q709 84 709 76Q709 73 708 71Q706 64 660 45T534 8T383 -11T260 24T181 115Q152 168 152 248Q152 410 268 552Q303 590 324 608Q439 705 551 705Q611 705 658 683T733 623T775 543T789 454Q789 380 766 304T720 192Q677 125 617 125Q591 125 573 137T548 160T541 176Q541 178 540 178L534 173Q527 168 515 160T488 144T454 131T417 125Q361 125 320 166T279 284Q279 393 356 481T523 569Q570 569 603 537Q623 515 632 490L637 480L657 479Q684 479 684 470Q684 465 650 333L617 199V185Q616 162 628 162Q677 162 712 278Q743 381 743 442Q743 555 687 611T553 668Q467 668 385 608T250 450T198 250ZM598 445Q598 453 594 470T569 510T518 532Q463 532 410 448T356 271Q356 220 374 191T423 162Q482 162 552 255L575 348Q598 440 598 445",91:"205 -221Q205 -239 194 -250H137H106Q73 -250 73 -242Q73 -232 194 255T321 747L324 750H381H417Q435 750 440 748T446 739Q446 730 443 723T437 712L434 710H350L349 706Q349 704 235 249T120 -208Q120 -210 159 -210Q166 -210 175 -210T187 -209Q205 -209 205 -221",93:"227 721Q227 739 238 750H295H326Q359 750 359 742Q359 732 238 245T111 -247L108 -250H51H15Q-3 -250 -8 -248T-14 -239Q-14 -230 -11 -223T-5 -212L-2 -210H82L83 -206Q83 -204 197 251T312 708Q312 710 273 710Q266 710 257 710T245 709Q227 709 227 721",94:"528 555Q528 549 514 538T496 527Q491 527 470 554Q458 569 449 580L414 625L353 578Q339 567 323 555T298 536L290 529Q286 527 285 527Q279 527 273 533T264 546L260 553Q260 559 263 562Q265 564 342 628T421 693T425 694Q430 694 433 691Q528 563 528 555",95:"98 -62Q91 -58 91 -51Q91 -31 100 -26Q102 -25 324 -25H442H500Q536 -25 545 -27T554 -36Q554 -50 548 -56Q546 -60 538 -61Q520 -62 319 -62H98",126:"266 208Q262 208 255 215T247 228Q247 233 250 236T274 259Q335 318 369 318Q394 318 420 292T464 265Q485 265 516 291T550 318Q554 318 562 311T571 297Q570 293 551 273T502 231T451 209H447Q421 209 396 235T355 261Q334 261 301 235T266 208",305:"75 287Q75 292 82 313T103 362T142 413T196 441H214Q248 441 270 419T293 357Q292 338 289 330T245 208Q193 72 193 46Q193 26 209 26Q228 26 247 43Q273 71 292 136Q295 148 297 150T311 153H317Q327 153 330 153T337 150T340 143Q340 133 330 105T292 41T228 -8Q220 -10 204 -10Q160 -10 141 15T122 71Q122 98 171 227T221 384Q221 396 218 400T203 405Q175 403 156 374T128 312T116 279Q115 278 97 278H81Q75 284 75 287",567:"75 284T75 287T81 305T101 343T133 389T180 426T240 442Q273 440 300 420T327 350V332L278 134Q267 92 253 37T233 -45T225 -73Q208 -123 162 -163T54 -204Q8 -204 -15 -181Q-32 -164 -32 -140Q-32 -112 -14 -96T27 -79Q48 -79 57 -91T67 -114Q67 -146 39 -166L44 -167H59H60Q112 -167 145 -74Q148 -65 198 134T251 347Q252 353 252 370Q252 382 251 388T245 399T230 405Q204 405 175 378Q157 360 145 337T126 298T117 280T98 278H81Q75 284 75 287",768:"-222 651Q-222 668 -206 682T-174 697Q-155 697 -145 680Q-140 671 -107 599T-74 526Q-74 522 -88 511T-107 500Q-109 500 -113 502T-167 568T-219 637Q-222 643 -222 651",769:"-148 500Q-154 500 -163 511T-173 528Q-173 529 -172 530V532Q-170 534 -97 610T-21 688Q-8 697 4 697Q19 697 29 688T39 663T30 638Q26 631 -50 573L-135 507Q-144 500 -148 500",770:"17 555Q17 549 3 538T-15 527Q-20 527 -41 554Q-53 569 -62 580L-97 625L-158 578Q-172 567 -188 555T-212 536L-221 529Q-225 527 -226 527Q-232 527 -238 533T-248 546L-251 553Q-251 559 -248 562Q-246 564 -169 628T-90 693T-86 694Q-81 694 -78 691Q17 563 17 555",771:"-245 558Q-249 558 -256 565T-264 578Q-264 583 -261 586T-237 609Q-176 668 -142 668Q-117 668 -91 642T-47 615Q-26 615 5 641T39 668Q43 668 51 661T60 647Q59 643 40 623T-9 581T-60 559H-64Q-90 559 -115 585T-156 611Q-177 611 -210 585T-245 558",772:"-275 544Q-282 548 -282 554Q-282 561 -279 573T-271 588Q-269 589 -111 589H-27H12Q38 589 46 587T54 578Q54 574 51 563T47 550Q45 546 32 545Q15 544 -118 544H-275",774:"-237 641Q-237 694 -218 694H-213Q-195 694 -195 684Q-195 683 -195 679T-197 667T-198 650Q-198 611 -176 589T-117 566Q-74 566 -34 597T23 678Q27 689 30 691T43 694Q62 694 62 684Q62 671 49 645T14 589T-46 537T-123 515Q-175 515 -206 550T-237 641",775:"-165 599Q-162 631 -139 650T-93 669Q-65 669 -53 653T-41 620Q-41 593 -63 571T-116 548Q-134 548 -149 559T-165 599",776:"-251 601Q-251 626 -230 647T-180 669Q-139 669 -133 625Q-133 595 -155 575T-203 554Q-223 554 -237 567T-251 601ZM-72 599Q-72 632 -48 650T-2 669Q18 669 31 657T45 623Q45 592 22 573T-25 554Q-68 554 -72 599",778:"-199 610Q-199 654 -161 685T-79 716Q-39 716 -16 693Q3 674 3 647Q3 607 -34 575T-118 542Q-199 542 -199 610ZM-41 631T-41 655T-83 679H-89Q-129 679 -142 656Q-146 650 -151 632T-156 604Q-156 578 -113 578H-108Q-94 578 -86 579T-69 586T-52 605Q-41 631 -41 655",779:"-217 503Q-221 503 -234 510T-248 523Q-248 528 -205 602Q-200 610 -192 623T-180 644T-170 661T-159 676T-151 686T-142 694T-134 696Q-132 697 -121 697Q-88 694 -88 664Q-88 652 -97 640T-152 574Q-214 504 -217 503ZM-64 503Q-68 503 -81 510T-95 523Q-95 528 -52 602Q-47 610 -39 623T-27 644T-17 661T-6 676T2 686T11 694T19 696Q21 697 32 697Q65 694 65 664Q65 652 56 640T1 574Q-61 504 -64 503",780:"11 637Q16 637 22 624T29 607Q29 606 27 602Q26 600 -47 552T-125 502H-127Q-133 502 -184 553Q-236 602 -236 608Q-236 612 -224 625T-206 638L-202 637L-196 632Q-190 628 -179 620T-158 603L-116 570Q-109 572 -52 604T11 637",989:"477 261Q477 257 473 256T455 253T417 251T348 250H235L155 -77L146 -82Q137 -85 109 -85Q55 -85 55 -77L139 261Q224 596 226 598Q229 603 239 603Q240 603 254 603T290 603T341 604T405 605T477 605Q656 603 687 602T719 596Q719 589 692 588T513 585H319L282 427L242 272Q242 270 351 270Q388 270 410 270T444 269T460 267T469 265T477 261",8211:"98 248Q91 252 91 259Q91 279 100 284Q102 285 324 285H442H500Q536 285 545 283T554 274Q554 260 548 254Q546 250 538 249Q520 248 319 248H98",8212:"124 248Q117 252 117 259Q117 279 126 284Q128 285 579 285T1033 284Q1037 280 1037 278Q1038 276 1038 274Q1038 253 1029 250Q1026 248 575 248H124",8213:"124 248Q117 252 117 259Q117 279 126 284Q128 285 579 285T1033 284Q1037 280 1037 278Q1038 276 1038 274Q1038 253 1029 250Q1026 248 575 248H124",8215:"98 -62Q91 -58 91 -51Q91 -31 100 -26Q102 -25 324 -25H442H500Q536 -25 545 -27T554 -36Q554 -50 548 -56Q546 -60 538 -61Q520 -62 319 -62H98",8216:"249 379Q228 379 213 396T197 448Q197 533 271 627L278 635Q286 643 295 652T314 671T332 687T344 694Q349 694 355 685T362 671Q362 668 345 654T301 608T256 537Q238 493 240 491Q241 491 245 493T258 498T275 500Q296 500 311 488T326 454Q326 426 304 403T249 379",8217:"250 620Q250 647 272 670T325 694Q348 694 362 677T377 633V624Q377 566 343 506T275 412T231 379Q226 379 220 388T213 401T232 421T279 472T323 547Q335 573 335 582L331 580Q327 578 318 576T300 573Q277 573 264 585T250 620",8220:"295 379Q274 379 259 396T243 448Q243 533 317 627Q326 638 354 666T391 694Q395 694 402 686T409 673Q409 668 392 654T348 608T302 537Q284 493 286 491Q287 491 291 493T304 498T321 500Q342 500 357 488T372 454Q372 426 350 403T295 379ZM492 379Q471 379 456 396T440 448Q440 533 514 627Q523 638 551 666T588 694Q592 694 599 685T606 672T589 654T544 608T499 537Q481 493 483 491Q484 491 488 493T501 498T518 500Q539 500 554 488T569 454Q569 426 547 403T492 379",8221:"214 620Q214 647 236 670T289 694Q312 694 326 677T341 633V624Q341 588 327 550T294 482T253 428T216 392T196 379Q191 379 184 388T176 401Q176 404 195 421T243 472T287 547Q299 576 299 582L295 580Q291 578 282 576T264 573Q241 573 228 585T214 620ZM411 620Q411 647 433 670T486 694Q509 694 523 677T538 633V624Q538 588 524 550T491 482T450 428T413 392T393 379Q388 379 381 388T373 401Q373 404 392 421T440 472T484 547Q496 576 496 582L492 580Q488 578 479 576T461 573Q438 573 425 585T411 620",8260:"166 -215T159 -215T147 -212T141 -204T139 -197Q139 -190 144 -183Q157 -157 378 274T602 707Q605 716 618 716Q625 716 630 712T636 703T638 696Q638 691 406 241T170 -212Q166 -215 159 -215",8463:"150 475Q147 475 118 466T82 457Q73 457 64 467T54 487Q54 490 55 492Q63 506 64 506Q67 512 118 526Q162 541 169 546Q173 559 175 575Q181 596 181 604Q181 613 166 617Q164 617 153 618T135 619Q119 619 114 621T109 630Q109 636 114 656T122 681Q125 685 202 688Q272 695 286 695Q304 695 304 684Q304 682 291 628L278 577L386 612Q466 635 476 635T492 627T499 607Q499 593 489 586Q485 583 373 546L262 512Q262 511 248 455T233 397T236 397T244 404Q295 441 357 441Q405 441 445 417T485 333Q485 284 449 178T412 58T426 44Q447 44 466 68Q485 87 500 130L509 152H531H543Q562 152 562 144Q562 128 546 93T494 23T415 -13Q385 -13 359 3T322 44Q318 52 318 77Q318 99 352 196T386 337Q386 386 346 386Q318 386 286 370Q267 361 245 338T211 292Q207 287 193 235T162 113T138 21Q128 7 122 4Q105 -12 83 -12Q66 -12 54 -2T42 26Q42 45 98 257L151 475H150",8710:"574 715L582 716Q589 716 595 716Q612 716 616 714Q621 712 621 709Q622 707 705 359T788 8Q786 5 785 3L781 0H416Q52 0 50 2T48 6Q48 9 305 358T567 711Q572 712 574 715ZM599 346L538 602L442 474Q347 345 252 217T157 87T409 86T661 88L654 120Q646 151 629 220T599 346",10744:"166 -215T159 -215T147 -212T141 -204T139 -197Q139 -190 144 -183Q157 -157 378 274T602 707Q605 716 618 716Q625 716 630 712T636 703T638 696Q638 691 406 241T170 -212Q166 -215 159 -215"},{})},8594:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.largeop=void 0;var n=r(768),o=r(1376);e.largeop=(0,n.AddPaths)(o.largeop,{40:"180 96T180 250T205 541T266 770T353 944T444 1069T527 1150H555Q561 1144 561 1141Q561 1137 545 1120T504 1072T447 995T386 878T330 721T288 513T272 251Q272 133 280 56Q293 -87 326 -209T399 -405T475 -531T536 -609T561 -640Q561 -643 555 -649H527Q483 -612 443 -568T353 -443T266 -270T205 -41",41:"35 1138Q35 1150 51 1150H56H69Q113 1113 153 1069T243 944T330 771T391 541T416 250T391 -40T330 -270T243 -443T152 -568T69 -649H56Q43 -649 39 -647T35 -637Q65 -607 110 -548Q283 -316 316 56Q324 133 324 251Q324 368 316 445Q278 877 48 1123Q36 1137 35 1138",47:"78 -649Q56 -646 56 -625Q56 -614 382 261T712 1140Q716 1150 732 1150Q754 1147 754 1126Q754 1116 428 240T98 -639Q94 -649 78 -649",91:"224 -649V1150H455V1099H275V-598H455V-649H224",92:"754 -625Q754 -649 731 -649Q715 -649 712 -639Q709 -635 383 242T55 1124Q54 1135 61 1142T80 1150Q92 1150 98 1140Q101 1137 427 262T754 -625",93:"16 1099V1150H247V-649H16V-598H196V1099H16",123:"547 -643L541 -649H528Q515 -649 503 -645Q324 -582 293 -466Q289 -449 289 -428T287 -200L286 42L284 53Q274 98 248 135T196 190T146 222L121 235Q119 239 119 250Q119 262 121 266T133 273Q262 336 284 449L286 460L287 701Q287 737 287 794Q288 949 292 963Q293 966 293 967Q325 1080 508 1148Q516 1150 527 1150H541L547 1144V1130Q547 1117 546 1115T536 1109Q480 1086 437 1046T381 950L379 940L378 699Q378 657 378 594Q377 452 374 438Q373 437 373 436Q350 348 243 282Q192 257 186 254L176 251L188 245Q211 236 234 223T287 189T340 135T373 65Q373 64 374 63Q377 49 378 -93Q378 -156 378 -198L379 -438L381 -449Q393 -504 436 -544T536 -608Q544 -611 545 -613T547 -629V-643",125:"119 1130Q119 1144 121 1147T135 1150H139Q151 1150 182 1138T252 1105T326 1046T373 964Q378 942 378 702Q378 469 379 462Q386 394 439 339Q482 296 535 272Q544 268 545 266T547 251Q547 241 547 238T542 231T531 227T510 217T477 194Q390 129 379 39Q378 32 378 -201Q378 -441 373 -463Q342 -580 165 -644Q152 -649 139 -649Q125 -649 122 -646T119 -629Q119 -622 119 -619T121 -614T124 -610T132 -607T143 -602Q195 -579 235 -539T285 -447Q286 -435 287 -199T289 51Q294 74 300 91T329 138T390 197Q412 213 436 226T475 244L489 250L472 258Q455 265 430 279T377 313T327 366T293 434Q289 451 289 472T287 699Q286 941 285 948Q279 978 262 1005T227 1048T184 1080T151 1100T129 1109L127 1110Q119 1113 119 1130",710:"1004 603Q1004 600 999 583T991 565L960 574Q929 582 866 599T745 631L500 698Q497 698 254 631Q197 616 134 599T39 574L8 565Q5 565 0 582T-5 603L26 614Q58 624 124 646T248 687L499 772Q999 604 1004 603",732:"296 691Q258 691 216 683T140 663T79 639T34 619T16 611Q13 619 8 628L0 644L36 662Q206 749 321 749Q410 749 517 710T703 670Q741 670 783 678T859 698T920 722T965 742T983 750Q986 742 991 733L999 717L963 699Q787 611 664 611Q594 611 484 651T296 691",770:"4 603Q4 600 -1 583T-9 565L-40 574Q-71 582 -134 599T-255 631L-500 698Q-503 698 -746 631Q-803 616 -866 599T-961 574L-992 565Q-995 565 -1000 582T-1005 603L-974 614Q-942 624 -876 646T-752 687L-501 772Q-1 604 4 603",771:"-704 691Q-742 691 -784 683T-860 663T-921 639T-966 619T-984 611Q-987 619 -992 628L-1000 644L-964 662Q-794 749 -679 749Q-590 749 -483 710T-297 670Q-259 670 -217 678T-141 698T-80 722T-35 742T-17 750Q-14 742 -9 733L-1 717L-37 699Q-213 611 -336 611Q-405 611 -515 651T-704 691",8214:"257 0V602H300V0H257ZM478 0V602H521V0H478",8260:"78 -649Q56 -646 56 -625Q56 -614 382 261T712 1140Q716 1150 732 1150Q754 1147 754 1126Q754 1116 428 240T98 -639Q94 -649 78 -649",8593:"112 421L120 424Q127 427 136 430T161 441T191 458T224 481T260 510T295 546T328 591L333 600L340 589Q380 527 431 489T555 421V377L543 381Q445 418 368 492L355 504V0H312V504L299 492Q222 418 124 381L112 377V421",8595:"312 96V600H355V96L368 108Q445 182 543 219L555 223V179L546 176Q538 173 529 169T505 158T475 141T442 119T407 90T372 53T339 9L334 0L327 11Q287 73 236 111T112 179V223L124 219Q222 182 299 108L312 96",8657:"142 329Q300 419 389 599Q389 598 399 579T420 541T452 494T497 438T558 383T636 329T708 294L721 289V246Q718 246 694 256T623 293T532 356L522 364L521 182V0H478V405L466 417Q436 450 389 516Q388 515 378 500T352 463T312 417L300 405V0H257V364L247 356Q202 320 155 293T82 256L57 246V289L70 294Q101 305 142 329",8659:"257 236V600H300V195L312 183Q342 150 389 84Q390 85 400 100T426 137T466 183L478 195V600H521V418L522 236L532 244Q576 280 623 307T696 344L721 354V311L708 306Q677 295 636 271Q478 181 389 1Q389 2 379 21T358 59T326 106T281 162T220 217T142 271T70 306L57 311V354Q60 354 83 345T154 308T247 244L257 236",8719:"220 812Q220 813 218 819T214 829T208 840T199 853T185 866T166 878T140 887T107 893T66 896H56V950H1221V896H1211Q1080 896 1058 812V-311Q1076 -396 1211 -396H1221V-450H725V-396H735Q864 -396 888 -314Q889 -312 889 -311V896H388V292L389 -311Q405 -396 542 -396H552V-450H56V-396H66Q195 -396 219 -314Q220 -312 220 -311V812",8720:"220 812Q220 813 218 819T214 829T208 840T199 853T185 866T166 878T140 887T107 893T66 896H56V950H552V896H542Q411 896 389 812L388 208V-396H889V812Q889 813 887 819T883 829T877 840T868 853T854 866T835 878T809 887T776 893T735 896H725V950H1221V896H1211Q1080 896 1058 812V-311Q1076 -396 1211 -396H1221V-450H56V-396H66Q195 -396 219 -314Q220 -312 220 -311V812",8721:"60 948Q63 950 665 950H1267L1325 815Q1384 677 1388 669H1348L1341 683Q1320 724 1285 761Q1235 809 1174 838T1033 881T882 898T699 902H574H543H251L259 891Q722 258 724 252Q725 250 724 246Q721 243 460 -56L196 -356Q196 -357 407 -357Q459 -357 548 -357T676 -358Q812 -358 896 -353T1063 -332T1204 -283T1307 -196Q1328 -170 1348 -124H1388Q1388 -125 1381 -145T1356 -210T1325 -294L1267 -449L666 -450Q64 -450 61 -448Q55 -446 55 -439Q55 -437 57 -433L590 177Q590 178 557 222T452 366T322 544L56 909L55 924Q55 945 60 948",8730:"1001 1150Q1017 1150 1020 1132Q1020 1127 741 244L460 -643Q453 -650 436 -650H424Q423 -647 423 -645T421 -640T419 -631T415 -617T408 -594T399 -560T385 -512T367 -448T343 -364T312 -259L203 119L138 41L111 67L212 188L264 248L472 -474L983 1140Q988 1150 1001 1150",8739:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612",8741:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612ZM368 612Q373 627 388 627Q404 627 409 612Q410 610 410 306T409 0Q406 -15 389 -15Q371 -15 368 0V10Q368 19 368 35T368 73T368 122T367 179T367 241T367 306T367 370T367 433T367 489T368 538T368 576T368 602V612",8747:"114 -798Q132 -824 165 -824H167Q195 -824 223 -764T275 -600T320 -391T362 -164Q365 -143 367 -133Q439 292 523 655T645 1127Q651 1145 655 1157T672 1201T699 1257T733 1306T777 1346T828 1360Q884 1360 912 1325T944 1245Q944 1220 932 1205T909 1186T887 1183Q866 1183 849 1198T832 1239Q832 1287 885 1296L882 1300Q879 1303 874 1307T866 1313Q851 1323 833 1323Q819 1323 807 1311T775 1255T736 1139T689 936T633 628Q574 293 510 -5T410 -437T355 -629Q278 -862 165 -862Q125 -862 92 -831T55 -746Q55 -711 74 -698T112 -685Q133 -685 150 -700T167 -741Q167 -789 114 -798",8748:"114 -798Q132 -824 165 -824H167Q195 -824 223 -764T275 -600T320 -391T362 -164Q365 -143 367 -133Q439 292 523 655T645 1127Q651 1145 655 1157T672 1201T699 1257T733 1306T777 1346T828 1360Q884 1360 912 1325T944 1245Q944 1220 932 1205T909 1186T887 1183Q866 1183 849 1198T832 1239Q832 1287 885 1296L882 1300Q879 1303 874 1307T866 1313Q851 1323 833 1323Q819 1323 807 1311T775 1255T736 1139T689 936T633 628Q574 293 510 -5T410 -437T355 -629Q278 -862 165 -862Q125 -862 92 -831T55 -746Q55 -711 74 -698T112 -685Q133 -685 150 -700T167 -741Q167 -789 114 -798ZM642 -798Q660 -824 693 -824H695Q723 -824 751 -764T803 -600T848 -391T890 -164Q893 -143 895 -133Q967 292 1051 655T1173 1127Q1179 1145 1183 1157T1200 1201T1227 1257T1261 1306T1305 1346T1356 1360Q1412 1360 1440 1325T1472 1245Q1472 1220 1460 1205T1437 1186T1415 1183Q1394 1183 1377 1198T1360 1239Q1360 1287 1413 1296L1410 1300Q1407 1303 1402 1307T1394 1313Q1379 1323 1361 1323Q1347 1323 1335 1311T1303 1255T1264 1139T1217 936T1161 628Q1102 293 1038 -5T938 -437T883 -629Q806 -862 693 -862Q653 -862 620 -831T583 -746Q583 -711 602 -698T640 -685Q661 -685 678 -700T695 -741Q695 -789 642 -798",8749:"114 -798Q132 -824 165 -824H167Q195 -824 223 -764T275 -600T320 -391T362 -164Q365 -143 367 -133Q439 292 523 655T645 1127Q651 1145 655 1157T672 1201T699 1257T733 1306T777 1346T828 1360Q884 1360 912 1325T944 1245Q944 1220 932 1205T909 1186T887 1183Q866 1183 849 1198T832 1239Q832 1287 885 1296L882 1300Q879 1303 874 1307T866 1313Q851 1323 833 1323Q819 1323 807 1311T775 1255T736 1139T689 936T633 628Q574 293 510 -5T410 -437T355 -629Q278 -862 165 -862Q125 -862 92 -831T55 -746Q55 -711 74 -698T112 -685Q133 -685 150 -700T167 -741Q167 -789 114 -798ZM642 -798Q660 -824 693 -824H695Q723 -824 751 -764T803 -600T848 -391T890 -164Q893 -143 895 -133Q967 292 1051 655T1173 1127Q1179 1145 1183 1157T1200 1201T1227 1257T1261 1306T1305 1346T1356 1360Q1412 1360 1440 1325T1472 1245Q1472 1220 1460 1205T1437 1186T1415 1183Q1394 1183 1377 1198T1360 1239Q1360 1287 1413 1296L1410 1300Q1407 1303 1402 1307T1394 1313Q1379 1323 1361 1323Q1347 1323 1335 1311T1303 1255T1264 1139T1217 936T1161 628Q1102 293 1038 -5T938 -437T883 -629Q806 -862 693 -862Q653 -862 620 -831T583 -746Q583 -711 602 -698T640 -685Q661 -685 678 -700T695 -741Q695 -789 642 -798ZM1150 -798Q1168 -824 1201 -824H1203Q1231 -824 1259 -764T1311 -600T1356 -391T1398 -164Q1401 -143 1403 -133Q1475 292 1559 655T1681 1127Q1687 1145 1691 1157T1708 1201T1735 1257T1769 1306T1813 1346T1864 1360Q1920 1360 1948 1325T1980 1245Q1980 1220 1968 1205T1945 1186T1923 1183Q1902 1183 1885 1198T1868 1239Q1868 1287 1921 1296L1918 1300Q1915 1303 1910 1307T1902 1313Q1887 1323 1869 1323Q1855 1323 1843 1311T1811 1255T1772 1139T1725 936T1669 628Q1610 293 1546 -5T1446 -437T1391 -629Q1314 -862 1201 -862Q1161 -862 1128 -831T1091 -746Q1091 -711 1110 -698T1148 -685Q1169 -685 1186 -700T1203 -741Q1203 -789 1150 -798",8750:"114 -798Q132 -824 165 -824H167Q195 -824 223 -764T275 -600T320 -391T362 -164Q365 -143 367 -133Q382 -52 390 2Q314 40 276 99Q230 167 230 249Q230 363 305 436T484 519H494L503 563Q587 939 632 1087T727 1298Q774 1360 828 1360Q884 1360 912 1325T944 1245Q944 1220 932 1205T909 1186T887 1183Q866 1183 849 1198T832 1239Q832 1287 885 1296L882 1300Q879 1303 874 1307T866 1313Q851 1323 833 1323Q766 1323 688 929Q662 811 610 496Q770 416 770 249Q770 147 701 68T516 -21H506L497 -65Q407 -464 357 -623T237 -837Q203 -862 165 -862Q125 -862 92 -831T55 -746Q55 -711 74 -698T112 -685Q133 -685 150 -700T167 -741Q167 -789 114 -798ZM480 478Q460 478 435 470T380 444T327 401T287 335T271 249Q271 124 375 56L397 43L431 223L485 478H480ZM519 20Q545 20 578 33T647 72T706 144T730 249Q730 383 603 455Q603 454 597 421T582 343T569 276Q516 22 515 20H519",8896:"1055 -401Q1055 -419 1042 -434T1007 -450Q977 -450 963 -423Q959 -417 757 167L555 750L353 167Q151 -417 147 -423Q134 -450 104 -450Q84 -450 70 -436T55 -401Q55 -394 56 -390Q59 -381 284 270T512 925Q525 950 555 950Q583 950 597 926Q599 923 825 270T1054 -391Q1055 -394 1055 -401",8897:"55 900Q55 919 69 934T103 950Q134 950 147 924Q152 913 353 333L555 -250L757 333Q958 913 963 924Q978 950 1007 950Q1028 950 1041 935T1055 901Q1055 894 1054 891Q1052 884 826 231T597 -426Q583 -450 556 -450Q527 -450 512 -424Q510 -421 285 229T56 890Q55 893 55 900",8898:"57 516Q68 602 104 675T190 797T301 882T423 933T542 949Q594 949 606 948Q780 928 901 815T1048 545Q1053 516 1053 475T1055 49Q1055 -406 1054 -410Q1051 -427 1037 -438T1006 -450T976 -439T958 -411Q957 -407 957 37Q957 484 956 494Q945 643 831 747T554 852Q481 852 411 826Q301 786 232 696T154 494Q153 484 153 37Q153 -407 152 -411Q148 -428 135 -439T104 -450T73 -439T56 -410Q55 -406 55 49Q56 505 57 516",8899:"56 911Q58 926 71 938T103 950Q120 950 134 939T152 911Q153 907 153 463Q153 16 154 6Q165 -143 279 -247T556 -352Q716 -352 830 -248T956 6Q957 16 957 463Q957 907 958 911Q962 928 975 939T1006 950T1037 939T1054 911Q1055 906 1055 451Q1054 -5 1053 -16Q1029 -207 889 -328T555 -449Q363 -449 226 -331T62 -45Q57 -16 57 25T55 451Q55 906 56 911",8968:"224 -649V1150H511V1099H275V-649H224",8969:"16 1099V1150H303V-649H252V1099H16",8970:"224 -649V1150H275V-598H511V-649H224",8971:"252 -598V1150H303V-649H16V-598H252",9001:"112 244V258L473 1130Q482 1150 498 1150Q511 1150 517 1142T523 1125V1118L344 685Q304 587 257 473T187 305L165 251L344 -184L523 -616V-623Q524 -634 517 -641T499 -649Q484 -649 473 -629L112 244",9002:"112 -649Q103 -649 95 -642T87 -623V-616L266 -184L445 251Q445 252 356 466T178 898T86 1123Q85 1134 93 1142T110 1150Q126 1150 133 1137Q134 1136 317 695L498 258V244L317 -194Q134 -635 133 -636Q126 -649 112 -649",9168:"312 0V602H355V0H312",10072:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612",10216:"112 244V258L473 1130Q482 1150 498 1150Q511 1150 517 1142T523 1125V1118L344 685Q304 587 257 473T187 305L165 251L344 -184L523 -616V-623Q524 -634 517 -641T499 -649Q484 -649 473 -629L112 244",10217:"112 -649Q103 -649 95 -642T87 -623V-616L266 -184L445 251Q445 252 356 466T178 898T86 1123Q85 1134 93 1142T110 1150Q126 1150 133 1137Q134 1136 317 695L498 258V244L317 -194Q134 -635 133 -636Q126 -649 112 -649",10752:"668 944Q697 949 744 949Q803 949 814 948Q916 937 1006 902T1154 826T1262 730T1336 638T1380 563Q1454 415 1454 250Q1454 113 1402 -14T1258 -238T1036 -391T755 -449Q608 -449 477 -392T255 -240T110 -16T56 250Q56 387 105 510T239 723T434 871T668 944ZM755 -352Q922 -352 1061 -269T1278 -48T1356 250Q1356 479 1202 652T809 850Q798 851 747 851Q634 851 527 806T337 682T204 491T154 251Q154 128 201 17T329 -176T521 -304T755 -352ZM665 250Q665 290 692 315T758 341Q792 339 818 315T845 250Q845 211 819 186T755 160Q716 160 691 186T665 250",10753:"668 944Q697 949 744 949Q803 949 814 948Q916 937 1006 902T1154 826T1262 730T1336 638T1380 563Q1454 415 1454 250Q1454 113 1402 -14T1258 -238T1036 -391T755 -449Q608 -449 477 -392T255 -240T110 -16T56 250Q56 387 105 510T239 723T434 871T668 944ZM706 299V850H704Q519 832 386 725T198 476Q181 433 169 379T156 300Q156 299 431 299H706ZM1116 732Q1054 778 982 807T871 842T810 849L804 850V299H1079Q1354 299 1354 300Q1354 311 1352 329T1336 402T1299 506T1228 620T1116 732ZM706 -350V201H431Q156 201 156 200Q156 189 158 171T174 98T211 -6T282 -120T395 -232Q428 -257 464 -277T527 -308T587 -328T636 -339T678 -346T706 -350ZM1354 200Q1354 201 1079 201H804V-350Q808 -349 838 -345T887 -338T940 -323T1010 -295Q1038 -282 1067 -265T1144 -208T1229 -121T1301 0T1349 158Q1354 188 1354 200",10754:"668 944Q697 949 744 949Q803 949 814 948Q916 937 1006 902T1154 826T1262 730T1336 638T1380 563Q1454 415 1454 250Q1454 113 1402 -14T1258 -238T1036 -391T755 -449Q608 -449 477 -392T255 -240T110 -16T56 250Q56 387 105 510T239 723T434 871T668 944ZM1143 709Q1138 714 1129 722T1086 752T1017 791T925 826T809 850Q798 851 747 851H728Q659 851 571 823T408 741Q367 713 367 709L755 320L1143 709ZM297 639Q296 639 282 622T247 570T205 491T169 382T154 250T168 118T204 9T247 -70T282 -122L297 -139L685 250L297 639ZM1213 -139Q1214 -139 1228 -122T1263 -70T1305 9T1341 118T1356 250T1342 382T1306 491T1263 570T1228 622L1213 639L825 250L1213 -139ZM367 -209Q373 -215 384 -224T434 -258T514 -302T622 -336T755 -352T887 -338T996 -302T1075 -259T1126 -224L1143 -209L755 180Q754 180 561 -14T367 -209",10756:"56 911Q58 926 71 938T103 950Q120 950 134 939T152 911Q153 907 153 463Q153 16 154 6Q165 -143 279 -247T556 -352Q716 -352 830 -248T956 6Q957 16 957 463Q957 907 958 911Q962 928 975 939T1006 950T1037 939T1054 911Q1055 906 1055 451Q1054 -5 1053 -16Q1029 -207 889 -328T555 -449Q363 -449 226 -331T62 -45Q57 -16 57 25T55 451Q55 906 56 911ZM507 554Q511 570 523 581T554 593Q571 593 585 582T603 554Q604 551 604 443V338H709Q817 338 820 337Q835 334 847 321T859 290Q859 254 819 241Q816 240 709 240H604V134Q604 48 604 34T598 11Q583 -15 555 -15Q526 -15 512 11Q507 20 507 34T506 134V240H401H344Q292 240 278 246Q251 259 251 290Q251 309 264 321T290 337Q293 338 401 338H506V443Q506 551 507 554",10758:"56 911Q60 927 72 938T103 950Q120 950 134 939T152 911Q153 907 153 277V-352H957V277Q957 907 958 911Q962 928 975 939T1006 950T1036 939T1054 911V891Q1054 871 1054 836T1054 754T1054 647T1055 525T1055 390T1055 250T1055 111T1055 -24T1055 -147T1054 -253T1054 -335T1054 -391V-411Q1047 -442 1016 -449Q1011 -450 552 -450L94 -449Q63 -439 56 -411V-391Q56 -371 56 -336T56 -254T56 -147T55 -25T55 110T55 250T55 389T55 524T55 647T56 753T56 835T56 891V911",12296:"112 244V258L473 1130Q482 1150 498 1150Q511 1150 517 1142T523 1125V1118L344 685Q304 587 257 473T187 305L165 251L344 -184L523 -616V-623Q524 -634 517 -641T499 -649Q484 -649 473 -629L112 244",12297:"112 -649Q103 -649 95 -642T87 -623V-616L266 -184L445 251Q445 252 356 466T178 898T86 1123Q85 1134 93 1142T110 1150Q126 1150 133 1137Q134 1136 317 695L498 258V244L317 -194Q134 -635 133 -636Q126 -649 112 -649"},{10764:"\u222c\u222c"})},4749:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.monospace=void 0;var n=r(768),o=r(1439);e.monospace=(0,n.AddPaths)(o.monospace,{32:"",33:"206 565Q206 590 222 606T265 622Q287 621 303 606T319 565T314 392L308 216Q299 194 273 194H262Q247 194 241 195T228 200T217 216L211 392Q206 539 206 565ZM206 56Q206 83 223 99T265 115Q288 113 304 99T320 58Q320 33 303 17T262 0Q237 0 222 17T206 56",34:"122 575Q122 593 137 608T173 623Q196 623 210 608T225 575Q225 562 218 464Q212 373 211 361T201 341Q193 333 173 333Q154 333 146 341Q138 348 137 360T129 464Q122 561 122 575ZM299 575Q299 593 314 608T350 623Q373 623 387 608T402 575Q402 562 395 464Q389 373 388 361T378 341Q370 333 350 333Q331 333 323 341Q315 348 314 360T306 464Q299 561 299 575",35:"93 163Q74 163 65 164T46 173T36 198Q36 210 40 215T61 233H131V236Q132 239 140 307T149 377Q149 379 105 379L61 380Q36 392 36 414Q36 450 86 450Q91 450 99 450T112 449H159Q163 480 167 517Q168 524 170 545T174 573T180 591T191 607T210 611Q223 611 232 604T243 588L245 580Q245 565 238 511T230 451Q230 449 282 449H333Q337 480 341 517Q342 524 343 537T345 556T348 573T352 589T359 600T370 608T384 611Q395 611 406 602T419 580Q419 565 412 511T404 451Q404 449 431 449H442Q477 449 485 429Q489 421 489 414Q489 392 463 380L428 379H394V376Q393 373 385 305T376 235Q376 233 419 233H463L468 230Q472 227 473 227T477 223T482 218T486 213T488 206T489 198Q489 162 436 162Q430 162 422 162T412 163H366V161Q364 159 357 92Q356 85 355 73T353 54T350 37T346 22T339 11T328 3T314 0Q303 0 292 9T279 31Q279 37 287 96T295 162Q295 163 244 163H192V161Q190 159 183 92Q182 85 181 73T179 54T176 37T172 22T165 11T154 3T140 0Q129 0 118 9T105 31Q105 37 113 96T121 162Q121 163 93 163ZM323 377Q323 379 272 379H220V376Q219 373 211 305T202 235Q202 233 253 233H305V236Q306 239 314 307T323 377",36:"415 397Q392 397 377 411T362 448Q362 464 376 485Q369 498 362 506T346 520T332 528T315 533T300 538V445L301 353L311 350Q382 334 424 284T466 174Q466 115 425 65T303 -2L300 -3V-30Q300 -64 291 -74Q283 -82 262 -82H255Q234 -82 225 -60L224 -32V-4L213 -2Q152 6 106 51T59 170V180Q59 197 74 213Q89 227 110 227T146 213T162 174Q162 156 147 137Q153 123 161 112T176 95T191 85T205 79T216 76T224 74V283L213 285Q147 298 103 343T58 449Q58 516 108 560T224 614V643V654Q224 666 226 673T237 687T264 694Q289 693 294 683T300 642V615H303Q355 607 390 587T440 540T460 493T466 453Q466 425 451 411T415 397ZM137 452Q137 425 158 404T198 376T223 369Q224 369 224 453T223 537Q198 532 168 509T137 452ZM301 75Q307 75 325 83T365 116T387 171Q387 238 300 267V171Q300 75 301 75",37:"35 560Q35 607 54 645T110 693Q111 693 116 693T125 694Q165 692 187 651T210 560Q210 506 186 467T123 428Q84 428 60 466T35 560ZM139 560Q139 574 136 587T130 608T124 615Q122 617 120 614Q106 595 106 561Q106 516 121 506Q123 504 125 507Q139 526 139 560ZM123 -83Q107 -83 98 -73T88 -48Q88 -43 89 -41Q90 -37 229 316T370 675Q381 694 400 694Q416 694 426 684T436 659Q436 654 435 652Q434 647 295 294T153 -65Q144 -83 123 -83ZM314 50Q314 104 338 143T400 183Q439 183 464 144T489 50T465 -43T402 -82Q358 -82 336 -41T314 50ZM417 50Q417 71 413 85T405 102L401 106Q386 95 386 50Q386 29 390 15T398 -2L402 -6Q417 5 417 50",38:"96 462Q96 546 132 584T211 622Q255 622 284 583T314 474Q314 395 224 305L208 288Q213 275 226 251L265 185L269 179Q273 184 299 246L332 333L342 363Q342 364 341 365Q334 365 334 393Q334 406 334 410T340 420T356 431H412H440Q467 431 478 424T490 393Q490 376 484 367T470 357T448 355H441H415L399 312Q349 176 322 127L315 115L323 106Q360 65 393 65Q405 65 410 80T416 109Q416 140 452 140Q487 140 487 105Q487 56 460 23T391 -11L286 41L273 53L262 42Q212 -11 151 -11Q97 -11 63 33T28 143Q28 161 30 176T38 205T47 227T60 247T72 261T84 274T94 283L122 311L119 323Q96 392 96 462ZM243 474Q243 533 218 545L215 546Q212 546 210 546Q182 546 169 501Q167 492 167 466Q167 419 179 368L188 377Q234 425 242 461Q243 465 243 474ZM217 129Q185 174 154 235Q121 214 115 176Q113 168 113 143Q113 83 139 67Q141 66 152 66Q191 66 228 112L217 129",39:"205 554Q205 577 221 594T263 611Q302 611 325 577T349 490Q349 409 298 347Q285 330 258 309T214 287Q203 289 189 302T175 327Q175 341 185 349T213 369T245 402Q269 437 273 483V497Q264 496 263 496Q240 496 223 513T205 554",40:"437 -53Q437 -82 399 -82H394Q377 -82 342 -55Q259 7 213 102T166 306Q166 412 211 507T342 667Q377 694 393 694H399Q437 694 437 665Q437 654 426 643T397 620T356 584T311 525Q301 511 290 488T264 412T250 306Q250 191 300 105T422 -27Q437 -37 437 -53",41:"87 664Q87 694 126 694Q138 694 147 690T183 667Q266 605 312 510T358 306Q358 193 307 93T161 -70Q142 -82 126 -82Q105 -82 96 -73T87 -53Q87 -47 88 -44Q92 -36 116 -19T173 34T230 119Q273 206 273 306Q273 408 231 494T109 635Q87 649 87 664",42:"222 487Q224 501 235 510T262 520Q279 520 289 510T302 487Q302 458 301 429Q301 421 301 413T301 398T300 386T300 377V374Q300 373 301 373Q304 373 353 403T416 434Q432 434 444 423T456 393Q456 389 456 386T454 379T451 373T448 368T442 363T436 358T427 353T417 348T405 342T391 334Q345 309 339 305L388 279Q400 273 412 266T432 255T441 250Q456 238 456 218Q456 200 445 189T417 177Q403 177 354 207T301 238Q300 238 300 237V234Q300 231 300 226T300 214T301 199T301 182Q302 153 302 124Q300 109 289 100T262 90T235 100T222 124Q222 153 223 182Q223 190 223 198T223 213T224 225T224 234V237Q224 238 223 238Q220 238 171 208T108 177Q92 177 80 188T68 218Q68 237 79 246T134 277Q180 303 185 306L136 332Q124 338 112 345T92 356T83 361Q68 373 68 393Q68 411 79 422T107 434Q121 434 170 404T223 373Q224 373 224 374V377Q224 380 224 385T224 397T223 412T223 429Q222 458 222 487",43:"147 271Q138 271 122 271T98 270Q68 270 53 277T38 306T53 335T98 342Q105 342 121 342T147 341H227V423L228 505Q241 531 262 531Q268 531 273 530T282 525T287 519T293 511L297 505V341H377H430Q457 341 467 338T483 321Q487 313 487 306Q487 295 480 286T463 273Q457 271 377 271H297V107Q281 81 262 81Q250 81 242 87T230 100L228 107L227 189V271H147",44:"193 37T193 70T213 121T260 140Q302 140 327 108T353 36Q353 -7 336 -43T294 -98T249 -128T215 -139Q204 -139 189 -125Q177 -111 174 -101Q172 -84 183 -77T217 -61T253 -33Q261 -24 272 1L265 0Q234 0 214 18",45:"57 306Q57 333 86 341H438Q468 332 468 306T438 271H86Q57 280 57 306",46:"193 70Q193 105 214 122T258 140Q291 140 311 120T332 70Q332 44 314 23T262 1Q234 1 214 18T193 70",47:"94 -83Q78 -83 68 -73T58 -48Q58 -44 60 -36Q62 -31 227 314T399 673Q410 694 431 694Q445 694 455 684T466 659Q466 656 464 648Q463 643 298 298T125 -62Q114 -83 94 -83",58:"193 361Q193 396 214 413T258 431Q291 431 311 411T332 361Q332 335 314 314T262 292Q234 292 214 309T193 361ZM193 70Q193 105 214 122T258 140Q291 140 311 120T332 70Q332 44 314 23T262 1Q234 1 214 18T193 70",59:"193 361Q193 396 214 413T258 431Q291 431 311 411T332 361Q332 335 314 314T262 292Q234 292 214 309T193 361ZM193 70Q193 105 214 122T259 140Q301 140 319 108T337 33Q337 -38 291 -88T214 -139Q203 -139 189 -126T175 -97Q175 -85 182 -78T200 -66T225 -50T249 -17Q256 -3 256 0Q252 1 248 1Q242 2 235 5T218 15T200 36T193 70",60:"468 90Q468 76 458 66T433 55Q426 55 419 58Q413 61 243 168T68 280Q57 291 57 306T68 332Q72 335 241 442T416 553Q424 557 432 557Q447 557 457 547T468 522T456 496Q454 494 305 399L158 306L305 213Q341 190 390 159Q443 125 452 119T464 106V105Q468 97 468 90",61:"38 382Q38 409 67 417H457Q487 408 487 382Q487 358 461 348H64Q51 352 45 360T38 376V382ZM67 195Q38 204 38 230Q38 255 62 264Q66 265 264 265H461L464 264Q467 262 469 261T475 256T481 249T485 240T487 230Q487 204 457 195H67",62:"57 522Q57 539 67 548T90 557Q98 557 105 554Q111 551 281 444T456 332Q468 320 468 306T456 280Q452 276 282 169T105 58Q98 55 91 55Q79 55 68 63T57 90Q57 105 68 116Q70 118 219 213L366 306L219 399Q75 491 71 494Q57 507 57 522",63:"62 493Q62 540 107 578T253 617Q366 617 414 578T462 490Q462 459 445 434T411 400L394 390Q315 347 296 287Q294 278 293 247V217Q285 201 278 198T246 194T216 197T201 215V245V253Q201 379 351 456Q366 464 375 477Q377 482 377 490Q377 517 339 528T251 540Q182 540 159 517Q166 503 166 490Q166 468 151 453T114 438Q96 438 79 451T62 493ZM190 58Q190 85 208 100T249 115Q272 113 288 99T304 58Q304 33 287 17T246 0T206 16T190 58",64:"44 306Q44 445 125 531T302 617Q332 617 358 607T411 574T456 502T479 387Q481 361 481 321Q481 203 421 143Q381 103 332 103Q266 103 225 165T183 307Q183 390 227 449T332 508Q358 508 378 498Q350 541 304 541Q229 541 172 473T115 305Q115 208 171 140T306 71H310Q358 71 397 105Q409 115 436 115Q458 115 462 113Q481 106 481 86Q481 73 468 61Q401 -6 305 -6Q262 -6 217 14T133 71T69 170T44 306ZM410 306Q410 361 386 396T333 431Q300 431 277 394T254 305Q254 256 276 218T332 180Q364 180 387 217T410 306",91:"237 -82Q221 -78 214 -58V305Q214 669 216 673Q220 687 231 690T278 694H350H461Q462 693 467 690T474 685T478 679T482 670T483 656Q483 632 471 625T428 617Q422 617 406 617T379 618H298V-7H379H420Q459 -7 471 -13T483 -45Q483 -55 483 -59T477 -70T461 -82H237",92:"58 659Q58 673 68 683T93 694Q114 694 125 673Q132 659 297 314T464 -36Q466 -44 466 -48Q466 -66 454 -74T431 -83Q410 -83 399 -62Q391 -47 226 298T60 648Q58 656 58 659",93:"41 656Q41 681 53 688T99 695Q107 695 133 695T177 694H288Q307 681 310 669V-58Q303 -76 288 -82H64Q41 -73 41 -45Q41 -21 53 -14T96 -6Q102 -6 118 -6T145 -7H226V618H145H100Q67 618 54 625T41 656",94:"138 460Q121 460 109 479T96 512Q96 527 106 534Q109 536 178 571T253 609Q256 611 264 611Q272 610 343 574Q357 567 369 561T389 550T402 543T411 538T416 535T420 532T422 529T425 525Q428 518 428 512Q428 498 416 479T386 460H384Q377 460 316 496L262 526L208 496Q147 460 138 460",95:"57 -60Q57 -33 86 -25H438Q468 -34 468 -60T438 -95H86Q57 -86 57 -60",96:"176 479Q176 563 227 622T310 681Q324 680 337 667T350 641Q350 627 340 619T312 599T280 566Q256 531 252 485V471Q261 472 262 472Q285 472 302 455T320 414Q320 389 303 373T261 357Q223 357 200 391T176 479",123:"430 -7H436Q449 -7 456 -8T469 -19T475 -45Q475 -69 466 -76T434 -83H419Q386 -82 363 -80T308 -69T253 -41T223 7L221 17L220 118V220L218 224Q215 229 214 230T210 235T204 241T195 246T184 252T170 257T151 262T127 265Q118 267 100 267T69 270T52 283Q50 288 50 306V314Q50 335 67 341Q68 342 102 343T172 355T217 386L220 392V493L221 595Q225 611 230 621T251 650T304 679T395 693L406 694Q418 694 426 694Q458 694 466 685Q475 676 475 656T466 627Q458 618 430 618Q319 618 305 587L304 486Q304 476 304 458T305 431Q305 385 295 358T251 311L243 306Q243 305 254 298T281 274T302 231Q304 223 304 125L305 25Q309 16 316 10T352 -1T430 -7",124:"228 668Q241 694 262 694Q268 694 273 693T282 688T287 682T293 674L297 668V-57Q282 -82 262 -82Q239 -82 228 -57V668",125:"49 655Q49 674 56 682T73 692T106 694Q141 693 167 690T224 677T275 647T303 595L305 392Q313 367 347 356T417 344T457 341Q475 335 475 306Q475 292 473 285T464 273T451 269T430 267Q352 262 327 246Q311 236 305 220L303 17L301 7Q294 -16 277 -33T242 -60T196 -74T150 -80T106 -83Q78 -83 72 -82T58 -74Q49 -65 49 -44Q49 -24 58 -16Q66 -7 94 -7Q143 -7 171 -1T207 10T220 25V125Q220 223 222 231Q228 257 243 274T270 299L281 306Q234 329 222 381Q220 387 220 486V587Q212 597 207 601T173 612T94 618Q66 618 58 627Q49 635 49 655",126:"125 467Q113 467 100 480T87 509Q88 520 111 543Q172 602 209 609Q219 611 224 611Q246 611 263 596T290 566T304 551Q319 551 367 594Q383 610 396 610H400Q411 610 424 597T437 568Q436 557 413 534Q348 469 305 466Q278 466 260 481T234 511T220 526Q205 526 157 483Q141 467 129 467H125",127:"104 565Q104 590 120 600T155 611Q175 611 180 610Q217 599 217 565Q217 545 202 532T166 519H159H155Q120 519 107 547Q104 553 104 565ZM307 565Q307 580 317 593T346 610Q348 610 350 610T354 611Q355 612 367 612Q395 611 408 597T421 565T409 534T365 519H358Q336 519 322 532T307 565",160:"",305:"411 76Q441 76 451 69T462 38Q462 29 462 26T460 18T453 9T440 1H94Q72 8 72 33V38Q72 46 72 49T74 58T81 68T94 76H233V355H167L102 356Q80 363 80 393Q80 418 91 425T138 432Q145 432 165 432T200 431H295Q297 429 303 425T310 420T314 415T317 404T317 389T318 363Q318 354 318 314T317 241V76H378H411",567:"75 -91T100 -91T138 -107T152 -144V-150L160 -151H193H203Q241 -151 267 -121Q284 -97 288 -73T292 23V151V355H218L145 356Q123 365 123 387V393Q123 422 145 430H148Q151 430 156 430T169 430T185 430T205 431T227 431T251 431H354Q356 430 360 427T365 424T369 420T372 416T373 410T375 402T376 391T377 376T377 356Q377 345 377 286T376 176Q376 -67 371 -88Q362 -123 342 -151T299 -194Q254 -228 180 -228Q84 -226 56 -177Q49 -162 48 -148Q48 -122 61 -107",697:"211 572Q211 593 226 608T262 623Q281 623 297 610T313 573Q313 561 307 465Q301 370 299 357T284 336Q279 334 262 334Q240 334 231 343Q226 350 225 362T217 465Q211 549 211 572",768:"-409 569Q-409 586 -399 596T-377 610Q-376 610 -372 610T-365 611Q-355 610 -284 588T-210 563Q-195 556 -195 537Q-195 533 -197 522T-208 498T-229 485Q-238 485 -312 508T-388 533Q-400 538 -405 552Q-409 559 -409 569",769:"-297 485Q-315 485 -323 505T-331 537Q-331 556 -316 563Q-307 569 -170 610Q-169 610 -165 610T-157 611Q-141 609 -131 600T-119 584T-117 569Q-117 555 -124 545T-138 533Q-140 531 -214 508T-297 485",770:"-387 460Q-404 460 -416 479T-429 512Q-429 527 -419 534Q-416 536 -347 571T-272 609Q-269 611 -261 611Q-254 610 -182 574Q-168 567 -156 561T-136 550T-123 543T-114 538T-109 535T-105 532T-103 529T-100 525Q-97 518 -97 512Q-97 498 -109 479T-139 460H-141Q-148 460 -209 496L-263 526L-317 496Q-378 460 -387 460",771:"-400 467Q-412 467 -425 480T-438 509Q-437 520 -414 543Q-353 602 -316 609Q-306 611 -301 611Q-279 611 -262 596T-235 566T-221 551Q-206 551 -158 594Q-142 610 -129 610H-125Q-114 610 -101 597T-88 568Q-89 557 -112 534Q-177 469 -220 466Q-247 466 -265 481T-291 511T-305 526Q-320 526 -368 483Q-384 467 -396 467H-400",772:"-429 500Q-440 504 -445 511T-450 522T-452 536Q-452 552 -451 556Q-445 571 -434 574T-379 578Q-369 578 -330 578T-261 577H-96Q-94 575 -90 573T-85 569T-81 564T-77 558T-75 550T-74 538Q-74 522 -78 515T-96 500H-429",774:"-446 579Q-446 611 -412 611H-407Q-383 609 -378 599T-358 587Q-340 583 -263 583H-235Q-159 583 -152 593Q-145 611 -120 611H-117H-115Q-79 611 -79 577Q-80 552 -95 536T-140 514T-191 506T-251 504H-263H-274Q-311 504 -334 505T-386 513T-431 536T-446 579",776:"-421 565Q-421 590 -405 600T-370 611Q-350 611 -345 610Q-308 599 -308 565Q-308 545 -323 532T-359 519H-366H-370Q-405 519 -418 547Q-421 553 -421 565ZM-218 565Q-218 580 -208 593T-179 610Q-177 610 -175 610T-171 611Q-170 612 -158 612Q-130 611 -117 597T-104 565T-116 534T-160 519H-167Q-189 519 -203 532T-218 565",778:"-344 558Q-344 583 -321 601T-262 619Q-225 619 -204 600T-182 560Q-182 536 -205 518T-264 499Q-301 499 -322 519T-344 558ZM-223 559Q-223 570 -234 579T-261 588T-289 580T-303 559Q-303 549 -293 540T-263 530T-234 539T-223 559",780:"-427 525Q-427 542 -417 559T-392 577Q-385 577 -323 553L-263 530L-203 553Q-143 576 -136 576Q-118 576 -109 559T-99 525Q-99 508 -107 502T-161 481Q-177 475 -186 472Q-256 449 -263 449Q-272 449 -339 472T-412 498Q-420 501 -423 508T-427 520V525",913:"191 76Q212 75 220 68T229 38Q229 10 208 1H129H80Q48 1 38 7T28 38Q28 51 29 57T40 69T70 76Q89 76 89 78Q90 79 117 205T173 461T205 599Q212 623 250 623H262H273Q312 623 319 599Q322 591 350 461T406 205T435 78Q435 76 454 76H458Q484 76 493 59Q496 53 496 38Q496 11 478 3Q474 1 395 1H317Q295 8 295 38Q295 65 311 73Q316 75 333 76L348 77V78Q348 80 341 112L334 143H190L183 112Q176 80 176 78Q175 76 178 76Q180 76 191 76ZM318 221Q313 238 288 366T263 519Q263 526 262 527Q261 527 261 520Q261 493 236 365T206 221Q206 219 262 219T318 221",914:"39 1Q17 10 17 32V38V46Q17 65 34 73Q40 76 61 76H84V535H61H54Q27 535 19 553Q17 557 17 573Q17 583 17 587T23 599T39 610Q40 611 179 611Q320 610 332 607Q332 607 339 605Q394 591 427 547T461 454Q461 413 436 378T369 325L358 320Q405 311 443 270T482 169Q482 112 445 64T345 3L334 1H39ZM309 533Q302 535 234 535H168V356H230Q284 357 296 358T323 368Q346 380 361 402T377 452Q377 482 358 505T309 533ZM398 176Q396 218 371 246T315 279Q310 280 237 280H168V76H239Q316 77 327 81Q329 82 334 84Q398 107 398 176",915:"466 611Q468 609 473 606T479 602T483 598T486 593T487 586T488 576T488 562V526V488Q488 452 470 444Q466 442 446 442Q421 442 413 450Q406 457 405 463T404 501V535H185V76H222H239Q260 76 270 69T281 38Q281 12 270 6T209 0H155H104Q48 0 37 5T25 38Q25 59 35 69Q44 76 76 76H101V535H76H64Q36 535 27 552Q25 557 25 573T27 594Q33 606 43 608T106 611H258H466",916:"232 622H237Q242 622 249 622T264 623H293Q295 622 300 619T308 613T314 608T319 601Q322 597 405 316T489 19Q489 9 473 1Q471 0 262 0T51 1Q35 9 35 19Q35 34 118 315T205 601Q214 616 232 622ZM267 501Q266 504 265 510T263 521T261 526V523Q261 508 211 332Q142 91 138 82H386Q385 84 345 224Q281 439 267 501",917:"374 271Q374 241 367 232T332 223Q307 223 299 231Q290 240 290 263V279H173V76H418V118V144Q418 167 426 176T460 186Q491 186 500 166Q502 161 502 93V52Q502 25 499 17T480 1H41Q19 9 19 32V38Q19 63 36 73Q42 76 65 76H89V535H65H55Q44 535 38 537T25 548T19 573Q19 602 41 610H47Q53 610 63 610T88 610T121 610T160 611T204 611T251 611H458Q460 609 465 606T471 602T475 598T478 593T479 586T480 576T480 562V526V488Q480 452 462 444Q458 442 438 442Q413 442 405 450Q398 457 397 463T396 501V535H173V355H290V371Q290 394 299 403T332 412Q363 412 372 392Q374 387 374 317V271",918:"71 1Q60 5 55 11T49 23T48 39V46Q48 56 58 73T131 183Q171 242 197 282L366 535H144V501Q144 470 143 464T135 450Q127 442 102 442H94Q71 442 62 461Q60 466 60 527L61 589Q70 607 83 610H88Q93 610 102 610T124 610T154 610T188 611T227 611T270 611H454Q456 609 461 606T467 601T471 597T474 591T475 584T476 572V565Q476 555 466 538T393 428Q353 369 327 329L158 76H397V120V146Q397 169 405 179T439 189Q470 189 479 169Q481 164 481 95V48Q481 24 478 16T459 1H71",919:"16 571Q16 597 27 604T74 611H125H208Q223 602 226 596T230 573Q230 559 227 551T217 540T204 536T186 535H165V356H359V535H338H333Q306 535 297 552Q295 556 295 573Q295 586 295 590T301 600T317 611H486Q501 602 504 596T508 573Q508 559 505 551T495 540T482 536T464 535H443V76H464H470Q482 76 489 75T502 64T508 38Q508 10 486 1H317Q306 5 301 11T296 21T295 38V44Q295 66 311 73Q318 76 338 76H359V280H165V76H186H192Q204 76 211 75T224 64T230 38Q230 10 208 1H39Q28 5 23 11T18 21T17 38V44Q17 66 33 73Q40 76 60 76H81V535H60Q45 535 38 536T24 545T16 571",920:"102 588Q140 621 240 621Q323 621 335 620Q393 613 422 588Q450 560 459 493T468 306Q468 185 460 118T422 23Q382 -10 289 -10H262H235Q142 -10 102 23Q74 50 65 118T56 306Q56 427 64 494T102 588ZM262 66Q285 66 300 67T329 74T351 86T366 108T376 138T381 181T383 235T384 306Q384 452 371 492T304 544Q296 545 251 545Q230 545 215 543T188 534T169 520T155 497T147 466T143 423T141 371T140 306Q140 247 141 215T146 151T158 107T179 82T212 69T262 66ZM179 356Q187 378 219 378H223Q240 377 249 372T260 360L261 355Q261 353 262 353T263 355Q263 362 272 369Q280 377 304 377H310Q325 377 331 374T346 356V256Q338 241 331 238T309 234H304Q280 234 272 242Q263 249 263 256Q263 258 262 258T261 256Q261 249 252 242Q244 234 220 234H216Q186 234 179 256V356",921:"400 76Q431 76 441 69T452 38Q452 29 452 26T450 18T443 9T430 1H95Q84 6 79 12T73 23T72 38Q72 65 90 73Q96 76 157 76H220V535H157H124Q93 535 83 542T72 573Q72 603 93 610Q97 611 264 611H430Q432 609 436 607T444 602T449 594Q452 588 452 573Q452 546 434 538Q428 535 367 535H304V76H367H400",922:"18 549T18 573T29 604T70 611H118H193Q207 603 210 596T214 573Q214 549 198 538Q191 535 172 535H152V421Q152 344 152 326T153 309L242 422L329 534Q327 535 322 536T314 538T308 542T303 548T300 558T298 573Q298 600 316 608Q322 611 392 611H463Q477 602 481 595T485 573Q485 535 446 535H441H420L281 357L436 77L454 76Q473 75 478 73Q495 62 495 38Q495 10 473 1H345Q334 5 329 11T324 21T323 38Q323 51 324 56T332 68T355 77L233 296L152 192V76H172Q191 76 198 73Q214 63 214 38Q214 9 193 1H41Q18 8 18 38Q18 61 35 73Q42 76 61 76H81V535H61Q42 535 35 538Q18 549 18 573",923:"30 38Q30 57 38 66T70 76Q88 76 88 78Q89 79 117 207T173 466T205 602Q213 617 231 622H236Q241 622 249 622T264 623H294Q315 609 319 602Q321 598 350 468T407 208T435 78Q436 76 454 76Q470 76 478 73Q495 62 495 38Q495 10 473 1H313Q290 10 290 38Q290 56 297 65T310 74T331 76Q350 76 350 78Q349 80 328 176T285 383T263 520Q263 526 262 527Q261 527 261 521Q261 497 240 388T198 181T174 78Q174 76 193 76Q220 75 227 65Q234 56 234 38Q234 28 234 24T228 13T212 1H52Q30 9 30 32V38",924:"50 535Q37 536 31 537T18 547T12 573Q12 598 22 604T62 611H91H121Q147 611 158 607T178 587Q183 579 222 446T261 293Q261 289 262 288Q263 288 263 292Q263 311 298 434T346 588Q353 603 365 607T402 611H435H450Q488 611 500 605T512 573Q512 556 506 547T493 537T474 535H459V76H474Q487 75 493 74T505 64T512 38Q512 11 494 3Q490 1 424 1H386Q355 1 345 7T335 38Q335 55 341 64T354 74T373 76H388V302Q388 512 387 519Q382 482 346 359T304 228Q292 204 262 204T220 228Q215 237 179 359T137 519Q136 512 136 302V76H151Q164 75 170 74T182 64T189 38Q189 11 171 3Q167 1 101 1H63Q32 1 22 7T12 38Q12 55 18 64T31 74T50 76H65V535H50",925:"20 571Q20 598 30 604T73 611H105H136Q152 611 160 611T177 607T189 601T198 587T206 568T217 537T231 497Q354 142 365 95L368 84V535H347H342Q314 535 306 552Q304 556 304 573Q304 586 304 590T310 600T326 611H482Q497 602 500 596T504 573Q504 559 501 551T491 540T478 536T460 535H439V25Q432 7 424 4T389 0H374Q334 0 322 31L293 115Q171 468 159 517L156 528V76H177H183Q195 76 202 75T215 64T221 38Q221 10 199 1H43Q32 5 27 11T22 21T21 38V44Q21 66 37 73Q44 76 64 76H85V535H64Q49 535 42 536T28 545T20 571",926:"37 555V569Q37 605 60 610H66Q71 610 81 610T105 610T137 610T175 611T217 611T264 611H465Q467 609 471 606T477 602T481 599T484 594T485 588T487 580T487 570T487 554Q487 526 486 520T478 506Q470 498 445 498T412 506Q403 515 403 531V539H121V531Q121 498 86 498H79H71Q48 498 39 517Q37 522 37 555ZM109 318V346Q109 366 113 374T132 389H170Q193 379 193 359V354H331V359Q331 379 354 389H392Q407 381 411 373T415 342V318V290Q415 270 411 262T392 247H354Q331 257 331 277V282H193V277Q193 257 170 247H132Q117 255 113 263T109 294V318ZM56 1Q41 7 37 15T33 42V58V80Q33 101 41 110T77 119Q87 118 91 118T103 114T114 103T117 83V72H407V83Q407 101 416 110T449 119T482 110Q489 103 490 97T491 59V41Q491 24 487 16T469 1H56",927:"102 588Q140 621 240 621Q323 621 335 620Q393 613 422 588Q450 560 459 493T468 306Q468 185 460 118T422 23Q382 -10 289 -10H262H235Q142 -10 102 23Q74 50 65 118T56 306Q56 427 64 494T102 588ZM363 513Q357 523 347 530T324 540T302 544T280 546H268Q192 546 167 521Q150 501 145 452T140 300Q140 235 142 197T151 130T172 89T207 71T262 65Q317 65 341 81T374 144T384 300Q384 474 363 513",928:"60 535Q45 535 38 536T24 545T16 571Q16 603 36 609Q41 611 264 611H486Q501 602 504 596T508 573Q508 559 505 551T495 540T482 536T464 535H443V76H464H470Q482 76 489 75T502 64T508 38Q508 10 486 1H317Q306 5 301 11T296 21T295 38V44Q295 66 311 73Q318 76 338 76H359V535H165V76H186H192Q204 76 211 75T224 64T230 38Q230 10 208 1H39Q28 5 23 11T18 21T17 38V44Q17 66 33 73Q40 76 60 76H81V535H60",929:"41 1Q19 9 19 32V38Q19 63 36 73Q42 76 65 76H89V535H65H55Q38 535 29 543T19 576Q19 603 41 610H49Q57 610 70 610T100 610T136 611T175 611Q190 611 216 611T255 612Q321 612 363 598T441 537Q480 486 480 427V421Q480 354 447 311T378 251Q339 230 275 230H239H173V76H197Q220 76 227 73Q244 62 244 38Q244 10 222 1H41ZM396 421Q396 461 369 491T300 533Q294 534 233 535H173V306H233Q294 307 300 308Q345 319 370 352T396 421",931:"40 575Q40 576 40 579T41 583T41 588T43 593T46 597T50 602T55 606T63 610H68Q74 610 84 610T108 610T139 610T176 611T219 611T264 611H462Q464 609 469 606T475 602T479 598T482 593T483 586T484 576T484 562V526V488Q484 452 466 444Q462 442 442 442Q417 442 409 450Q402 457 401 463T400 501V535H153Q153 533 218 430Q233 405 250 378T276 336T286 319Q290 311 290 307Q290 296 239 211Q229 194 223 184L161 78H400V112Q400 142 401 149T409 163Q418 172 442 172Q473 172 482 152Q484 147 484 86V49Q484 25 481 17T462 1H63Q41 10 41 31Q41 39 43 44Q43 45 81 109T157 238L195 303Q195 307 119 430T41 557T40 575",932:"129 38Q129 51 129 55T135 65T151 76H220V535H110V501Q110 470 109 464T101 450Q93 442 68 442H60Q37 442 28 461Q26 466 26 527L27 589Q36 607 49 610H55Q61 610 72 610T97 610T131 610T170 611T215 611T264 611H476Q478 609 483 606T489 602T493 598T496 593T497 586T498 576T498 562V526V488Q498 452 480 444Q476 442 456 442Q431 442 423 450Q416 457 415 463T414 501V535H304V76H374Q389 67 392 61T396 38Q396 10 374 1H151Q140 5 135 11T130 21T129 38",933:"38 494Q38 549 74 585T152 621Q168 621 179 619T209 606T241 566T262 492Q262 494 265 507T270 526T276 547T285 569T298 589T315 606T337 617T365 622Q416 622 451 584T486 494Q486 470 469 461Q464 459 445 459H437Q416 459 406 476Q404 479 403 502T393 541T365 558Q350 558 340 548T323 519T312 475T307 419T305 354T304 282Q304 254 304 239V76H358Q372 67 376 60T380 38Q380 10 358 1H167Q145 9 145 32V38Q145 54 148 60T167 76H220V239Q220 256 220 289T220 338T219 383T217 426T214 463T209 497T201 522T189 543T174 555Q168 558 159 558Q139 558 131 541T121 502T118 476Q108 459 84 459H79H71Q38 459 38 494",934:"139 573V578Q139 603 161 610H166Q172 610 182 610T204 610T232 611T264 611H364Q379 602 382 595T385 573Q385 544 364 536L334 535H304V441H306Q313 440 325 438T367 426T421 403T464 364T483 306Q483 251 430 216T317 172Q315 172 313 172T308 170H306H304V76H364Q379 67 382 60T385 38Q385 28 385 24T379 12T364 1H161Q139 8 139 33V38Q139 46 139 49T141 58T148 68T161 76H220V170H218Q211 171 199 173T157 185T103 208T60 248T41 306Q41 361 94 396T208 439Q210 439 212 439T216 440L218 441H220V535H190L161 536Q139 543 139 573ZM124 306Q124 286 147 271T194 252L218 247Q220 247 220 306V364H218Q212 364 192 359T148 340T124 306ZM400 305Q400 325 377 340T330 360L306 364Q304 364 304 306Q304 247 306 247Q312 247 332 252T376 271T400 305",935:"39 571Q39 597 49 604T93 611H141H218Q233 602 236 595T239 573Q239 538 210 535Q202 535 202 534T215 507T243 454L257 428L307 535H298Q266 538 266 573Q266 584 267 588T273 598T289 611H366H401Q442 611 454 605T466 573Q466 546 448 538Q442 535 421 535H398L299 327Q299 323 362 201L426 77L449 76Q467 76 475 75T489 65T495 38Q495 11 477 3Q473 1 395 1H317Q295 8 295 38Q295 73 325 76L334 77Q333 78 314 117T276 196L257 235L239 196Q221 157 204 118T186 77Q190 76 196 76Q211 74 218 67T227 55T228 38Q228 28 227 24T221 13T206 1H50Q28 9 28 32V38Q28 63 45 73Q51 76 73 76H96L214 324Q215 327 162 431L108 535H85H79Q67 535 60 536T46 546T39 571",936:"37 439Q38 451 40 457T52 469T77 475H79Q96 475 107 473T132 456T152 411Q152 409 153 396T154 372V365Q154 291 198 261Q215 251 219 251Q220 251 220 393V535H193L167 536Q145 545 145 567V573Q145 602 167 610Q168 611 264 611H358Q372 602 376 595T380 573Q380 545 358 536L331 535H304V393Q304 251 305 251Q307 251 310 252T323 259T339 272T355 295T367 331Q368 337 370 372Q370 382 371 395T372 411Q376 434 384 448T404 467T425 474T447 475Q461 474 467 473T480 463T487 437Q487 419 481 412Q476 403 459 398Q457 390 453 344T431 263Q415 228 383 205T332 177T306 172H304V76H358Q372 67 376 60T380 38Q380 10 358 1H167Q145 9 145 32V38Q145 54 148 60T167 76H220V172H218Q211 172 192 177T141 205T93 263Q74 298 71 343T67 391L66 398Q47 403 42 411T37 433V439",937:"40 404Q40 498 106 560T258 622Q357 622 420 558T484 406Q484 359 469 311T428 205T392 117Q382 84 382 78Q382 76 402 76H421V87Q421 110 431 116T457 123Q474 123 483 114Q490 107 491 100T492 61V42Q492 11 474 3Q470 1 397 1H324Q302 9 302 32V39Q302 104 351 225T400 405Q400 462 361 504T262 546Q200 546 162 504T124 405Q124 346 171 230T223 42V36Q223 11 205 3Q201 1 128 1H55Q39 7 33 23L32 60V80Q32 94 34 102T44 116T68 123Q103 123 103 87V76H123Q142 76 142 78Q142 100 117 156T66 282T40 404",8215:"57 -60Q57 -33 86 -25H438Q468 -34 468 -60T438 -95H86Q57 -86 57 -60",8242:"211 572Q211 593 226 608T262 623Q281 623 297 610T313 573Q313 561 307 465Q301 370 299 357T284 336Q279 334 262 334Q240 334 231 343Q226 350 225 362T217 465Q211 549 211 572",8260:"94 -83Q78 -83 68 -73T58 -48Q58 -44 60 -36Q62 -31 227 314T399 673Q410 694 431 694Q445 694 455 684T466 659Q466 656 464 648Q463 643 298 298T125 -62Q114 -83 94 -83",8710:"232 622H237Q242 622 249 622T264 623H293Q295 622 300 619T308 613T314 608T319 601Q322 597 405 316T489 19Q489 9 473 1Q471 0 262 0T51 1Q35 9 35 19Q35 34 118 315T205 601Q214 616 232 622ZM267 501Q266 504 265 510T263 521T261 526V523Q261 508 211 332Q142 91 138 82H386Q385 84 345 224Q281 439 267 501"},{8243:"\u2032\u2032",8244:"\u2032\u2032\u2032",8279:"\u2032\u2032\u2032\u2032"})},9320:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.normal=void 0;var n=r(768),o=r(331);e.normal=(0,n.AddPaths)(o.normal,{32:"",33:"78 661Q78 682 96 699T138 716T180 700T199 661Q199 654 179 432T158 206Q156 198 139 198Q121 198 119 206Q118 209 98 431T78 661ZM79 61Q79 89 97 105T141 121Q164 119 181 104T198 61Q198 31 181 16T139 1Q114 1 97 16T79 61",34:"34 634Q34 659 50 676T93 694Q121 694 144 668T168 579Q168 525 146 476T101 403T73 379Q69 379 60 388T50 401Q50 404 62 417T88 448T116 500T131 572Q131 584 130 584T125 581T112 576T94 573Q69 573 52 590T34 634ZM238 634Q238 659 254 676T297 694Q325 694 348 668T372 579Q372 525 350 476T305 403T277 379Q273 379 264 388T254 401Q254 404 266 417T292 448T320 500T335 572Q335 584 334 584T329 581T316 576T298 573Q273 573 256 590T238 634",35:"56 347Q56 360 70 367H313L355 524Q394 676 401 686Q406 694 416 694Q434 694 436 676Q436 672 396 522Q355 374 355 369L354 367H543L585 524Q626 679 630 685Q636 694 646 694Q653 694 659 689T665 678Q665 668 626 522Q585 374 585 369L584 367H762Q777 359 777 347Q777 334 767 331T722 327H667H572L552 251L531 174Q531 173 647 173H720Q756 173 766 170T777 153T762 133H519L477 -24Q436 -179 432 -185Q426 -194 416 -194Q409 -194 403 -189T397 -177Q397 -167 436 -21Q477 125 477 131L478 133H289L247 -24Q206 -179 202 -185Q196 -194 186 -194Q179 -194 173 -189T167 -177Q167 -167 206 -21Q247 125 247 131L248 133H70Q56 140 56 153Q56 168 72 173H260L280 249L301 326Q301 327 186 327H72Q56 332 56 347ZM531 326Q531 327 437 327H342L322 251L301 174Q301 173 395 173H490L510 249L531 326",36:"162 187Q162 164 146 149T109 133H103V130Q108 115 115 105Q122 92 131 82T150 64T170 52T190 44T206 40T220 37L227 36V313Q190 320 162 335Q116 358 86 404T55 508Q55 567 85 614T165 685Q186 696 225 704H227V750H273V704L286 703Q369 690 413 631Q441 588 444 531Q444 514 443 509Q439 490 425 479T391 468Q368 468 353 483T337 522Q337 546 353 560T390 575L394 576V578Q386 599 372 614T342 637T314 649T288 656L273 658V408L288 405Q329 394 355 376Q396 348 420 300T444 199Q444 130 408 76T313 1Q286 -9 276 -9H273V-56H227V-10H221Q202 -6 193 -4T155 11T108 41T74 94T55 176V182Q55 227 95 238Q103 240 108 240Q129 240 145 226T162 187ZM225 657Q219 657 204 651T169 632T135 594T121 538Q121 512 131 491T156 457T187 435T213 423T227 420V539Q227 657 225 657ZM378 169Q378 230 339 265T274 301Q273 301 273 169V37Q324 50 351 87T378 169",37:"465 605Q428 605 394 614T340 632T319 641Q332 608 332 548Q332 458 293 403T202 347Q145 347 101 402T56 548Q56 637 101 693T202 750Q241 750 272 719Q359 642 464 642Q580 642 650 732Q662 748 668 749Q670 750 673 750Q682 750 688 743T693 726Q178 -47 170 -52Q166 -56 160 -56Q147 -56 142 -45Q137 -36 142 -27Q143 -24 363 304Q469 462 525 546T581 630Q528 605 465 605ZM207 385Q235 385 263 427T292 548Q292 617 267 664T200 712Q193 712 186 709T167 698T147 668T134 615Q132 595 132 548V527Q132 436 165 403Q183 385 203 385H207ZM500 146Q500 234 544 290T647 347Q699 347 737 292T776 146T737 0T646 -56Q590 -56 545 0T500 146ZM651 -18Q679 -18 707 24T736 146Q736 215 711 262T644 309Q637 309 630 306T611 295T591 265T578 212Q577 200 577 146V124Q577 -18 647 -18H651",38:"156 540Q156 620 201 668T302 716Q354 716 377 671T401 578Q401 505 287 386L274 373Q309 285 416 148L429 132L437 142Q474 191 543 309L562 341V349Q562 368 541 376T498 385H493V431H502L626 428Q709 428 721 431H727V385H712Q688 384 669 379T639 369T618 354T603 337T591 316T578 295Q537 223 506 176T464 117T454 104Q454 102 471 85T497 62Q543 24 585 24Q618 24 648 48T682 113V121H722V112Q721 94 714 75T692 32T646 -7T574 -22Q491 -19 414 42L402 51L391 42Q312 -22 224 -22Q144 -22 93 25T42 135Q42 153 46 169T55 197T74 225T96 249T125 278T156 308L195 347L190 360Q185 372 182 382T174 411T165 448T159 491T156 540ZM361 576Q361 613 348 646T305 679Q272 679 252 649T232 572Q232 497 255 426L259 411L267 420Q361 519 361 576ZM140 164Q140 103 167 64T240 24Q271 24 304 36T356 61T374 77Q295 156 235 262L220 292L210 310L193 293Q177 277 169 268T151 229T140 164",39:"78 634Q78 659 95 676T138 694Q166 694 189 668T212 579Q212 525 190 476T146 403T118 379Q114 379 105 388T95 401Q95 404 107 417T133 448T161 500T176 572Q176 584 175 584T170 581T157 576T139 573Q114 573 96 590T78 634",40:"94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250",41:"60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749",42:"215 721Q216 732 225 741T248 750Q263 750 273 742T284 721L270 571L327 613Q383 654 388 657T399 660Q412 660 423 650T435 624T424 600T376 575Q363 569 355 566L289 534L355 504L424 470Q435 462 435 447Q435 431 424 420T399 409Q393 409 388 412T327 456L270 498L277 423L284 348Q280 320 250 320T215 348L229 498L172 456Q116 415 111 412T100 409Q87 409 76 420T64 447Q64 461 75 470L144 504L210 534L144 566Q136 570 122 576Q83 593 74 600T64 624Q64 639 75 649T100 660Q106 660 111 657T172 613L229 571Q229 578 222 643T215 721",43:"56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250",44:"78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17",45:"11 179V252H277V179H11",46:"78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60",47:"423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750",48:"96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597",49:"213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578",50:"109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429",51:"127 463Q100 463 85 480T69 524Q69 579 117 622T233 665Q268 665 277 664Q351 652 390 611T430 522Q430 470 396 421T302 350L299 348Q299 347 308 345T337 336T375 315Q457 262 457 175Q457 96 395 37T238 -22Q158 -22 100 21T42 130Q42 158 60 175T105 193Q133 193 151 175T169 130Q169 119 166 110T159 94T148 82T136 74T126 70T118 67L114 66Q165 21 238 21Q293 21 321 74Q338 107 338 175V195Q338 290 274 322Q259 328 213 329L171 330L168 332Q166 335 166 348Q166 366 174 366Q202 366 232 371Q266 376 294 413T322 525V533Q322 590 287 612Q265 626 240 626Q208 626 181 615T143 592T132 580H135Q138 579 143 578T153 573T165 566T175 555T183 540T186 520Q186 498 172 481T127 463",52:"462 0Q444 3 333 3Q217 3 199 0H190V46H221Q241 46 248 46T265 48T279 53T286 61Q287 63 287 115V165H28V211L179 442Q332 674 334 675Q336 677 355 677H373L379 671V211H471V165H379V114Q379 73 379 66T385 54Q393 47 442 46H471V0H462ZM293 211V545L74 212L183 211H293",53:"164 157Q164 133 148 117T109 101H102Q148 22 224 22Q294 22 326 82Q345 115 345 210Q345 313 318 349Q292 382 260 382H254Q176 382 136 314Q132 307 129 306T114 304Q97 304 95 310Q93 314 93 485V614Q93 664 98 664Q100 666 102 666Q103 666 123 658T178 642T253 634Q324 634 389 662Q397 666 402 666Q410 666 410 648V635Q328 538 205 538Q174 538 149 544L139 546V374Q158 388 169 396T205 412T256 420Q337 420 393 355T449 201Q449 109 385 44T229 -22Q148 -22 99 32T50 154Q50 178 61 192T84 210T107 214Q132 214 148 197T164 157",54:"42 313Q42 476 123 571T303 666Q372 666 402 630T432 550Q432 525 418 510T379 495Q356 495 341 509T326 548Q326 592 373 601Q351 623 311 626Q240 626 194 566Q147 500 147 364L148 360Q153 366 156 373Q197 433 263 433H267Q313 433 348 414Q372 400 396 374T435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM257 397Q227 397 205 380T171 335T154 278T148 216Q148 133 160 97T198 39Q222 21 251 21Q302 21 329 59Q342 77 347 104T352 209Q352 289 347 316T329 361Q302 397 257 397",55:"55 458Q56 460 72 567L88 674Q88 676 108 676H128V672Q128 662 143 655T195 646T364 644H485V605L417 512Q408 500 387 472T360 435T339 403T319 367T305 330T292 284T284 230T278 162T275 80Q275 66 275 52T274 28V19Q270 2 255 -10T221 -22Q210 -22 200 -19T179 0T168 40Q168 198 265 368Q285 400 349 489L395 552H302Q128 552 119 546Q113 543 108 522T98 479L95 458V455H55V458",56:"70 417T70 494T124 618T248 666Q319 666 374 624T429 515Q429 485 418 459T392 417T361 389T335 371T324 363L338 354Q352 344 366 334T382 323Q457 264 457 174Q457 95 399 37T249 -22Q159 -22 101 29T43 155Q43 263 172 335L154 348Q133 361 127 368Q70 417 70 494ZM286 386L292 390Q298 394 301 396T311 403T323 413T334 425T345 438T355 454T364 471T369 491T371 513Q371 556 342 586T275 624Q268 625 242 625Q201 625 165 599T128 534Q128 511 141 492T167 463T217 431Q224 426 228 424L286 386ZM250 21Q308 21 350 55T392 137Q392 154 387 169T375 194T353 216T330 234T301 253T274 270Q260 279 244 289T218 306L210 311Q204 311 181 294T133 239T107 157Q107 98 150 60T250 21",57:"352 287Q304 211 232 211Q154 211 104 270T44 396Q42 412 42 436V444Q42 537 111 606Q171 666 243 666Q245 666 249 666T257 665H261Q273 665 286 663T323 651T370 619T413 560Q456 472 456 334Q456 194 396 97Q361 41 312 10T208 -22Q147 -22 108 7T68 93T121 149Q143 149 158 135T173 96Q173 78 164 65T148 49T135 44L131 43Q131 41 138 37T164 27T206 22H212Q272 22 313 86Q352 142 352 280V287ZM244 248Q292 248 321 297T351 430Q351 508 343 542Q341 552 337 562T323 588T293 615T246 625Q208 625 181 598Q160 576 154 546T147 441Q147 358 152 329T172 282Q197 248 244 248",58:"78 370Q78 394 95 412T138 430Q162 430 180 414T199 371Q199 346 182 328T139 310T96 327T78 370ZM78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60",59:"78 370Q78 394 95 412T138 430Q162 430 180 414T199 371Q199 346 182 328T139 310T96 327T78 370ZM78 60Q78 85 94 103T137 121Q202 121 202 8Q202 -44 183 -94T144 -169T118 -194Q115 -194 106 -186T95 -174Q94 -171 107 -155T137 -107T160 -38Q161 -32 162 -22T165 -4T165 4Q165 5 161 4T142 0Q110 0 94 18T78 60",60:"694 -11T694 -19T688 -33T678 -40Q671 -40 524 29T234 166L90 235Q83 240 83 250Q83 261 91 266Q664 540 678 540Q681 540 687 534T694 519T687 505Q686 504 417 376L151 250L417 124Q686 -4 687 -5Q694 -11 694 -19",61:"56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153",62:"84 520Q84 528 88 533T96 539L99 540Q106 540 253 471T544 334L687 265Q694 260 694 250T687 235Q685 233 395 96L107 -40H101Q83 -38 83 -20Q83 -19 83 -17Q82 -10 98 -1Q117 9 248 71Q326 108 378 132L626 250L378 368Q90 504 86 509Q84 513 84 520",63:"226 668Q190 668 162 656T124 632L114 621Q116 621 119 620T130 616T145 607T157 591T162 567Q162 544 147 529T109 514T71 528T55 566Q55 625 100 661T199 704Q201 704 210 704T224 705H228Q281 705 320 692T378 656T407 612T416 567Q416 503 361 462Q267 395 247 303Q242 279 242 241V224Q242 205 239 202T222 198T205 201T202 218V249Q204 320 220 371T255 445T292 491T315 537Q317 546 317 574V587Q317 604 315 615T304 640T277 661T226 668ZM162 61Q162 89 180 105T224 121Q247 119 264 104T281 61Q281 31 264 16T222 1Q197 1 180 16T162 61",64:"56 347Q56 429 86 498T164 612T270 680T386 705Q522 705 622 603T722 349Q722 126 608 126Q541 126 513 176Q512 177 512 179T510 182L509 183Q508 183 503 177T487 163T464 146T429 132T385 126Q311 126 251 186T190 347Q190 448 251 508T385 568Q426 568 460 548T509 511T531 479H555Q580 479 582 478Q586 477 587 468Q588 454 588 338V260Q588 200 593 182T619 163Q641 163 655 178T674 223T680 273T682 325V330Q682 426 647 500Q611 569 544 618T388 668Q271 668 184 577T96 347Q96 216 180 121T396 26Q421 26 446 28T493 34T535 43T573 52T605 63T629 72T647 80T657 84H716Q722 78 722 74Q722 65 675 45T547 7T392 -11Q255 -11 156 90T56 347ZM274 347Q274 266 308 214T390 162Q420 162 449 182T498 235L504 245V449L498 459Q453 532 387 532Q347 532 311 483T274 347",65:"255 0Q240 3 140 3Q48 3 39 0H32V46H47Q119 49 139 88Q140 91 192 245T295 553T348 708Q351 716 366 716H376Q396 715 400 709Q402 707 508 390L617 67Q624 54 636 51T687 46H717V0H708Q699 3 581 3Q458 3 437 0H427V46H440Q510 46 510 64Q510 66 486 138L462 209H229L209 150Q189 91 189 85Q189 72 209 59T259 46H264V0H255ZM447 255L345 557L244 256Q244 255 345 255H447",66:"131 622Q124 629 120 631T104 634T61 637H28V683H229H267H346Q423 683 459 678T531 651Q574 627 599 590T624 512Q624 461 583 419T476 360L466 357Q539 348 595 302T651 187Q651 119 600 67T469 3Q456 1 242 0H28V46H61Q103 47 112 49T131 61V622ZM511 513Q511 560 485 594T416 636Q415 636 403 636T371 636T333 637Q266 637 251 636T232 628Q229 624 229 499V374H312L396 375L406 377Q410 378 417 380T442 393T474 417T499 456T511 513ZM537 188Q537 239 509 282T430 336L329 337H229V200V116Q229 57 234 52Q240 47 334 47H383Q425 47 443 53Q486 67 511 104T537 188",67:"56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q322 658 252 588Q173 509 173 342Q173 221 211 151Q232 111 263 84T328 45T384 29T428 24Q517 24 571 93T626 244Q626 251 632 257H660L666 251V236Q661 133 590 56T403 -21Q262 -21 159 83T56 342",68:"130 622Q123 629 119 631T103 634T60 637H27V683H228Q399 682 419 682T461 676Q504 667 546 641T626 573T685 470T708 336Q708 210 634 116T442 3Q429 1 228 0H27V46H60Q102 47 111 49T130 61V622ZM593 338Q593 439 571 501T493 602Q439 637 355 637H322H294Q238 637 234 628Q231 624 231 344Q231 62 232 59Q233 49 248 48T339 46H350Q456 46 515 95Q561 133 577 191T593 338",69:"128 619Q121 626 117 628T101 631T58 634H25V680H597V676Q599 670 611 560T625 444V440H585V444Q584 447 582 465Q578 500 570 526T553 571T528 601T498 619T457 629T411 633T353 634Q266 634 251 633T233 622Q233 622 233 621Q232 619 232 497V376H286Q359 378 377 385Q413 401 416 469Q416 471 416 473V493H456V213H416V233Q415 268 408 288T383 317T349 328T297 330Q290 330 286 330H232V196V114Q232 57 237 52Q243 47 289 47H340H391Q428 47 452 50T505 62T552 92T584 146Q594 172 599 200T607 247T612 270V273H652V270Q651 267 632 137T610 3V0H25V46H58Q100 47 109 49T128 61V619",70:"128 619Q121 626 117 628T101 631T58 634H25V680H582V676Q584 670 596 560T610 444V440H570V444Q563 493 561 501Q555 538 543 563T516 601T477 622T431 631T374 633H334H286Q252 633 244 631T233 621Q232 619 232 490V363H284Q287 363 303 363T327 364T349 367T372 373T389 385Q407 403 410 459V480H450V200H410V221Q407 276 389 296Q381 303 371 307T348 313T327 316T303 317T284 317H232V189L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619",71:"56 342Q56 428 89 500T174 615T283 681T391 705Q394 705 400 705T408 704Q499 704 569 636L582 624L612 663Q639 700 643 704Q644 704 647 704T653 705H657Q660 705 666 699V419L660 413H626Q620 419 619 430Q610 512 571 572T476 651Q457 658 426 658Q401 658 376 654T316 633T254 592T205 519T177 411Q173 369 173 335Q173 259 192 201T238 111T302 58T370 31T431 24Q478 24 513 45T559 100Q562 110 562 160V212Q561 213 557 216T551 220T542 223T526 225T502 226T463 227H437V273H449L609 270Q715 270 727 273H735V227H721Q674 227 668 215Q666 211 666 108V6Q660 0 657 0Q653 0 639 10Q617 25 600 42L587 54Q571 27 524 3T406 -22Q317 -22 238 22T108 151T56 342",72:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 500V378H517V622Q510 629 506 631T490 634T447 637H414V683H425Q446 680 569 680Q704 680 713 683H724V637H691Q651 636 640 634T622 622V61Q628 51 639 49T691 46H724V0H713Q692 3 569 3Q434 3 425 0H414V46H447Q489 47 498 49T517 61V332H232V197L233 61Q239 51 250 49T302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622",73:"328 0Q307 3 180 3T32 0H21V46H43Q92 46 106 49T126 60Q128 63 128 342Q128 620 126 623Q122 628 118 630T96 635T43 637H21V683H32Q53 680 180 680T328 683H339V637H317Q268 637 254 634T234 623Q232 620 232 342Q232 63 234 60Q238 55 242 53T264 48T317 46H339V0H328",74:"89 177Q115 177 133 160T152 112Q152 88 137 72T102 52Q99 51 101 49Q106 43 129 29Q159 15 190 15Q232 15 256 48T286 126Q286 127 286 142T286 183T286 238T287 306T287 378Q287 403 287 429T287 479T287 524T286 563T286 593T286 614V621Q281 630 263 633T182 637H154V683H166Q187 680 332 680Q439 680 457 683H465V637H449Q422 637 401 634Q393 631 389 623Q388 621 388 376T387 123Q377 61 322 20T194 -22Q188 -22 177 -21T160 -20Q96 -9 61 29T25 110Q25 144 44 160T89 177",75:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H313Q235 637 233 620Q232 618 232 462L233 307L379 449Q425 494 479 546Q518 584 524 591T531 607V608Q531 630 503 636Q501 636 498 636T493 637H489V683H499Q517 680 630 680Q704 680 716 683H722V637H708Q633 633 589 597Q584 592 495 506T406 419T515 254T631 80Q644 60 662 54T715 46H736V0H728Q719 3 615 3Q493 3 472 0H461V46H469Q515 46 515 72Q515 78 512 84L336 351Q332 348 278 296L232 251V156Q232 62 235 58Q243 47 302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622",76:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q48 680 182 680Q324 680 348 683H360V637H333Q273 637 258 635T233 622L232 342V129Q232 57 237 52Q243 47 313 47Q384 47 410 53Q470 70 498 110T536 221Q536 226 537 238T540 261T542 272T562 273H582V268Q580 265 568 137T554 5V0H25V46H58Q100 47 109 49T128 61V622",77:"132 622Q125 629 121 631T105 634T62 637H29V683H135Q221 683 232 682T249 675Q250 674 354 398L458 124L562 398Q666 674 668 675Q671 681 683 682T781 683H887V637H854Q814 636 803 634T785 622V61Q791 51 802 49T854 46H887V0H876Q855 3 736 3Q605 3 596 0H585V46H618Q660 47 669 49T688 61V347Q688 424 688 461T688 546T688 613L687 632Q454 14 450 7Q446 1 430 1T410 7Q409 9 292 316L176 624V606Q175 588 175 543T175 463T175 356L176 86Q187 50 261 46H278V0H269Q254 3 154 3Q52 3 37 0H29V46H46Q78 48 98 56T122 69T132 86V622",78:"42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42",79:"56 340Q56 423 86 494T164 610T270 680T388 705Q521 705 621 601T722 341Q722 260 693 191T617 75T510 4T388 -22T267 3T160 74T85 189T56 340ZM467 647Q426 665 388 665Q360 665 331 654T269 620T213 549T179 439Q174 411 174 354Q174 144 277 61Q327 20 385 20H389H391Q474 20 537 99Q603 188 603 354Q603 411 598 439Q577 592 467 647",80:"130 622Q123 629 119 631T103 634T60 637H27V683H214Q237 683 276 683T331 684Q419 684 471 671T567 616Q624 563 624 489Q624 421 573 372T451 307Q429 302 328 301H234V181Q234 62 237 58Q245 47 304 46H337V0H326Q305 3 182 3Q47 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM507 488Q507 514 506 528T500 564T483 597T450 620T397 635Q385 637 307 637H286Q237 637 234 628Q231 624 231 483V342H302H339Q390 342 423 349T481 382Q507 411 507 488",81:"56 341Q56 499 157 602T388 705Q521 705 621 601T722 341Q722 275 703 218T660 127T603 63T555 25T525 9Q524 8 524 8H523Q524 5 526 -1T537 -21T555 -47T581 -67T615 -76Q653 -76 678 -56T706 -3Q707 10 716 10Q721 10 728 5L727 -13Q727 -88 697 -140T606 -193Q563 -193 538 -166T498 -83Q483 -23 483 -8L471 -11Q459 -14 435 -18T388 -22Q254 -22 155 81T56 341ZM607 339Q607 429 586 496T531 598T461 649T390 665T318 649T248 598T192 496T170 339Q170 143 277 57Q301 39 305 39L304 42Q304 44 304 46Q301 53 301 68Q301 101 325 128T391 155Q454 155 495 70L501 58Q549 91 578 164Q607 234 607 339ZM385 18Q404 18 425 23T459 33T472 40Q471 47 468 57T449 88T412 115Q398 117 386 117Q367 117 353 102T338 67Q338 48 351 33T385 18",82:"130 622Q123 629 119 631T103 634T60 637H27V683H202H236H300Q376 683 417 677T500 648Q595 600 609 517Q610 512 610 501Q610 468 594 439T556 392T511 361T472 343L456 338Q459 335 467 332Q497 316 516 298T545 254T559 211T568 155T578 94Q588 46 602 31T640 16H645Q660 16 674 32T692 87Q692 98 696 101T712 105T728 103T732 90Q732 59 716 27T672 -16Q656 -22 630 -22Q481 -16 458 90Q456 101 456 163T449 246Q430 304 373 320L363 322L297 323H231V192L232 61Q238 51 249 49T301 46H334V0H323Q302 3 181 3Q59 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM491 499V509Q491 527 490 539T481 570T462 601T424 623T362 636Q360 636 340 636T304 637H283Q238 637 234 628Q231 624 231 492V360H289Q390 360 434 378T489 456Q491 467 491 499",83:"55 507Q55 590 112 647T243 704H257Q342 704 405 641L426 672Q431 679 436 687T446 700L449 704Q450 704 453 704T459 705H463Q466 705 472 699V462L466 456H448Q437 456 435 459T430 479Q413 605 329 646Q292 662 254 662Q201 662 168 626T135 542Q135 508 152 480T200 435Q210 431 286 412T370 389Q427 367 463 314T500 191Q500 110 448 45T301 -21Q245 -21 201 -4T140 27L122 41Q118 36 107 21T87 -7T78 -21Q76 -22 68 -22H64Q61 -22 55 -16V101Q55 220 56 222Q58 227 76 227H89Q95 221 95 214Q95 182 105 151T139 90T205 42T305 24Q352 24 386 62T420 155Q420 198 398 233T340 281Q284 295 266 300Q261 301 239 306T206 314T174 325T141 343T112 367T85 402Q55 451 55 507",84:"36 443Q37 448 46 558T55 671V677H666V671Q667 666 676 556T685 443V437H645V443Q645 445 642 478T631 544T610 593Q593 614 555 625Q534 630 478 630H451H443Q417 630 414 618Q413 616 413 339V63Q420 53 439 50T528 46H558V0H545L361 3Q186 1 177 0H164V46H194Q264 46 283 49T309 63V339V550Q309 620 304 625T271 630H244H224Q154 630 119 601Q101 585 93 554T81 486T76 443V437H36V443",85:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 418V291Q232 189 240 145T280 67Q325 24 389 24Q454 24 506 64T571 183Q575 206 575 410V598Q569 608 565 613T541 627T489 637H472V683H481Q496 680 598 680T715 683H724V637H707Q634 633 622 598L621 399Q620 194 617 180Q617 179 615 171Q595 83 531 31T389 -22Q304 -22 226 33T130 192Q129 201 128 412V622",86:"114 620Q113 621 110 624T107 627T103 630T98 632T91 634T80 635T67 636T48 637H19V683H28Q46 680 152 680Q273 680 294 683H305V637H284Q223 634 223 620Q223 618 313 372T404 126L490 358Q575 588 575 597Q575 616 554 626T508 637H503V683H512Q527 680 627 680Q718 680 724 683H730V637H723Q648 637 627 596Q627 595 515 291T401 -14Q396 -22 382 -22H374H367Q353 -22 348 -14Q346 -12 231 303Q114 617 114 620",87:"792 683Q810 680 914 680Q991 680 1003 683H1009V637H996Q931 633 915 598Q912 591 863 438T766 135T716 -17Q711 -22 694 -22Q676 -22 673 -15Q671 -13 593 231L514 477L435 234Q416 174 391 92T358 -6T341 -22H331Q314 -21 310 -15Q309 -14 208 302T104 622Q98 632 87 633Q73 637 35 637H18V683H27Q69 681 154 681Q164 681 181 681T216 681T249 682T276 683H287H298V637H285Q213 637 213 620Q213 616 289 381L364 144L427 339Q490 535 492 546Q487 560 482 578T475 602T468 618T461 628T449 633T433 636T408 637H380V683H388Q397 680 508 680Q629 680 650 683H660V637H647Q576 637 576 619L727 146Q869 580 869 600Q869 605 863 612T839 627T794 637H783V683H792",88:"270 0Q252 3 141 3Q46 3 31 0H23V46H40Q129 50 161 88Q165 94 244 216T324 339Q324 341 235 480T143 622Q133 631 119 634T57 637H37V683H46Q64 680 172 680Q297 680 318 683H329V637H324Q307 637 286 632T263 621Q263 618 322 525T384 431Q385 431 437 511T489 593Q490 595 490 599Q490 611 477 622T436 637H428V683H437Q455 680 566 680Q661 680 676 683H684V637H667Q585 634 551 599Q548 596 478 491Q412 388 412 387Q412 385 514 225T620 62Q628 53 642 50T695 46H726V0H717Q699 3 591 3Q466 3 445 0H434V46H440Q454 46 476 51T499 64Q499 67 463 124T390 238L353 295L350 292Q348 290 343 283T331 265T312 236T286 195Q219 88 218 84Q218 70 234 59T272 46H280V0H270",89:"518 0Q497 3 374 3Q253 3 232 0H221V46H254Q313 47 321 58Q324 62 324 167V273L221 446Q117 620 114 623Q106 631 91 634T31 637H11V683H20Q29 680 148 680Q273 680 294 683H305V637H287Q239 636 236 621Q236 619 321 475L407 332L483 460Q502 492 527 534Q563 594 563 604Q563 632 517 637H508V683H517H525Q533 683 545 683T571 682T600 681T626 681Q695 681 731 683H738V637H723Q640 633 613 588Q612 587 517 427L425 273V169V95Q425 66 428 59T444 49Q459 46 506 46H528V0H518",90:"69 443Q69 452 74 554T80 683H549Q555 677 555 664Q555 649 554 648Q552 645 366 348T179 50T192 49T263 49H275H302Q333 49 353 50T401 59T447 78T482 115T507 173Q513 200 520 273V282H560V274Q560 272 552 143T543 8V0H302L61 1L58 3Q55 8 55 21V35Q59 43 153 193T340 489T432 637H343Q259 637 214 625T141 573Q109 523 109 445Q109 443 89 443H69",91:"118 -250V750H255V710H158V-210H255V-250H118",92:"56 731Q56 740 62 745T75 750Q85 750 92 740Q96 733 270 255T444 -231Q444 -239 438 -244T424 -250Q414 -250 407 -240Q404 -236 230 242T56 731",93:"22 710V750H159V-250H22V-210H119V710H22",94:"112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560",95:"0 -62V-25H499V-62H0",96:"106 655Q106 671 119 685T150 699Q166 699 177 688Q190 671 222 629T275 561T295 533T282 519L267 505L196 563Q119 626 113 634Q106 643 106 655",97:"137 305T115 305T78 320T63 359Q63 394 97 421T218 448Q291 448 336 416T396 340Q401 326 401 309T402 194V124Q402 76 407 58T428 40Q443 40 448 56T453 109V145H493V106Q492 66 490 59Q481 29 455 12T400 -6T353 12T329 54V58L327 55Q325 52 322 49T314 40T302 29T287 17T269 6T247 -2T221 -8T190 -11Q130 -11 82 20T34 107Q34 128 41 147T68 188T116 225T194 253T304 268H318V290Q318 324 312 340Q290 411 215 411Q197 411 181 410T156 406T148 403Q170 388 170 359Q170 334 154 320ZM126 106Q126 75 150 51T209 26Q247 26 276 49T315 109Q317 116 318 175Q318 233 317 233Q309 233 296 232T251 223T193 203T147 166T126 106",98:"307 -11Q234 -11 168 55L158 37Q156 34 153 28T147 17T143 10L138 1L118 0H98V298Q98 599 97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V543Q179 391 180 391L183 394Q186 397 192 401T207 411T228 421T254 431T286 439T323 442Q401 442 461 379T522 216Q522 115 458 52T307 -11ZM182 98Q182 97 187 90T196 79T206 67T218 55T233 44T250 35T271 29T295 26Q330 26 363 46T412 113Q424 148 424 212Q424 287 412 323Q385 405 300 405Q270 405 239 390T188 347L182 339V98",99:"370 305T349 305T313 320T297 358Q297 381 312 396Q317 401 317 402T307 404Q281 408 258 408Q209 408 178 376Q131 329 131 219Q131 137 162 90Q203 29 272 29Q313 29 338 55T374 117Q376 125 379 127T395 129H409Q415 123 415 120Q415 116 411 104T395 71T366 33T318 2T249 -11Q163 -11 99 53T34 214Q34 318 99 383T250 448T370 421T404 357Q404 334 387 320",100:"376 495Q376 511 376 535T377 568Q377 613 367 624T316 637H298V660Q298 683 300 683L310 684Q320 685 339 686T376 688Q393 689 413 690T443 693T454 694H457V390Q457 84 458 81Q461 61 472 55T517 46H535V0Q533 0 459 -5T380 -11H373V44L365 37Q307 -11 235 -11Q158 -11 96 50T34 215Q34 315 97 378T244 442Q319 442 376 393V495ZM373 342Q328 405 260 405Q211 405 173 369Q146 341 139 305T131 211Q131 155 138 120T173 59Q203 26 251 26Q322 26 373 103V342",101:"28 218Q28 273 48 318T98 391T163 433T229 448Q282 448 320 430T378 380T406 316T415 245Q415 238 408 231H126V216Q126 68 226 36Q246 30 270 30Q312 30 342 62Q359 79 369 104L379 128Q382 131 395 131H398Q415 131 415 121Q415 117 412 108Q393 53 349 21T250 -11Q155 -11 92 58T28 218ZM333 275Q322 403 238 411H236Q228 411 220 410T195 402T166 381T143 340T127 274V267H333V275",102:"273 0Q255 3 146 3Q43 3 34 0H26V46H42Q70 46 91 49Q99 52 103 60Q104 62 104 224V385H33V431H104V497L105 564L107 574Q126 639 171 668T266 704Q267 704 275 704T289 705Q330 702 351 679T372 627Q372 604 358 590T321 576T284 590T270 627Q270 647 288 667H284Q280 668 273 668Q245 668 223 647T189 592Q183 572 182 497V431H293V385H185V225Q185 63 186 61T189 57T194 54T199 51T206 49T213 48T222 47T231 47T241 46T251 46H282V0H273",103:"329 409Q373 453 429 453Q459 453 472 434T485 396Q485 382 476 371T449 360Q416 360 412 390Q410 404 415 411Q415 412 416 414V415Q388 412 363 393Q355 388 355 386Q355 385 359 381T368 369T379 351T388 325T392 292Q392 230 343 187T222 143Q172 143 123 171Q112 153 112 133Q112 98 138 81Q147 75 155 75T227 73Q311 72 335 67Q396 58 431 26Q470 -13 470 -72Q470 -139 392 -175Q332 -206 250 -206Q167 -206 107 -175Q29 -140 29 -75Q29 -39 50 -15T92 18L103 24Q67 55 67 108Q67 155 96 193Q52 237 52 292Q52 355 102 398T223 442Q274 442 318 416L329 409ZM299 343Q294 371 273 387T221 404Q192 404 171 388T145 343Q142 326 142 292Q142 248 149 227T179 192Q196 182 222 182Q244 182 260 189T283 207T294 227T299 242Q302 258 302 292T299 343ZM403 -75Q403 -50 389 -34T348 -11T299 -2T245 0H218Q151 0 138 -6Q118 -15 107 -34T95 -74Q95 -84 101 -97T122 -127T170 -155T250 -167Q319 -167 361 -139T403 -75",104:"41 46H55Q94 46 102 60V68Q102 77 102 91T102 124T102 167T103 217T103 272T103 329Q103 366 103 407T103 482T102 542T102 586T102 603Q99 622 88 628T43 637H25V660Q25 683 27 683L37 684Q47 685 66 686T103 688Q120 689 140 690T170 693T181 694H184V367Q244 442 328 442Q451 442 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41",105:"69 609Q69 637 87 653T131 669Q154 667 171 652T188 609Q188 579 171 564T129 549Q104 549 87 564T69 609ZM247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247",106:"98 609Q98 637 116 653T160 669Q183 667 200 652T217 609Q217 579 200 564T158 549Q133 549 116 564T98 609ZM28 -163Q58 -168 64 -168Q124 -168 135 -77Q137 -65 137 141T136 353Q132 371 120 377T72 385H52V408Q52 431 54 431L58 432Q62 432 70 432T87 433T108 434T133 436Q151 437 171 438T202 441T214 442H218V184Q217 -36 217 -59T211 -98Q195 -145 153 -175T58 -205Q9 -205 -23 -179T-55 -117Q-55 -94 -40 -79T-2 -64T36 -79T52 -118Q52 -143 28 -163",107:"36 46H50Q89 46 97 60V68Q97 77 97 91T97 124T98 167T98 217T98 272T98 329Q98 366 98 407T98 482T98 542T97 586T97 603Q94 622 83 628T38 637H20V660Q20 683 22 683L32 684Q42 685 61 686T98 688Q115 689 135 690T165 693T176 694H179V463L180 233L240 287Q300 341 304 347Q310 356 310 364Q310 383 289 385H284V431H293Q308 428 412 428Q475 428 484 431H489V385H476Q407 380 360 341Q286 278 286 274Q286 273 349 181T420 79Q434 60 451 53T500 46H511V0H505Q496 3 418 3Q322 3 307 0H299V46H306Q330 48 330 65Q330 72 326 79Q323 84 276 153T228 222L176 176V120V84Q176 65 178 59T189 49Q210 46 238 46H254V0H246Q231 3 137 3T28 0H20V46H36",108:"42 46H56Q95 46 103 60V68Q103 77 103 91T103 124T104 167T104 217T104 272T104 329Q104 366 104 407T104 482T104 542T103 586T103 603Q100 622 89 628T44 637H26V660Q26 683 28 683L38 684Q48 685 67 686T104 688Q121 689 141 690T171 693T182 694H185V379Q185 62 186 60Q190 52 198 49Q219 46 247 46H263V0H255L232 1Q209 2 183 2T145 3T107 3T57 1L34 0H26V46H42",109:"41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q351 442 364 440T387 434T406 426T421 417T432 406T441 395T448 384T452 374T455 366L457 361L460 365Q463 369 466 373T475 384T488 397T503 410T523 422T546 432T572 439T603 442Q729 442 740 329Q741 322 741 190V104Q741 66 743 59T754 49Q775 46 803 46H819V0H811L788 1Q764 2 737 2T699 3Q596 3 587 0H579V46H595Q656 46 656 62Q657 64 657 200Q656 335 655 343Q649 371 635 385T611 402T585 404Q540 404 506 370Q479 343 472 315T464 232V168V108Q464 78 465 68T468 55T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41",110:"41 46H55Q94 46 102 60V68Q102 77 102 91T102 122T103 161T103 203Q103 234 103 269T102 328V351Q99 370 88 376T43 385H25V408Q25 431 27 431L37 432Q47 433 65 434T102 436Q119 437 138 438T167 441T178 442H181V402Q181 364 182 364T187 369T199 384T218 402T247 421T285 437Q305 442 336 442Q450 438 463 329Q464 322 464 190V104Q464 66 466 59T477 49Q498 46 526 46H542V0H534L510 1Q487 2 460 2T422 3Q319 3 310 0H302V46H318Q379 46 379 62Q380 64 380 200Q379 335 378 343Q372 371 358 385T334 402T308 404Q263 404 229 370Q202 343 195 315T187 232V168V108Q187 78 188 68T191 55T200 49Q221 46 249 46H265V0H257L234 1Q210 2 183 2T145 3Q42 3 33 0H25V46H41",111:"28 214Q28 309 93 378T250 448Q340 448 405 380T471 215Q471 120 407 55T250 -10Q153 -10 91 57T28 214ZM250 30Q372 30 372 193V225V250Q372 272 371 288T364 326T348 362T317 390T268 410Q263 411 252 411Q222 411 195 399Q152 377 139 338T126 246V226Q126 130 145 91Q177 30 250 30",112:"36 -148H50Q89 -148 97 -134V-126Q97 -119 97 -107T97 -77T98 -38T98 6T98 55T98 106Q98 140 98 177T98 243T98 296T97 335T97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 61 434T98 436Q115 437 135 438T165 441T176 442H179V416L180 390L188 397Q247 441 326 441Q407 441 464 377T522 216Q522 115 457 52T310 -11Q242 -11 190 33L182 40V-45V-101Q182 -128 184 -134T195 -145Q216 -148 244 -148H260V-194H252L228 -193Q205 -192 178 -192T140 -191Q37 -191 28 -194H20V-148H36ZM424 218Q424 292 390 347T305 402Q234 402 182 337V98Q222 26 294 26Q345 26 384 80T424 218",113:"33 218Q33 308 95 374T236 441H246Q330 441 381 372L387 364Q388 364 404 403L420 442H457V156Q457 -132 458 -134Q462 -142 470 -145Q491 -148 519 -148H535V-194H527L504 -193Q480 -192 453 -192T415 -191Q312 -191 303 -194H295V-148H311Q339 -148 360 -145Q369 -141 371 -135T373 -106V-41V49Q313 -11 236 -11Q154 -11 94 53T33 218ZM376 300Q346 389 278 401Q275 401 269 401T261 402Q211 400 171 350T131 214Q131 137 165 82T253 27Q296 27 328 54T376 118V300",114:"36 46H50Q89 46 97 60V68Q97 77 97 91T98 122T98 161T98 203Q98 234 98 269T98 328L97 351Q94 370 83 376T38 385H20V408Q20 431 22 431L32 432Q42 433 60 434T96 436Q112 437 131 438T160 441T171 442H174V373Q213 441 271 441H277Q322 441 343 419T364 373Q364 352 351 337T313 322Q288 322 276 338T263 372Q263 381 265 388T270 400T273 405Q271 407 250 401Q234 393 226 386Q179 341 179 207V154Q179 141 179 127T179 101T180 81T180 66V61Q181 59 183 57T188 54T193 51T200 49T207 48T216 47T225 47T235 46T245 46H276V0H267Q249 3 140 3Q37 3 28 0H20V46H36",115:"295 316Q295 356 268 385T190 414Q154 414 128 401Q98 382 98 349Q97 344 98 336T114 312T157 287Q175 282 201 278T245 269T277 256Q294 248 310 236T342 195T359 133Q359 71 321 31T198 -10H190Q138 -10 94 26L86 19L77 10Q71 4 65 -1L54 -11H46H42Q39 -11 33 -5V74V132Q33 153 35 157T45 162H54Q66 162 70 158T75 146T82 119T101 77Q136 26 198 26Q295 26 295 104Q295 133 277 151Q257 175 194 187T111 210Q75 227 54 256T33 318Q33 357 50 384T93 424T143 442T187 447H198Q238 447 268 432L283 424L292 431Q302 440 314 448H322H326Q329 448 335 442V310L329 304H301Q295 310 295 316",116:"27 422Q80 426 109 478T141 600V615H181V431H316V385H181V241Q182 116 182 100T189 68Q203 29 238 29Q282 29 292 100Q293 108 293 146V181H333V146V134Q333 57 291 17Q264 -10 221 -10Q187 -10 162 2T124 33T105 68T98 100Q97 107 97 248V385H18V422H27",117:"383 58Q327 -10 256 -10H249Q124 -10 105 89Q104 96 103 226Q102 335 102 348T96 369Q86 385 36 385H25V408Q25 431 27 431L38 432Q48 433 67 434T105 436Q122 437 142 438T172 441T184 442H187V261Q188 77 190 64Q193 49 204 40Q224 26 264 26Q290 26 311 35T343 58T363 90T375 120T379 144Q379 145 379 161T380 201T380 248V315Q380 361 370 372T320 385H302V431Q304 431 378 436T457 442H464V264Q464 84 465 81Q468 61 479 55T524 46H542V0Q540 0 467 -5T390 -11H383V58",118:"338 431Q344 429 422 429Q479 429 503 431H508V385H497Q439 381 423 345Q421 341 356 172T288 -2Q283 -11 263 -11Q244 -11 239 -2Q99 359 98 364Q93 378 82 381T43 385H19V431H25L33 430Q41 430 53 430T79 430T104 429T122 428Q217 428 232 431H240V385H226Q187 384 184 370Q184 366 235 234L286 102L377 341V349Q377 363 367 372T349 383T335 385H331V431H338",119:"90 368Q84 378 76 380T40 385H18V431H24L43 430Q62 430 84 429T116 428Q206 428 221 431H229V385H215Q177 383 177 368Q177 367 221 239L265 113L339 328L333 345Q323 374 316 379Q308 384 278 385H258V431H264Q270 428 348 428Q439 428 454 431H461V385H452Q404 385 404 369Q404 366 418 324T449 234T481 143L496 100L537 219Q579 341 579 347Q579 363 564 373T530 385H522V431H529Q541 428 624 428Q692 428 698 431H703V385H697Q696 385 691 385T682 384Q635 377 619 334L559 161Q546 124 528 71Q508 12 503 1T487 -11H479Q460 -11 456 -4Q455 -3 407 133L361 267Q359 263 266 -4Q261 -11 243 -11H238Q225 -11 220 -3L90 368",120:"201 0Q189 3 102 3Q26 3 17 0H11V46H25Q48 47 67 52T96 61T121 78T139 96T160 122T180 150L226 210L168 288Q159 301 149 315T133 336T122 351T113 363T107 370T100 376T94 379T88 381T80 383Q74 383 44 385H16V431H23Q59 429 126 429Q219 429 229 431H237V385Q201 381 201 369Q201 367 211 353T239 315T268 274L272 270L297 304Q329 345 329 358Q329 364 327 369T322 376T317 380T310 384L307 385H302V431H309Q324 428 408 428Q487 428 493 431H499V385H492Q443 385 411 368Q394 360 377 341T312 257L296 236L358 151Q424 61 429 57T446 50Q464 46 499 46H516V0H510H502Q494 1 482 1T457 2T432 2T414 3Q403 3 377 3T327 1L304 0H295V46H298Q309 46 320 51T331 63Q331 65 291 120L250 175Q249 174 219 133T185 88Q181 83 181 74Q181 63 188 55T206 46Q208 46 208 23V0H201",121:"69 -66Q91 -66 104 -80T118 -116Q118 -134 109 -145T91 -160Q84 -163 97 -166Q104 -168 111 -168Q131 -168 148 -159T175 -138T197 -106T213 -75T225 -43L242 0L170 183Q150 233 125 297Q101 358 96 368T80 381Q79 382 78 382Q66 385 34 385H19V431H26L46 430Q65 430 88 429T122 428Q129 428 142 428T171 429T200 430T224 430L233 431H241V385H232Q183 385 185 366L286 112Q286 113 332 227L376 341V350Q376 365 366 373T348 383T334 385H331V431H337H344Q351 431 361 431T382 430T405 429T422 429Q477 429 503 431H508V385H497Q441 380 422 345Q420 343 378 235T289 9T227 -131Q180 -204 113 -204Q69 -204 44 -177T19 -116Q19 -89 35 -78T69 -66",122:"42 263Q44 270 48 345T53 423V431H393Q399 425 399 415Q399 403 398 402L381 378Q364 355 331 309T265 220L134 41L182 40H206Q254 40 283 46T331 77Q352 105 359 185L361 201Q361 202 381 202H401V196Q401 195 393 103T384 6V0H209L34 1L31 3Q28 8 28 17Q28 30 29 31T160 210T294 394H236Q169 393 152 388Q127 382 113 367Q89 344 82 264V255H42V263",123:"434 -231Q434 -244 428 -250H410Q281 -250 230 -184Q225 -177 222 -172T217 -161T213 -148T211 -133T210 -111T209 -84T209 -47T209 0Q209 21 209 53Q208 142 204 153Q203 154 203 155Q189 191 153 211T82 231Q71 231 68 234T65 250T68 266T82 269Q116 269 152 289T203 345Q208 356 208 377T209 529V579Q209 634 215 656T244 698Q270 724 324 740Q361 748 377 749Q379 749 390 749T408 750H428Q434 744 434 732Q434 719 431 716Q429 713 415 713Q362 710 332 689T296 647Q291 634 291 499V417Q291 370 288 353T271 314Q240 271 184 255L170 250L184 245Q202 239 220 230T262 196T290 137Q291 131 291 1Q291 -134 296 -147Q306 -174 339 -192T415 -213Q429 -213 431 -216Q434 -219 434 -231",124:"139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139",125:"65 731Q65 745 68 747T88 750Q171 750 216 725T279 670Q288 649 289 635T291 501Q292 362 293 357Q306 312 345 291T417 269Q428 269 431 266T434 250T431 234T417 231Q380 231 345 210T298 157Q293 143 292 121T291 -28V-79Q291 -134 285 -156T256 -198Q202 -250 89 -250Q71 -250 68 -247T65 -230Q65 -224 65 -223T66 -218T69 -214T77 -213Q91 -213 108 -210T146 -200T183 -177T207 -139Q208 -134 209 3L210 139Q223 196 280 230Q315 247 330 250Q305 257 280 270Q225 304 212 352L210 362L209 498Q208 635 207 640Q195 680 154 696T77 713Q68 713 67 716T65 731",126:"179 251Q164 251 151 245T131 234T111 215L97 227L83 238Q83 239 95 253T121 283T142 304Q165 318 187 318T253 300T320 282Q335 282 348 288T368 299T388 318L402 306L416 295Q375 236 344 222Q330 215 313 215Q292 215 248 233T179 251",160:"",163:"699 578Q699 473 635 473Q597 473 595 508Q595 559 654 569V576Q654 619 637 648T581 677Q545 677 513 647T463 561Q460 554 437 464T414 371Q414 370 458 370H502Q508 364 508 362Q505 334 495 324H402L382 241Q377 224 373 206T366 180T361 163T358 151T354 142T350 133T344 120Q340 112 338 107T336 101L354 90Q398 63 422 54T476 44Q515 44 539 73T574 133Q578 144 580 146T598 148Q622 148 622 139Q622 138 620 130Q602 74 555 32T447 -11Q395 -11 317 38L294 51Q271 28 233 9T155 -10Q117 -10 103 5T88 39Q88 73 126 106T224 139Q236 139 247 138T266 134L273 132Q275 132 302 239L323 324H259Q253 330 253 332Q253 350 265 370H300L334 371L355 453Q356 457 360 477T366 501T372 522T379 545T387 565T397 587T409 606T425 627Q453 664 497 689T583 714Q640 714 669 676T699 578ZM245 76Q211 85 195 85Q173 85 158 71T142 42Q142 26 160 26H163Q211 30 245 76",165:"515 0Q494 3 374 3Q256 3 235 0H224V46H257Q316 47 324 58Q327 62 327 137V213H133Q121 213 113 213T97 213T86 213T78 213T73 214T70 215T69 216T68 218T67 220Q64 225 66 231T73 240Q76 242 202 242H327V273L247 407H115Q81 407 75 408T67 414Q64 419 66 425T73 434Q76 436 153 436Q228 436 228 437Q227 440 173 530T115 623Q101 637 31 637H11V683H20Q66 681 153 681Q169 681 202 681T262 682L288 683H298V637H280Q230 636 230 621Q230 619 250 584Q255 576 264 561T286 526T305 494L340 437L403 436H467L513 514Q564 596 564 605Q564 608 560 616Q550 634 517 637H508V683H516Q531 680 633 680Q722 680 731 683H738V637H723Q644 632 617 595Q614 591 568 515T521 437T597 436T676 434Q681 432 683 426T682 414T671 409T589 407H503L422 273V242H547Q673 242 676 240Q681 238 683 232T682 220Q682 219 682 218T681 217T679 216T677 215T672 214T664 213T652 213T637 213T616 213H422V139V87Q422 64 425 58T441 49Q456 46 503 46H525V0H515ZM449 406Q449 407 403 407Q358 407 358 406L370 387Q381 368 392 350L404 331Q447 404 449 406",168:"95 612Q95 633 112 651T153 669T193 652T210 612Q210 588 194 571T152 554L127 560Q95 577 95 612ZM289 611Q289 634 304 649T335 668Q336 668 340 668T346 669Q369 669 386 652T404 612T387 572T346 554Q323 554 306 570T289 611",172:"56 323T56 336T70 356H596Q603 353 611 343V102Q598 89 591 89Q587 89 584 90T579 94T575 98T572 102L571 209V316H70Q56 323 56 336",174:"915 266Q915 140 852 38T689 -120T474 -175Q312 -175 188 -71T38 190Q32 220 32 266V287Q32 345 57 416T129 545Q192 624 282 666T464 709Q513 709 522 708Q599 698 665 666T776 590T853 493T900 387T915 287V266ZM875 285Q875 339 853 399T789 517T676 616T519 668Q510 669 465 669Q380 669 299 630T155 514T77 336Q72 312 72 285V266V256Q72 123 163 11Q290 -135 474 -135Q614 -135 727 -46Q875 81 875 266V285ZM276 457Q275 458 274 460T272 463T270 465T267 467T264 469T258 471T252 472T243 473T232 474T218 474H204V514H335Q477 514 499 510Q560 502 610 467T661 375Q661 362 658 350T648 327T635 308T618 292T601 280T583 269T568 262T554 256L547 253Q548 252 556 247T570 237T586 223T602 202T614 174Q616 169 626 123T638 72Q652 23 683 23Q715 23 720 68Q721 78 724 81T740 84T756 82T760 70Q760 47 747 25T715 -7Q700 -14 673 -14Q672 -14 662 -14T643 -12T619 -7T593 2T568 16T547 37T534 67Q531 80 531 97Q531 103 531 116T532 136Q532 218 472 236Q466 238 413 239H360V148L361 58Q366 47 375 44T418 40H432V0H424Q409 3 318 3T212 0H204V40H218Q242 40 253 42T268 47T276 58V457ZM376 473Q365 471 363 464T360 430V366V276H416Q421 276 434 276T453 276T469 277T486 279T501 282T517 287T529 294T542 305Q561 324 561 375Q561 424 545 444T482 472Q478 473 427 474Q415 474 403 474T384 474L376 473",175:"69 544V590H430V544H69",176:"147 628Q147 669 179 692T244 715Q298 715 325 689T352 629Q352 592 323 567T249 542Q202 542 175 567T147 628ZM313 628Q313 660 300 669T259 678H253Q248 678 242 678T234 679Q217 679 207 674T192 659T188 644T187 629Q187 600 198 590Q210 579 250 579H265Q279 579 288 581T305 595T313 628",177:"56 320T56 333T70 353H369V502Q369 651 371 655Q376 666 388 666Q402 666 405 654T409 596V500V353H707Q722 345 722 333Q722 320 707 313H409V40H707Q722 32 722 20T707 0H70Q56 7 56 20T70 40H369V313H70Q56 320 56 333",180:"349 699Q367 699 380 686T393 656Q393 651 392 647T387 637T380 627T367 616T351 602T330 585T303 563L232 505L217 519Q203 533 204 533Q204 534 229 567T282 636T313 678L316 681Q318 684 321 686T328 692T337 697T349 699",183:"78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250",215:"630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29",240:"75 566V604Q75 624 79 629T102 635Q124 635 127 629T131 588L133 550L191 588L249 628L231 635Q176 654 124 657Q116 657 106 658L95 659Q94 661 94 687T95 715Q99 717 113 717Q195 717 282 679L309 668L331 681Q351 697 391 721Q428 748 435 748Q437 749 446 749Q470 749 473 746Q478 744 478 681V621Q466 615 456 615Q435 615 424 624L422 661V699L382 675L344 648Q353 639 366 630Q480 538 504 413Q509 393 509 333V313Q509 284 507 257T495 184T466 102T413 33T329 -16Q311 -21 275 -21Q226 -21 195 -10Q150 7 110 50T53 141Q42 179 42 227Q42 332 101 403T245 474Q282 474 314 461T359 436T380 415Q386 405 389 408Q389 426 378 475Q368 505 355 529T329 567T306 590T288 603L282 606L120 501Q116 500 102 500Q84 500 75 506V566ZM388 225Q388 376 309 410Q299 416 273 419Q216 419 191 390Q174 371 168 342T162 218Q162 112 184 79Q212 39 273 39Q312 39 342 62T380 121Q388 159 388 225",247:"318 466Q318 500 339 518T386 537Q418 537 438 517T458 466Q458 438 440 417T388 396Q355 396 337 417T318 466ZM56 237T56 250T70 270H706Q721 262 721 250T706 230H70Q56 237 56 250ZM318 34Q318 68 339 86T386 105Q418 105 438 85T458 34Q458 6 440 -15T388 -36Q355 -36 337 -15T318 34",305:"247 0Q232 3 143 3Q132 3 106 3T56 1L34 0H26V46H42Q70 46 91 49Q100 53 102 60T104 102V205V293Q104 345 102 359T88 378Q74 385 41 385H30V408Q30 431 32 431L42 432Q52 433 70 434T106 436Q123 437 142 438T171 441T182 442H185V62Q190 52 197 50T232 46H255V0H247",567:"28 -163Q58 -168 64 -168Q124 -168 135 -77Q137 -65 137 141T136 353Q132 371 120 377T72 385H52V408Q52 431 54 431L58 432Q62 432 70 432T87 433T108 434T133 436Q151 437 171 438T202 441T214 442H218V184Q217 -36 217 -59T211 -98Q195 -145 153 -175T58 -205Q9 -205 -23 -179T-55 -117Q-55 -94 -40 -79T-2 -64T36 -79T52 -118Q52 -143 28 -163",697:"79 43Q73 43 52 49T30 61Q30 68 85 293T146 528Q161 560 198 560Q218 560 240 545T262 501Q262 496 260 486Q259 479 173 263T84 45T79 43",710:"112 560L249 694L257 686Q387 562 387 560L361 531Q359 532 303 581L250 627L195 580Q182 569 169 557T148 538L140 532Q138 530 125 546L112 560",711:"114 611L127 630L136 644Q138 644 193 612Q248 581 250 581L306 612Q361 644 363 644L385 611L318 562L249 513L114 611",713:"69 544V590H430V544H69",714:"349 699Q367 699 380 686T393 656Q393 651 392 647T387 637T380 627T367 616T351 602T330 585T303 563L232 505L217 519Q203 533 204 533Q204 534 229 567T282 636T313 678L316 681Q318 684 321 686T328 692T337 697T349 699",715:"106 655Q106 671 119 685T150 699Q166 699 177 688Q190 671 222 629T275 561T295 533T282 519L267 505L196 563Q119 626 113 634Q106 643 106 655",728:"250 515Q179 515 138 565T92 683V694H129V689Q129 688 129 683T130 675Q137 631 169 599T248 567Q304 567 337 608T370 689V694H407V683Q403 617 361 566T250 515",729:"190 609Q190 637 208 653T252 669Q275 667 292 652T309 609Q309 579 292 564T250 549Q225 549 208 564T190 609",730:"147 628Q147 669 179 692T244 715Q298 715 325 689T352 629Q352 592 323 567T249 542Q202 542 175 567T147 628ZM313 628Q313 660 300 669T259 678H253Q248 678 242 678T234 679Q217 679 207 674T192 659T188 644T187 629Q187 600 198 590Q210 579 250 579H265Q279 579 288 581T305 595T313 628",732:"179 601Q164 601 151 595T131 584T111 565L97 577L83 588Q83 589 95 603T121 633T142 654Q165 668 187 668T253 650T320 632Q335 632 348 638T368 649T388 668L402 656L416 645Q375 586 344 572Q330 565 313 565Q292 565 248 583T179 601",768:"-394 655Q-394 671 -381 685T-350 699Q-334 699 -323 688Q-310 671 -278 629T-225 561T-205 533T-218 519L-233 505L-304 563Q-381 626 -387 634Q-394 643 -394 655",769:"-151 699Q-133 699 -120 686T-107 656Q-107 651 -108 647T-113 637T-120 627T-133 616T-149 602T-170 585T-197 563L-268 505L-283 519Q-297 533 -296 533Q-296 534 -271 567T-218 636T-187 678L-184 681Q-182 684 -179 686T-172 692T-163 697T-151 699",770:"-388 560L-251 694L-243 686Q-113 562 -113 560L-139 531Q-141 532 -197 581L-250 627L-305 580Q-318 569 -331 557T-352 538L-360 532Q-362 530 -375 546L-388 560",771:"-321 601Q-336 601 -349 595T-369 584T-389 565L-403 577L-417 588Q-417 589 -405 603T-379 633T-358 654Q-335 668 -313 668T-247 650T-180 632Q-165 632 -152 638T-132 649T-112 668L-98 656L-84 645Q-125 586 -156 572Q-170 565 -187 565Q-208 565 -252 583T-321 601",772:"-431 544V590H-70V544H-431",774:"-250 515Q-321 515 -362 565T-408 683V694H-371V689Q-371 688 -371 683T-370 675Q-363 631 -331 599T-252 567Q-196 567 -163 608T-130 689V694H-93V683Q-97 617 -139 566T-250 515",775:"-310 609Q-310 637 -292 653T-248 669Q-225 667 -208 652T-191 609Q-191 579 -208 564T-250 549Q-275 549 -292 564T-310 609",776:"-405 612Q-405 633 -388 651T-347 669T-307 652T-290 612Q-290 588 -306 571T-348 554L-373 560Q-405 577 -405 612ZM-211 611Q-211 634 -196 649T-165 668Q-164 668 -160 668T-154 669Q-131 669 -114 652T-96 612T-113 572T-154 554Q-177 554 -194 570T-211 611",778:"-353 628Q-353 669 -321 692T-256 715Q-202 715 -175 689T-148 629Q-148 592 -177 567T-251 542Q-298 542 -325 567T-353 628ZM-187 628Q-187 660 -200 669T-241 678H-247Q-252 678 -258 678T-266 679Q-283 679 -293 674T-308 659T-312 644T-313 629Q-313 600 -302 590Q-290 579 -250 579H-235Q-221 579 -212 581T-195 595T-187 628",779:"-292 701Q-278 701 -262 690T-246 658Q-246 649 -250 641Q-252 637 -297 574T-344 510L-378 528Q-378 530 -355 598T-327 676Q-316 701 -292 701ZM-126 701Q-112 701 -96 690T-80 658Q-80 649 -84 641Q-86 637 -131 574T-178 510L-212 528Q-212 530 -189 598T-161 676Q-150 701 -126 701",780:"-386 611L-373 630L-364 644Q-362 644 -307 612Q-252 581 -250 581L-194 612Q-139 644 -137 644L-115 611L-182 562L-251 513L-386 611",824:"-612 -215T-619 -215T-631 -212T-637 -204T-639 -197Q-639 -190 -634 -183Q-621 -157 -400 274T-176 707Q-173 716 -160 716Q-153 716 -148 712T-142 703T-140 696Q-140 691 -372 241T-608 -212Q-612 -215 -619 -215",913:"255 0Q240 3 140 3Q48 3 39 0H32V46H47Q119 49 139 88Q140 91 192 245T295 553T348 708Q351 716 366 716H376Q396 715 400 709Q402 707 508 390L617 67Q624 54 636 51T687 46H717V0H708Q699 3 581 3Q458 3 437 0H427V46H440Q510 46 510 64Q510 66 486 138L462 209H229L209 150Q189 91 189 85Q189 72 209 59T259 46H264V0H255ZM447 255L345 557L244 256Q244 255 345 255H447",914:"131 622Q124 629 120 631T104 634T61 637H28V683H229H267H346Q423 683 459 678T531 651Q574 627 599 590T624 512Q624 461 583 419T476 360L466 357Q539 348 595 302T651 187Q651 119 600 67T469 3Q456 1 242 0H28V46H61Q103 47 112 49T131 61V622ZM511 513Q511 560 485 594T416 636Q415 636 403 636T371 636T333 637Q266 637 251 636T232 628Q229 624 229 499V374H312L396 375L406 377Q410 378 417 380T442 393T474 417T499 456T511 513ZM537 188Q537 239 509 282T430 336L329 337H229V200V116Q229 57 234 52Q240 47 334 47H383Q425 47 443 53Q486 67 511 104T537 188",915:"128 619Q121 626 117 628T101 631T58 634H25V680H554V676Q556 670 568 560T582 444V440H542V444Q542 445 538 478T523 545T492 598Q454 634 349 634H334Q264 634 249 633T233 621Q232 618 232 339L233 61Q240 54 245 52T270 48T333 46H360V0H348Q324 3 182 3Q51 3 36 0H25V46H58Q100 47 109 49T128 61V619",916:"51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344",917:"128 619Q121 626 117 628T101 631T58 634H25V680H597V676Q599 670 611 560T625 444V440H585V444Q584 447 582 465Q578 500 570 526T553 571T528 601T498 619T457 629T411 633T353 634Q266 634 251 633T233 622Q233 622 233 621Q232 619 232 497V376H286Q359 378 377 385Q413 401 416 469Q416 471 416 473V493H456V213H416V233Q415 268 408 288T383 317T349 328T297 330Q290 330 286 330H232V196V114Q232 57 237 52Q243 47 289 47H340H391Q428 47 452 50T505 62T552 92T584 146Q594 172 599 200T607 247T612 270V273H652V270Q651 267 632 137T610 3V0H25V46H58Q100 47 109 49T128 61V619",918:"69 443Q69 452 74 554T80 683H549Q555 677 555 664Q555 649 554 648Q552 645 366 348T179 50T192 49T263 49H275H302Q333 49 353 50T401 59T447 78T482 115T507 173Q513 200 520 273V282H560V274Q560 272 552 143T543 8V0H302L61 1L58 3Q55 8 55 21V35Q59 43 153 193T340 489T432 637H343Q259 637 214 625T141 573Q109 523 109 445Q109 443 89 443H69",919:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H302Q262 636 251 634T233 622L232 500V378H517V622Q510 629 506 631T490 634T447 637H414V683H425Q446 680 569 680Q704 680 713 683H724V637H691Q651 636 640 634T622 622V61Q628 51 639 49T691 46H724V0H713Q692 3 569 3Q434 3 425 0H414V46H447Q489 47 498 49T517 61V332H232V197L233 61Q239 51 250 49T302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622",920:"56 340Q56 423 86 494T164 610T270 680T388 705Q521 705 621 601T722 341Q722 260 693 191T617 75T510 4T388 -22T267 3T160 74T85 189T56 340ZM610 339Q610 428 590 495T535 598T463 651T384 668Q332 668 289 638T221 566Q168 485 168 339Q168 274 176 235Q189 158 228 105T324 28Q356 16 388 16Q415 16 442 24T501 54T555 111T594 205T610 339ZM223 263V422H263V388H514V422H554V263H514V297H263V263H223",921:"328 0Q307 3 180 3T32 0H21V46H43Q92 46 106 49T126 60Q128 63 128 342Q128 620 126 623Q122 628 118 630T96 635T43 637H21V683H32Q53 680 180 680T328 683H339V637H317Q268 637 254 634T234 623Q232 620 232 342Q232 63 234 60Q238 55 242 53T264 48T317 46H339V0H328",922:"128 622Q121 629 117 631T101 634T58 637H25V683H36Q57 680 180 680Q315 680 324 683H335V637H313Q235 637 233 620Q232 618 232 462L233 307L379 449Q425 494 479 546Q518 584 524 591T531 607V608Q531 630 503 636Q501 636 498 636T493 637H489V683H499Q517 680 630 680Q704 680 716 683H722V637H708Q633 633 589 597Q584 592 495 506T406 419T515 254T631 80Q644 60 662 54T715 46H736V0H728Q719 3 615 3Q493 3 472 0H461V46H469Q515 46 515 72Q515 78 512 84L336 351Q332 348 278 296L232 251V156Q232 62 235 58Q243 47 302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V622",923:"320 708Q326 716 340 716H348H355Q367 716 372 708Q374 706 423 547T523 226T575 62Q581 52 591 50T634 46H661V0H653Q644 3 532 3Q411 3 390 0H379V46H392Q464 46 464 65Q463 70 390 305T316 539L246 316Q177 95 177 84Q177 72 198 59T248 46H253V0H245Q230 3 130 3Q47 3 38 0H32V46H45Q112 51 127 91Q128 92 224 399T320 708",924:"132 622Q125 629 121 631T105 634T62 637H29V683H135Q221 683 232 682T249 675Q250 674 354 398L458 124L562 398Q666 674 668 675Q671 681 683 682T781 683H887V637H854Q814 636 803 634T785 622V61Q791 51 802 49T854 46H887V0H876Q855 3 736 3Q605 3 596 0H585V46H618Q660 47 669 49T688 61V347Q688 424 688 461T688 546T688 613L687 632Q454 14 450 7Q446 1 430 1T410 7Q409 9 292 316L176 624V606Q175 588 175 543T175 463T175 356L176 86Q187 50 261 46H278V0H269Q254 3 154 3Q52 3 37 0H29V46H46Q78 48 98 56T122 69T132 86V622",925:"42 46Q74 48 94 56T118 69T128 86V634H124Q114 637 52 637H25V683H232L235 680Q237 679 322 554T493 303L578 178V598Q572 608 568 613T544 627T492 637H475V683H483Q498 680 600 680Q706 680 715 683H724V637H707Q634 633 622 598L621 302V6L614 0H600Q585 0 582 3T481 150T282 443T171 605V345L172 86Q183 50 257 46H274V0H265Q250 3 150 3Q48 3 33 0H25V46H42",926:"47 509L55 676Q55 677 333 677T611 676L619 509Q619 508 599 508T579 510Q579 529 575 557T564 589Q550 594 333 594T102 589Q95 586 91 558T87 510Q87 508 67 508T47 509ZM139 260V445H179V394H487V445H527V260H487V311H179V260H139ZM50 0L42 180H62Q82 180 82 178Q82 133 89 105Q92 93 95 90T108 86Q137 83 333 83Q530 83 558 86Q568 87 571 90T577 105Q584 133 584 178Q584 180 604 180H624L616 0H50",927:"56 340Q56 423 86 494T164 610T270 680T388 705Q521 705 621 601T722 341Q722 260 693 191T617 75T510 4T388 -22T267 3T160 74T85 189T56 340ZM467 647Q426 665 388 665Q360 665 331 654T269 620T213 549T179 439Q174 411 174 354Q174 144 277 61Q327 20 385 20H389H391Q474 20 537 99Q603 188 603 354Q603 411 598 439Q577 592 467 647",928:"128 619Q121 626 117 628T101 631T58 634H25V680H724V634H691Q651 633 640 631T622 619V61Q628 51 639 49T691 46H724V0H713Q692 3 569 3Q434 3 425 0H414V46H447Q489 47 498 49T517 61V634H232V348L233 61Q239 51 250 49T302 46H335V0H324Q303 3 180 3Q45 3 36 0H25V46H58Q100 47 109 49T128 61V619",929:"130 622Q123 629 119 631T103 634T60 637H27V683H214Q237 683 276 683T331 684Q419 684 471 671T567 616Q624 563 624 489Q624 421 573 372T451 307Q429 302 328 301H234V181Q234 62 237 58Q245 47 304 46H337V0H326Q305 3 182 3Q47 3 38 0H27V46H60Q102 47 111 49T130 61V622ZM507 488Q507 514 506 528T500 564T483 597T450 620T397 635Q385 637 307 637H286Q237 637 234 628Q231 624 231 483V342H302H339Q390 342 423 349T481 382Q507 411 507 488",931:"666 247Q664 244 652 126T638 4V0H351Q131 0 95 0T57 5V6Q54 12 57 17L73 36Q89 54 121 90T182 159L305 299L56 644L55 658Q55 677 60 681Q63 683 351 683H638V679Q640 674 652 564T666 447V443H626V447Q618 505 604 543T559 605Q529 626 478 631T333 637H294H189L293 494Q314 465 345 422Q400 346 400 340Q400 338 399 337L154 57Q407 57 428 58Q476 60 508 68T551 83T575 103Q595 125 608 162T624 225L626 251H666V247",932:"36 443Q37 448 46 558T55 671V677H666V671Q667 666 676 556T685 443V437H645V443Q645 445 642 478T631 544T610 593Q593 614 555 625Q534 630 478 630H451H443Q417 630 414 618Q413 616 413 339V63Q420 53 439 50T528 46H558V0H545L361 3Q186 1 177 0H164V46H194Q264 46 283 49T309 63V339V550Q309 620 304 625T271 630H244H224Q154 630 119 601Q101 585 93 554T81 486T76 443V437H36V443",933:"55 551Q55 604 91 654T194 705Q240 705 277 681T334 624T367 556T385 498L389 474L392 488Q394 501 400 521T414 566T438 615T473 659T521 692T584 705Q620 705 648 689T691 647T714 597T722 551Q722 540 719 538T699 536Q680 536 677 541Q677 542 677 544T676 548Q676 576 650 596T588 616H582Q538 616 505 582Q466 543 454 477T441 318Q441 301 441 269T442 222V61Q448 55 452 53T478 48T542 46H569V0H557Q533 3 389 3T221 0H209V46H236Q256 46 270 46T295 47T311 48T322 51T328 54T332 57T337 61V209Q337 383 333 415Q313 616 189 616Q154 616 128 597T101 548Q101 540 97 538T78 536Q63 536 59 538T55 551",934:"312 622Q310 623 307 625T303 629T297 631T286 634T270 635T246 636T211 637H184V683H196Q220 680 361 680T526 683H538V637H511Q468 637 447 635T422 631T411 622V533L425 531Q525 519 595 466T665 342Q665 301 642 267T583 209T506 172T425 152L411 150V61Q417 55 421 53T447 48T511 46H538V0H526Q502 3 361 3T196 0H184V46H211Q231 46 245 46T270 47T286 48T297 51T303 54T307 57T312 61V150H310Q309 151 289 153T232 166T160 195Q149 201 136 210T103 238T69 284T56 342Q56 414 128 467T294 530Q309 532 310 533H312V622ZM170 342Q170 207 307 188H312V495H309Q301 495 282 491T231 469T186 423Q170 389 170 342ZM415 188Q487 199 519 236T551 342Q551 384 539 414T507 459T470 481T434 491T415 495H410V188H415",935:"270 0Q252 3 141 3Q46 3 31 0H23V46H40Q129 50 161 88Q165 94 244 216T324 339Q324 341 235 480T143 622Q133 631 119 634T57 637H37V683H46Q64 680 172 680Q297 680 318 683H329V637H324Q307 637 286 632T263 621Q263 618 322 525T384 431Q385 431 437 511T489 593Q490 595 490 599Q490 611 477 622T436 637H428V683H437Q455 680 566 680Q661 680 676 683H684V637H667Q585 634 551 599Q548 596 478 491Q412 388 412 387Q412 385 514 225T620 62Q628 53 642 50T695 46H726V0H717Q699 3 591 3Q466 3 445 0H434V46H440Q454 46 476 51T499 64Q499 67 463 124T390 238L353 295L350 292Q348 290 343 283T331 265T312 236T286 195Q219 88 218 84Q218 70 234 59T272 46H280V0H270",936:"340 622Q338 623 335 625T331 629T325 631T314 634T298 635T274 636T239 637H212V683H224Q248 680 389 680T554 683H566V637H539Q479 637 464 635T439 622L438 407Q438 192 439 192Q443 193 449 195T474 207T507 232T536 276T557 344Q560 365 562 417T573 493Q587 536 620 544Q627 546 671 546H715L722 540V515Q714 509 708 509Q680 505 671 476T658 392T644 307Q599 177 451 153L438 151V106L439 61Q446 54 451 52T476 48T539 46H566V0H554Q530 3 389 3T224 0H212V46H239Q259 46 273 46T298 47T314 48T325 51T331 54T335 57T340 61V151Q126 178 117 406Q115 503 69 509Q55 509 55 526Q55 541 59 543T86 546H107H120Q150 546 161 543T184 528Q198 514 204 493Q212 472 213 420T226 316T272 230Q287 216 303 207T330 194L339 192Q340 192 340 407V622",937:"55 454Q55 503 75 546T127 617T197 665T272 695T337 704H352Q396 704 404 703Q527 687 596 615T666 454Q666 392 635 330T559 200T499 83V80H543Q589 81 600 83T617 93Q622 102 629 135T636 172L637 177H677V175L660 89Q645 3 644 2V0H552H488Q461 0 456 3T451 20Q451 89 499 235T548 455Q548 512 530 555T483 622T424 656T361 668Q332 668 303 658T243 626T193 560T174 456Q174 380 222 233T270 20Q270 7 263 0H77V2Q76 3 61 89L44 175V177H84L85 172Q85 171 88 155T96 119T104 93Q109 86 120 84T178 80H222V83Q206 132 162 199T87 329T55 454",8192:"",8193:"",8194:"",8195:"",8196:"",8197:"",8198:"",8201:"",8202:"",8203:"",8204:"",8211:"0 248V285H499V248H0",8212:"0 248V285H999V248H0",8213:"0 248V285H999V248H0",8214:"133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739",8215:"0 -62V-25H499V-62H0",8216:"64 494Q64 548 86 597T131 670T160 694Q163 694 172 685T182 672Q182 669 170 656T144 625T116 573T101 501Q101 489 102 489T107 491T120 497T138 500Q163 500 180 483T198 440T181 397T139 379Q110 379 87 405T64 494",8217:"78 634Q78 659 95 676T138 694Q166 694 189 668T212 579Q212 525 190 476T146 403T118 379Q114 379 105 388T95 401Q95 404 107 417T133 448T161 500T176 572Q176 584 175 584T170 581T157 576T139 573Q114 573 96 590T78 634",8220:"128 494Q128 528 137 560T158 616T185 658T209 685T223 694T236 685T245 670Q244 668 231 654T204 622T178 571T164 501Q164 489 165 489T170 491T183 497T201 500Q226 500 244 483T262 440T245 397T202 379Q173 379 151 405T128 494ZM332 494Q332 528 341 560T362 616T389 658T413 685T427 694T439 685T449 672Q449 669 437 656T411 625T383 573T368 501Q368 489 369 489T374 491T387 497T405 500Q430 500 448 483T466 440T449 397T406 379Q377 379 355 405T332 494",8221:"34 634Q34 659 50 676T93 694Q121 694 144 668T168 579Q168 525 146 476T101 403T73 379Q69 379 60 388T50 401Q50 404 62 417T88 448T116 500T131 572Q131 584 130 584T125 581T112 576T94 573Q69 573 52 590T34 634ZM238 634Q238 659 254 676T297 694Q325 694 348 668T372 579Q372 525 350 476T305 403T277 379Q273 379 264 388T254 401Q254 404 266 417T292 448T320 500T335 572Q335 584 334 584T329 581T316 576T298 573Q273 573 256 590T238 634",8224:"182 675Q195 705 222 705Q234 705 243 700T253 691T263 675L262 655Q262 620 252 549T240 454V449Q250 451 288 461T346 472T377 461T389 431Q389 417 379 404T346 390Q327 390 288 401T243 412H240V405Q245 367 250 339T258 301T261 274T263 225Q263 124 255 -41T239 -213Q236 -216 222 -216H217Q206 -216 204 -212T200 -186Q199 -175 199 -168Q181 38 181 225Q181 265 182 280T191 327T204 405V412H201Q196 412 157 401T98 390Q76 390 66 403T55 431T65 458T98 472Q116 472 155 462T205 449Q204 452 204 460T201 490T193 547Q182 619 182 655V675",8225:"181 658Q181 705 222 705T263 658Q263 633 252 572T240 497Q240 496 241 496Q243 496 285 507T345 519Q365 519 376 508T388 478Q388 466 384 458T375 447T361 438H344Q318 438 282 448T241 459Q240 458 240 456Q240 449 251 384T263 297Q263 278 255 267T238 253T222 250T206 252T190 266T181 297Q181 323 192 383T204 458Q204 459 203 459Q198 459 162 449T101 438H84Q74 443 70 446T61 457T56 478Q56 497 67 508T99 519Q117 519 159 508T203 496Q204 496 204 499Q204 507 193 572T181 658ZM181 202Q181 249 222 249T263 202Q263 185 259 161T249 103T240 48V41H243Q248 41 287 52T346 63T377 52T389 22Q389 8 379 -5T346 -19Q327 -19 288 -8T243 3H240V-4Q243 -24 249 -58T259 -117T263 -158Q263 -177 255 -188T238 -202T222 -205T206 -203T190 -189T181 -158Q181 -141 185 -117T195 -59T204 -4V3H201Q196 3 157 -8T98 -19Q76 -19 66 -6T55 22T65 49T98 63Q117 63 156 52T201 41H204V48Q201 68 195 102T185 161T181 202",8226:"55 251Q55 328 112 386T249 444T386 388T444 249Q444 171 388 113T250 55Q170 55 113 112T55 251",8230:"78 60Q78 84 95 102T138 120Q162 120 180 104T199 61Q199 36 182 18T139 0T96 17T78 60ZM525 60Q525 84 542 102T585 120Q609 120 627 104T646 61Q646 36 629 18T586 0T543 17T525 60ZM972 60Q972 84 989 102T1032 120Q1056 120 1074 104T1093 61Q1093 36 1076 18T1033 0T990 17T972 60",8242:"79 43Q73 43 52 49T30 61Q30 68 85 293T146 528Q161 560 198 560Q218 560 240 545T262 501Q262 496 260 486Q259 479 173 263T84 45T79 43",8245:"12 501Q12 527 31 542T63 558Q73 560 77 560Q114 560 128 528Q133 518 188 293T244 61Q244 56 223 50T195 43Q192 43 190 45T102 263T14 486Q12 496 12 501",8254:"69 544V590H430V544H69",8260:"423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750",8288:"",8289:"",8290:"",8291:"",8292:"",8407:"377 694Q377 702 382 708T397 714Q404 714 409 709Q414 705 419 690Q429 653 460 633Q471 626 471 615Q471 606 468 603T454 594Q411 572 379 531Q377 529 374 525T369 519T364 517T357 516Q350 516 344 521T337 536Q337 555 384 595H213L42 596Q29 605 29 615Q29 622 42 635H401Q377 673 377 694",8450:"684 131Q684 125 672 109T633 71T573 29T489 -5T386 -19Q330 -19 276 -3T174 46T91 134T44 261Q39 283 39 341T44 421Q66 538 143 611T341 699Q344 699 364 700T395 701Q449 698 503 677T585 655Q603 655 611 662T620 678T625 694T639 702Q650 702 657 690V481L653 474Q640 467 628 472Q624 476 618 496T595 541Q562 587 507 625T390 663H381Q337 663 299 625Q212 547 212 336Q212 249 233 179Q274 30 405 30Q533 30 641 130Q658 147 666 147Q671 147 677 143T684 131ZM250 625Q264 643 261 643Q238 635 214 620T161 579T110 510T79 414Q74 384 74 341T79 268Q89 213 113 169T164 101T217 61T260 39L277 34Q270 41 264 48Q199 111 181 254Q178 281 178 344T181 434Q200 559 250 625ZM621 565V625Q617 623 613 623Q603 619 590 619H575L588 605Q608 583 610 579L621 565",8459:"331 505Q331 519 382 574T472 629H480Q512 629 529 614T547 576Q547 555 534 532T520 504Q520 493 549 493Q590 493 623 506T668 533L681 546Q731 600 772 641T832 700T852 717Q857 717 860 711T865 697L866 690Q866 688 813 617T708 475T656 403Q682 403 714 404H771L780 416Q1004 707 1167 707Q1209 707 1225 689T1241 646Q1241 604 1209 547T1118 447Q1081 422 1034 405T952 382T888 374T857 370H852L826 334Q733 204 708 144Q691 104 691 76Q691 29 748 29Q768 31 791 48T831 83T862 122T881 146Q883 148 900 148H917Q921 143 921 140T914 127Q810 -8 723 -8Q611 -4 611 100Q611 142 631 191T676 275T721 337T742 367Q716 367 685 366H628L620 355Q618 352 558 268Q486 168 461 141Q405 79 339 34T215 -28Q188 -36 153 -36Q86 -36 58 -11T29 46Q29 82 55 120T123 158Q144 158 154 146T164 119Q164 102 143 89T100 75Q92 75 86 76T77 80T72 82Q67 82 67 60Q67 28 99 14T170 0Q214 0 272 47T419 224L505 340L518 357Q513 357 504 356T467 347T415 330T360 300T308 253Q296 238 295 237H278H274Q256 237 256 243Q256 248 263 256Q291 294 330 321T407 362T476 382T530 393T552 398Q556 402 573 423T600 454Q602 457 604 460T608 465L610 467Q565 455 532 455Q465 455 449 483Q447 487 447 498Q447 513 463 538T479 579Q479 593 463 593Q436 593 385 519Q374 504 371 502T360 499H353H349Q331 499 331 505ZM1195 634Q1195 643 1195 648T1185 662T1157 671Q1130 671 1092 644T1019 579T952 502T901 436L882 409L891 410Q900 411 913 412T934 415Q1081 439 1144 520Q1195 590 1195 634",8460:"11 -16L1 0Q7 6 25 27T57 62T91 88T128 101Q159 99 195 66L203 59L211 67Q239 95 239 133Q239 158 210 213T152 330T123 430Q123 477 173 536T269 630T320 666Q376 610 440 606H443Q457 606 466 611T519 647L542 664Q543 664 543 654V643L522 622Q434 537 403 537Q388 537 366 543T329 555T293 570T270 580L261 585L253 574Q206 517 206 475Q206 452 218 416T242 356L255 331Q256 331 270 345T324 391T421 459L437 468H453Q545 463 608 421L618 415L623 392Q644 307 644 233Q644 97 612 9Q604 -10 601 -15T581 -35Q505 -104 467 -124Q446 -133 431 -133Q414 -132 399 -126T376 -115T368 -107Q368 -106 392 -75L415 -43Q432 -67 444 -73T472 -79H474Q479 -79 484 -78T501 -69T521 -50T538 -13T551 46Q558 97 558 180Q558 232 557 245Q553 277 547 300T528 349T488 389T424 404Q344 404 276 295Q272 288 273 285Q300 216 300 168Q300 161 300 156T298 145T297 137T293 129T289 123T283 116T277 107Q212 23 178 -13L166 -26L149 -9Q108 32 81 32Q63 32 21 -7L11 -16",8461:"14 666Q14 675 26 683H344L351 679Q361 665 351 655Q344 648 317 648Q287 645 282 641Q270 637 269 623T266 497V370H511V497Q511 519 510 553Q509 615 507 626T496 641H495Q489 645 459 648Q420 648 420 665Q420 672 426 679L433 683H751Q762 676 762 666Q762 648 724 648Q684 645 677 632Q675 626 675 341Q675 57 677 52Q684 38 724 35Q762 35 762 16Q762 6 751 -1H433L426 3Q420 10 420 17Q420 35 459 35Q501 38 506 52Q511 64 511 190V323H266V190Q266 60 271 52Q276 38 317 35Q342 35 351 28Q360 17 351 3L344 -1H26Q14 5 14 16Q14 35 53 35Q94 38 99 52Q104 60 104 341T99 632Q93 645 53 648Q14 648 14 666ZM233 341V553Q233 635 239 648H131Q134 641 135 638T137 603T139 517T139 341Q139 131 138 89T132 37Q131 36 131 35H239Q233 47 233 129V341ZM639 341V489Q639 548 639 576T640 620T642 639T646 648H537L542 639Q546 625 546 341Q546 130 545 88T538 37Q537 36 537 35H646Q643 41 643 42T641 55T639 84T639 140V341",8462:"137 683Q138 683 209 688T282 694Q294 694 294 685Q294 674 258 534Q220 386 220 383Q220 381 227 388Q288 442 357 442Q411 442 444 415T478 336Q478 285 440 178T402 50Q403 36 407 31T422 26Q450 26 474 56T513 138Q516 149 519 151T535 153Q555 153 555 145Q555 144 551 130Q535 71 500 33Q466 -10 419 -10H414Q367 -10 346 17T325 74Q325 90 361 192T398 345Q398 404 354 404H349Q266 404 205 306L198 293L164 158Q132 28 127 16Q114 -11 83 -11Q69 -11 59 -2T48 16Q48 30 121 320L195 616Q195 629 188 632T149 637H128Q122 643 122 645T124 664Q129 683 137 683",8463:"150 475Q147 475 118 466T82 457Q73 457 64 467T54 487Q54 490 55 492Q63 506 64 506Q67 512 118 526Q162 541 169 546Q173 559 175 575Q181 596 181 604Q181 613 166 617Q164 617 153 618T135 619Q119 619 114 621T109 630Q109 636 114 656T122 681Q125 685 202 688Q272 695 286 695Q304 695 304 684Q304 682 291 628L278 577L386 612Q466 635 476 635T492 627T499 607Q499 593 489 586Q485 583 373 546L262 512Q262 511 248 455T233 397T236 397T244 404Q295 441 357 441Q405 441 445 417T485 333Q485 284 449 178T412 58T426 44Q447 44 466 68Q485 87 500 130L509 152H531H543Q562 152 562 144Q562 128 546 93T494 23T415 -13Q385 -13 359 3T322 44Q318 52 318 77Q318 99 352 196T386 337Q386 386 346 386Q318 386 286 370Q267 361 245 338T211 292Q207 287 193 235T162 113T138 21Q128 7 122 4Q105 -12 83 -12Q66 -12 54 -2T42 26Q42 45 98 257L151 475H150",8464:"487 225Q398 255 398 342Q398 410 455 492Q491 545 552 582T669 636T800 673T918 712Q930 717 933 717Q939 717 942 706T946 689Q946 686 915 664T830 591T729 480Q691 429 657 351T615 260Q628 260 663 279T733 339T769 426Q769 442 767 459T764 479Q764 484 766 486Q769 488 781 493T797 498Q802 498 803 494T808 472Q813 442 813 425Q813 369 761 315Q692 246 605 224L592 220L584 209Q547 155 487 106T358 25Q270 -17 191 -17Q143 -17 101 1T59 59Q59 96 85 127T148 158Q169 158 179 146T189 119Q189 102 167 89T125 75Q116 75 109 77T101 81T97 80Q96 77 96 72Q96 50 123 36T204 21H216Q249 21 302 49T411 134Q439 161 459 187Q487 220 487 225ZM460 334Q460 308 472 290T498 268L510 263Q515 263 545 313T626 438T723 561Q751 589 775 609T808 636T817 644H816Q813 644 732 618Q681 601 645 584T585 548T549 514T518 476Q460 390 460 334",8465:"190 601Q161 601 137 587T97 553T71 512T55 477T48 463Q44 465 39 468L30 473L35 488Q73 594 106 636T199 685Q200 686 211 686Q250 686 326 652T417 617Q435 617 455 626T497 652T522 670Q532 660 532 654Q469 591 390 550L378 543L343 556Q223 601 190 601ZM378 208Q378 249 369 318T360 424Q360 430 360 439T361 451L362 462Q416 526 482 571L495 580L503 577L511 575L499 562Q442 502 442 465Q442 436 452 368T462 246Q462 169 442 128T385 56Q292 -26 195 -26Q150 -26 104 14L96 21L43 -16Q43 -15 43 -14T41 -10T38 0L48 13Q76 50 123 97L150 125Q154 131 159 131Q166 131 171 116T182 81T193 53Q199 43 216 33T261 22Q307 22 344 68Q378 113 378 208",8466:"572 704Q607 704 607 693Q607 681 590 664H588Q586 664 584 664T578 663Q504 658 434 592T363 457Q363 426 386 401Q417 371 481 361Q490 360 527 360H562Q565 363 595 404T666 494T755 596T854 682T945 717Q986 717 1010 696T1035 637Q1035 593 996 531T873 414Q809 378 753 360T674 338T651 333Q650 333 633 308T588 245T544 185Q498 126 426 78L413 68H414Q498 47 575 47Q626 47 676 74T755 139L762 148H779H783Q802 148 802 142Q802 137 795 129Q760 81 691 33T544 -16Q470 -16 366 20L341 29L331 24Q239 -17 155 -17H141Q90 -17 61 -12T23 1T14 22Q14 44 39 65T103 95Q126 101 180 101Q224 101 258 98T309 90T330 86Q332 86 353 103T389 135Q401 146 412 158T431 179T450 203T466 225T485 252T505 280L535 322H509Q391 322 340 362T289 452Q289 495 321 547T396 630Q438 665 486 684T572 704ZM978 635Q978 644 977 650T973 661T968 668T961 673T954 676T946 678T938 680Q929 680 925 677Q893 659 795 531T682 377Q683 377 711 385T755 401T801 421T856 453T906 495Q927 516 952 557T978 635ZM274 50Q274 51 258 54T216 61T166 65Q160 65 151 65T140 64Q115 58 102 48T88 31Q88 20 159 20Q191 20 219 27T261 42L274 50",8467:"345 104T349 104T361 95T369 80T352 59Q268 -20 206 -20Q170 -20 146 3T113 53T99 104L94 129Q94 130 79 116T48 86T28 70Q22 70 15 79T7 94Q7 98 12 103T58 147L91 179V185Q91 186 91 191T92 200Q92 282 128 400T223 612T336 705Q397 705 397 636V627Q397 453 194 233Q185 223 180 218T174 211T171 208T165 201L163 186Q159 142 159 123Q159 17 208 17Q228 17 253 30T293 56T335 94Q345 104 349 104ZM360 634Q360 655 354 661T336 668Q328 668 322 666T302 645T272 592Q252 547 229 467T192 330L179 273Q179 272 186 280T204 300T221 322Q327 453 355 590Q360 612 360 634",8469:"20 664Q20 666 31 683H142Q256 683 258 681Q259 680 279 653T342 572T422 468L582 259V425Q582 451 582 490T583 541Q583 611 573 628T522 648Q500 648 493 654Q484 665 493 679L500 683H691Q702 676 702 666Q702 657 698 652Q688 648 680 648Q633 648 627 612Q624 601 624 294V-8Q616 -20 607 -20Q601 -20 596 -15Q593 -13 371 270L156 548L153 319Q153 284 153 234T152 167Q152 103 156 78T172 44T213 34Q236 34 242 28Q253 17 242 3L236 -1H36Q24 6 24 16Q24 34 56 34Q58 35 69 36T86 40T100 50T109 72Q111 83 111 345V603L96 619Q72 643 44 648Q20 648 20 664ZM413 419L240 648H120L136 628Q137 626 361 341T587 54L589 68Q589 78 589 121V192L413 419",8472:"300 74Q300 133 338 133Q350 133 356 126T363 109Q363 88 340 76Q340 71 342 62T358 39T393 26Q435 26 474 67T532 182T551 290Q551 325 535 349T484 373Q430 373 378 348T291 289T228 218T187 157T174 130Q254 30 265 10Q276 -15 276 -41Q276 -101 235 -158T142 -216Q112 -216 90 -195T67 -118Q67 -40 104 64L110 81Q81 118 81 174Q81 268 134 360T247 453Q252 453 255 451T258 447L259 445Q259 432 253 420Q251 416 242 416Q209 411 176 341T142 203Q142 193 143 184T146 170T149 165L158 180Q215 280 303 345T485 410Q548 410 586 368T625 255Q625 157 553 74T389 -10H383Q349 -10 325 14Q302 37 300 74ZM105 -123Q105 -134 106 -141T110 -158T122 -173T145 -178Q155 -178 160 -176Q184 -163 199 -132T214 -73Q214 -69 214 -66T213 -59T212 -53T209 -47T205 -41T199 -33T193 -25T184 -14T174 -1L165 10Q156 22 148 32L139 43Q138 43 130 15T113 -54T105 -123",8473:"16 666Q16 675 28 683H195Q334 683 370 682T437 672Q511 657 554 611T597 495Q597 343 404 309Q402 308 401 308Q381 303 319 303H261V181Q261 157 262 120Q262 60 267 50T304 36Q310 35 313 35Q352 35 352 17Q352 10 346 3L339 -1H28Q16 5 16 16Q16 35 53 35Q68 36 75 37T87 42T95 52Q98 61 98 341T95 630Q91 640 83 643T53 648Q16 648 16 666ZM235 35Q228 46 227 84Q226 129 226 337V621L230 635L237 648H128Q128 647 133 632Q136 620 136 341Q136 64 133 50L128 35H235ZM301 341H313Q339 341 354 344T389 362T417 410T426 498Q426 586 401 616T322 647Q301 647 293 643Q271 637 264 621Q261 617 261 479V341H301ZM429 350Q431 350 443 353T476 367T515 391T548 432T562 490Q562 550 524 592Q507 607 484 619Q481 621 448 635L433 639L439 621Q462 578 462 506Q462 448 454 413T437 366T428 350H429",8474:"480 -10Q480 -13 486 -24T507 -50T541 -80T588 -104T648 -114Q666 -114 688 -110T714 -106Q724 -106 728 -114T729 -130Q723 -145 663 -163T548 -181Q503 -181 463 -169T395 -139T343 -97T307 -56T284 -19L280 -3L262 1Q188 24 131 81Q57 155 37 275Q34 292 34 342T37 410Q58 528 131 601Q179 652 248 676T388 701Q485 701 562 661Q698 595 731 448Q742 410 742 341T731 235Q707 141 646 81Q616 50 575 27T493 -5L480 -10ZM568 342Q568 613 437 659L395 666Q329 666 286 626Q232 570 213 439Q210 408 210 342T213 246Q231 113 286 57Q309 37 342 23Q357 19 389 19Q420 19 437 23Q469 38 491 57Q568 134 568 342ZM174 341V354Q174 393 175 419T183 484T205 561T246 635L249 639Q246 639 224 627T193 608Q189 606 183 601T169 589T155 577Q69 491 69 344Q69 133 231 52Q247 42 247 46Q247 46 246 48Q231 69 222 85T200 141T177 239Q174 269 174 341ZM708 341Q708 410 689 467T640 556T588 606T546 630Q532 638 531 638Q530 638 531 635Q563 590 577 543Q602 472 602 341V316Q602 264 599 230T580 144T531 48Q529 44 532 45T546 52Q575 68 596 84T642 128T683 200T706 299Q708 327 708 341ZM391 -17H333Q329 -15 326 -15Q324 -15 324 -17Q324 -21 362 -68Q424 -130 506 -143Q518 -144 544 -144Q569 -144 577 -143L589 -141L575 -139Q544 -127 509 -101T453 -37L442 -19L391 -17",8475:"224 266Q185 266 156 286T127 354Q127 419 176 487T282 594Q346 642 433 679T615 717Q732 717 802 680L815 673Q824 680 840 690T860 700Q864 700 867 693T872 680L873 673Q873 668 858 659L845 651L853 642Q887 605 887 561Q887 500 840 439Q790 379 681 336Q693 312 693 292Q692 276 689 263T672 229T653 198T620 152L575 87Q557 57 557 33Q557 24 560 17T566 8L569 5Q546 5 508 25T470 76Q470 83 473 92T545 198T616 310Q616 317 615 318T612 319Q603 319 575 315H560L545 291Q492 201 429 135T277 23Q202 -17 142 -17H130Q50 -17 16 17Q-2 35 -2 57Q-2 95 24 126T88 158Q106 158 116 147T127 121Q127 110 122 102Q116 93 99 84T63 75Q58 75 53 76T47 77T45 75T44 67Q45 52 57 42T88 27T120 21T144 19Q174 19 208 36T267 76T324 134T369 189T406 239Q462 319 504 374T616 503T755 631L770 644Q767 647 753 654T697 670T602 680Q493 680 399 631T247 516Q218 485 193 440T168 359Q168 328 188 316T234 303Q255 303 273 315T304 340T343 389T390 448Q428 490 441 510T456 548Q456 557 458 559Q459 560 476 567T496 575Q505 575 505 558Q505 511 434 412Q429 406 427 403Q397 360 378 343Q342 308 300 287T224 266ZM819 564Q819 595 800 619L784 606Q729 557 692 512T605 387L591 365L610 364Q622 364 631 363T641 361Q643 361 651 363Q725 388 772 449T819 564ZM794 141Q794 123 725 63T612 3Q609 3 612 5Q612 5 615 7Q639 19 678 57T742 131L755 148H772H780Q794 148 794 141ZM588 -3Q590 0 593 0H594L593 -1Q592 -1 590 -2L588 -3",8476:"27 496Q31 569 102 627T234 685Q236 685 241 685T251 686Q287 686 318 672T367 638T399 598T418 564L423 550Q424 554 434 567T463 601T505 639T561 671T626 685Q672 685 688 659T710 572Q713 533 721 523T766 513Q781 513 787 514T794 516Q796 512 798 509T801 504T802 501T787 493Q702 461 624 401L607 389Q655 383 688 358L697 352V342Q699 330 699 297Q704 209 710 173T734 103Q751 69 765 69Q769 69 806 83L824 90V74Q823 73 759 24T693 -26Q692 -26 660 32L628 90L629 111Q631 159 631 177Q631 278 614 300Q584 340 523 340Q500 340 467 333T431 325Q429 325 429 322Q428 321 426 308T420 275T410 230T392 178T366 125L358 112L342 99Q306 70 269 38T213 -10T193 -26Q192 -26 163 0T116 26Q82 26 50 -8L42 -16L35 -8L27 0L35 10Q43 21 58 38T104 80T158 106Q179 106 218 65L235 48Q238 48 255 60T295 99T329 158Q352 231 352 359Q352 555 242 614Q210 628 187 628Q140 628 116 600T91 548Q91 522 138 464T185 382V376Q185 345 158 313T103 263L76 246Q74 244 64 253L54 260L65 267Q91 285 100 302Q111 318 111 337Q111 355 69 410T27 496ZM562 628Q504 628 443 507L435 491L436 479Q437 471 437 446Q437 396 432 351L529 389L602 426Q673 462 673 463H672Q644 470 637 483T622 553Q608 628 562 628",8477:"17 665Q17 672 28 683H221Q415 681 439 677Q461 673 481 667T516 654T544 639T566 623T584 607T597 592T607 578T614 565T618 554L621 548Q626 530 626 497Q626 447 613 419Q578 348 473 326L455 321Q462 310 473 292T517 226T578 141T637 72T686 35Q705 30 705 16Q705 7 693 -1H510Q503 6 404 159L306 310H268V183Q270 67 271 59Q274 42 291 38Q295 37 319 35Q344 35 353 28Q362 17 353 3L346 -1H28Q16 5 16 16Q16 35 55 35Q96 38 101 52Q106 60 106 341T101 632Q95 645 55 648Q17 648 17 665ZM241 35Q238 42 237 45T235 78T233 163T233 337V621L237 635L244 648H133Q136 641 137 638T139 603T141 517T141 341Q141 131 140 89T134 37Q133 36 133 35H241ZM457 496Q457 540 449 570T425 615T400 634T377 643Q374 643 339 648Q300 648 281 635Q271 628 270 610T268 481V346H284Q327 346 375 352Q421 364 439 392T457 496ZM492 537T492 496T488 427T478 389T469 371T464 361Q464 360 465 360Q469 360 497 370Q593 400 593 495Q593 592 477 630L457 637L461 626Q474 611 488 561Q492 537 492 496ZM464 243Q411 317 410 317Q404 317 401 315Q384 315 370 312H346L526 35H619L606 50Q553 109 464 243",8484:"39 -1Q29 9 29 12Q29 23 60 77T219 337L410 648H364Q261 648 210 628Q168 612 142 588T109 545T97 509T88 490Q85 489 80 489Q72 489 61 503L70 588Q72 607 75 628T79 662T81 675Q84 677 88 681Q90 683 341 683H592Q604 673 604 666Q604 662 412 348L221 37Q221 35 301 35Q406 35 446 48Q504 68 543 111T597 212Q602 239 617 239Q624 239 629 234T635 223Q635 215 621 113T604 8L597 1Q595 -1 317 -1H39ZM148 637L166 648H112V632Q111 629 110 622T108 612Q108 608 110 608T116 612T129 623T148 637ZM552 646Q552 648 504 648Q452 648 450 643Q448 639 266 343T77 37Q77 35 128 35H179L366 339L552 646ZM572 35Q581 89 581 97L561 77Q542 59 526 48L508 37L539 35H572",8486:"55 454Q55 503 75 546T127 617T197 665T272 695T337 704H352Q396 704 404 703Q527 687 596 615T666 454Q666 392 635 330T559 200T499 83V80H543Q589 81 600 83T617 93Q622 102 629 135T636 172L637 177H677V175L660 89Q645 3 644 2V0H552H488Q461 0 456 3T451 20Q451 89 499 235T548 455Q548 512 530 555T483 622T424 656T361 668Q332 668 303 658T243 626T193 560T174 456Q174 380 222 233T270 20Q270 7 263 0H77V2Q76 3 61 89L44 175V177H84L85 172Q85 171 88 155T96 119T104 93Q109 86 120 84T178 80H222V83Q206 132 162 199T87 329T55 454",8487:"126 584Q119 584 110 539T97 493Q95 490 73 490Q44 490 44 501Q44 515 62 590Q75 672 82 679Q84 684 177 684Q193 684 214 684T241 685Q265 685 271 682T277 664V648Q271 572 229 434T186 231Q186 173 203 132T247 70T302 42T360 33Q391 33 419 42T474 72T517 133T533 231Q533 297 491 437T442 648Q442 675 446 679Q448 684 542 684Q635 684 637 681Q640 678 657 594T675 501Q675 490 646 490Q624 490 622 493Q620 493 609 538T593 584Q591 585 585 585T569 586T551 588H513Q514 586 518 573T538 531T582 453Q647 340 660 277Q663 259 663 232Q663 194 657 177Q652 151 629 112T560 39Q495 -5 424 -19Q403 -22 360 -22Q318 -22 297 -19Q239 -8 193 18T120 74T80 131T62 177Q56 194 56 229Q56 281 74 328T137 453Q160 491 174 518T193 555T201 575T206 588H168Q160 587 150 587T134 586T126 584",8488:"148 590Q95 592 91 627V633L160 729H176Q169 713 169 705Q169 670 244 670Q269 670 305 672T357 675Q405 675 432 661T468 609Q469 605 469 596Q469 572 460 540Q433 463 301 372Q325 378 359 378Q431 378 472 350T519 297Q532 249 532 198Q532 115 500 40T442 -57Q335 -139 202 -139Q165 -139 125 -131L112 -129V-100Q112 -49 106 -33T75 -17Q55 -17 31 -35L22 -42L11 -26L22 -18Q94 36 151 36H160Q171 36 178 33T188 27T194 13T196 -5T197 -32Q198 -79 206 -90Q217 -107 251 -107Q336 -107 389 -33T442 155Q442 240 407 274Q362 319 285 319Q236 319 192 298Q188 298 181 309L224 372Q227 373 234 374T246 376T257 379T271 384T285 391T302 402T321 417Q384 471 384 540Q384 562 366 581T306 600Q292 600 233 595T148 590",8492:"256 262Q161 262 161 351Q161 408 203 471T289 570Q380 645 475 676T617 707L627 708Q637 708 644 708Q759 708 831 675L844 669L857 677Q892 700 896 700Q902 700 907 685Q907 683 907 681T908 678T909 676T909 673Q909 671 909 670T906 667T903 664T897 660T889 655L878 647L889 636Q928 598 928 548Q928 529 923 510T907 474T886 442T861 412T837 388T815 368T800 355Q847 323 847 270V263Q847 205 806 145Q766 82 695 37T564 -8Q527 -8 506 10T484 58Q484 85 501 117T543 172Q607 226 685 228Q695 228 698 226Q703 220 692 206Q684 194 682 193T665 191Q625 189 595 172T550 133T529 93T522 66Q522 29 576 29Q642 29 705 109Q785 211 785 270Q785 287 779 300T769 316T755 327L740 319Q682 290 634 290Q611 290 592 294H588L565 261Q559 252 544 231T522 201T504 178T481 151T455 123Q394 63 314 18T159 -28Q103 -28 67 -6T31 54Q31 88 57 123T123 158Q144 158 154 146T164 119Q164 102 142 89T100 75Q94 75 87 77T76 80L72 81Q69 78 69 65Q69 35 102 22T175 9Q184 9 198 11Q248 23 300 70T403 187T508 331T636 489T789 629L801 639Q796 642 786 647T732 661T633 670Q592 670 558 665Q481 651 409 613T286 520Q274 507 258 485T222 424T202 354Q202 299 269 299Q282 299 295 301T318 307T339 317T358 329T376 345T391 362T406 380T420 398T433 417T445 435Q496 512 496 547Q496 559 497 560T516 569Q526 574 530 574Q538 574 538 540Q538 414 427 325Q342 262 256 262ZM689 382Q708 382 753 375L765 387Q860 482 860 555Q860 594 839 610L822 592Q794 563 752 511T680 420T651 380Q655 381 660 381Q664 382 689 382ZM697 344Q692 345 681 345H675Q671 345 665 345T655 344T650 344L648 342Q646 339 645 338Q643 333 639 327H653Q670 329 676 330Q706 342 706 343Q702 344 697 344",8493:"299 585Q333 609 384 634T470 672L505 685Q506 685 513 662T531 613T548 580Q553 576 563 576Q575 576 605 585Q607 585 607 575V564Q537 532 496 527Q475 542 456 567T427 610T415 627Q410 627 398 618T382 603Q373 588 373 558T386 475T400 399Q400 337 366 303Q343 281 309 266T254 247T226 242L214 257Q214 258 223 260T251 272T287 299Q304 316 304 360Q304 396 289 451T274 532Q274 553 277 561V564H269Q205 558 172 501T139 358Q139 207 226 127T443 46Q448 46 457 46T470 47L485 48L601 106Q602 106 602 93V80Q551 48 517 25T474 -4T460 -13T443 -19Q409 -24 367 -24Q360 -24 351 -24T335 -23T326 -22Q190 -2 125 87T59 319V328Q62 412 96 487L101 500L118 512Q189 563 245 591L266 601L299 585",8496:"280 398L279 400Q278 402 277 405T275 413T272 426T271 443Q271 494 302 544T379 629T472 685T553 707H565H573Q630 707 664 689Q718 661 718 604Q718 548 662 492T553 436Q525 436 508 451T490 492Q490 534 531 579T619 630Q632 630 632 623Q632 619 624 606Q614 593 602 592T578 580Q566 568 549 541T532 497Q532 474 565 474Q577 474 587 476Q600 481 611 489Q630 503 651 535T672 596Q672 660 553 660H548Q494 660 450 616Q421 587 384 531T343 439Q341 420 344 415H345Q346 415 352 415T369 417T391 418Q421 418 440 412T466 398T473 382Q473 367 452 353T398 339Q370 339 348 345T315 359L304 366Q297 365 284 360T234 321T163 234Q120 160 120 117Q120 83 149 57T252 30Q311 30 357 60Q386 79 414 114T452 179Q454 186 454 200Q454 230 415 242Q401 246 373 246Q353 246 347 244Q328 236 313 219T288 184T274 149T265 121T261 109Q260 107 247 102T230 97Q223 97 223 105Q223 148 271 216T386 284Q446 284 483 260T520 195Q520 121 427 57T239 -8Q192 -8 152 2T79 46T46 133Q46 212 107 285T269 394L280 398ZM427 376Q427 377 402 380Q386 380 386 379L425 375L427 376",8497:"258 428Q258 489 322 562T482 685T661 735Q726 735 824 693T977 651Q990 651 990 644Q990 639 971 612T948 581Q947 580 938 580Q878 580 784 621T617 663Q544 663 480 635T379 568T320 492T299 431Q299 387 362 387Q404 387 438 402T493 438T527 486T546 531T551 563Q551 569 550 575T549 584T549 590Q551 593 563 602T579 611Q584 611 592 605T608 584T616 548Q616 513 595 477T554 423Q518 392 464 372T349 351Q258 351 258 428ZM324 187T305 187T286 196Q286 202 301 217Q327 242 383 262T484 290L527 297L567 356Q624 441 643 467T688 521Q715 550 752 581T795 613T804 603T808 587T778 547T702 444T626 300H637Q663 302 685 306L697 308L703 317Q745 376 792 400Q806 406 818 406Q849 406 849 375Q847 355 831 338T797 312T763 296L747 290Q744 289 735 266T724 241Q722 240 702 232T664 217T645 210Q638 210 638 218Q638 224 653 246T669 270Q669 271 668 271Q663 270 624 264L607 263Q570 199 529 152Q513 133 484 106T409 45T305 -13T193 -36Q109 -36 74 -10T39 50Q39 86 64 121T128 158Q171 158 171 121Q171 97 141 83Q125 75 107 75Q93 75 80 83Q76 71 76 62Q76 29 117 15T207 0Q324 0 494 248L501 258H495Q368 239 330 195Q324 187 305 187ZM775 335Q806 358 806 368Q805 369 804 369Q800 369 791 360Q774 336 775 335",8498:"457 681Q471 695 477 695Q485 695 497 681V12L484 -1H68Q55 14 55 19T68 39H457V328H215L211 335Q198 346 211 359L217 368H457V681",8499:"112 -7Q86 -7 58 6T30 48T54 103T113 130Q129 130 141 121T153 94Q153 71 132 59T90 47H80Q95 30 133 30Q180 30 228 63T311 137T402 249T500 361Q566 425 703 529T910 693Q942 721 945 721T958 716T970 709Q974 704 964 691Q961 688 905 622T847 554L595 181Q553 121 527 77T496 19L492 5Q497 5 531 46Q579 98 685 224T850 409L972 524Q994 543 1004 556Q1012 567 1097 643T1186 720Q1194 720 1206 715T1215 703Q1215 701 1191 671T1133 599T1080 530Q1036 461 983 357T862 152Q802 64 799 17Q799 7 800 5T811 2Q836 2 882 37T969 126Q972 130 974 134T978 138T983 139T996 140H1012Q1018 134 1018 132Q1018 122 981 83T889 4T795 -35Q761 -35 745 -12T728 48Q728 122 781 190Q833 269 890 370L927 434L914 422Q848 360 752 245Q643 117 582 51T498 -33T461 -50Q424 -48 424 -4Q424 84 481 172L714 495Q591 406 523 333Q507 316 430 226T313 95Q263 48 221 24T162 -4T120 -7H112",8501:"55 613Q55 643 61 663T74 688T85 694Q94 694 94 681Q98 632 134 588L412 285Q416 311 430 397T447 509V519L438 526Q407 554 398 571T388 617T394 664T407 688T418 694Q425 694 427 684Q429 675 454 635T488 586Q490 584 496 579T513 563T537 540Q555 516 555 487Q555 460 549 441T537 416T528 409Q519 409 517 415T513 435T503 463Q492 481 490 481Q454 264 454 246Q454 237 479 212T529 152T555 79Q555 32 538 9Q531 1 524 1Q516 1 516 13Q512 62 476 106Q468 115 337 258T195 412L193 406Q191 401 189 394T183 377T176 352T171 322T167 284T165 240Q165 224 166 220Q171 199 211 152T252 70Q252 45 235 29T203 8T175 1Q170 0 115 0H79Q60 0 58 3T55 20Q55 31 58 34Q60 37 76 37Q112 39 126 46T140 70Q140 96 112 148T83 236Q83 281 102 334T140 419T159 452Q55 556 55 613",8502:"56 706V726Q56 763 76 763Q83 763 87 759T98 741Q108 726 116 721L127 717L340 715Q547 712 564 709Q575 705 587 692Q599 680 605 663L609 650V137H676Q687 124 687 115Q687 110 678 100T622 43L558 -21H-9Q-22 -6 -22 -1T-13 14T42 72L107 137H569V339Q569 541 567 546Q558 555 554 557L545 563H329Q118 566 101 569Q90 573 78 586Q54 610 54 661Q54 670 56 706",8503:"56 750Q68 764 76 764Q88 764 97 743T125 717Q131 715 240 715T358 713Q421 691 421 640Q421 608 399 588T358 566Q353 566 352 565T351 557L356 526Q356 488 379 346T402 97Q400 21 385 -12Q366 -43 351 -43Q335 -43 329 -10Q316 40 316 64Q316 67 315 67Q313 67 269 26L222 -21H-9Q-22 -7 -22 -1Q-22 4 -14 14T42 73L107 137H311V564H211H164Q115 564 93 573T60 615Q56 630 56 690V750",8504:"62 757Q69 764 75 764Q87 764 97 741Q102 731 105 728T117 721L129 715H349Q569 715 580 710Q618 701 635 670Q640 661 640 639Q640 609 622 590Q617 583 604 575T580 566H573V553Q575 547 576 531T582 469T600 353Q624 205 624 104Q624 46 617 17T591 -32Q581 -43 573 -43Q550 -43 540 44Q535 73 533 319V564H322Q117 566 100 570Q90 573 77 586Q54 609 54 663Q54 689 55 706Q55 738 56 745T62 757",8513:"239 665Q194 665 154 653T90 629T66 617Q59 617 53 623T46 637Q46 652 66 659Q129 695 197 701Q218 705 248 705Q293 705 335 693Q371 684 435 644Q543 562 573 417Q577 393 577 341Q577 290 573 266Q531 83 384 10Q346 -9 315 -16T234 -23H206Q202 -23 183 -23T152 -21T120 -18T88 -10T63 3T44 24L37 35V297L50 310H235Q248 297 248 290Q248 285 235 270H77V103Q77 88 77 80T77 63T78 50T80 43T82 38T85 35T89 32T95 30Q126 20 206 17Q289 17 330 30Q407 55 460 120T533 275Q538 305 538 342Q538 486 452 575T239 665",8592:"944 261T944 250T929 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270H929Q944 261 944 250",8593:"27 414Q17 414 17 433Q17 437 17 439T17 444T19 447T20 450T22 452T26 453T30 454T36 456Q80 467 120 494T180 549Q227 607 238 678Q240 694 251 694Q259 694 261 684Q261 677 265 659T284 608T320 549Q340 525 363 507T405 479T440 463T467 455T479 451Q483 447 483 433Q483 413 472 413Q467 413 458 416Q342 448 277 545L270 555V-179Q262 -193 252 -193H250H248Q236 -193 230 -179V555L223 545Q192 499 146 467T70 424T27 414",8594:"56 237T56 250T70 270H835Q719 357 692 493Q692 494 692 496T691 499Q691 511 708 511H711Q720 511 723 510T729 506T732 497T735 481T743 456Q765 389 816 336T935 261Q944 258 944 250Q944 244 939 241T915 231T877 212Q836 186 806 152T761 85T740 35T732 4Q730 -6 727 -8T711 -11Q691 -11 691 0Q691 7 696 25Q728 151 835 230H70Q56 237 56 250",8595:"473 86Q483 86 483 67Q483 63 483 61T483 56T481 53T480 50T478 48T474 47T470 46T464 44Q428 35 391 14T316 -55T264 -168Q264 -170 263 -173T262 -180T261 -184Q259 -194 251 -194Q242 -194 238 -176T221 -121T180 -49Q169 -34 155 -21T125 2T95 20T67 33T44 42T27 47L21 49Q17 53 17 67Q17 87 28 87Q33 87 42 84Q158 52 223 -45L230 -55V312Q230 391 230 482T229 591Q229 662 231 676T243 693Q244 694 251 694Q264 692 270 679V-55L277 -45Q307 1 353 33T430 76T473 86",8596:"263 479Q267 501 271 506T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270H835Q729 349 696 475Q691 493 691 500Q691 511 711 511Q720 511 723 510T729 506T732 497T735 481T743 456Q765 389 816 336T935 261Q944 258 944 250Q944 244 939 241T915 231T877 212Q836 186 806 152T761 85T740 35T732 4Q730 -6 727 -8T711 -11Q691 -11 691 0Q691 7 696 25Q728 151 835 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q144 292 194 349T263 479",8597:"27 492Q17 492 17 511Q17 515 17 517T17 522T19 525T20 528T22 530T26 531T30 532T36 534Q80 545 120 572T180 627Q210 664 223 701T238 755T250 772T261 762Q261 757 264 741T282 691T319 628Q352 589 390 566T454 536L479 529Q483 525 483 511Q483 491 472 491Q467 491 458 494Q342 526 277 623L270 633V-133L277 -123Q307 -77 353 -45T430 -2T473 8Q483 8 483 -11Q483 -15 483 -17T483 -22T481 -25T480 -28T478 -30T474 -31T470 -32T464 -34Q407 -49 364 -84T300 -157T270 -223T261 -262Q259 -272 250 -272Q242 -272 239 -255T223 -201T180 -127Q169 -112 155 -99T125 -76T95 -58T67 -45T44 -36T27 -31L21 -29Q17 -25 17 -11Q17 9 28 9Q33 9 42 6Q158 -26 223 -123L230 -133V633L223 623Q192 577 146 545T70 502T27 492",8598:"204 662Q257 662 301 676T369 705T394 720Q398 720 407 711T417 697Q417 688 389 671T310 639T212 623Q176 623 153 628Q151 628 221 557T546 232Q942 -164 943 -168Q944 -170 944 -174Q944 -182 938 -188T924 -195Q922 -195 916 -193Q912 -191 517 204Q440 281 326 394T166 553L121 598Q126 589 126 541Q126 438 70 349Q59 332 52 332Q48 332 39 341T29 355Q29 358 38 372T57 407T77 464T86 545Q86 583 78 614T63 663T55 683Q55 693 65 693Q73 693 82 688Q136 662 204 662",8599:"582 697Q582 701 591 710T605 720Q607 720 630 706T697 677T795 662Q830 662 863 670T914 686T934 694Q942 694 944 685Q944 680 936 663T921 615T913 545Q913 490 927 446T956 379T970 355Q970 351 961 342T947 332Q940 332 929 349Q874 436 874 541Q874 590 878 598L832 553Q787 508 673 395T482 204Q87 -191 83 -193Q77 -195 75 -195Q67 -195 61 -189T55 -174Q55 -170 56 -168Q58 -164 453 232Q707 487 777 557T847 628Q824 623 787 623Q689 623 599 679Q582 690 582 697",8600:"55 675Q55 683 60 689T75 695Q77 695 83 693Q87 691 482 296Q532 246 605 174T717 62T799 -20T859 -80T878 -97Q874 -93 874 -41Q874 64 929 151Q940 168 947 168Q951 168 960 159T970 145Q970 143 956 121T928 54T913 -45Q913 -83 920 -114T936 -163T944 -185Q942 -194 934 -194Q932 -194 914 -186T864 -170T795 -162Q743 -162 698 -176T630 -205T605 -220Q601 -220 592 -211T582 -197Q582 -187 611 -170T691 -138T787 -123Q824 -123 847 -128Q848 -128 778 -57T453 268Q58 664 56 668Q55 670 55 675",8601:"126 -41Q126 -92 121 -97Q121 -98 139 -80T200 -20T281 61T394 173T517 296Q909 690 916 693Q922 695 924 695Q932 695 938 689T944 674Q944 670 943 668Q942 664 546 268Q292 13 222 -57T153 -128Q176 -123 212 -123Q310 -123 400 -179Q417 -190 417 -197Q417 -201 408 -210T394 -220Q392 -220 369 -206T302 -177T204 -162Q131 -162 67 -194Q63 -195 59 -192T55 -183Q55 -180 62 -163T78 -115T86 -45Q86 10 72 54T44 120T29 145Q29 149 38 158T52 168Q59 168 70 151Q126 62 126 -41",8602:"942 250Q942 244 928 230H511L457 148Q440 124 420 93Q404 68 400 64T389 60Q381 60 375 66T368 81Q368 88 415 159L462 230H175L188 214Q210 188 235 145T264 85Q264 75 260 74T231 72L206 74L191 103Q169 142 164 150Q130 195 64 239Q56 244 56 250T64 261Q115 294 142 323T191 397L206 428H231Q255 428 259 426T264 414Q260 397 235 355T188 288L175 272L331 270Q488 270 491 272Q491 275 542 352T597 432Q602 437 609 437Q617 437 622 432T628 417T582 341L537 272L735 270H931Q942 257 942 250",8603:"54 250Q54 258 66 270H277L488 272L542 350Q596 431 602 435Q604 437 609 437Q617 437 622 432T628 417T582 341L537 272L608 270H751L822 272L808 288Q786 313 761 355T733 414Q733 424 737 426T766 428H793L806 397Q829 354 864 314Q896 284 928 263Q942 257 942 250T928 237Q887 208 864 185Q829 147 806 103L793 74L766 72Q742 72 738 73T733 85Q735 102 756 137T797 198L817 225L822 230H511L457 148Q440 124 420 93Q404 68 400 64T389 60Q381 60 375 66T368 81Q368 88 415 159L462 230H264L66 232Q54 239 54 250",8606:"56 250Q103 277 142 322T199 417H221Q244 417 244 416Q244 414 237 397T208 344T158 278L151 270H276L285 277Q322 306 349 345T388 417H434Q434 413 424 392T393 338T349 279L340 270H634Q933 270 937 266L938 265Q944 259 944 250T938 235L937 234Q933 230 634 230H340L349 221Q372 196 393 163T424 108T434 83H388Q377 116 350 155T285 223L276 230H151L158 222Q186 191 207 156T236 104T244 84Q244 83 221 83H199Q181 133 142 178T56 250",8608:"943 250Q895 221 856 177T801 83H778Q755 83 755 84Q755 86 762 103T791 156T841 222L848 230H723L714 223Q677 194 650 155T611 83H565Q565 87 575 108T606 162T650 221L659 230H365Q66 230 62 234L61 235Q55 241 55 250T61 265L62 266Q66 270 365 270H659L650 279Q627 304 606 337T575 392T565 417H611Q622 384 649 345T714 277L723 270H848L841 278Q813 309 792 344T763 396T755 416Q755 417 778 417H801Q817 367 856 323T943 250",8610:"56 250Q103 277 142 322T199 417H221Q244 417 244 416Q244 414 237 397T208 344T158 278L151 270H873L882 277Q919 306 946 345T985 417H1031Q1031 413 1021 392T990 338T946 279L937 270V230L946 221Q969 196 990 163T1021 108T1031 83H985Q974 116 947 155T882 223L873 230H151L158 222Q186 191 207 156T236 104T244 84Q244 83 221 83H199Q181 133 142 178T56 250",8611:"1054 250Q1006 221 967 177T912 83H889Q866 83 866 84Q866 86 873 103T902 156T952 222L959 230H237L228 223Q191 194 164 155T125 83H79Q79 87 89 108T120 162T164 221L173 230V270L164 279Q141 304 120 337T89 392T79 417H125Q136 384 163 345T228 277L237 270H959L952 278Q924 309 903 344T874 396T866 416Q866 417 889 417H912Q928 367 967 323T1054 250",8614:"95 155V109Q95 83 92 73T75 63Q61 63 58 74T54 130Q54 140 54 180T55 250Q55 421 57 425Q61 437 75 437Q88 437 91 428T95 393V345V270H835Q719 357 692 493Q692 494 692 496T691 499Q691 511 708 511H711Q720 511 723 510T729 506T732 497T735 481T743 456Q765 389 816 336T935 261Q944 258 944 250Q944 244 939 241T915 231T877 212Q836 186 806 152T761 85T740 35T732 4Q730 -6 727 -8T711 -11Q691 -11 691 0Q691 7 696 25Q728 151 835 230H95V155",8617:"903 424T903 444T929 464Q976 464 1023 434T1070 347Q1070 316 1055 292T1016 256T971 237T929 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270H926Q929 270 941 271T960 275T978 280T998 290T1015 307Q1030 325 1030 347Q1030 355 1027 364T1014 387T983 411T929 424H928Q903 424 903 444",8618:"55 347Q55 380 72 404T113 441T159 458T197 464Q222 464 222 444Q222 429 204 426T157 417T110 387Q95 369 95 347Q95 339 98 330T111 307T142 283T196 270H961Q845 357 818 493Q818 494 818 496T817 499Q817 511 834 511H837Q846 511 849 510T855 506T858 497T861 481T869 456Q891 389 942 336T1061 261Q1070 258 1070 250Q1070 244 1065 241T1041 231T1003 212Q962 186 932 152T887 85T866 35T858 4Q856 -6 853 -8T837 -11Q817 -11 817 0Q817 7 822 25Q854 151 961 230H196Q149 230 102 260T55 347",8619:"56 250Q103 277 142 322T199 417H221Q244 417 244 416Q244 414 237 397T208 344T158 278L151 270H622V305Q622 356 624 388T635 460T661 521T709 559T785 575Q813 575 833 573T880 561T923 534T952 483T964 405Q964 374 959 350T942 307T918 276T884 255T847 242T804 235T760 231T713 230H662V-27Q654 -41 644 -41H642H640Q628 -41 622 -27V230H151L158 222Q186 191 207 156T236 104T244 84Q244 83 221 83H199Q181 133 142 178T56 250ZM924 403Q924 474 894 505T794 536Q758 536 734 526T696 500T675 453T665 395T662 319V270H699Q826 270 875 295T924 403",8620:"35 405Q35 454 48 489T86 542T137 567T195 575Q229 575 251 571T301 554T345 510T370 429Q377 384 377 305V270H848L841 278Q813 309 792 344T763 396T755 416Q755 417 778 417H801Q817 367 856 323T943 250Q896 221 857 177T801 83H778Q755 83 755 84Q755 86 762 103T791 156T841 222L848 230H377V-27Q369 -41 359 -41H357Q342 -41 337 -25V230H286Q247 231 225 232T169 238T115 255T75 284T45 333T35 405ZM75 406Q75 322 123 296T300 270H337V319Q335 432 317 477T240 534Q232 535 197 535Q140 535 108 507T75 406",8621:"57 250Q159 311 200 417H246L242 407Q215 340 159 278L152 270H276L315 310Q354 349 358 351Q366 356 376 351Q378 350 455 273L530 196L606 273Q683 350 686 351Q694 354 703 351Q705 350 782 273L858 196L933 273Q1010 350 1012 351Q1022 356 1030 351Q1034 349 1073 310L1112 270H1236L1229 278Q1173 340 1146 407L1142 417H1188Q1233 306 1331 250Q1231 192 1188 83H1142L1146 93Q1173 160 1229 222L1236 230H1168Q1155 230 1139 230T1119 229Q1112 229 1108 229T1099 231T1092 233T1085 238T1078 245T1068 256T1056 269L1021 304L984 267Q948 230 910 191T867 149Q857 144 848 150Q844 151 770 227T694 304T618 228T540 150Q531 144 521 149Q517 152 479 191T404 267L367 304L332 269Q328 264 320 256T310 246T303 239T296 234T289 231T280 229T269 229Q265 229 249 229T220 230H152L159 222Q215 160 242 93L246 83H223L200 84L195 96Q152 190 57 250",8622:"491 272Q491 275 542 352T597 432Q602 437 609 437Q617 437 622 432T628 417T582 341L537 272L608 270H751L822 272L808 288Q786 313 761 355T733 414Q733 424 737 426T766 428H793L806 397Q829 354 864 314Q896 284 928 263Q942 257 942 250T928 237Q887 208 864 185Q829 147 806 103L793 74L766 72Q742 72 738 73T733 85Q735 102 756 137T797 198L817 225L822 230H511L457 148Q440 124 420 93Q404 68 400 64T389 60Q381 60 375 66T368 81Q368 88 415 159L462 230H175L188 214Q210 188 235 145T264 85Q264 75 260 74T231 72L206 74L191 103Q169 142 164 150Q130 195 64 239Q56 244 56 250T64 261Q115 294 142 323T191 397L206 428H231Q255 428 259 426T264 414Q260 397 235 355T188 288L175 272L331 270Q488 270 491 272",8624:"56 555Q74 567 79 570T107 592T141 625T170 667T198 722H221Q244 722 244 721Q244 718 236 699T207 647T161 587L151 576L291 575H292H293H294H296H297H298H299H300H301H302H304H305H306H307H308H309H310H311H312H314H315H316H317H318H319H320H321H322H323H324H325H327H328H329H330H331H332H333H334H335H336H337H338H339H340H341H342H343H345Q435 574 438 570L439 569L440 568Q444 564 444 287Q444 15 442 12Q436 0 424 0T406 12Q404 15 404 275V535H151L162 523Q187 495 207 462T236 410T244 389H198L193 402Q171 457 131 497T56 555",8625:"301 722Q339 618 443 555L437 551Q431 547 422 541T401 526T377 504T352 477T327 443T306 402L301 389H255Q255 392 263 410T291 461T337 523L348 535H95V275Q95 15 93 12Q87 0 75 0T57 12Q55 15 55 287Q55 564 59 568L60 569Q64 573 76 573T208 575L348 576L338 587Q314 613 294 646T264 698T255 721Q255 722 278 722H301",8630:"361 210Q373 210 373 182V177Q373 155 370 151T348 139Q303 118 267 84T216 28T201 1Q197 -1 196 -1Q189 -1 184 8Q166 39 143 64T99 104T61 129T32 144T19 150Q17 152 17 179Q17 203 21 208Q28 210 39 206Q106 178 157 135L175 119V126Q179 130 179 155Q182 173 193 201Q228 305 312 374T510 459Q532 461 551 461H567Q678 461 784 386Q835 344 861 301Q902 245 926 173T950 32Q950 15 944 8Q930 -6 917 8Q910 12 910 43Q901 208 801 314T561 421Q453 421 359 359Q300 319 263 258T217 126L216 125Q216 124 216 123T217 122Q219 122 229 131T260 156T301 181Q314 189 336 199T361 210",8631:"972 209Q980 209 981 204T982 179Q982 155 979 151T957 139Q915 121 878 86T815 8Q808 -1 803 -1Q801 -1 797 1Q797 6 783 28T732 84T650 139L628 150Q626 152 626 177Q626 201 630 206Q636 210 637 210Q650 210 697 181Q727 166 764 137L784 119L782 132Q767 239 689 318T499 417Q474 421 442 421Q343 421 261 369T130 219Q86 121 86 28Q86 15 79 8Q73 1 66 1T53 8Q46 15 46 30Q46 102 77 192T186 361Q274 443 386 459Q396 460 426 460Q515 460 588 431T703 361T773 271T812 187T822 132Q822 123 825 123Q936 209 972 209",8634:"369 543T369 563T397 583Q408 583 440 579L454 577L464 581Q492 592 516 609T552 638T565 650Q604 638 607 637Q606 636 598 628T585 614T570 601T548 584T523 568L510 560L516 558Q522 555 527 553T541 546T559 536T580 523T603 506T626 485Q722 384 722 250Q722 106 622 12T387 -83Q253 -83 155 12T56 250Q56 357 110 433T235 545Q244 550 252 550Q270 550 270 531Q270 522 261 515T238 501T202 477T159 433Q95 352 95 250Q95 131 178 45T388 -42Q511 -42 596 43T682 250Q682 340 636 408T522 511Q495 526 488 526Q488 525 488 525T487 522T485 515L490 506Q505 481 516 451T531 404T535 384L532 385Q529 386 524 387T513 390L491 397L488 408Q472 483 413 542L399 543Q369 543 369 563",8635:"170 637L213 650Q270 597 313 581L323 577L337 579Q369 583 380 583Q408 583 408 563T380 543H378L364 542Q305 483 289 408L286 397L264 390Q259 389 254 388T245 385L242 384Q242 387 246 403T261 450T287 506L292 515Q291 519 291 521T290 524T289 526Q284 526 265 517T216 486T160 434T114 354T95 249Q95 132 178 45T388 -42Q513 -42 597 44T682 250Q682 337 638 404T532 506Q529 508 525 510T519 514T515 516T511 519T509 522T508 526T507 531Q507 550 525 550Q533 550 542 545Q569 532 596 511T653 454T702 366T721 250Q721 151 672 74T547 -43T388 -83Q254 -83 155 12T56 250Q56 385 151 485Q164 498 179 509T205 528T228 542T247 551T260 558L267 560L254 568Q215 590 170 637",8636:"62 230Q56 236 55 244Q55 252 57 255T69 265Q114 292 151 326T208 391T243 448T265 491T273 509Q276 511 288 511Q304 511 306 505Q309 501 303 484Q293 456 279 430T251 383T223 344T196 313T173 291T156 276L148 270H929Q944 261 944 250T929 230H62",8637:"55 256Q56 264 62 270H929Q944 261 944 250T929 230H148Q149 229 165 215T196 185T231 145T270 87T303 16Q309 -1 306 -5Q304 -11 288 -11Q279 -11 276 -10T269 -4T264 10T253 36T231 75Q172 173 69 235Q59 242 57 245T55 256",8638:"188 258V694H208L215 682Q246 628 293 594T375 551V528Q375 505 374 505Q369 505 351 510T299 534T237 578L228 587V205Q228 -178 226 -182Q221 -194 208 -194T190 -182Q188 -178 188 258",8639:"41 551Q76 559 123 592T201 682L208 694H228V258Q228 -178 226 -182Q221 -194 208 -194T190 -182Q188 -178 188 205V587L179 578Q151 552 117 534T65 511T42 505Q41 505 41 528V551",8640:"691 500Q691 511 711 511Q720 511 723 510T730 504T735 490T746 464T768 425Q796 378 835 339T897 285T933 263Q941 258 942 256T944 245T937 230H70Q56 237 56 250T70 270H852Q802 308 762 364T707 455T691 500",8641:"56 237T56 250T70 270H937Q944 263 944 256Q944 251 944 250T943 246T940 242T933 238Q794 153 734 7Q729 -7 726 -9T711 -11Q695 -11 693 -5Q690 -1 696 16Q721 84 763 139T852 230H70Q56 237 56 250",8642:"190 682Q195 694 208 694T226 683Q228 679 228 296V-87L237 -78Q265 -52 299 -34T351 -11T374 -5Q375 -5 375 -28V-51Q340 -60 293 -92T215 -182L208 -194H188V242Q188 678 190 682",8643:"188 295V573Q188 657 189 672T200 692Q206 694 208 694Q221 694 226 683Q228 679 228 242V-194H208L201 -182Q170 -128 123 -94T41 -51V-28Q41 -5 42 -5Q47 -5 65 -10T117 -34T179 -78L188 -87V295",8644:"943 500Q895 471 856 427T801 333H778Q755 333 755 334Q755 336 762 353T791 406T841 472L848 480H459Q70 480 67 482Q55 488 55 500T67 518Q70 520 459 520H848L841 528Q813 559 792 594T763 646T755 666Q755 667 778 667H801Q817 617 856 573T943 500ZM56 167Q102 194 141 238T198 333H221Q244 333 244 332Q221 265 161 198L151 187H539Q928 187 930 186Q944 182 944 167Q944 155 934 149Q930 147 541 147H151L160 137Q185 110 205 77T235 24T244 1Q244 0 221 0H199Q158 106 56 167",8646:"56 500Q103 527 142 572T199 667H221Q244 667 244 666Q244 664 237 647T208 594T158 528L151 520H539Q928 520 932 518Q944 513 944 500T932 482Q928 480 539 480H151L158 472Q186 441 207 406T236 354T244 334Q244 333 221 333H199Q181 383 142 428T56 500ZM943 167Q835 101 801 0H778Q755 0 755 1T758 9T765 25T771 39Q800 94 839 137L848 147H458Q68 147 66 149Q55 154 55 167Q55 182 69 186Q71 187 460 187H848L838 198Q811 228 791 261T762 314L755 332Q755 333 778 333H801Q841 227 943 167",8647:"930 437Q944 426 944 416T934 399Q930 397 540 397H150L159 387Q185 360 205 328T234 277T243 252Q243 237 217 191T159 113L150 103H540Q930 103 934 101Q944 94 944 84Q944 71 930 64L540 63H151Q180 34 203 -2T236 -61L244 -83H198Q178 -31 142 11T66 77L55 83L65 89Q157 145 197 246Q199 250 190 269Q150 359 65 411L55 417L66 423Q106 447 142 489T198 583H244Q202 488 151 437H930",8648:"83 551Q190 590 250 694Q251 689 263 671T307 621T380 567Q409 551 416 551Q422 551 447 563T511 608T577 684L582 694Q642 591 749 551V528Q749 505 748 505Q745 505 724 515T669 546T612 590L602 599V-181Q595 -193 585 -193H582H581Q568 -193 565 -183L563 -179L562 209V598L552 589Q517 556 473 531T414 506H412Q411 506 393 514T361 530T324 553T280 589L270 598V-179Q255 -192 250 -193H247Q237 -193 230 -181V599L220 590Q197 567 164 546T110 515T84 505Q83 505 83 528V551",8649:"55 416Q55 427 70 437H848Q819 466 796 502T764 561L755 583H801Q821 531 857 489T933 423L944 417L934 411Q843 355 802 254Q800 250 809 231Q849 141 934 89L944 83L933 77Q893 53 857 11T801 -83H755Q797 12 848 63H459L70 64Q55 70 55 84Q55 94 65 101Q69 103 459 103H849L840 113Q806 148 779 196T756 254Q756 255 760 264T770 286T786 315T809 351T840 387L849 397H459Q69 397 65 399Q55 406 55 416",8650:"230 681Q240 694 251 694Q260 693 270 680V-98L280 -89Q297 -73 314 -60T348 -38T374 -24T397 -13T412 -6H414Q428 -6 473 -32T552 -89L562 -98V291L563 680Q570 693 582 693Q593 694 602 681V-99L612 -90Q635 -68 668 -47T723 -15T748 -5Q749 -5 749 -28V-51Q642 -91 582 -194L577 -184Q551 -141 512 -108T447 -63T416 -51T385 -63T321 -108T255 -184L250 -194Q189 -89 83 -51V-28Q83 -5 84 -5Q88 -5 109 -15T164 -46T220 -90L230 -99V681",8651:"195 504L198 514H221Q244 514 244 512Q244 508 239 490T215 437T171 376L162 367H545Q928 367 932 365Q944 360 944 347T932 329Q928 327 492 327H55V347L67 354Q113 379 146 420T195 504ZM67 171Q70 173 507 173H944V153L932 146Q839 95 804 -4L801 -14H778Q755 -14 755 -12Q768 59 828 124L837 133H454Q71 133 67 135Q55 140 55 153Q55 165 67 171",8652:"691 660Q691 671 711 671Q720 671 723 670T730 664T735 650T746 624T768 585Q797 538 836 499T897 445T933 423Q941 418 942 416T944 405T937 390H70Q56 397 56 410T70 430H852Q802 468 762 524T707 615T691 660ZM55 256Q56 264 62 270H929Q944 261 944 250T929 230H148Q149 229 165 215T196 185T231 145T270 87T303 16Q309 -1 306 -5Q304 -11 288 -11Q279 -11 276 -10T269 -4T264 10T253 36T231 75Q172 173 69 235Q59 242 57 245T55 256",8653:"397 525Q410 525 414 524T418 516Q418 506 394 467T331 381L319 367H473L624 369L657 445Q674 487 684 507T699 531T709 534Q717 534 722 528T728 516Q728 510 695 434Q689 418 683 402T672 377T668 367H928Q942 355 942 347Q942 341 928 327H791Q651 327 651 325Q649 324 620 251T586 174Q586 172 757 172H928Q942 158 942 152Q942 143 928 132H568L537 54Q510 -9 503 -22T486 -35Q479 -35 473 -29T466 -17T495 61L526 132H319L331 118Q364 81 391 37T418 -17Q418 -23 415 -24T401 -26Q398 -26 397 -26L384 -24L377 -13Q344 49 301 97T218 170T143 210T84 233T55 245Q54 253 59 256T86 267Q281 327 377 512L384 525H397ZM606 325Q606 327 439 327H275Q258 312 179 265L148 249Q228 206 262 181L275 172H544L575 247L606 325",8654:"395 -24T395 -19T417 57T440 132H255L266 116Q308 64 340 -6Q342 -17 337 -21Q335 -26 320 -26T302 -19Q302 -15 294 4T265 54T217 117T145 182T49 236Q30 243 33 254Q40 261 49 263Q98 283 142 315T214 379T263 442T293 493T302 519Q305 525 320 525T337 521Q342 516 340 505Q308 435 266 383L255 370L384 367H515Q561 522 569 530Q574 534 580 534Q587 534 594 528T602 516Q602 512 580 441T557 367H651L742 370L731 383Q689 435 657 505Q655 516 660 521Q662 525 677 525T695 519Q695 515 703 496T732 446T780 383T853 317T949 263Q967 258 964 245Q959 240 949 236Q897 215 852 182T779 116T731 52T703 3T695 -19Q692 -26 677 -26T660 -21Q655 -17 657 -6Q670 21 682 42T702 77T717 99T728 114T735 122T739 126T740 130T613 132H482L460 54Q440 -9 433 -23T415 -37Q408 -37 402 -31ZM502 325Q502 327 360 327H217L195 310Q173 291 120 256L111 250Q114 248 143 229T195 190L217 172H335L453 174L502 325ZM886 250Q885 251 865 263T831 286T802 310L780 327H544L535 299Q531 283 511 223L495 174L637 172H780L802 190Q843 225 877 243L886 250",8655:"346 174Q348 176 378 249T411 325Q411 327 239 327H68Q55 342 55 347Q55 354 68 367H428L459 445Q487 509 494 521T510 534Q517 534 524 527T531 516Q531 515 502 438L471 367H677L666 381Q631 421 605 463T578 516Q578 522 582 523T599 525H615L619 512Q659 437 714 383T812 309T896 272T942 254Q943 246 938 243T911 232Q718 172 619 -13L615 -24L599 -26Q578 -26 578 -17Q578 -11 587 6T617 53T666 118L677 132H373L339 54Q323 12 313 -8T298 -32T288 -35Q280 -35 275 -29T269 -17Q269 -14 298 57T328 132H68Q55 145 55 152Q55 156 56 158T62 165T68 172H206Q346 172 346 174ZM848 249Q763 297 735 318L722 327H455L422 252L391 174Q391 172 557 172H722L735 181Q773 210 819 234L848 249",8656:"944 153Q944 140 929 133H318L328 123Q379 69 414 0Q419 -13 419 -17Q419 -24 399 -24Q388 -24 385 -23T377 -12Q332 77 253 144T72 237Q62 240 59 242T56 250T59 257T70 262T89 268T119 278T160 296Q303 366 377 512Q382 522 385 523T401 525Q419 524 419 515Q419 510 414 500Q379 431 328 377L318 367H929Q944 359 944 347Q944 336 930 328L602 327H274L264 319Q225 289 147 250Q148 249 165 241T210 217T264 181L274 173H930Q931 172 933 171T936 169T938 167T941 164T942 162T943 158T944 153",8657:"228 -179Q227 -180 226 -182T223 -186T221 -189T218 -192T214 -193T208 -194Q196 -194 189 -181L188 125V430L176 419Q122 369 59 338Q46 330 40 330Q38 330 31 337V350Q31 362 33 365T46 374Q60 381 77 390T128 426T190 484T247 567T292 677Q295 688 298 692Q302 694 305 694Q313 694 318 677Q334 619 363 568T420 485T481 427T532 391T564 374Q575 368 577 365T579 350V337Q572 330 570 330Q564 330 551 338Q487 370 435 419L423 430L422 125V-181Q409 -194 401 -194Q397 -194 394 -193T388 -189T385 -184T382 -180V-177V475L373 487Q331 541 305 602Q304 601 300 591T290 571T278 548T260 519T238 488L229 476L228 148V-179",8658:"580 514Q580 525 596 525Q601 525 604 525T609 525T613 524T615 523T617 520T619 517T622 512Q659 438 720 381T831 300T927 263Q944 258 944 250T935 239T898 228T840 204Q696 134 622 -12Q618 -21 615 -22T600 -24Q580 -24 580 -17Q580 -13 585 0Q620 69 671 123L681 133H70Q56 140 56 153Q56 168 72 173H725L735 181Q774 211 852 250Q851 251 834 259T789 283T735 319L725 327H72Q56 332 56 347Q56 360 70 367H681L671 377Q638 412 609 458T580 514",8659:"401 694Q412 694 422 681V375L423 70L435 81Q487 130 551 162Q564 170 570 170Q572 170 579 163V150Q579 138 577 135T564 126Q541 114 518 99T453 48T374 -46T318 -177Q313 -194 305 -194T293 -178T272 -119T225 -31Q158 70 46 126Q35 132 33 135T31 150V163Q38 170 40 170Q46 170 59 162Q122 131 176 81L188 70V375L189 681Q199 694 208 694Q219 694 228 680V352L229 25L238 12Q279 -42 305 -102Q344 -23 373 13L382 25V678Q387 692 401 694",8660:"308 524Q318 526 323 526Q340 526 340 514Q340 507 336 499Q326 476 314 454T292 417T274 391T260 374L255 368Q255 367 500 367Q744 367 744 368L739 374Q734 379 726 390T707 416T685 453T663 499Q658 511 658 515Q658 525 680 525Q687 524 690 523T695 519T701 507Q766 359 902 287Q921 276 939 269T961 259T966 250Q966 246 965 244T960 240T949 236T930 228T902 213Q763 137 701 -7Q697 -16 695 -19T690 -23T680 -25Q658 -25 658 -15Q658 -11 663 1Q673 24 685 46T707 83T725 109T739 126L744 132Q744 133 500 133Q255 133 255 132L260 126Q265 121 273 110T292 84T314 47T336 1Q341 -11 341 -15Q341 -25 319 -25Q312 -24 309 -23T304 -19T298 -7Q233 141 97 213Q83 221 70 227T51 235T41 239T35 243T34 250T35 256T40 261T51 265T70 273T97 287Q235 363 299 509Q305 522 308 524ZM792 319L783 327H216Q183 294 120 256L110 250L120 244Q173 212 207 181L216 173H783L792 181Q826 212 879 244L889 250L879 256Q826 288 792 319",8661:"290 755Q298 772 305 772T318 757T343 706T393 633Q431 588 473 558T545 515T579 497V484Q579 464 570 464Q564 464 550 470Q485 497 423 550L422 400V100L423 -50Q485 3 550 30Q565 36 570 36Q579 36 579 16V3Q575 -1 549 -12T480 -53T393 -132Q361 -172 342 -208T318 -258T305 -272T293 -258T268 -208T217 -132Q170 -80 128 -51T61 -12T31 3V16Q31 36 40 36Q46 36 61 30Q86 19 109 6T146 -18T173 -38T188 -50V550Q186 549 173 539T147 519T110 495T61 470Q46 464 40 464Q31 464 31 484V497Q34 500 63 513T135 557T217 633Q267 692 290 755ZM374 598Q363 610 351 625T332 651T316 676T305 695L294 676Q282 657 267 636T236 598L228 589V-89L236 -98Q247 -110 259 -125T278 -151T294 -176T305 -195L316 -176Q328 -157 343 -136T374 -98L382 -89V589L374 598",8666:"944 54Q942 44 929 36H372Q372 34 377 26T395 -4T422 -58Q442 -109 442 -110T408 -111H374L370 -100Q282 124 87 243L76 250L87 257Q284 377 370 600L374 611H408Q442 611 442 610Q423 550 381 480Q380 478 379 475T376 471T374 468T372 465V464H929Q942 456 944 446Q944 442 943 439T941 434T938 430T935 428T931 426T928 424H344L336 414Q277 336 200 277L191 270H560Q929 270 933 268Q944 262 944 250Q944 237 933 232Q929 230 560 230H191L200 223Q279 162 336 86L344 76H928Q929 76 931 75T934 73T938 70T941 66T943 61T944 54",8667:"56 250Q56 260 68 270H808L799 277Q720 338 663 414L655 424H363Q71 424 68 426Q55 432 55 444T68 462Q71 464 349 464H627Q627 466 622 474T604 504T577 558Q557 609 557 610T591 611H626L629 600Q717 376 912 257L923 250L912 243Q715 123 629 -100L626 -111H591Q557 -111 557 -110Q576 -50 618 20Q619 22 620 25T623 29T625 32T626 35L627 36H349Q71 36 68 38Q55 44 55 56T68 74Q71 76 363 76H655L663 86Q722 164 799 223L808 230H438L68 231Q56 236 56 250",8669:"76 230Q68 230 62 237T56 250Q56 257 63 264T91 291Q102 300 108 306L159 351Q168 356 177 351L218 316L303 239L353 195Q376 214 403 239L488 316L529 351Q538 356 546 351Q548 350 594 310L638 270H848L841 278Q813 309 792 344T763 396T755 416Q755 417 778 417H801Q817 367 856 323T943 250Q895 221 856 177T801 83H778Q755 83 755 84Q755 86 762 103T791 156T841 222L848 230H737Q625 230 622 232Q620 233 599 251T558 288L537 306Q537 305 451 228T362 149Q353 146 345 149Q341 150 255 227T169 306Q167 306 129 270Q123 265 115 257T102 245T93 237T84 232T76 230",8672:"292 419Q292 400 261 347T211 275H306H364Q400 275 411 271T422 250T411 230T366 225H306H211Q214 222 232 197T271 136T292 82Q292 71 285 68T262 64H250H241Q221 64 216 67T205 83Q186 127 153 167T78 230Q64 238 64 250Q64 258 69 263T82 272T106 288T139 318Q162 342 177 365T198 402T209 425T223 436Q224 437 252 437H258Q292 437 292 419ZM501 237T501 250T515 270H819Q834 262 834 250T819 230H515Q501 237 501 250ZM918 237T918 250T932 270H1236Q1251 262 1251 250T1236 230H932Q918 237 918 250",8674:"84 237T84 250T98 270H402Q417 262 417 250T402 230H98Q84 237 84 250ZM501 237T501 250T515 270H819Q834 262 834 250T819 230H515Q501 237 501 250ZM1022 417Q1022 437 1055 437H1067Q1090 437 1097 434T1109 417Q1128 373 1161 333T1236 270Q1251 261 1251 250Q1251 241 1244 236T1216 217T1175 182Q1149 155 1133 128T1109 85T1097 66Q1093 64 1065 64H1053Q1031 64 1025 72T1027 100Q1036 124 1049 147T1073 185T1091 210T1101 223L1103 225H1008H950Q914 225 903 229T892 250T903 270T948 275H1008H1103L1101 277Q1100 280 1091 291T1067 325T1039 374Q1022 408 1022 417",8704:"0 673Q0 684 7 689T20 694Q32 694 38 680T82 567L126 451H430L473 566Q483 593 494 622T512 668T519 685Q524 694 538 694Q556 692 556 674Q556 670 426 329T293 -15Q288 -22 278 -22T263 -15Q260 -11 131 328T0 673ZM414 410Q414 411 278 411T142 410L278 55L414 410",8705:"404 269Q412 269 418 267T428 261T435 253T441 245L444 240V172Q444 103 443 96Q440 81 431 65T403 27T344 -7T250 -21T156 -8T97 27T69 65T58 96Q56 103 56 413Q56 722 58 729Q74 822 215 845Q221 846 229 846H243Q282 846 290 845Q422 826 443 729Q444 722 444 653V586L442 583Q441 580 440 578T436 573T430 567T423 562T415 558T404 556Q377 556 367 583Q364 590 364 654V719Q363 721 360 726T355 733Q326 766 250 766H249Q235 766 219 765T174 752T137 719V107Q145 83 178 71T251 58H254Q340 58 364 107V172Q364 176 364 187T363 204Q363 269 404 269",8706:"202 508Q179 508 169 520T158 547Q158 557 164 577T185 624T230 675T301 710L333 715H345Q378 715 384 714Q447 703 489 661T549 568T566 457Q566 362 519 240T402 53Q321 -22 223 -22Q123 -22 73 56Q42 102 42 148V159Q42 276 129 370T322 465Q383 465 414 434T455 367L458 378Q478 461 478 515Q478 603 437 639T344 676Q266 676 223 612Q264 606 264 572Q264 547 246 528T202 508ZM430 306Q430 372 401 400T333 428Q270 428 222 382Q197 354 183 323T150 221Q132 149 132 116Q132 21 232 21Q244 21 250 22Q327 35 374 112Q389 137 409 196T430 306",8707:"56 661T56 674T70 694H487Q497 686 500 679V15Q497 10 487 1L279 0H70Q56 7 56 20T70 40H460V327H84Q70 334 70 347T84 367H460V654H70Q56 661 56 674",8709:"331 696Q335 708 339 722T345 744T350 759T357 769T367 772Q374 772 381 767T388 754Q388 746 377 712L366 673L378 661Q460 575 460 344Q460 281 456 234T432 126T373 27Q319 -22 250 -22Q214 -22 180 -7Q168 -3 168 -4L159 -33Q148 -71 142 -75Q138 -78 132 -78Q124 -78 118 -72T111 -60Q111 -52 122 -18L133 21L125 29Q39 111 39 344Q39 596 137 675Q187 716 251 716Q265 716 278 714T296 710T315 703T331 696ZM276 676Q264 679 246 679Q196 679 159 631Q134 597 128 536T121 356Q121 234 127 174T151 80L234 366Q253 430 275 506T308 618L318 654Q318 656 294 669L276 676ZM181 42Q207 16 250 16Q291 16 324 47Q354 78 366 136T378 356Q378 470 372 528T349 616L348 613Q348 611 264 326L181 42",8710:"51 0Q46 4 46 7Q46 9 215 357T388 709Q391 716 416 716Q439 716 444 709Q447 705 616 357T786 7Q786 4 781 0H51ZM507 344L384 596L137 92L383 91H630Q630 93 507 344",8711:"46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596",8712:"84 250Q84 372 166 450T360 539Q361 539 377 539T419 540T469 540H568Q583 532 583 520Q583 511 570 501L466 500Q355 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H568Q583 262 583 250T568 230H124V228Q124 207 134 177T167 112T231 48T328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 446 -40T417 -41Q262 -41 172 45Q84 127 84 250",8713:"196 25Q84 109 84 250Q84 372 166 450T360 539Q361 539 375 539T413 540T460 540L547 707Q550 716 563 716Q570 716 575 712T581 703T583 696T505 540H568Q583 532 583 520Q583 511 570 501L484 500L366 270H568Q583 262 583 250T568 230H346L247 38Q284 16 328 7Q355 1 466 0H570Q583 -10 583 -20Q583 -32 568 -40H471Q464 -40 447 -40T419 -41Q304 -41 228 3Q117 -211 115 -212Q111 -215 104 -215T92 -212T86 -204T84 -197Q84 -190 89 -183L196 25ZM214 61L301 230H124V228Q124 196 147 147T214 61ZM321 270L440 500Q353 499 329 494Q280 482 242 458T183 409T147 354T129 306T124 272V270H321",8715:"83 520Q83 532 98 540H195Q202 540 220 540T249 541Q404 541 494 455Q582 374 582 250Q582 165 539 99T434 0T304 -39Q297 -40 195 -40H98Q83 -32 83 -20Q83 -10 96 0H200Q311 1 337 6Q369 14 401 28Q422 39 445 55Q484 85 508 127T537 191T542 228V230H98Q84 237 84 250T98 270H542V272Q542 280 539 295T527 336T497 391T445 445Q422 461 401 472Q386 479 374 483T347 491T325 495T298 498T273 499T239 500T200 500L96 501Q83 511 83 520",8717:"154 -1Q122 -1 112 3T102 26Q102 63 158 63H178Q192 64 206 65T228 66T240 68Q301 85 324 146L329 157H244Q158 157 153 161Q149 162 145 169T140 183Q140 201 158 215L167 221H256L344 223L349 237Q352 262 352 287Q352 308 351 315Q341 352 315 368T256 385Q231 385 206 376T166 356T149 346Q143 346 138 364T132 388Q132 396 147 406Q198 440 252 440Q291 440 318 435Q421 404 451 301Q456 288 456 248V234Q456 151 391 86Q330 25 240 3Q212 -1 154 -1",8719:"158 656Q147 684 131 694Q110 707 69 710H55V750H888V710H874Q840 708 820 698T795 678T786 656V-155Q798 -206 874 -210H888V-250H570V-210H584Q618 -208 638 -197T663 -178T673 -155V710H270V277L271 -155Q283 -206 359 -210H373V-250H55V-210H69Q103 -208 123 -197T148 -178T158 -155V656",8720:"158 656Q147 684 131 694Q110 707 69 710H55V750H373V710H359Q325 708 305 698T280 678T271 656L270 223V-210H673V656Q666 672 663 679T639 697T584 710H570V750H888V710H874Q840 708 820 698T795 678T786 656V-155Q798 -206 874 -210H888V-250H55V-210H69Q103 -208 123 -197T148 -178T158 -155V656",8721:"61 748Q64 750 489 750H913L954 640Q965 609 976 579T993 533T999 516H979L959 517Q936 579 886 621T777 682Q724 700 655 705T436 710H319Q183 710 183 709Q186 706 348 484T511 259Q517 250 513 244L490 216Q466 188 420 134T330 27L149 -187Q149 -188 362 -188Q388 -188 436 -188T506 -189Q679 -189 778 -162T936 -43Q946 -27 959 6H999L913 -249L489 -250Q65 -250 62 -248Q56 -246 56 -239Q56 -234 118 -161Q186 -81 245 -11L428 206Q428 207 242 462L57 717L56 728Q56 744 61 748",8722:"84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250",8723:"56 467T56 480T70 500H707Q722 492 722 480T707 460H409V187H707Q722 179 722 167Q722 154 707 147H409V0V-93Q409 -144 406 -155T389 -166Q376 -166 372 -155T368 -105Q368 -96 368 -62T369 -2V147H70Q56 154 56 167T70 187H369V460H70Q56 467 56 480",8724:"339 717Q339 739 354 752T388 766Q410 766 424 751T439 716T424 681T390 666Q369 666 354 681T339 717ZM57 237T57 250T71 270H369V425L370 581Q380 594 389 594Q402 594 409 579V270H707Q722 262 722 250T707 230H409V-79Q401 -93 391 -93H389H387Q375 -93 369 -79V230H71Q57 237 57 250",8725:"423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750",8726:"56 731Q56 740 62 745T75 750Q85 750 92 740Q96 733 270 255T444 -231Q444 -239 438 -244T424 -250Q414 -250 407 -240Q404 -236 230 242T56 731",8727:"229 286Q216 420 216 436Q216 454 240 464Q241 464 245 464T251 465Q263 464 273 456T283 436Q283 419 277 356T270 286L328 328Q384 369 389 372T399 375Q412 375 423 365T435 338Q435 325 425 315Q420 312 357 282T289 250L355 219L425 184Q434 175 434 161Q434 146 425 136T401 125Q393 125 383 131T328 171L270 213Q283 79 283 63Q283 53 276 44T250 35Q231 35 224 44T216 63Q216 80 222 143T229 213L171 171Q115 130 110 127Q106 124 100 124Q87 124 76 134T64 161Q64 166 64 169T67 175T72 181T81 188T94 195T113 204T138 215T170 230T210 250L74 315Q65 324 65 338Q65 353 74 363T98 374Q106 374 116 368T171 328L229 286",8728:"55 251Q55 328 112 386T249 444T386 388T444 249Q444 171 388 113T250 55Q170 55 113 112T55 251ZM245 403Q188 403 142 361T96 250Q96 183 141 140T250 96Q284 96 313 109T354 135T375 160Q403 197 403 250Q403 313 360 358T245 403",8729:"55 251Q55 328 112 386T249 444T386 388T444 249Q444 171 388 113T250 55Q170 55 113 112T55 251",8730:"95 178Q89 178 81 186T72 200T103 230T169 280T207 309Q209 311 212 311H213Q219 311 227 294T281 177Q300 134 312 108L397 -77Q398 -77 501 136T707 565T814 786Q820 800 834 800Q841 800 846 794T853 782V776L620 293L385 -193Q381 -200 366 -200Q357 -200 354 -197Q352 -195 256 15L160 225L144 214Q129 202 113 190T95 178",8733:"56 124T56 216T107 375T238 442Q260 442 280 438T319 425T352 407T382 385T406 361T427 336T442 315T455 297T462 285L469 297Q555 442 679 442Q687 442 722 437V398H718Q710 400 694 400Q657 400 623 383T567 343T527 294T503 253T495 235Q495 231 520 192T554 143Q625 44 696 44Q717 44 719 46H722V-5Q695 -11 678 -11Q552 -11 457 141Q455 145 454 146L447 134Q362 -11 235 -11Q157 -11 107 56ZM93 213Q93 143 126 87T220 31Q258 31 292 48T349 88T389 137T413 178T421 196Q421 200 396 239T362 288Q322 345 288 366T213 387Q163 387 128 337T93 213",8734:"55 217Q55 305 111 373T254 442Q342 442 419 381Q457 350 493 303L507 284L514 294Q618 442 747 442Q833 442 888 374T944 214Q944 128 889 59T743 -11Q657 -11 580 50Q542 81 506 128L492 147L485 137Q381 -11 252 -11Q166 -11 111 57T55 217ZM907 217Q907 285 869 341T761 397Q740 397 720 392T682 378T648 359T619 335T594 310T574 285T559 263T548 246L543 238L574 198Q605 158 622 138T664 94T714 61T765 51Q827 51 867 100T907 217ZM92 214Q92 145 131 89T239 33Q357 33 456 193L425 233Q364 312 334 337Q285 380 233 380Q171 380 132 331T92 214",8736:"71 0L68 2Q65 3 63 5T58 11T55 20Q55 22 57 28Q67 43 346 361Q397 420 474 508Q595 648 616 671T647 694T661 688T666 674Q666 668 663 663Q662 662 627 622T524 503T390 350L120 41L386 40H653Q666 30 666 20Q666 8 651 0H71",8737:"71 0L68 2Q65 3 63 5T58 11T55 20Q55 22 57 28Q64 38 348 373T638 712Q644 714 646 714Q653 714 659 709T666 694V693Q666 687 633 647Q619 631 576 580Q528 524 495 485Q336 296 329 289Q328 288 348 264T395 182T433 54L434 40H651Q666 32 666 20T651 0H436Q431 -20 416 -20Q400 -20 396 -4V0H71ZM394 40Q394 51 389 76T366 149T319 234L302 256L119 41L256 40H394",8738:"666 -32Q666 -51 646 -51Q639 -51 365 85L75 228Q55 238 55 250Q55 257 59 262T68 268L72 270L611 536Q642 551 647 551T659 547T666 532Q666 521 657 515L525 449Q525 448 535 424T556 352T566 250T556 148T536 77T525 51L657 -15Q666 -21 666 -32ZM526 250Q526 297 517 342T499 409T488 431Q487 431 304 341T121 250T304 159T488 69Q526 143 526 250",8739:"139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139",8740:"118 737Q131 750 138 750L151 746L158 739V579L160 421L213 470Q269 519 276 519Q284 519 290 513T296 499V498Q296 493 291 488T244 445Q225 428 213 417L158 368V-239Q143 -252 136 -252L124 -248L120 -241L118 44V328L62 279Q4 231 0 230Q-8 230 -14 236T-20 250Q-20 257 -11 265T62 332L118 384V737",8741:"133 736Q138 750 153 750Q164 750 170 739Q172 735 172 250T170 -239Q164 -250 152 -250Q144 -250 138 -244L137 -243Q133 -241 133 -179T132 250Q132 731 133 736ZM329 739Q334 750 346 750Q353 750 361 744L362 743Q366 741 366 679T367 250T367 -178T362 -243L361 -244Q355 -250 347 -250Q335 -250 329 -239Q327 -235 327 250T329 739",8742:"131 737Q134 739 138 743T144 748T151 750T171 737V199L327 357V737Q340 750 347 750Q351 750 353 749T360 743T367 737V397L429 457Q493 518 498 519Q506 519 512 512T518 500Q518 489 442 417L367 339V-237Q352 -250 346 -250L333 -243L327 -237V301L171 143V-237Q156 -250 151 -250T131 -237V101L69 41Q24 -3 15 -12T0 -21Q-8 -21 -14 -14T-20 -2Q-20 5 -7 19T56 81L131 159V737",8743:"318 591Q325 598 333 598Q344 598 348 591Q349 590 414 445T545 151T611 -4Q609 -22 591 -22Q588 -22 586 -21T581 -20T577 -17T575 -13T572 -9T570 -4L333 528L96 -4Q87 -20 80 -21Q78 -22 75 -22Q57 -22 55 -4Q55 2 120 150T251 444T318 591",8744:"55 580Q56 587 61 592T75 598Q86 598 96 580L333 48L570 580Q579 596 586 597Q588 598 591 598Q609 598 611 580Q611 574 546 426T415 132T348 -15Q343 -22 333 -22T318 -15Q317 -14 252 131T121 425T55 580",8745:"88 -21T75 -21T55 -7V200Q55 231 55 280Q56 414 60 428Q61 430 61 431Q77 500 152 549T332 598Q443 598 522 544T610 405Q611 399 611 194V-7Q604 -22 591 -22Q582 -22 572 -9L570 405Q563 433 556 449T529 485Q498 519 445 538T334 558Q251 558 179 518T96 401Q95 396 95 193V-7Q88 -21 75 -21",8746:"591 598H592Q604 598 611 583V376Q611 345 611 296Q610 162 606 148Q605 146 605 145Q586 68 507 23T333 -22Q268 -22 209 -1T106 66T56 173Q55 180 55 384L56 585Q66 598 75 598Q85 598 95 585V378L96 172L98 162Q112 95 181 57T332 18Q415 18 487 58T570 175Q571 180 571 383V583Q579 598 591 598",8747:"151 -112Q151 -150 106 -161Q106 -165 114 -172T134 -179Q155 -179 170 -146Q181 -120 188 -64T206 101T232 310Q256 472 277 567Q308 716 392 716Q434 716 453 681T472 613Q472 590 458 577T424 564Q404 564 390 578T376 612Q376 650 421 661Q421 663 418 667T407 675T393 679Q387 679 380 675Q360 665 350 619T326 438Q302 190 253 -57Q235 -147 201 -186Q174 -213 138 -216Q93 -216 74 -181T55 -113Q55 -91 69 -78T103 -64Q123 -64 137 -78T151 -112",8748:"113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q220 -247 232 -218T251 -133T262 -15T276 155T297 367Q300 390 305 438T314 512T325 580T340 647T361 703T390 751T428 784T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q475 768 460 756T434 716T418 652T407 559T398 444T387 300T369 133Q349 -38 337 -102T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244ZM460 -244Q460 -246 466 -251T486 -263T514 -269Q532 -269 546 -260Q567 -247 579 -218T598 -133T609 -15T623 155T644 367Q647 390 652 438T661 512T672 580T687 647T708 703T737 751T775 784T826 804Q828 804 835 804T848 805Q899 802 928 769T957 695Q957 669 941 657T908 645Q889 645 874 658T859 694Q859 705 863 714T873 729T885 737T895 742L899 743Q899 745 892 751T872 762T845 768Q822 768 807 756T781 716T765 652T754 559T745 444T734 300T716 133Q696 -38 684 -102T650 -207Q603 -306 516 -306Q466 -306 434 -272T402 -196Q402 -170 418 -158T451 -146Q470 -146 485 -159T500 -195Q500 -206 496 -215T486 -230T474 -238T464 -242L460 -244",8749:"113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q220 -247 232 -218T251 -133T262 -15T276 155T297 367Q300 390 305 438T314 512T325 580T340 647T361 703T390 751T428 784T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q475 768 460 756T434 716T418 652T407 559T398 444T387 300T369 133Q349 -38 337 -102T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244ZM460 -244Q460 -246 466 -251T486 -263T514 -269Q532 -269 546 -260Q567 -247 579 -218T598 -133T609 -15T623 155T644 367Q647 390 652 438T661 512T672 580T687 647T708 703T737 751T775 784T826 804Q828 804 835 804T848 805Q899 802 928 769T957 695Q957 669 941 657T908 645Q889 645 874 658T859 694Q859 705 863 714T873 729T885 737T895 742L899 743Q899 745 892 751T872 762T845 768Q822 768 807 756T781 716T765 652T754 559T745 444T734 300T716 133Q696 -38 684 -102T650 -207Q603 -306 516 -306Q466 -306 434 -272T402 -196Q402 -170 418 -158T451 -146Q470 -146 485 -159T500 -195Q500 -206 496 -215T486 -230T474 -238T464 -242L460 -244ZM807 -244Q807 -246 813 -251T833 -263T861 -269Q880 -269 893 -260Q914 -247 926 -218T945 -133T956 -15T970 155T991 367Q994 390 999 438T1008 512T1019 580T1034 647T1055 703T1084 751T1122 784T1173 804Q1175 804 1182 804T1195 805Q1246 802 1275 769T1304 695Q1304 669 1288 657T1255 645Q1236 645 1221 658T1206 694Q1206 705 1210 714T1220 729T1232 737T1242 742L1246 743Q1246 745 1239 751T1219 762T1192 768Q1169 768 1154 756T1128 716T1112 652T1101 559T1092 444T1081 300T1063 133Q1043 -38 1031 -102T997 -207Q950 -306 863 -306Q813 -306 781 -272T749 -196Q749 -170 765 -158T798 -146Q817 -146 832 -159T847 -195Q847 -206 843 -215T833 -230T821 -238T811 -242L807 -244",8750:"269 74L256 80Q244 85 227 97T191 128T161 179T148 250Q148 332 199 379T302 433L306 434L307 444Q309 456 313 495T321 553T331 607T345 664T365 712T393 756T431 785T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q471 768 454 752T427 693T414 626T406 536Q405 530 405 527L397 425L404 422Q410 419 421 413T445 399T470 376T494 345T511 303T518 250Q518 205 502 169T460 112T410 80T364 66L360 65L359 55Q357 38 353 4T346 -43T340 -81T333 -118T326 -148T316 -179T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q231 -241 242 -183T266 33L269 74ZM272 122Q272 156 300 391Q300 392 299 392Q287 392 263 379T213 331T187 249Q187 211 205 180T239 137T272 116V122ZM366 107Q378 107 402 119T453 167T479 249Q479 340 394 383V377Q394 375 394 374T393 371T393 366T392 357T391 342T389 321T386 291T382 251T377 199T369 133Q366 112 366 107",8756:"273 411Q273 437 291 454T334 471Q358 471 375 454T393 411T376 368T333 351Q307 351 290 368T273 411ZM84 38Q110 38 126 21T143 -22Q143 -46 127 -64T83 -82Q57 -82 41 -65T24 -22Q24 4 41 21T84 38ZM524 -22Q524 4 541 21T584 38Q608 38 625 21T643 -22Q643 -45 627 -63T583 -82Q557 -82 541 -65T524 -22",8757:"23 411Q23 437 41 454T84 471Q108 471 125 454T143 411T126 368T83 351Q57 351 40 368T23 411ZM523 411Q523 437 541 454T584 471Q608 471 625 454T643 411T626 368T583 351Q557 351 540 368T523 411ZM274 -22Q274 4 291 21T334 38Q356 38 374 22T392 -22T375 -65T333 -82Q307 -82 291 -65T274 -22",8764:"55 166Q55 241 101 304T222 367Q260 367 296 349T362 304T421 252T484 208T554 189Q616 189 655 236T694 338Q694 350 698 358T708 367Q722 367 722 334Q722 260 677 197T562 134H554Q517 134 481 152T414 196T355 248T292 293T223 311Q179 311 145 286Q109 257 96 218T80 156T69 133Q55 133 55 166",8765:"222 133Q147 133 102 197T56 335Q56 362 66 365Q71 369 77 364Q83 356 84 335T90 298Q102 254 137 222T223 189Q258 189 292 206T355 250T413 301T477 346T550 367Q628 367 673 309T722 171Q722 133 708 133Q703 133 699 141T694 162Q694 220 655 265T555 311Q519 311 485 293T421 248T363 196T298 152T222 133",8768:"55 569Q55 583 83 583Q122 583 151 565T194 519T215 464T222 411Q222 360 194 304T139 193T111 89Q111 38 134 -7T195 -55Q222 -57 222 -69Q222 -83 189 -83Q130 -83 93 -33T55 90Q55 130 72 174T110 252T148 328T166 411Q166 462 144 507T83 555Q55 556 55 569",8769:"220 366Q258 366 297 347T361 308T391 288Q394 288 464 370Q494 407 510 425T535 454T546 465T552 467H553Q560 467 566 461T573 448Q573 439 499 350Q424 266 424 261Q424 259 442 247T492 222T554 209Q607 209 646 243Q671 268 680 295T690 341T702 366Q719 366 719 314Q716 265 695 226Q682 199 664 179Q614 132 555 132Q517 132 477 151T412 190T383 210T347 172T278 89T233 37Q228 32 220 32Q210 32 206 38T201 48Q201 57 266 137Q272 144 275 148Q351 231 351 237Q351 239 333 251T283 276T221 289Q159 289 123 248T86 166Q86 156 82 145T73 132Q55 132 55 172Q55 220 79 272Q95 301 111 319Q161 366 220 366",8770:"55 439T55 443T56 449T62 456T68 463H706Q720 449 720 443T706 423H68Q55 439 55 443ZM56 72Q56 112 73 152T130 225T224 257Q259 257 294 240T360 199T419 149T484 107T553 90Q603 90 643 125T691 223Q693 257 704 257Q717 257 717 221Q717 147 671 91T554 34Q517 34 481 51T414 93T355 142T291 184T222 201Q172 201 131 167T84 67Q81 34 71 34Q56 37 56 72",8771:"55 283Q55 356 103 409T217 463Q262 463 297 447T395 382Q431 355 446 344T493 320T554 307H558Q613 307 652 344T694 433Q694 464 708 464T722 432Q722 356 673 304T564 251H554Q510 251 465 275T387 329T310 382T223 407H219Q164 407 122 367Q91 333 85 295T76 253T69 250Q55 250 55 283ZM56 56Q56 71 72 76H706Q722 70 722 56Q722 44 707 36H70Q56 43 56 56",8773:"55 388Q55 463 101 526T222 589Q260 589 296 571T362 526T421 474T484 430T554 411Q616 411 655 458T694 560Q694 572 698 580T708 589Q722 589 722 556Q722 482 677 419T562 356H554Q517 356 481 374T414 418T355 471T292 515T223 533Q179 533 145 508Q109 479 96 440T80 378T69 355Q55 355 55 388ZM56 236Q56 249 70 256H707Q722 248 722 236Q722 225 708 217L390 216H72Q56 221 56 236ZM56 42Q56 57 72 62H708Q722 52 722 42Q722 30 707 22H70Q56 29 56 42",8775:"55 417Q55 479 101 528T222 578Q259 578 294 564T393 507Q413 493 434 480T469 460T484 454L537 549Q587 639 595 647Q600 652 607 652Q615 652 621 647T628 634Q628 625 575 536Q524 446 524 443Q527 440 555 440Q603 440 644 469T691 547Q694 578 706 578T718 556Q718 555 718 551T717 545Q717 488 684 445T595 387Q582 384 558 384Q530 384 508 389L493 394L404 238L557 236H708Q720 224 720 217T706 196H379L291 43L499 41H708Q720 29 720 21T706 1H268L226 -71Q186 -143 179 -148Q173 -155 165 -155T152 -150T146 -137Q146 -133 184 -64L222 1H144L66 3L59 7Q54 14 54 20Q54 29 66 41H246L333 194Q333 196 202 196H68Q55 211 55 218T66 236H213L357 238L457 409L437 421Q432 423 393 450T307 500T222 523Q171 523 129 491T84 414Q82 383 70 383Q55 383 55 417",8776:"55 319Q55 360 72 393T114 444T163 472T205 482Q207 482 213 482T223 483Q262 483 296 468T393 413L443 381Q502 346 553 346Q609 346 649 375T694 454Q694 465 698 474T708 483Q722 483 722 452Q722 386 675 338T555 289Q514 289 468 310T388 357T308 404T224 426Q164 426 125 393T83 318Q81 289 69 289Q55 289 55 319ZM55 85Q55 126 72 159T114 210T163 238T205 248Q207 248 213 248T223 249Q262 249 296 234T393 179L443 147Q502 112 553 112Q609 112 649 141T694 220Q694 249 708 249T722 217Q722 153 675 104T555 55Q514 55 468 76T388 123T308 170T224 192Q164 192 125 159T83 84Q80 55 69 55Q55 55 55 85",8778:"220 523Q163 523 124 486T84 412Q81 383 69 383Q56 383 56 413Q56 441 67 470Q78 508 111 537T187 575Q203 579 219 579Q248 579 271 572Q304 565 393 508Q498 439 551 439Q620 439 662 486Q688 512 693 557Q693 565 697 572T707 579Q719 579 719 548Q719 483 673 434T550 384Q512 384 467 405T386 453T305 501T220 523ZM222 288Q164 288 124 251T84 177Q81 148 69 148Q56 148 56 178Q56 206 67 235Q78 274 111 302T187 339Q198 343 220 343Q244 343 259 341T308 322T393 272Q496 203 553 203Q612 203 651 241T691 312Q693 343 705 343Q719 343 719 313Q719 245 673 199Q626 148 552 148Q513 148 467 170T385 218T304 266T222 288ZM51 -19Q51 -6 62 -1H387Q713 -1 715 -3Q725 -10 725 -20Q725 -27 718 -34Q714 -38 672 -38T387 -39H62Q51 -25 51 -19",8781:"55 464Q55 471 60 477T74 484Q80 484 108 464T172 420T268 376T389 356Q436 356 483 368T566 399T630 436T675 467T695 482Q701 484 703 484Q711 484 716 478T722 464Q722 454 707 442Q550 316 389 316Q338 316 286 329T195 362T124 402T76 437T57 456Q55 462 55 464ZM57 45Q66 58 109 88T230 151T381 183Q438 183 494 168T587 135T658 94T703 61T720 45Q722 39 722 36Q722 28 717 22T703 16Q697 16 669 36T606 80T510 124T389 144Q341 144 294 132T211 101T147 64T102 33T82 18Q76 16 74 16Q66 16 61 22T55 36Q55 39 57 45",8782:"245 367Q251 415 288 453T392 492Q445 492 485 456T532 367H707Q722 359 722 347Q722 334 711 331T665 327H608H509Q500 332 498 336Q496 338 493 363T472 411Q443 451 389 451H387Q335 451 305 411Q290 392 287 374T282 344T268 327H72Q56 332 56 347Q56 360 70 367H245ZM56 153Q56 168 72 173H268Q277 168 279 164Q281 162 284 137T305 89Q334 49 389 49H391Q442 49 472 89Q487 108 490 126T495 156T509 173H608H666Q701 173 711 170T722 153T707 133H532Q526 81 486 45T389 8Q331 8 291 45T245 133H70Q56 140 56 153",8783:"245 367Q251 415 288 453T392 492Q445 492 485 456T532 367H707Q722 359 722 347Q722 334 711 331T665 327H608H509Q500 332 498 336Q496 338 493 363T472 411Q443 451 389 451H387Q335 451 305 411Q290 392 287 374T282 344T268 327H72Q56 332 56 347Q56 360 70 367H245ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153",8784:"56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153ZM329 610Q329 634 346 652T389 670Q413 670 431 654T450 611Q450 586 433 568T390 550T347 567T329 610",8785:"421 474T389 474T339 493T321 541Q321 566 337 587T391 609Q456 602 456 541Q456 512 439 493ZM56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153ZM421 -108T389 -108T339 -89T321 -41Q321 -16 337 5T391 27Q456 20 456 -41Q456 -70 439 -89",8786:"15 541Q15 569 33 585T75 601T117 585T135 541Q135 514 118 498T75 481T32 498T15 541ZM56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153ZM642 -41Q642 -17 658 0T702 18Q726 18 744 3T762 -41Q762 -67 745 -84T702 -101Q676 -101 659 -85T642 -41",8787:"642 541Q642 569 660 585T702 601T744 585T762 541Q762 515 745 498T702 481Q676 481 659 497T642 541ZM56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153ZM14 -41Q14 -15 31 1T74 18Q101 18 118 0T135 -41Q135 -64 118 -83T75 -102Q51 -102 33 -85T14 -41",8790:"56 347Q56 360 70 367H707Q722 359 722 347Q722 334 711 331T658 327H586H465L472 318Q496 288 496 250T472 182L465 173H586H663Q700 173 711 170T722 153T707 133H70Q56 140 56 153Q56 168 72 173H312L305 182Q281 212 281 250T305 318L312 327H72Q56 332 56 347ZM473 250Q473 265 472 273T460 297T428 327H349Q328 313 318 298T306 273T304 250Q304 235 305 227T317 203T349 173H428Q449 187 459 202T471 227T473 250",8791:"279 612Q279 656 310 688T388 721Q433 721 465 689T498 612Q498 573 470 538T389 503Q336 503 308 538T279 612ZM458 614Q458 637 452 651T433 672T411 679T383 680T352 675T333 664T324 647T321 629T320 611Q320 593 321 584T332 562T359 545Q366 543 389 543H391Q406 543 414 544T435 552T452 573T458 614ZM56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153",8796:"192 482H190Q187 483 185 484T181 488T177 493T175 501Q175 506 178 512Q184 523 278 687T375 853Q379 857 383 857Q385 857 387 858T390 859Q397 859 403 853Q405 851 499 687T600 512Q603 506 603 501Q603 488 587 482H192ZM548 523L389 798Q388 798 309 661T230 523T389 522T548 523ZM56 347Q56 360 70 367H708Q723 359 723 347Q723 336 709 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H709Q723 163 723 153Q723 140 708 133H70Q56 140 56 153",8800:"166 -215T159 -215T147 -212T141 -204T139 -197Q139 -190 144 -183L306 133H70Q56 140 56 153Q56 168 72 173H327L406 327H72Q56 332 56 347Q56 360 70 367H426Q597 702 602 707Q605 716 618 716Q625 716 630 712T636 703T638 696Q638 692 471 367H707Q722 359 722 347Q722 336 708 328L451 327L371 173H708Q722 163 722 153Q722 140 707 133H351Q175 -210 170 -212Q166 -215 159 -215",8801:"56 444Q56 457 70 464H707Q722 456 722 444Q722 430 706 424H72Q56 429 56 444ZM56 237T56 250T70 270H707Q722 262 722 250T707 230H70Q56 237 56 250ZM56 56Q56 71 72 76H706Q722 70 722 56Q722 44 707 36H70Q56 43 56 56",8804:"674 636Q682 636 688 630T694 615T687 601Q686 600 417 472L151 346L399 228Q687 92 691 87Q694 81 694 76Q694 58 676 56H670L382 192Q92 329 90 331Q83 336 83 348Q84 359 96 365Q104 369 382 500T665 634Q669 636 674 636ZM84 -118Q84 -108 99 -98H678Q694 -104 694 -118Q694 -130 679 -138H98Q84 -131 84 -118",8805:"83 616Q83 624 89 630T99 636Q107 636 253 568T543 431T687 361Q694 356 694 346T687 331Q685 329 395 192L107 56H101Q83 58 83 76Q83 77 83 79Q82 86 98 95Q117 105 248 167Q326 204 378 228L626 346L360 472Q291 505 200 548Q112 589 98 597T83 616ZM84 -118Q84 -108 99 -98H678Q694 -104 694 -118Q694 -130 679 -138H98Q84 -131 84 -118",8806:"674 753Q682 753 688 747T694 732T687 718Q686 717 417 589L151 463L399 345Q687 209 691 204Q694 198 694 193Q694 175 676 173H670L382 309Q92 446 90 448Q83 453 83 465Q84 476 96 482Q104 486 382 617T665 751Q669 753 674 753ZM84 39Q84 49 99 59H678Q694 53 694 39Q694 26 679 19H98Q84 26 84 39ZM83 -157Q83 -153 84 -150T86 -145T89 -141T92 -139T96 -137T99 -135H678Q694 -146 694 -155Q694 -168 679 -175H98Q84 -168 83 -157",8807:"83 733Q83 741 89 747T99 753Q107 753 253 685T543 548T687 478Q694 473 694 463T687 448Q685 446 395 309L107 173H101Q83 175 83 193Q83 194 83 196Q82 203 98 212Q117 222 248 284Q326 321 378 345L626 463L360 589Q291 622 200 665Q112 706 98 714T83 733ZM84 39Q84 49 99 59H678Q694 53 694 39Q694 26 679 19H98Q84 26 84 39ZM83 -157Q83 -153 84 -150T86 -145T89 -141T92 -139T96 -137T99 -135H678Q694 -146 694 -155Q694 -168 679 -175H98Q84 -168 83 -157",8808:"86 472Q93 477 381 614T673 752Q680 752 686 746T693 732T689 721Q686 715 418 590L151 461L418 332Q684 207 689 201Q693 195 693 190Q693 183 687 177T675 170Q668 170 380 307T86 450Q82 454 82 461Q82 467 86 472ZM82 33Q82 37 83 40T89 47T95 54H473L520 105Q569 156 571 156Q573 157 578 157Q586 157 592 151T598 136Q598 130 562 92L526 56L604 54H682Q693 43 693 35Q693 31 692 28T686 21T680 14H489L342 -139L513 -142H682Q693 -148 693 -160Q693 -167 680 -182H304L258 -230Q248 -240 237 -251T221 -268T211 -278T203 -284T197 -286Q189 -286 184 -280T178 -264Q178 -257 213 -219L249 -182H171L93 -179L86 -175Q82 -170 82 -163Q82 -155 95 -142H289L360 -64L433 14H262L93 16Q82 23 82 33",8809:"89 745Q95 752 100 752Q106 752 394 615T689 472Q693 468 693 461T689 450Q684 445 396 308T100 170Q95 170 89 176T82 190Q82 195 86 201Q91 208 358 332L624 461L358 590Q90 715 86 721Q82 725 82 731Q82 739 89 745ZM82 33Q82 37 83 40T89 47T95 54H473L520 105Q569 156 571 156Q573 157 578 157Q586 157 592 151T598 136Q598 130 562 92L526 56L604 54H682Q693 43 693 35Q693 31 692 28T686 21T680 14H489L342 -139L513 -142H682Q693 -148 693 -160Q693 -167 680 -182H304L258 -230Q248 -240 237 -251T221 -268T211 -278T203 -284T197 -286Q189 -286 184 -280T178 -264Q178 -257 213 -219L249 -182H171L93 -179L86 -175Q82 -170 82 -163Q82 -155 95 -142H289L360 -64L433 14H262L93 16Q82 23 82 33",8810:"639 -48Q639 -54 634 -60T619 -67H618Q612 -67 536 -26Q430 33 329 88Q61 235 59 239Q56 243 56 250T59 261Q62 266 336 415T615 567L619 568Q622 567 625 567Q639 562 639 548Q639 540 633 534Q632 532 374 391L117 250L374 109Q632 -32 633 -34Q639 -40 639 -48ZM944 -48Q944 -54 939 -60T924 -67H923Q917 -67 841 -26Q735 33 634 88Q366 235 364 239Q361 243 361 250T364 261Q367 266 641 415T920 567L924 568Q927 567 930 567Q944 562 944 548Q944 540 938 534Q937 532 679 391L422 250L679 109Q937 -32 938 -34Q944 -40 944 -48",8811:"55 539T55 547T60 561T74 567Q81 567 207 498Q297 449 365 412Q633 265 636 261Q639 255 639 250Q639 241 626 232Q614 224 365 88Q83 -65 79 -66Q76 -67 73 -67Q65 -67 60 -61T55 -47Q55 -39 61 -33Q62 -33 95 -15T193 39T320 109L321 110H322L323 111H324L325 112L326 113H327L329 114H330L331 115H332L333 116L334 117H335L336 118H337L338 119H339L340 120L341 121H342L343 122H344L345 123H346L347 124L348 125H349L351 126H352L353 127H354L355 128L356 129H357L358 130H359L360 131H361L362 132L363 133H364L365 134H366L367 135H368L369 136H370L371 137L372 138H373L374 139H375L376 140L378 141L576 251Q63 530 62 533Q55 539 55 547ZM360 539T360 547T365 561T379 567Q386 567 512 498Q602 449 670 412Q938 265 941 261Q944 255 944 250Q944 241 931 232Q919 224 670 88Q388 -65 384 -66Q381 -67 378 -67Q370 -67 365 -61T360 -47Q360 -39 366 -33Q367 -33 400 -15T498 39T625 109L626 110H627L628 111H629L630 112L631 113H632L634 114H635L636 115H637L638 116L639 117H640L641 118H642L643 119H644L645 120L646 121H647L648 122H649L650 123H651L652 124L653 125H654L656 126H657L658 127H659L660 128L661 129H662L663 130H664L665 131H666L667 132L668 133H669L670 134H671L672 135H673L674 136H675L676 137L677 138H678L679 139H680L681 140L683 141L881 251Q368 530 367 533Q360 539 360 547",8812:"104 730Q104 749 123 749Q130 749 138 745Q186 717 237 671L250 659L261 670Q297 703 332 726T375 750T389 744T395 730Q395 721 390 717T364 699T322 668Q290 641 283 632Q280 628 281 627T293 612Q425 454 425 250Q425 144 388 51T293 -112Q282 -125 281 -126T283 -132Q306 -162 379 -209Q395 -219 395 -230Q395 -238 389 -244T375 -250T335 -228T262 -171L250 -159L238 -170Q202 -203 167 -226T124 -250T110 -244T104 -230Q104 -219 121 -209Q199 -156 216 -132Q219 -128 218 -127T206 -112Q74 46 74 250T206 612Q217 625 218 626T216 632Q199 656 121 709Q104 719 104 730ZM249 -94Q364 61 364 250Q364 430 265 574Q253 590 249 594L242 583Q134 439 134 250Q134 114 192 -1Q212 -44 242 -83L249 -94",8814:"693 -14T693 -20T687 -33T675 -41Q667 -41 506 37L344 112Q342 112 262 -46Q184 -196 176 -205Q172 -209 168 -209T162 -208Q155 -208 151 -203T146 -190Q146 -178 171 -137Q193 -91 251 21L306 132L198 183Q142 208 118 220T88 238T82 249Q82 253 86 261Q92 267 278 357L464 443L529 572Q561 637 577 667T597 703T607 708Q615 708 622 702T629 688Q629 680 575 579L524 474Q524 473 545 482T598 508Q666 541 673 541T686 535T693 521Q693 512 679 504T589 459L493 414L360 150Q366 148 378 142T431 116T529 70Q686 -8 689 -10Q693 -14 693 -20ZM380 277L433 383Q432 385 292 319T151 250T237 209T324 170L380 277",8815:"82 514T82 520T89 533T100 541Q106 541 271 463Q434 386 435 386L515 543Q593 699 600 706Q604 708 607 708Q615 708 622 702T629 688T549 526Q509 445 491 407T473 368Q522 343 580 317Q636 291 660 278T688 261T693 250V249Q693 241 681 234T580 184Q533 161 502 146Q317 59 315 59Q312 56 246 -74Q197 -170 186 -189T168 -209Q164 -209 162 -208Q155 -208 151 -203T146 -190Q146 -187 200 -79L253 28L218 11Q182 -6 144 -23T100 -41Q95 -41 89 -35T82 -21Q82 -12 96 -4T186 41L284 88L349 217Q377 273 395 311T413 350Q413 351 253 428Q101 498 86 510Q82 514 82 520ZM624 250Q461 330 455 330Q454 331 453 329T448 321T441 308T430 287T416 259T398 223L342 114L624 250",8816:"82 -124Q82 -120 83 -117T89 -110T95 -103H220L284 50Q346 204 344 206L218 268Q153 297 123 313T87 333T82 344T86 355Q104 369 291 455Q491 552 491 553L542 673Q581 767 590 784T609 801Q616 801 622 795T629 781Q629 773 586 677Q546 581 546 577L609 606Q669 635 673 635Q680 635 686 629T693 615Q693 610 692 608T670 593T604 561L524 521L400 226L542 157Q617 123 649 107T687 85T694 72Q694 66 690 60T679 54Q664 54 526 121Q513 127 495 136T464 150T438 162T416 173T399 180T388 185L384 186Q383 186 322 41L262 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L464 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 174 -213T202 -143H146L93 -141Q82 -134 82 -124ZM418 370L466 495Q464 495 308 420T151 344T204 317T311 267T364 244Q364 247 418 370",8817:"97 54Q82 54 82 72Q82 79 86 84Q95 91 222 153L351 215L398 324L442 433L258 519Q95 597 87 604Q82 608 82 615T88 628T102 635Q107 635 424 484L458 468L524 630Q593 789 597 795Q601 801 609 801Q616 801 622 795T629 781L562 615L493 450L589 406Q665 371 679 362T694 344Q694 339 693 337T677 326T631 302T538 257Q504 241 465 223T406 195T386 186Q384 185 322 39L262 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L464 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 174 -213T202 -143H146L93 -141Q82 -134 82 -124Q82 -120 83 -117T89 -110T95 -103H220L273 26Q326 156 326 157L218 106Q109 54 97 54ZM553 379Q480 412 480 415Q479 415 460 372T423 285T406 241Q408 240 516 291T624 344L553 379",8818:"674 732Q682 732 688 726T694 711T687 697Q686 696 417 568L151 442L399 324Q687 188 691 183Q694 177 694 172Q694 154 676 152H670L382 288Q92 425 90 427Q83 432 83 444Q84 455 96 461Q104 465 382 596T665 730Q669 732 674 732ZM56 -194Q56 -107 106 -51T222 6Q260 6 296 -12T362 -56T420 -108T483 -153T554 -171Q616 -171 654 -128T694 -29Q696 6 708 6Q722 6 722 -26Q722 -102 676 -164T557 -227Q518 -227 481 -209T415 -165T358 -113T294 -69T223 -51Q163 -51 125 -93T83 -196Q81 -228 69 -228Q56 -228 56 -202V-194",8819:"90 697Q83 704 83 712T88 726T99 732Q107 732 253 664T543 527T687 457Q694 452 694 442T687 427Q685 425 395 288L107 152H101Q83 154 83 172Q83 173 83 175Q82 182 98 191Q117 201 248 263Q326 300 378 324L626 442L360 568Q91 696 90 697ZM56 -194Q56 -107 106 -51T222 6Q260 6 296 -12T362 -56T420 -108T483 -153T554 -171Q616 -171 654 -128T694 -29Q696 6 708 6Q722 6 722 -26Q722 -102 676 -164T557 -227Q518 -227 481 -209T415 -165T358 -113T294 -69T223 -51Q163 -51 125 -93T83 -196Q81 -228 69 -228Q56 -228 56 -202V-194",8822:"734 181Q734 173 728 167T714 161Q711 161 386 280T54 404Q44 408 44 421Q44 432 52 437Q66 443 388 562T714 681Q721 681 727 675T734 661Q734 651 722 645Q711 639 462 546Q441 539 420 531L122 421L420 311L723 198Q734 192 734 181ZM44 247Q44 255 50 261T63 267Q66 267 391 148T723 24Q734 18 734 7T723 -10Q716 -14 391 -133T63 -253Q56 -253 50 -247T44 -233Q44 -223 55 -217Q67 -210 317 -118Q337 -110 357 -103L655 7L357 117L54 230Q44 236 44 247",8823:"83 661Q83 668 88 674T104 681Q111 679 396 560Q686 437 687 436Q694 431 694 421T687 406Q686 405 543 344T253 222T101 161Q83 163 83 180Q83 194 95 199Q96 199 130 213T232 257T361 311L621 421L357 532Q307 553 233 584Q121 631 102 640T83 661ZM673 267Q694 267 694 248Q694 237 687 232Q684 229 420 118L156 7L416 -103L683 -215Q694 -222 694 -233Q694 -251 676 -253Q670 -253 524 -192T235 -70T90 -8Q83 -1 83 7Q83 19 94 24Q97 25 378 144T667 266Q669 267 673 267",8826:"84 249Q84 262 91 266T117 270Q120 270 126 270T137 269Q388 273 512 333T653 512Q657 539 676 539Q685 538 689 532T694 520V515Q689 469 672 431T626 366T569 320T500 286T435 265T373 249Q379 248 404 242T440 233T477 221T533 199Q681 124 694 -17Q694 -41 674 -41Q658 -41 653 -17Q646 41 613 84T533 154T418 197T284 220T137 229H114Q104 229 98 230T88 235T84 249",8827:"84 517Q84 539 102 539Q115 539 119 529T125 503T137 459T171 404Q277 275 640 269H661Q694 269 694 249T661 229H640Q526 227 439 214T283 173T173 98T124 -17Q118 -41 103 -41Q83 -41 83 -17Q88 29 105 67T151 132T208 178T277 212T342 233T404 249Q401 250 380 254T345 263T302 276T245 299Q125 358 92 468Q84 502 84 517",8828:"112 270Q83 270 83 290Q83 301 94 307Q98 310 118 310Q516 310 620 464Q635 486 642 510T651 548T657 571T675 580Q693 577 693 559V552Q684 472 628 410T465 314Q436 303 372 290Q373 290 388 287T425 278T465 266Q674 199 693 28L694 17Q688 5 683 3Q677 0 673 0Q656 0 653 24Q623 270 118 270H112ZM110 116Q83 116 83 136T110 156H113Q134 156 160 155T231 146T318 128T407 95T489 44T550 -30T583 -131Q583 -153 563 -153Q556 -153 553 -152T547 -145T542 -127Q531 -54 478 0Q425 53 333 83T123 116H110",8829:"668 310Q694 310 694 290Q694 285 691 279Q684 271 664 270Q550 268 464 257T301 220T179 146T124 27Q119 0 103 0T83 16Q83 21 83 31T92 68T113 121T157 177T229 231Q295 268 405 290Q404 290 389 293T352 302T312 314Q138 371 96 500Q83 541 83 562Q83 568 89 574T103 580Q115 580 120 570T126 542T138 497T173 442Q289 310 659 310H668ZM194 -131Q201 -60 241 -6T343 82T477 133T628 155Q632 155 644 155T661 156Q685 155 690 147Q694 143 694 136Q694 132 693 129T689 124T685 120T681 117L656 116Q596 114 543 106T436 79T342 35T272 -33T235 -127Q231 -154 212 -154Q203 -153 199 -147T194 -136V-131",8830:"84 442Q84 455 91 459T117 463Q120 463 126 463T137 462Q388 466 512 526T653 705Q657 732 676 732Q685 731 689 725T694 714V708Q689 662 672 624T626 559T569 513T500 479T435 458T373 442Q379 441 404 435T440 426T477 414T533 392Q592 362 630 319T681 241T694 174Q694 153 674 153Q662 153 657 163T652 188T640 231T606 287Q500 416 137 422H114Q104 422 98 423T88 428T84 442ZM56 -194Q56 -107 106 -51T222 6Q260 6 296 -12T362 -56T420 -108T483 -153T554 -171Q616 -171 654 -128T694 -29Q696 6 708 6Q722 6 722 -26Q722 -102 676 -164T557 -227Q518 -227 481 -209T415 -165T358 -113T294 -69T223 -51Q163 -51 125 -93T83 -196Q81 -228 69 -228Q56 -228 56 -202V-194",8831:"84 710Q84 732 102 732Q115 732 119 722T125 696T137 652T171 597Q277 468 640 462H661Q694 462 694 442T661 422H640Q578 421 526 417T415 403T309 376T222 333T156 268T124 179Q122 162 118 158T103 153Q100 153 98 153T95 154T93 155T90 158T85 163Q83 167 83 176Q88 222 105 260T151 325T208 371T277 405T342 426T404 442Q401 443 380 447T345 456T302 469T245 492Q125 551 92 661Q84 695 84 710ZM56 -194Q56 -107 106 -51T222 6Q260 6 296 -12T362 -56T420 -108T483 -153T554 -171Q616 -171 654 -128T694 -29Q696 6 708 6Q722 6 722 -26Q722 -102 676 -164T557 -227Q518 -227 481 -209T415 -165T358 -113T294 -69T223 -51Q163 -51 125 -93T83 -196Q81 -228 69 -228Q56 -228 56 -202V-194",8832:"386 292Q388 292 439 393T543 598T598 703Q599 703 603 704T609 705Q616 705 622 699T629 685T533 494Q440 308 440 305Q451 310 462 312Q547 342 592 388T651 505Q654 525 658 532T673 539Q680 539 686 533T693 519Q693 495 678 450Q638 341 500 283Q433 259 418 259Q416 259 411 251T406 241T415 239Q482 224 544 190Q674 121 691 -10Q693 -28 691 -32Q684 -43 672 -43Q664 -43 658 -37Q656 -33 650 -6T634 47T589 109T500 168Q473 179 436 190T388 201H386L284 -1Q261 -45 232 -101T191 -181T178 -206Q176 -206 172 -207T166 -208Q160 -208 153 -202T146 -188Q146 -185 246 12Q344 206 344 210Q344 213 305 217T213 225T124 228H95Q82 241 82 248Q82 253 95 268H124Q172 268 236 273T343 283T386 292",8833:"103 -43Q96 -43 89 -39T82 -26L84 -10Q105 141 275 212Q342 236 355 236Q360 236 364 245L369 256H360Q284 280 275 283Q115 351 86 490Q82 507 82 517Q82 526 88 532T103 538Q110 538 115 534Q119 531 122 517T128 486T143 444T174 397T231 351T320 310Q371 292 389 292L491 496Q595 701 598 703Q599 703 603 704T609 705Q616 705 622 699T629 685Q629 684 531 485Q431 296 431 288Q431 278 520 273T651 268H680Q693 253 693 248Q693 241 680 228H651Q591 228 491 218T386 201L284 -1Q261 -45 232 -101T191 -181T178 -206Q176 -206 172 -207T166 -208Q160 -208 153 -202T146 -188Q146 -182 302 125L335 190L324 185Q313 185 289 172Q241 153 208 128T159 78T135 31T124 -11T118 -37Q112 -43 103 -43",8834:"84 250Q84 372 166 450T360 539Q361 539 370 539T395 539T430 540T475 540T524 540H679Q694 532 694 520Q694 511 681 501L522 500H470H441Q366 500 338 496T266 472Q244 461 224 446T179 404T139 337T124 250V245Q124 157 185 89Q244 25 328 7Q348 2 366 2T522 0H681Q694 -10 694 -20Q694 -32 679 -40H526Q510 -40 480 -40T434 -41Q350 -41 289 -25T172 45Q84 127 84 250",8835:"83 520Q83 532 98 540H251Q267 540 297 540T343 541Q427 541 488 525T605 455Q693 374 693 250Q693 165 650 99T545 0T415 -39Q407 -40 251 -40H98Q83 -32 83 -20Q83 -10 96 0H255H308H337Q412 0 439 4T512 28Q533 39 553 54T599 96T639 163T654 250Q654 341 592 411Q557 449 512 472Q468 491 439 495T335 500H306H255L96 501Q83 511 83 520",8838:"84 346Q84 468 166 546T360 635Q361 635 370 635T395 635T430 636T475 636T524 636H679Q694 628 694 616Q694 607 681 597L522 596H470H441Q366 596 338 592T266 568Q244 557 224 542T179 500T139 433T124 346V341Q124 253 185 185Q244 121 328 103Q348 98 366 98T522 96H681Q694 86 694 76Q694 64 679 56H526Q510 56 480 56T434 55Q350 55 289 71T172 141Q84 223 84 346ZM104 -131T104 -118T118 -98H679Q694 -106 694 -118T679 -138H118Q104 -131 104 -118",8839:"83 616Q83 628 98 636H251Q267 636 297 636T343 637Q427 637 488 621T605 551Q693 470 693 346Q693 261 650 195T545 96T415 57Q407 56 251 56H98Q83 64 83 76Q83 86 96 96H255H308H337Q412 96 439 100T512 124Q533 135 553 150T599 192T639 259T654 346Q654 437 592 507Q557 545 512 568Q468 587 439 591T335 596H306H255L96 597Q83 607 83 616ZM84 -131T84 -118T98 -98H659Q674 -106 674 -118T659 -138H98Q84 -131 84 -118",8840:"146 -283Q146 -282 174 -213T202 -143H115Q102 -127 102 -123T115 -103H220L291 68L278 73Q203 101 153 157T86 288Q83 309 83 344Q83 380 86 399Q107 480 160 539Q222 601 298 621Q328 630 345 631T435 635L526 637L560 715Q587 778 593 789T609 801Q616 801 622 795T629 781Q629 780 625 771T614 742T600 706L571 637Q571 635 626 635H680Q693 620 693 613T689 601L682 597L618 595H553L449 346Q425 288 399 223T359 127T346 95H356Q365 95 381 95T417 94T463 93T515 93H682Q693 82 693 74T680 53H511Q420 55 335 55L329 57L262 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L464 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283ZM509 590Q509 595 438 595Q354 595 318 586Q246 567 195 516T126 395Q123 378 123 344T126 293Q141 229 184 181T291 110L306 104L406 346L509 590",8841:"82 606T82 613T95 635H251H348Q408 635 435 632T502 615L515 608L520 617Q520 619 558 708Q584 774 591 787T609 801Q616 801 622 795T629 781Q629 775 562 615L551 590L569 577Q646 527 678 437Q691 398 691 344T678 250Q653 182 597 132T469 64Q427 53 366 53H326L295 -25L262 -103H660Q673 -118 673 -124Q673 -129 669 -136L662 -141L453 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 174 -213T202 -143H95Q82 -128 82 -123T95 -103H220L251 -25L284 53H189L93 55L86 59Q82 64 82 71T95 93H302L400 333Q498 569 498 573L444 590Q431 593 260 595L93 597L86 601Q82 606 82 613ZM652 344V354Q652 451 575 521Q571 526 557 538T537 551Q534 551 533 548Q533 543 438 319L344 95L371 93H386Q487 93 557 150T649 293Q652 309 652 344",8842:"693 72Q693 68 692 66T686 59T680 52H524Q398 52 367 53T309 63Q236 82 180 132T98 250Q84 288 84 343Q84 397 98 437Q126 515 193 568T346 632Q347 632 373 633T440 634T520 635H680Q693 620 693 615Q693 608 680 595H526Q364 595 353 592Q279 582 221 539T138 430Q124 392 124 343Q124 296 138 257Q163 192 221 149T353 95Q364 92 526 92H680Q693 79 693 72ZM102 -132T102 -125T115 -103H382L420 -68Q429 -60 438 -52T452 -39T463 -28T472 -20T478 -14T483 -10T487 -7T490 -6T493 -5T496 -5Q502 -5 508 -12T515 -28Q515 -34 513 -37Q512 -38 507 -42T492 -55T475 -70L440 -101L562 -103H682Q693 -114 693 -122T680 -143H395L355 -179Q289 -241 280 -241Q273 -241 267 -235T260 -221T265 -208T300 -174L335 -143H224L113 -141L106 -137Q102 -132 102 -125",8843:"82 615Q82 620 95 635H251Q378 635 409 634T469 623Q540 605 596 555T678 437Q691 397 691 343T678 250Q649 172 581 119T426 55Q415 52 251 52H95Q93 55 89 59T84 65T82 72Q82 79 95 92H249Q411 92 422 95Q496 105 554 148T638 257Q651 296 651 343Q651 391 638 430Q613 495 555 538T422 592Q411 595 249 595H95Q82 608 82 615ZM82 -132T82 -125T95 -103H380L420 -57Q452 -21 460 -14T474 -6Q482 -6 488 -12T495 -25T451 -81L433 -101L549 -103H662Q673 -114 673 -122T660 -143H395L355 -190Q311 -239 309 -239Q305 -241 302 -241Q294 -241 287 -235T280 -221T324 -163L342 -143H218L93 -141L86 -137Q82 -132 82 -125",8846:"591 598H592Q604 598 611 583V376Q611 345 611 296Q610 162 606 148Q605 146 605 145Q586 68 507 23T333 -22Q268 -22 209 -1T106 66T56 173Q55 180 55 384L56 585Q66 598 75 598Q85 598 95 585V378L96 172L98 162Q112 95 181 57T332 18Q415 18 487 58T570 175Q571 180 571 383V583Q579 598 591 598ZM313 406Q313 417 313 435T312 459Q312 483 316 493T333 503T349 494T353 461V406V325H515Q516 325 519 323T527 316T531 305T527 294T520 287T515 285H353V204V152Q353 127 350 117T333 107T316 117T312 152Q312 158 312 175T313 204V285H151Q150 285 147 287T139 294T135 305T139 316T146 323T151 325H313V406",8847:"83 523Q87 535 99 539H679Q694 531 694 519Q694 506 679 499H123V-1H678Q694 -7 694 -21Q694 -34 679 -41H98Q93 -38 84 -28L83 247V523",8848:"64 506T64 519T78 539H699Q706 536 714 526V-28Q706 -38 699 -41H78Q64 -34 64 -21Q64 -6 80 -1H674V499H78Q64 506 64 519",8849:"94 620Q98 632 110 636H699Q714 628 714 616T699 596H134V96H698Q714 90 714 76Q714 64 699 56H109Q104 59 95 69L94 344V620ZM84 -118Q84 -103 100 -98H698Q714 -104 714 -118Q714 -130 699 -138H98Q84 -131 84 -118",8850:"64 603T64 616T78 636H668Q675 633 683 623V69Q675 59 668 56H78Q64 63 64 76Q64 91 80 96H643V596H78Q64 603 64 616ZM64 -118Q64 -108 79 -98H678Q694 -104 694 -118Q694 -130 679 -138H78Q64 -131 64 -118",8851:"83 0Q79 0 76 1T71 3T67 6T65 9T63 13T61 16V301L62 585Q70 595 76 598H592Q602 590 605 583V15Q598 2 587 0Q583 0 580 1T575 3T571 6T569 9T567 13T565 16V558H101V15Q94 2 83 0",8852:"77 0Q65 4 61 16V301L62 585Q72 598 81 598Q94 598 101 583V40H565V583Q573 598 585 598Q598 598 605 583V15Q602 10 592 1L335 0H77",8853:"56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM364 542Q308 539 251 509T148 418T96 278V270H369V542H364ZM681 278Q675 338 650 386T592 462T522 509T458 535T412 542H409V270H681V278ZM96 222Q104 150 139 95T219 12T302 -29T366 -42H369V230H96V222ZM681 222V230H409V-42H412Q429 -42 456 -36T521 -10T590 37T649 113T681 222",8854:"56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM681 278Q669 385 591 463T381 542Q283 542 196 471T96 278V270H681V278ZM275 -42T388 -42T585 32T681 222V230H96V222Q108 107 191 33",8855:"56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM582 471Q531 510 496 523Q446 542 381 542Q324 542 272 519T196 471L389 278L485 375L582 471ZM167 442Q95 362 95 250Q95 137 167 58L359 250L167 442ZM610 58Q682 138 682 250Q682 363 610 442L418 250L610 58ZM196 29Q209 16 230 2T295 -27T388 -42Q409 -42 429 -40T465 -33T496 -23T522 -11T544 1T561 13T574 22T582 29L388 222L196 29",8856:"56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM582 471Q581 472 571 480T556 491T539 502T517 514T491 525T460 534T424 539T381 542Q272 542 184 460T95 251Q95 198 113 150T149 80L167 58L582 471ZM388 -42Q513 -42 597 44T682 250Q682 363 610 442L196 29Q209 16 229 2T295 -27T388 -42",8857:"56 250Q56 394 156 488T384 583Q530 583 626 485T722 250Q722 110 625 14T390 -83Q249 -83 153 14T56 250ZM682 250Q682 322 649 387T546 497T381 542Q272 542 184 459T95 250Q95 132 178 45T389 -42Q515 -42 598 45T682 250ZM311 250Q311 285 332 304T375 328Q376 328 382 328T392 329Q424 326 445 305T466 250Q466 217 445 195T389 172Q354 172 333 195T311 250",8858:"57 250Q57 327 87 392T166 497T270 560T382 582H394Q512 582 610 500Q721 401 721 250Q721 112 626 15T389 -82Q251 -82 154 13T57 250ZM682 129T682 250T596 457T390 543Q269 543 183 457T96 250Q96 132 180 45T389 -43Q511 -43 596 43ZM250 250Q250 316 295 352T384 388Q451 388 489 347T528 250Q528 192 487 152T389 112Q331 112 291 152T250 250ZM488 250Q488 290 460 319T389 349Q348 349 319 320T290 250Q290 208 320 180T389 151Q431 151 459 181T488 250",8859:"57 250Q57 327 87 392T166 497T270 560T382 582H394Q512 582 610 500Q721 401 721 250Q721 112 626 15T389 -82Q251 -82 154 13T57 250ZM682 129T682 250T596 457T390 543Q269 543 183 457T96 250Q96 132 180 45T389 -43Q511 -43 596 43ZM204 339Q204 357 215 366T238 375Q247 375 283 348Q300 336 311 328L368 286Q369 286 366 323T359 398T355 437Q357 456 379 465Q380 465 384 465T391 466Q403 465 412 457T423 437Q423 436 420 398T413 323T410 286L467 328Q476 334 486 341T501 353T513 361T523 368T529 372T535 374T541 375Q554 375 564 365T575 339Q575 325 566 318T519 292Q504 285 496 281L430 250L496 219Q552 192 559 188T572 175Q575 168 575 161Q575 148 566 137T541 126H538Q530 126 499 149Q480 163 467 172L410 214Q409 214 412 177T419 102T423 63Q423 59 421 54T411 43T389 36T368 42T357 54T355 63Q355 64 358 102T365 177T368 214L311 172Q302 165 293 159T279 148T268 140T260 134T254 131T250 128T246 127T242 126T238 126Q223 126 214 135T204 161T213 183T282 219L348 250L282 281Q226 308 219 312T206 325Q204 330 204 339",8861:"57 250Q57 327 87 392T166 497T270 560T382 582H394Q512 582 610 500Q721 401 721 250Q721 112 626 15T389 -82Q251 -82 154 13T57 250ZM682 129T682 250T596 457T390 543Q269 543 183 457T96 250Q96 132 180 45T389 -43Q511 -43 596 43ZM223 250Q223 263 233 267T280 271Q289 271 325 271T389 270H490Q535 270 545 267T555 250Q555 241 549 235Q544 231 527 231T389 230Q239 230 235 232Q223 236 223 250",8862:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM369 365V649H95V365H369ZM682 365V649H409V365H682ZM369 40V325H95V40H369ZM682 40V325H409V40H682",8863:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM682 365V649H95V365H682ZM682 40V325H95V40H682",8864:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H707Q714 686 722 676V13Q714 3 707 0H71ZM123 649Q147 625 214 555T335 430T389 374L654 649H123ZM95 70Q99 74 229 209T360 345L95 619V70ZM682 70V619L418 346Q417 344 549 207L682 70ZM654 41L400 304L388 315L123 41L256 40H522L654 41",8865:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM682 40V649H95V40H682ZM330 345Q330 371 347 388T390 405Q412 405 430 389T448 345Q448 317 430 301T389 285T348 301T330 345",8866:"55 678Q55 679 56 681T58 684T61 688T65 691T70 693T77 694Q88 692 95 679V367H540Q555 359 555 347Q555 334 540 327H95V15Q88 2 77 0Q73 0 70 1T65 3T61 6T59 9T57 13T55 16V678",8867:"515 678Q515 679 516 681T518 684T521 688T525 691T530 693T537 694Q548 692 555 679V15Q548 2 537 0Q533 0 530 1T525 3T521 6T519 9T517 13T515 16V327H71Q70 327 67 329T59 336T55 347T59 358T66 365T71 367H515V678",8868:"55 642T55 648T59 659T66 666T71 668H708Q723 660 723 648T708 628H409V15Q402 2 391 0Q387 0 384 1T379 3T375 6T373 9T371 13T369 16V628H71Q70 628 67 630T59 637",8869:"369 652Q369 653 370 655T372 658T375 662T379 665T384 667T391 668Q402 666 409 653V40H708Q723 32 723 20T708 0H71Q70 0 67 2T59 9T55 20T59 31T66 38T71 40H369V652",8872:"139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V367H796Q811 359 811 347Q811 336 797 328L479 327H161L159 328V172L161 173H797Q798 172 800 171T803 169T805 167T808 164T809 162T810 158T811 153Q811 140 796 133H159V-235Q151 -249 141 -249H139",8873:"55 678Q55 679 56 681T58 684T61 688T65 691T70 693T77 694Q88 692 95 679V15Q88 2 77 0Q73 0 70 1T65 3T61 6T59 9T57 13T55 16V678ZM249 678Q249 679 250 681T252 684T255 688T259 691T264 693T271 694Q282 692 289 679V367H651Q666 359 666 347Q666 334 651 327H289V15Q282 2 271 0Q267 0 264 1T259 3T255 6T253 9T251 13T249 16V678",8874:"55 678Q55 679 56 681T58 684T61 688T65 691T70 693T77 694Q88 692 95 679V15Q88 2 77 0Q73 0 70 1T65 3T61 6T59 9T57 13T55 16V678ZM237 678Q237 679 238 681T240 684T243 688T247 691T252 693T259 694Q270 692 277 679V15Q270 2 259 0Q255 0 252 1T247 3T243 6T241 9T239 13T237 16V678ZM419 678Q419 679 420 681T422 684T425 688T429 691T434 693T441 694Q452 692 459 679V367H818Q833 359 833 347Q833 334 818 327H459V15Q452 2 441 0Q437 0 434 1T429 3T425 6T423 9T421 13T419 16V678",8876:"56 681Q70 695 76 695T96 681V368H243L381 530Q521 692 525 692Q537 700 547 688Q554 682 554 674Q554 671 553 669T548 661T539 649T522 631T499 604T465 565T421 512Q296 373 296 368H416H476Q525 368 539 365T554 348Q554 334 543 328H261L96 141V12Q81 -1 75 -1Q65 -1 58 10L56 50V92L18 48Q7 37 -1 28T-13 14T-19 6T-23 1T-27 0T-33 -1Q-42 -1 -48 4T-55 19Q-55 24 -47 34T12 103L56 155V681ZM205 326Q205 328 152 328H96V263Q96 203 98 203Q99 203 123 231T174 290T205 326",8877:"56 681Q70 695 76 695T96 681V466H327L425 579Q522 692 527 692Q529 693 534 693Q542 693 547 688T553 674Q553 668 549 663Q549 662 538 650T504 611T463 563L381 468L461 466H543Q554 453 554 446T541 426H345L209 272L376 270H543Q554 257 554 251T541 230H174L96 141V12Q81 -1 75 -1Q65 -1 58 10L56 50V92L18 48Q7 37 -1 28T-13 14T-19 6T-23 1T-27 0T-33 -1Q-42 -1 -48 4T-55 19Q-55 24 -47 34T12 103L56 155V681ZM267 399L292 426H96V270H158L201 321Q256 382 267 399ZM118 228L119 229Q119 230 109 230H96V201L107 212Q118 227 118 228",8878:"56 681Q70 695 77 695T96 683V428L98 175L252 323V681Q264 695 272 695Q278 695 292 681V526Q292 368 296 368Q298 368 447 510Q638 695 642 695H645Q651 695 658 688T665 673Q665 666 661 661Q659 660 639 641T578 582T505 512L356 370L505 368H654Q665 357 665 349Q665 343 652 328H314L303 317L292 308V12Q289 10 285 6T279 1T272 -1Q265 -1 252 12V139Q252 266 249 266L96 119V12Q80 -1 76 -1T70 0T63 6T56 12V79L29 55Q-26 -1 -35 -1Q-42 -1 -48 5T-55 19Q-55 25 -51 30T-15 66Q5 86 18 99L56 135V681",8879:"56 681Q70 695 77 695T96 683V428L98 175L252 323V681Q264 695 272 695Q278 695 292 681V466H401L503 563L621 679Q637 695 645 695Q652 695 658 688T665 673Q665 670 663 666Q663 665 651 652T611 612T561 563L458 468L556 466H654Q665 455 665 447T652 426H416L294 308L292 288V270H652Q665 255 665 250T652 230H292V12Q289 10 285 6T279 1T272 -1Q265 -1 252 12V139Q252 266 249 266L96 119V12Q80 -1 76 -1T70 0T63 6T56 12V79L29 55Q-26 -1 -35 -1Q-42 -1 -48 5T-55 19Q-55 25 -51 30T-15 66Q5 86 18 99L56 135V681ZM358 426H292V361L325 392L358 426",8882:"694 -26Q686 -40 676 -41H670L382 95Q92 232 90 234Q83 239 83 249Q83 262 96 267Q101 270 379 401T665 537Q671 539 674 539Q686 539 694 524V-26ZM654 11T654 249T653 487T402 369T151 249L275 190Q399 131 524 72T652 11Q654 11 654 249",8883:"83 523Q83 524 85 527T92 535T103 539Q107 539 389 406T680 268Q694 260 694 249Q694 239 687 234Q685 232 395 95L107 -41H101Q90 -40 83 -26V523ZM376 368Q323 393 254 425T155 472L125 487Q123 487 123 249T125 11Q127 12 252 71T502 190L626 249L376 368",8884:"694 71Q686 58 676 56H670L382 192Q92 329 90 331Q83 336 83 346Q83 359 96 364Q101 367 379 498T665 634Q671 636 674 636Q686 636 694 621V71ZM654 108T654 346T653 584T402 466T151 346L275 287Q399 228 524 169T652 108Q654 108 654 346ZM83 -120Q83 -116 84 -113T86 -108T89 -104T92 -102T96 -100T99 -98H678Q679 -98 681 -99T684 -101T688 -104T691 -108T693 -113T694 -120Q692 -130 679 -138H98Q84 -130 83 -120",8885:"83 620Q83 621 85 624T92 632T103 636Q107 636 389 503T680 365Q694 357 694 346Q694 336 687 331Q685 329 395 192L107 56H101Q90 58 83 71V620ZM376 465Q323 490 254 522T155 570L125 584Q123 584 123 346T125 108Q127 109 252 168T502 287L626 346L376 465ZM83 -120Q83 -116 84 -113T86 -108T89 -104T92 -102T96 -100T99 -98H678Q679 -98 681 -99T684 -101T688 -104T691 -108T693 -113T694 -120Q692 -130 679 -138H98Q84 -130 83 -120",8888:"1055 250Q1055 190 1012 141T896 92Q858 92 828 106T781 140T755 180T741 214L738 228V230H405Q71 230 68 232Q55 238 55 250T68 268Q71 270 405 270H738V272L740 280Q742 287 745 297T754 321T771 348T796 374T832 396T881 408H891Q969 408 1012 360T1055 250ZM896 132Q948 132 981 166T1014 250Q1014 301 985 330T920 367Q914 368 891 368Q853 368 816 338T778 250Q778 198 812 165T896 132",8890:"318 -182Q302 -212 280 -212H278H275Q249 -212 239 -182L238 84V351H162L87 352Q57 362 57 391T84 429Q89 431 280 431H470L474 429Q477 427 479 426T484 423T490 417T495 410T499 402T500 391Q500 365 470 352L394 351H318V-182",8891:"56 697Q56 706 62 711T75 716Q86 716 90 709Q91 708 104 680T147 592T199 483L305 261L411 483Q443 548 481 629Q512 694 518 705T535 716Q543 716 549 710T555 700Q555 693 501 577T388 340T325 210Q316 194 305 194Q292 194 285 210Q282 219 224 339T111 574T56 697ZM55 14T55 20T59 31T66 38T71 40H540Q555 32 555 20T540 0H71Q70 0 67 2T59 9",8892:"55 698Q56 708 70 716H540Q554 708 555 698Q555 694 554 691T552 686T549 682T546 680T542 678T539 676H71Q70 676 68 677T65 679T61 682T58 686T56 691T55 698ZM555 18Q554 12 549 6T536 0H535Q525 0 515 17T459 132Q430 194 410 235L305 455L199 233Q176 185 147 125T105 36T90 7Q85 0 75 0Q63 0 58 11Q55 15 55 21Q58 31 170 266T285 507Q295 522 305 522T320 515Q322 513 439 268L555 24V18",8896:"119 -249T97 -249T65 -235T55 -207Q55 -201 56 -198Q58 -190 218 268T380 729Q392 750 416 750Q438 750 451 732Q453 728 534 498T695 36L775 -194Q777 -204 777 -208Q777 -222 767 -235T735 -249Q713 -249 700 -231Q696 -225 557 177L416 579L276 177Q136 -226 132 -231Q119 -249 97 -249",8897:"55 708Q55 729 68 739T96 750Q119 750 132 731Q136 726 276 323L416 -79L557 323Q696 725 700 731Q713 749 735 749Q756 749 766 736T777 708Q777 700 696 466T533 1T451 -232Q436 -249 416 -249Q402 -249 391 -241Q384 -236 380 -226Q368 -198 219 230Q55 697 55 708",8898:"139 -217Q127 -241 114 -246Q106 -249 97 -249Q67 -249 57 -220Q55 -214 55 102Q55 152 55 221T54 312Q54 422 60 464T91 554Q120 612 165 654T257 714T337 741T392 749Q393 750 402 750Q414 750 422 749Q557 749 660 659T776 430Q777 422 777 102Q777 -214 775 -220Q765 -249 735 -249Q716 -249 708 -241T694 -217L692 428L690 441Q674 540 597 603T416 666H409Q388 666 364 662T294 638T212 581Q156 523 142 441L140 428L139 105V-217",8899:"96 750Q103 750 109 748T120 744T127 737T133 730T137 723T139 718V395L140 73L142 60Q159 -43 237 -104T416 -166Q521 -166 597 -103T690 60L692 73L694 718Q708 749 735 749Q765 749 775 720Q777 714 777 398Q777 78 776 71Q766 -51 680 -140Q571 -249 416 -249H411Q261 -249 152 -140Q66 -51 56 71Q55 78 55 398Q55 714 57 720Q60 734 70 740Q80 750 96 750",8900:"242 486Q245 488 250 488Q256 488 258 486Q262 484 373 373T486 258T488 250T486 242T373 127T258 14Q256 12 250 12Q245 12 242 14Q237 16 127 126T14 242Q12 245 12 250T14 258Q16 263 126 373T242 486ZM439 250L250 439L61 250L250 61L439 250",8901:"78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250",8902:"210 282Q210 284 225 381T241 480Q241 484 245 484Q249 486 251 486Q258 486 260 477T272 406Q275 390 276 380Q290 286 290 282L388 299Q484 314 487 314H488Q497 314 497 302Q497 297 434 266Q416 257 404 251L315 206L361 118Q372 98 383 75T401 40L407 28Q407 16 395 16Q394 16 392 16L390 17L250 159L110 17L108 16Q106 16 105 16Q93 16 93 28L99 40Q105 52 116 75T139 118L185 206L96 251Q6 296 4 300Q3 301 3 302Q3 314 12 314H13Q16 314 112 299L210 282",8903:"366 543Q374 545 382 545Q405 545 419 538Q429 534 443 521T462 496Q466 478 466 467Q466 438 444 412Q422 390 388 390Q352 390 331 412Q311 434 311 467Q311 499 331 518Q345 533 366 543ZM146 472Q146 479 153 485T166 492Q171 492 187 476T279 385L386 278L495 385Q600 492 608 492Q615 492 621 486T628 472Q628 467 614 452T531 367L435 270H706Q720 256 720 250Q720 241 706 230H435L531 132Q600 63 614 48T628 27Q628 20 622 14T608 7Q600 7 495 114L386 221L279 114Q204 39 188 23T166 7Q159 7 153 13T146 27Q146 32 160 47T244 132L339 230H68Q55 243 55 250Q55 255 68 270H339L244 367Q175 436 161 451T146 472ZM466 34Q466 4 447 -20T388 -44Q353 -44 331 -22Q311 1 311 34Q311 66 331 85Q347 101 366 110Q374 112 382 112Q405 112 419 105Q429 100 443 87T462 63Q466 45 466 34",8904:"833 50T833 250T832 450T659 351T487 250T658 150T832 50Q833 50 833 250ZM873 10Q866 -5 854 -5Q851 -5 845 -3L449 226L260 115Q51 -5 43 -5Q39 -5 35 -1T28 7L26 11V489Q33 505 43 505Q51 505 260 385L449 274L845 503Q851 505 853 505Q866 505 873 490V10ZM412 250L67 450Q66 450 66 250T67 50Q69 51 240 150T412 250",8905:"146 479Q159 492 166 492Q171 492 189 475T279 386L386 279L495 386Q598 492 608 492Q615 492 621 486T628 472Q628 464 522 357L415 250L522 144Q628 37 628 28Q628 21 622 15T608 8Q599 8 495 115L386 221L279 115Q204 40 188 24T166 8Q162 8 160 9T153 15T146 21V479ZM186 77L359 250L186 424V77",8906:"146 472Q146 479 152 485T166 492Q171 492 189 475T279 386L386 279L495 386Q598 492 608 492Q615 492 628 479V21Q615 8 608 8Q599 8 495 115L386 221L279 115Q204 40 188 24T166 8Q159 8 153 14T146 28Q146 37 253 144L359 250L253 357Q146 464 146 472ZM588 77V424L499 337L415 250L588 77",8907:"55 674Q55 682 62 688T76 694H77Q83 694 100 677T208 561Q320 440 410 342Q462 286 541 201Q677 55 699 30T722 -2Q722 -9 716 -15T701 -22T688 -17Q687 -15 542 141T394 301L388 306L240 146Q119 15 101 -3T75 -22T61 -16T55 -2Q55 4 67 19T158 117Q190 151 209 172L361 336L209 500Q62 657 57 667Q55 671 55 674",8908:"84 -22T76 -22T62 -16T55 -2Q55 4 78 30T249 215Q321 293 367 342Q672 672 683 682Q695 694 702 694Q710 694 716 688T722 674Q722 668 710 653T619 555Q587 521 568 500L416 336L568 172Q715 15 720 5Q722 1 722 -2Q722 -9 716 -15T702 -22H700Q693 -22 671 1T537 146L389 306Q387 304 340 253T237 143T135 33L89 -17Q84 -22 76 -22",8909:"56 433Q56 464 71 464Q74 464 77 461Q82 454 82 438T91 397T123 347Q166 307 222 307Q264 307 308 331T386 385T465 438T556 463Q631 463 676 408T722 283Q722 250 708 250Q704 250 699 257Q695 265 693 286T682 330Q670 350 655 367Q612 407 556 407Q514 407 470 383T393 329T314 276T222 251Q148 251 102 306T56 433ZM57 56Q57 71 73 76H706Q722 70 722 56Q722 44 707 36H71Q57 43 57 56",8910:"83 558Q83 566 89 572T104 578Q108 578 116 577T146 570T190 555T239 526T286 480Q308 453 325 420T351 358T367 304T376 265T380 251T381 253Q381 262 395 312Q428 434 492 499T642 576Q654 578 655 578Q664 578 670 572T676 558Q676 543 657 540T599 524T525 476Q406 362 400 29V8Q400 -21 380 -21Q369 -21 362 -11Q360 -7 360 12Q360 115 348 200T308 360T231 480T111 537Q83 540 83 558",8911:"104 -22Q95 -22 89 -16T83 -2Q83 11 98 16T135 23T192 46T256 103Q360 233 360 549Q360 554 360 557T361 563T362 567T364 569T367 572T371 576Q377 578 380 578Q401 578 401 547Q401 543 401 537T400 527Q409 53 648 19Q676 16 676 -2Q676 -10 670 -16T655 -22Q654 -22 642 -20Q556 -9 492 56T395 244Q381 294 381 303Q381 305 380 305T374 275T352 201T310 110T234 27T117 -20Q105 -22 104 -22",8912:"84 250Q84 372 166 450T360 539Q361 539 370 539T395 539T430 540T475 540T524 540H679Q694 532 694 520Q694 511 681 501L522 500H470H441Q366 500 338 496T266 472Q244 461 224 446T179 404T139 337T124 250V245Q124 157 185 89Q244 25 328 7Q348 2 366 2T522 0H681Q694 -10 694 -20Q694 -32 679 -40H526Q510 -40 480 -40T434 -41Q350 -41 289 -25T172 45Q84 127 84 250ZM694 134Q694 123 679 114H425H384Q350 114 326 121T277 154Q238 193 238 251Q238 322 295 361Q318 378 339 382T412 387Q423 387 459 387T520 386H679Q694 377 694 366Q694 354 679 346H519Q493 346 458 346T411 347Q360 347 341 342T303 315Q278 287 278 250Q278 210 301 187T351 156Q358 154 519 154H679Q694 146 694 134",8913:"83 520Q83 532 98 540H251Q267 540 297 540T343 541Q427 541 488 525T605 455Q693 374 693 250Q693 165 650 99T545 0T415 -39Q407 -40 251 -40H98Q83 -32 83 -20Q83 -10 96 0H255H308H337Q412 0 439 4T512 28Q533 39 553 54T599 96T639 163T654 250Q654 341 592 411Q557 449 512 472Q468 491 439 495T335 500H306H255L96 501Q83 511 83 520ZM83 366Q83 376 96 386H244Q280 386 317 386T378 386L402 387Q456 387 498 348T540 250Q540 203 512 168T446 120Q427 114 353 114H99Q84 120 84 134Q84 147 98 154H258Q284 154 319 154T366 153Q416 153 436 158T474 185Q500 214 500 250Q500 290 477 313T426 344Q419 346 258 346H98Q83 354 83 366",8914:"88 -21T75 -21T55 -7V200Q55 231 55 280Q56 414 60 428Q61 430 61 431Q77 500 152 549T332 598Q443 598 522 544T610 405Q611 399 611 194V-7Q604 -22 591 -22Q582 -22 572 -9L570 405Q563 433 556 449T529 485Q498 519 445 538T334 558Q251 558 179 518T96 401Q95 396 95 193V-7Q88 -21 75 -21ZM229 -21H227Q215 -21 209 -7V166Q209 304 209 327T215 363Q226 398 259 421T333 444Q380 444 414 416T455 347Q457 339 457 166V-7Q449 -21 439 -21H437H435Q423 -21 417 -7V164Q417 303 417 325T411 358Q387 403 333 403T255 358Q250 347 250 325T249 164V-7Q241 -21 231 -21H229",8915:"591 598H592Q604 598 611 583V376Q611 345 611 296Q610 162 606 148Q605 146 605 145Q586 68 507 23T333 -22Q268 -22 209 -1T106 66T56 173Q55 180 55 384L56 585Q66 598 75 598Q85 598 95 585V378L96 172L98 162Q112 95 181 57T332 18Q415 18 487 58T570 175Q571 180 571 383V583Q579 598 591 598ZM437 598Q450 598 457 583V410Q457 237 455 229Q448 189 414 161T333 132Q291 132 255 157T211 230Q209 237 209 412L210 585Q220 598 229 598Q242 598 249 583V412Q249 273 249 251T255 218Q279 173 333 173T411 218Q416 229 416 251T417 412V583Q425 598 437 598",8916:"76 -22Q64 -22 56 -7V176L57 360L59 370Q66 401 83 426T123 468T171 495T221 513T265 522T298 527L311 528H314V625L315 723Q325 736 334 736Q346 736 354 721V528H356L368 527Q380 526 399 523T441 515T490 498T537 472T578 433T606 379Q611 359 611 171V-7Q604 -21 591 -21T571 -7V170Q571 313 571 337T565 375Q555 408 526 432T461 467T402 482T365 487H354V-7Q347 -21 334 -21T314 -7V487H303Q251 484 207 467Q121 438 99 367L97 357L96 174V-9Q86 -22 76 -22",8918:"86 261Q92 267 381 404T673 541Q680 541 686 535T693 521T689 510Q684 504 418 379L151 250L418 121Q686 -4 689 -10Q693 -14 693 -21T687 -34T675 -41Q668 -41 380 96T86 239Q82 244 82 250Q82 257 86 261ZM610 250Q610 224 592 198T531 172Q498 172 475 195Q453 214 453 250Q453 308 513 328Q515 330 535 330Q569 328 589 304T610 250",8919:"82 521Q82 529 89 535T100 541Q107 541 395 404T689 261Q693 257 693 250T689 239Q684 234 396 97T100 -41Q95 -41 89 -35T82 -21Q82 -12 96 -4Q118 9 358 121L624 250L358 379Q91 503 86 510Q82 514 82 521ZM165 250Q165 282 188 306T239 330Q262 330 275 323Q303 312 318 283Q322 272 322 250Q322 213 300 195Q277 172 246 172Q224 172 213 177Q165 200 165 250",8920:"639 -48Q639 -54 634 -60T619 -67H618Q612 -67 536 -26Q430 33 329 88Q61 235 59 239Q56 243 56 250T59 261Q62 266 336 415T615 567L619 568Q622 567 625 567Q639 562 639 548Q639 540 633 534Q632 532 374 391L117 250L374 109Q632 -32 633 -34Q639 -40 639 -48ZM958 -48Q958 -54 953 -60T938 -67H937Q931 -67 855 -26Q749 33 648 88Q380 235 378 239Q375 243 375 250T378 261Q381 266 655 415T934 567L938 568Q941 567 944 567Q958 562 958 548Q958 540 952 534Q951 532 693 391L436 250L693 109Q951 -32 952 -34Q958 -40 958 -48ZM1277 -48Q1277 -54 1272 -60T1257 -67H1256Q1250 -67 1174 -26Q1068 33 967 88Q699 235 697 239Q694 243 694 250T697 261Q700 266 974 415T1253 567L1257 568Q1260 567 1263 567Q1277 562 1277 548Q1277 540 1271 534Q1270 532 1012 391L755 250L1012 109Q1270 -32 1271 -34Q1277 -40 1277 -48",8921:"75 -67Q65 -67 60 -61T55 -48Q55 -40 61 -34Q62 -32 329 109L595 250L329 391Q62 532 61 534Q55 540 55 548Q55 562 69 567H77Q81 567 222 493T506 342T653 264Q667 250 653 236Q649 234 504 157T220 7T77 -67H75ZM364 547Q364 563 381 567L384 568Q387 568 518 499T795 353T955 269Q967 261 967 250T955 231Q925 216 780 139T513 -3T383 -67Q373 -67 369 -60T364 -47Q364 -40 370 -34Q373 -31 639 109L904 250L639 391Q373 531 370 534Q364 540 364 547ZM674 538T674 548T681 562T693 567Q699 567 816 505Q915 453 993 412Q1050 382 1132 339Q1241 282 1259 271T1277 250Q1277 241 1263 232Q1246 221 985 84Q698 -67 692 -67Q674 -67 674 -47Q674 -38 680 -33Q683 -30 947 109L1213 250L947 391Q683 530 680 533Q674 538 674 548",8922:"674 445Q674 438 669 432T655 425T369 531T90 640Q83 645 83 655Q83 668 95 673Q644 886 654 886Q662 886 668 880T674 866Q674 856 663 850Q649 843 411 751L160 655L407 560Q474 534 561 501Q646 469 660 462T674 445ZM84 250Q84 260 99 270H658Q674 264 674 250Q674 238 659 230H98Q84 237 84 250ZM83 55Q83 68 94 73Q98 76 104 76Q108 75 383 -30T664 -138Q674 -144 674 -155Q674 -165 667 -170Q664 -173 385 -279T104 -386Q85 -386 83 -368Q83 -354 92 -349Q93 -349 347 -251L597 -155L346 -59Q296 -40 223 -12Q118 28 101 36T83 55",8923:"111 425T102 425T88 431T83 445V446Q83 455 96 461Q111 469 203 504Q287 536 350 560L597 655L346 751Q94 848 92 850Q83 856 83 866Q83 873 88 879T104 886Q109 885 386 779T667 670Q674 665 674 655T667 640Q665 638 388 532ZM84 250Q84 260 99 270H658Q674 264 674 250Q674 238 659 230H98Q84 237 84 250ZM653 76Q656 76 660 75T669 68T674 56Q674 46 665 40Q663 38 411 -59L160 -155L410 -251Q664 -349 665 -349Q674 -354 674 -368Q672 -386 654 -386Q650 -386 371 -279T90 -170Q83 -165 83 -155Q83 -144 93 -138Q645 76 653 76",8926:"113 424Q83 424 83 444Q83 453 96 464H121Q181 466 234 474T341 501T435 545T505 613T542 707Q545 734 564 734Q583 731 583 714Q583 658 560 613T500 538T414 486T321 453T229 434T156 426T113 424ZM112 270Q83 270 83 290Q83 301 94 307Q98 310 118 310Q624 310 653 556Q657 580 675 580Q693 577 693 559V552Q684 472 628 410T465 314Q436 303 372 290Q373 290 388 287T425 278T465 266Q674 199 693 28L694 17L692 14Q691 11 689 8T683 3T673 0Q657 0 653 24Q623 270 118 270H112",8927:"195 713Q195 725 201 729T214 734Q227 734 231 722T238 691T255 641T299 580Q405 474 656 464H681Q694 451 694 443Q694 424 670 424H664Q535 424 415 465T235 595Q195 657 195 713ZM668 310Q694 310 694 290Q694 285 691 279Q684 271 664 270Q550 268 464 257T301 220T179 146T124 27Q119 0 103 0T83 16Q83 21 83 31T92 68T113 121T157 177T229 231Q295 268 405 290Q404 290 389 293T352 302T312 314Q138 371 96 500Q83 541 83 562Q83 568 89 574T103 580Q115 580 120 570T126 542T138 497T173 442Q289 310 659 310H668",8928:"82 344Q82 349 95 364H124Q266 364 398 390L429 397L509 595Q519 619 536 659Q581 766 590 783T609 801Q616 801 622 795T629 781Q629 776 553 595Q533 548 516 506T489 439T480 415Q482 415 505 426T538 444Q632 498 651 601Q654 621 658 628T673 635Q680 635 686 629T693 615Q693 591 678 546Q636 433 484 375L458 364L451 348Q443 332 443 329T455 324Q480 316 503 307T560 277T619 233T664 170T691 86Q693 68 691 64Q684 53 672 53Q664 53 658 59Q657 60 650 97T617 174T538 244Q515 257 476 273T428 289Q425 289 412 256Q381 179 344 90L262 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L464 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 174 -213T202 -143H95Q82 -128 82 -123T95 -103H220L302 97Q384 288 384 299Q384 302 341 308T235 319T124 324H95Q82 337 82 344ZM399 338Q403 338 406 346L409 353L375 344Q375 343 384 341T399 338",8929:"146 -283Q146 -282 174 -213T202 -143H95Q82 -127 82 -123T95 -103H220L300 93Q343 196 374 270Q385 294 386 299L373 295Q331 287 289 268Q241 249 208 224T159 174T135 127T124 85T118 59Q112 53 103 53Q91 53 84 64Q82 68 84 86Q96 185 174 248T375 337L400 344Q399 344 381 348T351 355T316 364T276 379T235 398T193 424T155 456T122 497T98 546Q82 587 82 615Q82 622 88 628T102 635Q112 635 116 628T124 601Q128 579 134 562T159 515T207 463T290 418T415 384L422 381L506 586Q571 744 584 772T609 801Q616 801 622 795T629 781T544 577Q525 529 504 478T473 402T462 375Q480 373 500 373Q579 364 651 364H680Q682 361 686 357T691 351T693 344Q693 337 680 324H651Q553 324 451 310L433 308L349 104L262 -101L473 -103H682Q694 -115 694 -123Q694 -133 682 -141L464 -143H246L213 -219Q182 -292 178 -299Q172 -303 166 -303T153 -297T146 -283",8934:"86 450Q93 455 380 592T673 730Q680 730 686 724T693 710Q693 702 688 699Q686 693 417 568L151 439L417 310Q685 185 688 179Q693 176 693 168Q693 161 687 155T675 148Q668 148 380 285T86 428Q74 438 86 450ZM55 -205Q55 -175 64 -142T92 -76T145 -22T222 -1Q288 -1 362 -66Q369 -72 372 -75T378 -79T382 -81T384 -79Q389 -74 439 21Q483 100 490 111T504 122Q510 122 518 118T526 103Q526 101 510 69T467 -12T419 -99L413 -112L433 -128Q498 -180 553 -180Q605 -180 646 -139Q672 -112 681 -77T693 -21T706 -1Q719 -1 719 -33Q719 -39 717 -57Q708 -141 655 -190Q625 -224 586 -232Q568 -237 551 -237Q487 -237 413 -172L391 -155Q391 -157 335 -255Q297 -325 286 -342T268 -359Q260 -359 254 -353T248 -339T304 -230L359 -126Q359 -124 337 -107T302 -81Q262 -57 221 -57Q170 -57 130 -93T84 -201Q82 -236 70 -236Q55 -236 55 -205",8935:"88 723Q95 730 99 730Q106 730 394 593T688 450Q693 447 693 439T688 428Q683 423 395 286T99 148Q94 148 88 155T82 168Q82 175 86 179Q89 184 357 310L624 439L357 568Q88 694 86 699Q81 703 81 711T88 723ZM55 -205Q55 -175 64 -142T92 -76T145 -22T222 -1Q288 -1 362 -66Q369 -72 372 -75T378 -79T382 -81T384 -79Q389 -74 439 21Q483 100 490 111T504 122Q510 122 518 118T526 103Q526 101 510 69T467 -12T419 -99L413 -112L433 -128Q498 -180 553 -180Q605 -180 646 -139Q672 -112 681 -77T693 -21T706 -1Q719 -1 719 -33Q719 -39 717 -57Q708 -141 655 -190Q625 -224 586 -232Q568 -237 551 -237Q487 -237 413 -172L391 -155Q391 -157 335 -255Q297 -325 286 -342T268 -359Q260 -359 254 -353T248 -339T304 -230L359 -126Q359 -124 337 -107T302 -81Q262 -57 221 -57Q170 -57 130 -93T84 -201Q82 -236 70 -236Q55 -236 55 -205",8936:"95 419Q81 433 81 439T95 459H124Q318 459 455 501Q515 521 556 550T615 607T641 659T652 702T659 725Q667 730 673 730Q680 730 686 724T693 710Q693 682 677 641Q668 616 654 594T622 554T586 522T545 497T504 477T464 462T428 452T397 444T375 439Q379 437 410 430T476 411T551 379T625 321T677 237Q693 196 693 168Q693 161 687 155T673 148Q662 148 658 154T651 181Q638 253 591 300T455 377Q318 419 124 419H95ZM55 -205Q55 -175 64 -142T92 -76T145 -22T222 -1Q288 -1 362 -66Q369 -72 372 -75T378 -79T382 -81T384 -79Q389 -74 439 21Q483 100 490 111T504 122Q510 122 518 118T526 103Q526 101 510 69T467 -12T419 -99L413 -112L433 -128Q498 -180 553 -180Q605 -180 646 -139Q672 -112 681 -77T693 -21T706 -1Q719 -1 719 -33Q719 -39 717 -57Q708 -141 655 -190Q625 -224 586 -232Q568 -237 551 -237Q487 -237 413 -172L391 -155Q391 -157 335 -255Q297 -325 286 -342T268 -359Q260 -359 254 -353T248 -339T304 -230L359 -126Q359 -124 337 -107T302 -81Q262 -57 221 -57Q170 -57 130 -93T84 -201Q82 -236 70 -236Q55 -236 55 -205",8937:"679 459Q693 445 693 439Q693 430 679 419H651Q455 419 319 377Q231 347 184 300T124 181Q120 161 116 155T102 148Q95 148 89 154T82 168Q82 192 97 237Q111 275 137 306T188 355T249 391T307 414T361 429T399 439Q397 440 364 447T298 467T224 499T149 557T97 641Q82 686 82 710Q82 717 88 723T102 730L115 725Q118 722 124 697Q137 625 184 578T319 501Q456 459 651 459H679ZM55 -205Q55 -175 64 -142T92 -76T145 -22T222 -1Q288 -1 362 -66Q369 -72 372 -75T378 -79T382 -81T384 -79Q389 -74 439 21Q483 100 490 111T504 122Q510 122 518 118T526 103Q526 101 510 69T467 -12T419 -99L413 -112L433 -128Q498 -180 553 -180Q605 -180 646 -139Q672 -112 681 -77T693 -21T706 -1Q719 -1 719 -33Q719 -39 717 -57Q708 -141 655 -190Q625 -224 586 -232Q568 -237 551 -237Q487 -237 413 -172L391 -155Q391 -157 335 -255Q297 -325 286 -342T268 -359Q260 -359 254 -353T248 -339T304 -230L359 -126Q359 -124 337 -107T302 -81Q262 -57 221 -57Q170 -57 130 -93T84 -201Q82 -236 70 -236Q55 -236 55 -205",8938:"693 -30Q686 -41 673 -41Q661 -41 506 34L346 110L280 -44Q228 -162 216 -185T193 -208Q177 -208 173 -192Q173 -186 242 -30T311 128Q271 145 184 186T86 236Q82 240 82 246Q82 251 86 259Q96 267 271 350L449 434L506 565Q537 635 551 664T571 700T582 706Q587 706 593 701T600 690Q600 679 553 572Q504 463 504 461L586 501Q672 539 673 539Q679 539 693 525V-30ZM653 10V488L566 445L480 405L422 276Q415 260 405 236T388 199T376 171T368 151T366 145Q368 143 510 77T653 10ZM422 374Q422 376 420 376T285 313T151 248Q315 168 326 163Q415 356 422 374",8939:"82 525Q96 539 102 539Q103 539 122 530T186 501T266 463L426 388Q428 388 495 541Q564 694 569 699Q573 706 581 706Q587 706 593 702T600 691Q600 676 533 528Q515 486 506 465T485 418T470 381T466 370Q466 369 575 316Q676 269 689 259Q693 253 693 248Q693 242 689 236Q688 235 506 145Q328 63 324 59Q324 50 266 -70Q224 -169 214 -188T193 -208Q177 -208 173 -192Q173 -183 222 -77Q244 -29 257 2T269 34L186 -6Q108 -43 99 -43Q93 -43 82 -30V525ZM271 416Q129 485 126 485H125Q122 485 122 250Q122 10 124 10L211 50L295 92L411 350Q411 351 271 416ZM624 248L449 332L440 319Q434 297 393 214Q353 121 353 119Q355 119 489 182T624 248",8940:"82 -123Q82 -114 93 -103H166L238 -101L293 50Q349 200 349 204L220 266Q166 291 140 304T100 325T84 336T82 344Q82 353 94 360Q112 372 282 453L473 541L482 568Q487 578 529 693Q559 785 569 795Q573 802 581 802Q587 802 593 797T599 786Q599 775 564 675L526 570Q526 568 561 584T633 617T673 635Q679 635 693 621V66Q686 54 679 54Q665 54 526 119Q491 137 458 153T405 177T386 184Q385 182 334 42T282 -101T482 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L473 -143H266L238 -219Q217 -278 210 -290T193 -303Q178 -303 173 -287Q173 -279 198 -214L222 -145Q222 -143 158 -143L93 -141L86 -136Q82 -131 82 -123ZM653 106V584L506 513L453 370Q442 339 428 300T407 243T400 224Q403 222 527 164T653 106ZM453 486Q453 488 451 488T300 417T151 344L224 308Q247 298 285 279T331 257L364 241L453 486",8941:"82 621Q96 635 102 635T249 568L420 486L449 473L469 533Q563 789 569 797Q573 801 581 801Q598 801 600 786Q602 781 544 617L484 455Q531 435 584 408Q677 364 689 355Q693 351 693 344Q693 339 692 337T676 325T631 302T538 257Q504 241 465 223T406 195T386 186Q384 184 333 44T282 -101Q282 -103 482 -103H680Q682 -105 684 -108T688 -113T691 -118T693 -124Q693 -134 682 -141L473 -143H266L238 -219Q217 -278 210 -290T193 -303Q178 -303 173 -287Q173 -279 198 -214L222 -145Q222 -143 158 -143L93 -141L86 -136Q82 -131 82 -123Q82 -114 93 -103H166L238 -101L333 159Q326 159 220 106Q110 54 97 54Q89 54 82 66V621ZM298 501Q155 567 142 575L122 584V344Q122 106 124 106Q125 106 180 132T291 185T351 213Q355 217 393 326L433 435Q433 436 298 501ZM549 381Q472 417 471 417L406 241Q408 240 516 291T624 344L549 381",8942:"78 30Q78 54 95 72T138 90Q162 90 180 74T199 31Q199 6 182 -12T139 -30T96 -13T78 30ZM78 440Q78 464 95 482T138 500Q162 500 180 484T199 441Q199 416 182 398T139 380T96 397T78 440ZM78 840Q78 864 95 882T138 900Q162 900 180 884T199 841Q199 816 182 798T139 780T96 797T78 840",8943:"78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250ZM525 250Q525 274 542 292T585 310Q609 310 627 294T646 251Q646 226 629 208T586 190T543 207T525 250ZM972 250Q972 274 989 292T1032 310Q1056 310 1074 294T1093 251Q1093 226 1076 208T1033 190T990 207T972 250",8945:"133 760Q133 784 150 802T193 820Q217 820 235 804T254 761Q254 736 237 718T194 700T151 717T133 760ZM580 460Q580 484 597 502T640 520Q664 520 682 504T701 461Q701 436 684 418T641 400T598 417T580 460ZM1027 160Q1027 184 1044 202T1087 220Q1111 220 1129 204T1148 161Q1148 136 1131 118T1088 100T1045 117T1027 160",8965:"55 698Q56 708 70 716H540Q554 708 555 698Q555 694 554 691T552 686T549 682T546 680T542 678T539 676H71Q70 676 68 677T65 679T61 682T58 686T56 691T55 698ZM555 18Q554 12 549 6T536 0H535Q525 0 515 17T459 132Q430 194 410 235L305 455L199 233Q176 185 147 125T105 36T90 7Q85 0 75 0Q63 0 58 11Q55 15 55 21Q58 31 170 266T285 507Q295 522 305 522T320 515Q322 513 439 268L555 24V18",8966:"55 795Q56 806 70 813H540Q554 806 555 795Q555 791 554 788T552 783T549 779T546 777T542 775T539 773H71Q70 773 68 774T65 776T61 779T58 783T56 788T55 795ZM55 601Q56 612 70 619H540Q554 612 555 601Q555 597 554 594T552 589T549 585T546 583T542 581T539 579H71Q70 579 68 580T65 582T61 585T58 589T56 594T55 601ZM75 -97Q67 -97 61 -91T55 -81Q55 -71 169 166T285 410Q295 425 305 425Q311 425 316 422T323 414L325 410Q327 404 441 167T555 -81Q555 -85 549 -91T535 -97T520 -90Q519 -89 506 -61T463 27T411 136L305 358L199 136Q167 71 129 -10Q98 -75 92 -86T75 -97",8968:"174 734Q178 746 190 750H298H369Q400 750 411 747T422 730T411 713T372 709Q365 709 345 709T310 710H214V-235Q206 -248 196 -250Q192 -250 189 -249T184 -247T180 -244T178 -241T176 -237T174 -234V734",8969:"21 717T21 730T32 746T75 750H147H256Q266 742 269 735V-235Q262 -248 251 -250Q247 -250 244 -249T239 -247T235 -244T233 -241T231 -237T229 -234V710H133Q119 710 99 710T71 709Q43 709 32 713",8970:"174 734Q174 735 175 737T177 740T180 744T184 747T189 749T196 750Q206 748 214 735V-210H310H373Q401 -210 411 -213T422 -230T411 -247T369 -251Q362 -251 338 -251T298 -250H190Q178 -246 174 -234V734",8971:"229 734Q229 735 230 737T232 740T235 744T239 747T244 749T251 750Q262 748 269 735V-235Q266 -240 256 -249L147 -250H77Q43 -250 32 -247T21 -230T32 -213T72 -209Q79 -209 99 -209T133 -210H229V734",8988:"76 306Q62 306 59 319T55 386V500V596Q55 664 57 676T68 692Q71 694 250 694Q428 694 432 692Q444 685 444 674Q444 665 432 656Q428 654 261 654H95V487Q95 355 95 336T90 312Q84 306 76 306",8989:"424 306Q418 306 413 310T406 318L404 321V654H238Q71 654 68 656Q55 662 55 674T68 692Q71 694 250 694H379Q432 694 438 688Q443 683 443 662T444 500T444 338T438 312Q432 306 424 306",8990:"55 172V287Q55 341 58 353T76 366Q88 366 95 351V18H261Q428 18 432 16Q444 9 444 -2Q444 -11 432 -20Q428 -22 250 -22H120Q67 -22 61 -16Q56 -11 56 10T55 172",8991:"404 351Q410 366 424 366Q437 366 440 353T444 288V172V72Q444 8 443 -4T432 -20Q428 -22 250 -22Q71 -22 68 -20Q55 -14 55 -2T68 16Q71 18 238 18H404V351",8994:"55 141Q55 149 72 174T125 234T209 303T329 360T478 388H526Q649 383 765 319Q814 291 858 250T923 179T944 141Q944 133 938 128T924 122Q914 124 912 125T902 139Q766 328 500 328Q415 328 342 308T225 258T150 199T102 148T84 124Q81 122 75 122Q55 127 55 141",8995:"923 378Q944 378 944 358Q944 345 912 311T859 259Q710 134 500 134Q288 134 140 259Q55 336 55 358Q55 366 61 372T75 378Q78 378 84 376Q86 376 101 356T147 310T221 257T339 212T500 193Q628 193 734 236Q841 282 903 363Q914 378 923 378",9001:"333 -232Q332 -239 327 -244T313 -250Q303 -250 296 -240Q293 -233 202 6T110 250T201 494T296 740Q299 745 306 749L309 750Q312 750 313 750Q331 750 333 732Q333 727 243 489Q152 252 152 250T243 11Q333 -227 333 -232",9002:"55 732Q56 739 61 744T75 750Q85 750 92 740Q95 733 186 494T278 250T187 6T92 -240Q85 -250 75 -250Q67 -250 62 -245T55 -232Q55 -227 145 11Q236 248 236 250T145 489Q55 727 55 732",9136:"357 741V726Q357 720 349 715Q261 655 242 539Q240 526 240 454T239 315T239 247Q240 235 240 124V40Q240 -17 233 -53T201 -130Q155 -206 78 -244H69H64Q58 -244 57 -243T56 -234Q56 -232 56 -231V-225Q56 -218 63 -215Q153 -153 170 -39Q172 -25 173 119V219Q173 245 174 249Q173 258 173 376V460Q173 515 178 545T201 611Q244 695 327 741L334 744H354L357 741",9137:"78 744Q153 706 196 640T239 492V376Q239 341 239 314T238 271T238 253Q239 251 239 223V119V49Q239 -39 254 -85Q263 -111 275 -134T301 -172T326 -197T346 -213T356 -221T357 -232V-241L354 -244H334Q264 -209 222 -146T174 -12Q173 -6 173 95Q173 134 173 191T174 250Q173 258 173 382V451Q173 542 159 585Q145 626 120 658T75 706T56 723V731Q56 741 57 742T66 744H78",9168:"312 0V602H355V0H312",9416:"451 -175Q328 -175 226 -115T66 47T8 267Q8 303 15 342T39 431T94 531T186 622Q239 663 307 686T424 709H440Q604 709 716 622Q757 592 788 555T838 482T869 414T886 350T892 301T894 267Q894 147 835 45T674 -116T451 -175ZM854 268Q854 375 802 467T657 614T450 670Q283 670 166 552T49 267Q49 99 167 -18T453 -136Q617 -136 735 -18T854 268ZM273 378Q273 430 309 474T409 527Q411 527 417 527T428 528Q498 528 549 484L567 505Q583 528 590 528H594Q600 528 606 522V350L600 344H586Q577 344 574 344T569 347T566 357Q542 491 432 491Q389 491 365 465T340 407Q340 391 344 378T358 356T377 340T400 328T421 321T443 316T459 313Q499 305 517 300T559 279T601 238Q629 195 629 148Q629 80 583 33T471 -14Q392 -14 330 30Q312 6 293 -13Q292 -14 285 -14Q279 -14 273 -8V77V138Q273 160 275 165T286 170H294H307Q313 164 313 158Q313 108 350 67T471 26Q512 26 537 54T562 119Q562 137 558 151T544 176T527 193T504 205T483 212T459 218T441 222Q391 232 368 241T318 273Q273 316 273 378",9484:"76 306Q62 306 59 319T55 386V500V596Q55 664 57 676T68 692Q71 694 250 694Q428 694 432 692Q444 685 444 674Q444 665 432 656Q428 654 261 654H95V487Q95 355 95 336T90 312Q84 306 76 306",9488:"424 306Q418 306 413 310T406 318L404 321V654H238Q71 654 68 656Q55 662 55 674T68 692Q71 694 250 694H379Q432 694 438 688Q443 683 443 662T444 500T444 338T438 312Q432 306 424 306",9492:"55 172V287Q55 341 58 353T76 366Q88 366 95 351V18H261Q428 18 432 16Q444 9 444 -2Q444 -11 432 -20Q428 -22 250 -22H120Q67 -22 61 -16Q56 -11 56 10T55 172",9496:"404 351Q410 366 424 366Q437 366 440 353T444 288V172V72Q444 8 443 -4T432 -20Q428 -22 250 -22Q71 -22 68 -20Q55 -14 55 -2T68 16Q71 18 238 18H404V351",9585:"19 -195Q13 -195 7 -188T0 -176Q0 -169 18 -151L822 683Q835 694 840 694T852 688T860 674Q860 667 810 614T460 252Q57 -167 44 -179Q27 -195 19 -195",9586:"0 675Q0 681 6 687T19 694Q27 694 44 678L460 247Q759 -62 809 -115T860 -175Q860 -183 852 -189T840 -195Q835 -195 822 -184L18 649Q0 667 0 675",9632:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71",9633:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM682 40V649H95V40H682",9642:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71",9650:"99 -20Q84 -11 84 0Q84 5 148 145T278 424L342 563Q347 575 360 575Q368 575 375 570Q376 569 441 430T571 148T637 0Q637 -11 622 -20H99",9651:"75 0L72 2Q69 3 67 5T62 11T59 20Q59 24 62 30Q65 37 245 370T428 707Q428 708 430 710T436 714T444 716Q451 716 455 712Q459 710 644 368L828 27V20Q828 7 814 0H75ZM610 347L444 653Q443 653 278 347T113 40H775Q775 42 610 347",9652:"99 -20Q84 -11 84 0Q84 5 148 145T278 424L342 563Q347 575 360 575Q368 575 375 570Q376 569 441 430T571 148T637 0Q637 -11 622 -20H99",9653:"75 0L72 2Q69 3 67 5T62 11T59 20Q59 24 62 30Q65 37 245 370T428 707Q428 708 430 710T436 714T444 716Q451 716 455 712Q459 710 644 368L828 27V20Q828 7 814 0H75ZM610 347L444 653Q443 653 278 347T113 40H775Q775 42 610 347",9654:"83 523Q83 524 85 527T92 535T103 539Q107 539 389 406T680 268Q694 260 694 249Q694 239 687 234Q685 232 395 95L107 -41H101Q90 -40 83 -26V523",9656:"83 523Q83 524 85 527T92 535T103 539Q107 539 389 406T680 268Q694 260 694 249Q694 239 687 234Q685 232 395 95L107 -41H101Q90 -40 83 -26V523",9657:"26 489Q33 505 43 505Q51 505 260 385Q464 266 471 259Q473 257 473 250Q473 242 469 239Q459 231 260 115Q51 -5 43 -5Q39 -5 35 -1T28 7L26 11V489ZM412 250L67 450Q66 450 66 250T67 50Q69 51 240 150T412 250",9660:"84 556Q84 567 99 576H622Q637 567 637 556Q637 551 572 409T441 127T375 -14Q368 -19 360 -19H358Q349 -19 342 -7T296 92Q249 193 211 275Q84 550 84 556",9661:"59 480Q59 485 61 489T66 495T72 498L75 500H814Q828 493 828 480V474L644 132Q458 -210 455 -212Q451 -215 444 -215T433 -212Q429 -210 342 -49T164 282T64 466Q59 478 59 480ZM775 460H113Q113 459 278 153T444 -153T610 153T775 460",9662:"84 556Q84 567 99 576H622Q637 567 637 556Q637 551 572 409T441 127T375 -14Q368 -19 360 -19H358Q349 -19 342 -7T296 92Q249 193 211 275Q84 550 84 556",9663:"59 480Q59 485 61 489T66 495T72 498L75 500H814Q828 493 828 480V474L644 132Q458 -210 455 -212Q451 -215 444 -215T433 -212Q429 -210 342 -49T164 282T64 466Q59 478 59 480ZM775 460H113Q113 459 278 153T444 -153T610 153T775 460",9664:"694 -26Q686 -40 676 -41H670L382 95Q92 232 90 234Q83 239 83 249Q83 262 96 267Q101 270 379 401T665 537Q671 539 674 539Q686 539 694 524V-26",9666:"694 -26Q686 -40 676 -41H670L382 95Q92 232 90 234Q83 239 83 249Q83 262 96 267Q101 270 379 401T665 537Q671 539 674 539Q686 539 694 524V-26",9667:"473 10Q466 -5 454 -5Q451 -5 445 -3Q444 -3 343 56T140 173T35 234Q26 239 26 250T35 266Q40 269 240 384T445 503Q451 505 453 505Q466 505 473 490V10ZM433 50T433 250T432 450T259 351T87 250T258 150T432 50Q433 50 433 250",9674:"318 709Q325 716 332 716Q340 716 344 713T474 511Q611 298 611 292Q611 285 526 152Q494 103 474 72Q347 -128 344 -130Q340 -132 333 -132T322 -130Q319 -128 257 -31T131 169T60 278Q56 285 56 292Q56 298 60 305Q73 326 194 516T318 709ZM567 290T567 291T451 475T333 658L100 293Q100 288 215 108L333 -74Q334 -74 450 108",9711:"56 250Q56 353 95 442T196 589T335 681T491 715Q573 715 635 693Q694 673 747 635T846 543T917 412T944 250Q944 58 815 -78T500 -215Q457 -215 429 -210Q274 -183 165 -56T56 250ZM500 -176Q664 -176 784 -54T904 250Q904 418 799 536T543 674Q534 675 493 675Q425 675 357 647T229 567T133 432T96 250Q96 160 129 80T217 -56T346 -144T500 -176",9723:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71ZM682 40V649H95V40H682",9724:"71 0Q59 4 55 16V346L56 676Q64 686 70 689H709Q719 681 722 674V15Q719 10 709 1L390 0H71",9733:"367 395Q374 416 398 492T442 627T463 688Q463 692 467 692Q471 694 472 694Q478 694 484 680T523 562Q553 469 576 400L577 395H731H819Q872 395 883 394T895 384Q895 380 891 376T832 333Q794 305 767 285Q643 195 643 194L690 47Q737 -96 737 -103Q737 -111 727 -111Q721 -111 594 -18L472 71L350 -18Q223 -111 217 -111Q207 -111 207 -103Q207 -96 254 47L301 194Q301 195 241 239T118 328T51 378Q49 382 49 384Q49 392 58 393T110 395H213H367",9824:"181 -21Q134 -21 96 27T55 193Q55 224 58 247T82 317T143 410Q172 443 234 498Q282 543 314 598T360 687T380 725Q386 727 389 727Q395 727 398 725T406 716T413 702T423 677T439 641Q481 556 544 498Q633 420 678 353T723 204Q723 142 711 94T669 12T590 -21Q520 -21 490 8T459 66V70H409V62Q409 22 416 -17T430 -82T437 -112Q437 -131 407 -131Q403 -131 397 -131T389 -130T382 -130T372 -131Q341 -131 341 -111Q341 -107 348 -82T362 -18T369 62V70H319V66Q319 57 314 44T297 16T257 -10T191 -21H181",9825:"55 490Q55 557 71 604T114 674T167 706T222 716Q279 716 322 684T389 605Q391 610 395 617T414 643T447 677T494 704T555 716Q642 716 682 652T723 490Q723 455 718 426T684 342T602 227Q573 196 537 161T485 110T449 63T412 -8Q408 -22 404 -27T389 -33Q382 -33 379 -31T372 -23T366 -8T355 18T335 54Q319 81 298 104T239 163T176 227Q102 310 79 371T55 490ZM198 674Q143 664 119 613T95 491Q95 415 137 346Q174 282 265 194T384 48L389 39Q391 42 397 54T406 71T415 86T427 104T442 122T464 146T491 172Q571 249 613 303Q683 396 683 487Q683 581 649 631Q613 676 556 676Q495 676 457 634T410 538Q407 514 390 514Q386 514 380 517Q372 520 369 536T355 581T319 635Q277 675 223 675H217H208L204 674Q200 674 198 674",9826:"370 714Q370 717 375 722T388 727Q398 727 403 721T417 697Q420 692 421 689Q536 465 709 304Q723 291 723 282T709 260Q529 93 406 -153Q402 -162 390 -162H389Q379 -162 376 -158T357 -125Q247 89 89 241L64 265Q55 272 55 282Q55 287 57 290T64 300T77 312T98 331T127 361Q197 435 258 523T344 663L370 714ZM655 299Q568 384 508 470T389 662L376 638Q362 613 341 577T289 497T215 399T123 299L105 282L123 265Q210 180 270 94T389 -98L402 -74Q416 -49 437 -13T489 67T563 165T655 265L673 282L655 299",9827:"213 532Q213 615 265 670T389 726Q461 726 513 671T565 532Q565 511 562 492T553 458T541 432T526 409T512 393T498 379L490 371L511 326Q512 326 516 330T528 341T546 353T572 363T606 368Q664 368 707 315T750 174Q750 87 699 33T579 -22Q567 -22 553 -20T517 -10T479 16T459 63V70H409V62Q409 22 416 -17T430 -82T437 -112Q437 -131 407 -131Q403 -131 397 -131T389 -130T382 -130T372 -131Q341 -131 341 -111Q341 -107 348 -82T362 -18T369 62V70H319V63Q315 25 281 2T197 -22Q132 -22 80 32T28 174Q28 255 69 311T175 368Q192 368 207 364T232 353T250 341T262 331T267 326L288 371L280 378Q272 385 267 391T253 407T238 430T226 457T217 492T213 532",9837:"200 467Q254 467 293 428T332 321Q332 147 104 -11L88 -22H75Q62 -22 56 -16L55 362V647Q55 743 60 748Q63 750 76 750H83Q87 750 95 744V434L104 440Q144 467 200 467ZM237 322Q237 360 225 388T183 417Q158 417 134 407T101 378Q96 370 96 349T95 197V34Q152 91 194 167T237 322",9838:"65 721Q78 734 94 734Q100 734 104 727V444L116 449Q129 454 157 465T208 486Q313 527 314 527Q318 527 324 521V-210Q306 -223 294 -223Q289 -223 284 -216V-13L270 -18Q257 -24 231 -34T180 -54Q77 -96 74 -96T65 -90V721ZM104 13Q282 84 283 85Q284 85 284 252Q284 418 283 418L230 396L140 360L104 346V13",9839:"101 -223Q94 -223 93 -217T91 -188V-151Q91 -88 90 -88Q87 -88 80 -92T68 -96Q62 -96 56 -90L55 -50V-22Q55 -8 58 -4T78 5L91 10V177Q91 343 90 343Q87 343 80 339T68 335Q62 335 56 341L55 381V409Q55 423 58 427T78 436L91 441V543V616Q91 643 93 648T106 656Q119 662 126 659Q130 657 130 645T131 554V456L257 503V607L258 710L260 712Q261 715 272 719T286 723Q293 723 295 715T297 671V617Q297 519 298 519Q301 519 307 522T319 526Q327 526 333 521V437L330 435Q328 432 312 427L297 421V254Q297 88 298 88Q301 88 307 91T319 95Q327 95 333 90V6L330 4Q328 1 312 -4L297 -10V-78V-122Q297 -145 295 -149T282 -156Q274 -160 268 -160Q257 -160 257 -130V-89V-25L131 -72V-210Q123 -215 116 -218T104 -222L101 -223ZM257 72V406L131 359V25L257 72",10003:"84 231Q84 244 114 264T170 285Q176 285 183 274T224 205Q267 129 268 129Q271 141 279 163T318 250T389 378T502 523T662 673Q702 706 732 706H734Q749 706 749 695Q749 682 730 666T660 607T559 505Q387 299 328 29Q324 0 295 -17T245 -34H241Q234 -34 225 -21T185 46Q166 79 154 101Q84 223 84 231",10016:"195 702T195 706T201 716H632Q638 710 638 706T636 700T621 690Q436 581 427 374V357H430Q554 357 645 421Q682 447 711 483T755 542T770 567Q775 572 786 563V131Q777 125 774 125T762 139Q709 228 642 274T482 333Q452 337 430 337H427V320Q430 279 437 247T462 170T521 82T621 4Q630 -2 633 -4T637 -7T638 -12Q638 -16 632 -22H201Q195 -16 195 -12T197 -6T212 4Q397 113 406 320V337H403Q279 337 188 273Q151 247 122 211T78 152T63 127Q58 122 48 131V563Q54 569 59 569Q62 569 71 555Q124 466 191 420T351 361Q381 357 403 357H406V374Q403 415 396 447T371 525T312 613T212 690Q199 697 197 699",10072:"139 -249H137Q125 -249 119 -235V251L120 737Q130 750 139 750Q152 750 159 735V-235Q151 -249 141 -249H139",10216:"333 -232Q332 -239 327 -244T313 -250Q303 -250 296 -240Q293 -233 202 6T110 250T201 494T296 740Q299 745 306 749L309 750Q312 750 313 750Q331 750 333 732Q333 727 243 489Q152 252 152 250T243 11Q333 -227 333 -232",10217:"55 732Q56 739 61 744T75 750Q85 750 92 740Q95 733 186 494T278 250T187 6T92 -240Q85 -250 75 -250Q67 -250 62 -245T55 -232Q55 -227 145 11Q236 248 236 250T145 489Q55 727 55 732",10222:"357 741V726Q357 720 349 715Q261 655 242 539Q240 526 240 394V331Q240 259 239 250Q240 242 240 119V49Q240 -42 254 -85Q263 -111 275 -134T301 -172T326 -197T346 -213T356 -221T357 -232V-241L354 -244H334Q264 -209 222 -146T174 -12Q173 -6 173 95Q173 134 173 191T174 250Q173 260 173 376V460Q173 515 178 545T201 611Q244 695 327 741L334 744H354L357 741",10223:"78 744Q153 706 196 640T239 492V376Q239 339 239 311T238 269T238 252Q240 236 240 124V40Q240 -18 233 -53T202 -130Q156 -206 79 -244H70H65Q58 -244 57 -242T56 -231T57 -220T64 -215Q153 -154 170 -39Q173 -18 174 119V247Q173 249 173 382V451Q173 542 159 585Q145 626 120 658T75 706T56 723V731Q56 741 57 742T66 744H78",10229:"165 270H1510Q1525 262 1525 250T1510 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270",10230:"84 237T84 250T98 270H1444Q1328 357 1301 493Q1301 494 1301 496T1300 499Q1300 511 1317 511H1320Q1329 511 1332 510T1338 506T1341 497T1344 481T1352 456Q1374 389 1425 336T1544 261Q1553 258 1553 250Q1553 244 1548 241T1524 231T1486 212Q1445 186 1415 152T1370 85T1349 35T1341 4Q1339 -6 1336 -8T1320 -11Q1300 -11 1300 0Q1300 7 1305 25Q1337 151 1444 230H98Q84 237 84 250",10231:"165 270H1694Q1578 357 1551 493Q1551 494 1551 496T1550 499Q1550 511 1567 511H1570Q1579 511 1582 510T1588 506T1591 497T1594 481T1602 456Q1624 389 1675 336T1794 261Q1803 258 1803 250Q1803 244 1798 241T1774 231T1736 212Q1695 186 1665 152T1620 85T1599 35T1591 4Q1589 -6 1586 -8T1570 -11Q1550 -11 1550 0Q1550 7 1555 25Q1587 151 1694 230H165Q167 228 182 216T211 189T244 152T277 96T303 25Q308 7 308 0Q308 -11 288 -11Q281 -11 278 -11T272 -7T267 2T263 21Q245 94 195 151T73 236Q58 242 55 247Q55 254 59 257T73 264Q121 283 158 314T215 375T247 434T264 480L267 497Q269 503 270 505T275 509T288 511Q308 511 308 500Q308 493 303 475Q293 438 278 406T246 352T215 315T185 287T165 270",10232:"274 173H1539Q1540 172 1542 171T1545 169T1547 167T1550 164T1551 162T1552 158T1553 153Q1553 140 1538 133H318L328 123Q379 69 414 0Q419 -13 419 -17Q419 -24 399 -24Q388 -24 385 -23T377 -12Q332 77 253 144T72 237Q62 240 59 242T56 250T59 257T70 262T89 268T119 278T160 296Q303 366 377 512Q382 522 385 523T401 525Q419 524 419 515Q419 510 414 500Q379 431 328 377L318 367H1538Q1553 359 1553 347Q1553 336 1539 328L1221 327H903L900 328L602 327H274L264 319Q225 289 147 250Q148 249 165 241T210 217T264 181L274 173",10233:"1218 514Q1218 525 1234 525Q1239 525 1242 525T1247 525T1251 524T1253 523T1255 520T1257 517T1260 512Q1297 438 1358 381T1469 300T1565 263Q1582 258 1582 250T1573 239T1536 228T1478 204Q1334 134 1260 -12Q1256 -21 1253 -22T1238 -24Q1218 -24 1218 -17Q1218 -13 1223 0Q1258 69 1309 123L1319 133H70Q56 140 56 153Q56 168 72 173H1363L1373 181Q1412 211 1490 250Q1489 251 1472 259T1427 283T1373 319L1363 327H710L707 328L390 327H72Q56 332 56 347Q56 360 70 367H1319L1309 377Q1276 412 1247 458T1218 514",10234:"1438 514Q1438 525 1454 525Q1459 525 1462 525T1467 525T1471 524T1473 523T1475 520T1477 517T1480 512Q1517 438 1578 381T1689 300T1785 263Q1802 258 1802 250T1793 239T1756 228T1698 204Q1554 134 1480 -12Q1476 -21 1473 -22T1458 -24Q1438 -24 1438 -17Q1438 -13 1443 0Q1478 69 1529 123L1539 133H318L328 123Q379 69 414 0Q419 -13 419 -17Q419 -24 399 -24Q388 -24 385 -23T377 -12Q332 77 253 144T72 237Q62 240 59 242T56 250T59 257T70 262T89 268T119 278T160 296Q303 366 377 512Q382 522 385 523T401 525Q419 524 419 515Q419 510 414 500Q379 431 328 377L318 367H1539L1529 377Q1496 412 1467 458T1438 514ZM274 173H1583L1593 181Q1632 211 1710 250Q1709 251 1692 259T1647 283T1593 319L1583 327H930L927 328L602 327H274L264 319Q225 289 147 250Q148 249 165 241T210 217T264 181L274 173",10236:"95 155V109Q95 83 92 73T75 63Q61 63 58 74T54 130Q54 140 54 180T55 250Q55 421 57 425Q61 437 75 437Q88 437 91 428T95 393V345V270H1444Q1328 357 1301 493Q1301 494 1301 496T1300 499Q1300 511 1317 511H1320Q1329 511 1332 510T1338 506T1341 497T1344 481T1352 456Q1374 389 1425 336T1544 261Q1553 258 1553 250Q1553 244 1548 241T1524 231T1486 212Q1445 186 1415 152T1370 85T1349 35T1341 4Q1339 -6 1336 -8T1320 -11Q1300 -11 1300 0Q1300 7 1305 25Q1337 151 1444 230H95V155",10731:"318 709Q325 716 332 716Q340 716 344 713T474 511Q611 298 611 292Q611 285 526 152Q494 103 474 72Q347 -128 344 -130Q340 -132 333 -132T322 -130Q319 -128 257 -31T131 169T60 278Q56 285 56 292Q56 298 60 305Q73 326 194 516T318 709",10744:"166 -215T159 -215T147 -212T141 -204T139 -197Q139 -190 144 -183Q157 -157 378 274T602 707Q605 716 618 716Q625 716 630 712T636 703T638 696Q638 691 406 241T170 -212Q166 -215 159 -215",10752:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM555 -165Q672 -165 767 -108T916 44T970 250Q970 418 861 532T600 664Q591 665 548 665Q446 665 353 614T200 466T140 250V243Q140 88 248 -30Q262 -46 280 -62T338 -105T434 -148T555 -165ZM478 250Q478 288 503 307T551 326Q586 326 609 305T632 250Q632 217 610 196T555 174T500 196T478 250",10753:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM513 478Q513 664 512 664Q504 664 481 660T406 637T313 588Q281 564 255 537T211 483T181 431T161 382T150 342T144 310T141 292H513V478ZM798 588Q758 616 711 634T639 658T602 663L597 664V292H969Q969 293 967 309T960 341T949 381T930 430T900 482T856 537T798 588ZM513 -164V208H141Q142 205 144 189T149 160T158 125T173 83T196 39T229 -9Q249 -34 273 -55T318 -92T363 -119T405 -138T444 -150T475 -158T499 -162T513 -164ZM775 -103Q801 -87 823 -68T863 -30T894 10T919 49T937 88T950 123T959 154T964 180T968 198L969 208H597V-164Q599 -163 616 -161T647 -155T683 -145T728 -128T775 -103",10754:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM600 664Q591 665 548 665Q414 665 306 583L292 573L423 441L555 310L687 441L818 573L804 583Q714 650 600 664ZM364 118L495 250L364 382L232 513L223 500Q140 391 140 250Q140 107 223 0L232 -13L364 118ZM970 250Q970 389 887 501L878 512Q878 513 861 496T812 447T746 381L615 250L746 118L878 -13L887 0Q970 109 970 250ZM687 59L555 190L423 59L292 -73L306 -83Q416 -166 555 -166T804 -83L818 -73L687 59",10756:"96 750Q103 750 109 748T120 744T127 737T133 730T137 723T139 718V395L140 73L142 60Q159 -43 237 -104T416 -166Q521 -166 597 -103T690 60L692 73L694 718Q708 749 735 749Q765 749 775 720Q777 714 777 398Q777 78 776 71Q766 -51 680 -140Q571 -249 416 -249H411Q261 -249 152 -140Q66 -51 56 71Q55 78 55 398Q55 714 57 720Q60 734 70 740Q80 750 96 750ZM223 276Q223 282 224 287T227 296T232 302T238 308T243 313T250 316L254 319H374V376V406Q374 438 382 454T418 470Q443 467 450 453T458 410V376V319H579Q580 319 583 317T589 313T594 308T600 302T604 295T608 287T609 276Q609 253 587 241Q577 235 513 235H458V178Q458 176 458 166T459 148Q459 84 415 84Q401 84 390 93T375 117Q374 120 374 178V235H319Q317 235 307 235T290 234Q223 234 223 276",10758:"777 -217Q766 -244 745 -249H88Q64 -242 57 -220Q55 -214 55 250T57 720Q60 734 70 740Q80 750 96 750Q127 750 137 720Q139 714 139 274V-166H693V274Q693 714 695 720Q705 749 735 749Q766 749 775 719Q777 713 777 248V-217",10799:"630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29",10815:"28 660Q28 676 31 679T46 683H50Q87 681 182 681Q217 681 247 681T294 682T315 682Q321 682 323 682T328 679T331 673T332 660Q332 643 328 640T304 637Q239 637 231 626Q229 620 229 334V46H520V334Q520 620 518 626Q510 637 445 637Q426 637 422 640T417 660Q417 675 420 678T432 682H435Q437 682 467 682T569 681T671 681T703 682Q714 682 717 679T721 660Q721 643 717 640T693 637Q628 637 620 626Q619 623 619 342Q619 60 620 57Q628 46 693 46Q714 46 717 43T721 23Q721 5 715 1Q713 0 374 0Q36 0 34 1Q28 5 28 23Q28 40 31 43T56 46Q121 46 129 57Q131 63 131 342Q131 620 129 626Q121 637 56 637Q35 637 32 640T28 660",10846:"55 795Q56 806 70 813H540Q554 806 555 795Q555 791 554 788T552 783T549 779T546 777T542 775T539 773H71Q70 773 68 774T65 776T61 779T58 783T56 788T55 795ZM55 601Q56 612 70 619H540Q554 612 555 601Q555 597 554 594T552 589T549 585T546 583T542 581T539 579H71Q70 579 68 580T65 582T61 585T58 589T56 594T55 601ZM75 -97Q67 -97 61 -91T55 -81Q55 -71 169 166T285 410Q295 425 305 425Q311 425 316 422T323 414L325 410Q327 404 441 167T555 -81Q555 -85 549 -91T535 -97T520 -90Q519 -89 506 -61T463 27T411 136L305 358L199 136Q167 71 129 -10Q98 -75 92 -86T75 -97",10877:"674 636Q682 636 688 630T694 615T687 601Q686 600 417 472L151 346L399 228Q687 92 691 87Q694 81 694 76Q694 58 676 56H670L382 192Q92 329 90 331Q83 336 83 348Q84 359 96 365Q104 369 382 500T665 634Q669 636 674 636ZM94 170Q102 172 104 172Q110 171 254 103T535 -30T678 -98Q694 -106 694 -118Q694 -136 676 -138H670L382 -2Q92 135 90 137Q83 142 83 154Q84 164 94 170",10878:"83 616Q83 624 89 630T99 636Q107 636 253 568T543 431T687 361Q694 356 694 346T687 331Q685 329 395 192L107 56H101Q83 58 83 76Q83 77 83 79Q82 86 98 95Q117 105 248 167Q326 204 378 228L626 346L360 472Q291 505 200 548Q112 589 98 597T83 616ZM674 172Q692 172 694 154Q694 142 687 137Q685 135 395 -2L107 -138H101Q83 -136 83 -118Q83 -106 96 -100Q100 -98 380 35T665 170T674 172",10885:"667 761Q669 762 673 762Q682 762 688 756T694 741Q694 731 687 727Q684 724 420 613L156 502L416 392Q476 367 544 338T647 295T682 280Q694 274 694 262Q694 244 676 242Q670 242 524 303T235 425T90 487Q83 493 83 501Q83 514 94 519Q97 520 378 639T667 761ZM55 -23Q55 43 103 90T223 138Q265 138 316 114Q342 100 393 68L443 36Q502 0 554 0Q609 0 650 32T694 109Q694 138 708 138Q710 138 713 136T719 127T722 108Q722 37 673 -9T557 -56Q514 -56 468 -35T387 13T308 60T223 82Q167 82 127 50T83 -27Q81 -56 69 -56Q55 -56 55 -23ZM55 -257Q55 -191 103 -144T223 -96Q265 -96 316 -120Q342 -134 393 -166L443 -198Q502 -234 554 -234Q609 -234 650 -202T694 -125Q694 -96 708 -96Q710 -96 713 -98T719 -107T722 -126Q722 -197 673 -243T557 -290Q514 -290 468 -269T387 -221T308 -174T223 -152Q167 -152 127 -184T83 -261Q80 -290 69 -290Q55 -290 55 -257",10886:"90 727Q83 734 83 743Q83 751 89 756T104 762Q111 760 396 641Q686 518 687 517Q694 512 694 502T687 487Q686 486 543 425T253 303T101 242Q83 244 83 262Q83 274 95 280Q96 280 130 294T232 338T361 392L621 502L357 613Q93 724 90 727ZM55 -23Q55 43 103 90T223 138Q265 138 316 114Q342 100 393 68L443 36Q502 0 554 0Q609 0 650 32T694 109Q694 138 708 138Q710 138 713 136T719 127T722 108Q722 37 673 -9T557 -56Q514 -56 468 -35T387 13T308 60T223 82Q167 82 127 50T83 -27Q81 -56 69 -56Q55 -56 55 -23ZM55 -257Q55 -191 103 -144T223 -96Q265 -96 316 -120Q342 -134 393 -166L443 -198Q502 -234 554 -234Q609 -234 650 -202T694 -125Q694 -96 708 -96Q710 -96 713 -98T719 -107T722 -126Q722 -197 673 -243T557 -290Q514 -290 468 -269T387 -221T308 -174T223 -152Q167 -152 127 -184T83 -261Q80 -290 69 -290Q55 -290 55 -257",10887:"380 497Q445 528 522 564T636 618T673 635Q680 635 686 628T693 615T689 603Q686 599 418 472L151 343L418 215Q686 88 689 83Q693 79 693 72T687 59T675 52Q669 52 381 189T86 332Q82 337 82 344Q82 350 86 355Q91 359 380 497ZM82 -130T82 -124T95 -103H380L431 -54Q476 -6 486 -6Q491 -6 498 -12T505 -27Q505 -28 505 -29T504 -32Q503 -33 498 -38T485 -53T469 -70L438 -103H680Q682 -106 686 -110T691 -116T693 -123Q693 -130 680 -143H398L346 -192Q300 -241 291 -241Q271 -241 271 -221Q271 -209 306 -179L340 -143H95Q82 -130 82 -124",10888:"82 614Q82 620 86 625T94 632T100 635Q106 635 394 498T689 355Q693 349 693 343Q693 338 689 332Q683 327 395 190T100 52Q95 52 89 58T82 72Q82 80 95 88Q114 99 358 215L624 343L358 472Q89 599 86 603Q82 607 82 614ZM82 -130T82 -124T95 -103H380L431 -54Q476 -6 486 -6Q491 -6 498 -12T505 -27Q505 -28 505 -29T504 -32Q503 -33 498 -38T485 -53T469 -70L438 -103H680Q682 -106 686 -110T691 -116T693 -123Q693 -130 680 -143H398L346 -192Q300 -241 291 -241Q271 -241 271 -221Q271 -209 306 -179L340 -143H95Q82 -130 82 -124",10889:"86 512Q93 518 381 639T673 761Q680 761 686 755T693 741Q693 733 688 730Q685 723 419 612L155 501L419 390Q685 277 688 272Q693 269 693 261Q693 254 687 248T675 241Q669 241 381 362T86 490Q74 500 86 512ZM70 -59Q57 -59 57 -24Q57 40 104 87Q116 102 146 118Q186 136 231 136Q232 136 242 135T258 133T276 128T302 118T334 101T377 74Q386 69 396 63T411 53T417 50Q435 87 453 134Q491 223 495 227Q498 230 505 230Q513 230 519 225T526 212Q526 203 491 118T453 30Q453 22 489 10T553 -3Q589 -3 622 14Q653 28 669 50T688 90T694 122T706 136Q718 136 718 114Q718 113 718 109T717 103Q717 31 668 -14T554 -60Q529 -60 499 -50T451 -32T433 -24Q431 -24 404 -90T375 -157Q375 -159 402 -178T473 -218T553 -239Q599 -239 641 -211T691 -130Q694 -99 706 -99T718 -122Q718 -123 718 -127T717 -133Q717 -204 668 -249T559 -295Q512 -295 470 -275T355 -206L322 -290Q313 -310 304 -332T289 -367T282 -382Q277 -387 270 -387Q262 -387 255 -382T248 -368Q248 -361 322 -186Q311 -177 280 -166T222 -155Q189 -155 153 -173Q122 -186 106 -208T87 -248T82 -280T71 -294Q57 -294 57 -259Q57 -195 104 -148Q122 -126 155 -113T220 -99Q245 -99 276 -109T324 -127T342 -135Q397 -2 397 1Q386 10 367 23T302 58T222 80Q175 80 132 52T84 -28Q82 -59 70 -59",10890:"86 730Q81 734 81 740Q81 747 88 754T99 761Q103 761 392 640T688 512Q693 509 693 501T688 490Q682 484 394 363T99 241Q94 241 88 248T82 261Q82 268 86 272Q89 277 355 390L619 501L355 612Q89 723 86 730ZM70 -59Q57 -59 57 -24Q57 40 104 87Q116 102 146 118Q186 136 231 136Q232 136 242 135T258 133T276 128T302 118T334 101T377 74Q386 69 396 63T411 53T417 50Q435 87 453 134Q491 223 495 227Q498 230 505 230Q513 230 519 225T526 212Q526 203 491 118T453 30Q453 22 489 10T553 -3Q589 -3 622 14Q653 28 669 50T688 90T694 122T706 136Q718 136 718 114Q718 113 718 109T717 103Q717 31 668 -14T554 -60Q529 -60 499 -50T451 -32T433 -24Q431 -24 404 -90T375 -157Q375 -159 402 -178T473 -218T553 -239Q599 -239 641 -211T691 -130Q694 -99 706 -99T718 -122Q718 -123 718 -127T717 -133Q717 -204 668 -249T559 -295Q512 -295 470 -275T355 -206L322 -290Q313 -310 304 -332T289 -367T282 -382Q277 -387 270 -387Q262 -387 255 -382T248 -368Q248 -361 322 -186Q311 -177 280 -166T222 -155Q189 -155 153 -173Q122 -186 106 -208T87 -248T82 -280T71 -294Q57 -294 57 -259Q57 -195 104 -148Q122 -126 155 -113T220 -99Q245 -99 276 -109T324 -127T342 -135Q397 -2 397 1Q386 10 367 23T302 58T222 80Q175 80 132 52T84 -28Q82 -59 70 -59",10891:"674 1003Q681 1003 687 999T694 983Q694 973 683 967Q669 959 420 868L162 772L422 676Q683 579 685 577Q694 571 694 560Q694 550 687 546T673 541Q669 542 384 647T93 755Q83 760 83 772Q83 783 91 788Q98 791 383 897T674 1003ZM84 354T84 367T98 387H679Q694 379 694 367Q694 354 679 347H98Q84 354 84 367ZM84 160T84 173T98 193H679Q694 185 694 173Q694 160 679 153H98Q84 160 84 173ZM94 -3Q102 -1 104 -1Q107 -2 392 -107T684 -215Q694 -219 694 -232Q694 -241 687 -247Q686 -248 395 -357Q106 -463 101 -463Q83 -461 83 -443Q83 -431 94 -426Q97 -423 357 -328L615 -232L355 -136Q94 -39 92 -37Q83 -31 83 -21Q83 -9 94 -3",10892:"104 541Q98 541 91 545T83 560Q83 571 92 577Q94 579 355 676L615 772L357 868Q108 959 94 967Q83 973 83 983Q83 989 87 996T104 1003Q109 1002 396 896T687 787Q694 781 694 772Q694 759 684 755Q678 752 393 647T104 541ZM84 367Q84 380 98 387H679Q694 379 694 367Q694 356 680 348L390 347H100Q84 352 84 367ZM84 173Q84 188 100 193H680Q694 183 694 173Q694 160 679 153H98Q84 160 84 173ZM674 -1Q682 -1 688 -6T694 -20Q694 -31 685 -37Q683 -39 422 -136L162 -232L420 -328Q680 -423 683 -426Q694 -431 694 -443Q694 -461 676 -463Q671 -463 382 -357Q91 -248 90 -247Q83 -242 83 -232Q83 -220 93 -215Q667 -1 674 -1",10901:"674 636Q682 636 688 631T694 616Q694 605 687 601Q685 599 395 462L107 326H101Q83 328 83 345Q83 358 96 365Q102 367 382 500T665 634Q671 636 674 636ZM674 442Q692 442 694 424Q694 412 687 407Q686 406 417 278L151 152L399 34Q687 -102 691 -107Q694 -113 694 -118Q694 -136 676 -138H670L382 -2Q92 135 90 137Q83 142 83 154Q84 165 96 171Q104 175 382 306T665 440Q669 442 674 442",10902:"83 616Q83 624 89 630T99 636Q107 636 253 568T543 431T687 361Q694 354 694 346Q694 328 676 326H670L382 462Q317 493 226 535Q119 585 101 595T83 616ZM94 440Q102 442 104 442Q110 441 254 373T535 240T678 172Q679 172 680 171Q694 164 694 153T687 137Q685 135 395 -2L107 -138H101Q83 -136 83 -118Q83 -106 93 -101L128 -84Q163 -68 230 -36T361 26L626 152L360 278Q91 406 90 407Q83 412 83 424Q84 434 94 440",10927:"84 346Q84 359 91 363T117 367Q120 367 126 367T137 366Q388 370 512 430T653 609Q657 636 676 636Q685 635 689 629T694 618V612Q689 566 672 528T626 463T569 417T500 383T435 362T373 346Q379 345 404 339T440 330T477 318T533 296Q592 266 630 223T681 145T694 78Q694 57 674 57Q662 57 657 67T652 92T640 135T606 191Q500 320 137 326H114Q104 326 98 327T88 332T84 346ZM84 -131T84 -118T98 -98H679Q694 -106 694 -118T679 -138H98Q84 -131 84 -118",10928:"84 614Q84 636 102 636Q115 636 119 626T125 600T137 556T171 501Q277 372 640 366H661Q694 366 694 346T661 326H640Q578 325 526 321T415 307T309 280T222 237T156 172T124 83Q122 66 118 62T103 57Q100 57 98 57T95 58T93 59T90 62T85 67Q83 71 83 80Q88 126 105 164T151 229T208 275T277 309T342 330T404 346Q401 347 380 351T345 360T302 373T245 396Q125 455 92 565Q84 599 84 614ZM84 -131T84 -118T98 -98H679Q694 -106 694 -118T679 -138H98Q84 -131 84 -118",10933:"653 734Q653 738 660 745T673 752T686 745T693 723Q672 555 466 485Q390 463 378 463Q373 463 373 461Q373 458 378 458Q390 458 466 436Q562 404 620 350Q682 283 693 198Q693 183 686 176Q681 170 674 170T660 176T653 187Q653 192 652 200T646 228T631 265T602 307T555 350Q435 431 151 441H95Q82 454 82 460T95 481H151Q165 482 197 483T238 485Q427 500 528 554T649 707Q653 729 653 734ZM82 33Q82 37 83 40T89 47T95 54H473L520 105Q569 156 571 156Q573 157 578 157Q586 157 592 151T598 136Q598 130 562 92L526 56L604 54H682Q693 43 693 35Q693 31 692 28T686 21T680 14H489L342 -139L513 -142H682Q693 -148 693 -160Q693 -167 680 -182H304L258 -230Q248 -240 237 -251T221 -268T211 -278T203 -284T197 -286Q189 -286 184 -280T178 -264Q178 -257 213 -219L249 -182H171L93 -179L86 -175Q82 -170 82 -163Q82 -155 95 -142H289L360 -64L433 14H262L93 16Q82 23 82 33",10934:"693 466T693 460T680 441H624Q608 439 577 438T538 436Q349 421 248 367T126 214Q122 192 122 187Q122 183 116 177T102 170Q95 170 89 176Q82 183 82 198Q93 283 155 350Q213 404 309 436Q385 458 398 458Q402 458 402 461Q402 463 398 463Q385 463 309 485Q103 555 82 723Q82 738 89 745T102 752T115 745T122 734Q122 721 126 701T155 640T220 572Q340 490 624 481H680Q693 466 693 460ZM82 33Q82 37 83 40T89 47T95 54H473L520 105Q569 156 571 156Q573 157 578 157Q586 157 592 151T598 136Q598 130 562 92L526 56L604 54H682Q693 43 693 35Q693 31 692 28T686 21T680 14H489L342 -139L513 -142H682Q693 -148 693 -160Q693 -167 680 -182H304L258 -230Q248 -240 237 -251T221 -268T211 -278T203 -284T197 -286Q189 -286 184 -280T178 -264Q178 -257 213 -219L249 -182H171L93 -179L86 -175Q82 -170 82 -163Q82 -155 95 -142H289L360 -64L433 14H262L93 16Q82 23 82 33",10935:"82 494T82 501T95 521H171Q405 527 511 569Q630 618 651 732Q652 734 653 740T655 748T658 754T663 759T672 761L686 754Q693 747 693 734Q684 668 648 623Q627 591 573 557T442 507L417 501Q428 496 442 494Q520 478 573 444T648 378Q684 333 693 267Q693 254 686 247Q673 234 659 245Q657 247 651 269Q630 383 511 432Q406 474 171 481H95Q82 494 82 501ZM70 -59Q57 -59 57 -26Q57 30 90 73T177 132Q191 136 226 136Q228 136 239 136T253 135T267 132T287 125T311 113T346 95T391 67Q462 20 502 5Q519 1 553 1Q586 1 602 5Q641 18 664 45T691 107Q694 136 704 136Q717 136 717 115V105Q717 39 671 -9T554 -58Q518 -58 481 -43T382 14Q302 63 273 74Q255 78 222 78Q188 78 173 74Q90 46 84 -28Q82 -59 70 -59ZM71 -294Q57 -294 57 -262Q57 -205 90 -162T177 -104Q191 -99 226 -99Q266 -103 277 -106Q310 -119 391 -168Q455 -212 502 -231Q519 -235 553 -235Q586 -235 602 -231Q640 -218 661 -195T686 -151T693 -115T704 -99Q717 -99 717 -121V-131Q717 -198 671 -246T556 -294Q519 -294 482 -279T382 -222Q307 -175 273 -162Q255 -157 222 -157Q188 -157 173 -162Q133 -175 110 -201T84 -264Q82 -294 71 -294",10936:"693 501Q693 493 679 481H604Q369 474 264 432Q143 382 124 269Q116 246 115 245Q101 234 88 247Q82 254 82 267Q89 329 126 378Q147 410 201 444T333 494L357 501Q354 502 340 505T318 510T295 516T269 525T243 535T215 548T188 565Q142 599 126 623Q89 672 82 734Q82 761 102 761L115 756Q116 755 124 732Q143 619 264 569Q371 527 604 521H679Q693 507 693 501ZM70 -59Q57 -59 57 -26Q57 30 90 73T177 132Q191 136 226 136Q228 136 239 136T253 135T267 132T287 125T311 113T346 95T391 67Q462 20 502 5Q519 1 553 1Q586 1 602 5Q641 18 664 45T691 107Q694 136 704 136Q717 136 717 115V105Q717 39 671 -9T554 -58Q518 -58 481 -43T382 14Q302 63 273 74Q255 78 222 78Q188 78 173 74Q90 46 84 -28Q82 -59 70 -59ZM71 -294Q57 -294 57 -262Q57 -205 90 -162T177 -104Q191 -99 226 -99Q266 -103 277 -106Q310 -119 391 -168Q455 -212 502 -231Q519 -235 553 -235Q586 -235 602 -231Q640 -218 661 -195T686 -151T693 -115T704 -99Q717 -99 717 -121V-131Q717 -198 671 -246T556 -294Q519 -294 482 -279T382 -222Q307 -175 273 -162Q255 -157 222 -157Q188 -157 173 -162Q133 -175 110 -201T84 -264Q82 -294 71 -294",10937:"82 494T82 501T95 521H171Q256 523 317 528T441 548T543 584T613 644T651 732Q652 734 653 740T655 748T658 754T663 759T672 761L686 754Q693 747 693 734Q686 686 664 647T615 586T548 545T482 518T417 501Q419 500 451 493T517 471T590 434T657 367T693 267Q693 241 673 241Q664 241 659 245Q656 249 650 273T635 323T593 380T511 432Q406 474 171 481H95Q82 494 82 501ZM57 -26Q57 39 101 87T219 136Q254 136 277 130Q320 114 382 72Q419 50 424 45Q426 45 459 110Q496 178 497 179Q500 180 504 180Q509 180 517 175T526 161Q526 158 495 90L462 25Q462 21 502 5Q519 1 553 1Q586 1 602 5Q641 18 664 45T691 107Q694 136 706 136T718 115Q718 114 718 111T717 105Q717 39 671 -9T554 -58L459 -33Q450 -29 444 -27T437 -26L371 -155L391 -168Q485 -235 538 -235H553Q586 -235 602 -230Q683 -204 691 -128Q694 -99 706 -99T718 -120Q718 -121 718 -124T717 -130Q717 -199 670 -246T557 -294T393 -228Q353 -205 351 -201Q348 -201 315 -266Q294 -310 285 -323T268 -337Q259 -337 254 -331T248 -317Q248 -305 282 -246L313 -181Q313 -177 273 -161Q255 -157 222 -157Q188 -157 173 -161Q134 -174 113 -198T88 -242T82 -278T71 -294Q57 -294 57 -261Q57 -204 91 -161T179 -104Q195 -99 228 -99Q274 -102 315 -124Q337 -132 337 -130L404 -1L384 12Q319 58 273 74Q255 79 222 79Q188 79 173 74Q133 61 112 37T88 -7T82 -43T70 -59Q57 -59 57 -26",10938:"693 501Q693 493 679 481H604Q548 479 509 477T418 469T331 454T257 429T194 392T150 340T124 270Q117 247 115 245Q101 236 88 247Q82 254 82 267Q89 330 126 379Q147 411 202 444T333 494L357 501Q239 531 188 565Q142 599 126 623Q89 672 82 734Q82 761 102 761L115 756Q116 755 124 732Q133 678 166 640T241 579T349 544T470 527T604 521H679Q693 507 693 501ZM57 -26Q57 39 101 87T219 136Q254 136 277 130Q320 114 382 72Q419 50 424 45Q426 45 459 110Q496 178 497 179Q500 180 504 180Q509 180 517 175T526 161Q526 158 495 90L462 25Q462 21 502 5Q519 1 553 1Q586 1 602 5Q641 18 664 45T691 107Q694 136 706 136T718 115Q718 114 718 111T717 105Q717 39 671 -9T554 -58L459 -33Q450 -29 444 -27T437 -26L371 -155L391 -168Q485 -235 538 -235H553Q586 -235 602 -230Q683 -204 691 -128Q694 -99 706 -99T718 -120Q718 -121 718 -124T717 -130Q717 -199 670 -246T557 -294T393 -228Q353 -205 351 -201Q348 -201 315 -266Q294 -310 285 -323T268 -337Q259 -337 254 -331T248 -317Q248 -305 282 -246L313 -181Q313 -177 273 -161Q255 -157 222 -157Q188 -157 173 -161Q134 -174 113 -198T88 -242T82 -278T71 -294Q57 -294 57 -261Q57 -204 91 -161T179 -104Q195 -99 228 -99Q274 -102 315 -124Q337 -132 337 -130L404 -1L384 12Q319 58 273 74Q255 79 222 79Q188 79 173 74Q133 61 112 37T88 -7T82 -43T70 -59Q57 -59 57 -26",10949:"84 463Q84 585 166 663T360 752Q361 752 370 752T395 752T430 752T475 753T524 753H679Q694 746 694 733Q694 724 681 714L522 713H470H441Q366 713 338 709T266 685Q244 674 224 659T179 617T139 550T124 463V458Q124 370 185 302Q244 238 328 220Q348 215 366 215T522 213H681Q694 203 694 193Q694 180 679 173H526Q510 173 480 173T434 172Q350 172 289 188T172 258Q84 340 84 463ZM84 -14T84 -1T98 19H679Q694 11 694 -1Q694 -14 679 -21H98Q84 -14 84 -1ZM84 -208T84 -195T98 -175H679Q694 -183 694 -195Q694 -208 679 -215H98Q84 -208 84 -195",10950:"83 733Q83 746 98 753H251Q267 753 297 753T343 754Q427 754 488 738T605 668Q693 587 693 463Q693 378 650 312T545 213T415 174Q407 173 251 173H98Q83 180 83 193Q83 203 96 213H255H308H337Q412 213 439 217T512 241Q533 252 553 267T599 309T639 376T654 463Q654 554 592 624Q557 662 512 685Q468 704 439 708T335 713H306H255L96 714Q83 724 83 733ZM84 -14T84 -1T98 19H679Q694 11 694 -1Q694 -14 679 -21H98Q84 -14 84 -1ZM84 -208T84 -195T98 -175H679Q694 -183 694 -195Q694 -208 679 -215H98Q84 -208 84 -195",10955:"693 221Q693 214 680 201H524Q398 201 367 202T309 212Q236 230 180 280T98 398Q84 438 84 492T98 585Q126 663 193 716T346 781Q347 781 373 781T440 782T520 783H680Q682 780 686 776T691 770T693 763T680 743H526Q364 743 353 741Q279 730 221 687T138 578Q124 540 124 492T138 405Q163 340 221 297T353 243Q364 241 526 241H680Q682 238 686 234T691 228T693 221ZM82 -48T82 -41T95 -19H462L513 41L569 105Q574 110 582 110T596 104T602 90Q602 87 600 83Q600 77 555 30L515 -17L600 -19H682Q693 -30 693 -38T680 -59H480L415 -137L349 -213L515 -215H682Q693 -226 693 -233T680 -255H313L260 -317Q224 -360 212 -372T192 -385Q184 -385 179 -377T173 -362Q174 -361 218 -306L260 -255H178L93 -253L86 -248Q82 -243 82 -235Q82 -226 93 -215H195L295 -213L362 -137L426 -59H260L93 -57L86 -53Q82 -48 82 -41",10956:"82 759T82 763T83 769T89 776T95 783H251Q378 783 409 782T469 772Q540 753 596 703T678 585Q691 546 691 492T678 398Q649 320 581 267T426 203Q415 201 251 201H95Q82 214 82 221Q82 225 83 227T89 234T95 241H249Q411 241 422 243Q496 253 554 296T638 405Q651 444 651 492Q651 539 638 578Q613 643 555 686T422 741Q411 743 249 743H95Q82 759 82 763ZM82 -48T82 -41T95 -19H462L513 41L569 105Q574 110 582 110T596 104T602 90Q602 87 600 83Q600 77 555 30L515 -17L600 -19H682Q693 -30 693 -38T680 -59H480L415 -137L349 -213L515 -215H682Q693 -226 693 -233T680 -255H313L260 -317Q224 -360 212 -372T192 -385Q184 -385 179 -377T173 -362Q174 -361 218 -306L260 -255H178L93 -253L86 -248Q82 -243 82 -235Q82 -226 93 -215H195L295 -213L362 -137L426 -59H260L93 -57L86 -53Q82 -48 82 -41",12296:"333 -232Q332 -239 327 -244T313 -250Q303 -250 296 -240Q293 -233 202 6T110 250T201 494T296 740Q299 745 306 749L309 750Q312 750 313 750Q331 750 333 732Q333 727 243 489Q152 252 152 250T243 11Q333 -227 333 -232",12297:"55 732Q56 739 61 744T75 750Q85 750 92 740Q95 733 186 494T278 250T187 6T92 -240Q85 -250 75 -250Q67 -250 62 -245T55 -232Q55 -227 145 11Q236 248 236 250T145 489Q55 727 55 732",57350:"91 417Q104 430 111 430T131 417V301L171 341Q201 373 207 378T220 384Q227 384 233 377T240 366Q240 357 187 299L131 244V-10Q116 -23 111 -23T91 -10V201L49 157Q20 127 14 121T0 115Q-8 115 -14 121T-20 132Q-20 139 17 178Q29 191 36 199L91 257V417",57351:"56 417Q68 431 76 431L89 426L96 419V317L98 215L193 273L291 330V375L293 419Q301 431 311 431Q331 431 331 388L333 355L356 370Q381 384 388 384Q394 384 400 377T407 363Q407 354 367 328L331 308V-10Q316 -23 310 -23Q300 -23 293 -12L291 135V284L98 168L96 77V-12Q84 -24 76 -24L62 -19L58 -12L56 66V144L31 128Q5 114 -2 114Q-8 114 -14 121T-20 136Q-20 142 -14 147T20 170L56 190V417",57352:"477 261Q477 257 473 256T455 253T417 251T348 250H235L155 -77L146 -82Q137 -85 109 -85Q55 -85 55 -77L139 261Q224 596 226 598Q229 603 239 603Q240 603 254 603T290 603T341 604T405 605T477 605Q656 603 687 602T719 596Q719 589 692 588T513 585H319L282 427L242 272Q242 270 351 270Q388 270 410 270T444 269T460 267T469 265T477 261",57353:"228 325Q170 322 156 316T127 309Q108 309 104 314Q99 319 99 322T108 341Q125 376 171 400T268 425H271Q302 425 319 396Q328 377 328 358Q328 332 324 314Q311 270 286 221Q274 194 274 192H275Q339 234 484 325T639 421Q669 434 691 434T723 425T734 406Q734 394 719 381Q715 376 644 330L575 287L566 267Q543 233 526 176Q520 160 515 143T508 115T506 105Q506 103 533 103Q585 103 607 110T641 118Q670 118 670 107Q670 100 661 85Q643 50 598 27T504 3Q465 3 450 36Q441 51 441 73Q441 84 444 96Q452 146 484 205L497 236L324 125Q143 12 135 10Q103 -6 77 -6Q61 -6 49 2T37 21Q37 36 49 46T124 96L195 141L204 156Q219 179 243 248T264 323Q264 325 228 325",57356:"86 472Q93 477 381 614T673 752Q680 752 686 746T693 732T689 721Q686 715 418 590L151 461L418 332Q684 207 689 201Q693 195 693 190Q693 183 687 177T675 170Q668 170 380 307T86 450Q82 454 82 461Q82 467 86 472ZM369 101V126Q369 156 382 156H384Q385 157 386 157Q409 157 409 115V98V54H680Q693 39 693 34T680 14H409V-142H680Q693 -155 693 -162Q693 -167 680 -182H409V-273Q396 -284 388 -284Q382 -284 369 -275V-182H95Q82 -167 82 -162Q82 -155 95 -142H369V14H95Q93 17 89 21T84 27T82 34T83 40T89 47T95 54H369V101",57357:"89 745Q95 752 100 752Q106 752 394 615T689 472Q693 468 693 461T689 450Q684 445 396 308T100 170Q95 170 89 176T82 190Q82 195 86 201Q91 208 358 332L624 461L358 590Q90 715 86 721Q82 725 82 731Q82 739 89 745ZM369 101V126Q369 156 382 156H384Q385 157 386 157Q409 157 409 115V98V54H680Q693 39 693 34T680 14H409V-142H680Q693 -155 693 -162Q693 -167 680 -182H409V-273Q396 -284 388 -284Q382 -284 369 -275V-182H95Q82 -167 82 -162Q82 -155 95 -142H369V14H95Q93 17 89 21T84 27T82 34T83 40T89 47T95 54H369V101",57358:"97 172Q82 172 82 190Q82 197 86 201Q94 209 173 246T327 319T402 357Q405 360 434 448T462 539L278 628Q96 713 86 721Q82 725 82 732T88 745T102 752Q103 752 125 742T198 709T293 666Q342 642 385 622T453 590T478 579Q479 579 506 659T562 824T598 915Q602 919 609 919T622 913T629 901Q629 898 571 728Q546 656 531 608T518 559Q555 539 602 519Q664 488 679 479T694 461Q694 457 689 450Q680 443 616 413T494 356T435 326L389 190L342 57L513 55H682Q694 43 694 34Q694 28 689 21L682 17L506 15H329L322 -8Q320 -13 310 -41T295 -85L275 -141H680Q682 -143 684 -146T688 -151T691 -156T693 -162Q693 -172 682 -179L473 -181H262L220 -303Q192 -388 185 -404T166 -421Q160 -421 153 -415T146 -403Q146 -400 179 -302T220 -185Q220 -181 158 -181L93 -179L86 -174Q82 -169 82 -161Q82 -152 93 -141H164L233 -139L260 -63L286 15H189L93 17L86 21Q82 26 82 34Q82 44 93 55H198L300 57L342 179Q350 204 361 238T378 286T382 301L246 237Q111 172 97 172ZM624 461Q621 464 560 492Q512 518 503 518Q500 518 500 517Q499 513 488 479T465 413T453 379L624 461",57359:"97 54Q82 54 82 72Q82 79 86 84Q95 91 222 153L351 215L398 324L442 433L258 519Q95 597 87 604Q82 608 82 615T88 628T102 635Q107 635 424 484L458 468L524 630Q593 789 597 795Q601 801 609 801Q616 801 622 795T629 781L562 615L493 450L589 406Q665 371 679 362T694 344Q694 339 693 337T677 326T631 302T538 257Q504 241 465 223T406 195T386 186Q383 185 344 92T306 -3L486 81Q662 168 673 168Q680 168 686 162T693 148T689 137Q688 136 482 35L280 -59L233 -176Q184 -291 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -279 185 -186T224 -90Q225 -88 223 -88Q219 -88 193 -101Q109 -143 98 -143Q82 -138 82 -122Q82 -116 85 -113T108 -98T171 -67L249 -30L289 61Q297 81 307 107T321 144T326 157L218 106Q109 54 97 54ZM553 379Q480 412 480 415Q479 415 460 372T423 285T406 241Q408 240 516 291T624 344L553 379",57360:"102 168Q103 168 151 146T247 102T295 81Q299 85 322 144T344 206L218 268Q153 297 123 313T87 333T82 344T86 355Q104 369 291 455Q491 552 491 553L542 673Q581 767 590 784T609 801Q616 801 622 795T629 781Q629 773 586 677Q546 581 546 577L609 606Q669 635 673 635Q680 635 686 629T693 615Q693 610 692 608T670 593T604 561L524 521L400 226L542 157Q617 123 649 107T687 85T694 72Q694 66 690 60T679 54Q665 54 526 119Q394 186 386 186Q385 186 342 88L331 61L509 -23Q680 -105 688 -111Q693 -115 693 -122T688 -135T675 -141H673Q664 -141 491 -59Q320 21 316 21H315L249 -136Q183 -293 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 154 -261T181 -197T213 -119L280 41Q280 46 186 86Q157 101 121 119Q92 133 87 136T82 148Q82 155 88 161T102 168ZM418 370L466 495Q464 495 308 420T151 344T204 317T311 267T364 244Q364 247 418 370",57361:"82 34Q82 44 93 55H198L300 57L342 179Q351 207 362 238T378 286T384 303T238 377Q109 435 86 450Q82 454 82 460T86 472Q90 476 302 579L511 679Q512 679 553 795Q569 842 577 866T592 903T600 917T608 919Q615 919 622 912T629 901Q629 899 595 799Q589 777 581 753T569 717T564 703L618 728Q666 752 673 752T686 746T693 732Q693 723 683 717T615 683L546 650L491 488Q464 410 450 368T438 326Q493 297 562 266Q660 219 677 209T694 190Q694 183 690 177T678 171Q664 171 546 228L424 286Q422 286 382 172L342 57L513 55H682Q694 43 694 34Q694 28 689 21L682 17L506 15H329L322 -8Q320 -13 310 -41T295 -85L275 -141H680Q682 -143 684 -146T688 -151T691 -156T693 -162Q693 -172 682 -179L473 -181H262L220 -303Q192 -388 185 -404T166 -421Q160 -421 153 -415T146 -403Q146 -400 179 -302T220 -185Q220 -181 158 -181L93 -179L86 -174Q82 -169 82 -161Q82 -152 93 -141H164L233 -139L260 -63L286 15H189L93 17L86 21Q82 26 82 34ZM495 623Q495 626 493 626T321 544T151 461L398 343Q399 343 405 360T423 415T446 483Q457 513 469 551T488 606T495 623",57366:"82 -6Q82 1 95 14H262L295 94Q331 171 331 174Q324 175 312 178T267 194T206 227T146 283T98 368Q84 406 84 461T98 554Q126 632 194 685T349 750Q360 752 480 752H591L604 783Q620 819 624 821Q631 828 640 828Q653 825 658 810Q658 808 646 781L635 754Q635 752 658 752Q680 752 686 746Q693 739 693 732Q693 728 692 726T686 719T680 712H615L506 466Q479 407 451 344T408 248T393 214Q393 210 535 210H680Q693 194 693 190T680 170H373L340 92L304 14H680Q693 1 693 -6Q693 -11 680 -26H286L253 -103L218 -179L451 -181H682Q694 -193 694 -201Q694 -212 682 -219L440 -221H200L178 -270Q160 -309 154 -319T139 -330Q122 -330 118 -312L155 -223Q155 -221 126 -221H95Q82 -206 82 -201T95 -181H175L206 -108Q237 -35 242 -30Q242 -26 169 -26H95Q82 -11 82 -6ZM571 710Q571 712 469 712Q443 712 416 712T371 711T351 710Q279 700 221 656T138 548Q124 508 124 461T138 374Q186 245 351 212L460 459Q571 709 571 710",57367:"82 -14T82 -7T95 15H431L529 170H435Q341 170 333 175Q149 218 98 368Q84 406 84 461Q84 515 98 555Q126 633 193 686T346 750Q347 750 373 750T440 751T520 752H680Q693 739 693 732Q693 727 680 712H526Q364 712 353 710Q268 700 207 646T126 512Q123 496 123 461T126 410Q141 350 180 304T280 232Q312 217 344 214T464 210H555L589 261Q613 301 620 311T635 321Q644 321 650 315T657 301Q657 296 651 286T630 252T604 212Q604 210 642 210H680Q693 197 693 190Q693 186 692 184T686 177T680 170H578L526 92L478 17L580 15H682Q693 4 693 -4T680 -25H451L353 -179L518 -181H682Q694 -193 694 -201Q694 -211 682 -219L504 -221H326L293 -272Q257 -332 246 -332Q238 -332 232 -326T225 -313Q225 -310 226 -308Q226 -305 251 -265T278 -223Q278 -221 186 -221H95Q93 -218 89 -214T84 -208T82 -201T95 -181H306L404 -25H249L93 -23L86 -19Q82 -14 82 -7",57368:"82 732Q82 739 95 752H251H348Q420 752 460 744T551 708Q566 697 566 701Q618 815 624 821Q631 828 640 828Q653 825 658 810L600 677Q600 671 615 656T653 605T689 517Q692 496 692 461T689 406Q668 325 615 266Q572 221 513 196T391 170H373L340 92L304 14H680Q693 1 693 -6Q693 -11 680 -26H286L253 -103L218 -179L451 -181H682Q694 -193 694 -201Q694 -212 682 -219L440 -221H200L178 -270Q160 -309 154 -319T139 -330Q122 -330 118 -312L155 -223Q155 -221 126 -221H95Q82 -206 82 -201T95 -181H175L206 -108Q237 -35 242 -30Q242 -26 169 -26H95Q82 -11 82 -6Q82 1 95 14H262L295 92L331 170H95Q93 172 91 175T87 180T84 185T82 191Q82 199 93 210H220L349 212L549 659Q507 692 462 702T338 712H249H95Q82 727 82 732ZM652 473Q652 513 636 552T603 611T582 632Q581 632 487 422T393 210Q424 210 460 220T535 253T605 316T649 410Q652 427 652 461V473",57369:"82 732Q82 739 95 752H251Q415 752 426 750Q539 736 615 657Q667 599 689 517Q692 496 692 461T689 406Q668 325 615 266Q522 170 382 170H355L326 95Q319 80 311 59T298 28T293 17Q293 15 486 15H680Q693 0 693 -6T680 -25H275L213 -179L449 -181H682Q693 -192 693 -199T680 -221H198L178 -270Q153 -333 139 -333Q132 -333 126 -327T119 -314T135 -266T153 -223Q153 -221 124 -221H95Q82 -207 82 -201T95 -181H171L233 -25H162L93 -23L86 -19Q82 -14 82 -7T95 15H251L313 170H202L93 172L86 177Q82 182 82 190Q82 199 93 210H211L329 212L349 261Q366 301 372 311T386 321Q392 321 399 315T407 302Q407 295 390 254T373 210Q374 209 377 209Q412 209 444 217Q512 231 564 273T638 377Q651 414 651 461Q651 509 638 548Q613 613 555 656T422 710Q411 712 249 712H95Q82 727 82 732",57370:"693 -115T693 -122T680 -144H315L269 -199Q221 -255 213 -255H212Q203 -255 197 -248T193 -231Q195 -225 229 -184L262 -144H186L113 -142L106 -137Q102 -130 102 -125Q102 -119 115 -104H298L426 52H386Q342 54 309 63Q236 79 180 129T98 249Q84 289 84 343Q84 398 98 436Q126 514 193 567T346 632Q347 632 373 632T440 633T520 634H680Q682 631 686 627T691 621T693 614T680 594H526Q364 594 353 592Q268 581 207 528T126 394Q123 378 123 343T126 292Q141 231 181 185T280 114Q329 92 415 92H462L506 147Q554 203 562 203H563Q572 203 578 196T582 178Q579 173 546 132L513 94L598 92H682Q693 81 693 73T680 52H480L349 -102L515 -104H682Q693 -115 693 -122",57371:"82 610T82 614T83 620T89 627T95 634H251Q378 634 409 633T469 623Q540 604 596 554T678 436Q691 397 691 343T678 249Q653 181 597 131T469 63Q427 52 362 52H315L213 -102L438 -104H662Q673 -115 673 -123Q673 -129 660 -144H186L151 -197Q114 -250 109 -253Q106 -254 104 -254Q100 -254 98 -253Q91 -253 87 -248T82 -235Q82 -230 109 -186L138 -144H115Q82 -144 82 -125Q82 -119 95 -104H166L266 49Q266 52 182 52H95Q82 65 82 72Q82 76 83 78T89 85T95 92H295L329 143Q365 195 369 198Q372 203 380 203Q385 203 391 197T398 185Q398 184 398 184L399 182Q399 175 369 129L344 94Q344 92 376 92Q402 92 422 94Q496 104 554 147T638 256Q651 295 651 343Q651 390 638 429Q613 494 555 537T422 592Q411 594 249 594H95Q82 610 82 614",119808:"296 0Q278 3 164 3Q58 3 49 0H40V62H92Q144 62 144 64Q388 682 397 689Q403 698 434 698Q463 698 471 689Q475 686 538 530T663 218L724 64Q724 62 776 62H828V0H817Q796 3 658 3Q509 3 485 0H472V62H517Q561 62 561 63L517 175H262L240 120Q218 65 217 64Q217 62 261 62H306V0H296ZM390 237L492 238L440 365Q390 491 388 491Q287 239 287 237H390",119809:"720 510Q720 476 704 448T665 404T619 377T580 362L564 359L583 356Q602 353 632 342T690 312Q712 292 725 276Q752 235 752 189V183Q752 160 741 125Q698 18 547 2Q543 1 288 0H39V62H147V624H39V686H264H409Q502 686 542 681T624 655Q720 607 720 510ZM563 513Q563 553 548 578T518 611T486 622Q479 624 385 624H293V382H375Q458 383 467 385Q563 405 563 513ZM590 192Q590 307 505 329Q504 330 503 330L398 331H293V62H391H400H444Q496 62 528 75T580 131Q590 155 590 192",119810:"64 343Q64 502 174 599T468 697Q502 697 533 691T586 674T623 655T647 639T657 632L694 663Q703 670 711 677T723 687T730 692T735 695T740 696T746 697Q759 697 762 692T766 668V627V489V449Q766 428 762 424T742 419H732H720Q699 419 697 436Q690 498 657 545Q611 618 532 632Q522 634 496 634Q356 634 286 553Q232 488 232 343T286 133Q355 52 497 52Q597 52 650 112T704 237Q704 248 709 251T729 254H735Q750 254 755 253T763 248T766 234Q766 136 680 63T469 -11Q285 -11 175 86T64 343",119811:"39 624V686H270H310H408Q500 686 545 680T638 649Q768 584 805 438Q817 388 817 338Q817 171 702 75Q628 17 515 2Q504 1 270 0H39V62H147V624H39ZM655 337Q655 370 655 390T650 442T639 494T616 540T580 580T526 607T451 623Q443 624 368 624H298V62H377H387H407Q445 62 472 65T540 83T606 129Q629 156 640 195T653 262T655 337",119812:"723 286Q721 284 700 145T677 3V0H39V62H147V618H39V680H660V676Q662 670 675 552T691 428V424H629V428Q629 429 627 448T618 494T601 541Q574 593 527 605T382 618H374H304V384H336Q338 384 347 384T361 384T376 386T392 390T407 397T421 407T432 423Q442 444 443 482V501H505V205H443V224Q442 258 435 278T411 307T380 318T336 322H304V62H375H394Q429 62 449 62T497 66T541 76T577 95T609 126T632 170T651 232Q661 287 661 289H723V286",119813:"425 0L228 3Q63 3 51 0H39V62H147V618H39V680H644V676Q647 670 659 552T675 428V424H613Q613 433 605 477Q599 511 589 535T562 574T530 599T488 612T441 617T387 618H368H304V371H333Q389 373 411 390T437 468V488H499V192H437V212Q436 244 430 263T408 292T378 305T333 309H304V62H439V0H425",119814:"465 -10Q281 -10 173 88T64 343Q64 413 85 471T143 568T217 631T298 670Q371 697 449 697Q452 697 459 697T470 696Q502 696 531 690T582 675T618 658T644 641T656 632L732 695Q734 697 745 697Q758 697 761 692T765 668V627V489V449Q765 428 761 424T741 419H731H724Q705 419 702 422T695 444Q683 520 631 577T495 635Q364 635 295 563Q261 528 247 477T232 343Q232 296 236 260T256 185T296 120T366 76T472 52Q481 51 498 51Q544 51 573 67T607 108Q608 111 608 164V214H464V276H479Q506 273 680 273Q816 273 834 276H845V214H765V113V51Q765 16 763 8T750 0Q742 2 709 16T658 40L648 46Q592 -10 465 -10",119815:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H51Q75 683 226 683Q376 683 400 686H412V624H304V388H595V624H487V686H499Q523 683 673 683Q824 683 848 686H860V624H752V62H860V0H848Q824 3 674 3Q523 3 499 0H487V62H595V326H304V62H412V0H400",119816:"397 0Q370 3 218 3Q65 3 38 0H25V62H139V624H25V686H38Q65 683 218 683Q370 683 397 686H410V624H296V62H410V0H397",119817:"174 114Q174 96 169 82T159 63T144 47L155 45Q183 40 203 40Q271 40 290 104Q294 118 294 150T295 380V624H154V686H169Q196 683 365 683Q499 683 517 686H527V624H446V379Q446 183 446 153T441 108Q413 32 315 2Q266 -11 208 -11Q160 -11 118 -2T42 37T8 114V122Q8 150 30 174T91 198T152 174T174 122V114",119818:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H51Q75 683 226 683Q376 683 400 686H412V624H304V338L472 483L634 624H565V686H576Q597 683 728 683Q814 683 829 686H836V624H730L614 524Q507 432 497 422Q496 422 498 418T514 395T553 342T627 241L759 63L805 62H852V0H842Q830 3 701 3Q550 3 526 0H513V62H549Q584 62 584 63Q583 65 486 196T388 328L304 256V62H412V0H400",119819:"643 285Q641 280 629 148T612 4V0H39V62H147V624H39V686H51Q75 683 228 683Q415 685 425 686H439V624H304V62H352H378Q492 62 539 138Q551 156 558 178T569 214T576 255T581 289H643V285",119820:"314 0Q296 3 181 3T48 0H39V62H147V624H39V686H305Q316 679 323 667Q330 653 434 414L546 157L658 414Q766 662 773 674Q778 681 788 686H1052V624H944V62H1052V0H1040Q1016 3 874 3T708 0H696V62H804V341L803 618L786 580Q770 543 735 462T671 315Q540 13 536 9Q528 1 507 1Q485 1 477 9Q472 14 408 162T281 457T217 603Q215 603 215 334V62H323V0H314",119821:"314 0Q296 3 181 3T48 0H39V62H147V624H39V686H171H265Q288 686 297 686T309 684T315 679Q317 676 500 455T684 233V624H576V686H585Q603 683 718 683T851 686H860V624H752V319Q752 15 750 11Q747 4 742 2T718 0H712Q708 0 706 0T700 0T696 1T693 2T690 4T687 7T684 11T679 16T674 23Q671 27 437 311L215 579V62H323V0H314",119822:"64 339Q64 431 96 502T182 614T295 675T420 696Q469 696 481 695Q620 680 709 589T798 339Q798 173 697 82T432 -10Q262 -10 163 85T64 339ZM625 454Q618 502 600 538T562 593T515 624T469 639T431 642Q331 642 276 563Q232 493 232 353Q232 315 234 285T244 216T267 148T308 94T372 56Q405 46 432 46Q517 46 567 106T627 267Q631 299 631 353Q631 418 625 454",119823:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H253Q435 686 470 685T536 678Q585 668 621 648T675 605T705 557T718 514T721 483T718 451T704 409T673 362T616 322T530 293Q500 288 399 287H304V62H412V0H400ZM553 475Q553 554 537 582T459 622Q451 623 373 624H298V343H372Q457 344 480 350Q527 362 540 390T553 475",119824:"64 339Q64 431 96 502T182 614T295 675T420 696Q469 696 481 695Q620 680 709 589T798 339Q798 255 768 184Q720 77 611 26L600 21Q635 -26 682 -26H696Q769 -26 769 0Q769 7 774 12T787 18Q805 18 805 -7V-13Q803 -64 785 -106T737 -171Q720 -183 697 -191Q687 -193 668 -193Q636 -193 613 -182T575 -144T552 -94T532 -27Q531 -23 530 -16T528 -6T526 -3L512 -5Q499 -7 477 -8T431 -10Q393 -10 382 -9Q238 8 151 97T64 339ZM326 80Q326 113 356 138T430 163Q492 163 542 100L553 86Q554 85 561 91T578 108Q637 179 637 330Q637 430 619 498T548 604Q500 641 425 641Q408 641 390 637T347 623T299 590T259 535Q226 469 226 338Q226 244 246 180T318 79L325 74Q326 74 326 80ZM506 58Q480 112 433 112Q412 112 395 104T378 77Q378 44 431 44Q480 44 506 58",119825:"394 0Q370 3 222 3Q75 3 51 0H39V62H147V624H39V686H234Q256 686 299 686T362 687Q479 687 554 669T681 593Q716 550 716 497Q716 390 568 338Q569 337 572 336T577 332Q605 317 623 300T650 258T662 218T668 172Q678 98 689 76Q707 40 748 40Q770 40 780 54T795 88T801 111Q805 117 827 117H831Q846 117 852 113T858 92Q857 78 852 63T834 30T797 1T739 -11Q630 -11 580 12T511 87Q506 104 506 168Q506 170 506 178T507 194Q507 289 438 313Q424 318 356 318H298V62H406V0H394ZM366 369Q459 370 490 381Q548 402 548 476V498V517Q548 578 513 600Q479 624 392 624H358H298V369H366",119826:"64 493Q64 582 120 636T264 696H272Q280 697 285 697Q380 697 454 645L480 669Q484 672 488 676T495 683T500 688T504 691T508 693T511 695T514 696T517 697T522 697Q536 697 539 691T542 652V577Q542 557 542 532T543 500Q543 472 540 465T524 458H511H505Q489 458 485 461T479 478Q472 529 449 564T393 614T336 634T287 639Q228 639 203 610T177 544Q177 517 195 493T247 457Q253 454 343 436T475 391Q574 326 574 207V200Q574 163 559 120Q517 12 389 -9Q380 -10 346 -10Q308 -10 275 -5T221 7T184 22T160 35T151 40L126 17Q122 14 118 10T111 3T106 -2T102 -5T98 -7T95 -9T92 -10T89 -11T84 -11Q70 -11 67 -4T64 35V108Q64 128 64 153T63 185Q63 203 63 211T69 223T77 227T94 228H100Q118 228 122 225T126 205Q130 125 193 88T345 51Q408 51 434 82T460 157Q460 196 439 221T388 257Q384 259 305 276T221 295Q155 313 110 366T64 493",119827:"41 425Q41 426 51 545T62 669V675H737V669Q738 665 748 546T758 425V419H696V425Q687 517 669 555T595 607Q578 612 522 613H478V62H631V0H615Q585 3 399 3Q214 3 184 0H168V62H321V613H277H263Q164 613 134 561Q113 527 103 425V419H41V425",119828:"570 686Q588 683 703 683T836 686H845V624H737V420Q737 390 737 345T738 284Q738 205 729 164T689 83Q614 -11 465 -11Q321 -11 240 51T148 207Q147 214 147 421V624H39V686H51Q75 683 226 683Q376 683 400 686H412V624H304V405V370V268Q304 181 311 146T346 87Q387 52 466 52Q642 52 667 195Q668 204 669 415V624H561V686H570",119829:"592 686H604Q615 685 631 685T666 684T700 684T724 683Q829 683 835 686H843V624H744L611 315Q584 254 546 165Q492 40 482 19T461 -6L460 -7H409Q398 -4 391 9Q385 20 257 315L124 624H25V686H36Q57 683 190 683Q340 683 364 686H377V624H289L384 403L480 185L492 212Q504 240 529 298T575 405L670 624H582V686H592",119830:"915 686L1052 683Q1142 683 1157 686H1164V624H1073L957 320Q930 249 900 170T855 52T839 10Q834 0 826 -5Q821 -7 799 -7H792Q777 -7 772 -5T759 10Q759 11 748 39T716 122T676 228L594 442L512 228Q486 159 455 78Q433 19 428 9T416 -5Q411 -7 389 -7H379Q356 -7 349 10Q349 12 334 51T288 170T231 320L116 624H24V686H35Q44 683 183 683Q331 683 355 686H368V624H323Q278 624 278 623L437 207L499 369L561 531L526 624H434V686H445Q454 683 593 683Q741 683 765 686H778V624H733Q688 624 688 623L847 207Q848 207 927 415T1006 624H905V686H915",119831:"327 0Q306 3 174 3Q52 3 43 0H33V62H98L162 63L360 333L157 624H48V686H59Q80 683 217 683Q368 683 395 686H408V624H335L393 540L452 458L573 623Q573 624 528 624H483V686H494Q515 683 646 683Q769 683 778 686H787V624H658L575 511Q493 398 493 397L508 376Q522 356 553 312T611 229L727 62H835V0H824Q803 3 667 3Q516 3 489 0H476V62H513L549 63L401 274L247 63Q247 62 292 62H338V0H327",119832:"605 0Q581 3 434 3Q286 3 262 0H250V62H358V275L126 624H19V686H30Q54 683 189 683Q361 685 370 686H383V624H308L319 608Q330 591 353 556T396 491L484 359L660 623Q660 624 623 624H585V686H595Q613 683 728 683Q832 683 841 686H849V624H742L509 274V62H618V0H605",119833:"80 430L92 686H358Q624 686 628 684Q638 679 638 656Q638 640 637 639Q637 638 445 353Q401 288 351 214T277 103L253 67L256 66Q258 66 265 66T279 66T298 66H343Q380 66 406 68T464 81T518 110T557 164T579 250Q583 278 583 298Q583 299 614 299H645V291Q643 281 636 150T627 8V0H353Q79 0 75 2Q64 7 64 31Q64 48 66 52L259 340L451 623Q451 624 384 624Q294 623 259 612Q155 581 143 446Q142 440 142 432V430H80",119834:"64 349Q64 399 107 426T255 453Q346 453 402 423T473 341Q478 327 478 310T479 196V77Q493 63 529 62Q549 62 553 57T558 31Q558 9 552 5T514 0H497H481Q375 0 367 56L356 46Q300 -6 210 -6Q130 -6 81 30T32 121Q32 188 111 226T332 272H350V292Q350 313 348 327T337 361T306 391T248 402T194 399H189Q204 376 204 354Q204 327 187 306T134 284Q97 284 81 305T64 349ZM164 121Q164 89 186 67T238 45Q274 45 307 63T346 108L350 117V226H347Q248 218 206 189T164 121",119835:"32 686L123 690Q214 694 215 694H221V409Q289 450 378 450Q479 450 539 387T600 221Q600 122 535 58T358 -6H355Q272 -6 203 53L160 1L129 0H98V301Q98 362 98 435T99 525Q99 591 97 604T83 620Q69 624 42 624H29V686H32ZM227 105L232 99Q237 93 242 87T258 73T280 59T306 49T339 45Q380 45 411 66T451 131Q457 160 457 230Q457 264 456 284T448 329T430 367T396 389T343 398Q282 398 235 355L227 348V105",119836:"447 131H458Q478 131 478 117Q478 112 471 95T439 51T377 9Q330 -6 286 -6Q196 -6 135 35Q39 96 39 222Q39 324 101 384Q169 453 286 453Q359 453 411 431T464 353Q464 319 445 302T395 284Q360 284 343 305T325 353Q325 380 338 396H333Q317 398 295 398H292Q280 398 271 397T245 390T218 373T197 338T183 283Q182 275 182 231Q182 199 184 180T193 132T220 85T270 57Q289 50 317 50H326Q385 50 414 115Q419 127 423 129T447 131",119837:"351 686L442 690Q533 694 534 694H540V389Q540 327 540 253T539 163Q539 97 541 83T555 66Q569 62 596 62H609V31Q609 0 608 0Q588 0 510 -3T412 -6Q411 -6 411 16V38L401 31Q337 -6 265 -6Q159 -6 99 58T38 224Q38 265 51 303T92 375T165 429T272 449Q359 449 417 412V507V555Q417 597 415 607T402 620Q388 624 361 624H348V686H351ZM411 350Q362 399 291 399Q278 399 256 392T218 371Q195 351 189 320T182 238V221Q182 179 183 159T191 115T212 74Q241 46 288 46Q358 46 404 100L411 109V350",119838:"32 225Q32 332 102 392T272 452H283Q382 452 436 401Q494 343 494 243Q494 226 486 222T440 217Q431 217 394 217T327 218H175V209Q175 177 179 154T196 107T236 69T306 50Q312 49 323 49Q376 49 410 85Q421 99 427 111T434 127T442 133T463 135H468Q494 135 494 117Q494 110 489 97T468 66T431 32T373 5T292 -6Q181 -6 107 55T32 225ZM383 276Q377 346 348 374T280 402Q253 402 230 390T195 357Q179 331 176 279V266H383V276",119839:"308 0Q290 3 172 3Q58 3 49 0H40V62H109V382H42V444H109V503L110 562L112 572Q127 625 178 658T316 699Q318 699 330 699T348 700Q381 698 404 687T436 658T449 629T452 606Q452 576 432 557T383 537Q355 537 335 555T314 605Q314 635 328 649H325Q311 649 293 644T253 618T227 560Q226 555 226 498V444H340V382H232V62H318V0H308",119840:"50 300Q50 368 105 409T255 450Q328 450 376 426L388 420Q435 455 489 455Q517 455 533 441T554 414T558 389Q558 367 544 353T508 339Q484 339 471 354T458 387Q458 397 462 400Q464 401 461 400Q459 400 454 399Q429 392 427 390Q454 353 459 328Q461 315 461 300Q461 240 419 202Q364 149 248 149Q185 149 136 172Q129 158 129 148Q129 105 170 93Q176 91 263 91Q273 91 298 91T334 91T366 89T400 85T432 77T466 64Q544 22 544 -69Q544 -114 506 -145Q438 -201 287 -201Q149 -201 90 -161T30 -70Q30 -58 33 -47T42 -27T54 -13T69 -1T82 6T94 12T101 15Q66 57 66 106Q66 151 90 187L97 197L89 204Q50 243 50 300ZM485 403H492Q491 404 488 404L485 403V403ZM255 200Q279 200 295 206T319 219T331 242T335 268T336 300Q336 337 333 352T317 380Q298 399 255 399Q228 399 211 392T187 371T178 345T176 312V300V289Q176 235 194 219Q215 200 255 200ZM287 -150Q357 -150 400 -128T443 -71Q443 -65 442 -61T436 -50T420 -37T389 -27T339 -21L308 -20Q276 -20 253 -20Q190 -20 180 -20T156 -26Q130 -38 130 -69Q130 -105 173 -127T287 -150",119841:"40 686L131 690Q222 694 223 694H229V533L230 372L238 381Q248 394 264 407T317 435T398 450Q428 450 448 447T491 434T529 402T551 346Q553 335 554 198V62H623V0H614Q596 3 489 3Q374 3 365 0H356V62H425V194V275Q425 348 416 373T371 399Q326 399 288 370T238 290Q236 281 235 171V62H304V0H295Q277 3 171 3Q64 3 46 0H37V62H106V332Q106 387 106 453T107 534Q107 593 105 605T91 620Q77 624 50 624H37V686H40",119842:"72 610Q72 649 98 672T159 695Q193 693 217 670T241 610Q241 572 217 549T157 525Q120 525 96 548T72 610ZM46 442L136 446L226 450H232V62H294V0H286Q271 3 171 3Q67 3 49 0H40V62H109V209Q109 358 108 362Q103 380 55 380H43V442H46",119843:"104 610Q104 649 130 672T191 695Q225 693 249 670T273 610Q273 572 249 549T189 525Q152 525 128 548T104 610ZM78 442L173 446L268 450H274V196Q274 -5 274 -37T269 -83Q256 -132 201 -166T71 -200Q10 -200 -30 -173T-71 -102Q-71 -70 -51 -51T-1 -31Q27 -31 48 -49T69 -100Q69 -121 53 -147H56Q66 -149 77 -149H80Q90 -149 100 -146T127 -125T149 -73Q151 -55 151 149V362Q150 364 148 366T145 370T142 373T138 375T133 377T124 378T113 379T97 380H75V442H78",119844:"32 686L123 690Q214 694 215 694H221V255L377 382H346V444H355Q370 441 476 441Q544 441 556 444H562V382H476L347 277L515 62H587V0H579Q564 3 476 3Q370 3 352 0H343V62H358L373 63L260 206L237 189L216 172V62H285V0H277Q259 3 157 3Q46 3 37 0H29V62H98V332Q98 387 98 453T99 534Q99 593 97 605T83 620Q69 624 42 624H29V686H32",119845:"43 686L134 690Q225 694 226 694H232V62H301V0H292Q274 3 170 3Q67 3 49 0H40V62H109V332Q109 387 109 453T110 534Q110 593 108 605T94 620Q80 624 53 624H40V686H43",119846:"40 442Q217 450 218 450H224V365Q226 367 235 378T254 397T278 416T314 435T362 448Q376 450 400 450H406Q503 450 534 393Q545 376 545 370Q545 368 555 379Q611 450 716 450Q774 450 809 434Q850 414 861 379T873 276V213V198V62H942V0H933Q915 3 809 3Q702 3 684 0H675V62H744V194V275Q744 348 735 373T690 399Q645 399 607 370T557 290Q555 281 554 171V62H623V0H614Q596 3 489 3Q374 3 365 0H356V62H425V194V275Q425 348 416 373T371 399Q326 399 288 370T238 290Q236 281 235 171V62H304V0H295Q277 3 171 3Q64 3 46 0H37V62H106V210V303Q106 353 104 363T91 376Q77 380 50 380H37V442H40",119847:"40 442Q217 450 218 450H224V407L225 365Q233 378 245 391T289 422T362 448Q374 450 398 450Q428 450 448 447T491 434T529 402T551 346Q553 335 554 198V62H623V0H614Q596 3 489 3Q374 3 365 0H356V62H425V194V275Q425 348 416 373T371 399Q326 399 288 370T238 290Q236 281 235 171V62H304V0H295Q277 3 171 3Q64 3 46 0H37V62H106V210V303Q106 353 104 363T91 376Q77 380 50 380H37V442H40",119848:"287 -5Q228 -5 182 10T109 48T63 102T39 161T32 219Q32 272 50 314T94 382T154 423T214 446T265 452H279Q319 452 326 451Q428 439 485 376T542 221Q542 156 514 108T442 33Q384 -5 287 -5ZM399 230V250Q399 280 398 298T391 338T372 372T338 392T282 401Q241 401 212 380Q190 363 183 334T175 230Q175 202 175 189T177 153T183 118T195 91T215 68T245 56T287 50Q348 50 374 84Q388 101 393 132T399 230",119849:"32 442L123 446Q214 450 215 450H221V409Q222 409 229 413T251 423T284 436T328 446T382 450Q480 450 540 388T600 223Q600 128 539 61T361 -6H354Q292 -6 236 28L227 34V-132H296V-194H287Q269 -191 163 -191Q56 -191 38 -194H29V-132H98V113V284Q98 330 97 348T93 370T83 376Q69 380 42 380H29V442H32ZM457 224Q457 303 427 349T350 395Q282 395 235 352L227 345V104L233 97Q274 45 337 45Q383 45 420 86T457 224",119850:"38 220Q38 273 54 314T95 380T152 421T211 443T264 449Q368 449 429 386L438 377L484 450H540V-132H609V-194H600Q582 -191 475 -191Q360 -191 351 -194H342V-132H411V42Q409 41 399 34T383 25T367 16T347 7T324 1T296 -4T264 -6Q162 -6 100 56T38 220ZM287 46Q368 46 417 127V301L412 312Q398 347 369 371T302 395Q282 395 263 388T225 362T194 308T182 221Q182 126 214 86T287 46",119851:"405 293T374 293T324 312T305 361Q305 378 312 394Q315 397 315 399Q305 399 294 394T266 375T238 329T222 249Q221 241 221 149V62H308V0H298Q280 3 161 3Q47 3 38 0H29V62H98V210V303Q98 353 96 363T83 376Q69 380 42 380H29V442H32L118 446Q204 450 205 450H210V414L211 378Q247 449 315 449H321Q384 449 413 422T442 360Q442 332 424 313",119852:"38 315Q38 339 45 360T70 404T127 440T223 453Q273 453 320 436L338 445L357 453H366Q380 453 383 447T386 403V387V355Q386 331 383 326T365 321H355H349Q333 321 329 324T324 341Q317 406 224 406H216Q123 406 123 353Q123 334 143 321T188 304T244 294T285 286Q305 281 325 273T373 237T412 172Q414 162 414 142Q414 -6 230 -6Q154 -6 117 22L68 -6H58Q44 -6 41 0T38 42V73Q38 85 38 101T37 122Q37 144 42 148T68 153H75Q87 153 91 151T97 147T103 132Q131 46 220 46H230Q257 46 265 47Q330 58 330 108Q330 127 316 142Q300 156 284 162Q271 168 212 178T122 202Q38 243 38 315",119853:"272 49Q320 49 320 136V145V177H382V143Q382 106 380 99Q374 62 349 36T285 -2L272 -5H247Q173 -5 134 27Q109 46 102 74T94 160Q94 171 94 199T95 245V382H21V433H25Q58 433 90 456Q121 479 140 523T162 621V635H224V444H363V382H224V239V207V149Q224 98 228 81T249 55Q261 49 272 49",119854:"40 442L134 446Q228 450 229 450H235V273V165Q235 90 238 74T254 52Q268 46 304 46H319Q352 46 380 67T419 121L420 123Q424 135 425 199Q425 201 425 207Q425 233 425 249V316Q425 354 423 363T410 376Q396 380 369 380H356V442L554 450V267Q554 84 556 79Q561 62 610 62H623V31Q623 0 622 0Q603 0 527 -3T432 -6Q431 -6 431 25V56L420 45Q373 6 332 -1Q313 -6 281 -6Q208 -6 165 14T109 87L107 98L106 230Q106 358 104 366Q96 380 50 380H37V442H40",119855:"401 444Q413 441 495 441Q568 441 574 444H580V382H510L409 156Q348 18 339 6Q331 -4 320 -4Q318 -4 313 -4T303 -3H288Q273 -3 264 12T221 102Q206 135 197 156L96 382H26V444H34Q49 441 145 441Q252 441 270 444H279V382H231L284 264Q335 149 338 149Q338 150 389 264T442 381Q442 382 418 382H394V444H401",119856:"624 444Q636 441 722 441Q797 441 800 444H805V382H741L593 11Q592 10 590 8T586 4T584 2T581 0T579 -2T575 -3T571 -3T567 -4T561 -4T553 -4H542Q525 -4 518 6T490 70Q474 110 463 137L415 257L367 137Q357 111 341 72Q320 17 313 7T289 -4H277Q259 -4 253 -2T238 11L90 382H25V444H32Q47 441 140 441Q243 441 261 444H270V382H222L310 164L382 342L366 382H303V444H310Q322 441 407 441Q508 441 523 444H531V382H506Q481 382 481 380Q482 376 529 259T577 142L674 382H617V444H624",119857:"227 0Q212 3 121 3Q40 3 28 0H21V62H117L245 213L109 382H26V444H34Q49 441 143 441Q247 441 265 444H274V382H246L281 339Q315 297 316 297Q320 297 354 341L389 382H352V444H360Q375 441 466 441Q547 441 559 444H566V382H471L355 246L504 63L545 62H586V0H578Q563 3 469 3Q365 3 347 0H338V62H366Q366 63 326 112T285 163L198 63L217 62H235V0H227",119858:"84 -102Q84 -110 87 -119T102 -138T133 -149Q148 -148 162 -143T186 -131T206 -114T222 -95T234 -76T243 -59T249 -45T252 -37L269 0L96 382H26V444H34Q49 441 146 441Q252 441 270 444H279V382H255Q232 382 232 380L337 151L442 382H394V444H401Q413 441 495 441Q568 441 574 444H580V382H510L406 152Q298 -84 297 -87Q269 -139 225 -169T131 -200Q85 -200 54 -172T23 -100Q23 -64 44 -50T87 -35Q111 -35 130 -50T152 -92V-100H84V-102",119859:"48 262Q48 264 54 349T60 436V444H252Q289 444 336 444T394 445Q441 445 450 441T459 418Q459 406 458 404Q456 399 327 229T194 55H237Q260 56 268 56T297 58T325 65T348 77T370 98T384 128T395 170Q400 197 400 216Q400 217 431 217H462V211Q461 208 453 108T444 6V0H245Q46 0 43 2Q32 7 32 28V33Q32 41 40 52T84 112Q129 170 164 217L298 393H256Q189 392 165 380Q124 360 115 303Q110 280 110 256Q110 254 79 254H48V262",119860:"208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260",119861:"231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229",119862:"50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q484 659 454 652T382 628T299 572T226 479Q194 422 175 346T156 222Q156 108 232 58Q280 24 350 24Q441 24 512 92T606 240Q610 253 612 255T628 257Q648 257 648 248Q648 243 647 239Q618 132 523 55T319 -22Q206 -22 128 53T50 252",119863:"287 628Q287 635 230 637Q207 637 200 638T193 647Q193 655 197 667T204 682Q206 683 403 683Q570 682 590 682T630 676Q702 659 752 597T803 431Q803 275 696 151T444 3L430 1L236 0H125H72Q48 0 41 2T33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM703 469Q703 507 692 537T666 584T629 613T590 629T555 636Q553 636 541 636T512 636T479 637H436Q392 637 386 627Q384 623 313 339T242 52Q242 48 253 48T330 47Q335 47 349 47T373 46Q499 46 581 128Q617 164 640 212T683 339T703 469",119864:"492 213Q472 213 472 226Q472 230 477 250T482 285Q482 316 461 323T364 330H312Q311 328 277 192T243 52Q243 48 254 48T334 46Q428 46 458 48T518 61Q567 77 599 117T670 248Q680 270 683 272Q690 274 698 274Q718 274 718 261Q613 7 608 2Q605 0 322 0H133Q31 0 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H757Q764 676 764 669Q764 664 751 557T737 447Q735 440 717 440H705Q698 445 698 453L701 476Q704 500 704 528Q704 558 697 578T678 609T643 625T596 632T532 634H485Q397 633 392 631Q388 629 386 622Q385 619 355 499T324 377Q347 376 372 376H398Q464 376 489 391T534 472Q538 488 540 490T557 493Q562 493 565 493T570 492T572 491T574 487T577 483L544 351Q511 218 508 216Q505 213 492 213",119865:"48 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H742Q749 676 749 669Q749 664 736 557T722 447Q720 440 702 440H690Q683 445 683 453Q683 454 686 477T689 530Q689 560 682 579T663 610T626 626T575 633T503 634H480Q398 633 393 631Q388 629 386 623Q385 622 352 492L320 363H375Q378 363 398 363T426 364T448 367T472 374T489 386Q502 398 511 419T524 457T529 475Q532 480 548 480H560Q567 475 567 470Q567 467 536 339T502 207Q500 200 482 200H470Q463 206 463 212Q463 215 468 234T473 274Q473 303 453 310T364 317H309L277 190Q245 66 245 60Q245 46 334 46H359Q365 40 365 39T363 19Q359 6 353 0H336Q295 2 185 2Q120 2 86 2T48 1",119866:"50 252Q50 367 117 473T286 641T490 704Q580 704 633 653Q642 643 648 636T656 626L657 623Q660 623 684 649Q691 655 699 663T715 679T725 690L740 705H746Q760 705 760 698Q760 694 728 561Q692 422 692 421Q690 416 687 415T669 413H653Q647 419 647 422Q647 423 648 429T650 449T651 481Q651 552 619 605T510 659Q492 659 471 656T418 643T357 615T294 567T236 496T189 394T158 260Q156 242 156 221Q156 173 170 136T206 79T256 45T308 28T353 24Q407 24 452 47T514 106Q517 114 529 161T541 214Q541 222 528 224T468 227H431Q425 233 425 235T427 254Q431 267 437 273H454Q494 271 594 271Q634 271 659 271T695 272T707 272Q721 272 721 263Q721 261 719 249Q714 230 709 228Q706 227 694 227Q674 227 653 224Q646 221 643 215T629 164Q620 131 614 108Q589 6 586 3Q584 1 581 1Q571 1 553 21T530 52Q530 53 528 52T522 47Q448 -22 322 -22Q201 -22 126 55T50 252",119867:"228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 219 683Q260 681 355 681Q389 681 418 681T463 682T483 682Q499 682 499 672Q499 670 497 658Q492 641 487 638H485Q483 638 480 638T473 638T464 637T455 637Q416 636 405 634T387 623Q384 619 355 500Q348 474 340 442T328 395L324 380Q324 378 469 378H614L615 381Q615 384 646 504Q674 619 674 627T617 637Q594 637 587 639T580 648Q580 650 582 660Q586 677 588 679T604 682Q609 682 646 681T740 680Q802 680 835 681T871 682Q888 682 888 672Q888 645 876 638H874Q872 638 869 638T862 638T853 637T844 637Q805 636 794 634T776 623Q773 618 704 340T634 58Q634 51 638 51Q646 48 692 46H723Q729 38 729 37T726 19Q722 6 716 0H701Q664 2 567 2Q533 2 504 2T458 2T437 1Q420 1 420 10Q420 15 423 24Q428 43 433 45Q437 46 448 46H454Q481 46 514 49Q520 50 522 50T528 55T534 64T540 82T547 110T558 153Q565 181 569 198Q602 330 602 331T457 332H312L279 197Q245 63 245 58Q245 51 253 49T303 46H334Q340 38 340 37T337 19Q333 6 327 0H312Q275 2 178 2Q144 2 115 2T69 2T48 1Q31 1 31 10Q31 12 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637",119868:"43 1Q26 1 26 10Q26 12 29 24Q34 43 39 45Q42 46 54 46H60Q120 46 136 53Q137 53 138 54Q143 56 149 77T198 273Q210 318 216 344Q286 624 286 626Q284 630 284 631Q274 637 213 637H193Q184 643 189 662Q193 677 195 680T209 683H213Q285 681 359 681Q481 681 487 683H497Q504 676 504 672T501 655T494 639Q491 637 471 637Q440 637 407 634Q393 631 388 623Q381 609 337 432Q326 385 315 341Q245 65 245 59Q245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2Q143 2 113 2T65 2T43 1",119869:"447 625Q447 637 354 637H329Q323 642 323 645T325 664Q329 677 335 683H352Q393 681 498 681Q541 681 568 681T605 682T619 682Q633 682 633 672Q633 670 630 658Q626 642 623 640T604 637Q552 637 545 623Q541 610 483 376Q420 128 419 127Q397 64 333 21T195 -22Q137 -22 97 8T57 88Q57 130 80 152T132 174Q177 174 182 130Q182 98 164 80T123 56Q115 54 115 53T122 44Q148 15 197 15Q235 15 271 47T324 130Q328 142 387 380T447 625",119870:"285 628Q285 635 228 637Q205 637 198 638T191 647Q191 649 193 661Q199 681 203 682Q205 683 214 683H219Q260 681 355 681Q389 681 418 681T463 682T483 682Q500 682 500 674Q500 669 497 660Q496 658 496 654T495 648T493 644T490 641T486 639T479 638T470 637T456 637Q416 636 405 634T387 623L306 305Q307 305 490 449T678 597Q692 611 692 620Q692 635 667 637Q651 637 651 648Q651 650 654 662T659 677Q662 682 676 682Q680 682 711 681T791 680Q814 680 839 681T869 682Q889 682 889 672Q889 650 881 642Q878 637 862 637Q787 632 726 586Q710 576 656 534T556 455L509 418L518 396Q527 374 546 329T581 244Q656 67 661 61Q663 59 666 57Q680 47 717 46H738Q744 38 744 37T741 19Q737 6 731 0H720Q680 3 625 3Q503 3 488 0H478Q472 6 472 9T474 27Q478 40 480 43T491 46H494Q544 46 544 71Q544 75 517 141T485 216L427 354L359 301L291 248L268 155Q245 63 245 58Q245 51 253 49T303 46H334Q340 37 340 35Q340 19 333 5Q328 0 317 0Q314 0 280 1T180 2Q118 2 85 2T49 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628",119871:"228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 217 683Q271 680 344 680Q485 680 506 683H518Q524 677 524 674T522 656Q517 641 513 637H475Q406 636 394 628Q387 624 380 600T313 336Q297 271 279 198T252 88L243 52Q243 48 252 48T311 46H328Q360 46 379 47T428 54T478 72T522 106T564 161Q580 191 594 228T611 270Q616 273 628 273H641Q647 264 647 262T627 203T583 83T557 9Q555 4 553 3T537 0T494 -1Q483 -1 418 -1T294 0H116Q32 0 32 10Q32 17 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637",119872:"289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629",119873:"234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637",119874:"740 435Q740 320 676 213T511 42T304 -22Q207 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435ZM637 476Q637 565 591 615T476 665Q396 665 322 605Q242 542 200 428T157 216Q157 126 200 73T314 19Q404 19 485 98T608 313Q637 408 637 476",119875:"287 628Q287 635 230 637Q206 637 199 638T192 648Q192 649 194 659Q200 679 203 681T397 683Q587 682 600 680Q664 669 707 631T751 530Q751 453 685 389Q616 321 507 303Q500 302 402 301H307L277 182Q247 66 247 59Q247 55 248 54T255 50T272 48T305 46H336Q342 37 342 35Q342 19 335 5Q330 0 319 0Q316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597T609 619T560 635Q553 636 480 637Q463 637 445 637T416 636T404 636Q391 635 386 627Q384 621 367 550T332 412T314 344Q314 342 395 342H407H430Q542 342 590 392Q617 419 631 471T645 554",119876:"399 -80Q399 -47 400 -30T402 -11V-7L387 -11Q341 -22 303 -22Q208 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435Q740 255 592 107Q529 47 461 16L444 8V3Q444 2 449 -24T470 -66T516 -82Q551 -82 583 -60T625 -3Q631 11 638 11Q647 11 649 2Q649 -6 639 -34T611 -100T557 -165T481 -194Q399 -194 399 -87V-80ZM636 468Q636 523 621 564T580 625T530 655T477 665Q429 665 379 640Q277 591 215 464T153 216Q153 110 207 59Q231 38 236 38V46Q236 86 269 120T347 155Q372 155 390 144T417 114T429 82T435 55L448 64Q512 108 557 185T619 334T636 468ZM314 18Q362 18 404 39L403 49Q399 104 366 115Q354 117 347 117Q344 117 341 117T337 118Q317 118 296 98T274 52Q274 18 314 18",119877:"230 637Q203 637 198 638T193 649Q193 676 204 682Q206 683 378 683Q550 682 564 680Q620 672 658 652T712 606T733 563T739 529Q739 484 710 445T643 385T576 351T538 338L545 333Q612 295 612 223Q612 212 607 162T602 80V71Q602 53 603 43T614 25T640 16Q668 16 686 38T712 85Q717 99 720 102T735 105Q755 105 755 93Q755 75 731 36Q693 -21 641 -21H632Q571 -21 531 4T487 82Q487 109 502 166T517 239Q517 290 474 313Q459 320 449 321T378 323H309L277 193Q244 61 244 59Q244 55 245 54T252 50T269 48T302 46H333Q339 38 339 37T336 19Q332 6 326 0H311Q275 2 180 2Q146 2 117 2T71 2T50 1Q33 1 33 10Q33 12 36 24Q41 43 46 45Q50 46 61 46H67Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628Q287 635 230 637ZM630 554Q630 586 609 608T523 636Q521 636 500 636T462 637H440Q393 637 386 627Q385 624 352 494T319 361Q319 360 388 360Q466 361 492 367Q556 377 592 426Q608 449 619 486T630 554",119878:"308 24Q367 24 416 76T466 197Q466 260 414 284Q308 311 278 321T236 341Q176 383 176 462Q176 523 208 573T273 648Q302 673 343 688T407 704H418H425Q521 704 564 640Q565 640 577 653T603 682T623 704Q624 704 627 704T632 705Q645 705 645 698T617 577T585 459T569 456Q549 456 549 465Q549 471 550 475Q550 478 551 494T553 520Q553 554 544 579T526 616T501 641Q465 662 419 662Q362 662 313 616T263 510Q263 480 278 458T319 427Q323 425 389 408T456 390Q490 379 522 342T554 242Q554 216 546 186Q541 164 528 137T492 78T426 18T332 -20Q320 -22 298 -22Q199 -22 144 33L134 44L106 13Q83 -14 78 -18T65 -22Q52 -22 52 -14Q52 -11 110 221Q112 227 130 227H143Q149 221 149 216Q149 214 148 207T144 186T142 153Q144 114 160 87T203 47T255 29T308 24",119879:"40 437Q21 437 21 445Q21 450 37 501T71 602L88 651Q93 669 101 677H569H659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437Q640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631Q469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46Q418 46 427 45T436 36Q436 31 433 22Q429 4 424 1L422 0Q419 0 415 0Q410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83H94Q174 46 189 55Q190 56 191 56Q196 59 201 76T241 233Q258 301 269 344Q339 619 339 625Q339 630 310 630H279Q212 630 191 624Q146 614 121 583T67 467Q60 445 57 441T43 437H40",119880:"107 637Q73 637 71 641Q70 643 70 649Q70 673 81 682Q83 683 98 683Q139 681 234 681Q268 681 297 681T342 682T362 682Q378 682 378 672Q378 670 376 658Q371 641 366 638H364Q362 638 359 638T352 638T343 637T334 637Q295 636 284 634T266 623Q265 621 238 518T184 302T154 169Q152 155 152 140Q152 86 183 55T269 24Q336 24 403 69T501 205L552 406Q599 598 599 606Q599 633 535 637Q511 637 511 648Q511 650 513 660Q517 676 519 679T529 683Q532 683 561 682T645 680Q696 680 723 681T752 682Q767 682 767 672Q767 650 759 642Q756 637 737 637Q666 633 648 597Q646 592 598 404Q557 235 548 205Q515 105 433 42T263 -22Q171 -22 116 34T60 167V183Q60 201 115 421Q164 622 164 628Q164 635 107 637",119881:"52 648Q52 670 65 683H76Q118 680 181 680Q299 680 320 683H330Q336 677 336 674T334 656Q329 641 325 637H304Q282 635 274 635Q245 630 242 620Q242 618 271 369T301 118L374 235Q447 352 520 471T595 594Q599 601 599 609Q599 633 555 637Q537 637 537 648Q537 649 539 661Q542 675 545 679T558 683Q560 683 570 683T604 682T668 681Q737 681 755 683H762Q769 676 769 672Q769 655 760 640Q757 637 743 637Q730 636 719 635T698 630T682 623T670 615T660 608T652 599T645 592L452 282Q272 -9 266 -16Q263 -18 259 -21L241 -22H234Q216 -22 216 -15Q213 -9 177 305Q139 623 138 626Q133 637 76 637H59Q52 642 52 648",119882:"436 683Q450 683 486 682T553 680Q604 680 638 681T677 682Q695 682 695 674Q695 670 692 659Q687 641 683 639T661 637Q636 636 621 632T600 624T597 615Q597 603 613 377T629 138L631 141Q633 144 637 151T649 170T666 200T690 241T720 295T759 362Q863 546 877 572T892 604Q892 619 873 628T831 637Q817 637 817 647Q817 650 819 660Q823 676 825 679T839 682Q842 682 856 682T895 682T949 681Q1015 681 1034 683Q1048 683 1048 672Q1048 666 1045 655T1038 640T1028 637Q1006 637 988 631T958 617T939 600T927 584L923 578L754 282Q586 -14 585 -15Q579 -22 561 -22Q546 -22 542 -17Q539 -14 523 229T506 480L494 462Q472 425 366 239Q222 -13 220 -15T215 -19Q210 -22 197 -22Q178 -22 176 -15Q176 -12 154 304T131 622Q129 631 121 633T82 637H58Q51 644 51 648Q52 671 64 683H76Q118 680 176 680Q301 680 313 683H323Q329 677 329 674T327 656Q322 641 318 637H297Q236 634 232 620Q262 160 266 136L501 550L499 587Q496 629 489 632Q483 636 447 637Q428 637 422 639T416 648Q416 650 418 660Q419 664 420 669T421 676T424 680T428 682T436 683",119883:"42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0",119884:"66 637Q54 637 49 637T39 638T32 641T30 647T33 664T42 682Q44 683 56 683Q104 680 165 680Q288 680 306 683H316Q322 677 322 674T320 656Q316 643 310 637H298Q242 637 242 624Q242 619 292 477T343 333L346 336Q350 340 358 349T379 373T411 410T454 461Q546 568 561 587T577 618Q577 634 545 637Q528 637 528 647Q528 649 530 661Q533 676 535 679T549 683Q551 683 578 682T657 680Q684 680 713 681T746 682Q763 682 763 673Q763 669 760 657T755 643Q753 637 734 637Q662 632 617 587Q608 578 477 424L348 273L322 169Q295 62 295 57Q295 46 363 46Q379 46 384 45T390 35Q390 33 388 23Q384 6 382 4T366 1Q361 1 324 1T232 2Q170 2 138 2T102 1Q84 1 84 9Q84 14 87 24Q88 27 89 30T90 35T91 39T93 42T96 44T101 45T107 45T116 46T129 46Q168 47 180 50T198 63Q201 68 227 171L252 274L129 623Q128 624 127 625T125 627T122 629T118 631T113 633T105 634T96 635T83 636T66 637",119885:"58 8Q58 23 64 35Q64 36 329 334T596 635L586 637Q575 637 512 637H500H476Q442 637 420 635T365 624T311 598T266 548T228 469Q227 466 226 463T224 458T223 453T222 450L221 448Q218 443 202 443Q185 443 182 453L214 561Q228 606 241 651Q249 679 253 681Q256 683 487 683H718Q723 678 723 675Q723 673 717 649Q189 54 188 52L185 49H274Q369 50 377 51Q452 60 500 100T579 247Q587 272 590 277T603 282H607Q628 282 628 271Q547 5 541 2Q538 0 300 0H124Q58 0 58 8",119886:"33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328",119887:"73 647Q73 657 77 670T89 683Q90 683 161 688T234 694Q246 694 246 685T212 542Q204 508 195 472T180 418L176 399Q176 396 182 402Q231 442 283 442Q345 442 383 396T422 280Q422 169 343 79T173 -11Q123 -11 82 27T40 150V159Q40 180 48 217T97 414Q147 611 147 623T109 637Q104 637 101 637H96Q86 637 83 637T76 640T73 647ZM336 325V331Q336 405 275 405Q258 405 240 397T207 376T181 352T163 330L157 322L136 236Q114 150 114 114Q114 66 138 42Q154 26 178 26Q211 26 245 58Q270 81 285 114T318 219Q336 291 336 325",119888:"34 159Q34 268 120 355T306 442Q362 442 394 418T427 355Q427 326 408 306T360 285Q341 285 330 295T319 325T330 359T352 380T366 386H367Q367 388 361 392T340 400T306 404Q276 404 249 390Q228 381 206 359Q162 315 142 235T121 119Q121 73 147 50Q169 26 205 26H209Q321 26 394 111Q403 121 406 121Q410 121 419 112T429 98T420 83T391 55T346 25T282 0T202 -11Q127 -11 81 37T34 159",119889:"366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326",119890:"39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353",119891:"118 -162Q120 -162 124 -164T135 -167T147 -168Q160 -168 171 -155T187 -126Q197 -99 221 27T267 267T289 382V385H242Q195 385 192 387Q188 390 188 397L195 425Q197 430 203 430T250 431Q298 431 298 432Q298 434 307 482T319 540Q356 705 465 705Q502 703 526 683T550 630Q550 594 529 578T487 561Q443 561 443 603Q443 622 454 636T478 657L487 662Q471 668 457 668Q445 668 434 658T419 630Q412 601 403 552T387 469T380 433Q380 431 435 431Q480 431 487 430T498 424Q499 420 496 407T491 391Q489 386 482 386T428 385H372L349 263Q301 15 282 -47Q255 -132 212 -173Q175 -205 139 -205Q107 -205 81 -186T55 -132Q55 -95 76 -78T118 -61Q162 -61 162 -103Q162 -122 151 -136T127 -157L118 -162",119892:"311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328",119894:"184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287",119895:"297 596Q297 627 318 644T361 661Q378 661 389 651T403 623Q403 595 384 576T340 557Q322 557 310 567T297 596ZM288 376Q288 405 262 405Q240 405 220 393T185 362T161 325T144 293L137 279Q135 278 121 278H107Q101 284 101 286T105 299Q126 348 164 391T252 441Q253 441 260 441T272 442Q296 441 316 432Q341 418 354 401T367 348V332L318 133Q267 -67 264 -75Q246 -125 194 -164T75 -204Q25 -204 7 -183T-12 -137Q-12 -110 7 -91T53 -71Q70 -71 82 -81T95 -112Q95 -148 63 -167Q69 -168 77 -168Q111 -168 139 -140T182 -74L193 -32Q204 11 219 72T251 197T278 308T289 365Q289 372 288 376",119896:"121 647Q121 657 125 670T137 683Q138 683 209 688T282 694Q294 694 294 686Q294 679 244 477Q194 279 194 272Q213 282 223 291Q247 309 292 354T362 415Q402 442 438 442Q468 442 485 423T503 369Q503 344 496 327T477 302T456 291T438 288Q418 288 406 299T394 328Q394 353 410 369T442 390L458 393Q446 405 434 405H430Q398 402 367 380T294 316T228 255Q230 254 243 252T267 246T293 238T320 224T342 206T359 180T365 147Q365 130 360 106T354 66Q354 26 381 26Q429 26 459 145Q461 153 479 153H483Q499 153 499 144Q499 139 496 130Q455 -11 378 -11Q333 -11 305 15T277 90Q277 108 280 121T283 145Q283 167 269 183T234 206T200 217T182 220H180Q168 178 159 139T145 81T136 44T129 20T122 7T111 -2Q98 -11 83 -11Q66 -11 57 -1T48 16Q48 26 85 176T158 471L195 616Q196 629 188 632T149 637H144Q134 637 131 637T124 640T121 647",119897:"117 59Q117 26 142 26Q179 26 205 131Q211 151 215 152Q217 153 225 153H229Q238 153 241 153T246 151T248 144Q247 138 245 128T234 90T214 43T183 6T137 -11Q101 -11 70 11T38 85Q38 97 39 102L104 360Q167 615 167 623Q167 626 166 628T162 632T157 634T149 635T141 636T132 637T122 637Q112 637 109 637T101 638T95 641T94 647Q94 649 96 661Q101 680 107 682T179 688Q194 689 213 690T243 693T254 694Q266 694 266 686Q266 675 193 386T118 83Q118 81 118 75T117 65V59",119898:"21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287",119899:"21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287",119900:"201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120",119901:"23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102",119902:"33 157Q33 258 109 349T280 441Q340 441 372 389Q373 390 377 395T388 406T404 418Q438 442 450 442Q454 442 457 439T460 434Q460 425 391 149Q320 -135 320 -139Q320 -147 365 -148H390Q396 -156 396 -157T393 -175Q389 -188 383 -194H370Q339 -192 262 -192Q234 -192 211 -192T174 -192T157 -193Q143 -193 143 -185Q143 -182 145 -170Q149 -154 152 -151T172 -148Q220 -148 230 -141Q238 -136 258 -53T279 32Q279 33 272 29Q224 -10 172 -10Q117 -10 75 30T33 157ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326",119903:"21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287",119904:"131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289",119905:"26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26",119906:"21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287",119907:"173 380Q173 405 154 405Q130 405 104 376T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Q21 294 29 316T53 368T97 419T160 441Q202 441 225 417T249 361Q249 344 246 335Q246 329 231 291T200 202T182 113Q182 86 187 69Q200 26 250 26Q287 26 319 60T369 139T398 222T409 277Q409 300 401 317T383 343T365 361T357 383Q357 405 376 424T417 443Q436 443 451 425T467 367Q467 340 455 284T418 159T347 40T241 -11Q177 -11 139 22Q102 54 102 117Q102 148 110 181T151 298Q173 362 173 380",119908:"580 385Q580 406 599 424T641 443Q659 443 674 425T690 368Q690 339 671 253Q656 197 644 161T609 80T554 12T482 -11Q438 -11 404 5T355 48Q354 47 352 44Q311 -11 252 -11Q226 -11 202 -5T155 14T118 53T104 116Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 293 29 315T52 366T96 418T161 441Q204 441 227 416T250 358Q250 340 217 250T184 111Q184 65 205 46T258 26Q301 26 334 87L339 96V119Q339 122 339 128T340 136T341 143T342 152T345 165T348 182T354 206T362 238T373 281Q402 395 406 404Q419 431 449 431Q468 431 475 421T483 402Q483 389 454 274T422 142Q420 131 420 107V100Q420 85 423 71T442 42T487 26Q558 26 600 148Q609 171 620 213T632 273Q632 306 619 325T593 357T580 385",119909:"52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289",119910:"21 287Q21 301 36 335T84 406T158 442Q199 442 224 419T250 355Q248 336 247 334Q247 331 231 288T198 191T182 105Q182 62 196 45T238 27Q261 27 281 38T312 61T339 94Q339 95 344 114T358 173T377 247Q415 397 419 404Q432 431 462 431Q475 431 483 424T494 412T496 403Q496 390 447 193T391 -23Q363 -106 294 -155T156 -205Q111 -205 77 -183T43 -117Q43 -95 50 -80T69 -58T89 -48T106 -45Q150 -45 150 -87Q150 -107 138 -122T115 -142T102 -147L99 -148Q101 -153 118 -160T152 -167H160Q177 -167 186 -165Q219 -156 247 -127T290 -65T313 -9T321 21L315 17Q309 13 296 6T270 -6Q250 -11 231 -11Q185 -11 150 11T104 82Q103 89 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287",119911:"347 338Q337 338 294 349T231 360Q211 360 197 356T174 346T162 335T155 324L153 320Q150 317 138 317Q117 317 117 325Q117 330 120 339Q133 378 163 406T229 440Q241 442 246 442Q271 442 291 425T329 392T367 375Q389 375 411 408T434 441Q435 442 449 442H462Q468 436 468 434Q468 430 463 420T449 399T432 377T418 358L411 349Q368 298 275 214T160 106L148 94L163 93Q185 93 227 82T290 71Q328 71 360 90T402 140Q406 149 409 151T424 153Q443 153 443 143Q443 138 442 134Q425 72 376 31T278 -11Q252 -11 232 6T193 40T155 57Q111 57 76 -3Q70 -11 59 -11H54H41Q35 -5 35 -2Q35 13 93 84Q132 129 225 214T340 322Q352 338 347 338",119912:"65 0Q45 0 45 18Q48 52 61 60Q65 62 81 62Q155 62 165 74Q166 74 265 228T465 539T569 699Q576 707 583 709T611 711T637 710T649 700Q650 697 695 380L741 63L784 62H827Q839 50 839 45L835 29Q831 9 827 5T806 0Q803 0 790 0T743 1T657 2Q585 2 547 1T504 0Q481 0 481 17Q484 54 497 60Q501 62 541 62Q580 62 580 63Q580 68 573 121T564 179V181H308L271 124Q236 69 236 67T283 62H287Q316 62 316 46Q316 26 307 8Q302 3 295 0L262 1Q242 2 168 2Q119 2 93 1T65 0ZM537 372Q533 402 528 435T521 486T518 504V505Q517 505 433 375L348 244L451 243Q555 243 555 244L537 372",119913:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 449 686H477H586Q684 686 733 677T817 634Q853 598 853 547Q853 499 826 460T761 401T695 371T654 360H653L662 358Q670 357 683 354T712 344T744 327T774 303T795 269T804 224Q804 148 732 79T533 1Q524 0 288 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624ZM703 550Q703 571 695 586T675 609T656 619T643 623L545 624H447L417 504Q386 384 386 383T470 382Q554 383 565 385Q632 397 667 447T703 550ZM651 240Q651 265 645 282T626 309T608 322T592 329Q587 330 479 331H373L340 198Q307 65 306 64Q306 62 406 62L507 63L519 65Q565 76 596 107T639 171T651 240",119914:"380 -17Q335 -17 293 -10T207 16T130 65T76 144T55 256Q55 306 70 361T122 476T211 582T345 663T525 702H545Q673 702 731 634L777 668Q783 672 789 677T800 685T808 691T814 695T818 698T822 700T825 702T828 703T830 703T833 703Q855 703 855 690Q855 686 823 558T789 426Q786 421 782 420T756 419Q734 420 729 421T724 432Q724 434 725 447T726 472Q726 552 678 604Q640 640 586 640H574Q533 640 494 632T409 604T324 541T260 437Q243 397 227 333T210 219Q210 152 237 117Q255 90 299 68T420 46H429Q506 46 580 100T678 234Q683 249 687 251T712 254H723Q743 254 743 240Q743 232 736 213T710 162T663 100T586 40T477 -5Q433 -17 380 -17",119915:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 437 686Q659 686 668 685Q727 680 772 662T842 621T883 568T905 517T913 475Q914 466 914 434Q914 373 892 307T828 179T712 69T548 7Q517 2 494 2T279 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624ZM768 475Q768 515 753 544T718 588T666 611T613 622T563 624H538H532H452L382 344Q311 64 311 63T363 62H405Q490 62 545 76T656 142Q696 185 724 265T760 399T768 475",119916:"257 618H231Q198 618 198 636Q202 672 214 678L219 680H811Q817 677 820 673T824 666L825 664Q825 659 814 549T799 433Q793 424 771 424Q752 424 746 427T740 441Q740 445 742 466T744 505Q744 561 722 585T646 616Q639 617 545 618H456Q456 617 427 502T398 385Q398 384 435 384Q461 385 471 385T499 391T526 405T545 433T562 478Q566 494 571 497T595 501H604Q622 501 626 486Q626 482 593 349T557 213Q552 205 530 205Q499 205 499 219Q499 222 503 242T508 281Q508 308 491 314T429 322Q425 322 423 322H382L317 64Q317 62 390 62Q460 62 493 64T569 80T640 124Q665 149 686 187T719 253T733 283Q739 289 760 289Q791 289 791 274Q791 267 763 201T706 71L678 8Q676 4 667 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L163 66Q163 67 231 341T301 616Q301 618 257 618",119917:"257 618H231Q198 618 198 636Q202 672 214 678L219 680H795Q801 677 804 673T808 666L809 664Q809 659 798 549T783 433Q777 424 755 424Q736 424 730 427T724 444Q724 448 725 468T727 507V524Q727 541 724 554T713 577T698 594T676 605T653 612T625 616T597 617T566 618T538 618H456L455 614Q455 611 424 491L394 371H429Q454 372 463 372T491 378T517 392T536 419T552 464Q556 481 561 484T586 488Q603 488 607 486Q616 482 616 473Q616 467 584 337T549 201Q542 192 521 192Q503 192 497 195T490 209Q490 212 492 224Q499 251 499 269Q499 288 489 296T465 306T417 308L379 309L348 188Q341 161 334 129T322 80L318 65L317 62H375H409Q430 62 438 59T447 45Q444 8 431 2L426 0L377 1Q347 2 231 2Q152 2 111 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L163 66Q163 67 231 341T301 616Q301 618 257 618",119918:"379 -16Q233 -16 145 52T56 255Q56 310 73 368T127 483T216 586T347 663T518 702H540Q562 702 582 700T616 696T644 689T667 681T686 670T702 659T717 647T731 635L776 668Q782 672 788 677T799 685T807 691T813 695T817 698T821 700T824 702T827 703T829 703T832 703Q854 703 854 690Q854 686 822 558T788 426Q785 421 781 420T755 419Q734 420 729 422T723 432Q723 434 724 446T725 469Q725 531 702 571T642 628Q616 640 575 640Q468 640 390 593T272 464Q247 415 229 340T210 214Q210 166 228 132T277 79T343 54T419 46Q445 46 465 50T500 59T526 76T544 96T557 123T566 150T574 182T581 214H519Q511 214 498 214T479 213Q443 213 443 230Q443 250 452 268Q457 273 464 276L514 275Q546 274 657 274Q735 274 768 275T803 276Q826 276 826 258Q823 224 810 216Q806 214 771 214H736Q736 211 710 109T683 5Q678 0 671 0Q666 0 637 14T597 36Q593 38 590 40T585 44T582 44T576 40Q511 -16 379 -16",119919:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 239 686Q290 684 403 684Q475 684 512 685T553 686Q576 686 576 668Q572 632 560 626Q555 624 506 624H457L399 389Q399 388 547 388H695L753 623Q753 624 709 624H686Q665 624 660 626T650 639Q653 678 668 684Q672 686 681 686Q685 686 726 685T847 684Q902 684 937 684T986 685T1004 686Q1027 686 1027 668Q1023 632 1011 626Q1006 624 957 624H908L839 344Q768 64 768 63T812 62H839Q871 62 871 44Q867 6 854 2L850 0L808 1Q782 2 675 2Q600 2 560 1T516 0Q499 0 494 15Q498 54 511 60Q515 62 564 62H613L614 66L679 324Q679 326 531 326H383L382 322L317 64Q317 62 361 62H388Q420 62 420 44Q416 6 403 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624",119920:"247 624Q242 624 233 624T220 623Q186 623 186 640Q186 647 190 664T202 684Q206 686 226 686Q277 684 393 684Q435 684 471 684T528 685T553 686Q573 686 573 670Q573 650 564 632Q556 624 537 624H501H449L380 344Q309 64 309 63T356 62Q361 62 370 62T384 63Q417 63 417 46Q417 26 408 8Q403 3 396 0L352 1Q325 2 216 2T82 1L45 0Q30 7 30 16Q33 51 46 60Q51 62 102 62H154L294 623Q294 624 247 624",119921:"205 131Q205 105 192 84T165 54L152 45Q152 44 160 42T182 37T213 35H216Q255 35 289 65Q314 90 329 129Q331 136 392 378T453 623Q453 624 393 624H332Q318 631 318 640Q318 647 322 664T334 684Q338 686 359 686Q413 684 533 684Q566 684 605 685T652 686Q677 686 685 683T694 669Q694 664 691 652Q686 631 681 628T647 624H602L542 380Q531 336 518 285T500 212T487 161T475 122T463 97T448 74T429 55Q351 -17 213 -17Q142 -17 99 7T43 70Q42 75 42 93Q42 143 73 168T139 194Q168 194 186 177T205 131",119922:"536 0Q522 6 522 18Q522 35 533 57Q539 62 557 62Q595 62 601 65L472 330L365 255L342 160Q318 65 317 64Q317 62 361 62H388Q420 62 420 44Q416 6 403 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 239 686Q290 684 403 684Q475 684 512 685T553 686Q576 686 576 668Q572 632 560 626Q555 624 506 624H457L422 481Q386 339 386 337L785 621Q779 624 749 624Q726 624 726 641Q726 645 730 659Q734 675 736 679T747 686L786 685Q812 684 888 684Q908 684 934 685T968 686Q1003 686 1003 669Q1003 646 991 629Q985 624 967 624Q918 624 888 617Q884 617 874 613L865 609Q864 608 732 515T599 420Q599 418 686 242T775 65Q784 62 829 62Q847 62 850 61T860 54Q862 52 862 43Q862 10 845 1Q844 1 842 1T836 0T797 1T694 2Q599 2 573 1L536 0",119923:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 239 686Q290 684 409 684Q454 684 492 684T552 685T579 686Q603 686 603 668Q599 632 587 626Q583 624 520 624H457L388 344Q317 64 317 63T353 62H390Q418 62 440 64T493 78T548 110T598 169T643 261Q651 282 655 285T680 289Q696 289 700 288T709 279Q711 274 711 269Q710 265 663 138T613 8Q611 4 602 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624",119924:"258 624H231Q214 624 208 626T199 639Q203 678 216 684Q220 686 347 686H473Q474 685 478 682T484 677Q487 673 535 413L584 153L608 187Q631 221 672 281T761 410Q935 663 943 671Q949 678 962 686H1082H1166Q1201 686 1210 683T1219 668Q1215 632 1203 626Q1199 624 1149 624H1100L1031 344Q960 64 960 63T1004 62H1031Q1063 62 1063 44Q1060 7 1046 2Q1042 0 1034 0Q1030 0 990 1T875 2Q804 2 767 1T725 0H723Q707 0 703 15Q707 54 720 60Q724 62 773 62H822Q961 618 961 619L754 318Q546 15 543 12Q531 0 510 0Q500 0 495 0T484 5T477 19Q477 20 421 315L367 604L299 335Q234 72 234 68Q234 62 302 62Q334 62 334 46Q332 8 317 2Q313 0 306 0Q301 0 267 1T181 2Q125 2 96 1T63 0Q48 0 43 15Q43 19 47 35Q52 55 57 58T94 62Q147 64 164 69L233 345Q302 619 302 622Q302 624 258 624",119925:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 344 686H434Q464 686 477 680Q480 677 607 454Q738 227 739 227Q742 227 789 418T836 618Q836 620 835 620L821 622Q811 622 779 624Q755 624 749 625T740 632Q737 635 737 644Q737 656 742 669T754 685Q755 685 757 685T763 686Q768 686 803 685T890 684Q925 684 951 684T990 685T1006 686Q1014 686 1016 684Q1027 679 1027 668Q1023 632 1011 626Q1007 624 978 624Q912 622 907 617Q907 616 831 314T753 8Q749 0 723 0H712Q699 0 692 7Q692 8 671 44T607 155T526 296L361 580L296 323Q234 74 234 68T302 62H307Q334 62 334 44Q330 6 317 2L313 0L280 1Q260 2 181 2Q125 2 96 1T63 0Q48 0 43 15Q43 19 47 35Q52 55 57 58T94 62Q147 64 164 69L233 345Q302 619 302 622Q302 624 258 624",119926:"53 245Q53 297 70 356T125 478T216 590T349 671T523 703Q656 703 735 637T815 445Q815 378 791 307Q727 104 527 17Q437 -17 344 -17Q289 -17 242 -5T150 35T79 116T53 245ZM664 489Q664 575 618 611T511 648Q463 648 416 627T334 570Q297 531 270 472T230 355T213 261T208 206Q208 177 215 151T237 98T284 56T358 40Q440 40 510 98T618 270Q664 400 664 489",119927:"162 62L302 623Q302 624 258 624H234Q214 624 209 626T200 638Q200 677 217 684Q220 686 439 686Q667 685 684 682Q686 681 693 680Q713 677 733 671T782 649T829 602T847 528Q847 450 784 382T604 293Q571 288 469 287H373L346 176Q340 151 333 122T321 78L317 64Q317 62 361 62H387Q420 62 420 44Q417 10 404 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q43 0 43 17Q43 21 47 33Q52 54 57 58T89 62H113H162ZM692 558Q692 611 617 622Q610 623 529 624H452L381 343H458H492Q604 343 641 389Q662 414 677 471T692 558",119928:"53 245Q53 297 70 356T125 478T216 590T349 671T523 703Q656 703 735 637T815 445Q815 410 808 370T781 277T729 178T643 87T519 14L525 4Q540 -19 553 -25T592 -32Q632 -32 654 -24T680 -7T689 10T704 18Q713 18 717 12T722 0Q722 -8 711 -36T681 -101T624 -166T541 -194Q513 -194 494 -183T465 -157T450 -118T444 -79T443 -41V-7L433 -9Q391 -17 344 -17Q301 -17 263 -10T185 15T118 62T71 138T53 245ZM666 482Q666 529 652 563T614 615T565 640T512 648Q412 648 335 573Q268 506 235 389T201 202Q201 164 210 136T230 95T259 66L262 76Q269 109 302 135T382 162Q401 162 415 159T449 140T484 92L491 78L496 82Q502 86 505 88T515 97T528 107T541 120T555 137T570 156T585 179T599 205T612 235Q629 278 647 351T666 482ZM439 56Q439 58 439 62T435 75T426 92T410 106T383 112Q353 112 332 96T311 63Q311 38 355 38H366Q391 39 415 45T439 56",119929:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 422 686H446H525Q634 686 698 674T806 620Q843 583 843 535Q843 505 833 478T805 432T768 396T728 370T690 352T662 342L651 338L654 336Q658 334 667 327T688 310Q719 278 719 237Q719 222 710 165T701 94Q701 35 748 35Q775 35 793 57T819 101Q822 112 826 114T843 117H849Q881 117 881 99Q881 78 852 39T781 -11Q765 -17 728 -17Q537 -13 537 94Q537 110 552 169T567 243Q567 292 529 309Q517 316 508 316T441 318H375L374 314Q374 312 343 189T311 64Q311 62 355 62H382Q414 62 414 44Q410 6 397 2L393 0L351 1Q325 2 221 2Q147 2 108 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624ZM687 555Q687 617 589 623Q581 624 513 624H451L420 498Q413 468 405 436T392 388L388 371Q388 369 458 369Q464 369 485 369T515 369T541 372T570 377T596 386T624 400Q649 417 664 457T683 522T687 555",119930:"354 45Q429 45 467 91T506 184Q506 225 477 250Q461 262 384 279T294 300Q238 318 210 362T182 452Q182 493 202 540T257 623Q338 702 449 702Q491 702 501 701Q571 690 610 654Q614 649 617 650Q618 650 650 675T683 702Q685 703 692 703Q714 703 714 690Q714 686 687 578T658 466Q653 458 629 458Q606 458 602 463Q600 465 599 466Q599 467 599 469T598 473Q598 475 599 487T600 511Q600 584 557 614T454 645Q386 645 347 606T308 520Q308 506 311 496T323 477T338 464T360 454T384 446T413 439T441 433Q523 416 549 401Q581 384 602 352Q631 309 631 254Q631 214 615 170T567 83T478 12T347 -16Q322 -16 300 -14T261 -8T230 0T205 10T187 20T172 30L162 37L130 11Q124 7 119 3T110 -4T104 -9T100 -13T96 -15T93 -16T91 -17T88 -17H82Q76 -17 73 -16T69 -14T66 -10T63 -5L90 107Q97 133 106 170Q116 211 120 219T136 228H148Q167 228 173 227T179 218Q179 216 176 200T173 168Q173 102 227 74T354 45",119931:"498 62Q511 58 511 43Q511 10 494 1L490 0Q487 0 482 0T424 1T271 2Q201 2 157 2T94 1T72 0H70Q46 0 46 17Q49 54 62 60L66 62H137Q208 62 209 63L218 98Q227 134 244 203T278 339L347 613H300Q262 612 246 611T198 599T146 564Q128 545 114 512T91 454T79 425Q73 419 52 419Q22 419 22 434Q22 440 41 498T80 611L100 666Q105 673 111 675H434Q758 675 762 673Q772 668 772 657Q772 655 756 549T738 434Q735 419 711 419H707Q690 419 686 421Q677 425 677 434Q676 436 678 449T683 485T686 529Q686 553 679 569T662 594T631 607T593 612T544 613H502L433 340Q418 279 400 207T374 100L365 65L364 62H498",119932:"856 686Q877 686 877 668Q877 663 873 649T867 631Q861 624 828 624Q762 622 757 617Q757 613 705 409T651 200Q620 112 540 48T328 -16Q251 -16 196 2T113 51T75 112T63 176Q63 202 70 232T117 422Q129 469 141 520T160 598L167 623Q167 624 123 624H96Q79 624 73 626T64 639Q68 678 81 684Q85 686 104 686Q155 684 268 684Q340 684 377 685T418 686Q441 686 441 668Q437 632 425 626Q421 624 371 624H322L270 415Q224 232 217 198T209 141Q209 45 336 45Q372 45 406 52T475 77T540 128T585 211L590 229Q594 247 601 274T617 336T636 409T654 482T670 547T681 595T686 618Q686 620 685 620H683Q681 621 678 621T671 622Q660 622 630 624Q616 624 610 624T598 626T589 630T587 640Q587 647 590 659Q594 677 598 681T613 686Q618 686 653 685T740 684Q775 684 801 684T840 685T856 686",119933:"401 686Q415 680 415 668Q415 651 404 629Q398 624 356 624Q318 624 318 623Q318 620 337 508T377 284L397 174L472 285Q548 396 623 507T699 620Q698 621 652 624Q634 624 627 627T619 641Q619 648 622 658Q627 677 631 681T650 686Q654 686 686 685T766 684Q794 684 823 684T858 685Q874 685 878 683T886 671Q886 667 882 651Q877 632 873 628T850 624Q800 624 779 617Q774 617 770 613Q767 610 560 304T350 -5Q346 -9 332 -16H306H291Q270 -16 267 -2Q267 -1 260 37T238 161T210 313L156 624H116H94Q62 624 62 642Q66 678 78 684Q82 686 99 686Q144 684 246 684Q330 684 368 685L401 686",119934:"111 624Q109 624 102 624T91 623Q61 623 61 640Q61 660 70 678Q78 686 98 686Q140 684 239 684Q277 684 309 684T360 685T383 686H385Q407 686 407 668Q404 634 391 626Q387 624 348 624Q307 624 307 622Q307 618 332 409Q359 198 359 195L570 532L564 576L558 622V624H522H504Q472 624 472 641Q475 678 488 684L493 686L529 685Q551 684 645 684Q716 684 753 685T795 686Q818 686 818 669Q815 632 802 626Q798 624 759 624Q718 624 718 622Q718 615 743 410Q770 199 770 196Q770 195 806 253T903 406Q1035 618 1035 619Q1025 624 968 624Q943 624 943 641Q943 648 946 659Q950 675 952 679T963 686L998 685Q1020 684 1093 684Q1113 684 1139 685T1173 686Q1207 686 1207 669Q1207 664 1204 652Q1199 631 1194 628T1164 624Q1113 622 1101 615Q1098 612 905 305Q715 -1 709 -7Q699 -17 673 -17Q645 -17 639 -8L581 441Q581 444 442 221Q331 44 314 18T288 -14Q279 -17 263 -17H254Q229 -17 227 -5Q225 2 186 311L147 620V624H111",119935:"931 686Q953 686 953 670Q953 650 944 632Q936 624 924 624H914Q823 624 803 611Q800 609 696 503T591 396Q591 394 667 229L743 62H787H814Q846 62 846 44Q843 7 829 2Q825 0 817 0Q813 0 775 1T664 2Q590 2 551 1T508 0H507Q484 0 484 18Q484 19 488 37Q492 56 497 58T534 62L566 63Q567 64 520 169T471 274Q469 274 369 172T268 67L315 62Q320 62 328 62L335 61Q347 58 347 44Q344 10 331 2L326 0L287 1Q263 2 177 2Q95 2 78 1L53 0Q38 6 38 17Q38 40 50 57Q56 62 78 62Q169 62 188 75Q194 77 435 324L444 334L439 347Q437 351 373 492L313 624H268H246Q220 624 212 632Q210 636 210 642Q210 655 215 669T227 684Q230 686 247 686Q295 684 398 684Q438 684 472 684T527 685T551 686Q567 686 572 671Q572 667 568 651Q563 631 558 628T523 624T492 623H488L526 540Q563 457 564 457Q564 456 574 466T604 496T645 537L724 619Q716 622 677 624H673Q645 624 645 640Q645 660 654 678Q659 683 666 686L704 685Q728 684 813 684Q847 684 873 684T913 685T931 686",119936:"97 624H73Q40 624 40 640Q40 660 49 678Q57 686 77 686Q122 684 228 684Q269 684 304 684T360 685T385 686Q406 686 406 668Q406 662 403 653Q398 631 393 628T361 624H353Q321 624 321 623T376 491T432 360L448 377Q465 394 493 424T553 490L673 620Q662 624 630 624Q606 624 606 640Q608 678 623 684Q627 686 634 686Q638 686 671 685T755 684Q777 684 805 685T841 686Q861 686 868 683T876 669Q876 664 873 652Q868 631 863 628T829 624Q764 622 747 611Q727 590 590 441L437 275L411 170Q385 65 384 64Q384 62 429 62H453Q473 62 478 60T487 48Q488 44 484 29Q479 6 473 3Q468 0 454 0Q450 0 436 0T386 1T294 2Q220 2 181 1T138 0Q121 0 116 15Q120 54 133 60Q137 62 187 62H236L289 275L142 624H97",119937:"223 430Q192 430 192 448Q192 450 225 561T261 677Q265 683 270 684Q273 686 534 686Q796 686 797 685Q805 682 805 673Q805 668 804 661T800 648T798 641Q796 637 531 352L266 67L329 66H364Q412 66 446 70T523 96T596 157Q617 186 630 220T649 273T663 297Q667 299 684 299H688Q715 299 715 281Q715 278 673 145T628 8Q626 4 617 0H348Q289 0 221 0T139 -1Q112 -1 99 -1T78 1T69 5T68 12Q68 16 71 31T77 49L84 57Q91 65 104 79T133 110T170 151T213 196L610 624H540Q533 624 514 624T488 624T467 623T443 620T422 616T398 609T373 600Q292 560 255 449Q251 436 246 433T223 430",119938:"222 -8Q140 -8 89 34T38 158Q38 191 48 227Q72 329 151 390T327 452Q361 452 385 443T421 425T433 416H434L441 421Q448 426 460 430T486 435Q509 435 523 422T538 386Q538 380 522 315T488 179T467 93Q466 87 466 72Q466 42 483 42Q505 42 521 75Q531 94 541 134Q546 155 550 158T571 162H576H587Q607 162 607 148Q606 142 604 132T590 94T566 47T528 9T474 -8Q396 -8 358 40Q295 -8 222 -8ZM404 351Q383 401 324 401Q300 401 270 385T221 330Q206 296 186 220Q166 136 166 106Q166 72 184 58T228 43Q256 43 284 57T328 84T343 103Q343 106 374 228L404 351",119939:"220 -8Q142 -8 94 35T45 155V167Q45 187 52 218T104 426L153 622H149Q148 622 144 622T134 623T122 624T111 624T101 624T96 625Q84 628 84 642Q84 647 88 661T94 679Q98 684 109 685T185 690Q258 694 272 694Q289 694 293 679Q293 676 263 553L232 429L244 434Q256 440 281 446T331 452Q417 452 465 407T513 285Q513 235 494 184T439 90T346 20T220 -8ZM385 337Q385 400 318 400Q269 400 226 360Q214 349 211 341T191 268Q162 149 162 113Q162 44 226 44Q269 44 299 76T339 135T362 215Q364 222 365 226Q385 303 385 337",119940:"362 325Q362 344 371 361T390 386L399 394Q390 401 355 401Q276 401 231 338Q207 301 189 230T170 122Q170 43 264 43Q392 43 457 105Q472 120 480 117Q486 114 497 102T509 83Q509 79 502 70T477 47T432 21T360 1T259 -8Q194 -8 148 9T80 54T49 109T40 167Q40 280 129 365T352 451Q390 451 396 450Q448 442 473 416T499 358T477 302T421 274H417Q393 274 378 288T362 325",119941:"222 -8Q140 -8 89 34T38 158Q38 220 68 285T151 391Q230 452 329 452Q382 452 416 428L422 424Q423 424 447 523L472 622H468Q467 622 463 622T453 623T441 624T430 624T420 624T415 625Q403 628 403 642Q403 647 407 661T413 679Q417 684 428 685T504 690Q577 694 591 694Q608 694 612 679L467 91Q466 87 466 72Q466 43 483 43Q518 43 541 134Q546 155 550 158T571 162H576H587Q607 162 607 148Q606 142 604 132T590 94T566 47T528 9T474 -8Q396 -8 358 40Q295 -8 222 -8ZM404 351Q383 401 324 401Q300 401 270 385T221 330Q206 296 186 220Q166 136 166 106Q166 72 184 58T228 43Q256 43 284 57T328 84T343 103Q343 106 374 228L404 351",119942:"260 -8Q196 -8 151 9T83 54T52 111T42 169Q42 188 44 210Q50 240 58 266Q127 434 335 451L338 452Q342 452 345 452Q347 452 353 452T363 451Q426 451 464 424T502 352Q502 289 442 250Q381 211 222 211H184Q184 210 181 196T175 162T171 126Q171 43 264 43Q391 43 457 105Q472 120 480 117Q486 114 497 102T509 83Q509 79 502 70T477 47T432 21T360 1T260 -8ZM237 262Q427 266 427 349Q427 368 409 384T354 401Q316 401 287 388T242 354T216 314T202 278L197 263Q197 262 237 262",119943:"584 444Q597 439 597 426Q597 409 586 387Q580 382 505 382H434V380Q432 378 421 314T395 162T368 30Q324 -164 203 -199Q194 -201 175 -201Q123 -201 94 -177T64 -117T88 -58T145 -33Q169 -33 184 -47T200 -84Q200 -122 166 -150L174 -151H185Q202 -148 217 -112Q222 -94 240 9Q246 40 262 132T293 303T307 382H247H210Q190 382 182 385T173 400Q177 436 189 442Q193 444 256 444H318L319 446Q337 565 355 602Q373 640 404 664T458 694T503 701Q569 701 596 676T624 617Q624 581 599 557T544 533Q520 533 504 547T488 585Q488 596 491 606T499 624T508 637T516 646L520 650Q515 650 509 651Q459 651 459 561V554L458 518L452 484Q446 448 445 447V444H584",119944:"227 0Q142 0 93 43T43 166Q43 207 58 252T104 341T188 414T310 451L313 452Q316 452 319 452Q321 452 326 452T335 451Q367 451 390 443T425 425L436 416L443 421Q450 426 462 430T488 435Q511 435 525 422T540 386Q540 378 483 151T424 -82Q401 -139 335 -170T167 -202Q72 -202 36 -183T0 -125Q0 -90 24 -67T81 -43Q103 -43 119 -56T136 -99Q133 -124 114 -149L123 -150H183Q222 -150 254 -127T299 -74Q300 -71 306 -47T318 -1T324 23Q323 23 310 18T274 6T227 0ZM407 353Q406 354 404 358T400 365T395 371T388 379T381 385T371 391T360 396T346 400T329 401Q300 401 277 389T240 355T219 317T205 280Q171 148 171 109Q171 77 190 64T235 51T296 67Q322 82 337 98L345 106L407 353",119945:"477 56Q477 48 479 46T490 43Q522 45 544 75T577 140Q582 156 585 159T605 162H611H622Q642 162 642 148Q642 138 632 114T602 62T550 13T478 -8Q429 -8 394 17T358 83Q358 95 395 199T433 350Q433 400 394 400H388H383Q335 400 291 363Q256 332 236 298Q233 293 202 170T169 40Q160 18 141 5T99 -8Q70 -8 58 9T45 39Q45 51 116 336L188 622H184Q183 622 179 622T169 623T157 624T146 624T136 624T131 625Q119 628 119 642Q119 647 123 661T129 679Q133 684 144 685T220 690Q293 694 307 694Q324 694 328 679Q328 672 294 540Q286 507 278 473T264 420L260 403Q260 400 269 408Q327 451 393 451H401H410Q425 451 439 450T476 442T515 424T544 391T556 337Q556 286 517 179T477 56",119946:"205 615Q205 646 229 670T283 694Q310 694 324 679T339 641Q339 610 315 586T258 562Q235 562 220 577T205 615ZM24 296Q24 305 34 328T63 380T115 430T187 452Q205 452 223 448T262 435T295 406T308 360Q308 345 287 290T240 170T207 87Q202 67 202 57Q202 42 215 42Q235 42 257 64Q288 92 302 140Q307 156 310 159T330 162H336H347Q367 162 367 148Q367 140 357 117T329 65T276 14T201 -8Q158 -8 121 15T83 84Q83 104 133 229T184 358Q189 376 189 388Q189 402 177 402Q156 402 134 380Q103 352 89 304Q84 288 81 285T61 282H55H44Q24 282 24 296",119947:"321 616Q321 648 346 671T400 694Q425 694 440 680T456 640Q456 609 431 586T376 562Q353 562 337 577T321 616ZM297 360T297 373T294 392T288 400T278 401H276Q241 399 210 372T158 303Q151 287 148 285T129 282H123H116Q102 282 97 284T92 298Q96 331 153 391T279 451Q357 451 388 422T420 354V339L371 142Q363 111 353 71T339 13T329 -30T318 -64T308 -88T296 -109T283 -125T264 -142Q190 -202 88 -202Q44 -202 16 -181T-12 -125Q-12 -93 11 -68T68 -43Q92 -43 108 -58T124 -93Q124 -121 106 -144Q101 -150 103 -150Q120 -150 147 -128T191 -64Q194 -57 242 136T294 345Q297 360 297 373",119948:"99 -8Q71 -8 58 9T45 39Q45 51 116 336L188 622H184Q183 622 179 622T169 623T157 624T146 624T136 624T131 625Q119 628 119 642Q119 647 123 661T129 679Q133 684 144 685T220 690Q293 694 307 694Q324 694 328 679Q328 674 280 482Q231 290 231 287Q231 285 234 286Q259 302 294 334T356 390T420 433T493 452Q528 452 546 427T564 364Q564 308 538 282T480 256Q456 256 441 269T425 308Q425 339 444 359T483 384L502 389Q502 395 496 398Q493 400 483 400Q465 400 449 395T409 374T373 347T323 305T268 257Q274 256 282 256Q312 251 329 247T371 232T411 202Q431 181 431 146Q431 132 427 110T422 73Q422 44 440 44H442Q462 44 478 64T502 102T514 141Q518 157 522 159T547 162H558Q578 162 578 148Q578 118 537 56T440 -7H432Q374 -7 337 21T299 94Q299 103 301 116T304 139Q304 164 281 181T235 202L212 206H211Q176 47 160 24Q137 -8 99 -8",119949:"157 -8Q138 -8 118 -4T77 11T41 42T27 91V106L156 622H152Q151 622 147 622T137 623T125 624T114 624T104 624T99 625Q87 628 87 642Q87 647 91 661T97 679Q101 684 112 685T188 690Q261 694 275 694Q292 694 296 679L151 91Q150 85 150 71Q150 42 167 42Q186 42 205 75Q216 96 225 134Q230 155 234 158T255 162H260H271Q291 162 291 148Q290 145 289 140T283 118T271 87T254 54T229 23T197 1T157 -8",119950:"24 296Q25 302 27 312T41 350T65 397T104 435T159 452Q203 452 234 435Q268 419 285 384L295 392Q305 401 317 410T349 429T389 445Q411 451 446 451Q560 451 592 383Q593 380 594 379L595 375L604 384Q675 452 762 452Q893 452 916 367Q918 356 918 334Q918 285 881 183T841 66Q838 43 849 43Q876 43 901 69T940 138Q945 156 949 159T969 162H975H986Q1006 162 1006 148Q1006 138 996 115T966 63T914 13T841 -8Q794 -8 758 16T721 82Q721 96 758 199T796 351Q796 401 753 401Q702 401 662 369T599 298Q597 294 567 172T533 40Q525 22 506 7T462 -8Q435 -8 422 8T409 39Q409 48 425 114T458 248T476 320Q478 330 478 348T474 377T462 393T449 399T433 400H428Q380 400 336 363Q301 332 281 298Q278 293 247 170T214 40Q206 22 187 7T143 -8T104 7T90 39Q90 47 108 124T146 274L164 347Q166 355 166 372Q166 401 149 401Q129 401 115 379T89 306Q84 288 80 285T55 282H44Q24 282 24 296",119951:"24 296Q25 302 27 312T41 350T65 397T104 435T159 452Q203 452 234 435Q268 419 285 384L293 391Q363 452 454 452Q575 446 597 367Q599 356 599 334Q599 285 562 183T522 66Q519 43 530 43Q557 43 582 69T621 138Q626 156 630 159T650 162H656H667Q687 162 687 148Q687 138 677 115T647 63T595 13T522 -8Q475 -8 439 16T402 82Q402 96 439 199T477 351Q477 401 434 401Q421 401 409 398Q341 388 285 305L278 295L247 170Q216 46 214 40Q206 22 187 7T143 -8T104 7T90 39Q90 47 108 124T146 274L164 347Q166 355 166 372Q166 401 149 401Q129 401 115 379T89 306Q84 288 80 285T55 282H44Q24 282 24 296",119952:"254 -8Q191 -8 146 9T80 54T49 111T39 169Q39 206 53 247T96 329T176 402T292 446Q317 451 336 451L344 452Q353 452 359 452Q457 452 516 408T576 279Q576 169 488 81T254 -8ZM349 400Q321 400 287 385T231 338Q206 301 188 228T170 126Q170 99 178 83Q198 44 260 44Q367 44 409 157Q419 185 432 238T445 317Q445 336 443 348Q435 372 416 384T384 398T349 400",119953:"24 296Q25 302 27 312T41 350T65 397T103 435T157 452Q235 452 273 404Q336 452 409 452Q434 452 458 448T507 432T550 402T581 354T593 285Q593 221 564 159T480 53Q401 -8 302 -8Q290 -8 279 -7T259 -3T242 3T228 9T218 14T212 18L209 20Q208 19 190 -55T171 -131T198 -132H213Q240 -132 240 -150Q237 -187 223 -192Q219 -194 212 -194Q208 -194 176 -193T95 -192Q48 -192 24 -193T-3 -194Q-11 -194 -16 -190T-22 -182T-23 -176Q-20 -142 -7 -134Q-3 -132 20 -132H44L164 354Q165 357 165 372Q165 401 148 401Q113 401 90 310Q85 289 82 286T60 282H55H44Q24 282 24 296ZM465 339Q465 373 447 387T403 401Q375 401 347 387T303 360T288 341Q288 338 257 216L227 93Q248 43 306 43Q332 43 361 59T410 115Q425 147 445 224Q465 309 465 339",119954:"38 159Q38 209 58 260T113 355T205 425T327 452Q338 452 348 451T366 449T382 444T394 440T405 434T414 429T422 423T429 418Q440 429 481 440T533 452Q540 452 545 447T550 437Q550 432 481 152Q410 -130 410 -131T437 -132H452Q479 -132 479 -150Q476 -187 462 -192Q458 -194 451 -194Q447 -194 414 -193T330 -192Q277 -192 249 -193T217 -194Q202 -194 197 -179Q197 -175 201 -159Q206 -139 211 -136T243 -132H283L319 15L307 10Q295 4 270 -2T220 -8Q134 -8 86 37T38 159ZM402 353Q402 358 395 368T369 390T324 401Q301 401 282 394T249 369T226 338T208 297T196 258T186 218Q166 141 166 107Q166 44 229 44Q265 44 294 61T337 95Q341 100 371 222T402 353",119955:"24 296Q24 298 28 313T42 352T67 398T104 436T154 452Q198 452 230 437T273 404L282 411Q334 452 393 452Q441 452 470 423T500 350Q500 301 473 279T418 256Q395 256 379 270T363 308Q363 366 424 386Q424 388 420 391T405 398T385 401Q363 401 343 390Q321 380 289 341L252 192Q214 42 212 39Q190 -8 142 -8Q117 -8 103 7T89 39Q89 52 127 202T165 369Q165 402 148 402Q139 402 128 393T110 369Q100 348 90 310Q85 289 82 286T60 282H55H44Q24 282 24 296",119956:"140 290Q140 311 148 336T176 388T235 433T326 451H336Q355 451 373 449T418 439T460 412T476 363Q476 333 456 311T406 289Q384 289 371 302T357 335Q357 351 364 364T379 384L386 391Q386 392 381 394T362 398T330 400Q299 400 278 393T247 373T235 352T232 335Q232 322 242 312Q258 299 315 290T403 260Q457 224 457 167Q457 152 453 134T435 90T397 43T330 7T229 -8Q133 -8 95 22T57 91Q57 127 81 152T139 177Q161 177 177 164T194 121Q189 80 153 56Q179 43 236 43Q275 43 303 52T343 75T361 101T366 124Q366 148 338 161T272 180T232 186Q187 198 164 227T140 290",119957:"82 382H55Q21 382 21 399Q21 422 33 439Q39 444 93 444H144L162 517Q163 522 167 541T174 567T181 589T192 611T206 627T226 639T253 643Q276 643 291 630T306 594Q306 586 288 514Q284 499 280 481T273 454L271 445Q271 444 317 444Q322 444 331 444T345 445Q377 445 377 428Q377 408 368 390Q360 382 341 382H306H255Q182 86 182 75Q182 43 201 43H204Q242 46 279 81Q298 101 309 119T323 145T330 157T350 162H356H363Q377 162 382 160T387 146Q385 136 372 114T337 64T275 14T192 -7Q131 -7 95 19T59 90V105L128 381Q128 382 82 382",119958:"189 389Q189 397 187 399T176 401Q150 399 126 372T89 304Q84 288 81 285T61 282H55H44Q24 282 24 296Q24 307 35 331T65 383T117 431T187 452Q237 452 272 427T308 362Q308 347 273 254T238 111Q238 43 291 43Q319 43 344 58T380 86T391 103T426 247T464 396Q472 414 491 429T535 444T574 429T588 397Q588 390 570 315T534 168L516 97Q514 89 514 72Q514 42 531 42Q544 42 556 56Q574 76 589 134Q594 155 598 158T619 162H624H635Q655 162 655 148Q654 142 652 132T638 94T614 47T575 9T520 -8Q509 -8 498 -7T478 -3T461 2T446 8T434 16T424 23T416 29T410 35T406 39L405 41L397 34Q347 -7 288 -7H281Q148 -7 122 78Q116 95 116 125V136Q116 174 152 273T189 389",119959:"380 367Q380 397 406 425T465 453Q493 453 516 430T540 357Q540 314 524 250T467 115T373 13Q338 -8 292 -8Q218 -8 167 23T116 129Q116 178 152 275T189 388Q189 396 187 398T176 401Q148 398 125 372T89 304Q84 288 81 285T61 282H55H44Q24 282 24 296Q24 306 34 330T64 382T116 431T189 452Q231 452 269 429T308 362Q308 346 273 255T238 114Q238 43 306 43Q336 43 363 65T407 118T437 182T456 239T462 268Q462 290 417 315Q380 335 380 367",119960:"636 367Q636 400 664 426T719 453Q748 453 772 431T796 357Q796 321 782 256T727 112T633 6Q604 -8 567 -8Q466 -8 415 43Q414 42 410 38T403 31T396 25T388 18T378 11T367 5T355 0T340 -4T324 -7T306 -8Q249 -8 209 5T151 40T125 84T117 129Q117 176 153 274T190 388Q190 408 158 396Q112 376 90 306Q85 288 81 285T61 282H55H44Q24 282 24 296Q24 305 34 328T63 380T114 430T187 452Q240 452 274 427T309 362Q309 346 275 255T240 117Q240 43 317 43Q325 43 333 45T347 50T359 57T369 66T377 75T383 83T388 90L390 95Q390 99 389 110T387 129Q387 139 391 167Q393 177 419 282T448 396Q456 414 475 429T519 444Q546 444 559 428T572 397Q572 384 542 265T511 114Q511 43 579 43Q608 43 633 66T673 122T699 188T714 244L718 267Q718 291 673 315Q636 335 636 367",119961:"74 282H63Q43 282 43 296Q43 298 45 307T56 332T76 365T110 401T159 433Q200 451 233 451H236Q273 451 282 450Q358 437 382 400L392 410Q434 452 483 452Q538 452 568 421T599 346Q599 303 573 280T517 256Q494 256 478 270T462 308Q462 343 488 367Q501 377 520 385Q520 386 516 389T502 396T480 400T462 398Q429 383 415 341Q354 116 354 80T405 44Q449 44 485 74T535 142Q539 156 542 159T562 162H568H579Q599 162 599 148Q599 135 586 111T550 60T485 12T397 -8Q313 -8 266 35L258 44Q215 -7 161 -7H156Q99 -7 71 25T43 95Q43 143 70 165T125 188Q148 188 164 174T180 136Q180 101 154 77Q141 67 122 59Q124 54 136 49T161 43Q183 43 200 61T226 103Q287 328 287 364T236 400Q200 400 164 377T107 302Q103 288 100 285T80 282H74",119962:"206 -150Q240 -150 268 -134T314 -95T344 -48T362 -7T367 14Q339 -7 280 -7Q230 -7 195 5T144 39T122 79T115 122Q115 175 152 274T189 388Q189 396 187 398T176 401Q148 398 125 372T89 304Q84 288 81 285T61 282H55H44Q24 282 24 296Q24 306 34 329T64 381T116 431T188 452Q239 452 273 427T308 361Q308 347 273 253T237 109Q237 43 291 43T388 98Q388 99 425 246T463 396Q471 414 490 429T534 444T573 430T587 399Q587 386 537 186T483 -25Q461 -84 410 -126T296 -188Q248 -202 204 -202Q127 -202 96 -175T64 -114Q64 -82 86 -57T144 -31Q169 -31 184 -45T199 -83Q199 -89 198 -94T196 -104T193 -113T189 -120T184 -128T179 -134T173 -141T168 -147Q189 -150 206 -150",119963:"66 -8H60Q34 -8 34 5Q34 9 42 22T70 59T115 110Q162 156 255 229T381 332L389 339H381Q348 332 298 329T212 325T172 321Q168 318 151 318H146Q116 318 116 332Q116 334 118 342Q128 374 154 402Q205 452 265 452Q304 452 352 422T426 392Q441 392 462 421T485 451T508 452H518Q539 452 539 438Q539 431 516 401T458 334Q412 289 312 210Q229 146 191 111L183 103H195Q203 103 213 104T240 107T268 110Q301 114 337 116T391 119T428 123T455 134T469 157Q473 166 495 166Q521 166 525 161Q532 156 528 141Q510 81 456 37T337 -7Q297 -7 251 22T177 52Q154 52 134 38T100 8L88 -7Q86 -8 66 -8",119964:"76 60Q83 29 135 29Q190 29 264 81Q280 93 280 95T277 99T265 106T248 118Q189 166 189 237Q189 307 245 388Q267 421 299 436Q336 455 386 455Q488 455 550 403L559 395L571 405Q727 544 944 679L957 687L966 701Q968 704 970 707T973 712T975 714T978 716T982 717T989 717H995Q1004 717 1007 717T1013 714T1016 708Q1016 705 829 403L636 92L630 83Q659 93 685 110T728 143L745 158Q758 158 752 138L748 127L740 119Q676 58 605 42L593 22Q590 17 587 12T583 6T579 2T573 0T564 0H530H484Q480 3 480 8Q480 15 489 26T498 39T497 40Q477 40 423 49T327 74L316 78L302 68Q200 -8 121 -8Q85 -8 60 7T35 53T60 113T123 144Q144 144 153 132T162 106Q162 89 143 75T99 61Q90 61 76 65V60ZM904 614L905 615Q901 615 840 573T700 469T581 369L587 359Q600 340 608 315T618 273T622 238T624 216L764 414Q904 612 904 614ZM525 363Q493 405 379 418H375Q342 418 309 378Q251 300 251 234Q251 174 306 137Q318 128 322 131Q323 132 329 139Q351 161 362 180Q430 273 509 348L525 363ZM579 205Q579 245 571 278T556 323T546 337L521 311Q461 248 422 196T362 121L353 111Q427 85 499 79Q517 77 520 77L525 76L549 111Q551 114 556 121T563 131T568 138T573 147T575 157T577 169T578 185T579 205",119966:"367 89Q367 84 353 77T334 70Q325 70 312 83T298 120Q298 169 364 233T496 298Q538 298 563 275T588 220V213Q588 132 501 53T306 -26Q251 -26 211 6T170 114Q171 148 181 184T205 248T232 298T255 334T265 349T246 350Q127 350 77 390T26 480Q26 533 71 581T178 656T295 683Q312 683 312 676Q312 674 311 672L302 660Q294 648 292 647L286 646Q280 646 276 646Q197 641 145 583T93 476Q93 387 265 387Q271 387 277 387T287 388T292 388T313 414T373 483T451 562Q618 712 732 727Q733 727 740 727T753 728Q790 727 804 708T819 665Q819 643 810 617T773 553T699 481T572 414T385 361Q381 361 367 341Q247 172 247 86Q247 11 325 11Q404 11 465 95Q518 165 528 208Q529 212 529 220Q529 237 518 249T480 261Q431 261 387 209T343 126Q343 111 355 101T367 89ZM777 658Q777 691 738 691Q704 691 658 662T570 590T491 504T432 432T410 400H411Q416 400 440 405T505 423T589 455T675 506T743 576Q777 627 777 658",119967:"251 272Q199 272 168 298T136 374Q136 432 175 496T267 603Q321 645 395 676T552 708Q610 708 655 694T724 659T763 618T784 584L790 569Q792 569 800 572T819 576T840 578Q855 578 855 571Q855 566 846 554T829 541Q824 541 817 539T804 533T799 529Q802 517 802 483Q802 376 742 256T585 53T392 -31Q353 -31 300 -7L289 -2L277 -6Q242 -17 192 -17Q141 -17 113 -13T77 -3T68 14Q68 20 73 28T93 45T131 58Q152 62 197 62Q241 62 272 48L282 44Q308 65 334 93Q380 145 467 266T622 454Q644 476 664 493T694 517T720 534T740 547Q699 671 540 671Q461 671 385 625T276 534Q265 520 251 499T219 438T202 368Q202 309 267 309Q325 309 396 383T491 545Q492 548 493 552Q494 558 496 559T511 564Q513 565 514 565Q523 568 527 568Q534 568 534 560Q534 554 529 537Q507 442 420 357T251 272ZM332 20Q332 19 341 15T368 6T400 2Q425 2 457 13T531 49T614 125T690 248Q750 376 750 476V490L738 479Q698 436 646 366T554 239T455 121T332 20ZM226 20Q226 25 186 25Q181 25 174 24H166Q161 24 158 23H152Q170 21 197 21Q205 21 213 21T223 20H226",119970:"206 318L249 320Q249 327 259 352T282 399Q312 447 366 510T465 610Q588 717 661 717Q695 717 716 701T738 653T704 577Q663 522 610 474T512 397T424 346T359 315T333 306Q331 304 327 290T323 267Q323 229 368 229Q402 229 439 254T505 312T571 382T638 435Q642 437 644 437Q658 437 658 409Q655 403 647 399T624 379T595 326Q583 296 564 267T523 179Q504 126 483 91T423 27Q335 -37 231 -37Q191 -37 157 -30T95 -2T67 53Q67 89 94 123T159 158Q180 158 190 146T200 119Q200 102 178 89T136 75Q128 75 120 78T110 81Q105 81 105 62Q105 38 129 24T180 5T238 1H244Q282 1 319 32Q349 55 371 85T436 190L465 239Q413 192 354 192Q300 192 274 217T245 276Q245 284 242 284Q220 280 187 280Q106 280 59 315T12 409Q12 457 43 508T118 597T210 659T295 683Q308 683 308 675Q308 670 299 658T282 646Q266 646 240 633Q182 606 118 511Q76 448 76 400Q76 368 105 343T206 318ZM677 660Q677 680 646 680Q616 680 565 629Q537 601 514 571Q493 544 455 492T389 398T360 355Q366 357 386 367Q463 406 534 473T641 591T677 660",119973:"829 148Q845 148 845 143T841 130T823 109T788 83T730 54T644 22Q637 20 634 19T627 16T622 13T618 10T612 3T604 -6Q510 -112 396 -203T201 -312Q190 -314 171 -314H166Q156 -314 147 -312T123 -304T101 -283T92 -245Q92 -203 117 -160T175 -93Q214 -65 280 -41T390 -6T509 22L532 27L547 47Q673 219 673 225L665 228Q657 231 648 235T627 249T606 270T591 300T584 341Q584 389 614 447T686 544Q735 588 799 615T959 667T1108 713Q1118 717 1119 717Q1125 717 1129 705T1133 689Q1133 686 1115 673Q1051 627 1001 579T918 481T867 403T828 328T805 277Q802 271 801 267T798 261T798 259Q849 270 900 317Q956 371 956 421Q956 438 953 457T950 480Q950 481 950 482L951 484Q953 487 966 492T985 498Q989 498 994 473Q1000 441 1000 423Q1000 362 934 302T790 223L775 220L767 207Q757 191 731 158T685 98T662 63Q662 61 690 70T755 99T811 142L816 148H829ZM646 332Q646 308 659 291T685 268L698 263L735 320Q828 465 865 511Q923 582 1003 643L1005 645Q1004 645 924 620Q775 572 716 492Q646 401 646 332ZM184 -278Q233 -278 311 -212T444 -80L498 -15H496Q468 -20 424 -30T293 -70T174 -133Q167 -140 158 -153T138 -190T127 -232Q127 -278 184 -278",119974:"521 506Q521 493 549 493Q608 493 660 527Q667 531 690 555L736 604Q750 619 777 646T825 694T848 716T852 717Q857 717 860 711T865 697L866 690Q866 687 812 615Q654 404 654 401Q655 401 656 401T659 402T665 403T680 404Q718 404 734 374Q735 370 743 376Q745 377 752 382Q806 416 852 466T933 563T982 623Q1028 666 1075 686T1155 706Q1165 706 1173 705T1186 703T1194 699T1199 695T1201 692T1202 688V687L1204 677Q1204 667 1191 670Q1189 670 1183 670T1174 671Q1137 671 1086 643T1001 564Q970 517 899 449T749 339L739 333L736 322Q730 295 703 253T652 165T628 77Q628 21 681 21Q692 21 698 23Q751 46 817 134L827 148H844Q861 148 864 146Q869 140 859 127Q818 75 761 29T665 -17Q649 -17 633 -12T598 4T569 40T558 100Q558 128 563 152T585 205T609 245T643 294Q647 300 645 300Q633 297 615 297Q607 297 600 298T589 300T584 301Q581 301 569 284T536 236T488 171T418 97T331 28Q233 -37 155 -37Q104 -37 68 -17T29 44Q29 82 55 120T123 158Q144 158 154 146T164 119Q164 102 143 89T100 75Q92 75 86 76T77 80T72 82Q68 82 68 59Q68 37 85 23T123 5T167 0Q203 0 238 21T311 85T382 174T468 288T563 410Q576 426 588 440T607 462T615 472L605 468Q568 456 533 456H527Q490 456 463 483Q451 496 451 508T468 545T486 581Q486 593 465 593Q448 593 425 568T384 518T364 493Q364 492 347 492Q326 492 326 499T351 537T414 599T477 630Q509 630 528 615T547 576Q547 556 534 533T521 506ZM675 357Q675 368 665 368Q656 368 644 363Q631 355 616 333H628Q640 334 672 341Q675 354 675 357",119977:"764 513Q764 482 772 423T780 330Q780 304 778 285T775 256T773 245Q778 252 826 328T932 484T1042 617Q1077 652 1114 678T1173 715T1200 726Q1208 726 1208 717Q1208 711 1206 695L1203 679L1199 675Q1197 675 1187 670T1161 657T1133 639Q1050 583 959 456Q906 381 858 307T779 179T725 83T691 18T679 -6Q677 -8 660 -8H656Q639 -8 639 -1Q639 4 646 17Q685 93 685 173V196Q685 233 681 288T676 380Q676 438 687 487L664 454Q505 230 454 170Q366 64 290 14T163 -36H152Q87 -36 58 -11T29 46Q29 82 55 120T123 158Q144 158 154 146T164 119Q164 102 143 89T100 75Q92 75 86 76T77 80T72 82Q67 82 67 59Q67 37 89 19T167 1Q187 1 197 3Q221 9 246 22T292 52T336 91T375 132T411 174T440 212T463 245T478 266Q779 695 784 698Q786 700 802 700H818Q824 694 824 692T809 668T779 604T764 513",119978:"259 -8Q230 -7 205 0T153 24T112 74T96 153Q96 254 174 379T374 599T607 707H621Q732 707 778 661Q805 634 805 598Q805 558 775 517T696 452L684 447V441Q684 378 626 273T484 97Q379 7 288 -7Q279 -8 259 -8ZM760 594Q760 670 608 670Q562 670 493 622T347 472Q174 240 174 131Q174 76 205 53T279 29Q294 29 306 32Q405 60 507 205Q592 325 616 401Q625 426 625 435Q625 436 621 436T603 440T569 449Q524 466 515 475Q513 477 513 481T525 496T541 508L548 504Q555 501 565 497T587 488T609 480T625 476Q627 476 626 481Q626 486 623 494T613 513T589 533T548 541Q495 541 413 454T286 281Q265 241 254 201T240 141T235 120Q234 118 217 111T197 104Q195 104 192 107T189 112Q190 125 193 147T220 231T280 348Q335 428 407 493T539 576Q548 578 563 578Q594 578 617 568T653 546T672 518T681 494T683 482Q683 481 684 481Q690 481 707 495T742 538T760 594",119979:"571 345Q571 384 612 418T687 452Q698 452 698 445Q698 436 679 417Q677 415 670 415Q650 412 633 389T615 350Q615 340 621 331T634 319T643 315L663 342Q751 462 817 536Q873 595 896 614L907 625Q843 680 701 680Q594 680 499 632T344 516Q317 486 296 449T267 384Q262 366 262 354Q262 332 276 316T326 299H327Q374 299 426 338Q481 376 537 456T597 598Q597 616 599 617Q601 619 614 624T630 630Q639 630 639 604V587V581Q639 519 597 456Q544 377 462 320T318 262Q278 262 250 282T222 350Q222 418 285 504Q360 597 480 656T702 716Q773 716 825 707T898 688T951 660Q962 670 985 685T1012 700Q1018 700 1022 690T1026 673Q1026 670 1019 664Q988 633 988 631Q988 630 999 618T1020 580T1031 522Q1031 471 1003 419T928 330Q854 275 765 264Q757 262 733 262H714L701 245Q615 121 473 42T218 -37Q159 -37 125 -15T90 46Q90 82 116 120T185 158Q203 158 213 147T224 121Q224 110 219 102Q198 75 159 75Q154 75 149 76T143 77T140 77Q137 72 137 53Q138 37 149 26T177 9T205 2T228 0Q313 0 419 74T602 257L620 281L614 285Q607 289 601 294T587 306T576 323T571 345ZM950 529Q950 576 943 576Q940 576 840 439T741 299H751Q804 300 845 334T924 438Q949 490 950 529",119980:"330 387Q330 331 402 331Q463 331 514 371T589 459T613 542Q613 559 608 570T598 588T593 596Q593 601 617 610Q632 617 636 616Q675 585 675 527Q675 464 629 409T516 324T387 294Q271 294 271 394V402Q271 438 292 478Q344 582 457 649T672 717Q765 717 825 675T885 548Q885 433 771 298T498 76Q493 73 491 72T486 69T484 67T485 66Q539 41 607 41Q655 41 703 71T780 139L787 148H804Q806 148 809 148Q826 149 826 140Q826 128 786 91T687 19T589 -16H576Q503 -16 414 20L396 27Q279 -17 192 -17Q130 -17 92 2T54 53Q54 92 107 123T222 155Q303 155 401 106L431 91L441 97Q476 118 527 157Q622 236 711 361T801 573Q801 591 795 607T775 641T732 668T660 679Q592 679 528 644T422 560T355 464T330 387ZM201 20Q232 20 267 27T322 40T342 49Q342 52 315 60T243 77T160 86Q150 88 144 88Q130 88 122 79T112 62L111 53Q111 20 201 20",119982:"346 463Q346 419 406 386T576 352H588L613 384L681 476Q767 594 842 651T973 708Q1016 708 1016 661Q1016 621 987 562T894 449Q802 375 696 338L682 334L665 312Q638 279 605 233T547 158T482 97Q418 46 332 5T158 -36Q87 -36 58 -11T29 48Q29 82 55 120T123 158Q144 158 154 146T164 119Q164 102 143 89T100 75Q92 75 86 76T77 80T72 82Q67 82 67 59Q67 28 98 14T166 0Q232 0 320 55T491 226Q530 279 551 305L558 314Q558 315 543 315Q417 321 353 365T289 460Q289 566 488 632Q578 662 660 665H679Q685 660 685 657T676 642Q670 633 666 629L664 628Q663 628 661 628T655 628Q606 628 546 615T426 568T350 486Q346 475 346 463ZM976 653Q976 671 959 671Q938 671 919 661T883 629T858 593T835 554Q832 548 830 545Q802 495 775 455T734 400T721 382L736 388Q876 449 946 568Q948 572 949 573Q976 622 976 653",119983:"354 350Q264 350 264 426Q264 442 265 448Q279 514 347 582T503 692T662 735Q719 735 774 714T882 672T983 651Q996 651 996 644Q996 639 977 612T954 581Q953 580 938 580Q909 582 884 587L869 591L870 587Q870 583 849 557T796 491T748 422Q729 391 692 313T620 188Q555 105 454 34T253 -37Q214 -37 181 -30T120 -2T92 53Q92 89 119 123T184 158Q205 158 215 146T225 119Q225 102 203 89T161 75Q153 75 145 78T135 81Q130 81 130 62Q130 39 153 24T204 5T267 0Q311 0 358 29T454 117T539 226T629 358T710 476Q726 496 744 516T778 551T807 577T828 595L836 601L785 623Q743 642 713 651T668 661T626 663Q564 663 509 644T418 596T356 535T317 475T305 431Q305 416 312 408Q323 388 369 388Q429 388 465 411T530 480Q557 526 557 565Q557 573 556 579T555 587T555 590Q555 591 568 600T584 611Q588 612 600 603Q622 581 622 549Q622 516 600 475T536 405Q454 350 354 350",119984:"55 377Q55 443 122 523T290 660T478 717Q533 717 575 689T618 594Q618 565 611 538T585 477T552 422T506 355T458 288L357 146Q307 68 307 31Q307 20 318 20Q326 20 331 21Q367 27 411 57T490 128L767 500L861 617H908H939Q953 617 956 616T960 609Q960 605 928 566T816 423T648 198Q587 113 571 86Q540 34 540 21Q540 20 545 20Q580 25 623 55T696 124Q702 132 704 133T722 134H739Q744 130 744 127T735 113Q713 80 655 38T548 -14Q527 -17 524 -17Q475 -17 473 47V63L462 55Q364 -17 302 -17Q235 -17 235 69Q235 88 239 105T248 135T268 171T292 205T328 251T369 304Q376 313 395 338T423 374T450 408T476 445T499 479T519 514T534 546T545 579T548 608Q548 647 522 663T460 680Q355 680 243 591T99 406Q97 399 97 383V377Q97 339 153 339Q169 339 175 340Q215 350 241 373T298 444Q333 496 349 535T367 588T374 603Q402 616 408 616Q416 616 416 608Q416 563 393 492T320 378Q233 302 140 302H132Q75 302 57 353Q55 361 55 377",119985:"540 717Q542 717 545 717Q562 717 562 710Q562 708 557 702T541 678T517 632T485 544T448 407Q447 405 443 388T438 366T433 345T427 321T420 299T411 274T400 250T387 223T372 197Q363 181 364 181L388 203Q476 284 527 354T620 490T718 612Q754 647 790 673T835 700Q839 700 842 691T848 672L850 662Q850 657 842 653Q803 630 768 600T699 527T653 467T610 405Q554 322 518 282T368 138Q307 84 273 51T231 9T218 -5L207 -17H175Q169 -11 169 -9Q169 -4 183 10Q227 56 258 120T302 234T330 350T356 445Q357 450 360 458L362 464Q317 434 276 434Q221 437 221 479Q221 498 240 521T259 552Q259 565 235 565Q209 565 174 546T105 482Q103 480 102 478T99 474T97 472T95 470T93 468T90 467T86 467T81 467H75Q56 467 56 475Q56 482 82 511T156 570T253 601Q289 601 311 590T334 557Q334 543 312 517T289 478Q289 471 297 471Q327 471 378 514Q384 519 390 531T412 571T451 632Q482 675 524 717H540",119986:"232 504Q232 492 263 492Q304 492 356 515L367 520L379 537Q443 632 515 705L527 717H543H552Q564 717 564 709Q564 705 562 703T554 694T540 677T518 643T488 589T448 504T398 385Q368 309 353 281L349 270L523 472L669 634Q726 695 737 706T757 717H765Q786 717 786 710Q786 704 776 691T738 627T675 497Q630 394 609 354T541 244Q456 120 449 111L447 107L448 108Q630 240 700 327Q734 368 788 463Q821 520 841 550T898 619T980 683Q1010 700 1018 700Q1020 700 1023 697T1026 692Q1026 688 1024 671T1020 652Q1018 650 1007 645T988 635Q940 609 902 565T842 477T781 374T699 272Q653 226 535 133Q423 47 373 -2L358 -17H342Q320 -17 320 -11Q320 -7 328 5T354 46T390 112Q416 161 439 217T488 326T564 453L589 490Q587 490 523 414T352 217T166 14Q138 -16 137 -16Q136 -17 120 -17Q106 -17 103 -16T99 -9Q99 -5 100 -3T106 3T116 14T132 35T154 72T184 129T222 212T270 327Q310 426 337 471L326 467Q278 455 243 455Q209 455 188 462T161 478T155 496Q155 508 176 533T198 576Q198 579 198 581T192 588T178 593Q151 593 100 519Q89 504 86 502T75 499H68Q46 499 46 506Q46 510 63 534T112 587T170 627Q178 629 195 629Q235 629 252 613T270 577Q270 556 251 532T232 504",119987:"351 351Q308 351 290 373T272 426Q272 487 329 566T478 688Q538 717 584 717Q635 717 681 696T745 620Q752 598 752 564T745 498L741 485Q742 486 769 516T825 573T889 634T962 689T1027 716Q1035 717 1060 717Q1083 716 1096 714T1120 705T1131 686Q1131 668 1109 647T1055 626Q1035 626 1026 638T1016 663Q1016 667 1020 679H1015Q971 671 886 589T728 413L688 360Q688 359 725 359H750Q762 359 766 357T770 348Q769 345 761 335T750 322Q748 321 704 321H660Q651 311 632 282T589 199T565 107Q565 25 653 20Q684 20 720 44T779 95T826 152T850 183L856 184Q861 184 865 184Q888 184 888 173Q883 163 845 117Q770 37 723 10T638 -17Q584 -14 554 17T523 101Q523 147 534 167L532 166Q530 164 526 160T518 153Q378 15 256 -15Q250 -16 226 -16Q161 -16 132 7T103 59Q103 93 129 125T194 158Q232 158 232 121Q233 118 233 113T221 96T188 77Q182 75 168 75T150 78V70Q150 43 178 32T241 20Q340 20 527 286L552 321H524Q489 321 489 330Q489 333 497 344T509 358Q511 359 545 359H579Q580 362 597 389T631 445T661 514T675 586Q675 637 645 658T572 680Q506 680 444 632T348 527T314 434Q314 388 361 388H364H366Q380 388 389 390T416 408T457 454Q487 497 505 536T526 594L529 613Q531 615 545 622T560 630Q568 630 573 613T578 577Q578 518 532 455Q504 413 453 382T351 351",119988:"155 280Q116 280 87 300T57 368Q57 409 87 466T192 589Q269 653 345 684T472 716Q572 716 613 675Q644 644 644 599Q644 585 643 574T637 550T629 529T616 505T600 481T578 450T554 416Q494 330 493 328L480 306Q466 278 466 256Q466 227 492 227H496Q514 227 534 234Q541 237 544 241T571 279L762 559Q777 579 792 595Q818 620 856 646T919 686T946 700Q951 700 955 692T959 677Q959 673 947 665T911 639T866 595Q816 538 749 408T640 225Q574 138 464 61T248 -17Q190 -17 144 1T98 62Q98 81 109 102T131 135Q156 156 183 158Q226 158 226 121Q226 111 224 107Q215 93 196 84T162 74Q154 74 147 77H144V70Q146 41 185 31T263 20Q363 20 493 175L507 192H504Q500 191 498 191Q484 189 476 189Q430 189 405 219T379 287Q379 294 379 299T382 311T385 322T391 335T398 347T408 363T420 379T434 399T450 422Q455 429 469 449T488 475T504 499T520 523T533 543T544 565T552 583T557 603T559 620Q559 680 467 680Q402 680 333 646T213 563T131 462T98 373Q98 343 119 330T169 317Q187 317 212 333Q242 354 291 423T352 555Q354 562 355 588Q355 612 356 612Q357 614 371 622T387 630Q391 630 397 623T409 597T415 556Q415 507 380 448T294 344Q216 280 155 280",119989:"221 428Q221 487 280 555T425 670T583 717H587Q641 717 665 695T689 646Q689 625 674 600T658 564Q658 550 671 541T695 530T710 528L718 539Q779 613 821 646Q894 707 964 707H970Q1010 707 1025 675Q1032 661 1032 645Q1032 626 1022 607Q1008 579 980 560T897 522Q867 512 836 505T788 496L771 493Q768 493 760 477T736 429T702 370Q700 367 698 363Q696 360 696 359H805Q809 355 809 350Q809 340 791 322Q789 321 728 321H668Q562 179 433 88L419 78L434 73Q505 54 554 54Q609 54 654 82T720 140H752Q758 134 758 132Q758 128 747 113Q711 67 657 32T552 -14Q540 -16 517 -16T480 -15T439 -3T375 27L354 38L338 30Q257 -8 191 -8H184Q154 -8 133 -5T103 1T88 10T83 19T83 29Q83 35 86 44T100 65T127 88T173 105T241 112Q286 112 342 99L360 95L372 105Q434 157 523 270L560 320Q560 321 533 321L507 322Q502 325 502 330Q502 339 521 358Q523 359 556 359H588L669 474L682 491Q676 492 665 494T647 498T632 503T614 510T596 521Q556 547 556 570Q556 585 579 618T603 663Q603 679 568 679Q510 679 452 650T354 581T288 500T262 431Q262 407 280 397T321 387Q331 387 341 390T360 398T376 409T390 423T400 435T409 447L414 454Q457 514 460 562Q460 575 461 576Q461 577 475 586T492 595Q496 595 503 588T514 572Q520 559 520 539Q520 473 452 412T308 351Q269 351 245 370T221 428ZM989 642Q989 667 953 671Q905 671 871 644Q853 632 832 604T799 554T787 531H788Q801 531 842 539T916 561Q989 592 989 642ZM198 29Q230 29 257 36T295 52L306 59Q306 63 259 73Q251 74 209 74Q177 74 158 66T134 48L130 40Q130 29 198 29",120068:"22 505Q22 563 94 624T271 685H280Q416 685 443 560Q447 535 447 504Q444 414 405 330L399 319L229 155Q233 154 241 153T253 150T265 145T281 135T301 119T328 93L357 64L402 92Q438 116 473 137L500 154V339Q500 528 495 593V601L559 649Q621 696 624 696L638 686L629 677Q599 650 593 638Q582 614 581 504Q580 490 580 443Q580 314 584 238Q584 235 584 224T584 210T585 199T586 187T588 176T591 164T595 152T601 137T609 121Q630 77 640 77Q661 77 703 101Q704 95 706 90L707 86V84L636 29Q618 15 601 2T574 -19T564 -25L500 121Q499 121 399 48L299 -26Q298 -26 291 -15T272 11T245 42T209 69T165 80Q120 80 58 43L48 37L40 42L32 48L122 117Q196 173 241 211Q319 280 343 327T368 447Q368 535 317 582Q264 633 199 633Q155 633 122 605T86 542Q86 518 133 467T181 387Q181 348 140 309Q113 281 73 260L64 255L50 265L59 273Q112 307 112 345Q112 363 90 387T45 441T22 505",120069:"48 506Q48 568 120 629T268 691Q362 691 425 594L431 585L441 594Q478 628 528 657T629 686Q665 686 687 670Q703 658 718 584T753 506Q756 505 763 505Q778 505 804 512L815 516L820 496Q820 494 808 490T774 476T732 454Q720 445 708 437L675 415L640 394L625 383Q626 382 635 382Q652 382 670 379T712 364T754 336T784 289T797 220Q797 172 776 122Q769 106 766 102T745 84Q654 11 619 -8T538 -27Q483 -27 387 10T249 47Q218 47 186 34T133 8T112 -5T104 7T97 21L196 82Q259 120 284 140Q333 181 351 214Q368 251 368 353Q368 588 228 620Q222 621 205 621Q160 621 139 596Q117 569 117 548Q117 526 162 470T208 387Q208 352 179 320T104 264Q88 256 86 256Q83 256 70 266L82 274Q134 309 134 343Q134 352 130 359Q118 377 100 401T72 439T56 470T48 506ZM453 528Q457 496 457 419L458 357L488 367Q554 390 622 425Q673 449 673 453L671 454Q669 456 665 460T657 473T648 498T639 541Q629 597 616 613Q599 633 567 633Q534 633 493 599Q471 577 457 540L453 528ZM713 176Q713 252 661 295T528 339Q512 339 494 336T466 330T455 325Q454 325 452 311T444 270T425 217L420 207L304 118L319 116Q381 111 475 74T602 37Q655 37 684 79T713 176",120071:"346 611Q300 611 261 604T194 584T144 555T107 519T82 481T65 443T55 410T50 383T48 367L37 372L27 378V393Q33 524 115 603Q160 648 230 666T365 685Q423 685 434 684Q745 653 745 405Q745 281 694 151L687 133L657 103Q524 -27 470 -27Q456 -27 331 18T157 64Q122 64 84 28Q67 9 57 -6L50 -16L43 -8L35 0Q35 3 46 22T83 74T141 133H154Q208 136 253 161T299 230Q299 259 277 290T232 348T209 392Q209 434 254 479T358 556L368 561L382 550Q382 549 381 548T377 545T371 541Q353 527 326 496T298 444Q298 430 343 365T389 277Q389 240 353 202T267 136L252 127Q304 118 400 83T513 47Q548 47 582 79T635 145Q671 208 671 323Q671 390 651 441T599 524T523 576T436 603T346 611",120072:"301 564Q240 564 203 507T165 361Q165 280 190 218T260 119T358 64T474 46Q491 46 499 47L511 48L628 106V80L499 -5Q498 -6 497 -7T494 -10T490 -12T485 -15T478 -17T468 -19T456 -21T439 -22T418 -23T392 -24Q252 -20 169 67T86 315Q86 409 124 491Q128 500 139 508Q211 560 272 591L293 601L325 585L338 594Q374 617 422 639T502 674L532 685Q533 685 540 663T557 614T574 581Q580 575 591 575Q600 575 616 580T634 585V564L623 559Q572 535 532 529L522 527Q491 547 442 627Q442 628 440 627T435 624T428 620Q410 610 405 597T399 559V553Q399 534 409 487Q419 431 427 369L476 400Q526 431 526 432Q531 426 537 420Q565 382 602 359Q611 353 610 352Q609 351 575 332T537 312Q536 312 505 335T463 358Q451 358 439 352T425 337Q394 243 263 223L251 221L243 229L235 236L245 239Q274 247 303 266Q320 277 325 290T330 336Q330 394 315 451T300 531Q300 549 303 561Q303 564 301 564",120073:"198 617Q177 617 159 609T128 587T106 557T91 524T82 494T76 472L75 463Q74 463 67 468T59 474Q59 488 63 510T80 564T114 622T170 667T253 686Q272 686 295 680Q330 672 384 645T468 598Q498 580 524 580Q549 580 595 626L612 643V616L599 599Q522 500 482 500Q466 500 435 514L420 521Q388 516 349 486T309 415Q309 396 323 366T352 315T367 294Q367 293 375 301T398 322T429 352L490 410Q537 355 542 332Q542 330 531 315T510 286L499 273Q479 313 449 313Q437 313 419 303T390 282L378 271L394 250Q444 183 470 129Q484 96 484 71Q484 -19 402 -86T223 -153H220Q175 -153 137 -120Q103 -89 103 -8Q103 12 106 40T109 96Q109 132 103 146T72 161Q46 161 16 143L14 154L11 165Q88 219 143 219Q163 219 177 197T192 127Q192 102 186 65T179 4Q179 -60 210 -88T272 -117Q319 -117 362 -75T405 33Q405 72 363 139T278 271T235 368Q235 385 243 404T264 439T292 472T324 500T353 522T374 538L382 543Q382 544 351 562T274 598T198 617",120074:"373 560Q373 543 378 509T388 448T394 421Q396 421 416 433T474 474T548 537L538 543Q481 570 452 628L487 659Q521 690 522 690L526 684Q529 677 535 667T551 646T575 625T607 608Q617 606 621 606Q644 606 660 622L664 600L497 455Q495 453 527 453H546Q628 453 665 407L666 406Q710 357 710 297Q710 196 631 109L621 98L577 69Q471 -7 452 -15Q413 -26 370 -26Q239 -26 155 59Q66 148 66 319Q66 442 113 505L191 552Q269 600 270 600H271Q273 600 280 596T293 589T299 586Q300 586 357 623Q413 659 415 659L426 649Q373 604 373 560ZM219 228Q305 262 305 329V343Q305 384 294 434T282 519Q282 562 287 567Q287 569 286 569Q222 556 191 520Q144 464 144 362Q144 213 228 128T420 42Q514 42 568 103T622 255V260Q622 320 578 357Q526 400 453 400Q434 400 410 396L399 394L400 378V372Q400 330 388 301T348 254T305 232T252 217Q245 215 242 214L234 213L226 220L219 228",120077:"194 601Q175 601 155 590T121 564T95 533T76 506L69 495Q55 503 55 507Q55 509 60 521Q87 586 132 636T222 686Q251 686 289 660T363 607T422 580Q442 580 466 588T506 604L522 612V591L487 574Q371 517 359 517H357Q332 522 280 561T194 601ZM383 39Q383 96 356 203T329 361Q329 364 329 370T330 378L331 388L339 399Q362 429 394 462T446 513T469 531Q470 531 477 527T484 521L474 509Q411 434 411 379Q411 341 434 223T458 82Q458 1 390 -69T239 -139Q191 -139 162 -123T123 -83T108 -30T101 23T88 64T52 80Q27 80 -4 64L-10 80Q-5 85 13 98T63 128T118 144Q149 144 163 129T179 93T182 38T187 -19Q199 -96 278 -96Q294 -96 309 -91T343 -73T372 -31T383 39",120078:"154 37Q219 41 219 142Q219 203 190 302T160 434Q160 445 172 472T209 534T269 602T354 657T460 680H472Q576 680 618 617V599Q618 578 615 555T608 517T602 501Q596 495 587 495Q586 495 586 499Q586 500 586 505T585 513Q567 628 415 628Q384 628 356 621T302 596T260 546T244 466Q244 416 258 377L261 367L276 382Q294 401 317 422T386 471T468 500Q500 500 518 477T544 422T554 386Q555 382 560 376T576 364T601 357Q612 357 623 361Q623 360 621 351T617 340L541 305L465 272Q469 271 476 270T488 266T502 260L512 255L519 242Q533 211 546 157T564 93Q584 53 617 53Q649 53 682 74V54L675 46Q646 17 612 -5T554 -27Q546 -27 538 -23T517 -9T494 28T478 91Q465 172 448 200T378 228Q337 228 289 207L288 196Q288 160 284 138Q283 125 262 98Q185 1 112 -24L102 -27L91 -25Q47 -13 17 31Q17 33 49 69L80 106Q111 37 154 37ZM421 434Q411 436 405 436Q370 436 336 407T275 337L267 325L271 313Q288 257 288 234Q289 234 395 276T502 319Q501 320 499 323T493 330T485 345T475 371Q473 378 468 388T449 416T421 434",120079:"251 231Q251 254 206 341T160 468Q160 529 238 605Q313 677 425 685L432 686Q440 686 445 686Q520 686 545 657T571 576Q571 548 568 517T564 480Q564 466 572 460T608 452H623V431L619 430Q618 430 611 428T591 423T566 417L516 404Q497 415 491 419T480 433T475 461Q475 470 477 498T480 546Q480 561 480 569T474 592T459 615T429 631T379 638Q322 638 283 606T239 526Q237 480 280 394Q319 310 320 268V250Q308 235 244 169L203 128H210Q215 128 256 112T357 80T466 64Q526 64 564 88T625 186L629 196Q643 187 644 186Q618 70 604 41Q577 -15 513 -24Q496 -26 476 -26Q418 -26 344 -3T211 45T133 69Q115 69 97 50T65 7T49 -20L45 -16Q41 -11 37 -6T33 0Q33 8 66 69T111 134Q251 156 251 231",120080:"687 578Q690 586 719 612T794 665T877 692Q909 692 926 670T953 614T973 570Q983 561 1000 560Q1023 560 1048 569V553L1034 546Q1003 528 972 504T933 466Q905 403 905 264Q905 205 909 172T920 126T940 91Q951 74 959 74T997 87L1027 100V79L956 27Q940 15 922 2T894 -19L885 -26Q883 -26 854 27L825 80V192Q826 314 830 341Q831 345 833 356Q840 398 844 404Q871 444 920 489L917 491Q914 493 911 495T903 501T898 508Q893 516 877 562T852 616Q840 628 818 628Q751 628 702 541L697 532L700 515Q708 467 708 419Q706 348 690 276T662 169T643 126L634 116Q626 105 611 87T581 51L522 -22L514 -15Q470 21 452 21Q431 21 394 -16L384 5L386 9L426 60Q449 87 460 95T486 104Q487 104 491 104T497 103Q514 99 541 81L559 69Q595 96 606 169T618 350Q618 486 598 543T517 601Q484 601 458 570T432 523Q432 516 434 492T436 443Q436 250 369 133L363 122L280 50Q207 -16 192 -27L182 -18Q136 26 106 26Q83 26 62 9T37 -16L27 0L33 10Q41 22 54 39T94 81T143 106Q178 106 225 62L235 53Q283 82 307 117Q352 190 352 359Q352 408 345 451T320 534T267 597T183 621Q159 621 147 617T120 598Q97 574 96 556Q96 528 143 469T191 377T161 311T102 262T70 245Q69 245 59 252T49 260L56 264Q63 268 73 275T94 291T111 312T118 338Q118 355 95 384T50 446T27 506Q31 567 101 626T255 686Q297 686 330 671T382 632T409 595T421 572V571L430 580Q454 610 496 634T588 659H590Q655 659 683 585L687 578",120081:"112 334Q112 356 70 410T27 497Q27 553 94 619T229 685Q230 685 236 685T246 686Q303 686 349 654Q373 636 392 607T419 558L426 538L454 576Q474 604 486 618T520 651T569 678T633 686Q668 684 687 673T713 651T730 609Q730 608 732 600T736 588T741 578T747 568T754 561T765 555T779 553Q789 553 817 562Q819 557 819 555V547L790 526Q743 492 730 479T712 447Q697 369 697 281Q697 166 726 108Q741 76 755 68Q759 66 767 66Q789 66 825 93V82Q825 71 822 70Q821 69 763 27T701 -18L692 -25L668 15Q662 25 650 45T635 70L627 85V107Q627 122 626 162T624 285Q624 381 632 398Q638 409 651 425T675 454T696 477T707 489H696Q683 490 679 492T669 507T653 551Q642 588 627 608T584 628Q572 628 560 625T538 616T519 602T502 586T486 568T473 549T463 532T454 517T448 504L445 497Q437 480 437 474Q437 472 439 461T444 421T446 348Q446 205 405 124Q396 105 392 100T368 78Q312 32 278 9T235 -18T214 -22Q191 -22 170 -10T139 12T129 25T160 66T192 105Q193 102 194 98T200 83T213 64T233 49T261 42Q303 42 339 90Q373 134 373 268Q373 397 339 493T235 618Q215 628 191 628Q155 628 126 604T97 548Q97 524 120 493T168 431T192 381Q192 346 164 318T86 260L70 250L54 266L63 272Q112 300 112 334",120082:"428 596Q412 596 386 595T350 593Q289 593 270 625Q267 632 267 640Q267 656 280 672T312 705T336 729H343Q351 729 351 728Q342 710 342 703Q342 683 382 676T493 662T604 643Q648 627 677 599T720 535T739 466T744 392Q744 317 732 260T696 166T659 116T621 83Q617 80 615 78Q485 -27 377 -27Q320 -25 272 -9T187 21T122 36H116Q65 36 29 -13L27 -15L12 0Q12 1 32 26T76 78T109 109Q145 123 166 150T187 207Q187 244 134 318T80 412Q80 454 112 498T176 566T213 590Q216 590 224 585L234 580L225 573Q216 566 207 557T188 536T172 511T165 484Q165 448 213 368T261 259Q261 241 252 219T228 179T200 146T176 122L167 112Q170 111 174 111Q188 110 233 91T339 55T453 37Q508 37 556 68T626 152Q655 219 655 328Q655 543 532 582Q484 596 428 596",120083:"112 339Q112 354 91 380T49 438T28 497Q28 565 95 628T242 692Q261 692 277 689T307 682T331 670T351 655T367 637T379 619T388 600T395 582T401 565T405 550Q409 554 422 570T453 603T500 641Q573 692 637 692Q656 692 670 686T692 672T705 647T713 618T718 584Q720 568 721 562T728 546T742 534T768 530Q776 531 782 532T791 535T796 536Q799 536 804 521Q801 519 789 513T764 499T738 480Q697 447 680 414Q677 407 677 396Q677 370 713 312T750 210Q750 125 686 57T560 -11Q540 -11 475 13L410 37V31Q410 -9 412 -50T417 -118T420 -150Q419 -150 373 -184T326 -218L305 -208Q305 -207 307 -196T314 -165T322 -116T328 -46T331 43V63L318 66Q270 80 250 80Q233 80 213 70Q183 57 138 -3L128 -16L118 5L125 20Q193 154 282 154Q309 154 331 146V287Q331 444 327 469Q321 522 301 560Q284 590 251 611T184 633Q146 633 119 607T92 550Q92 539 94 534Q100 516 143 460T186 386Q186 366 170 336T119 281Q102 264 70 250L49 260L56 266Q64 271 72 278T90 296T106 317T112 339ZM602 345Q602 357 608 371T622 397T642 421T661 441T678 456L686 462Q663 473 652 486T639 512T634 553Q631 594 624 608T593 631Q587 632 567 632Q539 632 497 600T416 497L410 484V122L467 103Q481 99 502 92T533 82T557 75T578 69T594 66T610 64Q647 64 672 87T697 144Q697 180 650 250T602 345",120084:"428 596Q412 596 386 595T350 593Q313 593 291 605T268 638Q268 644 269 648T274 658T284 669T301 689T326 718L336 729H343Q351 729 351 728Q342 710 342 703Q342 683 382 676T493 662T604 643Q744 592 744 398Q744 299 708 213T646 104L603 68L614 55Q670 -5 710 -5Q726 -5 744 1T772 14L781 20Q782 20 782 7V-6L771 -13Q673 -69 665 -69L647 -63Q552 -30 514 8H512Q509 8 500 3T471 -9T428 -23Q405 -27 377 -27Q305 -24 228 6T124 36Q69 36 27 -16Q23 -13 19 -8L11 0L27 20Q93 102 109 109Q145 123 166 150T187 207Q187 244 134 318T80 412Q80 454 112 498T176 566T213 590Q216 590 224 585L234 580L225 573Q216 566 207 557T188 536T172 511T165 484Q165 448 213 368T261 259Q261 241 252 219T228 179T200 146T176 122L167 112Q170 111 174 111Q188 110 233 91T339 55T453 37Q508 37 556 68T626 152Q655 219 655 328Q655 543 532 582Q484 596 428 596",120086:"750 276Q750 141 645 57T378 -27Q224 -27 146 67Q66 163 66 307Q66 361 80 412T127 515T217 609T356 676L388 684L420 692L442 681Q545 625 586 608T654 591Q688 591 710 609T737 646L742 665Q742 665 756 654L752 642Q736 594 706 566T621 515L607 510Q580 513 528 542T421 599T335 627Q272 627 214 569Q139 500 139 373Q139 308 159 247T217 136T316 56T455 26Q520 26 566 43T634 90T666 148T676 207Q676 264 649 297T580 338Q574 339 552 339Q516 339 442 325T327 310H324Q303 310 290 312T259 328T232 369Q230 375 230 390Q230 426 259 461Q286 488 338 507Q351 498 351 495L346 492Q342 490 339 488T330 482T320 473T312 462T305 447T303 428Q303 368 366 368Q393 368 487 388T613 409Q656 409 696 385T748 306Q750 294 750 276",120087:"289 686Q338 686 439 668T565 649Q606 649 641 672Q656 683 664 690T674 700L675 701Q676 698 676 692V681L641 636Q608 591 602 588Q577 575 528 575Q490 575 438 583L426 585L416 578Q335 520 335 465Q335 437 393 366T452 259Q452 226 406 171Q387 146 351 115L341 106L358 97Q438 58 475 58Q525 58 598 124L608 133Q617 119 617 118Q617 114 606 103Q513 0 448 -27L438 -25Q401 -19 337 14T234 48Q186 48 122 -3L112 -11L106 -3L101 5L110 15Q160 63 209 105L224 117H310Q384 163 384 210Q384 238 329 303T263 398Q262 400 262 404Q262 427 290 476T368 580Q383 596 381 596Q315 622 228 622Q159 622 118 593T76 516Q76 482 96 461T139 431L107 399L75 367Q34 403 34 472Q34 525 64 572T148 652Q207 686 289 686",120088:"160 247Q160 291 110 382T59 505Q59 542 106 597T207 690L218 697L229 682Q229 680 216 669T187 644T158 604T144 552Q144 526 165 482T207 387T228 291Q228 277 228 267T224 247T219 232T210 217T199 202T184 184T166 163L118 107Q124 105 132 105T160 98T220 77Q298 47 317 47Q354 47 409 105Q444 142 451 161T458 244V277Q458 339 455 457T447 596L575 686L591 676L583 668Q550 632 541 587T532 449V372V298Q532 198 550 147Q572 79 605 79Q617 79 631 84T656 95L665 100V79L595 27Q578 15 560 2T532 -19L523 -26Q522 -26 490 42L458 111L397 50Q389 42 374 27T355 8T340 -5T325 -16T311 -22T294 -26T274 -27Q232 -25 152 6T35 37Q28 36 19 30T4 18T-8 4T-16 -5Q-25 10 -25 11T-20 18Q-5 34 15 57L54 101Q70 103 86 116Q94 121 113 140T137 166Q160 201 160 247",120089:"54 266Q118 307 118 339Q118 360 74 413T27 493Q26 530 59 578T133 651Q187 686 256 686Q299 686 332 673T382 640T409 600T424 567T429 553Q431 553 463 586T542 653T624 686Q663 686 715 652T798 617Q812 617 825 622V606L815 599Q785 576 762 546Q724 495 724 432Q724 397 737 317T750 217Q750 148 711 96Q697 75 639 34T578 -10Q563 -21 555 -23T522 -26Q458 -26 363 29Q253 89 211 89Q192 89 173 83T139 67T114 49T96 34L90 27L80 43L95 59Q121 87 148 110T191 143T213 154Q261 154 300 195Q328 222 340 267T352 406Q352 562 255 611Q222 627 187 627H182Q143 627 115 598Q96 579 96 559Q96 528 144 470T192 381Q192 348 156 314T80 256L70 250L54 266ZM727 548Q701 550 650 583T567 617Q560 617 554 615Q532 610 501 580T445 501L437 485V465Q432 326 378 223L294 150Q321 143 421 87T560 31Q608 31 634 64Q660 102 660 198Q660 226 655 292T650 387Q650 418 658 452L660 462L735 548H727ZM264 150Q265 151 263 151H261Q261 150 264 150ZM280 150H276V149Q280 149 280 150",120090:"32 501Q35 564 103 625T264 686Q326 686 365 652Q402 618 420 564L441 585Q486 630 539 670L559 686L572 672Q637 606 665 559L682 576Q787 686 845 686Q877 686 929 656T992 623Q999 621 1016 621Q1041 621 1054 628L1051 617L1047 606Q1042 602 1037 597Q983 557 969 522T954 434Q954 394 961 336T968 221Q968 201 966 184T963 155T956 131T948 113T936 96T923 82T906 66T887 50L816 -2Q815 -3 810 -6T801 -11T791 -16T777 -20T759 -23T735 -25Q691 -25 619 4T505 37H496L463 21Q420 0 389 -20L378 -27H362Q316 -27 275 -9T202 28T150 46H146Q114 46 59 -5L48 -16L41 -6Q40 -4 38 -2T34 2L33 4Q33 8 77 54Q111 87 142 112L154 122H166Q239 127 288 182Q346 244 346 406Q346 489 326 537T259 610Q227 628 195 628Q155 628 128 606T101 549Q101 517 146 465T192 382Q192 348 156 310T85 254L75 250L64 258L55 266Q56 267 74 276T105 301T118 339Q118 362 75 413T32 501ZM952 547Q927 555 877 586T796 617Q744 617 682 525L676 516L677 498Q678 486 678 425Q678 301 652 206Q649 195 613 151T577 102Q577 100 582 100Q618 100 720 51Q761 32 790 32H794Q843 32 869 83Q884 110 884 189Q884 233 879 294T873 400Q874 433 879 451T889 478T915 507T952 547ZM241 105Q249 98 263 88T317 60T393 42Q478 42 547 109Q607 171 607 358Q607 371 607 380T604 417T595 467T577 517T546 566T500 601L479 580Q449 550 433 526L426 516V503Q426 311 357 200L352 191L296 149Q241 107 241 105",120091:"96 511L78 527L149 603Q207 666 227 686L237 685Q278 680 306 667T351 631T376 588T395 533L400 516L406 527Q439 600 523 653Q538 664 587 688Q589 688 596 672T613 635T629 606Q643 588 665 588Q677 588 693 596L709 603V585L607 526Q583 536 554 564T512 614Q461 571 435 507T405 381V367H581L563 347Q561 344 558 341T553 335T549 330T546 326L545 325H541Q537 325 488 329T411 334H405V325Q405 198 454 123Q497 54 568 54Q594 54 619 64T660 84L676 95V74L565 -16L553 -20Q528 -27 512 -27Q492 -27 475 -21T444 -5T418 19T398 47T382 77T371 105T363 128T358 145L357 151Q354 151 339 136T294 91T232 37Q152 -22 113 -22Q90 -22 69 -9T38 17T28 32Q28 33 58 68L86 101Q94 81 115 64T165 47Q206 47 249 84Q302 128 325 222Q334 263 336 312V334H312Q198 334 163 324H161Q162 326 182 348L198 367H336V398Q333 508 308 550Q295 570 274 585T227 601Q204 601 181 589T145 565T115 533T96 511",120092:"123 345Q123 358 75 415T27 496Q27 533 63 578T121 639Q181 685 256 685Q305 685 332 676T384 635Q419 588 425 542Q468 585 526 628T618 686Q632 667 658 645T704 609T724 594Q740 512 740 385V375V361Q740 128 682 -3Q656 -64 554 -141T361 -218Q319 -218 287 -203T243 -173T230 -150Q230 -148 267 -109L304 -69Q311 -115 341 -142T411 -170Q474 -170 534 -119T624 11Q660 111 660 312Q660 447 633 528L612 549Q578 583 552 596L543 601L528 592Q501 574 483 558Q454 528 436 494L431 484V473Q431 330 376 230Q366 213 359 206T306 159L250 112Q278 105 327 82T399 58Q421 58 440 69T471 92T484 104H485L493 90L480 73Q453 39 429 13Q393 -22 372 -22Q342 -22 260 15T153 53Q97 53 48 -16L38 5Q46 22 74 54T128 108L143 122H155Q226 127 275 168Q352 236 352 399Q352 501 309 564T197 628Q156 628 129 607T102 553Q102 517 147 463T192 383Q192 323 75 250L59 266Q123 314 123 345",120094:"86 363Q86 365 128 391T212 444L255 470Q256 470 263 465T283 453T308 442Q338 431 346 431Q350 431 358 436L414 465L421 459L418 434Q404 339 404 262Q404 147 408 119L425 97Q443 74 444 74L467 86L491 97Q492 97 497 83L436 28Q377 -26 374 -26L331 46L329 91L155 -35Q152 -35 114 10T68 65L67 86Q66 100 66 156Q66 177 66 198T68 236T71 268T74 296T77 320T80 338T83 351T86 360V363ZM314 365Q285 367 255 374T206 386L187 392Q181 392 172 376T154 311T145 197Q145 124 151 118Q156 110 187 78L208 56H214Q221 57 253 76L308 109L329 123V136Q328 143 328 257V365H314",120095:"177 427Q177 364 181 364Q184 364 192 370T223 395T271 433Q317 469 323 469Q325 469 338 462T377 440T432 413L440 409L441 396Q441 394 441 372T442 334Q442 203 425 108L423 97L400 83Q347 49 296 21T222 -19T196 -31Q192 -29 149 12T87 71L89 89Q100 155 100 319Q100 500 94 627Q94 632 94 638T94 648T94 656T93 662V664Q93 668 97 669T106 670H110Q114 653 118 633L127 596Q127 595 132 597Q136 599 195 642L255 685L272 673Q269 670 256 659T233 637T211 609T190 565T179 508Q177 494 177 427ZM295 377L274 385Q273 385 264 381T242 370T223 361Q213 355 188 340L178 333V123L198 103Q259 42 285 42Q299 42 314 55T339 85Q363 132 363 232Q363 310 358 343V349L345 355Q330 363 295 377",120096:"72 208Q72 323 84 361Q84 363 167 414Q248 466 250 466Q255 465 260 465Q283 460 307 450T344 430L357 422L306 343L301 342L296 340Q267 362 247 372T216 384T177 390Q154 349 154 238Q154 220 156 158V145L168 132Q179 121 208 93T244 59Q245 58 246 58Q255 58 302 83T350 108L352 104Q355 100 356 96L358 92Q358 91 274 32T187 -29L177 -20Q160 -6 120 36T77 84Q77 87 75 118T72 208",120097:"13 542Q13 544 77 576T147 609Q154 609 185 598T283 551T414 464L427 454V440Q427 436 427 412T428 372Q428 315 426 270T418 197T409 152T400 121T394 103L304 35Q285 21 261 2T225 -25L214 -33Q149 7 97 59L76 80L75 91V171Q75 221 76 254T79 299T80 313Q80 315 78 321Q78 323 78 326L77 330Q79 336 132 384T211 447L219 445Q221 445 224 444L228 443Q229 443 228 441T221 432T206 415L191 395Q175 378 162 339Q152 306 152 250Q152 217 159 140V134L171 121Q194 99 235 74T284 48Q296 48 310 75T337 156T349 267Q349 346 336 400L315 420Q246 489 176 525Q127 545 94 545H73L27 527L13 542",120098:"353 103Q353 97 358 87L337 71Q293 38 247 6Q191 -30 189 -30Q188 -30 173 -16T130 26T76 85L74 99Q70 139 70 190Q70 228 73 271T79 338T84 365L94 372Q105 378 126 392T166 417L246 467Q283 417 349 369L364 358L355 349Q249 249 169 180L151 166L152 152V139L165 126Q186 105 215 84T260 62Q267 62 309 82L353 103ZM267 323Q246 337 230 350T204 371T189 385T179 394T174 397Q149 381 149 219V211Q151 211 171 223T220 258T268 299L282 313L267 323",120099:"128 387Q128 391 112 456T92 546V555L101 568Q133 617 183 670L193 681L204 673Q238 648 262 648Q276 648 292 656L302 661L308 653Q308 652 278 618L249 585H234Q194 587 159 595Q158 595 156 596H153L150 597Q151 593 152 581T154 564T157 547T164 524T176 494Q199 436 203 400V392H207L323 386Q323 384 309 368L296 351H203V176Q201 -9 198 -32Q194 -61 166 -114Q158 -129 153 -138Q114 -214 110 -221Q105 -221 98 -220L87 -219V-216Q88 -215 106 -150T124 -82Q128 -73 129 155V351H30L64 386H96Q128 386 128 387",120100:"27 -144L17 -131L82 -75L146 -20L126 6Q99 37 92 48L78 65L77 79Q75 103 75 158Q75 217 78 268T86 343T91 368Q92 370 109 382T157 413T222 452Q240 465 249 469L251 470Q296 443 350 428L365 424L437 465L442 459Q442 456 441 453T437 444T432 424T427 385T423 317T421 215V133L423 119Q423 111 455 -17Q455 -21 380 -108T290 -201Q290 -202 284 -204T269 -207T252 -209Q172 -209 75 -135L62 -126Q60 -126 44 -135L27 -144ZM349 351Q267 359 178 389Q177 387 173 376T166 358T161 337T157 303T155 259Q155 195 159 135L160 124L170 112Q180 101 204 77T230 53Q231 53 286 88L340 123V141Q340 235 348 329Q348 334 348 339T348 348L349 351ZM364 -59Q364 -37 358 -1T347 64T341 93Q336 93 252 28T149 -57Q226 -134 293 -134Q325 -134 344 -118T364 -69V-59",120101:"88 427Q88 486 87 545T84 634T81 667Q81 673 82 673T89 676H94L117 600L200 661Q208 667 218 674T233 684L238 688L254 678Q222 646 216 637Q164 572 164 483V442V371Q187 390 244 431T312 478Q344 446 411 423L428 417L429 396Q434 297 434 218Q430 8 406 -34Q346 -111 262 -195L251 -205L249 -203Q248 -203 244 -199T236 -193Q226 -183 227 -182Q228 -182 244 -169T278 -140T301 -121Q330 -89 340 -22Q355 60 355 171Q355 200 353 244T348 321T344 354Q333 363 307 376T260 390Q241 390 179 350L164 341V121Q180 96 201 66L213 50Q210 46 172 11T131 -24Q130 -24 123 -11T102 25T77 65V78Q80 104 84 227T88 427",120102:"72 617Q72 618 102 645T133 673H134Q134 668 175 627L187 615L130 555L116 568Q72 615 72 617ZM27 369Q21 376 14 382L26 392Q83 440 119 474Q158 435 169 427L179 420L176 395Q166 302 166 227Q166 171 174 139Q178 119 186 103T202 81L208 75Q255 100 261 100Q262 100 264 92T267 83Q267 80 208 30T145 -20Q143 -20 118 17L91 55Q98 117 98 193Q98 339 88 369Q71 390 68 390Q63 390 39 376L27 369",120103:"101 644L132 672L145 657Q155 642 169 628L182 614L169 600Q148 579 140 570L125 555L112 568Q109 570 91 592T72 615Q72 617 101 644ZM19 -208Q-9 -185 -9 -183Q57 -134 80 -106Q103 -81 110 -19T118 179Q118 294 113 329T86 383Q78 389 76 389Q73 389 57 379L39 367Q26 380 26 381L33 387Q40 393 53 405T79 428L130 474Q147 457 186 428L195 422L196 376Q196 130 192 58T174 -35Q172 -39 104 -114T19 -208",120104:"93 348Q93 379 90 503T87 658V670Q87 671 94 671L100 672L112 636Q124 603 124 600L144 616Q196 659 234 682L246 689Q252 686 256 685T268 680L254 667Q225 641 211 626T184 579T168 505V497L178 504Q203 523 237 544L300 584L310 573Q359 522 359 481Q359 476 359 472T358 464T355 456T351 448T346 440T340 433T332 424T323 414T312 402T299 389L255 343L300 342H346L320 309H177V128L193 113Q214 92 244 68L254 60L303 84Q351 108 352 108L362 96Q355 85 277 30T194 -25L170 -4Q146 18 120 41T89 68Q94 85 94 168Q94 184 94 218T93 268V309H58L24 310L51 342H93V348ZM172 342Q217 342 252 374T287 445Q287 472 255 504Q242 517 241 517Q202 498 187 468T168 365V342H172",120105:"221 76L267 99Q268 98 269 96T271 88T270 82L262 76Q255 69 241 57T214 34L148 -20L98 56L99 89Q107 247 107 373Q107 494 101 621Q101 653 99 659V665L106 668L113 672L118 655Q122 642 131 617L138 597Q140 597 157 611L240 670L264 685Q265 685 270 680T276 674T269 667T247 647T219 617Q197 587 186 551T173 493T171 438Q171 376 175 282T179 147V117Q184 109 201 93T221 76",120106:"20 367L8 379Q9 380 63 425T118 471Q130 460 143 446L168 421V398L169 376L295 475Q362 433 415 418V399Q415 380 416 380T437 394T484 428T529 462L544 474L556 467Q590 449 614 438T646 424L653 421L665 417L664 412Q664 411 664 407T664 397T663 384Q660 342 660 335Q658 303 658 245Q658 186 660 152L661 126L669 115Q680 96 697 79L707 83Q716 87 723 90T735 96T741 100T746 102L747 103V102L750 95Q753 88 753 87L631 -18Q630 -17 622 -3T589 43L576 60L579 72Q592 146 592 218Q592 265 584 321Q581 345 578 350T560 363Q535 376 496 386L481 390Q475 387 425 358L415 351V238V157Q415 142 415 135T417 120T421 110T430 98T441 81L465 47Q462 44 458 41T443 28T420 8L380 -26L333 47L336 62Q339 77 342 109T345 184Q345 223 341 285T333 348Q322 364 258 382L240 388L169 347L168 240Q168 118 171 110L174 106Q178 101 183 93T195 78L217 48Q217 47 196 30T154 -5T133 -21L130 -16Q127 -10 122 0T111 19Q89 56 89 60Q95 76 95 153Q95 239 88 337V365L62 391L20 367",120107:"31 368Q20 379 20 380T72 427L121 470L129 463Q137 455 155 441T176 425V367L320 475L329 469Q351 454 385 437T434 417L432 402Q429 362 429 231V128L439 111Q442 107 445 102T449 95T453 90T456 86T459 84T463 82T467 82Q468 82 489 93T511 105T514 95V88L395 -18L340 65L341 77Q347 111 348 178Q348 343 343 353V358L332 363Q298 377 264 382Q260 382 254 382L249 383Q247 383 211 362L176 341V229V147Q176 134 176 127T177 115T179 106T183 99T189 91T197 81Q201 76 206 69T214 57L217 53Q217 52 175 15T132 -22Q132 -20 114 5T88 41Q84 45 84 50Q94 116 94 203Q94 227 93 263T92 324L90 364L67 388L50 378Q32 368 31 368",120108:"67 121Q70 265 84 359V364L97 371Q137 394 177 421T238 464T260 480L278 468Q295 457 327 442T394 418L406 414Q412 388 412 300Q412 263 410 228T405 170T399 130T393 103T391 92L381 86Q274 19 165 -28L161 -24Q157 -21 151 -15T136 -2T118 14T101 30T86 46T74 60L67 68V121ZM335 278Q335 286 335 303T334 335L333 349V356H326Q288 360 208 388L183 397Q178 393 172 383T154 333T142 239Q142 192 151 134Q152 124 155 120T175 99Q197 77 219 64T251 47T267 44T281 52T302 80T320 124Q335 182 335 278",120109:"23 25Q15 33 12 38L35 59Q82 102 87 105V351L68 378Q42 414 42 422Q42 437 67 472T114 530L125 541Q126 541 132 537T138 532Q121 507 121 488Q121 453 160 413L167 405L166 390L165 372Q169 372 233 421T305 478Q307 479 315 472Q395 421 423 415Q424 415 424 415T425 414L426 410Q426 407 426 401T426 388Q430 335 430 272Q430 139 408 80Q407 78 340 22L273 -33Q200 23 165 23Q164 23 164 -32Q165 -89 168 -155V-170L93 -212L78 -203Q85 -48 87 16V47H79Q53 44 23 25ZM319 41Q346 94 349 212Q349 278 343 343V351L330 357Q318 363 270 381L255 387L245 383Q212 370 178 345L166 336V287Q165 260 165 166V94H175Q219 90 299 51L319 41ZM132 57L129 60Q130 58 132 57ZM158 29Q159 29 155 34T145 45T138 50Q155 29 158 29",120110:"399 19Q399 -123 407 -174V-179L332 -219L322 -210L312 -202L314 -185Q320 -83 323 54V95L311 85Q255 40 162 -19Q146 -29 145 -27Q140 -22 103 20L63 65V73Q61 83 61 115Q61 122 61 135T60 154Q60 263 79 353L83 368L94 375Q123 391 147 405T186 429T212 446T229 458T238 466T243 470T247 471L260 464Q274 457 295 448T330 434L341 432L410 479L412 478Q414 476 416 475T419 473L417 461Q399 358 399 19ZM316 367Q287 370 252 377T196 391L176 397H175Q173 397 166 382T149 314T139 187V158Q139 138 141 132T155 114Q158 111 160 109Q210 58 211 58L218 62Q226 67 240 75T266 91L319 124V196Q319 334 325 361V367H316",120111:"357 398Q364 398 375 403L386 408Q386 404 387 400V393L369 377Q361 370 350 360T336 347T327 340T316 336T303 335Q270 335 234 371L224 379Q220 375 214 370T198 355L182 340V243Q182 164 183 152T189 129Q195 117 211 100T239 72T254 60T298 81Q342 101 343 101Q344 100 345 92T346 82L200 -21Q174 -5 117 55L97 75L99 92Q106 147 106 196Q106 216 104 282T97 355Q95 359 95 361Q95 364 77 378L65 387L48 380Q30 372 29 372Q28 371 23 375T17 380Q17 384 50 415T107 467L115 474L128 461Q171 421 182 414V382L235 425Q247 435 261 446T283 462L290 468L295 460Q335 398 357 398",120112:"272 33Q284 33 290 70T296 138Q296 181 290 198T262 230Q257 232 246 232Q231 232 218 227T156 194L108 167L101 176Q90 192 75 219L69 230V284Q69 346 70 357V377L146 427Q181 450 202 464T223 477L225 476Q227 475 229 474Q231 472 242 466T270 450T296 431Q309 418 326 418Q342 418 361 429T392 450T403 459Q406 445 406 442Q406 440 384 421T338 382L316 363Q315 362 310 362Q292 362 251 371T173 396Q156 403 155 403Q143 386 143 342Q143 305 150 278T168 244Q171 242 181 242L190 243L315 300Q330 295 357 274Q358 273 362 270T366 266T369 261T372 253T373 239T374 217T374 185Q374 157 372 133T368 98T363 71T358 50L336 40Q288 20 255 2T211 -22T198 -29L190 -22Q181 -14 168 -3T138 19T104 38T70 46Q50 46 32 37T3 20T-9 11L-18 23L-1 41Q46 89 62 99T112 110Q141 110 157 103T225 62Q268 33 272 33",120113:"228 640L242 627L227 613Q213 599 211 593T203 553Q197 500 196 435V389H301L272 353H195V274Q195 178 196 159L197 123Q249 71 273 68H280L312 83Q344 99 345 99Q348 99 348 78Q348 76 314 52T246 4L212 -20Q211 -20 164 19T112 62Q112 122 113 196Q113 228 113 262T114 318T114 341V353H27L62 389H116L117 431V558L228 640",120114:"171 315Q171 252 165 199T153 124L147 103Q147 102 196 80L244 57L335 107V116Q339 161 339 268Q339 315 338 351T337 412V424L420 468Q424 465 427 461L424 435Q412 331 412 226Q412 170 415 145T434 96Q442 84 452 83Q461 83 492 96L506 102Q507 102 510 96T513 88L493 71Q445 32 401 -9Q392 -18 388 -17L384 -16Q358 39 355 44Q336 77 333 77Q261 45 203 -9Q186 -23 181 -23Q177 -23 162 -11T121 18T69 44L57 48L61 54Q65 60 71 73T82 102Q100 156 100 262Q100 305 93 335T80 373T62 396L23 376Q18 377 9 386L119 474Q149 437 171 421V339V315",120115:"55 418Q55 443 100 503Q121 530 123 530Q125 528 127 528T131 528T134 528T135 524T131 516Q123 499 123 486Q123 457 159 416L169 405L170 388L171 372Q171 371 244 424L317 477L334 466Q394 428 432 416L433 402Q433 400 433 377T434 336V305Q434 195 420 131Q413 94 406 87Q403 84 298 29L192 -28L172 -8Q139 25 106 52L92 64V70Q95 97 95 198Q95 293 94 318L92 355L84 367Q55 406 55 418ZM174 306Q174 297 173 255T171 184Q171 153 175 136T198 100Q207 94 224 80T255 57T282 49Q304 49 328 80Q359 129 359 243Q359 284 352 345Q351 358 348 360Q333 373 304 384T265 396L251 390Q215 372 186 351L175 344V337Q175 319 174 306",120116:"45 425Q45 439 82 485T126 532Q127 532 128 532T131 531T137 529L132 519Q121 499 121 483Q121 473 131 454T156 419L167 408L169 376L185 388Q237 425 291 473L301 466Q337 443 394 416L419 405L418 387V369Q419 369 487 418T560 471L581 459Q597 450 621 437T664 415T684 406Q688 406 688 323Q688 254 679 193T662 103T648 71Q647 70 554 20L464 -28L443 -15Q416 1 386 17T343 40T331 49Q331 52 333 73T337 133T339 216Q339 309 334 339Q333 341 316 353T277 377T246 389Q235 389 201 369T166 346Q166 345 164 247Q164 232 164 210T163 179Q163 139 170 116T205 57L212 48L136 -27Q115 16 87 44L78 53L80 67Q88 124 88 211Q88 282 87 315T83 356T74 371Q45 410 45 425ZM591 352Q580 359 565 365T540 374T517 381T504 385L418 342L417 318V220Q417 212 417 194T417 170T418 152T420 134T424 120T431 106T440 95T454 83Q508 44 544 44Q566 44 583 77Q603 120 605 235Q605 289 600 322Q598 343 597 345T591 352",120117:"14 377Q63 428 117 472Q130 462 144 449L193 408V392V376L247 420Q300 464 301 464L310 451Q331 417 363 390L333 365Q303 340 301 340Q293 343 277 364T250 386Q241 386 215 361L195 341Q194 333 193 327T191 318T190 304T188 269Q188 220 192 148Q193 122 195 118T210 101Q255 60 271 60Q276 60 278 61L318 82Q327 86 336 91T351 98L356 101Q359 82 356 79Q354 77 283 27T210 -24L192 -7Q160 23 137 40L126 49L116 40Q66 -13 66 -54Q66 -117 167 -140L179 -142V-147L180 -152L123 -188L112 -185Q58 -170 31 -145Q10 -122 10 -96Q10 -80 22 -53Q44 -10 95 49Q97 51 100 54T104 59T107 64T109 71T111 81T112 97T113 119T114 149T114 188Q114 284 108 347V354L96 365Q76 385 67 385Q62 385 45 377L27 368L14 377",120118:"74 58Q89 124 89 241Q89 265 89 278T89 305T88 324T87 336T84 346T81 352T77 359T71 368Q57 388 52 398L45 409Q62 454 98 507L113 528Q128 528 128 524Q128 523 125 518T120 503T117 483V471Q123 456 130 445Q135 438 140 432T148 422T153 415T157 409T160 405T162 402T163 399T163 395V384V365Q165 365 237 419L311 473Q383 430 420 416Q426 414 426 411V404Q426 398 426 388T427 367Q431 233 431 201Q431 -3 391 -52Q387 -58 305 -138T221 -218L218 -217Q216 -216 211 -214T202 -210L184 -202L199 -194Q259 -162 288 -127T334 -19T350 184Q350 257 342 328L340 356Q282 390 262 390Q248 390 178 346L163 336V111L216 45L131 -26L124 -15Q114 3 85 44L74 58",120119:"47 335L36 347L52 362Q112 421 167 461L181 471L192 465Q236 444 260 417T284 369Q284 355 276 343T233 291Q195 246 195 245T205 242T241 228T300 198L302 187Q314 138 314 74Q314 -24 291 -95Q290 -100 222 -157L154 -214H145Q102 -214 53 -189T-7 -117Q41 -21 183 122L207 147Q205 149 186 157T140 172T100 180H97V192L140 231Q192 280 199 293Q205 303 205 315Q205 339 185 363T137 388Q119 388 63 347L47 335ZM179 -153Q212 -153 226 -113T240 14Q240 67 233 98T223 132T211 143L222 130Q216 125 206 116T170 82T124 33T88 -20T72 -70Q72 -99 105 -126T179 -153",120120:"130 -1H63Q34 -1 26 2T17 17Q17 24 22 29T35 35Q49 35 64 44T88 66Q101 93 210 383Q331 693 335 697T346 701T357 697Q358 696 493 399Q621 104 633 83Q656 35 686 35Q693 35 698 30T703 17Q703 5 693 2T643 -1H541Q388 -1 386 1Q378 6 378 16Q378 24 383 29T397 35Q412 35 434 45T456 65Q456 93 428 170L419 197H197L195 179Q184 134 184 97Q184 82 186 71T190 55T198 45T205 39T214 36L219 35Q241 31 241 17Q241 5 233 2T196 -1H130ZM493 68Q493 51 481 35H619Q604 56 515 256Q486 321 468 361L348 637Q347 637 330 592T313 543Q313 538 358 436T448 219T493 68ZM404 235Q404 239 355 355T295 488L275 430Q241 348 208 232H306Q404 232 404 235ZM155 48Q151 55 148 88V117L135 86Q118 47 117 46L110 37L135 35H159Q157 41 155 48",120121:"11 665Q11 672 22 683H213Q407 681 431 677Q582 649 582 515Q582 488 573 468Q554 413 484 372L474 366H475Q620 317 620 178Q620 115 568 69T420 6Q393 1 207 -1H22Q11 10 11 18Q11 35 51 35Q79 37 88 39T102 52Q107 70 107 341T102 630Q97 640 88 643T51 648H46Q11 648 11 665ZM142 341Q142 129 141 88T134 37Q133 36 133 35H240L233 48L229 61V623L233 635L240 648H133L138 639Q142 621 142 341ZM284 370Q365 378 391 411T417 508Q417 551 406 581T378 624T347 643T320 648Q298 648 278 635Q267 628 266 611T264 492V370H284ZM546 515Q546 551 531 577T494 617T454 635T422 641L411 643L420 630Q439 604 445 579T452 510V504Q452 481 451 467T441 430T415 383Q420 383 439 391T483 413T527 455T546 515ZM585 185Q585 221 570 249T534 294T490 320T453 334T436 337L435 336L440 330Q445 325 452 315T467 288T479 246T484 188Q484 145 474 110T454 62T442 48Q442 47 444 47Q450 47 470 54T517 75T564 119T585 185ZM449 184Q449 316 358 332Q355 332 335 333T302 335H264V199Q266 68 270 57Q275 50 289 43Q300 37 324 37Q449 37 449 184",120123:"16 666Q16 675 28 683H193Q329 683 364 682T430 672Q534 650 600 585T686 423Q688 406 688 352Q688 274 673 226Q641 130 565 72T381 1Q368 -1 195 -1H28Q16 5 16 16Q16 35 53 35Q68 36 75 37T87 42T95 52Q98 61 98 341T95 630Q91 640 83 643T53 648Q16 648 16 666ZM237 646Q237 648 184 648H128Q128 647 133 632Q136 620 136 341Q136 64 133 50L128 35H237L230 48L226 61V343Q228 620 231 633Q232 636 237 646ZM264 61Q278 40 310 35Q363 35 401 55T461 112T496 193T513 295Q515 333 515 349Q515 411 504 459Q481 598 373 641Q351 648 321 648Q304 648 292 643T277 635T264 621V61ZM461 628Q462 627 471 616T489 594T509 559T529 509T544 441T550 352Q550 165 479 75L468 59Q474 61 484 65T522 87T573 128T618 195T650 290Q654 322 654 354Q654 418 638 464T581 552Q559 576 529 595T480 621L461 628",120124:"12 666Q12 675 24 683H582Q590 680 593 672V588Q593 514 591 502T575 490Q567 490 563 495T555 517Q552 556 517 590Q486 623 445 634T340 648H282Q266 636 264 620T260 492V370H277Q329 375 358 391T404 439Q420 480 420 506Q420 529 436 529Q445 529 451 521Q455 517 455 361Q455 333 455 298T456 253Q456 217 453 207T437 197Q420 196 420 217Q420 240 406 270Q377 328 284 335H260V201Q261 174 261 134Q262 73 264 61T278 38Q281 36 282 35H331Q400 35 449 50Q571 93 602 179Q605 203 622 203Q629 203 634 197T640 183Q638 181 624 95T604 3L600 -1H24Q12 5 12 16Q12 35 51 35Q92 38 97 52Q102 60 102 341T97 632Q91 645 51 648Q12 648 12 666ZM137 341Q137 131 136 89T130 37Q129 36 129 35H235Q233 41 231 48L226 61V623L231 635L235 648H129Q132 641 133 638T135 603T137 517T137 341ZM557 603V648H504Q504 646 515 639Q527 634 542 619L557 603ZM420 317V397L406 383Q394 370 380 363L366 355Q373 350 382 346Q400 333 409 328L420 317ZM582 61L586 88Q585 88 582 83Q557 61 526 46L511 37L542 35H577Q577 36 578 39T580 49T582 61",120125:"584 499Q569 490 566 490Q558 490 552 497T546 515Q546 535 533 559Q526 574 506 593T469 621Q415 648 326 648Q293 648 287 647T275 641Q264 630 263 617Q262 609 260 492V370L275 372Q323 376 350 392T393 441Q409 473 409 506Q409 529 427 529Q437 529 442 519Q444 511 444 362Q444 212 442 206Q436 197 426 197Q409 197 409 217Q409 265 375 299Q346 328 280 335H260V206Q260 70 262 63Q265 46 276 41T326 35Q362 35 366 28Q377 17 366 3L360 -1H24Q12 5 12 16Q12 35 51 35Q92 38 97 52Q102 60 102 341T97 632Q91 645 51 648Q12 648 12 666Q12 675 24 683H573Q576 678 584 670V499ZM137 341Q137 131 136 89T130 37Q129 36 129 35H182Q233 35 233 39Q226 54 225 92T224 346L226 623L231 635L235 648H129Q132 641 133 638T135 603T137 517T137 341ZM549 603V648H495L506 641Q531 621 533 619L549 603ZM409 317V395L400 386Q390 376 375 366L357 355L373 346Q394 331 397 328L409 317",120126:"737 285Q749 277 749 268Q749 260 744 255T730 250Q695 250 677 217Q666 195 666 119Q666 52 664 50Q656 36 555 3Q483 -16 415 -19Q364 -19 348 -17Q226 -3 146 70T44 261Q39 283 39 341T44 421Q66 538 143 611T341 699Q344 699 364 700T395 701Q449 698 503 677T585 655Q603 655 611 662T620 678T625 694T639 702Q650 702 657 690V481L653 474Q640 467 628 472Q624 476 618 496T595 541Q562 587 507 625T390 663H381Q337 663 299 625Q213 547 213 337Q213 75 341 23Q357 19 397 19Q440 19 462 22T492 30T513 45V119Q513 184 506 203Q491 237 435 250Q421 250 415 257Q404 267 415 281L421 285H737ZM250 43Q250 45 243 55T225 87T203 139T185 224T177 343V361Q184 533 250 625Q264 643 261 643Q238 635 214 620T161 579T110 510T79 414Q74 384 74 341T79 268Q106 117 230 52L250 43ZM621 565V625Q617 623 613 623Q603 619 590 619H575L588 605Q608 583 610 579L621 565ZM655 250H517L524 241Q548 213 548 149V114V39Q549 39 562 44T592 55T615 63L630 70V134Q632 190 634 204T648 237Q655 245 655 250",120128:"20 666Q20 676 31 683H358Q369 676 369 666Q369 648 331 648Q288 645 282 632Q278 626 278 341Q278 57 282 50Q286 42 295 40T331 35Q369 35 369 16Q369 6 358 -1H31Q20 4 20 16Q20 35 58 35Q84 37 93 39T107 50Q113 60 113 341Q113 623 107 632Q101 645 58 648Q20 648 20 666ZM249 35Q246 40 246 41T244 54T242 83T242 139V341Q242 632 244 639L249 648H140Q146 634 147 596T149 341Q149 124 148 86T140 35H249",120129:"79 103Q108 103 129 83T151 38Q151 9 130 -15Q116 -34 130 -37Q133 -39 157 -39Q208 -39 219 -8L226 3V305Q226 612 224 621Q220 636 211 641T166 647Q137 647 128 654Q119 665 128 679L135 683H466Q478 677 478 666Q478 647 439 647Q399 644 393 632Q388 620 388 347Q386 69 384 59Q364 -6 316 -39T184 -77H172Q102 -77 56 -48T6 30Q6 62 26 82T79 103ZM353 354Q353 556 354 596T361 645Q362 646 362 647H253Q257 639 258 628T261 547T262 312V-4L255 -17Q248 -29 250 -29Q253 -29 258 -28T277 -20T302 -5T327 22T348 65Q350 74 353 354ZM115 36Q115 47 105 57T79 67Q73 67 67 66T52 56T44 34Q44 9 62 -8Q66 -11 71 -15T81 -22T86 -24L90 -13Q100 3 102 5Q115 22 115 36",120130:"22 666Q22 676 33 683H351L358 679Q368 665 358 655Q351 648 324 648Q288 645 280 637Q275 631 274 605T273 477L275 343L382 446Q473 530 492 553T512 599Q512 617 502 631T475 648Q455 651 455 666Q455 677 465 680T510 683H593H720Q732 676 732 666Q732 659 727 654T713 648Q670 648 589 581Q567 562 490 489T413 415Q413 413 554 245T711 61Q737 35 751 35Q758 35 763 29T768 15Q768 6 758 -1H624Q491 -1 486 3Q480 10 480 17Q480 25 487 30T506 35Q518 36 520 38T520 48L400 195L302 310L286 297L273 283V170Q275 65 277 57Q280 41 300 38Q302 37 324 35Q349 35 358 28Q367 17 358 3L351 -1H33Q22 4 22 16Q22 35 60 35Q101 38 106 52Q111 60 111 341T106 632Q100 645 60 648Q22 648 22 666ZM240 341V553Q240 635 246 648H138Q141 641 142 638T144 603T146 517T146 341Q146 131 145 89T139 37Q138 36 138 35H246Q240 47 240 129V341ZM595 632L615 648H535L542 637Q542 636 544 625T549 610V595L562 606Q565 608 577 618T595 632ZM524 226L386 388Q386 389 378 382T358 361Q330 338 330 333Q330 332 330 332L331 330L533 90Q558 55 558 41V35H684L671 50Q667 54 524 226",120131:"12 666Q12 675 24 683H333L340 679Q350 665 340 655Q333 648 309 648Q287 646 279 643T266 630Q264 623 264 346Q264 68 266 57Q274 40 284 35H340Q413 37 460 55Q514 78 553 117T602 197Q605 221 622 221Q629 221 634 215T640 201Q638 194 625 105T611 12Q611 6 600 -1H24Q12 5 12 16Q12 35 51 35Q92 38 97 52Q102 60 102 341T97 632Q91 645 51 648Q12 648 12 666ZM137 341Q137 131 136 89T130 37Q129 36 129 35H237Q235 41 233 48L229 61L226 339Q226 621 229 628Q230 630 231 636T233 643V648H129Q132 641 133 638T135 603T137 517T137 341ZM580 48Q580 59 583 74T586 97Q586 98 585 97T579 92T571 86Q549 64 513 43L500 35H577L580 48",120132:"18 666Q18 677 27 680T73 683H146Q261 683 266 679L465 215Q469 215 566 443Q663 676 668 681Q673 683 790 683H908L915 679Q924 664 915 655Q912 648 897 648Q851 639 835 606L833 346Q833 86 835 79Q838 69 849 58T873 41Q877 40 887 38T901 35Q926 35 926 16Q926 6 915 -1H604L597 3Q588 19 597 28Q600 35 615 35Q660 42 673 68L679 79V339Q679 409 679 443T679 520T679 580T677 597Q646 521 584 375T473 117T424 3Q416 -1 410 -1T401 1Q399 3 273 301L148 599L146 343Q146 86 148 79Q152 69 163 58T186 41Q190 40 200 38T215 35Q226 35 235 28Q244 17 235 3L228 -1H28Q17 4 17 17Q17 35 39 35Q84 42 97 68L104 79V639L88 641Q72 644 53 648Q34 648 26 651T18 666ZM457 166Q451 169 449 171T435 198T404 268T344 412L244 648H157L166 637Q169 633 293 346L413 66Q424 88 435 117L457 166ZM817 646Q817 648 766 648H715V72L708 57Q701 45 697 41L695 37Q695 35 757 35H819L813 46Q802 61 800 76Q797 105 797 346L799 612L804 626Q812 638 815 641L817 646ZM124 42Q119 42 119 38Q119 35 128 35Q132 35 132 36Q125 42 124 42",120134:"131 601Q180 652 249 676T387 701Q485 701 562 661Q628 629 671 575T731 448Q742 410 742 341T731 234Q707 140 646 81Q549 -19 389 -19Q228 -19 131 81Q57 155 37 274Q34 292 34 341Q34 392 37 410Q58 528 131 601ZM568 341Q568 613 437 659Q406 664 395 665Q329 665 286 625Q232 571 213 439Q210 408 210 341Q210 275 213 245Q232 111 286 57Q309 37 342 23Q357 19 389 19Q420 19 437 23Q469 38 491 57Q568 132 568 341ZM174 341Q174 403 177 441T197 535T249 639Q246 639 224 627T193 608Q189 606 183 601T169 589T155 577Q69 488 69 344Q69 133 231 52Q244 45 246 45Q248 45 246 48Q231 69 222 85T200 141T177 239Q174 269 174 341ZM708 341Q708 415 684 475T635 563T582 610Q578 612 565 619T546 630Q533 637 531 637Q530 637 530 636V635L531 634Q562 591 577 543Q602 471 602 341V316Q602 264 599 230T580 144T531 48L530 47V46Q530 45 531 45Q533 45 547 52T583 75T622 105Q708 195 708 341",120138:"54 238Q72 238 72 212Q72 174 106 121Q113 110 132 90T166 59Q221 23 264 23Q315 23 348 41Q368 50 384 79Q393 102 393 129Q393 181 356 219T221 299Q120 343 74 390T28 501Q28 561 55 610Q98 682 212 699Q214 699 231 700T261 701Q309 698 340 687T408 675Q431 678 445 690T465 702Q474 702 481 690V497L477 490Q464 481 450 490Q446 500 446 501Q446 546 386 606T260 666Q215 666 182 639T148 565Q148 528 186 496T319 428Q352 414 370 405T418 379T468 338T506 284Q528 239 528 191Q528 102 456 46T266 -10Q211 -10 176 2T110 15Q86 9 73 -1T53 -12Q44 -12 37 -1V112V182Q37 214 40 226T54 238ZM446 619Q446 648 444 648Q439 646 435 644Q425 644 415 639H404L417 624Q435 606 439 601L446 592V619ZM124 619L128 635Q126 635 108 617Q64 576 64 502Q64 489 65 479T76 449T102 414T150 376T228 335Q335 291 381 245T427 128Q427 94 419 75L415 61Q421 61 448 88Q490 127 490 190Q490 233 475 264Q456 299 430 321Q402 349 369 367T287 404T204 441Q138 481 119 526Q113 544 113 565Q113 596 124 619ZM75 43Q76 43 90 46T110 50H119L106 64L74 101Q72 101 72 72T75 43",120139:"33 672Q36 680 44 683H624Q632 680 635 672V490L631 483Q621 479 617 479Q611 479 606 485T600 499Q600 525 584 552Q577 567 558 588T524 617Q479 642 426 646L415 648V355Q415 62 422 52Q425 42 434 40T473 35Q500 35 509 28Q518 17 509 3L502 -1H166L160 3Q149 17 160 28Q167 35 195 35Q224 37 234 39T249 52Q253 66 253 355V648L242 646Q192 642 144 617Q129 609 110 588T84 552Q69 527 69 499Q69 490 64 484T50 478Q39 478 33 490V672ZM113 639L126 648H69V597L84 612Q93 623 113 639ZM389 35Q382 46 381 86Q380 134 380 350V648H289V350Q289 199 288 131T286 53T280 35H389ZM600 597V648H542L555 639Q575 623 584 612L600 597",120140:"16 666Q16 677 28 683H341L348 679Q359 665 348 654Q342 648 315 648Q270 644 266 632Q262 627 262 598T261 399Q261 372 261 325T260 260Q260 149 274 99T339 30Q355 25 393 25Q430 25 457 33T494 49T519 72Q562 115 575 205Q576 219 576 379Q576 538 575 550Q568 597 550 622T506 648Q498 648 493 654T487 667T499 683H697Q709 675 709 667T704 654T690 648Q653 648 633 597Q624 573 622 546T619 377Q617 193 613 174Q596 95 544 41Q477 -19 355 -19H344Q275 -16 226 5T153 57T120 110T106 154Q101 172 99 399Q99 618 95 632Q88 644 53 648Q16 648 16 666ZM228 639L233 648H128Q128 647 133 632Q135 621 135 412Q135 197 137 185Q148 115 181 79Q209 51 235 41Q242 36 258 31T277 25Q276 27 268 38T254 59T241 92T228 145Q226 161 226 399Q226 632 228 639ZM604 621Q606 626 619 648H577L586 634Q587 632 591 625T595 614L597 608L604 621",120141:"316 683Q327 676 327 666Q327 648 302 648Q272 642 258 628Q249 621 249 608Q252 589 263 556T289 485T322 406T357 325T388 256T411 205L420 185Q423 185 473 317Q547 497 547 590Q547 621 541 632T516 648Q501 648 498 654Q488 664 498 679L504 683H607H660Q695 683 707 680T719 667Q719 660 714 654T700 648Q678 648 658 628L642 614L513 301Q484 231 449 148T397 25T380 -15Q373 -20 368 -20Q361 -20 358 -15Q354 -13 287 135T149 438T67 610Q45 648 18 648Q11 648 6 653T0 666Q0 677 9 680T59 683H164H316ZM216 614Q216 620 216 622T216 628T216 633T217 635T218 638T219 640T221 644T224 648H84L96 632Q118 592 236 330L367 43L387 88L404 132L380 185Q250 468 222 568Q216 590 216 614ZM576 645Q584 628 584 597L587 568L598 597Q609 624 618 637L624 648H600Q576 648 576 645",120142:"785 664Q785 670 795 683H982Q994 675 994 665Q994 650 975 648Q953 643 939 619Q931 593 823 292T710 -15Q706 -19 699 -19T688 -15Q682 -6 639 107T555 328T513 437Q513 438 500 409T462 325T413 212Q315 -14 310 -17Q308 -19 302 -19T288 -15L57 619Q45 643 24 648Q5 650 5 665Q5 677 17 683H146H200Q256 683 270 681T285 666Q285 659 280 654T268 648Q253 648 239 634Q230 630 230 619Q230 598 264 481L362 192Q363 193 428 341T493 492Q493 496 473 546T446 608Q426 648 399 648Q392 648 387 653T382 667Q382 678 393 683H679Q690 670 690 665Q690 662 685 655T673 648Q653 648 633 632L622 625V610Q626 576 657 479T719 300T751 218Q754 218 779 294Q847 492 847 581Q847 648 802 648Q796 648 791 652T785 664ZM194 623Q194 630 199 648H82L90 632Q99 616 199 332L302 50Q303 50 322 94T342 141Q342 142 305 245T231 467T194 623ZM585 620Q585 634 593 648H530Q466 648 466 645Q479 632 595 323L699 54Q701 56 718 103T735 154L702 245Q585 562 585 620ZM884 572L890 587Q896 602 903 620T915 645Q915 648 893 648H868L875 634Q883 598 883 576Q883 572 884 572",120143:"22 666Q22 677 31 680T80 683H184H335Q346 675 346 667Q346 660 341 655Q335 648 315 648Q280 644 273 637Q273 630 300 583T356 492T386 448Q430 504 450 535T474 577T478 601Q478 620 469 634T444 648Q428 648 428 666Q428 678 436 680T488 683H559H630Q673 683 681 681T690 666Q690 648 673 648Q652 648 619 637Q571 615 517 550Q490 517 450 464T410 408Q415 399 501 273T617 106Q648 61 661 48T688 35Q705 35 705 16Q705 5 695 -1H539Q384 -1 379 3Q373 10 373 17Q373 27 380 31T408 35Q459 40 459 49Q459 59 418 129T335 259Q334 260 332 260Q328 260 273 197Q210 127 208 117Q199 104 199 82Q199 57 213 46T239 35Q247 35 252 29T257 15Q257 10 256 7T253 3T248 0L246 -1H28Q16 7 16 15T21 29T35 35Q61 35 117 88Q289 279 304 297Q307 303 255 377Q117 586 79 626Q60 648 39 648Q32 648 27 653T22 666ZM237 639V648H173Q113 647 113 646Q113 642 137 612Q186 546 302 373T453 139Q497 63 497 43Q497 39 495 35H559Q622 35 622 37Q622 38 583 94T486 233T373 399T277 552T237 639ZM553 637L566 648H504L508 637Q510 630 515 615V603L528 615Q529 616 539 625T553 637ZM170 46Q169 49 167 58T164 70V83L137 59L113 35H175Q175 38 170 46",120144:"16 659T16 667T28 683H295Q306 676 306 666Q306 648 284 648Q258 648 255 641Q255 634 265 615T339 479Q418 339 421 339L455 394Q489 448 523 502L557 557Q560 566 560 582Q560 637 504 648Q489 648 486 655Q475 664 486 679L493 683H693Q704 675 704 667Q704 650 684 648Q672 645 653 623Q633 604 614 576T517 426L439 301V183Q442 62 444 59Q449 35 504 35Q521 35 528 30Q538 16 528 3L521 -1H195L188 3Q178 16 188 30Q195 35 213 35Q266 35 273 59Q274 61 277 163V261L75 621Q64 638 58 643T37 648Q28 648 22 653ZM219 637V648H101Q110 634 215 446L313 270V166Q310 59 306 48L301 35H415L410 48Q404 65 404 175V290L317 443Q230 601 226 612Q219 625 219 637ZM608 630L624 648H575Q584 632 588 623L595 610L608 630",120172:"821 97Q822 97 824 88T827 77L793 53Q676 -25 670 -28Q669 -29 656 -27L583 123Q583 124 467 46L352 -31L341 -20Q305 18 264 47T192 77Q161 77 60 32L49 40Q37 47 38 49Q39 49 93 83T212 160T297 219Q411 312 411 452Q411 519 360 571T233 624Q180 624 157 601T133 548Q133 524 160 496T214 441T241 393Q241 356 199 321T100 256L86 249L77 256Q68 263 67 263L84 274Q101 286 118 304T135 339T109 384T56 446T29 504Q29 566 118 624Q207 686 309 686Q349 686 360 685Q405 678 439 661T491 625T520 583T534 543T537 511Q537 436 491 344L478 318L455 299Q420 272 308 179L284 160L294 158Q348 154 426 89L437 79Q513 110 579 153V175Q579 183 579 227T580 330T581 446T582 542L583 582L664 630Q681 640 703 653T734 673L744 679Q750 678 756 676L767 674L716 623V585Q716 568 712 463T708 289V250Q708 237 709 218T710 195L711 180L739 130Q768 79 771 79Q775 79 796 88T821 97",120173:"160 345Q160 357 144 376T109 413T73 458T57 509Q57 544 95 584Q142 631 205 657T331 684Q382 684 427 658T500 585L505 577L521 588Q537 599 562 614T616 646T679 673T738 684Q790 684 807 666T840 587Q850 552 863 532T888 508Q894 505 906 505Q917 505 930 507T953 512T963 514L964 504Q965 495 965 494T914 467T808 413T745 384H751Q782 380 802 377T854 362T904 334T937 287T951 217Q951 178 937 143T908 91Q903 86 820 34L734 -21L718 -24Q679 -31 639 -31Q561 -31 451 4T271 40Q190 40 119 -2L99 -13L91 1L84 15L86 16Q88 18 132 42T233 100T315 152Q377 199 386 233Q388 240 393 297T399 363Q399 487 353 551Q337 573 306 597T238 622Q201 622 179 602T157 557T214 476T272 396Q272 371 229 334T143 272T96 246Q95 246 85 252T74 259T95 273T138 306T160 345ZM529 443Q529 409 528 385T526 353L525 346Q526 346 649 390T773 435Q749 451 742 464T727 518Q727 519 725 532T721 548T717 562T712 577T706 589T698 601T688 608T675 614T658 616Q626 616 576 582T525 528Q525 527 526 518T528 489T529 443ZM772 57Q774 57 778 58T792 64T808 77T821 103T827 144Q827 222 784 266T660 322Q652 323 611 323H596Q577 323 535 316L523 314Q520 291 505 255L500 241L356 138L366 137Q443 131 518 110T650 72T748 54Q763 54 772 57",120174:"460 -32Q373 -32 305 -11T193 45T122 124T83 214T72 303Q72 395 114 476L119 486L313 592L338 568L359 580Q418 615 479 638T568 668T606 675Q607 675 608 676H610Q612 676 615 661T630 621T660 578Q673 568 694 568Q717 568 721 570H726Q724 565 722 559L717 549L706 545Q608 513 583 513Q568 517 559 522T533 546T493 603L490 609Q452 599 452 558Q452 537 469 481T486 393Q486 353 474 331T422 285T296 231L272 223L262 230L253 237Q279 246 314 274T351 338Q351 376 334 442T316 532Q316 546 319 552Q319 554 316 554Q304 554 288 547T250 523T214 466T199 371Q199 218 299 133T541 47Q571 47 585 51T652 81L712 108Q716 104 716 81L706 74Q695 68 673 54T633 29L550 -22L540 -24Q492 -32 460 -32",120175:"380 596Q307 596 250 582T158 546T100 493T67 433T56 373V361Q55 361 43 366L31 372V384Q31 455 69 523T173 627Q213 650 284 666T444 683H452Q629 683 735 629Q896 548 896 369Q896 263 839 163Q835 155 818 140Q746 82 662 27T563 -29Q525 -29 386 16T183 62Q147 62 127 52T63 1L48 -14L40 -4L31 5Q83 73 172 149L186 161H199Q291 161 329 181Q357 199 357 231Q357 258 301 316T245 396Q245 423 282 458T349 512T403 543L413 548L425 545L438 541Q373 491 373 462Q373 446 399 415T453 349T480 288Q480 251 433 212Q394 180 348 156L334 148L353 145Q408 134 513 105T654 76Q711 76 745 132T780 277Q780 434 676 517Q637 549 562 572T380 596",120176:"527 55Q574 55 619 69T691 97L717 111V85L562 -18Q520 -29 443 -29Q379 -29 325 -15T235 21T180 61T146 98Q74 186 74 307Q74 395 109 472Q113 482 123 489T190 533Q251 568 295 591L308 598L350 580L361 586Q403 612 464 636T564 673T609 686Q610 686 610 685Q612 683 616 670T627 636T646 601Q666 572 686 572H692Q713 572 726 576H728L725 565L723 554L692 544Q660 535 629 526T595 516Q585 514 574 519Q563 527 543 552T507 597T490 617Q467 604 456 579V564Q456 535 473 471T492 393L494 381L613 460L622 446Q630 433 650 411T696 371L703 365L614 312H596L580 322Q568 329 553 340T528 355T510 360Q496 358 491 354T484 345T471 326T435 297Q408 278 370 261T307 235T277 227Q273 227 266 234L256 240L267 245Q280 251 294 258T330 288T353 336Q353 373 335 444T316 530V537Q316 549 322 567Q270 554 233 499T196 370Q196 253 287 157Q392 55 527 55",120177:"424 522Q265 596 208 596Q193 596 180 593T150 579T116 542T89 474Q86 465 86 463L59 481L63 494Q87 578 137 627Q191 684 285 684Q334 684 406 658T538 607T621 581Q644 581 706 629L721 640Q722 640 725 630L727 620Q701 592 654 548T582 486L569 487Q533 490 485 504L468 508Q449 503 429 495T387 466T365 422Q365 373 439 299L453 310Q473 325 528 370L588 418Q614 398 642 368T668 331Q667 331 628 296L590 262L582 274Q557 311 526 311Q511 311 487 297T462 278Q462 277 492 244T551 166T581 88Q581 54 570 25T536 -27T505 -56T478 -76Q376 -146 274 -146H270Q199 -146 162 -118T124 -15Q124 12 128 30T132 96V107Q132 144 117 157Q102 169 85 169Q74 169 59 165T32 156T20 151Q20 152 19 158T17 167Q17 168 17 168T17 169T19 170T22 172T27 175T35 179Q131 230 195 230Q231 230 259 202Q270 190 270 171Q269 150 253 87T236 -16Q236 -67 261 -87T322 -107Q380 -107 428 -68Q467 -35 467 30Q467 60 447 91T383 171T316 251Q290 286 278 308T263 339T261 359Q261 384 284 418Q322 469 424 522",120178:"742 611Q784 611 812 631V611Q807 607 783 591T718 544T629 476L606 458Q608 458 628 457T667 453T713 443T762 423T804 388T836 335Q844 313 844 289Q844 231 814 182T746 103Q720 82 655 48T546 -18L520 -21Q456 -29 432 -29Q313 -29 223 33Q204 45 183 65T135 119T91 207T74 320Q74 428 109 480Q116 491 127 497T215 546L308 595L343 583L355 591Q387 613 433 636T488 660H489L491 659Q493 658 495 657T500 655L509 650L500 645Q479 635 460 612T441 552Q441 535 447 498T459 433T466 405L625 513L643 526Q620 530 585 546T535 586Q535 587 532 592T527 602T525 610Q525 613 577 649L630 687Q632 687 638 675T653 649T686 623T742 611ZM349 313Q349 328 327 413T305 510V516Q305 531 308 542T314 559T317 566T315 567Q297 567 270 548Q233 524 212 490T191 392Q191 337 206 288T244 207T284 156T316 128Q410 51 535 51Q632 51 675 102T718 217Q718 269 690 314T599 375Q574 381 535 381Q501 381 477 377L466 376Q469 364 469 349Q469 314 457 295T408 258Q366 236 308 219L288 213L279 220L270 227Q284 232 294 236T309 243T320 252T326 260T331 270T336 281Q349 310 349 313",120179:"288 139Q288 172 255 224T189 335T156 442Q156 495 242 579Q289 625 361 668Q364 671 368 673T376 678T380 681L384 683L392 676Q401 670 414 661T443 642T477 626T509 619Q543 619 618 668Q625 672 628 674T631 675Q632 673 633 663T633 651L564 595Q556 589 545 580T528 566T516 556T505 548T497 543T488 539T481 537T472 535T463 534T451 534H442Q385 534 304 581L291 589Q290 588 285 583T277 575T269 566T262 555T257 543T255 529V522Q255 507 260 487T276 446T293 409T311 376L321 359Q321 358 322 358T324 359T327 361T333 366Q386 409 481 460L503 472L543 471Q586 471 599 470Q692 459 714 430Q725 416 738 360T752 245Q752 184 742 127T725 51T703 -8Q700 -13 619 -64T518 -123Q508 -126 493 -126Q438 -126 398 -86L427 -52Q456 -17 457 -17Q460 -17 465 -16H473Q474 -21 481 -32T504 -56T539 -69Q572 -69 599 -34Q625 4 625 158Q625 264 609 311T532 378Q508 386 484 386Q455 386 419 372T360 345T337 330L346 313Q375 263 386 227Q389 215 389 202Q389 192 388 184T384 168T376 152T365 138T350 121T331 103T307 81T278 54L194 -24Q130 30 99 30Q85 30 64 20T31 1T16 -10Q15 -11 13 -7Q12 -6 11 -3Q8 4 6 8L32 35Q88 88 117 107T169 126Q177 126 182 125Q218 118 252 84L263 73Q288 113 288 139",120180:"500 615Q523 615 550 628T595 655T614 668L623 654L607 642Q512 569 440 534L427 527L413 529Q384 535 340 547T265 565T209 572Q173 572 145 556T101 522T60 465Q58 460 54 460T41 468L32 477L37 487Q96 599 139 640Q187 681 247 681Q275 681 283 680Q313 674 398 645T500 615ZM418 170Q418 186 410 260T401 382Q403 418 403 424L405 433L415 444Q482 515 571 571L582 578Q591 573 607 568L597 560Q522 504 522 450Q522 427 533 357T545 241V228Q545 190 536 159T508 106T478 73T446 48Q343 -25 238 -25Q179 -25 118 15L107 22L79 5Q51 -12 51 -12L38 2L55 18Q106 67 175 122L192 136Q202 130 206 123Q223 91 252 61Q263 50 266 48T278 39T297 32T320 30Q357 30 389 68Q415 102 418 170",120181:"65 510Q68 517 74 528T101 569T144 620T202 661T274 680Q308 680 389 628T503 576Q530 576 596 600Q615 607 616 607Q616 602 615 596V585Q605 581 576 568T531 548T485 531T418 509L400 503L358 522Q347 527 327 537T299 550T277 560T257 568T239 573T220 577T201 578H196Q181 578 169 575T135 554T88 502L83 496Q82 496 74 502T65 510ZM424 4Q424 50 395 151T365 313V320Q365 352 369 361T405 403Q431 432 465 462T521 508T547 525L549 524Q551 524 554 523T560 521L571 517L552 498Q515 461 499 430Q485 399 485 366Q485 326 512 231T539 84Q539 -14 460 -77T273 -141Q248 -141 234 -140T198 -131T160 -106T134 -59Q128 -40 124 -16T117 22T108 49T91 69T59 75T15 65L1 59Q-8 76 -7 77Q4 85 22 97T88 129T170 149Q218 149 234 125Q242 112 242 43V21Q242 -17 248 -41T274 -85T322 -105H325H330Q363 -105 396 -75Q424 -47 424 4",120182:"234 109Q234 144 194 245T153 404Q153 445 180 490Q232 572 325 626T517 681H524Q612 681 661 658Q683 647 699 632T717 604Q717 600 708 545L699 490L690 489Q681 488 679 488Q675 488 669 504T640 546T577 592Q520 620 446 620Q415 620 386 614T327 594T280 553T262 487Q262 468 265 447T271 413T279 384T285 362L295 371Q320 396 352 421T439 474T538 502Q577 502 596 484T627 428Q642 386 651 373T677 360H682Q698 360 727 369L724 357Q724 354 724 351T722 346V344Q559 289 539 283Q582 272 589 271L615 265L637 189Q662 109 663 108Q668 97 682 84Q698 68 722 68H730H738Q762 68 799 91L803 80L806 70Q795 59 770 40T703 -3T631 -26Q598 -26 578 -8Q548 24 536 92Q524 154 509 183T477 218T428 224Q409 224 385 220T346 212L331 207Q330 205 330 201T331 189T332 178Q332 158 325 116L305 96Q269 60 240 38Q171 -21 123 -21Q72 -21 33 18L20 32L62 74Q96 107 102 112T116 118Q120 118 122 113T131 95T150 69Q171 48 190 48Q198 48 206 51T224 69T234 109ZM519 367Q497 432 450 432Q379 432 313 333L300 314L304 299Q306 294 309 280T315 260L321 235L542 313Q530 325 519 367",120183:"277 226Q277 248 253 286T203 369T178 449Q178 490 212 533T284 607Q380 683 532 683Q610 683 639 660T668 583Q668 568 666 546T663 509Q663 478 683 460Q691 452 719 452L738 450Q732 437 729 437Q728 437 652 416T573 394Q554 394 541 409T527 444Q527 449 532 487T538 542Q536 584 501 606T418 628Q389 628 364 620T317 587T295 523Q295 478 333 401T372 276Q372 269 371 267Q371 264 318 206L264 149Q284 141 317 130T433 101T577 82Q619 82 652 95T701 127T728 164T742 196L744 209Q744 210 749 208T759 203T764 199T760 185T751 154T744 129Q714 42 680 13Q628 -28 566 -28Q490 -28 403 -5T249 42T153 66T106 53T70 15T47 -16Q46 -17 30 -5L39 13Q85 100 138 148L147 156L161 157Q218 165 246 179T277 226",120184:"134 338Q134 357 81 417T27 504Q27 516 34 530Q55 568 110 615Q190 683 305 683H314Q445 683 495 580L501 569L512 577Q608 646 681 646Q759 646 801 585L808 576L816 583Q860 619 921 650T1041 682Q1063 682 1077 675T1096 660T1112 631T1132 596Q1160 555 1188 555Q1204 555 1228 564Q1230 565 1231 562Q1231 560 1232 554V547L1215 538Q1179 521 1114 475Q1112 474 1106 470T1099 464T1093 459T1088 452T1085 441T1082 425T1081 404T1079 376T1079 339Q1079 282 1084 236T1098 160T1117 112T1138 85T1159 77Q1166 77 1180 81T1207 90L1219 94Q1220 94 1221 86T1222 76L1045 -32Q1044 -32 1004 15L964 64V167Q965 334 970 372V378L994 402Q1032 440 1057 460Q1061 463 1066 467Q1070 469 1070 470T1068 471T1060 474T1050 481Q1040 488 1021 531T996 583Q979 609 947 609Q922 609 887 592T820 537L821 524Q825 484 825 448Q825 268 768 155L759 137L589 -28L579 -20Q533 17 507 17Q475 17 449 -7L436 -18L424 2L441 20Q446 25 456 36T471 52T484 65T497 79T509 90T522 99T534 106T548 112T561 115T576 117Q602 117 639 86Q648 81 648 81Q650 82 657 94T668 112Q711 202 711 373Q711 484 677 533T600 583Q592 583 583 581T569 577T554 568T542 560T528 549T516 539L519 523Q527 485 527 461Q527 444 522 407Q506 266 447 150L437 130L217 -25L208 -15Q165 28 126 28Q89 28 62 1Q47 -14 43 -14Q42 -14 36 -8L28 0L44 17Q96 73 120 92T166 117Q182 123 204 123Q239 123 284 78L295 67Q307 72 337 102Q400 178 400 346Q400 508 325 571Q270 618 208 618Q180 618 168 614T140 594Q124 578 124 564Q124 540 182 480T240 396Q240 359 197 321Q154 285 94 252L80 245L76 248L67 257L61 262L71 268Q82 275 94 284T120 309T134 338",120185:"522 492Q521 492 517 502T512 513Q542 444 542 333Q542 226 503 137L498 125L396 53Q308 -8 292 -17T260 -27Q226 -27 191 -9T136 29L145 39Q162 56 192 89L230 129L235 128H241Q276 57 332 57Q358 57 391 80Q403 89 409 100T422 143T428 227Q428 329 406 408T347 530T272 594T196 615Q152 615 135 596T118 558Q118 535 146 502T203 438T232 385Q232 357 195 322T122 265T83 243Q82 242 72 249T61 258L66 262Q72 265 82 273T103 292Q125 314 125 333Q125 351 101 376T51 432T26 492Q26 549 108 614T290 679Q326 679 335 678Q353 675 370 670T400 658T425 642T445 625T463 606T477 588T487 571T495 556T500 543L504 535L523 553Q553 581 569 595T619 632T686 667T757 678Q778 678 793 675T819 664T833 651T844 633T852 617Q884 548 910 548H916Q938 548 962 556L967 542Q967 540 947 531Q909 509 883 492T847 467T838 458Q825 419 825 328Q825 234 833 191T858 121Q875 94 892 77Q898 71 907 71Q912 71 928 76T957 87T971 91L972 88Q972 84 972 81L973 73L957 63Q891 21 806 -23L794 -30L783 -14Q766 13 728 60L713 79V372L724 384Q743 406 765 427T800 460L813 471Q809 472 806 472Q783 479 766 503T741 551T715 594T672 614Q644 614 622 595Q597 576 572 550T534 508L522 492",120186:"254 595Q269 583 269 581L262 577Q256 573 247 566T228 549T212 527T205 502Q205 480 266 386T328 277Q328 234 239 150L221 134L231 133Q264 131 376 99T516 62Q567 50 604 50Q614 50 626 52Q643 57 662 71T703 115T739 198T753 323Q753 454 692 517Q652 555 584 565T382 577Q365 577 357 577H308L300 591L292 606Q292 608 342 665L392 724L403 725Q406 725 411 726H416L417 725L412 715Q408 705 408 698Q408 684 423 679Q431 677 516 672T663 655Q757 634 806 593T873 463Q881 421 881 380Q881 340 874 306Q859 223 809 147Q801 134 789 124Q595 -30 456 -30Q395 -30 289 3T147 36Q134 36 121 33T98 26T76 15T59 4T44 -8T32 -17L22 -7L12 4L56 59L100 114L116 118Q217 142 217 199Q217 230 185 276T120 365T87 430Q87 435 109 464T172 534T254 595",120187:"247 398Q247 372 206 334T126 272T83 247Q82 247 72 253T61 261Q60 261 61 262T66 265Q127 306 127 343Q127 364 63 430Q42 451 38 458T33 480V490V497Q33 526 63 567Q112 632 170 660T282 688Q341 688 384 667Q454 633 482 566Q483 565 484 566T496 574Q562 623 630 653Q699 681 751 681Q778 681 797 673Q818 662 830 609Q835 580 843 564Q863 524 895 524H901Q917 524 932 528Q936 522 938 518T942 513T942 511Q873 480 836 454Q789 423 789 395Q789 362 834 298T880 200Q880 170 867 145T820 81Q733 -20 647 -20Q581 -20 499 21V9Q499 -16 502 -53T509 -116L512 -141L370 -223L357 -216Q344 -209 344 -208L348 -196Q370 -113 370 33V52L355 58Q307 76 284 76Q258 76 228 60T183 29T141 -11Q137 -7 133 -2L126 7L134 18Q181 89 210 121T278 170Q304 179 328 179Q336 179 358 177L370 175Q368 268 367 359Q367 416 363 434Q362 438 362 441Q348 527 302 574T203 621Q169 621 148 599T127 557Q127 535 187 476T247 398ZM673 315Q673 357 786 442Q786 443 776 444T750 449T727 462Q719 471 716 484V496Q715 507 715 515Q715 571 698 588Q680 611 643 611Q592 611 547 571Q534 558 511 522L499 505V139L543 123Q702 64 744 64Q770 64 781 79T793 112Q793 143 733 217T673 315",120188:"254 595Q269 583 269 581L262 577Q256 573 247 566T228 549T212 527T205 502Q205 480 266 386T328 277Q328 234 239 150L221 134L231 133Q264 131 376 99T516 62Q567 50 604 50Q614 50 626 52Q643 57 662 71T703 115T739 198T753 323Q753 454 692 517Q652 555 584 565T382 577Q365 577 357 577H308L300 591L292 606Q292 608 342 665L392 724L403 725Q406 725 411 726H416L417 725L412 715Q408 705 408 698Q408 684 423 679Q431 677 516 672T663 655Q757 634 806 593T873 463Q881 421 881 380Q881 340 874 306Q864 250 838 196T791 126Q748 93 733 82L715 69Q714 68 723 60T748 40T774 23Q806 2 832 2Q849 2 870 6T904 14L917 17Q917 12 918 6V-3L882 -22Q806 -60 778 -73L755 -83Q640 -36 596 -7L586 0L576 -4Q513 -30 457 -30Q394 -30 289 2T149 35Q119 35 93 22T52 -4T36 -17T24 -7T12 4L56 59L100 114L116 118Q217 142 217 199Q217 230 185 276T120 365T87 430Q87 435 109 464T172 534T254 595",120189:"31 498Q34 541 76 586T176 659T279 688H290Q377 688 429 653T506 569L511 558L526 572Q620 663 707 682Q722 685 737 685Q781 685 804 665T830 619T838 565T854 525Q866 511 897 511Q917 511 925 513L937 515Q938 515 941 509T944 501T925 493T870 470T803 438Q735 406 735 401Q735 400 741 399T767 390T814 374L828 367L829 307Q829 233 833 202T852 144Q873 109 896 90Q906 82 928 82T976 95V92Q976 88 978 72L807 -28Q768 39 733 87L718 108V149Q718 230 714 257T693 298Q654 333 580 333Q524 333 520 329Q520 300 489 224T443 133Q441 131 333 53T223 -27Q221 -26 204 -11T169 16T136 28Q110 28 66 -8L56 -16Q52 -13 40 -1L48 7Q165 124 211 124Q232 124 287 77L298 67Q309 73 337 97Q397 150 397 347Q397 419 379 474T330 560T269 604T207 619Q177 619 152 601T126 563Q126 540 185 479T244 387Q240 336 160 289Q144 278 98 255L80 246L62 261L79 272Q96 283 113 301T130 337Q130 353 115 373T81 410T47 451T31 498ZM524 358Q537 358 657 405T777 457Q777 459 768 459Q749 462 738 474T723 499T714 539Q706 585 697 599Q681 618 657 618Q632 618 597 595T532 515L525 502L524 441Q524 375 523 369Q523 358 524 358",120190:"457 -31Q356 -31 272 6T135 120T82 304Q82 372 106 430T170 527T241 588T305 626Q341 643 386 657T460 678T495 685T554 660T674 609T778 584Q800 584 818 591T848 610T866 633T878 651T883 659L893 649L901 639Q879 574 803 532T666 490Q661 490 657 490T650 491T641 492T633 495T622 500T610 505T595 513T577 522T554 533T527 547Q436 594 415 602Q393 608 374 608Q303 608 253 545T202 386Q202 229 307 135T568 41Q674 41 748 85T822 198Q822 244 779 283T639 322Q595 322 499 303T383 283Q358 283 335 290T291 318T270 374Q270 418 313 460T424 510H431L435 505L440 500Q425 496 403 475T380 427Q380 382 431 373Q437 372 475 372Q543 372 626 388T742 404Q831 404 868 362T905 260Q905 182 831 108Q692 -31 457 -31",120191:"666 641Q737 641 794 686L802 662Q790 648 734 596L677 541L664 538Q630 528 583 528Q540 528 482 537L461 541Q402 512 402 456Q402 427 439 387T512 311T549 253Q549 220 455 139L440 126Q541 75 586 75Q600 75 619 80T654 94T685 110T709 124T719 130Q722 125 725 119L730 108Q700 72 568 -18Q551 -30 542 -30Q495 -30 404 6T270 42H263Q213 42 142 -11L131 -19L129 -8Q126 1 126 4Q218 84 301 126L316 134H406L413 142Q436 165 436 189Q436 202 421 221T364 281Q336 307 318 328T296 356T283 381L290 394Q338 478 410 540Q419 549 417 549Q415 550 369 558T268 575T195 584Q153 584 127 567T100 523Q100 499 116 479T151 447T170 433Q170 429 171 428Q171 427 131 394T88 359Q82 363 73 370T47 403T31 457Q31 513 79 565T197 648T332 679Q369 679 490 660T666 641",120192:"273 244Q273 281 244 331T186 428T155 502Q155 524 165 536Q239 634 333 688Q338 684 345 680L356 672L344 664Q310 642 295 624T280 582Q280 550 303 505T348 407T371 300Q371 270 362 248L247 123L358 92Q452 64 484 64Q507 64 523 72Q553 87 573 109Q583 121 586 146T593 283Q594 303 594 344Q594 401 591 461T584 558L581 595Q598 600 623 611T672 634T719 659T754 678L768 686Q770 686 784 673L782 670Q781 668 777 664T768 655Q747 635 738 616T721 535T714 359Q714 205 723 176Q727 164 744 133T771 89Q780 75 804 75Q814 75 853 87L867 92L871 73L671 -39L654 -10Q636 20 619 50T600 83Q600 84 589 75T539 34Q478 -16 475 -19Q469 -22 449 -28T414 -34Q410 -34 394 -32Q356 -28 282 -2L237 15Q169 38 126 38Q106 38 85 27T51 4T37 -8T27 -1T18 8Q18 10 70 63T124 116Q154 123 176 131T223 154T260 191T273 244",120193:"133 343Q133 360 79 416T25 496Q25 523 58 563T118 624Q197 685 293 685Q331 685 339 684Q453 665 489 558L493 546Q521 570 553 596T640 653T725 684Q753 684 783 672T844 641T889 618Q895 616 912 616Q924 616 936 617T956 620T965 622T966 612V604L952 595Q924 576 895 549Q864 517 856 496T847 448V434Q847 395 848 388L859 323Q874 241 874 212Q874 142 830 96Q796 62 724 14Q661 -29 603 -29Q555 -29 421 28T242 86Q182 86 110 31Q105 28 102 26T99 25Q88 36 88 42Q95 54 222 142Q252 163 262 165Q319 183 344 218Q378 266 378 377Q378 444 362 494T319 571T266 610T212 623Q181 623 156 603T131 562Q131 539 154 512T206 458T243 416Q246 409 246 399Q246 387 242 377T225 351T178 311T94 259L79 251Q72 256 68 261T62 268L61 270L70 277Q131 318 133 343ZM822 526Q778 531 719 564T628 597Q611 597 579 574Q543 543 513 506L505 495L506 473Q506 469 506 461T507 449Q507 348 467 271L462 261L404 218L348 174Q349 173 356 173Q384 169 450 144L546 105Q665 56 708 56Q737 56 746 72T756 118Q756 129 755 135L741 219Q725 314 725 334V344Q725 416 736 431Q748 450 815 510L832 526H822",120194:"133 317T133 338T80 413T26 496Q26 532 83 591Q100 608 111 616T151 644T219 672T304 682Q381 682 434 646T506 564L510 557Q513 557 534 573L677 665L707 683L790 561L803 572Q933 682 1001 682Q1037 682 1098 650T1193 616Q1208 616 1222 619L1235 622Q1239 622 1239 616Q1239 611 1240 609Q1240 608 1206 577T1138 503T1104 430Q1104 409 1123 330T1142 208Q1142 183 1136 147Q1127 118 1117 106Q1114 103 1031 48T935 -14Q930 -18 908 -22T862 -27Q826 -27 759 -6T647 26Q597 38 578 38Q573 38 561 33T533 20T505 4T480 -10L469 -16L452 -26L439 -28Q423 -30 411 -30Q358 -30 279 7T169 45Q125 45 58 -5L47 -14L41 -4L35 8Q35 11 56 29T113 75T181 125L200 139H217Q279 143 320 180T377 270T394 393Q394 453 378 498T334 568T277 605T213 617Q177 617 155 607Q140 600 130 587T119 560Q119 545 137 522T177 479T217 434T236 393Q236 324 98 251L89 246L76 253L63 261Q91 275 112 296ZM1088 526Q1066 526 1004 556T909 586Q863 586 816 539L802 526L804 514Q814 461 814 411Q814 319 781 238Q772 214 760 198T730 165T702 136L715 133Q759 122 848 90T973 57Q1003 57 1017 80Q1022 93 1022 116Q1022 152 1003 241T983 377V391Q983 405 985 409T1002 429Q1019 450 1045 475T1090 514L1107 528Q1104 527 1102 527T1096 527T1088 526ZM699 358Q699 391 696 419T688 467T675 503T660 530T642 550T626 563T608 574T593 582Q581 575 559 554T524 512Q523 510 523 477Q523 315 444 218L435 207L368 169Q301 132 301 131Q307 128 315 125L377 99Q476 57 515 57Q534 57 608 94L627 102L636 111Q699 187 699 358",120195:"273 679Q354 674 408 633T477 525L484 533Q496 548 524 574T571 615Q594 633 625 649T675 673T699 681Q724 632 747 607Q754 601 756 599T765 594T777 591T794 590Q818 590 834 594V585L835 577L704 513L693 518Q657 534 631 560T597 599Q596 601 581 584Q495 490 489 379V366H562L681 369Q682 369 679 366T668 355T651 341L620 314H485V295Q490 190 543 125T686 60Q720 60 789 88L801 93V89Q798 83 798 66Q781 59 685 -10L665 -25L634 -30Q596 -35 594 -35Q570 -35 536 -23T477 19Q461 37 445 67T418 118L409 138Q401 131 388 120T340 79T273 28T206 -12T151 -31Q129 -31 90 -12T32 22L113 101Q114 101 120 96T136 84T160 69T189 56T221 51Q256 51 305 90Q376 149 376 301V315H293Q276 315 251 315T210 314T190 313L168 312Q168 313 200 340L231 368L238 367Q275 367 311 366H378V387Q376 470 355 512T291 572Q274 579 252 579Q223 579 197 568T156 544T131 519T117 508Q112 512 108 518L99 527L117 545Q177 604 255 665L273 679",120196:"34 496Q34 518 53 549T107 610T195 661T310 682Q357 682 398 663T460 611Q467 600 475 583T489 554T495 542Q495 544 531 570T617 629T700 676L724 688Q742 670 756 657T784 635T806 621T830 606T856 592Q878 416 878 340Q878 154 805 -3L798 -20L779 -40Q706 -113 613 -163T421 -214Q359 -214 317 -196T256 -160L306 -63L313 -64L320 -66L326 -79Q337 -104 349 -120T392 -151T470 -166Q576 -166 644 -101Q750 7 750 292Q750 426 721 495T617 565H611Q563 565 513 509L506 501L508 493Q508 490 509 475T510 445Q510 319 458 236L451 225L436 216Q406 198 365 169T318 134L332 127Q336 126 397 103T489 80H493Q527 80 593 129L604 137L607 127Q610 119 610 116Q610 114 592 95T543 46T484 -4Q450 -27 446 -27Q441 -27 402 -18Q365 -9 290 20T188 50Q135 50 64 -7L52 -17L43 -7L34 2L51 19Q118 87 177 132L192 143H215Q259 145 289 155T335 184T355 214T366 245Q382 306 382 388Q382 426 381 436Q368 520 318 570T214 621Q184 621 165 608T142 583T137 562Q137 541 163 508L201 469Q245 425 251 408Q253 403 253 398Q253 383 240 366T212 335T161 295Q128 271 99 253L89 247L77 256L65 266L76 273Q125 301 134 329Q136 334 136 342Q136 357 124 372T88 410T49 455Q34 479 34 496",120197:"278 601Q242 601 212 591T167 570T121 533Q114 528 111 525L93 550Q223 661 244 667Q299 677 356 677Q415 677 456 666T515 634T541 596T549 555Q549 513 529 478T480 421T424 388T377 372Q365 370 365 367Q365 365 389 365T450 358T523 337T588 282T623 183Q624 177 624 161Q624 20 524 -60Q415 -148 285 -148Q242 -148 213 -139Q181 -131 159 -109Q136 -87 127 -56T114 6T104 49Q94 69 57 69Q38 69 13 58L1 53Q1 55 0 59T-3 68T-4 76Q78 130 138 142Q150 144 162 144Q213 144 227 120T242 31Q242 -30 263 -66T345 -102Q397 -102 444 -52T491 107Q491 172 471 211T428 265Q392 288 306 288Q269 288 233 284L218 282Q208 289 208 291L229 324L251 359Q250 360 248 360Q239 360 248 371L256 381H273Q344 385 378 409T413 495Q413 537 384 569T278 601",120198:"80 129V151Q80 241 99 363Q99 367 111 372T172 401T285 465L297 472Q340 455 405 443L423 440L455 453Q486 467 489 467L497 461L494 451Q480 390 480 292V283Q480 207 483 155L484 143L535 80L558 90L582 99Q586 95 586 83Q586 81 513 25L443 -29Q410 16 386 40L371 55V61Q371 63 371 67T370 74V80L278 25Q186 -29 184 -31Q182 -32 160 -12T112 35T80 75V129ZM359 366Q334 366 300 371T243 382L221 388Q218 388 212 375T200 323T194 228Q194 191 197 152L198 139L217 120Q245 92 269 74L279 66L304 78Q338 95 349 100L369 110V152Q368 164 368 210T367 275Q367 358 366 361V366H359",120199:"99 398Q99 610 86 662Q86 665 95 669T106 674L108 669Q109 664 112 654T119 635Q122 626 125 616T130 601L131 596Q214 649 273 678Q295 690 298 690Q299 690 304 688T313 682L317 679Q275 653 240 612Q210 569 210 469V459Q210 450 210 432T211 406L212 378L285 425Q301 435 321 447T350 466L360 472Q360 473 361 473T368 471T401 456T465 429L501 414V408Q504 386 504 309Q504 255 500 203T491 125T485 97Q485 95 445 74T343 23T237 -24L214 -32Q197 -22 165 3T109 49T87 73Q99 169 99 398ZM386 251Q386 320 380 347V350L305 374L282 382L214 348L213 274Q213 184 214 165V131L230 119Q288 76 349 54Q386 137 386 251",120200:"227 393Q215 393 210 351T205 269Q205 161 213 153Q220 145 244 125T290 88L312 72L365 92Q414 113 418 113V93L365 60Q255 -9 221 -26L211 -18Q158 21 91 88L90 107Q87 167 87 225Q87 267 90 302T96 351T100 366L295 473L311 470Q340 464 368 454T410 437T424 429L347 334L342 333H337L325 342Q299 363 271 378T228 393H227",120201:"88 117Q88 177 91 231T97 310T102 341Q102 343 118 357T168 397T239 447L257 459L268 454L278 449Q242 416 238 412L219 394Q219 391 216 378T211 349T206 307T203 249Q203 211 206 166L208 148Q224 132 261 108T333 70Q341 66 342 67T350 79Q393 157 393 302Q393 368 388 406V411L371 424Q199 558 101 558Q69 558 28 545L18 542L8 549L-1 557L24 569Q61 587 147 621L177 632Q179 631 194 627T216 621T240 613T269 602T302 589T340 571T382 549T431 522T484 488Q504 475 504 472Q511 449 511 365Q511 248 474 129L468 108L451 96Q427 77 347 28T254 -28Q235 -20 174 21T89 86L88 117",120202:"309 69Q391 98 416 108Q418 106 422 100T425 92Q419 86 326 30T229 -27Q228 -27 207 -13T154 27T97 76L85 87L84 106Q81 152 81 194Q81 295 93 359L95 369L286 471L313 449Q376 397 414 372L428 362Q428 360 375 318L188 181V170Q188 156 189 153V148L203 138Q228 119 266 94T309 69ZM209 389Q208 388 204 366T194 307T187 244Q187 225 188 225T201 233L245 261Q283 284 291 291Q324 313 324 316L296 334Q280 343 259 357T224 380L210 390Q209 390 209 389",120203:"128 400Q127 401 121 422T108 478T99 540V555L111 569Q135 597 165 626T214 671T235 687L249 678Q263 668 282 659T315 650Q335 650 362 666L372 654L286 569H271Q205 576 173 586V583Q173 558 208 492T252 401Q253 399 310 399T367 398L332 355H254V311Q251 160 235 16Q230 -28 226 -36Q225 -38 221 -45Q171 -140 121 -211L113 -222H104Q94 -222 94 -220Q94 -215 105 -187L121 -145Q139 -80 139 35V93Q139 222 135 314L134 354Q134 355 84 355H35L84 399H106Q128 399 128 400",120204:"92 71Q92 74 91 88T88 128T86 183Q86 230 91 275T102 342T109 366Q115 372 207 422T305 472Q407 426 431 426Q435 426 476 445L519 465L525 463L532 461Q497 392 497 268Q496 255 496 233Q496 179 516 92T539 -10L541 -22L526 -38Q441 -126 355 -194L339 -206L327 -207Q324 -207 319 -207T310 -208Q242 -208 171 -179T73 -131L56 -141Q40 -150 38 -150Q17 -140 17 -137Q17 -136 18 -136T98 -79L176 -23Q174 -21 134 24T92 71ZM226 393Q224 393 221 372T214 312T210 235Q210 182 214 144L215 132L230 118Q281 70 301 66Q304 66 331 80T373 105L384 112L383 165Q383 224 387 309Q387 314 387 319T387 329T388 336T388 341V343Q388 344 381 344T339 354T249 384Q246 385 243 386T236 389T231 391T228 392L226 393ZM414 -80Q414 -64 411 -43T403 -1T394 37T386 66T382 79Q381 79 286 15T189 -52Q312 -125 365 -125Q397 -125 405 -115T414 -80",120205:"95 661Q95 662 103 667T113 672L126 634L137 596L147 602Q235 656 275 677L292 687L303 680Q305 679 307 677T312 674L313 672L310 670Q307 669 301 667T289 660T274 649T259 634Q250 622 244 611T233 585T226 560T222 528T221 497T220 456T219 413V377L232 384Q244 391 271 409T339 455L362 471L383 461Q425 440 491 415L504 410V406Q507 399 507 269Q507 76 486 -21Q485 -30 483 -33T461 -57Q382 -139 299 -207L281 -197L263 -186L266 -185Q268 -184 280 -177T312 -155Q344 -130 353 -116Q394 -59 394 117Q394 162 391 216T386 301T382 335Q382 338 365 346T323 364T281 376L250 362Q220 347 219 347Q213 336 213 232Q213 177 217 144L218 128L224 119Q244 92 263 71L272 60Q206 21 157 -24Q156 -24 151 -16T132 11T98 52L89 62L91 103Q104 289 104 436Q104 471 103 506T101 568T99 616T96 649L95 661",120206:"73 613L164 686L184 666Q200 650 214 637T235 620T242 614T203 577T162 540Q158 540 122 570T73 613ZM92 58Q92 63 94 83T98 142T101 234Q101 318 97 358V366L59 387L40 379L21 371Q20 371 12 376T3 382L38 406Q78 431 125 466L138 477Q149 468 186 444L219 422V389Q215 324 215 247Q215 136 222 123Q226 113 238 98T258 83Q263 83 292 94L322 104Q322 103 324 97T327 89Q327 88 317 82T272 52T190 -7Q166 -25 164 -25L112 35Q92 55 92 58",120207:"74 611L155 682Q172 666 186 655T208 636L235 614Q227 606 191 574L154 540L135 556Q101 582 84 601L74 611ZM10 377L144 477Q145 476 184 453T229 428L233 425V416Q238 346 238 252Q238 93 215 -16L213 -30L185 -57Q29 -203 19 -203Q17 -203 -19 -189L-9 -183Q52 -146 78 -116T114 -37Q120 31 120 192V237Q120 327 113 351T72 380L53 372Q34 362 32 364L10 377",120208:"106 72Q110 105 111 193T114 294V308H74L34 309L83 346H115V430Q114 591 106 652Q105 662 107 665T114 668T123 672Q125 672 139 635L152 597L154 598Q156 600 160 602T167 607Q193 625 226 644T279 672T302 682L312 676L321 670L312 665Q281 649 263 626T241 587T233 547Q232 541 231 530T230 510T230 501Q231 501 265 522T334 564T369 583L380 570Q428 509 428 481Q428 475 427 470T423 459T416 448T404 434T389 418T369 397T344 371L321 347L365 346H409L372 308H227V294Q227 272 230 208T234 138Q234 136 256 119T302 84L324 68L372 88Q421 108 422 108T432 90L421 83Q373 53 270 -5L234 -25L204 -1Q172 25 124 60L106 72ZM336 434Q336 452 327 472T308 503T297 514Q296 514 290 510T275 499T264 490Q230 458 230 358V346H247Q268 346 276 350T302 372Q328 398 335 423Q335 424 335 428T336 434",120209:"111 275Q111 406 108 518T104 650V657Q105 657 109 660T117 665T122 666L133 629L144 594L161 606Q218 642 272 670L294 681Q295 681 300 677T306 672L302 669Q298 666 292 662T278 651T263 637T251 621Q232 587 227 530T222 343Q222 226 230 125L231 112L244 98L258 83Q271 87 285 92L312 102V84Q297 72 231 24T163 -23L100 55Q110 141 111 275",120210:"115 203Q115 257 114 291T112 338T111 355Q111 357 93 370L75 384L54 375Q32 366 31 365Q27 365 16 378Q25 383 89 430L152 476Q175 453 228 420Q229 420 229 418T229 410T227 394L225 369Q279 400 315 425T363 461T376 471Q480 424 514 416V412Q514 411 514 404T513 392L511 376L520 382Q529 387 548 399T584 422Q599 432 618 444T648 463L657 469H658Q661 469 681 461T735 440T796 420Q803 418 803 416Q801 414 798 390T791 325T788 247Q788 220 790 172T794 123Q799 115 814 97T835 78H838Q841 78 867 89L895 101Q896 101 896 100T897 92T900 78L873 62Q810 23 761 -12L736 -30Q735 -30 729 -22T707 7T671 48L661 59Q674 93 674 207V219Q674 341 670 344Q655 353 591 372L576 376L544 364Q511 351 510 351Q507 349 507 224V132L535 95Q541 87 548 78T560 63L563 58Q563 57 504 15T444 -28L385 53L387 67Q396 114 396 206Q396 289 393 334Q393 346 390 348Q369 358 306 373Q301 373 265 361L228 349V335Q227 322 227 284Q227 206 231 157Q231 151 231 144T232 133V129Q232 125 259 90Q286 56 286 53Q287 53 284 51T273 43T258 31L173 -31L166 -20Q160 -11 145 7T119 38T108 59Q108 62 110 81T113 133T115 203",120211:"608 88Q572 65 535 37T477 -8T455 -25Q432 7 389 53L375 68L378 82Q386 160 386 195V221Q386 284 385 307L384 344Q352 359 306 373L286 379L213 353V273Q214 229 214 161V129L275 62L163 -28L150 -14Q136 0 121 16T91 44Q86 48 86 50Q95 83 96 148Q96 224 89 340L88 366L79 374Q69 384 67 385L64 388L55 383Q52 382 44 378T33 373L21 367L13 374Q5 379 5 381Q5 384 69 428L133 473Q135 473 147 464T179 443T215 424L214 400V376Q271 404 342 457L363 472Q363 473 364 473Q366 473 375 469T418 449T502 414L512 411V407Q502 330 502 217V197V132L523 109Q527 104 533 97T543 87T547 83L550 80L578 92Q603 103 604 103Q606 103 608 88",120212:"107 102Q107 178 112 242T123 334T129 362Q129 363 140 368T199 400T315 469L336 482L346 476Q409 439 498 414L514 410L515 389Q515 208 502 141Q494 101 491 94Q490 89 478 81Q430 51 375 23T288 -20T254 -34Q250 -34 200 -1T119 56L108 65L107 76V102ZM389 355Q367 358 346 363T309 372T282 381T264 388L257 390H256Q254 390 249 381T238 348T227 293Q226 280 226 237Q226 183 231 146L232 131L244 122Q285 91 323 74T374 57H377L380 68Q405 154 405 267Q405 315 401 349V354L389 355",120213:"66 435Q66 445 117 501T173 557Q174 557 183 555T193 551Q174 526 174 509Q174 496 190 472T233 428V386L377 482L399 471Q450 445 509 425Q519 421 519 420L518 419Q518 418 518 416T517 410Q517 405 518 381T519 335Q519 222 501 137Q492 84 489 84L473 75Q457 66 423 44T354 -6L338 -19L329 -13Q320 -8 313 -4T297 4T284 10T270 14T258 17T245 20T233 22V12L241 -161L214 -172Q187 -184 160 -195T131 -207Q127 -207 112 -202L113 -188Q113 -182 115 -77T118 31Q118 32 109 32Q63 27 23 0L10 -9Q5 -4 -1 8Q1 13 52 57T114 101H115L117 123Q117 141 117 230V359L110 367Q85 394 71 421Q66 433 66 435ZM384 83Q386 83 389 110T396 180T400 254Q400 294 395 339L394 349L379 355Q308 383 294 383Q290 383 263 372L234 360L233 245V130Q270 125 305 113T361 92T384 83",120214:"362 -196Q375 -92 375 47V78L282 24Q189 -29 188 -30Q187 -30 139 21T90 75Q87 84 87 158Q88 206 94 259T107 342L113 372L308 478L322 473Q374 452 421 444L433 442L503 485Q515 479 515 477Q485 378 485 56Q485 -100 494 -164V-171L381 -211L371 -207L362 -202V-196ZM280 72Q301 77 323 86T358 101T372 110Q372 268 377 346L378 358H374Q368 360 358 360T323 365T257 380L234 386Q231 386 229 379Q215 353 211 310T207 180Q207 152 208 150Q210 142 235 114T280 72",120215:"23 367Q21 370 18 374T14 380L13 382L151 472L236 411L238 381L290 426Q298 432 307 439T322 452T333 461T342 467L344 469Q382 410 404 399Q410 397 416 397Q423 397 432 399T446 403L451 405Q453 405 453 399V393Q430 374 404 356T364 328T350 318L349 317Q321 320 276 356Q257 371 256 371Q253 374 249 366T242 351Q232 321 232 236Q232 214 232 205T232 182T233 162T235 148T238 137T242 129T249 120T257 114T268 105T281 95Q313 70 314 70L358 85Q377 92 389 96T402 100V90L403 80L229 -26L221 -18Q195 6 166 29T121 63T105 76T106 82T110 97T114 121T117 158T119 208Q119 269 114 329L113 341L103 350Q90 362 67 380L45 374L23 367",120216:"189 331Q190 304 196 282T207 252T214 244Q239 244 348 292L371 302L382 297Q398 290 415 279T433 265Q442 238 442 166Q442 103 423 45Q416 42 380 29T310 3T244 -26L227 -34Q139 40 73 40Q61 40 48 37T24 30T6 22T-8 14L-13 11Q-14 11 -18 18T-23 26T38 75T102 125Q107 128 146 131H153Q192 131 296 56Q318 40 318 43Q323 48 323 114Q323 157 321 177L319 194Q308 208 291 216T261 225Q239 225 160 185L123 167Q85 205 79 227Q78 230 78 304V377L171 428Q264 479 265 478Q268 478 287 465T334 440T384 427Q423 427 475 463L478 453Q481 446 481 442Q481 439 410 391L339 342H331Q309 345 277 361T222 391T198 406T195 399T191 372T189 331",120217:"328 69Q401 102 403 102Q404 102 405 94T406 84Q406 83 318 28L230 -27Q223 -21 206 -5T171 25T132 54L124 60V71Q129 154 129 297V359H43L44 363Q44 365 44 367L45 369L48 372Q51 374 57 378T68 387L90 405H129V553L285 648Q304 641 306 640L260 598V592Q259 589 255 505T249 413V405H353V402Q353 399 328 379L303 360H245V319Q245 150 253 125Q257 115 276 101T311 78T328 69",120218:"444 -31Q444 -29 384 66Q382 66 364 58T309 30T231 -17Q214 -29 212 -29L197 -20Q172 -4 140 11T88 34L68 42Q68 43 73 49T85 67T100 98T113 149T118 221Q118 272 105 332L100 356L58 383L23 365L9 379L76 425Q141 472 144 472Q144 471 183 443L221 414V404Q224 365 224 275V253Q224 159 196 113Q191 104 193 104Q203 104 285 72L308 62L374 89L375 106Q375 266 373 340Q373 364 371 396V424L430 445L491 467Q493 467 499 463T505 457Q505 456 503 442Q488 335 488 187V158L529 81L534 80Q541 80 568 90L598 101Q605 94 602 87L524 27Q445 -32 444 -31",120219:"95 67Q104 80 104 193Q104 261 100 321L98 355L91 363Q56 402 56 421Q56 441 82 472T132 524T159 546Q174 542 175 542Q159 520 159 501Q159 481 205 432L221 415L220 401Q219 394 219 387L288 429Q309 441 325 451T347 465T358 472T365 476L504 415V409Q504 408 505 374T507 318Q507 155 474 91L469 80L343 26Q314 14 281 0T232 -20L216 -27L202 -15Q192 -5 152 28Q141 35 126 45T103 60T95 67ZM386 349Q302 389 287 389Q271 383 253 375L220 361V136Q226 120 256 100T312 68T342 56Q355 56 360 68Q389 134 389 258Q389 310 386 341V349",120220:"90 58T90 59T92 64T97 78T102 105T107 150T109 218Q109 290 103 350V356L83 377Q55 407 55 425Q55 445 138 528Q158 549 162 549L164 548Q165 548 167 548T170 547L175 546L172 540Q168 533 165 523T161 502Q161 479 216 430L229 419V382Q232 382 366 471Q407 445 500 408L511 404V387L512 370L595 420Q678 469 679 469L693 462Q756 431 795 417L815 409L814 380Q812 187 782 96Q774 71 766 62T744 48T684 25T577 -23L557 -32L546 -26Q536 -19 519 -10T481 10T436 31T393 47Q384 50 380 50Q380 52 381 58T384 77T387 104Q391 174 391 256V292L390 333L377 340Q350 357 304 373L294 376L227 355V348Q224 322 224 243Q228 117 232 112L235 108Q238 103 245 95T257 80L281 50Q281 49 227 10T172 -29L159 -13Q133 19 116 36T94 56ZM652 64Q658 64 667 84T685 162T697 303V336L686 341Q653 356 619 367L591 376Q590 376 553 361T514 344T512 324T510 275T508 221Q508 167 510 152T521 126Q537 112 590 88T652 64",120221:"8 -90Q8 -68 13 -63Q13 -56 53 -8T120 63L128 71L129 85Q133 120 134 182Q134 308 131 331T106 365Q100 367 97 369L75 381L35 365L20 377Q20 378 47 397T110 440T161 471L253 413V396Q253 378 254 378L309 422Q364 466 365 466Q365 467 366 466T370 461T376 454Q403 419 426 396L441 380L438 377Q438 376 433 372T420 359T404 344L372 314Q351 320 338 327T310 344T277 364Q261 364 252 316Q251 306 251 235Q251 136 255 129Q257 127 258 124T268 113T298 92Q334 68 335 68Q340 70 349 73T377 84T408 95T421 99Q422 99 422 90L423 82L334 26Q246 -28 243 -28L200 8Q156 43 148 43Q144 43 130 36T99 9T83 -36Q83 -67 121 -89T198 -118L237 -124V-129L238 -133L193 -160Q183 -166 171 -173T152 -184L146 -188Q140 -187 131 -185T98 -173T56 -154T23 -127T8 -90",120222:"280 53Q272 47 246 27T199 -10T176 -27L167 -18Q137 17 107 44L90 60L93 71Q108 130 109 290V331Q109 339 109 344T108 353T107 359T105 364T102 369T97 374T91 381Q60 412 60 432Q60 448 86 479T138 534L164 557Q168 553 180 553Q163 532 163 511Q165 491 186 468Q206 443 231 423V404L232 385L371 477L389 468Q439 441 498 418L512 412V386Q512 360 507 190T500 14Q488 -26 445 -67Q401 -111 355 -148T282 -203T249 -221Q247 -220 230 -210T213 -199T229 -191T269 -172T306 -151Q361 -120 379 14Q391 92 391 182Q391 218 386 305Q384 339 380 341Q363 353 330 366T288 379Q282 379 258 368L230 356V181V141Q230 127 232 120T236 108T251 89T275 59L280 53",120223:"153 371Q141 371 126 365T100 354T78 340L65 331L57 338L50 346L62 356Q133 419 222 471Q274 453 306 422T338 366Q338 356 329 346T283 301L243 264L262 257Q298 246 361 214Q378 154 378 73Q378 33 371 -9T356 -74T345 -104Q340 -106 267 -160L191 -214H177Q60 -214 13 -150Q-7 -122 -7 -115Q-7 -112 19 -77T106 25T241 149Q241 152 227 158T181 173T109 185V190L108 194L158 229Q212 267 223 278T234 306Q234 329 208 350T153 371ZM258 1Q258 42 257 68T254 105T252 118Q235 105 210 85T144 22T102 -45Q102 -79 146 -106T234 -133H238Q248 -128 254 -80Q258 -58 258 1",120224:"183 181Q183 179 152 91T118 0H28L154 346L280 693Q281 694 333 694H385L511 349Q636 4 638 2Q638 0 584 0H530L464 183H184L183 181ZM324 606Q319 578 292 492T238 332T210 256Q210 254 324 254T438 255L429 281L419 308Q409 336 395 378T365 465T339 551T324 611V606",120225:"425 363Q438 363 465 353T526 324T585 270T610 192Q610 132 561 78T426 7Q404 2 387 2T240 0H90V694H227Q373 693 396 689Q484 673 533 623T583 517Q583 494 574 473T551 437T520 409T487 388T456 374T433 366L425 363ZM490 516Q490 527 485 539T467 568T423 599T347 621Q340 622 262 623H188V399H261H286Q432 399 478 475Q490 496 490 516ZM514 190Q514 245 462 280T343 322Q336 323 259 323H188V71H274Q365 72 388 77Q445 88 479 121T514 190",120226:"59 347Q59 440 100 521T218 654T392 705Q473 705 550 680Q577 670 577 667Q576 666 572 642T564 595T559 571Q515 601 479 613T392 626Q300 626 232 549T164 347Q164 231 229 150T397 68Q453 68 489 80T568 120L581 129L582 110Q584 91 585 71T587 46Q580 40 566 31T502 5T396 -11Q296 -11 218 41T99 174T59 347",120227:"88 0V694H237H258H316Q383 694 425 686T511 648Q578 604 622 525T666 343Q666 190 564 86Q494 18 400 3Q387 1 237 0H88ZM565 341Q565 409 546 463T495 550T429 600T359 621Q348 623 267 623H189V71H267Q272 71 286 71T310 70Q461 70 527 184Q565 251 565 341",120228:"86 0V691H541V611H366L190 612V397H513V321H190V85H372L554 86V0H86",120229:"86 0V691H526V611H358L190 612V384H485V308H190V0H86",120230:"59 346Q59 499 157 601T384 704Q436 704 466 700T541 679Q551 674 560 670T575 664T583 660T588 658T590 656Q590 652 582 605T573 557L564 564Q489 626 392 626Q301 626 233 549T164 347T233 145T392 68Q441 68 506 84V223H388V299H599V38L588 33Q494 -11 393 -11Q296 -11 219 40T100 172T59 346",120231:"86 0V694H190V399H517V694H621V0H517V323H190V0H86",120232:"87 0V694H191V0H87",120233:"181 53Q200 53 215 56T241 66T259 79T272 95T280 109T285 122L287 129V694H388V415V229Q388 135 385 112T369 63Q364 51 355 39T328 12T280 -12T212 -22Q172 -22 130 -12T66 8T43 20L46 42Q50 65 54 88L58 110Q58 111 65 104Q107 53 181 53",120234:"88 0V694H188V519L189 343L525 694H638L375 419L651 0H541L309 351L188 225V0H88",120235:"87 0V694H191V79L297 80H451L499 81V0H87",120236:"92 0V694H228L233 680Q236 675 284 547T382 275T436 106Q446 149 497 292T594 558L640 680L645 694H782V0H689V305L688 606Q688 577 500 78L479 23H392L364 96Q364 97 342 156T296 280T246 418T203 544T186 609V588Q185 568 185 517T185 427T185 305V0H92",120237:"88 0V694H235L252 659Q261 639 364 428T526 84V694H619V0H472L455 35Q453 39 330 294T185 601L181 611V0H88",120238:"55 345Q55 504 149 609T361 715Q386 715 406 713Q521 696 600 592T680 344Q680 193 590 86T368 -22Q239 -22 147 84T55 345ZM276 59T368 59T518 146T576 360Q576 473 525 545T401 634Q371 637 362 637Q284 637 222 562T159 360T217 147",120239:"88 0V694H230Q347 693 370 692T410 686Q487 667 535 611T583 485Q583 409 527 348T379 276Q369 274 279 274H192V0H88ZM486 485Q486 523 471 551T432 593T391 612T357 621Q350 622 268 623H189V347H268Q350 348 357 349Q370 351 383 354T416 368T450 391T475 429T486 485",120240:"55 345Q55 504 149 609T361 715Q386 715 406 713Q521 696 600 592T680 344Q680 284 665 231T629 143T587 85T551 48L536 35L648 -120L652 -125H531L452 -8L440 -12Q407 -22 369 -22Q239 -22 147 85T55 345ZM579 345Q579 473 517 555T369 637Q279 637 218 554T156 345Q156 223 215 141T368 58Q376 58 382 58T392 58T397 59T401 60T403 61H404Q404 63 360 128T315 194H421L453 150Q485 105 486 105Q490 108 496 113T517 138T545 182T567 247T579 334V345",120241:"88 0V694H227H259H302Q365 694 399 689T474 663Q528 637 558 595T589 504Q589 482 584 462T569 426T547 396T522 372T495 353T470 338T449 328T434 322L429 320L440 300Q452 280 477 238T523 160L617 1L565 0Q513 0 512 1Q512 2 424 156L337 309H189V0H88ZM492 504Q492 600 367 620Q354 622 271 623H189V385H271Q363 386 388 392Q432 402 462 430T492 504",120242:"55 514Q55 589 115 652T283 716Q315 716 345 711T396 699T432 685T457 672T467 667Q467 666 459 618T449 568Q383 634 282 634Q214 634 182 600T150 525Q150 507 155 492T172 465T194 446T222 432T247 423T272 416T289 412Q353 396 378 384Q432 358 466 307T500 194Q500 110 438 44T272 -22Q215 -22 159 -5T73 28T44 50Q45 51 49 75T57 122T62 146L65 143Q68 140 74 136T88 125T107 111T131 98T160 85T194 74T232 66T274 63H286Q327 63 366 96T406 182Q406 245 352 280Q329 296 265 310T173 339Q124 363 90 409T55 514",120243:"36 608V688H644V608H518L392 609V0H288V609L162 608H36",120244:"87 450V694H191V449Q192 203 193 194Q200 148 220 117T266 72T311 54T347 49Q404 49 446 84T501 178Q505 195 505 218T507 449V694H600V450Q600 414 600 356Q599 198 595 181Q594 178 594 177Q575 89 505 34T345 -22Q258 -22 184 34T89 196Q88 205 87 450",120245:"14 692Q14 694 68 694H122L146 633Q325 165 339 90Q340 87 341 87Q341 124 530 619L558 694H605Q652 694 652 692Q650 690 523 354T390 10L387 0H279L276 10Q271 18 144 354T14 692",120246:"115 694Q115 693 156 550T233 266T270 90L271 85Q272 86 272 92Q272 153 405 616L427 694H524L553 590Q672 174 681 95L682 84L684 95Q689 138 728 287T803 563T841 692Q841 694 885 694T929 693Q929 691 829 346L730 0H679L628 1L606 75Q478 524 470 600L469 611L467 600Q458 518 338 101L310 0H213L114 346Q14 691 14 693Q14 694 64 694H115",120247:"14 0Q16 5 144 184T275 367L153 528Q121 571 88 615T42 674T28 694H150L228 584Q315 463 316 461L326 448L497 694H610L609 692Q606 689 492 528Q440 454 409 410T378 366Q378 365 515 182L652 0H531L326 292Q326 293 299 254T226 146L128 0H14",120248:"4 693L64 694H125L174 621Q335 378 340 364L341 362Q361 398 395 450L558 694H663L383 277V0H282V278L143 485Q112 531 75 586T21 668L4 693",120249:"69 617V694H555V643L373 362Q190 81 190 79H234Q244 79 272 79T344 80T419 81H560V0H55V53L237 334Q420 615 420 617Q413 618 387 618Q380 618 334 618T245 617H69",120250:"236 387Q209 387 184 382T141 370T111 355T91 342T83 337L82 355Q80 373 79 393T77 417Q77 419 81 421Q86 423 91 426Q155 460 227 460H238Q319 460 368 400Q393 371 400 341T408 252Q408 240 408 207T407 152V0H317V39L306 32Q244 -10 159 -10H152Q109 -10 77 22Q38 61 38 126Q38 142 39 146Q55 199 130 223T295 252H314V277Q314 305 313 310Q308 342 287 364T236 387ZM303 186Q124 180 124 126Q124 105 144 86T208 66Q284 66 309 124Q314 137 314 166V186H303",120251:"303 -11Q280 -11 259 -6T222 6T194 21T176 33T168 38V0H75V694H165V550L166 405Q247 455 336 455Q397 455 439 389T482 226Q482 115 428 52T303 -11ZM390 221Q390 283 361 331T265 379Q214 379 177 342L168 334V118Q203 66 258 66Q316 66 353 106T390 221",120252:"34 223Q34 327 99 393T245 460Q290 460 301 459Q328 455 354 445T395 427T410 415L396 338L386 344Q377 349 362 357T335 370Q305 381 258 381H252Q182 381 146 315Q126 275 126 224Q126 158 159 113T255 68Q329 68 394 106L408 114L410 93Q411 72 412 52L414 32Q407 27 394 20T338 2T252 -10Q156 -10 95 58T34 223",120253:"33 224Q33 321 81 388T197 455Q277 455 342 414L351 408V694H441V0H348V44L338 37Q278 -10 198 -10Q177 -10 168 -8Q99 11 62 90Q33 148 33 224ZM348 337Q307 378 263 378Q260 378 256 378T251 379Q239 379 223 374T182 355T142 305T126 220Q126 90 225 67Q231 66 250 66H255Q306 66 342 115L348 124V337",120254:"28 226Q28 329 91 395T235 461Q258 461 279 456T325 436T368 397T399 332T415 238V219H113V215Q113 163 151 114T248 65Q273 65 298 70T341 82T373 96T396 108L403 113Q403 106 406 76T409 38Q409 34 408 33T393 24Q325 -10 252 -10Q155 -10 92 59T28 226ZM340 289L338 297Q335 305 333 310T327 326T317 343T304 358T286 372T263 381T233 385Q212 385 193 376T162 353T140 325T127 301T123 289H340",120255:"262 705H267Q300 705 347 694V612L336 616Q303 628 274 628H266Q224 628 199 605Q187 590 184 579T181 541V507V444H287V371H184V0H94V371H27V444H94V492Q94 544 95 550Q102 617 151 661T262 705",120256:"55 286Q55 357 105 406T224 455Q280 455 323 421L322 423L318 427Q318 428 339 434T396 448T465 455H471L478 416L485 377Q484 377 474 379T445 383T401 385Q397 385 391 385T381 384L362 383L357 387Q358 386 364 375T375 354T384 325T389 287Q389 217 340 168T221 119Q178 119 138 142Q133 145 131 143Q125 131 125 117Q125 82 155 72L227 71Q230 71 251 71T280 71T310 69T343 65T373 57T403 46T428 30T449 7Q471 -26 471 -62V-71Q471 -136 384 -178Q326 -206 250 -206Q159 -206 102 -172T30 -92Q28 -84 28 -68T31 -37T40 -12T52 7T64 21T75 31T82 38Q60 68 60 106Q60 145 80 180L86 189L80 199Q55 240 55 286ZM304 233T304 287T279 362T220 383Q189 383 165 361T140 287Q140 243 161 217T220 191Q253 191 278 212ZM250 -134Q298 -134 331 -122T375 -96T387 -69Q387 -21 306 -7Q288 -5 216 -5Q161 -5 153 -7Q146 -9 139 -13T122 -31T113 -66Q113 -75 113 -80T127 -97T166 -121Q203 -134 250 -134",120257:"163 395Q223 455 307 455Q417 455 438 354Q442 331 443 164V0H350V157Q349 315 348 320Q334 378 259 378H253Q224 378 204 358Q180 334 173 301T165 209Q165 198 165 172T166 129V0H73V694H163V395",120258:"67 576V680H171V576H67ZM74 0V444H164V0H74",120259:"88 576V680H192V576H88ZM31 -126Q40 -126 48 -125T62 -122T73 -117T82 -111T89 -105T94 -99T98 -92L102 -86V444H192V180Q191 -45 191 -70T184 -113Q171 -152 140 -178T63 -205Q34 -205 4 -197T-43 -181T-59 -171T-51 -133T-41 -96L-38 -99Q-34 -102 -28 -106T-13 -115T7 -123T31 -126",120260:"76 0V694H163V257L340 444H449L286 272L292 263Q296 259 378 138T463 12L471 0H372L309 92Q294 114 277 139T250 179T237 198L228 211L160 139V0H76",120261:"74 0V694H164V0H74",120262:"160 392Q223 455 304 455Q359 455 386 436T430 383L437 391Q495 455 584 455Q694 455 715 354Q719 331 720 164V0H627V157Q626 315 625 320Q611 378 536 378H530Q501 378 481 358Q457 334 450 301T442 209Q442 198 442 172T443 129V0H350V157Q349 315 348 320Q334 378 259 378H253Q224 378 204 358Q180 334 173 301T165 209Q165 198 165 172T166 129V0H73V450H160V392",120263:"160 392Q214 446 283 454Q285 454 292 454T303 455H306Q417 455 438 354Q442 331 443 164V0H350V157Q349 315 348 320Q334 378 259 378H253Q224 378 204 358Q180 334 173 301T165 209Q165 198 165 172T166 129V0H73V450H160V392",120264:"28 222Q28 323 95 391T244 460Q275 460 281 459Q364 445 417 377T471 219Q471 124 408 57T250 -10Q158 -10 93 57T28 222ZM377 230Q377 277 364 310T328 358T287 379T248 385Q233 385 219 382T186 369T155 342T132 297T122 230Q122 146 159 108T250 69H253Q263 69 274 70T305 81T339 106T365 154T377 230",120265:"166 404Q194 424 241 439T337 455H341Q410 455 451 370Q483 307 483 222Q483 128 433 59T306 -10Q282 -10 260 -5T222 7T194 21T176 33T168 38V-194H75V444H165V424L166 404ZM390 222Q390 287 354 331T266 376T177 340L168 332V118Q200 66 257 66Q313 66 351 112T390 222",120266:"33 220Q33 325 87 389T206 454Q286 454 341 406L351 398V455H441V-194H348V41L338 35Q276 -8 198 -11Q171 -11 154 -5Q102 12 68 74T33 220ZM126 220Q126 160 161 113T251 65Q305 65 351 123V298L350 301Q349 304 347 308T342 319T336 331T327 343T315 355T300 365T283 373Q273 375 256 375Q208 375 167 332T126 220",120267:"171 389Q237 455 320 455H327V373H317Q262 369 220 336T167 248Q165 239 164 119V0H74V450H159V377L171 389",120268:"33 326Q33 376 60 408T117 450T175 460H190Q245 460 272 454T345 429Q345 428 338 388L331 349Q278 386 188 386H183Q119 386 119 336Q119 307 142 295T210 276T278 256Q360 213 360 130Q360 108 354 88T332 43T281 5T195 -10Q152 -10 111 1T49 22T28 35Q29 36 32 56T39 95T43 115T51 110T72 99T102 85T143 73T193 68Q274 68 274 123Q274 152 248 167Q234 178 187 186T115 207Q66 229 46 273Q33 298 33 326",120269:"333 27Q333 24 314 16T257 -1T184 -10H172Q146 -10 128 14T105 58T99 91Q95 113 95 251V371H18V444H98V571H182V444H316V371H182V253Q183 128 189 104Q199 68 234 68Q277 72 314 98Q315 93 323 61T333 27",120270:"353 39Q352 38 344 34T331 27T315 19T295 11T270 3T241 -3T207 -8T168 -10H162Q148 -10 137 -8T111 2T87 30T74 81Q73 89 73 268V444H166V268L167 92Q171 79 174 74T192 64T238 59Q317 59 344 116Q349 128 349 148T350 291V444H443V0H353V39",120271:"178 0Q15 441 14 442Q14 444 60 444Q107 444 107 442Q108 441 136 364T196 194T232 67Q233 98 280 234T356 442Q356 444 401 444T446 442L282 0H178",120272:"14 444H105L108 434Q192 160 200 74V65L201 75Q206 144 282 399L296 444H381L399 381Q480 112 480 69L481 70Q481 113 562 386L580 444H668L534 1L483 0H432L429 10Q343 294 338 367L337 377Q336 375 336 370Q336 340 313 250T269 88T245 11L242 0H195L148 1L14 444",120273:"187 229L6 444H107L227 294L344 444H393L442 443Q439 437 299 268L267 229L460 0H359L294 88Q280 107 262 131T236 166L227 177L100 0H0Q1 1 47 58T140 171T187 229",120274:"113 -204Q83 -204 63 -200L43 -197Q43 -196 40 -157T36 -117L48 -121Q79 -133 114 -133Q124 -133 130 -132T145 -121T163 -94Q169 -82 184 -42T200 1L188 29Q176 57 152 115T107 223T62 330T26 416L14 443Q14 444 61 444H109L122 411Q230 155 236 75L237 65V74Q245 161 348 424L356 444H401Q446 444 446 443L396 313Q345 183 293 49T236 -93Q191 -204 123 -204H113",120275:"42 370V444H400V395L156 76L279 77H402V0H28V51L273 371L157 370H42",120276:"110 0H86Q42 0 42 27Q42 37 148 350T258 667Q269 687 291 692Q295 694 366 694H399Q432 694 448 689T474 667Q477 663 583 350T690 27Q690 0 642 0H617H592Q582 0 575 1T561 2T549 6T541 11T533 18T527 26T522 37T517 49T512 64T506 81L490 130H225Q225 128 208 79T189 27Q185 19 180 14T170 7T156 3T143 1T127 0T110 0ZM439 279Q359 524 359 547L357 555L355 543Q347 503 270 263L259 231H357Q455 231 455 232L439 279",120277:"119 1Q98 5 92 28V667Q98 686 118 693Q121 694 272 694H289H346Q439 694 500 681T600 625Q640 580 640 513Q640 451 601 414T504 364L518 361Q568 351 602 329T649 280T666 235T671 197Q671 172 665 147T642 91T586 37T488 5Q456 1 282 1H119ZM489 509Q489 532 479 548T450 573T421 585T394 591Q387 592 315 593H247V404H298H325Q432 404 466 444Q489 470 489 509ZM517 194Q517 235 502 261T458 299T407 313T353 317H329H322H247V101H319H357Q387 101 407 103T452 111T492 133T514 171Q516 176 517 194",120278:"423 -11Q339 -11 275 9T171 62T106 143T71 240T61 347Q61 450 93 527Q157 664 313 694Q357 704 416 704Q479 704 517 699T608 676Q634 667 635 660Q635 653 624 592L612 528L609 524Q604 521 601 521Q595 521 583 531T555 555T505 578T428 589H424Q298 589 250 494Q224 438 224 347Q224 292 233 251T265 175T329 122T432 104Q488 104 524 115T604 158Q607 160 610 162T615 165T619 168L621 170Q625 172 630 170T637 163Q638 160 642 109T647 54Q646 49 625 37T568 11T499 -7Q463 -11 423 -11",120279:"119 1Q98 5 92 28V667Q98 686 118 693H124Q131 693 142 693T168 694T200 694T237 694H296Q416 694 450 692T525 677Q732 617 732 342Q732 169 644 81Q593 32 528 16T372 0Q356 0 324 0T276 1H119ZM573 349Q573 387 571 413T559 473T532 527T482 567T403 591Q395 592 320 593H250V101H321Q418 102 456 114Q553 144 569 263Q573 303 573 349",120280:"277 122Q280 122 380 123T544 125Q552 125 557 125T565 124T569 124Q595 115 595 75V62V47Q595 9 569 2Q564 0 341 0L119 1Q99 7 92 28V664Q98 683 118 690Q121 691 335 691T554 689Q580 682 580 644V632V618Q580 582 554 573Q553 573 551 573T542 572T527 572Q464 572 364 573T260 575H253V412H385H459Q524 412 536 404T549 357Q549 341 549 334T542 318T523 305Q518 303 385 303H253V122H277",120281:"512 572Q451 572 356 573T258 575H253V400H370H431Q494 400 506 392T518 345Q518 307 507 299T437 291H370H253V161Q253 141 253 113T254 75Q254 23 245 12T195 0H170L119 1Q99 7 92 28V664Q98 683 118 690Q121 691 327 691T538 689Q564 682 564 644V632V618Q564 582 538 573Q537 573 535 573T526 572T512 572",120282:"61 347Q61 405 70 454T105 550T171 631T276 685T426 705Q483 705 537 693T620 668T650 646Q650 645 649 637T645 612T639 578L627 514L624 510Q620 507 615 507T597 520T566 548T512 577T430 590Q223 590 223 347T431 104Q478 104 506 112Q508 112 508 164V215H471L434 216L428 222L427 268Q427 315 429 318Q432 323 444 323T544 324H652Q655 320 659 317V45L656 43Q654 39 624 27T536 2T424 -11Q366 -11 317 -2T219 33T137 97T82 200T61 347",120283:"92 667Q101 694 143 694H172H198Q244 694 251 669Q253 663 253 539V415H540V539Q540 558 540 585T539 621Q539 673 550 683T611 694H621H646Q671 694 683 690T700 669Q702 663 702 347T700 25Q696 9 684 5T646 0H621H606Q560 0 550 11T539 76Q539 85 539 116T540 169V306H253V169Q253 147 253 116T254 75Q254 23 245 12T194 0H170L119 1Q99 7 92 28V667",120284:"85 667Q94 694 136 694H165H191Q237 694 244 669Q246 663 246 347T244 25Q235 0 192 0H163L112 1Q92 7 85 28V667",120285:"236 -22Q190 -22 144 -11T72 12T46 29Q63 147 69 153Q80 164 92 146Q124 91 191 91Q222 91 242 102T267 134Q268 139 268 402Q268 663 270 669Q275 687 294 692Q298 694 347 694H367Q393 694 406 690T425 669Q427 663 427 399Q427 132 426 125Q421 87 404 58T366 15T318 -9T273 -20T236 -22",120286:"92 667Q101 694 139 694H163H186Q225 694 234 671Q236 663 236 529L237 392L533 682Q550 694 590 694H623H681Q695 680 695 672Q695 670 693 664Q688 657 561 533L431 405L698 33Q701 28 701 23Q701 7 683 0H626H604Q571 0 564 2T545 13Q544 14 530 33T489 90T437 162L332 307Q331 307 284 260L236 214V122V65Q236 32 231 19T210 2Q205 0 161 0L119 1Q99 7 92 28V667",120287:"92 667Q98 684 109 689T142 694H172H198Q244 694 251 669Q253 663 253 389V116L278 117Q410 119 490 119H495Q511 119 517 115T534 93V63V48Q534 9 508 2Q503 0 310 0L119 1Q99 7 92 28V667",120288:"92 667Q98 684 109 689T146 695Q152 695 167 695T192 694Q200 694 214 694T234 695Q291 695 305 664Q313 651 400 419T487 165Q487 162 488 162T489 165Q489 187 574 413T671 664Q679 680 695 688Q708 694 785 694H828Q855 694 867 689T884 669Q886 663 886 347T884 25Q876 0 832 0H817H802Q758 0 750 25Q748 31 748 293V555L746 544Q737 509 692 386T606 160T564 52Q548 22 502 22H487H472Q423 22 410 52Q407 59 367 160T283 385T231 546L230 548Q229 548 229 293Q229 31 227 25Q222 9 211 5T176 0H158L119 1Q99 7 92 28V667",120289:"92 667Q98 684 109 689T146 694H185Q273 694 279 692Q301 689 315 669Q322 660 419 453L554 163L562 143Q564 143 564 401Q564 663 566 669Q574 694 618 694H633H648Q692 694 700 669Q702 663 702 347T700 25Q696 10 683 5T642 0H596H551Q520 0 505 4T478 25Q471 34 374 241L239 532Q231 550 231 552L229 479Q229 440 229 293Q229 31 227 25Q222 9 211 5T176 0H158L119 1Q99 7 92 28V667",120290:"362 715Q364 715 376 715T394 716H400Q542 716 626 643T727 426Q731 395 731 342Q731 271 722 225Q674 -22 396 -22Q320 -22 259 -3T148 68T77 201Q62 257 62 342Q62 447 86 522T173 649Q245 707 362 715ZM568 433Q551 623 396 623Q383 623 370 622T333 612T292 591T257 550T233 485Q223 442 223 350Q223 276 232 227T267 137Q309 74 397 74Q433 74 461 85T507 113T537 156T556 205T566 260T569 310T570 357Q570 409 568 433",120291:"641 470Q641 426 630 391T603 334T561 295T513 271T459 259T408 254T361 253H350H337H253V142Q253 125 253 100T254 67Q254 32 249 19T227 2Q222 0 170 0L119 1Q99 7 92 28V667Q98 686 118 693Q121 694 271 694Q428 693 462 688Q641 656 641 470ZM487 467Q487 495 485 510T474 546T442 578T382 592Q375 593 310 593H250V347H309H339Q364 347 380 348T418 354T451 368T474 395T486 438Q487 444 487 467",120292:"450 -20Q444 -20 429 -21T396 -22Q320 -22 259 -3T148 68T77 201Q62 257 62 342Q62 447 86 522T173 649Q245 707 362 715Q364 715 376 715T394 716Q732 716 732 340Q732 268 719 210T686 120T647 68T615 39T601 29T638 -22T676 -73Q679 -78 679 -83Q679 -98 661 -106H593Q526 -106 521 -104Q514 -103 507 -97T496 -84T477 -55L454 -19L450 -20ZM554 509Q516 622 391 622Q294 622 250 535Q220 475 220 345Q220 299 222 266T234 198T258 140T299 99T363 74Q378 71 393 71H395L381 92Q367 114 353 136T338 161Q336 165 336 170Q336 186 352 193L361 194Q370 194 384 194T412 194H452Q457 194 460 194T466 194T471 192T476 191T480 188T483 185T487 180T492 174T497 167T504 158L526 129Q532 127 552 175Q573 231 573 348Q573 455 554 509",120293:"654 24Q654 9 644 5T612 0H577L521 1Q509 5 503 13Q498 20 421 160L343 304H250V168Q250 147 250 118T251 78Q251 24 242 12T192 0H168L119 1Q99 7 92 28V667Q98 686 118 693H124Q131 693 141 693T165 694T195 694T229 694T280 694T332 695Q389 695 428 691T510 675T582 637T627 569Q641 532 641 493Q641 377 537 331L497 317L493 316L571 177Q653 28 654 24ZM487 472T487 492T485 525T476 553T450 577T404 591Q398 592 322 593H250V391H321Q327 391 353 391T385 392T412 395T438 401T457 412T474 430T483 456",120294:"61 503Q61 547 72 583T110 650T186 698T305 716Q405 716 496 671Q513 664 514 657Q514 656 513 648T509 623T503 589L491 525L488 521Q484 518 479 518H475L461 532Q430 565 395 581T305 598Q201 598 201 523Q201 480 240 462T345 431T443 394Q549 324 549 204Q549 160 538 123T502 51T427 -2T308 -22Q180 -22 69 41Q50 52 49 57Q49 58 50 66T54 91T60 125L72 189L75 193Q80 196 84 196Q87 196 104 182T145 149T212 117T304 102Q408 102 408 188Q408 215 396 234T362 263T319 278T267 290T219 302Q149 324 105 380T61 503",120295:"67 687Q70 688 366 688Q661 688 666 686Q692 680 692 641V629V615Q692 579 666 570H660Q655 569 648 569Q645 569 624 569T581 570Q505 570 475 572H447V302Q447 31 445 25Q436 0 393 0H364L313 1Q293 7 286 28L285 300V572H257Q227 570 151 570Q130 570 109 570T84 569Q77 569 72 570H66Q48 577 44 588T40 631L41 661Q47 680 67 687",120296:"92 667Q101 694 143 694H172H200Q242 694 251 671Q253 663 253 430Q254 189 255 185Q262 134 288 107T384 79Q498 79 516 168Q520 191 521 431Q521 663 523 671Q532 694 572 694H596H618Q639 694 648 692T665 679Q671 672 671 653Q672 632 672 555V432Q671 200 670 190Q652 79 581 29T383 -22Q137 -22 98 166Q92 195 92 303V667",120297:"27 667Q27 683 39 688T75 694H101Q155 694 159 692Q182 687 194 665Q202 652 283 419T374 142Q376 165 473 445Q552 664 553 666Q568 694 618 694H639H658Q681 694 693 689T705 667Q705 660 592 347Q481 32 477 28Q466 7 441 1H292Q266 7 255 28Q251 32 140 347Q27 660 27 667",120298:"994 694Q1012 683 1014 668Q1014 661 977 519T896 217T845 26Q831 0 783 0H747H711Q685 0 672 5T649 26Q644 36 583 272T517 548Q516 552 516 551Q503 479 437 227Q389 37 383 26Q367 0 323 0H288H254Q207 0 193 26Q191 32 108 346T24 665Q24 685 44 693Q47 694 98 694H115Q152 694 168 668Q174 657 235 417T297 144Q297 134 300 153Q307 204 362 421T427 668Q441 694 488 694H523Q586 694 597 688Q612 683 620 661T651 549Q664 496 673 462Q744 194 750 146V140Q767 223 800 354T857 576T883 668Q897 694 938 694H958H994",120299:"52 1Q37 11 37 23Q37 26 39 32Q39 34 158 202L275 369Q275 370 221 441T112 586T55 663Q53 669 53 672Q53 687 68 693H72Q77 693 84 693T99 694T118 694T139 694H176Q203 694 212 692T230 682Q231 681 239 669T265 634T296 591L358 504L418 591Q481 682 486 686Q491 691 499 692Q505 694 569 694H632Q650 685 650 672Q650 667 646 660Q643 654 592 582T491 440T441 369T566 201T693 29Q694 27 694 23Q694 11 677 0H607L537 1Q523 6 519 10T437 131Q422 153 411 170T390 200T375 222T365 237T359 245L357 247L348 232Q339 218 319 188T283 131Q222 37 211 22T186 1H52",120300:"635 694H668Q688 694 698 690T708 670Q708 664 704 658L446 278L445 152V27Q442 20 440 17T433 9T419 1L368 0H339Q316 0 305 5T288 26Q286 31 286 154V278L157 468Q135 500 101 550Q43 635 34 650T24 671Q24 686 39 693Q42 694 105 694H122H132Q163 694 180 689T214 666Q225 654 336 485Q373 425 373 420L374 418Q375 419 375 421Q378 432 418 493T496 609T536 667Q543 676 551 681T572 689T591 693T615 694T635 694",120301:"411 584Q243 581 131 581Q122 581 116 581T106 582T102 582Q84 589 80 600T76 640L77 667Q83 686 103 693Q106 694 343 694Q579 694 584 692Q592 691 599 684T609 668Q610 665 610 646Q610 614 608 608Q605 603 434 361L261 116Q340 117 402 118T490 119T533 120T560 120H572Q605 120 614 95Q616 89 616 60V46Q616 9 590 2Q585 0 339 0Q92 0 87 2Q79 3 72 10T62 26Q61 29 61 49Q61 84 63 90Q65 94 152 217T325 461T411 584",120302:"255 394Q218 394 186 383T138 358T109 333T94 321H91Q88 321 86 322T83 325T80 331T79 339T78 349T77 362T75 377Q72 410 72 420Q72 423 72 425T73 429T74 431T77 433T80 435T85 437Q166 475 262 475Q360 475 413 440Q462 406 471 341Q472 332 472 181Q472 155 472 119T473 73Q473 20 462 10T398 0H380Q349 0 337 8T324 48V65Q298 30 257 10T172 -11Q109 -11 70 37T31 145Q31 276 307 289H321V309Q321 337 318 352T300 381T255 394ZM176 146Q176 116 190 97T231 77Q251 77 266 85Q322 110 322 185Q322 189 322 192T322 198L321 201V234L308 232Q176 220 176 146",120303:"54 667Q63 694 102 694H127H151Q190 694 199 671Q201 663 201 544L202 422L211 428Q270 468 355 468Q523 468 523 231Q523 -10 321 -10Q286 -10 261 -2T204 33Q197 11 187 6T142 0H126L81 1Q61 7 54 28V667ZM372 230Q372 317 355 349T280 382Q251 382 204 356V107Q235 76 274 76Q301 76 320 84T349 105T364 139T371 180T372 230",120304:"188 233Q188 199 190 177T200 131T225 95T271 83H281Q356 83 421 130Q433 138 434 139Q446 141 448 131Q449 128 453 84T457 36Q455 30 432 20T364 -1T273 -11Q37 -11 37 232Q37 456 244 474Q246 474 257 474T276 475Q349 475 400 455Q443 436 448 431L451 425Q451 419 443 377Q442 372 441 366T439 356T438 348T436 340T435 334T433 330T431 327T429 325T426 324Q420 324 406 336Q376 362 350 372T281 382Q254 382 236 373T208 352T194 317T189 278T188 233",120305:"225 -11Q192 -11 164 -3T104 29T55 102T37 227Q37 321 63 376Q111 469 223 469Q292 469 349 433L359 426V546Q359 564 359 589T358 623Q358 675 369 684T433 694H451Q497 694 505 669Q507 663 507 347T505 25Q500 9 487 5T450 0H432H413Q356 0 356 36V40Q298 -11 225 -11ZM356 359Q326 382 286 382Q239 382 215 358Q189 330 189 256V229V203V195Q189 102 231 86Q251 76 274 76Q318 76 356 114V359",120306:"30 231Q30 301 51 351T107 426T181 463T262 474H268Q293 474 312 472T366 459T422 427T462 363T480 260Q480 230 466 222T405 213Q395 213 364 213T311 214H173V211Q173 183 183 148T216 96Q244 76 287 76Q319 76 350 85T399 104T433 125T451 136Q463 138 465 128Q466 125 469 84T473 39Q471 29 423 13T330 -9Q321 -10 286 -10Q213 -10 161 11T81 68T42 144T30 231ZM353 292Q350 324 342 344T320 373T294 384T264 387Q191 387 175 286V282H353V292",120307:"67 458H78V502V509Q78 538 79 556T90 604T117 651T169 685T253 704Q254 704 258 704T265 705T275 705T287 704Q364 704 381 687V638V607Q381 591 378 585T366 579Q362 581 351 591T323 610T282 618Q238 618 226 587Q224 581 223 519V458H253Q288 458 298 453Q315 441 315 415Q315 399 312 390T299 377T282 372T259 371H255H226V201Q226 31 224 25Q215 0 174 0H150L106 1Q86 7 79 28L78 199V371H69Q29 371 29 412Q29 425 30 431T40 447T67 458",120308:"63 108Q63 142 83 176L76 184Q35 227 35 300Q35 469 243 469Q330 469 385 437L397 443Q451 469 508 469Q515 468 517 466T522 456T528 425Q534 392 534 386Q532 379 523 377Q520 377 509 381T477 390T431 398L425 399Q453 362 453 297Q453 268 445 242T417 189T351 146T242 130Q169 130 119 153Q117 141 117 136Q117 95 155 83Q161 81 252 81Q354 80 362 79Q437 71 475 48T526 -24Q532 -42 532 -65Q532 -116 489 -156T341 -204Q323 -206 274 -206H256Q39 -206 18 -84Q17 -79 17 -68Q17 15 82 42L76 53Q63 79 63 108ZM310 300Q310 359 298 377T238 396Q217 396 204 390T186 368T179 339T178 300Q178 245 189 224T244 203T299 224T310 300ZM414 -66Q414 -55 411 -47T401 -32T387 -21T368 -14T346 -10T322 -7T297 -6T271 -6T246 -6H193Q163 -6 154 -10T140 -30Q135 -45 135 -62Q135 -134 274 -134Q414 -134 414 -66",120309:"53 667Q62 694 101 694H126H148Q191 694 198 669Q200 663 200 526V390Q263 469 361 469Q390 469 412 465T456 449T491 413T507 351Q508 342 508 185Q508 31 506 25Q498 0 450 0H432H413Q368 0 359 23Q357 31 357 186Q356 345 355 350Q349 369 336 376Q324 381 301 381H298Q269 381 242 362Q217 342 210 316T202 239Q202 229 202 202T203 157V82Q203 24 195 12T146 0H125L80 1Q60 7 53 28V667",120310:"72 574Q55 583 51 591T46 619V636L47 670L48 673Q50 676 52 678T56 684T63 690T73 694H81Q89 694 102 694T129 695H181Q193 687 196 685T203 676T207 661T208 634Q208 603 204 593T181 574H72ZM54 431Q63 458 102 458H127H149Q192 458 199 433Q201 427 201 229T199 25Q190 0 149 0H125L81 1Q61 7 54 28V431",120311:"70 634V648Q70 686 96 693Q100 695 151 695H176Q201 695 213 691T230 670Q232 665 232 634V620Q232 582 206 575Q202 573 151 573H126Q101 573 89 577T72 598Q70 603 70 634ZM-41 -84Q-1 -105 28 -105Q67 -105 78 -85Q83 -77 83 -48T84 180Q84 427 86 433Q93 458 136 458H158H180Q201 458 209 456T225 443Q230 436 231 418Q232 397 232 313V183V124V40Q232 -55 228 -87T203 -147Q166 -205 78 -205Q31 -205 -20 -189T-71 -159Q-71 -156 -62 -124T-52 -89Q-49 -84 -41 -84",120312:"496 23Q496 9 487 5T457 0H427H398Q367 0 354 11Q352 12 288 99L226 183L191 150V90V54Q191 30 186 18T165 2Q160 0 124 0L90 1Q70 7 63 28V667Q72 694 108 694H128H146Q183 694 192 671Q194 663 194 496L195 325L254 383Q266 394 281 409T301 429T316 441T329 450T341 455T357 458T376 458H409H436Q461 458 470 454T480 437Q480 430 477 427T445 395Q417 368 396 347L319 271Q319 270 358 217T442 103T494 32Q496 30 496 23",120313:"54 667Q63 694 102 694H127H149Q192 694 199 669Q201 663 201 347T199 25Q190 0 149 0H125L81 1Q61 7 54 28V667",120314:"197 386Q256 468 366 468Q404 468 430 461T471 438T491 413T503 385Q563 469 666 469Q731 469 769 446T814 350Q815 343 815 185Q815 31 813 25Q808 9 796 5T758 0H737L692 1Q672 7 665 28L664 186V206V290Q664 349 655 365T610 381Q581 381 560 370T529 341T515 311T510 291Q509 286 509 157V82Q509 24 501 12T452 0H431L386 1Q366 7 359 28L358 186V206V290Q358 349 349 365T304 381Q275 381 254 370T223 341T209 311T204 291Q203 286 203 157V82Q203 24 195 12T146 0H125L80 1Q60 7 53 28V437Q58 453 80 464H122H142Q167 464 178 460T195 439Q197 434 197 409V386",120315:"197 386Q264 468 350 468Q375 468 390 467T429 460T466 443T492 408T507 351Q508 342 508 185Q508 31 506 25Q498 0 450 0H432H413Q368 0 359 23Q357 31 357 186Q356 345 355 350Q349 369 336 376Q324 381 301 381H298Q269 381 242 362Q217 342 210 316T202 239Q202 229 202 202T203 157V82Q203 24 195 12T146 0H125L80 1Q60 7 53 28V437Q58 453 80 464H122H142Q167 464 178 460T195 439Q197 434 197 409V386",120316:"274 -11Q32 -11 32 225Q32 346 85 406T249 474H266H271Q302 474 325 471T385 458T451 419T498 346Q518 300 518 225Q518 -11 274 -11ZM367 233Q367 322 350 354T270 387Q240 387 222 377T195 344T184 298T182 233Q182 151 198 117T275 83H282Q318 83 339 104Q355 119 361 146T367 233",120317:"125 458H139Q174 458 185 452T202 420L211 426Q245 448 288 458T354 469Q356 469 361 469T369 468Q443 468 481 412Q523 355 523 223Q523 164 509 120T473 51T423 12T371 -7T323 -11Q260 -11 204 33V-65Q204 -80 204 -102T205 -131Q205 -162 200 -175T178 -192Q173 -194 126 -194L81 -193Q61 -187 54 -166V431Q58 447 81 458H125ZM372 230Q372 376 282 376Q247 376 204 352V107L208 103Q213 99 218 95T232 87T251 79T274 76Q323 76 349 116Q372 153 372 230",120318:"226 -11Q37 -11 37 236Q37 294 51 338T86 407T135 445T186 464T233 469H235Q300 469 349 422L359 413V425Q359 452 376 464Q384 469 433 469H455Q498 469 505 444Q507 438 507 137Q507 -163 505 -169Q500 -185 487 -189T450 -194H432H413Q367 -194 358 -171Q356 -163 356 -63V40L348 33Q296 -11 231 -11H226ZM281 375Q188 375 188 228Q188 77 275 77Q322 77 359 120V328Q338 357 324 366T281 375",120319:"54 437Q58 453 81 464H122H147Q186 464 194 439Q196 434 196 405V377L203 387Q245 456 324 468Q325 468 331 468T340 469Q347 469 356 462V360Q350 355 346 354T339 353T326 353T300 347Q260 337 234 311T202 252Q201 247 201 138Q201 122 201 98T202 66Q202 33 197 20T175 2Q170 0 125 0L81 1Q61 7 54 28V437",120320:"37 328Q37 392 75 433T203 474Q254 474 265 473Q319 465 370 442Q378 439 380 432Q380 426 372 384Q364 336 359 333Q358 331 355 331Q348 331 337 341Q282 388 216 388H208Q190 388 180 387T161 377T151 351Q151 333 164 323T224 306L267 297Q314 285 355 246T396 144Q396 17 282 -5Q260 -10 218 -10Q170 -10 124 2T55 26T30 44Q30 48 39 99T49 153Q52 159 60 159Q66 159 70 153Q100 120 133 101T218 82Q231 82 238 83T258 87T277 101T283 126Q283 149 260 160T200 176T153 186Q109 201 73 236T37 328",120321:"225 267Q225 202 226 169T232 115T244 88T265 82Q295 84 318 100T345 116Q352 116 354 110T364 77Q373 46 373 43Q373 28 312 9T190 -10Q160 -10 139 1T107 29T89 77T82 136T80 210V258V371H66H59Q39 371 27 386Q20 394 20 417Q21 432 23 437Q35 458 60 458H65H83V510L84 562Q93 589 131 589H154H174Q216 589 223 564Q225 558 225 508V458H274Q330 458 338 453Q355 441 355 415Q355 388 338 376Q330 371 274 371H225V267",120322:"53 431Q62 459 100 459Q105 459 114 459T127 458H152Q192 458 201 435Q203 427 203 262Q204 86 208 77Q209 74 216 71Q227 66 258 66H264Q334 66 354 140L356 150L357 290Q357 427 359 435Q365 449 377 453T412 458H432H450Q498 458 506 433Q508 427 508 229T506 25Q498 0 451 0H434H418Q386 0 374 7T360 43V58L352 49Q298 -11 199 -11Q135 -9 101 11T56 80Q52 100 52 273L53 431",120323:"26 429T26 435T32 448T44 456Q48 458 85 458H99Q145 458 161 431Q162 429 207 285L251 145L294 284Q333 410 341 430Q351 451 374 456Q379 458 420 458H430Q450 458 457 456T471 443Q473 437 473 435Q473 426 443 325T381 126L350 28Q339 7 316 2Q312 0 250 0Q187 0 183 2Q160 7 149 28L136 68Q124 109 106 166T70 283T39 385",120324:"699 458Q717 447 719 432Q719 426 666 230T610 27Q602 10 588 5T548 0H512H482Q431 0 420 17T384 135Q356 241 352 298V308L351 295Q348 251 322 145T290 28Q279 0 233 0H212H191Q146 0 133 27Q130 33 77 229T24 430Q24 449 44 457Q47 458 79 458Q122 458 126 456Q154 450 163 419L233 153Q241 187 272 304T307 431Q318 458 368 458Q394 458 398 456Q421 451 430 431Q434 423 509 147L547 286Q582 416 588 429Q600 454 624 457Q632 458 647 458H663H699",120325:"92 0Q87 0 77 0T62 -1Q24 -1 24 22Q24 29 33 41T106 136Q185 237 184 238Q184 239 147 284T73 376T33 427Q31 430 31 436Q31 451 45 457Q48 458 96 458H122Q152 458 163 450T208 394L247 345L282 394Q288 403 297 416T309 434T319 444T328 452T338 455T352 458T372 458H393H440Q457 449 457 435Q457 428 450 419T379 328Q308 239 308 237L389 137Q409 112 436 79Q475 31 475 23Q475 -1 436 -1Q432 -1 422 -1T407 0Q360 0 352 3Q343 6 336 16T291 83L247 151L245 148Q243 145 239 139T229 124T218 106T204 84Q167 24 160 15T141 1L92 0",120326:"454 458Q473 446 473 430Q473 426 394 184L311 -68Q291 -119 245 -162T123 -205Q51 -205 46 -190Q44 -187 40 -142T36 -92Q36 -90 36 -88L37 -87Q41 -80 46 -80Q48 -80 73 -92T126 -105Q146 -105 161 -98T185 -76T197 -53T206 -28L215 0L122 212Q29 427 29 435Q29 448 46 457Q49 458 91 458Q93 458 106 458T125 457T140 454T157 446T170 431Q183 410 224 305T266 158Q266 152 266 151Q267 151 268 163Q271 206 302 310T342 432Q354 458 398 458H418H454",120327:"268 376Q250 376 180 375T92 374Q69 374 63 380Q46 390 46 419Q46 428 49 437Q57 451 73 457Q76 458 242 458T413 456Q420 455 427 448Q439 438 439 413Q439 392 433 385Q432 383 318 236T204 88Q235 88 306 89T395 90H399Q408 90 414 89T427 84T438 70T442 45Q442 9 416 2Q411 0 236 0H136Q73 0 62 1T41 12Q31 23 31 47Q31 68 36 77Q37 78 51 97T96 155T153 228L268 376",120328:"28 0L429 694H533L585 350Q596 275 610 182T632 46L638 3V0H530L528 18Q527 25 515 103T503 183H223L135 29L118 1L73 0H28ZM492 254Q492 256 473 398T454 589V610Q433 552 290 301L264 255L378 254H492",120329:"501 363Q557 355 605 316T653 222Q653 148 586 85T403 2Q394 1 240 0Q90 0 90 1L100 46Q109 90 128 177T164 348L238 694H375Q518 693 546 688Q614 674 655 635T696 544Q696 490 648 441T516 368L501 363ZM601 530Q601 568 566 590T479 621Q472 622 394 623H320L297 513Q292 489 286 459T276 415L273 401V399H339H372Q504 399 571 466Q601 498 601 530ZM257 322Q256 320 230 197T203 73Q203 71 289 71Q379 72 387 73Q459 84 507 122T556 210Q556 255 519 283T428 320Q415 322 336 323Q257 323 257 322",120330:"124 266Q124 372 179 473T333 639T544 705Q592 705 635 697T698 679L718 670Q719 669 701 621T681 572L676 576Q670 580 661 586T641 598T614 611T583 620Q558 625 526 625Q406 625 318 516T230 276Q230 238 236 212Q251 148 294 108T412 68Q469 68 508 80T598 123Q608 129 608 128Q606 109 603 87L598 45L573 33Q521 7 486 -1T394 -10Q358 -10 346 -8Q260 5 202 62Q124 145 124 266",120331:"162 348L236 694H385Q535 693 543 692Q600 682 641 654T705 586T737 506T747 425Q747 296 672 187Q625 114 548 62T384 1Q376 0 262 0Q88 0 88 1L98 46Q107 90 126 177T162 348ZM622 533Q575 624 443 624Q434 624 419 624T399 623H321L263 348Q249 283 234 213T212 107L204 72Q204 71 289 71Q374 72 386 74Q501 94 573 193T646 422Q646 487 622 533",120332:"86 2Q88 4 160 346T233 689Q233 691 461 691Q688 691 688 689Q685 686 671 611H495L320 612L319 609Q319 607 297 501L274 397H436Q597 397 597 396L596 391Q595 386 593 376T589 358L581 322L420 321Q258 321 258 320Q209 89 208 87Q208 85 390 85Q417 85 460 85T518 86L572 85Q556 8 554 2V0H86V2",120333:"86 2Q88 4 160 346T233 689Q233 691 453 691T673 689Q670 686 656 611H488L320 612Q314 579 302 523T281 427T272 385Q272 384 419 384H567L551 308H255L223 156Q216 124 207 82T194 20L190 2Q190 0 138 0H86V2",120334:"125 267Q125 375 182 476T337 641T544 705Q598 705 644 693T710 669T730 655L712 609L693 560L692 557L681 567Q618 626 526 626Q447 626 378 573T269 440T229 277Q229 185 276 127T406 68Q422 68 451 71T502 78T524 84L526 93Q528 102 532 119T539 153L553 222Q553 223 495 223Q436 223 436 224Q436 230 444 262L452 299H662V296Q661 290 635 166T607 40Q606 37 576 25T492 1T391 -11Q272 -11 199 66T125 267",120335:"517 2Q518 3 551 161T585 322Q586 323 557 323T422 323H259L190 0H138Q86 0 86 1L96 46Q105 90 124 177T160 348L234 694H337V691Q336 690 306 545T275 399H602L603 403Q603 407 634 551L665 694H768V691Q768 690 695 348T621 2V0H517V2",120336:"161 348L235 694H338V691Q338 690 265 348T191 2V0H139Q87 0 87 1L96 46Q106 90 125 177T161 348",120337:"377 424L435 694H535V691Q534 685 476 412T416 135Q401 74 350 26T210 -22Q165 -22 124 -11T65 9T46 21L54 41Q62 61 70 83T81 109Q82 111 85 106Q86 105 87 103Q93 94 103 84T135 64T185 53Q238 53 272 76T317 142Q317 145 325 182T348 289T377 424",120338:"236 223Q235 222 213 113T188 2V0H138Q88 0 88 1L98 46Q107 90 126 177T162 348L236 694H285Q335 694 335 693L330 671Q326 649 316 603T298 518Q289 477 280 433T266 366L261 343L672 694H729L784 693L465 420L651 0H596L541 1L384 350Q383 351 310 288T236 223",120339:"161 348L235 694H338V691Q338 690 273 385T208 79Q278 80 362 80H516Q502 11 499 2V0H293Q87 0 87 1L96 46Q106 90 125 177T161 348",120340:"375 691Q456 215 459 124V106Q488 177 762 641L793 694H929V691Q929 690 856 348T782 2V0H689V2Q691 4 753 304Q817 604 818 606Q819 611 817 608Q817 607 815 603Q798 559 540 117L484 22H440L397 23L393 42Q393 47 373 169T334 422T315 594V609L250 306Q186 3 185 2Q185 0 138 0Q92 0 92 1L102 46Q111 90 130 177T166 348L240 694H375V691",120341:"311 609Q310 608 246 306T181 2V0H134Q88 0 88 1L98 46Q107 90 126 177T162 348L236 694H382L383 691Q383 688 418 561T493 286T541 97L544 84L545 89Q545 90 553 128T578 246T610 394L674 694H766V691Q766 690 693 348T619 2V0H472L469 13Q468 17 393 293T312 605L311 609",120342:"118 254Q118 366 174 473T324 648T517 716Q627 716 695 638T763 435Q763 321 706 215T555 43T362 -22Q256 -22 187 56T118 254ZM380 58Q452 58 518 116T622 263T661 442Q661 496 646 535T608 594T567 622T534 634Q516 636 496 636Q400 636 313 528T225 264Q225 172 267 115T380 58",120343:"162 348L236 694H378Q522 693 530 692Q604 680 647 635T690 524Q690 474 665 430T612 359Q550 299 465 280Q443 275 343 274H250V271Q250 269 235 201T206 68T192 2V0H140Q88 0 88 1L98 46Q107 90 126 177T162 348ZM594 513Q594 560 562 588T477 622Q470 623 394 623H321L293 487L263 349V347H342H347H375Q530 347 578 449Q594 483 594 513",120344:"118 254Q118 366 174 473T324 648T517 716Q627 716 695 638T763 435Q763 305 693 194T543 36Q547 29 586 -47T625 -125H504L450 -8Q406 -22 363 -22Q256 -22 187 56T118 254ZM661 437Q661 532 616 584T506 636Q428 636 361 578T257 433T220 258Q220 167 264 113T380 58Q390 58 397 58T408 59T413 60T417 61Q417 63 387 127T356 193Q356 194 409 194H462L485 150L508 105Q509 103 532 125T567 161Q661 278 661 437",120345:"162 348L236 694H375H414H445Q507 694 538 690T606 668Q698 623 698 534V528Q698 447 608 377Q582 358 555 345T512 326L497 321L617 0H565L513 1L402 309H255L189 0H138Q88 0 88 1L98 46Q107 90 126 177T162 348ZM603 525Q603 603 499 620Q486 622 403 623H321L297 506Q292 482 285 449T274 402L271 387V385H346Q350 385 363 385T386 384Q548 384 592 479Q603 503 603 525",120346:"161 478Q161 568 242 642T435 716Q527 716 599 673L609 667Q595 633 589 615L571 568Q570 568 564 575T546 592T518 611T475 628T417 635Q351 635 305 596T259 507Q259 465 290 444T372 411T432 396Q473 385 509 343T545 236Q545 140 464 59T270 -22Q155 -22 54 48L92 146Q93 146 101 138T124 117T161 92T216 72T288 63Q360 63 403 109T447 204Q447 220 444 233T435 256T421 273T404 285T385 295T366 301T347 306T331 310T315 314T292 321T265 331T235 346T207 367T183 395T168 431T161 478",120347:"165 608L182 687Q182 688 486 688H790L789 685L781 645L773 609H521L457 306Q393 3 392 2Q392 0 340 0H288V2Q289 5 353 304T417 605V609L291 608H165",120348:"340 -22Q251 -22 191 33T131 177V187Q131 192 131 195T132 205T133 215T136 231T141 253T147 285T156 328T168 384T184 457L235 694H338V691Q338 690 288 451T236 210Q234 194 234 177Q234 138 247 111T280 72T319 54T357 49Q408 49 449 74T510 128Q516 136 521 143T530 158T538 175T545 194T553 220T560 250T569 289T579 336T591 395T606 464L655 694H747V691Q651 243 645 213Q623 149 587 102Q482 -22 340 -22",120349:"220 348L161 694H216Q270 694 270 693L283 613Q334 313 346 215Q359 102 359 96Q359 87 358 84Q388 162 684 657L706 694H753Q799 694 799 693L387 0H333Q279 0 279 1L272 45Q264 89 249 177T220 348",120350:"596 540Q596 562 597 585T599 609Q599 588 436 255Q402 185 362 104L310 0H213V3Q213 6 188 347T161 694H263L265 664Q290 327 293 184Q293 112 289 85Q290 85 290 87Q290 95 301 123T332 194T373 282T419 380T463 469T498 541T517 579L574 694H671V689L674 646Q678 603 682 538T691 401T699 263T703 160Q703 102 700 87Q719 154 930 576L989 694H1076Q1076 693 903 347L730 0H628V4L626 26Q624 48 622 85T616 168T609 267T603 369T598 464T596 540",120351:"14 0Q17 3 184 184T352 367L265 529Q244 567 222 609T188 672L176 692Q176 694 236 694H297L338 612Q387 515 400 489L421 448L645 694H758L708 640Q481 393 456 368Q455 366 500 281T596 104T652 0H531L388 293L128 0H14",120352:"151 692Q151 694 212 694H272L418 362L696 683L705 694H758L809 693Q809 692 630 490T444 280Q442 275 413 139L383 1L333 0Q282 0 282 2Q283 3 312 141L341 278L246 484L151 692",120353:"67 54Q551 615 551 617Q543 618 517 618Q510 618 463 618T376 617Q200 617 200 618T209 657L216 694H459Q702 694 702 692Q702 689 697 667L692 643L207 80H392Q493 81 577 81Q577 70 560 2V0H55V2L67 54",120354:"313 386Q286 386 260 381T217 369T186 355T164 342T155 337Q154 338 159 377T165 418Q251 461 320 461Q322 461 328 461T337 460Q397 460 435 424T473 329Q473 325 473 318T472 308Q432 110 407 2V0H317V2L325 38Q295 21 269 10Q215 -10 156 -10H149Q76 -10 62 69Q61 75 61 90Q61 127 73 150T116 194Q146 215 207 231T348 252H368L373 277Q378 302 378 318Q378 367 339 384Q332 386 313 386ZM150 116Q150 93 171 79T223 65Q259 65 293 85T341 135Q343 140 348 160T353 184Q353 186 342 186Q298 186 231 174T153 134Q150 127 150 116",120355:"302 -11Q266 -11 235 1T190 26L176 38Q170 8 168 2V0H121Q75 0 75 1L84 46Q94 90 113 177T149 348L223 694H267Q312 694 312 693T282 551T251 407Q251 406 256 408T271 415Q347 454 430 454H438Q501 454 528 374Q539 339 539 299Q539 179 466 84T302 -11ZM443 275Q443 317 421 348T346 379Q318 379 296 369Q269 359 238 332L193 118L198 109Q220 65 269 65Q350 65 396 130T443 275",120356:"75 164Q75 226 100 282T165 377T252 437T342 460H347Q447 460 499 417L483 378Q468 339 468 338Q466 338 455 347T424 366T385 378Q355 382 334 382Q262 382 215 318T168 177Q168 120 196 95T259 69H269Q345 69 420 108Q432 114 432 113T427 72L422 32L402 22Q382 12 344 2T259 -11Q214 -11 180 2T126 36T95 81T79 126T75 164",120357:"73 156Q73 224 102 293T184 408T294 455Q375 455 432 413Q438 407 438 410T469 553L499 694H588V691Q588 690 515 348T441 2V0H348V2Q357 29 357 43L352 41Q332 24 288 7T196 -10H190Q178 -10 166 -7T134 8T98 46T75 113Q73 129 73 156ZM419 335Q419 339 412 348T386 368T342 379Q284 379 243 343T184 261T167 168Q167 122 191 94T263 66Q321 66 367 116L374 124L397 229Q419 333 419 335",120358:"248 -11Q170 -11 121 41T71 173Q71 265 133 349T285 454Q305 460 318 460H328Q368 460 399 448Q472 414 472 309Q472 274 464 234L462 219H159Q156 198 156 185Q156 137 179 107T237 68Q246 66 268 66Q345 66 427 113V109Q426 108 422 73T417 37Q417 34 409 29Q329 -11 248 -11ZM401 299Q399 337 376 361T316 385Q291 385 266 371Q220 350 184 289H401V299",120359:"381 443Q381 440 374 407T366 371H315Q263 371 263 369Q262 368 224 186Q215 145 205 97T189 25L184 2V0H94V2L99 25Q104 48 114 96T134 186Q172 368 173 369Q173 371 139 371H106V373L114 410L121 444H155L188 445L191 455L212 551Q232 612 288 658T415 705Q438 705 464 701T494 694Q478 614 477 614L467 618Q457 621 440 624T406 629H400Q333 629 306 579Q301 568 289 507L275 444H328Q381 444 381 443",120360:"113 252Q113 334 177 394T311 454Q332 454 350 451T379 442T398 432T410 424L413 421Q412 423 411 424L409 426Q409 429 434 436T496 449T560 455H568V451Q568 447 567 429T566 394L565 377L553 379Q522 385 479 385Q463 385 456 384L443 383L436 392Q454 357 454 324Q454 243 390 182T249 120Q233 120 219 122T195 128T178 136T167 142L163 145Q149 131 149 105Q149 78 171 72L242 71Q246 71 269 71T303 71T336 68T372 62T403 51T432 32Q461 8 461 -40Q461 -112 383 -159T211 -206Q123 -206 68 -172T12 -86Q12 -55 31 -23T82 32Q90 38 89 39Q89 40 87 44T82 59T80 82Q80 134 126 189Q113 228 113 252ZM369 319Q369 354 350 368T304 383Q274 383 252 369T218 333T202 291T197 255Q197 221 217 206T263 191Q317 191 343 233T369 319ZM373 -59Q373 -41 362 -30T330 -13T291 -7T247 -5H216Q167 -5 158 -6T139 -12Q123 -20 110 -38T97 -76Q97 -102 133 -118T221 -134Q242 -134 267 -130T316 -118T357 -94T373 -59",120361:"416 321Q416 379 336 379Q276 379 237 302Q226 276 209 202T180 66T166 2V0H119Q73 0 73 1L82 46Q92 90 111 177T147 348L221 694H265Q310 694 310 693T279 544L247 395Q325 455 403 455Q513 455 513 358Q513 334 508 309Q507 304 476 156T443 2V0H350V2L357 34Q364 65 373 110T392 200T409 281T416 321",120362:"189 578Q190 579 199 627T211 678V680H315V678Q313 675 304 627T293 578V576H189V578ZM168 442T168 443T213 444T258 443T212 225T164 2V0H74V2Q75 7 121 224",120363:"211 577L233 680H284Q336 680 336 679L315 576H263Q211 576 211 577ZM19 -204Q-12 -204 -40 -196T-82 -179T-96 -170Q-96 -168 -78 -132L-61 -95L-54 -103Q-32 -126 3 -126Q26 -126 50 -116Q76 -101 83 -85Q84 -79 140 180T196 443Q196 444 241 444T286 443Q286 441 232 186T175 -75Q163 -120 122 -162T19 -204",120364:"150 348L224 694H310V691Q218 259 218 258L232 270Q245 281 274 306T327 351L435 444H489L542 443Q542 442 443 357L344 272L471 1L422 0H372L366 14Q359 27 347 54T323 105L273 210Q271 210 231 174L190 139L160 0H118Q76 0 76 1L86 46Q95 90 114 177T150 348",120365:"148 348L222 694H311V691Q311 690 238 348T164 2V0H119Q74 0 74 1L84 46Q93 90 112 177T148 348",120366:"416 321Q416 379 336 379Q276 379 237 302Q226 276 209 202T180 66T166 2V0H119Q73 0 73 2L121 226L169 449Q169 450 213 450H256L249 421Q248 417 247 412T246 404T245 398T244 394T244 392Q250 398 261 407T307 433T379 454H392H400Q451 454 472 439Q482 434 489 427T500 412T506 399T510 388L511 384Q511 384 517 388Q563 431 620 446Q648 455 680 455Q790 455 790 358Q790 334 785 309Q784 304 753 156T720 2V0H627V2L634 34Q641 65 650 110T669 200T686 281T693 321Q693 379 613 379Q553 379 514 302Q503 276 486 202T457 66T443 2V0H350V2L357 34Q364 65 373 110T392 200T409 281T416 321",120367:"416 321Q416 379 336 379Q276 379 237 302Q226 276 209 202T180 66T166 2V0H119Q73 0 73 2L121 226L169 449Q169 450 213 450H256L249 421Q248 417 247 412T246 404T245 398T244 394T244 392Q250 398 261 407T307 433T379 454H392Q416 454 433 452T470 440T502 411T513 358Q513 334 508 309Q507 304 476 156T443 2V0H350V2L357 34Q364 65 373 110T392 200T409 281T416 321",120368:"69 169Q69 238 107 306T211 417T348 461Q419 461 471 412T523 271Q523 161 438 75T247 -11Q170 -11 120 39T69 169ZM432 279Q432 338 401 361T333 385Q280 385 240 352T182 273T164 178Q164 119 195 94T265 68Q306 68 344 94Q380 115 406 169T432 279",120369:"259 443Q251 405 251 404L260 409Q269 414 286 421T324 436T375 449T434 455Q482 455 510 417T538 303Q538 169 463 79T302 -11Q226 -11 176 39V36Q175 35 151 -80L127 -193Q127 -194 80 -194H34V-191L102 127L169 443Q169 444 214 444T259 443ZM269 65Q332 65 386 124T441 262Q441 304 422 334T370 373Q356 375 339 375Q293 375 238 331L193 118Q200 103 206 94T229 75T269 65",120370:"72 149Q72 272 146 363T304 455Q340 455 371 442T409 423T436 398Q438 411 442 427L448 455H538L400 -193Q400 -194 354 -194Q307 -194 307 -193L356 37V41Q355 41 350 38T332 27T302 13Q247 -10 191 -10H179Q138 -10 105 32T72 149ZM414 298Q402 376 341 376Q277 376 223 317T169 182Q169 121 198 93T265 65Q319 65 365 111L377 123L414 298",120371:"240 377L244 380Q248 384 255 390T272 404T296 419T325 434T361 446T401 454Q403 454 408 454T416 455H424L421 442Q419 435 413 405T406 373Q351 373 294 336T216 237Q213 231 201 173T178 60T164 2V0H119Q74 0 74 2L122 226L170 449Q170 450 213 450H255L247 414Q246 409 245 403T243 393T241 385T240 379T240 377",120372:"99 299Q99 318 106 341T133 393T195 441T298 461Q336 461 370 453T420 437L436 429Q436 428 421 389T405 350Q356 386 273 386H265Q248 386 237 384T211 371T191 337Q189 329 189 326Q189 320 190 315T194 306T200 299T209 293T218 289T228 285T239 283T251 281T263 278L270 276Q278 275 283 274T298 270T316 264T333 255T351 243T367 228T380 209T388 186T391 157Q391 96 341 43T193 -11Q171 -11 150 -8T114 -1T84 9T61 19T45 28T35 33Q35 36 67 116L76 109Q132 67 211 67Q258 67 279 88T301 135Q301 159 280 170T224 187T180 197Q141 212 120 239T99 299",120373:"245 68Q267 68 289 75T322 90L334 98Q338 94 338 28V24L324 19Q268 -4 218 -8Q198 -11 177 -11Q118 -11 118 75Q118 98 123 127Q125 137 149 251T174 369Q174 371 135 371H97V373L105 410L112 444H152L192 445L200 478Q208 512 213 541L219 571H261Q303 571 303 570T290 506L276 444H343Q410 444 410 443Q410 440 403 407T395 371H328Q261 371 261 369Q211 152 211 118Q211 68 245 68",120374:"166 -10H160Q146 -10 137 -8T115 0T97 22T90 63Q90 79 130 268L167 443Q167 444 214 444Q260 444 260 443L224 273Q187 97 187 86Q187 70 202 65T250 59Q303 59 336 83T379 139Q380 143 412 292T444 443Q444 444 491 444Q537 444 537 443T491 225T443 2V0H353V2L361 38L352 34Q344 29 326 22T286 7T232 -5T166 -10",120375:"177 6L108 442V444H201V442Q202 441 213 371T235 213T246 90V65Q259 117 429 406L450 444H495Q540 444 540 443Q539 442 411 221L282 1L230 0H178L177 6",120376:"148 5Q147 8 128 222T109 440L108 444H199V442Q200 441 204 385T214 253T219 140Q219 108 215 76Q215 72 214 67V65L215 66Q219 95 278 221L390 444H475V437Q497 203 497 121Q497 90 494 70Q494 67 494 67L496 73Q520 143 654 405L674 444H718Q762 444 762 443L534 1L483 0H432V5Q429 28 422 126T413 283Q413 343 416 370L417 378Q416 377 416 376Q401 303 248 12L242 0H148V5",120377:"317 229Q453 9 460 0H409L359 1L312 88Q266 176 265 176Q265 177 254 165T223 132T182 88L100 0H1L15 14Q29 28 61 59T118 115L236 229L226 244Q108 433 100 444H201L290 294L438 444H537L528 435Q526 432 512 418T468 376T418 327L317 229",120378:"11 -117L20 -120Q28 -124 46 -128T84 -132H100Q124 -122 149 -85Q200 -6 200 1Q200 17 155 204T109 442Q109 444 156 444H203Q203 443 208 419T221 357T235 277T248 190T254 114Q254 81 250 67V65Q251 65 251 67Q256 94 297 177Q339 259 422 397L450 444H540Q540 443 386 186T219 -90Q179 -153 145 -179T73 -205Q52 -205 34 -202Q29 -202 21 -201T7 -198L1 -197Q1 -196 6 -157T11 -117",120379:"129 408L136 444H315Q494 444 494 443Q494 441 489 419L484 396L164 76L291 77Q418 77 418 76T411 41T402 2V0H215Q28 0 28 2L34 27L38 50L360 371L240 370Q121 370 121 371Q124 388 129 408",120432:"191 76Q212 75 220 68T229 38Q229 10 208 1H129H80Q48 1 38 7T28 38Q28 51 29 57T40 69T70 76Q89 76 89 78Q90 79 117 205T173 461T205 599Q212 623 250 623H262H273Q312 623 319 599Q322 591 350 461T406 205T435 78Q435 76 454 76H458Q484 76 493 59Q496 53 496 38Q496 11 478 3Q474 1 395 1H317Q295 8 295 38Q295 65 311 73Q316 75 333 76L348 77V78Q348 80 341 112L334 143H190L183 112Q176 80 176 78Q175 76 178 76Q180 76 191 76ZM318 221Q313 238 288 366T263 519Q263 526 262 527Q261 527 261 520Q261 493 236 365T206 221Q206 219 262 219T318 221",120433:"39 1Q17 10 17 32V38V46Q17 65 34 73Q40 76 61 76H84V535H61H54Q27 535 19 553Q17 557 17 573Q17 583 17 587T23 599T39 610Q40 611 179 611Q320 610 332 607Q332 607 339 605Q394 591 427 547T461 454Q461 413 436 378T369 325L358 320Q405 311 443 270T482 169Q482 112 445 64T345 3L334 1H39ZM309 533Q302 535 234 535H168V356H230Q284 357 296 358T323 368Q346 380 361 402T377 452Q377 482 358 505T309 533ZM398 176Q396 218 371 246T315 279Q310 280 237 280H168V76H239Q316 77 327 81Q329 82 334 84Q398 107 398 176",120434:"40 305Q40 437 110 529T281 622Q315 622 343 611T387 589T404 578Q409 585 415 596T425 611T435 618T452 622Q472 622 478 609T485 566Q485 559 485 540T484 508V460Q484 413 478 403T442 393Q417 393 409 402Q400 409 400 420Q400 428 395 445T380 487T347 528T295 546Q235 546 180 483T124 306Q124 245 141 197T186 121T241 80T296 66Q346 66 373 103T400 178Q400 209 435 209H442H450Q484 209 484 172Q480 96 421 43T281 -11Q177 -11 109 84T40 305",120435:"38 1Q16 8 16 38Q16 62 32 73Q39 76 58 76H78V535H58Q40 535 32 538Q16 548 16 573Q16 587 17 591Q23 604 34 607T83 611H166H176Q188 611 209 611T239 612Q299 612 337 597T415 530Q485 438 485 300Q485 180 431 100T301 3L291 1H38ZM400 301Q400 363 385 410T346 482T303 519T267 534Q261 535 210 535H162V76H214L267 77Q323 89 361 148T400 301",120436:"374 271Q374 241 367 232T332 223Q307 223 299 231Q290 240 290 263V279H173V76H418V118V144Q418 167 426 176T460 186Q491 186 500 166Q502 161 502 93V52Q502 25 499 17T480 1H41Q19 9 19 32V38Q19 63 36 73Q42 76 65 76H89V535H65H55Q44 535 38 537T25 548T19 573Q19 602 41 610H47Q53 610 63 610T88 610T121 610T160 611T204 611T251 611H458Q460 609 465 606T471 602T475 598T478 593T479 586T480 576T480 562V526V488Q480 452 462 444Q458 442 438 442Q413 442 405 450Q398 457 397 463T396 501V535H173V355H290V371Q290 394 299 403T332 412Q363 412 372 392Q374 387 374 317V271",120437:"384 260Q384 230 377 221T342 212Q317 212 309 220Q300 229 300 252V268H179V76H249Q264 67 267 61T271 38Q271 10 249 1H44Q22 9 22 32V38Q22 63 39 73Q45 76 69 76H95V535H69H59Q42 535 32 542T22 573Q22 602 44 610H50Q56 610 66 610T91 610T125 610T164 611T208 611T257 611H468Q470 609 475 606T481 602T485 598T488 593T489 586T490 576T490 562V526V488Q490 452 472 444Q468 442 448 442Q423 442 415 450Q408 457 407 463T406 501V535H179V344H300V360Q300 383 309 392T342 401Q373 401 382 381Q384 376 384 306V260",120438:"38 306Q38 447 105 534T261 622Q280 622 298 618T329 608T350 596T366 585L371 581Q373 581 377 591T390 612T417 622Q437 622 443 609T450 566Q450 559 450 540T449 508V460Q449 413 443 403T407 393Q392 393 386 394T373 402T364 426Q360 472 335 509T271 546Q214 546 168 477T121 308Q121 210 164 138T271 65Q293 65 310 78T337 109T352 147T360 180T362 195Q362 196 333 196L304 197Q282 204 282 227V234Q282 247 282 251T288 261T304 272H474Q488 263 492 256T496 234Q496 211 479 199Q475 197 461 196H449V21Q441 6 434 3T412 -1H407H402Q385 -1 379 3T364 28Q350 14 322 2T260 -11Q173 -11 106 76T38 306",120439:"16 571Q16 597 27 604T74 611H125H208Q223 602 226 596T230 573Q230 559 227 551T217 540T204 536T186 535H165V356H359V535H338H333Q306 535 297 552Q295 556 295 573Q295 586 295 590T301 600T317 611H486Q501 602 504 596T508 573Q508 559 505 551T495 540T482 536T464 535H443V76H464H470Q482 76 489 75T502 64T508 38Q508 10 486 1H317Q306 5 301 11T296 21T295 38V44Q295 66 311 73Q318 76 338 76H359V280H165V76H186H192Q204 76 211 75T224 64T230 38Q230 10 208 1H39Q28 5 23 11T18 21T17 38V44Q17 66 33 73Q40 76 60 76H81V535H60Q45 535 38 536T24 545T16 571",120440:"400 76Q431 76 441 69T452 38Q452 29 452 26T450 18T443 9T430 1H95Q84 6 79 12T73 23T72 38Q72 65 90 73Q96 76 157 76H220V535H157H124Q93 535 83 542T72 573Q72 603 93 610Q97 611 264 611H430Q432 609 436 607T444 602T449 594Q452 588 452 573Q452 546 434 538Q428 535 367 535H304V76H367H400",120441:"202 543T202 573T224 610H228Q231 610 237 610T251 610T269 610T291 611T315 611T342 611H457Q471 602 475 595T479 573Q479 549 462 538Q454 535 432 535H408V328Q408 159 408 133T402 93Q386 48 340 19T229 -11Q158 -11 108 16T57 100Q57 129 73 141T108 154Q128 154 143 140T159 102Q159 93 155 79Q188 65 228 65H230Q290 65 318 106Q323 115 323 139T324 329V535H274L224 536Q202 543 202 573",120442:"18 549T18 573T29 604T70 611H118H193Q207 603 210 596T214 573Q214 549 198 538Q191 535 172 535H152V421Q152 344 152 326T153 309L242 422L329 534Q327 535 322 536T314 538T308 542T303 548T300 558T298 573Q298 600 316 608Q322 611 392 611H463Q477 602 481 595T485 573Q485 535 446 535H441H420L281 357L436 77L454 76Q473 75 478 73Q495 62 495 38Q495 10 473 1H345Q334 5 329 11T324 21T323 38Q323 51 324 56T332 68T355 77L233 296L152 192V76H172Q191 76 198 73Q214 63 214 38Q214 9 193 1H41Q18 8 18 38Q18 61 35 73Q42 76 61 76H81V535H61Q42 535 35 538Q18 549 18 573",120443:"27 594Q34 605 43 608T84 611H154H213Q258 611 269 605T281 573Q281 546 263 538Q257 535 222 535H185V76H404V118V145Q404 168 411 177T446 186H453Q478 186 486 167Q488 161 488 93V50Q488 24 485 17T466 1L258 0H147H99Q47 0 36 6T25 38Q25 59 35 69Q44 76 76 76H101V535H76H64Q36 535 27 552Q25 557 25 573T27 594",120444:"50 535Q37 536 31 537T18 547T12 573Q12 598 22 604T62 611H91H121Q147 611 158 607T178 587Q183 579 222 446T261 293Q261 289 262 288Q263 288 263 292Q263 311 298 434T346 588Q353 603 365 607T402 611H435H450Q488 611 500 605T512 573Q512 556 506 547T493 537T474 535H459V76H474Q487 75 493 74T505 64T512 38Q512 11 494 3Q490 1 424 1H386Q355 1 345 7T335 38Q335 55 341 64T354 74T373 76H388V302Q388 512 387 519Q382 482 346 359T304 228Q292 204 262 204T220 228Q215 237 179 359T137 519Q136 512 136 302V76H151Q164 75 170 74T182 64T189 38Q189 11 171 3Q167 1 101 1H63Q32 1 22 7T12 38Q12 55 18 64T31 74T50 76H65V535H50",120445:"20 571Q20 598 30 604T73 611H105H136Q152 611 160 611T177 607T189 601T198 587T206 568T217 537T231 497Q354 142 365 95L368 84V535H347H342Q314 535 306 552Q304 556 304 573Q304 586 304 590T310 600T326 611H482Q497 602 500 596T504 573Q504 559 501 551T491 540T478 536T460 535H439V25Q432 7 424 4T389 0H374Q334 0 322 31L293 115Q171 468 159 517L156 528V76H177H183Q195 76 202 75T215 64T221 38Q221 10 199 1H43Q32 5 27 11T22 21T21 38V44Q21 66 37 73Q44 76 64 76H85V535H64Q49 535 42 536T28 545T20 571",120446:"102 588Q140 621 240 621Q323 621 335 620Q393 613 422 588Q450 560 459 493T468 306Q468 185 460 118T422 23Q382 -10 289 -10H262H235Q142 -10 102 23Q74 50 65 118T56 306Q56 427 64 494T102 588ZM363 513Q357 523 347 530T324 540T302 544T280 546H268Q192 546 167 521Q150 501 145 452T140 300Q140 235 142 197T151 130T172 89T207 71T262 65Q317 65 341 81T374 144T384 300Q384 474 363 513",120447:"41 1Q19 9 19 32V38Q19 63 36 73Q42 76 65 76H89V535H65H55Q38 535 29 543T19 576Q19 603 41 610H49Q57 610 70 610T100 610T136 611T175 611Q190 611 216 611T255 612Q321 612 363 598T441 537Q480 486 480 427V421Q480 354 447 311T378 251Q339 230 275 230H239H173V76H197Q220 76 227 73Q244 62 244 38Q244 10 222 1H41ZM396 421Q396 461 369 491T300 533Q294 534 233 535H173V306H233Q294 307 300 308Q345 319 370 352T396 421",120448:"56 306Q56 380 58 426T68 510T87 568T120 600T170 617T240 621Q323 621 335 620Q393 613 422 588Q450 560 459 493T468 306Q468 124 447 66Q433 23 394 6L424 -53Q454 -112 454 -118Q454 -128 441 -138H377Q367 -135 363 -129T333 -69L304 -11H254Q205 -10 180 -8T128 6T91 36T70 92T58 178T56 306ZM227 151Q227 171 262 171H276H281Q292 171 296 171T305 170T313 165T317 158T323 145T332 127L353 88Q356 88 361 95T372 131T382 202Q384 228 384 306Q384 452 371 492T304 544Q296 545 251 545Q230 545 215 543T188 534T169 520T155 497T147 466T143 423T141 371T140 306Q140 248 141 217T146 154T157 109T178 83T212 68T262 65H266L264 70Q261 75 256 85T247 105Q227 145 227 151",120449:"16 571Q16 598 27 605T76 612Q84 612 108 612T148 611Q268 611 294 605Q346 592 389 550T432 440Q432 394 410 359Q393 329 366 310L358 303Q387 273 399 239Q405 219 405 178T408 106T421 68Q426 65 428 65Q433 65 435 74T438 96T441 112Q450 130 480 130H485Q519 130 522 100Q522 79 516 56T488 11T434 -11Q421 -11 408 -8T377 5T344 37T324 93Q322 101 322 154L321 209Q304 257 257 267Q252 268 207 268H165V76H186H192Q204 76 211 75T224 64T230 38Q230 10 208 1H39Q28 5 23 11T18 21T17 38V44Q17 66 33 73Q40 76 60 76H81V535H60Q45 535 38 536T24 545T16 571ZM348 440Q348 478 321 502T260 532Q252 534 208 535H165V344H208Q212 344 223 344T239 345T252 346T266 348T278 351T293 358Q348 387 348 440",120450:"52 454Q52 524 107 572T229 621Q266 621 274 620Q326 610 360 588L371 581Q377 594 379 598T386 610T397 619T412 622Q433 622 439 610T446 570Q446 563 446 545T445 515V479Q445 441 444 432T436 417Q428 408 403 408T370 417Q361 424 361 434Q361 439 360 448T351 476T331 509T295 535T238 546Q194 546 163 522T132 458Q132 435 148 412Q155 401 166 393T192 380T218 371T247 364T270 359Q341 342 349 339Q389 325 418 296T461 229Q472 201 472 164Q469 92 417 41T287 -11Q240 -11 200 -1T143 19L126 29Q117 6 109 -2Q100 -11 84 -11Q64 -11 58 1T51 42Q51 49 51 66T52 95V135Q52 173 53 180T61 194Q70 203 95 203Q119 203 127 194Q136 186 136 168Q143 66 284 66H290Q325 66 350 85Q391 115 391 165Q391 204 369 228T322 260Q320 260 255 275T185 293Q123 309 88 355T52 454",120451:"129 38Q129 51 129 55T135 65T151 76H220V535H110V501Q110 470 109 464T101 450Q93 442 68 442H60Q37 442 28 461Q26 466 26 527L27 589Q36 607 49 610H55Q61 610 72 610T97 610T131 610T170 611T215 611T264 611H476Q478 609 483 606T489 602T493 598T496 593T497 586T498 576T498 562V526V488Q498 452 480 444Q476 442 456 442Q431 442 423 450Q416 457 415 463T414 501V535H304V76H374Q389 67 392 61T396 38Q396 10 374 1H151Q140 5 135 11T130 21T129 38",120452:"-3 573Q-3 597 8 604T50 612Q57 612 77 612T111 611H200Q214 602 218 595T222 573Q222 549 205 538Q198 535 175 535H151V359Q151 333 151 291Q152 177 156 162Q157 160 157 159Q165 123 193 95T262 66Q303 66 330 94T367 159Q371 175 371 191T373 359V535H349H339Q328 535 322 537T309 548T303 573T306 595T325 611H506Q520 602 524 595T528 573Q528 549 511 538Q504 535 481 535H457V364Q457 189 456 182Q448 101 394 45T262 -11Q189 -11 132 43T68 182Q67 189 67 364V535H43H33Q22 535 16 537T3 548T-3 573",120453:"19 578Q19 585 20 590T23 598T29 604T38 608T48 610T62 611T78 612T97 611T119 611H195Q210 602 213 596T217 573Q217 561 216 555T206 542T179 535H164Q166 529 188 435T235 231T261 94L262 84V88Q263 91 263 94Q265 121 289 231T336 438L360 535H345Q308 535 308 566V573Q308 586 308 590T314 600T330 611H484Q499 602 502 595T505 573Q505 560 504 554T493 541T465 535H447L384 278Q321 19 319 14Q309 -7 278 -7H262H246Q215 -7 205 14Q203 19 140 278L78 535H59Q45 535 38 536T25 547T19 573V578",120454:"459 611Q491 611 501 605T512 573Q512 538 482 535H474L439 276Q406 26 402 11Q398 2 389 -3Q387 -3 386 -4L380 -7H359H349Q324 -7 313 13Q307 29 285 139T263 275Q263 283 262 283Q261 282 261 274Q261 248 239 137T211 13Q200 -7 175 -7H165H144Q136 -3 127 3Q121 10 117 36T85 276L50 535H42Q26 536 19 545T12 564V573Q12 603 33 610Q37 611 101 611H134Q165 611 175 604T186 573Q186 563 186 559T182 547T169 538T143 535H122V531Q124 517 133 446T155 266T172 96V84L173 102Q176 157 192 243T215 346Q227 367 259 367H262H265Q297 367 309 346Q316 329 332 243T351 102L352 84V96Q356 161 368 266T390 444T402 531V535H381Q366 535 359 536T345 547T338 573Q338 600 356 608Q362 611 425 611H459",120455:"39 571Q39 597 49 604T93 611H141H218Q233 602 236 595T239 573Q239 538 210 535Q202 535 202 534T215 507T243 454L257 428L307 535H298Q266 538 266 573Q266 584 267 588T273 598T289 611H366H401Q442 611 454 605T466 573Q466 546 448 538Q442 535 421 535H398L299 327Q299 323 362 201L426 77L449 76Q467 76 475 75T489 65T495 38Q495 11 477 3Q473 1 395 1H317Q295 8 295 38Q295 73 325 76L334 77Q333 78 314 117T276 196L257 235L239 196Q221 157 204 118T186 77Q190 76 196 76Q211 74 218 67T227 55T228 38Q228 28 227 24T221 13T206 1H50Q28 9 28 32V38Q28 63 45 73Q51 76 73 76H96L214 324Q215 327 162 431L108 535H85H79Q67 535 60 536T46 546T39 571",120456:"20 573Q20 597 30 604T72 611H121H198Q212 602 216 595T220 573Q220 568 219 563T217 555T214 549T211 544T207 541T203 538T198 537T194 536T190 536L188 535Q179 535 179 534L188 516Q196 497 208 470T232 415T252 363T261 332Q261 329 262 329T263 332Q263 354 333 508L345 534Q345 535 336 535Q305 538 305 567V573Q305 589 308 595T327 611H483Q505 598 505 573Q505 549 488 538Q481 535 460 535H438L304 245V76H325H331Q343 76 350 75T363 64T369 38Q369 10 347 1H178Q167 5 162 11T157 21T156 38V44Q156 66 172 73Q180 76 199 76H220V245L86 535H64Q44 535 36 538Q20 548 20 573",120457:"71 1Q60 5 55 11T49 23T48 39V46Q48 56 58 73T131 183Q171 242 197 282L366 535H144V501Q144 470 143 464T135 450Q127 442 102 442H94Q71 442 62 461Q60 466 60 527L61 589Q70 607 83 610H88Q93 610 102 610T124 610T154 610T188 611T227 611T270 611H454Q456 609 461 606T467 601T471 597T474 591T475 584T476 572V565Q476 555 466 538T393 428Q353 369 327 329L158 76H397V120V146Q397 169 405 179T439 189Q470 189 479 169Q481 164 481 95V48Q481 24 478 16T459 1H71",120458:"126 306Q105 306 90 321T74 359Q74 439 211 439Q268 439 276 438Q343 426 383 390T430 306Q431 301 431 190V81Q446 79 465 78T492 76T509 72T521 60T524 38Q524 11 506 3Q502 1 466 1Q426 1 406 5T379 14T355 36L345 30Q284 -6 205 -6Q135 -6 92 39T48 141Q48 182 79 212T158 256T252 278T342 285H347V290Q347 315 325 335T267 362Q258 363 224 363Q189 363 185 362H179L178 358Q178 353 178 352T176 345T174 337T170 330T165 322T158 316T150 311T139 308T126 306ZM132 140Q132 115 157 93T224 70Q269 70 302 87T344 133Q346 139 347 175V211H339Q256 209 194 190T132 140",120459:"4 573Q4 596 15 603T52 611H90H124Q146 611 155 608T171 591Q173 586 173 491V396L182 402Q217 424 256 431Q280 437 309 437Q376 437 434 379T492 217Q492 162 473 118T422 47T358 8T293 -6Q229 -6 174 38Q171 13 163 7T135 1H131H122Q99 1 90 23L89 279V535H58L27 536Q4 543 4 573ZM409 215Q409 269 377 315T283 361Q255 361 224 344T177 297L173 290V167Q189 124 213 97T278 70Q330 70 369 111T409 215",120460:"291 -6Q196 -6 131 60T66 216Q66 296 119 361Q154 403 200 421T273 439Q275 440 293 440H313Q400 440 433 409Q454 388 454 359Q454 335 439 321T402 306Q380 306 365 321T350 357V362L340 363Q339 363 326 363T303 364Q280 364 266 362Q217 352 184 313T151 215Q151 153 199 112T313 70Q341 70 357 85T381 118T394 140Q402 146 424 146Q443 146 447 144Q466 137 466 117Q466 106 457 88T429 47T374 10T291 -6",120461:"266 573Q266 596 277 603T314 611H352H385Q411 611 419 607T435 586V76H498Q512 67 516 60T520 38Q520 9 498 1H436Q429 1 417 1T398 0Q375 0 363 7T351 34V43L342 36Q288 -6 223 -6Q143 -6 87 58T31 216Q31 307 88 372T230 437Q292 437 342 405L351 399V535H320L289 536Q266 543 266 573ZM351 290Q347 302 337 316T302 346T244 361Q193 361 154 319T115 215Q115 152 152 111T235 70Q314 70 351 170V290",120462:"48 217Q48 295 100 361T248 439L258 440Q268 440 274 440Q329 438 369 416T428 359T456 292T464 228Q464 215 461 208T454 198T442 190L288 189H135L138 179Q153 132 199 102T303 71Q336 71 353 86T380 120T398 143Q404 146 422 146Q453 146 462 126Q464 120 464 116Q464 84 416 39T285 -6Q187 -6 118 59T48 217ZM377 264Q371 291 365 306T341 338T294 362Q288 363 264 363Q225 363 190 336T139 264H377",120463:"43 395Q44 405 44 408T47 416T53 423T66 431H176V461Q176 500 182 518Q201 570 252 593T353 617Q399 614 418 593T437 548Q437 528 424 514T387 499Q365 499 353 511T338 537V541H328Q275 536 261 494Q260 490 260 460V431H327Q334 431 346 431T364 432Q392 432 404 425T416 393T405 362T365 355H327H260V76H319Q375 76 388 71T401 38Q401 27 400 23T395 12T379 1H58Q47 6 42 12T36 23T35 38Q35 65 53 73Q59 76 117 76H176V355H121H93Q64 355 54 362T43 395",120464:"60 274Q60 337 107 386T233 436Q278 436 316 417L329 410L338 416Q384 442 427 442T489 423T509 381T494 345T460 332Q449 332 440 338Q432 341 427 348T419 360T415 365Q414 364 410 364L383 355Q406 320 406 274Q406 211 358 162T233 112Q189 112 155 128L146 133Q142 125 142 115Q142 99 150 85T175 71Q182 72 187 70Q188 70 195 70T218 70T254 69Q259 69 275 69T297 69T318 68T340 66T361 62T384 57T405 49T428 38Q495 -1 495 -76Q495 -143 427 -186T262 -229Q161 -229 94 -185T29 -73Q30 -60 33 -48T39 -26T47 -8T57 8T67 20T77 30T86 38L91 43Q91 44 86 53T75 80T70 117Q70 142 89 183L83 194Q60 232 60 274ZM321 274Q321 312 296 337T230 362Q197 362 171 338T145 274Q145 235 170 211T233 187Q273 187 297 212T321 274ZM422 -78Q422 -54 408 -38T366 -15T315 -6T255 -4H200Q198 -4 193 -4T183 -3Q148 -3 125 -26T102 -78Q102 -110 151 -132T261 -154Q321 -154 371 -132T422 -78",120465:"4 573Q4 596 15 603T52 611H90H124Q146 611 155 608T171 591Q173 586 173 489Q173 394 175 394L186 402Q197 410 219 420T269 434Q278 436 306 436Q343 436 371 423Q411 402 423 365T436 265Q436 257 436 239T435 211V198V76H498Q512 67 516 60T520 38Q520 9 498 1H308Q286 10 286 32V38V46Q286 65 303 73Q309 76 329 76H351V188Q351 204 351 230T352 266Q352 321 341 341T288 361Q253 361 222 341T176 274L174 264L173 170V76H236Q250 67 254 60T258 38Q258 9 236 1H27Q4 8 4 38Q4 53 8 60T27 76H89V535H58L27 536Q4 543 4 573",120466:"202 538T202 559T218 596T260 612Q283 612 300 597T317 560Q317 538 300 523T260 507Q235 507 219 522ZM411 76Q441 76 451 69T462 38Q462 29 462 26T460 18T453 9T440 1H94Q72 8 72 33V38Q72 46 72 49T74 58T81 68T94 76H233V355H167L102 356Q80 363 80 393Q80 418 91 425T138 432Q145 432 165 432T200 431H295Q297 429 303 425T310 420T314 415T317 404T317 389T318 363Q318 354 318 314T317 241V76H378H411",120467:"261 559Q261 580 277 596T319 612Q342 612 359 597T376 560T360 523T320 507Q296 507 279 523T261 559ZM75 -91T100 -91T138 -107T152 -144V-150L160 -151H193H203Q241 -151 267 -121Q284 -97 288 -73T292 23V151V355H218L145 356Q123 365 123 387V393Q123 422 145 430H148Q151 430 156 430T169 430T185 430T205 431T227 431T251 431H354Q356 430 360 427T365 424T369 420T372 416T373 410T375 402T376 391T377 376T377 356Q377 345 377 286T376 176Q376 -67 371 -88Q362 -123 342 -151T299 -194Q254 -228 180 -228Q84 -226 56 -177Q49 -162 48 -148Q48 -122 61 -107",120468:"13 42Q13 63 23 69T69 76H102V535H69H54Q34 535 24 542T13 573Q13 588 15 593Q22 605 29 608T56 611H95Q113 611 122 611T140 610T152 609T159 607T163 603T167 597T173 589V413L174 237L295 355H275Q260 355 253 356T239 367T232 393Q232 419 243 425T304 431H359H464Q479 422 482 415T485 393Q485 364 464 356L431 355H398L293 254L427 76H486Q501 67 504 60T507 38Q507 28 507 24T501 12T486 1H314Q292 8 292 38Q292 62 308 73Q312 75 326 76L338 77L290 140Q279 154 267 171T248 196L242 204L207 171L173 139V76H206H221Q241 76 251 69T262 38Q262 11 244 3Q240 1 138 1Q123 1 100 1T70 0Q32 0 23 7T13 42",120469:"51 573Q51 602 73 610H76Q79 610 84 610T97 610T113 610T133 611T155 611T179 611H282Q301 598 304 586V76H452Q466 67 470 60T474 38Q474 10 452 1H73Q51 9 51 32V38Q51 54 54 60T73 76H220V535H146L73 536Q51 545 51 567V573",120470:"133 76Q156 74 164 67T172 38Q172 9 151 1H11Q-12 8 -12 38Q-12 61 5 73Q10 75 28 76H45V355H28Q10 356 5 358Q-12 370 -12 393Q-12 419 11 431H52H70Q91 431 100 427T116 405Q163 436 200 436Q255 436 281 390L285 394Q289 398 292 400T301 407T314 415T329 423T346 429T366 434T389 436H392Q425 436 448 411Q469 390 474 360T480 268V232V203V76H497Q520 74 528 67T536 38Q536 9 515 1H396Q374 9 374 32V38Q374 73 402 76H409V191V242Q409 317 404 339T375 361Q343 361 323 332T299 264Q298 258 298 165V76H315Q338 74 346 67T354 38Q354 9 333 1H214Q192 9 192 32V38Q192 73 220 76H227V191V242Q227 317 222 339T193 361Q161 361 141 332T117 264Q116 258 116 165V76H133",120471:"89 431Q94 431 105 431T122 432Q173 432 173 399Q173 394 175 394Q176 394 190 404T233 425T298 436Q343 436 371 423Q411 402 423 365T436 265Q436 257 436 239T435 211V198V76H498Q512 67 516 60T520 38Q520 9 498 1H308Q286 9 286 32V38V45Q286 65 303 73Q309 76 329 76H351V188Q351 204 351 230T352 266Q352 321 341 341T288 361Q253 361 222 341T176 274L174 264L173 170V76H236Q250 67 254 60T258 38Q258 9 236 1H27Q4 8 4 38Q4 53 8 60T27 76H89V355H58L27 356Q4 363 4 393Q4 408 8 415T27 431H89",120472:"52 216Q52 318 118 379T261 440Q343 440 407 378T472 216Q472 121 410 58T262 -6Q176 -6 114 58T52 216ZM388 225Q388 281 351 322T261 364Q213 364 175 325T136 225Q136 158 174 114T262 70T350 114T388 225",120473:"89 431Q93 431 104 431T121 432Q173 432 173 401V396L182 402Q237 437 305 437Q376 437 434 378T492 217Q492 146 459 93T382 17T291 -6Q261 -6 232 5T188 26L174 37Q173 37 173 -54V-146H236Q250 -155 254 -162T258 -184Q258 -213 236 -221H27Q4 -214 4 -184Q4 -169 8 -162T27 -146H89V355H58L27 356Q4 363 4 393Q4 408 8 415T27 431H89ZM409 215Q409 269 377 315T283 361Q255 361 224 344T177 297L173 290V167Q189 124 213 97T278 70Q330 70 369 111T409 215",120474:"34 215Q34 309 91 368T222 436Q224 436 231 436T242 437Q309 437 372 390V401Q372 419 381 428T414 437Q426 437 432 436T444 430T456 412V-146H489H504Q524 -146 534 -153T545 -184Q545 -211 527 -219Q523 -221 414 -221Q398 -221 374 -221T342 -222Q304 -222 294 -216T283 -184Q283 -157 301 -149Q307 -146 339 -146H372V-51Q372 43 371 43L364 38Q357 33 345 26T318 12T280 -1T236 -6Q155 -6 95 55T34 215ZM117 215Q117 152 157 111T250 70Q289 70 318 92T363 146Q372 163 372 192V215L371 263Q339 360 254 360Q206 360 162 321T117 215",120475:"327 76Q359 76 369 70T380 38Q380 10 359 1H47Q24 8 24 38Q24 54 28 61T47 76H145V355H96L47 356Q24 363 24 393Q24 409 28 416T47 431H207Q223 419 226 414T229 393V387V369Q297 437 394 437Q436 437 461 417T487 368Q487 347 473 332T438 317Q428 317 420 320T407 327T398 337T393 347T390 356L388 361Q348 356 324 345Q228 299 228 170Q228 161 228 151T229 138V76H293H327",120476:"72 317Q72 361 108 396T229 439Q231 439 245 439T268 440Q303 439 324 435T353 427T363 423L372 432Q380 440 397 440Q430 440 430 395Q430 390 430 380T429 366V335Q429 311 422 302T387 293Q364 293 355 300T346 316T343 336T325 353Q306 364 257 364Q209 364 178 351T147 317Q147 284 231 272Q327 256 357 247Q458 210 458 129V121Q458 74 413 34T271 -6Q246 -6 224 -3T189 5T165 14T150 22T144 26Q142 23 139 18T135 11T132 6T128 1T124 -2T119 -4T113 -5T104 -6Q84 -6 78 6T71 43Q71 48 71 60T72 79Q72 132 73 141T81 157Q90 166 115 166Q135 166 142 162T157 140Q168 108 191 90T260 70Q297 70 323 76T361 91T379 110T384 129Q384 157 346 171T247 195T165 212Q119 228 96 256T72 317",120477:"25 395Q26 405 26 408T29 416T35 423T48 431H145V481L146 532Q154 547 161 550T184 554H189Q218 554 227 534Q229 529 229 480V431H405Q406 430 411 427T418 422T422 416T426 407T427 393Q427 387 427 382T424 374T421 368T417 363T413 360T408 358L405 356L317 355H229V249Q229 237 229 214T228 179Q228 126 241 98T295 70Q354 70 365 149Q366 167 375 174Q383 182 407 182H415Q438 182 446 166Q448 161 448 148Q448 84 398 39T282 -6Q226 -6 189 29T146 128Q145 134 145 247V355H96H72Q45 355 35 362T25 395",120478:"4 393Q4 416 15 423T52 431H90Q141 431 151 429T168 417Q171 412 173 409V254L174 100Q182 70 244 70Q320 70 344 119Q349 130 350 144T351 248V355H320L289 356Q266 363 266 393Q266 408 270 415T289 431H351H386Q409 431 418 428T433 411Q435 406 435 241V76H498Q512 67 516 60T520 38Q520 9 498 1H436H394Q372 1 364 5T351 26L342 21Q293 -5 227 -5Q118 -5 96 67Q91 82 90 101T89 227V355H58L27 356Q4 363 4 393",120479:"24 392Q24 417 36 424T79 432Q85 432 103 432T132 431H215Q229 422 233 415T237 393Q237 355 198 355H193H172L262 77L352 355H331H323Q288 355 288 393Q288 409 291 415T310 431H478Q491 423 495 416T500 393Q500 364 478 356L452 355H426L374 190Q320 24 318 20Q307 -4 273 -4H262H251Q217 -4 206 20Q204 24 150 190L98 355H72L47 356Q24 363 24 392",120480:"54 355Q16 355 16 388V393Q16 423 37 430Q41 431 125 431H162Q206 431 218 425T230 393Q230 366 212 358Q206 355 174 355Q141 355 141 354L150 296Q181 110 181 89V84Q182 85 183 96Q185 118 199 173T218 237Q223 247 245 259H264H268Q294 259 309 240Q315 229 329 174T343 92Q343 84 344 84V86Q344 88 344 91T345 97Q347 125 356 187T374 301T383 354Q383 355 350 355H333Q314 355 304 362T294 393Q294 420 312 428Q318 431 401 431H440Q485 431 496 425T508 393Q508 382 508 377T498 363T470 355L455 354Q455 353 441 271T413 104T396 16Q384 -4 355 -4H351Q315 -4 305 9T280 79Q278 90 276 96Q265 149 265 169Q265 176 264 169Q263 166 263 162Q261 130 248 79T230 18Q220 -4 183 -4H175L151 -3Q134 5 127 17L112 102Q97 188 83 270T69 354Q62 355 54 355",120481:"35 393Q35 417 46 424T89 432Q95 432 112 432T141 431H223Q238 422 241 415T244 393Q244 389 244 383T237 367T216 355Q209 355 209 354L234 319Q259 286 260 286L308 354Q308 355 301 355Q285 356 278 365T270 384L271 393Q271 420 289 428Q295 431 376 431H459Q460 430 465 427T472 422T476 416T480 407T481 393Q481 368 470 362T434 355H425H392L344 290Q295 225 295 223Q294 223 309 203T350 149L405 77L439 76H453Q474 76 484 69T495 38Q495 10 473 1H303Q281 9 281 32V38Q281 49 282 54T290 67T313 76Q324 76 324 77L259 173L197 77Q202 76 209 76Q225 75 233 68T241 55T242 38Q242 28 242 24T236 12T221 1H51Q29 9 29 32V38Q29 48 29 51T31 59T38 67T51 76H117L171 149Q224 222 224 223L124 355H90H78Q54 355 45 361T35 393",120482:"26 393Q26 417 37 424T80 431H134H217Q232 422 235 416T239 393Q239 379 236 371T226 360T214 356T197 355L179 354V353L188 330Q197 306 209 272T235 201T259 133T271 89V84L274 95Q279 122 298 185T335 300T352 354Q352 355 331 355Q312 355 304 358Q288 368 288 393Q288 408 291 415T310 431H478Q479 430 484 427T491 422T495 416T499 407T500 393Q500 376 493 367T479 357T458 355H452Q426 355 425 353Q420 337 351 124T280 -94Q240 -195 168 -220Q147 -228 125 -228Q89 -228 66 -201T42 -139Q42 -116 56 -102T93 -87Q117 -87 130 -102T144 -135V-138H126Q121 -148 121 -150T130 -152Q182 -147 207 -87Q211 -78 223 -40T236 1Q230 10 102 355H75L49 356Q26 363 26 393",120483:"56 1Q40 7 37 14T34 41Q34 59 36 64Q39 67 43 73Q65 95 191 213T341 355H133V334Q133 306 124 297Q116 289 91 289H83Q60 289 51 308Q49 313 49 361L50 409Q59 427 72 430H78Q83 430 92 430T115 430T144 430T179 431T219 431T262 431H450Q452 430 455 428T459 424T463 422T466 419T468 416T469 413T470 409T471 404T472 398T472 391Q472 374 469 368L462 358Q453 349 315 218Q210 122 164 76H391V103Q391 136 400 146Q409 155 433 155Q464 155 473 135Q475 130 475 78V46Q475 24 472 16T453 1H56",120488:"296 0Q278 3 164 3Q58 3 49 0H40V62H92Q144 62 144 64Q388 682 397 689Q403 698 434 698Q463 698 471 689Q475 686 538 530T663 218L724 64Q724 62 776 62H828V0H817Q796 3 658 3Q509 3 485 0H472V62H517Q561 62 561 63L517 175H262L240 120Q218 65 217 64Q217 62 261 62H306V0H296ZM390 237L492 238L440 365Q390 491 388 491Q287 239 287 237H390",120489:"720 510Q720 476 704 448T665 404T619 377T580 362L564 359L583 356Q602 353 632 342T690 312Q712 292 725 276Q752 235 752 189V183Q752 160 741 125Q698 18 547 2Q543 1 288 0H39V62H147V624H39V686H264H409Q502 686 542 681T624 655Q720 607 720 510ZM563 513Q563 553 548 578T518 611T486 622Q479 624 385 624H293V382H375Q458 383 467 385Q563 405 563 513ZM590 192Q590 307 505 329Q504 330 503 330L398 331H293V62H391H400H444Q496 62 528 75T580 131Q590 155 590 192",120490:"425 0L228 3Q63 3 51 0H39V62H147V618H39V680H612V676Q614 670 627 552T643 428V424H581V428Q580 430 576 461T562 524T532 576Q512 596 481 605T426 616T357 618H304V62H439V0H425",120491:"901 12Q901 7 892 0H479Q65 0 62 2Q56 6 56 11Q56 14 242 347T433 685Q438 694 450 696Q454 698 480 698H506L523 687Q526 683 711 354T899 17Q901 13 901 12ZM653 137L427 538L202 137L315 136H540L653 137",120492:"723 286Q721 284 700 145T677 3V0H39V62H147V618H39V680H660V676Q662 670 675 552T691 428V424H629V428Q629 429 627 448T618 494T601 541Q574 593 527 605T382 618H374H304V384H336Q338 384 347 384T361 384T376 386T392 390T407 397T421 407T432 423Q442 444 443 482V501H505V205H443V224Q442 258 435 278T411 307T380 318T336 322H304V62H375H394Q429 62 449 62T497 66T541 76T577 95T609 126T632 170T651 232Q661 287 661 289H723V286",120493:"80 430L92 686H358Q624 686 628 684Q638 679 638 656Q638 640 637 639Q637 638 445 353Q401 288 351 214T277 103L253 67L256 66Q258 66 265 66T279 66T298 66H343Q380 66 406 68T464 81T518 110T557 164T579 250Q583 278 583 298Q583 299 614 299H645V291Q643 281 636 150T627 8V0H353Q79 0 75 2Q64 7 64 31Q64 48 66 52L259 340L451 623Q451 624 384 624Q294 623 259 612Q155 581 143 446Q142 440 142 432V430H80",120494:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H51Q75 683 226 683Q376 683 400 686H412V624H304V388H595V624H487V686H499Q523 683 673 683Q824 683 848 686H860V624H752V62H860V0H848Q824 3 674 3Q523 3 499 0H487V62H595V326H304V62H412V0H400",120495:"629 -10T446 -10T164 89T64 340Q64 380 71 420T102 510T163 596T266 662T418 696H438Q488 696 499 695Q582 686 644 655T741 584T796 495T823 409T829 338Q829 188 729 89ZM439 645Q416 645 390 638T333 615T275 564T236 480Q221 423 221 341Q221 272 230 228Q247 144 301 94T447 43T592 93T663 228Q672 272 672 341Q672 645 439 645ZM286 242V446H348V412H545V446H607V242H545V276H348V242H286",120496:"397 0Q370 3 218 3Q65 3 38 0H25V62H139V624H25V686H38Q65 683 218 683Q370 683 397 686H410V624H296V62H410V0H397",120497:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H51Q75 683 226 683Q376 683 400 686H412V624H304V338L472 483L634 624H565V686H576Q597 683 728 683Q814 683 829 686H836V624H730L614 524Q507 432 497 422Q496 422 498 418T514 395T553 342T627 241L759 63L805 62H852V0H842Q830 3 701 3Q550 3 526 0H513V62H549Q584 62 584 63Q583 65 486 196T388 328L304 256V62H412V0H400",120498:"285 0Q267 3 154 3Q56 3 47 0H40V62H131Q131 63 167 160T244 369T321 578T359 678Q366 698 393 698H404H413Q437 698 446 678Q448 672 560 369T674 62H765V0H754Q733 3 604 3Q453 3 429 0H416V62H461L507 63L355 470Q353 468 279 265L203 63L249 62H294V0H285",120499:"314 0Q296 3 181 3T48 0H39V62H147V624H39V686H305Q316 679 323 667Q330 653 434 414L546 157L658 414Q766 662 773 674Q778 681 788 686H1052V624H944V62H1052V0H1040Q1016 3 874 3T708 0H696V62H804V341L803 618L786 580Q770 543 735 462T671 315Q540 13 536 9Q528 1 507 1Q485 1 477 9Q472 14 408 162T281 457T217 603Q215 603 215 334V62H323V0H314",120500:"314 0Q296 3 181 3T48 0H39V62H147V624H39V686H171H265Q288 686 297 686T309 684T315 679Q317 676 500 455T684 233V624H576V686H585Q603 683 718 683T851 686H860V624H752V319Q752 15 750 11Q747 4 742 2T718 0H712Q708 0 706 0T700 0T696 1T693 2T690 4T687 7T684 11T679 16T674 23Q671 27 437 311L215 579V62H323V0H314",120501:"54 465L63 674Q63 675 383 675T703 674L712 465Q712 464 681 464H650V467Q650 490 646 516T632 545Q612 550 383 550H283Q169 550 149 548T124 531Q123 530 123 529Q116 506 116 467V464H85Q54 464 54 465ZM160 256V447H222V414H544V447H606V256H544V289H222V256H160ZM57 0L48 222H110V219Q110 147 125 133Q127 130 130 129T160 127T235 126T383 126Q482 126 530 126T604 127T635 129T641 133Q656 146 656 219V222H718L709 0H57",120502:"64 339Q64 431 96 502T182 614T295 675T420 696Q469 696 481 695Q620 680 709 589T798 339Q798 173 697 82T432 -10Q262 -10 163 85T64 339ZM625 454Q618 502 600 538T562 593T515 624T469 639T431 642Q331 642 276 563Q232 493 232 353Q232 315 234 285T244 216T267 148T308 94T372 56Q405 46 432 46Q517 46 567 106T627 267Q631 299 631 353Q631 418 625 454",120503:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V618H39V680H860V618H752V62H860V0H848Q824 3 674 3Q523 3 499 0H487V62H595V618H304V62H412V0H400",120504:"400 0Q376 3 226 3Q75 3 51 0H39V62H147V624H39V686H253Q435 686 470 685T536 678Q585 668 621 648T675 605T705 557T718 514T721 483T718 451T704 409T673 362T616 322T530 293Q500 288 399 287H304V62H412V0H400ZM553 475Q553 554 537 582T459 622Q451 623 373 624H298V343H372Q457 344 480 350Q527 362 540 390T553 475",120506:"766 271Q764 266 750 137T735 4V0H407Q74 0 71 4L70 5Q64 9 64 18Q64 24 82 41T213 158L359 288Q360 288 320 336T214 460Q67 633 66 635Q64 638 64 655Q64 679 75 684Q78 686 407 686H735V682Q738 676 751 558T766 434V430H735Q704 430 704 431Q704 434 703 444T696 477T681 520T654 563T613 598Q578 615 527 619T371 624H281L396 489Q506 358 513 351Q517 342 512 334Q503 325 371 208Q338 179 303 147T249 99L231 83L243 81Q258 81 364 81Q382 81 418 81T470 82T513 83T554 88T587 96T619 109T645 129Q689 173 702 260L704 274Q704 275 735 275H766V271",120507:"41 425Q41 426 51 545T62 669V675H737V669Q738 665 748 546T758 425V419H696V425Q687 517 669 555T595 607Q578 612 522 613H478V62H631V0H615Q585 3 399 3Q214 3 184 0H168V62H321V613H277H263Q164 613 134 561Q113 527 103 425V419H41V425",120508:"64 556Q69 619 114 658T224 697Q271 697 310 677T375 622T417 554T444 484L447 477V479Q456 516 473 551T516 620T582 676T670 697Q735 697 780 656T829 556Q829 539 818 532H772Q761 539 761 548Q761 571 681 571Q664 571 653 570T623 562T587 537T555 490Q536 448 531 410T525 300V210V62H660V0H646L447 3Q257 1 247 0H233V62H368V210V301Q368 373 363 410T338 490Q324 518 307 536T270 561T240 569T212 571Q132 571 132 548Q132 539 121 532H75Q64 538 64 556",120509:"609 0Q582 3 415 3T221 0H207V62H342V168L328 169Q193 180 117 241Q64 286 64 343T117 445Q193 506 328 517L342 518V624H207V686H221Q248 683 415 683T609 686H623V624H488V518L502 517Q637 506 713 445Q766 400 766 343T713 241Q637 180 502 169L488 168V62H623V0H609ZM342 219T342 343T340 467Q328 467 304 459Q277 451 261 439T237 409T228 378T226 343Q226 314 229 296T250 259T301 228Q331 219 341 219Q342 219 342 343ZM604 343Q604 365 602 379T591 413T560 446T503 464L489 467Q488 467 488 343T489 219Q499 219 529 228Q554 236 570 248T593 277T602 308T604 343",120510:"327 0Q306 3 174 3Q52 3 43 0H33V62H98L162 63L360 333L157 624H48V686H59Q80 683 217 683Q368 683 395 686H408V624H335L393 540L452 458L573 623Q573 624 528 624H483V686H494Q515 683 646 683Q769 683 778 686H787V624H658L575 511Q493 398 493 397L508 376Q522 356 553 312T611 229L727 62H835V0H824Q803 3 667 3Q516 3 489 0H476V62H513L549 63L401 274L247 63Q247 62 292 62H338V0H327",120511:"64 515Q64 532 71 536T104 540H139Q200 540 207 538Q225 533 236 521T253 489T260 454T264 414Q264 340 287 296T347 237Q369 226 373 226Q374 226 374 425V624H239V686H253Q280 683 447 683T641 686H655V624H520V226L522 227Q525 228 531 229T552 240T580 261T606 298T624 354Q627 368 628 394T631 440T637 482T654 518T686 538Q693 540 754 540H794Q817 540 823 536T829 515Q829 500 824 495T811 489T796 483T782 461T775 408Q767 212 568 175Q526 168 521 168Q520 168 520 115V62H655V0H641Q614 3 447 3T253 0H239V62H374V168L364 169Q290 178 243 203Q126 261 118 409Q117 443 111 461T98 484T83 489T70 495T64 515",120512:"598 645T415 645T232 458Q232 385 275 239T318 26Q318 8 311 4T272 -1Q265 -1 240 -1T196 0H88V3Q86 5 70 108Q52 211 51 212V215H113V212Q123 149 132 133Q136 124 149 122T202 118Q241 118 241 119Q241 132 132 277Q64 378 64 457Q64 564 158 630T403 696Q487 696 543 685T661 638Q722 599 744 549T766 458Q766 434 761 410T749 368T729 327T709 293T684 258T663 229Q632 187 614 160T592 126L589 119Q589 118 628 118Q667 119 680 121T698 133Q702 140 706 160T714 196L717 212V215H779V212Q778 211 760 108Q744 5 742 3V0H634H562Q528 0 520 4T512 26Q512 92 555 238T598 458Q598 645 415 645",120513:"56 673Q56 679 65 686H892Q901 679 901 673Q901 668 714 331T521 -15Q518 -18 506 -24H452Q440 -19 436 -15Q431 -8 337 162T150 501L57 669Q57 670 56 672V673ZM528 136L758 553H297Q298 551 414 341L528 136",120546:"208 74Q208 50 254 46Q272 46 272 35Q272 34 270 22Q267 8 264 4T251 0Q249 0 239 0T205 1T141 2Q70 2 50 0H42Q35 7 35 11Q37 38 48 46H62Q132 49 164 96Q170 102 345 401T523 704Q530 716 547 716H555H572Q578 707 578 706L606 383Q634 60 636 57Q641 46 701 46Q726 46 726 36Q726 34 723 22Q720 7 718 4T704 0Q701 0 690 0T651 1T578 2Q484 2 455 0H443Q437 6 437 9T439 27Q443 40 445 43L449 46H469Q523 49 533 63L521 213H283L249 155Q208 86 208 74ZM516 260Q516 271 504 416T490 562L463 519Q447 492 400 412L310 260L413 259Q516 259 516 260",120547:"231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229",120548:"49 1Q31 1 31 10Q31 12 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 661Q197 674 203 680H714Q721 676 721 669Q721 664 708 557T694 447Q692 440 674 440H662Q655 445 655 454Q655 455 658 480T661 534Q661 572 652 592Q638 619 603 626T501 634H471Q398 633 393 630Q389 628 386 622Q385 619 315 341T245 60Q245 46 333 46H345Q366 46 366 35Q366 33 363 21T358 6Q356 1 339 1Q334 1 292 1T187 2Q122 2 88 2T49 1",120549:"574 715L582 716Q589 716 595 716Q612 716 616 714Q621 712 621 709Q622 707 705 359T788 8Q786 5 785 3L781 0H416Q52 0 50 2T48 6Q48 9 305 358T567 711Q572 712 574 715ZM599 346L538 602L442 474Q347 345 252 217T157 87T409 86T661 88L654 120Q646 151 629 220T599 346",120550:"492 213Q472 213 472 226Q472 230 477 250T482 285Q482 316 461 323T364 330H312Q311 328 277 192T243 52Q243 48 254 48T334 46Q428 46 458 48T518 61Q567 77 599 117T670 248Q680 270 683 272Q690 274 698 274Q718 274 718 261Q613 7 608 2Q605 0 322 0H133Q31 0 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H757Q764 676 764 669Q764 664 751 557T737 447Q735 440 717 440H705Q698 445 698 453L701 476Q704 500 704 528Q704 558 697 578T678 609T643 625T596 632T532 634H485Q397 633 392 631Q388 629 386 622Q385 619 355 499T324 377Q347 376 372 376H398Q464 376 489 391T534 472Q538 488 540 490T557 493Q562 493 565 493T570 492T572 491T574 487T577 483L544 351Q511 218 508 216Q505 213 492 213",120551:"58 8Q58 23 64 35Q64 36 329 334T596 635L586 637Q575 637 512 637H500H476Q442 637 420 635T365 624T311 598T266 548T228 469Q227 466 226 463T224 458T223 453T222 450L221 448Q218 443 202 443Q185 443 182 453L214 561Q228 606 241 651Q249 679 253 681Q256 683 487 683H718Q723 678 723 675Q723 673 717 649Q189 54 188 52L185 49H274Q369 50 377 51Q452 60 500 100T579 247Q587 272 590 277T603 282H607Q628 282 628 271Q547 5 541 2Q538 0 300 0H124Q58 0 58 8",120552:"228 637Q194 637 192 641Q191 643 191 649Q191 673 202 682Q204 683 219 683Q260 681 355 681Q389 681 418 681T463 682T483 682Q499 682 499 672Q499 670 497 658Q492 641 487 638H485Q483 638 480 638T473 638T464 637T455 637Q416 636 405 634T387 623Q384 619 355 500Q348 474 340 442T328 395L324 380Q324 378 469 378H614L615 381Q615 384 646 504Q674 619 674 627T617 637Q594 637 587 639T580 648Q580 650 582 660Q586 677 588 679T604 682Q609 682 646 681T740 680Q802 680 835 681T871 682Q888 682 888 672Q888 645 876 638H874Q872 638 869 638T862 638T853 637T844 637Q805 636 794 634T776 623Q773 618 704 340T634 58Q634 51 638 51Q646 48 692 46H723Q729 38 729 37T726 19Q722 6 716 0H701Q664 2 567 2Q533 2 504 2T458 2T437 1Q420 1 420 10Q420 15 423 24Q428 43 433 45Q437 46 448 46H454Q481 46 514 49Q520 50 522 50T528 55T534 64T540 82T547 110T558 153Q565 181 569 198Q602 330 602 331T457 332H312L279 197Q245 63 245 58Q245 51 253 49T303 46H334Q340 38 340 37T337 19Q333 6 327 0H312Q275 2 178 2Q144 2 115 2T69 2T48 1Q31 1 31 10Q31 12 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628Q285 635 228 637",120553:"740 435Q740 320 676 213T511 42T304 -22Q207 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435ZM640 466Q640 523 625 565T583 628T532 658T479 668Q370 668 273 559T151 255Q150 245 150 213Q150 156 165 116T207 55T259 26T313 17Q385 17 451 63T561 184Q590 234 615 312T640 466ZM510 276Q510 278 512 288L515 298Q515 299 384 299H253L250 285Q246 271 244 268T231 265H227Q216 265 214 266T207 274Q207 278 223 345T244 416Q247 419 260 419H263Q280 419 280 408Q280 406 278 396L275 386Q275 385 406 385H537L540 399Q544 413 546 416T559 419H563Q574 419 576 418T583 410Q583 403 566 339Q549 271 544 267Q542 265 538 265H530H527Q510 265 510 276",120554:"43 1Q26 1 26 10Q26 12 29 24Q34 43 39 45Q42 46 54 46H60Q120 46 136 53Q137 53 138 54Q143 56 149 77T198 273Q210 318 216 344Q286 624 286 626Q284 630 284 631Q274 637 213 637H193Q184 643 189 662Q193 677 195 680T209 683H213Q285 681 359 681Q481 681 487 683H497Q504 676 504 672T501 655T494 639Q491 637 471 637Q440 637 407 634Q393 631 388 623Q381 609 337 432Q326 385 315 341Q245 65 245 59Q245 52 255 50T307 46H339Q345 38 345 37T342 19Q338 6 332 0H316Q279 2 179 2Q143 2 113 2T65 2T43 1",120555:"285 628Q285 635 228 637Q205 637 198 638T191 647Q191 649 193 661Q199 681 203 682Q205 683 214 683H219Q260 681 355 681Q389 681 418 681T463 682T483 682Q500 682 500 674Q500 669 497 660Q496 658 496 654T495 648T493 644T490 641T486 639T479 638T470 637T456 637Q416 636 405 634T387 623L306 305Q307 305 490 449T678 597Q692 611 692 620Q692 635 667 637Q651 637 651 648Q651 650 654 662T659 677Q662 682 676 682Q680 682 711 681T791 680Q814 680 839 681T869 682Q889 682 889 672Q889 650 881 642Q878 637 862 637Q787 632 726 586Q710 576 656 534T556 455L509 418L518 396Q527 374 546 329T581 244Q656 67 661 61Q663 59 666 57Q680 47 717 46H738Q744 38 744 37T741 19Q737 6 731 0H720Q680 3 625 3Q503 3 488 0H478Q472 6 472 9T474 27Q478 40 480 43T491 46H494Q544 46 544 71Q544 75 517 141T485 216L427 354L359 301L291 248L268 155Q245 63 245 58Q245 51 253 49T303 46H334Q340 37 340 35Q340 19 333 5Q328 0 317 0Q314 0 280 1T180 2Q118 2 85 2T49 1Q31 1 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q147 65 216 339T285 628",120556:"135 2Q114 2 90 2T60 1Q35 1 35 11Q35 28 42 40Q45 46 55 46Q119 46 151 94Q153 97 325 402T498 709Q505 716 526 716Q543 716 549 710Q550 709 560 548T580 224T591 57Q594 52 595 52Q603 47 638 46H663Q670 39 670 35Q669 12 657 0H644Q613 2 530 2Q497 2 469 2T424 2T405 1Q388 1 388 10Q388 15 391 24Q392 27 393 32T395 38T397 41T401 44T406 45T415 46Q473 46 487 64L472 306Q468 365 465 426T459 518L457 550Q456 550 328 322T198 88Q196 80 196 77Q196 49 243 46Q261 46 261 35Q261 34 259 22Q256 7 254 4T240 0Q237 0 211 1T135 2",120557:"289 629Q289 635 232 637Q208 637 201 638T194 648Q194 649 196 659Q197 662 198 666T199 671T201 676T203 679T207 681T212 683T220 683T232 684Q238 684 262 684T307 683Q386 683 398 683T414 678Q415 674 451 396L487 117L510 154Q534 190 574 254T662 394Q837 673 839 675Q840 676 842 678T846 681L852 683H948Q965 683 988 683T1017 684Q1051 684 1051 673Q1051 668 1048 656T1045 643Q1041 637 1008 637Q968 636 957 634T939 623Q936 618 867 340T797 59Q797 55 798 54T805 50T822 48T855 46H886Q892 37 892 35Q892 19 885 5Q880 0 869 0Q864 0 828 1T736 2Q675 2 644 2T609 1Q592 1 592 11Q592 13 594 25Q598 41 602 43T625 46Q652 46 685 49Q699 52 704 61Q706 65 742 207T813 490T848 631L654 322Q458 10 453 5Q451 4 449 3Q444 0 433 0Q418 0 415 7Q413 11 374 317L335 624L267 354Q200 88 200 79Q206 46 272 46H282Q288 41 289 37T286 19Q282 3 278 1Q274 0 267 0Q265 0 255 0T221 1T157 2Q127 2 95 1T58 0Q43 0 39 2T35 11Q35 13 38 25T43 40Q45 46 65 46Q135 46 154 86Q158 92 223 354T289 629",120558:"234 637Q231 637 226 637Q201 637 196 638T191 649Q191 676 202 682Q204 683 299 683Q376 683 387 683T401 677Q612 181 616 168L670 381Q723 592 723 606Q723 633 659 637Q635 637 635 648Q635 650 637 660Q641 676 643 679T653 683Q656 683 684 682T767 680Q817 680 843 681T873 682Q888 682 888 672Q888 650 880 642Q878 637 858 637Q787 633 769 597L620 7Q618 0 599 0Q585 0 582 2Q579 5 453 305L326 604L261 344Q196 88 196 79Q201 46 268 46H278Q284 41 284 38T282 19Q278 6 272 0H259Q228 2 151 2Q123 2 100 2T63 2T46 1Q31 1 31 10Q31 14 34 26T39 40Q41 46 62 46Q130 49 150 85Q154 91 221 362L289 634Q287 635 234 637",120559:"222 668Q222 670 229 677H654Q677 677 705 677T740 678Q764 678 770 676T777 667Q777 662 764 594Q761 579 757 559T751 528L749 519Q747 512 729 512H717Q710 519 710 525Q712 532 715 559T719 591Q718 595 711 595Q682 598 486 598Q252 598 246 592Q239 587 228 552L216 517Q214 512 197 512H185Q178 517 178 522Q178 524 198 591T222 668ZM227 262Q218 262 215 262T209 266L207 270L227 356Q247 435 250 439Q253 443 260 443H267H280Q287 438 287 433Q287 430 285 420T280 402L278 393Q278 392 431 392H585L590 415Q595 436 598 439T612 443H628Q635 438 635 433Q635 431 615 351T594 268Q592 262 575 262H572Q556 262 556 272Q556 280 560 293L565 313H258L252 292Q248 271 245 267T230 262H227ZM60 0Q53 4 53 11Q53 14 68 89T84 169Q88 176 98 176H104H116Q123 169 123 163Q122 160 117 127T112 88Q112 80 243 80H351H454Q554 80 574 81T597 88V89Q603 100 610 121T622 157T630 174Q633 176 646 176H658Q665 171 665 166Q665 164 643 89T618 7Q616 2 607 1T548 0H335H60",120560:"740 435Q740 320 676 213T511 42T304 -22Q207 -22 138 35T51 201Q50 209 50 244Q50 346 98 438T227 601Q351 704 476 704Q514 704 524 703Q621 689 680 617T740 435ZM637 476Q637 565 591 615T476 665Q396 665 322 605Q242 542 200 428T157 216Q157 126 200 73T314 19Q404 19 485 98T608 313Q637 408 637 476",120561:"48 1Q31 1 31 10Q31 12 34 24Q39 43 44 45Q48 46 59 46H65Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 661Q197 674 203 680H541Q621 680 709 680T812 681Q841 681 855 681T877 679T886 676T887 670Q887 663 885 656Q880 637 875 635Q871 634 860 634H854Q827 634 794 631Q780 628 775 619Q773 614 704 338T634 58Q634 51 638 51Q646 48 692 46H723Q729 38 729 37T726 19Q722 6 716 0H701Q664 2 567 2Q533 2 504 2T458 2T437 1Q420 1 420 10Q420 15 423 24Q428 43 433 45Q437 46 448 46H454Q481 46 514 49Q528 52 533 61Q536 67 572 209T642 491T678 632Q678 634 533 634H388Q387 631 316 347T245 59Q245 55 246 54T253 50T270 48T303 46H334Q340 38 340 37T337 19Q333 6 327 0H312Q275 2 178 2Q144 2 115 2T69 2T48 1",120562:"287 628Q287 635 230 637Q206 637 199 638T192 648Q192 649 194 659Q200 679 203 681T397 683Q587 682 600 680Q664 669 707 631T751 530Q751 453 685 389Q616 321 507 303Q500 302 402 301H307L277 182Q247 66 247 59Q247 55 248 54T255 50T272 48T305 46H336Q342 37 342 35Q342 19 335 5Q330 0 319 0Q316 0 282 1T182 2Q120 2 87 2T51 1Q33 1 33 11Q33 13 36 25Q40 41 44 43T67 46Q94 46 127 49Q141 52 146 61Q149 65 218 339T287 628ZM645 554Q645 567 643 575T634 597T609 619T560 635Q553 636 480 637Q463 637 445 637T416 636T404 636Q391 635 386 627Q384 621 367 550T332 412T314 344Q314 342 395 342H407H430Q542 342 590 392Q617 419 631 471T645 554",120564:"65 0Q58 4 58 11Q58 16 114 67Q173 119 222 164L377 304Q378 305 340 386T261 552T218 644Q217 648 219 660Q224 678 228 681Q231 683 515 683H799Q804 678 806 674Q806 667 793 559T778 448Q774 443 759 443Q747 443 743 445T739 456Q739 458 741 477T743 516Q743 552 734 574T710 609T663 627T596 635T502 637Q480 637 469 637H339Q344 627 411 486T478 341V339Q477 337 477 336L457 318Q437 300 398 265T322 196L168 57Q167 56 188 56T258 56H359Q426 56 463 58T537 69T596 97T639 146T680 225Q686 243 689 246T702 250H705Q726 250 726 239Q726 238 683 123T639 5Q637 1 610 1Q577 0 348 0H65",120565:"40 437Q21 437 21 445Q21 450 37 501T71 602L88 651Q93 669 101 677H569H659Q691 677 697 676T704 667Q704 661 687 553T668 444Q668 437 649 437Q640 437 637 437T631 442L629 445Q629 451 635 490T641 551Q641 586 628 604T573 629Q568 630 515 631Q469 631 457 630T439 622Q438 621 368 343T298 60Q298 48 386 46Q418 46 427 45T436 36Q436 31 433 22Q429 4 424 1L422 0Q419 0 415 0Q410 0 363 1T228 2Q99 2 64 0H49Q43 6 43 9T45 27Q49 40 55 46H83H94Q174 46 189 55Q190 56 191 56Q196 59 201 76T241 233Q258 301 269 344Q339 619 339 625Q339 630 310 630H279Q212 630 191 624Q146 614 121 583T67 467Q60 445 57 441T43 437H40",120566:"45 535Q34 535 31 536T28 544Q28 554 39 578T70 631T126 683T206 705Q230 705 251 698T295 671T330 612T344 514Q344 477 342 473V472Q343 472 347 480T361 509T380 547Q471 704 596 704Q615 704 625 702Q659 692 679 663T700 595Q700 565 696 552T687 537T670 535Q656 535 653 536T649 543Q649 544 649 550T650 562Q650 589 629 605T575 621Q502 621 448 547T365 361Q290 70 290 60Q290 46 379 46H404Q410 40 410 39T408 19Q404 6 398 0H381Q340 2 225 2Q184 2 149 2T94 2T69 1Q61 1 58 1T53 4T51 10Q51 11 53 23Q54 25 55 30T56 36T58 40T60 43T62 44T67 46T73 46T82 46H89Q144 46 163 49T190 62L198 93Q206 124 217 169T241 262T262 350T274 404Q281 445 281 486V494Q281 621 185 621Q147 621 116 601T74 550Q71 539 66 537T45 535",120567:"356 624Q356 637 267 637H243Q237 642 237 645T239 664Q243 677 249 683H264Q342 681 429 681Q565 681 571 683H583Q589 677 589 674T587 656Q582 641 578 637H540Q516 637 504 637T479 633T463 630T454 623T448 613T443 597T438 576Q436 566 434 556T430 539L428 533Q442 533 472 526T543 502T613 451T642 373Q642 301 567 241T386 158L336 150Q332 150 331 146Q310 66 310 60Q310 46 399 46H424Q430 40 430 39T428 19Q424 6 418 0H401Q360 2 247 2Q207 2 173 2T119 2T95 1Q87 1 84 1T79 4T77 10Q77 11 79 23Q80 25 81 30T82 36T84 40T86 43T88 44T93 46T99 46T108 46H115Q170 46 189 49T216 62Q220 74 228 107L239 150L223 152Q139 164 82 205T24 311Q24 396 125 462Q207 517 335 533L346 578Q356 619 356 624ZM130 291Q130 203 241 188H249Q249 190 287 342L325 495H324Q313 495 291 491T229 466T168 414Q130 357 130 291ZM536 393Q536 440 507 463T418 496L341 187L351 189Q443 201 487 255Q536 314 536 393",120568:"42 0H40Q26 0 26 11Q26 15 29 27Q33 41 36 43T55 46Q141 49 190 98Q200 108 306 224T411 342Q302 620 297 625Q288 636 234 637H206Q200 643 200 645T202 664Q206 677 212 683H226Q260 681 347 681Q380 681 408 681T453 682T473 682Q490 682 490 671Q490 670 488 658Q484 643 481 640T465 637Q434 634 411 620L488 426L541 485Q646 598 646 610Q646 628 622 635Q617 635 609 637Q594 637 594 648Q594 650 596 664Q600 677 606 683H618Q619 683 643 683T697 681T738 680Q828 680 837 683H845Q852 676 852 672Q850 647 840 637H824Q790 636 763 628T722 611T698 593L687 584Q687 585 592 480L505 384Q505 383 536 304T601 142T638 56Q648 47 699 46Q734 46 734 37Q734 35 732 23Q728 7 725 4T711 1Q708 1 678 1T589 2Q528 2 496 2T461 1Q444 1 444 10Q444 11 446 25Q448 35 450 39T455 44T464 46T480 47T506 54Q523 62 523 64Q522 64 476 181L429 299Q241 95 236 84Q232 76 232 72Q232 53 261 47Q262 47 267 47T273 46Q276 46 277 46T280 45T283 42T284 35Q284 26 282 19Q279 6 276 4T261 1Q258 1 243 1T201 2T142 2Q64 2 42 0",120569:"216 151Q48 174 48 329Q48 361 56 403T65 458Q65 482 58 494T43 507T28 510T21 520Q21 528 23 534T29 544L32 546H72H94Q110 546 119 544T139 536T154 514T159 476V465Q159 445 149 399T138 314Q142 229 197 201Q223 187 226 190L233 218Q240 246 253 300T280 407Q333 619 333 625Q333 637 244 637H220Q214 642 214 645T216 664Q220 677 226 683H241Q321 681 405 681Q543 681 549 683H560Q566 677 566 674T564 656Q559 641 555 637H517Q448 636 436 628Q429 623 423 600T373 404L320 192Q370 201 419 248Q451 281 469 317T500 400T518 457Q529 486 542 505T569 532T594 543T621 546H644H669Q692 546 692 536Q691 509 676 509Q623 509 593 399Q587 377 579 355T552 301T509 244T446 195T359 159Q324 151 314 151Q311 151 310 150T298 106T287 60Q287 46 376 46H401Q407 40 407 39T405 19Q401 6 395 0H378Q337 2 224 2Q184 2 150 2T96 2T72 1Q64 1 61 1T56 4T54 10Q54 11 56 23Q57 25 58 30T59 36T61 40T63 43T65 44T70 46T76 46T85 46H92Q147 46 166 49T193 62L204 106Q216 149 216 151",120570:"125 84Q127 78 194 76H243V78Q243 122 208 215T165 350Q164 359 162 389Q162 522 272 610Q328 656 396 680T525 704Q628 704 698 661Q734 637 755 601T781 544T786 504Q786 439 747 374T635 226T537 109Q518 81 518 77Q537 76 557 76Q608 76 620 78T640 92Q646 100 656 119T673 155T683 172Q690 173 698 173Q718 173 718 162Q718 161 681 82T642 2Q639 0 550 0H461Q455 5 455 9T458 28Q472 78 510 149T584 276T648 402T677 525Q677 594 636 631T530 668Q476 668 423 641T335 568Q284 499 271 400Q270 388 270 348Q270 298 277 228T285 115Q285 82 280 49T271 6Q269 1 258 1T175 0H87Q83 3 80 7V18Q80 22 82 98Q84 156 85 163T91 172Q94 173 104 173T119 172Q124 169 124 126Q125 104 125 84",120572:"34 156Q34 270 120 356T309 442Q379 442 421 402T478 304Q484 275 485 237V208Q534 282 560 374Q564 388 566 390T582 393Q603 393 603 385Q603 376 594 346T558 261T497 161L486 147L487 123Q489 67 495 47T514 26Q528 28 540 37T557 60Q559 67 562 68T577 70Q597 70 597 62Q597 56 591 43Q579 19 556 5T512 -10H505Q438 -10 414 62L411 69L400 61Q390 53 370 41T325 18T267 -2T203 -11Q124 -11 79 39T34 156ZM208 26Q257 26 306 47T379 90L403 112Q401 255 396 290Q382 405 304 405Q235 405 183 332Q156 292 139 224T121 120Q121 71 146 49T208 26",120573:"29 -194Q23 -188 23 -186Q23 -183 102 134T186 465Q208 533 243 584T309 658Q365 705 429 705H431Q493 705 533 667T573 570Q573 465 469 396L482 383Q533 332 533 252Q533 139 448 65T257 -10Q227 -10 203 -2T165 17T143 40T131 59T126 65L62 -188Q60 -194 42 -194H29ZM353 431Q392 431 427 419L432 422Q436 426 439 429T449 439T461 453T472 471T484 495T493 524T501 560Q503 569 503 593Q503 611 502 616Q487 667 426 667Q384 667 347 643T286 582T247 514T224 455Q219 439 186 308T152 168Q151 163 151 147Q151 99 173 68Q204 26 260 26Q302 26 349 51T425 137Q441 171 449 214T457 279Q457 337 422 372Q380 358 347 358H337Q258 358 258 389Q258 396 261 403Q275 431 353 431",120574:"31 249Q11 249 11 258Q11 275 26 304T66 365T129 418T206 441Q233 441 239 440Q287 429 318 386T371 255Q385 195 385 170Q385 166 386 166L398 193Q418 244 443 300T486 391T508 430Q510 431 524 431H537Q543 425 543 422Q543 418 522 378T463 251T391 71Q385 55 378 6T357 -100Q341 -165 330 -190T303 -216Q286 -216 286 -188Q286 -138 340 32L346 51L347 69Q348 79 348 100Q348 257 291 317Q251 355 196 355Q148 355 108 329T51 260Q49 251 47 251Q45 249 31 249",120575:"195 609Q195 656 227 686T302 717Q319 716 351 709T407 697T433 690Q451 682 451 662Q451 644 438 628T403 612Q382 612 348 641T288 671T249 657T235 628Q235 584 334 463Q401 379 401 292Q401 169 340 80T205 -10H198Q127 -10 83 36T36 153Q36 286 151 382Q191 413 252 434Q252 435 245 449T230 481T214 521T201 566T195 609ZM112 130Q112 83 136 55T204 27Q233 27 256 51T291 111T309 178T316 232Q316 267 309 298T295 344T269 400L259 396Q215 381 183 342T137 256T118 179T112 130",120576:"190 -22Q124 -22 76 11T27 107Q27 174 97 232L107 239L99 248Q76 273 76 304Q76 364 144 408T290 452H302Q360 452 405 421Q428 405 428 392Q428 381 417 369T391 356Q382 356 371 365T338 383T283 392Q217 392 167 368T116 308Q116 289 133 272Q142 263 145 262T157 264Q188 278 238 278H243Q308 278 308 247Q308 206 223 206Q177 206 142 219L132 212Q68 169 68 112Q68 39 201 39Q253 39 286 49T328 72T345 94T362 105Q376 103 376 88Q376 79 365 62T334 26T275 -8T190 -22",120577:"296 643Q298 704 324 704Q342 704 342 687Q342 682 339 664T336 633Q336 623 337 618T338 611Q339 612 341 612Q343 614 354 616T374 618L384 619H394Q471 619 471 586Q467 548 386 546H372Q338 546 320 564L311 558Q235 506 175 398T114 190Q114 171 116 155T125 127T137 104T153 86T171 72T192 61T213 53T235 46T256 39L322 16Q389 -10 389 -80Q389 -119 364 -154T300 -202Q292 -204 274 -204Q247 -204 225 -196Q210 -192 193 -182T172 -167Q167 -159 173 -148Q180 -139 191 -139Q195 -139 221 -153T283 -168Q298 -166 310 -152T322 -117Q322 -91 302 -75T250 -51T183 -29T116 4T65 62T44 160Q44 287 121 410T293 590L302 595Q296 613 296 643",120578:"21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q156 442 175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336V326Q503 302 439 53Q381 -182 377 -189Q364 -216 332 -216Q319 -216 310 -208T299 -186Q299 -177 358 57L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287",120579:"35 200Q35 302 74 415T180 610T319 704Q320 704 327 704T339 705Q393 701 423 656Q462 596 462 495Q462 380 417 261T302 66T168 -10H161Q125 -10 99 10T60 63T41 130T35 200ZM383 566Q383 668 330 668Q294 668 260 623T204 521T170 421T157 371Q206 370 254 370L351 371Q352 372 359 404T375 484T383 566ZM113 132Q113 26 166 26Q181 26 198 36T239 74T287 161T335 307L340 324H145Q145 321 136 286T120 208T113 132",120580:"139 -10Q111 -10 92 0T64 25T52 52T48 74Q48 89 55 109T85 199T135 375L137 384Q139 394 140 397T145 409T151 422T160 431T173 439T190 442Q202 442 213 435T225 410Q225 404 214 358T181 238T137 107Q126 74 126 54Q126 43 126 39T130 31T142 27H147Q206 27 255 78Q272 98 281 114T290 138T295 149T313 153Q321 153 324 153T329 152T332 149T332 143Q332 106 276 48T145 -10H139",120581:"83 -11Q70 -11 62 -4T51 8T49 17Q49 30 96 217T147 414Q160 442 193 442Q205 441 213 435T223 422T225 412Q225 401 208 337L192 270Q193 269 208 277T235 292Q252 304 306 349T396 412T467 431Q489 431 500 420T512 391Q512 366 494 347T449 327Q430 327 418 338T405 368Q405 370 407 380L397 375Q368 360 315 315L253 266L240 257H245Q262 257 300 251T366 230Q422 203 422 150Q422 140 417 114T411 67Q411 26 437 26Q484 26 513 137Q516 149 519 151T535 153Q554 153 554 144Q554 121 527 64T457 -7Q447 -10 431 -10Q386 -10 360 17T333 90Q333 108 336 122T339 146Q339 170 320 186T271 209T222 218T185 221H180L155 122Q129 22 126 16Q113 -11 83 -11",120582:"166 673Q166 685 183 694H202Q292 691 316 644Q322 629 373 486T474 207T524 67Q531 47 537 34T546 15T551 6T555 2T556 -2T550 -11H482Q457 3 450 18T399 152L354 277L340 262Q327 246 293 207T236 141Q211 112 174 69Q123 9 111 -1T83 -12Q47 -12 47 20Q47 37 61 52T199 187Q229 216 266 252T321 306L338 322Q338 323 288 462T234 612Q214 657 183 657Q166 657 166 673",120583:"58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216",120584:"74 431Q75 431 146 436T219 442Q231 442 231 434Q231 428 185 241L137 51H140L150 55Q161 59 177 67T214 86T261 119T312 165Q410 264 445 394Q458 442 496 442Q509 442 519 434T530 411Q530 390 516 352T469 262T388 162T267 70T106 5Q81 -2 71 -2Q66 -2 59 -1T51 1Q45 5 45 11Q45 13 88 188L132 364Q133 377 125 380T86 385H65Q59 391 59 393T61 412Q65 431 74 431",120585:"268 632Q268 704 296 704Q314 704 314 687Q314 682 311 664T308 635T309 620V616H315Q342 619 360 619Q443 619 443 586Q439 548 358 546H344Q326 546 317 549T290 566Q257 550 226 505T195 405Q195 381 201 364T211 342T218 337Q266 347 298 347Q375 347 375 314Q374 297 359 288T327 277T280 275Q234 275 208 283L195 286Q149 260 119 214T88 130Q88 116 90 108Q101 79 129 63T229 20Q238 17 243 15Q337 -21 354 -33Q383 -53 383 -94Q383 -137 351 -171T273 -205Q240 -205 202 -190T158 -167Q156 -163 156 -159Q156 -151 161 -146T176 -140Q182 -140 189 -143Q232 -168 274 -168Q286 -168 292 -165Q313 -151 313 -129Q313 -112 301 -104T232 -75Q214 -68 204 -64Q198 -62 171 -52T136 -38T107 -24T78 -8T56 12T36 37T26 66T21 103Q21 149 55 206T145 301L154 307L148 313Q141 319 136 323T124 338T111 358T103 382T99 413Q99 471 143 524T259 602L271 607Q268 618 268 632",120586:"201 -11Q126 -11 80 38T34 156Q34 221 64 279T146 380Q222 441 301 441Q333 441 341 440Q354 437 367 433T402 417T438 387T464 338T476 268Q476 161 390 75T201 -11ZM121 120Q121 70 147 48T206 26Q250 26 289 58T351 142Q360 163 374 216T388 308Q388 352 370 375Q346 405 306 405Q243 405 195 347Q158 303 140 230T121 120",120587:"132 -11Q98 -11 98 22V33L111 61Q186 219 220 334L228 358H196Q158 358 142 355T103 336Q92 329 81 318T62 297T53 285Q51 284 38 284Q19 284 19 294Q19 300 38 329T93 391T164 429Q171 431 389 431Q549 431 553 430Q573 423 573 402Q573 371 541 360Q535 358 472 358H408L405 341Q393 269 393 222Q393 170 402 129T421 65T431 37Q431 20 417 5T381 -10Q370 -10 363 -7T347 17T331 77Q330 86 330 121Q330 170 339 226T357 318T367 358H269L268 354Q268 351 249 275T206 114T175 17Q164 -11 132 -11",120588:"58 -216Q25 -216 23 -186Q23 -176 73 26T127 234Q143 289 182 341Q252 427 341 441Q343 441 349 441T359 442Q432 442 471 394T510 276Q510 219 486 165T425 74T345 13T266 -10H255H248Q197 -10 165 35L160 41L133 -71Q108 -168 104 -181T92 -202Q76 -216 58 -216ZM424 322Q424 359 407 382T357 405Q322 405 287 376T231 300Q217 269 193 170L176 102Q193 26 260 26Q298 26 334 62Q367 92 389 158T418 266T424 322",120589:"31 207Q31 306 115 374T302 442Q341 442 373 430T405 400Q405 392 399 383T379 374Q373 375 348 390T296 405Q222 405 160 357T98 249Q98 232 103 218T112 195T132 175T154 159T186 141T219 122Q234 114 255 102T286 85T299 78L302 74Q306 71 308 69T315 61T322 51T328 40T332 25T334 8Q334 -31 305 -69T224 -107Q194 -107 163 -92Q156 -88 156 -80Q156 -73 162 -67T178 -61Q186 -61 190 -63Q209 -71 224 -71Q244 -71 253 -59T263 -30Q263 -25 263 -21T260 -12T255 -4T248 3T239 9T227 17T213 25T195 34T174 46Q170 48 150 58T122 74T97 90T70 112T51 137T36 169T31 207",120590:"184 -11Q116 -11 74 34T31 147Q31 247 104 333T274 430Q275 431 414 431H552Q553 430 555 429T559 427T562 425T565 422T567 420T569 416T570 412T571 407T572 401Q572 357 507 357Q500 357 490 357T476 358H416L421 348Q439 310 439 263Q439 153 359 71T184 -11ZM361 278Q361 358 276 358Q152 358 115 184Q114 180 114 178Q106 141 106 117Q106 67 131 47T188 26Q242 26 287 73Q316 103 334 153T356 233T361 278",120591:"39 284Q18 284 18 294Q18 301 45 338T99 398Q134 425 164 429Q170 431 332 431Q492 431 497 429Q517 424 517 402Q517 388 508 376T485 360Q479 358 389 358T299 356Q298 355 283 274T251 109T233 20Q228 5 215 -4T186 -13Q153 -13 153 20V30L203 192Q214 228 227 272T248 336L254 357Q254 358 208 358Q206 358 197 358T183 359Q105 359 61 295Q56 287 53 286T39 284",120592:"413 384Q413 406 432 424T473 443Q492 443 507 425T523 367Q523 334 508 270T468 153Q424 63 373 27T282 -10H268Q220 -10 186 2T135 36T111 78T104 121Q104 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 299 34 333T82 404T161 441Q200 441 225 419T250 355Q248 336 247 334Q247 331 232 291T201 199T185 118Q185 68 211 47T275 26Q317 26 355 57T416 132T452 216T465 277Q465 301 457 318T439 343T421 361T413 384",120593:"92 210Q92 176 106 149T142 108T185 85T220 72L235 70L237 71L250 112Q268 170 283 211T322 299T370 375T429 423T502 442Q547 442 582 410T618 302Q618 224 575 152T457 35T299 -10Q273 -10 273 -12L266 -48Q260 -83 252 -125T241 -179Q236 -203 215 -212Q204 -218 190 -218Q159 -215 159 -185Q159 -175 214 -2L209 0Q204 2 195 5T173 14T147 28T120 46T94 71T71 103T56 142T50 190Q50 238 76 311T149 431H162Q183 431 183 423Q183 417 175 409Q134 361 114 300T92 210ZM574 278Q574 320 550 344T486 369Q437 369 394 329T323 218Q309 184 295 109L286 64Q304 62 306 62Q423 62 498 131T574 278",120594:"576 -125Q576 -147 547 -175T487 -204H476Q394 -204 363 -157Q334 -114 293 26L284 59Q283 58 248 19T170 -66T92 -151T53 -191Q49 -194 43 -194Q36 -194 31 -189T25 -177T38 -154T151 -30L272 102L265 131Q189 405 135 405Q104 405 87 358Q86 351 68 351Q48 351 48 361Q48 369 56 386T89 423T148 442Q224 442 258 400Q276 375 297 320T330 222L341 180Q344 180 455 303T573 429Q579 431 582 431Q600 431 600 414Q600 407 587 392T477 270Q356 138 353 134L362 102Q392 -10 428 -89T490 -168Q504 -168 517 -156T536 -126Q539 -116 543 -115T557 -114T571 -115Q576 -118 576 -125",120595:"161 441Q202 441 226 417T250 358Q250 338 218 252T187 127Q190 85 214 61Q235 43 257 37Q275 29 288 29H289L371 360Q455 691 456 692Q459 694 472 694Q492 694 492 687Q492 678 411 356Q329 28 329 27T335 26Q421 26 498 114T576 278Q576 302 568 319T550 343T532 361T524 384Q524 405 541 424T583 443Q602 443 618 425T634 366Q634 337 623 288T605 220Q573 125 492 57T329 -11H319L296 -104Q272 -198 272 -199Q270 -205 252 -205H239Q233 -199 233 -197Q233 -192 256 -102T279 -9Q272 -8 265 -8Q106 14 106 139Q106 174 139 264T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 299 34 333T82 404T161 441",120596:"495 384Q495 406 514 424T555 443Q574 443 589 425T604 364Q604 334 592 278T555 155T483 38T377 -11Q297 -11 267 66Q266 68 260 61Q201 -11 125 -11Q15 -11 15 139Q15 230 56 325T123 434Q135 441 147 436Q160 429 160 418Q160 406 140 379T94 306T62 208Q61 202 61 187Q61 124 85 100T143 76Q201 76 245 129L253 137V156Q258 297 317 297Q348 297 348 261Q348 243 338 213T318 158L308 135Q309 133 310 129T318 115T334 97T358 83T393 76Q456 76 501 148T546 274Q546 305 533 325T508 357T495 384",120597:"202 508Q179 508 169 520T158 547Q158 557 164 577T185 624T230 675T301 710L333 715H345Q378 715 384 714Q447 703 489 661T549 568T566 457Q566 362 519 240T402 53Q321 -22 223 -22Q123 -22 73 56Q42 102 42 148V159Q42 276 129 370T322 465Q383 465 414 434T455 367L458 378Q478 461 478 515Q478 603 437 639T344 676Q266 676 223 612Q264 606 264 572Q264 547 246 528T202 508ZM430 306Q430 372 401 400T333 428Q270 428 222 382Q197 354 183 323T150 221Q132 149 132 116Q132 21 232 21Q244 21 250 22Q327 35 374 112Q389 137 409 196T430 306",120598:"227 -11Q149 -11 95 41T40 174Q40 262 87 322Q121 367 173 396T287 430Q289 431 329 431H367Q382 426 382 411Q382 385 341 385H325H312Q191 385 154 277L150 265H327Q340 256 340 246Q340 228 320 219H138V217Q128 187 128 143Q128 77 160 52T231 26Q258 26 284 36T326 57T343 68Q350 68 354 58T358 39Q358 36 357 35Q354 31 337 21T289 0T227 -11",120599:"537 500Q537 474 533 439T524 383L521 362Q558 355 561 351Q563 349 563 345Q563 321 552 318Q542 318 521 323L510 326Q496 261 459 187T362 51T241 -11Q100 -11 100 105Q100 139 127 242T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Q21 291 27 313T47 368T79 418Q103 442 134 442Q169 442 201 419T233 344Q232 330 206 228T180 98Q180 26 247 26Q292 26 332 90T404 260L427 349Q422 349 398 359T339 392T289 440Q265 476 265 520Q265 590 312 647T417 705Q463 705 491 670T528 592T537 500ZM464 564Q464 668 413 668Q373 668 339 622T304 522Q304 494 317 470T349 431T388 406T421 391T435 387H436L443 415Q450 443 457 485T464 564",120600:"228 325Q170 322 156 316T127 309Q108 309 104 314Q99 319 99 322T108 341Q125 376 171 400T268 425H271Q302 425 319 396Q328 377 328 358Q328 332 324 314Q311 270 286 221Q274 194 274 192H275Q339 234 484 325T639 421Q669 434 691 434T723 425T734 406Q734 394 719 381Q715 376 644 330L575 287L566 267Q543 233 526 176Q520 160 515 143T508 115T506 105Q506 103 533 103Q585 103 607 110T641 118Q670 118 670 107Q670 100 661 85Q643 50 598 27T504 3Q465 3 450 36Q441 51 441 73Q441 84 444 96Q452 146 484 205L497 236L324 125Q143 12 135 10Q103 -6 77 -6Q61 -6 49 2T37 21Q37 36 49 46T124 96L195 141L204 156Q219 179 243 248T264 323Q264 325 228 325",120601:"409 688Q413 694 421 694H429H442Q448 688 448 686Q448 679 418 563Q411 535 404 504T392 458L388 442Q388 441 397 441T429 435T477 418Q521 397 550 357T579 260T548 151T471 65T374 11T279 -10H275L251 -105Q245 -128 238 -160Q230 -192 227 -198T215 -205H209Q189 -205 189 -198Q189 -193 211 -103L234 -11Q234 -10 226 -10Q221 -10 206 -8T161 6T107 36T62 89T43 171Q43 231 76 284T157 370T254 422T342 441Q347 441 348 445L378 567Q409 686 409 688ZM122 150Q122 116 134 91T167 53T203 35T237 27H244L337 404Q333 404 326 403T297 395T255 379T211 350T170 304Q152 276 137 237Q122 191 122 150ZM500 282Q500 320 484 347T444 385T405 400T381 404H378L332 217L284 29Q284 27 285 27Q293 27 317 33T357 47Q400 66 431 100T475 170T494 234T500 282",120602:"205 -174Q136 -174 102 -153T67 -76Q67 -25 91 85T127 234Q143 289 182 341Q252 427 341 441Q343 441 349 441T359 442Q432 442 471 394T510 276Q510 169 431 80T253 -10Q226 -10 204 -2T169 19T146 44T132 64L128 73Q128 72 124 53T116 5T112 -44Q112 -68 117 -78T150 -95T236 -102Q327 -102 356 -111T386 -154Q386 -166 384 -178Q381 -190 378 -192T361 -194H348Q342 -188 342 -179Q342 -169 315 -169Q294 -169 264 -171T205 -174ZM424 322Q424 359 407 382T357 405Q322 405 287 376T231 300Q221 276 204 217Q188 152 188 116Q188 68 210 47T259 26Q297 26 334 62Q367 92 389 158T418 266T424 322",120603:"206 -10Q158 -10 136 24T114 110Q114 233 199 349L205 358H184Q144 358 121 347Q108 340 95 330T75 312T61 295T53 285Q51 284 38 284Q19 284 19 294Q19 300 38 329T93 391T164 429Q171 431 532 431Q799 431 803 430Q823 423 823 402Q823 377 801 364Q790 358 766 358Q748 358 748 357Q748 355 749 348T752 327T754 297Q754 258 738 207T693 107T618 24T520 -10Q488 -10 466 2T432 36T416 77T411 120Q411 128 410 128T404 122Q373 71 323 31T206 -10ZM714 296Q714 316 707 358H251Q250 357 244 348T230 328T212 301T193 267T176 229T164 187T159 144Q159 62 222 62Q290 62 349 127T432 285Q433 286 434 288T435 291T437 293T440 294T444 294T452 294H466Q472 288 472 286Q472 285 464 244T456 170Q456 62 534 62Q604 62 659 139T714 296",120604:"65 0Q45 0 45 18Q48 52 61 60Q65 62 81 62Q155 62 165 74Q166 74 265 228T465 539T569 699Q576 707 583 709T611 711T637 710T649 700Q650 697 695 380L741 63L784 62H827Q839 50 839 45L835 29Q831 9 827 5T806 0Q803 0 790 0T743 1T657 2Q585 2 547 1T504 0Q481 0 481 17Q484 54 497 60Q501 62 541 62Q580 62 580 63Q580 68 573 121T564 179V181H308L271 124Q236 69 236 67T283 62H287Q316 62 316 46Q316 26 307 8Q302 3 295 0L262 1Q242 2 168 2Q119 2 93 1T65 0ZM537 372Q533 402 528 435T521 486T518 504V505Q517 505 433 375L348 244L451 243Q555 243 555 244L537 372",120605:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 449 686H477H586Q684 686 733 677T817 634Q853 598 853 547Q853 499 826 460T761 401T695 371T654 360H653L662 358Q670 357 683 354T712 344T744 327T774 303T795 269T804 224Q804 148 732 79T533 1Q524 0 288 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624ZM703 550Q703 571 695 586T675 609T656 619T643 623L545 624H447L417 504Q386 384 386 383T470 382Q554 383 565 385Q632 397 667 447T703 550ZM651 240Q651 265 645 282T626 309T608 322T592 329Q587 330 479 331H373L340 198Q307 65 306 64Q306 62 406 62L507 63L519 65Q565 76 596 107T639 171T651 240",120606:"257 618H231Q198 618 198 636Q202 672 214 678L219 680H763Q769 677 772 673T776 666L777 664Q777 659 766 549T751 433Q745 424 723 424Q704 424 699 427T693 441Q693 444 695 467T697 513Q697 543 689 563T670 594T636 610T592 617T534 618H516H456L455 614Q455 613 387 339T317 64Q317 62 375 62H411Q430 62 438 59T447 44Q444 7 430 2Q426 0 416 0Q409 0 359 1T231 2Q152 2 111 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L163 66Q163 67 231 341T301 616Q301 618 257 618",120607:"65 0Q59 6 59 9T61 16Q64 20 334 357T608 698Q616 706 629 710Q630 710 634 710T644 710T656 711Q686 711 694 703Q698 699 700 693Q706 674 805 345T904 14Q904 7 894 1L479 0H65ZM630 342L567 551L232 134L462 133H693Q693 137 630 342",120608:"257 618H231Q198 618 198 636Q202 672 214 678L219 680H811Q817 677 820 673T824 666L825 664Q825 659 814 549T799 433Q793 424 771 424Q752 424 746 427T740 441Q740 445 742 466T744 505Q744 561 722 585T646 616Q639 617 545 618H456Q456 617 427 502T398 385Q398 384 435 384Q461 385 471 385T499 391T526 405T545 433T562 478Q566 494 571 497T595 501H604Q622 501 626 486Q626 482 593 349T557 213Q552 205 530 205Q499 205 499 219Q499 222 503 242T508 281Q508 308 491 314T429 322Q425 322 423 322H382L317 64Q317 62 390 62Q460 62 493 64T569 80T640 124Q665 149 686 187T719 253T733 283Q739 289 760 289Q791 289 791 274Q791 267 763 201T706 71L678 8Q676 4 667 0H58Q47 5 43 15Q47 54 60 60Q64 62 113 62H162L163 66Q163 67 231 341T301 616Q301 618 257 618",120609:"223 430Q192 430 192 448Q192 450 225 561T261 677Q265 683 270 684Q273 686 534 686Q796 686 797 685Q805 682 805 673Q805 668 804 661T800 648T798 641Q796 637 531 352L266 67L329 66H364Q412 66 446 70T523 96T596 157Q617 186 630 220T649 273T663 297Q667 299 684 299H688Q715 299 715 281Q715 278 673 145T628 8Q626 4 617 0H348Q289 0 221 0T139 -1Q112 -1 99 -1T78 1T69 5T68 12Q68 16 71 31T77 49L84 57Q91 65 104 79T133 110T170 151T213 196L610 624H540Q533 624 514 624T488 624T467 623T443 620T422 616T398 609T373 600Q292 560 255 449Q251 436 246 433T223 430",120610:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 239 686Q290 684 403 684Q475 684 512 685T553 686Q576 686 576 668Q572 632 560 626Q555 624 506 624H457L399 389Q399 388 547 388H695L753 623Q753 624 709 624H686Q665 624 660 626T650 639Q653 678 668 684Q672 686 681 686Q685 686 726 685T847 684Q902 684 937 684T986 685T1004 686Q1027 686 1027 668Q1023 632 1011 626Q1006 624 957 624H908L839 344Q768 64 768 63T812 62H839Q871 62 871 44Q867 6 854 2L850 0L808 1Q782 2 675 2Q600 2 560 1T516 0Q499 0 494 15Q498 54 511 60Q515 62 564 62H613L614 66L679 324Q679 326 531 326H383L382 322L317 64Q317 62 361 62H388Q420 62 420 44Q416 6 403 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624",120611:"358 -17Q218 -17 136 49T54 243Q54 298 70 356T123 474T211 582T338 663T504 702H527Q578 702 590 701Q709 688 776 622T844 441Q844 379 825 315T765 192T668 86T532 11T358 -17ZM700 474Q700 525 685 561T642 616T587 643T528 652Q390 652 301 534Q252 472 225 373T198 210Q198 160 214 125T256 71T311 44T372 36Q484 36 571 119Q639 189 669 299T700 474ZM366 428Q366 425 364 419T362 411H466L570 412L573 422Q576 437 581 441T604 445Q620 445 623 444Q636 440 636 429Q636 423 616 340T593 253Q586 243 572 243H566Q545 243 539 249Q536 251 535 253T534 258T534 263T535 270T537 277H329L326 266Q323 251 318 247T295 243Q279 243 276 244Q263 248 263 259Q263 265 283 346Q288 366 295 394Q304 431 308 438T326 445H334H338Q366 445 366 428",120612:"247 624Q242 624 233 624T220 623Q186 623 186 640Q186 647 190 664T202 684Q206 686 226 686Q277 684 393 684Q435 684 471 684T528 685T553 686Q573 686 573 670Q573 650 564 632Q556 624 537 624H501H449L380 344Q309 64 309 63T356 62Q361 62 370 62T384 63Q417 63 417 46Q417 26 408 8Q403 3 396 0L352 1Q325 2 216 2T82 1L45 0Q30 7 30 16Q33 51 46 60Q51 62 102 62H154L294 623Q294 624 247 624",120613:"536 0Q522 6 522 18Q522 35 533 57Q539 62 557 62Q595 62 601 65L472 330L365 255L342 160Q318 65 317 64Q317 62 361 62H388Q420 62 420 44Q416 6 403 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L302 623Q302 624 258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 239 686Q290 684 403 684Q475 684 512 685T553 686Q576 686 576 668Q572 632 560 626Q555 624 506 624H457L422 481Q386 339 386 337L785 621Q779 624 749 624Q726 624 726 641Q726 645 730 659Q734 675 736 679T747 686L786 685Q812 684 888 684Q908 684 934 685T968 686Q1003 686 1003 669Q1003 646 991 629Q985 624 967 624Q918 624 888 617Q884 617 874 613L865 609Q864 608 732 515T599 420Q599 418 686 242T775 65Q784 62 829 62Q847 62 850 61T860 54Q862 52 862 43Q862 10 845 1Q844 1 842 1T836 0T797 1T694 2Q599 2 573 1L536 0",120614:"439 0Q425 6 425 18Q425 35 436 57Q442 62 485 62Q525 62 525 64L478 483Q478 484 465 463T422 394T350 277Q222 69 222 68Q223 67 224 67Q229 64 271 62Q290 62 297 59T305 45Q305 38 302 28Q297 9 293 5T274 0Q270 0 238 1T159 2Q133 2 105 2T72 1Q56 1 52 3T44 15Q44 19 48 35Q53 55 58 58T89 62Q142 64 151 73Q154 76 345 387T538 699Q550 711 570 711H580H592Q613 711 618 695Q619 692 654 379T690 63Q690 62 726 62H746Q776 62 776 44Q773 7 759 2Q755 0 747 0Q743 0 707 1T600 2Q502 2 476 1L439 0",120615:"258 624H231Q214 624 208 626T199 639Q203 678 216 684Q220 686 347 686H473Q474 685 478 682T484 677Q487 673 535 413L584 153L608 187Q631 221 672 281T761 410Q935 663 943 671Q949 678 962 686H1082H1166Q1201 686 1210 683T1219 668Q1215 632 1203 626Q1199 624 1149 624H1100L1031 344Q960 64 960 63T1004 62H1031Q1063 62 1063 44Q1060 7 1046 2Q1042 0 1034 0Q1030 0 990 1T875 2Q804 2 767 1T725 0H723Q707 0 703 15Q707 54 720 60Q724 62 773 62H822Q961 618 961 619L754 318Q546 15 543 12Q531 0 510 0Q500 0 495 0T484 5T477 19Q477 20 421 315L367 604L299 335Q234 72 234 68Q234 62 302 62Q334 62 334 46Q332 8 317 2Q313 0 306 0Q301 0 267 1T181 2Q125 2 96 1T63 0Q48 0 43 15Q43 19 47 35Q52 55 57 58T94 62Q147 64 164 69L233 345Q302 619 302 622Q302 624 258 624",120616:"258 624H235Q214 624 209 626T199 639Q203 678 216 684Q220 686 344 686H434Q464 686 477 680Q480 677 607 454Q738 227 739 227Q742 227 789 418T836 618Q836 620 835 620L821 622Q811 622 779 624Q755 624 749 625T740 632Q737 635 737 644Q737 656 742 669T754 685Q755 685 757 685T763 686Q768 686 803 685T890 684Q925 684 951 684T990 685T1006 686Q1014 686 1016 684Q1027 679 1027 668Q1023 632 1011 626Q1007 624 978 624Q912 622 907 617Q907 616 831 314T753 8Q749 0 723 0H712Q699 0 692 7Q692 8 671 44T607 155T526 296L361 580L296 323Q234 74 234 68T302 62H307Q334 62 334 44Q330 6 317 2L313 0L280 1Q260 2 181 2Q125 2 96 1T63 0Q48 0 43 15Q43 19 47 35Q52 55 57 58T94 62Q147 64 164 69L233 345Q302 619 302 622Q302 624 258 624",120617:"206 466Q175 466 175 484Q175 487 201 574T230 666Q235 673 241 675H547Q853 675 857 673Q867 668 867 657Q867 655 850 569T832 478Q827 466 808 466H802H795Q773 466 771 481Q771 486 775 508T779 541V549H774Q755 552 505 552Q281 551 267 548Q262 548 255 533T242 496T233 472Q228 466 206 466ZM259 255H252Q231 255 228 270Q228 275 248 355T270 439Q277 448 288 448H298Q321 448 326 440Q331 434 326 414Q326 413 486 413H647L650 424Q654 441 658 444T678 448H683H693Q702 448 705 446T714 432L694 348Q674 267 669 261Q664 255 652 255H643Q622 255 617 261Q613 265 613 272T613 283T616 289Q616 290 456 290H295L294 285Q293 280 292 275T288 265T281 257Q278 255 259 255ZM150 131Q150 124 281 123Q346 123 390 123Q640 123 664 126Q668 127 675 127Q686 131 704 198Q708 213 713 216T733 220H738Q755 220 759 218Q768 213 768 203Q768 198 741 105T710 8Q708 4 699 0H388Q77 0 73 2Q62 7 62 18Q62 27 81 115Q99 206 102 212Q106 220 120 220H129Q140 220 145 220T155 215T160 202Q160 196 159 192Q150 145 150 131",120618:"53 245Q53 297 70 356T125 478T216 590T349 671T523 703Q656 703 735 637T815 445Q815 378 791 307Q727 104 527 17Q437 -17 344 -17Q289 -17 242 -5T150 35T79 116T53 245ZM664 489Q664 575 618 611T511 648Q463 648 416 627T334 570Q297 531 270 472T230 355T213 261T208 206Q208 177 215 151T237 98T284 56T358 40Q440 40 510 98T618 270Q664 400 664 489",120619:"257 618H231Q198 618 198 636Q202 672 214 678L219 680H1011Q1022 675 1026 665Q1022 626 1009 620Q1005 618 956 618H907L906 614Q906 613 838 339T768 64Q768 62 812 62H839Q871 62 871 44Q867 6 854 2L850 0L808 1Q782 2 675 2Q600 2 560 1T516 0Q499 0 494 15Q498 54 511 60Q515 62 564 62H613L614 66Q614 67 682 341T752 616Q752 618 604 618H456L455 614Q455 613 387 339T317 64Q317 62 361 62H388Q420 62 420 44Q416 6 403 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q48 0 43 15Q47 54 60 60Q64 62 113 62H162L163 66Q163 67 231 341T301 616Q301 618 257 618",120620:"162 62L302 623Q302 624 258 624H234Q214 624 209 626T200 638Q200 677 217 684Q220 686 439 686Q667 685 684 682Q686 681 693 680Q713 677 733 671T782 649T829 602T847 528Q847 450 784 382T604 293Q571 288 469 287H373L346 176Q340 151 333 122T321 78L317 64Q317 62 361 62H387Q420 62 420 44Q417 10 404 2L399 0L357 1Q331 2 224 2Q149 2 109 1T65 0Q43 0 43 17Q43 21 47 33Q52 54 57 58T89 62H113H162ZM692 558Q692 611 617 622Q610 623 529 624H452L381 343H458H492Q604 343 641 389Q662 414 677 471T692 558",120622:"847 430Q828 430 823 434T817 450Q817 454 817 466T818 487Q818 526 809 551T784 591T737 613T675 622T590 624H528H430L513 487Q594 351 596 345Q596 335 590 330Q583 323 418 204L250 81L363 80Q533 80 591 89T694 142Q739 185 765 252Q772 268 776 271T799 274Q816 274 820 272Q832 266 830 254Q829 250 784 130T736 7Q732 3 725 0H405Q84 0 80 2Q69 7 69 18Q69 26 75 32Q76 32 98 48T168 100T255 164L432 293Q429 300 329 465T225 637Q223 675 245 686H888Q900 680 902 671Q902 667 890 556T876 441Q871 430 847 430",120623:"498 62Q511 58 511 43Q511 10 494 1L490 0Q487 0 482 0T424 1T271 2Q201 2 157 2T94 1T72 0H70Q46 0 46 17Q49 54 62 60L66 62H137Q208 62 209 63L218 98Q227 134 244 203T278 339L347 613H300Q262 612 246 611T198 599T146 564Q128 545 114 512T91 454T79 425Q73 419 52 419Q22 419 22 434Q22 440 41 498T80 611L100 666Q105 673 111 675H434Q758 675 762 673Q772 668 772 657Q772 655 756 549T738 434Q735 419 711 419H707Q690 419 686 421Q677 425 677 434Q676 436 678 449T683 485T686 529Q686 553 679 569T662 594T631 607T593 612T544 613H502L433 340Q418 279 400 207T374 100L365 65L364 62H498",120624:"32 544Q32 586 91 644T229 703Q277 703 311 683T363 628T389 560T397 491V478L404 491Q455 589 526 646T677 703Q730 703 766 671T802 584Q802 551 793 541T766 531H757L736 532L732 535L729 539V549Q731 569 715 575T658 581H650Q545 581 477 443Q453 392 443 351Q441 345 424 273T389 133T371 64Q371 62 428 62H461Q483 62 492 59T501 44Q498 10 485 2L480 0L431 1Q401 2 278 2T127 1L85 0Q71 5 71 17Q71 24 74 33Q77 46 78 49T84 57T95 61T118 62H154H216Q232 126 249 193T273 287T287 345T296 388T299 416T300 452Q294 581 198 581Q154 581 132 575T106 562T99 546T86 533Q82 531 60 531L39 532Q32 537 32 544",120625:"323 624H293Q267 624 261 626T251 639Q255 678 268 684Q272 686 293 686Q348 684 475 684Q557 684 600 685T647 686H648Q671 686 671 668Q667 632 655 626Q650 624 588 624H525L500 520Q500 519 520 518T579 507T656 480Q737 440 737 372Q737 294 648 237Q562 180 426 169L412 168L399 118Q386 66 386 65L385 62H443H479Q498 62 506 59T515 44Q511 8 499 2L494 0L447 1Q417 2 298 2Q212 2 167 1T118 0Q100 0 95 15Q99 54 112 60Q116 62 179 62H241Q242 64 254 114T266 167Q266 168 262 168Q256 168 237 170T180 181T110 205T54 249T29 316Q29 391 112 446T327 516Q345 518 349 518Q351 518 353 518L355 519Q356 520 368 570T381 623Q381 624 323 624ZM342 466Q341 467 339 467Q320 467 283 455T225 420Q181 361 181 296Q181 273 193 257T222 233T254 222T277 219L280 220Q281 220 311 342T342 466ZM583 389Q583 409 576 423T557 444T533 456T509 463T492 467H486L455 343Q444 300 437 271T428 231T426 219Q430 219 445 222T483 232T521 250Q551 269 567 310T583 389",120626:"931 686Q953 686 953 670Q953 650 944 632Q936 624 924 624H914Q823 624 803 611Q800 609 696 503T591 396Q591 394 667 229L743 62H787H814Q846 62 846 44Q843 7 829 2Q825 0 817 0Q813 0 775 1T664 2Q590 2 551 1T508 0H507Q484 0 484 18Q484 19 488 37Q492 56 497 58T534 62L566 63Q567 64 520 169T471 274Q469 274 369 172T268 67L315 62Q320 62 328 62L335 61Q347 58 347 44Q344 10 331 2L326 0L287 1Q263 2 177 2Q95 2 78 1L53 0Q38 6 38 17Q38 40 50 57Q56 62 78 62Q169 62 188 75Q194 77 435 324L444 334L439 347Q437 351 373 492L313 624H268H246Q220 624 212 632Q210 636 210 642Q210 655 215 669T227 684Q230 686 247 686Q295 684 398 684Q438 684 472 684T527 685T551 686Q567 686 572 671Q572 667 568 651Q563 631 558 628T523 624T492 623H488L526 540Q563 457 564 457Q564 456 574 466T604 496T645 537L724 619Q716 622 677 624H673Q645 624 645 640Q645 660 654 678Q659 683 666 686L704 685Q728 684 813 684Q847 684 873 684T913 685T931 686",120627:"205 471Q205 445 196 403T186 333Q186 303 194 281T218 248T240 233T262 224L361 623Q361 624 303 624Q296 624 284 624T266 623Q232 623 232 641Q232 648 235 657Q240 678 244 682T268 686H273Q329 684 457 684Q502 684 540 684T599 685T626 686H628Q651 686 651 668Q649 633 631 624H505L407 227Q410 228 416 229T439 239T472 259T507 294T539 345Q549 365 563 416T597 498T649 538Q657 540 717 540Q725 540 737 540T755 541Q790 541 790 524Q790 512 784 497Q780 491 767 490T742 477Q736 471 731 463T722 449T715 433T710 419T705 403T701 389Q686 340 658 302T599 240T530 201T463 179T404 169L391 168L379 116Q365 67 365 63Q365 62 422 62H455Q477 62 486 59T495 44Q492 10 479 2L474 0L427 1Q397 2 278 2T131 1L90 0Q76 5 76 17Q76 24 79 33Q82 46 83 49T89 57T100 61T123 62H159H221Q247 162 247 168H244Q241 169 239 169Q202 176 178 182T123 207T74 252Q46 291 46 351Q46 375 52 404T59 454Q59 489 40 489Q32 489 27 494T22 507Q22 535 37 538Q40 540 99 540H128Q168 540 186 528T205 471",120628:"162 119Q181 115 235 115L273 116Q273 133 231 222T180 345Q173 368 173 391V406V414Q173 477 214 540Q255 600 315 635Q353 661 423 682T585 703Q656 703 711 690T799 656T851 608T879 555T886 503Q886 449 860 401Q840 359 810 322T725 230T643 146Q619 117 619 116T650 115Q707 115 722 120Q730 123 750 165T775 210Q779 212 796 212Q828 212 828 196Q828 191 807 144T764 52L743 7Q740 4 740 4T733 2T717 0T686 0H632H573Q535 0 526 3T517 17Q517 44 544 103T617 243T671 341Q729 454 729 535Q729 599 686 625T583 652Q549 652 517 645T450 616T388 561T344 470T327 340Q327 304 331 237T336 135Q336 93 330 50T313 2Q308 0 208 0H142Q107 0 100 4T93 25Q93 28 93 41T95 77T96 118L100 199Q105 208 109 210T131 212Q147 212 151 210T161 199V160Q161 131 162 125V119",120630:"39 166Q39 213 59 261T117 353T219 424T362 452Q420 452 466 433T536 384T573 325T586 269V265Q593 272 609 308T636 381Q640 397 644 399T669 402H680Q700 402 700 388Q700 379 691 351T659 276T604 188L593 173L595 153Q600 79 612 43H618Q634 45 642 51T653 64T658 71Q661 73 684 73Q712 73 712 59Q712 39 685 16T603 -7Q588 -7 575 -5T551 2T532 12T516 24T503 37T494 49T487 60T481 69L469 61Q362 -8 251 -8Q159 -8 99 36T39 166ZM260 43Q310 43 361 63T438 101T465 124Q458 240 453 277Q435 401 354 401Q291 401 245 355Q230 337 217 313Q201 279 186 216T170 126Q170 72 208 54Q230 43 260 43",120631:"59 -194H49Q31 -194 28 -182Q28 -178 107 139T192 473Q212 533 248 580T324 652T395 689T450 701H461Q514 701 551 688T605 652T630 607T637 561Q637 546 634 526T611 465T556 393Q572 382 590 347T608 262Q608 146 522 69T299 -8Q279 -8 261 -6T228 2T204 13T183 26T169 37T157 48L150 56L120 -64Q113 -90 104 -128Q93 -175 89 -184T73 -194H59ZM531 592Q531 651 463 651Q399 651 341 600T253 466Q250 458 217 327T182 185Q180 176 180 159Q180 108 212 76T301 44Q330 44 354 51T393 65T423 91T444 118T459 151T468 179T475 206Q490 264 491 296Q491 313 489 326T484 345L482 350Q481 350 477 348T464 344T444 340T413 335T372 333T334 334T301 340T274 355T265 380Q265 444 397 444Q425 444 445 441T476 436L485 433Q489 433 499 458Q509 482 520 527T531 592ZM424 390Q424 393 389 393Q383 393 374 393T362 392Q348 392 333 388Q345 384 379 384Q424 384 424 390",120632:"5 269Q5 285 19 312T57 368T124 421T215 451H241Q274 451 303 439T353 406T389 361T416 311T432 266T442 232L444 220L446 216L450 226Q473 278 513 357T561 441Q566 444 584 444H594Q617 444 617 430Q617 426 596 389T536 273T462 110L452 84L451 70Q447 12 427 -76T388 -192Q375 -211 355 -211Q339 -211 332 -198T325 -171Q325 -114 386 64L393 84V98Q393 181 371 241Q360 280 319 303T210 327Q158 327 126 317T84 296T68 272T59 258Q55 256 36 256Q23 256 18 256T9 260T5 269",120633:"216 610Q216 640 229 664T262 700T299 719T327 725Q330 725 406 709T487 690Q513 681 513 651Q513 627 494 607T450 587Q417 587 378 631Q346 663 314 663Q286 663 272 639Q271 637 271 634Q271 609 344 536L397 484Q438 448 458 410T478 313Q478 234 443 147T338 18Q298 -8 249 -8Q214 -8 180 0T113 26T60 81T39 168Q39 200 50 237T87 316T160 391T272 442L260 465Q216 553 216 610ZM348 235Q348 274 336 313T310 372L298 392Q295 391 290 390T269 380T241 359T212 323T185 267Q157 168 157 130Q157 83 186 63T255 43Q280 43 300 67Q317 89 332 138T348 235",120634:"224 -17Q126 -17 81 22T36 112Q36 178 84 226L93 236L88 246Q79 264 79 289Q79 341 124 388Q201 461 333 461Q402 461 455 425Q480 409 481 390Q481 365 464 350T428 334Q415 334 387 352T313 370Q141 370 141 293Q141 275 146 270Q147 270 148 270T155 272Q202 291 263 291H270Q349 291 349 244Q349 195 281 183Q274 182 239 182Q201 182 184 185T137 200Q123 188 112 168T100 129T112 98T148 81T189 75T237 74H243H251Q288 74 310 75T359 86T398 112Q405 124 417 124Q426 124 432 117T439 100Q439 88 427 70T390 32T322 -3T224 -17ZM286 238Q286 240 253 240Q245 240 234 239T216 237T209 235Q209 232 250 232Q286 232 286 238",120635:"361 711Q373 711 381 703T389 683Q389 681 388 676T383 656T376 618V612H379Q385 618 429 618Q521 618 521 572Q521 551 506 534Q483 510 415 507Q385 507 371 511T336 536L326 528Q254 472 204 381T154 209Q154 190 157 177Q159 165 162 154T170 135T182 119T195 106T212 95T229 86T249 78T269 72T290 66T311 60Q385 37 388 36Q437 14 454 -36Q456 -46 456 -64Q456 -83 455 -90Q445 -132 413 -167T333 -202Q300 -202 257 -191T206 -169Q203 -164 203 -158Q203 -148 210 -140T231 -130Q239 -130 263 -139T326 -151H329Q337 -151 342 -150T352 -143T357 -123Q356 -117 355 -113T350 -104T344 -96T335 -90T324 -85T310 -80T294 -74T275 -68T254 -62Q253 -62 231 -56T205 -48T179 -39T150 -26T125 -10T100 11T80 37T62 70T53 109T48 157Q48 281 123 396T317 586V612Q319 638 320 649T325 678T338 703T361 711ZM454 564Q445 567 424 567Q407 567 398 565T387 563Q387 558 411 558Q434 558 450 562L454 564",120636:"24 296Q25 302 27 312T41 350T65 397T103 435T157 452Q202 452 233 435Q267 419 284 384L294 392Q304 401 316 410T348 429T388 445Q410 451 445 451H453Q468 451 482 450T519 443T558 425T587 391T600 337V327Q600 311 538 64Q484 -158 478 -168Q457 -211 409 -211Q386 -211 372 -197T357 -161Q357 -158 415 80Q476 330 477 348Q477 366 473 377T461 393T448 399T432 400H427Q379 400 335 363Q300 332 280 298Q277 293 246 170T213 40Q205 22 186 7T142 -8T103 7T89 39Q89 49 106 117T142 260T164 351Q166 363 166 372Q166 402 148 402Q126 402 110 369Q100 350 90 310Q85 289 82 286T60 282H55H44Q24 282 24 296",120637:"213 -8Q130 -8 85 50T40 200V207Q40 303 83 428Q122 535 189 608Q279 702 381 702Q410 702 437 693T492 661T537 593T554 486Q554 428 539 362T495 230T425 111T330 25T213 -8ZM433 562Q433 600 419 625T377 651Q363 651 348 644T311 619T268 557T229 453Q225 441 217 411T208 378H401Q433 500 433 562ZM161 140Q161 43 217 43Q249 43 280 74Q310 103 332 150T378 287Q385 313 385 315Q385 316 289 316H192Q191 308 183 275T169 205T161 140",120638:"161 -8Q111 -8 75 16T38 85Q38 95 48 121T80 214T123 368L124 374Q126 381 127 386T132 399T139 414T149 428T162 440T180 448T203 452Q226 452 241 439T257 404Q257 386 230 290T171 111Q157 73 157 57Q157 43 166 43Q209 43 258 69T322 144Q326 157 330 159T348 162H355H366Q386 162 386 148Q386 143 383 132T367 100T335 61Q301 27 253 10T161 -8",120639:"258 405Q258 394 251 364T237 308T230 281T238 284T270 306T330 349Q365 377 389 394T450 427T519 444Q545 444 559 430T574 391Q574 360 551 336T491 312Q469 312 454 326T439 364Q439 372 438 372Q433 372 395 344T320 289T283 260H285Q287 260 290 260T297 259Q495 248 495 146Q495 132 491 110T486 74Q486 43 505 43Q520 43 531 53Q559 72 578 141Q582 157 586 159T611 162H622Q642 162 642 148T627 100T578 29T504 -7H495Q435 -7 399 22T363 96Q363 111 366 122T369 142Q369 155 364 165T347 182T326 193T298 200T269 204T238 207T212 210L211 206L190 123L169 40Q161 22 142 7T98 -8T59 7T45 39Q45 48 67 139T112 317L134 404Q142 424 161 438T204 452Q226 452 242 440T258 405",120640:"95 -13Q70 -13 55 4T40 41Q40 65 61 88Q65 92 210 207T357 322L235 602Q217 640 185 643Q182 643 178 644T173 645Q161 651 161 666Q161 677 167 684T181 692Q189 694 212 694Q335 694 358 660Q362 653 500 340T647 18Q652 10 652 6Q652 -8 622 -8H589H538L526 -5Q506 1 500 8Q494 16 444 128Q442 133 440 138L387 259L265 134Q156 20 137 4T95 -13",120641:"294 -8Q265 -8 244 -5T213 1T201 4Q200 4 192 -32T172 -111T155 -168Q134 -211 86 -211Q62 -211 48 -196T34 -158Q37 -144 103 123T174 404Q182 424 201 438T244 452Q271 452 284 436T298 404Q298 392 267 269T235 114Q235 43 305 43Q342 43 375 68T418 110Q420 112 455 253T492 397Q514 444 562 444Q587 444 601 429T615 397Q615 387 599 320T563 178T542 93Q540 81 540 72Q540 42 558 42Q580 42 596 75Q606 94 616 134Q621 155 624 158T646 162H651H662Q682 162 682 148Q681 142 679 132T665 94T641 47T602 9T548 -8Q523 -8 502 -3T468 11T446 27T432 40L429 46Q367 -8 294 -8",120642:"88 382Q70 382 65 385T59 402T64 427T78 443Q79 444 157 448T247 452Q256 452 261 448T266 440L267 437Q267 432 223 252L177 71L192 77Q293 117 371 199T480 388Q489 424 511 438T556 452Q579 452 593 438T608 402Q608 378 593 340T540 251T446 152T299 62T96 -1Q91 -2 78 -2Q38 -2 38 15Q38 22 82 198L127 379Q124 382 88 382",120643:"287 648Q291 671 293 680T305 700T329 711Q339 711 347 705T356 687Q356 680 351 653T345 619Q345 615 346 615Q358 618 398 618Q490 618 490 572Q490 553 476 536T434 512Q411 508 378 508H366Q332 508 306 534L298 525Q271 496 254 456T237 375Q237 336 244 336Q272 346 319 346H325Q354 346 372 344T406 331T422 300Q422 252 350 238Q332 236 303 236Q286 236 269 238T240 242T218 247T202 252L196 254Q191 254 174 237T141 191T124 139Q124 108 151 92T267 46Q285 40 295 37Q308 33 332 25T366 13T392 3T415 -8T432 -20T445 -36T451 -55T454 -80Q454 -118 427 -153T358 -199Q349 -201 327 -201Q313 -201 298 -200T271 -196T246 -191T226 -185T210 -180T200 -176L196 -174Q187 -170 187 -158T196 -138T216 -130Q217 -130 254 -140T329 -151Q349 -151 349 -135Q349 -127 340 -122T293 -104Q260 -93 238 -85Q130 -48 115 -41Q71 -19 47 15T23 88Q23 126 48 179T130 277L144 288L136 297Q99 336 99 390Q99 456 148 514T285 602V619Q285 624 286 635T287 648ZM355 563Q362 560 376 558Q424 558 423 564Q405 567 390 567Q369 567 355 563ZM279 292Q297 287 315 287Q355 287 355 293Q355 296 321 296Q316 296 308 296L301 295Q295 295 289 294L279 292",120644:"254 -8Q191 -8 146 9T80 54T49 111T39 169Q39 206 53 247T96 329T176 402T292 446Q317 451 336 451L344 452Q353 452 359 452Q457 452 516 408T576 279Q576 169 488 81T254 -8ZM349 400Q321 400 287 385T231 338Q206 301 188 228T170 126Q170 99 178 83Q198 44 260 44Q367 44 409 157Q419 185 432 238T445 317Q445 336 443 348Q435 372 416 384T384 398T349 400",120645:"55 289H43Q23 289 23 303Q23 308 33 322Q116 434 199 443Q200 444 418 444Q591 444 617 444T652 439Q674 426 674 400Q674 378 661 360T625 335Q621 334 549 333H479L477 321Q476 312 476 279Q476 219 491 174T521 104T536 65Q536 38 511 15T457 -8Q403 -8 386 94Q384 110 384 139Q384 181 391 229T406 304L413 331Q413 333 365 333H316L315 329Q315 328 312 314T301 272T288 220Q274 167 258 103Q244 49 240 38T228 18Q225 16 224 14Q200 -8 172 -8Q146 -8 132 7T118 44Q118 54 121 61Q122 65 142 102T190 195T235 293Q250 329 250 333Q177 333 166 332Q115 328 88 301L77 290L55 289",120646:"307 -8Q277 -8 251 0T215 14L205 20Q203 18 193 -25T171 -114T155 -168Q134 -211 87 -211Q64 -211 49 -198T34 -162Q34 -158 137 254Q153 299 179 334T232 390T277 419T311 434Q357 451 403 451Q435 451 455 449T506 435T560 400Q603 357 603 285Q603 172 520 82T307 -8ZM474 343Q474 364 458 382T409 400H406Q339 400 299 341Q281 313 264 257Q261 248 242 170T222 89Q222 84 230 74T260 54T308 43Q334 43 365 57T417 110Q437 145 456 228Q474 298 474 332V343",120647:"33 209Q33 277 80 334T195 421T330 451H344Q410 451 439 429Q457 417 457 402Q457 386 445 375T420 363Q415 363 406 368T383 383T354 398Q347 400 330 400Q256 400 196 361T135 265V257Q135 242 147 225T174 199L358 107Q400 77 400 28T362 -63T271 -105Q254 -105 229 -99T195 -86Q188 -82 188 -71Q188 -56 197 -50T216 -44Q225 -44 237 -48T270 -53H282Q293 -44 293 -31Q293 -19 283 -10Q278 -4 200 33T115 76Q77 98 55 133T33 209",120648:"35 151Q35 190 51 236T99 327T184 404T306 443Q307 443 316 443T342 443T378 444T425 444T476 444Q606 444 626 444T655 439Q677 426 677 400Q677 358 639 340Q625 333 563 333Q510 333 510 331Q518 319 518 272Q518 155 437 74T226 -8Q123 -8 79 41T35 151ZM396 278Q396 314 375 323T305 332Q249 332 222 310T180 243Q171 219 162 178T153 116V110Q153 43 234 43Q347 43 382 199Q383 203 383 204Q396 255 396 278",120649:"55 289H43Q23 289 23 303Q23 308 33 322Q116 434 199 443Q200 444 386 444Q571 444 577 442Q588 441 599 432T610 402Q610 359 572 340Q561 335 547 334T452 333H353V331Q352 330 342 261T320 119T306 40Q300 18 281 3Q257 -13 233 -13Q210 -13 196 0T181 35Q181 44 182 48Q183 53 229 187T279 331Q279 333 228 333H209Q163 333 136 328T88 301L77 290L55 289",120650:"189 388Q189 396 187 398T176 401Q144 399 122 369T89 304Q84 288 81 285T61 282H55H44Q24 282 24 296Q24 306 34 330T64 382T116 431T188 452Q232 452 270 430T308 361Q308 345 275 258T241 123Q241 44 336 44H344Q380 44 415 73T474 140T511 214T526 267Q526 280 513 292Q505 301 486 311T456 333T444 367Q444 400 471 426T529 453Q555 453 579 431T604 358Q604 327 592 271T557 172Q550 157 541 142T510 97T464 47T404 9T328 -8Q264 -8 219 5T154 41T125 85T117 131Q117 182 153 277T189 388",120651:"238 4Q230 5 218 8T174 26T118 58T73 112T53 190Q53 219 60 246Q77 313 103 362T143 426T163 443Q165 444 186 444Q217 444 217 432Q217 425 188 392Q157 351 137 291T116 206Q116 127 263 109L276 107L288 139Q347 304 414 378T566 452Q621 449 662 412T703 286Q698 167 598 82T357 -8H332V-11Q332 -12 327 -46T317 -116T310 -157Q306 -180 286 -198T234 -216Q211 -216 197 -203T183 -168Q183 -160 184 -155Q184 -152 198 -112T225 -34T238 4ZM637 260Q637 303 607 322T541 341Q502 341 466 319T405 264Q368 218 356 159Q348 111 348 104Q348 103 361 103Q502 103 569 152T637 260",120652:"58 -194Q32 -194 32 -164Q32 -153 46 -139L175 -13Q296 104 296 106Q271 232 226 308Q165 401 141 401Q128 401 117 390T100 365Q94 350 91 349T69 346H45Q35 348 35 359Q35 380 62 411T133 450Q143 452 165 452Q286 452 329 402Q347 379 366 333T394 254T404 215Q404 213 405 213Q405 212 420 227T463 268T520 324Q637 437 640 438Q647 444 661 444Q667 444 676 438T685 419Q685 405 670 389T549 271L420 145Q433 85 444 53Q466 -25 509 -88T575 -151Q590 -151 600 -140T617 -114T626 -98Q629 -96 650 -96H655Q681 -96 681 -108Q681 -114 679 -119Q670 -148 646 -169T591 -199Q581 -201 550 -201Q422 -201 381 -143Q345 -88 316 20L311 39L230 -40Q144 -126 114 -153Q85 -182 77 -188T58 -194",120653:"244 141Q244 117 254 98T277 70T305 55T329 48T342 47L344 48L424 366Q501 678 505 686Q508 691 512 692T533 694T555 693T562 688T565 683Q565 678 486 362T406 45Q406 43 415 43Q467 49 514 78T590 143T636 213T653 266Q653 282 641 293T613 311T585 332T572 367Q572 397 598 425T657 453Q684 453 708 430T732 358Q732 330 723 287T706 225Q671 124 578 58T401 -8H393L370 -101Q346 -196 345 -197Q340 -202 316 -202H306Q286 -202 286 -188Q286 -187 296 -144T318 -57T331 -8Q331 -6 328 -6Q290 -6 233 11T148 62Q119 97 119 146Q119 181 154 275T190 388Q190 401 181 401Q154 401 129 375T90 306Q85 288 81 285T61 282H55H44Q24 282 24 296Q24 306 34 329T64 381T116 431T189 452Q237 452 273 428T309 362Q309 343 277 260T244 141",120654:"532 367Q532 399 559 426T618 453Q645 453 668 430T691 357Q691 319 677 261T649 171Q640 149 626 125T586 68T521 14T438 -7Q401 -7 372 7T333 30T311 57Q246 -8 165 -8Q119 -8 82 19T30 102Q24 126 24 163V178Q24 210 37 255Q61 346 118 424Q141 451 161 451Q174 451 184 443T194 419Q194 402 179 387Q91 273 91 206Q91 159 122 138T189 117T281 145V173Q283 223 294 253Q304 276 323 289T364 303Q386 303 400 287T415 250Q415 219 385 157L378 144Q378 142 388 136T419 124T462 117Q522 117 566 165T610 255Q610 288 561 320Q532 337 532 367",120655:"230 475Q202 475 189 492T175 526T186 570T221 631T288 687T389 710Q430 710 438 709Q495 701 537 679T601 629T637 568T653 509T657 459Q657 409 640 341Q617 248 581 180T507 75T424 16T348 -11T282 -17Q171 -17 113 37Q60 88 60 159Q60 192 71 231Q96 336 184 402Q264 462 366 462Q407 462 439 448T497 389L502 380Q503 381 508 403T519 463T525 531Q523 580 499 610T447 648T387 657Q324 657 283 616Q271 604 276 604Q279 604 286 600T302 583T311 555Q311 523 287 499T230 475ZM196 110Q196 41 287 41Q351 41 398 88Q422 111 437 151Q473 243 473 298Q473 386 409 409Q408 409 383 411Q316 411 278 373Q265 360 259 351T241 311T217 226Q196 143 196 110",120656:"415 89Q423 89 429 74T436 46Q436 43 434 39Q432 36 420 29T380 11T322 -5Q311 -7 281 -7Q216 -7 168 10T94 54T56 110T44 167V181Q44 262 94 329Q104 343 119 357T162 391T234 425T327 443Q328 443 348 443T383 444Q434 444 442 438Q450 430 450 416Q446 392 424 383L376 382Q306 381 278 369Q230 349 208 294Q199 274 199 268Q199 267 291 267Q305 267 325 267T353 268Q383 268 394 263T406 241Q406 214 380 206Q375 205 279 205T183 203Q174 176 174 140Q174 87 208 65T292 43Q295 43 300 43T307 44Q337 49 372 69T415 89",120657:"114 132Q114 153 140 253T166 372Q166 402 148 402Q126 402 110 369Q100 350 90 310Q85 289 82 286T60 282H55H44Q24 282 24 296Q25 302 27 312T41 350T65 397T104 435T158 452Q184 452 211 445T263 414T288 354V339L265 245Q237 134 237 118V107V102Q237 87 239 77T257 56T300 43Q395 43 455 254Q479 346 479 347L460 354Q294 408 294 528Q294 606 350 653T464 701Q536 701 579 659Q634 601 634 491Q634 468 630 438T623 388L620 370Q624 370 631 369T647 364T656 352Q656 347 653 335Q647 317 642 316Q640 315 637 315Q635 315 619 317Q606 319 605 316Q605 315 603 308Q587 248 550 177T457 57Q379 -8 293 -8Q192 -8 153 23T114 116V132ZM519 566Q519 600 507 625T464 651Q425 651 391 617T356 529Q356 501 370 478T404 441T443 417T477 404L491 400Q493 400 499 428T512 497T519 566",120658:"228 325Q170 322 156 316T127 309Q108 309 104 314Q99 319 99 322T108 341Q125 376 171 400T268 425H271Q302 425 319 396Q328 377 328 358Q328 332 324 314Q311 270 286 221Q274 194 274 192H275Q339 234 484 325T639 421Q669 434 691 434T723 425T734 406Q734 394 719 381Q715 376 644 330L575 287L566 267Q543 233 526 176Q520 160 515 143T508 115T506 105Q506 103 533 103Q585 103 607 110T641 118Q670 118 670 107Q670 100 661 85Q643 50 598 27T504 3Q465 3 450 36Q441 51 441 73Q441 84 444 96Q452 146 484 205L497 236L324 125Q143 12 135 10Q103 -6 77 -6Q61 -6 49 2T37 21Q37 36 49 46T124 96L195 141L204 156Q219 179 243 248T264 323Q264 325 228 325",120659:"274 -7Q232 -4 195 7T125 38T71 94T51 176V190Q51 213 60 242T95 307T156 373T255 425T393 451L397 452L427 568Q434 597 443 636Q452 677 456 685T472 694H486H495Q517 694 517 680L514 665Q510 650 503 621T489 564L460 451H469Q527 447 574 430T657 370T693 266Q693 163 599 82T350 -7H346L322 -100Q301 -190 295 -197Q291 -202 283 -202H269H258Q238 -202 238 -188Q238 -186 260 -96L283 -7H274ZM449 400Q448 400 404 225T359 47T366 45Q464 55 516 119Q542 149 558 199T575 295Q575 387 462 398L449 400ZM384 398Q384 399 381 399Q350 399 298 378T214 308Q168 236 168 149Q168 68 259 49Q282 44 294 44H295L384 398",120660:"371 -168Q357 -168 323 -171T245 -175Q143 -175 109 -150T75 -66Q75 -5 100 108T137 254Q153 299 179 334T232 390T277 419T311 434Q357 451 403 451Q435 451 455 449T506 435T560 400Q603 357 603 282Q603 213 569 148T465 38T304 -8Q273 -8 247 -2T204 14T176 31T159 46T152 53Q152 52 148 27T144 -16Q144 -36 150 -44T189 -58T293 -64Q405 -65 432 -75Q466 -88 466 -127Q466 -140 459 -172Q455 -188 451 -191T426 -194H420Q405 -194 400 -191T395 -176Q396 -170 394 -169T378 -168Q373 -168 371 -168ZM236 116Q236 77 258 60T311 43Q369 43 407 94Q429 123 451 206T474 331Q474 400 409 400H406Q339 400 299 341Q276 305 256 227T236 116",120661:"55 289H43Q23 289 23 303Q23 308 33 322Q116 434 199 443Q200 444 562 444Q922 444 928 442Q961 434 961 400Q961 376 944 355T886 333H870Q872 322 872 295V279Q872 230 842 165T751 46T618 -8Q581 -8 554 6T513 45T494 84T484 119Q484 121 478 114Q477 113 476 111Q384 -7 268 -7H265Q251 -7 237 -4T199 11T162 54T147 132Q147 149 149 166T155 198T165 229T176 256T189 281T200 301T211 319T220 333H199Q120 333 88 301L77 290L55 289ZM639 103Q674 103 712 122T780 188T811 295Q811 318 808 330V333H289Q274 318 244 263T214 169Q214 133 236 118T288 103Q351 103 412 153T494 278Q497 290 502 292T529 295Q546 295 551 293T556 283Q556 281 553 260T550 218Q550 153 576 128T639 103",120662:"110 0H86Q42 0 42 27Q42 37 148 350T258 667Q269 687 291 692Q295 694 366 694H399Q432 694 448 689T474 667Q477 663 583 350T690 27Q690 0 642 0H617H592Q582 0 575 1T561 2T549 6T541 11T533 18T527 26T522 37T517 49T512 64T506 81L490 130H225Q225 128 208 79T189 27Q185 19 180 14T170 7T156 3T143 1T127 0T110 0ZM439 279Q359 524 359 547L357 555L355 543Q347 503 270 263L259 231H357Q455 231 455 232L439 279",120663:"119 1Q98 5 92 28V667Q98 686 118 693Q121 694 272 694H289H346Q439 694 500 681T600 625Q640 580 640 513Q640 451 601 414T504 364L518 361Q568 351 602 329T649 280T666 235T671 197Q671 172 665 147T642 91T586 37T488 5Q456 1 282 1H119ZM489 509Q489 532 479 548T450 573T421 585T394 591Q387 592 315 593H247V404H298H325Q432 404 466 444Q489 470 489 509ZM517 194Q517 235 502 261T458 299T407 313T353 317H329H322H247V101H319H357Q387 101 407 103T452 111T492 133T514 171Q516 176 517 194",120664:"92 664Q98 683 118 690Q121 691 312 691T508 689Q534 682 534 644V632V618Q534 582 508 573L502 572Q496 572 489 572Q486 572 463 572T416 573Q333 573 291 575H253V303Q253 31 251 25Q242 0 199 0H170L119 1Q99 7 92 28V664",120665:"381 692Q386 694 458 694Q516 694 527 693T549 687Q564 680 575 663Q576 658 715 349T856 27Q856 6 838 1H826Q815 1 795 1T747 1T686 1T616 0T539 0T458 0T378 0T300 0T230 0T169 1T122 1T90 1H78Q60 6 60 27Q62 38 201 349T341 663Q356 687 381 692ZM627 148Q626 149 581 250T492 453L447 554Q447 553 446 552Q444 546 326 278L268 148Q268 147 448 147Q627 147 627 148",120666:"277 122Q280 122 380 123T544 125Q552 125 557 125T565 124T569 124Q595 115 595 75V62V47Q595 9 569 2Q564 0 341 0L119 1Q99 7 92 28V664Q98 683 118 690Q121 691 335 691T554 689Q580 682 580 644V632V618Q580 582 554 573Q553 573 551 573T542 572T527 572Q464 572 364 573T260 575H253V412H385H459Q524 412 536 404T549 357Q549 341 549 334T542 318T523 305Q518 303 385 303H253V122H277",120667:"411 584Q243 581 131 581Q122 581 116 581T106 582T102 582Q84 589 80 600T76 640L77 667Q83 686 103 693Q106 694 343 694Q579 694 584 692Q592 691 599 684T609 668Q610 665 610 646Q610 614 608 608Q605 603 434 361L261 116Q340 117 402 118T490 119T533 120T560 120H572Q605 120 614 95Q616 89 616 60V46Q616 9 590 2Q585 0 339 0Q92 0 87 2Q79 3 72 10T62 26Q61 29 61 49Q61 84 63 90Q65 94 152 217T325 461T411 584",120668:"92 667Q101 694 143 694H172H198Q244 694 251 669Q253 663 253 539V415H540V539Q540 558 540 585T539 621Q539 673 550 683T611 694H621H646Q671 694 683 690T700 669Q702 663 702 347T700 25Q696 9 684 5T646 0H621H606Q560 0 550 11T539 76Q539 85 539 116T540 169V306H253V169Q253 147 253 116T254 75Q254 23 245 12T194 0H170L119 1Q99 7 92 28V667",120669:"62 340Q62 716 425 716Q511 716 576 696T681 642T747 559T783 458T793 341Q793 264 777 203T721 89T608 7T428 -22Q62 -22 62 340ZM638 333Q638 365 637 387T632 441T621 495T600 542T567 583T518 611T451 628Q443 629 427 629Q402 629 378 624T327 608T276 571T240 511Q217 453 217 345Q217 254 231 204T279 120Q333 69 428 69Q522 69 576 120Q638 183 638 333ZM279 349V373Q279 413 305 420Q309 422 427 422H487Q550 422 563 414T576 369V349Q576 345 576 337T577 324Q577 284 550 277Q545 275 428 275H369Q306 275 293 283T279 329V349",120670:"85 667Q94 694 136 694H165H191Q237 694 244 669Q246 663 246 347T244 25Q235 0 192 0H163L112 1Q92 7 85 28V667",120671:"92 667Q101 694 139 694H163H186Q225 694 234 671Q236 663 236 529L237 392L533 682Q550 694 590 694H623H681Q695 680 695 672Q695 670 693 664Q688 657 561 533L431 405L698 33Q701 28 701 23Q701 7 683 0H626H604Q571 0 564 2T545 13Q544 14 530 33T489 90T437 162L332 307Q331 307 284 260L236 214V122V65Q236 32 231 19T210 2Q205 0 161 0L119 1Q99 7 92 28V667",120672:"106 0H83Q41 0 41 28Q41 39 133 349T229 667Q242 694 296 694H335H375Q403 694 418 689T442 667Q445 660 537 350T630 28Q630 11 619 6T584 0H555H526Q478 0 465 27Q462 32 431 136T366 372T325 555V546Q320 503 287 376T222 141T186 27Q184 22 177 15T165 6Q154 0 106 0",120673:"92 667Q98 684 109 689T146 695Q152 695 167 695T192 694Q200 694 214 694T234 695Q291 695 305 664Q313 651 400 419T487 165Q487 162 488 162T489 165Q489 187 574 413T671 664Q679 680 695 688Q708 694 785 694H828Q855 694 867 689T884 669Q886 663 886 347T884 25Q876 0 832 0H817H802Q758 0 750 25Q748 31 748 293V555L746 544Q737 509 692 386T606 160T564 52Q548 22 502 22H487H472Q423 22 410 52Q407 59 367 160T283 385T231 546L230 548Q229 548 229 293Q229 31 227 25Q222 9 211 5T176 0H158L119 1Q99 7 92 28V667",120674:"92 667Q98 684 109 689T146 694H185Q273 694 279 692Q301 689 315 669Q322 660 419 453L554 163L562 143Q564 143 564 401Q564 663 566 669Q574 694 618 694H633H648Q692 694 700 669Q702 663 702 347T700 25Q696 10 683 5T642 0H596H551Q520 0 505 4T478 25Q471 34 374 241L239 532Q231 550 231 552L229 479Q229 440 229 293Q229 31 227 25Q222 9 211 5T176 0H158L119 1Q99 7 92 28V667",120675:"627 553Q609 553 512 554T366 555Q316 555 220 554T105 553Q96 553 90 553T82 554T78 554Q61 560 57 571T52 605V623L53 661Q59 680 79 687Q82 688 366 688Q649 688 654 686Q680 679 680 639V621V603Q680 563 654 554Q653 554 651 554T642 554T627 553ZM149 423Q152 424 366 424Q579 424 584 422Q610 415 610 376V358V340Q610 300 584 293Q579 291 366 291H232Q162 291 150 293T129 306Q122 315 122 360L123 397Q129 416 149 423ZM108 135Q143 135 226 134T363 133Q407 133 507 134T632 135H645Q675 135 684 110Q686 104 686 68V49Q686 9 660 2Q655 0 364 0L74 1Q57 7 49 21L47 28L46 65V83Q46 126 72 133Q80 135 108 135",120676:"362 715Q364 715 376 715T394 716H400Q542 716 626 643T727 426Q731 395 731 342Q731 271 722 225Q674 -22 396 -22Q320 -22 259 -3T148 68T77 201Q62 257 62 342Q62 447 86 522T173 649Q245 707 362 715ZM568 433Q551 623 396 623Q383 623 370 622T333 612T292 591T257 550T233 485Q223 442 223 350Q223 276 232 227T267 137Q309 74 397 74Q433 74 461 85T507 113T537 156T556 205T566 260T569 310T570 357Q570 409 568 433",120677:"92 664Q98 683 118 690Q121 691 396 691T676 689Q695 684 700 666Q702 660 702 345Q702 31 700 25Q696 9 684 5T646 0H621H596Q571 0 559 4T542 25Q540 31 540 307V582H253V307Q253 31 251 25Q242 0 199 0H170L119 1Q99 7 92 28V664",120678:"641 470Q641 426 630 391T603 334T561 295T513 271T459 259T408 254T361 253H350H337H253V142Q253 125 253 100T254 67Q254 32 249 19T227 2Q222 0 170 0L119 1Q99 7 92 28V667Q98 686 118 693Q121 694 271 694Q428 693 462 688Q641 656 641 470ZM487 467Q487 495 485 510T474 546T442 578T382 592Q375 593 310 593H250V347H309H339Q364 347 380 348T418 354T451 368T474 395T486 438Q487 444 487 467",120680:"322 124Q326 124 457 125T672 127H689Q721 127 730 102Q732 96 732 64V48Q732 9 706 2Q701 0 394 0L89 1Q76 5 69 13T62 29V36Q62 37 62 38Q62 47 70 58T126 126Q161 167 185 196Q302 335 302 336L187 463Q74 584 68 594Q61 603 61 639L62 667Q68 686 88 693Q91 694 396 694T706 692Q732 686 732 647V635V621Q732 585 706 576Q705 576 702 576T691 576T670 575L302 578Q302 577 394 475T490 371Q498 362 498 347Q498 336 488 323T408 226L322 124",120681:"67 687Q70 688 366 688Q661 688 666 686Q692 680 692 641V629V615Q692 579 666 570H660Q655 569 648 569Q645 569 624 569T581 570Q505 570 475 572H447V302Q447 31 445 25Q436 0 393 0H364L313 1Q293 7 286 28L285 300V572H257Q227 570 151 570Q130 570 109 570T84 569Q77 569 72 570H66Q48 577 44 588T40 631L41 661Q47 680 67 687",120682:"62 560Q62 607 94 644T169 698T253 715Q273 715 286 713T322 704T363 677T398 625Q413 597 423 556L428 540Q429 541 436 566T454 620T494 677T561 713Q570 715 593 715Q682 715 737 668T793 560Q793 549 793 545T786 533T767 520H670Q646 532 644 551T632 579Q618 594 591 594Q539 594 524 530T509 321V216Q509 31 507 25Q498 0 455 0H426L375 1Q355 7 348 28L347 232Q346 344 346 441Q346 442 343 468T335 521T312 571T266 594Q252 594 247 593Q228 586 220 576T212 557T209 539T191 523L185 520H88Q75 527 69 534T63 545T62 560",120683:"62 292T62 347T80 445T124 511T183 552T243 574T292 584L315 587H319V627L320 667Q329 694 370 694H397H422Q466 694 473 669Q475 663 475 625V587H478Q479 587 500 584T548 575T608 553T668 513T713 446T732 347Q732 253 674 187Q655 167 628 152T576 128T530 116T493 109L478 107H475V69V50Q475 9 449 2Q444 0 395 0L347 1Q327 7 320 28L319 67V107H315L292 110Q269 114 243 119T184 142T124 182T80 249ZM319 197T319 347T318 497Q316 497 307 494T284 485T262 471Q220 438 220 347Q220 285 239 249Q248 234 261 223T286 208T308 200L317 197Q319 197 319 347ZM572 347V357Q572 387 569 407T548 452T496 491Q495 491 494 491T487 493T475 497V197Q518 210 541 232T571 303Q572 312 572 347",120684:"52 1Q37 11 37 23Q37 26 39 32Q39 34 158 202L275 369Q275 370 221 441T112 586T55 663Q53 669 53 672Q53 687 68 693H72Q77 693 84 693T99 694T118 694T139 694H176Q203 694 212 692T230 682Q231 681 239 669T265 634T296 591L358 504L418 591Q481 682 486 686Q491 691 499 692Q505 694 569 694H632Q650 685 650 672Q650 667 646 660Q643 654 592 582T491 440T441 369T566 201T693 29Q694 27 694 23Q694 11 677 0H607L537 1Q523 6 519 10T437 131Q422 153 411 170T390 200T375 222T365 237T359 245L357 247L348 232Q339 218 319 188T283 131Q222 37 211 22T186 1H52",120685:"61 585Q62 594 62 597T64 606T73 616T89 626H138Q196 626 208 620Q243 602 253 546T261 431T271 309T325 219Q342 205 349 205Q350 205 350 436L351 667Q360 694 401 694H428H454Q495 694 504 671Q506 663 506 436L507 205Q542 222 561 251T586 318T593 392T595 472T602 546Q614 614 661 625Q665 626 708 626H730Q766 626 780 618T794 582Q794 548 768 540Q755 538 754 501T750 410T736 298T680 191T560 120Q550 116 512 109H506V70V50Q506 9 480 2Q475 0 426 0L378 1Q358 7 351 28L350 68V109L335 111Q298 117 267 129T214 156T175 191T146 229T127 272T115 314T109 357T106 395T105 429Q104 537 87 540Q66 548 63 565Q61 570 61 585",120686:"241 122Q225 154 191 199T131 278T83 363T61 464Q61 497 68 527T94 591T145 650T228 693T349 715Q354 715 370 715T396 716Q539 716 622 668Q658 647 682 617T715 556T728 505T732 465Q732 415 711 365T663 280T602 200T552 122H632Q649 122 669 122T693 123H697Q736 123 742 98Q744 92 744 62V47Q744 9 718 2Q713 0 591 0L471 1Q454 7 446 21Q444 27 444 45Q444 96 463 154T506 257T549 360T569 469Q569 504 563 530T538 580T485 616T396 629Q313 629 268 594T223 468Q223 419 243 361T286 258T330 152T350 41Q350 14 335 7T276 -1Q267 -1 241 -1T197 0L77 1Q57 7 50 28L49 59V74Q49 114 75 121Q81 123 100 123Q104 123 124 123T161 122H241",120782:"266 654H280H282Q500 654 524 418Q529 370 529 320Q529 125 456 52Q397 -10 287 -10Q110 -10 63 154Q45 212 45 316Q45 504 113 585Q140 618 185 636T266 654ZM374 548Q347 604 286 604Q247 604 218 575Q197 552 193 511T188 311Q188 159 196 116Q202 87 225 64T287 41Q339 41 367 87Q379 107 382 152T386 329Q386 518 374 548",120783:"481 0L294 3Q136 3 109 0H96V62H227V304Q227 546 225 546Q169 529 97 529H80V591H97Q231 591 308 647L319 655H333Q355 655 359 644Q361 640 361 351V62H494V0H481",120784:"175 580Q175 578 185 572T205 551T215 510Q215 467 191 449T137 430Q107 430 83 448T58 511Q58 558 91 592T168 640T259 654Q328 654 383 637Q451 610 484 563T517 459Q517 401 482 360T368 262Q340 243 265 184L210 140H274Q416 140 429 145Q439 148 447 186T455 237H517V233Q516 230 501 119Q489 9 486 4V0H57V25Q57 51 58 54Q60 57 109 106T215 214T288 291Q364 377 364 458Q364 515 328 553T231 592Q214 592 201 589T181 584T175 580",120785:"80 503Q80 565 133 610T274 655Q366 655 421 623T491 538Q493 528 493 510Q493 446 453 407T361 348L376 344Q452 324 489 281T526 184Q526 152 514 121T474 58T392 8T265 -11Q175 -11 111 34T48 152Q50 187 72 209T132 232Q171 232 193 208T216 147Q216 136 214 126T207 108T197 94T187 84T178 77T170 72L168 71Q168 70 179 65T215 54T266 48H270Q331 48 350 105Q358 128 358 185Q358 239 348 268T309 313Q292 321 242 322Q205 322 198 324T191 341V348Q191 366 196 369T232 375Q239 375 247 376T260 377T268 378Q284 383 297 393T326 436T341 517Q341 536 339 547T331 573T308 593T266 600Q248 600 241 599Q214 593 183 576Q234 556 234 503Q234 462 210 444T157 426Q126 426 103 446T80 503",120786:"531 0Q510 3 381 3Q238 3 214 0H201V62H313V155H32V217L205 434Q342 606 362 630T387 655L391 656Q395 656 401 656T414 656H427Q447 656 451 645Q453 641 453 429V217H542V155H453V62H542V0H531ZM324 217V494L103 218L213 217H324",120787:"100 565V605Q100 637 102 646T113 655Q116 655 139 647T202 631T286 623Q332 623 372 631T434 647T459 655Q466 655 469 651T472 643T472 629Q472 613 463 601Q370 487 219 487Q195 487 183 488T169 490T168 433V376Q169 376 174 379T188 387T211 397T244 405T288 409Q390 409 453 352T517 201Q517 106 445 48T253 -11Q169 -11 113 37T57 154Q57 187 79 208T131 229T183 209T206 154Q206 99 155 83Q152 82 157 78Q196 47 253 47Q347 47 358 135Q358 137 358 138Q360 158 360 209Q360 277 355 301T337 338Q315 358 282 358Q202 358 160 303Q153 294 149 292T130 290Q107 290 102 301Q100 304 100 474V565",120788:"48 318Q48 395 68 456T120 553T193 613T273 646T350 655Q425 655 461 616T497 524Q497 485 475 468T428 451Q399 451 378 470T357 521Q357 565 403 588Q375 601 351 601Q313 601 282 584Q242 565 222 526Q199 473 199 367Q201 369 210 380T227 396T246 410T275 422T312 426Q438 426 494 332Q526 285 526 208V199Q526 112 465 53Q428 17 388 3T285 -11Q236 -11 195 7T135 43T104 80Q48 165 48 318ZM375 231V244V268Q375 295 373 310T364 342T341 366T299 374H297Q231 374 208 287Q200 257 200 196Q201 120 209 100Q231 47 288 47Q351 47 368 90Q375 112 375 231",120789:"256 -11Q231 -11 208 5T185 65Q185 105 193 146T212 220T241 289T275 349T312 402T346 445T377 479T397 502L400 504H301Q156 503 150 497Q142 491 134 456T126 407H64V411Q65 414 82 544T99 675T130 676H161V673Q161 669 162 666T167 661T173 657T181 654T190 652T200 651T210 650T220 649T229 648Q237 648 254 647T276 646Q277 646 426 644H558V620V607Q558 596 551 586T509 537Q489 515 476 500Q390 401 384 393Q349 339 337 259T324 113T322 38Q307 -11 256 -11",120790:"80 474Q80 561 139 607T278 654Q357 654 411 632Q490 593 494 509Q494 424 416 376L407 371L418 364Q432 356 447 345T481 312T513 260T526 192Q526 100 461 45T285 -11Q184 -11 116 32T48 164Q48 181 50 196T58 225T69 249T84 270T100 286T117 300T134 311T149 321T162 329L152 336Q120 360 100 397T80 474ZM347 404Q404 446 404 503Q404 579 317 599Q309 600 276 600Q178 600 170 538Q170 532 171 527T173 518T178 509T184 501T194 492T205 484T219 476T235 467T254 456T275 445L347 404ZM289 47Q323 47 351 54T402 82T425 137Q425 147 421 161Q411 183 391 197T303 249Q224 293 223 293Q220 291 215 288T197 273T175 248T157 213T149 167Q149 109 188 78T289 47",120791:"178 59Q206 48 238 48Q311 48 345 102Q370 138 375 259V278Q374 278 369 271T350 252T322 232Q297 220 258 220Q172 220 110 275T48 438V446Q54 561 146 618Q199 654 278 654Q321 654 329 653Q526 621 526 330Q526 252 507 190T457 92T388 31T312 -2T240 -11Q165 -11 121 25T77 120Q77 159 99 176T147 193T194 177T217 122Q217 113 216 106T211 92T205 82T198 73T191 67T184 62T178 59ZM374 446V465Q374 523 364 552T315 598Q309 600 293 601Q227 601 210 562Q199 539 199 433Q199 343 204 319T235 279Q250 272 274 271H282Q293 271 303 274T327 288T353 323T371 385Q374 403 374 446",120802:"117 621Q174 678 247 678Q305 678 351 647Q396 617 424 557Q460 472 460 328Q460 271 455 224Q448 154 427 104T376 27T314 -10T249 -22Q201 -22 160 1T91 67Q39 154 39 316Q39 541 117 621ZM250 55Q274 55 293 66T324 93T344 136T357 185T364 240T366 291T367 340Q367 373 367 393T363 449T352 507T332 553T299 589T250 601Q217 601 194 584T159 542T141 479T133 411T132 340V331Q132 299 133 277T137 219T147 157T167 107T201 68T250 55",120803:"94 612Q172 616 211 632T284 678H307V73H430V0H88V73H213V317Q213 560 212 560Q210 558 197 554T155 546T96 540L83 539V612H94",120804:"222 599Q190 599 166 585T128 550T108 509T97 474T93 459L67 492L42 526L47 539Q72 608 120 642T225 677Q304 677 355 644Q449 579 449 454Q449 373 361 290Q351 280 315 250T199 144Q156 103 137 85L293 86H449V0H50V79L216 242Q284 302 317 349T351 456Q351 517 315 558T222 599",120805:"333 521Q333 554 313 579T243 604Q154 604 99 514L78 546Q56 577 56 579Q56 580 62 589T82 611T114 637T162 662T222 677Q224 677 231 677T242 678H245Q318 678 374 634T430 520Q430 483 417 452T382 398T351 369T329 354L328 353Q369 333 373 330Q408 306 432 268T457 184Q457 103 397 41T242 -22Q131 -22 51 58L42 68L49 105L55 142L58 138Q62 134 66 130T77 120T91 108T108 96T129 83T152 72T179 63T209 57T242 54Q285 54 319 86T353 184Q353 231 331 267T260 315L213 316H166V354Q166 392 167 392Q233 395 257 405Q290 418 311 450T333 521",120806:"271 654L272 656H380V235H471V159H380V0H286V159H28V235L149 443Q269 652 271 654ZM292 235V607Q292 604 290 591T286 571T280 548T269 517T252 476T226 422T189 354T140 267Q136 260 132 253T126 240L123 236Q123 235 207 235H292",120807:"257 350Q236 350 218 342T189 323T171 301T160 281L157 273Q157 272 116 272H75V656H416V577H162V486Q162 396 163 396T174 403T207 418T258 426Q339 426 394 360T449 203Q449 113 386 46T226 -21H223Q188 -21 156 -11T102 13T64 42T41 66T33 77Q34 78 44 95T64 128L73 144Q93 112 117 93Q165 54 223 54Q270 54 306 86T345 197Q345 350 257 350",120808:"42 318Q42 396 61 460T109 564T173 629T237 666T289 677H301H317Q359 677 408 658V621Q408 585 407 585H406Q359 605 308 605Q246 605 203 556T146 421Q143 403 144 403Q145 402 152 409Q216 469 299 469Q333 469 357 457T407 405Q457 330 457 226Q457 126 402 57Q340 -22 251 -22Q216 -22 183 -7T116 43T63 149T42 318ZM260 393Q216 393 188 365T150 306T141 243Q141 153 172 104Q192 68 230 56Q238 54 251 54Q311 54 342 116Q360 152 360 226Q360 297 344 332Q320 382 277 392Q275 392 270 392T260 393",120809:"42 570V656H457V577L447 564Q345 439 295 289T244 0V-11H145V12Q160 330 356 550Q360 556 365 561T374 571L208 570H42",120810:"55 500Q55 568 109 623T250 678Q327 678 385 627T444 501Q444 445 410 410T336 357L329 353H330Q378 335 417 293T456 184Q456 93 393 36T249 -22T106 35T43 184Q43 251 82 293T169 353Q171 354 166 356Q165 356 163 357Q113 378 84 416T55 500ZM358 496Q358 557 325 581T250 605Q206 605 174 580T141 496Q141 446 171 420T250 393Q298 393 328 419T358 496ZM245 316Q205 316 172 285T139 185V179Q139 79 222 57Q231 55 250 55H254Q295 55 327 84Q360 120 360 188Q360 254 326 285Q295 316 245 316",120811:"44 476Q57 561 116 619T245 677H255Q308 677 349 647Q392 619 424 545T457 334Q457 178 382 78T205 -22Q168 -22 135 -10T86 14L72 25Q73 25 91 58L110 91Q127 78 136 72T163 60T203 54Q238 54 265 71T308 110T335 164T350 214T357 253V257L347 248Q284 187 200 187Q165 187 140 201T87 258Q42 332 42 430Q42 458 44 476ZM269 604Q265 605 254 605Q222 605 199 591T164 554T148 517T141 487Q140 478 140 430T141 373Q146 335 164 307T207 269Q223 263 247 263Q299 266 328 308T358 417Q358 435 356 456T346 511T318 570T269 604",120812:"274 -22Q227 -22 190 -9T128 24T87 76T62 135T49 204T44 271T43 336V343V362Q43 407 45 440T56 524T86 613T141 677Q197 715 264 715Q314 715 353 702T418 669T460 616T487 555T500 483T505 413T506 343Q506 310 506 293T503 241T498 185T486 133T467 83T437 42T397 8T343 -13T274 -22ZM355 355V401Q355 448 354 476T349 537T336 587T311 617T272 629Q270 629 266 629T261 628Q219 618 207 568T194 419V355Q194 203 200 156T231 85Q250 66 275 66Q299 66 318 85Q342 109 348 156T355 355",120813:"118 560H116Q107 560 100 561T85 572T76 600Q76 612 77 618T83 632T99 644Q102 645 135 646T207 660T275 700Q292 716 310 716Q353 716 360 691Q362 685 362 386V87H446Q464 76 468 69T473 44Q473 12 446 1H118Q105 7 100 13T94 25T93 44V62Q100 79 119 87H210V329Q210 571 208 571Q182 560 118 560",120814:"339 477Q339 505 332 531T301 579T242 601Q165 601 136 503Q133 493 130 490T121 486Q116 486 94 514Q86 523 82 528Q46 572 46 577Q46 591 77 632T147 691Q192 716 257 716Q305 716 351 700Q416 674 455 615T494 481Q494 421 463 376T356 266Q326 240 287 205T224 146T199 122H331Q359 122 392 122T431 123H445Q485 123 492 98Q494 92 494 62V47Q494 9 468 2Q463 0 272 0L83 1Q63 7 56 28L55 57V89Q59 97 215 261Q255 303 275 327T317 394T339 477",120815:"61 624Q62 630 83 650T153 693T262 716Q328 716 373 698T438 650T465 593T473 536Q473 438 375 376L387 371Q450 350 476 305T503 208Q503 164 492 126T456 53T380 -2T261 -22Q224 -22 189 -15T130 2T86 24T57 43T46 53Q46 56 53 99T62 145Q65 152 71 152Q76 152 90 143T123 121T175 99T248 87Q302 87 321 113T341 202Q341 264 329 292T279 329L232 331L190 332L184 338V411Q190 417 192 417Q193 418 205 419T232 421T252 424Q280 430 299 461T318 539V551Q318 599 283 609Q276 611 257 611Q225 611 199 601T159 577T136 554T120 543T102 560T76 597T62 618T61 624",120816:"278 693H282Q285 693 291 693T305 694T322 694T342 694H377Q402 694 411 691T430 677Q434 670 434 646T435 456V249H461H472Q509 249 516 224Q518 219 518 194Q518 178 518 171T511 155T492 142Q488 140 461 140H435V86V53Q435 9 409 2Q405 0 366 0H351Q306 0 298 25Q296 31 296 86V140H179H123Q99 140 80 129T50 106T37 95Q31 95 31 163V208Q31 246 33 251Q251 673 262 684Q268 691 278 693ZM302 249V416L301 576Q301 536 165 276L151 250L226 249H302",120817:"109 282Q87 290 83 310V666Q83 667 84 670T87 676T91 682T98 688T108 693Q112 694 269 694T431 692Q457 686 457 648V637V624Q457 588 431 581Q426 579 326 579H227V510Q227 442 229 442Q243 450 288 450Q377 450 435 399T494 222Q494 -22 241 -22Q202 -22 167 -11T109 16T69 49T45 79T37 94T69 151Q91 185 97 185Q105 185 112 170Q127 135 160 111T240 87Q266 87 284 94T311 111T325 142T331 179T332 226Q332 307 324 335T281 363Q228 363 197 306Q189 289 172 282H109",120818:"414 589Q410 589 389 600T334 612Q275 612 243 575Q209 538 202 433V422L209 431Q243 487 317 487Q392 487 440 442Q478 402 490 357T503 236Q503 113 454 54Q421 13 381 -4T279 -22Q263 -22 250 -21T214 -15T173 1T133 30T96 77T68 146T50 242Q46 278 46 336Q46 406 52 447Q84 698 312 715L315 716Q318 716 321 716Q323 716 328 716T337 715Q398 715 425 688V596Q419 591 414 589ZM282 87Q324 89 336 117T348 231Q348 310 343 343T324 388T277 399Q249 399 231 373T208 317T202 253Q202 201 207 168T224 117T249 93T282 87",120819:"135 38Q135 190 198 335T353 572H215Q185 572 151 572T110 571H96Q55 571 48 596Q46 602 46 633V648Q46 686 72 693Q76 695 124 695Q134 695 183 695T274 694Q472 694 477 692Q503 686 503 648V637Q503 612 502 605T491 588Q300 349 292 46V36Q292 -4 266 -9Q262 -11 214 -11H192Q160 -11 148 -3T135 38",120820:"61 518Q61 574 79 614T128 676T192 706T263 715H270Q298 715 318 714T373 701T430 671T470 612T488 517Q488 459 458 423T390 376Q388 375 393 373Q395 372 398 371Q503 330 503 204Q503 -22 275 -22Q209 -22 163 -3T92 49T57 120T46 204Q46 230 50 252T61 289T77 318T96 339T116 353T134 363T148 369T158 373T160 376Q118 389 90 424T61 518ZM344 538Q344 563 340 578T326 600T307 609T279 612Q232 612 218 594T204 518Q204 459 216 439T275 418Q328 418 338 450Q344 464 344 515V538ZM248 88T274 88T315 94T338 117T346 149T349 197Q349 269 342 290Q338 309 320 320T274 331Q246 331 229 320T207 290Q200 269 200 197Q201 163 202 149T210 118T232 94",120821:"347 272Q346 272 342 266T330 250T309 230T276 214T230 207Q185 207 150 223Q116 240 90 276T54 357Q46 393 46 468Q46 469 46 484T47 502T48 520T51 540T55 559T61 579T69 599T81 620T96 640T115 661Q174 716 276 716Q299 716 317 714T369 698T426 658T471 580T499 456Q503 402 503 342Q503 115 392 29Q322 -22 231 -22Q163 -22 115 7L82 31Q76 38 81 46Q116 112 127 123Q130 126 134 126T148 116T179 97T226 87Q287 87 318 132Q323 139 326 146T332 165T337 182T340 204T342 225T345 249T347 272ZM201 547T201 454T211 329T262 294Q276 294 285 296T310 312T335 355Q347 391 347 447Q347 520 340 550T317 595Q300 612 277 612Q226 612 214 580",120822:"42 305Q42 450 111 535T257 621Q335 621 390 562Q482 468 482 306Q482 174 418 82T262 -10T106 82T42 305ZM257 545Q209 545 168 481T126 320Q126 220 162 147Q204 65 262 65Q318 65 358 139T398 320V328Q395 411 364 470T284 543Q270 545 257 545",120823:"99 461Q99 470 99 474T104 487T120 498T151 502Q213 517 251 596Q264 622 283 622Q308 622 319 597V76H373H401Q428 76 439 69T450 38Q450 11 428 1H127Q104 10 104 38Q104 62 115 69T153 76H181H235V269Q235 461 234 461Q184 426 137 424H133Q124 424 119 425T109 431T99 447V461",120824:"52 462Q52 528 110 575T247 622H250Q343 622 407 565T472 421Q472 371 446 324T390 248T308 178Q307 177 275 151T214 101L185 77Q185 76 286 76H388V87Q388 105 397 114T430 123T463 114Q470 107 471 100T472 61V42Q472 24 468 16T450 1H75Q53 10 53 32V38V48Q53 57 63 67T127 122Q153 144 169 157L289 256Q388 345 388 419Q388 473 346 509T231 545H224Q176 545 146 499L144 494Q155 476 155 459Q154 459 155 455T154 444T148 430T136 417T114 408Q113 408 110 408T104 407Q80 407 66 422T52 462",120825:"260 546Q233 546 211 541T180 531T171 524L174 514Q177 505 177 497Q177 476 162 461T125 446Q106 446 90 459T73 504Q76 540 98 565T150 601T203 616T239 621Q241 622 265 622Q322 620 362 602T420 558T444 513T451 478Q451 386 369 329L375 326Q381 323 386 320T401 311T419 298T436 283T452 263T466 240T475 212T479 180Q479 99 416 44T259 -11T105 28T44 130Q44 154 59 168T95 183Q117 183 132 169T148 131Q148 119 139 101Q175 65 260 65Q316 65 355 97T395 179Q395 211 375 240Q336 292 253 292H234H215Q194 292 185 299T175 330Q175 350 184 359Q192 368 238 370T309 384Q336 398 351 423T367 474Q367 496 350 513Q321 546 260 546",120826:"235 1Q213 10 213 32V38V46Q213 65 230 73Q236 76 274 76H314V168H183L52 169Q37 175 33 182T29 205V218L30 244Q53 283 155 443T264 613Q276 623 298 623H323H363Q378 616 385 601V244H429H450Q474 244 484 237T495 206Q495 179 477 171Q471 168 429 168H385V76H425H442Q466 76 476 69T487 38Q487 10 465 1H235ZM314 244V554L117 245L215 244H314",120827:"387 189Q387 244 354 278T273 313Q230 313 205 301T163 271T138 249H120Q102 249 97 251Q85 258 83 266T80 311Q80 320 80 359T81 430Q81 587 82 591Q88 605 103 610H108Q112 610 120 610T138 610T163 610T192 611T225 611T260 611H415Q416 610 421 607T428 602T432 596T436 587T437 573Q437 567 437 562T434 554T431 548T427 543T423 540T418 538L415 536L289 535H164V363L170 366Q175 368 184 372T207 380T238 386T276 389Q357 389 414 331T472 187Q472 116 412 53T245 -10Q218 -10 209 -9Q126 5 89 48T52 137Q52 164 68 177T104 191Q130 191 143 175T156 141Q156 132 154 125T149 113T146 107Q146 104 155 95T188 76T245 65Q298 65 342 98T387 189",120828:"357 536Q357 546 318 546Q258 546 205 497T133 357V353L144 361Q210 402 285 402Q362 402 414 350Q479 285 479 193Q479 111 418 50T263 -11Q234 -11 207 -3T149 26T97 81T60 171T45 301Q45 444 129 533T319 622Q388 622 421 589T454 510Q454 491 442 475T402 458Q373 458 362 475T350 510Q350 520 354 528L357 536ZM319 326T269 326T179 298T136 223Q136 202 143 174T176 112T237 68Q246 66 265 66Q319 66 360 107Q395 146 395 197Q395 250 356 289Q319 326 269 326",120829:"204 -10Q162 -10 162 40Q162 146 198 261T310 477Q311 478 321 491T342 517T358 535H128V524Q128 506 119 497Q111 489 86 489H78Q55 489 46 508Q44 513 44 557V580Q44 605 52 616T88 627H93Q114 627 125 611H458Q474 598 477 593T480 573Q480 559 478 553T469 543T446 521T408 477Q252 290 246 49Q246 43 246 37T246 27T245 22Q243 11 233 1T204 -10",120830:"58 460Q58 523 117 572T254 621Q290 621 298 620Q376 607 421 560T466 460Q466 441 460 424T443 393T421 370T397 352T374 340T357 332L350 330L356 328Q363 325 371 321T392 310T415 295T439 274T459 249T473 217T479 179Q479 102 418 46T262 -10T106 46T45 179Q45 202 52 222T70 257T96 284T123 305T148 319T167 328L174 330L170 332Q166 333 159 336T145 343Q104 362 81 393T58 460ZM382 458Q382 491 349 518T263 546Q215 546 179 521T142 458Q142 421 178 395T262 368Q315 368 348 396T382 458ZM396 178Q396 223 358 257T263 292Q206 292 167 258T128 178Q128 137 163 102T262 66Q324 66 360 101T396 178",120831:"392 259Q333 210 236 210H233Q163 210 109 262Q46 325 46 411T99 550Q164 622 264 622Q293 622 319 615T376 587T428 532T464 440T479 304Q479 167 400 78T217 -11Q140 -11 105 22T70 101Q70 124 84 138T122 153Q150 153 162 137T174 101Q174 91 168 76Q179 65 216 65Q267 65 300 93Q322 109 339 130T366 173T380 210T388 242T392 259ZM388 389Q388 438 357 492T268 546T185 520Q129 479 129 415Q129 384 138 363Q145 349 156 334T195 302T255 285Q305 285 345 313T388 389"},{8243:"\u2032\u2032",8244:"\u2032\u2032\u2032",8246:"\u2035\u2035",8247:"\u2035\u2035\u2035",8279:"\u2032\u2032\u2032\u2032",8708:"\u2203\u0338",8716:"\u220b\u0338",8772:"\u2243\u0338",8777:"\u2248\u0338",8802:"\u2261\u0338",8813:"\u224d\u0338",8820:"\u2272\u0338",8821:"\u2273\u0338",8824:"\u2276\u0338",8825:"\u2277\u0338",8836:"\u2282\u0338",8837:"\u2283\u0338",8930:"\u2291\u0338",8931:"\u2292\u0338",10764:"\u222c\u222c"})},466:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifBoldItalic=void 0;var n=r(768),o=r(4886);e.sansSerifBoldItalic=(0,n.AddPaths)(o.sansSerifBoldItalic,{305:"54 431Q63 458 102 458H127H149Q192 458 199 433Q201 427 201 229T199 25Q190 0 149 0H125L81 1Q61 7 54 28V431",567:"-38 -84Q-36 -84 -14 -95T33 -106H38Q70 -103 78 -86Q83 -78 83 -49T84 180Q84 427 86 433Q93 458 136 458H158H180Q201 458 209 456T225 443Q230 436 231 418Q232 397 232 313V183V124V40Q232 -55 228 -87T203 -147Q166 -205 78 -205Q31 -205 -20 -189T-71 -159Q-71 -156 -59 -123Q-50 -96 -47 -91T-38 -84"},{})},9671:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifBold=void 0;var n=r(768),o=r(4471);e.sansSerifBold=(0,n.AddPaths)(o.sansSerifBold,{33:"111 669Q111 680 111 682T113 689T121 693T137 694H184H249Q255 686 256 681Q244 220 239 213Q236 208 229 208T183 207T137 207T127 213T118 431T111 669ZM110 71V95Q110 137 136 144Q140 146 183 146H200Q246 146 254 121Q256 115 256 73V51Q256 9 230 2Q225 0 181 0L138 1Q121 7 113 21L111 28L110 71",34:"38 687Q42 693 45 693Q46 694 111 694H176Q179 690 183 687V556L144 501Q139 494 134 486T126 474T120 465T114 457T110 451T106 447T102 445T98 443T94 443T89 442H73H62Q37 442 37 453Q37 458 55 501T74 546Q74 548 59 548L44 549L38 555V687ZM275 687Q279 693 282 693Q283 694 348 694H413Q416 690 420 687V556L381 501Q376 494 371 486T363 474T357 465T351 457T347 451T343 447T339 445T335 443T331 443T326 442H310H299Q274 442 274 453Q274 458 292 501T311 546Q311 548 296 548L281 549L275 555V687",35:"61 365Q61 370 62 375T65 383T69 390T74 395T80 399T85 403T90 406L94 407H344L381 536Q418 668 426 680Q431 687 445 692Q451 694 457 694Q477 694 488 682T500 651Q500 645 466 528T431 409Q431 407 504 407H577L609 521Q651 668 656 675Q669 693 691 693Q710 693 721 680T733 651Q733 645 699 528T664 409Q664 407 743 407H823L827 405Q831 403 834 402T841 397T848 389T853 379T855 365Q855 337 823 324L731 323H639L619 253Q599 181 598 180V177H823L827 175Q831 173 834 172T841 167T848 159T853 149T855 135Q855 107 823 94L698 93H573L540 -21Q498 -168 493 -175Q480 -193 458 -193Q439 -193 428 -180T416 -151Q416 -144 450 -27T485 91Q485 93 412 93H340L307 -21Q265 -168 260 -175Q247 -193 225 -193Q206 -193 195 -180T183 -151Q183 -144 217 -27T252 91Q252 93 173 93L94 94Q61 105 61 135Q61 140 62 145T65 153T69 160T74 165T80 169T85 173T90 176L94 177H185L277 178L297 248L318 320V323H206L94 324Q61 335 61 365ZM551 320V323H479Q406 323 405 322Q404 319 385 249T365 178T438 177L510 178L530 248L551 320",36:"231 712L232 716Q232 719 232 722T234 729T239 736T246 743T256 748T271 750Q318 750 318 711V703Q393 692 451 656Q469 645 470 640Q470 635 461 587L453 537Q445 529 442 529Q438 529 424 540T384 565T330 585Q328 585 325 585T320 586L318 587V434Q322 433 333 429T350 424T365 418T382 409T399 397T419 380Q488 313 488 213Q488 24 334 -5L318 -8V-17Q318 -56 279 -56H272Q253 -56 243 -46T232 -30T231 -18V-8H224Q170 2 127 20T68 50T49 67Q49 71 58 122T68 176Q71 182 79 182Q83 182 98 169T145 138T216 110Q228 108 229 108H231V288Q167 299 114 356T61 496Q61 537 70 570T94 624T126 661T162 684T195 696T219 701L228 702H231V712ZM231 521Q231 583 230 583Q226 582 220 579T204 561T193 521Q193 491 212 472Q226 458 230 458Q231 458 231 521ZM318 112Q356 131 356 187Q356 237 318 263V112",37:"61 549Q61 733 218 749Q220 749 228 749T241 750Q286 750 321 735T369 708T389 683Q422 634 422 548V538Q422 519 420 501T408 453T381 401T328 364T243 347Q61 347 61 549ZM292 549Q292 663 242 663Q221 663 211 648T198 615T196 566V548Q196 471 206 454Q218 434 242 434Q292 434 292 549ZM243 -55Q223 -55 212 -42T201 -13Q201 -2 207 7Q209 11 480 371T758 738Q770 750 788 750Q805 750 817 738T830 709Q830 694 820 681L544 315Q273 -43 269 -47Q258 -55 243 -55ZM606 146Q606 330 763 346Q764 346 773 346T786 347Q831 347 866 332T914 305T934 280Q966 233 966 146V135Q966 115 964 97T952 49T925 -2T872 -40T788 -56Q606 -56 606 146ZM742 146V132Q742 107 743 93T748 62T762 39T787 31Q819 31 832 79Q837 97 837 146Q837 260 787 260Q767 260 757 246T744 214T742 169V146",38:"757 117Q762 117 769 110V3Q759 -7 718 -14T641 -22T571 -15T518 1T477 19T453 31L437 23Q350 -19 257 -22Q158 -22 103 30T47 155Q47 188 57 216T87 263T119 292T151 313L182 333L187 336L181 349Q150 431 150 506Q150 605 211 660T347 716Q417 716 471 668T526 543Q526 517 518 495T471 432T360 343L342 330Q342 327 358 306T402 250T458 189L467 181Q518 225 556 289T607 395L620 437Q622 443 630 443Q631 443 679 430Q718 420 725 418T733 409Q733 402 722 365T670 255T573 123Q562 111 563 111Q589 94 644 94Q678 94 703 100T740 111T757 117ZM397 544Q397 573 384 601T346 629Q320 629 299 607T277 538Q277 484 295 429Q301 413 301 412Q302 409 309 415Q397 476 397 544ZM227 258Q197 228 197 177Q197 150 207 126T234 95Q242 93 251 93Q288 93 337 107L349 110L328 131Q266 196 234 248L227 258",39:"81 687Q85 693 88 693Q89 694 154 694H219Q222 690 226 687V556L187 501Q182 494 177 486T169 474T163 465T157 457T153 451T149 447T145 445T141 443T137 443T132 442H116H105Q80 442 80 453Q80 458 98 501T117 546Q117 548 102 548L87 549L81 555V687",40:"79 250Q79 352 100 441T152 585T213 678T266 733L287 749Q288 750 324 750H359Q366 741 366 738Q366 734 356 721T329 682T296 623T262 531T238 407Q230 346 230 250Q230 142 244 55T278 -82T318 -165T352 -215T366 -238Q366 -242 359 -249H286L277 -242Q79 -74 79 250",41:"61 737Q61 750 85 750H106H141L150 742Q348 574 348 250T150 -242L141 -249L106 -250H87Q61 -250 61 -238Q61 -233 74 -216Q157 -113 183 51Q197 130 197 250T183 449Q174 505 158 554T126 634T95 687T71 722T61 737",42:"241 579Q241 582 228 639T215 702Q215 722 233 736T271 750Q296 750 315 736T334 702V697Q334 693 328 664T314 607L308 579L352 620Q389 654 397 660T417 668Q447 668 464 647T482 602Q482 591 479 583T472 569T459 559T443 552T421 546T397 538L342 521L397 504Q405 501 420 497T442 490T458 483T472 473T479 460T482 440Q482 416 465 395T417 374Q406 375 398 381T352 422L308 463L314 435Q321 407 327 378T334 345Q336 333 327 319T296 295Q288 293 275 293Q241 293 227 311T215 345Q215 349 221 378T234 435L241 463L197 422Q160 388 152 382T132 374Q102 374 85 395T67 440Q67 451 70 459T77 473T90 483T106 490T128 496T152 504L207 521L152 538Q144 541 129 545T107 552T91 559T77 569T70 582T67 602Q67 626 84 647T132 668Q143 667 151 661T197 620L241 579",43:"61 250Q61 276 94 292H386V436V535Q386 577 388 589T401 607Q411 617 427 617Q458 617 468 587Q470 581 470 436V292H762L766 290Q770 288 773 287T780 282T787 274T792 264T794 250Q794 222 762 209L616 208H470V64Q470 -81 468 -87Q458 -116 428 -116T388 -87Q386 -81 386 64V208H240L94 209Q61 220 61 250",44:"81 139Q85 145 88 145Q89 146 154 146H219Q222 142 226 139V8L187 -47Q182 -54 177 -62T169 -74T163 -83T157 -91T153 -97T149 -101T145 -103T141 -105T137 -105T132 -106H116H105Q80 -106 80 -95Q80 -90 98 -47T117 -2Q117 0 102 0L87 1L81 7V139",45:"12 230Q12 257 26 265T80 274Q88 274 114 274T158 273T201 273T235 274Q276 274 290 266T305 230T291 194T235 185Q226 185 201 185T159 186Q143 186 119 186T85 185Q43 185 28 193T12 230",46:"219 146Q222 142 226 139V7L222 4L219 1L154 0Q102 0 94 0T82 6Q80 9 80 74L81 139Q85 145 88 145Q89 146 154 146H219",47:"103 -249Q81 -249 71 -235T61 -207Q61 -201 62 -198Q64 -192 235 265T409 727Q418 750 445 750Q464 750 476 737T488 707Q488 701 313 234Q143 -225 137 -232Q126 -249 103 -249",58:"226 319L219 313H87L81 319L80 384Q80 437 80 445T86 456Q89 458 154 458H219Q222 454 226 451V319ZM219 146Q222 142 226 139V7L222 4L219 1L154 0Q102 0 94 0T82 6Q80 9 80 74L81 139Q85 145 88 145Q89 146 154 146H219",59:"226 319L219 313H87L81 319L80 384Q80 437 80 445T86 456Q89 458 154 458H219Q222 454 226 451V319ZM81 139Q85 145 88 145Q89 146 154 146H219Q222 142 226 139V8L187 -47Q182 -54 177 -62T169 -74T163 -83T157 -91T153 -97T149 -101T145 -103T141 -105T137 -105T132 -106H116H105Q80 -106 80 -95Q80 -90 98 -47T117 -2Q117 0 102 0L87 1L81 7V139",61:"94 324Q61 335 61 366Q61 396 91 405Q96 407 429 407H762Q763 406 767 404T774 400T781 395T787 387T792 378T794 365Q794 338 762 324H94ZM94 94Q61 105 61 135Q61 149 69 160T92 175Q97 177 430 177H762L766 175Q770 173 773 172T780 167T787 159T792 149T794 135Q794 107 762 94H94",63:"61 644Q61 652 87 666T157 693T244 705Q344 705 400 671T457 551Q457 516 446 490T422 451T387 421T356 391Q330 361 318 332T305 292T303 252Q303 218 300 213T290 208T244 207H220Q194 207 188 213Q187 214 186 215V255Q187 282 188 296T198 345T229 417T288 496Q306 515 306 559Q306 596 296 607T253 618Q214 618 185 607T143 583T120 558T103 547Q99 547 95 551Q93 553 77 597T61 644ZM171 71V95Q171 137 197 144Q201 146 244 146H261Q307 146 315 121Q317 115 317 73V51Q317 9 291 2Q286 0 242 0L199 1Q182 7 174 21L172 28L171 71",64:"61 264T61 347T82 494T136 596T217 660T311 694T410 704Q460 704 471 703Q534 694 577 666Q633 623 651 552T670 370V342Q670 249 633 195Q583 116 454 116Q238 116 238 347Q238 443 276 499Q328 578 456 578Q488 578 494 577L504 575Q475 617 430 617H421Q196 617 196 347Q196 215 253 143Q310 76 427 76Q499 76 561 102L575 107H664Q671 97 671 94V89L663 81Q566 -11 422 -11Q365 -11 316 -2T219 33T137 97T82 200ZM469 490Q459 492 453 492Q429 492 405 472Q374 439 374 347Q374 233 423 210Q436 202 454 202L486 210Q536 228 536 347Q536 461 486 484Q476 490 469 490",91:"318 -206Q318 -235 305 -243T255 -251Q248 -251 229 -251T198 -250H143Q112 -250 99 -246T81 -225Q79 -219 79 250T81 725Q85 741 98 745T143 750H198Q210 750 229 750T255 751Q291 751 304 743T318 707Q318 680 301 668Q293 663 255 663H224V-163H255Q293 -163 301 -168Q318 -180 318 -206",93:"24 706Q24 734 39 742T90 751Q97 751 114 751T143 750H198Q230 750 243 746T261 725Q263 719 263 250T261 -225Q257 -241 244 -245T198 -250H143Q131 -250 112 -250T86 -251Q50 -251 37 -243T24 -207Q24 -180 41 -168Q49 -163 87 -163H118V663H87H71Q24 663 24 706",94:"108 550Q108 554 135 589T190 658T219 692Q221 694 275 694Q328 694 330 693Q331 692 381 629T438 557Q441 553 441 549T434 538L399 537Q363 537 362 538Q361 538 318 575L275 611Q274 611 231 575Q188 538 187 538Q186 537 150 537L115 538Q108 545 108 550",95:"0 -66Q0 -32 26 -25Q30 -23 274 -23Q469 -23 497 -23T532 -28Q549 -40 549 -67Q549 -93 532 -105Q525 -109 498 -109T275 -110Q31 -110 26 -108Q0 -101 0 -66",126:"92 215Q92 259 122 301T204 344Q238 344 264 329T310 300T343 285Q356 285 361 295T369 322T377 344H450Q457 334 457 330Q457 281 427 240T344 198Q312 198 285 213T239 242T206 257Q188 257 182 230T172 199L137 198H120Q102 198 97 200T92 215",305:"54 431Q63 458 102 458H127H149Q192 458 199 433Q201 427 201 229T199 25Q190 0 149 0H125L81 1Q61 7 54 28V431",567:"-38 -84Q-36 -84 -14 -95T33 -106H38Q70 -103 78 -86Q83 -78 83 -49T84 180Q84 427 86 433Q93 458 136 458H158H180Q201 458 209 456T225 443Q230 436 231 418Q232 397 232 313V183V124V40Q232 -55 228 -87T203 -147Q166 -205 78 -205Q31 -205 -20 -189T-71 -159Q-71 -156 -59 -123Q-50 -96 -47 -91T-38 -84",768:"-458 682Q-458 690 -452 692T-426 694H-381H-314L-312 691Q-311 691 -305 682T-287 655T-263 622L-218 555V549Q-218 544 -224 538L-259 537Q-295 537 -296 538Q-298 539 -376 606T-456 676Q-458 680 -458 682",769:"-290 537H-310Q-334 537 -334 549Q-334 553 -311 588T-264 656L-241 690Q-240 690 -239 691T-236 693Q-235 694 -167 694H-100Q-93 684 -93 681T-94 677Q-95 675 -173 607T-255 538Q-256 537 -290 537",770:"-442 550Q-442 554 -415 589T-360 658T-331 692Q-329 694 -275 694Q-222 694 -220 693Q-219 692 -169 629T-112 557Q-109 552 -109 549Q-109 545 -116 538L-151 537Q-187 537 -188 538Q-189 538 -232 575L-275 611Q-276 611 -319 575Q-362 538 -363 538Q-364 537 -400 537L-435 538Q-442 545 -442 550",771:"-458 565Q-458 609 -428 651T-346 694Q-312 694 -286 679T-240 650T-207 635Q-194 635 -189 645T-181 672T-173 694H-100Q-93 684 -93 680Q-93 631 -123 590T-206 548Q-238 548 -265 563T-311 592T-344 607Q-362 607 -368 580T-378 549L-413 548H-430Q-448 548 -453 550T-458 565",772:"-84 660Q-81 656 -77 653V567L-81 564L-84 561L-274 560H-383Q-469 560 -471 565L-472 566Q-474 569 -474 611L-473 653Q-469 659 -466 659Q-465 660 -274 660H-84",774:"-123 694Q-80 694 -80 657Q-80 626 -99 601T-161 563Q-199 552 -275 552Q-352 552 -389 563Q-470 586 -470 655Q-470 667 -468 673Q-457 694 -435 694H-431Q-408 694 -396 685Q-387 676 -387 671Q-384 661 -275 661Q-167 661 -164 671Q-164 674 -163 677T-151 687T-123 694",775:"-329 596Q-346 602 -351 611T-356 638V646Q-356 653 -356 654T-356 661T-355 668T-353 673T-351 679T-347 684T-341 689T-332 693T-274 695H-221Q-202 683 -198 676T-194 645Q-194 632 -195 625T-202 610T-221 596H-329",776:"-331 695Q-312 683 -308 676T-304 645Q-304 632 -304 626T-311 610T-331 596L-380 595H-408Q-448 595 -457 617Q-459 621 -459 645T-457 673Q-448 696 -409 696Q-405 696 -396 696T-380 695H-331ZM-247 644Q-247 658 -246 665T-239 680T-221 694Q-217 695 -169 695H-143Q-102 695 -93 672Q-91 664 -91 645V635Q-91 613 -106 602Q-113 597 -121 596T-171 595L-219 596Q-232 600 -238 608T-246 622T-247 644",778:"-365 616Q-365 658 -331 676T-256 694Q-253 694 -247 694T-236 693Q-166 693 -139 666Q-119 644 -119 616T-139 565Q-166 538 -237 538H-242Q-365 538 -365 616ZM-181 616Q-181 641 -195 647T-242 654Q-258 654 -266 654T-284 650T-298 638T-303 616Q-303 592 -289 585T-242 577Q-209 577 -195 584T-181 616",779:"-426 686Q-424 694 -394 694H-350H-283Q-277 686 -277 682Q-277 673 -317 608T-361 538L-396 537H-420Q-432 537 -436 539T-440 548Q-440 560 -434 616Q-432 633 -430 650T-427 677L-426 686ZM-243 686Q-241 694 -211 694H-167H-100Q-94 686 -94 682Q-94 673 -134 608T-178 538L-213 537H-237Q-249 537 -253 539T-257 548Q-257 560 -251 616Q-249 633 -247 650T-244 677L-243 686",780:"-442 645Q-442 657 -418 657H-398Q-393 657 -388 657T-379 657T-371 656T-365 656H-363L-319 620L-276 583Q-275 583 -232 619Q-189 656 -188 656Q-187 657 -151 657H-116Q-109 649 -109 645Q-109 642 -112 637Q-118 629 -168 566T-220 501Q-222 500 -275 500Q-329 500 -331 501Q-442 634 -442 645",8211:"0 284Q0 318 26 325Q30 327 274 327Q469 327 497 327T532 322Q549 310 549 283Q549 257 532 245Q525 241 498 241T275 240Q31 240 26 242Q0 249 0 284",8212:"0 284Q0 318 26 325Q30 327 549 327T1073 325Q1099 318 1099 284Q1099 249 1073 242Q1068 240 549 240Q31 240 26 242Q0 249 0 284",8213:"0 284Q0 318 26 325Q30 327 549 327T1073 325Q1099 318 1099 284Q1099 249 1073 242Q1068 240 549 240Q31 240 26 242Q0 249 0 284",8215:"0 -66Q0 -32 26 -25Q30 -23 274 -23Q469 -23 497 -23T532 -28Q549 -40 549 -67Q549 -93 532 -105Q525 -109 498 -109T275 -110Q31 -110 26 -108Q0 -101 0 -66",8216:"87 443L81 449V581L119 636Q125 644 131 653T141 667T148 677T154 685T158 689T163 692T167 693T173 694H190H201Q226 694 226 683Q226 678 208 635T189 590Q189 588 204 588H219Q222 584 226 581V449L219 443H87",8217:"81 687Q85 693 88 693Q89 694 154 694H219Q222 690 226 687V556L187 501Q182 494 177 486T169 474T163 465T157 457T153 451T149 447T145 445T141 443T137 443T132 442H116H105Q80 442 80 453Q80 458 98 501T117 546Q117 548 102 548L87 549L81 555V687",8220:"144 443L138 449V581L176 636Q182 644 188 653T198 667T205 677T211 685T215 689T220 692T224 693T230 694H247H258Q283 694 283 683Q283 678 265 635T246 590Q246 588 261 588H276Q279 584 283 581V449L276 443H144ZM381 443L375 449V581L413 636Q419 644 425 653T435 667T442 677T448 685T452 689T457 692T461 693T467 694H484H495Q520 694 520 683Q520 678 502 635T483 590Q483 588 498 588H513Q516 584 520 581V449L513 443H381",8221:"38 687Q42 693 45 693Q46 694 111 694H176Q179 690 183 687V556L144 501Q139 494 134 486T126 474T120 465T114 457T110 451T106 447T102 445T98 443T94 443T89 442H73H62Q37 442 37 453Q37 458 55 501T74 546Q74 548 59 548L44 549L38 555V687ZM275 687Q279 693 282 693Q283 694 348 694H413Q416 690 420 687V556L381 501Q376 494 371 486T363 474T357 465T351 457T347 451T343 447T339 445T335 443T331 443T326 442H310H299Q274 442 274 453Q274 458 292 501T311 546Q311 548 296 548L281 549L275 555V687",8260:"103 -249Q81 -249 71 -235T61 -207Q61 -201 62 -198Q64 -192 235 265T409 727Q418 750 445 750Q464 750 476 737T488 707Q488 701 313 234Q143 -225 137 -232Q126 -249 103 -249",8710:"381 692Q386 694 458 694Q516 694 527 693T549 687Q564 680 575 663Q576 658 715 349T856 27Q856 6 838 1H826Q815 1 795 1T747 1T686 1T616 0T539 0T458 0T378 0T300 0T230 0T169 1T122 1T90 1H78Q60 6 60 27Q62 38 201 349T341 663Q356 687 381 692ZM627 148Q626 149 581 250T492 453L447 554Q447 553 446 552Q444 546 326 278L268 148Q268 147 448 147Q627 147 627 148"},{})},3746:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerifItalic=void 0;var n=r(768),o=r(5181);e.sansSerifItalic=(0,n.AddPaths)(o.sansSerifItalic,{33:"160 187L257 694H306Q355 694 355 693L238 186H199Q160 186 160 187ZM110 2Q111 3 120 49T131 96Q131 98 180 98T229 96L219 50Q209 3 208 2V0H110V2",34:"171 647L180 694H229Q278 694 278 693L276 686Q275 680 273 668T268 644L258 597L182 471H157Q133 471 133 472L189 595Q189 596 174 596H160V598Q160 601 171 647ZM365 647L374 694H423Q472 694 472 693L470 686Q469 680 467 668T462 644L452 597L376 471H351Q327 471 327 472L383 595Q383 596 368 596H354V598Q354 601 365 647",35:"793 170Q809 162 809 149Q809 145 807 141T802 135T796 132L793 130H547L472 -27Q397 -184 394 -187Q389 -194 379 -194Q367 -194 362 -183Q359 -179 359 -173Q360 -168 431 -20L503 129Q503 130 410 130H317L242 -27Q167 -184 164 -187Q159 -194 149 -194Q137 -194 132 -183Q129 -179 129 -173Q130 -168 201 -19L273 130H187L100 131Q87 141 87 150Q87 162 102 170H294L331 248Q339 265 349 286T365 318L370 328Q370 330 258 330Q145 330 142 332Q129 338 129 351Q129 362 140 368Q146 370 267 370L391 371L467 527Q542 684 544 686Q544 688 549 691T560 694H562Q565 693 567 692T571 690T575 686T578 681T579 672Q577 665 507 520T436 373L435 370H528L621 371L692 518Q767 675 769 677Q775 694 789 694Q798 694 804 688T809 672Q806 664 737 519L665 371L751 370Q835 370 841 368Q851 362 851 350Q851 337 841 334T799 330H765H741H645L606 250L568 170H793ZM600 328Q600 330 508 330H415Q412 326 338 171Q338 170 431 170H524L561 248Q569 265 579 286T595 318L600 328",36:"228 70Q233 92 246 155T270 266T280 316Q271 318 265 320T237 333T200 360T172 403T159 468Q159 537 205 600T325 691Q352 701 360 701Q361 701 361 701T362 703T364 711T368 727L372 750H409Q445 750 445 749L436 705Q436 703 450 702T494 691T554 657L565 649Q562 642 548 604L534 568Q511 591 484 605T440 621L424 623L419 624L372 405Q399 400 424 384Q490 338 490 247V240Q490 156 430 85Q374 13 294 -5L284 -7L280 -30Q279 -35 278 -41T275 -52L274 -55Q274 -56 237 -56Q201 -56 201 -54Q202 -53 205 -34T211 -11Q211 -9 206 -9Q154 -2 115 19Q80 35 56 59L88 141L99 131Q109 121 119 113T141 99T160 89T180 82T197 77T214 73T228 70ZM303 426Q304 427 313 471T332 564T345 620L335 616Q287 596 263 549Q252 525 252 499Q252 470 267 451T298 426Q303 424 303 426ZM302 75Q305 75 315 80T340 98T367 125T390 164T399 214Q399 247 384 268T349 297Q338 247 326 186L302 75",37:"268 347Q224 347 195 386T165 488Q165 517 173 552Q191 637 246 693T349 749Q389 749 414 725T448 673T456 614Q456 506 396 427T268 347ZM372 604Q372 674 339 674Q311 674 290 633T261 549T253 482V474Q253 438 272 426Q277 424 286 424Q319 424 345 485T372 604ZM189 -56Q179 -56 173 -49T167 -37Q167 -30 347 198Q425 296 475 360Q780 745 785 747Q790 750 796 750Q814 748 814 730Q814 725 811 719L204 -49Q198 -56 189 -56ZM523 87Q523 184 583 265T713 347Q758 347 786 308T815 207Q815 110 757 28T629 -55Q576 -55 550 -12T523 87ZM729 200Q729 271 696 271Q675 271 658 247T631 189T616 125T611 76Q611 21 644 21H647Q672 21 700 77T729 200",38:"219 -22Q158 -22 117 13T71 111Q71 131 74 150T84 185T98 215T118 241T137 262T159 281T179 295T199 308L214 318L258 348L256 362Q254 373 254 413V435Q254 483 271 537T325 641T411 708Q427 715 441 715Q446 716 455 716Q504 716 534 681T565 590Q565 522 519 468T377 347L358 334Q359 333 363 320T374 290T387 262Q404 227 428 187T460 139Q521 183 574 251T651 362T674 409L710 398Q746 388 747 388Q747 381 720 333T635 213T517 94L510 87Q542 57 598 57Q649 57 708 72Q716 75 718 75L709 34L701 -7Q636 -22 578 -22Q531 -22 498 -8T428 34L408 25Q314 -22 219 -22ZM480 579Q480 640 436 640Q410 640 385 615T351 554Q340 513 340 457Q340 413 343 410Q343 406 360 419Q431 471 455 505T480 579ZM245 57Q279 59 311 67T359 81T375 89T358 113T318 178T281 260L274 277L245 257Q167 205 167 135Q167 110 174 93T194 69T217 60T237 57H245",39:"228 647L237 694H286Q335 694 335 693L334 686Q332 680 330 668T325 644L315 597L239 471H214Q190 471 190 472L246 595Q246 596 231 596H217V598Q217 601 228 647",40:"195 37Q195 -7 200 -47T213 -113T231 -166T250 -204T268 -232T280 -250H204L194 -238Q104 -124 104 55Q104 238 181 432T405 740L417 750H454Q491 750 491 749L468 729Q446 709 411 667T337 565T262 405T208 188Q195 110 195 37",41:"300 463Q300 634 222 740L214 750H290L299 740Q300 738 309 726T323 707T337 682T353 651T367 613T379 566T387 510T390 444Q390 314 344 156T203 -125Q179 -155 145 -191Q111 -224 89 -241L78 -250H2Q4 -248 27 -227T65 -189T107 -140T155 -71T200 16T244 129T278 266Q300 372 300 463",42:"193 608Q193 628 210 644T246 660Q250 660 252 660T257 658T264 654T272 648T284 638T302 623Q340 590 340 593Q341 594 345 623T354 682T360 715Q365 729 378 739T407 750Q424 750 433 740T443 720Q443 712 427 652L410 591L462 623Q505 650 514 655T534 660Q549 660 558 650T568 625Q568 617 567 611T560 599T551 590T536 580T519 571T496 561T470 548L429 528L474 500Q482 495 492 489T506 481T516 475T523 469T527 464T529 458T530 450Q530 430 514 414T479 397H475Q468 397 460 402T423 433Q414 440 404 448T388 461L383 465L365 344Q348 306 314 306Q302 306 292 313T281 338Q281 347 297 404L313 464L260 433Q201 397 195 397H189Q173 397 165 407T156 432Q156 438 157 443T161 452T166 460T175 468T185 475T198 482T212 489T230 497T250 506L295 528L250 556Q203 582 202 585Q193 591 193 608",43:"108 244T108 250T112 261T119 268T124 270H426V272Q428 274 457 419Q489 565 492 573Q497 583 508 583Q516 583 522 577T528 565Q528 553 498 417Q491 384 483 346T471 288L467 270H760Q775 262 775 250T760 230H458Q456 221 426 77T394 -71Q389 -83 375 -83Q367 -83 362 -78T356 -64Q356 -58 387 84Q394 118 401 155T413 210L417 229Q417 230 271 230H124Q123 230 120 232T112 239",44:"90 2Q91 3 100 49T111 96Q111 98 160 98T209 96L199 50Q189 3 188 2Q188 0 149 -63L112 -125H63L120 0H105Q90 0 90 2",45:"66 257V259H332V257L324 220L317 186H184Q51 186 51 187T58 220T66 257",46:"90 2Q91 3 100 49T111 96Q111 98 160 98T209 96L199 50Q189 3 188 2V0H90V2",47:"564 744L568 747Q573 750 579 750Q588 750 594 744T599 729Q597 721 321 241T41 -243Q37 -250 27 -250Q6 -250 6 -230Q6 -228 8 -222Q9 -219 285 261T564 744",48:"245 -22Q209 -22 181 -11T135 20T107 65T92 116T88 171Q88 235 114 354T194 557Q226 606 269 635T340 671T392 678H395Q422 678 446 670T495 643T534 582T549 481Q549 430 534 350T499 213Q459 89 379 25Q315 -22 247 -22H245ZM430 582Q408 601 378 601Q313 601 269 534Q234 475 205 341Q181 232 181 174Q181 104 209 76Q231 54 260 54T318 73T368 125Q410 194 447 375Q460 445 460 487Q460 555 430 582",49:"234 613Q277 613 331 628T428 678H439Q451 678 451 676Q450 671 387 373T323 74T384 73H445L430 0H259L88 1L104 73H229L332 560Q278 541 198 539Q198 540 198 541T199 546T200 554T202 564T205 576L213 612H219Q221 612 226 612T234 613",50:"190 460Q189 460 181 475T164 507T155 527Q155 535 182 571Q259 678 380 678Q462 678 506 630T551 513V507Q551 418 487 349Q469 329 441 305T391 265T344 232T316 212Q158 87 158 86T188 85Q194 85 234 85T311 86Q467 86 467 85Q451 9 449 2V0H50Q54 18 58 40L67 79L133 133Q246 226 269 243Q369 318 410 373T452 492Q452 535 433 560T393 592T350 599Q311 599 279 578T231 532T203 484T190 460",51:"446 542Q446 576 424 590T372 605Q330 605 288 583T216 524Q209 515 208 516Q207 517 192 549L178 580L187 589Q224 627 276 652T386 678Q456 678 500 642T544 550Q544 515 530 482T495 427T453 387T418 362L403 353L413 348Q440 335 462 313Q500 271 500 217Q500 135 423 57T236 -22T63 59L56 68L85 141Q106 112 125 98Q177 54 254 54Q315 54 355 105T396 218Q396 242 393 254Q380 301 335 313Q327 315 280 316Q233 316 233 318L249 392Q298 392 322 399Q373 408 409 453T446 542",52:"78 235L411 656H465Q519 656 519 655T475 447T430 237V235H521V233L505 160Q505 159 459 159H414L380 0H286L320 159H62L63 164Q64 169 66 179T70 198L78 235ZM342 235L421 607Q420 607 419 604Q409 535 197 267Q173 236 173 235H342",53:"330 350Q263 350 214 272H133V275Q134 276 174 467L214 655Q214 656 385 656H555V653Q555 652 554 647T550 631T546 613L539 577H284L265 486Q261 464 256 441T248 406L246 395L250 398Q255 401 264 406T286 415T315 423T350 427Q412 427 455 381T498 256Q498 150 415 64T222 -22Q186 -22 155 -12T105 12T74 41T55 65T50 77L51 79Q61 89 78 112L104 145L107 138Q110 130 114 123T125 106T142 88T165 72T196 60T236 55Q282 55 316 79T366 140T389 208T396 267Q396 310 378 330T337 350H330",54:"437 605Q397 605 361 585T301 536T261 477T236 426T228 401L236 408Q244 414 260 424T296 445T345 462T402 469H404Q422 469 434 467T465 446T498 394Q515 351 515 307Q515 254 497 193T439 85Q352 -22 246 -22Q220 -22 196 -14T148 15T109 78T94 179Q94 272 123 373Q163 505 257 591T450 678Q474 678 498 674T535 664T548 656L540 621L532 586L520 590Q509 594 485 599T437 605ZM339 392Q281 392 233 334T185 163V158Q185 87 230 61Q244 54 262 54Q325 54 371 122Q395 158 407 217T419 298Q419 337 401 364T339 392",55:"173 614L181 656H389Q596 656 596 655L595 650Q594 645 592 635T588 616L580 578L554 551Q313 307 245 4L242 -11H192Q143 -11 143 -10Q144 0 148 17T169 89T212 198T285 327T393 470Q423 504 472 550Q479 555 485 561T496 571L329 570Q163 570 163 571L164 577Q166 583 168 593T173 614",56:"159 470Q159 547 229 612T394 678Q467 678 510 636T554 533Q554 512 549 493T535 458T515 429T492 405T467 386T443 372T423 362T409 356L404 354Q404 353 405 353Q411 353 432 341T476 295T500 218Q500 134 424 56T246 -22Q175 -22 126 22T77 143Q77 204 110 251T188 327L202 334Q216 340 229 346T243 353T235 358T214 372T189 393T168 426T159 470ZM467 527Q467 605 375 605Q317 605 281 566T244 472Q244 429 271 411T334 392Q392 392 429 430T467 527ZM405 228Q405 262 384 289T315 316Q257 316 216 266T174 144Q174 95 199 75T262 54Q329 54 367 109T405 228",57:"220 594Q303 677 389 677Q545 677 545 479Q545 413 526 327Q493 175 398 77T202 -22Q124 -22 77 25L130 91L137 83Q169 54 218 54Q255 54 290 76T347 129Q364 151 380 182T403 232T411 256Q410 255 390 241T353 217T303 197T236 187Q195 187 173 209Q155 226 140 263T124 352Q124 392 135 435Q154 527 220 594ZM455 497Q455 605 383 605Q340 605 305 577T246 492Q220 411 220 360Q220 278 279 264Q280 264 287 264T299 263Q347 263 387 302Q455 375 455 497",58:"174 396L184 444H233Q282 444 282 443Q277 421 272 394L262 346H213Q164 346 164 347Q169 369 174 396ZM90 2Q91 3 100 49T111 96Q111 98 160 98T209 96L199 50Q189 3 188 2V0H90V2",59:"174 396L184 444H233Q282 444 282 443Q277 421 272 394L262 346H213Q164 346 164 347Q169 369 174 396ZM90 2Q91 3 100 49T111 96Q111 98 160 98T209 96L199 50Q189 3 188 2Q188 0 149 -63L112 -125H63L120 0H105Q90 0 90 2",61:"142 368Q145 370 463 370Q780 370 784 368Q796 364 796 350T784 332Q780 330 463 330Q145 330 142 332Q129 338 129 351Q129 362 142 368ZM88 137T88 150T102 170H738Q739 170 742 168T750 161T754 150T750 139T743 132T738 130H102Q88 137 88 150",63:"194 652Q194 654 218 666T284 691T362 704Q444 704 490 678T536 583Q536 541 516 500T459 433Q415 400 387 371T343 313T321 266T307 216L301 186H262Q223 186 223 187Q224 199 228 218T250 288T294 377Q317 413 344 440T391 481T414 499Q442 527 442 574Q442 584 441 590T433 607T409 623T362 629Q335 629 310 624T267 610T235 595T214 582T205 576L200 614Q194 651 194 652ZM173 2Q174 3 183 49T194 96Q194 98 243 98T292 96L282 50Q272 3 271 2V0H173V2",64:"120 267Q120 377 179 478T336 642T538 705Q610 705 658 662T707 513Q707 425 681 331Q658 241 590 179T447 117Q386 117 343 163T300 288Q300 397 374 486T544 576Q575 576 608 562Q590 628 517 628Q406 628 309 522T212 278Q212 179 267 122T404 65T550 91H631Q513 -10 390 -10Q265 -10 193 70T120 267ZM600 397Q600 441 581 471T530 501Q476 501 433 436T390 298Q390 254 409 224T462 193Q512 193 556 257T600 397",91:"148 252L253 750H339Q425 750 425 749L424 744Q423 739 421 729T417 711L409 675L367 674H325L235 252Q145 -167 145 -172Q145 -174 187 -174H229V-176Q213 -240 213 -250H127Q41 -250 41 -248Q41 -245 148 252",93:"353 749Q353 746 303 512T200 27T141 -250H-31Q-31 -240 -15 -176V-174H70L250 674H208L165 675L181 750H267Q353 750 353 749",94:"190 527L360 694H434L484 611Q533 528 533 527H457L390 632L385 639L266 527H190",95:"59 -75L66 -38H316Q565 -38 565 -39T558 -75T549 -112Q549 -114 299 -114Q50 -114 50 -113L52 -108Q53 -103 55 -93T59 -75",126:"330 327Q356 326 388 298T446 269Q470 269 484 327H522Q560 327 560 325L557 316Q554 306 549 292T535 263T512 232T480 208Q453 193 429 193T370 222T315 251Q285 251 275 193H199V197Q214 257 251 292T330 327",305:"168 442T168 443T213 444T258 443T212 225T164 2V0H74V2Q75 7 121 224",567:"-54 -96L-48 -104Q-41 -111 -27 -118T7 -126Q60 -126 82 -87Q85 -81 140 181L196 443Q196 444 241 444T286 443Q286 441 232 186T175 -75Q163 -120 122 -162T19 -204Q-13 -204 -41 -196T-83 -180T-96 -170Q-55 -96 -54 -96",768:"-262 681L-270 694H-177L-132 612Q-89 530 -87 528Q-87 527 -125 527H-163L-208 598Q-254 670 -262 681",769:"-96 625L-29 694H63Q42 673 -31 605L-114 527H-190L-176 541Q-160 559 -96 625",770:"-310 527L-140 694H-66L-16 611Q33 528 33 527H-43L-110 632L-115 639L-234 527H-310",771:"-170 677Q-144 676 -112 648T-54 619Q-30 619 -16 677H22Q60 677 60 675L57 666Q54 656 49 642T35 613T12 582T-20 558Q-47 543 -71 543T-130 572T-185 601Q-215 601 -225 543H-301V547Q-286 607 -249 642T-170 677",772:"-314 553L-297 631H-116Q64 631 64 630Q60 612 56 591L47 553L-133 552Q-314 552 -314 553",774:"-142 508Q-205 508 -244 548T-284 652Q-284 666 -281 683L-280 694H-204Q-205 689 -205 677Q-205 650 -196 631T-173 604T-147 593T-125 590Q-85 590 -50 618T-5 686L-2 694H73V690Q53 610 -10 559T-142 508",775:"-180 578Q-179 579 -170 627T-158 678V680H-54V678Q-56 675 -65 627T-76 578V576H-180V578",776:"-273 584Q-272 585 -262 632L-252 678V680H-154V678L-164 632Q-174 585 -175 584Q-175 582 -224 582T-273 584ZM-78 586Q-78 587 -69 632T-58 678V680H40L39 677Q39 676 38 670T34 651T29 628L19 583L-30 582H-79L-78 586",778:"-227 597Q-227 639 -186 666T-102 693H-97Q-29 693 -8 649Q-2 637 -2 623Q-2 582 -43 555T-132 527Q-171 527 -199 546T-227 597ZM-59 619Q-59 635 -68 643T-104 652Q-142 652 -156 636T-171 602Q-171 569 -123 569Q-119 569 -111 570T-99 571Q-59 582 -59 619",779:"-236 619L-195 694H-149Q-103 694 -103 693L-211 527H-287L-282 536Q-281 539 -236 619ZM-70 619L-29 694H17Q63 694 63 693L-45 527H-121L-116 536Q-115 539 -70 619",780:"-283 654H-207L-140 549L-135 542L-16 654H60L-109 487H-147L-184 488L-234 570Q-283 653 -283 654",913:"28 0L429 694H533L585 350Q596 275 610 182T632 46L638 3V0H530L528 18Q527 25 515 103T503 183H223L135 29L118 1L73 0H28ZM492 254Q492 256 473 398T454 589V610Q433 552 290 301L264 255L378 254H492",914:"501 363Q557 355 605 316T653 222Q653 148 586 85T403 2Q394 1 240 0Q90 0 90 1L100 46Q109 90 128 177T164 348L238 694H375Q518 693 546 688Q614 674 655 635T696 544Q696 490 648 441T516 368L501 363ZM601 530Q601 568 566 590T479 621Q472 622 394 623H320L297 513Q292 489 286 459T276 415L273 401V399H339H372Q504 399 571 466Q601 498 601 530ZM257 322Q256 320 230 197T203 73Q203 71 289 71Q379 72 387 73Q459 84 507 122T556 210Q556 255 519 283T428 320Q415 322 336 323Q257 323 257 322",915:"87 2Q88 4 160 346T234 689Q234 691 440 691T646 689Q643 686 629 611H475L321 612Q193 4 191 2V0H87V2",916:"273 343L510 694H617Q790 2 790 0H416L42 1L273 343ZM539 576Q536 597 536 600Q536 602 535 605Q534 607 534 607Q527 580 222 130L201 98H651L648 110Q645 123 639 149T627 198Q554 489 539 576",917:"86 2Q88 4 160 346T233 689Q233 691 461 691Q688 691 688 689Q685 686 671 611H495L320 612L319 609Q319 607 297 501L274 397H436Q597 397 597 396L596 391Q595 386 593 376T589 358L581 322L420 321Q258 321 258 320Q209 89 208 87Q208 85 390 85Q417 85 460 85T518 86L572 85Q556 8 554 2V0H86V2",918:"67 54Q551 615 551 617Q543 618 517 618Q510 618 463 618T376 617Q200 617 200 618T209 657L216 694H459Q702 694 702 692Q702 689 697 667L692 643L207 80H392Q493 81 577 81Q577 70 560 2V0H55V2L67 54",919:"517 2Q518 3 551 161T585 322Q586 323 557 323T422 323H259L190 0H138Q86 0 86 1L96 46Q105 90 124 177T160 348L234 694H337V691Q336 690 306 545T275 399H602L603 403Q603 407 634 551L665 694H768V691Q768 690 695 348T621 2V0H517V2",920:"119 260Q119 348 157 433T254 579T387 677T533 715Q701 715 772 574Q804 511 804 431Q804 315 744 209T586 41T384 -22Q262 -22 191 59T119 260ZM706 426Q706 524 655 582T525 640Q454 640 395 600T293 502Q256 447 237 383T218 266Q218 168 269 112T401 55Q518 55 612 166T706 426ZM283 349L293 397H473Q652 397 652 396Q647 374 642 347L632 299H452Q273 299 273 300Q278 322 283 349",921:"161 348L235 694H338V691Q338 690 265 348T191 2V0H139Q87 0 87 1L96 46Q106 90 125 177T161 348",922:"236 223Q235 222 213 113T188 2V0H138Q88 0 88 1L98 46Q107 90 126 177T162 348L236 694H285Q335 694 335 693L330 671Q326 649 316 603T298 518Q289 477 280 433T266 366L261 343L672 694H729L784 693L465 420L651 0H596L541 1L384 350Q383 351 310 288T236 223",923:"28 0L401 694H504V690Q505 686 543 345T582 1Q582 0 528 0H473V3Q472 6 460 113T435 359T422 558Q422 593 424 603L425 610L424 608Q414 572 343 431Q287 316 143 49L117 1L73 0H28",924:"375 691Q456 215 459 124V106Q488 177 762 641L793 694H929V691Q929 690 856 348T782 2V0H689V2Q691 4 753 304Q817 604 818 606Q819 611 817 608Q817 607 815 603Q798 559 540 117L484 22H440L397 23L393 42Q393 47 373 169T334 422T315 594V609L250 306Q186 3 185 2Q185 0 138 0Q92 0 92 1L102 46Q111 90 130 177T166 348L240 694H375V691",925:"311 609Q310 608 246 306T181 2V0H134Q88 0 88 1L98 46Q107 90 126 177T162 348L236 694H382L383 691Q383 688 418 561T493 286T541 97L544 84L545 89Q545 90 553 128T578 246T610 394L674 694H766V691Q766 690 693 348T619 2V0H472L469 13Q468 17 393 293T312 605L311 609",926:"193 687Q193 688 479 688H765V686Q764 685 755 642L747 600H461L175 601Q175 602 184 645L193 687ZM196 400Q196 401 418 401T640 400L622 315Q622 314 400 314T178 315L196 400ZM42 2Q43 3 51 44T60 87H64Q68 87 75 87T93 87T119 87T151 88T190 88T237 88T291 88T352 88H643Q638 66 634 44T627 13T624 2V0H42V2",927:"118 254Q118 366 174 473T324 648T517 716Q627 716 695 638T763 435Q763 321 706 215T555 43T362 -22Q256 -22 187 56T118 254ZM380 58Q452 58 518 116T622 263T661 442Q661 496 646 535T608 594T567 622T534 634Q516 636 496 636Q400 636 313 528T225 264Q225 172 267 115T380 58",928:"86 2Q88 4 160 346T233 689Q233 691 501 691Q768 691 768 689Q766 688 694 346T621 2V0H517V2Q518 3 582 304T646 609L648 615H321L190 0H86V2",929:"162 348L236 694H378Q522 693 530 692Q604 680 647 635T690 524Q690 474 665 430T612 359Q550 299 465 280Q443 275 343 274H250V271Q250 269 235 201T206 68T192 2V0H140Q88 0 88 1L98 46Q107 90 126 177T162 348ZM594 513Q594 560 562 588T477 622Q470 623 394 623H321L293 487L263 349V347H342H347H375Q530 347 578 449Q594 483 594 513",931:"194 655L202 694H508Q813 694 813 693Q809 675 805 653L797 614H559L321 615Q327 606 405 478L485 347Q449 311 348 203T247 86Q247 84 294 84Q303 84 359 84T465 85H684Q684 84 675 42L666 0H360L55 1L195 154Q346 319 347 320L359 333L273 473Q187 614 186 614L187 620Q188 625 190 635T194 655",932:"165 608L182 687Q182 688 486 688H790L789 685L781 645L773 609H521L457 306Q393 3 392 2Q392 0 340 0H288V2Q289 5 353 304T417 605V609L291 608H165",933:"357 637Q320 637 297 612T266 555H173Q178 576 188 598Q214 651 265 683T373 716Q497 716 497 542V509L504 526Q579 715 711 715Q773 715 808 677T843 589Q843 576 840 555H747L748 557Q748 559 748 563T749 574V580Q749 604 731 622Q715 638 693 638Q591 638 543 465Q531 425 506 309T462 98T441 2V0H337V2Q425 401 436 486Q438 504 438 526Q438 637 364 637H357",934:"124 308Q124 399 208 481T433 587Q437 587 437 589Q438 590 449 643L459 694H508Q557 694 557 693Q557 691 546 641T535 587Q543 587 562 583T614 565T674 531T722 472T743 387Q743 288 656 209T449 110L433 106Q411 3 410 2Q410 0 361 0H312L313 3Q313 5 324 56L335 107H331L321 108Q311 110 297 114T266 124T228 141T190 168Q124 225 124 308ZM227 315Q227 282 239 257T270 218T306 197T338 186L350 184H351L386 346Q420 507 420 509H419Q411 509 393 505T342 485T284 444Q227 387 227 315ZM642 381Q642 413 629 437T599 475T563 496T533 507T519 510Q518 510 484 348T450 184Q544 201 593 258T642 381",935:"14 0Q17 3 184 184T352 367L265 529Q244 567 222 609T188 672L176 692Q176 694 236 694H297L338 612Q387 515 400 489L421 448L645 694H758L708 640Q481 393 456 368Q455 366 500 281T596 104T652 0H531L388 293L128 0H14",936:"325 556Q325 524 310 447T294 330Q294 289 304 260Q314 234 333 216T364 192T380 187L488 694H585V691Q584 689 531 438L478 188H479Q485 188 503 195T555 231T613 305Q637 352 654 435Q662 470 669 496T681 538T690 562T698 578T704 587Q719 609 733 615T772 621H802H854V619L838 546Q838 545 832 545Q775 539 749 418Q716 274 638 196Q616 173 590 156T543 131T503 117T473 110T460 106Q460 105 450 54T438 2V0H340V2Q341 3 351 54T362 106Q363 107 358 108T344 111T322 117T295 128T267 145T239 171T216 207T200 256T194 319Q194 356 203 408T213 483Q213 517 203 530T182 544T171 546Q184 609 187 619V621H239Q286 621 294 620T309 612Q325 596 325 556",937:"148 407Q148 475 182 534T269 633T386 694T511 716Q622 716 695 658T769 507Q769 461 747 409T699 321T628 225T562 136Q533 90 533 86Q542 85 557 85Q564 85 583 85T614 86Q695 86 695 85Q679 9 677 2V0H425Q426 3 433 30T447 72T480 131T549 241L554 248Q558 254 563 261T576 281T592 306T609 335T625 366T640 400T653 434T661 466T664 498Q664 562 618 601T497 640Q416 640 351 596T262 482Q250 441 250 392T276 237T302 70V56Q302 28 296 2V0H44V2L62 85Q62 86 143 86L225 85V88Q224 89 224 89T224 91T224 95T223 101T222 110T220 123T216 140T209 163T200 191T188 227Q148 344 148 407",8211:"59 275L66 312H316Q565 312 565 311T558 275T549 238Q549 236 299 236Q50 236 50 237L52 242Q53 247 55 257T59 275",8212:"59 275L66 312H566Q1065 312 1065 311T1058 275T1049 238Q1049 236 549 236Q50 236 50 237L52 242Q53 247 55 257T59 275",8213:"59 275L66 312H566Q1065 312 1065 311T1058 275T1049 238Q1049 236 549 236Q50 236 50 237L52 242Q53 247 55 257T59 275",8215:"59 -75L66 -38H316Q565 -38 565 -39T558 -75T549 -112Q549 -114 299 -114Q50 -114 50 -113L52 -108Q53 -103 55 -93T59 -75",8216:"309 567L299 520Q289 474 288 473Q288 471 239 471T190 473L192 480Q193 486 196 499T201 522L211 569L287 694H312L335 693L332 685Q328 677 321 661T307 630L279 570L294 569Q309 569 309 567",8217:"228 647L237 694H286Q335 694 335 693L334 686Q332 680 330 668T325 644L315 597L239 471H214Q190 471 190 472L246 595Q246 596 231 596H217V598Q217 601 228 647",8220:"393 567L383 520Q373 474 372 473Q372 471 323 471T274 473L276 480Q277 486 280 499T285 522L295 569L371 694H396L419 693L416 685Q412 677 405 661T391 630L363 570L378 569Q393 569 393 567ZM587 567L577 520Q567 474 566 473Q566 471 517 471T468 473L470 480Q471 486 474 499T479 522L489 569L565 694H590L613 693L610 685Q606 677 599 661T585 630L557 570L572 569Q587 569 587 567",8221:"171 647L180 694H229Q278 694 278 693L276 686Q275 680 273 668T268 644L258 597L182 471H157Q133 471 133 472L189 595Q189 596 174 596H160V598Q160 601 171 647ZM365 647L374 694H423Q472 694 472 693L470 686Q469 680 467 668T462 644L452 597L376 471H351Q327 471 327 472L383 595Q383 596 368 596H354V598Q354 601 365 647",8260:"564 744L568 747Q573 750 579 750Q588 750 594 744T599 729Q597 721 321 241T41 -243Q37 -250 27 -250Q6 -250 6 -230Q6 -228 8 -222Q9 -219 285 261T564 744",8710:"273 343L510 694H617Q790 2 790 0H416L42 1L273 343ZM539 576Q536 597 536 600Q536 602 535 605Q534 607 534 607Q527 580 222 130L201 98H651L648 110Q645 123 639 149T627 198Q554 489 539 576"},{})},3240:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sansSerif=void 0;var n=r(768),o=r(3526);e.sansSerif=(0,n.AddPaths)(o.sansSerif,{33:"120 187Q120 225 115 440T110 693Q110 694 159 694T208 693Q208 655 203 440T198 187Q198 186 159 186T120 187ZM110 0V98H208V0H110",34:"33 596V694H131V597L82 471H32L47 532Q62 593 63 594Q63 596 48 596H33ZM227 596V694H325V597L276 471H226L241 532Q256 593 257 594Q257 596 242 596H227",35:"56 350Q56 363 70 370H192Q314 370 314 371L356 526Q396 676 401 685Q406 694 416 694Q423 694 429 689T436 677Q436 673 396 523T355 371Q355 370 449 370Q544 370 544 371L586 526Q628 682 630 685Q636 694 646 694Q653 694 659 689T665 678Q665 670 645 593T605 444L585 371Q585 370 673 370H762Q777 362 777 350Q777 337 767 334T723 330H668H573L567 305Q560 282 545 226L530 171L646 170H721Q756 170 766 167T777 150Q777 138 762 130H640Q518 130 518 129L476 -26Q434 -182 432 -185Q426 -194 416 -194Q409 -194 403 -189T397 -178Q397 -170 417 -93T457 56L477 129Q477 130 383 130Q288 130 288 129L246 -26Q204 -182 202 -185Q196 -194 186 -194Q179 -194 173 -189T167 -178Q167 -170 187 -94T227 56L247 129Q247 130 159 130H70Q56 137 56 150Q56 165 72 170H259L265 195Q273 222 287 275L302 330H186L70 331Q63 334 58 339Q56 343 56 350ZM489 170L532 330H343L337 305Q330 282 315 226L300 171L394 170H489",36:"55 509Q55 585 103 638T213 701V750H286V703H289Q312 703 354 689Q372 682 399 666T427 646L413 569Q413 568 403 575Q352 615 291 624H286V405Q357 389 400 331T444 199Q444 128 402 69T286 -7V-56H213V-9Q167 -3 125 14T63 44T44 60Q44 61 52 101L59 140L69 132Q78 125 87 119T107 107T124 97T141 90T157 84T173 80T187 76T201 73T213 70V317L202 319Q141 335 98 386T55 509ZM213 424V620L203 615Q143 587 143 522Q143 455 213 424ZM356 187Q356 208 350 227T334 258T315 280T298 293T287 297Q286 297 286 186V75Q356 110 356 187",37:"56 549Q56 639 98 694T195 750Q248 750 290 694T332 548Q332 455 290 401T195 347Q141 347 99 403T56 549ZM248 549Q248 602 234 638T195 674Q145 674 145 549Q145 423 195 423Q219 423 233 459T248 549ZM197 -56Q187 -56 182 -49T176 -35Q176 -33 178 -27Q179 -25 399 356T623 741Q626 750 639 750Q648 750 654 744T659 729Q657 721 435 336T207 -52Q203 -56 197 -56ZM500 146Q500 235 542 291T639 347Q692 347 734 293T776 146Q776 53 733 -1T639 -56Q587 -56 544 -2T500 146ZM692 146Q692 199 678 235T639 271Q589 271 589 146Q589 20 639 20Q663 20 677 56T692 146",38:"156 502Q156 600 198 658T302 716Q367 716 405 665T444 549Q444 531 442 523Q426 446 304 348L287 334Q305 297 340 249T402 170T430 139T443 149T472 181T509 231T549 303T583 394Q584 398 586 404Q587 408 587 409Q588 409 626 399T665 388Q663 381 660 369T644 322T614 253T567 176T502 98L491 87Q534 57 584 57Q653 57 700 75Q702 75 702 34T700 -7Q652 -22 586 -22H580Q505 -22 434 26L421 34Q419 33 405 25T374 11T336 -4T285 -17T226 -22Q143 -22 93 31T42 152Q42 184 51 211T81 260T111 291T144 317L184 348L178 365Q156 430 156 502ZM359 552Q359 588 345 614T302 640Q292 640 282 636T260 622T241 590T233 535Q236 474 253 417L257 407L271 419Q312 454 330 479Q359 514 359 552ZM345 102Q262 190 216 277Q215 277 204 267T180 247T165 236Q135 208 135 159Q135 123 152 97T198 61Q207 58 227 58Q286 58 357 89L345 102",39:"90 596V694H188V597L139 471H89L104 532Q119 593 120 594Q120 596 105 596H90",40:"74 250Q74 564 240 733L257 750H333L323 739Q167 573 167 250T323 -239L333 -250H257L240 -233Q74 -63 74 250",41:"221 -73T221 250T65 739L55 750H131L148 733Q314 567 314 250T148 -233L131 -250H55L65 -239Q221 -73 221 250",42:"208 717Q211 731 222 740T250 750Q265 750 277 741T291 717Q291 706 290 675T286 617L285 591L329 622Q369 651 376 655T393 659Q411 659 423 647T436 616Q436 609 434 603T429 594T419 585T407 577T389 567T368 556L316 528L368 500Q421 472 429 464Q436 455 436 440Q436 422 423 409T393 396Q390 396 388 396T384 397T380 398T375 401T367 406T358 413T346 422T329 434L285 465Q284 465 285 438T289 381T291 347Q291 327 278 317T250 306Q234 306 222 315T208 339Q208 350 209 381T212 439L214 465L170 434Q130 405 123 401T106 397Q88 397 76 409T63 440Q63 447 65 453T70 462T80 471T92 479T110 489T131 500L183 528L131 556Q78 584 70 592Q63 601 63 616Q63 634 76 647T106 660Q109 660 111 660T115 659T119 658T124 655T132 650T141 643T153 634T170 622L214 591L212 617Q211 643 210 674T208 717",43:"56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250",44:"90 0V98H188V1L139 -125H89L104 -64Q119 -3 120 -2Q120 0 105 0H90",45:"11 186V259H277V186H11",46:"90 0V98H188V0H90",47:"423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750",58:"90 346V444H188V346H90ZM90 0V98H188V0H90",59:"90 346V444H188V346H90ZM90 0V98H188V1L139 -125H89L104 -64Q119 -3 120 -2Q120 0 105 0H90",61:"56 350Q56 363 70 370H707Q722 362 722 350Q722 339 708 331L390 330H72Q56 335 56 350ZM56 150Q56 165 72 170H708Q722 160 722 150Q722 138 707 130H70Q56 137 56 150",63:"55 652Q63 658 77 666T132 689T214 704T265 703Q303 698 332 684T376 653T401 615T413 578T416 546Q416 475 360 426Q325 396 303 365T273 303T263 256T261 216V186H183V225Q184 281 194 322Q206 368 232 409T276 469T306 495Q323 517 323 550Q323 596 297 612T223 629Q187 629 157 618Q122 607 91 583L83 576L55 652ZM173 0V98H271V0H173",64:"422 576Q440 576 456 573T480 566L488 563Q488 565 484 571T472 588T452 607T424 622T387 629Q294 629 220 550T146 347Q146 233 210 155T365 66Q376 65 400 65Q465 68 517 86L532 91H612L598 76Q511 -11 388 -11Q250 -11 153 93T56 347Q56 454 107 538T231 663T378 704Q446 704 492 680T564 608T599 506T611 376Q611 320 607 299Q595 227 546 173T422 118Q343 118 288 185T232 347Q232 444 287 510T422 576ZM520 347Q520 429 487 465T421 501Q385 501 354 461T323 347Q323 270 355 232T422 193Q454 193 487 229T520 347",91:"94 -250V750H266V674H181V-174H266V-250H94",93:"22 674V750H194V-250H22V-174H107V674H22",94:"146 612L212 694H287L353 612Q417 532 420 529Q421 528 418 527Q414 527 383 527H345L250 639Q244 633 199 580L154 527H116Q79 528 79 529Q82 532 146 612",95:"0 -114V-38H499V-114H0",126:"83 204Q86 254 113 290T186 327Q211 327 251 299T312 270Q337 270 340 315V327H416V316Q413 258 382 226T315 193Q289 193 249 221T187 250Q162 250 159 205V193H83V204",305:"74 0V444H164V0H74",567:"-35 -95Q-4 -126 34 -126Q58 -126 76 -116T100 -88Q102 -82 102 181V444H192V180Q191 -45 191 -70T184 -113Q171 -152 140 -178T63 -205Q34 -205 4 -197T-43 -181T-59 -171L-47 -133L-35 -95",768:"-415 692L-417 694H-324L-262 612Q-249 594 -233 572T-208 539L-200 528L-237 527H-275L-344 608Q-359 625 -378 647T-406 680T-415 692",769:"-239 612L-177 694H-84L-86 692Q-86 691 -95 681T-123 648T-157 608L-226 527H-264L-301 528L-293 539Q-285 550 -269 572T-239 612",770:"-354 612L-288 694H-213L-147 612Q-83 532 -80 529Q-79 528 -82 527Q-86 527 -117 527H-155L-250 639Q-256 633 -301 580L-346 527H-384Q-421 528 -421 529Q-418 532 -354 612",771:"-417 554Q-414 604 -387 640T-314 677Q-289 677 -249 649T-188 620Q-163 620 -160 665V677H-84V666Q-87 608 -118 576T-185 543Q-211 543 -251 571T-313 600Q-338 600 -341 555V543H-417V554",772:"-431 552V631H-70V552H-431",774:"-250 508Q-331 508 -379 567T-427 689V694H-351V685Q-348 649 -321 620T-250 591Q-206 591 -180 619T-150 685V694H-74V689Q-74 624 -122 566T-250 508",775:"-302 576V680H-198V576H-302",776:"-397 582V680H-299V582H-397ZM-202 582V680H-104V582H-202",778:"-319 611Q-319 649 -285 671T-211 694Q-164 694 -132 671T-99 611Q-99 572 -133 550T-209 527T-285 549T-319 611ZM-155 610Q-155 635 -171 643T-215 651Q-263 651 -263 610Q-263 570 -211 570H-209H-207Q-155 570 -155 610",779:"-250 693Q-317 544 -323 527H-399L-343 694H-296Q-250 694 -250 693ZM-84 693Q-151 544 -157 527H-233L-177 694H-130Q-84 694 -84 693",780:"-421 652Q-422 653 -419 654Q-415 654 -384 654H-346L-301 601Q-287 585 -275 571T-258 551T-250 542L-155 654H-117Q-80 653 -80 652Q-83 649 -147 569L-213 487H-288L-354 569Q-418 649 -421 652",913:"183 181Q183 179 152 91T118 0H28L154 346L280 693Q281 694 333 694H385L511 349Q636 4 638 2Q638 0 584 0H530L464 183H184L183 181ZM324 606Q319 578 292 492T238 332T210 256Q210 254 324 254T438 255L429 281L419 308Q409 336 395 378T365 465T339 551T324 611V606",914:"425 363Q438 363 465 353T526 324T585 270T610 192Q610 132 561 78T426 7Q404 2 387 2T240 0H90V694H227Q373 693 396 689Q484 673 533 623T583 517Q583 494 574 473T551 437T520 409T487 388T456 374T433 366L425 363ZM490 516Q490 527 485 539T467 568T423 599T347 621Q340 622 262 623H188V399H261H286Q432 399 478 475Q490 496 490 516ZM514 190Q514 245 462 280T343 322Q336 323 259 323H188V71H274Q365 72 388 77Q445 88 479 121T514 190",915:"87 0V691H499V611H345L191 612V0H87",916:"203 348L362 694H470L629 348Q789 2 790 1Q790 0 416 0T42 1Q43 2 203 348ZM630 98Q630 100 584 198T481 422T407 603L405 610L403 600Q388 544 191 122L180 99L405 98H630",917:"86 0V691H541V611H366L190 612V397H513V321H190V85H372L554 86V0H86",918:"69 617V694H555V643L373 362Q190 81 190 79H234Q244 79 272 79T344 80T419 81H560V0H55V53L237 334Q420 615 420 617Q413 618 387 618Q380 618 334 618T245 617H69",919:"86 0V694H190V399H517V694H621V0H517V323H190V0H86",920:"56 344Q56 430 86 502T164 619T271 690T388 716Q448 716 506 691T613 619T692 501T722 344Q722 188 624 84T389 -21Q252 -21 154 83T56 344ZM624 345Q624 423 597 488T513 596T380 639Q343 639 305 621T232 568T175 475T153 344Q153 216 222 136T388 56Q487 56 555 138T624 345ZM209 299V397H568V299H209",921:"87 0V694H191V0H87",922:"88 0V694H188V519L189 343L525 694H638L375 419L651 0H541L309 351L188 225V0H88",923:"294 606Q294 574 252 430T163 144T117 0H72Q28 0 28 1T141 348L254 694H357L469 348Q582 2 582 1T527 0L473 1L469 11Q469 13 427 141T343 411T296 599L294 610V606",924:"92 0V694H228L233 680Q236 675 284 547T382 275T436 106Q446 149 497 292T594 558L640 680L645 694H782V0H689V305L688 606Q688 577 500 78L479 23H392L364 96Q364 97 342 156T296 280T246 418T203 544T186 609V588Q185 568 185 517T185 427T185 305V0H92",925:"88 0V694H235L252 659Q261 639 364 428T526 84V694H619V0H472L455 35Q453 39 330 294T185 601L181 611V0H88",926:"47 600V688H619V600H47ZM111 314V401H555V314H111ZM42 0V88H624V0H42",927:"55 345Q55 504 149 609T361 715Q386 715 406 713Q521 696 600 592T680 344Q680 193 590 86T368 -22Q239 -22 147 84T55 345ZM276 59T368 59T518 146T576 360Q576 473 525 545T401 634Q371 637 362 637Q284 637 222 562T159 360T217 147",928:"86 0V691H621V0H517V615H190V0H86",929:"88 0V694H230Q347 693 370 692T410 686Q487 667 535 611T583 485Q583 409 527 348T379 276Q369 274 279 274H192V0H88ZM486 485Q486 523 471 551T432 593T391 612T357 621Q350 622 268 623H189V347H268Q350 348 357 349Q370 351 383 354T416 368T450 391T475 429T486 485",931:"55 0Q56 3 171 167T288 332Q288 334 172 474L55 615V694H666V614H428L190 615L412 347L322 218Q236 97 228 84L447 85H666V0H55",932:"36 608V688H644V608H518L392 609V0H288V609L162 608H36",933:"55 565Q59 625 105 670T219 716H222Q310 716 353 627Q376 583 386 524L389 510L393 532Q397 555 407 584T433 644T482 695T557 716Q621 716 669 673T722 565V555H629V563Q627 592 607 615T557 638Q530 638 511 629T479 598T459 553T447 488T442 411T441 319V202V0H337V202Q337 453 331 497Q313 634 226 638Q185 638 167 612T148 563V555H55V565",934:"666 347Q666 326 661 302T638 247T594 190T520 140T413 107H410V0H312V54Q312 107 311 107Q286 107 229 128T125 192Q55 260 55 347Q55 396 77 438T131 507T200 552T265 579T311 587Q312 587 312 641V694H410V587H413Q476 576 524 552T598 502T640 444T661 390T666 347ZM310 510Q305 510 291 507T252 492T208 464T172 416T157 347T171 279T204 233T247 205T286 190T310 184H312V347Q312 510 310 510ZM564 347Q564 385 549 416T514 463T470 491T433 505T414 509L410 510V184Q413 184 426 187T464 200T510 227T548 275T564 347",935:"14 0Q16 5 144 184T275 367L153 528Q121 571 88 615T42 674T28 694H150L228 584Q315 463 316 461L326 448L497 694H610L609 692Q606 689 492 528Q440 454 409 410T378 366Q378 365 515 182L652 0H531L326 292Q326 293 299 254T226 146L128 0H14",936:"340 187V694H438V187Q481 206 495 219Q518 239 533 267T553 332T560 386T562 435Q562 576 593 608Q608 621 637 621H670H722V545H719Q718 545 715 545T710 544Q679 536 666 487Q664 474 662 429T654 344T633 259T580 175T486 119Q450 109 438 108V0H340V108L326 110Q122 149 117 415Q116 460 111 487Q98 536 67 544Q65 544 62 544T58 545H55V621H107Q160 621 163 620Q191 613 202 573Q213 536 213 473T220 351T256 249Q262 239 270 230T285 216T301 205T316 197T329 192T340 187",937:"55 462Q55 561 141 638T359 716Q492 716 579 640T666 462Q666 407 642 347T579 222T529 126Q515 91 515 86Q517 85 528 85Q530 85 552 85T596 86H677V0H425V14Q429 79 465 168L492 228Q494 232 504 254T516 283T527 310T539 340T548 368T556 399T560 428T562 460Q562 531 510 585T361 639Q263 639 211 585T159 460Q159 422 170 378T192 309T229 228L256 168Q292 79 296 14V0H44V86H125Q146 86 168 86T193 85L206 86Q206 103 183 148T131 241T79 352T55 462",8211:"0 236V312H499V236H0",8212:"0 236V312H999V236H0",8213:"0 236V312H999V236H0",8215:"0 -114V-38H499V-114H0",8216:"90 568L140 694H189L174 633Q159 572 158 571Q158 569 173 569H188V471H90V568",8217:"90 596V694H188V597L139 471H89L104 532Q119 593 120 594Q120 596 105 596H90",8220:"174 568L224 694H273L258 633Q243 572 242 571Q242 569 257 569H272V471H174V568ZM368 568L418 694H467L452 633Q437 572 436 571Q436 569 451 569H466V471H368V568",8221:"33 596V694H131V597L82 471H32L47 532Q62 593 63 594Q63 596 48 596H33ZM227 596V694H325V597L276 471H226L241 532Q256 593 257 594Q257 596 242 596H227",8260:"423 750Q432 750 438 744T444 730Q444 725 271 248T92 -240Q85 -250 75 -250Q68 -250 62 -245T56 -231Q56 -221 230 257T407 740Q411 750 423 750",8710:"203 348L362 694H470L629 348Q789 2 790 1Q790 0 416 0T42 1Q43 2 203 348ZM630 98Q630 100 584 198T481 422T407 603L405 610L403 600Q388 544 191 122L180 99L405 98H630"},{})},1325:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.scriptBold=void 0;var n=r(5649);Object.defineProperty(e,"scriptBold",{enumerable:!0,get:function(){return n.scriptBold}})},4164:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.script=void 0;var n=r(7153);Object.defineProperty(e,"script",{enumerable:!0,get:function(){return n.script}})},8652:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.smallop=void 0;var n=r(768),o=r(5745);e.smallop=(0,n.AddPaths)(o.smallop,{40:"152 251Q152 646 388 850H416Q422 844 422 841Q422 837 403 816T357 753T302 649T255 482T236 250Q236 124 255 19T301 -147T356 -251T403 -315T422 -340Q422 -343 416 -349H388Q359 -325 332 -296T271 -213T212 -97T170 56T152 251",41:"305 251Q305 -145 69 -349H56Q43 -349 39 -347T35 -338Q37 -333 60 -307T108 -239T160 -136T204 27T221 250T204 473T160 636T108 740T60 807T35 839Q35 850 50 850H56H69Q197 743 256 566Q305 425 305 251",47:"481 838Q489 850 500 850Q508 850 515 844T522 827Q521 824 311 248T96 -337Q90 -349 77 -349Q68 -349 62 -343T55 -326Q56 -323 266 253T481 838",91:"202 -349V850H394V810H242V-309H394V-349H202",92:"522 -326Q522 -337 515 -343T500 -349Q487 -349 481 -337Q477 -328 267 248T55 827Q54 835 60 842T76 850Q89 850 96 838Q100 829 310 253T522 -326",93:"22 810V850H214V-349H22V-309H174V810H22",123:"477 -343L471 -349H458Q432 -349 367 -325T273 -263Q258 -245 250 -212L249 -51Q249 -27 249 12Q248 118 244 128Q243 129 243 130Q220 189 121 228Q109 232 107 235T105 250Q105 256 105 257T105 261T107 265T111 268T118 272T128 276T142 283T162 291Q224 324 243 371Q243 372 244 373Q248 384 249 469Q249 475 249 489Q249 528 249 552L250 714Q253 728 256 736T271 761T299 789T347 816T422 843Q440 849 441 849H443Q445 849 447 849T452 850T457 850H471L477 844V830Q477 820 476 817T470 811T459 807T437 801T404 785Q353 760 338 724Q333 710 333 550Q333 526 333 492T334 447Q334 393 327 368T295 318Q257 280 181 255L169 251L184 245Q318 198 332 112Q333 106 333 -49Q333 -209 338 -223Q351 -255 391 -277T469 -309Q477 -311 477 -329V-343",125:"110 849L115 850Q120 850 125 850Q151 850 215 826T309 764Q324 747 332 714L333 552Q333 528 333 489Q334 383 338 373Q339 372 339 371Q353 336 391 310T469 271Q477 268 477 251Q477 241 476 237T472 232T456 225T428 214Q357 179 339 130Q339 129 338 128Q334 117 333 32Q333 26 333 12Q333 -27 333 -51L332 -212Q328 -228 323 -240T302 -271T255 -307T175 -338Q139 -349 125 -349T108 -346T105 -329Q105 -314 107 -312T130 -304Q233 -271 248 -209Q249 -203 249 -49V57Q249 106 253 125T273 167Q307 213 398 245L413 251L401 255Q265 300 250 389Q249 395 249 550Q249 710 244 724Q224 774 112 811Q105 813 105 830Q105 845 110 849",710:"279 669Q273 669 142 610T9 551L0 569Q-8 585 -8 587Q-8 588 -7 588L12 598Q30 608 66 628T136 666L277 744L564 587L555 569Q549 556 547 554T544 552Q539 555 410 612T279 669",732:"374 597Q337 597 269 627T160 658Q101 658 34 606L24 597L12 611Q1 624 1 626Q1 627 27 648T55 671Q120 722 182 722Q219 722 286 692T395 661Q454 661 521 713L531 722L543 708Q554 695 554 693Q554 692 528 671T500 648Q434 597 374 597",770:"-277 669Q-283 669 -414 610T-547 551L-556 569Q-564 585 -564 587Q-564 588 -563 588L-544 598Q-526 608 -490 628T-420 666L-279 744L8 587L-1 569Q-7 556 -9 554T-12 552Q-17 555 -146 612T-277 669",771:"-182 597Q-219 597 -287 627T-396 658Q-455 658 -522 606L-532 597L-544 611Q-555 624 -555 626Q-555 627 -529 648T-501 671Q-436 722 -374 722Q-337 722 -270 692T-161 661Q-102 661 -35 713L-25 722L-13 708Q-2 695 -2 693Q-2 692 -28 671T-56 648Q-122 597 -182 597",8214:"257 0V602H300V0H257ZM478 0V602H521V0H478",8260:"481 838Q489 850 500 850Q508 850 515 844T522 827Q521 824 311 248T96 -337Q90 -349 77 -349Q68 -349 62 -343T55 -326Q56 -323 266 253T481 838",8593:"112 421L120 424Q127 427 136 430T161 441T191 458T224 481T260 510T295 546T328 591L333 600L340 589Q380 527 431 489T555 421V377L543 381Q445 418 368 492L355 504V0H312V504L299 492Q222 418 124 381L112 377V421",8595:"312 96V600H355V96L368 108Q445 182 543 219L555 223V179L546 176Q538 173 529 169T505 158T475 141T442 119T407 90T372 53T339 9L334 0L327 11Q287 73 236 111T112 179V223L124 219Q222 182 299 108L312 96",8657:"142 329Q300 419 389 599Q389 598 399 579T420 541T452 494T497 438T558 383T636 329T708 294L721 289V246Q718 246 694 256T623 293T532 356L522 364L521 182V0H478V405L466 417Q436 450 389 516Q388 515 378 500T352 463T312 417L300 405V0H257V364L247 356Q202 320 155 293T82 256L57 246V289L70 294Q101 305 142 329",8659:"257 236V600H300V195L312 183Q342 150 389 84Q390 85 400 100T426 137T466 183L478 195V600H521V418L522 236L532 244Q576 280 623 307T696 344L721 354V311L708 306Q677 295 636 271Q478 181 389 1Q389 2 379 21T358 59T326 106T281 162T220 217T142 271T70 306L57 311V354Q60 354 83 345T154 308T247 244L257 236",8719:"158 656Q147 684 131 694Q110 707 69 710H55V750H888V710H874Q840 708 820 698T795 678T786 656V-155Q798 -206 874 -210H888V-250H570V-210H584Q618 -208 638 -197T663 -178T673 -155V710H270V277L271 -155Q283 -206 359 -210H373V-250H55V-210H69Q103 -208 123 -197T148 -178T158 -155V656",8720:"158 656Q147 684 131 694Q110 707 69 710H55V750H373V710H359Q325 708 305 698T280 678T271 656L270 223V-210H673V656Q666 672 663 679T639 697T584 710H570V750H888V710H874Q840 708 820 698T795 678T786 656V-155Q798 -206 874 -210H888V-250H55V-210H69Q103 -208 123 -197T148 -178T158 -155V656",8721:"61 748Q64 750 489 750H913L954 640Q965 609 976 579T993 533T999 516H979L959 517Q936 579 886 621T777 682Q724 700 655 705T436 710H319Q183 710 183 709Q186 706 348 484T511 259Q517 250 513 244L490 216Q466 188 420 134T330 27L149 -187Q149 -188 362 -188Q388 -188 436 -188T506 -189Q679 -189 778 -162T936 -43Q946 -27 959 6H999L913 -249L489 -250Q65 -250 62 -248Q56 -246 56 -239Q56 -234 118 -161Q186 -81 245 -11L428 206Q428 207 242 462L57 717L56 728Q56 744 61 748",8730:"263 249Q264 249 315 130T417 -108T470 -228L725 302Q981 837 982 839Q989 850 1001 850Q1008 850 1013 844T1020 832V826L741 243Q645 43 540 -176Q479 -303 469 -324T453 -348Q449 -350 436 -350L424 -349L315 -96Q206 156 205 156L171 130Q138 104 137 104L111 130L263 249",8739:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612",8741:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612ZM368 612Q373 627 388 627Q404 627 409 612Q410 610 410 306T409 0Q406 -15 389 -15Q371 -15 368 0V10Q368 19 368 35T368 73T368 122T367 179T367 241T367 306T367 370T367 433T367 489T368 538T368 576T368 602V612",8747:"113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q220 -247 232 -218T251 -133T262 -15T276 155T297 367Q300 390 305 438T314 512T325 580T340 647T361 703T390 751T428 784T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q475 768 460 756T434 716T418 652T407 559T398 444T387 300T369 133Q349 -38 337 -102T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244",8748:"113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q220 -247 232 -218T251 -133T262 -15T276 155T297 367Q300 390 305 438T314 512T325 580T340 647T361 703T390 751T428 784T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q475 768 460 756T434 716T418 652T407 559T398 444T387 300T369 133Q349 -38 337 -102T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244ZM460 -244Q460 -246 466 -251T486 -263T514 -269Q532 -269 546 -260Q567 -247 579 -218T598 -133T609 -15T623 155T644 367Q647 390 652 438T661 512T672 580T687 647T708 703T737 751T775 784T826 804Q828 804 835 804T848 805Q899 802 928 769T957 695Q957 669 941 657T908 645Q889 645 874 658T859 694Q859 705 863 714T873 729T885 737T895 742L899 743Q899 745 892 751T872 762T845 768Q822 768 807 756T781 716T765 652T754 559T745 444T734 300T716 133Q696 -38 684 -102T650 -207Q603 -306 516 -306Q466 -306 434 -272T402 -196Q402 -170 418 -158T451 -146Q470 -146 485 -159T500 -195Q500 -206 496 -215T486 -230T474 -238T464 -242L460 -244",8749:"113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q220 -247 232 -218T251 -133T262 -15T276 155T297 367Q300 390 305 438T314 512T325 580T340 647T361 703T390 751T428 784T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q475 768 460 756T434 716T418 652T407 559T398 444T387 300T369 133Q349 -38 337 -102T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244ZM460 -244Q460 -246 466 -251T486 -263T514 -269Q532 -269 546 -260Q567 -247 579 -218T598 -133T609 -15T623 155T644 367Q647 390 652 438T661 512T672 580T687 647T708 703T737 751T775 784T826 804Q828 804 835 804T848 805Q899 802 928 769T957 695Q957 669 941 657T908 645Q889 645 874 658T859 694Q859 705 863 714T873 729T885 737T895 742L899 743Q899 745 892 751T872 762T845 768Q822 768 807 756T781 716T765 652T754 559T745 444T734 300T716 133Q696 -38 684 -102T650 -207Q603 -306 516 -306Q466 -306 434 -272T402 -196Q402 -170 418 -158T451 -146Q470 -146 485 -159T500 -195Q500 -206 496 -215T486 -230T474 -238T464 -242L460 -244ZM807 -244Q807 -246 813 -251T833 -263T861 -269Q880 -269 893 -260Q914 -247 926 -218T945 -133T956 -15T970 155T991 367Q994 390 999 438T1008 512T1019 580T1034 647T1055 703T1084 751T1122 784T1173 804Q1175 804 1182 804T1195 805Q1246 802 1275 769T1304 695Q1304 669 1288 657T1255 645Q1236 645 1221 658T1206 694Q1206 705 1210 714T1220 729T1232 737T1242 742L1246 743Q1246 745 1239 751T1219 762T1192 768Q1169 768 1154 756T1128 716T1112 652T1101 559T1092 444T1081 300T1063 133Q1043 -38 1031 -102T997 -207Q950 -306 863 -306Q813 -306 781 -272T749 -196Q749 -170 765 -158T798 -146Q817 -146 832 -159T847 -195Q847 -206 843 -215T833 -230T821 -238T811 -242L807 -244",8750:"269 74L256 80Q244 85 227 97T191 128T161 179T148 250Q148 332 199 379T302 433L306 434L307 444Q309 456 313 495T321 553T331 607T345 664T365 712T393 756T431 785T479 804Q481 804 488 804T501 805Q552 802 581 769T610 695Q610 669 594 657T561 645Q542 645 527 658T512 694Q512 705 516 714T526 729T538 737T548 742L552 743Q552 745 545 751T525 762T498 768Q471 768 454 752T427 693T414 626T406 536Q405 530 405 527L397 425L404 422Q410 419 421 413T445 399T470 376T494 345T511 303T518 250Q518 205 502 169T460 112T410 80T364 66L360 65L359 55Q357 38 353 4T346 -43T340 -81T333 -118T326 -148T316 -179T303 -207Q256 -306 169 -306Q119 -306 87 -272T55 -196Q55 -170 71 -158T104 -146Q123 -146 138 -159T153 -195Q153 -206 149 -215T139 -230T127 -238T117 -242L113 -244Q113 -246 119 -251T139 -263T167 -269Q186 -269 199 -260Q231 -241 242 -183T266 33L269 74ZM272 122Q272 156 300 391Q300 392 299 392Q287 392 263 379T213 331T187 249Q187 211 205 180T239 137T272 116V122ZM366 107Q378 107 402 119T453 167T479 249Q479 340 394 383V377Q394 375 394 374T393 371T393 366T392 357T391 342T389 321T386 291T382 251T377 199T369 133Q366 112 366 107",8896:"119 -249T97 -249T65 -235T55 -207Q55 -201 56 -198Q58 -190 218 268T380 729Q392 750 416 750Q438 750 451 732Q453 728 534 498T695 36L775 -194Q777 -204 777 -208Q777 -222 767 -235T735 -249Q713 -249 700 -231Q696 -225 557 177L416 579L276 177Q136 -226 132 -231Q119 -249 97 -249",8897:"55 708Q55 729 68 739T96 750Q119 750 132 731Q136 726 276 323L416 -79L557 323Q696 725 700 731Q713 749 735 749Q756 749 766 736T777 708Q777 700 696 466T533 1T451 -232Q436 -249 416 -249Q402 -249 391 -241Q384 -236 380 -226Q368 -198 219 230Q55 697 55 708",8898:"139 -217Q127 -241 114 -246Q106 -249 97 -249Q67 -249 57 -220Q55 -214 55 102Q55 152 55 221T54 312Q54 422 60 464T91 554Q120 612 165 654T257 714T337 741T392 749Q393 750 402 750Q414 750 422 749Q557 749 660 659T776 430Q777 422 777 102Q777 -214 775 -220Q765 -249 735 -249Q716 -249 708 -241T694 -217L692 428L690 441Q674 540 597 603T416 666H409Q388 666 364 662T294 638T212 581Q156 523 142 441L140 428L139 105V-217",8899:"96 750Q103 750 109 748T120 744T127 737T133 730T137 723T139 718V395L140 73L142 60Q159 -43 237 -104T416 -166Q521 -166 597 -103T690 60L692 73L694 718Q708 749 735 749Q765 749 775 720Q777 714 777 398Q777 78 776 71Q766 -51 680 -140Q571 -249 416 -249H411Q261 -249 152 -140Q66 -51 56 71Q55 78 55 398Q55 714 57 720Q60 734 70 740Q80 750 96 750",8968:"202 -349V850H449V810H242V-349H202",8969:"22 810V850H269V-349H229V810H22",8970:"202 -349V850H242V-309H449V-349H202",8971:"229 -309V850H269V-349H22V-309H229",9001:"373 850Q392 850 394 832Q394 825 267 538L139 250L267 -38Q394 -325 394 -332Q392 -350 375 -350Q361 -350 356 -338Q354 -331 289 -186T161 103T97 250T160 397T289 685T356 838Q362 850 373 850",9002:"77 832Q77 837 82 843T98 850Q110 849 115 838Q117 831 182 686T310 397T374 250T311 103T182 -185T115 -338Q110 -350 96 -350Q79 -350 77 -332Q77 -325 204 -38L332 250L204 538Q77 825 77 832",9168:"312 0V602H355V0H312",10072:"146 612Q151 627 166 627Q182 627 187 612Q188 610 188 306T187 0Q184 -15 166 -15Q149 -15 146 0V10Q146 19 146 35T146 73T146 122T145 179T145 241T145 306T145 370T145 433T145 489T146 538T146 576T146 602V612",10216:"373 850Q392 850 394 832Q394 825 267 538L139 250L267 -38Q394 -325 394 -332Q392 -350 375 -350Q361 -350 356 -338Q354 -331 289 -186T161 103T97 250T160 397T289 685T356 838Q362 850 373 850",10217:"77 832Q77 837 82 843T98 850Q110 849 115 838Q117 831 182 686T310 397T374 250T311 103T182 -185T115 -338Q110 -350 96 -350Q79 -350 77 -332Q77 -325 204 -38L332 250L204 538Q77 825 77 832",10752:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM555 -165Q672 -165 767 -108T916 44T970 250Q970 418 861 532T600 664Q591 665 548 665Q446 665 353 614T200 466T140 250V243Q140 88 248 -30Q262 -46 280 -62T338 -105T434 -148T555 -165ZM478 250Q478 288 503 307T551 326Q586 326 609 305T632 250Q632 217 610 196T555 174T500 196T478 250",10753:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM513 478Q513 664 512 664Q504 664 481 660T406 637T313 588Q281 564 255 537T211 483T181 431T161 382T150 342T144 310T141 292H513V478ZM798 588Q758 616 711 634T639 658T602 663L597 664V292H969Q969 293 967 309T960 341T949 381T930 430T900 482T856 537T798 588ZM513 -164V208H141Q142 205 144 189T149 160T158 125T173 83T196 39T229 -9Q249 -34 273 -55T318 -92T363 -119T405 -138T444 -150T475 -158T499 -162T513 -164ZM775 -103Q801 -87 823 -68T863 -30T894 10T919 49T937 88T950 123T959 154T964 180T968 198L969 208H597V-164Q599 -163 616 -161T647 -155T683 -145T728 -128T775 -103",10754:"555 -250Q420 -250 306 -185T124 -4T56 250Q56 453 193 595T526 749Q528 750 539 750Q554 750 562 749Q688 749 800 687T983 508T1054 250Q1054 112 987 -3T806 -184T555 -250ZM600 664Q591 665 548 665Q414 665 306 583L292 573L423 441L555 310L687 441L818 573L804 583Q714 650 600 664ZM364 118L495 250L364 382L232 513L223 500Q140 391 140 250Q140 107 223 0L232 -13L364 118ZM970 250Q970 389 887 501L878 512Q878 513 861 496T812 447T746 381L615 250L746 118L878 -13L887 0Q970 109 970 250ZM687 59L555 190L423 59L292 -73L306 -83Q416 -166 555 -166T804 -83L818 -73L687 59",10756:"96 750Q103 750 109 748T120 744T127 737T133 730T137 723T139 718V395L140 73L142 60Q159 -43 237 -104T416 -166Q521 -166 597 -103T690 60L692 73L694 718Q708 749 735 749Q765 749 775 720Q777 714 777 398Q777 78 776 71Q766 -51 680 -140Q571 -249 416 -249H411Q261 -249 152 -140Q66 -51 56 71Q55 78 55 398Q55 714 57 720Q60 734 70 740Q80 750 96 750ZM223 276Q223 282 224 287T227 296T232 302T238 308T243 313T250 316L254 319H374V376V406Q374 438 382 454T418 470Q443 467 450 453T458 410V376V319H579Q580 319 583 317T589 313T594 308T600 302T604 295T608 287T609 276Q609 253 587 241Q577 235 513 235H458V178Q458 176 458 166T459 148Q459 84 415 84Q401 84 390 93T375 117Q374 120 374 178V235H319Q317 235 307 235T290 234Q223 234 223 276",10758:"777 -217Q766 -244 745 -249H88Q64 -242 57 -220Q55 -214 55 250T57 720Q60 734 70 740Q80 750 96 750Q127 750 137 720Q139 714 139 274V-166H693V274Q693 714 695 720Q705 749 735 749Q766 749 775 719Q777 713 777 248V-217",12296:"373 850Q392 850 394 832Q394 825 267 538L139 250L267 -38Q394 -325 394 -332Q392 -350 375 -350Q361 -350 356 -338Q354 -331 289 -186T161 103T97 250T160 397T289 685T356 838Q362 850 373 850",12297:"77 832Q77 837 82 843T98 850Q110 849 115 838Q117 831 182 686T310 397T374 250T311 103T182 -185T115 -338Q110 -350 96 -350Q79 -350 77 -332Q77 -325 204 -38L332 250L204 538Q77 825 77 832"},{10764:"\u222c\u222c"})},5667:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texCalligraphicBold=void 0;var n=r(768),o=r(1411);e.texCalligraphicBold=(0,n.AddPaths)(o.texCalligraphicBold,{65:"761 751Q784 751 784 728V711Q784 570 795 417T820 191Q844 76 865 76Q868 76 902 93T962 112H973Q989 104 989 94Q989 92 987 86Q978 47 846 -11Q812 -25 779 -26Q722 -26 708 9Q688 47 669 161H524L379 162L359 136Q286 43 234 -3T142 -49T71 -19T39 55Q39 92 60 131T103 174Q113 174 117 167T124 149T136 128T166 110Q183 105 190 105Q230 105 341 246Q401 322 453 397T531 514T582 601T611 651H640V663Q640 692 676 718T745 750Q747 750 752 750T761 751ZM658 266Q653 312 649 377T644 489T641 541V556L557 415Q500 325 448 253Q467 261 524 261H568H658V266",66:"441 83Q571 83 571 195Q571 246 538 279T466 322T386 333Q378 333 357 330T329 327Q307 327 307 345Q307 354 313 365T347 396T419 430Q546 472 581 498Q594 508 594 535Q594 574 567 589T508 604Q469 604 442 583Q390 546 342 457T265 256Q237 148 186 60Q167 29 144 13Q105 -15 68 -17H65Q40 -17 40 1Q40 7 53 29T87 100T124 210Q162 373 190 575Q188 575 174 567T138 550T98 542Q75 542 75 560Q75 588 123 618Q135 625 203 659T281 696Q299 703 316 703Q339 703 339 685Q339 656 328 583L333 588Q338 592 346 599T367 615T394 634T428 654T467 674T511 690T559 701T611 705Q651 704 681 689Q739 659 739 598Q739 507 595 427L584 421Q585 420 595 416T610 410T626 402T644 392T660 380T677 365T691 347T703 325T710 299T715 268Q717 193 665 130Q622 73 531 28T348 -17Q275 -17 225 10Q206 19 200 24T193 36Q193 57 231 86T311 119H322Q386 83 441 83",67:"243 -20Q135 -20 78 48T20 218Q20 280 39 344T98 470T193 580T324 661T488 702H490Q491 702 493 702T498 703T507 703T518 702H526Q599 702 599 631Q599 597 577 550T541 486Q523 463 490 447T431 430Q423 430 419 433Q409 437 409 450Q410 456 432 499T454 567Q454 586 446 594T415 603Q316 603 254 532Q216 487 190 421T164 284Q164 228 181 186T226 122T282 90T340 80Q377 80 405 96T449 131T492 167T553 187H555Q580 187 580 168Q580 153 551 123T476 60T367 4T243 -20",68:"107 0Q92 5 92 18Q92 33 113 53T160 86Q170 91 182 94T197 100L206 120Q248 226 273 337T304 501T309 585Q278 585 234 577T179 557Q172 550 166 532T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q281 686 447 686H480H517Q692 686 784 631Q885 571 885 450Q885 339 805 239T586 75T286 1Q276 0 187 0H107ZM741 391Q741 424 731 452T694 510T613 558T481 584Q476 584 468 584T457 585L449 586V579Q441 501 425 424T391 292T357 193T330 125T319 100H324Q511 100 628 175Q688 215 714 275T741 391",69:"495 516Q485 516 478 520T470 532Q470 537 476 550T482 570Q482 589 465 596T401 603Q344 603 319 582Q295 558 295 519Q295 493 312 474T355 445T407 432T455 427Q477 427 477 409Q477 395 453 371T389 333Q380 330 345 327T279 312T223 272Q181 223 181 176Q181 131 225 107T324 83Q366 83 395 98T448 136T487 167Q517 185 547 187H551Q574 187 574 170Q574 151 535 113T421 36T271 -15Q260 -16 226 -16Q181 -16 152 -9Q104 4 71 33T37 111Q37 140 50 176T106 263T216 356Q215 357 207 362T190 374T172 392T156 419T150 456Q150 521 208 580T341 670T474 702Q475 703 499 703Q528 703 547 701T586 693T615 673T627 637Q627 584 581 550T495 516",70:"812 567Q804 567 795 570T786 579Q786 586 647 586H559L558 582Q558 575 539 510T506 407L498 384H775Q788 378 790 368Q790 328 746 298T665 268Q646 268 642 284H457L447 261Q396 150 360 94Q329 46 270 8T149 -30Q123 -30 100 -24T63 -10T37 9T22 26T17 36Q17 59 56 88T135 119Q145 119 149 117T165 104Q187 78 227 72Q232 72 234 76Q245 93 273 145T350 323T424 570L428 586H276Q265 575 239 563T190 551Q180 551 174 556T167 569Q167 580 179 597T213 634T278 668T371 685Q374 686 624 686Q863 685 888 682Q917 678 927 663Q930 658 930 650Q930 624 888 596T812 567",71:"50 279Q50 361 88 438T190 570T335 661T503 702H514Q524 703 532 703Q671 703 671 626Q671 580 614 514T495 447Q472 447 472 465Q472 477 499 511T527 562Q527 582 507 592T433 602Q351 602 302 569Q252 535 223 469T194 344Q194 266 237 217T352 168Q401 168 442 205T505 316Q515 345 551 368T622 393H625Q649 393 649 376Q649 371 635 318T612 237Q580 129 540 62T442 -49Q353 -114 264 -114Q259 -114 252 -114L246 -113Q190 -113 142 -107T81 -96Q71 -90 71 -81Q71 -57 110 -30T187 2Q196 2 236 -4T338 -14Q371 -14 377 -9Q410 24 446 113L451 127Q353 68 253 68Q157 68 104 129T50 279",72:"42 447Q20 447 20 465Q20 481 47 515T119 589T239 657T392 686Q443 686 463 664T484 616Q484 570 473 506T452 401L441 360Q441 359 550 359H660L663 370Q684 435 716 522T758 624Q771 646 806 666T870 686Q894 686 894 668Q894 667 867 597T804 416T752 218Q737 135 737 93Q737 77 746 65T778 53Q799 53 803 54T814 63Q831 86 864 103T924 120Q946 120 946 100Q945 85 931 63T888 16T806 -27T684 -48H681Q625 -48 603 -10Q593 4 593 29Q593 71 603 131T624 230L634 269Q632 269 624 266Q610 261 600 261T507 259H411L399 222Q344 62 322 21Q301 -7 268 -24T209 -41H207Q187 -41 185 -25Q185 -17 192 2T220 71T261 184Q284 256 284 258Q284 259 227 259H170Q169 259 166 261T162 264T158 266T156 271T155 277Q155 296 184 320T250 356Q259 358 286 359Q312 359 312 360Q314 372 318 385Q332 450 339 526Q339 530 339 535T340 543Q340 586 296 586Q255 586 227 576T188 553T165 523T146 497Q127 476 97 462T42 447",73:"56 499Q32 499 32 516Q32 540 64 580T165 649Q241 682 365 685Q366 685 376 685T405 685T445 686T496 686T553 686H732Q746 677 746 668Q746 646 711 620T642 587L572 586H503Q479 546 458 479T424 352T383 224T318 111L309 101L412 100H514L523 109Q567 150 618 153Q644 153 644 135Q644 132 642 124Q629 86 581 52T476 6Q454 2 433 2T216 0Q-11 0 -15 2Q-27 6 -27 18Q-27 37 2 61T59 93Q77 100 142 100H198Q255 177 299 369Q337 513 382 574L391 586H348Q261 586 176 576Q163 543 124 521T56 499",74:"286 390Q263 390 263 407Q263 432 293 481T367 566Q511 687 724 687Q738 687 761 687T793 686H923Q937 677 937 668Q937 648 905 623T842 589Q829 587 817 586T802 585T795 583T788 578Q709 506 632 189Q622 153 615 134T588 81T537 17Q482 -39 404 -76T247 -114Q192 -114 158 -100Q53 -61 53 32Q53 59 58 73T79 102Q126 147 177 147Q200 147 200 128Q200 123 198 112T196 96Q196 47 238 17T345 -13Q362 -13 377 -9T404 0T426 16T444 34T459 55T470 76T478 97T483 116T488 132L490 141Q511 222 520 257T554 364T608 486T675 576L685 586H634H612Q532 586 484 564Q453 549 436 526T409 478T395 447Q378 424 345 407T286 390",75:"98 542Q75 542 75 560Q75 588 123 618Q132 624 199 657T275 694Q291 703 315 703Q327 703 332 699T338 690T339 670Q339 596 323 505T283 337T237 194T198 90L181 53Q170 31 136 8T68 -17H65Q40 -17 40 0L76 92Q112 185 150 322T194 564V578L168 565Q125 542 98 542ZM834 142Q834 125 819 100T774 48T692 3T576 -16H560Q540 -16 508 6Q469 33 422 108T342 267T309 398Q309 411 310 417T320 442T347 482Q401 542 517 615T710 702Q712 702 721 702T735 703Q772 703 791 690Q819 674 819 646T792 597T733 574H722Q704 584 704 599Q706 607 700 610T672 617L660 613Q609 595 524 538T423 450V440Q423 376 488 247T604 83Q621 70 640 70Q677 70 701 82Q713 87 718 101T737 132T783 160Q792 163 807 163Q834 163 834 142",76:"63 -17Q41 -17 41 0Q41 22 85 54Q101 68 113 92T133 141T154 219T182 315Q230 462 306 553Q345 599 391 632T478 678T543 697T582 703Q584 703 589 703T598 702Q643 702 666 676T689 613Q689 588 683 575Q674 551 632 524T552 496Q530 496 530 512Q530 517 531 525T533 538Q533 559 522 577T480 596H476Q462 596 451 588T415 544Q350 447 310 281Q284 181 261 136L255 124H285Q342 123 441 107T583 90L596 89Q603 116 647 144T729 173Q751 173 751 157Q751 118 685 60T523 -15Q514 -16 479 -16Q421 -16 320 0T171 18H155L142 10Q98 -17 63 -17",77:"38 20Q38 59 60 99T104 139Q106 139 126 125T176 106H181Q200 106 221 139T286 281Q322 370 342 451T368 581T376 634Q384 657 420 680T487 703Q502 703 507 696T522 649Q538 589 554 537Q579 453 609 372T660 248T686 202Q687 201 739 244T830 322L1166 642Q1225 700 1230 701Q1230 701 1237 703Q1258 703 1258 667L1253 637Q1248 607 1241 558T1227 451T1214 326T1209 202Q1209 77 1232 77Q1237 77 1269 94T1326 112H1329Q1353 112 1353 94Q1353 81 1334 60Q1311 37 1248 7T1150 -24H1141H1135Q1085 -24 1074 26Q1064 75 1064 134Q1064 239 1086 426Q1087 430 1087 434L1061 410Q871 227 783 149L694 76Q653 44 647 40T631 34Q620 34 616 37T594 63Q546 125 514 198Q467 307 423 449L418 466L412 444Q376 310 306 153Q278 88 251 45T201 -18T163 -43T131 -49Q102 -48 70 -31T38 20",78:"47 139Q81 105 122 105Q137 105 147 117Q159 134 182 199T234 381T274 610Q275 634 284 647Q297 666 327 684T389 703Q403 703 408 695T428 645Q480 490 567 298Q628 163 673 103Q674 102 674 102T675 106Q732 331 803 551Q842 674 875 725Q908 775 966 807T1081 840H1084Q1105 840 1105 803Q1105 768 1088 733T1051 689Q1045 686 1032 686Q986 683 948 663T901 624Q881 579 837 430T760 154L726 28Q725 28 725 28T723 25Q716 0 682 -24T611 -48Q600 -48 595 -45T576 -23Q522 44 480 124Q417 243 332 463L328 473L325 457Q291 293 227 124Q159 -49 72 -49Q38 -49 5 -28Q-24 -8 -24 21Q-24 58 -3 98T41 139H47",79:"433 703Q456 703 456 685Q456 672 441 655T407 627Q402 623 378 611T328 579T276 524Q207 434 207 324Q207 222 270 153T441 84Q566 84 651 177T737 400V405Q737 496 693 549T576 603Q542 603 510 560Q490 537 472 502T442 454Q397 412 346 409Q320 409 320 427Q320 430 322 436Q331 465 360 507T433 594T542 671T677 703Q776 703 829 636T882 468Q882 369 831 277T702 122T528 21T343 -17Q214 -17 139 61T63 257Q63 336 94 409T173 534T272 625T367 684T432 703H433",80:"170 -67Q147 -67 147 -49Q147 -42 162 -8T204 99T253 254Q274 332 288 415T305 542L308 585Q277 585 234 577T179 557Q172 550 166 532T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q279 686 448 686H495H537Q622 686 678 677T784 637Q846 598 846 533Q846 452 776 375T597 252T378 206H366L358 181Q341 130 316 68T282 -7Q262 -33 230 -50T170 -67ZM701 468Q701 512 661 540T570 577T461 586H448V582Q446 576 443 545T428 447T395 301L389 280Q390 280 398 284T419 295T441 303Q443 304 484 306T572 321T651 359Q701 402 701 468",81:"874 453Q874 372 836 298T750 177T638 89T543 33T486 8L483 7Q485 5 523 -7T622 -32T726 -46Q741 -46 746 -45T755 -41T762 -27Q770 -1 806 23T878 50H890Q905 42 905 33Q905 -8 838 -68T670 -145Q662 -146 628 -146Q538 -146 389 -100T164 -50Q132 -50 132 -32T162 11T227 47Q231 48 286 51T394 62T518 100T641 180Q730 271 730 387Q730 478 673 540T520 602Q410 602 337 525T264 355Q264 284 310 244T420 203Q476 203 568 222Q594 222 594 204Q594 184 565 161T508 128Q433 103 316 103Q227 103 174 157T120 290Q120 382 182 471T343 620T548 697Q578 703 601 703Q604 703 611 703T623 702Q663 702 687 696Q760 679 817 618T874 453",82:"159 0Q159 5 172 34T205 114T245 229T284 386T309 575V585H304Q303 585 295 585T282 584Q233 579 207 570T175 553T165 531T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q279 686 448 686H505H582Q683 686 745 672T834 611Q842 594 842 565Q842 523 824 484T780 419T722 370T669 336T632 318L619 312L626 302Q640 279 667 227T696 172Q717 133 735 112T762 88T784 84Q824 84 872 118T957 153Q981 153 981 136Q981 114 937 78T820 13T684 -17Q646 -17 616 8T569 66T526 151T477 234Q461 256 446 265Q437 272 421 274Q400 274 400 291Q400 311 430 336T495 371Q496 371 543 374T627 392T681 436Q699 467 699 503Q699 550 644 568T471 586H449V582Q449 581 447 559T438 499T422 413T393 298T348 165Q313 73 296 45Q282 24 249 4T185 -17Q159 -17 159 0",83:"204 476Q204 525 248 577T372 666T539 703T674 683T721 612Q721 588 714 569Q704 547 669 524T601 499Q573 499 573 516Q573 521 575 527T577 543Q577 563 568 574T548 588L539 590Q490 603 444 603Q418 603 394 597T364 583Q348 567 348 533Q348 493 382 466T459 425T555 387T633 330Q662 292 662 249Q662 153 544 69T257 -16Q218 -16 208 -15Q118 1 64 46Q25 76 25 126Q25 185 82 235T203 290H207Q229 290 231 274Q231 243 180 213Q173 209 172 206T170 189T171 170T183 150T216 121Q273 83 356 83Q412 83 459 100Q493 111 507 141Q518 165 518 185Q518 208 506 228T478 262T437 288T398 306T360 320Q316 335 285 352T239 384T215 416T205 443T204 467V476",84:"61 462H59Q38 462 38 479Q38 528 109 594T289 683L304 685L837 687L846 693Q889 720 923 720Q947 720 947 702Q945 671 892 631T776 583Q774 583 772 583T769 582T766 582L764 581H758Q753 581 744 581T722 580T693 580T662 580H563L514 385Q507 355 493 299T475 225T460 172T443 119T426 76T402 24Q386 -11 355 -33T304 -61T266 -69Q242 -69 242 -50Q243 -45 253 -25T278 32T307 115L364 340Q405 511 413 538T436 580H207Q202 572 200 568T197 561T195 552T190 537Q176 511 135 487T61 462",85:"124 586Q107 586 74 569T15 552H13Q-10 552 -10 570Q-10 605 70 645T222 686Q283 686 283 631Q283 590 246 504T172 326T135 181Q135 130 157 107T205 83Q221 83 259 106Q347 165 453 301T604 548Q607 557 612 569T619 587T624 600T628 612T632 621T637 628T641 634T647 640T654 645T662 652Q706 686 748 686Q771 686 771 669Q771 656 754 614T700 467T630 229Q615 168 610 105Q610 88 617 78L641 90Q681 111 706 112Q733 112 733 95Q733 82 714 60Q694 40 633 10Q567 -23 532 -24Q507 -24 495 -17Q466 -4 466 32Q466 96 500 225Q277 -17 102 -17Q56 -17 23 17T-10 118Q-10 164 13 234T64 363T115 481T139 567Q139 586 124 586",86:"25 608Q25 628 60 657T148 686Q184 683 213 671T273 625T327 538T363 394T380 184L381 134L399 148Q503 226 574 302T667 415T689 467Q688 474 684 482T672 502T645 521T600 532Q576 532 576 567Q576 604 597 644T641 685H649Q701 685 737 648T774 545Q774 457 703 333T461 66Q397 13 332 -32T255 -77Q237 -77 237 -30V-23Q241 20 241 109Q241 483 115 569Q91 586 50 589Q25 589 25 608",87:"25 607Q25 629 62 657T142 686Q205 686 248 647T312 541T339 411T347 275Q347 249 345 203V189Q375 219 449 316T587 516Q629 584 629 587Q629 589 626 597T622 607Q622 629 658 656T732 686H744Q755 680 757 678Q757 677 769 649T799 577T835 475T874 339T904 183Q908 157 910 151L925 169Q997 252 1059 343T1121 474Q1120 498 1103 513T1059 532Q1036 532 1036 568Q1036 600 1053 636T1090 683L1097 686H1109Q1147 684 1176 652T1206 551Q1206 460 1131 320T897 7Q859 -33 840 -52T816 -74T804 -77Q788 -77 784 -32Q783 -28 783 -26Q774 108 744 239T691 436T665 501Q664 501 649 475T602 400T528 289T420 146T280 -15Q243 -56 231 -66T210 -77Q191 -77 191 -40Q191 -38 195 -4T204 91T209 217Q209 290 202 351T177 469T126 557T45 589Q25 589 25 607",88:"762 562Q762 579 737 584T711 604Q711 630 753 658T834 686Q864 686 885 669T906 627Q906 580 834 522T614 379L584 362V357Q585 354 589 315T597 233T603 183Q610 132 627 116T671 100Q678 100 704 113T754 126T778 107Q776 79 733 45T626 2Q615 1 578 1Q542 1 535 3Q521 7 510 15T491 31T477 54T467 78T460 108T456 137T452 170T449 201Q447 220 445 240T442 270L441 281Q435 281 357 233Q240 165 206 135Q200 128 200 124Q200 113 208 108T226 101T244 96T252 82Q252 61 214 31T129 1H120Q97 1 77 16T56 60Q56 105 133 168T414 345Q428 352 431 354T433 359Q422 493 414 522Q407 551 395 566T373 583T350 586H341L332 580Q290 560 265 560Q243 560 243 577Q243 585 248 596T269 624T306 653T365 676T447 686H456Q472 686 484 683T514 671T543 637T562 576Q565 557 570 501L577 437Q577 436 613 457T694 506T756 551Q762 558 762 562",89:"73 555Q49 555 49 573Q49 602 110 644T239 686Q319 686 376 624Q416 584 444 511T483 361T499 240T503 173Q503 165 504 165Q506 165 524 184T556 218Q631 297 674 377T718 485Q718 505 699 526Q673 552 628 552Q619 552 613 562T607 590Q607 617 621 645T658 685Q661 686 671 686Q718 686 757 652T797 545Q797 476 749 369T602 146Q500 29 371 -67T176 -164Q112 -164 74 -120T36 -29Q36 5 55 36T95 67Q104 67 108 59T115 39T128 12T154 -12Q183 -30 216 -30Q239 -30 305 7L361 44L367 49V54Q367 95 364 143T351 273T312 429T243 546Q206 581 156 588L146 581Q108 555 73 555",90:"622 574Q522 579 420 579H396Q373 579 364 574T351 550Q339 516 297 490T218 462Q195 462 195 479Q195 487 197 492Q218 565 313 625T509 685Q564 685 650 683T755 680Q787 680 807 683T831 686Q853 686 853 669Q853 657 826 626Q742 532 641 437L619 415L622 414Q626 414 631 414T642 414Q697 411 697 388Q697 367 670 345T607 323Q605 323 592 325T546 329H522L490 302Q457 274 400 226T289 136L260 113L318 112Q345 111 452 109T587 106H627Q650 143 656 170Q666 197 710 225T788 253Q811 253 811 237Q811 211 781 160T710 77Q619 0 515 0Q507 0 497 0T484 1Q434 1 319 3T177 6Q123 6 95 2Q83 2 71 0H68Q46 0 46 17Q46 28 58 44Q68 56 100 80T210 165T383 307L408 329H361L314 330Q297 338 297 350Q297 368 320 388T368 413Q375 415 441 415H506L647 555L664 574H622",305:"24 296Q24 305 34 328T63 380T115 430T187 452Q205 452 223 448T262 435T295 406T308 360Q308 345 287 290T240 170T207 87Q202 67 202 57Q202 42 215 42Q235 42 257 64Q288 92 302 140Q307 156 310 159T330 162H336H347Q367 162 367 148Q367 140 357 117T329 65T276 14T201 -8Q158 -8 121 15T83 84Q83 104 133 229T184 358Q189 376 189 388Q189 402 177 402Q156 402 134 380Q103 352 89 304Q84 288 81 285T61 282H55H44Q24 282 24 296",567:"297 360T297 373T294 392T288 400T278 401H276Q237 398 200 363Q181 343 170 325T156 299T149 287T129 282H123H116Q102 282 97 284T92 298Q93 303 98 315T118 349T151 390T201 427T267 451H279Q357 451 388 422T420 354V339L370 138Q321 -60 317 -69Q287 -157 163 -194Q133 -201 99 -201Q39 -201 14 -178T-12 -125Q-12 -94 11 -69T68 -43Q93 -43 108 -57T123 -95Q123 -121 100 -151H104Q131 -151 155 -125T193 -60Q195 -54 244 141T294 345Q297 360 297 373"},{})},5821:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texCalligraphic=void 0;var n=r(768),o=r(6384);e.texCalligraphic=(0,n.AddPaths)(o.texCalligraphic,{65:"576 668Q576 688 606 708T660 728Q676 728 675 712V571Q675 409 688 252Q696 122 720 57Q722 53 723 50T728 46T732 43T737 41T743 39L754 45Q788 61 803 61Q819 61 819 47Q818 43 814 35Q799 15 755 -7T675 -30Q659 -30 648 -25T630 -8T621 11T614 34Q603 77 599 106T594 146T591 160V163H460L329 164L316 145Q241 35 196 -7T119 -50T59 -24T30 43Q30 75 46 100T74 125Q81 125 83 120T88 104T96 84Q118 57 151 57Q189 57 277 182Q432 400 542 625L559 659H567Q574 659 575 660T576 668ZM584 249Q579 333 577 386T575 473T574 520V581L563 560Q497 426 412 290L372 228L370 224H371L383 228L393 232H586L584 249",66:"304 342Q292 342 292 353Q292 372 323 391Q331 396 417 428T533 487Q563 512 563 555V562Q563 575 557 589T530 618T475 636Q429 636 396 613T330 539Q263 446 210 238Q196 183 173 120Q135 31 121 16Q108 1 85 -10T47 -22T32 -10Q32 -5 44 18T77 93T112 206Q135 296 154 395T182 550T191 615Q191 616 190 616Q188 616 179 611T157 601T131 594Q113 594 113 605Q113 623 144 644Q154 650 205 676T267 703Q277 705 279 705Q295 705 295 693Q295 686 288 635T278 575Q278 572 287 582Q336 635 402 669T540 704Q603 704 633 673T664 599Q664 559 638 523T580 462Q553 440 504 413L491 407L504 402Q566 381 596 338T627 244Q627 172 575 110T444 13T284 -22Q208 -22 158 28Q144 42 146 50Q150 67 178 85T230 103Q236 103 246 95T267 75T302 56T357 47Q436 47 486 93Q526 136 526 198V210Q526 228 518 249T491 292T436 330T350 345Q335 345 321 344T304 342",67:"201 -25Q167 -25 136 -14T75 23T29 94T12 202Q12 290 50 394T161 574Q227 642 303 673T433 704Q435 705 457 705Q533 701 533 640Q533 606 507 548T464 474Q431 444 396 444Q381 444 381 453Q381 459 388 473T407 513T428 563Q433 580 433 594Q433 636 381 636Q314 636 260 594T175 489T128 363T112 247Q112 157 153 101T273 44Q347 44 398 121Q413 144 437 157T481 171Q496 171 496 160Q496 150 476 123Q426 56 350 16T201 -25",68:"37 475Q19 475 19 487Q19 536 103 604T327 682H356Q386 683 408 683H419Q475 683 506 681T582 668T667 633Q766 571 766 450Q766 365 723 287T611 152T455 57T279 6Q248 1 160 0Q148 0 131 0T108 -1Q72 -1 72 11Q72 24 90 40T133 64L144 68L152 88Q247 328 272 587Q275 613 272 613Q272 613 269 613Q225 610 195 602T149 579T129 556T119 532Q118 530 116 525T113 518Q102 502 80 490T37 475ZM665 407Q665 596 412 613Q403 614 383 614Q370 614 370 612Q370 598 363 542T323 357T242 103L228 69H265Q391 73 481 119Q536 148 575 188T633 268T658 338T665 392V407",69:"144 470Q144 556 240 630T451 705Q564 705 564 637Q564 611 540 573Q529 559 505 547T464 534Q448 534 448 545Q448 552 455 562Q463 577 463 591Q463 600 462 604T456 616T436 627T400 635Q396 635 390 635T380 636Q291 636 258 568Q245 544 245 516Q245 463 290 438T391 410Q415 410 415 398Q415 392 407 380T376 356T326 341Q288 340 260 327Q218 311 187 276T143 208T130 151Q130 113 156 88T211 55T268 47Q349 47 403 125Q415 144 439 157T483 171Q499 171 499 160Q499 148 475 120T413 59T315 3T197 -22Q124 -22 77 14T30 105Q30 126 39 154T66 216T122 288T209 354L223 362Q144 400 144 470",70:"199 579Q181 579 181 590Q181 598 188 611T212 639T260 666T335 682Q336 682 349 682T383 682T431 682T493 683T561 683Q776 682 784 681Q826 673 829 647Q829 620 797 600T744 580Q728 580 728 595Q729 607 713 610Q698 613 598 614H500L499 610Q499 598 467 486T428 367Q428 365 551 365H674Q683 360 684 355Q687 346 677 329Q666 312 642 299T598 285Q586 285 582 296H402L394 277Q386 258 373 229T346 167T315 102T286 51Q265 22 225 -5T133 -32Q108 -32 87 -25T54 -7T33 15T21 35T18 47Q18 60 44 80T98 103Q108 103 111 101T119 88Q130 66 150 54T179 39T195 37Q199 37 203 43Q217 67 245 125T318 300T391 532Q393 543 398 564T406 598T409 613T339 614H269Q229 579 199 579",71:"216 68Q155 68 115 100T59 177T44 273Q44 299 50 333T73 421T133 533T239 632Q346 704 466 704Q508 704 515 703Q555 696 577 681T599 635Q599 605 570 560T523 496Q490 466 455 466Q440 466 440 475T469 526T499 589Q499 605 489 617Q460 636 403 636Q343 636 295 611T220 548T174 464T150 382T144 318Q144 241 180 189T287 137Q325 137 359 160Q428 205 466 322Q472 342 501 359T551 376Q557 376 560 373T564 368L565 365Q560 341 551 302T512 173T451 31Q359 -119 204 -119Q163 -118 127 -109T74 -91T53 -77Q52 -75 52 -71Q52 -54 79 -35T132 -14H140L151 -19Q210 -49 281 -49H289Q312 -49 329 -31Q351 -7 372 36T405 109T416 142L408 136Q401 131 392 125T369 111T338 96T303 82T261 72T216 68",72:"18 487Q18 496 29 517T67 566T127 621T216 665T330 683Q359 683 376 669T397 643T400 622Q400 584 382 488T348 343Q348 342 467 342H587L594 366Q615 440 648 534T690 641Q701 656 723 669T764 683Q783 683 783 672L750 578Q716 485 677 346T625 101Q624 92 623 82T622 65T621 56Q621 20 658 20Q666 20 701 25Q709 52 736 69T785 87Q803 87 803 75T791 44T754 3T685 -33T588 -48Q568 -48 562 -46Q522 -31 522 13V23Q531 129 562 250L569 281L565 280Q561 278 556 277T549 274L438 273H328L321 249Q307 202 275 107T232 0Q219 -16 196 -28T155 -41Q149 -41 145 -39T140 -34T139 -29Q139 -24 148 -3T181 86T233 247Q240 270 240 272Q240 273 194 273H169Q139 273 139 285Q139 295 153 308T187 332Q206 341 236 342L260 343L264 359Q278 414 289 482T300 578Q300 613 260 613H254Q198 613 169 592Q148 578 127 544T104 508Q72 478 37 475Q18 475 18 487",73:"174 0H31Q-13 0 -21 2T-30 12Q-30 23 -17 36Q9 60 42 68L155 70Q187 102 214 179T257 333T302 491T366 610L369 614H305Q221 611 188 607T145 596T128 569Q119 543 94 529T47 512Q28 512 28 524Q28 527 32 539Q56 614 159 654Q218 678 312 682Q314 682 339 682T404 682T481 683H632Q642 678 642 671Q642 657 621 641T577 617Q570 615 507 614H444Q427 592 406 542Q382 478 355 366T310 209Q280 123 238 78L230 69H330Q442 70 442 74Q443 74 443 77T447 87T460 105Q490 134 527 137Q545 137 545 125Q545 120 542 112Q531 78 491 49T399 7Q379 2 360 2T174 0",74:"148 78Q148 16 189 -17T286 -50Q319 -50 348 -33T396 10T426 59T444 101L471 204Q498 306 521 372Q575 532 649 605L659 614H591Q517 613 494 607Q433 591 400 550T360 477Q353 454 325 437T275 419Q256 419 260 435Q280 523 376 597T583 681Q603 683 713 683H830Q839 674 839 671Q839 654 810 634T754 614Q735 614 721 601Q688 571 654 495T600 351T561 209T541 132Q507 29 412 -45T213 -119Q141 -119 94 -77T47 33Q47 55 50 69T58 90T71 103Q105 131 135 131Q152 131 152 120Q152 119 151 114T149 99T148 78",75:"194 618Q193 618 182 613T156 601T131 594Q113 594 113 605Q113 623 144 644Q154 650 205 676T267 703Q277 705 279 705Q295 705 295 691Q295 569 250 397Q225 306 197 217T151 81T128 25Q120 8 94 -7T47 -22Q32 -22 32 -10L64 76Q95 163 133 295T185 530Q198 611 194 618ZM331 429Q331 383 364 290T449 117T542 36Q574 36 607 51T652 103Q660 124 677 133T709 143Q727 143 727 128Q727 119 723 111Q704 56 639 17T497 -22H493Q463 -22 425 16Q401 40 382 71Q335 138 296 243T256 399Q256 434 288 473Q342 540 471 622T670 705Q691 704 703 696Q732 678 732 644Q732 613 714 600T677 586Q671 586 667 587T660 592T657 604V619Q657 647 629 647Q623 647 620 646Q576 635 495 583T365 482Q331 448 331 429",76:"62 -22T47 -22T32 -11Q32 -1 56 24T83 55Q113 96 138 172T180 320T234 473T323 609Q364 649 419 677T531 705Q559 705 578 696T604 671T615 645T618 623V611Q618 582 615 571T598 548Q581 531 558 520T518 509Q503 509 503 520Q503 523 505 536T507 560Q507 590 494 610T452 630Q423 630 410 617Q367 578 333 492T271 301T233 170Q211 123 204 112L198 103L224 102Q281 102 369 79T509 52H523Q535 64 544 87T579 128Q616 152 641 152Q656 152 656 142Q656 101 588 40T433 -22Q381 -22 289 1T156 28L141 29L131 20Q111 0 87 -11",77:"28 9Q28 37 43 63T73 90Q77 90 83 84T103 70T141 57H146Q162 57 178 79T222 167Q266 279 295 371T334 513T349 598T358 651T371 677Q397 705 432 705Q442 705 445 699T452 666Q453 661 453 659Q475 538 509 405T568 207L574 192Q581 178 587 164T594 150Q596 150 635 189T693 248Q765 324 863 438T1024 626T1089 701Q1093 705 1100 705Q1111 705 1111 682Q1111 675 1108 660T1099 611T1086 540Q1041 277 1041 144Q1041 98 1044 75T1050 48T1059 42Q1064 41 1075 46Q1102 61 1121 61Q1137 61 1137 50Q1137 28 1087 0T1000 -29Q983 -29 972 -23T955 -9T945 16T942 45T941 83V96Q941 158 952 256T974 422L985 489Q984 489 939 436T821 300T698 164Q665 128 620 85T568 37Q564 34 558 34Q550 34 546 37T535 54Q512 91 496 127T450 259T389 498L384 518Q349 367 294 223T198 15Q155 -50 117 -50Q87 -50 61 -35T30 -6Q28 2 28 9",78:"343 705Q358 705 358 698Q360 696 370 658T411 524T484 319Q536 174 590 82L595 73L615 152Q646 274 683 407Q729 571 752 637T799 727Q852 780 937 788Q939 788 947 788T958 789H962Q979 789 979 765Q979 722 951 692Q942 683 924 683Q888 681 859 672T818 654T803 639Q784 608 708 322T631 15Q631 14 630 15Q630 17 629 15Q628 14 628 12Q621 -4 601 -17T560 -31Q550 -31 546 -28T530 -7Q484 67 458 123T398 272Q352 392 314 514L306 535V534Q306 533 296 488T272 379T234 239T185 100T127 -7T61 -50Q34 -50 4 -34T-27 8Q-27 33 -12 61T18 90Q21 90 36 77T87 57H92Q109 57 123 78T162 173Q206 299 232 417T265 599T276 667Q284 681 304 693T343 705",79:"308 428Q289 428 289 438Q289 457 318 508T378 593Q417 638 475 671T599 705Q688 705 732 643T777 483Q777 380 733 285T620 123T464 18T293 -22Q188 -22 123 51T58 245Q58 327 87 403T159 533T249 626T333 685T388 705Q404 705 404 693Q404 674 363 649Q333 632 304 606T239 537T181 429T158 290Q158 179 214 114T364 48Q489 48 583 165T677 438Q677 473 670 505T648 568T601 617T528 636Q518 636 513 635Q486 629 460 600T419 544T392 490Q383 470 372 459Q341 430 308 428",80:"37 475Q19 475 19 487Q19 536 103 604T327 682Q329 682 344 682T380 682T421 683H463Q625 683 695 615Q718 591 726 564Q733 547 733 525Q733 412 607 312T321 205H312Q293 205 293 217Q293 224 302 236T333 260T385 274Q558 287 614 407Q633 445 633 477Q633 515 612 543T556 585T481 607T399 614H370L368 603Q352 463 312 312T242 82T202 -13Q190 -33 164 -45T121 -57Q108 -57 108 -45Q108 -40 120 -10T151 73T192 190T233 349T266 539Q267 546 269 565T272 598T274 613H270Q209 613 163 588Q131 572 113 518Q102 502 80 490T37 475",81:"114 286Q114 358 151 433T249 569T392 667T558 705Q653 705 713 641T774 460Q774 389 750 322T687 206T600 114T504 46T412 4L399 -2Q542 -62 636 -62Q660 -62 670 -54T686 -27T700 0Q734 34 770 34Q787 34 787 23Q787 -18 720 -74T563 -131Q485 -131 350 -83T145 -34Q127 -34 127 -22Q127 -12 144 5T190 31L200 34L237 35Q386 38 467 79Q550 120 612 210T675 416Q675 510 625 573T484 636Q410 636 346 587T248 469T214 333Q214 306 221 281T243 229T288 188T360 172Q403 172 441 188T490 205Q510 205 510 192Q505 162 432 132T287 102Q206 102 160 155T114 286",82:"37 475Q19 475 19 487Q19 503 35 530T83 589T180 647T327 682H374Q387 682 417 682T464 683Q519 683 559 679T642 663T708 625T731 557Q731 481 668 411T504 300Q506 296 512 286T528 257T553 202Q594 105 611 82Q635 47 665 47Q708 47 742 93Q758 113 786 128Q804 136 819 137Q837 137 837 125Q837 115 818 92T767 43T687 -2T589 -22Q549 -22 517 22T467 120T422 221T362 273Q346 273 346 287Q348 301 373 320T436 342Q437 342 446 343T462 345T481 348T504 353T527 362T553 375T577 393Q598 412 614 443T630 511Q630 545 613 566T541 600T393 614Q370 614 370 613L366 584Q349 446 311 307T243 96L213 25Q205 8 179 -7T132 -22Q125 -22 120 -18T117 -8Q117 -5 130 26T163 113T205 239T246 408T274 606V614Q273 614 259 613T231 609T198 602T163 588Q131 572 113 518Q102 502 80 490T37 475",83:"554 512Q536 512 536 522Q536 525 539 539T542 564Q542 588 528 604Q515 616 482 625T410 635Q374 635 349 624T312 594T295 561T290 532Q290 505 303 482T342 442T378 419T409 404Q435 391 451 383T494 357T535 323T562 282T574 231Q574 133 464 56T220 -22Q138 -22 78 21T18 123Q18 184 61 227T156 274Q178 274 178 263Q178 260 177 258Q172 247 164 239T151 227T136 218L127 213L124 202Q118 186 118 163Q120 124 165 86T292 48Q374 48 423 86T473 186V193Q473 267 347 327Q268 364 239 389Q191 431 191 486Q191 547 242 600T356 679T470 705Q472 705 478 705T489 704Q551 704 596 682T642 610Q642 566 621 545Q592 516 554 512",84:"49 475Q34 475 34 490Q34 552 106 611T261 681Q272 683 507 683H742Q790 717 816 717Q833 717 833 708Q833 682 795 653T714 615Q691 610 588 609Q490 609 490 607L483 580Q476 554 462 496T435 392Q410 289 395 231T363 116T335 34T309 -15T279 -47T242 -64Q231 -68 218 -68Q203 -68 203 -57Q203 -52 211 -38Q224 -7 234 20T251 66T268 123T283 179T304 261T328 360Q342 415 360 488Q380 567 384 582T397 605Q400 607 401 609H302H244Q200 609 188 607T167 596Q145 572 145 541Q145 520 109 498T49 475",85:"8 592Q8 616 70 649T193 683Q246 683 246 631Q246 587 205 492T124 297T83 143Q83 101 100 75T154 48Q202 48 287 135T450 342T560 553Q589 635 593 640Q603 656 626 668T669 683H670Q687 683 687 672T670 616T617 463T547 220Q525 137 521 68Q521 54 522 50T533 42L543 47Q573 61 588 61Q604 61 604 47Q599 16 506 -22Q486 -28 468 -28T436 -18T421 18Q421 92 468 258Q468 259 467 257T459 248Q426 206 391 167T303 81T194 6T83 -22Q66 -22 58 -20Q25 -11 4 19T-17 99Q-17 146 8 220T64 358T120 488T146 586Q146 604 141 608T123 613H120Q99 613 72 597T25 580Q8 580 8 592",86:"25 633Q25 647 47 665T100 683Q291 683 291 306Q291 264 288 213T282 132L279 102Q281 102 308 126T378 191T464 279T545 381T596 479Q600 490 600 502Q600 527 581 550T523 577Q505 577 505 601Q505 622 516 647T542 681Q546 683 558 683Q605 679 631 645T658 559Q658 423 487 215Q409 126 308 37T190 -52Q177 -52 177 -28Q177 -26 183 15T196 127T203 270Q203 356 192 421T165 523T126 583T83 613T41 620Q25 620 25 633",87:"25 633Q25 647 46 665T103 683Q168 683 207 632Q228 608 243 568Q269 485 269 374Q269 324 265 271T256 184L251 150L252 152Q254 153 257 157T264 167T274 180T286 197Q359 293 424 398T519 558T549 616Q549 618 547 624T545 638Q550 654 572 668T615 683Q626 683 632 672T657 595Q726 370 741 128L742 110Q752 122 767 142T823 217T894 321T950 424T976 511Q976 544 958 560T918 577Q906 577 906 602Q906 629 918 651T942 681Q948 683 954 683Q983 683 1008 658T1034 569T999 421T915 257T813 109T724 -3T681 -49Q666 -59 660 -45Q659 -41 657 35T639 233T591 477Q573 551 570 551Q569 551 554 523T507 439T433 315T323 155T182 -25Q160 -52 151 -53Q137 -53 137 -30Q137 -29 148 25T170 168T181 338Q181 424 168 483T131 571T87 609T40 620Q25 620 25 633",88:"324 614Q291 576 250 573Q231 573 231 584Q231 589 232 592Q235 601 244 614T271 643T324 671T400 683H403Q462 683 481 610Q485 594 490 545T498 454L501 413Q504 413 551 442T648 509T705 561Q707 565 707 578Q707 610 682 614Q667 614 667 626Q667 641 695 662T755 683Q765 683 775 680T796 662T807 623Q807 596 792 572T713 499T530 376L505 361V356Q508 346 511 278T524 148T557 75Q569 69 580 69Q585 69 593 77Q624 108 660 110Q667 110 670 110T676 106T678 94Q668 59 624 30T510 0Q487 0 471 9T445 32T430 71T422 117T417 173Q416 183 416 188Q413 214 411 244T407 286T405 299Q403 299 344 263T223 182T154 122Q152 118 152 105Q152 69 180 69Q183 69 187 66T191 60L192 58V56Q192 41 163 21T105 0Q94 0 84 3T63 21T52 60Q52 77 56 90T85 131T155 191Q197 223 259 263T362 327T402 352L391 489Q391 492 390 505T387 526T384 547T379 568T372 586T361 602T348 611Q346 612 341 613T333 614H324",89:"65 599Q65 618 107 650T204 683Q267 683 312 643T380 533T414 385T424 217Q424 186 423 160T422 123Q426 123 468 170T567 304T650 469Q661 503 661 519Q661 546 639 570Q615 591 583 591Q569 591 569 616Q569 640 582 661T613 683Q624 683 638 679T671 664T702 625T714 558Q714 472 639 329T426 45Q361 -21 282 -82T154 -143Q97 -143 64 -104T31 -20Q31 4 44 25T70 46Q78 46 81 39T87 16T97 -9Q127 -51 182 -51Q184 -51 187 -50H190Q233 -41 314 25Q330 36 330 40Q336 79 336 178Q336 508 223 594Q199 614 158 619L148 620L139 611Q111 586 83 586Q65 586 65 599",90:"694 220Q708 220 708 210Q708 195 695 167T658 105T593 42T502 3Q492 1 458 1Q400 1 293 11T150 22Q116 22 92 11T51 0Q37 0 37 10Q37 21 63 44T179 146T367 319L391 343H343L296 344Q285 350 285 358Q285 365 289 372T300 383T313 392T324 398L329 400H450L561 518Q597 558 607 571L621 587H596Q553 589 484 599T383 609Q342 609 326 596T301 555Q294 533 263 514T208 492Q189 492 189 503Q189 510 197 528T215 559Q249 607 318 645T466 683Q504 683 573 673T669 662L690 661Q734 682 748 683Q767 683 767 673Q767 666 746 640Q655 531 555 428L529 400Q529 399 543 399Q604 397 604 366Q604 350 587 337T551 322Q541 322 539 323Q529 328 529 334Q529 339 487 342L470 343L446 320Q272 153 200 96L235 95Q297 95 392 86T533 74H554Q586 116 597 159Q604 179 635 199T694 220"},{})},957:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texMathit=void 0;var n=r(768),o=r(6041);e.texMathit=(0,n.AddPaths)(o.texMathit,{65:"85 46Q112 48 132 56T161 73T176 92T185 104Q185 106 353 407T524 709Q527 716 551 716Q568 716 572 712Q573 711 574 710Q576 708 594 384Q613 54 617 52H618Q626 46 672 46H689Q696 41 696 36Q696 13 683 0H670Q639 2 557 2Q526 2 500 2T459 2T441 1Q425 1 425 10Q425 12 427 24Q428 27 429 31T430 36T432 40T434 43T437 45T443 46T450 46Q514 46 514 69Q514 74 511 136L506 209H292L260 152Q222 84 222 74Q222 48 264 46Q280 46 280 35Q280 33 278 21Q275 7 272 4T259 0Q256 0 232 1T159 2Q135 2 109 1T78 0Q58 0 58 10Q58 14 61 26T66 40Q68 46 85 46ZM504 260Q503 263 496 407T486 553L466 520Q446 486 402 406L318 256Q318 255 411 255H504V260",66:"57 11Q57 38 69 45L74 46Q78 46 85 46T99 46Q134 47 145 50T162 62Q164 66 233 344T303 626Q303 627 302 629V631Q296 637 241 637H223Q217 642 217 645T219 664Q223 677 229 683H411L593 682L605 680Q616 678 628 675T660 662T694 639T720 601T732 547Q732 519 726 503Q710 452 662 414T556 360L545 357L556 355Q604 346 641 312T678 221Q678 155 622 92T482 8Q459 2 439 2T256 0H154H105Q74 0 66 2T57 11ZM629 549Q628 550 629 557T627 576T619 600T601 622T570 636Q564 637 490 637Q472 637 454 637T424 636T411 636Q399 635 395 622T364 500Q333 377 332 376Q332 374 408 374L485 375L495 377Q547 390 588 437T629 549ZM504 336Q500 337 410 337Q323 337 322 336Q322 334 305 263T270 122T252 51Q252 47 337 46Q346 46 361 46T384 45Q425 45 455 55T515 95Q574 156 574 235Q574 276 555 304T504 336",67:"395 -21Q279 -21 215 56T150 244Q150 402 265 543Q339 630 421 667T562 704Q596 704 604 703Q627 698 647 689T679 669T699 649T711 633T716 627L753 665Q790 704 792 704Q793 705 798 705Q812 705 812 698Q812 694 780 561Q744 422 744 421Q742 416 739 415T721 413H705Q699 419 699 426Q701 432 701 444Q705 464 705 493Q705 524 700 551T681 604T643 644T583 659Q480 659 387 570Q321 502 287 397T252 213Q252 123 297 74Q347 24 421 24Q500 24 564 89T653 240Q656 253 659 255T677 257Q700 257 700 248Q700 242 694 222Q681 183 656 143T593 65T504 3T395 -21",68:"56 11Q56 38 68 45L72 46Q77 46 84 46T98 46Q133 47 144 50T161 62Q163 66 232 344T302 626Q302 627 302 629L301 631Q295 637 240 637H222Q216 642 216 645T218 664Q222 677 228 683H403Q582 683 589 682Q672 674 723 608T775 440Q775 312 709 209T562 54Q502 14 432 2Q423 1 243 0H148H102Q72 0 64 2T56 11ZM254 51Q254 46 348 46Q395 46 422 50T484 71Q585 121 633 255Q679 396 679 477Q679 522 665 554T629 603T587 626T548 636Q547 636 536 636T510 636T480 637Q420 637 411 636T398 627Q396 623 325 339T254 51",69:"248 634Q216 634 214 638Q213 641 213 646Q213 674 224 678Q226 680 481 680H736Q743 676 743 669Q743 665 729 557T713 447Q711 440 690 440H675Q667 445 667 454Q667 455 671 481T675 536Q675 583 658 604T592 632Q574 634 475 634Q439 634 424 633T405 631T399 625Q397 622 367 501T336 377Q336 376 367 376H388Q451 376 477 389Q493 399 503 419T520 462T528 489Q531 493 549 493Q557 493 561 492T566 491T569 488T572 483L539 351Q507 221 503 216Q503 216 500 213H484Q468 213 465 216Q461 219 461 225Q461 228 466 250T472 290Q472 317 452 323T368 330H324Q323 326 289 191T255 51T331 46H360Q413 46 444 49T511 67T570 113Q589 137 608 175T638 242T652 272Q656 274 670 274Q693 274 693 262L648 148Q590 4 588 2Q585 0 323 0H61Q54 4 54 11Q54 27 61 41Q65 46 95 46Q131 47 142 50T159 62L194 200Q229 337 264 477T299 623Q299 630 292 631T248 634",70:"299 623Q299 630 292 631T247 634H219Q213 640 213 642T215 661Q218 673 225 680H724Q731 676 731 669Q731 665 717 557T701 447Q699 440 678 440H663Q656 444 656 452Q656 457 659 485T663 538Q663 586 644 607T566 633Q564 633 535 633T486 634H458Q404 634 399 625Q396 620 364 492L332 363H380Q446 365 464 373Q496 389 514 458Q518 477 523 479Q527 480 541 480H556Q563 475 563 470Q563 467 532 339T498 207Q496 200 475 200H460Q453 207 453 212Q454 213 456 225T461 254T464 278Q464 304 445 310T369 317H321L289 190Q257 66 257 59Q257 54 261 52T283 48T337 46Q348 46 352 46T360 45T366 42T368 37Q368 32 365 23Q360 4 355 2Q352 1 342 1Q336 1 297 1T199 2Q138 2 106 2T71 1H68Q54 1 54 11Q54 38 66 45L70 46Q75 46 82 46T96 46Q131 47 142 50T159 62L194 200Q229 337 264 477T299 623",71:"632 -1Q629 -1 622 5T604 25T583 53Q508 -22 394 -22Q287 -22 219 52T150 244Q150 402 265 543Q339 630 421 667T562 704Q596 704 604 703Q627 698 647 689T679 669T699 649T711 633T716 627L753 665Q790 704 792 704Q793 705 798 705Q812 705 812 698Q812 694 780 561Q744 422 744 421Q742 416 739 415T721 413H705Q699 419 699 426Q701 432 701 444Q705 464 705 493Q705 524 700 551T681 604T643 644T583 659Q480 659 387 570Q319 501 286 394T252 208Q252 156 269 118T314 61T369 33T425 24Q470 24 509 46T566 104Q571 116 583 162T595 214Q595 222 583 223Q561 227 517 227H495Q488 230 488 238Q488 254 495 268Q500 273 511 273Q515 273 532 273T581 272T649 271Q731 271 752 273H761Q767 267 767 264T765 246Q761 233 755 227H742Q698 227 693 213L639 4Q636 -1 632 -1",72:"61 0Q54 7 54 11Q54 27 61 41Q65 46 95 46Q131 47 142 50T159 62Q161 66 230 344T300 626Q300 627 300 629L299 631Q293 637 238 637H220Q214 642 214 645T216 664Q220 677 226 683H239Q307 681 372 681Q480 681 486 683H496Q502 677 502 674T500 656Q496 643 490 637H472Q418 637 406 630Q400 627 396 612T367 500Q360 474 352 442T340 395L336 380Q336 378 466 378H596Q657 622 657 626Q657 627 656 629V631Q650 637 595 637H577Q571 642 571 645T573 664Q577 677 583 683H596Q664 681 729 681Q837 681 843 683H853Q860 676 860 672Q858 647 848 637H819Q783 636 772 634T756 623Q753 618 684 340T614 57Q614 50 621 49T666 46Q697 46 699 40Q701 37 698 21Q693 3 689 1Q686 0 677 0Q673 0 657 0T611 1T546 2Q453 2 428 0H418Q411 7 411 11Q411 27 418 41Q422 46 452 46Q488 47 499 50T516 62Q517 64 550 196T584 331Q584 332 454 332H324L291 197Q257 64 257 56Q257 50 265 49T309 46Q340 46 342 40Q344 37 341 21Q336 3 332 1Q329 0 320 0Q316 0 300 0T254 1T189 2Q96 2 71 0H61",73:"235 637Q217 637 213 638T209 649Q209 673 220 682Q222 683 237 683Q278 681 369 681Q404 681 441 682T483 683Q499 683 503 681T508 672Q508 670 505 658T500 643Q498 637 464 637Q425 635 415 633T398 621Q396 618 327 340T257 58T260 52T278 48T322 46Q349 46 349 36Q349 31 346 22Q342 4 337 1Q336 1 334 1T329 0Q325 0 307 0T258 1T190 2Q95 2 67 0H56Q49 7 49 11Q51 38 62 46H91Q129 47 141 50T159 62Q161 66 230 344T300 625Q300 637 235 637",74:"361 637Q333 637 331 641Q330 644 330 649Q330 673 341 682Q343 683 360 683Q405 681 500 681Q551 681 577 681T607 682Q622 682 622 673Q622 665 616 647Q614 640 610 639T587 637Q547 636 541 624Q538 618 477 374T413 124Q391 64 333 22T207 -21T109 12T78 86Q78 130 101 150T149 170Q193 170 196 129Q196 100 178 80T137 58L132 57Q134 52 138 46T160 28T205 16Q242 16 273 48T319 122Q322 129 383 371T444 627Q444 637 361 637",75:"668 621Q668 635 645 637Q629 637 629 648Q629 650 632 662T637 677Q640 682 653 682Q657 682 688 681T764 680Q786 680 810 681T839 682Q859 682 859 672Q859 655 852 643Q849 637 839 637Q804 637 768 621T717 595T697 578Q696 578 600 497L505 417L508 408Q543 311 574 227T618 106T632 69Q645 47 688 46H707Q713 38 713 37T710 19Q706 6 700 0H688Q659 2 587 2Q557 2 532 2T492 2T474 1Q458 1 458 10Q458 13 460 23Q464 39 466 42T480 46Q526 46 526 72Q526 75 476 213L427 350Q426 350 396 325T334 272T302 242Q302 241 299 230T290 194T279 150Q257 61 257 55Q257 50 265 49T309 46H337Q343 40 343 38T341 19Q337 6 331 0H316Q280 2 190 2Q158 2 131 2T89 2T70 1Q54 1 54 11Q54 38 66 45L70 46Q75 46 82 46T96 46Q131 47 142 50T159 62Q161 66 230 344T300 626Q300 627 300 629L299 631Q293 637 238 637H220Q214 642 214 645T216 664Q220 677 226 683H239Q307 681 372 681Q386 681 414 681T464 682L487 683H496Q502 677 502 674T500 656Q495 641 491 637H462Q426 636 415 634T399 623Q396 618 358 467L320 314Q321 314 484 452Q510 474 552 509Q625 570 646 590T668 621",76:"61 0Q54 4 54 11Q54 27 61 41Q65 46 95 46Q131 47 142 50T159 62Q161 66 230 344T300 626Q300 627 300 629L299 631Q293 637 238 637H220Q214 642 214 645T216 664Q220 677 226 683H240Q275 681 371 681Q407 681 438 681T487 682T509 682Q527 682 527 674Q527 670 524 659Q523 657 523 654T522 649T520 645T519 642T517 640T515 639T512 638T507 637T502 637T494 637H478Q433 636 417 633T396 617Q395 614 325 334T255 51Q255 47 319 47Q387 47 410 52Q459 65 494 98T543 163T570 229T589 273H622Q628 264 628 262Q628 259 584 133T539 5Q537 1 511 1Q482 0 296 0H61",77:"72 1Q58 1 58 11Q58 33 66 41Q68 46 87 46Q150 50 168 84Q172 91 238 356T304 626Q304 627 304 629L303 631Q297 637 242 637H224Q218 642 218 645T220 664Q224 677 230 683H326H394Q417 683 422 682T429 676L480 127L502 163Q523 199 560 262T642 400Q801 668 805 676L817 683H1003Q1010 678 1010 672Q1010 650 997 637H979Q915 637 906 623Q903 618 834 340T764 57Q764 50 771 49T817 46H845Q851 38 851 37T848 19Q845 7 838 0H824Q789 2 701 2Q670 2 644 2T603 2T584 1Q569 1 569 11Q569 13 571 25Q576 42 581 45L586 46Q590 46 597 46T611 46Q646 47 657 50T674 62L813 616L634 313Q453 7 452 7Q446 0 428 0Q409 0 407 6Q405 10 379 304T351 604L285 348Q220 83 220 82Q220 65 233 57T279 46H295Q301 38 301 37T298 19Q295 7 288 0H275Q244 2 171 2Q145 2 123 2T88 2T72 1",78:"633 637Q624 637 621 639T617 650Q617 670 630 683H641Q682 680 736 680Q836 680 845 683H853Q860 676 860 672Q858 647 848 637H832Q764 633 750 598Q746 590 673 300Q656 230 638 156T610 44L600 7Q598 0 576 0H559Q553 6 448 297L342 588Q341 588 279 336T216 81Q216 49 274 46Q293 46 295 40Q297 37 294 21Q293 19 292 16T291 11T290 7T289 4T287 2T284 1T280 1T275 0T263 0T229 1T167 2Q91 2 70 0H61Q54 7 54 11T57 27Q61 41 64 43T83 46Q146 50 164 84Q167 90 235 362L303 634Q300 635 253 637H220Q214 643 214 645T216 664Q220 677 226 683H314Q386 683 397 683T410 677Q412 675 501 428L591 179Q591 178 592 180T595 189T600 209T610 246T624 303T645 385Q698 595 698 606Q698 618 683 627T633 637",79:"149 237Q149 326 186 413T282 563T412 665T552 704Q619 704 667 678T741 611T777 528T788 444Q788 328 728 219T572 44T377 -22Q275 -22 212 50T149 237ZM688 487Q688 570 650 617T548 665Q467 665 398 592T291 413T253 203Q253 119 290 70T387 20Q440 20 489 52T573 135T635 249T675 373T688 487",80:"62 0Q55 7 55 11Q55 27 62 41Q66 46 96 46Q132 47 143 50T160 62Q162 66 231 344T301 626Q301 627 300 629V631Q294 637 239 637H221Q215 642 215 645T217 664Q221 677 227 683H404H431H502Q578 683 615 675T684 636Q729 595 729 531Q729 462 671 396T524 308Q499 302 404 301H318L288 182Q258 63 258 55T310 46Q341 46 343 40Q345 37 342 21Q337 3 333 1Q330 0 321 0Q317 0 301 0T255 1T190 2Q97 2 72 0H62ZM626 555V562Q626 620 552 635Q546 636 481 637Q466 637 450 637T423 636T412 636Q401 635 398 627Q396 622 361 484Q353 452 344 416T330 362L325 344Q325 342 390 342H427Q523 342 567 386Q596 415 611 473T626 555",81:"460 -107Q460 -72 464 -42T468 -7L457 -10Q446 -14 424 -18T379 -22Q276 -22 213 50T149 237Q149 326 186 413T282 563T412 665T552 704Q664 704 726 631T788 442Q788 305 703 180Q627 64 517 13L506 8Q506 7 508 -12T513 -38T522 -59T538 -79T565 -85Q604 -85 634 -59T672 0Q676 11 684 11Q693 11 695 2Q695 -1 690 -20T673 -69T644 -126T599 -174T538 -194Q464 -194 460 -110Q460 -108 460 -107ZM689 481Q689 578 646 621T551 665Q468 665 391 586Q321 512 285 399T249 202Q249 106 295 58Q310 41 314 41Q315 41 315 46Q315 83 344 118T420 154Q450 154 473 135Q493 114 500 69L502 58L512 65Q571 110 613 192T672 348T689 481ZM472 49Q472 118 415 118Q393 118 373 98T353 51Q353 18 386 18H387Q424 18 472 40V49",82:"62 0Q55 7 55 11Q55 27 62 41Q66 46 96 46Q132 47 143 50T160 62Q162 66 231 344T301 626Q301 627 300 629V631Q294 637 239 637H221Q215 642 215 645T217 664Q221 677 227 683H386Q554 682 569 679Q571 678 580 676Q643 662 680 623T717 533Q717 473 667 420T528 337L538 330Q563 314 578 286T594 228Q594 212 588 147T581 65Q581 36 589 26T616 16H618Q637 16 652 37Q668 57 677 94Q679 105 701 105T723 95Q723 89 717 72T698 33T662 -5T610 -22Q555 -22 513 3T471 88Q471 107 486 168T502 244Q502 303 452 320Q445 322 382 323H320L288 192Q255 63 255 55T307 46Q338 46 340 40Q342 37 339 21Q335 3 330 1Q326 0 320 0Q317 0 306 0T265 1T190 2Q99 2 73 0H62ZM612 558Q612 566 612 568T610 581T603 597T590 611T567 625T532 635Q526 636 470 637Q458 637 445 637T422 636T412 636Q402 635 397 627L390 598Q383 570 373 532T354 455T337 389T330 361Q356 360 384 360H415Q483 360 527 382Q557 399 574 424T604 498Q612 533 612 558",83:"198 460Q198 551 269 628T432 705Q516 705 557 644L583 673Q589 679 593 684T600 693T605 698T609 702T611 704T614 705T618 705H620Q633 705 633 698T605 577T573 459L570 456H554Q546 456 543 456T536 457T532 460T531 466Q531 469 533 489T536 532Q536 573 525 600T496 640T462 657T427 662Q369 662 325 612T281 503Q281 475 290 458T318 430T356 415T407 401T463 383Q506 360 522 323T538 258V244Q538 141 465 60T300 -22Q198 -22 152 41L143 31Q137 25 126 12T106 -10T95 -21L92 -22Q88 -22 86 -22Q81 -22 78 -20T74 -16V-14Q74 -11 132 221Q134 227 155 227H171Q177 221 177 215Q177 212 175 205T171 182T169 147Q171 99 195 70T246 33T306 25Q358 25 400 70T453 169Q455 180 455 203V210Q455 263 414 285Q409 288 347 305Q271 328 254 339Q239 350 224 371Q198 409 198 460",84:"178 437Q173 442 171 446Q171 451 238 654Q243 670 250 677H681H762Q792 677 799 676T806 667Q806 661 788 553T768 444Q768 437 746 437Q727 437 723 445Q723 450 729 492T736 562Q736 589 728 602T693 624Q675 630 622 630H595Q575 630 571 629T564 623Q562 621 492 342T422 59Q422 48 502 46H542Q548 38 548 37T545 19Q541 6 535 0H517Q475 2 357 2Q315 2 279 2T223 2T198 1Q179 1 179 9Q179 14 182 24Q187 42 190 44Q194 46 206 46H232Q289 47 301 49T326 65L395 344Q465 619 465 626Q465 629 462 629Q456 631 411 631Q364 631 336 625T288 597T255 549T224 467Q215 442 210 437H178",85:"636 637Q627 637 624 639T620 650Q620 670 633 683H644Q702 681 753 681Q760 681 772 681T796 681T820 682T838 683H845H853Q860 676 860 672Q858 647 848 637H832Q764 633 750 598Q745 588 698 400T648 204Q627 140 584 86Q484 -22 378 -22Q300 -22 247 31T194 167Q194 176 194 182T196 198T200 218T207 248T217 288T231 346T250 422Q300 618 300 626Q300 627 300 629L299 631Q293 637 238 637H220Q214 642 214 645T216 664Q220 677 226 683H239Q307 681 372 681Q480 681 486 683H496Q502 677 502 674T500 656Q496 643 490 637H472Q418 637 406 630Q400 627 394 603T344 410Q299 232 292 198T284 135Q284 102 294 78T322 44T355 29T387 24Q455 24 515 74T604 211Q605 215 653 404T701 607Q701 618 686 627T636 637",86:"667 637Q657 637 654 639T650 650Q650 670 663 683H675Q704 681 772 681Q793 681 818 682T847 683Q868 683 868 672Q868 670 865 658T860 643Q857 637 848 637Q785 637 749 587L394 -15Q387 -22 366 -22Q346 -22 342 -16Q341 -13 313 303Q285 622 285 623Q283 631 273 634T229 637Q205 637 205 648Q205 654 208 666T217 682Q219 683 230 683Q276 680 329 680Q444 680 456 683H466Q472 677 472 674T470 656Q466 643 460 637H448Q384 637 384 615Q385 612 406 371T427 126Q427 125 495 240T632 473T704 596Q707 604 707 609Q707 633 667 637",87:"234 637H226Q205 637 205 648Q205 673 216 682Q218 683 231 683Q265 681 340 681Q371 681 404 682T443 683Q458 683 462 681T467 672Q467 670 464 658T459 643Q457 637 434 637Q407 636 394 632T378 623T376 613Q376 589 385 377T394 149L511 361Q542 419 596 519L613 551L612 585Q610 621 610 624Q608 637 559 637H555Q537 637 537 647Q537 654 540 664Q544 677 550 683H561Q600 680 656 680Q771 680 783 683H792Q798 677 798 675T796 658Q792 643 790 640T778 637H774Q721 637 708 620L717 385Q726 150 727 149Q727 148 752 193T812 303T882 433T942 546T969 596Q970 600 970 606Q970 610 969 613T966 620T961 625T955 628T949 631T941 633T934 634T927 636T920 637Q903 637 903 648Q903 650 905 664Q909 677 915 683H928Q960 681 1031 681Q1050 681 1073 681T1101 682Q1124 682 1124 672Q1124 655 1117 643Q1114 637 1104 637Q1085 637 1069 632T1043 618T1026 603T1014 588L1009 580L687 -16Q681 -22 660 -22Q643 -22 637 -16Q635 -14 627 223Q617 441 617 464L602 441Q578 397 487 228Q456 171 423 110T372 17T355 -15Q348 -22 328 -22Q312 -22 308 -20T303 -9Q303 -5 291 310T277 627Q273 636 234 637",88:"684 0Q670 0 634 1T569 2Q512 2 482 2T449 1Q433 1 433 10Q433 11 435 25Q437 34 438 37T442 43T448 45T459 46T476 49Q506 58 506 64Q506 65 467 179T426 295L382 244Q339 194 295 142T249 86Q245 79 245 72Q245 48 279 46Q293 46 293 32Q293 13 280 0H268Q206 2 151 2Q70 2 64 0Q50 0 50 11Q50 15 53 27Q57 41 60 43T78 46Q154 49 205 100Q207 103 312 225L411 341L407 353Q404 360 381 428T336 560T310 627Q301 636 255 637H229Q223 643 223 645T225 664Q229 677 235 683H246Q288 680 346 680Q462 680 477 683H487Q493 677 493 674T491 656Q488 644 485 641T471 637Q461 635 454 635Q419 626 421 619Q421 617 453 524T486 430T554 509T624 593Q631 604 631 611Q631 622 621 629T598 637Q583 637 583 648Q583 650 585 660Q589 676 591 679T602 683Q606 683 637 682T715 680Q742 680 771 681T804 682Q825 682 825 672Q825 650 817 642Q814 637 797 637Q739 634 700 608Q684 597 659 569T505 389L501 384L557 222Q612 61 616 57Q625 47 671 46Q691 46 697 45T704 36Q704 35 702 23Q701 19 700 14T699 7T696 3T692 1T684 0",89:"232 637Q198 637 198 647Q198 651 201 664T210 682Q212 683 223 683Q269 680 325 680Q443 680 455 683H465Q472 676 472 672Q472 656 465 642Q460 637 441 637Q395 634 395 623Q395 621 438 478T482 334T583 460T688 591Q688 593 694 601T700 617Q700 637 668 637H666Q655 637 655 648Q655 654 658 664Q660 672 660 673T663 678T668 682T677 683Q680 683 704 682T776 680Q801 680 828 681T858 682Q875 682 875 673Q875 669 872 657T867 643Q865 637 848 637Q788 634 749 597Q733 581 608 424L487 273L461 170Q454 145 448 118T438 76T434 60Q434 54 436 52T452 48T496 46H514Q520 41 520 38T518 19Q514 6 508 0H495Q427 2 364 2Q350 2 323 2T272 0H250H241Q234 7 234 11Q234 27 241 41Q245 46 275 46Q312 47 323 50T340 64Q340 65 344 79T355 120T368 171L393 274L341 448Q288 622 286 626Q278 636 232 637",90:"203 452Q203 455 236 565T270 677Q270 681 274 681Q276 683 488 683H699Q704 678 704 675Q704 663 697 649Q697 647 449 348L201 50L266 49H301Q442 49 495 116Q525 155 556 251Q563 274 565 278T579 282H585Q609 285 609 271Q609 270 570 142T528 8T518 1T466 0H303Q253 0 197 0T131 -1Q112 -1 102 -1T87 1T81 3T80 8Q80 30 89 39Q90 41 204 178T446 470T575 626L584 637H512H504H475Q446 637 426 635T378 624T330 597T289 546T254 467Q247 446 243 444Q239 442 226 442Q203 442 203 452",97:"418 53Q418 26 438 26Q466 26 494 131Q500 151 504 152Q507 153 516 153H521Q531 153 534 153T540 150T543 144Q543 141 540 126T529 88T509 43T477 5T434 -11Q404 -11 383 3T354 30T347 48H346Q345 47 342 45T337 40Q282 -11 228 -11Q172 -11 137 34T101 146Q101 260 177 351T333 442Q343 442 352 441T369 437T382 431T393 425T402 417T409 410T414 402T419 396Q423 406 436 414T461 422Q475 422 484 413T494 395Q494 384 459 244T420 88Q418 80 418 58V53ZM397 323Q397 344 382 374T333 405Q302 405 271 372Q249 349 235 316T203 215Q184 135 184 108V100V94Q184 54 207 35Q218 26 235 26Q279 26 330 91Q343 109 346 118T372 217Q397 317 397 323",98:"158 683Q163 683 223 688T300 694Q312 694 312 685T279 544Q243 405 243 403L256 412Q268 422 292 432T338 442Q395 442 431 398T467 284Q467 175 393 82T229 -11Q175 -11 142 32T108 142Q108 176 115 207T166 412Q177 458 190 510T209 588T216 616Q216 629 209 632T170 637H149Q143 643 143 645T145 664Q150 683 158 683ZM178 109Q178 27 234 27Q247 27 254 29Q295 44 323 94Q343 129 363 208T384 332Q384 354 382 361Q369 405 332 405Q282 405 228 326L222 317L205 250Q178 142 178 109",99:"257 -10Q183 -10 143 37T103 155Q103 257 173 341T337 440Q341 441 348 441H358Q421 441 445 415T469 356Q469 320 450 305T410 289Q392 289 381 299T370 325Q370 362 404 378L414 383Q392 402 365 405Q322 405 285 375T227 294Q217 271 202 213T187 119Q187 27 263 27Q299 27 330 40Q361 51 386 71T424 106T440 121Q444 121 455 110T466 96Q466 92 458 81T432 54T390 24T331 0T257 -10",100:"418 54Q418 26 438 26Q466 26 494 131Q500 151 504 152Q507 153 516 153H521H526Q543 153 543 144Q543 143 541 129Q531 91 521 65T487 14T434 -11T383 3T354 30T347 48H346Q345 47 342 45T337 40Q282 -11 228 -11Q172 -11 137 34T101 146Q101 255 174 348T337 441Q354 441 368 437T390 427T404 414T413 404T417 400L471 616Q471 629 464 632T425 637H404Q398 643 398 645T400 664Q405 683 413 683Q418 683 478 688T555 694Q567 694 567 686Q567 676 495 389L419 86Q418 80 418 61V54ZM397 323Q397 329 394 340T385 367T365 394T333 405Q302 405 271 372Q249 349 235 316T203 215Q184 135 184 108V100Q184 71 191 56Q204 26 235 26Q267 26 300 57T344 112Q347 117 372 217T397 323",101:"107 166Q107 230 131 283T193 369T270 420T345 441Q346 441 352 441T361 442H364Q409 442 439 418T470 355Q470 270 366 239Q308 223 218 223H205Q189 164 189 125Q189 83 206 55T261 27Q309 27 353 50T426 109Q436 121 440 121T453 111T466 97Q469 92 455 77Q424 41 372 16T258 -10Q184 -10 146 41T107 166ZM416 333T416 354T401 390T360 405Q322 405 292 384T246 336T223 288T215 261Q215 260 240 260Q262 261 276 262T314 266T353 275T384 291T408 317",102:"351 608Q351 642 389 661Q368 668 365 668Q358 668 352 664Q349 663 347 661T342 654T337 647T333 637T330 627T327 614T324 601T321 587T318 571L291 432Q291 431 343 431H394Q400 426 400 423T398 404Q394 390 389 386L335 385H282L255 246Q212 20 189 -51Q136 -199 58 -204Q22 -204 0 -185T-23 -134Q-23 -100 -3 -85T37 -69Q54 -69 65 -80T76 -108Q76 -115 75 -119Q70 -134 61 -144T46 -158L39 -161Q39 -162 42 -163T50 -166T61 -168Q77 -168 91 -145Q98 -128 105 -95L125 -1Q145 90 146 98Q149 109 163 180T189 317T202 384T158 385H114Q108 390 108 393T110 412Q113 424 120 431H165Q211 431 211 433Q213 435 219 473T237 561T266 639Q282 667 310 686T367 705Q402 705 426 686T450 635Q450 600 430 585T390 569Q373 569 362 580T351 608",103:"103 163Q106 263 173 347T320 441Q322 441 329 441T341 442Q387 439 419 398Q420 399 420 400Q421 402 425 406T440 416T464 422Q476 421 485 413T494 396Q494 386 465 268T407 38T377 -77Q365 -123 310 -164T179 -205Q46 -205 46 -139Q46 -114 64 -97T106 -79Q127 -79 136 -91T146 -115Q146 -127 141 -138T130 -155T124 -162T125 -163Q133 -166 170 -168Q200 -168 217 -162Q242 -153 264 -130T297 -78Q298 -74 305 -46T320 10T327 38Q326 38 317 31T291 15T256 2Q249 1 231 1Q182 1 143 38T103 163ZM398 324Q398 330 395 346T375 383T332 405Q330 405 326 405T320 404Q291 396 263 365Q230 324 208 239T185 115Q185 38 238 38Q258 38 279 50T312 77T336 106L348 122Q349 125 373 223T398 324",104:"398 44Q398 26 414 26Q431 26 451 43Q477 71 496 136Q499 148 501 150T515 153H521Q531 153 534 153T541 150T544 143Q544 133 534 105T496 41T432 -8Q424 -10 408 -10Q370 -10 348 12T326 72Q326 93 342 135Q397 288 397 349Q397 367 396 372Q386 405 357 405Q283 405 228 310Q217 290 212 274T180 152Q153 42 148 26T135 3Q121 -11 102 -11Q89 -11 80 -3T69 19L216 616Q216 629 209 632T170 637H149Q143 643 143 645T145 664Q150 683 158 683Q163 683 223 688T300 694Q312 694 312 685Q312 674 277 539Q241 395 241 393Q242 394 249 399T259 407T271 415T285 424T300 431T318 437T338 440T362 442Q423 442 449 410T475 338Q475 290 437 178T398 44",105:"234 599Q234 620 251 638T292 656Q306 656 319 647T332 617Q332 594 313 577T273 560Q260 560 247 569T234 599ZM75 287Q75 292 82 313T103 362T142 413T196 441H214Q248 441 270 419T293 357Q292 338 289 330T245 208Q193 72 193 46Q193 26 209 26Q228 26 247 43Q273 71 292 136Q295 148 297 150T311 153H317Q327 153 330 153T337 150T340 143Q340 133 330 105T292 41T228 -8Q220 -10 204 -10Q160 -10 141 15T122 71Q122 98 171 227T221 384Q221 396 218 400T203 405Q175 403 156 374T128 312T116 279Q115 278 97 278H81Q75 284 75 287",106:"266 600Q266 622 283 639T322 656Q340 656 352 645T364 616Q364 596 347 578T305 560Q291 560 279 569T266 600ZM75 287Q75 293 86 316T117 369T168 420T236 442Q282 442 304 415T327 358V332L278 134Q269 98 260 60T246 3T236 -36T227 -66T220 -85T213 -101T204 -114Q181 -150 139 -177T46 -204Q8 -204 -12 -186T-32 -140Q-32 -112 -14 -96T27 -79Q48 -79 57 -91T67 -114Q67 -146 38 -166Q42 -168 49 -168Q75 -168 98 -147T130 -108T146 -71Q150 -59 199 138T250 346Q253 359 253 373Q253 405 230 405Q206 405 184 386T149 345T126 301L117 280Q115 278 98 278H81Q75 284 75 287",107:"158 683Q163 683 223 688T300 694Q312 694 312 686Q312 679 262 478L211 273Q212 272 219 276T248 299T296 349Q317 371 328 382T360 410T399 434T439 442Q462 442 480 427T498 373Q498 329 479 313T437 296Q420 296 409 305T398 331Q398 357 413 372T445 391Q454 392 448 399Q445 405 431 405Q408 405 377 385Q351 368 314 327T250 261Q243 257 243 254Q249 254 279 243T328 220Q366 192 366 146Q366 131 361 109T355 62V54Q355 26 376 26Q379 26 387 28Q420 36 443 130Q449 151 454 152Q457 153 465 153H470Q484 153 488 152T492 144Q492 141 489 126T476 88T454 42T420 5T372 -11Q331 -11 306 17T280 88Q280 100 283 119T287 146Q287 172 265 190T221 215T198 220Q197 220 173 121Q152 37 148 24T135 3Q121 -11 102 -11Q89 -11 80 -3T69 19L216 616Q216 629 209 632T170 637H149Q143 643 143 645T145 664Q150 683 158 683",108:"162 61Q162 26 183 26Q211 26 239 131Q245 151 249 152Q252 153 261 153H266H271Q288 153 288 144Q288 143 286 129Q276 91 266 65T232 14T179 -11Q144 -11 116 12T87 81Q87 96 88 102L216 616Q216 629 209 632T170 637H149Q143 643 143 645T145 664Q150 683 158 683Q163 683 223 688T300 694Q312 694 312 686Q312 676 240 389L164 86Q162 74 162 61",109:"81 278Q75 284 75 289Q77 299 89 338Q101 373 114 396T142 428T166 439T186 442H189Q225 440 251 417Q266 401 271 384L275 374L286 386Q342 442 414 442Q428 442 440 440T461 435T479 427T493 418T503 407T511 397T516 387T520 378T523 370L524 366Q546 395 583 418T667 442Q729 442 755 411T782 338Q782 290 743 178T704 45Q704 26 720 26Q773 26 802 136Q805 148 807 150T822 153H828Q838 153 841 153T848 150T851 143Q851 137 843 115T821 63T778 12T715 -10Q671 -10 652 16T632 71Q632 88 668 191T704 349Q704 367 703 372Q693 405 664 405Q637 405 613 393T571 360T547 329T534 309Q523 290 518 274T487 151Q455 24 452 16Q438 -11 408 -11T376 18Q376 26 411 167T447 314Q449 325 449 346Q449 372 444 384Q431 405 408 405Q334 405 276 305Q266 289 262 273T231 151Q199 24 196 16Q182 -11 152 -11T120 18Q120 26 159 182T200 347Q202 361 202 372Q202 405 181 405Q168 405 159 391Q145 374 132 328T117 280T98 278H81",110:"449 44Q449 26 465 26Q482 26 502 43Q528 71 547 136Q550 148 552 150T566 153H572Q582 153 585 153T592 150T595 143Q595 133 585 105T547 41T483 -8Q475 -10 459 -10Q421 -10 399 12T377 72Q377 93 393 135Q448 288 448 349Q448 367 447 372Q437 405 408 405Q381 405 357 393T315 360T291 329T278 309Q267 290 262 274T231 151Q199 24 196 16Q182 -11 152 -11T120 18Q120 23 159 181Q199 343 199 346Q202 360 202 372Q202 406 183 406Q163 406 148 374Q142 360 135 338T124 299T117 280T98 278H81Q75 284 75 287Q76 293 78 303T90 341T110 388T141 425T184 442Q195 442 204 441T221 436T235 429T247 421T256 412T262 403T267 394T271 387T273 381L274 378V374L287 387Q342 442 414 442Q474 442 500 410T526 338Q526 290 488 178T449 44",111:"103 155Q103 266 185 354T366 442Q435 442 476 394T517 275Q517 169 436 79T255 -11Q194 -11 149 32T103 155ZM187 119Q187 67 209 47T260 26Q290 26 321 47Q354 68 380 113T426 260Q432 291 432 315Q432 361 408 385Q388 405 358 405Q319 405 283 374T227 294Q217 271 202 213T187 119",112:"81 278Q75 284 75 287Q93 379 131 417Q154 442 189 442Q222 440 243 423T272 382L280 390Q335 442 389 442Q446 442 482 398T518 284Q518 212 480 137T375 19Q321 -10 291 -10H282H278Q237 -10 204 28L202 32L181 -51Q160 -135 160 -139Q160 -147 205 -148H230Q236 -155 236 -157T233 -175Q230 -187 227 -190T214 -194Q211 -194 202 -194T169 -193T108 -192Q40 -192 21 -194H13Q6 -187 6 -183T9 -167Q13 -153 16 -151T39 -148Q73 -147 78 -136Q82 -128 139 104Q199 337 199 347Q202 362 202 372Q202 406 182 406Q169 406 159 391Q145 374 132 328T117 280T98 278H81ZM221 111Q234 26 286 26Q307 26 336 47T385 116Q398 147 416 217T435 332Q435 354 433 361Q420 405 383 405Q333 405 279 326L273 317L221 111",113:"228 -11Q172 -11 137 33T101 147Q101 205 125 266T201 377T318 441Q322 442 333 442Q388 442 420 394L429 403Q439 413 455 423T481 437T494 442Q498 442 501 439T504 434Q504 425 435 149Q364 -135 364 -139Q364 -147 409 -148H434Q440 -155 440 -157T437 -175Q433 -191 429 -193Q425 -194 418 -194Q416 -194 406 -194T372 -193T309 -192Q259 -192 233 -192T204 -193Q190 -193 190 -184Q190 -181 192 -169Q196 -153 199 -151T219 -148Q266 -148 277 -141Q283 -137 305 -51L325 29L316 22Q270 -11 228 -11ZM397 323Q397 329 394 340T385 367T365 394T333 405Q302 405 271 372Q249 349 235 316T203 215Q184 135 184 108V100Q184 71 191 56Q204 26 235 26Q267 26 300 57T344 112Q347 117 372 217T397 323",114:"81 278Q75 284 75 289Q77 301 89 339Q122 442 183 442Q219 442 241 425T271 384L283 396Q327 442 384 442Q424 442 454 421T484 362Q484 327 464 312T424 296Q407 296 396 305T385 331Q385 352 394 365T414 384T424 390Q409 405 378 405Q322 405 276 315L268 300L234 161Q200 25 196 16Q182 -11 152 -11T120 18Q120 23 159 181Q199 343 199 346Q202 360 202 372Q202 405 182 405Q164 405 150 377T128 316T117 280Q115 278 98 278H81",115:"153 285Q153 349 197 395T311 442Q355 442 386 420T418 356Q418 321 401 308T365 294Q336 294 331 326Q331 336 334 345T343 359T353 368T362 374L366 376Q365 379 362 383T344 396T308 404Q265 404 246 377T226 325T244 289T287 275T339 258T383 212Q395 188 395 163Q395 132 379 95T333 32Q279 -11 207 -11Q154 -11 115 13T76 86Q76 108 83 123T102 145T121 153T135 156Q154 156 164 145T175 117Q175 82 142 66L132 62Q131 62 131 61Q131 57 139 49T166 34T210 26Q250 26 277 44T312 83T321 123Q321 153 301 166T248 185T204 198Q176 211 162 241Q153 258 153 285",116:"94 385Q87 392 87 395Q87 399 90 411T95 425Q97 430 103 430T149 431H196L215 511Q218 521 222 539T228 565T234 585T242 603T251 615T264 623T281 626Q311 626 315 597Q315 591 296 513T275 433Q275 431 320 431H366Q373 424 373 420Q373 398 360 385H263L189 86Q188 80 188 61V54Q188 29 201 27Q213 23 229 30Q253 37 276 66T316 138Q321 149 324 151T342 153H347Q364 153 364 146T360 130Q331 63 290 26T202 -11Q158 -11 135 18T111 81Q111 93 129 168T166 314L184 383Q184 385 139 385H94",117:"75 287Q75 299 89 333T135 404T205 441Q246 441 269 420T293 357Q292 338 259 245T225 95Q225 26 274 26Q301 26 324 43T358 77T369 99Q369 102 406 249T446 404Q460 431 490 431T522 402Q522 394 485 245T446 89Q443 74 443 56Q443 28 461 26Q487 26 507 86Q524 130 524 146Q524 147 530 153H547Q570 153 570 144Q570 138 561 109T544 62Q530 29 512 12Q492 -11 454 -11Q429 -9 410 2T385 23T376 41L363 28Q350 16 325 3T269 -10Q204 -10 176 25T148 108Q148 161 184 262T221 383Q221 405 206 405Q178 405 158 375T128 313T116 279Q115 278 97 278H81Q75 284 75 287",118:"387 386Q387 407 406 425T445 443Q466 443 479 423T492 371Q492 330 473 253Q411 18 307 -8Q298 -10 279 -10Q208 -10 179 26T149 114Q149 162 185 261T221 384Q221 405 206 405Q177 405 157 375T128 313T116 279Q115 278 97 278H81Q75 284 75 287T79 304T93 342T119 388T158 425T210 441H218Q243 441 268 421T293 357Q292 337 259 245T226 102Q226 26 285 26Q328 26 360 72T422 237Q429 265 429 290Q428 324 408 349T387 386",119:"591 386Q591 407 610 425T649 443Q670 443 683 423T696 371Q696 327 672 232T621 85Q575 -11 493 -11Q469 -11 449 -6T418 8T398 24T386 38L382 43Q347 -10 293 -10H286Q221 -10 186 21T150 115Q150 164 185 262T221 384Q221 405 206 405Q177 405 157 375T128 313T116 279Q115 278 97 278H81Q75 284 75 287T79 304T93 342T119 388T158 425T210 441H218Q243 441 268 421T293 357Q292 336 260 246T227 108Q227 26 292 26H295Q332 26 361 93L366 103V119Q366 122 367 133T369 150Q372 167 401 282T433 404Q446 431 477 431Q507 431 509 402Q509 396 500 358T474 254T446 140Q444 126 444 104V92Q444 66 459 46T502 26H505Q527 28 545 43T577 88T602 149T623 226Q633 265 633 290Q632 324 612 349T591 386",120:"275 356Q275 383 262 394T233 405Q196 405 166 371T121 289Q119 280 116 279T98 278H81Q77 282 76 283T75 288T78 300Q88 332 109 363T153 411Q195 442 235 442Q306 442 333 386Q373 442 427 442Q461 442 487 421T513 364T494 312T453 296Q436 296 425 305T414 331Q414 352 424 366T446 386L456 390Q448 404 421 404H418Q382 404 358 341Q355 332 328 227T298 105Q295 90 295 75Q295 26 339 26Q365 26 388 43T424 82T444 123T451 146L457 153H474Q490 153 493 152T496 144Q496 133 486 110T456 58T404 10T333 -11Q276 -11 237 45Q197 -11 146 -11Q108 -11 83 10T58 67Q58 99 76 117T119 135Q136 135 147 124T158 96Q158 89 157 85Q149 57 125 45L115 41Q125 26 151 26Q171 26 187 45T214 93Q217 102 244 210T273 330Q275 339 275 356",121:"75 287Q75 299 89 333T135 404T205 441Q246 441 269 420T293 357Q292 338 259 245T225 95Q225 26 274 26Q325 26 367 93L405 245Q442 393 446 404Q460 431 490 431T522 402Q522 400 416 -24Q389 -102 327 -153T196 -205Q152 -205 122 -181T91 -119Q91 -84 110 -67T152 -49Q170 -49 180 -60T191 -87Q191 -108 174 -128Q167 -134 157 -138T146 -144Q155 -153 159 -156T173 -163T199 -167Q229 -167 255 -149T297 -105T325 -52T342 -6T347 15Q315 -10 269 -10Q204 -10 176 25T148 108Q148 161 184 262T221 383Q221 405 206 405Q178 405 158 375T128 313T116 279Q115 278 97 278H81Q75 284 75 287",122:"160 317Q158 317 155 317Q136 317 136 324Q136 351 171 396T260 442Q292 442 321 410T365 375H369Q384 375 404 408L425 441Q427 442 444 442H460Q466 436 466 434Q466 419 426 367Q387 314 294 222T178 105L170 95L181 94Q198 93 236 81T295 68Q328 68 356 89T395 141Q398 150 401 151T419 153Q441 153 441 144Q441 110 394 50T282 -11Q251 -11 221 23T171 57Q157 57 143 47T121 26T104 3T95 -10Q93 -11 76 -11H60Q54 -5 54 -2Q54 3 61 14Q103 88 233 215Q349 329 349 338L302 351Q269 362 247 362Q227 362 212 356T192 342T183 327T178 320Q175 317 160 317"},{})},1044:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texOldstyleBold=void 0;var n=r(768),o=r(8199);e.texOldstyleBold=(0,n.AddPaths)(o.texOldstyleBold,{48:"259 460H279Q352 460 403 444T491 378Q528 320 528 219Q528 100 475 45Q417 -17 287 -17Q152 -17 99 44T46 219Q46 246 47 265T57 318T82 376T131 422T210 454Q234 460 259 460ZM389 229V271Q389 351 371 380T280 409Q232 409 208 385Q194 371 190 345T185 229V210Q185 108 194 83Q208 35 287 35Q317 35 336 42Q372 55 380 85T389 204V229",49:"119 417Q191 417 240 428T310 450T338 461Q353 461 357 452T361 400Q361 389 361 342T360 254V62H420H456Q483 62 488 58T494 35V29Q494 13 491 7T473 0Q468 0 424 1T295 2T167 1T117 0Q114 0 111 0T107 1Q96 8 96 27V35Q96 54 102 58T140 62H170H229V213Q229 363 228 363Q220 360 196 358T150 356L130 355H93Q84 360 82 365T80 386Q80 404 81 407T95 417H119",50:"214 399Q202 399 191 398T175 395T170 392L171 390Q172 389 174 386T178 379T181 369T182 355Q182 328 165 312T123 296Q99 296 82 312T64 356Q64 397 105 428T253 460Q301 460 337 456T411 441T476 403T514 338Q516 328 516 310V304Q516 257 470 227Q456 217 427 205T376 184L354 176Q350 174 325 162T277 139L254 128Q414 129 428 130H439Q450 148 453 166T460 188T486 193H493Q515 193 517 178Q517 171 502 94T484 11Q481 3 472 2T410 0H269Q65 0 62 2Q55 5 53 10T51 32Q51 54 56 58Q60 62 173 131Q296 207 318 224Q368 264 368 308Q368 342 342 363T283 392T214 399",51:"80 309Q80 367 131 414T276 461Q388 461 441 417T494 313Q494 265 463 223T373 155L361 151L376 147Q436 132 480 92T525 -15T487 -127T393 -192T274 -211Q179 -211 114 -167T48 -53Q48 -18 69 5T128 29Q168 29 188 5T208 -50Q208 -59 207 -67T203 -81T197 -92T190 -101T183 -109T177 -114T170 -118L167 -121Q160 -125 164 -127Q167 -129 176 -133Q215 -152 268 -152H273Q337 -152 356 -92Q364 -69 364 -14Q364 45 352 74T303 120Q287 125 240 125H230Q201 125 196 127T191 146V152Q192 170 196 173T233 178Q234 178 241 178T252 179T262 181T274 183T285 188T297 195T308 205T319 218T328 235T337 257Q345 280 345 320V330Q345 345 343 355T335 379T312 399T270 407Q226 407 177 377Q226 356 226 310Q226 270 204 253T153 235Q123 235 102 253T80 309",52:"180 0Q155 0 124 0T84 -1Q48 -1 40 3T32 27V37Q32 59 34 63T204 265T377 465Q380 468 383 468H387Q391 468 398 468T411 469Q432 469 438 468T449 459Q451 455 451 258V62H489H498Q531 62 536 58T542 31Q542 9 537 5T504 0H489H451V-132H489H498Q530 -132 536 -136T542 -163Q542 -181 538 -187T522 -194Q518 -194 483 -193T378 -192Q281 -192 256 -193L217 -194Q203 -189 203 -169V-163V-158Q203 -140 209 -136T246 -132H265H314V0H180ZM325 62V320L105 63L215 62H325",53:"131 29Q159 26 175 12T194 -13T197 -35V-41Q197 -58 195 -66Q191 -76 185 -84T173 -97T161 -105T152 -109L148 -110Q148 -112 158 -121T195 -141T252 -152Q274 -152 280 -151Q335 -137 349 -104T363 9Q363 85 356 114T322 157Q305 166 286 166Q251 166 223 154T182 131T162 109Q154 98 150 96T130 93Q107 93 102 104Q100 107 100 279V371V424Q100 461 110 461Q114 461 123 458T149 450T183 441Q234 429 286 429Q313 429 340 432T387 440T422 449T447 457T458 461Q472 461 472 435Q472 420 470 418Q464 405 438 379T352 325T226 297Q189 297 171 301H168V182Q169 182 174 185T190 194T213 205T248 213T292 217Q391 217 454 159T517 5Q517 -92 444 -151T255 -211Q167 -211 112 -160T57 -44Q57 -12 76 8T131 29",54:"48 316Q48 398 70 462T124 562T198 621T274 652T339 660Q377 660 384 659Q497 632 497 532Q497 507 482 487T431 466Q397 466 381 486T365 530Q365 569 405 593Q382 603 381 603Q361 607 350 607Q316 607 279 589T221 533Q199 489 196 385L195 370Q196 371 203 379T217 395T237 410T263 424Q283 431 313 431Q409 431 468 368Q526 310 526 208Q526 131 492 81T405 5Q359 -17 289 -17Q256 -17 227 -11T163 17T105 73T65 170T48 316ZM293 380Q244 380 220 331T196 212Q196 104 216 80Q240 41 292 41Q295 41 301 41T309 42Q338 46 355 62Q372 81 375 108T379 230Q378 314 372 333Q358 375 299 380H293",55:"95 210H88Q66 210 64 225Q64 229 82 345T102 465Q106 476 125 476H131Q162 476 162 458Q162 451 213 448Q221 448 238 447T260 446Q261 446 410 444Q436 444 468 444T509 445Q544 445 551 440T558 413V404Q558 395 547 380T478 301L392 202Q354 150 339 81T321 -104V-132Q321 -187 286 -203Q273 -211 255 -211Q236 -211 217 -199T190 -160Q189 -153 189 -130Q194 17 282 156Q309 200 370 270Q404 307 400 307H293Q151 306 146 303Q140 300 132 259T120 215Q115 210 95 210",56:"48 164Q48 199 59 228T92 277T128 307T163 329Q159 332 155 336Q135 346 110 382Q80 427 80 477Q80 564 147 620Q202 660 264 660Q266 660 275 660T290 661Q384 661 439 619T494 506Q494 486 489 468T477 437T459 413T440 395T421 380T406 370L410 368Q414 365 421 361T437 351T456 335T476 316T495 291T511 262T522 228T526 189Q526 93 460 38T282 -17Q242 -17 205 -9T130 19T71 75T48 164ZM406 506Q406 545 379 576T283 607Q218 606 193 585T168 536Q168 522 172 513T195 490T224 471T275 443L346 403Q406 446 406 506ZM291 42Q365 42 395 70T425 134V141Q425 170 401 190T319 242Q308 248 302 251Q286 260 266 271T235 288L225 294Q222 292 217 289T198 274T175 249T157 212T148 163Q148 116 179 79T291 42",57:"175 -140Q198 -152 236 -152Q294 -152 332 -116Q356 -91 366 -54T379 62V78L376 74Q372 70 366 64T352 50T333 35T308 23Q289 17 262 17Q168 17 108 77T48 235Q48 273 59 317Q81 381 141 421T276 461Q279 461 285 461T295 460Q326 460 354 454T415 426T471 371T510 277T526 136Q526 42 501 -28T432 -136T341 -192T240 -210Q199 -210 169 -201T121 -178T94 -146T80 -112T77 -82Q77 -51 95 -33T143 -15Q170 -15 189 -33T209 -81Q209 -116 175 -140ZM377 244V274Q377 300 376 316T368 352T348 384T312 405Q307 406 283 406Q257 406 238 396T213 376T205 361Q196 341 196 259V233V181Q196 122 211 96T278 69H298Q330 82 345 104Q367 134 376 190Q377 200 377 244",65:"761 751Q784 751 784 728V711Q784 570 795 417T820 191Q844 76 865 76Q868 76 902 93T962 112H973Q989 104 989 94Q989 92 987 86Q978 47 846 -11Q812 -25 779 -26Q722 -26 708 9Q688 47 669 161H524L379 162L359 136Q286 43 234 -3T142 -49T71 -19T39 55Q39 92 60 131T103 174Q113 174 117 167T124 149T136 128T166 110Q183 105 190 105Q230 105 341 246Q401 322 453 397T531 514T582 601T611 651H640V663Q640 692 676 718T745 750Q747 750 752 750T761 751ZM658 266Q653 312 649 377T644 489T641 541V556L557 415Q500 325 448 253Q467 261 524 261H568H658V266",66:"441 83Q571 83 571 195Q571 246 538 279T466 322T386 333Q378 333 357 330T329 327Q307 327 307 345Q307 354 313 365T347 396T419 430Q546 472 581 498Q594 508 594 535Q594 574 567 589T508 604Q469 604 442 583Q390 546 342 457T265 256Q237 148 186 60Q167 29 144 13Q105 -15 68 -17H65Q40 -17 40 1Q40 7 53 29T87 100T124 210Q162 373 190 575Q188 575 174 567T138 550T98 542Q75 542 75 560Q75 588 123 618Q135 625 203 659T281 696Q299 703 316 703Q339 703 339 685Q339 656 328 583L333 588Q338 592 346 599T367 615T394 634T428 654T467 674T511 690T559 701T611 705Q651 704 681 689Q739 659 739 598Q739 507 595 427L584 421Q585 420 595 416T610 410T626 402T644 392T660 380T677 365T691 347T703 325T710 299T715 268Q717 193 665 130Q622 73 531 28T348 -17Q275 -17 225 10Q206 19 200 24T193 36Q193 57 231 86T311 119H322Q386 83 441 83",67:"243 -20Q135 -20 78 48T20 218Q20 280 39 344T98 470T193 580T324 661T488 702H490Q491 702 493 702T498 703T507 703T518 702H526Q599 702 599 631Q599 597 577 550T541 486Q523 463 490 447T431 430Q423 430 419 433Q409 437 409 450Q410 456 432 499T454 567Q454 586 446 594T415 603Q316 603 254 532Q216 487 190 421T164 284Q164 228 181 186T226 122T282 90T340 80Q377 80 405 96T449 131T492 167T553 187H555Q580 187 580 168Q580 153 551 123T476 60T367 4T243 -20",68:"107 0Q92 5 92 18Q92 33 113 53T160 86Q170 91 182 94T197 100L206 120Q248 226 273 337T304 501T309 585Q278 585 234 577T179 557Q172 550 166 532T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q281 686 447 686H480H517Q692 686 784 631Q885 571 885 450Q885 339 805 239T586 75T286 1Q276 0 187 0H107ZM741 391Q741 424 731 452T694 510T613 558T481 584Q476 584 468 584T457 585L449 586V579Q441 501 425 424T391 292T357 193T330 125T319 100H324Q511 100 628 175Q688 215 714 275T741 391",69:"495 516Q485 516 478 520T470 532Q470 537 476 550T482 570Q482 589 465 596T401 603Q344 603 319 582Q295 558 295 519Q295 493 312 474T355 445T407 432T455 427Q477 427 477 409Q477 395 453 371T389 333Q380 330 345 327T279 312T223 272Q181 223 181 176Q181 131 225 107T324 83Q366 83 395 98T448 136T487 167Q517 185 547 187H551Q574 187 574 170Q574 151 535 113T421 36T271 -15Q260 -16 226 -16Q181 -16 152 -9Q104 4 71 33T37 111Q37 140 50 176T106 263T216 356Q215 357 207 362T190 374T172 392T156 419T150 456Q150 521 208 580T341 670T474 702Q475 703 499 703Q528 703 547 701T586 693T615 673T627 637Q627 584 581 550T495 516",70:"812 567Q804 567 795 570T786 579Q786 586 647 586H559L558 582Q558 575 539 510T506 407L498 384H775Q788 378 790 368Q790 328 746 298T665 268Q646 268 642 284H457L447 261Q396 150 360 94Q329 46 270 8T149 -30Q123 -30 100 -24T63 -10T37 9T22 26T17 36Q17 59 56 88T135 119Q145 119 149 117T165 104Q187 78 227 72Q232 72 234 76Q245 93 273 145T350 323T424 570L428 586H276Q265 575 239 563T190 551Q180 551 174 556T167 569Q167 580 179 597T213 634T278 668T371 685Q374 686 624 686Q863 685 888 682Q917 678 927 663Q930 658 930 650Q930 624 888 596T812 567",71:"50 279Q50 361 88 438T190 570T335 661T503 702H514Q524 703 532 703Q671 703 671 626Q671 580 614 514T495 447Q472 447 472 465Q472 477 499 511T527 562Q527 582 507 592T433 602Q351 602 302 569Q252 535 223 469T194 344Q194 266 237 217T352 168Q401 168 442 205T505 316Q515 345 551 368T622 393H625Q649 393 649 376Q649 371 635 318T612 237Q580 129 540 62T442 -49Q353 -114 264 -114Q259 -114 252 -114L246 -113Q190 -113 142 -107T81 -96Q71 -90 71 -81Q71 -57 110 -30T187 2Q196 2 236 -4T338 -14Q371 -14 377 -9Q410 24 446 113L451 127Q353 68 253 68Q157 68 104 129T50 279",72:"42 447Q20 447 20 465Q20 481 47 515T119 589T239 657T392 686Q443 686 463 664T484 616Q484 570 473 506T452 401L441 360Q441 359 550 359H660L663 370Q684 435 716 522T758 624Q771 646 806 666T870 686Q894 686 894 668Q894 667 867 597T804 416T752 218Q737 135 737 93Q737 77 746 65T778 53Q799 53 803 54T814 63Q831 86 864 103T924 120Q946 120 946 100Q945 85 931 63T888 16T806 -27T684 -48H681Q625 -48 603 -10Q593 4 593 29Q593 71 603 131T624 230L634 269Q632 269 624 266Q610 261 600 261T507 259H411L399 222Q344 62 322 21Q301 -7 268 -24T209 -41H207Q187 -41 185 -25Q185 -17 192 2T220 71T261 184Q284 256 284 258Q284 259 227 259H170Q169 259 166 261T162 264T158 266T156 271T155 277Q155 296 184 320T250 356Q259 358 286 359Q312 359 312 360Q314 372 318 385Q332 450 339 526Q339 530 339 535T340 543Q340 586 296 586Q255 586 227 576T188 553T165 523T146 497Q127 476 97 462T42 447",73:"56 499Q32 499 32 516Q32 540 64 580T165 649Q241 682 365 685Q366 685 376 685T405 685T445 686T496 686T553 686H732Q746 677 746 668Q746 646 711 620T642 587L572 586H503Q479 546 458 479T424 352T383 224T318 111L309 101L412 100H514L523 109Q567 150 618 153Q644 153 644 135Q644 132 642 124Q629 86 581 52T476 6Q454 2 433 2T216 0Q-11 0 -15 2Q-27 6 -27 18Q-27 37 2 61T59 93Q77 100 142 100H198Q255 177 299 369Q337 513 382 574L391 586H348Q261 586 176 576Q163 543 124 521T56 499",74:"286 390Q263 390 263 407Q263 432 293 481T367 566Q511 687 724 687Q738 687 761 687T793 686H923Q937 677 937 668Q937 648 905 623T842 589Q829 587 817 586T802 585T795 583T788 578Q709 506 632 189Q622 153 615 134T588 81T537 17Q482 -39 404 -76T247 -114Q192 -114 158 -100Q53 -61 53 32Q53 59 58 73T79 102Q126 147 177 147Q200 147 200 128Q200 123 198 112T196 96Q196 47 238 17T345 -13Q362 -13 377 -9T404 0T426 16T444 34T459 55T470 76T478 97T483 116T488 132L490 141Q511 222 520 257T554 364T608 486T675 576L685 586H634H612Q532 586 484 564Q453 549 436 526T409 478T395 447Q378 424 345 407T286 390",75:"98 542Q75 542 75 560Q75 588 123 618Q132 624 199 657T275 694Q291 703 315 703Q327 703 332 699T338 690T339 670Q339 596 323 505T283 337T237 194T198 90L181 53Q170 31 136 8T68 -17H65Q40 -17 40 0L76 92Q112 185 150 322T194 564V578L168 565Q125 542 98 542ZM834 142Q834 125 819 100T774 48T692 3T576 -16H560Q540 -16 508 6Q469 33 422 108T342 267T309 398Q309 411 310 417T320 442T347 482Q401 542 517 615T710 702Q712 702 721 702T735 703Q772 703 791 690Q819 674 819 646T792 597T733 574H722Q704 584 704 599Q706 607 700 610T672 617L660 613Q609 595 524 538T423 450V440Q423 376 488 247T604 83Q621 70 640 70Q677 70 701 82Q713 87 718 101T737 132T783 160Q792 163 807 163Q834 163 834 142",76:"63 -17Q41 -17 41 0Q41 22 85 54Q101 68 113 92T133 141T154 219T182 315Q230 462 306 553Q345 599 391 632T478 678T543 697T582 703Q584 703 589 703T598 702Q643 702 666 676T689 613Q689 588 683 575Q674 551 632 524T552 496Q530 496 530 512Q530 517 531 525T533 538Q533 559 522 577T480 596H476Q462 596 451 588T415 544Q350 447 310 281Q284 181 261 136L255 124H285Q342 123 441 107T583 90L596 89Q603 116 647 144T729 173Q751 173 751 157Q751 118 685 60T523 -15Q514 -16 479 -16Q421 -16 320 0T171 18H155L142 10Q98 -17 63 -17",77:"38 20Q38 59 60 99T104 139Q106 139 126 125T176 106H181Q200 106 221 139T286 281Q322 370 342 451T368 581T376 634Q384 657 420 680T487 703Q502 703 507 696T522 649Q538 589 554 537Q579 453 609 372T660 248T686 202Q687 201 739 244T830 322L1166 642Q1225 700 1230 701Q1230 701 1237 703Q1258 703 1258 667L1253 637Q1248 607 1241 558T1227 451T1214 326T1209 202Q1209 77 1232 77Q1237 77 1269 94T1326 112H1329Q1353 112 1353 94Q1353 81 1334 60Q1311 37 1248 7T1150 -24H1141H1135Q1085 -24 1074 26Q1064 75 1064 134Q1064 239 1086 426Q1087 430 1087 434L1061 410Q871 227 783 149L694 76Q653 44 647 40T631 34Q620 34 616 37T594 63Q546 125 514 198Q467 307 423 449L418 466L412 444Q376 310 306 153Q278 88 251 45T201 -18T163 -43T131 -49Q102 -48 70 -31T38 20",78:"47 139Q81 105 122 105Q137 105 147 117Q159 134 182 199T234 381T274 610Q275 634 284 647Q297 666 327 684T389 703Q403 703 408 695T428 645Q480 490 567 298Q628 163 673 103Q674 102 674 102T675 106Q732 331 803 551Q842 674 875 725Q908 775 966 807T1081 840H1084Q1105 840 1105 803Q1105 768 1088 733T1051 689Q1045 686 1032 686Q986 683 948 663T901 624Q881 579 837 430T760 154L726 28Q725 28 725 28T723 25Q716 0 682 -24T611 -48Q600 -48 595 -45T576 -23Q522 44 480 124Q417 243 332 463L328 473L325 457Q291 293 227 124Q159 -49 72 -49Q38 -49 5 -28Q-24 -8 -24 21Q-24 58 -3 98T41 139H47",79:"433 703Q456 703 456 685Q456 672 441 655T407 627Q402 623 378 611T328 579T276 524Q207 434 207 324Q207 222 270 153T441 84Q566 84 651 177T737 400V405Q737 496 693 549T576 603Q542 603 510 560Q490 537 472 502T442 454Q397 412 346 409Q320 409 320 427Q320 430 322 436Q331 465 360 507T433 594T542 671T677 703Q776 703 829 636T882 468Q882 369 831 277T702 122T528 21T343 -17Q214 -17 139 61T63 257Q63 336 94 409T173 534T272 625T367 684T432 703H433",80:"170 -67Q147 -67 147 -49Q147 -42 162 -8T204 99T253 254Q274 332 288 415T305 542L308 585Q277 585 234 577T179 557Q172 550 166 532T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q279 686 448 686H495H537Q622 686 678 677T784 637Q846 598 846 533Q846 452 776 375T597 252T378 206H366L358 181Q341 130 316 68T282 -7Q262 -33 230 -50T170 -67ZM701 468Q701 512 661 540T570 577T461 586H448V582Q446 576 443 545T428 447T395 301L389 280Q390 280 398 284T419 295T441 303Q443 304 484 306T572 321T651 359Q701 402 701 468",81:"874 453Q874 372 836 298T750 177T638 89T543 33T486 8L483 7Q485 5 523 -7T622 -32T726 -46Q741 -46 746 -45T755 -41T762 -27Q770 -1 806 23T878 50H890Q905 42 905 33Q905 -8 838 -68T670 -145Q662 -146 628 -146Q538 -146 389 -100T164 -50Q132 -50 132 -32T162 11T227 47Q231 48 286 51T394 62T518 100T641 180Q730 271 730 387Q730 478 673 540T520 602Q410 602 337 525T264 355Q264 284 310 244T420 203Q476 203 568 222Q594 222 594 204Q594 184 565 161T508 128Q433 103 316 103Q227 103 174 157T120 290Q120 382 182 471T343 620T548 697Q578 703 601 703Q604 703 611 703T623 702Q663 702 687 696Q760 679 817 618T874 453",82:"159 0Q159 5 172 34T205 114T245 229T284 386T309 575V585H304Q303 585 295 585T282 584Q233 579 207 570T175 553T165 531T156 509Q140 484 105 466T44 447Q20 447 20 465Q20 482 34 510T76 565Q122 608 173 632Q279 686 448 686H505H582Q683 686 745 672T834 611Q842 594 842 565Q842 523 824 484T780 419T722 370T669 336T632 318L619 312L626 302Q640 279 667 227T696 172Q717 133 735 112T762 88T784 84Q824 84 872 118T957 153Q981 153 981 136Q981 114 937 78T820 13T684 -17Q646 -17 616 8T569 66T526 151T477 234Q461 256 446 265Q437 272 421 274Q400 274 400 291Q400 311 430 336T495 371Q496 371 543 374T627 392T681 436Q699 467 699 503Q699 550 644 568T471 586H449V582Q449 581 447 559T438 499T422 413T393 298T348 165Q313 73 296 45Q282 24 249 4T185 -17Q159 -17 159 0",83:"204 476Q204 525 248 577T372 666T539 703T674 683T721 612Q721 588 714 569Q704 547 669 524T601 499Q573 499 573 516Q573 521 575 527T577 543Q577 563 568 574T548 588L539 590Q490 603 444 603Q418 603 394 597T364 583Q348 567 348 533Q348 493 382 466T459 425T555 387T633 330Q662 292 662 249Q662 153 544 69T257 -16Q218 -16 208 -15Q118 1 64 46Q25 76 25 126Q25 185 82 235T203 290H207Q229 290 231 274Q231 243 180 213Q173 209 172 206T170 189T171 170T183 150T216 121Q273 83 356 83Q412 83 459 100Q493 111 507 141Q518 165 518 185Q518 208 506 228T478 262T437 288T398 306T360 320Q316 335 285 352T239 384T215 416T205 443T204 467V476",84:"61 462H59Q38 462 38 479Q38 528 109 594T289 683L304 685L837 687L846 693Q889 720 923 720Q947 720 947 702Q945 671 892 631T776 583Q774 583 772 583T769 582T766 582L764 581H758Q753 581 744 581T722 580T693 580T662 580H563L514 385Q507 355 493 299T475 225T460 172T443 119T426 76T402 24Q386 -11 355 -33T304 -61T266 -69Q242 -69 242 -50Q243 -45 253 -25T278 32T307 115L364 340Q405 511 413 538T436 580H207Q202 572 200 568T197 561T195 552T190 537Q176 511 135 487T61 462",85:"124 586Q107 586 74 569T15 552H13Q-10 552 -10 570Q-10 605 70 645T222 686Q283 686 283 631Q283 590 246 504T172 326T135 181Q135 130 157 107T205 83Q221 83 259 106Q347 165 453 301T604 548Q607 557 612 569T619 587T624 600T628 612T632 621T637 628T641 634T647 640T654 645T662 652Q706 686 748 686Q771 686 771 669Q771 656 754 614T700 467T630 229Q615 168 610 105Q610 88 617 78L641 90Q681 111 706 112Q733 112 733 95Q733 82 714 60Q694 40 633 10Q567 -23 532 -24Q507 -24 495 -17Q466 -4 466 32Q466 96 500 225Q277 -17 102 -17Q56 -17 23 17T-10 118Q-10 164 13 234T64 363T115 481T139 567Q139 586 124 586",86:"25 608Q25 628 60 657T148 686Q184 683 213 671T273 625T327 538T363 394T380 184L381 134L399 148Q503 226 574 302T667 415T689 467Q688 474 684 482T672 502T645 521T600 532Q576 532 576 567Q576 604 597 644T641 685H649Q701 685 737 648T774 545Q774 457 703 333T461 66Q397 13 332 -32T255 -77Q237 -77 237 -30V-23Q241 20 241 109Q241 483 115 569Q91 586 50 589Q25 589 25 608",87:"25 607Q25 629 62 657T142 686Q205 686 248 647T312 541T339 411T347 275Q347 249 345 203V189Q375 219 449 316T587 516Q629 584 629 587Q629 589 626 597T622 607Q622 629 658 656T732 686H744Q755 680 757 678Q757 677 769 649T799 577T835 475T874 339T904 183Q908 157 910 151L925 169Q997 252 1059 343T1121 474Q1120 498 1103 513T1059 532Q1036 532 1036 568Q1036 600 1053 636T1090 683L1097 686H1109Q1147 684 1176 652T1206 551Q1206 460 1131 320T897 7Q859 -33 840 -52T816 -74T804 -77Q788 -77 784 -32Q783 -28 783 -26Q774 108 744 239T691 436T665 501Q664 501 649 475T602 400T528 289T420 146T280 -15Q243 -56 231 -66T210 -77Q191 -77 191 -40Q191 -38 195 -4T204 91T209 217Q209 290 202 351T177 469T126 557T45 589Q25 589 25 607",88:"762 562Q762 579 737 584T711 604Q711 630 753 658T834 686Q864 686 885 669T906 627Q906 580 834 522T614 379L584 362V357Q585 354 589 315T597 233T603 183Q610 132 627 116T671 100Q678 100 704 113T754 126T778 107Q776 79 733 45T626 2Q615 1 578 1Q542 1 535 3Q521 7 510 15T491 31T477 54T467 78T460 108T456 137T452 170T449 201Q447 220 445 240T442 270L441 281Q435 281 357 233Q240 165 206 135Q200 128 200 124Q200 113 208 108T226 101T244 96T252 82Q252 61 214 31T129 1H120Q97 1 77 16T56 60Q56 105 133 168T414 345Q428 352 431 354T433 359Q422 493 414 522Q407 551 395 566T373 583T350 586H341L332 580Q290 560 265 560Q243 560 243 577Q243 585 248 596T269 624T306 653T365 676T447 686H456Q472 686 484 683T514 671T543 637T562 576Q565 557 570 501L577 437Q577 436 613 457T694 506T756 551Q762 558 762 562",89:"73 555Q49 555 49 573Q49 602 110 644T239 686Q319 686 376 624Q416 584 444 511T483 361T499 240T503 173Q503 165 504 165Q506 165 524 184T556 218Q631 297 674 377T718 485Q718 505 699 526Q673 552 628 552Q619 552 613 562T607 590Q607 617 621 645T658 685Q661 686 671 686Q718 686 757 652T797 545Q797 476 749 369T602 146Q500 29 371 -67T176 -164Q112 -164 74 -120T36 -29Q36 5 55 36T95 67Q104 67 108 59T115 39T128 12T154 -12Q183 -30 216 -30Q239 -30 305 7L361 44L367 49V54Q367 95 364 143T351 273T312 429T243 546Q206 581 156 588L146 581Q108 555 73 555",90:"622 574Q522 579 420 579H396Q373 579 364 574T351 550Q339 516 297 490T218 462Q195 462 195 479Q195 487 197 492Q218 565 313 625T509 685Q564 685 650 683T755 680Q787 680 807 683T831 686Q853 686 853 669Q853 657 826 626Q742 532 641 437L619 415L622 414Q626 414 631 414T642 414Q697 411 697 388Q697 367 670 345T607 323Q605 323 592 325T546 329H522L490 302Q457 274 400 226T289 136L260 113L318 112Q345 111 452 109T587 106H627Q650 143 656 170Q666 197 710 225T788 253Q811 253 811 237Q811 211 781 160T710 77Q619 0 515 0Q507 0 497 0T484 1Q434 1 319 3T177 6Q123 6 95 2Q83 2 71 0H68Q46 0 46 17Q46 28 58 44Q68 56 100 80T210 165T383 307L408 329H361L314 330Q297 338 297 350Q297 368 320 388T368 413Q375 415 441 415H506L647 555L664 574H622"},{})},7292:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texOldstyle=void 0;var n=r(768),o=r(9848);e.texOldstyle=(0,n.AddPaths)(o.texOldstyle,{48:"39 213Q39 274 53 319T89 389T139 429T192 448T242 452Q347 452 400 400Q460 335 460 213Q460 -22 250 -22Q39 -22 39 213ZM364 242Q364 279 363 301T355 348T338 385T306 406T254 415Q250 415 245 415T238 416Q217 416 190 404T150 368Q136 339 136 221Q136 114 146 78T200 23Q219 16 250 16Q280 16 299 23Q341 41 352 77T364 221V242",49:"116 410Q176 412 215 423T269 443T288 453H291Q293 453 301 447V254Q301 62 303 60Q307 52 322 49T394 46Q418 46 422 43T426 23Q426 8 424 4T411 0Q407 0 369 1T258 2T148 1T106 0Q96 0 94 4T91 23Q91 40 95 43T123 46Q180 46 195 49T215 61Q216 63 216 220V376Q192 367 119 364H93L86 371V403L92 410H116",50:"55 334Q55 386 105 419T236 453Q333 453 390 413T448 307Q448 278 437 256T406 218T365 193T318 172T277 151L248 134Q219 118 191 102T163 84T267 83L382 85H391Q399 99 406 126Q410 143 413 145T429 148Q440 148 442 147T449 139Q449 137 435 73T420 7Q420 6 414 0H233Q94 0 71 0T46 5Q46 5 46 6Q44 8 44 24Q44 39 46 41Q47 44 98 78T212 155T294 212Q347 257 347 304Q347 354 306 380T203 407Q150 407 120 377Q118 375 123 373Q146 362 146 332Q146 315 133 302T101 288Q85 288 70 298T55 334",51:"69 312Q69 377 122 414T233 452Q333 452 381 409T430 313Q430 268 402 223T311 149L301 144Q307 143 317 140T355 123T402 92T439 44T456 -25Q456 -101 396 -158T241 -216Q154 -216 98 -173T42 -68Q42 -58 44 -50T50 -35T57 -25T66 -17T75 -13T82 -10L87 -8Q92 -7 102 -7Q132 -7 147 -25T162 -66Q162 -112 118 -125L113 -126Q113 -129 127 -140T173 -162T239 -173Q268 -173 292 -158Q345 -124 345 -24Q345 33 329 67Q298 125 229 125H210H172Q166 131 166 142Q166 159 172 161Q178 161 208 164T244 169Q251 169 263 176T291 199T316 245T327 314Q327 413 238 413Q182 413 130 369Q177 350 181 312Q181 289 166 273T125 257Q102 257 86 272T69 312",52:"163 0Q139 0 109 0T71 -1Q43 -1 36 2T28 15V27V46L190 270Q325 457 330 462Q333 464 352 464H371L377 458V46H464L471 40V6L464 0H377V-65V-108Q377 -131 379 -137T391 -144Q409 -148 446 -148H464Q468 -151 471 -155V-187L464 -194H453Q395 -192 325 -192Q222 -192 210 -194H199L193 -188V-154L199 -148H228Q241 -148 250 -148T265 -146T275 -145T281 -143T284 -141T286 -138T289 -134V0H163ZM295 46V350L75 46H295",53:"159 -44Q159 -66 145 -80T109 -96H102L107 -105Q148 -173 228 -173Q255 -173 280 -162Q351 -128 351 -6V8Q351 67 344 98T316 151Q288 176 255 176Q175 176 136 109Q129 100 114 100Q97 100 95 106Q93 110 93 277V403Q93 451 98 451Q100 452 103 452Q105 452 124 445T177 431T251 423Q294 423 328 430T380 445T401 453Q410 453 410 435V422Q332 331 203 331Q152 331 140 339Q139 339 139 254V168Q194 214 256 214Q332 214 390 154T448 0Q448 -95 381 -155T229 -216Q153 -216 104 -166T50 -49Q50 -15 66 -1T105 13Q128 13 143 -3T159 -44",54:"42 313Q42 401 68 472T133 583T215 644T296 665H304Q317 665 329 664T360 657T393 640T418 608T432 557Q432 533 422 519T401 502T380 498Q358 498 343 512T328 550Q328 591 367 601L372 602Q372 604 365 609T341 620T307 626Q260 626 226 600T174 537Q147 483 143 376V356Q192 434 266 434Q317 434 357 409Q406 375 435 317Q456 268 456 210V192Q456 169 451 149Q440 90 387 34T253 -22Q225 -22 199 -14T143 16T92 75T56 172T42 313ZM251 396Q211 396 178 354T145 217Q145 159 152 122T166 73T187 47Q216 21 252 21Q294 21 321 47Q342 68 349 99T356 203V232Q356 264 354 285T345 331T322 373T280 395Q274 396 251 396",55:"75 246Q64 246 62 247T55 255Q55 259 72 357T90 458L94 462H99Q104 463 109 463H121Q128 460 128 452Q128 445 134 441T165 435T233 432T356 431H478L485 425V392L414 298Q408 290 385 260T358 223T337 191T317 154T302 116T289 68T282 14T275 -55T274 -137Q274 -173 272 -177Q262 -216 223 -216Q170 -216 170 -157V-148Q172 -78 189 -12T237 109T288 196T338 266Q345 275 348 279Q395 340 395 342Q396 343 376 343T274 343Q122 342 117 339T103 294T90 248Q88 246 75 246",56:"69 496Q69 570 124 618T247 666Q321 666 375 624T429 515Q429 468 405 433T320 361L346 344Q385 320 403 301T439 250Q456 212 456 181V172V160Q456 141 449 119T426 71T386 26T326 -8T246 -21Q160 -21 102 30T43 155Q43 265 167 332L176 337L161 347Q105 384 87 423Q69 458 69 496ZM371 513Q371 567 334 596T249 626Q198 626 163 598T127 532Q127 521 129 511T138 492T150 476T167 460T185 447T207 433T228 420L284 384L294 391Q346 424 363 469Q371 486 371 513ZM190 21T250 21T351 56T393 140Q393 180 362 213Q354 221 317 246T246 292L212 313Q210 313 200 307T173 287T142 256T117 212T106 157Q106 100 148 61",57:"171 -101Q171 -118 163 -130T146 -146T134 -151Q132 -151 132 -152Q132 -154 140 -159T167 -168T206 -173Q274 -173 317 -108Q356 -50 356 79V86L350 77Q308 9 231 9Q150 9 92 81Q42 141 42 228Q42 289 64 333Q93 390 142 421T235 452Q237 452 244 452T255 453Q289 453 321 439T386 391T437 290T457 128Q457 -29 381 -122T206 -216Q148 -216 108 -187T67 -104Q67 -75 84 -62T119 -49Q141 -49 156 -63T171 -101ZM242 46Q293 46 324 94T355 223Q355 323 337 356Q316 401 275 410Q267 412 248 412Q206 412 179 386Q155 360 149 328T143 224Q143 120 163 88Q192 46 242 46",65:"576 668Q576 688 606 708T660 728Q676 728 675 712V571Q675 409 688 252Q696 122 720 57Q722 53 723 50T728 46T732 43T737 41T743 39L754 45Q788 61 803 61Q819 61 819 47Q818 43 814 35Q799 15 755 -7T675 -30Q659 -30 648 -25T630 -8T621 11T614 34Q603 77 599 106T594 146T591 160V163H460L329 164L316 145Q241 35 196 -7T119 -50T59 -24T30 43Q30 75 46 100T74 125Q81 125 83 120T88 104T96 84Q118 57 151 57Q189 57 277 182Q432 400 542 625L559 659H567Q574 659 575 660T576 668ZM584 249Q579 333 577 386T575 473T574 520V581L563 560Q497 426 412 290L372 228L370 224H371L383 228L393 232H586L584 249",66:"304 342Q292 342 292 353Q292 372 323 391Q331 396 417 428T533 487Q563 512 563 555V562Q563 575 557 589T530 618T475 636Q429 636 396 613T330 539Q263 446 210 238Q196 183 173 120Q135 31 121 16Q108 1 85 -10T47 -22T32 -10Q32 -5 44 18T77 93T112 206Q135 296 154 395T182 550T191 615Q191 616 190 616Q188 616 179 611T157 601T131 594Q113 594 113 605Q113 623 144 644Q154 650 205 676T267 703Q277 705 279 705Q295 705 295 693Q295 686 288 635T278 575Q278 572 287 582Q336 635 402 669T540 704Q603 704 633 673T664 599Q664 559 638 523T580 462Q553 440 504 413L491 407L504 402Q566 381 596 338T627 244Q627 172 575 110T444 13T284 -22Q208 -22 158 28Q144 42 146 50Q150 67 178 85T230 103Q236 103 246 95T267 75T302 56T357 47Q436 47 486 93Q526 136 526 198V210Q526 228 518 249T491 292T436 330T350 345Q335 345 321 344T304 342",67:"201 -25Q167 -25 136 -14T75 23T29 94T12 202Q12 290 50 394T161 574Q227 642 303 673T433 704Q435 705 457 705Q533 701 533 640Q533 606 507 548T464 474Q431 444 396 444Q381 444 381 453Q381 459 388 473T407 513T428 563Q433 580 433 594Q433 636 381 636Q314 636 260 594T175 489T128 363T112 247Q112 157 153 101T273 44Q347 44 398 121Q413 144 437 157T481 171Q496 171 496 160Q496 150 476 123Q426 56 350 16T201 -25",68:"37 475Q19 475 19 487Q19 536 103 604T327 682H356Q386 683 408 683H419Q475 683 506 681T582 668T667 633Q766 571 766 450Q766 365 723 287T611 152T455 57T279 6Q248 1 160 0Q148 0 131 0T108 -1Q72 -1 72 11Q72 24 90 40T133 64L144 68L152 88Q247 328 272 587Q275 613 272 613Q272 613 269 613Q225 610 195 602T149 579T129 556T119 532Q118 530 116 525T113 518Q102 502 80 490T37 475ZM665 407Q665 596 412 613Q403 614 383 614Q370 614 370 612Q370 598 363 542T323 357T242 103L228 69H265Q391 73 481 119Q536 148 575 188T633 268T658 338T665 392V407",69:"144 470Q144 556 240 630T451 705Q564 705 564 637Q564 611 540 573Q529 559 505 547T464 534Q448 534 448 545Q448 552 455 562Q463 577 463 591Q463 600 462 604T456 616T436 627T400 635Q396 635 390 635T380 636Q291 636 258 568Q245 544 245 516Q245 463 290 438T391 410Q415 410 415 398Q415 392 407 380T376 356T326 341Q288 340 260 327Q218 311 187 276T143 208T130 151Q130 113 156 88T211 55T268 47Q349 47 403 125Q415 144 439 157T483 171Q499 171 499 160Q499 148 475 120T413 59T315 3T197 -22Q124 -22 77 14T30 105Q30 126 39 154T66 216T122 288T209 354L223 362Q144 400 144 470",70:"199 579Q181 579 181 590Q181 598 188 611T212 639T260 666T335 682Q336 682 349 682T383 682T431 682T493 683T561 683Q776 682 784 681Q826 673 829 647Q829 620 797 600T744 580Q728 580 728 595Q729 607 713 610Q698 613 598 614H500L499 610Q499 598 467 486T428 367Q428 365 551 365H674Q683 360 684 355Q687 346 677 329Q666 312 642 299T598 285Q586 285 582 296H402L394 277Q386 258 373 229T346 167T315 102T286 51Q265 22 225 -5T133 -32Q108 -32 87 -25T54 -7T33 15T21 35T18 47Q18 60 44 80T98 103Q108 103 111 101T119 88Q130 66 150 54T179 39T195 37Q199 37 203 43Q217 67 245 125T318 300T391 532Q393 543 398 564T406 598T409 613T339 614H269Q229 579 199 579",71:"216 68Q155 68 115 100T59 177T44 273Q44 299 50 333T73 421T133 533T239 632Q346 704 466 704Q508 704 515 703Q555 696 577 681T599 635Q599 605 570 560T523 496Q490 466 455 466Q440 466 440 475T469 526T499 589Q499 605 489 617Q460 636 403 636Q343 636 295 611T220 548T174 464T150 382T144 318Q144 241 180 189T287 137Q325 137 359 160Q428 205 466 322Q472 342 501 359T551 376Q557 376 560 373T564 368L565 365Q560 341 551 302T512 173T451 31Q359 -119 204 -119Q163 -118 127 -109T74 -91T53 -77Q52 -75 52 -71Q52 -54 79 -35T132 -14H140L151 -19Q210 -49 281 -49H289Q312 -49 329 -31Q351 -7 372 36T405 109T416 142L408 136Q401 131 392 125T369 111T338 96T303 82T261 72T216 68",72:"18 487Q18 496 29 517T67 566T127 621T216 665T330 683Q359 683 376 669T397 643T400 622Q400 584 382 488T348 343Q348 342 467 342H587L594 366Q615 440 648 534T690 641Q701 656 723 669T764 683Q783 683 783 672L750 578Q716 485 677 346T625 101Q624 92 623 82T622 65T621 56Q621 20 658 20Q666 20 701 25Q709 52 736 69T785 87Q803 87 803 75T791 44T754 3T685 -33T588 -48Q568 -48 562 -46Q522 -31 522 13V23Q531 129 562 250L569 281L565 280Q561 278 556 277T549 274L438 273H328L321 249Q307 202 275 107T232 0Q219 -16 196 -28T155 -41Q149 -41 145 -39T140 -34T139 -29Q139 -24 148 -3T181 86T233 247Q240 270 240 272Q240 273 194 273H169Q139 273 139 285Q139 295 153 308T187 332Q206 341 236 342L260 343L264 359Q278 414 289 482T300 578Q300 613 260 613H254Q198 613 169 592Q148 578 127 544T104 508Q72 478 37 475Q18 475 18 487",73:"174 0H31Q-13 0 -21 2T-30 12Q-30 23 -17 36Q9 60 42 68L155 70Q187 102 214 179T257 333T302 491T366 610L369 614H305Q221 611 188 607T145 596T128 569Q119 543 94 529T47 512Q28 512 28 524Q28 527 32 539Q56 614 159 654Q218 678 312 682Q314 682 339 682T404 682T481 683H632Q642 678 642 671Q642 657 621 641T577 617Q570 615 507 614H444Q427 592 406 542Q382 478 355 366T310 209Q280 123 238 78L230 69H330Q442 70 442 74Q443 74 443 77T447 87T460 105Q490 134 527 137Q545 137 545 125Q545 120 542 112Q531 78 491 49T399 7Q379 2 360 2T174 0",74:"148 78Q148 16 189 -17T286 -50Q319 -50 348 -33T396 10T426 59T444 101L471 204Q498 306 521 372Q575 532 649 605L659 614H591Q517 613 494 607Q433 591 400 550T360 477Q353 454 325 437T275 419Q256 419 260 435Q280 523 376 597T583 681Q603 683 713 683H830Q839 674 839 671Q839 654 810 634T754 614Q735 614 721 601Q688 571 654 495T600 351T561 209T541 132Q507 29 412 -45T213 -119Q141 -119 94 -77T47 33Q47 55 50 69T58 90T71 103Q105 131 135 131Q152 131 152 120Q152 119 151 114T149 99T148 78",75:"194 618Q193 618 182 613T156 601T131 594Q113 594 113 605Q113 623 144 644Q154 650 205 676T267 703Q277 705 279 705Q295 705 295 691Q295 569 250 397Q225 306 197 217T151 81T128 25Q120 8 94 -7T47 -22Q32 -22 32 -10L64 76Q95 163 133 295T185 530Q198 611 194 618ZM331 429Q331 383 364 290T449 117T542 36Q574 36 607 51T652 103Q660 124 677 133T709 143Q727 143 727 128Q727 119 723 111Q704 56 639 17T497 -22H493Q463 -22 425 16Q401 40 382 71Q335 138 296 243T256 399Q256 434 288 473Q342 540 471 622T670 705Q691 704 703 696Q732 678 732 644Q732 613 714 600T677 586Q671 586 667 587T660 592T657 604V619Q657 647 629 647Q623 647 620 646Q576 635 495 583T365 482Q331 448 331 429",76:"62 -22T47 -22T32 -11Q32 -1 56 24T83 55Q113 96 138 172T180 320T234 473T323 609Q364 649 419 677T531 705Q559 705 578 696T604 671T615 645T618 623V611Q618 582 615 571T598 548Q581 531 558 520T518 509Q503 509 503 520Q503 523 505 536T507 560Q507 590 494 610T452 630Q423 630 410 617Q367 578 333 492T271 301T233 170Q211 123 204 112L198 103L224 102Q281 102 369 79T509 52H523Q535 64 544 87T579 128Q616 152 641 152Q656 152 656 142Q656 101 588 40T433 -22Q381 -22 289 1T156 28L141 29L131 20Q111 0 87 -11",77:"28 9Q28 37 43 63T73 90Q77 90 83 84T103 70T141 57H146Q162 57 178 79T222 167Q266 279 295 371T334 513T349 598T358 651T371 677Q397 705 432 705Q442 705 445 699T452 666Q453 661 453 659Q475 538 509 405T568 207L574 192Q581 178 587 164T594 150Q596 150 635 189T693 248Q765 324 863 438T1024 626T1089 701Q1093 705 1100 705Q1111 705 1111 682Q1111 675 1108 660T1099 611T1086 540Q1041 277 1041 144Q1041 98 1044 75T1050 48T1059 42Q1064 41 1075 46Q1102 61 1121 61Q1137 61 1137 50Q1137 28 1087 0T1000 -29Q983 -29 972 -23T955 -9T945 16T942 45T941 83V96Q941 158 952 256T974 422L985 489Q984 489 939 436T821 300T698 164Q665 128 620 85T568 37Q564 34 558 34Q550 34 546 37T535 54Q512 91 496 127T450 259T389 498L384 518Q349 367 294 223T198 15Q155 -50 117 -50Q87 -50 61 -35T30 -6Q28 2 28 9",78:"343 705Q358 705 358 698Q360 696 370 658T411 524T484 319Q536 174 590 82L595 73L615 152Q646 274 683 407Q729 571 752 637T799 727Q852 780 937 788Q939 788 947 788T958 789H962Q979 789 979 765Q979 722 951 692Q942 683 924 683Q888 681 859 672T818 654T803 639Q784 608 708 322T631 15Q631 14 630 15Q630 17 629 15Q628 14 628 12Q621 -4 601 -17T560 -31Q550 -31 546 -28T530 -7Q484 67 458 123T398 272Q352 392 314 514L306 535V534Q306 533 296 488T272 379T234 239T185 100T127 -7T61 -50Q34 -50 4 -34T-27 8Q-27 33 -12 61T18 90Q21 90 36 77T87 57H92Q109 57 123 78T162 173Q206 299 232 417T265 599T276 667Q284 681 304 693T343 705",79:"308 428Q289 428 289 438Q289 457 318 508T378 593Q417 638 475 671T599 705Q688 705 732 643T777 483Q777 380 733 285T620 123T464 18T293 -22Q188 -22 123 51T58 245Q58 327 87 403T159 533T249 626T333 685T388 705Q404 705 404 693Q404 674 363 649Q333 632 304 606T239 537T181 429T158 290Q158 179 214 114T364 48Q489 48 583 165T677 438Q677 473 670 505T648 568T601 617T528 636Q518 636 513 635Q486 629 460 600T419 544T392 490Q383 470 372 459Q341 430 308 428",80:"37 475Q19 475 19 487Q19 536 103 604T327 682Q329 682 344 682T380 682T421 683H463Q625 683 695 615Q718 591 726 564Q733 547 733 525Q733 412 607 312T321 205H312Q293 205 293 217Q293 224 302 236T333 260T385 274Q558 287 614 407Q633 445 633 477Q633 515 612 543T556 585T481 607T399 614H370L368 603Q352 463 312 312T242 82T202 -13Q190 -33 164 -45T121 -57Q108 -57 108 -45Q108 -40 120 -10T151 73T192 190T233 349T266 539Q267 546 269 565T272 598T274 613H270Q209 613 163 588Q131 572 113 518Q102 502 80 490T37 475",81:"114 286Q114 358 151 433T249 569T392 667T558 705Q653 705 713 641T774 460Q774 389 750 322T687 206T600 114T504 46T412 4L399 -2Q542 -62 636 -62Q660 -62 670 -54T686 -27T700 0Q734 34 770 34Q787 34 787 23Q787 -18 720 -74T563 -131Q485 -131 350 -83T145 -34Q127 -34 127 -22Q127 -12 144 5T190 31L200 34L237 35Q386 38 467 79Q550 120 612 210T675 416Q675 510 625 573T484 636Q410 636 346 587T248 469T214 333Q214 306 221 281T243 229T288 188T360 172Q403 172 441 188T490 205Q510 205 510 192Q505 162 432 132T287 102Q206 102 160 155T114 286",82:"37 475Q19 475 19 487Q19 503 35 530T83 589T180 647T327 682H374Q387 682 417 682T464 683Q519 683 559 679T642 663T708 625T731 557Q731 481 668 411T504 300Q506 296 512 286T528 257T553 202Q594 105 611 82Q635 47 665 47Q708 47 742 93Q758 113 786 128Q804 136 819 137Q837 137 837 125Q837 115 818 92T767 43T687 -2T589 -22Q549 -22 517 22T467 120T422 221T362 273Q346 273 346 287Q348 301 373 320T436 342Q437 342 446 343T462 345T481 348T504 353T527 362T553 375T577 393Q598 412 614 443T630 511Q630 545 613 566T541 600T393 614Q370 614 370 613L366 584Q349 446 311 307T243 96L213 25Q205 8 179 -7T132 -22Q125 -22 120 -18T117 -8Q117 -5 130 26T163 113T205 239T246 408T274 606V614Q273 614 259 613T231 609T198 602T163 588Q131 572 113 518Q102 502 80 490T37 475",83:"554 512Q536 512 536 522Q536 525 539 539T542 564Q542 588 528 604Q515 616 482 625T410 635Q374 635 349 624T312 594T295 561T290 532Q290 505 303 482T342 442T378 419T409 404Q435 391 451 383T494 357T535 323T562 282T574 231Q574 133 464 56T220 -22Q138 -22 78 21T18 123Q18 184 61 227T156 274Q178 274 178 263Q178 260 177 258Q172 247 164 239T151 227T136 218L127 213L124 202Q118 186 118 163Q120 124 165 86T292 48Q374 48 423 86T473 186V193Q473 267 347 327Q268 364 239 389Q191 431 191 486Q191 547 242 600T356 679T470 705Q472 705 478 705T489 704Q551 704 596 682T642 610Q642 566 621 545Q592 516 554 512",84:"49 475Q34 475 34 490Q34 552 106 611T261 681Q272 683 507 683H742Q790 717 816 717Q833 717 833 708Q833 682 795 653T714 615Q691 610 588 609Q490 609 490 607L483 580Q476 554 462 496T435 392Q410 289 395 231T363 116T335 34T309 -15T279 -47T242 -64Q231 -68 218 -68Q203 -68 203 -57Q203 -52 211 -38Q224 -7 234 20T251 66T268 123T283 179T304 261T328 360Q342 415 360 488Q380 567 384 582T397 605Q400 607 401 609H302H244Q200 609 188 607T167 596Q145 572 145 541Q145 520 109 498T49 475",85:"8 592Q8 616 70 649T193 683Q246 683 246 631Q246 587 205 492T124 297T83 143Q83 101 100 75T154 48Q202 48 287 135T450 342T560 553Q589 635 593 640Q603 656 626 668T669 683H670Q687 683 687 672T670 616T617 463T547 220Q525 137 521 68Q521 54 522 50T533 42L543 47Q573 61 588 61Q604 61 604 47Q599 16 506 -22Q486 -28 468 -28T436 -18T421 18Q421 92 468 258Q468 259 467 257T459 248Q426 206 391 167T303 81T194 6T83 -22Q66 -22 58 -20Q25 -11 4 19T-17 99Q-17 146 8 220T64 358T120 488T146 586Q146 604 141 608T123 613H120Q99 613 72 597T25 580Q8 580 8 592",86:"25 633Q25 647 47 665T100 683Q291 683 291 306Q291 264 288 213T282 132L279 102Q281 102 308 126T378 191T464 279T545 381T596 479Q600 490 600 502Q600 527 581 550T523 577Q505 577 505 601Q505 622 516 647T542 681Q546 683 558 683Q605 679 631 645T658 559Q658 423 487 215Q409 126 308 37T190 -52Q177 -52 177 -28Q177 -26 183 15T196 127T203 270Q203 356 192 421T165 523T126 583T83 613T41 620Q25 620 25 633",87:"25 633Q25 647 46 665T103 683Q168 683 207 632Q228 608 243 568Q269 485 269 374Q269 324 265 271T256 184L251 150L252 152Q254 153 257 157T264 167T274 180T286 197Q359 293 424 398T519 558T549 616Q549 618 547 624T545 638Q550 654 572 668T615 683Q626 683 632 672T657 595Q726 370 741 128L742 110Q752 122 767 142T823 217T894 321T950 424T976 511Q976 544 958 560T918 577Q906 577 906 602Q906 629 918 651T942 681Q948 683 954 683Q983 683 1008 658T1034 569T999 421T915 257T813 109T724 -3T681 -49Q666 -59 660 -45Q659 -41 657 35T639 233T591 477Q573 551 570 551Q569 551 554 523T507 439T433 315T323 155T182 -25Q160 -52 151 -53Q137 -53 137 -30Q137 -29 148 25T170 168T181 338Q181 424 168 483T131 571T87 609T40 620Q25 620 25 633",88:"324 614Q291 576 250 573Q231 573 231 584Q231 589 232 592Q235 601 244 614T271 643T324 671T400 683H403Q462 683 481 610Q485 594 490 545T498 454L501 413Q504 413 551 442T648 509T705 561Q707 565 707 578Q707 610 682 614Q667 614 667 626Q667 641 695 662T755 683Q765 683 775 680T796 662T807 623Q807 596 792 572T713 499T530 376L505 361V356Q508 346 511 278T524 148T557 75Q569 69 580 69Q585 69 593 77Q624 108 660 110Q667 110 670 110T676 106T678 94Q668 59 624 30T510 0Q487 0 471 9T445 32T430 71T422 117T417 173Q416 183 416 188Q413 214 411 244T407 286T405 299Q403 299 344 263T223 182T154 122Q152 118 152 105Q152 69 180 69Q183 69 187 66T191 60L192 58V56Q192 41 163 21T105 0Q94 0 84 3T63 21T52 60Q52 77 56 90T85 131T155 191Q197 223 259 263T362 327T402 352L391 489Q391 492 390 505T387 526T384 547T379 568T372 586T361 602T348 611Q346 612 341 613T333 614H324",89:"65 599Q65 618 107 650T204 683Q267 683 312 643T380 533T414 385T424 217Q424 186 423 160T422 123Q426 123 468 170T567 304T650 469Q661 503 661 519Q661 546 639 570Q615 591 583 591Q569 591 569 616Q569 640 582 661T613 683Q624 683 638 679T671 664T702 625T714 558Q714 472 639 329T426 45Q361 -21 282 -82T154 -143Q97 -143 64 -104T31 -20Q31 4 44 25T70 46Q78 46 81 39T87 16T97 -9Q127 -51 182 -51Q184 -51 187 -50H190Q233 -41 314 25Q330 36 330 40Q336 79 336 178Q336 508 223 594Q199 614 158 619L148 620L139 611Q111 586 83 586Q65 586 65 599",90:"694 220Q708 220 708 210Q708 195 695 167T658 105T593 42T502 3Q492 1 458 1Q400 1 293 11T150 22Q116 22 92 11T51 0Q37 0 37 10Q37 21 63 44T179 146T367 319L391 343H343L296 344Q285 350 285 358Q285 365 289 372T300 383T313 392T324 398L329 400H450L561 518Q597 558 607 571L621 587H596Q553 589 484 599T383 609Q342 609 326 596T301 555Q294 533 263 514T208 492Q189 492 189 503Q189 510 197 528T215 559Q249 607 318 645T466 683Q504 683 573 673T669 662L690 661Q734 682 748 683Q767 683 767 673Q767 666 746 640Q655 531 555 428L529 400Q529 399 543 399Q604 397 604 366Q604 350 587 337T551 322Q541 322 539 323Q529 328 529 334Q529 339 487 342L470 343L446 320Q272 153 200 96L235 95Q297 95 392 86T533 74H554Q586 116 597 159Q604 179 635 199T694 220"},{})},2162:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texSize3=void 0;var n=r(768),o=r(7906);e.texSize3=(0,n.AddPaths)(o.texSize3,{40:"701 -940Q701 -943 695 -949H664Q662 -947 636 -922T591 -879T537 -818T475 -737T412 -636T350 -511T295 -362T250 -186T221 17T209 251Q209 962 573 1361Q596 1386 616 1405T649 1437T664 1450H695Q701 1444 701 1441Q701 1436 681 1415T629 1356T557 1261T476 1118T400 927T340 675T308 359Q306 321 306 250Q306 -139 400 -430T690 -924Q701 -936 701 -940",41:"34 1438Q34 1446 37 1448T50 1450H56H71Q73 1448 99 1423T144 1380T198 1319T260 1238T323 1137T385 1013T440 864T485 688T514 485T526 251Q526 134 519 53Q472 -519 162 -860Q139 -885 119 -904T86 -936T71 -949H56Q43 -949 39 -947T34 -937Q88 -883 140 -813Q428 -430 428 251Q428 453 402 628T338 922T245 1146T145 1309T46 1425Q44 1427 42 1429T39 1433T36 1436L34 1438",47:"81 -949Q71 -949 63 -941T55 -921Q55 -917 56 -915Q59 -906 498 264T939 1438Q945 1450 960 1450Q972 1450 980 1441T988 1421Q982 1403 839 1020L398 -155Q107 -934 103 -938Q96 -949 81 -949",91:"247 -949V1450H516V1388H309V-887H516V-949H247",92:"988 -922Q988 -933 980 -941T962 -949Q947 -949 940 -938Q936 -934 645 -155L204 1020Q56 1416 56 1424Q56 1433 62 1441T84 1450Q97 1448 103 1439Q107 1435 398 656L839 -519Q988 -918 988 -922",93:"11 1388V1450H280V-949H11V-887H218V1388H11",123:"618 -943L612 -949H582L568 -943Q472 -903 411 -841T332 -703Q327 -682 327 -653T325 -350Q324 -28 323 -18Q317 24 301 61T264 124T221 171T179 205T147 225T132 234Q130 238 130 250Q130 255 130 258T131 264T132 267T134 269T139 272T144 275Q207 308 256 367Q310 436 323 519Q324 529 325 851Q326 1124 326 1154T332 1205Q369 1358 566 1443L582 1450H612L618 1444V1429Q618 1413 616 1411L608 1406Q599 1402 585 1393T552 1372T515 1343T479 1305T449 1257T429 1200Q425 1180 425 1152T423 851Q422 579 422 549T416 498Q407 459 388 424T346 364T297 318T250 284T214 264T197 254L188 251L205 242Q290 200 345 138T416 3Q421 -18 421 -48T423 -349Q423 -397 423 -472Q424 -677 428 -694Q429 -697 429 -699Q434 -722 443 -743T465 -782T491 -816T519 -845T548 -868T574 -886T595 -899T610 -908L616 -910Q618 -912 618 -928V-943",125:"131 1414T131 1429T133 1447T148 1450H153H167L182 1444Q276 1404 336 1343T415 1207Q421 1184 421 1154T423 851L424 531L426 517Q434 462 460 415T518 339T571 296T608 274Q615 270 616 267T618 251Q618 241 618 238T615 232T608 227Q542 194 491 132T426 -15L424 -29L423 -350Q422 -622 422 -652T415 -706Q397 -780 337 -841T182 -943L167 -949H153Q137 -949 134 -946T131 -928Q131 -914 132 -911T144 -904Q146 -903 148 -902Q299 -820 323 -680Q324 -663 325 -349T327 -19Q355 145 541 241L561 250L541 260Q356 355 327 520Q326 537 325 850T323 1181Q315 1227 293 1267T244 1332T193 1374T151 1401T132 1413Q131 1414 131 1429",710:"1439 564Q1434 564 1080 631T722 698Q719 698 362 631Q7 564 4 564L0 583Q-4 602 -4 603L720 772L1083 688Q1446 603 1447 603Q1447 602 1443 583L1439 564",732:"1 643Q1 646 76 671T271 722T476 749Q555 749 626 736T742 706T856 676T999 662Q1088 662 1192 684T1363 727T1432 749Q1432 745 1437 731T1442 716Q1442 714 1381 693T1212 645T1012 611Q1000 610 955 610Q851 610 701 653T444 697Q355 697 251 676T80 632T11 610Q11 614 6 628T1 643",770:"-5 564Q-9 564 -363 631T-722 698Q-725 698 -1082 631Q-1437 564 -1440 564L-1444 583Q-1448 602 -1448 603L-724 772L-361 688Q2 603 3 603Q3 602 -1 583L-5 564",771:"-1443 643Q-1443 646 -1368 671T-1173 722T-968 749Q-889 749 -818 736T-702 706T-588 676T-445 662Q-356 662 -252 684T-81 727T-12 749Q-12 745 -7 731T-2 716Q-2 714 -63 693T-232 645T-432 611Q-444 610 -489 610Q-593 610 -743 653T-1000 697Q-1089 697 -1193 676T-1364 632T-1433 610Q-1433 614 -1438 628T-1443 643",8260:"81 -949Q71 -949 63 -941T55 -921Q55 -917 56 -915Q59 -906 498 264T939 1438Q945 1450 960 1450Q972 1450 980 1441T988 1421Q982 1403 839 1020L398 -155Q107 -934 103 -938Q96 -949 81 -949",8730:"424 -948Q422 -947 313 -434T202 80L170 31Q165 24 157 10Q137 -21 137 -21Q131 -16 124 -8L111 5L264 248L473 -720Q473 -717 727 359T983 1440Q989 1450 1001 1450Q1007 1450 1013 1445T1020 1433Q1020 1425 742 244T460 -941Q458 -950 439 -950H436Q424 -950 424 -948",8968:"246 -949V1450H571V1388H308V-949H246",8969:"11 1388V1450H336V-949H274V1388H11",8970:"246 -949V1450H308V-887H571V-949H246",8971:"274 -887V1450H336V-949H11V-887H274",9001:"126 242V259L361 845Q595 1431 597 1435Q610 1450 624 1450Q634 1450 644 1443T654 1419V1411L422 831Q190 253 190 250T422 -331L654 -910V-919Q654 -936 644 -943T624 -950Q612 -950 597 -935Q595 -931 361 -345L126 242",9002:"94 1424Q94 1426 97 1432T107 1444T124 1450Q141 1450 152 1435Q154 1431 388 845L623 259V242L388 -345Q153 -933 152 -934Q142 -949 127 -949H125Q95 -949 95 -919V-910L327 -331Q559 247 559 250T327 831Q94 1411 94 1424",10216:"126 242V259L361 845Q595 1431 597 1435Q610 1450 624 1450Q634 1450 644 1443T654 1419V1411L422 831Q190 253 190 250T422 -331L654 -910V-919Q654 -936 644 -943T624 -950Q612 -950 597 -935Q595 -931 361 -345L126 242",10217:"94 1424Q94 1426 97 1432T107 1444T124 1450Q141 1450 152 1435Q154 1431 388 845L623 259V242L388 -345Q153 -933 152 -934Q142 -949 127 -949H125Q95 -949 95 -919V-910L327 -331Q559 247 559 250T327 831Q94 1411 94 1424",12296:"126 242V259L361 845Q595 1431 597 1435Q610 1450 624 1450Q634 1450 644 1443T654 1419V1411L422 831Q190 253 190 250T422 -331L654 -910V-919Q654 -936 644 -943T624 -950Q612 -950 597 -935Q595 -931 361 -345L126 242",12297:"94 1424Q94 1426 97 1432T107 1444T124 1450Q141 1450 152 1435Q154 1431 388 845L623 259V242L388 -345Q153 -933 152 -934Q142 -949 127 -949H125Q95 -949 95 -919V-910L327 -331Q559 247 559 250T327 831Q94 1411 94 1424"},{})},9244:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texSize4=void 0;var n=r(768),o=r(2644);e.texSize4=(0,n.AddPaths)(o.texSize4,{40:"758 -1237T758 -1240T752 -1249H736Q718 -1249 717 -1248Q711 -1245 672 -1199Q237 -706 237 251T672 1700Q697 1730 716 1749Q718 1750 735 1750H752Q758 1744 758 1741Q758 1737 740 1713T689 1644T619 1537T540 1380T463 1176Q348 802 348 251Q348 -242 441 -599T744 -1218Q758 -1237 758 -1240",41:"33 1741Q33 1750 51 1750H60H65Q73 1750 81 1743T119 1700Q554 1207 554 251Q554 -707 119 -1199Q76 -1250 66 -1250Q65 -1250 62 -1250T56 -1249Q55 -1249 53 -1249T49 -1250Q33 -1250 33 -1239Q33 -1236 50 -1214T98 -1150T163 -1052T238 -910T311 -727Q443 -335 443 251Q443 402 436 532T405 831T339 1142T224 1438T50 1716Q33 1737 33 1741",47:"1166 1738Q1176 1750 1189 1750T1211 1742T1221 1721Q1221 1720 1221 1718T1220 1715Q1219 1708 666 238T111 -1237Q102 -1249 86 -1249Q74 -1249 65 -1240T56 -1220Q56 -1219 56 -1217T57 -1214Q58 -1207 611 263T1166 1738",91:"269 -1249V1750H577V1677H342V-1176H577V-1249H269",92:"56 1720Q56 1732 64 1741T85 1750Q104 1750 111 1738Q113 1734 666 264T1220 -1214Q1220 -1215 1220 -1217T1221 -1220Q1221 -1231 1212 -1240T1191 -1249Q1175 -1249 1166 -1237Q1164 -1233 611 237T57 1715Q57 1716 56 1718V1720",93:"5 1677V1750H313V-1249H5V-1176H240V1677H5",123:"661 -1243L655 -1249H622L604 -1240Q503 -1190 434 -1107T348 -909Q346 -897 346 -499L345 -98L343 -82Q335 3 287 87T157 223Q146 232 145 236Q144 240 144 250Q144 265 145 268T157 278Q242 333 288 417T343 583L345 600L346 1001Q346 1398 348 1410Q379 1622 600 1739L622 1750H655L661 1744V1727V1721Q661 1712 661 1710T657 1705T648 1700T630 1690T602 1668Q589 1659 574 1643T531 1593T484 1508T459 1398Q458 1389 458 1001Q458 614 457 605Q441 435 301 316Q254 277 202 251L250 222Q260 216 301 185Q443 66 457 -104Q458 -113 458 -501Q458 -888 459 -897Q463 -944 478 -988T509 -1060T548 -1114T580 -1149T602 -1167Q620 -1183 634 -1192T653 -1202T659 -1207T661 -1220V-1226V-1243",125:"144 1727Q144 1743 146 1746T162 1750H167H183L203 1740Q274 1705 325 1658T403 1562T440 1478T456 1410Q458 1398 458 1001Q459 661 459 624T465 558Q470 526 480 496T502 441T529 395T559 356T588 325T615 301T637 284T654 273L660 269V266Q660 263 660 259T661 250V239Q661 236 661 234T660 232T656 229T649 224Q577 179 528 105T465 -57Q460 -86 460 -123T458 -499V-661Q458 -857 457 -893T447 -955Q425 -1048 359 -1120T203 -1239L183 -1249H168Q150 -1249 147 -1246T144 -1226Q144 -1213 145 -1210T153 -1202Q169 -1193 186 -1181T232 -1140T282 -1081T322 -1000T345 -897Q346 -888 346 -501Q346 -113 347 -104Q359 58 503 184Q554 226 603 250Q504 299 430 393T347 605Q346 614 346 1002Q346 1389 345 1398Q338 1493 288 1573T153 1703Q146 1707 145 1710T144 1727",710:"5 561Q-4 561 -9 582T-14 618Q-14 623 -13 625Q-11 628 461 736T943 845Q945 845 1417 738T1896 628Q1902 628 1902 618Q1902 607 1897 584T1883 561Q1881 561 1412 654L945 750L476 654Q6 561 5 561",732:"1212 583Q1124 583 1048 603T923 647T799 691T635 711Q524 711 375 679T120 615L16 583Q14 584 12 587T9 592Q-2 650 2 659Q2 669 38 687Q54 696 146 723T309 767Q527 823 666 823Q759 823 837 803T964 759T1088 715T1252 695Q1363 695 1512 727T1764 791T1871 823Q1872 822 1874 819T1878 814Q1885 783 1885 753Q1885 748 1884 747Q1884 738 1849 719Q1836 712 1740 682T1484 617T1212 583",770:"-1884 561Q-1893 561 -1898 582T-1903 618Q-1903 623 -1902 625Q-1900 628 -1428 736T-946 845Q-944 845 -472 738T7 628Q13 628 13 618Q13 607 8 584T-6 561Q-8 561 -477 654L-944 750L-1413 654Q-1883 561 -1884 561",771:"-677 583Q-765 583 -841 603T-966 647T-1090 691T-1254 711Q-1365 711 -1514 679T-1768 615L-1873 583Q-1875 584 -1877 587T-1880 592Q-1891 650 -1887 659Q-1887 669 -1851 687Q-1835 696 -1743 723T-1580 767Q-1362 823 -1223 823Q-1130 823 -1052 803T-925 759T-801 715T-637 695Q-526 695 -377 727T-125 791T-18 823Q-17 822 -15 819T-11 814Q-4 782 -4 753Q-4 748 -5 747Q-5 738 -40 719Q-53 712 -149 682T-405 617T-677 583",8260:"1166 1738Q1176 1750 1189 1750T1211 1742T1221 1721Q1221 1720 1221 1718T1220 1715Q1219 1708 666 238T111 -1237Q102 -1249 86 -1249Q74 -1249 65 -1240T56 -1220Q56 -1219 56 -1217T57 -1214Q58 -1207 611 263T1166 1738",8730:"983 1739Q988 1750 1001 1750Q1008 1750 1013 1745T1020 1733Q1020 1726 742 244T460 -1241Q458 -1250 439 -1250H436Q424 -1250 424 -1248L410 -1166Q395 -1083 367 -920T312 -601L201 44L137 -83L111 -57L187 96L264 247Q265 246 369 -357Q470 -958 473 -963L727 384Q979 1729 983 1739",8968:"269 -1249V1750H633V1677H342V-1249H269",8969:"5 1677V1750H369V-1249H296V1677H5",8970:"269 -1249V1750H342V-1176H633V-1249H269",8971:"296 -1176V1750H369V-1249H5V-1176H296",9001:"140 242V260L386 994Q633 1729 635 1732Q643 1745 657 1749Q658 1749 662 1749T668 1750Q682 1749 692 1740T702 1714V1705L214 251L703 -1204L702 -1213Q702 -1230 692 -1239T667 -1248H664Q647 -1248 635 -1231Q633 -1228 386 -493L140 242",9002:"103 1714Q103 1732 114 1741T137 1750Q157 1750 170 1732Q172 1729 419 994L665 260V242L419 -493Q172 -1228 170 -1231Q158 -1248 141 -1248H138Q123 -1248 113 -1239T103 -1213V-1204L591 251L103 1705V1714",9115:"837 1154Q843 1148 843 1145Q843 1141 818 1106T753 1002T667 841T574 604T494 299Q417 -84 417 -609Q417 -641 416 -647T411 -654Q409 -655 366 -655Q299 -655 297 -654Q292 -652 292 -643T291 -583Q293 -400 304 -242T347 110T432 470T574 813T785 1136Q787 1139 790 1142T794 1147T796 1150T799 1152T802 1153T807 1154T813 1154H819H837",9116:"413 -9Q412 -9 407 -9T388 -10T354 -10Q300 -10 297 -9Q294 -8 293 -5Q291 5 291 127V300Q291 602 292 605L296 609Q298 610 366 610Q382 610 392 610T407 610T412 609Q416 609 416 592T417 473V127Q417 -9 413 -9",9117:"843 -635Q843 -638 837 -644H820Q801 -644 800 -643Q792 -635 785 -626Q684 -503 605 -363T473 -75T385 216T330 518T302 809T291 1093Q291 1144 291 1153T296 1164Q298 1165 366 1165Q409 1165 411 1164Q415 1163 416 1157T417 1119Q417 529 517 109T833 -617Q843 -631 843 -635",9118:"31 1143Q31 1154 49 1154H59Q72 1154 75 1152T89 1136Q190 1013 269 873T401 585T489 294T544 -8T572 -299T583 -583Q583 -634 583 -643T577 -654Q575 -655 508 -655Q465 -655 463 -654Q459 -653 458 -647T457 -609Q457 -58 371 340T100 1037Q87 1059 61 1098T31 1143",9119:"579 -9Q578 -9 573 -9T554 -10T520 -10Q466 -10 463 -9Q460 -8 459 -5Q457 5 457 127V300Q457 602 458 605L462 609Q464 610 532 610Q548 610 558 610T573 610T578 609Q582 609 582 592T583 473V127Q583 -9 579 -9",9120:"56 -644H50Q31 -644 31 -635Q31 -632 37 -622Q69 -579 100 -527Q286 -228 371 170T457 1119Q457 1161 462 1164Q464 1165 520 1165Q575 1165 577 1164Q582 1162 582 1153T583 1093Q581 910 570 752T527 400T442 40T300 -303T89 -626Q78 -640 75 -642T61 -644H56",9121:"319 -645V1154H666V1070H403V-645H319",9122:"319 0V602H403V0H319",9123:"319 -644V1155H403V-560H666V-644H319",9124:"0 1070V1154H347V-645H263V1070H0",9125:"263 0V602H347V0H263",9126:"263 -560V1155H347V-644H0V-560H263",9127:"712 899L718 893V876V865Q718 854 704 846Q627 793 577 710T510 525Q510 524 509 521Q505 493 504 349Q504 345 504 334Q504 277 504 240Q504 -2 503 -4Q502 -8 494 -9T444 -10Q392 -10 390 -9Q387 -8 386 -5Q384 5 384 230Q384 262 384 312T383 382Q383 481 392 535T434 656Q510 806 664 892L677 899H712",9128:"389 1159Q391 1160 455 1160Q496 1160 498 1159Q501 1158 502 1155Q504 1145 504 924Q504 691 503 682Q494 549 425 439T243 259L229 250L243 241Q349 175 421 66T503 -182Q504 -191 504 -424Q504 -600 504 -629T499 -659H498Q496 -660 444 -660T390 -659Q387 -658 386 -655Q384 -645 384 -425V-282Q384 -176 377 -116T342 10Q325 54 301 92T255 155T214 196T183 222T171 232Q170 233 170 250T171 268Q171 269 191 284T240 331T300 407T354 524T383 679Q384 691 384 925Q384 1152 385 1155L389 1159",9129:"718 -893L712 -899H677L666 -893Q542 -825 468 -714T385 -476Q384 -466 384 -282Q384 3 385 5L389 9Q392 10 444 10Q486 10 494 9T503 4Q504 2 504 -239V-310V-366Q504 -470 508 -513T530 -609Q546 -657 569 -698T617 -767T661 -812T699 -843T717 -856T718 -876V-893",9130:"384 150V266Q384 304 389 309Q391 310 455 310Q496 310 498 309Q502 308 503 298Q504 283 504 150Q504 32 504 12T499 -9H498Q496 -10 444 -10T390 -9Q386 -8 385 2Q384 17 384 150",9131:"170 875Q170 892 172 895T189 899H194H211L222 893Q345 826 420 715T503 476Q504 467 504 230Q504 51 504 21T499 -9H498Q496 -10 444 -10Q402 -10 394 -9T385 -4Q384 -2 384 240V311V366Q384 469 380 513T358 609Q342 657 319 698T271 767T227 812T189 843T171 856T170 875",9132:"389 1159Q391 1160 455 1160Q496 1160 498 1159Q501 1158 502 1155Q504 1145 504 925V782Q504 676 511 616T546 490Q563 446 587 408T633 345T674 304T705 278T717 268Q718 267 718 250T717 232Q717 231 697 216T648 169T588 93T534 -24T505 -179Q504 -191 504 -425Q504 -600 504 -629T499 -659H498Q496 -660 444 -660T390 -659Q387 -658 386 -655Q384 -645 384 -424Q384 -191 385 -182Q394 -49 463 61T645 241L659 250L645 259Q539 325 467 434T385 682Q384 692 384 873Q384 1153 385 1155L389 1159",9133:"384 -239V-57Q384 4 389 9Q391 10 455 10Q496 10 498 9Q501 8 502 5Q504 -5 504 -230Q504 -261 504 -311T505 -381Q505 -486 492 -551T435 -691Q357 -820 222 -893L211 -899H195Q176 -899 173 -896T170 -874Q170 -858 171 -855T184 -846Q262 -793 312 -709T378 -525Q378 -524 379 -522Q383 -493 384 -351Q384 -345 384 -334Q384 -276 384 -239",9143:"742 -871Q740 -873 737 -876T733 -880T730 -882T724 -884T714 -885H702L222 569L180 484Q138 399 137 399Q131 404 124 412L111 425L265 736L702 -586V168L703 922Q713 935 722 935Q734 935 742 920V-871",10216:"140 242V260L386 994Q633 1729 635 1732Q643 1745 657 1749Q658 1749 662 1749T668 1750Q682 1749 692 1740T702 1714V1705L214 251L703 -1204L702 -1213Q702 -1230 692 -1239T667 -1248H664Q647 -1248 635 -1231Q633 -1228 386 -493L140 242",10217:"103 1714Q103 1732 114 1741T137 1750Q157 1750 170 1732Q172 1729 419 994L665 260V242L419 -493Q172 -1228 170 -1231Q158 -1248 141 -1248H138Q123 -1248 113 -1239T103 -1213V-1204L591 251L103 1705V1714",12296:"140 242V260L386 994Q633 1729 635 1732Q643 1745 657 1749Q658 1749 662 1749T668 1750Q682 1749 692 1740T702 1714V1705L214 251L703 -1204L702 -1213Q702 -1230 692 -1239T667 -1248H664Q647 -1248 635 -1231Q633 -1228 386 -493L140 242",12297:"103 1714Q103 1732 114 1741T137 1750Q157 1750 170 1732Q172 1729 419 994L665 260V242L419 -493Q172 -1228 170 -1231Q158 -1248 141 -1248H138Q123 -1248 113 -1239T103 -1213V-1204L591 251L103 1705V1714",57344:"722 -14H720Q708 -14 702 0V306L703 612Q713 625 722 625Q734 625 742 610V0Q734 -14 724 -14H722",57345:"702 589Q706 601 718 605H1061Q1076 597 1076 585Q1076 572 1061 565H742V0Q734 -14 724 -14H722H720Q708 -14 702 0V589",57680:"-18 -213L-24 -207V-172L-16 -158Q75 2 260 84Q334 113 415 119Q418 119 427 119T440 120Q454 120 457 117T460 98V60V25Q460 7 457 4T441 0Q308 0 193 -55T25 -205Q21 -211 18 -212T-1 -213H-18",57681:"-10 60Q-10 104 -10 111T-5 118Q-1 120 10 120Q96 120 190 84Q375 2 466 -158L474 -172V-207L468 -213H451H447Q437 -213 434 -213T428 -209T423 -202T414 -187T396 -163Q331 -82 224 -41T9 0Q-4 0 -7 3T-10 25V60",57682:"-24 327L-18 333H-1Q11 333 15 333T22 329T27 322T35 308T54 284Q115 203 225 162T441 120Q454 120 457 117T460 95V60V28Q460 8 457 4T442 0Q355 0 260 36Q75 118 -16 278L-24 292V327",57683:"-10 60V95Q-10 113 -7 116T9 120Q151 120 250 171T396 284Q404 293 412 305T424 324T431 331Q433 333 451 333H468L474 327V292L466 278Q375 118 190 36Q95 0 8 0Q-5 0 -7 3T-10 24V60",57684:"-10 0V120H410V0H-10"},{57685:"\ue153\ue152",57686:"\ue151\ue150"})},2675:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.texVariant=void 0;var n=r(768),o=r(4926);e.texVariant=(0,n.AddPaths)(o.texVariant,{710:"1 561Q-3 563 -6 577T-12 604L-14 618Q-14 625 -7 628T23 635Q31 636 36 637Q63 641 621 745Q1148 845 1165 845Q1167 845 1752 739L2338 630Q2346 630 2346 618Q2340 565 2332 561Q2329 561 1749 654Q1617 675 1466 699T1241 736T1167 748Q1165 748 1093 737T867 700T583 654Q3 561 1 561",732:"804 788Q717 788 606 772T397 732T213 685T75 645T18 628Q11 628 11 632Q8 637 4 668T2 704Q2 713 36 732Q55 739 242 795Q622 898 826 898Q893 898 947 895Q1009 887 1056 872T1187 819Q1286 776 1356 758T1527 739Q1614 739 1725 755T1934 795T2118 842T2256 882T2313 899Q2320 899 2320 895Q2323 890 2327 860T2329 824Q2329 818 2296 795Q2273 787 2089 732Q1810 657 1598 632Q1562 629 1492 629Q1389 629 1320 644T1144 708Q1048 751 977 769T804 788",770:"-2332 561Q-2336 563 -2340 577T-2346 604L-2347 618Q-2347 625 -2340 628T-2310 635Q-2302 636 -2297 637Q-2270 641 -1712 745Q-1185 845 -1168 845Q-1166 845 -581 739L5 630Q13 630 13 618Q7 565 -1 561Q-4 561 -584 654Q-716 675 -867 699T-1092 736T-1166 748Q-1168 748 -1240 737T-1466 700T-1750 654Q-2330 561 -2332 561",771:"-1529 788Q-1616 788 -1727 772T-1936 732T-2120 685T-2258 645T-2315 628Q-2322 628 -2322 632Q-2325 637 -2329 668T-2331 704Q-2331 713 -2297 732Q-2278 739 -2091 795Q-1711 898 -1507 898Q-1440 898 -1386 895Q-1324 887 -1277 872T-1146 819Q-1047 776 -977 758T-806 739Q-719 739 -608 755T-399 795T-215 842T-77 882T-20 899Q-13 899 -13 895Q-10 890 -6 860T-4 824Q-4 818 -37 795Q-60 787 -244 732Q-523 657 -735 632Q-771 629 -841 629Q-944 629 -1013 644T-1189 708Q-1285 751 -1356 769T-1529 788",1008:"228 325Q170 322 156 316T127 309Q108 309 104 314Q99 319 99 322T108 341Q125 376 171 400T268 425H271Q302 425 319 396Q328 377 328 358Q328 332 324 314Q311 270 286 221Q274 194 274 192H275Q339 234 484 325T639 421Q669 434 691 434T723 425T734 406Q734 394 719 381Q715 376 644 330L575 287L566 267Q543 233 526 176Q520 160 515 143T508 115T506 105Q506 103 533 103Q585 103 607 110T641 118Q670 118 670 107Q670 100 661 85Q643 50 598 27T504 3Q465 3 450 36Q441 51 441 73Q441 84 444 96Q452 146 484 205L497 236L324 125Q143 12 135 10Q103 -6 77 -6Q61 -6 49 2T37 21Q37 36 49 46T124 96L195 141L204 156Q219 179 243 248T264 323Q264 325 228 325",8463:"182 599Q182 611 174 615T133 619Q118 619 114 621T109 630Q109 636 114 656T122 681Q125 685 202 688Q272 695 286 695Q304 695 304 684Q304 682 295 644T282 597Q282 592 360 592H399Q430 592 445 587T460 563Q460 552 451 541L442 535H266L251 468Q247 453 243 436T236 409T233 399Q233 395 244 404Q295 441 357 441Q405 441 445 417T485 333Q485 284 449 178T412 58T426 44Q447 44 466 68Q485 87 500 130L509 152H531H543Q562 152 562 144Q562 128 546 93T494 23T415 -13Q385 -13 359 3T322 44Q318 52 318 77Q318 99 352 196T386 337Q386 386 346 386Q318 386 286 370Q267 361 245 338T211 292Q207 287 193 235T162 113T138 21Q128 7 122 4Q105 -12 83 -12Q66 -12 54 -2T42 26L166 530Q166 534 161 534T129 535Q127 535 122 535T112 534Q74 534 74 562Q74 570 77 576T84 585T96 589T109 591T124 592T138 592L182 595V599",8592:"292 419Q292 400 261 347T211 275H306Q319 275 338 275T364 276Q399 276 410 271T422 250T411 230T366 225H306H211Q214 222 232 197T271 136T292 82Q292 71 285 68T262 64H250H241Q221 64 216 67T205 83Q186 127 153 167T78 230Q64 238 64 250Q64 258 69 263T82 272T106 288T139 318Q162 342 177 365T198 402T209 425T223 436Q224 437 252 437H258Q292 437 292 419",8594:"188 417Q188 437 221 437H233Q256 437 263 434T275 417Q294 373 327 333T402 270Q417 261 417 250Q417 241 410 236T382 217T341 182Q315 155 299 128T275 85T263 66Q259 64 231 64H219Q197 64 191 72T193 100Q202 124 215 147T239 185T257 210T267 223L269 225H174H116Q80 225 69 229T58 250T70 271T114 276Q121 276 140 276T174 275H269L267 277Q266 280 257 291T233 325T205 374Q188 408 188 417",8652:"755 512Q755 514 778 514H801L804 503Q805 501 812 486T824 462T839 437T862 408T892 381T932 354L944 347V327H507Q70 327 67 329Q55 335 55 347T67 365Q70 367 454 367H837L828 376Q803 403 785 437T761 489T755 512ZM55 153V173H492Q928 173 932 171Q944 166 944 153T932 135Q928 133 545 133H162L171 124Q198 95 216 61T239 8L244 -12Q244 -14 221 -14H198L195 -4Q160 95 67 146L55 153",8708:"55 676Q55 688 66 694H199L333 696L351 772Q364 827 370 843T386 860Q393 860 399 854T406 841Q406 836 391 765L375 696Q375 694 431 694H484Q491 688 497 681V12L493 5L486 1L353 -1H219L202 -79Q184 -153 180 -159Q175 -166 165 -166Q146 -166 146 -148Q146 -141 161 -76T177 -4Q177 -1 122 -1H68Q55 12 55 20T66 39H126L186 41L219 181Q226 215 234 251T246 305T251 325Q251 328 166 328H79Q68 345 68 347Q68 352 75 359L82 368H262L291 505Q298 539 306 575T319 630T324 650V654H68Q55 669 55 676ZM457 368V654H411Q366 654 366 652Q365 651 361 634T349 580T333 514Q303 373 302 372V368H457ZM457 39V328H375Q293 328 293 325Q292 322 260 183T228 41T344 39H457",8709:"624 470Q624 468 639 446T668 382T683 291Q683 181 612 99T437 -1Q425 -2 387 -2T337 -1Q245 18 193 70L179 81L131 39Q96 8 89 3T75 -3Q55 -3 55 17Q55 24 61 30T111 73Q154 113 151 113Q151 114 140 130T115 177T95 241Q94 253 94 291T95 341Q112 431 173 495Q265 587 385 587Q410 587 437 581Q522 571 582 513L595 501L642 541Q689 586 695 586Q696 586 697 586T699 587Q706 587 713 583T720 568Q720 560 711 551T664 510Q651 499 642 490T628 475T624 470ZM564 477Q517 522 448 539Q428 546 375 546Q290 546 229 492T144 370Q133 332 133 279Q136 228 151 195Q157 179 168 160T184 141Q186 141 375 307T564 477ZM642 290Q642 318 637 343T625 386T611 416T598 436T593 444Q590 444 402 277T213 108Q213 104 231 89T293 55T392 37Q495 37 568 111T642 290",8722:"84 237T84 250T98 270H402Q417 262 417 250T402 230H98Q84 237 84 250",8726:"91 404T91 410T97 423T111 430Q117 430 395 224Q676 13 678 10Q685 3 685 -3T678 -16T664 -23Q658 -23 380 184T98 397Q91 404 91 410",8733:"56 250Q56 346 122 409T276 472Q349 472 407 430T486 326L489 316Q490 317 493 326T501 345T514 367T531 393Q557 425 602 448T698 472Q722 472 722 452Q722 437 702 435T642 421T571 377Q520 323 520 250Q520 179 568 126T693 68Q722 66 722 48Q722 28 698 28Q636 28 576 67T493 174L490 184Q489 181 483 167T475 150T468 136T458 120T447 107T432 90T412 73Q350 28 277 28Q188 28 122 91T56 250ZM199 68T278 68T408 122T459 250Q459 322 414 370T308 430Q302 431 273 431Q204 431 150 380T96 250Q96 176 147 122",8739:"91 417Q104 430 111 430T131 417V-10Q116 -23 111 -23T91 -10V417",8740:"91 417Q104 430 111 430T131 417V301L171 341Q201 373 207 378T220 384Q227 384 233 377T240 366Q240 357 187 299L131 244V-10Q116 -23 111 -23T91 -10V201L49 157Q20 127 14 121T0 115Q-8 115 -14 121T-20 132Q-20 139 17 178Q29 191 36 199L91 257V417",8741:"55 417Q69 431 76 431T95 419V-12Q84 -23 76 -23Q72 -23 69 -22T62 -16T55 -10V417ZM293 419Q300 431 310 431L324 424L331 417V-10Q316 -23 309 -23L297 -19L293 -12V419",8742:"56 417Q68 431 76 431L89 426L96 419V317L98 215L193 273L291 330V375L293 419Q301 431 311 431Q331 431 331 388L333 355L356 370Q381 384 388 384Q394 384 400 377T407 363Q407 354 367 328L331 308V-10Q316 -23 310 -23Q300 -23 293 -12L291 135V284L98 168L96 77V-12Q84 -24 76 -24L62 -19L58 -12L56 66V144L31 128Q5 114 -2 114Q-8 114 -14 121T-20 136Q-20 142 -14 147T20 170L56 190V417",8764:"73 132Q55 132 55 172Q55 220 79 272Q95 301 111 319Q148 353 195 363Q199 364 212 364Q262 364 294 350T408 272Q472 222 522 212Q537 208 555 208Q606 208 646 243Q671 268 680 296T691 342T702 365Q713 365 716 354T719 314Q714 236 664 179L660 176Q657 173 654 170T644 163T631 154T615 146T596 139T574 134T549 132Q510 132 465 156T386 211T307 265T223 290Q162 290 124 249T86 165Q86 155 82 144T73 132",8776:"55 326Q55 394 101 437T226 481Q268 479 313 460T392 419T469 379T555 361Q622 361 662 401Q686 423 688 450Q693 479 702 479H705Q719 479 719 442Q719 367 670 327T554 286Q512 286 466 304T386 345T307 385T220 404Q184 404 157 394T120 374L111 363Q86 339 86 317Q86 288 71 288Q55 288 55 326ZM55 90Q55 164 105 205T226 246Q269 243 314 224T392 183T470 144T558 126Q622 126 662 166Q686 187 688 214Q693 244 704 244Q716 244 719 210Q719 165 702 132T658 82T605 58T552 50T498 58T447 77T384 110Q322 146 302 152Q263 168 220 168Q179 168 144 152Q128 147 107 125T86 81Q86 52 71 52Q55 52 55 90",8808:"86 472Q93 477 381 614T673 752Q680 752 686 746T693 732T689 721Q686 715 418 590L151 461L418 332Q684 207 689 201Q693 195 693 190Q693 183 687 177T675 170Q668 170 380 307T86 450Q82 454 82 461Q82 467 86 472ZM369 101V126Q369 156 382 156H384Q385 157 386 157Q409 157 409 115V98V54H680Q693 39 693 34T680 14H409V-142H680Q693 -155 693 -162Q693 -167 680 -182H409V-273Q396 -284 388 -284Q382 -284 369 -275V-182H95Q82 -167 82 -162Q82 -155 95 -142H369V14H95Q93 17 89 21T84 27T82 34T83 40T89 47T95 54H369V101",8809:"89 745Q95 752 100 752Q106 752 394 615T689 472Q693 468 693 461T689 450Q684 445 396 308T100 170Q95 170 89 176T82 190Q82 195 86 201Q91 208 358 332L624 461L358 590Q90 715 86 721Q82 725 82 731Q82 739 89 745ZM369 101V126Q369 156 382 156H384Q385 157 386 157Q409 157 409 115V98V54H680Q693 39 693 34T680 14H409V-142H680Q693 -155 693 -162Q693 -167 680 -182H409V-273Q396 -284 388 -284Q382 -284 369 -275V-182H95Q82 -167 82 -162Q82 -155 95 -142H369V14H95Q93 17 89 21T84 27T82 34T83 40T89 47T95 54H369V101",8816:"82 34Q82 44 93 55H198L300 57L342 179Q351 207 362 238T378 286T384 303T238 377Q109 435 86 450Q82 454 82 460T86 472Q90 476 302 579L511 679Q512 679 553 795Q569 842 577 866T592 903T600 917T608 919Q615 919 622 912T629 901Q629 899 595 799Q589 777 581 753T569 717T564 703L618 728Q666 752 673 752T686 746T693 732Q693 723 683 717T615 683L546 650L491 488Q464 410 450 368T438 326Q493 297 562 266Q660 219 677 209T694 190Q694 183 690 177T678 171Q664 171 546 228L424 286Q422 286 382 172L342 57L513 55H682Q694 43 694 34Q694 28 689 21L682 17L506 15H329L322 -8Q320 -13 310 -41T295 -85L275 -141H680Q682 -143 684 -146T688 -151T691 -156T693 -162Q693 -172 682 -179L473 -181H262L220 -303Q192 -388 185 -404T166 -421Q160 -421 153 -415T146 -403Q146 -400 179 -302T220 -185Q220 -181 158 -181L93 -179L86 -174Q82 -169 82 -161Q82 -152 93 -141H164L233 -139L260 -63L286 15H189L93 17L86 21Q82 26 82 34ZM495 623Q495 626 493 626T321 544T151 461L398 343Q399 343 405 360T423 415T446 483Q457 513 469 551T488 606T495 623",8817:"97 172Q82 172 82 190Q82 197 86 201Q94 209 173 246T327 319T402 357Q405 360 434 448T462 539L278 628Q96 713 86 721Q82 725 82 732T88 745T102 752Q103 752 125 742T198 709T293 666Q342 642 385 622T453 590T478 579Q479 579 506 659T562 824T598 915Q602 919 609 919T622 913T629 901Q629 898 571 728Q546 656 531 608T518 559Q555 539 602 519Q664 488 679 479T694 461Q694 457 689 450Q680 443 616 413T494 356T435 326L389 190L342 57L513 55H682Q694 43 694 34Q694 28 689 21L682 17L506 15H329L322 -8Q320 -13 310 -41T295 -85L275 -141H680Q682 -143 684 -146T688 -151T691 -156T693 -162Q693 -172 682 -179L473 -181H262L220 -303Q192 -388 185 -404T166 -421Q160 -421 153 -415T146 -403Q146 -400 179 -302T220 -185Q220 -181 158 -181L93 -179L86 -174Q82 -169 82 -161Q82 -152 93 -141H164L233 -139L260 -63L286 15H189L93 17L86 21Q82 26 82 34Q82 44 93 55H198L300 57L342 179Q350 204 361 238T378 286T382 301L246 237Q111 172 97 172ZM624 461Q621 464 560 492Q512 518 503 518Q500 518 500 517Q499 513 488 479T465 413T453 379L624 461",8840:"82 -6Q82 1 95 14H262L295 94Q331 171 331 174Q324 175 312 178T267 194T206 227T146 283T98 368Q84 406 84 461T98 554Q126 632 194 685T349 750Q360 752 480 752H591L604 783Q620 819 624 821Q631 828 640 828Q653 825 658 810Q658 808 646 781L635 754Q635 752 658 752Q680 752 686 746Q693 739 693 732Q693 728 692 726T686 719T680 712H615L506 466Q479 407 451 344T408 248T393 214Q393 210 535 210H680Q693 194 693 190T680 170H373L340 92L304 14H680Q693 1 693 -6Q693 -11 680 -26H286L253 -103L218 -179L451 -181H682Q694 -193 694 -201Q694 -212 682 -219L440 -221H200L178 -270Q160 -309 154 -319T139 -330Q122 -330 118 -312L155 -223Q155 -221 126 -221H95Q82 -206 82 -201T95 -181H175L206 -108Q237 -35 242 -30Q242 -26 169 -26H95Q82 -11 82 -6ZM571 710Q571 712 469 712Q443 712 416 712T371 711T351 710Q279 700 221 656T138 548Q124 508 124 461T138 374Q186 245 351 212L460 459Q571 709 571 710",8841:"82 732Q82 739 95 752H251H348Q420 752 460 744T551 708Q566 697 566 701Q618 815 624 821Q631 828 640 828Q653 825 658 810L600 677Q600 671 615 656T653 605T689 517Q692 496 692 461T689 406Q668 325 615 266Q572 221 513 196T391 170H373L340 92L304 14H680Q693 1 693 -6Q693 -11 680 -26H286L253 -103L218 -179L451 -181H682Q694 -193 694 -201Q694 -212 682 -219L440 -221H200L178 -270Q160 -309 154 -319T139 -330Q122 -330 118 -312L155 -223Q155 -221 126 -221H95Q82 -206 82 -201T95 -181H175L206 -108Q237 -35 242 -30Q242 -26 169 -26H95Q82 -11 82 -6Q82 1 95 14H262L295 92L331 170H95Q93 172 91 175T87 180T84 185T82 191Q82 199 93 210H220L349 212L549 659Q507 692 462 702T338 712H249H95Q82 727 82 732ZM652 473Q652 513 636 552T603 611T582 632Q581 632 487 422T393 210Q424 210 460 220T535 253T605 316T649 410Q652 427 652 461V473",8842:"693 -115T693 -122T680 -144H315L269 -199Q221 -255 213 -255H212Q203 -255 197 -248T193 -231Q195 -225 229 -184L262 -144H186L113 -142L106 -137Q102 -130 102 -125Q102 -119 115 -104H298L426 52H386Q342 54 309 63Q236 79 180 129T98 249Q84 289 84 343Q84 398 98 436Q126 514 193 567T346 632Q347 632 373 632T440 633T520 634H680Q682 631 686 627T691 621T693 614T680 594H526Q364 594 353 592Q268 581 207 528T126 394Q123 378 123 343T126 292Q141 231 181 185T280 114Q329 92 415 92H462L506 147Q554 203 562 203H563Q572 203 578 196T582 178Q579 173 546 132L513 94L598 92H682Q693 81 693 73T680 52H480L349 -102L515 -104H682Q693 -115 693 -122",8843:"82 610T82 614T83 620T89 627T95 634H251Q378 634 409 633T469 623Q540 604 596 554T678 436Q691 397 691 343T678 249Q653 181 597 131T469 63Q427 52 362 52H315L213 -102L438 -104H662Q673 -115 673 -123Q673 -129 660 -144H186L151 -197Q114 -250 109 -253Q106 -254 104 -254Q100 -254 98 -253Q91 -253 87 -248T82 -235Q82 -230 109 -186L138 -144H115Q82 -144 82 -125Q82 -119 95 -104H166L266 49Q266 52 182 52H95Q82 65 82 72Q82 76 83 78T89 85T95 92H295L329 143Q365 195 369 198Q372 203 380 203Q385 203 391 197T398 185Q398 184 398 184L399 182Q399 175 369 129L344 94Q344 92 376 92Q402 92 422 94Q496 104 554 147T638 256Q651 295 651 343Q651 390 638 429Q613 494 555 537T422 592Q411 594 249 594H95Q82 610 82 614",8872:"55 678Q55 679 56 681T58 684T61 688T65 691T70 693T77 694Q88 692 95 679V464H540Q554 456 555 446Q555 442 554 439T552 434T549 430T546 428T542 426T539 424H95V270H539Q540 270 542 269T545 267T549 264T552 260T554 255T555 248Q554 238 540 230H95V15Q88 2 77 0Q73 0 70 1T65 3T61 6T59 9T57 13T55 16V678",8901:"71 0Q59 4 55 16V96L56 176Q59 180 66 187L70 189H209Q219 181 222 174V15Q219 10 209 1L140 0H71",8994:"77 122Q68 122 63 126T57 135T55 142Q55 151 68 176T111 235T177 302T271 356T388 378Q451 378 508 355T602 300T668 233T709 174T722 142Q722 124 704 122Q692 122 685 134T658 179T606 243Q511 338 390 338Q354 338 320 329Q251 312 193 263T97 141Q87 123 77 122",8995:"389 143Q324 143 266 164T171 215T107 277T67 330T55 358T60 371T77 378Q85 377 92 367T116 331T158 280Q256 182 389 182Q475 182 552 227T675 351Q688 378 704 378Q722 376 722 358Q722 352 710 330T670 276T605 215T511 164T389 143",9651:"99 -20Q84 -11 84 0Q84 5 148 145T278 424L342 563Q347 575 360 575Q368 575 375 570Q376 569 441 430T571 148T637 0Q637 -11 622 -20H99ZM476 260L360 509L248 266Q137 24 135 22Q135 20 360 20Q586 20 586 21L476 260",9661:"84 556Q84 567 99 576H622Q637 567 637 556Q637 551 572 409T441 127T375 -14Q368 -19 360 -19H358Q349 -19 342 -7T296 92Q249 193 211 275Q84 550 84 556ZM586 534Q586 536 361 536Q135 536 135 535L358 52L361 47L473 290Q584 532 586 534",10887:"102 168Q103 168 151 146T247 102T295 81Q299 85 322 144T344 206L218 268Q153 297 123 313T87 333T82 344T86 355Q104 369 291 455Q491 552 491 553L542 673Q581 767 590 784T609 801Q616 801 622 795T629 781Q629 773 586 677Q546 581 546 577L609 606Q669 635 673 635Q680 635 686 629T693 615Q693 610 692 608T670 593T604 561L524 521L400 226L542 157Q617 123 649 107T687 85T694 72Q694 66 690 60T679 54Q665 54 526 119Q394 186 386 186Q385 186 342 88L331 61L509 -23Q680 -105 688 -111Q693 -115 693 -122T688 -135T675 -141H673Q664 -141 491 -59Q320 21 316 21H315L249 -136Q183 -293 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -282 154 -261T181 -197T213 -119L280 41Q280 46 186 86Q157 101 121 119Q92 133 87 136T82 148Q82 155 88 161T102 168ZM418 370L466 495Q464 495 308 420T151 344T204 317T311 267T364 244Q364 247 418 370",10888:"97 54Q82 54 82 72Q82 79 86 84Q95 91 222 153L351 215L398 324L442 433L258 519Q95 597 87 604Q82 608 82 615T88 628T102 635Q107 635 424 484L458 468L524 630Q593 789 597 795Q601 801 609 801Q616 801 622 795T629 781L562 615L493 450L589 406Q665 371 679 362T694 344Q694 339 693 337T677 326T631 302T538 257Q504 241 465 223T406 195T386 186Q383 185 344 92T306 -3L486 81Q662 168 673 168Q680 168 686 162T693 148T689 137Q688 136 482 35L280 -59L233 -176Q184 -291 178 -299Q172 -303 166 -303T153 -297T146 -283Q146 -279 185 -186T224 -90Q225 -88 223 -88Q219 -88 193 -101Q109 -143 98 -143Q82 -138 82 -122Q82 -116 85 -113T108 -98T171 -67L249 -30L289 61Q297 81 307 107T321 144T326 157L218 106Q109 54 97 54ZM553 379Q480 412 480 415Q479 415 460 372T423 285T406 241Q408 240 516 291T624 344L553 379",10955:"82 -14T82 -7T95 15H431L529 170H435Q341 170 333 175Q149 218 98 368Q84 406 84 461Q84 515 98 555Q126 633 193 686T346 750Q347 750 373 750T440 751T520 752H680Q693 739 693 732Q693 727 680 712H526Q364 712 353 710Q268 700 207 646T126 512Q123 496 123 461T126 410Q141 350 180 304T280 232Q312 217 344 214T464 210H555L589 261Q613 301 620 311T635 321Q644 321 650 315T657 301Q657 296 651 286T630 252T604 212Q604 210 642 210H680Q693 197 693 190Q693 186 692 184T686 177T680 170H578L526 92L478 17L580 15H682Q693 4 693 -4T680 -25H451L353 -179L518 -181H682Q694 -193 694 -201Q694 -211 682 -219L504 -221H326L293 -272Q257 -332 246 -332Q238 -332 232 -326T225 -313Q225 -310 226 -308Q226 -305 251 -265T278 -223Q278 -221 186 -221H95Q93 -218 89 -214T84 -208T82 -201T95 -181H306L404 -25H249L93 -23L86 -19Q82 -14 82 -7",10956:"82 732Q82 739 95 752H251Q415 752 426 750Q539 736 615 657Q667 599 689 517Q692 496 692 461T689 406Q668 325 615 266Q522 170 382 170H355L326 95Q319 80 311 59T298 28T293 17Q293 15 486 15H680Q693 0 693 -6T680 -25H275L213 -179L449 -181H682Q693 -192 693 -199T680 -221H198L178 -270Q153 -333 139 -333Q132 -333 126 -327T119 -314T135 -266T153 -223Q153 -221 124 -221H95Q82 -207 82 -201T95 -181H171L233 -25H162L93 -23L86 -19Q82 -14 82 -7T95 15H251L313 170H202L93 172L86 177Q82 182 82 190Q82 199 93 210H211L329 212L349 261Q366 301 372 311T386 321Q392 321 399 315T407 302Q407 295 390 254T373 210Q374 209 377 209Q412 209 444 217Q512 231 564 273T638 377Q651 414 651 461Q651 509 638 548Q613 613 555 656T422 710Q411 712 249 712H95Q82 727 82 732"},{})},5865:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},Q=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.MJContextMenu=void 0;var T=r(5073),s=r(6186),a=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.mathItem=null,e.annotation="",e.annotationTypes={},e}return o(e,t),e.prototype.post=function(e,r){if(this.mathItem){if(void 0!==r){var n=this.mathItem.inputJax.name,o=this.findID("Show","Original");o.content="MathML"===n?"Original MathML":n+" Commands",this.findID("Copy","Original").content=o.content;var i=this.findID("Settings","semantics");"MathML"===n?i.disable():i.enable(),this.getAnnotationMenu(),this.dynamicSubmenus()}t.prototype.post.call(this,e,r)}},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.mathItem=null},e.prototype.findID=function(){for(var t,e,r=[],n=0;n=0)return T}}catch(t){e={error:t}}finally{try{Q&&!Q.done&&(r=o.return)&&r.call(o)}finally{if(e)throw e.error}}return null},e.prototype.createAnnotationMenu=function(t,e,r){var n=this,o=this.findID(t,"Annotation");o.submenu=this.factory.get("subMenu")(this.factory,{items:e.map((function(t){var e=Q(t,2),o=e[0],i=e[1];return{type:"command",id:o,content:o,action:function(){n.annotation=i,r()}}})),id:"annotations"},o),e.length?o.enable():o.disable()},e.prototype.dynamicSubmenus=function(){var t,r;try{for(var n=i(e.DynamicSubmenus),o=n.next();!o.done;o=n.next()){var T=Q(o.value,2),s=T[0],a=T[1],l=this.find(s);if(l){var c=a(this,l);l.submenu=c,c.items.length?l.enable():l.disable()}}}catch(e){t={error:e}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},e.DynamicSubmenus=new Map,e}(T.ContextMenu);e.MJContextMenu=a},8310:function(t,e,r){var n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(e,"__esModule",{value:!0}),e.Menu=void 0;var Q=r(5713),T=r(4474),s=r(9515),a=r(7233),l=r(5865),c=r(473),u=r(4414),p=r(4922),h=r(6914),d=r(3463),f=r(7309),L=i(r(5445)),m=s.MathJax,y="undefined"!=typeof window&&window.navigator&&"Mac"===window.navigator.platform.substr(0,3),g=function(){function t(t,e){void 0===e&&(e={});var r=this;this.settings=null,this.defaultSettings=null,this.menu=null,this.MmlVisitor=new c.MmlVisitor,this.jax={CHTML:null,SVG:null},this.rerenderStart=T.STATE.LAST,this.about=new p.Info('MathJax v'+Q.mathjax.version,(function(){var t=[];return t.push("Input Jax: "+r.document.inputJax.map((function(t){return t.name})).join(", ")),t.push("Output Jax: "+r.document.outputJax.name),t.push("Document Type: "+r.document.kind),t.join("
")}),'www.mathjax.org'),this.help=new p.Info("MathJax Help",(function(){return["

MathJax is a JavaScript library that allows page"," authors to include mathematics within their web pages."," As a reader, you don't need to do anything to make that happen.

","

Browsers: MathJax works with all modern browsers including"," Edge, Firefox, Chrome, Safari, Opera, and most mobile browsers.

","

Math Menu: MathJax adds a contextual menu to equations."," Right-click or CTRL-click on any mathematics to access the menu.

",'
',"

Show Math As: These options allow you to view the formula's"," source markup (as MathML or in its original format).

","

Copy to Clipboard: These options copy the formula's source markup,"," as MathML or in its original format, to the clipboard"," (in browsers that support that).

","

Math Settings: These give you control over features of MathJax,"," such the size of the mathematics, and the mechanism used"," to display equations.

","

Accessibility: MathJax can work with screen"," readers to make mathematics accessible to the visually impaired."," Turn on the explorer to enable generation of speech strings"," and the ability to investigate expressions interactively.

","

Language: This menu lets you select the language used by MathJax"," for its menus and warning messages. (Not yet implemented in version 3.)

","
","

Math Zoom: If you are having difficulty reading an"," equation, MathJax can enlarge it to help you see it better, or"," you can scall all the math on the page to make it larger."," Turn these features on in the Math Settings menu.

","

Preferences: MathJax uses your browser's localStorage database"," to save the preferences set via this menu locally in your browser. These"," are not used to track you, and are not transferred or used remotely by"," MathJax in any way.

"].join("\n")}),'www.mathjax.org'),this.mathmlCode=new u.SelectableInfo("MathJax MathML Expression",(function(){if(!r.menu.mathItem)return"";var t=r.toMML(r.menu.mathItem);return"
"+r.formatSource(t)+"
"}),""),this.originalText=new u.SelectableInfo("MathJax Original Source",(function(){if(!r.menu.mathItem)return"";var t=r.menu.mathItem.math;return'
'+r.formatSource(t)+"
"}),""),this.annotationText=new u.SelectableInfo("MathJax Annotation Text",(function(){if(!r.menu.mathItem)return"";var t=r.menu.annotation;return'
'+r.formatSource(t)+"
"}),""),this.zoomBox=new p.Info("MathJax Zoomed Expression",(function(){if(!r.menu.mathItem)return"";var t=r.menu.mathItem.typesetRoot.cloneNode(!0);return t.style.margin="0",'
'+t.outerHTML+"
"}),""),this.document=t,this.options=(0,a.userOptions)((0,a.defaultOptions)({},this.constructor.OPTIONS),e),this.initSettings(),this.mergeUserSettings(),this.initMenu(),this.applySettings()}return Object.defineProperty(t.prototype,"isLoading",{get:function(){return t.loading>0},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,"loadingPromise",{get:function(){return this.isLoading?(t._loadingPromise||(t._loadingPromise=new Promise((function(e,r){t._loadingOK=e,t._loadingFailed=r}))),t._loadingPromise):Promise.resolve()},enumerable:!1,configurable:!0}),t.prototype.initSettings=function(){this.settings=this.options.settings,this.jax=this.options.jax;var t=this.document.outputJax;this.jax[t.name]=t,this.settings.renderer=t.name,m._.a11y&&m._.a11y.explorer&&Object.assign(this.settings,this.document.options.a11y),this.settings.scale=t.options.scale,this.defaultSettings=Object.assign({},this.settings)},t.prototype.initMenu=function(){var t=this,e=new h.Parser([["contextMenu",l.MJContextMenu.fromJson.bind(l.MJContextMenu)]]);this.menu=e.parse({type:"contextMenu",id:"MathJax_Menu",pool:[this.variable("texHints"),this.variable("semantics"),this.variable("zoom"),this.variable("zscale"),this.variable("renderer",(function(e){return t.setRenderer(e)})),this.variable("alt"),this.variable("cmd"),this.variable("ctrl"),this.variable("shift"),this.variable("scale",(function(e){return t.setScale(e)})),this.variable("explorer",(function(e){return t.setExplorer(e)})),this.a11yVar("highlight"),this.a11yVar("backgroundColor"),this.a11yVar("backgroundOpacity"),this.a11yVar("foregroundColor"),this.a11yVar("foregroundOpacity"),this.a11yVar("speech"),this.a11yVar("subtitles"),this.a11yVar("braille"),this.a11yVar("viewBraille"),this.a11yVar("locale",(function(t){return L.default.setupEngine({locale:t})})),this.a11yVar("speechRules",(function(e){var r=n(e.split("-"),2),o=r[0],i=r[1];t.document.options.sre.domain=o,t.document.options.sre.style=i})),this.a11yVar("magnification"),this.a11yVar("magnify"),this.a11yVar("treeColoring"),this.a11yVar("infoType"),this.a11yVar("infoRole"),this.a11yVar("infoPrefix"),this.variable("autocollapse"),this.variable("collapsible",(function(e){return t.setCollapsible(e)})),this.variable("inTabOrder",(function(e){return t.setTabOrder(e)})),this.variable("assistiveMml",(function(e){return t.setAssistiveMml(e)}))],items:[this.submenu("Show","Show Math As",[this.command("MathMLcode","MathML Code",(function(){return t.mathmlCode.post()})),this.command("Original","Original Form",(function(){return t.originalText.post()})),this.submenu("Annotation","Annotation")]),this.submenu("Copy","Copy to Clipboard",[this.command("MathMLcode","MathML Code",(function(){return t.copyMathML()})),this.command("Original","Original Form",(function(){return t.copyOriginal()})),this.submenu("Annotation","Annotation")]),this.rule(),this.submenu("Settings","Math Settings",[this.submenu("Renderer","Math Renderer",this.radioGroup("renderer",[["CHTML"],["SVG"]])),this.rule(),this.submenu("ZoomTrigger","Zoom Trigger",[this.command("ZoomNow","Zoom Once Now",(function(){return t.zoom(null,"",t.menu.mathItem)})),this.rule(),this.radioGroup("zoom",[["Click"],["DoubleClick","Double-Click"],["NoZoom","No Zoom"]]),this.rule(),this.label("TriggerRequires","Trigger Requires:"),this.checkbox(y?"Option":"Alt",y?"Option":"Alt","alt"),this.checkbox("Command","Command","cmd",{hidden:!y}),this.checkbox("Control","Control","ctrl",{hiddne:y}),this.checkbox("Shift","Shift","shift")]),this.submenu("ZoomFactor","Zoom Factor",this.radioGroup("zscale",[["150%"],["175%"],["200%"],["250%"],["300%"],["400%"]])),this.rule(),this.command("Scale","Scale All Math...",(function(){return t.scaleAllMath()})),this.rule(),this.checkbox("texHints","Add TeX hints to MathML","texHints"),this.checkbox("semantics","Add original as annotation","semantics"),this.rule(),this.command("Reset","Reset to defaults",(function(){return t.resetDefaults()}))]),this.submenu("Accessibility","Accessibility",[this.checkbox("Activate","Activate","explorer"),this.submenu("Speech","Speech",[this.checkbox("Speech","Speech Output","speech"),this.checkbox("Subtitles","Speech Subtitles","subtitles"),this.checkbox("Braille","Braille Output","braille"),this.checkbox("View Braille","Braille Subtitles","viewBraille"),this.rule(),this.submenu("A11yLanguage","Language"),this.rule(),this.submenu("Mathspeak","Mathspeak Rules",this.radioGroup("speechRules",[["mathspeak-default","Verbose"],["mathspeak-brief","Brief"],["mathspeak-sbrief","Superbrief"]])),this.submenu("Clearspeak","Clearspeak Rules",this.radioGroup("speechRules",[["clearspeak-default","Auto"]])),this.submenu("ChromeVox","ChromeVox Rules",this.radioGroup("speechRules",[["chromevox-default","Standard"],["chromevox-alternative","Alternative"]]))]),this.submenu("Highlight","Highlight",[this.submenu("Background","Background",this.radioGroup("backgroundColor",[["Blue"],["Red"],["Green"],["Yellow"],["Cyan"],["Magenta"],["White"],["Black"]])),{type:"slider",variable:"backgroundOpacity",content:" "},this.submenu("Foreground","Foreground",this.radioGroup("foregroundColor",[["Black"],["White"],["Magenta"],["Cyan"],["Yellow"],["Green"],["Red"],["Blue"]])),{type:"slider",variable:"foregroundOpacity",content:" "},this.rule(),this.radioGroup("highlight",[["None"],["Hover"],["Flame"]]),this.rule(),this.checkbox("TreeColoring","Tree Coloring","treeColoring")]),this.submenu("Magnification","Magnification",[this.radioGroup("magnification",[["None"],["Keyboard"],["Mouse"]]),this.rule(),this.radioGroup("magnify",[["200%"],["300%"],["400%"],["500%"]])]),this.submenu("Semantic Info","Semantic Info",[this.checkbox("Type","Type","infoType"),this.checkbox("Role","Role","infoRole"),this.checkbox("Prefix","Prefix","infoPrefix")],!0),this.rule(),this.checkbox("Collapsible","Collapsible Math","collapsible"),this.checkbox("AutoCollapse","Auto Collapse","autocollapse",{disabled:!0}),this.rule(),this.checkbox("InTabOrder","Include in Tab Order","inTabOrder"),this.checkbox("AssistiveMml","Include Hidden MathML","assistiveMml")]),this.submenu("Language","Language"),this.rule(),this.command("About","About MathJax",(function(){return t.about.post()})),this.command("Help","MathJax Help",(function(){return t.help.post()}))]});var r=this.menu;this.about.attachMenu(r),this.help.attachMenu(r),this.originalText.attachMenu(r),this.annotationText.attachMenu(r),this.mathmlCode.attachMenu(r),this.zoomBox.attachMenu(r),this.checkLoadableItems(),this.enableExplorerItems(this.settings.explorer),r.showAnnotation=this.annotationText,r.copyAnnotation=this.copyAnnotation.bind(this),r.annotationTypes=this.options.annotationTypes,f.CssStyles.addInfoStyles(this.document.document),f.CssStyles.addMenuStyles(this.document.document)},t.prototype.checkLoadableItems=function(){var t,e;if(m&&m._&&m.loader&&m.startup)!this.settings.collapsible||m._.a11y&&m._.a11y.complexity||this.loadA11y("complexity"),!this.settings.explorer||m._.a11y&&m._.a11y.explorer||this.loadA11y("explorer"),!this.settings.assistiveMml||m._.a11y&&m._.a11y["assistive-mml"]||this.loadA11y("assistive-mml");else{var r=this.menu;try{for(var n=o(Object.keys(this.jax)),i=n.next();!i.done;i=n.next()){var Q=i.value;this.jax[Q]||r.findID("Settings","Renderer",Q).disable()}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}r.findID("Accessibility","Activate").disable(),r.findID("Accessibility","AutoCollapse").disable(),r.findID("Accessibility","Collapsible").disable()}},t.prototype.enableExplorerItems=function(t){var e,r,n=this.menu.findID("Accessibility","Activate").menu;try{for(var i=o(n.items.slice(1)),Q=i.next();!Q.done;Q=i.next()){var T=Q.value;if(T instanceof d.Rule)break;t?T.enable():T.disable()}}catch(t){e={error:t}}finally{try{Q&&!Q.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},t.prototype.mergeUserSettings=function(){try{var e=localStorage.getItem(t.MENU_STORAGE);if(!e)return;Object.assign(this.settings,JSON.parse(e)),this.setA11y(this.settings)}catch(t){console.log("MathJax localStorage error: "+t.message)}},t.prototype.saveUserSettings=function(){var e,r,n={};try{for(var i=o(Object.keys(this.settings)),Q=i.next();!Q.done;Q=i.next()){var T=Q.value;this.settings[T]!==this.defaultSettings[T]&&(n[T]=this.settings[T])}}catch(t){e={error:t}}finally{try{Q&&!Q.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}try{Object.keys(n).length?localStorage.setItem(t.MENU_STORAGE,JSON.stringify(n)):localStorage.removeItem(t.MENU_STORAGE)}catch(t){console.log("MathJax localStorage error: "+t.message)}},t.prototype.setA11y=function(t){m._.a11y&&m._.a11y.explorer&&m._.a11y.explorer_ts.setA11yOptions(this.document,t)},t.prototype.getA11y=function(t){if(m._.a11y&&m._.a11y.explorer)return void 0!==this.document.options.a11y[t]?this.document.options.a11y[t]:this.document.options.sre[t]},t.prototype.applySettings=function(){this.setTabOrder(this.settings.inTabOrder),this.document.options.enableAssistiveMml=this.settings.assistiveMml,this.document.outputJax.options.scale=parseFloat(this.settings.scale),this.settings.renderer!==this.defaultSettings.renderer&&this.setRenderer(this.settings.renderer)},t.prototype.setScale=function(t){this.document.outputJax.options.scale=parseFloat(t),this.document.rerender()},t.prototype.setRenderer=function(t){var e=this;if(this.jax[t])this.setOutputJax(t);else{var r=t.toLowerCase();this.loadComponent("output/"+r,(function(){var n=m.startup;r in n.constructors&&(n.useOutput(r,!0),n.output=n.getOutputJax(),e.jax[t]=n.output,e.setOutputJax(t))}))}},t.prototype.setOutputJax=function(t){this.jax[t].setAdaptor(this.document.adaptor),this.document.outputJax=this.jax[t],this.rerender()},t.prototype.setTabOrder=function(t){this.menu.store.inTaborder(t)},t.prototype.setAssistiveMml=function(t){this.document.options.enableAssistiveMml=t,!t||m._.a11y&&m._.a11y["assistive-mml"]?this.rerender():this.loadA11y("assistive-mml")},t.prototype.setExplorer=function(t){this.enableExplorerItems(t),this.document.options.enableExplorer=t,!t||m._.a11y&&m._.a11y.explorer?this.rerender(this.settings.collapsible?T.STATE.RERENDER:T.STATE.COMPILED):this.loadA11y("explorer")},t.prototype.setCollapsible=function(t){this.document.options.enableComplexity=t,!t||m._.a11y&&m._.a11y.complexity?this.rerender(T.STATE.COMPILED):this.loadA11y("complexity")},t.prototype.scaleAllMath=function(){var t=(100*parseFloat(this.settings.scale)).toFixed(1).replace(/.0$/,""),e=prompt("Scale all mathematics (compared to surrounding text) by",t+"%");if(e)if(e.match(/^\s*\d+(\.\d*)?\s*%?\s*$/)){var r=parseFloat(e)/100;r?this.menu.pool.lookup("scale").setValue(String(r)):alert("The scale should not be zero")}else alert("The scale should be a percentage (e.g., 120%)")},t.prototype.resetDefaults=function(){var e,r;t.loading++;var n=this.menu.pool,i=this.defaultSettings;try{for(var Q=o(Object.keys(this.settings)),s=Q.next();!s.done;s=Q.next()){var a=s.value,l=n.lookup(a);if(l){l.setValue(i[a]);var c=l.items[0];c&&c.executeCallbacks_()}else this.settings[a]=i[a]}}catch(t){e={error:t}}finally{try{s&&!s.done&&(r=Q.return)&&r.call(Q)}finally{if(e)throw e.error}}t.loading--,this.rerender(T.STATE.COMPILED)},t.prototype.checkComponent=function(e){var r=t.loadingPromises.get(e);r&&Q.mathjax.retryAfter(r)},t.prototype.loadComponent=function(e,r){if(!t.loadingPromises.has(e)){var n=m.loader;if(n){t.loading++;var o=n.load(e).then((function(){t.loading--,t.loadingPromises.delete(e),r(),0===t.loading&&t._loadingPromise&&(t._loadingPromise=null,t._loadingOK())})).catch((function(e){t._loadingPromise?(t._loadingPromise=null,t._loadingFailed(e)):console.log(e)}));t.loadingPromises.set(e,o)}}},t.prototype.loadA11y=function(e){var r=this,n=!T.STATE.ENRICHED;this.loadComponent("a11y/"+e,(function(){var o=m.startup;Q.mathjax.handlers.unregister(o.handler),o.handler=o.getHandler(),Q.mathjax.handlers.register(o.handler);var i=r.document;r.document=o.document=o.getDocument(),r.document.menu=r,r.document.outputJax.reset(),r.transferMathList(i),r.document.processed=i.processed,t._loadingPromise||(r.document.outputJax.reset(),r.rerender("complexity"===e||n?T.STATE.COMPILED:T.STATE.TYPESET))}))},t.prototype.transferMathList=function(t){var e,r,n=this.document.options.MathItem;try{for(var i=o(t.math),Q=i.next();!Q.done;Q=i.next()){var T=Q.value,s=new n;Object.assign(s,T),this.document.math.push(s)}}catch(t){e={error:t}}finally{try{Q&&!Q.done&&(r=i.return)&&r.call(i)}finally{if(e)throw e.error}}},t.prototype.formatSource=function(t){return t.trim().replace(/&/g,"&").replace(//g,">")},t.prototype.toMML=function(t){return this.MmlVisitor.visitTree(t.root,t,{texHints:this.settings.texHints,semantics:this.settings.semantics&&"MathML"!==t.inputJax.name})},t.prototype.zoom=function(t,e,r){t&&!this.isZoomEvent(t,e)||(this.menu.mathItem=r,t&&this.menu.post(t),this.zoomBox.post())},t.prototype.isZoomEvent=function(t,e){return this.settings.zoom===e&&(!this.settings.alt||t.altKey)&&(!this.settings.ctrl||t.ctrlKey)&&(!this.settings.cmd||t.metaKey)&&(!this.settings.shift||t.shiftKey)},t.prototype.rerender=function(e){void 0===e&&(e=T.STATE.TYPESET),this.rerenderStart=Math.min(e,this.rerenderStart),t.loading||(this.rerenderStart<=T.STATE.COMPILED&&this.document.reset({inputJax:[]}),this.document.rerender(this.rerenderStart),this.rerenderStart=T.STATE.LAST)},t.prototype.copyMathML=function(){this.copyToClipboard(this.toMML(this.menu.mathItem))},t.prototype.copyOriginal=function(){this.copyToClipboard(this.menu.mathItem.math.trim())},t.prototype.copyAnnotation=function(){this.copyToClipboard(this.menu.annotation.trim())},t.prototype.copyToClipboard=function(t){var e=document.createElement("textarea");e.value=t,e.setAttribute("readonly",""),e.style.cssText="height: 1px; width: 1px; padding: 1px; position: absolute; left: -10px",document.body.appendChild(e),e.select();try{document.execCommand("copy")}catch(t){alert("Can't copy to clipboard: "+t.message)}document.body.removeChild(e)},t.prototype.addMenu=function(t){var e=this,r=t.typesetRoot;r.addEventListener("contextmenu",(function(){return e.menu.mathItem=t}),!0),r.addEventListener("keydown",(function(){return e.menu.mathItem=t}),!0),r.addEventListener("click",(function(r){return e.zoom(r,"Click",t)}),!0),r.addEventListener("dblclick",(function(r){return e.zoom(r,"DoubleClick",t)}),!0),this.menu.store.insert(r)},t.prototype.clear=function(){this.menu.store.clear()},t.prototype.variable=function(t,e){var r=this;return{name:t,getter:function(){return r.settings[t]},setter:function(n){r.settings[t]=n,e&&e(n),r.saveUserSettings()}}},t.prototype.a11yVar=function(t,e){var r=this;return{name:t,getter:function(){return r.getA11y(t)},setter:function(n){r.settings[t]=n;var o={};o[t]=n,r.setA11y(o),e&&e(n),r.saveUserSettings()}}},t.prototype.submenu=function(t,e,r,n){var i,Q;void 0===r&&(r=[]),void 0===n&&(n=!1);var T=[];try{for(var s=o(r),a=s.next();!a.done;a=s.next()){var l=a.value;Array.isArray(l)?T=T.concat(l):T.push(l)}}catch(t){i={error:t}}finally{try{a&&!a.done&&(Q=s.return)&&Q.call(s)}finally{if(i)throw i.error}}return{type:"submenu",id:t,content:e,menu:{items:T},disabled:0===T.length||n}},t.prototype.command=function(t,e,r,n){return void 0===n&&(n={}),Object.assign({type:"command",id:t,content:e,action:r},n)},t.prototype.checkbox=function(t,e,r,n){return void 0===n&&(n={}),Object.assign({type:"checkbox",id:t,content:e,variable:r},n)},t.prototype.radioGroup=function(t,e){var r=this;return e.map((function(e){return r.radio(e[0],e[1]||e[0],t)}))},t.prototype.radio=function(t,e,r,n){return void 0===n&&(n={}),Object.assign({type:"radio",id:t,content:e,variable:r},n)},t.prototype.label=function(t,e){return{type:"label",id:t,content:e}},t.prototype.rule=function(){return{type:"rule"}},t.MENU_STORAGE="MathJax-Menu-Settings",t.OPTIONS={settings:{texHints:!0,semantics:!1,zoom:"NoZoom",zscale:"200%",renderer:"CHTML",alt:!1,cmd:!1,ctrl:!1,shift:!1,scale:1,autocollapse:!1,collapsible:!1,inTabOrder:!0,assistiveMml:!0,explorer:!1},jax:{CHTML:null,SVG:null},annotationTypes:(0,a.expandable)({TeX:["TeX","LaTeX","application/x-tex"],StarMath:["StarMath 5.0"],Maple:["Maple"],ContentMathML:["MathML-Content","application/mathml-content+xml"],OpenMath:["OpenMath"]})},t.loading=0,t.loadingPromises=new Map,t._loadingPromise=null,t._loadingOK=null,t._loadingFailed=null,t}();e.Menu=g},4001:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__assign||function(){return i=Object.assign||function(t){for(var e,r=1,n=arguments.length;r0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},T=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MenuHandler=e.MenuMathDocumentMixin=e.MenuMathItemMixin=void 0;var a=r(5713),l=r(4474),c=r(7233),u=r(8310);function p(t){return function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addMenu=function(t,e){void 0===e&&(e=!1),this.state()>=l.STATE.CONTEXT_MENU||(this.isEscaped||!t.options.enableMenu&&!e||t.menu.addMenu(this),this.state(l.STATE.CONTEXT_MENU))},e.prototype.checkLoading=function(t){t.checkLoading()},e}(t)}function h(t){var e;return e=function(t){function e(){for(var e=[],r=0;r\n"+this.childNodeMml(e,r+" ","\n")+r+""},e.prototype.visitMathNode=function(e,r){if(!this.options.semantics||"TeX"!==this.mathItem.inputJax.name)return t.prototype.visitDefault.call(this,e,r);var n=e.childNodes.length&&e.childNodes[0].childNodes.length>1;return r+"\n"+r+" \n"+(n?r+" \n":"")+this.childNodeMml(e,r+(n?" ":" "),"\n")+(n?r+" \n":"")+r+' '+this.mathItem.math+"\n"+r+" \n"+r+""},e}(i.SerializedMmlVisitor);e.MmlVisitor=T},4414:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.SelectableInfo=void 0;var i=r(4922),Q=r(2165),T=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addEvents=function(t){var e=this;t.addEventListener("keypress",(function(t){"a"===t.key&&(t.ctrlKey||t.metaKey)&&(e.selectAll(),e.stop(t))}))},e.prototype.selectAll=function(){document.getSelection().selectAllChildren(this.html.querySelector("pre"))},e.prototype.copyToClipboard=function(){this.selectAll();try{document.execCommand("copy")}catch(t){alert("Can't copy to clipboard: "+t.message)}document.getSelection().removeAllRanges()},e.prototype.generateHtml=function(){var e=this;t.prototype.generateHtml.call(this);var r=this.html.querySelector("span."+Q.HtmlClasses.INFOSIGNATURE).appendChild(document.createElement("input"));r.type="button",r.value="Copy to Clipboard",r.addEventListener("click",(function(t){return e.copyToClipboard()}))},e}(i.Info);e.SelectableInfo=T},9923:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.asyncLoad=void 0;var n=r(5713);e.asyncLoad=function(t){return n.mathjax.asyncLoad?new Promise((function(e,r){var o=n.mathjax.asyncLoad(t);o instanceof Promise?o.then((function(t){return e(t)})).catch((function(t){return r(t)})):e(o)})):Promise.reject("Can't load '".concat(t,"': No asyncLoad method specified"))}},6469:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.BBox=void 0;var n=r(6010),o=function(){function t(t){void 0===t&&(t={w:0,h:-n.BIGDIMEN,d:-n.BIGDIMEN}),this.w=t.w||0,this.h="h"in t?t.h:-n.BIGDIMEN,this.d="d"in t?t.d:-n.BIGDIMEN,this.L=this.R=this.ic=this.sk=this.dx=0,this.scale=this.rscale=1,this.pwidth=""}return t.zero=function(){return new t({h:0,d:0,w:0})},t.empty=function(){return new t},t.prototype.empty=function(){return this.w=0,this.h=this.d=-n.BIGDIMEN,this},t.prototype.clean=function(){this.w===-n.BIGDIMEN&&(this.w=0),this.h===-n.BIGDIMEN&&(this.h=0),this.d===-n.BIGDIMEN&&(this.d=0)},t.prototype.rescale=function(t){this.w*=t,this.h*=t,this.d*=t},t.prototype.combine=function(t,e,r){void 0===e&&(e=0),void 0===r&&(r=0);var n=t.rscale,o=e+n*(t.w+t.L+t.R),i=r+n*t.h,Q=n*t.d-r;o>this.w&&(this.w=o),i>this.h&&(this.h=i),Q>this.d&&(this.d=Q)},t.prototype.append=function(t){var e=t.rscale;this.w+=e*(t.w+t.L+t.R),e*t.h>this.h&&(this.h=e*t.h),e*t.d>this.d&&(this.d=e*t.d)},t.prototype.updateFrom=function(t){this.h=t.h,this.d=t.d,this.w=t.w,t.pwidth&&(this.pwidth=t.pwidth)},t.fullWidth="100%",t.StyleAdjust=[["borderTopWidth","h"],["borderRightWidth","w"],["borderBottomWidth","d"],["borderLeftWidth","w",0],["paddingTop","h"],["paddingRight","w"],["paddingBottom","d"],["paddingLeft","w",0]],t}();e.BBox=o},6751:function(t,e){var r,n=this&&this.__extends||(r=function(t,e){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},r(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}),o=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},i=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},Q=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o",gtdot:"\u22d7",harrw:"\u21ad",hbar:"\u210f",hellip:"\u2026",hookleftarrow:"\u21a9",hookrightarrow:"\u21aa",imath:"\u0131",infin:"\u221e",intcal:"\u22ba",iota:"\u03b9",jmath:"\u0237",kappa:"\u03ba",kappav:"\u03f0",lEg:"\u2a8b",lambda:"\u03bb",lap:"\u2a85",larrlp:"\u21ab",larrtl:"\u21a2",lbrace:"{",lbrack:"[",le:"\u2264",leftleftarrows:"\u21c7",leftthreetimes:"\u22cb",lessdot:"\u22d6",lmoust:"\u23b0",lnE:"\u2268",lnap:"\u2a89",lne:"\u2a87",lnsim:"\u22e6",longmapsto:"\u27fc",looparrowright:"\u21ac",lowast:"\u2217",loz:"\u25ca",lt:"<",ltimes:"\u22c9",ltri:"\u25c3",macr:"\xaf",malt:"\u2720",mho:"\u2127",mu:"\u03bc",multimap:"\u22b8",nLeftarrow:"\u21cd",nLeftrightarrow:"\u21ce",nRightarrow:"\u21cf",nVDash:"\u22af",nVdash:"\u22ae",natur:"\u266e",nearr:"\u2197",nharr:"\u21ae",nlarr:"\u219a",not:"\xac",nrarr:"\u219b",nu:"\u03bd",nvDash:"\u22ad",nvdash:"\u22ac",nwarr:"\u2196",omega:"\u03c9",omicron:"\u03bf",or:"\u2228",osol:"\u2298",period:".",phi:"\u03c6",phiv:"\u03d5",pi:"\u03c0",piv:"\u03d6",prap:"\u2ab7",precnapprox:"\u2ab9",precneqq:"\u2ab5",precnsim:"\u22e8",prime:"\u2032",psi:"\u03c8",quot:'"',rarrtl:"\u21a3",rbrace:"}",rbrack:"]",rho:"\u03c1",rhov:"\u03f1",rightrightarrows:"\u21c9",rightthreetimes:"\u22cc",ring:"\u02da",rmoust:"\u23b1",rtimes:"\u22ca",rtri:"\u25b9",scap:"\u2ab8",scnE:"\u2ab6",scnap:"\u2aba",scnsim:"\u22e9",sdot:"\u22c5",searr:"\u2198",sect:"\xa7",sharp:"\u266f",sigma:"\u03c3",sigmav:"\u03c2",simne:"\u2246",smile:"\u2323",spades:"\u2660",sub:"\u2282",subE:"\u2ac5",subnE:"\u2acb",subne:"\u228a",supE:"\u2ac6",supnE:"\u2acc",supne:"\u228b",swarr:"\u2199",tau:"\u03c4",theta:"\u03b8",thetav:"\u03d1",tilde:"\u02dc",times:"\xd7",triangle:"\u25b5",triangleq:"\u225c",upsi:"\u03c5",upuparrows:"\u21c8",veebar:"\u22bb",vellip:"\u22ee",weierp:"\u2118",xi:"\u03be",yen:"\xa5",zeta:"\u03b6",zigrarr:"\u21dd",nbsp:"\xa0",rsquo:"\u2019",lsquo:"\u2018"};var i={};function Q(t,r){if("#"===r.charAt(0))return T(r.slice(1));if(e.entities[r])return e.entities[r];if(e.options.loadMissingEntities){var Q=r.match(/^[a-zA-Z](fr|scr|opf)$/)?RegExp.$1:r.charAt(0).toLowerCase();i[Q]||(i[Q]=!0,(0,n.retryAfter)((0,o.asyncLoad)("./util/entities/"+Q+".js")))}return t}function T(t){var e="x"===t.charAt(0)?parseInt(t.slice(1),16):parseInt(t);return String.fromCodePoint(e)}e.add=function(t,r){Object.assign(e.entities,t),i[r]=!0},e.remove=function(t){delete e.entities[t]},e.translate=function(t){return t.replace(/&([a-z][a-z0-9]*|#(?:[0-9]+|x[0-9a-f]+));/gi,Q)},e.numeric=T},7525:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=e[r])},n(t,e)},function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},Q=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},T=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o0&&o[o.length-1])||6!==i[0]&&2!==i[0])){Q=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.LinkedList=e.ListItem=e.END=void 0,e.END=Symbol();var Q=function(t){void 0===t&&(t=null),this.next=null,this.prev=null,this.data=t};e.ListItem=Q;var T=function(){function t(){for(var t=[],r=0;r1;){var a=o.shift(),l=o.shift();a.merge(l,e),o.push(a)}return o.length&&(this.list=o[0].list),this},t.prototype.merge=function(t,r){var o,i,Q,T,s;void 0===r&&(r=null),null===r&&(r=this.isBefore.bind(this));for(var a=this.list.next,l=t.list.next;a.data!==e.END&&l.data!==e.END;)r(l.data,a.data)?(o=n([a,l],2),l.prev.next=o[0],a.prev.next=o[1],i=n([a.prev,l.prev],2),l.prev=i[0],a.prev=i[1],Q=n([t.list,this.list],2),this.list.prev.next=Q[0],t.list.prev.next=Q[1],T=n([t.list.prev,this.list.prev],2),this.list.prev=T[0],t.list.prev=T[1],a=(s=n([l.next,a],2))[0],l=s[1]):a=a.next;return l.data!==e.END&&(this.list.prev.next=t.list.next,t.list.next.prev=this.list.prev,t.list.prev.next=this.list,this.list.prev=t.list.prev,t.list.next=t.list.prev=t.list),this},t}();e.LinkedList=T},7233:function(t,e){var r=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;oe.length}}}},t.prototype.add=function(e,r){void 0===r&&(r=t.DEFAULTPRIORITY);var n=this.items.length;do{n--}while(n>=0&&r=0&&this.items[e].item!==t);e>=0&&this.items.splice(e,1)},t.DEFAULTPRIORITY=5,t}();e.PrioritizedList=r},4542:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.retryAfter=e.handleRetriesFor=void 0,e.handleRetriesFor=function(t){return new Promise((function e(r,n){try{r(t())}catch(t){t.retry&&t.retry instanceof Promise?t.retry.then((function(){return e(r,n)})).catch((function(t){return n(t)})):t.restart&&t.restart.isCallback?MathJax.Callback.After((function(){return e(r,n)}),t.restart):n(t)}}))},e.retryAfter=function(t){var e=new Error("MathJax retry");throw e.retry=t,e}},4139:function(t,e){var r=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.CssStyles=void 0;var n=function(){function t(t){void 0===t&&(t=null),this.styles={},this.addStyles(t)}return Object.defineProperty(t.prototype,"cssText",{get:function(){return this.getStyleString()},enumerable:!1,configurable:!0}),t.prototype.addStyles=function(t){var e,n;if(t)try{for(var o=r(Object.keys(t)),i=o.next();!i.done;i=o.next()){var Q=i.value;this.styles[Q]||(this.styles[Q]={}),Object.assign(this.styles[Q],t[Q])}}catch(t){e={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(e)throw e.error}}},t.prototype.removeStyles=function(){for(var t,e,n=[],o=0;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__read||function(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,i=r.call(t),Q=[];try{for(;(void 0===e||e-- >0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},o=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o1;)e.shift(),r.push(e.shift());return r}function s(t){var e,n,o=T(this.styles[t]);0===o.length&&o.push(""),1===o.length&&o.push(o[0]),2===o.length&&o.push(o[0]),3===o.length&&o.push(o[1]);try{for(var i=r(y.connect[t].children),Q=i.next();!Q.done;Q=i.next()){var s=Q.value;this.setStyle(this.childName(t,s),o.shift())}}catch(t){e={error:t}}finally{try{Q&&!Q.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}}function a(t){var e,n,o=y.connect[t].children,i=[];try{for(var Q=r(o),T=Q.next();!T.done;T=Q.next()){var s=T.value,a=this.styles[t+"-"+s];if(!a)return void delete this.styles[t];i.push(a)}}catch(t){e={error:t}}finally{try{T&&!T.done&&(n=Q.return)&&n.call(Q)}finally{if(e)throw e.error}}i[3]===i[1]&&(i.pop(),i[2]===i[0]&&(i.pop(),i[1]===i[0]&&i.pop())),this.styles[t]=i.join(" ")}function l(t){var e,n;try{for(var o=r(y.connect[t].children),i=o.next();!i.done;i=o.next()){var Q=i.value;this.setStyle(this.childName(t,Q),this.styles[t])}}catch(t){e={error:t}}finally{try{i&&!i.done&&(n=o.return)&&n.call(o)}finally{if(e)throw e.error}}}function c(t){var e,i,Q=o([],n(y.connect[t].children),!1),T=this.styles[this.childName(t,Q.shift())];try{for(var s=r(Q),a=s.next();!a.done;a=s.next()){var l=a.value;if(this.styles[this.childName(t,l)]!==T)return void delete this.styles[t]}}catch(t){e={error:t}}finally{try{a&&!a.done&&(i=s.return)&&i.call(s)}finally{if(e)throw e.error}}this.styles[t]=T}var u=/^(?:[\d.]+(?:[a-z]+)|thin|medium|thick|inherit|initial|unset)$/,p=/^(?:none|hidden|dotted|dashed|solid|double|groove|ridge|inset|outset|inherit|initial|unset)$/;function h(t){var e,n,o,i,Q={width:"",style:"",color:""};try{for(var s=r(T(this.styles[t])),a=s.next();!a.done;a=s.next()){var l=a.value;l.match(u)&&""===Q.width?Q.width=l:l.match(p)&&""===Q.style?Q.style=l:Q.color=l}}catch(t){e={error:t}}finally{try{a&&!a.done&&(n=s.return)&&n.call(s)}finally{if(e)throw e.error}}try{for(var c=r(y.connect[t].children),h=c.next();!h.done;h=c.next()){var d=h.value;this.setStyle(this.childName(t,d),Q[d])}}catch(t){o={error:t}}finally{try{h&&!h.done&&(i=c.return)&&i.call(c)}finally{if(o)throw o.error}}}function d(t){var e,n,o=[];try{for(var i=r(y.connect[t].children),Q=i.next();!Q.done;Q=i.next()){var T=Q.value,s=this.styles[this.childName(t,T)];s&&o.push(s)}}catch(t){e={error:t}}finally{try{Q&&!Q.done&&(n=i.return)&&n.call(i)}finally{if(e)throw e.error}}o.length?this.styles[t]=o.join(" "):delete this.styles[t]}var f={style:/^(?:normal|italic|oblique|inherit|initial|unset)$/,variant:new RegExp("^(?:"+["normal|none","inherit|initial|unset","common-ligatures|no-common-ligatures","discretionary-ligatures|no-discretionary-ligatures","historical-ligatures|no-historical-ligatures","contextual|no-contextual","(?:stylistic|character-variant|swash|ornaments|annotation)\\([^)]*\\)","small-caps|all-small-caps|petite-caps|all-petite-caps|unicase|titling-caps","lining-nums|oldstyle-nums|proportional-nums|tabular-nums","diagonal-fractions|stacked-fractions","ordinal|slashed-zero","jis78|jis83|jis90|jis04|simplified|traditional","full-width|proportional-width","ruby"].join("|")+")$"),weight:/^(?:normal|bold|bolder|lighter|[1-9]00|inherit|initial|unset)$/,stretch:new RegExp("^(?:"+["normal","(?:(?:ultra|extra|semi)-)?condensed","(?:(?:semi|extra|ulta)-)?expanded","inherit|initial|unset"].join("|")+")$"),size:new RegExp("^(?:"+["xx-small|x-small|small|medium|large|x-large|xx-large|larger|smaller","[d.]+%|[d.]+[a-z]+","inherit|initial|unset"].join("|")+")(?:/(?:normal|[d.+](?:%|[a-z]+)?))?$")};function L(t){var e,o,i,Q,s=T(this.styles[t]),a={style:"",variant:[],weight:"",stretch:"",size:"",family:"","line-height":""};try{for(var l=r(s),c=l.next();!c.done;c=l.next()){var u=c.value;a.family=u;try{for(var p=(i=void 0,r(Object.keys(f))),h=p.next();!h.done;h=p.next()){var d=h.value;if((Array.isArray(a[d])||""===a[d])&&u.match(f[d]))if("size"===d){var L=n(u.split(/\//),2),m=L[0],g=L[1];a[d]=m,g&&(a["line-height"]=g)}else""===a.size&&(Array.isArray(a[d])?a[d].push(u):a[d]=u)}}catch(t){i={error:t}}finally{try{h&&!h.done&&(Q=p.return)&&Q.call(p)}finally{if(i)throw i.error}}}}catch(t){e={error:t}}finally{try{c&&!c.done&&(o=l.return)&&o.call(l)}finally{if(e)throw e.error}}!function(t,e){var n,o;try{for(var i=r(y.connect[t].children),Q=i.next();!Q.done;Q=i.next()){var T=Q.value,s=this.childName(t,T);if(Array.isArray(e[T])){var a=e[T];a.length&&(this.styles[s]=a.join(" "))}else""!==e[T]&&(this.styles[s]=e[T])}}catch(t){n={error:t}}finally{try{Q&&!Q.done&&(o=i.return)&&o.call(i)}finally{if(n)throw n.error}}}(t,a),delete this.styles[t]}function m(t){}var y=function(){function t(t){void 0===t&&(t=""),this.parse(t)}return Object.defineProperty(t.prototype,"cssText",{get:function(){var t,e,n=[];try{for(var o=r(Object.keys(this.styles)),i=o.next();!i.done;i=o.next()){var Q=i.value,T=this.parentName(Q);this.styles[T]||n.push(Q+": "+this.styles[Q]+";")}}catch(e){t={error:e}}finally{try{i&&!i.done&&(e=o.return)&&e.call(o)}finally{if(t)throw t.error}}return n.join(" ")},enumerable:!1,configurable:!0}),t.prototype.set=function(e,r){for(e=this.normalizeName(e),this.setStyle(e,r),t.connect[e]&&!t.connect[e].combine&&(this.combineChildren(e),delete this.styles[e]);e.match(/-/)&&(e=this.parentName(e),t.connect[e]);)t.connect[e].combine.call(this,e)},t.prototype.get=function(t){return t=this.normalizeName(t),this.styles.hasOwnProperty(t)?this.styles[t]:""},t.prototype.setStyle=function(e,r){this.styles[e]=r,t.connect[e]&&t.connect[e].children&&t.connect[e].split.call(this,e),""===r&&delete this.styles[e]},t.prototype.combineChildren=function(e){var n,o,i=this.parentName(e);try{for(var Q=r(t.connect[e].children),T=Q.next();!T.done;T=Q.next()){var s=T.value,a=this.childName(i,s);t.connect[a].combine.call(this,a)}}catch(t){n={error:t}}finally{try{T&&!T.done&&(o=Q.return)&&o.call(Q)}finally{if(n)throw n.error}}},t.prototype.parentName=function(t){var e=t.replace(/-[^-]*$/,"");return t===e?"":e},t.prototype.childName=function(e,r){return r.match(/-/)?r:(t.connect[e]&&!t.connect[e].combine&&(r+=e.replace(/.*-/,"-"),e=this.parentName(e)),e+"-"+r)},t.prototype.normalizeName=function(t){return t.replace(/[A-Z]/g,(function(t){return"-"+t.toLowerCase()}))},t.prototype.parse=function(t){void 0===t&&(t="");var e=this.constructor.pattern;this.styles={};for(var r=t.replace(e.comment,"").split(e.style);r.length>1;){var o=n(r.splice(0,3),3),i=o[0],Q=o[1],T=o[2];if(i.match(/[^\s\n]/))return;this.set(Q,T)}},t.pattern={style:/([-a-z]+)[\s\n]*:[\s\n]*((?:'[^']*'|"[^"]*"|\n|.)*?)[\s\n]*(?:;|$)/g,comment:/\/\*[^]*?\*\//g},t.connect={padding:{children:i,split:s,combine:a},border:{children:i,split:l,combine:c},"border-top":{children:Q,split:h,combine:d},"border-right":{children:Q,split:h,combine:d},"border-bottom":{children:Q,split:h,combine:d},"border-left":{children:Q,split:h,combine:d},"border-width":{children:i,split:s,combine:null},"border-style":{children:i,split:s,combine:null},"border-color":{children:i,split:s,combine:null},font:{children:["style","variant","weight","stretch","line-height","size","family"],split:L,combine:m}},t}();e.Styles=y},6010:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.px=e.emRounded=e.em=e.percent=e.length2em=e.MATHSPACE=e.RELUNITS=e.UNITS=e.BIGDIMEN=void 0,e.BIGDIMEN=1e6,e.UNITS={px:1,in:96,cm:96/2.54,mm:96/25.4},e.RELUNITS={em:1,ex:.431,pt:.1,pc:1.2,mu:1/18},e.MATHSPACE={veryverythinmathspace:1/18,verythinmathspace:2/18,thinmathspace:3/18,mediummathspace:4/18,thickmathspace:5/18,verythickmathspace:6/18,veryverythickmathspace:7/18,negativeveryverythinmathspace:-1/18,negativeverythinmathspace:-2/18,negativethinmathspace:-3/18,negativemediummathspace:-4/18,negativethickmathspace:-5/18,negativeverythickmathspace:-6/18,negativeveryverythickmathspace:-7/18,thin:.04,medium:.06,thick:.1,normal:1,big:2,small:1/Math.sqrt(2),infinity:e.BIGDIMEN},e.length2em=function(t,r,n,o){if(void 0===r&&(r=0),void 0===n&&(n=1),void 0===o&&(o=16),"string"!=typeof t&&(t=String(t)),""===t||null==t)return r;if(e.MATHSPACE[t])return e.MATHSPACE[t];var i=t.match(/^\s*([-+]?(?:\.\d+|\d+(?:\.\d*)?))?(pt|em|ex|mu|px|pc|in|mm|cm|%)?/);if(!i)return r;var Q=parseFloat(i[1]||"1"),T=i[2];return e.UNITS.hasOwnProperty(T)?Q*e.UNITS[T]/o/n:e.RELUNITS.hasOwnProperty(T)?Q*e.RELUNITS[T]:"%"===T?Q/100*r:Q*r},e.percent=function(t){return(100*t).toFixed(1).replace(/\.?0+$/,"")+"%"},e.em=function(t){return Math.abs(t)<.001?"0":t.toFixed(3).replace(/\.?0+$/,"")+"em"},e.emRounded=function(t,e){return void 0===e&&(e=16),t=(Math.round(t*e)+.05)/e,Math.abs(t)<.001?"0em":t.toFixed(3).replace(/\.?0+$/,"")+"em"},e.px=function(t,r,n){return void 0===r&&(r=-e.BIGDIMEN),void 0===n&&(n=16),t*=n,r&&t0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},n=this&&this.__spreadArray||function(t,e,r){if(r||2===arguments.length)for(var n,o=0,i=e.length;o=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractItem=void 0;var Q=r(9329),T=r(2556),s=r(2165),a=function(t){function e(e,r,n,o){var i=t.call(this,e,r)||this;return i._content=n,i.disabled=!1,i.callbacks=[],i._id=o||n,i}return o(e,t),Object.defineProperty(e.prototype,"content",{get:function(){return this._content},set:function(t){this._content=t,this.generateHtml(),this.menu&&this.menu.generateHtml()},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._id},enumerable:!1,configurable:!0}),e.prototype.press=function(){this.disabled||(this.executeAction(),this.executeCallbacks_())},e.prototype.executeAction=function(){},e.prototype.registerCallback=function(t){-1===this.callbacks.indexOf(t)&&this.callbacks.push(t)},e.prototype.unregisterCallback=function(t){var e=this.callbacks.indexOf(t);-1!==e&&this.callbacks.splice(e,1)},e.prototype.mousedown=function(t){this.press(),this.stop(t)},e.prototype.mouseover=function(t){this.focus(),this.stop(t)},e.prototype.mouseout=function(t){this.deactivate(),this.stop(t)},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;e.setAttribute("aria-disabled","false"),e.textContent=this.content},e.prototype.activate=function(){this.disabled||this.html.classList.add(s.HtmlClasses.MENUACTIVE)},e.prototype.deactivate=function(){this.html.classList.remove(s.HtmlClasses.MENUACTIVE)},e.prototype.focus=function(){this.menu.focused=this,t.prototype.focus.call(this),this.activate()},e.prototype.unfocus=function(){this.deactivate(),t.prototype.unfocus.call(this)},e.prototype.escape=function(t){T.MenuUtil.close(this)},e.prototype.up=function(t){this.menu.up(t)},e.prototype.down=function(t){this.menu.down(t)},e.prototype.left=function(t){this.menu.left(t)},e.prototype.right=function(t){this.menu.right(t)},e.prototype.space=function(t){this.press()},e.prototype.disable=function(){this.disabled=!0;var t=this.html;t.classList.add(s.HtmlClasses.MENUDISABLED),t.setAttribute("aria-disabled","true")},e.prototype.enable=function(){this.disabled=!1;var t=this.html;t.classList.remove(s.HtmlClasses.MENUDISABLED),t.removeAttribute("aria-disabled")},e.prototype.executeCallbacks_=function(){var t,e;try{for(var r=i(this.callbacks),n=r.next();!n.done;n=r.next()){var o=n.value;try{o(this)}catch(t){T.MenuUtil.error(t,"Callback for menu entry "+this.id+" failed.")}}}catch(e){t={error:e}}finally{try{n&&!n.done&&(e=r.return)&&e.call(r)}finally{if(t)throw t.error}}},e}(Q.AbstractEntry);e.AbstractItem=a},1484:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)}),i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractMenu=void 0;var Q=r(8372),T=r(1340),s=r(2165),a=r(6186),l=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.className=s.HtmlClasses.CONTEXTMENU,e.role="menu",e._items=[],e._baseMenu=null,e}return o(e,t),Object.defineProperty(e.prototype,"baseMenu",{get:function(){return this._baseMenu},set:function(t){this._baseMenu=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"items",{get:function(){return this._items},set:function(t){this._items=t},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"pool",{get:function(){return this.variablePool},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"focused",{get:function(){return this._focused},set:function(t){if(this._focused!==t){this._focused||this.unfocus();var e=this._focused;this._focused=t,e&&e.unfocus()}},enumerable:!1,configurable:!0}),e.prototype.up=function(t){var e=this.items.filter((function(t){return t instanceof T.AbstractItem&&!t.isHidden()}));if(0!==e.length)if(this.focused){var r=e.indexOf(this.focused);-1!==r&&e[r=r?--r:e.length-1].focus()}else e[e.length-1].focus()},e.prototype.down=function(t){var e=this.items.filter((function(t){return t instanceof T.AbstractItem&&!t.isHidden()}));if(0!==e.length)if(this.focused){var r=e.indexOf(this.focused);-1!==r&&e[r=++r===e.length?0:r].focus()}else e[0].focus()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.generateMenu()},e.prototype.generateMenu=function(){var t,e,r=this.html;r.classList.add(s.HtmlClasses.MENU);try{for(var n=i(this.items),o=n.next();!o.done;o=n.next()){var Q=o.value;if(Q.isHidden()){var T=Q.html;T.parentNode&&T.parentNode.removeChild(T)}else r.appendChild(Q.html)}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.post=function(e,r){this.variablePool.update(),t.prototype.post.call(this,e,r)},e.prototype.unpostSubmenus=function(){var t,e,r=this.items.filter((function(t){return t instanceof a.Submenu}));try{for(var n=i(r),o=n.next();!o.done;o=n.next()){var Q=o.value;Q.submenu.unpost(),Q!==this.focused&&Q.unfocus()}}catch(e){t={error:e}}finally{try{o&&!o.done&&(e=n.return)&&e.call(n)}finally{if(t)throw t.error}}},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.unpostSubmenus(),this.focused=null},e.prototype.find=function(t){var e,r;try{for(var n=i(this.items),o=n.next();!o.done;o=n.next()){var Q=o.value;if("rule"!==Q.type){if(Q.id===t)return Q;if("submenu"===Q.type){var T=Q.submenu.find(t);if(T)return T}}}}catch(t){e={error:t}}finally{try{o&&!o.done&&(r=n.return)&&r.call(n)}finally{if(e)throw e.error}}return null},e}(Q.AbstractPostable);e.AbstractMenu=l},2868:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractNavigatable=void 0;var n=r(3205),o=r(8853),i=function(){function t(){this.bubble=!1}return t.prototype.bubbleKey=function(){this.bubble=!0},t.prototype.keydown=function(t){switch(t.keyCode){case n.KEY.ESCAPE:this.escape(t);break;case n.KEY.RIGHT:this.right(t);break;case n.KEY.LEFT:this.left(t);break;case n.KEY.UP:this.up(t);break;case n.KEY.DOWN:this.down(t);break;case n.KEY.RETURN:case n.KEY.SPACE:this.space(t);break;default:return}this.bubble?this.bubble=!1:this.stop(t)},t.prototype.escape=function(t){},t.prototype.space=function(t){},t.prototype.left=function(t){},t.prototype.right=function(t){},t.prototype.up=function(t){},t.prototype.down=function(t){},t.prototype.stop=function(t){t&&(t.stopPropagation(),t.preventDefault(),t.cancelBubble=!0)},t.prototype.mousedown=function(t){return this.stop(t)},t.prototype.mouseup=function(t){return this.stop(t)},t.prototype.mouseover=function(t){return this.stop(t)},t.prototype.mouseout=function(t){return this.stop(t)},t.prototype.click=function(t){return this.stop(t)},t.prototype.addEvents=function(t){t.addEventListener(o.MOUSE.DOWN,this.mousedown.bind(this)),t.addEventListener(o.MOUSE.UP,this.mouseup.bind(this)),t.addEventListener(o.MOUSE.OVER,this.mouseover.bind(this)),t.addEventListener(o.MOUSE.OUT,this.mouseout.bind(this)),t.addEventListener(o.MOUSE.CLICK,this.click.bind(this)),t.addEventListener("keydown",this.keydown.bind(this)),t.addEventListener("dragstart",this.stop.bind(this)),t.addEventListener(o.MOUSE.SELECTSTART,this.stop.bind(this)),t.addEventListener("contextmenu",this.stop.bind(this)),t.addEventListener(o.MOUSE.DBLCLICK,this.stop.bind(this))},t}();e.AbstractNavigatable=i},8372:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractPostable=void 0;var i=function(t){function e(){var e=null!==t&&t.apply(this,arguments)||this;return e.posted=!1,e}return o(e,t),e.prototype.isPosted=function(){return this.posted},e.prototype.post=function(t,e){this.posted||(void 0!==t&&void 0!==e&&this.html.setAttribute("style","left: "+t+"px; top: "+e+"px;"),this.display(),this.posted=!0)},e.prototype.unpost=function(){if(this.posted){var t=this.html;t.parentNode&&t.parentNode.removeChild(t),this.posted=!1}},e}(r(9328).MenuElement);e.AbstractPostable=i},6765:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractVariableItem=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;this.span||this.generateSpan(),e.appendChild(this.span),this.update()},e.prototype.register=function(){this.variable.register(this)},e.prototype.unregister=function(){this.variable.unregister(this)},e.prototype.update=function(){this.updateAria(),this.span&&this.updateSpan()},e}(r(1340).AbstractItem);e.AbstractVariableItem=i},5179:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.CloseButton=void 0;var i=r(8372),Q=r(2165),T=function(t){function e(e){var r=t.call(this)||this;return r.element=e,r.className=Q.HtmlClasses.MENUCLOSE,r.role="button",r}return o(e,t),e.prototype.generateHtml=function(){var t=document.createElement("span");t.classList.add(this.className),t.setAttribute("role",this.role),t.setAttribute("tabindex","0");var e=document.createElement("span");e.textContent="\xd7",t.appendChild(e),this.html=t},e.prototype.display=function(){},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.element.unpost()},e.prototype.keydown=function(e){this.bubbleKey(),t.prototype.keydown.call(this,e)},e.prototype.space=function(t){this.unpost(),this.stop(t)},e.prototype.mousedown=function(t){this.unpost(),this.stop(t)},e}(i.AbstractPostable);e.CloseButton=T},5073:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.ContextMenu=void 0;var i=r(1484),Q=r(2165),T=r(1932),s=r(2358),a=function(t){function e(e){var r=t.call(this)||this;return r.factory=e,r.id="",r.moving=!1,r._store=new T.MenuStore(r),r.widgets=[],r.variablePool=new s.VariablePool,r}return o(e,t),e.fromJson=function(t,e){var r=e.pool,n=e.items,o=e.id,i=void 0===o?"":o,Q=new this(t);Q.id=i;var T=t.get("variable");r.forEach((function(e){return T(t,e,Q.pool)}));var s=t.get("items")(t,n,Q);return Q.items=s,Q},e.prototype.generateHtml=function(){this.isPosted()&&this.unpost(),t.prototype.generateHtml.call(this),this._frame=document.createElement("div"),this._frame.classList.add(Q.HtmlClasses.MENUFRAME);var e="left: 0px; top: 0px; z-index: 200; width: 100%; height: 100%; border: 0px; padding: 0px; margin: 0px;";this._frame.setAttribute("style","position: absolute; "+e);var r=document.createElement("div");r.setAttribute("style","position: fixed; "+e),this._frame.appendChild(r),r.addEventListener("mousedown",function(t){this.unpost(),this.unpostWidgets(),this.stop(t)}.bind(this))},e.prototype.display=function(){document.body.appendChild(this.frame),this.frame.appendChild(this.html),this.focus()},e.prototype.escape=function(t){this.unpost(),this.unpostWidgets()},e.prototype.unpost=function(){if(t.prototype.unpost.call(this),!(this.widgets.length>0)){this.frame.parentNode.removeChild(this.frame);var e=this.store;this.moving||e.insertTaborder(),e.active.focus()}},e.prototype.left=function(t){this.move_(this.store.previous())},e.prototype.right=function(t){this.move_(this.store.next())},Object.defineProperty(e.prototype,"frame",{get:function(){return this._frame},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"store",{get:function(){return this._store},enumerable:!1,configurable:!0}),e.prototype.post=function(e,r){if(void 0!==r)return this.moving||this.store.removeTaborder(),void t.prototype.post.call(this,e,r);var n,o,i,Q=e;if(Q instanceof Event?(n=Q.target,this.stop(Q)):n=Q,Q instanceof MouseEvent&&(o=Q.pageX,i=Q.pageY,o||i||!Q.clientX||(o=Q.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,i=Q.clientY+document.body.scrollTop+document.documentElement.scrollTop)),!o&&!i&&n){var T=window.pageXOffset||document.documentElement.scrollLeft,s=window.pageYOffset||document.documentElement.scrollTop,a=n.getBoundingClientRect();o=(a.right+a.left)/2+T,i=(a.bottom+a.top)/2+s}this.store.active=n,this.anchor=this.store.active;var l=this.html;o+l.offsetWidth>document.body.offsetWidth-5&&(o=document.body.offsetWidth-l.offsetWidth-5),this.post(o,i)},e.prototype.registerWidget=function(t){this.widgets.push(t)},e.prototype.unregisterWidget=function(t){var e=this.widgets.indexOf(t);e>-1&&this.widgets.splice(e,1),0===this.widgets.length&&this.unpost()},e.prototype.unpostWidgets=function(){this.widgets.forEach((function(t){return t.unpost()}))},e.prototype.toJson=function(){return{type:""}},e.prototype.move_=function(t){this.anchor&&t!==this.anchor&&(this.moving=!0,this.unpost(),this.post(t),this.moving=!1)},e}(i.AbstractMenu);e.ContextMenu=a},7309:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CssStyles=void 0;var n=r(2165);!function(t){function e(t){return"."+(n.HtmlClasses[t]||t)}var r={};r[e("INFOCLOSE")]="{ top:.2em; right:.2em;}",r[e("INFOCONTENT")]="{ overflow:auto; text-align:left; font-size:80%; padding:.4em .6em; border:1px inset; margin:1em 0px; max-height:20em; max-width:30em; background-color:#EEEEEE; white-space:normal;}",r[e("INFO")+e("MOUSEPOST")]="{outline:none;}",r[e("INFO")]='{ position:fixed; left:50%; width:auto; text-align:center; border:3px outset; padding:1em 2em; background-color:#DDDDDD; color:black; cursor:default; font-family:message-box; font-size:120%; font-style:normal; text-indent:0; text-transform:none; line-height:normal; letter-spacing:normal; word-spacing:normal; word-wrap:normal; white-space:nowrap; float:none; z-index:201; border-radius: 15px; /* Opera 10.5 and IE9 */ -webkit-border-radius:15px; /* Safari and Chrome */ -moz-border-radius:15px; /* Firefox */ -khtml-border-radius:15px; /* Konqueror */ box-shadow:0px 10px 20px #808080; /* Opera 10.5 and IE9 */ -webkit-box-shadow:0px 10px 20px #808080; /* Safari 3 & Chrome */ -moz-box-shadow:0px 10px 20px #808080; /* Forefox 3.5 */ -khtml-box-shadow:0px 10px 20px #808080; /* Konqueror */ filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color="gray", Positive="true"); /* IE */}';var o={};o[e("MENU")]="{ position:absolute; background-color:white; color:black; width:auto; padding:5px 0px; border:1px solid #CCCCCC; margin:0; cursor:default; font: menu; text-align:left; text-indent:0; text-transform:none; line-height:normal; letter-spacing:normal; word-spacing:normal; word-wrap:normal; white-space:nowrap; float:none; z-index:201; border-radius: 5px; /* Opera 10.5 and IE9 */ -webkit-border-radius: 5px; /* Safari and Chrome */ -moz-border-radius: 5px; /* Firefox */ -khtml-border-radius: 5px; /* Konqueror */ box-shadow:0px 10px 20px #808080; /* Opera 10.5 and IE9 */ -webkit-box-shadow:0px 10px 20px #808080; /* Safari 3 & Chrome */ -moz-box-shadow:0px 10px 20px #808080; /* Forefox 3.5 */ -khtml-box-shadow:0px 10px 20px #808080; /* Konqueror */}",o[e("MENUITEM")]="{ padding: 1px 2em; background:transparent;}",o[e("MENUARROW")]="{ position:absolute; right:.5em; padding-top:.25em; color:#666666; font-family: null; font-size: .75em}",o[e("MENUACTIVE")+" "+e("MENUARROW")]="{color:white}",o[e("MENUARROW")+e("RTL")]="{left:.5em; right:auto}",o[e("MENUCHECK")]="{ position:absolute; left:.7em; font-family: null}",o[e("MENUCHECK")+e("RTL")]="{ right:.7em; left:auto }",o[e("MENURADIOCHECK")]="{ position:absolute; left: .7em;}",o[e("MENURADIOCHECK")+e("RTL")]="{ right: .7em; left:auto}",o[e("MENUINPUTBOX")]="{ padding-left: 1em; right:.5em; color:#666666; font-family: null;}",o[e("MENUINPUTBOX")+e("RTL")]="{ left: .1em;}",o[e("MENUCOMBOBOX")]="{ left:.1em; padding-bottom:.5em;}",o[e("MENUSLIDER")]="{ left: .1em;}",o[e("SLIDERVALUE")]="{ position:absolute; right:.1em; padding-top:.25em; color:#333333; font-size: .75em}",o[e("SLIDERBAR")]="{ outline: none; background: #d3d3d3}",o[e("MENULABEL")]="{ padding: 1px 2em 3px 1.33em; font-style:italic}",o[e("MENURULE")]="{ border-top: 1px solid #DDDDDD; margin: 4px 3px;}",o[e("MENUDISABLED")]="{ color:GrayText}",o[e("MENUACTIVE")]="{ background-color: #606872; color: white;}",o[e("MENUDISABLED")+":focus"]="{ background-color: #E8E8E8}",o[e("MENULABEL")+":focus"]="{ background-color: #E8E8E8}",o[e("CONTEXTMENU")+":focus"]="{ outline:none}",o[e("CONTEXTMENU")+" "+e("MENUITEM")+":focus"]="{ outline:none}",o[e("SELECTIONMENU")]="{ position:relative; float:left; border-bottom: none; -webkit-box-shadow:none; -webkit-border-radius:0px; }",o[e("SELECTIONITEM")]="{ padding-right: 1em;}",o[e("SELECTION")]="{ right: 40%; width:50%; }",o[e("SELECTIONBOX")]="{ padding: 0em; max-height:20em; max-width: none; background-color:#FFFFFF;}",o[e("SELECTIONDIVIDER")]="{ clear: both; border-top: 2px solid #000000;}",o[e("MENU")+" "+e("MENUCLOSE")]="{ top:-10px; left:-10px}";var i={};i[e("MENUCLOSE")]='{ position:absolute; cursor:pointer; display:inline-block; border:2px solid #AAA; border-radius:18px; -webkit-border-radius: 18px; /* Safari and Chrome */ -moz-border-radius: 18px; /* Firefox */ -khtml-border-radius: 18px; /* Konqueror */ font-family: "Courier New", Courier; font-size:24px; color:#F0F0F0}',i[e("MENUCLOSE")+" span"]="{ display:block; background-color:#AAA; border:1.5px solid; border-radius:18px; -webkit-border-radius: 18px; /* Safari and Chrome */ -moz-border-radius: 18px; /* Firefox */ -khtml-border-radius: 18px; /* Konqueror */ line-height:0; padding:8px 0 6px /* may need to be browser-specific */}",i[e("MENUCLOSE")+":hover"]="{ color:white!important; border:2px solid #CCC!important}",i[e("MENUCLOSE")+":hover span"]="{ background-color:#CCC!important}",i[e("MENUCLOSE")+":hover:focus"]="{ outline:none}";var Q=!1,T=!1,s=!1;function a(t){s||(l(i,t),s=!0)}function l(t,e){var r=e||document,n=r.createElement("style");n.type="text/css";var o="";for(var i in t)o+=i,o+=" ",o+=t[i],o+="\n";n.innerHTML=o,r.head.appendChild(n)}t.addMenuStyles=function(t){T||(l(o,t),T=!0,a(t))},t.addInfoStyles=function(t){Q||(l(r,t),Q=!0,a(t))}}(e.CssStyles||(e.CssStyles={}))},2165:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.HtmlAttrs=e.HtmlClasses=void 0;function r(t){return"CtxtMenu_"+t}function n(t){return r(t)}function o(t){return r(t)}e.HtmlClasses={ATTACHED:n("Attached"),CONTEXTMENU:n("ContextMenu"),MENU:n("Menu"),MENUARROW:n("MenuArrow"),MENUACTIVE:n("MenuActive"),MENUCHECK:n("MenuCheck"),MENUCLOSE:n("MenuClose"),MENUCOMBOBOX:n("MenuComboBox"),MENUDISABLED:n("MenuDisabled"),MENUFRAME:n("MenuFrame"),MENUITEM:n("MenuItem"),MENULABEL:n("MenuLabel"),MENURADIOCHECK:n("MenuRadioCheck"),MENUINPUTBOX:n("MenuInputBox"),MENURULE:n("MenuRule"),MENUSLIDER:n("MenuSlider"),MOUSEPOST:n("MousePost"),RTL:n("RTL"),INFO:n("Info"),INFOCLOSE:n("InfoClose"),INFOCONTENT:n("InfoContent"),INFOSIGNATURE:n("InfoSignature"),INFOTITLE:n("InfoTitle"),SLIDERVALUE:n("SliderValue"),SLIDERBAR:n("SliderBar"),SELECTION:n("Selection"),SELECTIONBOX:n("SelectionBox"),SELECTIONMENU:n("SelectionMenu"),SELECTIONDIVIDER:n("SelectionDivider"),SELECTIONITEM:n("SelectionItem")},e.HtmlAttrs={COUNTER:o("Counter"),KEYDOWNFUNC:o("keydownFunc"),CONTEXTMENUFUNC:o("contextmenuFunc"),OLDTAB:o("Oldtabindex"),TOUCHFUNC:o("TouchFunc")}},4922:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Info=void 0;var i=r(5179),Q=r(2165),T=function(t){function e(e,r,n){var o=t.call(this)||this;return o.title=e,o.signature=n,o.className=Q.HtmlClasses.INFO,o.role="dialog",o.contentDiv=o.generateContent(),o.close=o.generateClose(),o.content=r||function(){return""},o}return o(e,t),e.prototype.attachMenu=function(t){this.menu=t},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;e.appendChild(this.generateTitle()),e.appendChild(this.contentDiv),e.appendChild(this.generateSignature()),e.appendChild(this.close.html),e.setAttribute("tabindex","0")},e.prototype.post=function(){t.prototype.post.call(this);var e=document.documentElement,r=this.html,n=window.innerHeight||e.clientHeight||e.scrollHeight||0,o=Math.floor(-r.offsetWidth/2),i=Math.floor((n-r.offsetHeight)/3);r.setAttribute("style","margin-left: "+o+"px; top: "+i+"px;"),window.event instanceof MouseEvent&&r.classList.add(Q.HtmlClasses.MOUSEPOST),r.focus()},e.prototype.display=function(){this.menu.registerWidget(this),this.contentDiv.innerHTML=this.content();var t=this.menu.html;t.parentNode&&t.parentNode.removeChild(t),this.menu.frame.appendChild(this.html)},e.prototype.click=function(t){},e.prototype.keydown=function(e){this.bubbleKey(),t.prototype.keydown.call(this,e)},e.prototype.escape=function(t){this.unpost()},e.prototype.unpost=function(){t.prototype.unpost.call(this),this.html.classList.remove(Q.HtmlClasses.MOUSEPOST),this.menu.unregisterWidget(this)},e.prototype.generateClose=function(){var t=new i.CloseButton(this),e=t.html;return e.classList.add(Q.HtmlClasses.INFOCLOSE),e.setAttribute("aria-label","Close Dialog Box"),t},e.prototype.generateTitle=function(){var t=document.createElement("span");return t.innerHTML=this.title,t.classList.add(Q.HtmlClasses.INFOTITLE),t},e.prototype.generateContent=function(){var t=document.createElement("div");return t.classList.add(Q.HtmlClasses.INFOCONTENT),t.setAttribute("tabindex","0"),t},e.prototype.generateSignature=function(){var t=document.createElement("span");return t.innerHTML=this.signature,t.classList.add(Q.HtmlClasses.INFOSIGNATURE),t},e.prototype.toJson=function(){return{type:""}},e}(r(8372).AbstractPostable);e.Info=T},1409:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Checkbox=void 0;var i=r(6765),Q=r(2556),T=r(2165),s=function(t){function e(e,r,n,o){var i=t.call(this,e,"checkbox",r,o)||this;return i.role="menuitemcheckbox",i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(!this.variable.getValue()),Q.MenuUtil.close(this)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.span.textContent="\u2713",this.span.classList.add(T.HtmlClasses.MENUCHECK)},e.prototype.updateAria=function(){this.html.setAttribute("aria-checked",this.variable.getValue()?"true":"false")},e.prototype.updateSpan=function(){this.span.style.display=this.variable.getValue()?"":"none"},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Checkbox=s},9886:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Combo=void 0;var i=r(6765),Q=r(2556),T=r(2165),s=r(3205),a=function(t){function e(e,r,n,o){var i=t.call(this,e,"combobox",r,o)||this;return i.role="combobox",i.inputEvent=!1,i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(this.input.value,Q.MenuUtil.getActiveElement(this))},e.prototype.space=function(e){t.prototype.space.call(this,e),Q.MenuUtil.close(this)},e.prototype.focus=function(){t.prototype.focus.call(this),this.input.focus()},e.prototype.unfocus=function(){t.prototype.unfocus.call(this),this.updateSpan()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.html.classList.add(T.HtmlClasses.MENUCOMBOBOX)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.span.classList.add(T.HtmlClasses.MENUINPUTBOX),this.input=document.createElement("input"),this.input.addEventListener("keydown",this.inputKey.bind(this)),this.input.setAttribute("size","10em"),this.input.setAttribute("type","text"),this.input.setAttribute("tabindex","-1"),this.span.appendChild(this.input)},e.prototype.inputKey=function(t){this.bubbleKey(),this.inputEvent=!0},e.prototype.keydown=function(e){if(this.inputEvent&&e.keyCode!==s.KEY.ESCAPE&&e.keyCode!==s.KEY.RETURN)return this.inputEvent=!1,void e.stopPropagation();t.prototype.keydown.call(this,e),e.stopPropagation()},e.prototype.updateAria=function(){},e.prototype.updateSpan=function(){var t;try{t=this.variable.getValue(Q.MenuUtil.getActiveElement(this))}catch(e){t=""}this.input.value=t},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Combo=a},3467:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Command=void 0;var i=r(1340),Q=r(2556),T=function(t){function e(e,r,n,o){var i=t.call(this,e,"command",r,o)||this;return i.command=n,i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.action,e.id)},e.prototype.executeAction=function(){try{this.command(Q.MenuUtil.getActiveElement(this))}catch(t){Q.MenuUtil.error(t,"Illegal command callback.")}Q.MenuUtil.close(this)},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractItem);e.Command=T},2965:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Label=void 0;var i=r(1340),Q=r(2165),T=function(t){function e(e,r,n){return t.call(this,e,"label",r,n)||this}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.id)},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.html.classList.add(Q.HtmlClasses.MENULABEL)},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractItem);e.Label=T},385:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Radio=void 0;var i=r(6765),Q=r(2556),T=r(2165),s=function(t){function e(e,r,n,o){var i=t.call(this,e,"radio",r,o)||this;return i.role="menuitemradio",i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(this.id),Q.MenuUtil.close(this)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.span.textContent="\u2713",this.span.classList.add(T.HtmlClasses.MENURADIOCHECK)},e.prototype.updateAria=function(){this.html.setAttribute("aria-checked",this.variable.getValue()===this.id?"true":"false")},e.prototype.updateSpan=function(){this.span.style.display=this.variable.getValue()===this.id?"":"none"},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Radio=s},3463:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Rule=void 0;var i=r(9329),Q=r(2165),T=function(t){function e(e){var r=t.call(this,e,"rule")||this;return r.className=Q.HtmlClasses.MENUITEM,r.role="separator",r}return o(e,t),e.fromJson=function(t,e,r){return new this(r)},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;e.classList.add(Q.HtmlClasses.MENURULE),e.setAttribute("aria-orientation","vertical")},e.prototype.addEvents=function(t){},e.prototype.toJson=function(){return{type:"rule"}},e}(i.AbstractEntry);e.Rule=T},7625:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Slider=void 0;var i=r(6765),Q=r(2556),T=r(2165),s=r(3205),a=function(t){function e(e,r,n,o){var i=t.call(this,e,"slider",r,o)||this;return i.role="slider",i.labelId="ctx_slideLabel"+Q.MenuUtil.counter(),i.valueId="ctx_slideValue"+Q.MenuUtil.counter(),i.inputEvent=!1,i.variable=e.pool.lookup(n),i.register(),i}return o(e,t),e.fromJson=function(t,e,r){return new this(r,e.content,e.variable,e.id)},e.prototype.executeAction=function(){this.variable.setValue(this.input.value,Q.MenuUtil.getActiveElement(this)),this.update()},e.prototype.space=function(e){t.prototype.space.call(this,e),Q.MenuUtil.close(this)},e.prototype.focus=function(){t.prototype.focus.call(this),this.input.focus()},e.prototype.unfocus=function(){t.prototype.unfocus.call(this),this.updateSpan()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.html.classList.add(T.HtmlClasses.MENUSLIDER),this.valueSpan=document.createElement("span"),this.valueSpan.setAttribute("id",this.valueId),this.valueSpan.classList.add(T.HtmlClasses.SLIDERVALUE),this.html.appendChild(this.valueSpan)},e.prototype.generateSpan=function(){this.span=document.createElement("span"),this.labelSpan=document.createElement("span"),this.labelSpan.setAttribute("id",this.labelId),this.labelSpan.appendChild(this.html.childNodes[0]),this.html.appendChild(this.labelSpan),this.input=document.createElement("input"),this.input.setAttribute("type","range"),this.input.setAttribute("min","0"),this.input.setAttribute("max","100"),this.input.setAttribute("aria-valuemin","0"),this.input.setAttribute("aria-valuemax","100"),this.input.setAttribute("aria-labelledby",this.labelId),this.input.addEventListener("keydown",this.inputKey.bind(this)),this.input.addEventListener("input",this.executeAction.bind(this)),this.input.classList.add(T.HtmlClasses.SLIDERBAR),this.span.appendChild(this.input)},e.prototype.inputKey=function(t){this.inputEvent=!0},e.prototype.mousedown=function(t){t.stopPropagation()},e.prototype.mouseup=function(t){event.stopPropagation()},e.prototype.keydown=function(e){var r=e.keyCode;return r===s.KEY.UP||r===s.KEY.DOWN?(e.preventDefault(),void t.prototype.keydown.call(this,e)):this.inputEvent&&r!==s.KEY.ESCAPE&&r!==s.KEY.RETURN?(this.inputEvent=!1,void e.stopPropagation()):(t.prototype.keydown.call(this,e),void e.stopPropagation())},e.prototype.updateAria=function(){var t=this.variable.getValue();t&&this.input&&(this.input.setAttribute("aria-valuenow",t),this.input.setAttribute("aria-valuetext",t+"%"))},e.prototype.updateSpan=function(){var t;try{t=this.variable.getValue(Q.MenuUtil.getActiveElement(this)),this.valueSpan.innerHTML=t+"%"}catch(e){t=""}this.input.value=t},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractVariableItem);e.Slider=a},6186:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.Submenu=void 0;var i=r(1340),Q=r(2165),T=function(t){function e(e,r,n){var o=t.call(this,e,"submenu",r,n)||this;return o._submenu=null,o}return o(e,t),e.fromJson=function(t,e,r){var n=e.content,o=e.menu,i=new this(r,n,e.id),Q=t.get("subMenu")(t,o,i);return i.submenu=Q,i},Object.defineProperty(e.prototype,"submenu",{get:function(){return this._submenu},set:function(t){this._submenu=t},enumerable:!1,configurable:!0}),e.prototype.mouseover=function(t){this.focus(),this.stop(t)},e.prototype.mouseout=function(t){this.stop(t)},e.prototype.unfocus=function(){if(this.submenu.isPosted()){if(this.menu.focused!==this)return t.prototype.unfocus.call(this),void this.menu.unpostSubmenus();this.html.setAttribute("tabindex","-1"),this.html.blur()}else t.prototype.unfocus.call(this)},e.prototype.focus=function(){t.prototype.focus.call(this),this.submenu.isPosted()||this.disabled||this.submenu.post()},e.prototype.executeAction=function(){this.submenu.isPosted()?this.submenu.unpost():this.submenu.post()},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this);var e=this.html;this.span=document.createElement("span"),this.span.textContent="\u25ba",this.span.classList.add(Q.HtmlClasses.MENUARROW),e.appendChild(this.span),e.setAttribute("aria-haspopup","true")},e.prototype.left=function(e){this.submenu.isPosted()?this.submenu.unpost():t.prototype.left.call(this,e)},e.prototype.right=function(t){this.submenu.isPosted()?this.submenu.down(t):this.submenu.post()},e.prototype.toJson=function(){return{type:""}},e}(i.AbstractItem);e.Submenu=T},3205:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.KEY=void 0,function(t){t[t.RETURN=13]="RETURN",t[t.ESCAPE=27]="ESCAPE",t[t.SPACE=32]="SPACE",t[t.LEFT=37]="LEFT",t[t.UP=38]="UP",t[t.RIGHT=39]="RIGHT",t[t.DOWN=40]="DOWN"}(e.KEY||(e.KEY={}))},9328:function(t,e,r){var n,o=this&&this.__extends||(n=function(t,e){return n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])},n(t,e)},function(t,e){function r(){this.constructor=t}n(t,e),t.prototype=null===e?Object.create(e):(r.prototype=e.prototype,new r)});Object.defineProperty(e,"__esModule",{value:!0}),e.MenuElement=void 0;var i=function(t){function e(){return null!==t&&t.apply(this,arguments)||this}return o(e,t),e.prototype.addAttributes=function(t){for(var e in t)this.html.setAttribute(e,t[e])},Object.defineProperty(e.prototype,"html",{get:function(){return this._html||this.generateHtml(),this._html},set:function(t){this._html=t,this.addEvents(t)},enumerable:!1,configurable:!0}),e.prototype.generateHtml=function(){var t=document.createElement("div");t.classList.add(this.className),t.setAttribute("role",this.role),this.html=t},e.prototype.focus=function(){var t=this.html;t.setAttribute("tabindex","0"),t.focus()},e.prototype.unfocus=function(){var t=this.html;t.hasAttribute("tabindex")&&t.setAttribute("tabindex","-1");try{t.blur()}catch(t){}t.blur()},e}(r(2868).AbstractNavigatable);e.MenuElement=i},1932:function(t,e,r){var n=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")};Object.defineProperty(e,"__esModule",{value:!0}),e.MenuStore=void 0;var o=r(2556),i=r(2165),Q=r(3205),T=function(){function t(t){this.menu=t,this.store=[],this._active=null,this.counter=0,this.attachedClass=i.HtmlClasses.ATTACHED+"_"+o.MenuUtil.counter(),this.taborder=!0,this.attrMap={}}return Object.defineProperty(t.prototype,"active",{get:function(){return this._active},set:function(t){do{if(-1!==this.store.indexOf(t)){this._active=t;break}t=t.parentNode}while(t)},enumerable:!1,configurable:!0}),t.prototype.next=function(){var t=this.store.length;if(0===t)return this.active=null,null;var e=this.store.indexOf(this.active);return e=-1===e?0:e0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q},i=this&&this.__values||function(t){var e="function"==typeof Symbol&&Symbol.iterator,r=e&&t[e],n=0;if(r)return r.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&n>=t.length&&(t=void 0),{value:t&&t[n++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")},Q=this&&this.__spread||function(){for(var t=[],e=0;e0)&&!(n=i.next()).done;)Q.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=i.return)&&r.call(i)}finally{if(o)throw o.error}}return Q};Object.defineProperty(e,"__esModule",{value:!0}),e.SelectionBox=e.SelectionMenu=void 0;var Q=r(2556),T=r(2165),s=r(1484),a=r(4922),l=function(t){function e(e){var r=t.call(this)||this;return r.anchor=e,r.className=T.HtmlClasses.SELECTIONMENU,r.variablePool=r.anchor.menu.pool,r.baseMenu=r.anchor.menu,r}return o(e,t),e.fromJson=function(t,e,r){var n=e.title,o=e.values,i=e.variable,Q=new this(r),T=t.get("label")(t,{content:n||"",id:n||"id"},Q),s=t.get("rule")(t,{},Q),a=o.map((function(e){return t.get("radio")(t,{content:e,variable:i,id:e},Q)})),l=[T,s].concat(a);return Q.items=l,Q},e.prototype.generateHtml=function(){t.prototype.generateHtml.call(this),this.items.forEach((function(t){return t.html.classList.add(T.HtmlClasses.SELECTIONITEM)}))},e.prototype.display=function(){},e.prototype.right=function(t){this.anchor.right(t)},e.prototype.left=function(t){this.anchor.left(t)},e}(s.AbstractMenu);e.SelectionMenu=l;var c=function(t){function e(e,r,n,o){void 0===n&&(n="none"),void 0===o&&(o="vertical");var i=t.call(this,e,null,r)||this;return i.style=n,i.grid=o,i._selections=[],i.prefix="ctxt-selection",i._balanced=!0,i}return o(e,t),e.fromJson=function(t,e,r){var n=e.title,o=e.signature,i=e.selections,Q=new this(n,o,e.order,e.grid);Q.attachMenu(r);var T=i.map((function(e){return t.get("selectionMenu")(t,e,Q)}));return Q.selections=T,Q},e.prototype.attachMenu=function(t){this.menu=t},Object.defineProperty(e.prototype,"selections",{get:function(){return this._selections},set:function(t){var e=this;this._selections=[],t.forEach((function(t){return e.addSelection(t)}))},enumerable:!1,configurable:!0}),e.prototype.addSelection=function(t){t.anchor=this,this._selections.push(t)},e.prototype.rowDiv=function(t){var e=this,r=document.createElement("div");this.contentDiv.appendChild(r);var n=t.map((function(t){return r.appendChild(t.html),t.html.id||(t.html.id=e.prefix+Q.MenuUtil.counter()),t.html.getBoundingClientRect()})),o=n.map((function(t){return t.width})),i=o.reduce((function(t,e){return t+e}),0),s=n.reduce((function(t,e){return Math.max(t,e.height)}),0);return r.classList.add(T.HtmlClasses.SELECTIONDIVIDER),r.setAttribute("style","height: "+s+"px;"),[r,i,s,o]},e.prototype.display=function(){if(t.prototype.display.call(this),this.order(),this.selections.length){for(var e=[],r=0,n=[],o=this.getChunkSize(this.selections.length),Q=function(t){var Q=T.selections.slice(t,t+o),s=i(T.rowDiv(Q),4),a=s[0],l=s[1],c=s[2],u=s[3];e.push(a),r=Math.max(r,l),Q.forEach((function(t){return t.html.style.height=c+"px"})),n=T.combineColumn(n,u)},T=this,s=0;sdocument.body.offsetWidth-5&&(i=Math.max(5,i-o-r.offsetWidth+6)),t.prototype.post.call(this,i,Q)}},e.prototype.display=function(){this.baseMenu.frame.appendChild(this.html)},e.prototype.setBaseMenu=function(){var t=this;do{t=t.anchor.menu}while(t instanceof e);this.baseMenu=t},e.prototype.left=function(t){this.focused=null,this.anchor.focus()},e.prototype.toJson=function(){return{type:""}},e}(r(1484).AbstractMenu);e.SubMenu=i},3737:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Variable=void 0;var n=r(2556),o=function(){function t(t,e,r){this._name=t,this.getter=e,this.setter=r,this.items=[]}return t.fromJson=function(t,e,r){var n=new this(e.name,e.getter,e.setter);r.insert(n)},Object.defineProperty(t.prototype,"name",{get:function(){return this._name},enumerable:!1,configurable:!0}),t.prototype.getValue=function(t){try{return this.getter(t)}catch(t){return n.MenuUtil.error(t,"Command of variable "+this.name+" failed."),null}},t.prototype.setValue=function(t,e){try{this.setter(t,e)}catch(t){n.MenuUtil.error(t,"Command of variable "+this.name+" failed.")}this.update()},t.prototype.register=function(t){-1===this.items.indexOf(t)&&this.items.push(t)},t.prototype.unregister=function(t){var e=this.items.indexOf(t);-1!==e&&this.items.splice(e,1)},t.prototype.update=function(){this.items.forEach((function(t){return t.update()}))},t.prototype.registerCallback=function(t){this.items.forEach((function(e){return e.registerCallback(t)}))},t.prototype.unregisterCallback=function(t){this.items.forEach((function(e){return e.unregisterCallback(t)}))},t.prototype.toJson=function(){return{type:"variable",name:this.name,getter:this.getter.toString(),setter:this.setter.toString()}},t}();e.Variable=o},2358:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.VariablePool=void 0;var r=function(){function t(){this.pool={}}return t.prototype.insert=function(t){this.pool[t.name]=t},t.prototype.lookup=function(t){return this.pool[t]},t.prototype.remove=function(t){delete this.pool[t]},t.prototype.update=function(){for(var t in this.pool)this.pool[t].update()},t}();e.VariablePool=r},3921:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractAudioRenderer=void 0;const n=r(5897);e.AbstractAudioRenderer=class{constructor(){this.separator_=" "}setSeparator(t){this.separator_=t}getSeparator(){return"braille"===n.default.getInstance().modality?"":this.separator_}error(t){return null}merge(t){let e="";const r=t.length-1;for(let n,o=0;n=t[o];o++)if(e+=n.speech,odelete t[e])),e.open.forEach((r=>t[r]=e[r]));const r=Object.keys(t);t.open=r},e.sortClose=function(t,e){if(t.length<=1)return t;const r=[];for(let n,o=0;n=e[o],t.length;o++)n.close&&n.close.length&&n.close.forEach((function(e){const n=t.indexOf(e);-1!==n&&(r.unshift(e),t.splice(n,1))}));return r};let T={},s=[];function a(t,e){const r=t[t.length-1];if(r){if(p(e)&&p(r)){if(void 0===r.join)return void(r.span=r.span.concat(e.span));const t=r.span.pop(),n=e.span.shift();return r.span.push(t+r.join+n),r.span=r.span.concat(e.span),void(r.join=e.join)}u(e)&&u(r)?r.pause=Q(r.pause,e.pause):t.push(e)}else t.push(e)}function l(t,e){t.rate&&(e.rate=t.rate),t.pitch&&(e.pitch=t.pitch),t.volume&&(e.volume=t.volume)}function c(t){return"object"==typeof t&&t.open}function u(t){return"object"==typeof t&&1===Object.keys(t).length&&Object.keys(t)[0]===o.personalityProps.PAUSE}function p(t){const e=Object.keys(t);return"object"==typeof t&&(1===e.length&&"span"===e[0]||2===e.length&&("span"===e[0]&&"join"===e[1]||"span"===e[1]&&"join"===e[0]))}function h(t,e,r,n,T,s=!1){if(s){const s=t[t.length-1];let a;if(s&&(a=s[o.personalityProps.JOIN]),s&&!e.speech&&T&&u(s)){const t=o.personalityProps.PAUSE;s[t]=Q(s[t],T[t]),T=null}if(s&&e.speech&&0===Object.keys(r).length&&p(s)){if(void 0!==a){const t=s.span.pop();e=new i.Span(t.speech+a+e.speech,t.attributes)}s.span.push(e),e=new i.Span("",{}),s[o.personalityProps.JOIN]=n}}0!==Object.keys(r).length&&t.push(r),e.speech&&t.push({span:[e],join:n}),T&&t.push(T)}function d(t,e){if(!e)return t;const r={};for(const n of o.personalityPropList){const o=t[n],i=e[n];if(!o&&!i||o&&i&&o===i)continue;const Q=o||0;c(r)||(r.open=[],r.close=[]),o||r.close.push(n),i||r.open.push(n),i&&o&&(r.close.push(n),r.open.push(n)),e[n]=Q,r[n]=Q,T[n]?T[n].push(Q):T[n]=[Q]}if(c(r)){let t=r.close.slice();for(;t.length>0;){let o=s.pop();const i=(0,n.setdifference)(o,t);if(t=(0,n.setdifference)(t,o),o=i,0!==t.length){if(0!==o.length){r.close=r.close.concat(o),r.open=r.open.concat(o);for(let t,n=0;t=o[n];n++)r[t]=e[t]}}else 0!==o.length&&s.push(o)}s.push(r.open)}return r}e.personalityMarkup=function(t){T={},s=[];let e=[];const r={};for(let n,i=0;n=t[i];i++){let t=null;const i=n.descriptionSpan(),Q=n.personality,T=Q[o.personalityProps.JOIN];delete Q[o.personalityProps.JOIN],void 0!==Q[o.personalityProps.PAUSE]&&(t={[o.personalityProps.PAUSE]:Q[o.personalityProps.PAUSE]},delete Q[o.personalityProps.PAUSE]);h(e,i,d(Q,r),T,t,!0)}return e=e.concat(function(){const t=[];for(let e=s.length-1;e>=0;e--){const r=s[e];if(r.length){const e={open:[],close:[]};for(let t=0;t"string"==typeof t?new a.Span(t,{}):t)),r=d.get(n.default.getInstance().markup);return r?r.merge(e):t.join()},e.finalize=function(t){const e=d.get(n.default.getInstance().markup);return e?e.finalize(t):t},e.error=function(t){const e=d.get(n.default.getInstance().markup);return e?e.error(t):""},e.registerRenderer=function(t,e){d.set(t,e)},e.isXml=function(){return d.get(n.default.getInstance().markup)instanceof p.XmlRenderer}},8639:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.LayoutRenderer=void 0;const n=r(2057),o=r(5740),i=r(4440),Q=r(3706),T=r(2456);class s extends T.XmlRenderer{finalize(t){return function(t){a="";const e=o.parseInput(`${t}`);return n.Debugger.getInstance().output(o.formatXml(e.toString())),a=p(e),a}(t)}pause(t){return""}prosodyElement(t,e){return t===i.personalityProps.LAYOUT?`<${e}>`:""}closeTag(t){return``}markup(t){const e=[];let r=[];for(const n of t){if(!n.layout){r.push(n);continue}e.push(this.processContent(r)),r=[];const t=n.layout;t.match(/^begin/)?e.push("<"+t.replace(/^begin/,"")+">"):t.match(/^end/)?e.push(""):console.warn("Something went wrong with layout markup: "+t)}return e.push(this.processContent(r)),e.join("")}processContent(t){const e=[],r=Q.personalityMarkup(t);for(let t,n=0;t=r[n];n++)t.span?e.push(this.merge(t.span)):Q.isPauseElement(t);return e.join("")}}e.LayoutRenderer=s;let a="";const l={TABLE:function(t){let e=L(t);e.forEach((t=>{t.cells=t.cells.slice(1).slice(0,-1),t.width=t.width.slice(1).slice(0,-1)}));const[r,n]=m(e);return e=y(e,n),g(e,r)},CASES:function(t){let e=L(t);e.forEach((t=>{t.cells=t.cells.slice(0,-1),t.width=t.width.slice(0,-1)}));const[r,n]=m(e);return e=y(e,n),g(e,r)},CAYLEY:function(t){let e=L(t);e.forEach((t=>{t.cells=t.cells.slice(1).slice(0,-1),t.width=t.width.slice(1).slice(0,-1),t.sep=t.sep+t.sep}));const[r,n]=m(e),o={lfence:"",rfence:"",cells:n.map((t=>"\u2810"+new Array(t).join("\u2812"))),width:n,height:1,sep:e[0].sep};return e.splice(1,0,o),e=y(e,n),g(e,r)},MATRIX:function(t){let e=L(t);const[r,n]=m(e);return e=y(e,n),g(e,r)},CELL:p,FENCE:p,ROW:p,FRACTION:function(t){const[e,r,,n,o]=Array.from(t.childNodes),i=c(r),Q=c(n),T=d(i),s=d(Q);let a=Math.max(T,s);const l=e+new Array(a+1).join("\u2812")+o;return a=l.length,`${M(i,a)}\n${l}\n${M(Q,a)}`},NUMERATOR:_,DENOMINATOR:_};function c(t){const e=o.tagName(t),r=l[e];return r?r(t):t.textContent}function u(t,e){if(!t||!e)return t+e;const r=h(t),n=h(e),o=r-n;t=o<0?f(t,n,d(t)):t,e=o>0?f(e,r,d(e)):e;const i=t.split(/\r\n|\r|\n/),Q=e.split(/\r\n|\r|\n/),T=[];for(let t=0;tMath.max(e.length,t)),0)}function f(t,e,r){return t=function(t,e){const r=e-h(t);return t+(r>0?new Array(r+1).join("\n"):"")}(t,e),function(t,e){const r=t.split(/\r\n|\r|\n/),n=[];for(const t of r){const r=e-t.length;n.push(t+(r>0?new Array(r+1).join("\u2800"):""))}return n.join("\n")}(t,r)}function L(t){const e=Array.from(t.childNodes),r=[];for(const t of e)t.nodeType===o.NodeType.ELEMENT_NODE&&r.push(v(t));return r}function m(t){const e=t.reduce(((t,e)=>Math.max(e.height,t)),0),r=[];for(let e=0;et.width[e])).reduce(((t,e)=>Math.max(t,e)),0));return[e,r]}function y(t,e){const r=[];for(const n of t){if(0===n.height)continue;const t=[];for(let r=0;rt.lfence+t.cells.join(t.sep)+t.rfence)).join("\n");const r=[];for(const e of t){const t=H(e.sep,e.height);let n=e.cells.shift();for(;e.cells.length;)n=u(n,t),n=u(n,e.cells.shift());n=u(H(e.lfence,e.height),n),n=u(n,H(e.rfence,e.height)),r.push(n),r.push(e.lfence+new Array(d(n)-3).join(e.sep)+e.rfence)}return r.slice(0,-1).join("\n")}function H(t,e){let r="";for(;e;)r+=t+"\n",e--;return r.slice(0,-1)}function b(t){return t.nodeType===o.NodeType.ELEMENT_NODE&&"FENCE"===o.tagName(t)?c(t):""}function v(t){const e=Array.from(t.childNodes),r=b(e[0]),n=b(e[e.length-1]);r&&e.shift(),n&&e.pop();let i="";const Q=[];for(const t of e){if(t.nodeType===o.NodeType.TEXT_NODE){i=t.textContent;continue}const e=c(t);Q.push(e)}return{lfence:r,rfence:n,sep:i,cells:Q,height:Q.reduce(((t,e)=>Math.max(h(e),t)),0),width:Q.map(d)}}function M(t,e){const r=(e-d(t))/2,[n,o]=Math.floor(r)===r?[r,r]:[Math.floor(r),Math.ceil(r)],i=t.split(/\r\n|\r|\n/),Q=[],[T,s]=[new Array(n+1).join("\u2800"),new Array(o+1).join("\u2800")];for(const t of i)Q.push(T+t+s);return Q.join("\n")}function _(t){const e=t.firstChild,r=p(t);if(e&&e.nodeType===o.NodeType.ELEMENT_NODE){if("ENGLISH"===o.tagName(e))return"\u2830"+r;if("NUMBER"===o.tagName(e))return"\u283c"+r}return r}},182:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MarkupRenderer=void 0;const n=r(4440),o=r(3921);class i extends o.AbstractAudioRenderer{constructor(){super(...arguments),this.ignoreElements=[n.personalityProps.LAYOUT],this.scaleFunction=null}setScaleFunction(t,e,r,n,o=0){this.scaleFunction=i=>{const Q=(i-t)/(e-t),T=r*(1-Q)+n*Q;return+(Math.round(T+"e+"+o)+"e-"+o)}}applyScaleFunction(t){return this.scaleFunction?this.scaleFunction(t):t}ignoreElement(t){return-1!==this.ignoreElements.indexOf(t)}}e.MarkupRenderer=i},8990:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.PunctuationRenderer=void 0;const n=r(4440),o=r(3921),i=r(3706);class Q extends o.AbstractAudioRenderer{markup(t){const e=i.personalityMarkup(t);let r="",o=null,Q=!1;for(let t,T=0;t=e[T];T++)i.isMarkupElement(t)||(i.isPauseElement(t)?Q&&(o=i.mergePause(o,t,Math.max)):(o&&(r+=this.pause(o[n.personalityProps.PAUSE]),o=null),r+=(Q?this.getSeparator():"")+this.merge(t.span),Q=!0));return r}pause(t){let e;return e="number"==typeof t?t<=250?"short":t<=500?"medium":"long":t,Q.PAUSE_PUNCTUATION.get(e)||""}}e.PunctuationRenderer=Q,Q.PAUSE_PUNCTUATION=new Map([["short",","],["medium",";"],["long","."]])},6660:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SableRenderer=void 0;const n=r(4440),o=r(2456);class i extends o.XmlRenderer{finalize(t){return''+this.getSeparator()+t+this.getSeparator()+""}pause(t){return''}prosodyElement(t,e){switch(e=this.applyScaleFunction(e),t){case n.personalityProps.PITCH:return'';case n.personalityProps.RATE:return'';case n.personalityProps.VOLUME:return'';default:return"<"+t.toUpperCase()+' VALUE="'+e+'">'}}closeTag(t){return""}}e.SableRenderer=i},9536:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Span=void 0;e.Span=class{constructor(t,e){this.speech=t,this.attributes=e}}},7504:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SsmlRenderer=void 0;const n=r(5897),o=r(4440),i=r(2456);class Q extends i.XmlRenderer{finalize(t){return''+this.getSeparator()+t+this.getSeparator()+""}pause(t){return''}prosodyElement(t,e){const r=(e=Math.floor(this.applyScaleFunction(e)))<0?e.toString():"+"+e.toString();return"":'%">')}closeTag(t){return""}}e.SsmlRenderer=Q},3757:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SsmlStepRenderer=void 0;const n=r(7504);class o extends n.SsmlRenderer{markup(t){return o.MARKS={},super.markup(t)}merge(t){const e=[];for(let r=0;r'),o.MARKS[i]=!0),1===n.speech.length&&n.speech.match(/[a-zA-Z]/)?e.push(''+n.speech+""):e.push(n.speech)}return e.join(this.getSeparator())}}e.SsmlStepRenderer=o,o.CHARACTER_ATTR="character",o.MARKS={}},4032:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.StringRenderer=void 0;const n=r(3921),o=r(3706);class i extends n.AbstractAudioRenderer{markup(t){let e="";const r=(0,o.personalityMarkup)(t).filter((t=>t.span));if(!r.length)return e;const n=r.length-1;for(let t,o=0;t=r[o];o++){if(t.span&&(e+=this.merge(t.span)),o>=n)continue;const r=t.join;e+=void 0===r?this.getSeparator():r}return e}}e.StringRenderer=i},2456:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.XmlRenderer=void 0;const n=r(5897),o=r(3706),i=r(182);class Q extends i.MarkupRenderer{markup(t){this.setScaleFunction(-2,2,-100,100,2);const e=o.personalityMarkup(t),r=[],i=[];for(let t,Q=0;t=e[Q];Q++)if(t.span)r.push(this.merge(t.span));else if(o.isPauseElement(t))r.push(this.pause(t));else{if(t.close.length)for(let e=0;e{r.push(this.prosodyElement(e,t[e])),i.push(e)}))}}return r.join(" ")}}e.XmlRenderer=Q},707:function(t,e){function r(t,e){return t?e?t.filter((t=>e.indexOf(t)<0)):t:[]}Object.defineProperty(e,"__esModule",{value:!0}),e.union=e.setdifference=e.interleaveLists=e.removeEmpty=void 0,e.removeEmpty=function(t){return t.filter((t=>t))},e.interleaveLists=function(t,e){const r=[];for(;t.length||e.length;)t.length&&r.push(t.shift()),e.length&&r.push(e.shift());return r},e.setdifference=r,e.union=function(t,e){return t&&e?t.concat(r(e,t)):t||e||[]}},2139:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.loadScript=e.loadMapsForIE_=e.installWGXpath_=e.loadWGXpath_=e.mapsForIE=e.detectEdge=e.detectIE=void 0;const n=r(2315),o=r(5274);function i(t){s(n.default.WGXpath),Q(t)}function Q(t,e){let r=e||1;"undefined"==typeof wgxpath&&r<10?setTimeout((function(){Q(t,r++)}),200):r>=10||(n.default.wgxpath=wgxpath,t?n.default.wgxpath.install({document:document}):n.default.wgxpath.install(),o.xpath.evaluate=document.evaluate,o.xpath.result=XPathResult,o.xpath.createNSResolver=document.createNSResolver)}function T(){s(n.default.mathmapsIePath)}function s(t){const e=n.default.document.createElement("script");e.type="text/javascript",e.src=t,n.default.document.head?n.default.document.head.appendChild(e):n.default.document.body.appendChild(e)}e.detectIE=function(){return"undefined"!=typeof window&&"ActiveXObject"in window&&"clipboardData"in window&&(T(),i(),!0)},e.detectEdge=function(){var t;return"undefined"!=typeof window&&"MSGestureEvent"in window&&null===(null===(t=window.chrome)||void 0===t?void 0:t.loadTimes)&&(document.evaluate=null,i(!0),!0)},e.mapsForIE=null,e.loadWGXpath_=i,e.installWGXpath_=Q,e.loadMapsForIE_=T,e.loadScript=s},2057:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Debugger=void 0;const n=r(2315);class o{constructor(){this.isActive_=!1,this.outputFunction_=console.info,this.stream_=null}static getInstance(){return o.instance=o.instance||new o,o.instance}init(t){t&&this.startDebugFile_(t),this.isActive_=!0}output(...t){this.isActive_&&this.output_(t)}generateOutput(t){this.isActive_&&this.output_(t.apply(t,[]))}exit(t=(()=>{})){this.isActive_&&this.stream_&&this.stream_.end("","",t)}startDebugFile_(t){this.stream_=n.default.fs.createWriteStream(t),this.outputFunction_=function(...t){this.stream_.write(t.join(" ")),this.stream_.write("\n")}.bind(this),this.stream_.on("error",function(t){console.info("Invalid log file. Debug information sent to console."),this.outputFunction_=console.info}.bind(this)),this.stream_.on("finish",(function(){console.info("Finalizing debug file.")}))}output_(t){this.outputFunction_.apply(console.info===this.outputFunction_?console:this.outputFunction_,["Speech Rule Engine Debugger:"].concat(t))}}e.Debugger=o},5740:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.serializeXml=e.cloneNode=e.tagName=e.querySelectorAll=e.querySelectorAllByAttrValue=e.querySelectorAllByAttr=e.formatXml=e.createTextNode=e.createElementNS=e.createElement=e.replaceNode=e.NodeType=e.parseInput=e.XML_ENTITIES=e.trimInput_=e.toArray=void 0;const n=r(5897),o=r(4440),i=r(2315),Q=r(5274);function T(t){const e=[];for(let r=0,n=t.length;r[ \f\n\r\t\v\u200b]+<").trim()}function a(t,e){if(!e)return[!1,""];const r=t.match(/^<([^> ]+).*>/),n=e.match(/^<\/([^>]+)>(.*)/);return r&&n&&r[1]===n[1]?[!0,n[2]]:[!1,""]}e.toArray=T,e.trimInput_=s,e.XML_ENTITIES={"<":!0,">":!0,"&":!0,""":!0,"'":!0},e.parseInput=function(t){const e=new i.default.xmldom.DOMParser,r=s(t),T=!!r.match(/&(?!lt|gt|amp|quot|apos)\w+;/g);if(!r)throw new Error("Empty input!");try{const t=e.parseFromString(r,T?"text/html":"text/xml");return n.default.getInstance().mode===o.Mode.HTTP?(Q.xpath.currentDocument=t,T?t.body.childNodes[0]:t.documentElement):t.documentElement}catch(t){throw new n.SREError("Illegal input: "+t.message)}},function(t){t[t.ELEMENT_NODE=1]="ELEMENT_NODE",t[t.ATTRIBUTE_NODE=2]="ATTRIBUTE_NODE",t[t.TEXT_NODE=3]="TEXT_NODE",t[t.CDATA_SECTION_NODE=4]="CDATA_SECTION_NODE",t[t.ENTITY_REFERENCE_NODE=5]="ENTITY_REFERENCE_NODE",t[t.ENTITY_NODE=6]="ENTITY_NODE",t[t.PROCESSING_INSTRUCTION_NODE=7]="PROCESSING_INSTRUCTION_NODE",t[t.COMMENT_NODE=8]="COMMENT_NODE",t[t.DOCUMENT_NODE=9]="DOCUMENT_NODE",t[t.DOCUMENT_TYPE_NODE=10]="DOCUMENT_TYPE_NODE",t[t.DOCUMENT_FRAGMENT_NODE=11]="DOCUMENT_FRAGMENT_NODE",t[t.NOTATION_NODE=12]="NOTATION_NODE"}(e.NodeType||(e.NodeType={})),e.replaceNode=function(t,e){t.parentNode&&(t.parentNode.insertBefore(e,t),t.parentNode.removeChild(t))},e.createElement=function(t){return i.default.document.createElement(t)},e.createElementNS=function(t,e){return i.default.document.createElementNS(t,e)},e.createTextNode=function(t){return i.default.document.createTextNode(t)},e.formatXml=function(t){let e="",r=/(>)(<)(\/*)/g,n=0,o=(t=t.replace(r,"$1\r\n$2$3")).split("\r\n");for(r=/(\.)*(<)(\/*)/g,o=o.map((t=>t.replace(r,"$1\r\n$2$3").split("\r\n"))).reduce(((t,e)=>t.concat(e)),[]);o.length;){let t=o.shift();if(!t)continue;let r=0;if(t.match(/^<\w[^>/]*>[^>]+$/)){const e=a(t,o[0]);e[0]?e[1]?(t+=o.shift().slice(0,-e[1].length),e[1].trim()&&o.unshift(e[1])):t+=o.shift():r=1}else if(t.match(/^<\/\w/))0!==n&&(n-=1);else if(t.match(/^<\w[^>]*[^/]>.*$/))r=1;else if(t.match(/^<\w[^>]*\/>.+$/)){const e=t.indexOf(">")+1;t.slice(e).trim()&&o.unshift(),t=t.slice(0,e)}else r=0;e+=new Array(n+1).join(" ")+t+"\r\n",n+=r}return e},e.querySelectorAllByAttr=function(t,e){return t.querySelectorAll?T(t.querySelectorAll(`[${e}]`)):Q.evalXPath(`.//*[@${e}]`,t)},e.querySelectorAllByAttrValue=function(t,e,r){return t.querySelectorAll?T(t.querySelectorAll(`[${e}="${r}"]`)):Q.evalXPath(`.//*[@${e}="${r}"]`,t)},e.querySelectorAll=function(t,e){return t.querySelectorAll?T(t.querySelectorAll(e)):Q.evalXPath(`.//${e}`,t)},e.tagName=function(t){return t.tagName.toUpperCase()},e.cloneNode=function(t){return t.cloneNode(!0)},e.serializeXml=function(t){return(new i.default.xmldom.XMLSerializer).serializeToString(t)}},5897:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.EnginePromise=e.SREError=void 0;const n=r(1676),o=r(4440),i=r(2057),Q=r(1377);class T extends Error{constructor(t=""){super(),this.message=t,this.name="SRE Error"}}e.SREError=T;class s{constructor(){this.customLoader=null,this.parsers={},this.comparator=null,this.mode=o.Mode.SYNC,this.init=!0,this.delay=!1,this.comparators={},this.domain="mathspeak",this.style=n.DynamicCstr.DEFAULT_VALUES[n.Axis.STYLE],this._defaultLocale=n.DynamicCstr.DEFAULT_VALUES[n.Axis.LOCALE],this.locale=this.defaultLocale,this.subiso="",this.modality=n.DynamicCstr.DEFAULT_VALUES[n.Axis.MODALITY],this.speech=o.Speech.NONE,this.markup=o.Markup.NONE,this.walker="Table",this.structure=!1,this.ruleSets=[],this.strict=!1,this.isIE=!1,this.isEdge=!1,this.rate="100",this.pprint=!1,this.config=!1,this.rules="",this.prune="",this.evaluator=s.defaultEvaluator,this.defaultParser=new n.DynamicCstrParser(n.DynamicCstr.DEFAULT_ORDER),this.parser=this.defaultParser,this.dynamicCstr=n.DynamicCstr.defaultCstr()}set defaultLocale(t){this._defaultLocale=Q.Variables.ensureLocale(t,this._defaultLocale)}get defaultLocale(){return this._defaultLocale}static getInstance(){return s.instance=s.instance||new s,s.instance}static defaultEvaluator(t,e){return t}static evaluateNode(t){return s.nodeEvaluator(t)}getRate(){const t=parseInt(this.rate,10);return isNaN(t)?100:t}setDynamicCstr(t){if(this.defaultLocale&&(n.DynamicCstr.DEFAULT_VALUES[n.Axis.LOCALE]=this.defaultLocale),t){const e=Object.keys(t);for(let r=0;r{void 0!==t[r]&&(e[r]=t[r])};return r("mode"),e.configurate(t),T.default.BINARY_FEATURES.forEach((r=>{void 0!==t[r]&&(e[r]=!!t[r])})),T.default.STRING_FEATURES.forEach(r),t.json&&(a.default.jsonPath=s.makePath(t.json)),t.xpath&&(a.default.WGXpath=t.xpath),e.setCustomLoader(t.custom),function(t){t.isIE=Q.detectIE(),t.isEdge=Q.detectEdge()}(e),o.setLocale(),e.setDynamicCstr(),e.init?(T.EnginePromise.promises.init=new Promise(((t,e)=>{setTimeout((()=>{t("init")}),10)})),e.init=!1,T.EnginePromise.get()):e.delay?(e.delay=!1,T.EnginePromise.get()):i.loadLocale()}))}},8496:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Event=e.EventType=e.Move=e.KeyCode=void 0,function(t){t[t.ENTER=13]="ENTER",t[t.ESC=27]="ESC",t[t.SPACE=32]="SPACE",t[t.PAGE_UP=33]="PAGE_UP",t[t.PAGE_DOWN=34]="PAGE_DOWN",t[t.END=35]="END",t[t.HOME=36]="HOME",t[t.LEFT=37]="LEFT",t[t.UP=38]="UP",t[t.RIGHT=39]="RIGHT",t[t.DOWN=40]="DOWN",t[t.TAB=9]="TAB",t[t.LESS=188]="LESS",t[t.GREATER=190]="GREATER",t[t.DASH=189]="DASH",t[t.ZERO=48]="ZERO",t[t.ONE=49]="ONE",t[t.TWO=50]="TWO",t[t.THREE=51]="THREE",t[t.FOUR=52]="FOUR",t[t.FIVE=53]="FIVE",t[t.SIX=54]="SIX",t[t.SEVEN=55]="SEVEN",t[t.EIGHT=56]="EIGHT",t[t.NINE=57]="NINE",t[t.A=65]="A",t[t.B=66]="B",t[t.C=67]="C",t[t.D=68]="D",t[t.E=69]="E",t[t.F=70]="F",t[t.G=71]="G",t[t.H=72]="H",t[t.I=73]="I",t[t.J=74]="J",t[t.K=75]="K",t[t.L=76]="L",t[t.M=77]="M",t[t.N=78]="N",t[t.O=79]="O",t[t.P=80]="P",t[t.Q=81]="Q",t[t.R=82]="R",t[t.S=83]="S",t[t.T=84]="T",t[t.U=85]="U",t[t.V=86]="V",t[t.W=87]="W",t[t.X=88]="X",t[t.Y=89]="Y",t[t.Z=90]="Z"}(e.KeyCode||(e.KeyCode={})),e.Move=new Map([[13,"ENTER"],[27,"ESC"],[32,"SPACE"],[33,"PAGE_UP"],[34,"PAGE_DOWN"],[35,"END"],[36,"HOME"],[37,"LEFT"],[38,"UP"],[39,"RIGHT"],[40,"DOWN"],[9,"TAB"],[188,"LESS"],[190,"GREATER"],[189,"DASH"],[48,"ZERO"],[49,"ONE"],[50,"TWO"],[51,"THREE"],[52,"FOUR"],[53,"FIVE"],[54,"SIX"],[55,"SEVEN"],[56,"EIGHT"],[57,"NINE"],[65,"A"],[66,"B"],[67,"C"],[68,"D"],[69,"E"],[70,"F"],[71,"G"],[72,"H"],[73,"I"],[74,"J"],[75,"K"],[76,"L"],[77,"M"],[78,"N"],[79,"O"],[80,"P"],[81,"Q"],[82,"R"],[83,"S"],[84,"T"],[85,"U"],[86,"V"],[87,"W"],[88,"X"],[89,"Y"],[90,"Z"]]),function(t){t.CLICK="click",t.DBLCLICK="dblclick",t.MOUSEDOWN="mousedown",t.MOUSEUP="mouseup",t.MOUSEOVER="mouseover",t.MOUSEOUT="mouseout",t.MOUSEMOVE="mousemove",t.SELECTSTART="selectstart",t.KEYPRESS="keypress",t.KEYDOWN="keydown",t.KEYUP="keyup",t.TOUCHSTART="touchstart",t.TOUCHMOVE="touchmove",t.TOUCHEND="touchend",t.TOUCHCANCEL="touchcancel"}(e.EventType||(e.EventType={}));e.Event=class{constructor(t,e,r){this.src=t,this.type=e,this.callback=r}add(){this.src.addEventListener(this.type,this.callback)}remove(){this.src.removeEventListener(this.type,this.callback)}}},7248:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.localePath=e.makePath=void 0;const n=r(2315);function o(t){return t.match("/$")?t:t+"/"}e.makePath=o,e.localePath=function(t,e="json"){return o(n.default.jsonPath)+t+(e.match(/^\./)?e:"."+e)}},3769:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.KeyProcessor=e.Processor=void 0;const n=r(8496);class o{constructor(t,e){this.name=t,this.process=e.processor,this.postprocess=e.postprocessor||((t,e)=>t),this.processor=this.postprocess?function(t){return this.postprocess(this.process(t),t)}:this.process,this.print=e.print||o.stringify_,this.pprint=e.pprint||this.print}static stringify_(t){return t?t.toString():t}}e.Processor=o,o.LocalState={walker:null,speechGenerator:null,highlighter:null};class i extends o{constructor(t,e){super(t,e),this.key=e.key||i.getKey_}static getKey_(t){return"string"==typeof t?n.KeyCode[t.toUpperCase()]:t}}e.KeyProcessor=i},6499:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.keypress=e.output=e.print=e.process=e.set=void 0;const n=r(8290),o=r(5714),i=r(3090),Q=r(4356),T=r(1414),s=r(9552),a=r(9543),l=r(3362),c=r(1204),u=r(5740),p=r(5897),h=r(4440),d=r(3769),f=r(5274),L=new Map;function m(t){L.set(t.name,t)}function y(t){const e=L.get(t);if(!e)throw new p.SREError("Unknown processor "+t);return e}function g(t,e){const r=y(t);try{return r.processor(e)}catch(t){throw new p.SREError("Processing error for expression "+e)}}function H(t,e){const r=y(t);return p.default.getInstance().pprint?r.pprint(e):r.print(e)}e.set=m,e.process=g,e.print=H,e.output=function(t,e){const r=y(t);try{const t=r.processor(e);return p.default.getInstance().pprint?r.pprint(t):r.print(t)}catch(t){throw new p.SREError("Processing error for expression "+e)}},e.keypress=function(t,e){const r=y(t),n=r instanceof d.KeyProcessor?r.key(e):e,o=r.processor(n);return p.default.getInstance().pprint?r.pprint(o):r.print(o)},m(new d.Processor("semantic",{processor:function(t){const e=u.parseInput(t);return T.xmlTree(e)},postprocessor:function(t,e){const r=p.default.getInstance().speech;if(r===h.Speech.NONE)return t;const o=u.cloneNode(t);let i=a.computeMarkup(o);if(r===h.Speech.SHALLOW)return t.setAttribute("speech",n.finalize(i)),t;const Q=f.evalXPath(".//*[@id]",t),T=f.evalXPath(".//*[@id]",o);for(let t,e,r=0;t=Q[r],e=T[r];r++)i=a.computeMarkup(e),t.setAttribute("speech",n.finalize(i));return t},pprint:function(t){return u.formatXml(t.toString())}})),m(new d.Processor("speech",{processor:function(t){const e=u.parseInput(t),r=T.xmlTree(e),o=a.computeSpeech(r);return n.finalize(n.markup(o))},pprint:function(t){const e=t.toString();return n.isXml()?u.formatXml(e):e}})),m(new d.Processor("json",{processor:function(t){const e=u.parseInput(t);return T.getTree(e).toJson()},postprocessor:function(t,e){const r=p.default.getInstance().speech;if(r===h.Speech.NONE)return t;const o=u.parseInput(e),i=T.xmlTree(o),Q=a.computeMarkup(i);if(r===h.Speech.SHALLOW)return t.stree.speech=n.finalize(Q),t;const s=t=>{const e=f.evalXPath(`.//*[@id=${t.id}]`,i)[0],r=a.computeMarkup(e);t.speech=n.finalize(r),t.children&&t.children.forEach(s)};return s(t.stree),t},print:function(t){return JSON.stringify(t)},pprint:function(t){return JSON.stringify(t,null,2)}})),m(new d.Processor("description",{processor:function(t){const e=u.parseInput(t),r=T.xmlTree(e);return a.computeSpeech(r)},print:function(t){return JSON.stringify(t)},pprint:function(t){return JSON.stringify(t,null,2)}})),m(new d.Processor("enriched",{processor:function(t){return o.semanticMathmlSync(t)},postprocessor:function(t,e){const r=c.getSemanticRoot(t);let n;switch(p.default.getInstance().speech){case h.Speech.NONE:break;case h.Speech.SHALLOW:n=s.generator("Adhoc"),n.getSpeech(r,t);break;case h.Speech.DEEP:n=s.generator("Tree"),n.getSpeech(t,t)}return t},pprint:function(t){return u.formatXml(t.toString())}})),m(new d.Processor("walker",{processor:function(t){const e=s.generator("Node");d.Processor.LocalState.speechGenerator=e,e.setOptions({modality:p.default.getInstance().modality,locale:p.default.getInstance().locale,domain:p.default.getInstance().domain,style:p.default.getInstance().style}),d.Processor.LocalState.highlighter=i.highlighter({color:"black"},{color:"white"},{renderer:"NativeMML"});const r=g("enriched",t),n=H("enriched",r);return d.Processor.LocalState.walker=l.walker(p.default.getInstance().walker,r,e,d.Processor.LocalState.highlighter,n),d.Processor.LocalState.walker},print:function(t){return d.Processor.LocalState.walker.speech()}})),m(new d.KeyProcessor("move",{processor:function(t){if(!d.Processor.LocalState.walker)return null;return!1===d.Processor.LocalState.walker.move(t)?n.error(t):d.Processor.LocalState.walker.speech()}})),m(new d.Processor("number",{processor:function(t){const e=parseInt(t,10);return isNaN(e)?"":Q.LOCALE.NUMBERS.numberToWords(e)}})),m(new d.Processor("ordinal",{processor:function(t){const e=parseInt(t,10);return isNaN(e)?"":Q.LOCALE.NUMBERS.wordOrdinal(e)}})),m(new d.Processor("numericOrdinal",{processor:function(t){const e=parseInt(t,10);return isNaN(e)?"":Q.LOCALE.NUMBERS.numericOrdinal(e)}})),m(new d.Processor("vulgar",{processor:function(t){const[e,r]=t.split("/").map((t=>parseInt(t,10)));return isNaN(e)||isNaN(r)?"":g("speech",`${e}${r}`)}}))},2998:function(t,e,r){var n=this&&this.__awaiter||function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function Q(t){try{s(n.next(t))}catch(t){i(t)}}function T(t){try{s(n.throw(t))}catch(t){i(t)}}function s(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(Q,T)}s((n=n.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.localePath=e.exit=e.move=e.walk=e.processFile=e.file=e.vulgar=e.numericOrdinal=e.ordinal=e.number=e.toEnriched=e.toDescription=e.toJson=e.toSemantic=e.toSpeech=e.localeLoader=e.engineReady=e.engineSetup=e.setupEngine=e.version=void 0;const o=r(5897),i=r(6828),Q=r(4440),T=r(7248),s=r(6499),a=r(2315),l=r(1377),c=r(6141);function u(t){return n(this,void 0,void 0,(function*(){return(0,i.setup)(t)}))}function p(t,e){return s.process(t,e)}function h(t,e,r){switch(o.default.getInstance().mode){case Q.Mode.ASYNC:return function(t,e,r){return n(this,void 0,void 0,(function*(){const n=yield a.default.fs.promises.readFile(e,{encoding:"utf8"}),i=s.output(t,n);if(r)try{a.default.fs.promises.writeFile(r,i)}catch(t){throw new o.SREError("Can not write to file: "+r)}return i}))}(t,e,r);case Q.Mode.SYNC:return function(t,e,r){const n=function(t){let e;try{e=a.default.fs.readFileSync(t,{encoding:"utf8"})}catch(e){throw new o.SREError("Can not open file: "+t)}return e}(e),i=s.output(t,n);if(r)try{a.default.fs.writeFileSync(r,i)}catch(t){throw new o.SREError("Can not write to file: "+r)}return i}(t,e,r);default:throw new o.SREError(`Can process files in ${o.default.getInstance().mode} mode`)}}e.version=l.Variables.VERSION,e.setupEngine=u,e.engineSetup=function(){const t=["mode"].concat(o.default.STRING_FEATURES,o.default.BINARY_FEATURES),e=o.default.getInstance(),r={};return t.forEach((function(t){r[t]=e[t]})),r.json=a.default.jsonPath,r.xpath=a.default.WGXpath,r.rules=e.ruleSets.slice(),r},e.engineReady=function(){return n(this,void 0,void 0,(function*(){return u({}).then((()=>o.EnginePromise.getall()))}))},e.localeLoader=c.standardLoader,e.toSpeech=function(t){return p("speech",t)},e.toSemantic=function(t){return p("semantic",t)},e.toJson=function(t){return p("json",t)},e.toDescription=function(t){return p("description",t)},e.toEnriched=function(t){return p("enriched",t)},e.number=function(t){return p("number",t)},e.ordinal=function(t){return p("ordinal",t)},e.numericOrdinal=function(t){return p("numericOrdinal",t)},e.vulgar=function(t){return p("vulgar",t)},e.file={},e.file.toSpeech=function(t,e){return h("speech",t,e)},e.file.toSemantic=function(t,e){return h("semantic",t,e)},e.file.toJson=function(t,e){return h("json",t,e)},e.file.toDescription=function(t,e){return h("description",t,e)},e.file.toEnriched=function(t,e){return h("enriched",t,e)},e.processFile=h,e.walk=function(t){return s.output("walker",t)},e.move=function(t){return s.keypress("move",t)},e.exit=function(t){const e=t||0;o.EnginePromise.getall().then((()=>process.exit(e)))},e.localePath=T.localePath,a.default.documentSupported?u({mode:Q.Mode.HTTP}).then((()=>u({}))):u({mode:Q.Mode.SYNC}).then((()=>u({mode:Q.Mode.ASYNC})))},2315:function(__unused_webpack_module,exports,__webpack_require__){var __dirname="/";Object.defineProperty(exports,"__esModule",{value:!0});const variables_1=__webpack_require__(1377);class SystemExternal{static extRequire(library){if("undefined"!=typeof process){const nodeRequire=eval("require");return nodeRequire(library)}return null}}exports.default=SystemExternal,SystemExternal.windowSupported=!("undefined"==typeof window),SystemExternal.documentSupported=SystemExternal.windowSupported&&!(void 0===window.document),SystemExternal.xmldom=SystemExternal.documentSupported?window:SystemExternal.extRequire("xmldom-sre"),SystemExternal.document=SystemExternal.documentSupported?window.document:(new SystemExternal.xmldom.DOMImplementation).createDocument("","",0),SystemExternal.xpath=SystemExternal.documentSupported?document:function(){const t={document:{},XPathResult:{}};return SystemExternal.extRequire("wicked-good-xpath").install(t),t.document.XPathResult=t.XPathResult,t.document}(),SystemExternal.mathmapsIePath="https://cdn.jsdelivr.net/npm/sre-mathmaps-ie@"+variables_1.Variables.VERSION+"mathmaps_ie.js",SystemExternal.commander=SystemExternal.documentSupported?null:SystemExternal.extRequire("commander"),SystemExternal.fs=SystemExternal.documentSupported?null:SystemExternal.extRequire("fs"),SystemExternal.url=variables_1.Variables.url,SystemExternal.jsonPath=(SystemExternal.documentSupported?SystemExternal.url:process.env.SRE_JSON_PATH||__webpack_require__.g.SRE_JSON_PATH||__dirname+"/mathmaps")+"/",SystemExternal.WGXpath=variables_1.Variables.WGXpath,SystemExternal.wgxpath=null},1377:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.Variables=void 0;class r{static ensureLocale(t,e){return r.LOCALES.get(t)?t:(console.error(`Locale ${t} does not exist! Using ${r.LOCALES.get(e)} instead.`),e)}}e.Variables=r,r.VERSION="4.0.6",r.LOCALES=new Map([["ca","Catalan"],["da","Danish"],["de","German"],["en","English"],["es","Spanish"],["fr","French"],["hi","Hindi"],["it","Italian"],["nb","Bokm\xe5l"],["nn","Nynorsk"],["sv","Swedish"],["nemeth","Nemeth"]]),r.mathjaxVersion="3.2.1",r.url="https://cdn.jsdelivr.net/npm/speech-rule-engine@"+r.VERSION+"/lib/mathmaps",r.WGXpath="https://cdn.jsdelivr.net/npm/wicked-good-xpath@1.3.0/dist/wgxpath.install.js"},5274:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.updateEvaluator=e.evaluateString=e.evaluateBoolean=e.getLeafNodes=e.evalXPath=e.resolveNameSpace=e.xpath=void 0;const n=r(5897),o=r(4440),i=r(2315);function Q(){return"undefined"!=typeof XPathResult}e.xpath={currentDocument:null,evaluate:Q()?document.evaluate:i.default.xpath.evaluate,result:Q()?XPathResult:i.default.xpath.XPathResult,createNSResolver:Q()?document.createNSResolver:i.default.xpath.createNSResolver};const T={xhtml:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",mml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};function s(t){return T[t]||null}e.resolveNameSpace=s;class a{constructor(){this.lookupNamespaceURI=s}}function l(t,r,i){return n.default.getInstance().mode!==o.Mode.HTTP||n.default.getInstance().isIE||n.default.getInstance().isEdge?e.xpath.evaluate(t,r,new a,i,null):e.xpath.currentDocument.evaluate(t,r,s,i,null)}function c(t,r){let n;try{n=l(t,r,e.xpath.result.ORDERED_NODE_ITERATOR_TYPE)}catch(t){return[]}const o=[];for(let t=n.iterateNext();t;t=n.iterateNext())o.push(t);return o}e.evalXPath=c,e.getLeafNodes=function(t){return c(".//*[count(*)=0]",t)},e.evaluateBoolean=function(t,r){let n;try{n=l(t,r,e.xpath.result.BOOLEAN_TYPE)}catch(t){return!1}return n.booleanValue},e.evaluateString=function(t,r){let n;try{n=l(t,r,e.xpath.result.STRING_TYPE)}catch(t){return""}return n.stringValue},e.updateEvaluator=function(t){if(n.default.getInstance().mode!==o.Mode.HTTP)return;let r=t;for(;r&&!r.evaluate;)r=r.parentNode;r&&r.evaluate?e.xpath.currentDocument=r:t.ownerDocument&&(e.xpath.currentDocument=t.ownerDocument)}},9268:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractEnrichCase=void 0;e.AbstractEnrichCase=class{constructor(t){this.semantic=t}}},6061:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseBinomial=void 0;const n=r(5740),o=r(9268),i=r(5452),Q=r(2298);class T extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return!t.mathmlTree&&"line"===t.type&&"binomial"===t.role}getMathml(){if(!this.semantic.childNodes.length)return this.mml;const t=this.semantic.childNodes[0];if(this.mml=(0,i.walkTree)(t),this.mml.hasAttribute(Q.Attribute.TYPE)){const t=n.createElement("mrow");t.setAttribute(Q.Attribute.ADDED,"true"),n.replaceNode(this.mml,t),t.appendChild(this.mml),this.mml=t}return(0,Q.setAttributes)(this.mml,this.semantic),this.mml}}e.CaseBinomial=T},5765:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseDoubleScript=void 0;const n=r(5740),o=r(9268),i=r(5452),Q=r(2298);class T extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){if(!t.mathmlTree||!t.childNodes.length)return!1;const e=n.tagName(t.mathmlTree),r=t.childNodes[0].role;return"MSUBSUP"===e&&"subsup"===r||"MUNDEROVER"===e&&"underover"===r}getMathml(){const t=this.semantic.childNodes[0],e=t.childNodes[0],r=this.semantic.childNodes[1],n=t.childNodes[1],o=i.walkTree(r),T=i.walkTree(e),s=i.walkTree(n);return(0,Q.setAttributes)(this.mml,this.semantic),this.mml.setAttribute(Q.Attribute.CHILDREN,(0,Q.makeIdList)([e,n,r])),[T,s,o].forEach((t=>i.getInnerNode(t).setAttribute(Q.Attribute.PARENT,this.mml.getAttribute(Q.Attribute.ID)))),this.mml.setAttribute(Q.Attribute.TYPE,t.role),i.addCollapsedAttribute(this.mml,[this.semantic.id,[t.id,e.id,n.id],r.id]),this.mml}}e.CaseDoubleScript=T},7251:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseEmbellished=void 0;const n=r(5740),o=r(5952),i=r(9268),Q=r(5765),T=r(7014),s=r(6887),a=r(5452),l=r(2298);class c extends i.AbstractEnrichCase{constructor(t){super(t),this.fenced=null,this.fencedMml=null,this.fencedMmlNodes=[],this.ofence=null,this.ofenceMml=null,this.ofenceMap={},this.cfence=null,this.cfenceMml=null,this.cfenceMap={},this.parentCleanup=[]}static test(t){return!(!t.mathmlTree||!t.fencePointer||t.mathmlTree.getAttribute("data-semantic-type"))}static makeEmptyNode_(t){const e=n.createElement("mrow"),r=new o.SemanticNode(t);return r.type="empty",r.mathmlTree=e,r}static fencedMap_(t,e){e[t.id]=t.mathmlTree,t.embellished&&c.fencedMap_(t.childNodes[0],e)}getMathml(){this.getFenced_(),this.fencedMml=a.walkTree(this.fenced),this.getFencesMml_(),"empty"!==this.fenced.type||this.fencedMml.parentNode||(this.fencedMml.setAttribute(l.Attribute.ADDED,"true"),this.cfenceMml.parentNode.insertBefore(this.fencedMml,this.cfenceMml)),this.getFencedMml_();return this.rewrite_()}fencedElement(t){return"fenced"===t.type||"matrix"===t.type||"vector"===t.type}getFenced_(){let t=this.semantic;for(;!this.fencedElement(t);)t=t.childNodes[0];this.fenced=t.childNodes[0],this.ofence=t.contentNodes[0],this.cfence=t.contentNodes[1],c.fencedMap_(this.ofence,this.ofenceMap),c.fencedMap_(this.cfence,this.cfenceMap)}getFencedMml_(){let t=this.ofenceMml.nextSibling;for(t=t===this.fencedMml?t:this.fencedMml;t&&t!==this.cfenceMml;)this.fencedMmlNodes.push(t),t=t.nextSibling}getFencesMml_(){let t=this.semantic;const e=Object.keys(this.ofenceMap),r=Object.keys(this.cfenceMap);for(;!(this.ofenceMml&&this.cfenceMml||t===this.fenced);)-1===e.indexOf(t.fencePointer)||this.ofenceMml||(this.ofenceMml=t.mathmlTree),-1===r.indexOf(t.fencePointer)||this.cfenceMml||(this.cfenceMml=t.mathmlTree),t=t.childNodes[0];this.ofenceMml||(this.ofenceMml=this.ofence.mathmlTree),this.cfenceMml||(this.cfenceMml=this.cfence.mathmlTree),this.ofenceMml&&(this.ofenceMml=a.ascendNewNode(this.ofenceMml)),this.cfenceMml&&(this.cfenceMml=a.ascendNewNode(this.cfenceMml))}rewrite_(){let t=this.semantic,e=null;const r=this.introduceNewLayer_();for((0,l.setAttributes)(r,this.fenced.parent);!this.fencedElement(t);){const o=t.mathmlTree,i=this.specialCase_(t,o);if(i)t=i;else{(0,l.setAttributes)(o,t);const e=[];for(let r,n=1;r=t.childNodes[n];n++)e.push(a.walkTree(r));t=t.childNodes[0]}const Q=n.createElement("dummy"),T=o.childNodes[0];n.replaceNode(o,Q),n.replaceNode(r,o),n.replaceNode(o.childNodes[0],r),n.replaceNode(Q,T),e||(e=o)}return a.walkTree(this.ofence),a.walkTree(this.cfence),this.cleanupParents_(),e||r}specialCase_(t,e){const r=n.tagName(e);let o,i=null;if("MSUBSUP"===r?(i=t.childNodes[0],o=Q.CaseDoubleScript):"MMULTISCRIPTS"===r&&("superscript"===t.type||"subscript"===t.type?o=T.CaseMultiscripts:"tensor"===t.type&&(o=s.CaseTensor),i=o&&t.childNodes[0]&&"subsup"===t.childNodes[0].role?t.childNodes[0]:t),!i)return null;const a=i.childNodes[0],l=c.makeEmptyNode_(a.id);return i.childNodes[0]=l,e=new o(t).getMathml(),i.childNodes[0]=a,this.parentCleanup.push(e),i.childNodes[0]}introduceNewLayer_(){const t=this.fullFence(this.ofenceMml),e=this.fullFence(this.cfenceMml);let r=n.createElement("mrow");if(n.replaceNode(this.fencedMml,r),this.fencedMmlNodes.forEach((t=>r.appendChild(t))),r.insertBefore(t,this.fencedMml),r.appendChild(e),!r.parentNode){const t=n.createElement("mrow");for(;r.childNodes.length>0;)t.appendChild(r.childNodes[0]);r.appendChild(t),r=t}return r}fullFence(t){const e=this.fencedMml.parentNode;let r=t;for(;r.parentNode&&r.parentNode!==e;)r=r.parentNode;return r}cleanupParents_(){this.parentCleanup.forEach((function(t){const e=t.childNodes[1].getAttribute(l.Attribute.PARENT);t.childNodes[0].setAttribute(l.Attribute.PARENT,e)}))}}e.CaseEmbellished=c},6265:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseLimit=void 0;const n=r(5740),o=r(9268),i=r(5452),Q=r(2298);class T extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){if(!t.mathmlTree||!t.childNodes.length)return!1;const e=n.tagName(t.mathmlTree),r=t.type;return("limupper"===r||"limlower"===r)&&("MSUBSUP"===e||"MUNDEROVER"===e)||"limboth"===r&&("MSUB"===e||"MUNDER"===e||"MSUP"===e||"MOVER"===e)}static walkTree_(t){t&&i.walkTree(t)}getMathml(){const t=this.semantic.childNodes;return"limboth"!==this.semantic.type&&this.mml.childNodes.length>=3&&(this.mml=i.introduceNewLayer([this.mml],this.semantic)),(0,Q.setAttributes)(this.mml,this.semantic),t[0].mathmlTree||(t[0].mathmlTree=this.semantic.mathmlTree),t.forEach(T.walkTree_),this.mml}}e.CaseLimit=T},6514:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseLine=void 0;const n=r(9268),o=r(5452),i=r(2298);class Q extends n.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return!!t.mathmlTree&&"line"===t.type}getMathml(){return this.semantic.contentNodes.length&&o.walkTree(this.semantic.contentNodes[0]),this.semantic.childNodes.length&&o.walkTree(this.semantic.childNodes[0]),(0,i.setAttributes)(this.mml,this.semantic),this.mml}}e.CaseLine=Q},6839:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseMultiindex=void 0;const n=r(5740),o=r(9268),i=r(5452),Q=r(2298);class T extends o.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static multiscriptIndex(t){return"punctuated"===t.type&&"dummy"===t.contentNodes[0].role?i.collapsePunctuated(t):(i.walkTree(t),t.id)}static createNone_(t){const e=n.createElement("none");return t&&(0,Q.setAttributes)(e,t),e.setAttribute(Q.Attribute.ADDED,"true"),e}completeMultiscript(t,e){const r=n.toArray(this.mml.childNodes).slice(1);let o=0;const s=t=>{for(let e,n=0;e=t[n];n++){const t=r[o];if(t&&e===parseInt(i.getInnerNode(t).getAttribute(Q.Attribute.ID)))i.getInnerNode(t).setAttribute(Q.Attribute.PARENT,this.semantic.id.toString()),o++;else{const r=this.semantic.querySelectorAll((t=>t.id===e));this.mml.insertBefore(T.createNone_(r[0]),t||null)}}};s(t),r[o]&&"MPRESCRIPTS"!==n.tagName(r[o])?this.mml.insertBefore(r[o],n.createElement("mprescripts")):o++,s(e)}}e.CaseMultiindex=T},7014:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseMultiscripts=void 0;const n=r(5740),o=r(5656),i=r(6839),Q=r(5452),T=r(2298);class s extends i.CaseMultiindex{static test(t){if(!t.mathmlTree)return!1;return"MMULTISCRIPTS"===n.tagName(t.mathmlTree)&&("superscript"===t.type||"subscript"===t.type)}constructor(t){super(t)}getMathml(){let t,e,r;if((0,T.setAttributes)(this.mml,this.semantic),this.semantic.childNodes[0]&&"subsup"===this.semantic.childNodes[0].role){const n=this.semantic.childNodes[0];t=n.childNodes[0],e=i.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[1]),r=i.CaseMultiindex.multiscriptIndex(n.childNodes[1]);const s=[this.semantic.id,[n.id,t.id,r],e];Q.addCollapsedAttribute(this.mml,s),this.mml.setAttribute(T.Attribute.TYPE,n.role),this.completeMultiscript(o.SemanticSkeleton.interleaveIds(r,e),[])}else{t=this.semantic.childNodes[0],e=i.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[1]);const r=[this.semantic.id,t.id,e];Q.addCollapsedAttribute(this.mml,r)}const n=o.SemanticSkeleton.collapsedLeafs(r||[],e),s=Q.walkTree(t);return Q.getInnerNode(s).setAttribute(T.Attribute.PARENT,this.semantic.id.toString()),n.unshift(t.id),this.mml.setAttribute(T.Attribute.CHILDREN,n.join(",")),this.mml}}e.CaseMultiscripts=s},3416:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseProof=void 0;const n=r(9268),o=r(5452),i=r(2298);class Q extends n.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return!!t.mathmlTree&&("inference"===t.type||"premises"===t.type)}getMathml(){return this.semantic.childNodes.length?(this.semantic.contentNodes.forEach((function(t){o.walkTree(t),(0,i.setAttributes)(t.mathmlTree,t)})),this.semantic.childNodes.forEach((function(t){o.walkTree(t)})),(0,i.setAttributes)(this.mml,this.semantic),this.mml.getAttribute("data-semantic-id")===this.mml.getAttribute("data-semantic-parent")&&this.mml.removeAttribute("data-semantic-parent"),this.mml):this.mml}}e.CaseProof=Q},5699:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseTable=void 0;const n=r(5740),o=r(9268),i=r(5452),Q=r(2298);class T extends o.AbstractEnrichCase{constructor(t){super(t),this.inner=[],this.mml=t.mathmlTree}static test(t){return"matrix"===t.type||"vector"===t.type||"cases"===t.type}getMathml(){const t=i.cloneContentNode(this.semantic.contentNodes[0]),e=this.semantic.contentNodes[1]?i.cloneContentNode(this.semantic.contentNodes[1]):null;if(this.inner=this.semantic.childNodes.map(i.walkTree),this.mml)if("MFENCED"===n.tagName(this.mml)){const r=this.mml.childNodes;this.mml.insertBefore(t,r[0]||null),e&&this.mml.appendChild(e),this.mml=i.rewriteMfenced(this.mml)}else{const r=[t,this.mml];e&&r.push(e),this.mml=i.introduceNewLayer(r,this.semantic)}else this.mml=i.introduceNewLayer([t].concat(this.inner,[e]),this.semantic);return(0,Q.setAttributes)(this.mml,this.semantic),this.mml}}e.CaseTable=T},6887:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseTensor=void 0;const n=r(5656),o=r(6839),i=r(5452),Q=r(2298);class T extends o.CaseMultiindex{static test(t){return!!t.mathmlTree&&"tensor"===t.type}constructor(t){super(t)}getMathml(){i.walkTree(this.semantic.childNodes[0]);const t=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[1]),e=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[2]),r=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[3]),T=o.CaseMultiindex.multiscriptIndex(this.semantic.childNodes[4]);(0,Q.setAttributes)(this.mml,this.semantic);const s=[this.semantic.id,this.semantic.childNodes[0].id,t,e,r,T];i.addCollapsedAttribute(this.mml,s);const a=n.SemanticSkeleton.collapsedLeafs(t,e,r,T);return a.unshift(this.semantic.childNodes[0].id),this.mml.setAttribute(Q.Attribute.CHILDREN,a.join(",")),this.completeMultiscript(n.SemanticSkeleton.interleaveIds(r,T),n.SemanticSkeleton.interleaveIds(t,e)),this.mml}}e.CaseTensor=T},9236:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CaseText=void 0;const n=r(9268),o=r(5452),i=r(2298);class Q extends n.AbstractEnrichCase{constructor(t){super(t),this.mml=t.mathmlTree}static test(t){return"punctuated"===t.type&&("text"===t.role||t.contentNodes.every((t=>"dummy"===t.role)))}getMathml(){const t=[],e=o.collapsePunctuated(this.semantic,t);return this.mml=o.introduceNewLayer(t,this.semantic),(0,i.setAttributes)(this.mml,this.semantic),this.mml.removeAttribute(i.Attribute.CONTENT),o.addCollapsedAttribute(this.mml,e),this.mml}}e.CaseText=Q},5714:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.prepareMmlString=e.testTranslation__=e.semanticMathml=e.semanticMathmlSync=e.semanticMathmlNode=void 0;const n=r(2057),o=r(5740),i=r(5897),Q=r(1414),T=r(5452),s=r(2298);function a(t){const e=o.cloneNode(t),r=Q.getTree(e);return T.enrich(e,r)}function l(t){return a(o.parseInput(t))}function c(t){return t.match(/^$/)||(t+=""),t}r(1513),e.semanticMathmlNode=a,e.semanticMathmlSync=l,e.semanticMathml=function(t,e){i.EnginePromise.getall().then((()=>{const r=o.parseInput(t);e(a(r))}))},e.testTranslation__=function(t){n.Debugger.getInstance().init();const e=l(c(t)).toString();return(0,s.removeAttributePrefix)(e),n.Debugger.getInstance().exit(),e},e.prepareMmlString=c},2298:function(t,e){var r;function n(t){return t.map((function(t){return t.id})).join(",")}function o(t,e){const n=[];"mglyph"===e.role&&n.push("image"),e.attributes.href&&n.push("link"),n.length&&t.setAttribute(r.POSTFIX,n.join(" "))}Object.defineProperty(e,"__esModule",{value:!0}),e.addPrefix=e.removeAttributePrefix=e.setPostfix=e.setAttributes=e.makeIdList=e.EnrichAttributes=e.Attribute=e.Prefix=void 0,e.Prefix="data-semantic-",function(t){t.ADDED="data-semantic-added",t.ALTERNATIVE="data-semantic-alternative",t.CHILDREN="data-semantic-children",t.COLLAPSED="data-semantic-collapsed",t.CONTENT="data-semantic-content",t.EMBELLISHED="data-semantic-embellished",t.FENCEPOINTER="data-semantic-fencepointer",t.FONT="data-semantic-font",t.ID="data-semantic-id",t.ANNOTATION="data-semantic-annotation",t.OPERATOR="data-semantic-operator",t.OWNS="data-semantic-owns",t.PARENT="data-semantic-parent",t.POSTFIX="data-semantic-postfix",t.PREFIX="data-semantic-prefix",t.ROLE="data-semantic-role",t.SPEECH="data-semantic-speech",t.STRUCTURE="data-semantic-structure",t.TYPE="data-semantic-type"}(r=e.Attribute||(e.Attribute={})),e.EnrichAttributes=[r.ADDED,r.ALTERNATIVE,r.CHILDREN,r.COLLAPSED,r.CONTENT,r.EMBELLISHED,r.FENCEPOINTER,r.FONT,r.ID,r.ANNOTATION,r.OPERATOR,r.OWNS,r.PARENT,r.POSTFIX,r.PREFIX,r.ROLE,r.SPEECH,r.STRUCTURE,r.TYPE],e.makeIdList=n,e.setAttributes=function(t,i){t.setAttribute(r.TYPE,i.type);const Q=i.allAttributes();for(let r,n=0;r=Q[n];n++)t.setAttribute(e.Prefix+r[0].toLowerCase(),r[1]);i.childNodes.length&&t.setAttribute(r.CHILDREN,n(i.childNodes)),i.contentNodes.length&&t.setAttribute(r.CONTENT,n(i.contentNodes)),i.parent&&t.setAttribute(r.PARENT,i.parent.id.toString()),o(t,i)},e.setPostfix=o,e.removeAttributePrefix=function(t){return t.toString().replace(new RegExp(e.Prefix,"g"),"")},e.addPrefix=function(t){return e.Prefix+t}},3532:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.factory=e.getCase=void 0,e.getCase=function(t){for(let r,n=0;r=e.factory[n];n++)if(r.test(t))return r.constr(t);return null},e.factory=[]},1513:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(6061),o=r(5765),i=r(7251),Q=r(6265),T=r(6514),s=r(7014),a=r(3416),l=r(5699),c=r(6887),u=r(9236);r(3532).factory.push({test:Q.CaseLimit.test,constr:t=>new Q.CaseLimit(t)},{test:i.CaseEmbellished.test,constr:t=>new i.CaseEmbellished(t)},{test:o.CaseDoubleScript.test,constr:t=>new o.CaseDoubleScript(t)},{test:c.CaseTensor.test,constr:t=>new c.CaseTensor(t)},{test:s.CaseMultiscripts.test,constr:t=>new s.CaseMultiscripts(t)},{test:T.CaseLine.test,constr:t=>new T.CaseLine(t)},{test:n.CaseBinomial.test,constr:t=>new n.CaseBinomial(t)},{test:a.CaseProof.test,constr:t=>new a.CaseProof(t)},{test:l.CaseTable.test,constr:t=>new l.CaseTable(t)},{test:u.CaseText.test,constr:t=>new u.CaseText(t)})},5452:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.printNodeList__=e.collapsePunctuated=e.formattedOutput_=e.formattedOutput=e.getInnerNode=e.setOperatorAttribute_=e.createInvisibleOperator_=e.rewriteMfenced=e.cloneContentNode=e.addCollapsedAttribute=e.parentNode_=e.isIgnorable_=e.unitChild_=e.descendNode_=e.ascendNewNode=e.validLca_=e.pathToRoot_=e.attachedElement_=e.prunePath_=e.mathmlLca_=e.lcaType=e.functionApplication_=e.isDescendant_=e.insertNewChild_=e.mergeChildren_=e.collectChildNodes_=e.collateChildNodes_=e.childrenSubset_=e.moveSemanticAttributes_=e.introduceLayerAboveLca=e.introduceNewLayer=e.walkTree=e.enrich=e.SETTINGS=void 0;const n=r(2057),o=r(5740),i=r(5897),Q=r(3588),T=r(7516),s=r(5656),a=r(4795),l=r(2298),c=r(3532);function u(t){const e=(0,c.getCase)(t);let r;if(e)return r=e.getMathml(),x(r);if(1===t.mathml.length)return n.Debugger.getInstance().output("Walktree Case 0"),r=t.mathml[0],l.setAttributes(r,t),t.childNodes.length&&(n.Debugger.getInstance().output("Walktree Case 0.1"),t.childNodes.forEach((function(t){"empty"===t.type&&r.appendChild(u(t))}))),x(r);const o=t.contentNodes.map(w);k(t,o);const i=t.childNodes.map(u),Q=s.SemanticSkeleton.combineContentChildren(t,o,i);if(r=t.mathmlTree,null===r)n.Debugger.getInstance().output("Walktree Case 1"),r=p(Q,t);else{const t=O(Q);n.Debugger.getInstance().output("Walktree Case 2"),t?(n.Debugger.getInstance().output("Walktree Case 2.1"),r=t.parentNode):(n.Debugger.getInstance().output("Walktree Case 2.2"),r=R(r))}return r=P(r),y(r,Q,t),l.setAttributes(r,t),x(r)}function p(t,e){const r=M(t);let i=r.node;const Q=r.type;if(Q!==v.VALID||!a.hasEmptyTag(i))if(n.Debugger.getInstance().output("Walktree Case 1.1"),i=o.createElement("mrow"),Q===v.PRUNED)n.Debugger.getInstance().output("Walktree Case 1.1.0"),i=h(i,r.node,t);else if(t[0]){n.Debugger.getInstance().output("Walktree Case 1.1.1");const e=O(t),r=f(e.parentNode,t);o.replaceNode(e,i),r.forEach((function(t){i.appendChild(t)}))}return e.mathmlTree||(e.mathmlTree=i),i}function h(t,e,r){let i=E(e);if(a.hasMathTag(i)){n.Debugger.getInstance().output("Walktree Case 1.1.0.0"),d(i,t),o.toArray(i.childNodes).forEach((function(e){t.appendChild(e)}));const e=t;t=i,i=e}const Q=r.indexOf(e);return r[Q]=i,o.replaceNode(i,t),t.appendChild(i),r.forEach((function(e){t.appendChild(e)})),t}function d(t,e){for(const r of l.EnrichAttributes)t.hasAttribute(r)&&(e.setAttribute(r,t.getAttribute(r)),t.removeAttribute(r))}function f(t,e){const r=o.toArray(t.childNodes);let n=1/0,i=-1/0;return e.forEach((function(t){const e=r.indexOf(t);-1!==e&&(n=Math.min(n,e),i=Math.max(i,e))})),r.slice(n,i+1)}function L(t,e,r){const n=[];let i=o.toArray(t.childNodes),Q=!1;for(;i.length;){const t=i.shift();if(t.hasAttribute(l.Attribute.TYPE)){n.push(t);continue}const e=m(t);0!==e.length&&(1!==e.length?(Q?t.setAttribute("AuxiliaryImplicit",!0):Q=!0,i=e.concat(i)):n.push(t))}const T=[],s=r.childNodes.map((function(t){return t.mathmlTree}));for(;s.length;){const t=s.pop();if(t){if(-1!==n.indexOf(t))break;-1!==e.indexOf(t)&&T.unshift(t)}}return n.concat(T)}function m(t){const e=[];let r=o.toArray(t.childNodes);for(;r.length;){const t=r.shift();t.nodeType===o.NodeType.ELEMENT_NODE&&(t.hasAttribute(l.Attribute.TYPE)?e.push(t):r=o.toArray(t.childNodes).concat(r))}return e}function y(t,e,r){const n="implicit"===r.role&&T.flags.combine_juxtaposition?L(t,e,r):o.toArray(t.childNodes);if(!n.length)return void e.forEach((function(e){t.appendChild(e)}));let i=0;for(;e.length;){const r=e[0];n[i]===r||b(n[i],r)?(e.shift(),i++):n[i]&&-1===e.indexOf(n[i])?i++:(H(r,t)||g(t,n[i],r),e.shift())}}function g(t,e,r){if(!e)return void t.insertBefore(r,null);let n=e,o=N(n);for(;o&&o.firstChild===n&&!n.hasAttribute("AuxiliaryImplicit")&&o!==t;)n=o,o=N(n);o&&(o.insertBefore(r,n),n.removeAttribute("AuxiliaryImplicit"))}function H(t,e){if(!t)return!1;do{if((t=t.parentNode)===e)return!0}while(t);return!1}function b(t,e){const r=Q.functionApplication();if(t&&e&&t.textContent&&e.textContent&&t.textContent===r&&e.textContent===r&&"true"===e.getAttribute(l.Attribute.ADDED)){for(let r,n=0;r=t.attributes[n];n++)e.hasAttribute(r.nodeName)||e.setAttribute(r.nodeName,r.nodeValue);return o.replaceNode(t,e),!0}return!1}var v;function M(t){const e=O(t);if(!e)return{type:v.INVALID,node:null};const r=O(t.slice().reverse());if(e===r)return{type:v.VALID,node:e};const n=V(e),o=_(n,t),i=V(r,(function(t){return-1!==o.indexOf(t)})),Q=i[0],T=o.indexOf(Q);return-1===T?{type:v.INVALID,node:null}:{type:o.length!==n.length?v.PRUNED:S(o[T+1],i[1])?v.VALID:v.INVALID,node:Q}}function _(t,e){let r=0;for(;t[r]&&-1===e.indexOf(t[r]);)r++;return t.slice(0,r+1)}function O(t){let e=0,r=null;for(;!r&&e!1),n=[t];for(;!r(t)&&!a.hasMathTag(t)&&t.parentNode;)t=N(t),n.unshift(t);return n}function S(t,e){return!(!t||!e||t.previousSibling||e.nextSibling)}function x(t){for(;!a.hasMathTag(t)&&A(t);)t=N(t);return t}function E(t){const e=o.toArray(t.childNodes);if(!e)return t;const r=e.filter((function(t){return t.nodeType===o.NodeType.ELEMENT_NODE&&!a.hasIgnoreTag(t)}));return 1===r.length&&a.hasEmptyTag(r[0])&&!r[0].hasAttribute(l.Attribute.TYPE)?E(r[0]):t}function A(t){const e=N(t);return!(!e||!a.hasEmptyTag(e))&&o.toArray(e.childNodes).every((function(e){return e===t||C(e)}))}function C(t){if(t.nodeType!==o.NodeType.ELEMENT_NODE)return!0;if(!t||a.hasIgnoreTag(t))return!0;const e=o.toArray(t.childNodes);return!(!a.hasEmptyTag(t)&&e.length||a.hasDisplayTag(t)||t.hasAttribute(l.Attribute.TYPE)||a.isOrphanedGlyph(t))&&o.toArray(t.childNodes).every(C)}function N(t){return t.parentNode}function w(t){if(t.mathml.length)return u(t);const r=e.SETTINGS.implicit?I(t):o.createElement("mrow");return t.mathml=[r],r}function P(t){if("MFENCED"!==o.tagName(t))return t;const e=o.createElement("mrow");for(let r,n=0;r=t.attributes[n];n++)-1===["open","close","separators"].indexOf(r.name)&&e.setAttribute(r.name,r.value);return o.toArray(t.childNodes).forEach((function(t){e.appendChild(t)})),o.replaceNode(t,e),e}function I(t){const e=o.createElement("mo"),r=o.createTextNode(t.textContent);return e.appendChild(r),l.setAttributes(e,t),e.setAttribute(l.Attribute.ADDED,"true"),e}function k(t,e){const r=t.type+(t.textContent?","+t.textContent:"");e.forEach((function(t){R(t).setAttribute(l.Attribute.OPERATOR,r)}))}function R(t){const e=o.toArray(t.childNodes);if(!e)return t;const r=e.filter((function(t){return!C(t)})),n=[];for(let t,e=0;t=r[e];e++)if(a.hasEmptyTag(t)){const e=R(t);e&&e!==t&&n.push(e)}else n.push(t);return 1===n.length?n[0]:t}function j(t,e,r,n){const o=n||!1;D(t,"Original MathML",o),D(r,"Semantic Tree",o),D(e,"Semantically enriched MathML",o)}function D(t,e,r){const n=o.formatXml(t.toString());r?console.info(e+":\n```html\n"+l.removeAttributePrefix(n)+"\n```\n"):console.info(n)}e.SETTINGS={collapsed:!0,implicit:!0},e.enrich=function(t,e){const r=o.cloneNode(t);return u(e.root),i.default.getInstance().structure&&t.setAttribute(l.Attribute.STRUCTURE,s.SemanticSkeleton.fromStructure(t,e).toString()),n.Debugger.getInstance().generateOutput((function(){return j(r,t,e,!0),[]})),t},e.walkTree=u,e.introduceNewLayer=p,e.introduceLayerAboveLca=h,e.moveSemanticAttributes_=d,e.childrenSubset_=f,e.collateChildNodes_=L,e.collectChildNodes_=m,e.mergeChildren_=y,e.insertNewChild_=g,e.isDescendant_=H,e.functionApplication_=b,function(t){t.VALID="valid",t.INVALID="invalid",t.PRUNED="pruned"}(v=e.lcaType||(e.lcaType={})),e.mathmlLca_=M,e.prunePath_=_,e.attachedElement_=O,e.pathToRoot_=V,e.validLca_=S,e.ascendNewNode=x,e.descendNode_=E,e.unitChild_=A,e.isIgnorable_=C,e.parentNode_=N,e.addCollapsedAttribute=function(t,e){const r=new s.SemanticSkeleton(e);t.setAttribute(l.Attribute.COLLAPSED,r.toString())},e.cloneContentNode=w,e.rewriteMfenced=P,e.createInvisibleOperator_=I,e.setOperatorAttribute_=k,e.getInnerNode=R,e.formattedOutput=j,e.formattedOutput_=D,e.collapsePunctuated=function(t,e){const r=!!e,n=e||[],o=t.parent,i=t.contentNodes.map((function(t){return t.id}));i.unshift("c");const Q=[t.id,i];for(let e,i=0;e=t.childNodes[i];i++){const t=u(e);n.push(t);const i=R(t);o&&!r&&i.setAttribute(l.Attribute.PARENT,o.id.toString()),Q.push(e.id)}return Q},e.printNodeList__=function(t,e){console.info(t),o.toArray(e).forEach((function(t){console.info(t.toString())})),console.info("<<<<<<<<<<<<<<<<<")}},5105:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractHighlighter=void 0;const n=r(5274),o=r(2298);class i{constructor(){this.color=null,this.mactionName="",this.currentHighlights=[]}highlight(t){this.currentHighlights.push(t.map((t=>{const e=this.highlightNode(t);return this.setHighlighted(t),e})))}highlightAll(t){const e=this.getMactionNodes(t);for(let t,r=0;t=e[r];r++)this.highlight([t])}unhighlight(){const t=this.currentHighlights.pop();t&&t.forEach((t=>{this.isHighlighted(t.node)&&(this.unhighlightNode(t),this.unsetHighlighted(t.node))}))}unhighlightAll(){for(;this.currentHighlights.length>0;)this.unhighlight()}setColor(t){this.color=t}colorString(){return this.color.rgba()}addEvents(t,e){const r=this.getMactionNodes(t);for(let t,n=0;t=r[n];n++)for(const r in e)t.addEventListener(r,e[r])}getMactionNodes(t){return Array.from(t.getElementsByClassName(this.mactionName))}isMactionNode(t){const e=t.className||t.getAttribute("class");return!!e&&!!e.match(new RegExp(this.mactionName))}isHighlighted(t){return t.hasAttribute(i.ATTR)}setHighlighted(t){t.setAttribute(i.ATTR,"true")}unsetHighlighted(t){t.removeAttribute(i.ATTR)}colorizeAll(t){n.evalXPath(`.//*[@${o.Attribute.ID}]`,t).forEach((t=>this.colorize(t)))}uncolorizeAll(t){n.evalXPath(`.//*[@${o.Attribute.ID}]`,t).forEach((t=>this.uncolorize(t)))}colorize(t){const e=(0,o.addPrefix)("foreground");t.hasAttribute(e)&&(t.setAttribute(e+"-old",t.style.color),t.style.color=t.getAttribute(e))}uncolorize(t){const e=(0,o.addPrefix)("foreground")+"-old";t.hasAttribute(e)&&(t.style.color=t.getAttribute(e))}}e.AbstractHighlighter=i,i.ATTR="sre-highlight"},6937:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ChtmlHighlighter=void 0;const n=r(933);class o extends n.CssHighlighter{constructor(){super()}isMactionNode(t){return t.tagName.toUpperCase()===this.mactionName.toUpperCase()}getMactionNodes(t){return Array.from(t.getElementsByTagName(this.mactionName))}}e.ChtmlHighlighter=o},8396:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.ContrastPicker=e.ColorPicker=void 0;const r={red:{red:255,green:0,blue:0},green:{red:0,green:255,blue:0},blue:{red:0,green:0,blue:255},yellow:{red:255,green:255,blue:0},cyan:{red:0,green:255,blue:255},magenta:{red:255,green:0,blue:255},white:{red:255,green:255,blue:255},black:{red:0,green:0,blue:0}};function n(t,e){const n=t||{color:e};let o=Object.prototype.hasOwnProperty.call(n,"color")?r[n.color]:n;return o||(o=r[e]),o.alpha=Object.prototype.hasOwnProperty.call(n,"alpha")?n.alpha:1,function(t){const e=t=>(t=Math.max(t,0),t=Math.min(255,t),Math.round(t));return t.red=e(t.red),t.green=e(t.green),t.blue=e(t.blue),t.alpha=Math.max(t.alpha,0),t.alpha=Math.min(1,t.alpha),t}(o)}class o{constructor(t,e){this.foreground=n(e,o.DEFAULT_FOREGROUND_),this.background=n(t,o.DEFAULT_BACKGROUND_)}static toHex(t){const e=t.toString(16);return 1===e.length?"0"+e:e}rgba(){const t=function(t){return"rgba("+t.red+","+t.green+","+t.blue+","+t.alpha+")"};return{background:t(this.background),foreground:t(this.foreground)}}rgb(){const t=function(t){return"rgb("+t.red+","+t.green+","+t.blue+")"};return{background:t(this.background),alphaback:this.background.alpha.toString(),foreground:t(this.foreground),alphafore:this.foreground.alpha.toString()}}hex(){const t=function(t){return"#"+o.toHex(t.red)+o.toHex(t.green)+o.toHex(t.blue)};return{background:t(this.background),alphaback:this.background.alpha.toString(),foreground:t(this.foreground),alphafore:this.foreground.alpha.toString()}}}e.ColorPicker=o,o.DEFAULT_BACKGROUND_="blue",o.DEFAULT_FOREGROUND_="black";e.ContrastPicker=class{constructor(){this.hue=10,this.sat=100,this.light=50,this.incr=50}generate(){return e=function(t,e,r){e=e>1?e/100:e,r=r>1?r/100:r;const n=(1-Math.abs(2*r-1))*e,o=n*(1-Math.abs(t/60%2-1)),i=r-n/2;let Q=0,T=0,s=0;return 0<=t&&t<60?[Q,T,s]=[n,o,0]:60<=t&&t<120?[Q,T,s]=[o,n,0]:120<=t&&t<180?[Q,T,s]=[0,n,o]:180<=t&&t<240?[Q,T,s]=[0,o,n]:240<=t&&t<300?[Q,T,s]=[o,0,n]:300<=t&&t<360&&([Q,T,s]=[n,0,o]),{red:Q+i,green:T+i,blue:s+i}}(this.hue,this.sat,this.light),"rgb("+(t={red:Math.round(255*e.red),green:Math.round(255*e.green),blue:Math.round(255*e.blue)}).red+","+t.green+","+t.blue+")";var t,e}increment(){this.hue=(this.hue+this.incr)%360}}},933:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.CssHighlighter=void 0;const n=r(5105);class o extends n.AbstractHighlighter{constructor(){super(),this.mactionName="mjx-maction"}highlightNode(t){const e={node:t,background:t.style.backgroundColor,foreground:t.style.color},r=this.colorString();return t.style.backgroundColor=r.background,t.style.color=r.foreground,e}unhighlightNode(t){t.node.style.backgroundColor=t.background,t.node.style.color=t.foreground}}e.CssHighlighter=o},3090:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.highlighterMapping_=e.addEvents=e.highlighter=void 0;const n=r(6937),o=r(8396),i=r(933),Q=r(2598),T=r(4500),s=r(7071),a=r(4346),l=r(2222);e.highlighter=function(t,r,n){const i=new o.ColorPicker(t,r),Q="NativeMML"===n.renderer&&"Safari"===n.browser?"MML-CSS":"SVG"===n.renderer&&"v3"===n.browser?"SVG-V3":n.renderer,T=new(e.highlighterMapping_[Q]||e.highlighterMapping_.NativeMML);return T.setColor(i),T},e.addEvents=function(t,r,n){const o=e.highlighterMapping_[n.renderer];o&&(new o).addEvents(t,r)},e.highlighterMapping_={SVG:a.SvgHighlighter,"SVG-V3":l.SvgV3Highlighter,NativeMML:s.MmlHighlighter,"HTML-CSS":Q.HtmlHighlighter,"MML-CSS":T.MmlCssHighlighter,CommonHTML:i.CssHighlighter,CHTML:n.ChtmlHighlighter}},2598:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.HtmlHighlighter=void 0;const n=r(5740),o=r(5105);class i extends o.AbstractHighlighter{constructor(){super(),this.mactionName="maction"}highlightNode(t){const e={node:t,foreground:t.style.color,position:t.style.position},r=this.color.rgb();t.style.color=r.foreground,t.style.position="relative";const o=t.bbox;if(o&&o.w){const i=.05,Q=0,T=n.createElement("span"),s=parseFloat(t.style.paddingLeft||"0");T.style.backgroundColor=r.background,T.style.opacity=r.alphaback.toString(),T.style.display="inline-block",T.style.height=o.h+o.d+2*i+"em",T.style.verticalAlign=-o.d+"em",T.style.marginTop=T.style.marginBottom=-i+"em",T.style.width=o.w+2*Q+"em",T.style.marginLeft=s-Q+"em",T.style.marginRight=-o.w-Q-s+"em",t.parentNode.insertBefore(T,t),e.box=T}return e}unhighlightNode(t){const e=t.node;e.style.color=t.foreground,e.style.position=t.position,t.box&&t.box.parentNode.removeChild(t.box)}}e.HtmlHighlighter=i},4500:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlCssHighlighter=void 0;const n=r(933);class o extends n.CssHighlighter{constructor(){super(),this.mactionName="maction"}getMactionNodes(t){return Array.from(t.getElementsByTagName(this.mactionName))}isMactionNode(t){return t.tagName===this.mactionName}}e.MmlCssHighlighter=o},7071:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MmlHighlighter=void 0;const n=r(5105);class o extends n.AbstractHighlighter{constructor(){super(),this.mactionName="maction"}highlightNode(t){let e=t.getAttribute("style");return e+=";background-color: "+this.colorString().background,e+=";color: "+this.colorString().foreground,t.setAttribute("style",e),{node:t}}unhighlightNode(t){let e=t.node.getAttribute("style");e=e.replace(";background-color: "+this.colorString().background,""),e=e.replace(";color: "+this.colorString().foreground,""),t.node.setAttribute("style",e)}colorString(){return this.color.rgba()}getMactionNodes(t){return Array.from(t.getElementsByTagName(this.mactionName))}isMactionNode(t){return t.tagName===this.mactionName}}e.MmlHighlighter=o},4346:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SvgHighlighter=void 0;const n=r(5740),o=r(5105);class i extends o.AbstractHighlighter{constructor(){super(),this.mactionName="mjx-svg-maction"}highlightNode(t){let e;if(this.isHighlighted(t))return e={node:t.previousSibling||t,background:t.style.backgroundColor,foreground:t.style.color},e;if("svg"===t.tagName){const e={node:t,background:t.style.backgroundColor,foreground:t.style.color};return t.style.backgroundColor=this.colorString().background,t.style.color=this.colorString().foreground,e}const r=n.createElementNS("http://www.w3.org/2000/svg","rect");let i;if("use"===t.nodeName){const e=n.createElementNS("http://www.w3.org/2000/svg","g");t.parentNode.insertBefore(e,t),e.appendChild(t),i=e.getBBox(),e.parentNode.replaceChild(t,e)}else i=t.getBBox();r.setAttribute("x",(i.x-40).toString()),r.setAttribute("y",(i.y-40).toString()),r.setAttribute("width",(i.width+80).toString()),r.setAttribute("height",(i.height+80).toString());const Q=t.getAttribute("transform");return Q&&r.setAttribute("transform",Q),r.setAttribute("fill",this.colorString().background),r.setAttribute(o.AbstractHighlighter.ATTR,"true"),t.parentNode.insertBefore(r,t),e={node:r,foreground:t.getAttribute("fill")},t.setAttribute("fill",this.colorString().foreground),e}setHighlighted(t){"svg"===t.tagName&&super.setHighlighted(t)}unhighlightNode(t){if("background"in t)return t.node.style.backgroundColor=t.background,void(t.node.style.color=t.foreground);t.foreground?t.node.nextSibling.setAttribute("fill",t.foreground):t.node.nextSibling.removeAttribute("fill"),t.node.parentNode.removeChild(t.node)}isMactionNode(t){let e=t.className||t.getAttribute("class");return e=void 0!==e.baseVal?e.baseVal:e,!!e&&!!e.match(new RegExp(this.mactionName))}}e.SvgHighlighter=i},2222:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SvgV3Highlighter=void 0;const n=r(5740),o=r(5274),i=r(5105),Q=r(8396),T=r(4346);class s extends T.SvgHighlighter{constructor(){super(),this.mactionName="maction"}highlightNode(t){let e;if(this.isHighlighted(t))return e={node:t,background:this.colorString().background,foreground:this.colorString().foreground},e;if("svg"===t.tagName||"MJX-CONTAINER"===t.tagName)return e={node:t,background:t.style.backgroundColor,foreground:t.style.color},t.style.backgroundColor=this.colorString().background,t.style.color=this.colorString().foreground,e;const r=n.createElementNS("http://www.w3.org/2000/svg","rect");r.setAttribute("sre-highlighter-added","true");const o=t.getBBox();r.setAttribute("x",(o.x-40).toString()),r.setAttribute("y",(o.y-40).toString()),r.setAttribute("width",(o.width+80).toString()),r.setAttribute("height",(o.height+80).toString());const T=t.getAttribute("transform");if(T&&r.setAttribute("transform",T),r.setAttribute("fill",this.colorString().background),t.setAttribute(i.AbstractHighlighter.ATTR,"true"),t.parentNode.insertBefore(r,t),e={node:t,foreground:t.getAttribute("fill")},"rect"===t.nodeName){const e=new Q.ColorPicker({alpha:0,color:"black"});t.setAttribute("fill",e.rgba().foreground)}else t.setAttribute("fill",this.colorString().foreground);return e}unhighlightNode(t){const e=t.node.previousSibling;if(e&&e.hasAttribute("sre-highlighter-added"))return t.foreground?t.node.setAttribute("fill",t.foreground):t.node.removeAttribute("fill"),void t.node.parentNode.removeChild(e);t.node.style.backgroundColor=t.background,t.node.style.color=t.foreground}isMactionNode(t){return t.getAttribute("data-mml-node")===this.mactionName}getMactionNodes(t){return Array.from(o.evalXPath(`.//*[@data-mml-node="${this.mactionName}"]`,t))}}e.SvgV3Highlighter=s},7222:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.StaticTrieNode=e.AbstractTrieNode=void 0;const n=r(2057),o=r(4391);class i{constructor(t,e){this.constraint=t,this.test=e,this.children_={},this.kind=o.TrieNodeKind.ROOT}getConstraint(){return this.constraint}getKind(){return this.kind}applyTest(t){return this.test(t)}addChild(t){const e=t.getConstraint(),r=this.children_[e];return this.children_[e]=t,r}getChild(t){return this.children_[t]}getChildren(){const t=[];for(const e in this.children_)t.push(this.children_[e]);return t}findChildren(t){const e=[];for(const r in this.children_){const n=this.children_[r];n.applyTest(t)&&e.push(n)}return e}removeChild(t){delete this.children_[t]}toString(){return this.constraint}}e.AbstractTrieNode=i;e.StaticTrieNode=class extends i{constructor(t,e){super(t,e),this.rule_=null,this.kind=o.TrieNodeKind.STATIC}getRule(){return this.rule_}setRule(t){this.rule_&&n.Debugger.getInstance().output("Replacing rule "+this.rule_+" with "+t),this.rule_=t}toString(){return this.getRule()?this.constraint+"\n==> "+this.getRule().action:this.constraint}}},4508:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Trie=void 0;const n=r(4391),o=r(9701);class i{constructor(){this.root=(0,o.getNode)(n.TrieNodeKind.ROOT,"",null)}static collectRules_(t){const e=[];let r=[t];for(;r.length;){const t=r.shift();if(t.getKind()===n.TrieNodeKind.QUERY||t.getKind()===n.TrieNodeKind.BOOLEAN){const r=t.getRule();r&&e.unshift(r)}r=r.concat(t.getChildren())}return e}static printWithDepth_(t,e,r){r+=new Array(e+2).join(e.toString())+": "+t.toString()+"\n";const n=t.getChildren();for(let t,o=0;t=n[o];o++)r=i.printWithDepth_(t,e+1,r);return r}static order_(t){const e=t.getChildren();if(!e.length)return 0;const r=Math.max.apply(null,e.map(i.order_));return Math.max(e.length,r)}addRule(t){let e=this.root;const r=t.context,o=t.dynamicCstr.getValues();for(let t=0,i=o.length;t{e.getKind()===n.TrieNodeKind.DYNAMIC&&-1===t.indexOf(e.getConstraint())||o.push(e)}))}r=o.slice()}for(;r.length;){const e=r.shift();if(e.getRule){const t=e.getRule();t&&o.push(t)}const n=e.findChildren(t);r=r.concat(n)}return o}hasSubtrie(t){let e=this.root;for(let r=0,n=t.length;r!0)),this.kind=a.TrieNodeKind.ROOT}}e.RootTrieNode=l;class c extends T.AbstractTrieNode{constructor(t){super(t,(e=>e===t)),this.kind=a.TrieNodeKind.DYNAMIC}}e.DynamicTrieNode=c;const u={"=":(t,e)=>t===e,"!=":(t,e)=>t!==e,"<":(t,e)=>t":(t,e)=>t>e,"<=":(t,e)=>t<=e,">=":(t,e)=>t>=e};function p(t){if(t.match(/^self::\*$/))return t=>!0;if(t.match(/^self::\w+$/)){const e=t.slice(6).toUpperCase();return t=>t.tagName&&n.tagName(t)===e}if(t.match(/^self::\w+:\w+$/)){const e=t.split(":"),r=o.resolveNameSpace(e[2]);if(!r)return null;const n=e[3].toUpperCase();return t=>t.localName&&t.localName.toUpperCase()===n&&t.namespaceURI===r}if(t.match(/^@\w+$/)){const e=t.slice(1);return t=>t.hasAttribute&&t.hasAttribute(e)}if(t.match(/^@\w+="[\w\d ]+"$/)){const e=t.split("="),r=e[0].slice(1),n=e[1].slice(1,-1);return t=>t.hasAttribute&&t.hasAttribute(r)&&t.getAttribute(r)===n}if(t.match(/^@\w+!="[\w\d ]+"$/)){const e=t.split("!="),r=e[0].slice(1),n=e[1].slice(1,-1);return t=>!t.hasAttribute||!t.hasAttribute(r)||t.getAttribute(r)!==n}if(t.match(/^contains\(\s*@grammar\s*,\s*"[\w\d ]+"\s*\)$/)){const e=t.split('"')[1];return t=>!!i.Grammar.getInstance().getParameter(e)}if(t.match(/^not\(\s*contains\(\s*@grammar\s*,\s*"[\w\d ]+"\s*\)\s*\)$/)){const e=t.split('"')[1];return t=>!i.Grammar.getInstance().getParameter(e)}if(t.match(/^name\(\.\.\/\.\.\)="\w+"$/)){const e=t.split('"')[1].toUpperCase();return t=>{var r,o;return(null===(o=null===(r=t.parentNode)||void 0===r?void 0:r.parentNode)||void 0===o?void 0:o.tagName)&&n.tagName(t.parentNode.parentNode)===e}}if(t.match(/^count\(preceding-sibling::\*\)=\d+$/)){const e=t.split("="),r=parseInt(e[1],10);return t=>{var e;return(null===(e=t.parentNode)||void 0===e?void 0:e.childNodes[r])===t}}if(t.match(/^.+\[@category!?=".+"\]$/)){let[,e,r,n]=t.match(/^(.+)\[@category(!?=)"(.+)"\]$/);const i=n.match(/^unit:(.+)$/);let T="";return i&&(n=i[1],T=":unit"),t=>{const i=o.evalXPath(e,t)[0];if(i){const t=Q.lookupCategory(i.textContent+T);return"="===r?t===n:t!==n}return!1}}if(t.match(/^string-length\(.+\)\W+\d+/)){const[,e,r,n]=t.match(/^string-length\((.+)\)(\W+)(\d+)/),i=u[r]||u["="],Q=parseInt(n,10);return t=>{const r=o.evalXPath(e,t)[0];return!!r&&i(Array.from(r.textContent).length,Q)}}return null}e.constraintTest_=p;class h extends s.StaticTrieNode{constructor(t,e){super(t,p(t)),this.context=e,this.kind=a.TrieNodeKind.QUERY}applyTest(t){return this.test?this.test(t):this.context.applyQuery(t,this.constraint)===t}}e.QueryTrieNode=h;class d extends s.StaticTrieNode{constructor(t,e){super(t,p(t)),this.context=e,this.kind=a.TrieNodeKind.BOOLEAN}applyTest(t){return this.test?this.test(t):this.context.applyConstraint(t,this.constraint)}}e.BooleanTrieNode=d},7491:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.completeLocale=e.getLocale=e.setLocale=e.locales=void 0;const n=r(5897),o=r(1377),i=r(2105),Q=r(4249),T=r(8657),s=r(173),a=r(9393),l=r(7978),c=r(5540),u=r(5218),p=r(3887),h=r(8384),d=r(7206),f=r(7734),L=r(7264),m=r(4356);function y(){const t=o.Variables.ensureLocale(n.default.getInstance().locale,n.default.getInstance().defaultLocale);return n.default.getInstance().locale=t,e.locales[t]()}e.locales={ca:Q.ca,da:T.da,de:s.de,en:a.en,es:l.es,fr:c.fr,hi:u.hi,it:p.it,nb:h.nb,nn:f.nn,sv:L.sv,nemeth:d.nemeth},e.setLocale=function(){const t=y();if(function(t){const e=n.default.getInstance().subiso;-1===t.SUBISO.all.indexOf(e)&&(n.default.getInstance().subiso=t.SUBISO.default);t.SUBISO.current=n.default.getInstance().subiso}(t),t){for(const e of Object.getOwnPropertyNames(t))m.LOCALE[e]=t[e];for(const[e,r]of Object.entries(t.CORRECTIONS))i.Grammar.getInstance().setCorrection(e,r)}},e.getLocale=y,e.completeLocale=function(t){const r=e.locales[t.locale];if(!r)return void console.error("Locale "+t.locale+" does not exist!");const n=t.kind.toUpperCase(),o=t.messages;if(!o)return;const i=r();for(const[t,e]of Object.entries(o))i[n][t]=e}},4356:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.createLocale=e.LOCALE=void 0;const n=r(7549);function o(){return{FUNCTIONS:(0,n.FUNCTIONS)(),MESSAGES:(0,n.MESSAGES)(),ALPHABETS:(0,n.ALPHABETS)(),NUMBERS:(0,n.NUMBERS)(),COMBINERS:{},CORRECTIONS:{},SUBISO:(0,n.SUBISO)()}}e.LOCALE=o(),e.createLocale=o},2536:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.localeFontCombiner=e.extractString=e.localEnclose=e.localRole=e.localFont=e.combinePostfixIndex=e.nestingToString=void 0;const n=r(4356),o=r(4977);function i(t,e){return void 0===t?e:"string"==typeof t?t:t[0]}e.nestingToString=function(t){switch(t){case 1:return n.LOCALE.MESSAGES.MS.ONCE||"";case 2:return n.LOCALE.MESSAGES.MS.TWICE;default:return t.toString()}},e.combinePostfixIndex=function(t,e){return t===n.LOCALE.MESSAGES.MS.ROOTINDEX||t===n.LOCALE.MESSAGES.MS.INDEX?t:t+" "+e},e.localFont=function(t){return i(n.LOCALE.MESSAGES.font[t],t)},e.localRole=function(t){return i(n.LOCALE.MESSAGES.role[t],t)},e.localEnclose=function(t){return i(n.LOCALE.MESSAGES.enclose[t],t)},e.extractString=i,e.localeFontCombiner=function(t){return"string"==typeof t?{font:t,combiner:n.LOCALE.ALPHABETS.combiner}:{font:t[0],combiner:n.LOCALE.COMBINERS[t[1]]||o.Combiners[t[1]]||n.LOCALE.ALPHABETS.combiner}}},4249:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ca=void 0;const n=r(4356),o=r(2536),i=r(614),Q=r(4977),T=function(t,e,r){return t="sans serif "+(r?r+" "+t:t),e?t+" "+e:t};let s=null;e.ca=function(){return s||(s=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.COMBINERS.sansserif=T,t.FUNCTIONS.fracNestDepth=t=>!1,t.FUNCTIONS.combineRootIndex=o.combinePostfixIndex,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>t+r,t.FUNCTIONS.fontRegexp=t=>RegExp("^"+t+" "),t.FUNCTIONS.plural=t=>/.*os$/.test(t)?t+"sos":/.*s$/.test(t)?t+"os":/.*ga$/.test(t)?t.slice(0,-2)+"gues":/.*\xe7a$/.test(t)?t.slice(0,-2)+"ces":/.*ca$/.test(t)?t.slice(0,-2)+"ques":/.*ja$/.test(t)?t.slice(0,-2)+"ges":/.*qua$/.test(t)?t.slice(0,-3)+"q\xfces":/.*a$/.test(t)?t.slice(0,-1)+"es":/.*(e|i)$/.test(t)?t+"ns":/.*\xed$/.test(t)?t.slice(0,-1)+"ins":t+"s",t.FUNCTIONS.si=(t,e)=>(e.match(/^metre/)&&(t=t.replace(/a$/,"\xe0").replace(/o$/,"\xf2").replace(/i$/,"\xed")),t+e),t.ALPHABETS.combiner=Q.Combiners.prefixCombiner,t}()),s}},8657:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.da=void 0;const n=r(4356),o=r(2536),i=r(3866),Q=r(4977);let T=null;e.da=function(){return T||(T=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t.FUNCTIONS.fontRegexp=e=>e===t.ALPHABETS.capPrefix.default?RegExp("^"+e+" "):RegExp(" "+e+"$"),t.ALPHABETS.combiner=Q.Combiners.postfixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t}()),T}},173:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.de=void 0;const n=r(2105),o=r(2536),i=r(4356),Q=r(1435),T=function(t,e,r){return"s"===r&&(e=e.split(" ").map((function(t){return t.replace(/s$/,"")})).join(" "),r=""),t=r?r+" "+t:t,e?e+" "+t:t},s=function(t,e,r){return t=r&&"s"!==r?r+" "+t:t,e?t+" "+e:t};let a=null;e.de=function(){return a||(a=function(){const t=(0,i.createLocale)();return t.NUMBERS=Q.default,t.COMBINERS.germanPostfix=s,t.ALPHABETS.combiner=T,t.FUNCTIONS.radicalNestDepth=e=>e>1?t.NUMBERS.numberToWords(e)+"fach":"",t.FUNCTIONS.combineRootIndex=(t,e)=>{const r=e?e+"wurzel":"";return t.replace("Wurzel",r)},t.FUNCTIONS.combineNestedRadical=(t,e,r)=>{const n=(e?e+" ":"")+(t=r.match(/exponent$/)?t+"r":t);return r.match(/ /)?r.replace(/ /," "+n+" "):n+" "+r},t.FUNCTIONS.fontRegexp=function(t){return t=t.split(" ").map((function(t){return t.replace(/s$/,"(|s)")})).join(" "),new RegExp("((^"+t+" )|( "+t+"$))")},t.CORRECTIONS.correctOne=t=>t.replace(/^eins$/,"ein"),t.CORRECTIONS.localFontNumber=t=>(0,o.localFont)(t).split(" ").map((function(t){return t.replace(/s$/,"")})).join(" "),t.CORRECTIONS.lowercase=t=>t.toLowerCase(),t.CORRECTIONS.article=t=>{const e=n.Grammar.getInstance().getParameter("case"),r=n.Grammar.getInstance().getParameter("plural");return"dative"===e?{der:"dem",die:r?"den":"der",das:"dem"}[t]:t},t.CORRECTIONS.masculine=t=>"dative"===n.Grammar.getInstance().getParameter("case")?t+"n":t,t}()),a}},9393:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.en=void 0;const n=r(2105),o=r(4356),i=r(2536),Q=r(310),T=r(4977);let s=null;e.en=function(){return s||(s=function(){const t=(0,o.createLocale)();return t.NUMBERS=Q.default,t.FUNCTIONS.radicalNestDepth=i.nestingToString,t.FUNCTIONS.plural=t=>/.*s$/.test(t)?t:t+"s",t.ALPHABETS.combiner=T.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=Q.default.numberToWords,t.CORRECTIONS.article=t=>n.Grammar.getInstance().getParameter("noArticle")?"":t,t}()),s}},7978:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.es=void 0;const n=r(4356),o=r(2536),i=r(4634),Q=r(4977),T=function(t,e,r){return t="sans serif "+(r?r+" "+t:t),e?t+" "+e:t};let s=null;e.es=function(){return s||(s=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.COMBINERS.sansserif=T,t.FUNCTIONS.fracNestDepth=t=>!1,t.FUNCTIONS.combineRootIndex=o.combinePostfixIndex,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>t+r,t.FUNCTIONS.fontRegexp=t=>RegExp("^"+t+" "),t.FUNCTIONS.plural=t=>/.*(a|e|i|o|u)$/.test(t)?t+"s":/.*z$/.test(t)?t.slice(0,-1)+"ces":/.*c$/.test(t)?t.slice(0,-1)+"ques":/.*g$/.test(t)?t+"ues":/.*\u00f3n$/.test(t)?t.slice(0,-2)+"ones":t+"es",t.FUNCTIONS.si=(t,e)=>(e.match(/^metro/)&&(t=t.replace(/a$/,"\xe1").replace(/o$/,"\xf3").replace(/i$/,"\xed")),t+e),t.ALPHABETS.combiner=Q.Combiners.prefixCombiner,t}()),s}},5540:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.fr=void 0;const n=r(2105),o=r(4356),i=r(2536),Q=r(2350),T=r(4977);let s=null;e.fr=function(){return s||(s=function(){const t=(0,o.createLocale)();return t.NUMBERS=Q.default,t.FUNCTIONS.radicalNestDepth=i.nestingToString,t.FUNCTIONS.combineRootIndex=i.combinePostfixIndex,t.FUNCTIONS.combineNestedFraction=(t,e,r)=>r.replace(/ $/g,"")+e+t,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>r+" "+t,t.FUNCTIONS.fontRegexp=t=>RegExp(" (en |)"+t+"$"),t.FUNCTIONS.plural=t=>/.*s$/.test(t)?t:t+"s",t.CORRECTIONS.article=t=>n.Grammar.getInstance().getParameter("noArticle")?"":t,t.ALPHABETS.combiner=T.Combiners.romanceCombiner,t.SUBISO={default:"fr",current:"fr",all:["fr","be","ch"]},t}()),s}},5218:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.hi=void 0;const n=r(4356),o=r(4438),i=r(4977),Q=r(2536);let T=null;e.hi=function(){return T||(T=function(){const t=(0,n.createLocale)();return t.NUMBERS=o.default,t.ALPHABETS.combiner=i.Combiners.prefixCombiner,t.FUNCTIONS.radicalNestDepth=Q.nestingToString,t}()),T}},3887:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.it=void 0;const n=r(2536),o=r(4356),i=r(8825),Q=r(4977),T=function(t,e,r){return t.match(/^[a-zA-Z]$/)&&(e=e.replace("cerchiato","cerchiata")),t=r?t+" "+r:t,e?t+" "+e:t};let s=null;e.it=function(){return s||(s=function(){const t=(0,o.createLocale)();return t.NUMBERS=i.default,t.COMBINERS.italianPostfix=T,t.FUNCTIONS.radicalNestDepth=n.nestingToString,t.FUNCTIONS.combineRootIndex=n.combinePostfixIndex,t.FUNCTIONS.combineNestedFraction=(t,e,r)=>r.replace(/ $/g,"")+e+t,t.FUNCTIONS.combineNestedRadical=(t,e,r)=>r+" "+t,t.FUNCTIONS.fontRegexp=t=>RegExp(" (en |)"+t+"$"),t.ALPHABETS.combiner=Q.Combiners.romanceCombiner,t}()),s}},8384:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.nb=void 0;const n=r(4356),o=r(2536),i=r(8274),Q=r(4977);let T=null;e.nb=function(){return T||(T=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.ALPHABETS.combiner=Q.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t}()),T}},7206:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.nemeth=void 0;const n=r(4356),o=r(3720),i=r(4977),Q=function(t){return t.match(RegExp("^"+u.ALPHABETS.languagePrefix.english))?t.slice(1):t},T=function(t,e,r){return t=Q(t),e?t+e:t},s=function(t,e,r){return e+Q(t)},a=function(t,e,r){return e+(r||"")+(t=Q(t))+"\u283b"},l=function(t,e,r){return e+(r||"")+(t=Q(t))+"\u283b\u283b"},c=function(t,e,r){return e+(t=Q(t))+"\u283e"};let u=null;e.nemeth=function(){return u||(u=function(){const t=(0,n.createLocale)();return t.NUMBERS=o.default,t.COMBINERS={postfixCombiner:T,germanCombiner:s,embellishCombiner:a,doubleEmbellishCombiner:l,parensCombiner:c},t.FUNCTIONS.fracNestDepth=t=>!1,t.FUNCTIONS.fontRegexp=t=>RegExp("^"+t),t.FUNCTIONS.si=i.identityTransformer,t.ALPHABETS.combiner=(t,e,r)=>e?e+r+t:Q(t),t.ALPHABETS.digitTrans={default:o.default.numberToWords},t}()),u}},7734:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.nn=void 0;const n=r(4356),o=r(2536),i=r(8274),Q=r(4977);let T=null;e.nn=function(){return T||(T=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.ALPHABETS.combiner=Q.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t.SUBISO={default:"",current:"",all:["","alt"]},t}()),T}},7264:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.sv=void 0;const n=r(4356),o=r(2536),i=r(3898),Q=r(4977);let T=null;e.sv=function(){return T||(T=function(){const t=(0,n.createLocale)();return t.NUMBERS=i.default,t.FUNCTIONS.radicalNestDepth=o.nestingToString,t.FUNCTIONS.fontRegexp=function(t){return new RegExp("((^"+t+" )|( "+t+"$))")},t.ALPHABETS.combiner=Q.Combiners.prefixCombiner,t.ALPHABETS.digitTrans.default=i.default.numberToWords,t.CORRECTIONS.correctOne=t=>t.replace(/^ett$/,"en"),t}()),T}},7549:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SUBISO=e.FUNCTIONS=e.ALPHABETS=e.NUMBERS=e.MESSAGES=void 0;const n=r(4977);e.MESSAGES=function(){return{MS:{},MSroots:{},font:{},embellish:{},role:{},enclose:{},navigate:{},regexp:{},unitTimes:""}},e.NUMBERS=function(){return{zero:"zero",ones:[],tens:[],large:[],special:{},wordOrdinal:n.identityTransformer,numericOrdinal:n.identityTransformer,numberToWords:n.identityTransformer,numberToOrdinal:n.pluralCase,vulgarSep:" ",numSep:" "}},e.ALPHABETS=function(){return{latinSmall:[],latinCap:[],greekSmall:[],greekCap:[],capPrefix:{default:""},smallPrefix:{default:""},digitPrefix:{default:""},languagePrefix:{},digitTrans:{default:n.identityTransformer,mathspeak:n.identityTransformer,clearspeak:n.identityTransformer},letterTrans:{default:n.identityTransformer},combiner:(t,e,r)=>t}},e.FUNCTIONS=function(){return{fracNestDepth:t=>n.vulgarFractionSmall(t,10,100),radicalNestDepth:t=>"",combineRootIndex:function(t,e){return t},combineNestedFraction:n.Combiners.identityCombiner,combineNestedRadical:n.Combiners.identityCombiner,fontRegexp:function(t){return new RegExp("^"+t.split(/ |-/).join("( |-)")+"( |-)")},si:n.siCombiner,plural:n.identityTransformer}},e.SUBISO=function(){return{default:"",current:"",all:[]}}},614:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){const e=t%1e3,r=Math.floor(e/100),n=r?1===r?"cent":T.ones[r]+"-cents":"",o=function(t){const e=t%100;if(e<20)return T.ones[e];const r=Math.floor(e/10),n=T.tens[r],o=T.ones[e%10];return n&&o?n+(2===r?"-i-":"-")+o:n||o}(e%100);return n&&o?n+T.numSep+o:n||o}function i(t){if(0===t)return T.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){const n=t%(e>1?1e6:1e3);if(n){let t=T.large[e];if(e)if(1===e)r=(1===n?"":o(n)+T.numSep)+t+(r?T.numSep+r:"");else{const e=i(n);t=1===n?t:t.replace(/\u00f3$/,"ons"),r=e+T.numSep+t+(r?T.numSep+r:"")}else r=o(n)}t=Math.floor(t/(e>1?1e6:1e3)),e++}return r}function Q(t){const e=n.Grammar.getInstance().getParameter("gender");return t.toString()+("f"===e?"a":"n")}const T=(0,r(7549).NUMBERS)();T.numericOrdinal=Q,T.numberToWords=i,T.numberToOrdinal=function(t,e){if(t>1999)return Q(t);if(t<=10)return T.special.onesOrdinals[t-1];const r=i(t);return r.match(/mil$/)?r.replace(/mil$/,"mil\xb7l\xe8sima"):r.match(/u$/)?r.replace(/u$/,"vena"):r.match(/a$/)?r.replace(/a$/,"ena"):r+(r.match(/e$/)?"na":"ena")},e.default=T},3866:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t,e=!1){return t===T.ones[1]?e?"et":"en":t}function o(t,e=!1){let r=t%1e3,o="",i=T.ones[Math.floor(r/100)];if(o+=i?n(i,!0)+" hundrede":"",r%=100,r)if(o+=o?" og ":"",i=e?T.special.smallOrdinals[r]:T.ones[r],i)o+=i;else{const t=e?T.special.tensOrdinals[Math.floor(r/10)]:T.tens[Math.floor(r/10)];i=T.ones[r%10],o+=i?n(i)+"og"+t:t}return o}function i(t,e=!1){if(0===t)return T.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,i="";for(;t>0;){const Q=t%1e3;if(Q){const t=o(Q,e&&!r);if(r){const e=T.large[r],o=Q>1?"er":"";i=n(t,r<=1)+" "+e+o+(i?" og ":"")+i}else i=n(t)+i}t=Math.floor(t/1e3),r++}return i}function Q(t){if(t%100)return i(t,!0);const e=i(t);return e.match(/e$/)?e:e+"e"}const T=(0,r(7549).NUMBERS)();T.wordOrdinal=Q,T.numericOrdinal=function(t){return t.toString()+"."},T.numberToWords=i,T.numberToOrdinal=function(t,e){return 1===t?e?"hel":"hele":2===t?e?"halv":"halve":Q(t)+(e?"dele":"del")},e.default=T},1435:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t,e=!1){return t===T.ones[1]?e?"eine":"ein":t}function o(t){let e=t%1e3,r="",o=T.ones[Math.floor(e/100)];if(r+=o?n(o)+"hundert":"",e%=100,e)if(r+=r?T.numSep:"",o=T.ones[e],o)r+=o;else{const t=T.tens[Math.floor(e/10)];o=T.ones[e%10],r+=o?n(o)+"und"+t:t}return r}function i(t){if(0===t)return T.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){const i=t%1e3;if(i){const Q=o(t%1e3);if(e){const t=T.large[e],o=e>1&&i>1?t.match(/e$/)?"n":"en":"";r=n(Q,e>1)+t+o+r}else r=n(Q,e>1)+r}t=Math.floor(t/1e3),e++}return r.replace(/ein$/,"eins")}function Q(t){if(1===t)return"erste";if(3===t)return"dritte";if(7===t)return"siebte";if(8===t)return"achte";return i(t)+(t<19?"te":"ste")}const T=(0,r(7549).NUMBERS)();T.wordOrdinal=Q,T.numericOrdinal=function(t){return t.toString()+"."},T.numberToWords=i,T.numberToOrdinal=function(t,e){return 1===t?"eintel":2===t?e?"halbe":"halb":Q(t)+"l"},e.default=T},310:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t){let e=t%1e3,r="";return r+=Q.ones[Math.floor(e/100)]?Q.ones[Math.floor(e/100)]+Q.numSep+"hundred":"",e%=100,e&&(r+=r?Q.numSep:"",r+=Q.ones[e]||Q.tens[Math.floor(e/10)]+(e%10?Q.numSep+Q.ones[e%10]:"")),r}function o(t){if(0===t)return Q.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){t%1e3&&(r=n(t%1e3)+(e?"-"+Q.large[e]+"-":"")+r),t=Math.floor(t/1e3),e++}return r.replace(/-$/,"")}function i(t){let e=o(t);return e.match(/one$/)?e=e.slice(0,-3)+"first":e.match(/two$/)?e=e.slice(0,-3)+"second":e.match(/three$/)?e=e.slice(0,-5)+"third":e.match(/five$/)?e=e.slice(0,-4)+"fifth":e.match(/eight$/)?e=e.slice(0,-5)+"eighth":e.match(/nine$/)?e=e.slice(0,-4)+"ninth":e.match(/twelve$/)?e=e.slice(0,-6)+"twelfth":e.match(/ty$/)?e=e.slice(0,-2)+"tieth":e+="th",e}const Q=(0,r(7549).NUMBERS)();Q.wordOrdinal=i,Q.numericOrdinal=function(t){const e=t%100,r=t.toString();if(e>10&&e<20)return r+"th";switch(t%10){case 1:return r+"st";case 2:return r+"nd";case 3:return r+"rd";default:return r+"th"}},Q.numberToWords=o,Q.numberToOrdinal=function(t,e){if(1===t)return e?"oneths":"oneth";if(2===t)return e?"halves":"half";const r=i(t);return e?r+"s":r},e.default=Q},4634:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){const e=t%1e3,r=Math.floor(e/100),n=i.special.hundreds[r],o=function(t){const e=t%100;if(e<30)return i.ones[e];const r=i.tens[Math.floor(e/10)],n=i.ones[e%10];return r&&n?r+" y "+n:r||n}(e%100);return 1===r?o?n+"to "+o:n:n&&o?n+" "+o:n||o}const i=(0,r(7549).NUMBERS)();i.numericOrdinal=function(t){const e=n.Grammar.getInstance().getParameter("gender");return t.toString()+("f"===e?"a":"o")},i.numberToWords=function(t){if(0===t)return i.zero;if(t>=Math.pow(10,36))return t.toString();let e=0,r="";for(;t>0;){const n=t%1e3;if(n){let t=i.large[e];const Q=o(n);e?1===n?(t=t.match("/^mil( |$)/")?t:"un "+t,r=t+(r?" "+r:"")):(t=t.replace(/\u00f3n$/,"ones"),r=o(n)+" "+t+(r?" "+r:"")):r=Q}t=Math.floor(t/1e3),e++}return r},i.numberToOrdinal=function(t,e){if(t>1999)return t.toString()+"a";if(t<=12)return i.special.onesOrdinals[t-1];const r=[];if(t>=1e3&&(t-=1e3,r.push("mil\xe9sima")),!t)return r.join(" ");let n=0;return n=Math.floor(t/100),n>0&&(r.push(i.special.hundredsOrdinals[n-1]),t%=100),t<=12?r.push(i.special.onesOrdinals[t-1]):(n=Math.floor(t/10),n>0&&(r.push(i.special.tensOrdinals[n-1]),t%=10),t>0&&r.push(i.special.onesOrdinals[t-1])),r.join(" ")},e.default=i},2350:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(5897),o=r(2105),i=r(7549);function Q(t){let e=t%1e3,r="";if(r+=l.ones[Math.floor(e/100)]?l.ones[Math.floor(e/100)]+"-cent":"",e%=100,e){r+=r?"-":"";let t=l.ones[e];if(t)r+=t;else{const n=l.tens[Math.floor(e/10)];n.match(/-dix$/)?(t=l.ones[e%10+10],r+=n.replace(/-dix$/,"")+"-"+t):r+=n+(e%10?"-"+l.ones[e%10]:"")}}const n=r.match(/s-\w+$/);return n?r.replace(/s-\w+$/,n[0].slice(1)):r.replace(/-un$/,"-et-un")}function T(t){if(0===t)return l.zero;if(t>=Math.pow(10,36))return t.toString();l.special["tens-"+n.default.getInstance().subiso]&&(l.tens=l.special["tens-"+n.default.getInstance().subiso]);let e=0,r="";for(;t>0;){const n=t%1e3;if(n){let t=l.large[e];const o=Q(n);if(t&&t.match(/^mille /)){const n=t.replace(/^mille /,"");r=r.match(RegExp(n))?o+(e?"-mille-":"")+r:r.match(RegExp(n.replace(/s$/,"")))?o+(e?"-mille-":"")+r.replace(n.replace(/s$/,""),n):o+(e?"-"+t+"-":"")+r}else t=1===n&&t?t.replace(/s$/,""):t,r=o+(e?"-"+t+"-":"")+r}t=Math.floor(t/1e3),e++}return r.replace(/-$/,"")}const s={1:"uni\xe8me",2:"demi",3:"tiers",4:"quart"};function a(t){if(1===t)return"premi\xe8re";let e=T(t);return e.match(/^neuf$/)?e=e.slice(0,-1)+"v":e.match(/cinq$/)?e+="u":e.match(/trois$/)?e+="":(e.match(/e$/)||e.match(/s$/))&&(e=e.slice(0,-1)),e+="i\xe8me",e}const l=(0,i.NUMBERS)();l.wordOrdinal=a,l.numericOrdinal=function(t){const e=o.Grammar.getInstance().getParameter("gender");return 1===t?t.toString()+("m"===e?"er":"re"):t.toString()+"e"},l.numberToWords=T,l.numberToOrdinal=function(t,e){const r=s[t]||a(t);return 3===t?r:e?r+"s":r},e.default=l},4438:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){if(0===t)return Q.zero;if(t>=Math.pow(10,32))return t.toString();let e=0,r="";const n=function(t){let e=t%1e3,r="";return r+=Q.ones[Math.floor(e/100)]?Q.ones[Math.floor(e/100)]+Q.numSep+Q.special.hundred:"",e%=100,e&&(r+=r?Q.numSep:"",r+=Q.ones[e]),r}(t%1e3);if(!(t=Math.floor(t/1e3)))return n;for(;t>0;){const n=t%100;n&&(r=Q.ones[n]+Q.numSep+Q.large[e]+(r?Q.numSep+r:"")),t=Math.floor(t/100),e++}return n?r+Q.numSep+n:r}function i(t){const e=n.Grammar.getInstance().getParameter("gender");if(t<=0)return t.toString();if(t<10)return"f"===e?Q.special.ordinalsFeminine[t]:Q.special.ordinalsMasculine[t];return o(t)+("f"===e?"\u0935\u0940\u0902":"\u0935\u093e\u0901")}const Q=(0,r(7549).NUMBERS)();Q.wordOrdinal=i,Q.numericOrdinal=function(t){const e=n.Grammar.getInstance().getParameter("gender");return t>0&&t<10?"f"===e?Q.special.simpleSmallOrdinalsFeminine[t]:Q.special.simpleSmallOrdinalsMasculine[t]:t.toString().split("").map((function(t){const e=parseInt(t,10);return isNaN(e)?"":Q.special.simpleNumbers[e]})).join("")+("f"===e?"\u0935\u0940\u0902":"\u0935\u093e\u0901")},Q.numberToWords=o,Q.numberToOrdinal=function(t,e){return t<=10?Q.special.smallDenominators[t]:i(t)+" \u0905\u0902\u0936"},e.default=Q},8825:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2105);function o(t){let e=t%1e3,r="";if(r+=T.ones[Math.floor(e/100)]?T.ones[Math.floor(e/100)]+T.numSep+"cento":"",e%=100,e){r+=r?T.numSep:"";const t=T.ones[e];if(t)r+=t;else{let t=T.tens[Math.floor(e/10)];const n=e%10;1!==n&&8!==n||(t=t.slice(0,-1)),r+=t,r+=n?T.numSep+T.ones[e%10]:""}}return r}function i(t){if(0===t)return T.zero;if(t>=Math.pow(10,36))return t.toString();if(1===t&&n.Grammar.getInstance().getParameter("fraction"))return"un";let e=0,r="";for(;t>0;){t%1e3&&(r=o(t%1e3)+(e?"-"+T.large[e]+"-":"")+r),t=Math.floor(t/1e3),e++}return r.replace(/-$/,"")}function Q(t){const e="m"===n.Grammar.getInstance().getParameter("gender")?"o":"a";let r=T.special.onesOrdinals[t];return r?r.slice(0,-1)+e:(r=i(t),r.slice(0,-1)+"esim"+e)}const T=(0,r(7549).NUMBERS)();T.wordOrdinal=Q,T.numericOrdinal=function(t){const e=n.Grammar.getInstance().getParameter("gender");return t.toString()+("m"===e?"o":"a")},T.numberToWords=i,T.numberToOrdinal=function(t,e){if(2===t)return e?"mezzi":"mezzo";const r=Q(t);if(!e)return r;const n=r.match(/o$/)?"i":"e";return r.slice(0,-1)+n},e.default=T},3720:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t){return t.toString().split("").map((function(t){return o.ones[parseInt(t,10)]})).join("")}const o=(0,r(7549).NUMBERS)();o.numberToWords=n,o.numberToOrdinal=n,e.default=o},8274:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(5897);function o(t,e=!1){let r=t%1e3,n="";const o=Math.floor(r/100),Q=T.ones[o];if(n+=Q?(1===o?"":Q)+"hundre":"",r%=100,r){if(n+=n?"og":"",e){const t=T.special.smallOrdinals[r];if(t)return n+t;if(r%10)return n+T.tens[Math.floor(r/10)]+T.special.smallOrdinals[r%10]}n+=T.ones[r]||T.tens[Math.floor(r/10)]+(r%10?T.ones[r%10]:"")}return e?i(n):n}function i(t){const e=T.special.endOrdinal[0];return"a"===e&&t.match(/en$/)?t.slice(0,-2)+T.special.endOrdinal:t.match(/(d|n)$/)||t.match(/hundre$/)?t+"de":t.match(/i$/)?t+T.special.endOrdinal:"a"===e&&t.match(/e$/)?t.slice(0,-1)+T.special.endOrdinal:(t.match(/e$/),t+"nde")}function Q(t){return l(t,!0)}const T=(0,r(7549).NUMBERS)();function s(t,e=!1){return t===T.ones[1]?"ein"===t?"eitt ":e?"et":"ett":t}function a(t,e=!1){let r=t%1e3,n="",o=T.ones[Math.floor(r/100)];if(n+=o?s(o)+"hundre":"",r%=100,r){if(n+=n?"og":"",e){const t=T.special.smallOrdinals[r];if(t)return n+t}if(o=T.ones[r],o)n+=o;else{const t=T.tens[Math.floor(r/10)];o=T.ones[r%10],n+=o?o+"og"+t:t}}return e?i(n):n}function l(t,e=!1){const r="alt"===n.default.getInstance().subiso?function(t,e=!1){if(0===t)return e?T.special.smallOrdinals[0]:T.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,n="";for(;t>0;){const o=t%1e3;if(o){const i=a(t%1e3,!r&&e);!r&&e&&(e=!e),n=(1===r?s(i,!0):i)+(r>1?T.numSep:"")+(r?T.large[r]+(r>1&&o>1?"er":""):"")+(r>1&&n?T.numSep:"")+n}t=Math.floor(t/1e3),r++}return e?n+(n.match(/tusen$/)?"de":"te"):n}(t,e):function(t,e=!1){if(0===t)return e?T.special.smallOrdinals[0]:T.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,n="";for(;t>0;){const i=t%1e3;if(i){const Q=o(t%1e3,!r&&e);!r&&e&&(e=!e),n=Q+(r?" "+T.large[r]+(r>1&&i>1?"er":"")+(n?" ":""):"")+n}t=Math.floor(t/1e3),r++}return e?n+(n.match(/tusen$/)?"de":"te"):n}(t,e);return r}T.wordOrdinal=Q,T.numericOrdinal=function(t){return t.toString()+"."},T.numberToWords=l,T.numberToOrdinal=function(t,e){return Q(t)},e.default=T},3898:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});function n(t){let e=t%1e3,r="";const n=Math.floor(e/100);return r+=Q.ones[n]?(1===n?"":Q.ones[n]+Q.numSep)+"hundra":"",e%=100,e&&(r+=r?Q.numSep:"",r+=Q.ones[e]||Q.tens[Math.floor(e/10)]+(e%10?Q.numSep+Q.ones[e%10]:"")),r}function o(t,e=!1){if(0===t)return Q.zero;if(t>=Math.pow(10,36))return t.toString();let r=0,o="";for(;t>0;){const i=t%1e3;if(i){const T=Q.large[r],s=i>1&&r>1&&!e?"er":"";o=(1===r&&1===i?"":(r>1&&1===i?"en":n(t%1e3))+(r>1?" ":""))+(r?T+s+(r>1?" ":""):"")+o}t=Math.floor(t/1e3),r++}return o.replace(/ $/,"")}function i(t){let e=o(t,!0);return e.match(/^noll$/)?e="nollte":e.match(/ett$/)?e=e.replace(/ett$/,"f\xf6rsta"):e.match(/tv\xe5$/)?e=e.replace(/tv\xe5$/,"andra"):e.match(/tre$/)?e=e.replace(/tre$/,"tredje"):e.match(/fyra$/)?e=e.replace(/fyra$/,"fj\xe4rde"):e.match(/fem$/)?e=e.replace(/fem$/,"femte"):e.match(/sex$/)?e=e.replace(/sex$/,"sj\xe4tte"):e.match(/sju$/)?e=e.replace(/sju$/,"sjunde"):e.match(/\xe5tta$/)?e=e.replace(/\xe5tta$/,"\xe5ttonde"):e.match(/nio$/)?e=e.replace(/nio$/,"nionde"):e.match(/tio$/)?e=e.replace(/tio$/,"tionde"):e.match(/elva$/)?e=e.replace(/elva$/,"elfte"):e.match(/tolv$/)?e=e.replace(/tolv$/,"tolfte"):e.match(/tusen$/)?e=e.replace(/tusen$/,"tusonde"):e.match(/jard$/)||e.match(/jon$/)?e+="te":e+="de",e}const Q=(0,r(7549).NUMBERS)();Q.wordOrdinal=i,Q.numericOrdinal=function(t){const e=t.toString();return e.match(/11$|12$/)?e+":e":e+(e.match(/1$|2$/)?":a":":e")},Q.numberToWords=o,Q.numberToOrdinal=function(t,e){if(1===t)return"hel";if(2===t)return e?"halva":"halv";let r=i(t);return r=r.match(/de$/)?r.replace(/de$/,""):r,r+(e?"delar":"del")},e.default=Q},4977:function(t,e){function r(t,e=""){if(!t.childNodes||!t.childNodes[0]||!t.childNodes[0].childNodes||t.childNodes[0].childNodes.length<2||"number"!==t.childNodes[0].childNodes[0].tagName||"integer"!==t.childNodes[0].childNodes[0].getAttribute("role")||"number"!==t.childNodes[0].childNodes[1].tagName||"integer"!==t.childNodes[0].childNodes[1].getAttribute("role"))return{convertible:!1,content:t.textContent};const r=t.childNodes[0].childNodes[1].textContent,n=t.childNodes[0].childNodes[0].textContent,o=Number(r),i=Number(n);return isNaN(o)||isNaN(i)?{convertible:!1,content:`${n} ${e} ${r}`}:{convertible:!0,enumerator:i,denominator:o}}Object.defineProperty(e,"__esModule",{value:!0}),e.vulgarFractionSmall=e.convertVulgarFraction=e.Combiners=e.siCombiner=e.identityTransformer=e.pluralCase=void 0,e.pluralCase=function(t,e){return t.toString()},e.identityTransformer=function(t){return t.toString()},e.siCombiner=function(t,e){return t+e.toLowerCase()},e.Combiners={},e.Combiners.identityCombiner=function(t,e,r){return t+e+r},e.Combiners.prefixCombiner=function(t,e,r){return t=r?r+" "+t:t,e?e+" "+t:t},e.Combiners.postfixCombiner=function(t,e,r){return t=r?r+" "+t:t,e?t+" "+e:t},e.Combiners.romanceCombiner=function(t,e,r){return t=r?t+" "+r:t,e?t+" "+e:t},e.convertVulgarFraction=r,e.vulgarFractionSmall=function(t,e,n){const o=r(t);if(o.convertible){const t=o.enumerator,r=o.denominator;return t>0&&t0&&r{const Q=this.parseCstr(e.toString().replace(o,""));this.addRule(new i.SpeechRule(t,Q,n,r))}))}getFullPreconditions(t){const e=this.preconditions.get(t);return e||!this.inherits?e:this.inherits.getFullPreconditions(t)}definePrecondition(t,e,r,...n){const o=this.parsePrecondition(r,n),i=this.parseCstr(e);o&&i?(o.rank=this.rank++,this.preconditions.set(t,new s(i,o))):console.error(`Precondition Error: ${r}, (${e})`)}inheritRules(){if(!this.inherits||!this.inherits.getSpeechRules().length)return;const t=new RegExp("^\\w+\\.\\w+\\."+(this.domain?"\\w+\\.":""));this.inherits.getSpeechRules().forEach((e=>{const r=this.parseCstr(e.dynamicCstr.toString().replace(t,""));this.addRule(new i.SpeechRule(e.name,r,e.precondition,e.action))}))}ignoreRules(t,...e){let r=this.findAllRules((e=>e.name===t));if(!e.length)return void r.forEach(this.deleteRule.bind(this));let n=[];for(const t of e){const e=this.parseCstr(t);for(const t of r)e.equal(t.dynamicCstr)?this.deleteRule(t):n.push(t);r=n,n=[]}}parsePrecondition_(t){const e=this.context.customGenerators.lookup(t);return e?e():[t]}}e.BaseRuleStore=T;class s{constructor(t,e){this.base=t,this._conditions=[],this.constraints=[],this.allCstr={},this.constraints.push(t),this.addCondition(t,e)}get conditions(){return this._conditions}addConstraint(t){if(this.constraints.filter((e=>e.equal(t))).length)return;this.constraints.push(t);const e=[];for(const[r,n]of this.conditions)this.base.equal(r)&&e.push([t,n]);this._conditions=this._conditions.concat(e)}addBaseCondition(t){this.addCondition(this.base,t)}addFullCondition(t){this.constraints.forEach((e=>this.addCondition(e,t)))}addCondition(t,e){const r=t.toString()+" "+e.toString();this.allCstr.condStr||(this.allCstr[r]=!0,this._conditions.push([t,e]))}}e.Condition=s},2469:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.BrailleStore=void 0;const n=r(7630),o=r(9935);class i extends o.MathStore{constructor(){super(...arguments),this.modality="braille",this.customTranscriptions={"\u22ca":"\u2808\u2821\u2833"}}evaluateString(t){const e=[],r=Array.from(t);for(let t=0;tt.push(this.getProperty(e).slice()))),t}toString(){const t=[];return this.order.forEach((e=>t.push(e+": "+this.getProperty(e).toString()))),t.join("\n")}}e.DynamicProperties=n;class o extends n{constructor(t,e){const r={};for(const[e,n]of Object.entries(t))r[e]=[n];super(r,e),this.components=t}static createCstr(...t){const e=o.DEFAULT_ORDER,r={};for(let n=0,o=t.length,i=e.length;n{const r=e.indexOf(t);return-1!==r&&e.splice(r,1)}))}getComponents(){return this.components}getValue(t){return this.components[t]}getValues(){return this.order.map((t=>this.getValue(t)))}allProperties(){const t=super.allProperties();for(let e,r,n=0;e=t[n],r=this.order[n];n++){const t=this.getValue(r);-1===e.indexOf(t)&&e.unshift(t)}return t}toString(){return this.getValues().join(".")}equal(t){const e=t.getAxes();if(this.order.length!==e.length)return!1;for(let r,n=0;r=e[n];n++){const e=this.getValue(r);if(!e||t.getValue(r)!==e)return!1}return!0}}e.DynamicCstr=o,o.DEFAULT_ORDER=[r.LOCALE,r.MODALITY,r.DOMAIN,r.STYLE,r.TOPIC],o.BASE_LOCALE="base",o.DEFAULT_VALUE="default",o.DEFAULT_VALUES={[r.LOCALE]:"en",[r.DOMAIN]:o.DEFAULT_VALUE,[r.STYLE]:o.DEFAULT_VALUE,[r.TOPIC]:o.DEFAULT_VALUE,[r.MODALITY]:"speech"};e.DynamicCstrParser=class{constructor(t){this.order=t}parse(t){const e=t.split("."),r={};if(e.length>this.order.length)throw new Error("Invalid dynamic constraint: "+r);let n=0;for(let t,o=0;t=this.order[o],e.length;o++,n++){const n=e.shift();r[t]=n}return new o(r,this.order.slice(0,n))}};e.DefaultComparator=class{constructor(t,e=new n(t.getProperties(),t.getOrder())){this.reference=t,this.fallback=e,this.order=this.reference.getOrder()}getReference(){return this.reference}setReference(t,e){this.reference=t,this.fallback=e||new n(t.getProperties(),t.getOrder()),this.order=this.reference.getOrder()}match(t){const e=t.getAxes();return e.length===this.reference.getAxes().length&&e.every((e=>{const r=t.getValue(e);return r===this.reference.getValue(e)||-1!==this.fallback.getProperty(e).indexOf(r)}))}compare(t,e){let r=!1;for(let n,o=0;n=this.order[o];o++){const o=t.getValue(n),i=e.getValue(n);if(!r){const t=this.reference.getValue(n);if(t===o&&t!==i)return-1;if(t===i&&t!==o)return 1;if(t===o&&t===i)continue;t!==o&&t!==i&&(r=!0)}const Q=this.fallback.getProperty(n),T=Q.indexOf(o),s=Q.indexOf(i);if(T!u.equal(t.cstr))),s.push(d),this.rules.set(e,s),p.setReference(h)}lookupRule(t,e){let r=this.getRules(e.getValue(o.Axis.LOCALE));return r=r.filter((function(t){return i.testDynamicConstraints_(e,t)})),1===r.length?r[0]:r.length?r.sort(((t,e)=>n.default.getInstance().comparator.compare(t.cstr,e.cstr)))[0]:null}}e.MathSimpleStore=i},9935:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MathStore=void 0;const n=r(707),o=r(4356),i=r(7630),Q=r(4504),T=r(4650);class s extends Q.BaseRuleStore{constructor(){super(),this.annotators=[],this.parseMethods.Alias=this.defineAlias,this.parseMethods.SpecializedRule=this.defineSpecializedRule,this.parseMethods.Specialized=this.defineSpecialized}initialize(){this.initialized||(this.annotations(),this.initialized=!0)}annotations(){for(let t,e=0;t=this.annotators[e];e++)(0,i.activate)(this.domain,t)}defineAlias(t,e,...r){const n=this.parsePrecondition(e,r);if(!n)return void console.error(`Precondition Error: ${e} ${r}`);const o=this.preconditions.get(t);o?o.addFullCondition(n):console.error(`Alias Error: No precondition by the name of ${t}`)}defineRulesAlias(t,e,...r){const n=this.findAllRules((function(e){return e.name===t}));if(0===n.length)throw new T.OutputError("Rule with name "+t+" does not exist.");const o=[];n.forEach((t=>{(t=>{const e=t.dynamicCstr.toString(),r=t.action.toString();for(let t,n=0;t=o[n];n++)if(t.action===r&&t.cstr===e)return!1;return o.push({cstr:e,action:r}),!0})(t)&&this.addAlias_(t,e,r)}))}defineSpecializedRule(t,e,r,n){const o=this.parseCstr(e),i=this.findRule((e=>e.name===t&&o.equal(e.dynamicCstr))),Q=this.parseCstr(r);if(!i&&n)throw new T.OutputError("Rule named "+t+" with style "+e+" does not exist.");const s=n?T.Action.fromString(n):i.action,a=new T.SpeechRule(i.name,Q,i.precondition,s);this.addRule(a)}defineSpecialized(t,e,r){const n=this.parseCstr(r);if(!n)return void console.error(`Dynamic Constraint Error: ${r}`);const o=this.preconditions.get(t);o?o.addConstraint(n):console.error(`Alias Error: No precondition by the name of ${t}`)}evaluateString(t){const e=[];if(t.match(/^\s+$/))return e;let r=this.matchNumber_(t);if(r&&r.length===t.length)return e.push(this.evaluateCharacter(r.number)),e;const i=n.removeEmpty(t.replace(/\s/g," ").split(" "));for(let t,n=0;t=i[n];n++)if(1===t.length)e.push(this.evaluateCharacter(t));else if(t.match(new RegExp("^["+o.LOCALE.MESSAGES.regexp.TEXT+"]+$")))e.push(this.evaluateCharacter(t));else{let n=t;for(;n;){r=this.matchNumber_(n);const t=n.match(new RegExp("^["+o.LOCALE.MESSAGES.regexp.TEXT+"]+"));if(r)e.push(this.evaluateCharacter(r.number)),n=n.substring(r.length);else if(t)e.push(this.evaluateCharacter(t[0])),n=n.substring(t[0].length);else{const t=Array.from(n),r=t[0];e.push(this.evaluateCharacter(r)),n=t.slice(1).join("")}}}return e}parse(t){super.parse(t),this.annotators=t.annotators||[]}addAlias_(t,e,r){const n=this.parsePrecondition(e,r),o=new T.SpeechRule(t.name,t.dynamicCstr,n,t.action);o.name=t.name,this.addRule(o)}matchNumber_(t){const e=t.match(new RegExp("^"+o.LOCALE.MESSAGES.regexp.NUMBER)),r=t.match(new RegExp("^"+s.regexp.NUMBER));if(!e&&!r)return null;const n=r&&r[0]===t;if(e&&e[0]===t||!n)return e?{number:e[0],length:e[0].length}:null;return{number:r[0].replace(new RegExp(s.regexp.DIGIT_GROUP,"g"),"X").replace(new RegExp(s.regexp.DECIMAL_MARK,"g"),o.LOCALE.MESSAGES.regexp.DECIMAL_MARK).replace(/X/g,o.LOCALE.MESSAGES.regexp.DIGIT_GROUP.replace(/\\/g,"")),length:r[0].length}}}e.MathStore=s,s.regexp={NUMBER:"((\\d{1,3})(?=(,| ))((,| )\\d{3})*(\\.\\d+)?)|^\\d*\\.\\d+|^\\d+",DECIMAL_MARK:"\\.",DIGIT_GROUP:","}},4650:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.OutputError=e.Precondition=e.Action=e.Component=e.ActionType=e.SpeechRule=void 0;const n=r(5897),o=r(2105);var i;function Q(t){switch(t){case"[n]":return i.NODE;case"[m]":return i.MULTI;case"[t]":return i.TEXT;case"[p]":return i.PERSONALITY;default:throw"Parse error: "+t}}e.SpeechRule=class{constructor(t,e,r,n){this.name=t,this.dynamicCstr=e,this.precondition=r,this.action=n,this.context=null}toString(){return this.name+" | "+this.dynamicCstr.toString()+" | "+this.precondition.toString()+" ==> "+this.action.toString()}},function(t){t.NODE="NODE",t.MULTI="MULTI",t.TEXT="TEXT",t.PERSONALITY="PERSONALITY"}(i=e.ActionType||(e.ActionType={}));class T{constructor({type:t,content:e,attributes:r,grammar:n}){this.type=t,this.content=e,this.attributes=r,this.grammar=n}static grammarFromString(t){return o.Grammar.parseInput(t)}static fromString(t){const e={type:Q(t.substring(0,3))};let r=t.slice(3).trim();if(!r)throw new l("Missing content.");switch(e.type){case i.TEXT:if('"'===r[0]){const t=c(r,"\\(")[0].trim();if('"'!==t.slice(-1))throw new l("Invalid string syntax.");e.content=t,r=r.slice(t.length).trim(),-1===r.indexOf("(")&&(r="");break}case i.NODE:case i.MULTI:{const t=r.indexOf(" (");if(-1===t){e.content=r.trim(),r="";break}e.content=r.substring(0,t).trim(),r=r.slice(t).trim()}}if(r){const t=T.attributesFromString(r);t.grammar&&(e.grammar=t.grammar,delete t.grammar),Object.keys(t).length&&(e.attributes=t)}return new T(e)}static attributesFromString(t){if("("!==t[0]||")"!==t.slice(-1))throw new l("Invalid attribute expression: "+t);const e={},r=c(t.slice(1,-1),",");for(let t=0,n=r.length;t0?"("+t.join(", ")+")":""}getAttributes(){const t=[];for(const e in this.attributes){const r=this.attributes[e];"true"===r?t.push(e):t.push(e+":"+r)}return t}}e.Component=T;class s{constructor(t){this.components=t}static fromString(t){const e=c(t,";").filter((function(t){return t.match(/\S/)})).map((function(t){return t.trim()})),r=[];for(let t=0,n=e.length;t0?r[0]:null}applyConstraint(t,e){return!!this.applyQuery(t,e)||n.evaluateBoolean(e,t)}constructString(t,e){if(!e)return"";if('"'===e.charAt(0))return e.slice(1,-1);const r=this.customStrings.lookup(e);return r?r(t):n.evaluateString(e,t)}parse(t){const e=Array.isArray(t)?t:Object.entries(t);for(let t,r=0;t=e[r];r++){switch(t[0].slice(0,3)){case"CQF":this.customQueries.add(t[0],t[1]);break;case"CSF":this.customStrings.add(t[0],t[1]);break;case"CTF":this.contextFunctions.add(t[0],t[1]);break;case"CGF":this.customGenerators.add(t[0],t[1]);break;default:console.error("FunctionError: Invalid function name "+t[0])}}}}},2362:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.storeFactory=e.SpeechRuleEngine=void 0;const n=r(7052),o=r(2057),i=r(5740),Q=r(5897),T=r(4440),s=r(5274),a=r(7283),l=r(7599),c=r(2469),u=r(1676),p=r(2105),h=r(9935),d=r(4650),f=r(4508);class L{constructor(){this.trie=null,this.evaluators_={},this.trie=new f.Trie}static getInstance(){return L.instance=L.instance||new L,L.instance}static debugSpeechRule(t,e){const r=t.precondition,n=t.context.applyQuery(e,r.query);o.Debugger.getInstance().output(r.query,n?n.toString():n),r.constraints.forEach((r=>o.Debugger.getInstance().output(r,t.context.applyConstraint(e,r))))}static debugNamedSpeechRule(t,e){const r=L.getInstance().trie.collectRules().filter((e=>e.name==t));for(let n,i=0;n=r[i];i++)o.Debugger.getInstance().output("Rule",t,"DynamicCstr:",n.dynamicCstr.toString(),"number",i),L.debugSpeechRule(n,e)}evaluateNode(t){(0,s.updateEvaluator)(t);const e=(new Date).getTime();let r=[];try{r=this.evaluateNode_(t)}catch(t){console.error("Something went wrong computing speech."),o.Debugger.getInstance().output(t)}const n=(new Date).getTime();return o.Debugger.getInstance().output("Time:",n-e),r}toString(){return this.trie.collectRules().map((t=>t.toString())).join("\n")}runInSetting(t,e){const r=Q.default.getInstance(),n={};for(const e in t)n[e]=r[e],r[e]=t[e];r.setDynamicCstr();const o=e();for(const t in n)r[t]=n[t];return r.setDynamicCstr(),o}addStore(t){const e=y(t);"abstract"!==e.kind&&e.getSpeechRules().forEach((t=>this.trie.addRule(t))),this.addEvaluator(e)}processGrammar(t,e,r){const n={};for(const o in r){const i=r[o];n[o]="string"==typeof i?t.constructString(e,i):i}p.Grammar.getInstance().pushState(n)}addEvaluator(t){const e=t.evaluateDefault.bind(t),r=this.evaluators_[t.locale];if(r)return void(r[t.modality]=e);const n={};n[t.modality]=e,this.evaluators_[t.locale]=n}getEvaluator(t,e){const r=this.evaluators_[t]||this.evaluators_[u.DynamicCstr.DEFAULT_VALUES[u.Axis.LOCALE]];return r[e]||r[u.DynamicCstr.DEFAULT_VALUES[u.Axis.MODALITY]]}enumerate(t){return this.trie.enumerate(t)}evaluateNode_(t){return t?(this.updateConstraint_(),this.evaluateTree_(t)):[]}evaluateTree_(t){const e=Q.default.getInstance();let r;o.Debugger.getInstance().output(e.mode!==T.Mode.HTTP?t.toString():t),p.Grammar.getInstance().setAttribute(t);const i=this.lookupRule(t,e.dynamicCstr);if(!i)return e.strict?[]:(r=this.getEvaluator(e.locale,e.modality)(t),t.attributes&&this.addPersonality_(r,{},!1,t),r);o.Debugger.getInstance().generateOutput((()=>["Apply Rule:",i.name,i.dynamicCstr.toString(),(e.mode,T.Mode.HTTP,t).toString()]));const a=i.context,l=i.action.components;r=[];for(let e,o=0;e=l[o];o++){let o=[];const i=e.content||"",T=e.attributes||{};let l=!1;e.grammar&&this.processGrammar(a,t,e.grammar);let c=null;if(T.engine){c=Q.default.getInstance().dynamicCstr.getComponents();const t=p.Grammar.parseInput(T.engine);Q.default.getInstance().setDynamicCstr(t)}switch(e.type){case d.ActionType.NODE:{const e=a.applyQuery(t,i);e&&(o=this.evaluateTree_(e))}break;case d.ActionType.MULTI:{l=!0;const e=a.applySelector(t,i);e.length>0&&(o=this.evaluateNodeList_(a,e,T.sepFunc,a.constructString(t,T.separator),T.ctxtFunc,a.constructString(t,T.context)))}break;case d.ActionType.TEXT:{const e=T.span,r={};if(e){const n=(0,s.evalXPath)(e,t);n.length&&(r.extid=n[0].getAttribute("extid"))}const Q=a.constructString(t,i);(Q||""===Q)&&(o=Array.isArray(Q)?Q.map((function(t){return n.AuditoryDescription.create({text:t.speech,attributes:t.attributes},{adjust:!0})})):[n.AuditoryDescription.create({text:Q,attributes:r},{adjust:!0})])}break;case d.ActionType.PERSONALITY:default:o=[n.AuditoryDescription.create({text:i})]}o[0]&&!l&&(T.context&&(o[0].context=a.constructString(t,T.context)+(o[0].context||"")),T.annotation&&(o[0].annotation=T.annotation)),this.addLayout(o,T,l),e.grammar&&p.Grammar.getInstance().popState(),r=r.concat(this.addPersonality_(o,T,l,t)),c&&Q.default.getInstance().setDynamicCstr(c)}return r}evaluateNodeList_(t,e,r,o,i,Q){if(!e.length)return[];const T=o||"",s=Q||"",a=t.contextFunctions.lookup(i),l=a?a(e,s):function(){return s},c=t.contextFunctions.lookup(r),u=c?c(e,T):function(){return[n.AuditoryDescription.create({text:T},{translate:!0})]};let p=[];for(let t,r=0;t=e[r];r++){const n=this.evaluateTree_(t);if(n.length>0&&(n[0].context=l()+(n[0].context||""),p=p.concat(n),r=0;e--){const n=r[e].name;!t.attributes[n]&&n.match(/^ext/)&&(t.attributes[n]=r[e].value)}}}addRelativePersonality_(t,e){if(!t.personality)return t.personality=e,t;const r=t.personality;for(const t in e)r[t]&&"number"==typeof r[t]&&"number"==typeof e[t]?r[t]=r[t]+e[t]:r[t]||(r[t]=e[t]);return t}updateConstraint_(){const t=Q.default.getInstance().dynamicCstr,e=Q.default.getInstance().strict,r=this.trie,n={};let o=t.getValue(u.Axis.LOCALE),i=t.getValue(u.Axis.MODALITY),T=t.getValue(u.Axis.DOMAIN);r.hasSubtrie([o,i,T])||(T=u.DynamicCstr.DEFAULT_VALUES[u.Axis.DOMAIN],r.hasSubtrie([o,i,T])||(i=u.DynamicCstr.DEFAULT_VALUES[u.Axis.MODALITY],r.hasSubtrie([o,i,T])||(o=u.DynamicCstr.DEFAULT_VALUES[u.Axis.LOCALE]))),n[u.Axis.LOCALE]=[o],n[u.Axis.MODALITY]=["summary"!==i?i:u.DynamicCstr.DEFAULT_VALUES[u.Axis.MODALITY]],n[u.Axis.DOMAIN]=["speech"!==i?u.DynamicCstr.DEFAULT_VALUES[u.Axis.DOMAIN]:T];const s=t.getOrder();for(let r,o=0;r=s[o];o++)if(!n[r]){const o=t.getValue(r),i=this.makeSet_(o,t.preference),Q=u.DynamicCstr.DEFAULT_VALUES[r];e||o===Q||i.push(Q),n[r]=i}t.updateProperties(n)}makeSet_(t,e){return e&&Object.keys(e).length?t.split(":"):[t]}lookupRule(t,e){if(!t||t.nodeType!==i.NodeType.ELEMENT_NODE&&t.nodeType!==i.NodeType.TEXT_NODE)return null;const r=this.lookupRules(t,e);return r.length>0?this.pickMostConstraint_(e,r):null}lookupRules(t,e){return this.trie.lookupRules(t,e.allProperties())}pickMostConstraint_(t,e){const r=Q.default.getInstance().comparator;return e.sort((function(t,e){return r.compare(t.dynamicCstr,e.dynamicCstr)||e.precondition.priority-t.precondition.priority||e.precondition.constraints.length-t.precondition.constraints.length||e.precondition.rank-t.precondition.rank})),o.Debugger.getInstance().generateOutput((()=>e.map((t=>t.name+"("+t.dynamicCstr.toString()+")"))).bind(this)),e[0]}}e.SpeechRuleEngine=L;const m=new Map;function y(t){const e=`${t.locale}.${t.modality}.${t.domain}`;if("actions"===t.kind){const r=m.get(e);return r.parse(t),r}l.init(),t&&!t.functions&&(t.functions=a.getStore(t.locale,t.modality,t.domain));const r="braille"===t.modality?new c.BrailleStore:new h.MathStore;return m.set(e,r),t.inherits&&(r.inherits=m.get(`${t.inherits}.${t.modality}.${t.domain}`)),r.parse(t),r.initialize(),r}e.storeFactory=y,Q.default.nodeEvaluator=L.getInstance().evaluateNode.bind(L.getInstance())},5662:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.CustomGenerators=e.ContextFunctions=e.CustomStrings=e.CustomQueries=void 0;class r{constructor(t,e){this.prefix=t,this.store=e}add(t,e){this.checkCustomFunctionSyntax_(t)&&(this.store[t]=e)}addStore(t){const e=Object.keys(t.store);for(let r,n=0;r=e[n];n++)this.add(r,t.store[r])}lookup(t){return this.store[t]}checkCustomFunctionSyntax_(t){const e=new RegExp("^"+this.prefix);return!!t.match(e)||(console.error("FunctionError: Invalid function name. Expected prefix "+this.prefix),!1)}}e.CustomQueries=class extends r{constructor(){super("CQF",{})}};e.CustomStrings=class extends r{constructor(){super("CSF",{})}};e.ContextFunctions=class extends r{constructor(){super("CTF",{})}};e.CustomGenerators=class extends r{constructor(){super("CGF",{})}}},365:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.contentIterator=e.pauseSeparator=e.nodeCounter=void 0;const n=r(7052),o=r(5274),i=r(5897);e.nodeCounter=function(t,e){const r=t.length;let n=0,o=e;return e||(o=""),function(){return n0?o.evalXPath("../../content/*",t[0]):[],function(){const t=r.shift(),o=e?[n.AuditoryDescription.create({text:e},{translate:!0})]:[];if(!t)return o;const Q=i.default.evaluateNode(t);return o.concat(Q)}}},1414:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.getTreeFromString=e.getTree=e.xmlTree=void 0;const n=r(5740),o=r(7075);function i(t){return new o.SemanticTree(t)}e.xmlTree=function(t){return i(t).xml()},e.getTree=i,e.getTreeFromString=function(t){return i(n.parseInput(t))}},7630:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.annotate=e.activate=e.register=e.visitors=e.annotators=void 0;const n=r(9265);e.annotators=new Map,e.visitors=new Map,e.register=function(t){const r=t.domain+":"+t.name;t instanceof n.SemanticAnnotator?e.annotators.set(r,t):e.visitors.set(r,t)},e.activate=function(t,r){const n=t+":"+r,o=e.annotators.get(n)||e.visitors.get(n);o&&(o.active=!0)},e.annotate=function(t){for(const r of e.annotators.values())r.active&&r.annotate(t);for(const r of e.visitors.values())r.active&&r.visit(t,Object.assign({},r.def))}},9265:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticVisitor=e.SemanticAnnotator=void 0;e.SemanticAnnotator=class{constructor(t,e,r){this.domain=t,this.name=e,this.func=r,this.active=!1}annotate(t){t.childNodes.forEach(this.annotate.bind(this)),t.addAnnotation(this.domain,this.func(t))}};e.SemanticVisitor=class{constructor(t,e,r,n={}){this.domain=t,this.name=e,this.func=r,this.def=n,this.active=!1}visit(t,e){let r=this.func(t,e);t.addAnnotation(this.domain,r[0]);for(let e,n=0;e=t.childNodes[n];n++)r=this.visit(e,r[1]);return r}}},3588:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.lookupSecondary=e.isEmbellishedType=e.isMatchingFence=e.functionApplication=e.invisibleComma=e.invisiblePlus=e.invisibleTimes=e.lookupMeaning=e.lookupRole=e.lookupType=e.equal=e.allLettersRegExp=void 0;const r=String.fromCodePoint(8291),n=["\uff0c","\ufe50",",",r],o=["\xaf","\u2012","\u2013","\u2014","\u2015","\ufe58","-","\u207b","\u208b","\u2212","\u2796","\ufe63","\uff0d","\u2010","\u2011","\u203e","_"],i=["~","\u0303","\u223c","\u02dc","\u223d","\u02f7","\u0334","\u0330"],Q={"(":")","[":"]","{":"}","\u2045":"\u2046","\u2329":"\u232a","\u2768":"\u2769","\u276a":"\u276b","\u276c":"\u276d","\u276e":"\u276f","\u2770":"\u2771","\u2772":"\u2773","\u2774":"\u2775","\u27c5":"\u27c6","\u27e6":"\u27e7","\u27e8":"\u27e9","\u27ea":"\u27eb","\u27ec":"\u27ed","\u27ee":"\u27ef","\u2983":"\u2984","\u2985":"\u2986","\u2987":"\u2988","\u2989":"\u298a","\u298b":"\u298c","\u298d":"\u298e","\u298f":"\u2990","\u2991":"\u2992","\u2993":"\u2994","\u2995":"\u2996","\u2997":"\u2998","\u29d8":"\u29d9","\u29da":"\u29db","\u29fc":"\u29fd","\u2e22":"\u2e23","\u2e24":"\u2e25","\u2e26":"\u2e27","\u2e28":"\u2e29","\u3008":"\u3009","\u300a":"\u300b","\u300c":"\u300d","\u300e":"\u300f","\u3010":"\u3011","\u3014":"\u3015","\u3016":"\u3017","\u3018":"\u3019","\u301a":"\u301b","\u301d":"\u301e","\ufd3e":"\ufd3f","\ufe17":"\ufe18","\ufe59":"\ufe5a","\ufe5b":"\ufe5c","\ufe5d":"\ufe5e","\uff08":"\uff09","\uff3b":"\uff3d","\uff5b":"\uff5d","\uff5f":"\uff60","\uff62":"\uff63","\u2308":"\u2309","\u230a":"\u230b","\u230c":"\u230d","\u230e":"\u230f","\u231c":"\u231d","\u231e":"\u231f","\u239b":"\u239e","\u239c":"\u239f","\u239d":"\u23a0","\u23a1":"\u23a4","\u23a2":"\u23a5","\u23a3":"\u23a6","\u23a7":"\u23ab","\u23a8":"\u23ac","\u23a9":"\u23ad","\u23b0":"\u23b1","\u23b8":"\u23b9"},T={"\u23b4":"\u23b5","\u23dc":"\u23dd","\u23de":"\u23df","\u23e0":"\u23e1","\ufe35":"\ufe36","\ufe37":"\ufe38","\ufe39":"\ufe3a","\ufe3b":"\ufe3c","\ufe3d":"\ufe3e","\ufe3f":"\ufe40","\ufe41":"\ufe42","\ufe43":"\ufe44","\ufe47":"\ufe48"},s=Object.keys(Q),a=Object.values(Q);a.push("\u301f");const l=Object.keys(T),c=Object.values(T),u=["|","\xa6","\u2223","\u23d0","\u23b8","\u23b9","\u2758","\uff5c","\uffe4","\ufe31","\ufe32"],p=["\u2016","\u2225","\u2980","\u2af4"],h=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],d=["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","\u0131","\u0237"],f=["\uff21","\uff22","\uff23","\uff24","\uff25","\uff26","\uff27","\uff28","\uff29","\uff2a","\uff2b","\uff2c","\uff2d","\uff2e","\uff2f","\uff30","\uff31","\uff32","\uff33","\uff34","\uff35","\uff36","\uff37","\uff38","\uff39","\uff3a"],L=["\uff41","\uff42","\uff43","\uff44","\uff45","\uff46","\uff47","\uff48","\uff49","\uff4a","\uff4b","\uff4c","\uff4d","\uff4e","\uff4f","\uff50","\uff51","\uff52","\uff53","\uff54","\uff55","\uff56","\uff57","\uff58","\uff59","\uff5a"],m=["\ud835\udc00","\ud835\udc01","\ud835\udc02","\ud835\udc03","\ud835\udc04","\ud835\udc05","\ud835\udc06","\ud835\udc07","\ud835\udc08","\ud835\udc09","\ud835\udc0a","\ud835\udc0b","\ud835\udc0c","\ud835\udc0d","\ud835\udc0e","\ud835\udc0f","\ud835\udc10","\ud835\udc11","\ud835\udc12","\ud835\udc13","\ud835\udc14","\ud835\udc15","\ud835\udc16","\ud835\udc17","\ud835\udc18","\ud835\udc19"],y=["\ud835\udc1a","\ud835\udc1b","\ud835\udc1c","\ud835\udc1d","\ud835\udc1e","\ud835\udc1f","\ud835\udc20","\ud835\udc21","\ud835\udc22","\ud835\udc23","\ud835\udc24","\ud835\udc25","\ud835\udc26","\ud835\udc27","\ud835\udc28","\ud835\udc29","\ud835\udc2a","\ud835\udc2b","\ud835\udc2c","\ud835\udc2d","\ud835\udc2e","\ud835\udc2f","\ud835\udc30","\ud835\udc31","\ud835\udc32","\ud835\udc33"],g=["\ud835\udc34","\ud835\udc35","\ud835\udc36","\ud835\udc37","\ud835\udc38","\ud835\udc39","\ud835\udc3a","\ud835\udc3b","\ud835\udc3c","\ud835\udc3d","\ud835\udc3e","\ud835\udc3f","\ud835\udc40","\ud835\udc41","\ud835\udc42","\ud835\udc43","\ud835\udc44","\ud835\udc45","\ud835\udc46","\ud835\udc47","\ud835\udc48","\ud835\udc49","\ud835\udc4a","\ud835\udc4b","\ud835\udc4c","\ud835\udc4d"],H=["\ud835\udc4e","\ud835\udc4f","\ud835\udc50","\ud835\udc51","\ud835\udc52","\ud835\udc53","\ud835\udc54","\u210e","\ud835\udc56","\ud835\udc57","\ud835\udc58","\ud835\udc59","\ud835\udc5a","\ud835\udc5b","\ud835\udc5c","\ud835\udc5d","\ud835\udc5e","\ud835\udc5f","\ud835\udc60","\ud835\udc61","\ud835\udc62","\ud835\udc63","\ud835\udc64","\ud835\udc65","\ud835\udc66","\ud835\udc67","\ud835\udea4","\ud835\udea5"],b=["\ud835\udc68","\ud835\udc69","\ud835\udc6a","\ud835\udc6b","\ud835\udc6c","\ud835\udc6d","\ud835\udc6e","\ud835\udc6f","\ud835\udc70","\ud835\udc71","\ud835\udc72","\ud835\udc73","\ud835\udc74","\ud835\udc75","\ud835\udc76","\ud835\udc77","\ud835\udc78","\ud835\udc79","\ud835\udc7a","\ud835\udc7b","\ud835\udc7c","\ud835\udc7d","\ud835\udc7e","\ud835\udc7f","\ud835\udc80","\ud835\udc81"],v=["\ud835\udc82","\ud835\udc83","\ud835\udc84","\ud835\udc85","\ud835\udc86","\ud835\udc87","\ud835\udc88","\ud835\udc89","\ud835\udc8a","\ud835\udc8b","\ud835\udc8c","\ud835\udc8d","\ud835\udc8e","\ud835\udc8f","\ud835\udc90","\ud835\udc91","\ud835\udc92","\ud835\udc93","\ud835\udc94","\ud835\udc95","\ud835\udc96","\ud835\udc97","\ud835\udc98","\ud835\udc99","\ud835\udc9a","\ud835\udc9b"],M=["\ud835\udc9c","\u212c","\ud835\udc9e","\ud835\udc9f","\u2130","\u2131","\ud835\udca2","\u210b","\u2110","\ud835\udca5","\ud835\udca6","\u2112","\u2133","\ud835\udca9","\ud835\udcaa","\ud835\udcab","\ud835\udcac","\u211b","\ud835\udcae","\ud835\udcaf","\ud835\udcb0","\ud835\udcb1","\ud835\udcb2","\ud835\udcb3","\ud835\udcb4","\ud835\udcb5","\u2118"],_=["\ud835\udcb6","\ud835\udcb7","\ud835\udcb8","\ud835\udcb9","\u212f","\ud835\udcbb","\u210a","\ud835\udcbd","\ud835\udcbe","\ud835\udcbf","\ud835\udcc0","\ud835\udcc1","\ud835\udcc2","\ud835\udcc3","\u2134","\ud835\udcc5","\ud835\udcc6","\ud835\udcc7","\ud835\udcc8","\ud835\udcc9","\ud835\udcca","\ud835\udccb","\ud835\udccc","\ud835\udccd","\ud835\udcce","\ud835\udccf","\u2113"],O=["\ud835\udcd0","\ud835\udcd1","\ud835\udcd2","\ud835\udcd3","\ud835\udcd4","\ud835\udcd5","\ud835\udcd6","\ud835\udcd7","\ud835\udcd8","\ud835\udcd9","\ud835\udcda","\ud835\udcdb","\ud835\udcdc","\ud835\udcdd","\ud835\udcde","\ud835\udcdf","\ud835\udce0","\ud835\udce1","\ud835\udce2","\ud835\udce3","\ud835\udce4","\ud835\udce5","\ud835\udce6","\ud835\udce7","\ud835\udce8","\ud835\udce9"],V=["\ud835\udcea","\ud835\udceb","\ud835\udcec","\ud835\udced","\ud835\udcee","\ud835\udcef","\ud835\udcf0","\ud835\udcf1","\ud835\udcf2","\ud835\udcf3","\ud835\udcf4","\ud835\udcf5","\ud835\udcf6","\ud835\udcf7","\ud835\udcf8","\ud835\udcf9","\ud835\udcfa","\ud835\udcfb","\ud835\udcfc","\ud835\udcfd","\ud835\udcfe","\ud835\udcff","\ud835\udd00","\ud835\udd01","\ud835\udd02","\ud835\udd03"],S=["\ud835\udd04","\ud835\udd05","\u212d","\ud835\udd07","\ud835\udd08","\ud835\udd09","\ud835\udd0a","\u210c","\u2111","\ud835\udd0d","\ud835\udd0e","\ud835\udd0f","\ud835\udd10","\ud835\udd11","\ud835\udd12","\ud835\udd13","\ud835\udd14","\u211c","\ud835\udd16","\ud835\udd17","\ud835\udd18","\ud835\udd19","\ud835\udd1a","\ud835\udd1b","\ud835\udd1c","\u2128"],x=["\ud835\udd1e","\ud835\udd1f","\ud835\udd20","\ud835\udd21","\ud835\udd22","\ud835\udd23","\ud835\udd24","\ud835\udd25","\ud835\udd26","\ud835\udd27","\ud835\udd28","\ud835\udd29","\ud835\udd2a","\ud835\udd2b","\ud835\udd2c","\ud835\udd2d","\ud835\udd2e","\ud835\udd2f","\ud835\udd30","\ud835\udd31","\ud835\udd32","\ud835\udd33","\ud835\udd34","\ud835\udd35","\ud835\udd36","\ud835\udd37"],E=["\ud835\udd38","\ud835\udd39","\u2102","\ud835\udd3b","\ud835\udd3c","\ud835\udd3d","\ud835\udd3e","\u210d","\ud835\udd40","\ud835\udd41","\ud835\udd42","\ud835\udd43","\ud835\udd44","\u2115","\ud835\udd46","\u2119","\u211a","\u211d","\ud835\udd4a","\ud835\udd4b","\ud835\udd4c","\ud835\udd4d","\ud835\udd4e","\ud835\udd4f","\ud835\udd50","\u2124"],A=["\ud835\udd52","\ud835\udd53","\ud835\udd54","\ud835\udd55","\ud835\udd56","\ud835\udd57","\ud835\udd58","\ud835\udd59","\ud835\udd5a","\ud835\udd5b","\ud835\udd5c","\ud835\udd5d","\ud835\udd5e","\ud835\udd5f","\ud835\udd60","\ud835\udd61","\ud835\udd62","\ud835\udd63","\ud835\udd64","\ud835\udd65","\ud835\udd66","\ud835\udd67","\ud835\udd68","\ud835\udd69","\ud835\udd6a","\ud835\udd6b"],C=["\ud835\udd6c","\ud835\udd6d","\ud835\udd6e","\ud835\udd6f","\ud835\udd70","\ud835\udd71","\ud835\udd72","\ud835\udd73","\ud835\udd74","\ud835\udd75","\ud835\udd76","\ud835\udd77","\ud835\udd78","\ud835\udd79","\ud835\udd7a","\ud835\udd7b","\ud835\udd7c","\ud835\udd7d","\ud835\udd7e","\ud835\udd7f","\ud835\udd80","\ud835\udd81","\ud835\udd82","\ud835\udd83","\ud835\udd84","\ud835\udd85"],N=["\ud835\udd86","\ud835\udd87","\ud835\udd88","\ud835\udd89","\ud835\udd8a","\ud835\udd8b","\ud835\udd8c","\ud835\udd8d","\ud835\udd8e","\ud835\udd8f","\ud835\udd90","\ud835\udd91","\ud835\udd92","\ud835\udd93","\ud835\udd94","\ud835\udd95","\ud835\udd96","\ud835\udd97","\ud835\udd98","\ud835\udd99","\ud835\udd9a","\ud835\udd9b","\ud835\udd9c","\ud835\udd9d","\ud835\udd9e","\ud835\udd9f"],w=["\ud835\udda0","\ud835\udda1","\ud835\udda2","\ud835\udda3","\ud835\udda4","\ud835\udda5","\ud835\udda6","\ud835\udda7","\ud835\udda8","\ud835\udda9","\ud835\uddaa","\ud835\uddab","\ud835\uddac","\ud835\uddad","\ud835\uddae","\ud835\uddaf","\ud835\uddb0","\ud835\uddb1","\ud835\uddb2","\ud835\uddb3","\ud835\uddb4","\ud835\uddb5","\ud835\uddb6","\ud835\uddb7","\ud835\uddb8","\ud835\uddb9"],P=["\ud835\uddba","\ud835\uddbb","\ud835\uddbc","\ud835\uddbd","\ud835\uddbe","\ud835\uddbf","\ud835\uddc0","\ud835\uddc1","\ud835\uddc2","\ud835\uddc3","\ud835\uddc4","\ud835\uddc5","\ud835\uddc6","\ud835\uddc7","\ud835\uddc8","\ud835\uddc9","\ud835\uddca","\ud835\uddcb","\ud835\uddcc","\ud835\uddcd","\ud835\uddce","\ud835\uddcf","\ud835\uddd0","\ud835\uddd1","\ud835\uddd2","\ud835\uddd3"],I=["\ud835\uddd4","\ud835\uddd5","\ud835\uddd6","\ud835\uddd7","\ud835\uddd8","\ud835\uddd9","\ud835\uddda","\ud835\udddb","\ud835\udddc","\ud835\udddd","\ud835\uddde","\ud835\udddf","\ud835\udde0","\ud835\udde1","\ud835\udde2","\ud835\udde3","\ud835\udde4","\ud835\udde5","\ud835\udde6","\ud835\udde7","\ud835\udde8","\ud835\udde9","\ud835\uddea","\ud835\uddeb","\ud835\uddec","\ud835\udded"],k=["\ud835\uddee","\ud835\uddef","\ud835\uddf0","\ud835\uddf1","\ud835\uddf2","\ud835\uddf3","\ud835\uddf4","\ud835\uddf5","\ud835\uddf6","\ud835\uddf7","\ud835\uddf8","\ud835\uddf9","\ud835\uddfa","\ud835\uddfb","\ud835\uddfc","\ud835\uddfd","\ud835\uddfe","\ud835\uddff","\ud835\ude00","\ud835\ude01","\ud835\ude02","\ud835\ude03","\ud835\ude04","\ud835\ude05","\ud835\ude06","\ud835\ude07"],R=["\ud835\ude08","\ud835\ude09","\ud835\ude0a","\ud835\ude0b","\ud835\ude0c","\ud835\ude0d","\ud835\ude0e","\ud835\ude0f","\ud835\ude10","\ud835\ude11","\ud835\ude12","\ud835\ude13","\ud835\ude14","\ud835\ude15","\ud835\ude16","\ud835\ude17","\ud835\ude18","\ud835\ude19","\ud835\ude1a","\ud835\ude1b","\ud835\ude1c","\ud835\ude1d","\ud835\ude1e","\ud835\ude1f","\ud835\ude20","\ud835\ude21"],j=["\ud835\ude22","\ud835\ude23","\ud835\ude24","\ud835\ude25","\ud835\ude26","\ud835\ude27","\ud835\ude28","\ud835\ude29","\ud835\ude2a","\ud835\ude2b","\ud835\ude2c","\ud835\ude2d","\ud835\ude2e","\ud835\ude2f","\ud835\ude30","\ud835\ude31","\ud835\ude32","\ud835\ude33","\ud835\ude34","\ud835\ude35","\ud835\ude36","\ud835\ude37","\ud835\ude38","\ud835\ude39","\ud835\ude3a","\ud835\ude3b"],D=["\ud835\ude3c","\ud835\ude3d","\ud835\ude3e","\ud835\ude3f","\ud835\ude40","\ud835\ude41","\ud835\ude42","\ud835\ude43","\ud835\ude44","\ud835\ude45","\ud835\ude46","\ud835\ude47","\ud835\ude48","\ud835\ude49","\ud835\ude4a","\ud835\ude4b","\ud835\ude4c","\ud835\ude4d","\ud835\ude4e","\ud835\ude4f","\ud835\ude50","\ud835\ude51","\ud835\ude52","\ud835\ude53","\ud835\ude54","\ud835\ude55"],B=["\ud835\ude56","\ud835\ude57","\ud835\ude58","\ud835\ude59","\ud835\ude5a","\ud835\ude5b","\ud835\ude5c","\ud835\ude5d","\ud835\ude5e","\ud835\ude5f","\ud835\ude60","\ud835\ude61","\ud835\ude62","\ud835\ude63","\ud835\ude64","\ud835\ude65","\ud835\ude66","\ud835\ude67","\ud835\ude68","\ud835\ude69","\ud835\ude6a","\ud835\ude6b","\ud835\ude6c","\ud835\ude6d","\ud835\ude6e","\ud835\ude6f"],F=["\ud835\ude70","\ud835\ude71","\ud835\ude72","\ud835\ude73","\ud835\ude74","\ud835\ude75","\ud835\ude76","\ud835\ude77","\ud835\ude78","\ud835\ude79","\ud835\ude7a","\ud835\ude7b","\ud835\ude7c","\ud835\ude7d","\ud835\ude7e","\ud835\ude7f","\ud835\ude80","\ud835\ude81","\ud835\ude82","\ud835\ude83","\ud835\ude84","\ud835\ude85","\ud835\ude86","\ud835\ude87","\ud835\ude88","\ud835\ude89"],Z=["\ud835\ude8a","\ud835\ude8b","\ud835\ude8c","\ud835\ude8d","\ud835\ude8e","\ud835\ude8f","\ud835\ude90","\ud835\ude91","\ud835\ude92","\ud835\ude93","\ud835\ude94","\ud835\ude95","\ud835\ude96","\ud835\ude97","\ud835\ude98","\ud835\ude99","\ud835\ude9a","\ud835\ude9b","\ud835\ude9c","\ud835\ude9d","\ud835\ude9e","\ud835\ude9f","\ud835\udea0","\ud835\udea1","\ud835\udea2","\ud835\udea3"],G=["\u2145","\u2146","\u2147","\u2148","\u2149"],U=["\u0391","\u0392","\u0393","\u0394","\u0395","\u0396","\u0397","\u0398","\u0399","\u039a","\u039b","\u039c","\u039d","\u039e","\u039f","\u03a0","\u03a1","\u03a3","\u03a4","\u03a5","\u03a6","\u03a7","\u03a8","\u03a9"],q=["\u03b1","\u03b2","\u03b3","\u03b4","\u03b5","\u03b6","\u03b7","\u03b8","\u03b9","\u03ba","\u03bb","\u03bc","\u03bd","\u03be","\u03bf","\u03c0","\u03c1","\u03c2","\u03c3","\u03c4","\u03c5","\u03c6","\u03c7","\u03c8","\u03c9"],W=["\ud835\udea8","\ud835\udea9","\ud835\udeaa","\ud835\udeab","\ud835\udeac","\ud835\udead","\ud835\udeae","\ud835\udeaf","\ud835\udeb0","\ud835\udeb1","\ud835\udeb2","\ud835\udeb3","\ud835\udeb4","\ud835\udeb5","\ud835\udeb6","\ud835\udeb7","\ud835\udeb8","\ud835\udeba","\ud835\udebb","\ud835\udebc","\ud835\udebd","\ud835\udebe","\ud835\udebf","\ud835\udec0"],X=["\ud835\udec2","\ud835\udec3","\ud835\udec4","\ud835\udec5","\ud835\udec6","\ud835\udec7","\ud835\udec8","\ud835\udec9","\ud835\udeca","\ud835\udecb","\ud835\udecc","\ud835\udecd","\ud835\udece","\ud835\udecf","\ud835\uded0","\ud835\uded1","\ud835\uded2","\ud835\uded3","\ud835\uded4","\ud835\uded5","\ud835\uded6","\ud835\uded7","\ud835\uded8","\ud835\uded9","\ud835\udeda"],z=["\ud835\udee2","\ud835\udee3","\ud835\udee4","\ud835\udee5","\ud835\udee6","\ud835\udee7","\ud835\udee8","\ud835\udee9","\ud835\udeea","\ud835\udeeb","\ud835\udeec","\ud835\udeed","\ud835\udeee","\ud835\udeef","\ud835\udef0","\ud835\udef1","\ud835\udef2","\ud835\udef4","\ud835\udef5","\ud835\udef6","\ud835\udef7","\ud835\udef8","\ud835\udef9","\ud835\udefa"],J=["\ud835\udefc","\ud835\udefd","\ud835\udefe","\ud835\udeff","\ud835\udf00","\ud835\udf01","\ud835\udf02","\ud835\udf03","\ud835\udf04","\ud835\udf05","\ud835\udf06","\ud835\udf07","\ud835\udf08","\ud835\udf09","\ud835\udf0a","\ud835\udf0b","\ud835\udf0c","\ud835\udf0d","\ud835\udf0e","\ud835\udf0f","\ud835\udf10","\ud835\udf11","\ud835\udf12","\ud835\udf13","\ud835\udf14"],K=["\ud835\udf1c","\ud835\udf1d","\ud835\udf1e","\ud835\udf1f","\ud835\udf20","\ud835\udf21","\ud835\udf22","\ud835\udf23","\ud835\udf24","\ud835\udf25","\ud835\udf26","\ud835\udf27","\ud835\udf28","\ud835\udf29","\ud835\udf2a","\ud835\udf2b","\ud835\udf2c","\ud835\udf2e","\ud835\udf2f","\ud835\udf30","\ud835\udf31","\ud835\udf32","\ud835\udf33","\ud835\udf34"],$=["\ud835\udf36","\ud835\udf37","\ud835\udf38","\ud835\udf39","\ud835\udf3a","\ud835\udf3b","\ud835\udf3c","\ud835\udf3d","\ud835\udf3e","\ud835\udf3f","\ud835\udf40","\ud835\udf41","\ud835\udf42","\ud835\udf43","\ud835\udf44","\ud835\udf45","\ud835\udf46","\ud835\udf47","\ud835\udf48","\ud835\udf49","\ud835\udf4a","\ud835\udf4b","\ud835\udf4c","\ud835\udf4d","\ud835\udf4e"],Y=["\ud835\udf56","\ud835\udf57","\ud835\udf58","\ud835\udf59","\ud835\udf5a","\ud835\udf5b","\ud835\udf5c","\ud835\udf5d","\ud835\udf5e","\ud835\udf5f","\ud835\udf60","\ud835\udf61","\ud835\udf62","\ud835\udf63","\ud835\udf64","\ud835\udf65","\ud835\udf66","\ud835\udf68","\ud835\udf69","\ud835\udf6a","\ud835\udf6b","\ud835\udf6c","\ud835\udf6d","\ud835\udf6e"],tt=["\ud835\udf70","\ud835\udf71","\ud835\udf72","\ud835\udf73","\ud835\udf74","\ud835\udf75","\ud835\udf76","\ud835\udf77","\ud835\udf78","\ud835\udf79","\ud835\udf7a","\ud835\udf7b","\ud835\udf7c","\ud835\udf7d","\ud835\udf7e","\ud835\udf7f","\ud835\udf80","\ud835\udf81","\ud835\udf82","\ud835\udf83","\ud835\udf84","\ud835\udf85","\ud835\udf86","\ud835\udf87","\ud835\udf88"],et=["\ud835\udf90","\ud835\udf91","\ud835\udf92","\ud835\udf93","\ud835\udf94","\ud835\udf95","\ud835\udf96","\ud835\udf97","\ud835\udf98","\ud835\udf99","\ud835\udf9a","\ud835\udf9b","\ud835\udf9c","\ud835\udf9d","\ud835\udf9e","\ud835\udf9f","\ud835\udfa0","\ud835\udfa2","\ud835\udfa3","\ud835\udfa4","\ud835\udfa5","\ud835\udfa6","\ud835\udfa7","\ud835\udfa8"],rt=["\ud835\udfaa","\ud835\udfab","\ud835\udfac","\ud835\udfad","\ud835\udfae","\ud835\udfaf","\ud835\udfb0","\ud835\udfb1","\ud835\udfb2","\ud835\udfb3","\ud835\udfb4","\ud835\udfb5","\ud835\udfb6","\ud835\udfb7","\ud835\udfb8","\ud835\udfb9","\ud835\udfba","\ud835\udfbb","\ud835\udfbc","\ud835\udfbd","\ud835\udfbe","\ud835\udfbf","\ud835\udfc0","\ud835\udfc1","\ud835\udfc2"],nt=["\u213c","\u213d","\u213e","\u213f"],ot=["\u03d0","\u03d1","\u03d5","\u03d6","\u03d7","\u03f0","\u03f1","\u03f5","\u03f6","\u03f4"],it=["\ud835\udedc","\ud835\udedd","\ud835\udede","\ud835\udedf","\ud835\udee0","\ud835\udee1"],Qt=["\ud835\udf16","\ud835\udf17","\ud835\udf18","\ud835\udf19","\ud835\udf1a","\ud835\udf1b"],Tt=["\ud835\udf8a","\ud835\udf8b","\ud835\udf8c","\ud835\udf8d","\ud835\udf8e","\ud835\udf8f"],st=["\u2135","\u2136","\u2137","\u2138"],at=h.concat(d,f,L,m,y,g,b,v,H,M,_,O,V,S,x,E,A,C,N,w,P,I,k,R,j,D,B,F,Z,G,U,q,W,X,z,J,K,$,Y,tt,nt,ot,et,rt,it,Qt,Tt,st);e.allLettersRegExp=new RegExp(at.join("|"));const lt=["+","\xb1","\u2213","\u2214","\u2227","\u2228","\u2229","\u222a","\u228c","\u228d","\u228e","\u2293","\u2294","\u229d","\u229e","\u22a4","\u22a5","\u22ba","\u22bb","\u22bc","\u22c4","\u22ce","\u22cf","\u22d2","\u22d3","\u2a5e","\u2295","\u22d4"],ct=String.fromCodePoint(8292);lt.push(ct);const ut=["\u2020","\u2021","\u2210","\u2217","\u2218","\u2219","\u2240","\u229a","\u229b","\u22a0","\u22a1","\u22c5","\u22c6","\u22c7","\u22c8","\u22c9","\u22ca","\u22cb","\u22cc","\u25cb","\xb7","*","\u2297","\u2299"],pt=String.fromCodePoint(8290);ut.push(pt);const ht=String.fromCodePoint(8289),dt=["\xbc","\xbd","\xbe","\u2150","\u2151","\u2152","\u2153","\u2154","\u2155","\u2156","\u2157","\u2158","\u2159","\u215a","\u215b","\u215c","\u215d","\u215e","\u215f","\u2189"],ft=["\xb2","\xb3","\xb9","\u2070","\u2074","\u2075","\u2076","\u2077","\u2078","\u2079"].concat(["\u2080","\u2081","\u2082","\u2083","\u2084","\u2085","\u2086","\u2087","\u2088","\u2089"],["\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246a","\u246b","\u246c","\u246d","\u246e","\u246f","\u2470","\u2471","\u2472","\u2473","\u24ea","\u24eb","\u24ec","\u24ed","\u24ee","\u24ef","\u24f0","\u24f1","\u24f2","\u24f3","\u24f4","\u24f5","\u24f6","\u24f7","\u24f8","\u24f9","\u24fa","\u24fb","\u24fc","\u24fd","\u24fe","\u24ff","\u2776","\u2777","\u2778","\u2779","\u277a","\u277b","\u277c","\u277d","\u277e","\u277f","\u2780","\u2781","\u2782","\u2783","\u2784","\u2785","\u2786","\u2787","\u2788","\u2789","\u278a","\u278b","\u278c","\u278d","\u278e","\u278f","\u2790","\u2791","\u2792","\u2793","\u3248","\u3249","\u324a","\u324b","\u324c","\u324d","\u324e","\u324f","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325a","\u325b","\u325c","\u325d","\u325e","\u325f","\u32b1","\u32b2","\u32b3","\u32b4","\u32b5","\u32b6","\u32b7","\u32b8","\u32b9","\u32ba","\u32bb","\u32bc","\u32bd","\u32be","\u32bf"],["\u2474","\u2475","\u2476","\u2477","\u2478","\u2479","\u247a","\u247b","\u247c","\u247d","\u247e","\u247f","\u2480","\u2481","\u2482","\u2483","\u2484","\u2485","\u2486","\u2487"],["\u2488","\u2489","\u248a","\u248b","\u248c","\u248d","\u248e","\u248f","\u2490","\u2491","\u2492","\u2493","\u2494","\u2495","\u2496","\u2497","\u2498","\u2499","\u249a","\u249b","\ud83c\udd00","\ud83c\udd01","\ud83c\udd02","\ud83c\udd03","\ud83c\udd04","\ud83c\udd05","\ud83c\udd06","\ud83c\udd07","\ud83c\udd08","\ud83c\udd09","\ud83c\udd0a"]),Lt=["cos","cot","csc","sec","sin","tan","arccos","arccot","arccsc","arcsec","arcsin","arctan","arc cos","arc cot","arc csc","arc sec","arc sin","arc tan"].concat(["cosh","coth","csch","sech","sinh","tanh","arcosh","arcoth","arcsch","arsech","arsinh","artanh","arccosh","arccoth","arccsch","arcsech","arcsinh","arctanh"],["deg","det","dim","hom","ker","Tr","tr"],["log","ln","lg","exp","expt","gcd","gcd","arg","im","re","Pr"]),mt=[{set:["!",'"',"#","%","&",";","?","@","\\","\xa1","\xa7","\xb6","\xbf","\u2017","\u2020","\u2021","\u2022","\u2023","\u2024","\u2025","\u2027","\u2030","\u2031","\u2038","\u203b","\u203c","\u203d","\u203e","\u2041","\u2042","\u2043","\u2047","\u2048","\u2049","\u204b","\u204c","\u204d","\u204e","\u204f","\u2050","\u2051","\u2053","\u2055","\u2056","\u2058","\u2059","\u205a","\u205b","\u205c","\u205d","\u205e","\ufe10","\ufe14","\ufe15","\ufe16","\ufe30","\ufe45","\ufe46","\ufe49","\ufe4a","\ufe4b","\ufe4c","\ufe54","\ufe56","\ufe57","\ufe5f","\ufe60","\ufe61","\ufe68","\ufe6a","\ufe6b","\uff01","\uff02","\uff03","\uff05","\uff06","\uff07","\uff0a","\uff0f","\uff1b","\uff1f","\uff20","\uff3c"],type:"punctuation",role:"unknown"},{set:["\ufe13",":","\uff1a","\ufe55"],type:"punctuation",role:"colon"},{set:n,type:"punctuation",role:"comma"},{set:["\u2026","\u22ee","\u22ef","\u22f0","\u22f1","\ufe19"],type:"punctuation",role:"ellipsis"},{set:[".","\ufe52","\uff0e"],type:"punctuation",role:"fullstop"},{set:o,type:"operator",role:"dash"},{set:i,type:"operator",role:"tilde"},{set:["'","\u2032","\u2033","\u2034","\u2035","\u2036","\u2037","\u2057","\u02b9","\u02ba"],type:"punctuation",role:"prime"},{set:["\xb0"],type:"punctuation",role:"degree"},{set:s,type:"fence",role:"open"},{set:a,type:"fence",role:"close"},{set:l,type:"fence",role:"top"},{set:c,type:"fence",role:"bottom"},{set:u,type:"fence",role:"neutral"},{set:p,type:"fence",role:"metric"},{set:d,type:"identifier",role:"latinletter",font:"normal"},{set:h,type:"identifier",role:"latinletter",font:"normal"},{set:L,type:"identifier",role:"latinletter",font:"normal"},{set:f,type:"identifier",role:"latinletter",font:"normal"},{set:y,type:"identifier",role:"latinletter",font:"bold"},{set:m,type:"identifier",role:"latinletter",font:"bold"},{set:H,type:"identifier",role:"latinletter",font:"italic"},{set:g,type:"identifier",role:"latinletter",font:"italic"},{set:v,type:"identifier",role:"latinletter",font:"bold-italic"},{set:b,type:"identifier",role:"latinletter",font:"bold-italic"},{set:_,type:"identifier",role:"latinletter",font:"script"},{set:M,type:"identifier",role:"latinletter",font:"script"},{set:V,type:"identifier",role:"latinletter",font:"bold-script"},{set:O,type:"identifier",role:"latinletter",font:"bold-script"},{set:x,type:"identifier",role:"latinletter",font:"fraktur"},{set:S,type:"identifier",role:"latinletter",font:"fraktur"},{set:A,type:"identifier",role:"latinletter",font:"double-struck"},{set:E,type:"identifier",role:"latinletter",font:"double-struck"},{set:N,type:"identifier",role:"latinletter",font:"bold-fraktur"},{set:C,type:"identifier",role:"latinletter",font:"bold-fraktur"},{set:P,type:"identifier",role:"latinletter",font:"sans-serif"},{set:w,type:"identifier",role:"latinletter",font:"sans-serif"},{set:k,type:"identifier",role:"latinletter",font:"sans-serif-bold"},{set:I,type:"identifier",role:"latinletter",font:"sans-serif-bold"},{set:j,type:"identifier",role:"latinletter",font:"sans-serif-italic"},{set:R,type:"identifier",role:"latinletter",font:"sans-serif-italic"},{set:B,type:"identifier",role:"latinletter",font:"sans-serif-bold-italic"},{set:D,type:"identifier",role:"latinletter",font:"sans-serif-bold-italic"},{set:Z,type:"identifier",role:"latinletter",font:"monospace"},{set:F,type:"identifier",role:"latinletter",font:"monospace"},{set:G,type:"identifier",role:"latinletter",font:"double-struck-italic"},{set:q,type:"identifier",role:"greekletter",font:"normal"},{set:U,type:"identifier",role:"greekletter",font:"normal"},{set:X,type:"identifier",role:"greekletter",font:"bold"},{set:W,type:"identifier",role:"greekletter",font:"bold"},{set:J,type:"identifier",role:"greekletter",font:"italic"},{set:z,type:"identifier",role:"greekletter",font:"italic"},{set:$,type:"identifier",role:"greekletter",font:"bold-italic"},{set:K,type:"identifier",role:"greekletter",font:"bold-italic"},{set:tt,type:"identifier",role:"greekletter",font:"sans-serif-bold"},{set:Y,type:"identifier",role:"greekletter",font:"sans-serif-bold"},{set:et,type:"identifier",role:"greekletter",font:"sans-serif-bold-italic"},{set:rt,type:"identifier",role:"greekletter",font:"sans-serif-bold-italic"},{set:nt,type:"identifier",role:"greekletter",font:"double-struck"},{set:ot,type:"identifier",role:"greekletter",font:"normal"},{set:it,type:"identifier",role:"greekletter",font:"bold"},{set:Qt,type:"identifier",role:"greekletter",font:"italic"},{set:Tt,type:"identifier",role:"greekletter",font:"sans-serif-bold"},{set:st,type:"identifier",role:"otherletter",font:"normal"},{set:["0","1","2","3","4","5","6","7","8","9"],type:"number",role:"integer",font:"normal"},{set:["\uff10","\uff11","\uff12","\uff13","\uff14","\uff15","\uff16","\uff17","\uff18","\uff19"],type:"number",role:"integer",font:"normal"},{set:["\ud835\udfce","\ud835\udfcf","\ud835\udfd0","\ud835\udfd1","\ud835\udfd2","\ud835\udfd3","\ud835\udfd4","\ud835\udfd5","\ud835\udfd6","\ud835\udfd7"],type:"number",role:"integer",font:"bold"},{set:["\ud835\udfd8","\ud835\udfd9","\ud835\udfda","\ud835\udfdb","\ud835\udfdc","\ud835\udfdd","\ud835\udfde","\ud835\udfdf","\ud835\udfe0","\ud835\udfe1"],type:"number",role:"integer",font:"double-struck"},{set:["\ud835\udfe2","\ud835\udfe3","\ud835\udfe4","\ud835\udfe5","\ud835\udfe6","\ud835\udfe7","\ud835\udfe8","\ud835\udfe9","\ud835\udfea","\ud835\udfeb"],type:"number",role:"integer",font:"sans-serif"},{set:["\ud835\udfec","\ud835\udfed","\ud835\udfee","\ud835\udfef","\ud835\udff0","\ud835\udff1","\ud835\udff2","\ud835\udff3","\ud835\udff4","\ud835\udff5"],type:"number",role:"integer",font:"sans-serif-bold"},{set:["\ud835\udff6","\ud835\udff7","\ud835\udff8","\ud835\udff9","\ud835\udffa","\ud835\udffb","\ud835\udffc","\ud835\udffd","\ud835\udffe","\ud835\udfff"],type:"number",role:"integer",font:"monospace"},{set:dt,type:"number",role:"float"},{set:ft,type:"number",role:"othernumber"},{set:lt,type:"operator",role:"addition"},{set:ut,type:"operator",role:"multiplication"},{set:["\xaf","-","\u2052","\u207b","\u208b","\u2212","\u2216","\u2238","\u2242","\u2296","\u229f","\u2796","\u2a29","\u2a2a","\u2a2b","\u2a2c","\u2a3a","\u2a41","\ufe63","\uff0d","\u2010","\u2011"],type:"operator",role:"subtraction"},{set:["/","\xf7","\u2044","\u2215","\u2298","\u27cc","\u29bc","\u2a38"],type:"operator",role:"division"},{set:["\u2200","\u2203","\u2206","\u2207","\u2202","\u2201","\u2204"],type:"operator",role:"prefix operator"},{set:["\ud835\udec1","\ud835\udedb","\ud835\udfca","\ud835\udfcb"],type:"operator",role:"prefix operator",font:"bold"},{set:["\ud835\udefb","\ud835\udf15"],type:"operator",role:"prefix operator",font:"italic"},{set:["\ud835\udf6f","\ud835\udf89"],type:"operator",role:"prefix operator",font:"sans-serif-bold"},{set:["=","~","\u207c","\u208c","\u223c","\u223d","\u2243","\u2245","\u2248","\u224a","\u224b","\u224c","\u224d","\u224e","\u2251","\u2252","\u2253","\u2254","\u2255","\u2256","\u2257","\u2258","\u2259","\u225a","\u225b","\u225c","\u225d","\u225e","\u225f","\u2261","\u2263","\u29e4","\u2a66","\u2a6e","\u2a6f","\u2a70","\u2a71","\u2a72","\u2a73","\u2a74","\u2a75","\u2a76","\u2a77","\u2a78","\u22d5","\u2a6d","\u2a6a","\u2a6b","\u2a6c","\ufe66","\uff1d","\u2a6c","\u229c","\u2237"],type:"relation",role:"equality"},{set:["<",">","\u2241","\u2242","\u2244","\u2246","\u2247","\u2249","\u224f","\u2250","\u2260","\u2262","\u2264","\u2265","\u2266","\u2267","\u2268","\u2269","\u226a","\u226b","\u226c","\u226d","\u226e","\u226f","\u2270","\u2271","\u2272","\u2273","\u2274","\u2275","\u2276","\u2277","\u2278","\u2279","\u227a","\u227b","\u227c","\u227d","\u227e","\u227f","\u2280","\u2281","\u22d6","\u22d7","\u22d8","\u22d9","\u22da","\u22db","\u22dc","\u22dd","\u22de","\u22df","\u22e0","\u22e1","\u22e6","\u22e7","\u22e8","\u22e9","\u2a79","\u2a7a","\u2a7b","\u2a7c","\u2a7d","\u2a7e","\u2a7f","\u2a80","\u2a81","\u2a82","\u2a83","\u2a84","\u2a85","\u2a86","\u2a87","\u2a88","\u2a89","\u2a8a","\u2a8b","\u2a8c","\u2a8d","\u2a8e","\u2a8f","\u2a90","\u2a91","\u2a92","\u2a93","\u2a94","\u2a95","\u2a96","\u2a97","\u2a98","\u2a99","\u2a9a","\u2a9b","\u2a9c","\u2a9d","\u2a9e","\u2a9f","\u2aa0","\u2aa1","\u2aa2","\u2aa3","\u2aa4","\u2aa5","\u2aa6","\u2aa7","\u2aa8","\u2aa9","\u2aaa","\u2aab","\u2aac","\u2aad","\u2aae","\u2aaf","\u2ab0","\u2ab1","\u2ab2","\u2ab3","\u2ab4","\u2ab5","\u2ab6","\u2ab7","\u2ab8","\u2ab9","\u2aba","\u2abb","\u2abc","\u2af7","\u2af8","\u2af9","\u2afa","\u29c0","\u29c1","\ufe64","\ufe65","\uff1c","\uff1e"],type:"relation",role:"inequality"},{set:["\u22e2","\u22e3","\u22e4","\u22e5","\u2282","\u2283","\u2284","\u2285","\u2286","\u2287","\u2288","\u2289","\u228a","\u228b","\u228f","\u2290","\u2291","\u2292","\u2abd","\u2abe","\u2abf","\u2ac0","\u2ac1","\u2ac2","\u2ac3","\u2ac4","\u2ac5","\u2ac6","\u2ac7","\u2ac8","\u2ac9","\u2aca","\u2acb","\u2acc","\u2acd","\u2ace","\u2acf","\u2ad0","\u2ad1","\u2ad2","\u2ad3","\u2ad4","\u2ad5","\u2ad6","\u2ad7","\u2ad8","\u22d0","\u22d1","\u22ea","\u22eb","\u22ec","\u22ed","\u22b2","\u22b3","\u22b4","\u22b5"],type:"relation",role:"set"},{set:["\u22a2","\u22a3","\u22a6","\u22a7","\u22a8","\u22a9","\u22aa","\u22ab","\u22ac","\u22ad","\u22ae","\u22af","\u2ade","\u2adf","\u2ae0","\u2ae1","\u2ae2","\u2ae3","\u2ae4","\u2ae5","\u2ae6","\u2ae7","\u2ae8","\u2ae9","\u2aea","\u2aeb","\u2aec","\u2aed"],type:"relation",role:"unknown"},{set:["\u2190","\u2191","\u2192","\u2193","\u2194","\u2195","\u2196","\u2197","\u2198","\u2199","\u219a","\u219b","\u219c","\u219d","\u219e","\u219f","\u21a0","\u21a1","\u21a2","\u21a3","\u21a4","\u21a5","\u21a6","\u21a7","\u21a8","\u21a9","\u21aa","\u21ab","\u21ac","\u21ad","\u21ae","\u21af","\u21b0","\u21b1","\u21b2","\u21b3","\u21b4","\u21b5","\u21b6","\u21b7","\u21b8","\u21b9","\u21ba","\u21bb","\u21c4","\u21c5","\u21c6","\u21c7","\u21c8","\u21c9","\u21ca","\u21cd","\u21ce","\u21cf","\u21d0","\u21d1","\u21d2","\u21d3","\u21d4","\u21d5","\u21d6","\u21d7","\u21d8","\u21d9","\u21da","\u21db","\u21dc","\u21dd","\u21de","\u21df","\u21e0","\u21e1","\u21e2","\u21e3","\u21e4","\u21e5","\u21e6","\u21e7","\u21e8","\u21e9","\u21ea","\u21eb","\u21ec","\u21ed","\u21ee","\u21ef","\u21f0","\u21f1","\u21f2","\u21f3","\u21f4","\u21f5","\u21f6","\u21f7","\u21f8","\u21f9","\u21fa","\u21fb","\u21fc","\u21fd","\u21fe","\u21ff","\u2301","\u2303","\u2304","\u2324","\u238b","\u2794","\u2798","\u2799","\u279a","\u279b","\u279c","\u279d","\u279e","\u279f","\u27a0","\u27a1","\u27a2","\u27a3","\u27a4","\u27a5","\u27a6","\u27a7","\u27a8","\u27a9","\u27aa","\u27ab","\u27ac","\u27ad","\u27ae","\u27af","\u27b1","\u27b2","\u27b3","\u27b4","\u27b5","\u27b6","\u27b7","\u27b8","\u27b9","\u27ba","\u27bb","\u27bc","\u27bd","\u27be","\u27f0","\u27f1","\u27f2","\u27f3","\u27f4","\u27f5","\u27f6","\u27f7","\u27f8","\u27f9","\u27fa","\u27fb","\u27fc","\u27fd","\u27fe","\u27ff","\u2900","\u2901","\u2902","\u2903","\u2904","\u2905","\u2906","\u2907","\u2908","\u2909","\u290a","\u290b","\u290c","\u290d","\u290e","\u290f","\u2910","\u2911","\u2912","\u2913","\u2914","\u2915","\u2916","\u2917","\u2918","\u2919","\u291a","\u291b","\u291c","\u291d","\u291e","\u291f","\u2920","\u2921","\u2922","\u2923","\u2924","\u2925","\u2926","\u2927","\u2928","\u2929","\u292a","\u292d","\u292e","\u292f","\u2930","\u2931","\u2932","\u2933","\u2934","\u2935","\u2936","\u2937","\u2938","\u2939","\u293a","\u293b","\u293c","\u293d","\u293e","\u293f","\u2940","\u2941","\u2942","\u2943","\u2944","\u2945","\u2946","\u2947","\u2948","\u2949","\u2970","\u2971","\u2972","\u2973","\u2974","\u2975","\u2976","\u2977","\u2978","\u2979","\u297a","\u297b","\u29b3","\u29b4","\u29bd","\u29ea","\u29ec","\u29ed","\u2a17","\u2b00","\u2b01","\u2b02","\u2b03","\u2b04","\u2b05","\u2b06","\u2b07","\u2b08","\u2b09","\u2b0a","\u2b0b","\u2b0c","\u2b0d","\u2b0e","\u2b0f","\u2b10","\u2b11","\u2b30","\u2b31","\u2b32","\u2b33","\u2b34","\u2b35","\u2b36","\u2b37","\u2b38","\u2b39","\u2b3a","\u2b3b","\u2b3c","\u2b3d","\u2b3e","\u2b3f","\u2b40","\u2b41","\u2b42","\u2b43","\u2b44","\u2b45","\u2b46","\u2b47","\u2b48","\u2b49","\u2b4a","\u2b4b","\u2b4c","\uffe9","\uffea","\uffeb","\uffec","\u21bc","\u21bd","\u21be","\u21bf","\u21c0","\u21c1","\u21c2","\u21c3","\u21cb","\u21cc","\u294a","\u294b","\u294c","\u294d","\u294e","\u294f","\u2950","\u2951","\u2952","\u2953","\u2954","\u2955","\u2956","\u2957","\u2958","\u2959","\u295a","\u295b","\u295c","\u295d","\u295e","\u295f","\u2960","\u2961","\u2962","\u2963","\u2964","\u2965","\u2966","\u2967","\u2968","\u2969","\u296a","\u296b","\u296c","\u296d","\u296e","\u296f","\u297c","\u297d","\u297e","\u297f"],type:"relation",role:"arrow"},{set:["\u2208","\u220a","\u22f2","\u22f3","\u22f4","\u22f5","\u22f6","\u22f7","\u22f8","\u22f9","\u22ff"],type:"operator",role:"element"},{set:["\u2209"],type:"operator",role:"nonelement"},{set:["\u220b","\u220d","\u22fa","\u22fb","\u22fc","\u22fd","\u22fe"],type:"operator",role:"reelement"},{set:["\u220c"],type:"operator",role:"renonelement"},{set:["\u2140","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a03","\u2a04","\u2a05","\u2a06","\u2a07","\u2a08","\u2a09","\u2a0a","\u2a0b","\u2afc","\u2aff"],type:"largeop",role:"sum"},{set:["\u222b","\u222c","\u222d","\u222e","\u222f","\u2230","\u2231","\u2232","\u2233","\u2a0c","\u2a0d","\u2a0e","\u2a0f","\u2a10","\u2a11","\u2a12","\u2a13","\u2a14","\u2a15","\u2a16","\u2a17","\u2a18","\u2a19","\u2a1a","\u2a1b","\u2a1c"],type:"largeop",role:"integral"},{set:["\u221f","\u2220","\u2221","\u2222","\u22be","\u22bf","\u25b3","\u25b7","\u25bd","\u25c1"],type:"operator",role:"geometry"},{set:["inf","lim","liminf","limsup","max","min","sup","injlim","projlim","inj lim","proj lim"],type:"function",role:"limit function"},{set:Lt,type:"function",role:"prefix function"},{set:["mod","rem"],type:"operator",role:"prefix function"}],yt=function(){const t={};for(let e,r=0;e=mt[r];r++)e.set.forEach((function(r){t[r]={role:e.role||"unknown",type:e.type||"unknown",font:e.font||"unknown"}}));return t}();e.equal=function(t,e){return t.type===e.type&&t.role===e.role&&t.font===e.font},e.lookupType=function(t){var e;return(null===(e=yt[t])||void 0===e?void 0:e.type)||"unknown"},e.lookupRole=function(t){var e;return(null===(e=yt[t])||void 0===e?void 0:e.role)||"unknown"},e.lookupMeaning=function(t){return yt[t]||{role:"unknown",type:"unknown",font:"unknown"}},e.invisibleTimes=function(){return pt},e.invisiblePlus=function(){return ct},e.invisibleComma=function(){return r},e.functionApplication=function(){return ht},e.isMatchingFence=function(t,e){return-1!==u.indexOf(t)||-1!==p.indexOf(t)?t===e:Q[t]===e||T[t]===e},e.isEmbellishedType=function(t){return"operator"===t||"relation"===t||"fence"===t||"punctuation"===t};const gt=new Map;function Ht(t,e){return`${t} ${e}`}function bt(t,e,r=""){for(const n of e)gt.set(Ht(t,n),r||t)}bt("d",["d","\u2146","\uff44","\ud835\udc1d","\ud835\udc51","\ud835\udcb9","\ud835\udced","\ud835\udd21","\ud835\udd55","\ud835\udd89","\ud835\uddbd","\ud835\uddf1","\ud835\ude25","\ud835\ude8d"]),bt("bar",o),bt("tilde",i),e.lookupSecondary=function(t,e){return gt.get(Ht(t,e))}},8158:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticMeaningCollator=e.SemanticNodeCollator=e.SemanticDefault=void 0;const n=r(3588),o=r(3882);class i{constructor(){this.map={}}static key(t,e){return e?t+":"+e:t}add(t,e){this.map[i.key(t,e.font)]=e}addNode(t){this.add(t.textContent,t.meaning())}retrieve(t,e){return this.map[i.key(t,e)]}retrieveNode(t){return this.retrieve(t.textContent,t.font)}size(){return Object.keys(this.map).length}}e.SemanticDefault=i;class Q{constructor(){this.map={}}add(t,e){const r=this.map[t];r?r.push(e):this.map[t]=[e]}retrieve(t,e){return this.map[i.key(t,e)]}retrieveNode(t){return this.retrieve(t.textContent,t.font)}copy(){const t=this.copyCollator();for(const e in this.map)t.map[e]=this.map[e];return t}minimize(){for(const t in this.map)1===this.map[t].length&&delete this.map[t]}minimalCollator(){const t=this.copy();for(const e in t.map)1===t.map[e].length&&delete t.map[e];return t}isMultiValued(){for(const t in this.map)if(this.map[t].length>1)return!0;return!1}isEmpty(){return!Object.keys(this.map).length}}class T extends Q{copyCollator(){return new T}add(t,e){const r=i.key(t,e.font);super.add(r,e)}addNode(t){this.add(t.textContent,t)}toString(){const t=[];for(const e in this.map){const r=Array(e.length+3).join(" "),n=this.map[e],o=[];for(let t,e=0;t=n[e];e++)o.push(t.toString());t.push(e+": "+o.join("\n"+r))}return t.join("\n")}collateMeaning(){const t=new s;for(const e in this.map)t.map[e]=this.map[e].map((function(t){return t.meaning()}));return t}}e.SemanticNodeCollator=T;class s extends Q{copyCollator(){return new s}add(t,e){const r=this.retrieve(t,e.font);if(!r||!r.find((function(t){return n.equal(t,e)}))){const r=i.key(t,e.font);super.add(r,e)}}addNode(t){this.add(t.textContent,t.meaning())}toString(){const t=[];for(const e in this.map){const r=Array(e.length+3).join(" "),n=this.map[e],o=[];for(let t,e=0;t=n[e];e++)o.push("{type: "+t.type+", role: "+t.role+", font: "+t.font+"}");t.push(e+": "+o.join("\n"+r))}return t.join("\n")}reduce(){for(const t in this.map)1!==this.map[t].length&&(this.map[t]=(0,o.reduce)(this.map[t]))}default(){const t=new i;for(const e in this.map)1===this.map[e].length&&(t.map[e]=this.map[e][0]);return t}newDefault(){const t=this.default();this.reduce();const e=this.default();return t.size()!==e.size()?e:null}}e.SemanticMeaningCollator=s},9911:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticMultiHeuristic=e.SemanticTreeHeuristic=e.SemanticAbstractHeuristic=void 0;class r{constructor(t,e,r=(t=>!1)){this.name=t,this.apply=e,this.applicable=r}}e.SemanticAbstractHeuristic=r;e.SemanticTreeHeuristic=class extends r{};e.SemanticMultiHeuristic=class extends r{}},7516:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.lookup=e.run=e.add=e.blacklist=e.flags=e.updateFactory=e.factory=void 0,e.factory=null,e.updateFactory=function(t){e.factory=t};const r=new Map;function n(t){return r.get(t)}e.flags={combine_juxtaposition:!0,convert_juxtaposition:!0,multioperator:!0},e.blacklist={},e.add=function(t){const n=t.name;r.set(n,t),e.flags[n]||(e.flags[n]=!1)},e.run=function(t,r,o){const i=n(t);return i&&!e.blacklist[t]&&(e.flags[t]||i.applicable(r))?i.apply(r):o?o(r):r},e.lookup=n},94:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(2057),o=r(5897),i=r(3588),Q=r(7516),T=r(9911),s=r(5609),a=r(3308),l=r(4795);function c(t,e,r){let n=null;if(!t.length)return n;const o=r[r.length-1],i=o&&o.length,Q=e&&e.length,T=a.default.getInstance();if(i&&Q){if("infixop"===e[0].type&&"implicit"===e[0].role)return n=t.pop(),o.push(T.postfixNode_(o.pop(),t)),n;n=t.shift();const r=T.prefixNode_(e.shift(),t);return e.unshift(r),n}return i?(o.push(T.postfixNode_(o.pop(),t)),n):(Q&&e.unshift(T.prefixNode_(e.shift(),t)),n)}function u(t,e,r){if(!e.length)return t;const o=t.pop(),i=e.shift(),T=r.shift();if(s.isImplicitOp(i)){n.Debugger.getInstance().output("Juxta Heuristic Case 2");const Q=(o?[o,i]:[i]).concat(T);return u(t.concat(Q),e,r)}if(!o)return n.Debugger.getInstance().output("Juxta Heuristic Case 3"),u([i].concat(T),e,r);const a=T.shift();if(!a){n.Debugger.getInstance().output("Juxta Heuristic Case 9");const T=Q.factory.makeBranchNode("infixop",[o,e.shift()],[i],i.textContent);return T.role="implicit",Q.run("combine_juxtaposition",T),e.unshift(T),u(t,e,r)}if(s.isOperator(o)||s.isOperator(a))return n.Debugger.getInstance().output("Juxta Heuristic Case 4"),u(t.concat([o,i,a]).concat(T),e,r);let l=null;return s.isImplicitOp(o)&&s.isImplicitOp(a)?(n.Debugger.getInstance().output("Juxta Heuristic Case 5"),o.contentNodes.push(i),o.contentNodes=o.contentNodes.concat(a.contentNodes),o.childNodes.push(a),o.childNodes=o.childNodes.concat(a.childNodes),a.childNodes.forEach((t=>t.parent=o)),i.parent=o,o.addMathmlNodes(i.mathml),o.addMathmlNodes(a.mathml),l=o):s.isImplicitOp(o)?(n.Debugger.getInstance().output("Juxta Heuristic Case 6"),o.contentNodes.push(i),o.childNodes.push(a),a.parent=o,i.parent=o,o.addMathmlNodes(i.mathml),o.addMathmlNodes(a.mathml),l=o):s.isImplicitOp(a)?(n.Debugger.getInstance().output("Juxta Heuristic Case 7"),a.contentNodes.unshift(i),a.childNodes.unshift(o),o.parent=a,i.parent=a,a.addMathmlNodes(i.mathml),a.addMathmlNodes(o.mathml),l=a):(n.Debugger.getInstance().output("Juxta Heuristic Case 8"),l=Q.factory.makeBranchNode("infixop",[o,a],[i],i.textContent),l.role="implicit"),t.push(l),u(t.concat(T),e,r)}Q.add(new T.SemanticTreeHeuristic("combine_juxtaposition",(function(t){for(let e,r=t.childNodes.length-1;e=t.childNodes[r];r--)s.isImplicitOp(e)&&!e.nobreaking&&(t.childNodes.splice(r,1,...e.childNodes),t.contentNodes.splice(r,0,...e.contentNodes),e.childNodes.concat(e.contentNodes).forEach((function(e){e.parent=t})),t.addMathmlNodes(e.mathml));return t}))),Q.add(new T.SemanticTreeHeuristic("propagateSimpleFunction",(t=>("infixop"!==t.type&&"fraction"!==t.type||!t.childNodes.every(s.isSimpleFunction)||(t.role="composed function"),t)),(t=>"clearspeak"===o.default.getInstance().domain))),Q.add(new T.SemanticTreeHeuristic("simpleNamedFunction",(t=>("unit"!==t.role&&-1!==["f","g","h","F","G","H"].indexOf(t.textContent)&&(t.role="simple function"),t)),(t=>"clearspeak"===o.default.getInstance().domain))),Q.add(new T.SemanticTreeHeuristic("propagateComposedFunction",(t=>("fenced"===t.type&&"composed function"===t.childNodes[0].role&&(t.role="composed function"),t)),(t=>"clearspeak"===o.default.getInstance().domain))),Q.add(new T.SemanticTreeHeuristic("multioperator",(t=>{if("unknown"!==t.role||t.textContent.length<=1)return;const e=[...t.textContent].map(i.lookupMeaning).reduce((function(t,e){return t&&e.role&&"unknown"!==e.role&&e.role!==t?"unknown"===t?e.role:null:t}),"unknown");e&&(t.role=e)}))),Q.add(new T.SemanticMultiHeuristic("convert_juxtaposition",(t=>{let e=l.partitionNodes(t,(function(t){return t.textContent===i.invisibleTimes()&&"operator"===t.type}));e=e.rel.length?function(t){const e=[],r=[];let n=t.comp.shift(),o=null,i=[];for(;t.comp.length;)if(i=[],n.length)o&&e.push(o),r.push(n),o=t.rel.shift(),n=t.comp.shift();else{for(o&&i.push(o);!n.length&&t.comp.length;)n=t.comp.shift(),i.push(t.rel.shift());o=c(i,n,r)}i.length||n.length?(e.push(o),r.push(n)):(i.push(o),c(i,n,r));return{rel:e,comp:r}}(e):e,t=e.comp[0];for(let r,n,o=1;r=e.comp[o],n=e.rel[o-1];o++)t.push(n),t=t.concat(r);return e=l.partitionNodes(t,(function(t){return t.textContent===i.invisibleTimes()&&("operator"===t.type||"infixop"===t.type)})),e.rel.length?u(e.comp.shift(),e.rel,e.comp):t}))),Q.add(new T.SemanticTreeHeuristic("simple2prefix",(t=>(t.textContent.length>1&&!t.textContent[0].match(/[A-Z]/)&&(t.role="prefix function"),t)),(t=>"braille"===o.default.getInstance().modality&&"identifier"===t.type))),Q.add(new T.SemanticTreeHeuristic("detect_cycle",(t=>{t.type="matrix",t.role="cycle";const e=t.childNodes[0];return e.type="row",e.role="cycle",e.textContent="",e.contentNodes=[],t}),(t=>"fenced"===t.type&&"infixop"===t.childNodes[0].type&&"implicit"===t.childNodes[0].role&&t.childNodes[0].childNodes.every((function(t){return"number"===t.type}))&&t.childNodes[0].contentNodes.every((function(t){return"space"===t.role})))))},7228:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticMathml=void 0;const n=r(5740),o=r(5250),i=r(5609),Q=r(3308),T=r(4795);class s extends o.SemanticAbstractParser{constructor(){super("MathML"),this.parseMap_={SEMANTICS:this.semantics_.bind(this),MATH:this.rows_.bind(this),MROW:this.rows_.bind(this),MPADDED:this.rows_.bind(this),MSTYLE:this.rows_.bind(this),MFRAC:this.fraction_.bind(this),MSUB:this.limits_.bind(this),MSUP:this.limits_.bind(this),MSUBSUP:this.limits_.bind(this),MOVER:this.limits_.bind(this),MUNDER:this.limits_.bind(this),MUNDEROVER:this.limits_.bind(this),MROOT:this.root_.bind(this),MSQRT:this.sqrt_.bind(this),MTABLE:this.table_.bind(this),MLABELEDTR:this.tableLabeledRow_.bind(this),MTR:this.tableRow_.bind(this),MTD:this.tableCell_.bind(this),MS:this.text_.bind(this),MTEXT:this.text_.bind(this),MSPACE:this.space_.bind(this),"ANNOTATION-XML":this.text_.bind(this),MI:this.identifier_.bind(this),MN:this.number_.bind(this),MO:this.operator_.bind(this),MFENCED:this.fenced_.bind(this),MENCLOSE:this.enclosed_.bind(this),MMULTISCRIPTS:this.multiscripts_.bind(this),ANNOTATION:this.empty_.bind(this),NONE:this.empty_.bind(this),MACTION:this.action_.bind(this)};const t={type:"identifier",role:"numbersetletter",font:"double-struck"};["C","H","N","P","Q","R","Z","\u2102","\u210d","\u2115","\u2119","\u211a","\u211d","\u2124"].forEach((e=>this.getFactory().defaultMap.add(e,t)).bind(this))}static getAttribute_(t,e,r){if(!t.hasAttribute(e))return r;const n=t.getAttribute(e);return n.match(/^\s*$/)?null:n}parse(t){Q.default.getInstance().setNodeFactory(this.getFactory());const e=n.toArray(t.childNodes),r=n.tagName(t),o=this.parseMap_[r],i=(o||this.dummy_.bind(this))(t,e);return T.addAttributes(i,t),-1!==["MATH","MROW","MPADDED","MSTYLE","SEMANTICS"].indexOf(r)||(i.mathml.unshift(t),i.mathmlTree=t),i}semantics_(t,e){return e.length?this.parse(e[0]):this.getFactory().makeEmptyNode()}rows_(t,e){const r=t.getAttribute("semantics");if(r&&r.match("bspr_"))return Q.default.proof(t,r,this.parseList.bind(this));let n;return 1===(e=T.purgeNodes(e)).length?(n=this.parse(e[0]),"empty"!==n.type||n.mathmlTree||(n.mathmlTree=t)):n=Q.default.getInstance().row(this.parseList(e)),n.mathml.unshift(t),n}fraction_(t,e){if(!e.length)return this.getFactory().makeEmptyNode();const r=this.parse(e[0]),n=e[1]?this.parse(e[1]):this.getFactory().makeEmptyNode();return Q.default.getInstance().fractionLikeNode(r,n,t.getAttribute("linethickness"),"true"===t.getAttribute("bevelled"))}limits_(t,e){return Q.default.getInstance().limitNode(n.tagName(t),this.parseList(e))}root_(t,e){return e[1]?this.getFactory().makeBranchNode("root",[this.parse(e[1]),this.parse(e[0])],[]):this.sqrt_(t,e)}sqrt_(t,e){const r=this.parseList(T.purgeNodes(e));return this.getFactory().makeBranchNode("sqrt",[Q.default.getInstance().row(r)],[])}table_(t,e){const r=t.getAttribute("semantics");if(r&&r.match("bspr_"))return Q.default.proof(t,r,this.parseList.bind(this));const n=this.getFactory().makeBranchNode("table",this.parseList(e),[]);return n.mathmlTree=t,Q.default.tableToMultiline(n),n}tableRow_(t,e){const r=this.getFactory().makeBranchNode("row",this.parseList(e),[]);return r.role="table",r}tableLabeledRow_(t,e){if(!e.length)return this.tableRow_(t,e);const r=this.parse(e[0]);r.role="label";const n=this.getFactory().makeBranchNode("row",this.parseList(e.slice(1)),[r]);return n.role="table",n}tableCell_(t,e){const r=this.parseList(T.purgeNodes(e));let n;n=r.length?1===r.length&&i.isType(r[0],"empty")?r:[Q.default.getInstance().row(r)]:[];const o=this.getFactory().makeBranchNode("cell",n,[]);return o.role="table",o}space_(t,e){const r=t.getAttribute("width"),o=r&&r.match(/[a-z]*$/);if(!o)return this.empty_(t,e);const i=o[0],T=parseFloat(r.slice(0,o.index)),s={cm:.4,pc:.5,em:.5,ex:1,in:.15,pt:5,mm:5}[i];if(!s||isNaN(T)||T1?this.parse(e[1]):this.getFactory().makeUnprocessed(t)}dummy_(t,e){const r=this.getFactory().makeUnprocessed(t);return r.role=t.tagName,r.textContent=t.textContent,r}leaf_(t,e){if(1===e.length&&e[0].nodeType!==n.NodeType.TEXT_NODE){const r=this.getFactory().makeUnprocessed(t);return r.role=e[0].tagName,T.addAttributes(r,e[0]),r}return this.getFactory().makeLeafNode(t.textContent,Q.default.getInstance().font(t.getAttribute("mathvariant")))}}e.SemanticMathml=s},5952:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticNode=void 0;const n=r(5740),o=r(3588),i=r(4795);class Q{constructor(t){this.id=t,this.mathml=[],this.parent=null,this.type="unknown",this.role="unknown",this.font="unknown",this.embellished=null,this.fencePointer="",this.childNodes=[],this.textContent="",this.mathmlTree=null,this.contentNodes=[],this.annotation={},this.attributes={},this.nobreaking=!1}static fromXml(t){const e=parseInt(t.getAttribute("id"),10),r=new Q(e);return r.type=t.tagName,Q.setAttribute(r,t,"role"),Q.setAttribute(r,t,"font"),Q.setAttribute(r,t,"embellished"),Q.setAttribute(r,t,"fencepointer","fencePointer"),t.getAttribute("annotation")&&r.parseAnnotation(t.getAttribute("annotation")),i.addAttributes(r,t),Q.processChildren(r,t),r}static setAttribute(t,e,r,n){n=n||r;const o=e.getAttribute(r);o&&(t[n]=o)}static processChildren(t,e){for(const r of n.toArray(e.childNodes)){if(r.nodeType===n.NodeType.TEXT_NODE){t.textContent=r.textContent;continue}const e=n.toArray(r.childNodes).map(Q.fromXml);e.forEach((e=>e.parent=t)),"CONTENT"===n.tagName(r)?t.contentNodes=e:t.childNodes=e}}querySelectorAll(t){let e=[];for(let r,n=0;r=this.childNodes[n];n++)e=e.concat(r.querySelectorAll(t));for(let r,n=0;r=this.contentNodes[n];n++)e=e.concat(r.querySelectorAll(t));return t(this)&&e.unshift(this),e}xml(t,e){const r=function(r,n){const o=n.map((function(r){return r.xml(t,e)})),i=t.createElementNS("",r);for(let t,e=0;t=o[e];e++)i.appendChild(t);return i},n=t.createElementNS("",this.type);return e||this.xmlAttributes(n),n.textContent=this.textContent,this.contentNodes.length>0&&n.appendChild(r("content",this.contentNodes)),this.childNodes.length>0&&n.appendChild(r("children",this.childNodes)),n}toString(t=!1){const e=n.parseInput("");return n.serializeXml(this.xml(e,t))}allAttributes(){const t=[];return t.push(["role",this.role]),"unknown"!==this.font&&t.push(["font",this.font]),Object.keys(this.annotation).length&&t.push(["annotation",this.xmlAnnotation()]),this.embellished&&t.push(["embellished",this.embellished]),this.fencePointer&&t.push(["fencepointer",this.fencePointer]),t.push(["id",this.id.toString()]),t}xmlAnnotation(){const t=[];for(const e in this.annotation)this.annotation[e].forEach((function(r){t.push(e+":"+r)}));return t.join(";")}toJson(){const t={};t.type=this.type;const e=this.allAttributes();for(let r,n=0;r=e[n];n++)t[r[0]]=r[1].toString();return this.textContent&&(t.$t=this.textContent),this.childNodes.length&&(t.children=this.childNodes.map((function(t){return t.toJson()}))),this.contentNodes.length&&(t.content=this.contentNodes.map((function(t){return t.toJson()}))),t}updateContent(t,e){const r=e?t.replace(/^[ \f\n\r\t\v\u200b]*/,"").replace(/[ \f\n\r\t\v\u200b]*$/,""):t.trim();if(t=t&&!r?t:r,this.textContent===t)return;const n=(0,o.lookupMeaning)(t);this.textContent=t,this.role=n.role,this.type=n.type,this.font=n.font}addMathmlNodes(t){for(let e,r=0;e=t[r];r++)-1===this.mathml.indexOf(e)&&this.mathml.push(e)}appendChild(t){this.childNodes.push(t),this.addMathmlNodes(t.mathml),t.parent=this}replaceChild(t,e){const r=this.childNodes.indexOf(t);if(-1===r)return;t.parent=null,e.parent=this,this.childNodes[r]=e;const n=t.mathml.filter((function(t){return-1===e.mathml.indexOf(t)})),o=e.mathml.filter((function(e){return-1===t.mathml.indexOf(e)}));this.removeMathmlNodes(n),this.addMathmlNodes(o)}appendContentNode(t){t&&(this.contentNodes.push(t),this.addMathmlNodes(t.mathml),t.parent=this)}removeContentNode(t){if(t){const e=this.contentNodes.indexOf(t);-1!==e&&this.contentNodes.slice(e,1)}}equals(t){if(!t)return!1;if(this.type!==t.type||this.role!==t.role||this.textContent!==t.textContent||this.childNodes.length!==t.childNodes.length||this.contentNodes.length!==t.contentNodes.length)return!1;for(let e,r,n=0;e=this.childNodes[n],r=t.childNodes[n];n++)if(!e.equals(r))return!1;for(let e,r,n=0;e=this.contentNodes[n],r=t.contentNodes[n];n++)if(!e.equals(r))return!1;return!0}displayTree(){console.info(this.displayTree_(0))}addAnnotation(t,e){e&&this.addAnnotation_(t,e)}getAnnotation(t){const e=this.annotation[t];return e||[]}hasAnnotation(t,e){const r=this.annotation[t];return!!r&&-1!==r.indexOf(e)}parseAnnotation(t){const e=t.split(";");for(let t=0,r=e.length;t1)return!1;const r=e[0];if("infixop"===r.type){if("implicit"!==r.role)return!1;if(r.childNodes.some((t=>i(t,"infixop"))))return!1}return!0},e.isPrefixFunctionBoundary=function(t){return a(t)&&!T(t,"division")||i(t,"appl")||s(t)},e.isBigOpBoundary=function(t){return a(t)||s(t)},e.isIntegralDxBoundary=function(t,e){return!!e&&i(e,"identifier")&&n.lookupSecondary("d",t.textContent)},e.isIntegralDxBoundarySingle=function(t){if(i(t,"identifier")){const e=t.textContent[0];return e&&t.textContent[1]&&n.lookupSecondary("d",e)}return!1},e.isGeneralFunctionBoundary=s,e.isEmbellished=function(t){return t.embellished?t.embellished:n.isEmbellishedType(t.type)?t.type:null},e.isOperator=a,e.isRelation=l,e.isPunctuation=c,e.isFence=u,e.isElligibleEmbellishedFence=function(t){return!(!t||!u(t))&&(!t.embellished||p(t))},e.isTableOrMultiline=h,e.tableIsMatrixOrVector=function(t){return!!t&&d(t)&&h(t.childNodes[0])},e.isFencedElement=d,e.tableIsCases=function(t,e){return e.length>0&&T(e[e.length-1],"openfence")},e.tableIsMultiline=function(t){return t.childNodes.every((function(t){return t.childNodes.length<=1}))},e.lineIsLabelled=function(t){return i(t,"line")&&t.contentNodes.length&&T(t.contentNodes[0],"label")},e.isBinomial=function(t){return 2===t.childNodes.length},e.isLimitBase=function t(e){return i(e,"largeop")||i(e,"limboth")||i(e,"limlower")||i(e,"limupper")||i(e,"function")&&T(e,"limit function")||(i(e,"overscore")||i(e,"underscore"))&&t(e.childNodes[0])},e.isSimpleFunctionHead=function(t){return"identifier"===t.type||"latinletter"===t.role||"greekletter"===t.role||"otherletter"===t.role},e.singlePunctAtPosition=function(t,e,r){return 1===e.length&&("punctuation"===t[r].type||"punctuation"===t[r].embellished)&&t[r]===e[0]},e.isSimpleFunction=function(t){return i(t,"identifier")&&T(t,"simple function")},e.isLeftBrace=f,e.isRightBrace=L,e.isSetNode=function(t){return f(t.contentNodes[0])&&L(t.contentNodes[1])},e.illegalSingleton_=["punctuation","punctuated","relseq","multirel","table","multiline","cases","inference"],e.scriptedElement_=["limupper","limlower","limboth","subscript","superscript","underscore","overscore","tensor"],e.isSingletonSetContent=function t(r){const n=r.type;return-1===e.illegalSingleton_.indexOf(n)&&("infixop"!==n||"implicit"===r.role)&&("fenced"===n?"leftright"!==r.role||t(r.childNodes[0]):-1===e.scriptedElement_.indexOf(n)||t(r.childNodes[0]))},e.isNumber=m,e.isUnitCounter=function(t){return m(t)||"vulgar"===t.role||"mixed"===t.role},e.isPureUnit=function(t){const e=t.childNodes;return"unit"===t.role&&(!e.length||"unit"===e[0].role)},e.isImplicit=function(t){return"implicit"===t.role||"unit"===t.role&&!!t.contentNodes.length&&t.contentNodes[0].textContent===n.invisibleTimes()},e.isImplicitOp=function(t){return"infixop"===t.type&&"implicit"===t.role},e.isNeutralFence=y,e.compareNeutralFences=function(t,e){return y(t)&&y(e)&&(0,o.getEmbellishedInner)(t).textContent===(0,o.getEmbellishedInner)(e).textContent},e.elligibleLeftNeutral=function(t){return!!y(t)&&(!t.embellished||"superscript"!==t.type&&"subscript"!==t.type&&("tensor"!==t.type||"empty"===t.childNodes[3].type&&"empty"===t.childNodes[4].type))},e.elligibleRightNeutral=function(t){return!!y(t)&&(!t.embellished||("tensor"!==t.type||"empty"===t.childNodes[1].type&&"empty"===t.childNodes[2].type))},e.isMembership=function(t){return["element","nonelement","reelement","renonelement"].includes(t.role)}},3308:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0});const n=r(5740),o=r(3588),i=r(7516),Q=r(6537),T=r(5609),s=r(4795);class a{constructor(){this.funcAppls={},this.factory_=new Q.SemanticNodeFactory,i.updateFactory(this.factory_)}static getInstance(){return a.instance=a.instance||new a,a.instance}static tableToMultiline(t){if(T.tableIsMultiline(t)){t.type="multiline";for(let e,r=0;e=t.childNodes[r];r++)a.rowToLine_(e,"multiline");1===t.childNodes.length&&!T.lineIsLabelled(t.childNodes[0])&&T.isFencedElement(t.childNodes[0].childNodes[0])&&a.tableToMatrixOrVector_(a.rewriteFencedLine_(t)),a.binomialForm_(t),a.classifyMultiline(t)}else a.classifyTable(t)}static number(t){"unknown"!==t.type&&"identifier"!==t.type||(t.type="number"),a.numberRole_(t),a.exprFont_(t)}static classifyMultiline(t){let e=0;const r=t.childNodes.length;let n;for(;e=r)return;const o=n.childNodes[0].role;"unknown"!==o&&t.childNodes.every((function(t){const e=t.childNodes[0];return!e||e.role===o&&(T.isType(e,"relation")||T.isType(e,"relseq"))}))&&(t.role=o)}static classifyTable(t){const e=a.computeColumns_(t);a.classifyByColumns_(t,e,"equality")||a.classifyByColumns_(t,e,"inequality",["equality"])||a.classifyByColumns_(t,e,"arrow")||a.detectCaleyTable(t)}static detectCaleyTable(t){if(!t.mathmlTree)return!1;const e=t.mathmlTree,r=e.getAttribute("columnlines"),n=e.getAttribute("rowlines");return!(!r||!n)&&(!(!a.cayleySpacing(r)||!a.cayleySpacing(n))&&(t.role="cayley",!0))}static cayleySpacing(t){const e=t.split(" ");return("solid"===e[0]||"dashed"===e[0])&&e.slice(1).every((t=>"none"===t))}static proof(t,e,r){const n=a.separateSemantics(e);return a.getInstance().proof(t,n,r)}static findSemantics(t,e,r){const n=null==r?null:r,o=a.getSemantics(t);return!!o&&(!!o[e]&&(null==n||o[e]===n))}static getSemantics(t){const e=t.getAttribute("semantics");return e?a.separateSemantics(e):null}static removePrefix(t){const[,...e]=t.split("_");return e.join("_")}static separateSemantics(t){const e={};return t.split(";").forEach((function(t){const[r,n]=t.split(":");e[a.removePrefix(r)]=n})),e}static matchSpaces_(t,e){for(let r,n=0;r=e[n];n++){const e=t[n].mathmlTree,o=t[n+1].mathmlTree;if(!e||!o)continue;const i=e.nextSibling;if(!i||i===o)continue;const Q=a.getSpacer_(i);Q&&(r.mathml.push(Q),r.mathmlTree=Q,r.role="space")}}static getSpacer_(t){if("MSPACE"===n.tagName(t))return t;for(;s.hasEmptyTag(t)&&1===t.childNodes.length;)if(t=t.childNodes[0],"MSPACE"===n.tagName(t))return t;return null}static fenceToPunct_(t){const e=a.FENCE_TO_PUNCT_[t.role];if(e){for(;t.embellished;)t.embellished="punctuation",T.isRole(t,"subsup")||T.isRole(t,"underover")||(t.role=e),t=t.childNodes[0];t.type="punctuation",t.role=e}}static classifyFunction_(t,e){if("appl"===t.type||"bigop"===t.type||"integral"===t.type)return"";if(e[0]&&e[0].textContent===o.functionApplication()){a.getInstance().funcAppls[t.id]=e.shift();let r="simple function";return i.run("simple2prefix",t),"prefix function"!==t.role&&"limit function"!==t.role||(r=t.role),a.propagateFunctionRole_(t,r),"prefix"}const r=a.CLASSIFY_FUNCTION_[t.role];return r||(T.isSimpleFunctionHead(t)?"simple":"")}static propagateFunctionRole_(t,e){if(t){if("infixop"===t.type)return;T.isRole(t,"subsup")||T.isRole(t,"underover")||(t.role=e),a.propagateFunctionRole_(t.childNodes[0],e)}}static getFunctionOp_(t,e){if(e(t))return t;for(let r,n=0;r=t.childNodes[n];n++){const t=a.getFunctionOp_(r,e);if(t)return t}return null}static tableToMatrixOrVector_(t){const e=t.childNodes[0];T.isType(e,"multiline")?a.tableToVector_(t):a.tableToMatrix_(t),t.contentNodes.forEach(e.appendContentNode.bind(e));for(let t,r=0;t=e.childNodes[r];r++)a.assignRoleToRow_(t,a.getComponentRoles_(e));return e.parent=null,e}static tableToVector_(t){const e=t.childNodes[0];e.type="vector",1!==e.childNodes.length?a.binomialForm_(e):a.tableToSquare_(t)}static binomialForm_(t){T.isBinomial(t)&&(t.role="binomial",t.childNodes[0].role="binomial",t.childNodes[1].role="binomial")}static tableToMatrix_(t){const e=t.childNodes[0];e.type="matrix",e.childNodes&&e.childNodes.length>0&&e.childNodes[0].childNodes&&e.childNodes.length===e.childNodes[0].childNodes.length?a.tableToSquare_(t):e.childNodes&&1===e.childNodes.length&&(e.role="rowvector")}static tableToSquare_(t){const e=t.childNodes[0];T.isNeutralFence(t)?e.role="determinant":e.role="squarematrix"}static getComponentRoles_(t){const e=t.role;return e&&"unknown"!==e?e:t.type.toLowerCase()||"unknown"}static tableToCases_(t,e){for(let e,r=0;e=t.childNodes[r];r++)a.assignRoleToRow_(e,"cases");return t.type="cases",t.appendContentNode(e),T.tableIsMultiline(t)&&a.binomialForm_(t),t}static rewriteFencedLine_(t){const e=t.childNodes[0],r=t.childNodes[0].childNodes[0],n=t.childNodes[0].childNodes[0].childNodes[0];return r.parent=t.parent,t.parent=r,n.parent=e,r.childNodes=[t],e.childNodes=[n],r}static rowToLine_(t,e){const r=e||"unknown";T.isType(t,"row")&&(t.type="line",t.role=r,1===t.childNodes.length&&T.isType(t.childNodes[0],"cell")&&(t.childNodes=t.childNodes[0].childNodes,t.childNodes.forEach((function(e){e.parent=t}))))}static assignRoleToRow_(t,e){T.isType(t,"line")?t.role=e:T.isType(t,"row")&&(t.role=e,t.childNodes.forEach((function(t){T.isType(t,"cell")&&(t.role=e)})))}static nextSeparatorFunction_(t){let e;if(t){if(t.match(/^\s+$/))return null;e=t.replace(/\s/g,"").split("").filter((function(t){return t}))}else e=[","];return function(){return e.length>1?e.shift():e[0]}}static numberRole_(t){if("unknown"!==t.role)return;const e=[...t.textContent].filter((t=>t.match(/[^\s]/))),r=e.map(o.lookupMeaning);if(r.every((function(t){return"number"===t.type&&"integer"===t.role||"punctuation"===t.type&&"comma"===t.role})))return t.role="integer",void("0"===e[0]&&t.addAnnotation("general","basenumber"));r.every((function(t){return"number"===t.type&&"integer"===t.role||"punctuation"===t.type}))?t.role="float":t.role="othernumber"}static exprFont_(t){if("unknown"!==t.font)return;const e=[...t.textContent].map(o.lookupMeaning).reduce((function(t,e){return t&&e.font&&"unknown"!==e.font&&e.font!==t?"unknown"===t?e.font:null:t}),"unknown");e&&(t.font=e)}static purgeFences_(t){const e=t.rel,r=t.comp,n=[],o=[];for(;e.length>0;){const t=e.shift();let i=r.shift();T.isElligibleEmbellishedFence(t)?(n.push(t),o.push(i)):(a.fenceToPunct_(t),i.push(t),i=i.concat(r.shift()),r.unshift(i))}return o.push(r.shift()),{rel:n,comp:o}}static rewriteFencedNode_(t){const e=t.contentNodes[0],r=t.contentNodes[1];let n=a.rewriteFence_(t,e);return t.contentNodes[0]=n.fence,n=a.rewriteFence_(n.node,r),t.contentNodes[1]=n.fence,t.contentNodes[0].parent=t,t.contentNodes[1].parent=t,n.node.parent=null,n.node}static rewriteFence_(t,e){if(!e.embellished)return{node:t,fence:e};const r=e.childNodes[0],n=a.rewriteFence_(t,r);return T.isType(e,"superscript")||T.isType(e,"subscript")||T.isType(e,"tensor")?(T.isRole(e,"subsup")||(e.role=t.role),r!==n.node&&(e.replaceChild(r,n.node),r.parent=t),a.propagateFencePointer_(e,r),{node:e,fence:n.fence}):(e.replaceChild(r,n.fence),e.mathmlTree&&-1===e.mathml.indexOf(e.mathmlTree)&&e.mathml.push(e.mathmlTree),{node:n.node,fence:e})}static propagateFencePointer_(t,e){t.fencePointer=e.fencePointer||e.id.toString(),t.embellished=null}static classifyByColumns_(t,e,r,n){return!!(3===e.length&&a.testColumns_(e,1,(t=>a.isPureRelation_(t,r)))||2===e.length&&(a.testColumns_(e,1,(t=>a.isEndRelation_(t,r)||a.isPureRelation_(t,r)))||a.testColumns_(e,0,(t=>a.isEndRelation_(t,r,!0)||a.isPureRelation_(t,r)))))&&(t.role=r,!0)}static isEndRelation_(t,e,r){const n=r?t.childNodes.length-1:0;return T.isType(t,"relseq")&&T.isRole(t,e)&&T.isType(t.childNodes[n],"empty")}static isPureRelation_(t,e){return T.isType(t,"relation")&&T.isRole(t,e)}static computeColumns_(t){const e=[];for(let r,n=0;r=t.childNodes[n];n++)for(let t,n=0;t=r.childNodes[n];n++){e[n]?e[n].push(t):e[n]=[t]}return e}static testColumns_(t,e,r){const n=t[e];return!!n&&(n.some((function(t){return t.childNodes.length&&r(t.childNodes[0])}))&&n.every((function(t){return!t.childNodes.length||r(t.childNodes[0])})))}setNodeFactory(t){a.getInstance().factory_=t,i.updateFactory(a.getInstance().factory_)}getNodeFactory(){return a.getInstance().factory_}identifierNode(t,e,r){if("MathML-Unit"===r)t.type="identifier",t.role="unit";else if(!e&&1===t.textContent.length&&("integer"===t.role||"latinletter"===t.role||"greekletter"===t.role)&&"normal"===t.font)return t.font="italic",i.run("simpleNamedFunction",t);return"unknown"===t.type&&(t.type="identifier"),a.exprFont_(t),i.run("simpleNamedFunction",t)}implicitNode(t){if(t=a.getInstance().getMixedNumbers_(t),1===(t=a.getInstance().combineUnits_(t)).length)return t[0];const e=a.getInstance().implicitNode_(t);return i.run("combine_juxtaposition",e)}text(t,e){return a.exprFont_(t),t.type="text","MS"===e?(t.role="string",t):"MSPACE"===e||t.textContent.match(/^\s*$/)?(t.role="space",t):t}row(t){return 0===(t=t.filter((function(t){return!T.isType(t,"empty")}))).length?a.getInstance().factory_.makeEmptyNode():(t=a.getInstance().getFencesInRow_(t),t=a.getInstance().tablesInRow(t),t=a.getInstance().getPunctuationInRow_(t),t=a.getInstance().getTextInRow_(t),t=a.getInstance().getFunctionsInRow_(t),a.getInstance().relationsInRow_(t))}limitNode(t,e){if(!e.length)return a.getInstance().factory_.makeEmptyNode();let r,n=e[0],o="unknown";if(!e[1])return n;if(T.isLimitBase(n)){r=a.MML_TO_LIMIT_[t];const i=r.length;if(o=r.type,e=e.slice(0,r.length+1),1===i&&T.isAccent(e[1])||2===i&&T.isAccent(e[1])&&T.isAccent(e[2]))return r=a.MML_TO_BOUNDS_[t],a.getInstance().accentNode_(n,e,r.type,r.length,r.accent);if(2===i){if(T.isAccent(e[1]))return n=a.getInstance().accentNode_(n,[n,e[1]],{MSUBSUP:"subscript",MUNDEROVER:"underscore"}[t],1,!0),e[2]?a.getInstance().makeLimitNode_(n,[n,e[2]],null,"limupper"):n;if(e[2]&&T.isAccent(e[2]))return n=a.getInstance().accentNode_(n,[n,e[2]],{MSUBSUP:"superscript",MUNDEROVER:"overscore"}[t],1,!0),a.getInstance().makeLimitNode_(n,[n,e[1]],null,"limlower");e[i]||(o="limlower")}return a.getInstance().makeLimitNode_(n,e,null,o)}return r=a.MML_TO_BOUNDS_[t],a.getInstance().accentNode_(n,e,r.type,r.length,r.accent)}tablesInRow(t){let e=s.partitionNodes(t,T.tableIsMatrixOrVector),r=[];for(let t,n=0;t=e.rel[n];n++)r=r.concat(e.comp.shift()),r.push(a.tableToMatrixOrVector_(t));r=r.concat(e.comp.shift()),e=s.partitionNodes(r,T.isTableOrMultiline),r=[];for(let t,n=0;t=e.rel[n];n++){const n=e.comp.shift();T.tableIsCases(t,n)&&a.tableToCases_(t,n.pop()),r=r.concat(n),r.push(t)}return r.concat(e.comp.shift())}mfenced(t,e,r,n){if(r&&n.length>0){const t=a.nextSeparatorFunction_(r),e=[n.shift()];n.forEach((r=>{e.push(a.getInstance().factory_.makeContentNode(t())),e.push(r)})),n=e}return t&&e?a.getInstance().horizontalFencedNode_(a.getInstance().factory_.makeContentNode(t),a.getInstance().factory_.makeContentNode(e),n):(t&&n.unshift(a.getInstance().factory_.makeContentNode(t)),e&&n.push(a.getInstance().factory_.makeContentNode(e)),a.getInstance().row(n))}fractionLikeNode(t,e,r,n){let o;if(!n&&s.isZeroLength(r)){const r=a.getInstance().factory_.makeBranchNode("line",[t],[]),n=a.getInstance().factory_.makeBranchNode("line",[e],[]);return o=a.getInstance().factory_.makeBranchNode("multiline",[r,n],[]),a.binomialForm_(o),a.classifyMultiline(o),o}return o=a.getInstance().fractionNode_(t,e),n&&o.addAnnotation("general","bevelled"),o}tensor(t,e,r,n,o){const i=a.getInstance().factory_.makeBranchNode("tensor",[t,a.getInstance().scriptNode_(e,"leftsub"),a.getInstance().scriptNode_(r,"leftsuper"),a.getInstance().scriptNode_(n,"rightsub"),a.getInstance().scriptNode_(o,"rightsuper")],[]);return i.role=t.role,i.embellished=T.isEmbellished(t),i}pseudoTensor(t,e,r){const n=t=>!T.isType(t,"empty"),o=e.filter(n).length,i=r.filter(n).length;if(!o&&!i)return t;const Q=o?i?"MSUBSUP":"MSUB":"MSUP",s=[t];return o&&s.push(a.getInstance().scriptNode_(e,"rightsub",!0)),i&&s.push(a.getInstance().scriptNode_(r,"rightsuper",!0)),a.getInstance().limitNode(Q,s)}font(t){const e=a.MATHJAX_FONTS[t];return e||t}proof(t,e,r){if(e.inference||e.axiom||console.log("Noise"),e.axiom){const e=a.getInstance().cleanInference(t.childNodes),n=e.length?a.getInstance().factory_.makeBranchNode("inference",r(e),[]):a.getInstance().factory_.makeEmptyNode();return n.role="axiom",n.mathmlTree=t,n}const n=a.getInstance().inference(t,e,r);return e.proof&&(n.role="proof",n.childNodes[0].role="final"),n}inference(t,e,r){if(e.inferenceRule){const e=a.getInstance().getFormulas(t,[],r);return a.getInstance().factory_.makeBranchNode("inference",[e.conclusion,e.premises],[])}const o=e.labelledRule,i=n.toArray(t.childNodes),Q=[];"left"!==o&&"both"!==o||Q.push(a.getInstance().getLabel(t,i,r,"left")),"right"!==o&&"both"!==o||Q.push(a.getInstance().getLabel(t,i,r,"right"));const T=a.getInstance().getFormulas(t,i,r),s=a.getInstance().factory_.makeBranchNode("inference",[T.conclusion,T.premises],Q);return s.mathmlTree=t,s}getLabel(t,e,r,o){const i=a.getInstance().findNestedRow(e,"prooflabel",o),Q=a.getInstance().factory_.makeBranchNode("rulelabel",r(n.toArray(i.childNodes)),[]);return Q.role=o,Q.mathmlTree=i,Q}getFormulas(t,e,r){const o=e.length?a.getInstance().findNestedRow(e,"inferenceRule"):t,i="up"===a.getSemantics(o).inferenceRule,Q=i?o.childNodes[1]:o.childNodes[0],T=i?o.childNodes[0]:o.childNodes[1],s=Q.childNodes[0].childNodes[0],l=n.toArray(s.childNodes[0].childNodes),c=[];let u=1;for(const t of l)u%2&&c.push(t.childNodes[0]),u++;const p=r(c),h=r(n.toArray(T.childNodes[0].childNodes))[0],d=a.getInstance().factory_.makeBranchNode("premises",p,[]);d.mathmlTree=s;const f=a.getInstance().factory_.makeBranchNode("conclusion",[h],[]);return f.mathmlTree=T.childNodes[0].childNodes[0],{conclusion:f,premises:d}}findNestedRow(t,e,r){return a.getInstance().findNestedRow_(t,e,0,r)}cleanInference(t){return n.toArray(t).filter((function(t){return"MSPACE"!==n.tagName(t)}))}operatorNode(t){return"unknown"===t.type&&(t.type="operator"),i.run("multioperator",t)}implicitNode_(t){const e=a.getInstance().factory_.makeMultipleContentNodes(t.length-1,o.invisibleTimes());a.matchSpaces_(t,e);const r=a.getInstance().infixNode_(t,e[0]);return r.role="implicit",e.forEach((function(t){t.parent=r})),r.contentNodes=e,r}infixNode_(t,e){const r=a.getInstance().factory_.makeBranchNode("infixop",t,[e],s.getEmbellishedInner(e).textContent);return r.role=e.role,i.run("propagateSimpleFunction",r)}explicitMixed_(t){const e=s.partitionNodes(t,(function(t){return t.textContent===o.invisiblePlus()}));if(!e.rel.length)return t;let r=[];for(let t,n=0;t=e.rel[n];n++){const o=e.comp[n],i=e.comp[n+1],Q=o.length-1;if(o[Q]&&i[0]&&T.isType(o[Q],"number")&&!T.isRole(o[Q],"mixed")&&T.isType(i[0],"fraction")){const t=a.getInstance().factory_.makeBranchNode("number",[o[Q],i[0]],[]);t.role="mixed",r=r.concat(o.slice(0,Q)),r.push(t),i.shift()}else r=r.concat(o),r.push(t)}return r.concat(e.comp[e.comp.length-1])}concatNode_(t,e,r){if(0===e.length)return t;const n=e.map((function(t){return s.getEmbellishedInner(t).textContent})).join(" "),o=a.getInstance().factory_.makeBranchNode(r,[t],e,n);return e.length>1&&(o.role="multiop"),o}prefixNode_(t,e){const r=s.partitionNodes(e,(t=>T.isRole(t,"subtraction")));let n=a.getInstance().concatNode_(t,r.comp.pop(),"prefixop");for(1===n.contentNodes.length&&"addition"===n.contentNodes[0].role&&"+"===n.contentNodes[0].textContent&&(n.role="positive");r.rel.length>0;)n=a.getInstance().concatNode_(n,[r.rel.pop()],"prefixop"),n.role="negative",n=a.getInstance().concatNode_(n,r.comp.pop(),"prefixop");return n}postfixNode_(t,e){return e.length?a.getInstance().concatNode_(t,e,"postfixop"):t}combineUnits_(t){const e=s.partitionNodes(t,(function(t){return!T.isRole(t,"unit")}));if(t.length===e.rel.length)return e.rel;const r=[];let n,o;do{const t=e.comp.shift();n=e.rel.shift();let i=null;o=r.pop(),o&&(t.length&&T.isUnitCounter(o)?t.unshift(o):r.push(o)),1===t.length&&(i=t.pop()),t.length>1&&(i=a.getInstance().implicitNode_(t),i.role="unit"),i&&r.push(i),n&&r.push(n)}while(n);return r}getMixedNumbers_(t){const e=s.partitionNodes(t,(function(t){return T.isType(t,"fraction")&&T.isRole(t,"vulgar")}));if(!e.rel.length)return t;let r=[];for(let t,n=0;t=e.rel[n];n++){const o=e.comp[n],i=o.length-1;if(o[i]&&T.isType(o[i],"number")&&(T.isRole(o[i],"integer")||T.isRole(o[i],"float"))){const e=a.getInstance().factory_.makeBranchNode("number",[o[i],t],[]);e.role="mixed",r=r.concat(o.slice(0,i)),r.push(e)}else r=r.concat(o),r.push(t)}return r.concat(e.comp[e.comp.length-1])}getTextInRow_(t){if(t.length<=1)return t;const e=s.partitionNodes(t,(t=>T.isType(t,"text")));if(0===e.rel.length)return t;const r=[];let n=e.comp[0];n.length>0&&r.push(a.getInstance().row(n));for(let t,o=0;t=e.rel[o];o++)r.push(t),n=e.comp[o+1],n.length>0&&r.push(a.getInstance().row(n));return[a.getInstance().dummyNode_(r)]}relationsInRow_(t){const e=s.partitionNodes(t,T.isRelation),r=e.rel[0];if(!r)return a.getInstance().operationsInRow_(t);if(1===t.length)return t[0];const n=e.comp.map(a.getInstance().operationsInRow_);let o;return e.rel.some((function(t){return!t.equals(r)}))?(o=a.getInstance().factory_.makeBranchNode("multirel",n,e.rel),e.rel.every((function(t){return t.role===r.role}))&&(o.role=r.role),o):(o=a.getInstance().factory_.makeBranchNode("relseq",n,e.rel,s.getEmbellishedInner(r).textContent),o.role=r.role,o)}operationsInRow_(t){if(0===t.length)return a.getInstance().factory_.makeEmptyNode();if(1===(t=a.getInstance().explicitMixed_(t)).length)return t[0];const e=[];for(;t.length>0&&T.isOperator(t[0]);)e.push(t.shift());if(0===t.length)return a.getInstance().prefixNode_(e.pop(),e);if(1===t.length)return a.getInstance().prefixNode_(t[0],e);t=i.run("convert_juxtaposition",t);const r=s.sliceNodes(t,T.isOperator),n=a.getInstance().prefixNode_(a.getInstance().implicitNode(r.head),e);return r.div?a.getInstance().operationsTree_(r.tail,n,r.div):n}operationsTree_(t,e,r,n){const o=n||[];if(0===t.length){if(o.unshift(r),"infixop"===e.type){const t=a.getInstance().postfixNode_(e.childNodes.pop(),o);return e.appendChild(t),e}return a.getInstance().postfixNode_(e,o)}const i=s.sliceNodes(t,T.isOperator);if(0===i.head.length)return o.push(i.div),a.getInstance().operationsTree_(i.tail,e,r,o);const Q=a.getInstance().prefixNode_(a.getInstance().implicitNode(i.head),o),l=a.getInstance().appendOperand_(e,r,Q);return i.div?a.getInstance().operationsTree_(i.tail,l,i.div,[]):l}appendOperand_(t,e,r){if("infixop"!==t.type)return a.getInstance().infixNode_([t,r],e);const n=a.getInstance().appendDivisionOp_(t,e,r);return n||(a.getInstance().appendExistingOperator_(t,e,r)?t:"multiplication"===e.role?a.getInstance().appendMultiplicativeOp_(t,e,r):a.getInstance().appendAdditiveOp_(t,e,r))}appendDivisionOp_(t,e,r){return"division"===e.role?T.isImplicit(t)?a.getInstance().infixNode_([t,r],e):a.getInstance().appendLastOperand_(t,e,r):"division"===t.role?a.getInstance().infixNode_([t,r],e):null}appendLastOperand_(t,e,r){let n=t,o=t.childNodes[t.childNodes.length-1];for(;o&&"infixop"===o.type&&!T.isImplicit(o);)n=o,o=n.childNodes[t.childNodes.length-1];const i=a.getInstance().infixNode_([n.childNodes.pop(),r],e);return n.appendChild(i),t}appendMultiplicativeOp_(t,e,r){if(T.isImplicit(t))return a.getInstance().infixNode_([t,r],e);let n=t,o=t.childNodes[t.childNodes.length-1];for(;o&&"infixop"===o.type&&!T.isImplicit(o);)n=o,o=n.childNodes[t.childNodes.length-1];const i=a.getInstance().infixNode_([n.childNodes.pop(),r],e);return n.appendChild(i),t}appendAdditiveOp_(t,e,r){return a.getInstance().infixNode_([t,r],e)}appendExistingOperator_(t,e,r){return!(!t||"infixop"!==t.type||T.isImplicit(t))&&(t.contentNodes[0].equals(e)?(t.appendContentNode(e),t.appendChild(r),!0):a.getInstance().appendExistingOperator_(t.childNodes[t.childNodes.length-1],e,r))}getFencesInRow_(t){let e=s.partitionNodes(t,T.isFence);e=a.purgeFences_(e);const r=e.comp.shift();return a.getInstance().fences_(e.rel,e.comp,[],[r])}fences_(t,e,r,n){if(0===t.length&&0===r.length)return n[0];const o=t=>T.isRole(t,"open");if(0===t.length){const t=n.shift();for(;r.length>0;){if(o(r[0])){const e=r.shift();a.fenceToPunct_(e),t.push(e)}else{const e=s.sliceNodes(r,o),i=e.head.length-1,Q=a.getInstance().neutralFences_(e.head,n.slice(0,i));n=n.slice(i),t.push(...Q),e.div&&e.tail.unshift(e.div),r=e.tail}t.push(...n.shift())}return t}const i=r[r.length-1],Q=t[0].role;if("open"===Q||T.isNeutralFence(t[0])&&(!i||!T.compareNeutralFences(t[0],i))){r.push(t.shift());const o=e.shift();return o&&n.push(o),a.getInstance().fences_(t,e,r,n)}if(i&&"close"===Q&&"open"===i.role){const o=a.getInstance().horizontalFencedNode_(r.pop(),t.shift(),n.pop());return n.push(n.pop().concat([o],e.shift())),a.getInstance().fences_(t,e,r,n)}if(i&&T.compareNeutralFences(t[0],i)){if(!T.elligibleLeftNeutral(i)||!T.elligibleRightNeutral(t[0])){r.push(t.shift());const o=e.shift();return o&&n.push(o),a.getInstance().fences_(t,e,r,n)}const o=a.getInstance().horizontalFencedNode_(r.pop(),t.shift(),n.pop());return n.push(n.pop().concat([o],e.shift())),a.getInstance().fences_(t,e,r,n)}if(i&&"close"===Q&&T.isNeutralFence(i)&&r.some(o)){const i=s.sliceNodes(r,o,!0),Q=n.pop(),T=n.length-i.tail.length+1,l=a.getInstance().neutralFences_(i.tail,n.slice(T));n=n.slice(0,T);const c=a.getInstance().horizontalFencedNode_(i.div,t.shift(),n.pop().concat(l,Q));return n.push(n.pop().concat([c],e.shift())),a.getInstance().fences_(t,e,i.head,n)}const l=t.shift();return a.fenceToPunct_(l),n.push(n.pop().concat([l],e.shift())),a.getInstance().fences_(t,e,r,n)}neutralFences_(t,e){if(0===t.length)return t;if(1===t.length)return a.fenceToPunct_(t[0]),t;const r=t.shift();if(!T.elligibleLeftNeutral(r)){a.fenceToPunct_(r);const n=e.shift();return n.unshift(r),n.concat(a.getInstance().neutralFences_(t,e))}const n=s.sliceNodes(t,(function(t){return T.compareNeutralFences(t,r)}));if(!n.div){a.fenceToPunct_(r);const n=e.shift();return n.unshift(r),n.concat(a.getInstance().neutralFences_(t,e))}if(!T.elligibleRightNeutral(n.div))return a.fenceToPunct_(n.div),t.unshift(r),a.getInstance().neutralFences_(t,e);const o=a.getInstance().combineFencedContent_(r,n.div,n.head,e);if(n.tail.length>0){const t=o.shift(),e=a.getInstance().neutralFences_(n.tail,o);return t.concat(e)}return o[0]}combineFencedContent_(t,e,r,n){if(0===r.length){const r=a.getInstance().horizontalFencedNode_(t,e,n.shift());return n.length>0?n[0].unshift(r):n=[[r]],n}const o=n.shift(),i=r.length-1,Q=n.slice(0,i),T=(n=n.slice(i)).shift(),s=a.getInstance().neutralFences_(r,Q);o.push(...s),o.push(...T);const l=a.getInstance().horizontalFencedNode_(t,e,o);return n.length>0?n[0].unshift(l):n=[[l]],n}horizontalFencedNode_(t,e,r){const n=a.getInstance().row(r);let o=a.getInstance().factory_.makeBranchNode("fenced",[n],[t,e]);return"open"===t.role?(a.getInstance().classifyHorizontalFence_(o),o=i.run("propagateComposedFunction",o)):o.role=t.role,o=i.run("detect_cycle",o),a.rewriteFencedNode_(o)}classifyHorizontalFence_(t){t.role="leftright";const e=t.childNodes;if(!T.isSetNode(t)||e.length>1)return;if(0===e.length||"empty"===e[0].type)return void(t.role="set empty");const r=e[0].type;if(1===e.length&&T.isSingletonSetContent(e[0]))return void(t.role="set singleton");const n=e[0].role;if("punctuated"===r&&"sequence"===n){if("comma"!==e[0].contentNodes[0].role)return 1!==e[0].contentNodes.length||"vbar"!==e[0].contentNodes[0].role&&"colon"!==e[0].contentNodes[0].role?void 0:(t.role="set extended",void a.getInstance().setExtension_(t));t.role="set collection"}}setExtension_(t){const e=t.childNodes[0].childNodes[0];e&&"infixop"===e.type&&1===e.contentNodes.length&&T.isMembership(e.contentNodes[0])&&(e.addAnnotation("set","intensional"),e.contentNodes[0].addAnnotation("set","intensional"))}getPunctuationInRow_(t){if(t.length<=1)return t;const e=t=>{const e=t.type;return"punctuation"===e||"text"===e||"operator"===e||"relation"===e},r=s.partitionNodes(t,(function(r){if(!T.isPunctuation(r))return!1;if(T.isPunctuation(r)&&!T.isRole(r,"ellipsis"))return!0;const n=t.indexOf(r);if(0===n)return!t[1]||!e(t[1]);const o=t[n-1];if(n===t.length-1)return!e(o);const i=t[n+1];return!e(o)||!e(i)}));if(0===r.rel.length)return t;const n=[];let o=r.comp.shift();o.length>0&&n.push(a.getInstance().row(o));let i=0;for(;r.comp.length>0;)n.push(r.rel[i++]),o=r.comp.shift(),o.length>0&&n.push(a.getInstance().row(o));return[a.getInstance().punctuatedNode_(n,r.rel)]}punctuatedNode_(t,e){const r=a.getInstance().factory_.makeBranchNode("punctuated",t,e);if(e.length===t.length){const t=e[0].role;if("unknown"!==t&&e.every((function(e){return e.role===t})))return r.role=t,r}return T.singlePunctAtPosition(t,e,0)?r.role="startpunct":T.singlePunctAtPosition(t,e,t.length-1)?r.role="endpunct":e.every((t=>T.isRole(t,"dummy")))?r.role="text":e.every((t=>T.isRole(t,"space")))?r.role="space":r.role="sequence",r}dummyNode_(t){const e=a.getInstance().factory_.makeMultipleContentNodes(t.length-1,o.invisibleComma());return e.forEach((function(t){t.role="dummy"})),a.getInstance().punctuatedNode_(t,e)}accentRole_(t,e){if(!T.isAccent(t))return!1;const r=t.textContent,n=o.lookupSecondary("bar",r)||o.lookupSecondary("tilde",r)||t.role;return t.role="underscore"===e?"underaccent":"overaccent",t.addAnnotation("accent",n),!0}accentNode_(t,e,r,n,o){const i=(e=e.slice(0,n+1))[1],Q=e[2];let T;if(!o&&Q&&(T=a.getInstance().factory_.makeBranchNode("subscript",[t,i],[]),T.role="subsup",e=[T,Q],r="superscript"),o){const n=a.getInstance().accentRole_(i,r);if(Q){a.getInstance().accentRole_(Q,"overscore")&&!n?(T=a.getInstance().factory_.makeBranchNode("overscore",[t,Q],[]),e=[T,i],r="underscore"):(T=a.getInstance().factory_.makeBranchNode("underscore",[t,i],[]),e=[T,Q],r="overscore"),T.role="underover"}}return a.getInstance().makeLimitNode_(t,e,T,r)}makeLimitNode_(t,e,r,n){if("limupper"===n&&"limlower"===t.type)return t.childNodes.push(e[1]),e[1].parent=t,t.type="limboth",t;if("limlower"===n&&"limupper"===t.type)return t.childNodes.splice(1,-1,e[1]),e[1].parent=t,t.type="limboth",t;const o=a.getInstance().factory_.makeBranchNode(n,e,[]),i=T.isEmbellished(t);return r&&(r.embellished=i),o.embellished=i,o.role=t.role,o}getFunctionsInRow_(t,e){const r=e||[];if(0===t.length)return r;const n=t.shift(),o=a.classifyFunction_(n,t);if(!o)return r.push(n),a.getInstance().getFunctionsInRow_(t,r);const i=a.getInstance().getFunctionsInRow_(t,[]),Q=a.getInstance().getFunctionArgs_(n,i,o);return r.concat(Q)}getFunctionArgs_(t,e,r){let n,o,i;switch(r){case"integral":{const r=a.getInstance().getIntegralArgs_(e);if(!r.intvar&&!r.integrand.length)return r.rest.unshift(t),r.rest;const n=a.getInstance().row(r.integrand);return i=a.getInstance().integralNode_(t,n,r.intvar),r.rest.unshift(i),r.rest}case"prefix":if(e[0]&&"fenced"===e[0].type){const r=e.shift();return T.isNeutralFence(r)||(r.role="leftright"),i=a.getInstance().functionNode_(t,r),e.unshift(i),e}if(n=s.sliceNodes(e,T.isPrefixFunctionBoundary),n.head.length)o=a.getInstance().row(n.head),n.div&&n.tail.unshift(n.div);else{if(!n.div||!T.isType(n.div,"appl"))return e.unshift(t),e;o=n.div}return i=a.getInstance().functionNode_(t,o),n.tail.unshift(i),n.tail;case"bigop":return n=s.sliceNodes(e,T.isBigOpBoundary),n.head.length?(o=a.getInstance().row(n.head),i=a.getInstance().bigOpNode_(t,o),n.div&&n.tail.unshift(n.div),n.tail.unshift(i),n.tail):(e.unshift(t),e);default:{if(0===e.length)return[t];const r=e[0];return"fenced"===r.type&&!T.isNeutralFence(r)&&T.isSimpleFunctionScope(r)?(r.role="leftright",a.propagateFunctionRole_(t,"simple function"),i=a.getInstance().functionNode_(t,e.shift()),e.unshift(i),e):(e.unshift(t),e)}}}getIntegralArgs_(t,e=[]){if(0===t.length)return{integrand:e,intvar:null,rest:t};const r=t[0];if(T.isGeneralFunctionBoundary(r))return{integrand:e,intvar:null,rest:t};if(T.isIntegralDxBoundarySingle(r))return r.role="integral",{integrand:e,intvar:r,rest:t.slice(1)};if(t[1]&&T.isIntegralDxBoundary(r,t[1])){const n=a.getInstance().prefixNode_(t[1],[r]);return n.role="integral",{integrand:e,intvar:n,rest:t.slice(2)}}return e.push(t.shift()),a.getInstance().getIntegralArgs_(t,e)}functionNode_(t,e){const r=a.getInstance().factory_.makeContentNode(o.functionApplication()),n=a.getInstance().funcAppls[t.id];n&&(r.mathmlTree=n.mathmlTree,r.mathml=n.mathml,r.annotation=n.annotation,r.attributes=n.attributes,delete a.getInstance().funcAppls[t.id]),r.type="punctuation",r.role="application";const i=a.getFunctionOp_(t,(function(t){return T.isType(t,"function")||T.isType(t,"identifier")&&T.isRole(t,"simple function")}));return a.getInstance().functionalNode_("appl",[t,e],i,[r])}bigOpNode_(t,e){const r=a.getFunctionOp_(t,(t=>T.isType(t,"largeop")));return a.getInstance().functionalNode_("bigop",[t,e],r,[])}integralNode_(t,e,r){e=e||a.getInstance().factory_.makeEmptyNode(),r=r||a.getInstance().factory_.makeEmptyNode();const n=a.getFunctionOp_(t,(t=>T.isType(t,"largeop")));return a.getInstance().functionalNode_("integral",[t,e,r],n,[])}functionalNode_(t,e,r,n){const o=e[0];let i;r&&(i=r.parent,n.push(r));const Q=a.getInstance().factory_.makeBranchNode(t,e,n);return Q.role=o.role,i&&(r.parent=i),Q}fractionNode_(t,e){const r=a.getInstance().factory_.makeBranchNode("fraction",[t,e],[]);return r.role=r.childNodes.every((function(t){return T.isType(t,"number")&&T.isRole(t,"integer")}))?"vulgar":r.childNodes.every(T.isPureUnit)?"unit":"division",i.run("propagateSimpleFunction",r)}scriptNode_(t,e,r){let n;switch(t.length){case 0:n=a.getInstance().factory_.makeEmptyNode();break;case 1:if(n=t[0],r)return n;break;default:n=a.getInstance().dummyNode_(t)}return n.role=e,n}findNestedRow_(t,e,r,o){if(r>3)return null;for(let i,Q=0;i=t[Q];Q++){const t=n.tagName(i);if("MSPACE"!==t){if("MROW"===t)return a.getInstance().findNestedRow_(n.toArray(i.childNodes),e,r+1,o);if(a.findSemantics(i,e,o))return i}}return null}}e.default=a,a.FENCE_TO_PUNCT_={metric:"metric",neutral:"vbar",open:"openfence",close:"closefence"},a.MML_TO_LIMIT_={MSUB:{type:"limlower",length:1},MUNDER:{type:"limlower",length:1},MSUP:{type:"limupper",length:1},MOVER:{type:"limupper",length:1},MSUBSUP:{type:"limboth",length:2},MUNDEROVER:{type:"limboth",length:2}},a.MML_TO_BOUNDS_={MSUB:{type:"subscript",length:1,accent:!1},MSUP:{type:"superscript",length:1,accent:!1},MSUBSUP:{type:"subscript",length:2,accent:!1},MUNDER:{type:"underscore",length:1,accent:!0},MOVER:{type:"overscore",length:1,accent:!0},MUNDEROVER:{type:"underscore",length:2,accent:!0}},a.CLASSIFY_FUNCTION_={integral:"integral",sum:"bigop","prefix function":"prefix","limit function":"prefix","simple function":"prefix","composed function":"prefix"},a.MATHJAX_FONTS={"-tex-caligraphic":"caligraphic","-tex-caligraphic-bold":"caligraphic-bold","-tex-calligraphic":"caligraphic","-tex-calligraphic-bold":"caligraphic-bold","-tex-oldstyle":"oldstyle","-tex-oldstyle-bold":"oldstyle-bold","-tex-mathit":"italic"}},5656:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticSkeleton=void 0;const n=r(707),o=r(5274),i=r(2298);class Q{constructor(t){this.parents=null,this.levelsMap=null,t=0===t?t:t||[],this.array=t}static fromTree(t){return Q.fromNode(t.root)}static fromNode(t){return new Q(Q.fromNode_(t))}static fromString(t){return new Q(Q.fromString_(t))}static simpleCollapseStructure(t){return"number"==typeof t}static contentCollapseStructure(t){return!!t&&!Q.simpleCollapseStructure(t)&&"c"===t[0]}static interleaveIds(t,e){return n.interleaveLists(Q.collapsedLeafs(t),Q.collapsedLeafs(e))}static collapsedLeafs(...t){return t.reduce(((t,e)=>{return t.concat((r=e,Q.simpleCollapseStructure(r)?[r]:(r=r,Q.contentCollapseStructure(r[1])?r.slice(2):r.slice(1))));var r}),[])}static fromStructure(t,e){return new Q(Q.tree_(t,e.root))}static combineContentChildren(t,e,r){switch(t.type){case"relseq":case"infixop":case"multirel":return n.interleaveLists(r,e);case"prefixop":return e.concat(r);case"postfixop":return r.concat(e);case"fenced":return r.unshift(e[0]),r.push(e[1]),r;case"appl":return[r[0],e[0],r[1]];case"root":return[r[1],r[0]];case"row":case"line":return e.length&&r.unshift(e[0]),r;default:return r}}static makeSexp_(t){return Q.simpleCollapseStructure(t)?t.toString():Q.contentCollapseStructure(t)?"(c "+t.slice(1).map(Q.makeSexp_).join(" ")+")":"("+t.map(Q.makeSexp_).join(" ")+")"}static fromString_(t){let e=t.replace(/\(/g,"[");return e=e.replace(/\)/g,"]"),e=e.replace(/ /g,","),e=e.replace(/c/g,'"c"'),JSON.parse(e)}static fromNode_(t){if(!t)return[];const e=t.contentNodes;let r;e.length&&(r=e.map(Q.fromNode_),r.unshift("c"));const n=t.childNodes;if(!n.length)return e.length?[t.id,r]:t.id;const o=n.map(Q.fromNode_);return e.length&&o.unshift(r),o.unshift(t.id),o}static tree_(t,e){if(!e)return[];if(!e.childNodes.length)return e.id;const r=e.id,n=[r],T=o.evalXPath(`.//self::*[@${i.Attribute.ID}=${r}]`,t)[0],s=Q.combineContentChildren(e,e.contentNodes.map((function(t){return t})),e.childNodes.map((function(t){return t})));T&&Q.addOwns_(T,s);for(let e,r=0;e=s[r];r++)n.push(Q.tree_(t,e));return n}static addOwns_(t,e){const r=t.getAttribute(i.Attribute.COLLAPSED),n=r?Q.realLeafs_(Q.fromString(r).array):e.map((t=>t.id));t.setAttribute(i.Attribute.OWNS,n.join(" "))}static realLeafs_(t){if(Q.simpleCollapseStructure(t))return[t];if(Q.contentCollapseStructure(t))return[];t=t;let e=[];for(let r=1;rQ.simpleCollapseStructure(t)?t:Q.contentCollapseStructure(t)?t[1]:t[0]))}subtreeNodes(t){if(!this.isRoot(t))return[];const e=(t,r)=>{Q.simpleCollapseStructure(t)?r.push(t):(t=t,Q.contentCollapseStructure(t)&&(t=t.slice(1)),t.forEach((t=>e(t,r))))},r=this.levelsMap[t],n=[];return e(r.slice(1),n),n}}e.SemanticSkeleton=Q},7075:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SemanticTree=void 0;const n=r(5740),o=r(7630),i=r(9265),Q=r(7228),T=r(5952),s=r(5609);r(94);class a{constructor(t){this.mathml=t,this.parser=new Q.SemanticMathml,this.root=this.parser.parse(t),this.collator=this.parser.getFactory().leafMap.collateMeaning();const e=this.collator.newDefault();e&&(this.parser=new Q.SemanticMathml,this.parser.getFactory().defaultMap=e,this.root=this.parser.parse(t)),l.visit(this.root,{}),(0,o.annotate)(this.root)}static empty(){const t=n.parseInput(""),e=new a(t);return e.mathml=t,e}static fromNode(t,e){const r=a.empty();return r.root=t,e&&(r.mathml=e),r}static fromRoot(t,e){let r=t;for(;r.parent;)r=r.parent;const n=a.fromNode(r);return e&&(n.mathml=e),n}static fromXml(t){const e=a.empty();return t.childNodes[0]&&(e.root=T.SemanticNode.fromXml(t.childNodes[0])),e}xml(t){const e=n.parseInput(""),r=this.root.xml(e.ownerDocument,t);return e.appendChild(r),e}toString(t){return n.serializeXml(this.xml(t))}formatXml(t){const e=this.toString(t);return n.formatXml(e)}displayTree(){this.root.displayTree()}replaceNode(t,e){const r=t.parent;r?r.replaceChild(t,e):this.root=e}toJson(){const t={};return t.stree=this.root.toJson(),t}}e.SemanticTree=a;const l=new i.SemanticVisitor("general","unit",((t,e)=>{if("infixop"===t.type&&("multiplication"===t.role||"implicit"===t.role)){const e=t.childNodes;e.length&&(s.isPureUnit(e[0])||s.isUnitCounter(e[0]))&&t.childNodes.slice(1).every(s.isPureUnit)&&(t.role="unit")}return!1}))},4795:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.partitionNodes=e.sliceNodes=e.getEmbellishedInner=e.addAttributes=e.isZeroLength=e.purgeNodes=e.isOrphanedGlyph=e.hasDisplayTag=e.hasEmptyTag=e.hasIgnoreTag=e.hasLeafTag=e.hasMathTag=e.directSpeechKeys=e.DISPLAYTAGS=e.EMPTYTAGS=e.IGNORETAGS=e.LEAFTAGS=void 0;const n=r(5740);function o(t){return!!t&&-1!==e.LEAFTAGS.indexOf(n.tagName(t))}function i(t,e,r){r&&t.reverse();const n=[];for(let o,i=0;o=t[i];i++){if(e(o))return r?{head:t.slice(i+1).reverse(),div:o,tail:n.reverse()}:{head:n,div:o,tail:t.slice(i+1)};n.push(o)}return r?{head:[],div:null,tail:n.reverse()}:{head:n,div:null,tail:[]}}e.LEAFTAGS=["MO","MI","MN","MTEXT","MS","MSPACE"],e.IGNORETAGS=["MERROR","MPHANTOM","MALIGNGROUP","MALIGNMARK","MPRESCRIPTS","ANNOTATION","ANNOTATION-XML"],e.EMPTYTAGS=["MATH","MROW","MPADDED","MACTION","NONE","MSTYLE","SEMANTICS"],e.DISPLAYTAGS=["MROOT","MSQRT"],e.directSpeechKeys=["aria-label","exact-speech","alt"],e.hasMathTag=function(t){return!!t&&"MATH"===n.tagName(t)},e.hasLeafTag=o,e.hasIgnoreTag=function(t){return!!t&&-1!==e.IGNORETAGS.indexOf(n.tagName(t))},e.hasEmptyTag=function(t){return!!t&&-1!==e.EMPTYTAGS.indexOf(n.tagName(t))},e.hasDisplayTag=function(t){return!!t&&-1!==e.DISPLAYTAGS.indexOf(n.tagName(t))},e.isOrphanedGlyph=function(t){return!!t&&"MGLYPH"===n.tagName(t)&&!o(t.parentNode)},e.purgeNodes=function(t){const r=[];for(let o,i=0;o=t[i];i++){if(o.nodeType!==n.NodeType.ELEMENT_NODE)continue;const t=n.tagName(o);-1===e.IGNORETAGS.indexOf(t)&&(-1!==e.EMPTYTAGS.indexOf(t)&&0===o.childNodes.length||r.push(o))}return r},e.isZeroLength=function(t){if(!t)return!1;if(-1!==["negativeveryverythinmathspace","negativeverythinmathspace","negativethinmathspace","negativemediummathspace","negativethickmathspace","negativeverythickmathspace","negativeveryverythickmathspace"].indexOf(t))return!0;const e=t.match(/[0-9.]+/);return!!e&&0===parseFloat(e[0])},e.addAttributes=function(t,r){if(r.hasAttributes()){const n=r.attributes;for(let r=n.length-1;r>=0;r--){const o=n[r].name;o.match(/^ext/)&&(t.attributes[o]=n[r].value,t.nobreaking=!0),-1!==e.directSpeechKeys.indexOf(o)&&(t.attributes["ext-speech"]=n[r].value,t.nobreaking=!0),o.match(/texclass$/)&&(t.attributes.texclass=n[r].value),"href"===o&&(t.attributes.href=n[r].value,t.nobreaking=!0)}}},e.getEmbellishedInner=function t(e){return e&&e.embellished&&e.childNodes.length>0?t(e.childNodes[0]):e},e.sliceNodes=i,e.partitionNodes=function(t,e){let r=t;const n=[],o=[];let Q=null;do{Q=i(r,e),o.push(Q.head),n.push(Q.div),r=Q.tail}while(Q.div);return n.pop(),{rel:n,comp:o}}},6278:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractSpeechGenerator=void 0;const n=r(6828),o=r(2298),i=r(1214),Q=r(9543);e.AbstractSpeechGenerator=class{constructor(){this.modality=o.addPrefix("speech"),this.rebuilt_=null,this.options_={}}getRebuilt(){return this.rebuilt_}setRebuilt(t){this.rebuilt_=t}setOptions(t){this.options_=t||{},this.modality=o.addPrefix(this.options_.modality||"speech")}getOptions(){return this.options_}start(){}end(){}generateSpeech(t,e){return this.rebuilt_||(this.rebuilt_=new i.RebuildStree(e)),(0,n.setup)(this.options_),Q.computeMarkup(this.getRebuilt().xml)}}},1452:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AdhocSpeechGenerator=void 0;const n=r(6278);class o extends n.AbstractSpeechGenerator{getSpeech(t,e){const r=this.generateSpeech(t,e);return t.setAttribute(this.modality,r),r}}e.AdhocSpeechGenerator=o},5152:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ColorGenerator=void 0;const n=r(2298),o=r(8396),i=r(1214),Q=r(1204),T=r(6278);class s extends T.AbstractSpeechGenerator{constructor(){super(...arguments),this.modality=(0,n.addPrefix)("foreground"),this.contrast=new o.ContrastPicker}static visitStree_(t,e,r){if(t.childNodes.length){if(t.contentNodes.length&&("punctuated"===t.type&&t.contentNodes.forEach((t=>r[t.id]=!0)),"implicit"!==t.role&&e.push(t.contentNodes.map((t=>t.id)))),t.childNodes.length){if("implicit"===t.role){const n=[];let o=[];for(const e of t.childNodes){const t=[];s.visitStree_(e,t,r),t.length<=2&&n.push(t.shift()),o=o.concat(t)}return e.push(n),void o.forEach((t=>e.push(t)))}t.childNodes.forEach((t=>s.visitStree_(t,e,r)))}}else r[t.id]||e.push(t.id)}getSpeech(t,e){return Q.getAttribute(t,this.modality)}generateSpeech(t,e){return this.getRebuilt()||this.setRebuilt(new i.RebuildStree(t)),this.colorLeaves_(t),Q.getAttribute(t,this.modality)}colorLeaves_(t){const e=[];s.visitStree_(this.getRebuilt().streeRoot,e,{});for(const r of e){const e=this.contrast.generate();let n=!1;n=Array.isArray(r)?r.map((r=>this.colorLeave_(t,r,e))).reduce(((t,e)=>t||e),!1):this.colorLeave_(t,r.toString(),e),n&&this.contrast.increment()}}colorLeave_(t,e,r){const n=Q.getBySemanticId(t,e);return!!n&&(n.setAttribute(this.modality,r),!0)}}e.ColorGenerator=s},6604:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DirectSpeechGenerator=void 0;const n=r(1204),o=r(6278);class i extends o.AbstractSpeechGenerator{getSpeech(t,e){return n.getAttribute(t,this.modality)}}e.DirectSpeechGenerator=i},3123:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DummySpeechGenerator=void 0;const n=r(6278);class o extends n.AbstractSpeechGenerator{getSpeech(t,e){return""}}e.DummySpeechGenerator=o},5858:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.NodeSpeechGenerator=void 0;const n=r(1204),o=r(4598);class i extends o.TreeSpeechGenerator{getSpeech(t,e){return super.getSpeech(t,e),n.getAttribute(t,this.modality)}}e.NodeSpeechGenerator=i},9552:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.generatorMapping_=e.generator=void 0;const n=r(1452),o=r(5152),i=r(6604),Q=r(3123),T=r(5858),s=r(597),a=r(4598);e.generator=function(t){return(e.generatorMapping_[t]||e.generatorMapping_.Direct)()},e.generatorMapping_={Adhoc:()=>new n.AdhocSpeechGenerator,Color:()=>new o.ColorGenerator,Direct:()=>new i.DirectSpeechGenerator,Dummy:()=>new Q.DummySpeechGenerator,Node:()=>new T.NodeSpeechGenerator,Summary:()=>new s.SummarySpeechGenerator,Tree:()=>new a.TreeSpeechGenerator}},9543:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.computeSummary_=e.retrieveSummary=e.connectAllMactions=e.connectMactions=e.nodeAtPosition_=e.computePrefix_=e.retrievePrefix=e.addPrefix=e.addModality=e.addSpeech=e.recomputeMarkup=e.computeMarkup=e.recomputeSpeech=e.computeSpeech=void 0;const n=r(8290),o=r(5740),i=r(5274),Q=r(2298),T=r(2362),s=r(7075),a=r(1204);function l(t){return T.SpeechRuleEngine.getInstance().evaluateNode(t)}function c(t){return l(s.SemanticTree.fromNode(t).xml())}function u(t){const e=c(t);return n.markup(e)}function p(t){const e=h(t);return n.markup(e)}function h(t){const e=s.SemanticTree.fromRoot(t),r=i.evalXPath('.//*[@id="'+t.id+'"]',e.xml());let n=r[0];return r.length>1&&(n=d(t,r)||n),n?T.SpeechRuleEngine.getInstance().runInSetting({modality:"prefix",domain:"default",style:"default",strict:!0,speech:!0},(function(){return T.SpeechRuleEngine.getInstance().evaluateNode(n)})):[]}function d(t,e){const r=e[0];if(!t.parent)return r;const n=[];for(;t;)n.push(t.id),t=t.parent;const o=function(t,e){for(;e.length&&e.shift().toString()===t.getAttribute("id")&&t.parentNode&&t.parentNode.parentNode;)t=t.parentNode.parentNode;return!e.length};for(let t,r=0;t=e[r];r++)if(o(t,n.slice()))return t;return r}function f(t){return t?T.SpeechRuleEngine.getInstance().runInSetting({modality:"summary",strict:!1,speech:!0},(function(){return T.SpeechRuleEngine.getInstance().evaluateNode(t)})):[]}e.computeSpeech=l,e.recomputeSpeech=c,e.computeMarkup=function(t){const e=l(t);return n.markup(e)},e.recomputeMarkup=u,e.addSpeech=function(t,e,r){const i=o.querySelectorAllByAttrValue(r,"id",e.id.toString())[0],T=i?n.markup(l(i)):u(e);t.setAttribute(Q.Attribute.SPEECH,T)},e.addModality=function(t,e,r){const n=u(e);t.setAttribute(r,n)},e.addPrefix=function(t,e){const r=p(e);r&&t.setAttribute(Q.Attribute.PREFIX,r)},e.retrievePrefix=p,e.computePrefix_=h,e.nodeAtPosition_=d,e.connectMactions=function(t,e,r){const n=o.querySelectorAll(e,"maction");for(let e,i=0;e=n[i];i++){const n=e.getAttribute("id"),i=o.querySelectorAllByAttrValue(t,"id",n)[0];if(!i)continue;const T=e.childNodes[1],s=T.getAttribute(Q.Attribute.ID);let l=a.getBySemanticId(t,s);if(l&&"dummy"!==l.getAttribute(Q.Attribute.TYPE))continue;if(l=i.childNodes[0],l.getAttribute("sre-highlighter-added"))continue;const c=T.getAttribute(Q.Attribute.PARENT);c&&l.setAttribute(Q.Attribute.PARENT,c),l.setAttribute(Q.Attribute.TYPE,"dummy"),l.setAttribute(Q.Attribute.ID,s);o.querySelectorAllByAttrValue(r,"id",s)[0].setAttribute("alternative",s)}},e.connectAllMactions=function(t,e){const r=o.querySelectorAll(t,"maction");for(let t,n=0;t=r[n];n++){const r=t.childNodes[1].getAttribute(Q.Attribute.ID);o.querySelectorAllByAttrValue(e,"id",r)[0].setAttribute("alternative",r)}},e.retrieveSummary=function(t){const e=f(t);return n.markup(e)},e.computeSummary_=f},597:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SummarySpeechGenerator=void 0;const n=r(6278),o=r(9543);class i extends n.AbstractSpeechGenerator{getSpeech(t,e){return o.connectAllMactions(e,this.getRebuilt().xml),this.generateSpeech(t,e)}}e.SummarySpeechGenerator=i},4598:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.TreeSpeechGenerator=void 0;const n=r(2298),o=r(1204),i=r(6278),Q=r(9543);class T extends i.AbstractSpeechGenerator{getSpeech(t,e){const r=this.generateSpeech(t,e),i=this.getRebuilt().nodeDict;for(const r in i){const T=i[r],s=o.getBySemanticId(e,r),a=o.getBySemanticId(t,r);s&&a&&(this.modality&&this.modality!==n.Attribute.SPEECH?Q.addModality(a,T,this.modality):Q.addSpeech(a,T,this.getRebuilt().xml),this.modality===n.Attribute.SPEECH&&Q.addPrefix(a,T))}return r}}e.TreeSpeechGenerator=T},313:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.INTERVALS=e.makeLetter=e.numberRules=e.alphabetRules=e.getFont=e.makeInterval=e.generate=e.makeDomains_=e.Domains_=e.Base=e.Embellish=e.Font=void 0;const n=r(5897),o=r(7491),i=r(4356),Q=r(2536),T=r(2780);var s,a,l;function c(){const t=i.LOCALE.ALPHABETS,r=(t,e)=>{const r={};return Object.keys(t).forEach((t=>r[t]=!0)),Object.keys(e).forEach((t=>r[t]=!0)),Object.keys(r)};e.Domains_.small=r(t.smallPrefix,t.letterTrans),e.Domains_.capital=r(t.capPrefix,t.letterTrans),e.Domains_.digit=r(t.digitPrefix,t.digitTrans)}function u(t){const e=t.toString(16).toUpperCase();return e.length>3?e:("000"+e).slice(-4)}function p([t,e],r){const n=parseInt(t,16),o=parseInt(e,16),i=[];for(let t=n;t<=o;t++){let e=u(t);!1!==r[e]&&(e=r[e]||e,i.push(e))}return i}function h(t){const e="normal"===t||"fullwidth"===t?"":i.LOCALE.MESSAGES.font[t]||i.LOCALE.MESSAGES.embellish[t]||"";return(0,Q.localeFontCombiner)(e)}function d(t,r,n,o,Q,T){const s=h(o);for(let o,a,l,c=0;o=t[c],a=r[c],l=n[c];c++){const t=T?i.LOCALE.ALPHABETS.capPrefix:i.LOCALE.ALPHABETS.smallPrefix,r=T?e.Domains_.capital:e.Domains_.small;L(s.combiner,o,a,l,s.font,t,Q,i.LOCALE.ALPHABETS.letterTrans,r)}}function f(t,r,n,o,Q){const T=h(n);for(let n,s,a=0;n=t[a],s=r[a];a++){const t=i.LOCALE.ALPHABETS.digitPrefix,r=a+Q;L(T.combiner,n,s,r,T.font,t,o,i.LOCALE.ALPHABETS.digitTrans,e.Domains_.digit)}}function L(t,e,r,n,o,i,Q,s,a){for(let l,c=0;l=a[c];c++){const a=l in s?s[l]:s.default,c=l in i?i[l]:i.default;T.defineRule(e.toString(),l,"default",Q,r,t(a(n),o,c))}}!function(t){t.BOLD="bold",t.BOLDFRAKTUR="bold-fraktur",t.BOLDITALIC="bold-italic",t.BOLDSCRIPT="bold-script",t.DOUBLESTRUCK="double-struck",t.FULLWIDTH="fullwidth",t.FRAKTUR="fraktur",t.ITALIC="italic",t.MONOSPACE="monospace",t.NORMAL="normal",t.SCRIPT="script",t.SANSSERIF="sans-serif",t.SANSSERIFITALIC="sans-serif-italic",t.SANSSERIFBOLD="sans-serif-bold",t.SANSSERIFBOLDITALIC="sans-serif-bold-italic"}(s=e.Font||(e.Font={})),function(t){t.SUPER="super",t.SUB="sub",t.CIRCLED="circled",t.PARENTHESIZED="parenthesized",t.PERIOD="period",t.NEGATIVECIRCLED="negative-circled",t.DOUBLECIRCLED="double-circled",t.CIRCLEDSANSSERIF="circled-sans-serif",t.NEGATIVECIRCLEDSANSSERIF="negative-circled-sans-serif",t.COMMA="comma",t.SQUARED="squared",t.NEGATIVESQUARED="negative-squared"}(a=e.Embellish||(e.Embellish={})),function(t){t.LATINCAP="latinCap",t.LATINSMALL="latinSmall",t.GREEKCAP="greekCap",t.GREEKSMALL="greekSmall",t.DIGIT="digit"}(l=e.Base||(e.Base={})),e.Domains_={small:["default"],capital:["default"],digit:["default"]},e.makeDomains_=c,e.generate=function(t){const r=n.default.getInstance().locale;n.default.getInstance().locale=t,o.setLocale(),T.addSymbolRules({locale:t}),c();const Q=e.INTERVALS;for(let t,e=0;t=Q[e];e++){const e=p(t.interval,t.subst),r=e.map((function(t){return String.fromCodePoint(parseInt(t,16))}));if("offset"in t)f(e,r,t.font,t.category,t.offset||0);else{d(e,r,i.LOCALE.ALPHABETS[t.base],t.font,t.category,!!t.capital)}}n.default.getInstance().locale=r,o.setLocale()},e.makeInterval=p,e.getFont=h,e.alphabetRules=d,e.numberRules=f,e.makeLetter=L,e.INTERVALS=[{interval:["1D400","1D419"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.BOLD},{interval:["1D41A","1D433"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.BOLD},{interval:["1D56C","1D585"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.BOLDFRAKTUR},{interval:["1D586","1D59F"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.BOLDFRAKTUR},{interval:["1D468","1D481"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.BOLDITALIC},{interval:["1D482","1D49B"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.BOLDITALIC},{interval:["1D4D0","1D4E9"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.BOLDSCRIPT},{interval:["1D4EA","1D503"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.BOLDSCRIPT},{interval:["1D538","1D551"],base:l.LATINCAP,subst:{"1D53A":"2102","1D53F":"210D","1D545":"2115","1D547":"2119","1D548":"211A","1D549":"211D","1D551":"2124"},capital:!0,category:"Lu",font:s.DOUBLESTRUCK},{interval:["1D552","1D56B"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.DOUBLESTRUCK},{interval:["1D504","1D51D"],base:l.LATINCAP,subst:{"1D506":"212D","1D50B":"210C","1D50C":"2111","1D515":"211C","1D51D":"2128"},capital:!0,category:"Lu",font:s.FRAKTUR},{interval:["1D51E","1D537"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.FRAKTUR},{interval:["FF21","FF3A"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.FULLWIDTH},{interval:["FF41","FF5A"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.FULLWIDTH},{interval:["1D434","1D44D"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.ITALIC},{interval:["1D44E","1D467"],base:l.LATINSMALL,subst:{"1D455":"210E"},capital:!1,category:"Ll",font:s.ITALIC},{interval:["1D670","1D689"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.MONOSPACE},{interval:["1D68A","1D6A3"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.MONOSPACE},{interval:["0041","005A"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.NORMAL},{interval:["0061","007A"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.NORMAL},{interval:["1D49C","1D4B5"],base:l.LATINCAP,subst:{"1D49D":"212C","1D4A0":"2130","1D4A1":"2131","1D4A3":"210B","1D4A4":"2110","1D4A7":"2112","1D4A8":"2133","1D4AD":"211B"},capital:!0,category:"Lu",font:s.SCRIPT},{interval:["1D4B6","1D4CF"],base:l.LATINSMALL,subst:{"1D4BA":"212F","1D4BC":"210A","1D4C4":"2134"},capital:!1,category:"Ll",font:s.SCRIPT},{interval:["1D5A0","1D5B9"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.SANSSERIF},{interval:["1D5BA","1D5D3"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.SANSSERIF},{interval:["1D608","1D621"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.SANSSERIFITALIC},{interval:["1D622","1D63B"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.SANSSERIFITALIC},{interval:["1D5D4","1D5ED"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.SANSSERIFBOLD},{interval:["1D5EE","1D607"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.SANSSERIFBOLD},{interval:["1D63C","1D655"],base:l.LATINCAP,subst:{},capital:!0,category:"Lu",font:s.SANSSERIFBOLDITALIC},{interval:["1D656","1D66F"],base:l.LATINSMALL,subst:{},capital:!1,category:"Ll",font:s.SANSSERIFBOLDITALIC},{interval:["0391","03A9"],base:l.GREEKCAP,subst:{"03A2":"03F4"},capital:!0,category:"Lu",font:s.NORMAL},{interval:["03B0","03D0"],base:l.GREEKSMALL,subst:{"03B0":"2207","03CA":"2202","03CB":"03F5","03CC":"03D1","03CD":"03F0","03CE":"03D5","03CF":"03F1","03D0":"03D6"},capital:!1,category:"Ll",font:s.NORMAL},{interval:["1D6A8","1D6C0"],base:l.GREEKCAP,subst:{},capital:!0,category:"Lu",font:s.BOLD},{interval:["1D6C1","1D6E1"],base:l.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:s.BOLD},{interval:["1D6E2","1D6FA"],base:l.GREEKCAP,subst:{},capital:!0,category:"Lu",font:s.ITALIC},{interval:["1D6FB","1D71B"],base:l.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:s.ITALIC},{interval:["1D71C","1D734"],base:l.GREEKCAP,subst:{},capital:!0,category:"Lu",font:s.BOLDITALIC},{interval:["1D735","1D755"],base:l.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:s.BOLDITALIC},{interval:["1D756","1D76E"],base:l.GREEKCAP,subst:{},capital:!0,category:"Lu",font:s.SANSSERIFBOLD},{interval:["1D76F","1D78F"],base:l.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:s.SANSSERIFBOLD},{interval:["1D790","1D7A8"],base:l.GREEKCAP,subst:{},capital:!0,category:"Lu",font:s.SANSSERIFBOLDITALIC},{interval:["1D7A9","1D7C9"],base:l.GREEKSMALL,subst:{},capital:!1,category:"Ll",font:s.SANSSERIFBOLDITALIC},{interval:["0030","0039"],base:l.DIGIT,subst:{},offset:0,category:"Nd",font:s.NORMAL},{interval:["2070","2079"],base:l.DIGIT,subst:{2071:"00B9",2072:"00B2",2073:"00B3"},offset:0,category:"No",font:a.SUPER},{interval:["2080","2089"],base:l.DIGIT,subst:{},offset:0,category:"No",font:a.SUB},{interval:["245F","2473"],base:l.DIGIT,subst:{"245F":"24EA"},offset:0,category:"No",font:a.CIRCLED},{interval:["3251","325F"],base:l.DIGIT,subst:{},offset:21,category:"No",font:a.CIRCLED},{interval:["32B1","32BF"],base:l.DIGIT,subst:{},offset:36,category:"No",font:a.CIRCLED},{interval:["2474","2487"],base:l.DIGIT,subst:{},offset:1,category:"No",font:a.PARENTHESIZED},{interval:["2487","249B"],base:l.DIGIT,subst:{2487:"1F100"},offset:0,category:"No",font:a.PERIOD},{interval:["2775","277F"],base:l.DIGIT,subst:{2775:"24FF"},offset:0,category:"No",font:a.NEGATIVECIRCLED},{interval:["24EB","24F4"],base:l.DIGIT,subst:{},offset:11,category:"No",font:a.NEGATIVECIRCLED},{interval:["24F5","24FE"],base:l.DIGIT,subst:{},offset:1,category:"No",font:a.DOUBLECIRCLED},{interval:["277F","2789"],base:l.DIGIT,subst:{"277F":"1F10B"},offset:0,category:"No",font:a.CIRCLEDSANSSERIF},{interval:["2789","2793"],base:l.DIGIT,subst:{2789:"1F10C"},offset:0,category:"No",font:a.NEGATIVECIRCLEDSANSSERIF},{interval:["FF10","FF19"],base:l.DIGIT,subst:{},offset:0,category:"Nd",font:s.FULLWIDTH},{interval:["1D7CE","1D7D7"],base:l.DIGIT,subst:{},offset:0,category:"Nd",font:s.BOLD},{interval:["1D7D8","1D7E1"],base:l.DIGIT,subst:{},offset:0,category:"Nd",font:s.DOUBLESTRUCK},{interval:["1D7E2","1D7EB"],base:l.DIGIT,subst:{},offset:0,category:"Nd",font:s.SANSSERIF},{interval:["1D7EC","1D7F5"],base:l.DIGIT,subst:{},offset:0,category:"Nd",font:s.SANSSERIFBOLD},{interval:["1D7F6","1D7FF"],base:l.DIGIT,subst:{},offset:0,category:"Nd",font:s.MONOSPACE},{interval:["1F101","1F10A"],base:l.DIGIT,subst:{},offset:0,category:"No",font:a.COMMA},{interval:["24B6","24CF"],base:l.LATINCAP,subst:{},capital:!0,category:"So",font:a.CIRCLED},{interval:["24D0","24E9"],base:l.LATINSMALL,subst:{},capital:!1,category:"So",font:a.CIRCLED},{interval:["1F110","1F129"],base:l.LATINCAP,subst:{},capital:!0,category:"So",font:a.PARENTHESIZED},{interval:["249C","24B5"],base:l.LATINSMALL,subst:{},capital:!1,category:"So",font:a.PARENTHESIZED},{interval:["1F130","1F149"],base:l.LATINCAP,subst:{},capital:!0,category:"So",font:a.SQUARED},{interval:["1F170","1F189"],base:l.LATINCAP,subst:{},capital:!0,category:"So",font:a.NEGATIVESQUARED},{interval:["1F150","1F169"],base:l.LATINCAP,subst:{},capital:!0,category:"So",font:a.NEGATIVECIRCLED}]},8504:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Parser=e.Comparator=e.ClearspeakPreferences=void 0;const n=r(5897),o=r(4440),i=r(1676),Q=r(1676),T=r(2780),s=r(2362);class a extends i.DynamicCstr{constructor(t,e){super(t),this.preference=e}static comparator(){return new c(n.default.getInstance().dynamicCstr,Q.DynamicProperties.createProp([i.DynamicCstr.DEFAULT_VALUES[Q.Axis.LOCALE]],[i.DynamicCstr.DEFAULT_VALUES[Q.Axis.MODALITY]],[i.DynamicCstr.DEFAULT_VALUES[Q.Axis.DOMAIN]],[i.DynamicCstr.DEFAULT_VALUES[Q.Axis.STYLE]]))}static fromPreference(t){const e=t.split(":"),r={},n=l.getProperties(),o=Object.keys(n);for(let t,i=0;t=e[i];i++){const e=t.split("_");if(-1===o.indexOf(e[0]))continue;const i=e[1];i&&i!==a.AUTO&&-1!==n[e[0]].indexOf(i)&&(r[e[0]]=e[1])}return r}static toPreference(t){const e=Object.keys(t),r=[];for(let n=0;nQ?-1:i0&&e<20&&r>0&&r<11}function v(t){return o.default.getInstance().style===t}function M(t){if(!t.hasAttribute("annotation"))return!1;const e=t.getAttribute("annotation");return!!/clearspeak:simple$|clearspeak:simple;/.exec(e)}function _(t){if(M(t))return!0;if("subscript"!==t.tagName)return!1;const e=t.childNodes[0].childNodes,r=e[1];return"identifier"===e[0].tagName&&(O(r)||"infixop"===r.tagName&&r.hasAttribute("role")&&"implicit"===r.getAttribute("role")&&V(r))}function O(t){return"number"===t.tagName&&t.hasAttribute("role")&&"integer"===t.getAttribute("role")}function V(t){return i.evalXPath("children/*",t).every((t=>O(t)||"identifier"===t.tagName))}function S(t){return"text"===t.type||"punctuated"===t.type&&"text"===t.role&&g(t.childNodes[0])&&x(t.childNodes.slice(1))||"identifier"===t.type&&"unit"===t.role||"infixop"===t.type&&("implicit"===t.role||"unit"===t.role)}function x(t){for(let e=0;e10?Q.LOCALE.NUMBERS.numericOrdinal(e):Q.LOCALE.NUMBERS.wordOrdinal(e)},e.NESTING_DEPTH=null,e.nestingDepth=function(t){let r=0;const n=t.textContent,o="open"===t.getAttribute("role")?0:1;let i=t.parentNode;for(;i;)"fenced"===i.tagName&&i.childNodes[0].childNodes[o].textContent===n&&r++,i=i.parentNode;return e.NESTING_DEPTH=r>1?Q.LOCALE.NUMBERS.wordOrdinal(r):"",e.NESTING_DEPTH},e.matchingFences=function(t){const e=t.previousSibling;let r,n;return e?(r=e,n=t):(r=t,n=t.nextSibling),n&&(0,u.isMatchingFence)(r.textContent,n.textContent)?[t]:[]},e.insertNesting=E,s.Grammar.getInstance().setCorrection("insertNesting",E),e.fencedArguments=function(t){const e=n.toArray(t.parentNode.childNodes),r=i.evalXPath("../../children/*",t),o=e.indexOf(t);return C(r[o])||C(r[o+1])?[t]:[]},e.simpleArguments=function(t){const e=n.toArray(t.parentNode.childNodes),r=i.evalXPath("../../children/*",t),o=e.indexOf(t);return A(r[o])&&r[o+1]&&(A(r[o+1])||"root"===r[o+1].tagName||"sqrt"===r[o+1].tagName||"superscript"===r[o+1].tagName&&r[o+1].childNodes[0].childNodes[0]&&("number"===r[o+1].childNodes[0].childNodes[0].tagName||"identifier"===r[o+1].childNodes[0].childNodes[0].tagName)&&("2"===r[o+1].childNodes[0].childNodes[1].textContent||"3"===r[o+1].childNodes[0].childNodes[1].textContent))?[t]:[]},e.simpleFactor_=A,e.fencedFactor_=C,e.layoutFactor_=N,e.wordOrdinal=function(t){return Q.LOCALE.NUMBERS.wordOrdinal(parseInt(t.textContent,10))}},6141:function(t,e,r){var n=this&&this.__awaiter||function(t,e,r,n){return new(r||(r=Promise))((function(o,i){function Q(t){try{s(n.next(t))}catch(t){i(t)}}function T(t){try{s(n.throw(t))}catch(t){i(t)}}function s(t){var e;t.done?o(t.value):(e=t.value,e instanceof r?e:new r((function(t){t(e)}))).then(Q,T)}s((n=n.apply(t,e||[])).next())}))};Object.defineProperty(e,"__esModule",{value:!0}),e.loadAjax=e.loadFileSync=e.loadFile=e.parseMaps=e.retrieveFiles=e.standardLoader=e.loadLocale=e.store=void 0;const o=r(2139),i=r(5897),Q=r(4440),T=r(7248),s=r(2315),a=r(1676),l=r(2780),c=r(2362),u=r(7491),p=r(313);e.store=l;const h={functions:l.addFunctionRules,symbols:l.addSymbolRules,units:l.addUnitRules,si:l.setSiPrefixes};let d=!1;function f(t=i.default.getInstance().locale){i.EnginePromise.loaded[t]||(i.EnginePromise.loaded[t]=[!1,!1],function(t){if(i.default.getInstance().isIE&&i.default.getInstance().mode===Q.Mode.HTTP)return void H(t);m(t)}(t))}function L(){switch(i.default.getInstance().mode){case Q.Mode.ASYNC:return b;case Q.Mode.HTTP:return M;case Q.Mode.SYNC:default:return v}}function m(t){const e=i.default.getInstance().customLoader?i.default.getInstance().customLoader:L(),r=new Promise((r=>{e(t).then((e=>{y(e),i.EnginePromise.loaded[t]=[!0,!0],r(t)}),(e=>{i.EnginePromise.loaded[t]=[!0,!1],console.error(`Unable to load locale: ${t}`),i.default.getInstance().locale=i.default.getInstance().defaultLocale,r(t)}))}));i.EnginePromise.promises[t]=r}function y(t){g(JSON.parse(t))}function g(t,e){let r=!0;for(let n,o=0;n=Object.keys(t)[o];o++){const o=n.split("/");e&&e!==o[0]||("rules"===o[1]?c.SpeechRuleEngine.getInstance().addStore(t[n]):"messages"===o[1]?(0,u.completeLocale)(t[n]):(r&&(p.generate(o[0]),r=!1),t[n].forEach(h[o[1]])))}}function H(t,e){let r=e||1;o.mapsForIE?g(o.mapsForIE,t):r<=5&&setTimeout((()=>H(t,r++)).bind(this),300)}function b(t){const e=T.localePath(t);return new Promise(((t,r)=>{s.default.fs.readFile(e,"utf8",((e,n)=>{if(e)return r(e);t(n)}))}))}function v(t){const e=T.localePath(t);return new Promise(((t,r)=>{let n="{}";try{n=s.default.fs.readFileSync(e,"utf8")}catch(t){return r(t)}t(n)}))}function M(t){const e=T.localePath(t),r=new XMLHttpRequest;return new Promise(((t,n)=>{r.onreadystatechange=function(){if(4===r.readyState){const e=r.status;0===e||e>=200&&e<400?t(r.responseText):n(e)}},r.open("GET",e,!0),r.send()}))}e.loadLocale=function(t=i.default.getInstance().locale){return n(this,void 0,void 0,(function*(){return d||(f(a.DynamicCstr.BASE_LOCALE),d=!0),i.EnginePromise.promises[a.DynamicCstr.BASE_LOCALE].then((()=>n(this,void 0,void 0,(function*(){const e=i.default.getInstance().defaultLocale;return e?(f(e),i.EnginePromise.promises[e].then((()=>n(this,void 0,void 0,(function*(){return f(t),i.EnginePromise.promises[t]}))))):(f(t),i.EnginePromise.promises[t])}))))}))},e.standardLoader=L,e.retrieveFiles=m,e.parseMaps=y,e.loadFile=b,e.loadFileSync=v,e.loadAjax=M},7088:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.leftSubscriptBrief=e.leftSuperscriptBrief=e.leftSubscriptVerbose=e.leftSuperscriptVerbose=e.baselineBrief=e.baselineVerbose=void 0;const n=r(1378);e.baselineVerbose=function(t){return n.baselineVerbose(t).replace(/-$/,"")},e.baselineBrief=function(t){return n.baselineBrief(t).replace(/-$/,"")},e.leftSuperscriptVerbose=function(t){return n.superscriptVerbose(t).replace(/^exposant/,"exposant gauche")},e.leftSubscriptVerbose=function(t){return n.subscriptVerbose(t).replace(/^indice/,"indice gauche")},e.leftSuperscriptBrief=function(t){return n.superscriptBrief(t).replace(/^sup/,"sup gauche")},e.leftSubscriptBrief=function(t){return n.subscriptBrief(t).replace(/^sub/,"sub gauche")}},9577:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.MathspeakRules=void 0;const n=r(1676),o=r(365),i=r(7088),Q=r(1378),T=r(8437),s=r(7283),a=r(7598);e.MathspeakRules=function(){s.addStore(n.DynamicCstr.BASE_LOCALE+".speech.mathspeak","",{CQFspaceoutNumber:Q.spaceoutNumber,CQFspaceoutIdentifier:Q.spaceoutIdentifier,CSFspaceoutText:Q.spaceoutText,CSFopenFracVerbose:Q.openingFractionVerbose,CSFcloseFracVerbose:Q.closingFractionVerbose,CSFoverFracVerbose:Q.overFractionVerbose,CSFopenFracBrief:Q.openingFractionBrief,CSFcloseFracBrief:Q.closingFractionBrief,CSFopenFracSbrief:Q.openingFractionSbrief,CSFcloseFracSbrief:Q.closingFractionSbrief,CSFoverFracSbrief:Q.overFractionSbrief,CSFvulgarFraction:T.vulgarFraction,CQFvulgarFractionSmall:Q.isSmallVulgarFraction,CSFopenRadicalVerbose:Q.openingRadicalVerbose,CSFcloseRadicalVerbose:Q.closingRadicalVerbose,CSFindexRadicalVerbose:Q.indexRadicalVerbose,CSFopenRadicalBrief:Q.openingRadicalBrief,CSFcloseRadicalBrief:Q.closingRadicalBrief,CSFindexRadicalBrief:Q.indexRadicalBrief,CSFopenRadicalSbrief:Q.openingRadicalSbrief,CSFindexRadicalSbrief:Q.indexRadicalSbrief,CQFisSmallRoot:Q.smallRoot,CSFsuperscriptVerbose:Q.superscriptVerbose,CSFsuperscriptBrief:Q.superscriptBrief,CSFsubscriptVerbose:Q.subscriptVerbose,CSFsubscriptBrief:Q.subscriptBrief,CSFbaselineVerbose:Q.baselineVerbose,CSFbaselineBrief:Q.baselineBrief,CSFleftsuperscriptVerbose:Q.superscriptVerbose,CSFleftsubscriptVerbose:Q.subscriptVerbose,CSFrightsuperscriptVerbose:Q.superscriptVerbose,CSFrightsubscriptVerbose:Q.subscriptVerbose,CSFleftsuperscriptBrief:Q.superscriptBrief,CSFleftsubscriptBrief:Q.subscriptBrief,CSFrightsuperscriptBrief:Q.superscriptBrief,CSFrightsubscriptBrief:Q.subscriptBrief,CSFunderscript:Q.nestedUnderscript,CSFoverscript:Q.nestedOverscript,CSFendscripts:Q.endscripts,CTFordinalCounter:T.ordinalCounter,CTFwordCounter:T.wordCounter,CTFcontentIterator:o.contentIterator,CQFdetIsSimple:Q.determinantIsSimple,CSFRemoveParens:Q.removeParens,CQFresetNesting:Q.resetNestingDepth,CGFbaselineConstraint:Q.generateBaselineConstraint,CGFtensorRules:Q.generateTensorRules}),s.addStore("es.speech.mathspeak",n.DynamicCstr.BASE_LOCALE+".speech.mathspeak",{CTFunitMultipliers:a.unitMultipliers,CQFoneLeft:a.oneLeft}),s.addStore("fr.speech.mathspeak",n.DynamicCstr.BASE_LOCALE+".speech.mathspeak",{CSFbaselineVerbose:i.baselineVerbose,CSFbaselineBrief:i.baselineBrief,CSFleftsuperscriptVerbose:i.leftSuperscriptVerbose,CSFleftsubscriptVerbose:i.leftSubscriptVerbose,CSFleftsuperscriptBrief:i.leftSuperscriptBrief,CSFleftsubscriptBrief:i.leftSubscriptBrief})}},1378:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.smallRoot=e.generateTensorRules=e.removeParens=e.generateBaselineConstraint=e.determinantIsSimple=e.nestedOverscript=e.endscripts=e.overscoreNestingDepth=e.nestedUnderscript=e.underscoreNestingDepth=e.indexRadicalSbrief=e.openingRadicalSbrief=e.indexRadicalBrief=e.closingRadicalBrief=e.openingRadicalBrief=e.indexRadicalVerbose=e.closingRadicalVerbose=e.openingRadicalVerbose=e.getRootIndex=e.nestedRadical=e.radicalNestingDepth=e.baselineBrief=e.baselineVerbose=e.superscriptBrief=e.superscriptVerbose=e.subscriptBrief=e.subscriptVerbose=e.nestedSubSuper=e.isSmallVulgarFraction=e.overFractionSbrief=e.closingFractionSbrief=e.openingFractionSbrief=e.closingFractionBrief=e.openingFractionBrief=e.overFractionVerbose=e.closingFractionVerbose=e.openingFractionVerbose=e.nestedFraction=e.fractionNestingDepth=e.computeNestingDepth_=e.containsAttr=e.getNestingDepth=e.resetNestingDepth=e.nestingBarriers=e.spaceoutIdentifier=e.spaceoutNumber=e.spaceoutNodes=e.spaceoutText=void 0;const n=r(707),o=r(5740),i=r(5274),Q=r(4356),T=r(3308);let s={};function a(t,e){const r=Array.from(t.textContent),n=[],o=T.default.getInstance(),i=t.ownerDocument;for(let t,Q=0;t=r[Q];Q++){const r=o.getNodeFactory().makeLeafNode(t,"unknown"),Q=o.identifierNode(r,"unknown","");e(Q),n.push(Q.xml(i))}return n}function l(t,r,i,Q,T,a){Q=Q||e.nestingBarriers,T=T||{},a=a||function(t){return!1};const l=o.serializeXml(r);if(s[t]||(s[t]={}),s[t][l])return s[t][l];if(a(r)||i.indexOf(r.tagName)<0)return 0;const c=u(r,i,n.setdifference(Q,i),T,a,0);return s[t][l]=c,c}function c(t,e){if(!t.attributes)return!1;const r=o.toArray(t.attributes);for(let t,n=0;t=r[n];n++)if(e[t.nodeName]===t.nodeValue)return!0;return!1}function u(t,e,r,n,i,Q){if(i(t)||r.indexOf(t.tagName)>-1||c(t,n))return Q;if(e.indexOf(t.tagName)>-1&&Q++,!t.childNodes||0===t.childNodes.length)return Q;const T=o.toArray(t.childNodes);return Math.max.apply(null,T.map((function(t){return u(t,e,r,n,i,Q)})))}function p(t){return l("fraction",t,["fraction"],e.nestingBarriers,{},Q.LOCALE.FUNCTIONS.fracNestDepth)}function h(t,e,r){const n=p(t),o=Array(n).fill(e);return r&&o.push(r),o.join(Q.LOCALE.MESSAGES.regexp.JOINER_FRAC)}function d(t,e,r){for(;t.parentNode;){const n=t.parentNode,o=n.parentNode;if(!o)break;const i=t.getAttribute&&t.getAttribute("role");("subscript"===o.tagName&&t===n.childNodes[1]||"tensor"===o.tagName&&i&&("leftsub"===i||"rightsub"===i))&&(e=r.sub+Q.LOCALE.MESSAGES.regexp.JOINER_SUBSUPER+e),("superscript"===o.tagName&&t===n.childNodes[1]||"tensor"===o.tagName&&i&&("leftsuper"===i||"rightsuper"===i))&&(e=r.sup+Q.LOCALE.MESSAGES.regexp.JOINER_SUBSUPER+e),t=o}return e.trim()}function f(t){return l("radical",t,["sqrt","root"],e.nestingBarriers,{})}function L(t,e,r){const n=f(t),o=m(t);return r=o?Q.LOCALE.FUNCTIONS.combineRootIndex(r,o):r,1===n?r:Q.LOCALE.FUNCTIONS.combineNestedRadical(e,Q.LOCALE.FUNCTIONS.radicalNestDepth(n-1),r)}function m(t){const e="sqrt"===t.tagName?"2":i.evalXPath("children/*[1]",t)[0].textContent.trim();return Q.LOCALE.MESSAGES.MSroots[e]||""}function y(t){return l("underscore",t,["underscore"],e.nestingBarriers,{},(function(t){return t.tagName&&"underscore"===t.tagName&&"underaccent"===t.childNodes[0].childNodes[1].getAttribute("role")}))}function g(t){return l("overscore",t,["overscore"],e.nestingBarriers,{},(function(t){return t.tagName&&"overscore"===t.tagName&&"overaccent"===t.childNodes[0].childNodes[1].getAttribute("role")}))}e.spaceoutText=function(t){return Array.from(t.textContent).join(" ")},e.spaceoutNodes=a,e.spaceoutNumber=function(t){return a(t,(function(t){t.textContent.match(/\W/)||(t.type="number")}))},e.spaceoutIdentifier=function(t){return a(t,(function(t){t.font="unknown",t.type="identifier"}))},e.nestingBarriers=["cases","cell","integral","line","matrix","multiline","overscore","root","row","sqrt","subscript","superscript","table","underscore","vector"],e.resetNestingDepth=function(t){return s={},[t]},e.getNestingDepth=l,e.containsAttr=c,e.computeNestingDepth_=u,e.fractionNestingDepth=p,e.nestedFraction=h,e.openingFractionVerbose=function(t){return h(t,Q.LOCALE.MESSAGES.MS.START,Q.LOCALE.MESSAGES.MS.FRAC_V)},e.closingFractionVerbose=function(t){return h(t,Q.LOCALE.MESSAGES.MS.END,Q.LOCALE.MESSAGES.MS.FRAC_V)},e.overFractionVerbose=function(t){return h(t,Q.LOCALE.MESSAGES.MS.FRAC_OVER)},e.openingFractionBrief=function(t){return h(t,Q.LOCALE.MESSAGES.MS.START,Q.LOCALE.MESSAGES.MS.FRAC_B)},e.closingFractionBrief=function(t){return h(t,Q.LOCALE.MESSAGES.MS.END,Q.LOCALE.MESSAGES.MS.FRAC_B)},e.openingFractionSbrief=function(t){const e=p(t);return 1===e?Q.LOCALE.MESSAGES.MS.FRAC_S:Q.LOCALE.FUNCTIONS.combineNestedFraction(Q.LOCALE.MESSAGES.MS.NEST_FRAC,Q.LOCALE.FUNCTIONS.radicalNestDepth(e-1),Q.LOCALE.MESSAGES.MS.FRAC_S)},e.closingFractionSbrief=function(t){const e=p(t);return 1===e?Q.LOCALE.MESSAGES.MS.ENDFRAC:Q.LOCALE.FUNCTIONS.combineNestedFraction(Q.LOCALE.MESSAGES.MS.NEST_FRAC,Q.LOCALE.FUNCTIONS.radicalNestDepth(e-1),Q.LOCALE.MESSAGES.MS.ENDFRAC)},e.overFractionSbrief=function(t){const e=p(t);return 1===e?Q.LOCALE.MESSAGES.MS.FRAC_OVER:Q.LOCALE.FUNCTIONS.combineNestedFraction(Q.LOCALE.MESSAGES.MS.NEST_FRAC,Q.LOCALE.FUNCTIONS.radicalNestDepth(e-1),Q.LOCALE.MESSAGES.MS.FRAC_OVER)},e.isSmallVulgarFraction=function(t){return Q.LOCALE.FUNCTIONS.fracNestDepth(t)?[t]:[]},e.nestedSubSuper=d,e.subscriptVerbose=function(t){return d(t,Q.LOCALE.MESSAGES.MS.SUBSCRIPT,{sup:Q.LOCALE.MESSAGES.MS.SUPER,sub:Q.LOCALE.MESSAGES.MS.SUB})},e.subscriptBrief=function(t){return d(t,Q.LOCALE.MESSAGES.MS.SUB,{sup:Q.LOCALE.MESSAGES.MS.SUP,sub:Q.LOCALE.MESSAGES.MS.SUB})},e.superscriptVerbose=function(t){return d(t,Q.LOCALE.MESSAGES.MS.SUPERSCRIPT,{sup:Q.LOCALE.MESSAGES.MS.SUPER,sub:Q.LOCALE.MESSAGES.MS.SUB})},e.superscriptBrief=function(t){return d(t,Q.LOCALE.MESSAGES.MS.SUP,{sup:Q.LOCALE.MESSAGES.MS.SUP,sub:Q.LOCALE.MESSAGES.MS.SUB})},e.baselineVerbose=function(t){const e=d(t,"",{sup:Q.LOCALE.MESSAGES.MS.SUPER,sub:Q.LOCALE.MESSAGES.MS.SUB});return e?e.replace(new RegExp(Q.LOCALE.MESSAGES.MS.SUB+"$"),Q.LOCALE.MESSAGES.MS.SUBSCRIPT).replace(new RegExp(Q.LOCALE.MESSAGES.MS.SUPER+"$"),Q.LOCALE.MESSAGES.MS.SUPERSCRIPT):Q.LOCALE.MESSAGES.MS.BASELINE},e.baselineBrief=function(t){return d(t,"",{sup:Q.LOCALE.MESSAGES.MS.SUP,sub:Q.LOCALE.MESSAGES.MS.SUB})||Q.LOCALE.MESSAGES.MS.BASE},e.radicalNestingDepth=f,e.nestedRadical=L,e.getRootIndex=m,e.openingRadicalVerbose=function(t){return L(t,Q.LOCALE.MESSAGES.MS.NESTED,Q.LOCALE.MESSAGES.MS.STARTROOT)},e.closingRadicalVerbose=function(t){return L(t,Q.LOCALE.MESSAGES.MS.NESTED,Q.LOCALE.MESSAGES.MS.ENDROOT)},e.indexRadicalVerbose=function(t){return L(t,Q.LOCALE.MESSAGES.MS.NESTED,Q.LOCALE.MESSAGES.MS.ROOTINDEX)},e.openingRadicalBrief=function(t){return L(t,Q.LOCALE.MESSAGES.MS.NEST_ROOT,Q.LOCALE.MESSAGES.MS.STARTROOT)},e.closingRadicalBrief=function(t){return L(t,Q.LOCALE.MESSAGES.MS.NEST_ROOT,Q.LOCALE.MESSAGES.MS.ENDROOT)},e.indexRadicalBrief=function(t){return L(t,Q.LOCALE.MESSAGES.MS.NEST_ROOT,Q.LOCALE.MESSAGES.MS.ROOTINDEX)},e.openingRadicalSbrief=function(t){return L(t,Q.LOCALE.MESSAGES.MS.NEST_ROOT,Q.LOCALE.MESSAGES.MS.ROOT)},e.indexRadicalSbrief=function(t){return L(t,Q.LOCALE.MESSAGES.MS.NEST_ROOT,Q.LOCALE.MESSAGES.MS.INDEX)},e.underscoreNestingDepth=y,e.nestedUnderscript=function(t){const e=y(t);return Array(e).join(Q.LOCALE.MESSAGES.MS.UNDER)+Q.LOCALE.MESSAGES.MS.UNDERSCRIPT},e.overscoreNestingDepth=g,e.endscripts=function(t){return Q.LOCALE.MESSAGES.MS.ENDSCRIPTS},e.nestedOverscript=function(t){const e=g(t);return Array(e).join(Q.LOCALE.MESSAGES.MS.OVER)+Q.LOCALE.MESSAGES.MS.OVERSCRIPT},e.determinantIsSimple=function(t){if("matrix"!==t.tagName||"determinant"!==t.getAttribute("role"))return[];const e=i.evalXPath("children/row/children/cell/children/*",t);for(let t,r=0;t=e[r];r++)if("number"!==t.tagName){if("identifier"===t.tagName){const e=t.getAttribute("role");if("latinletter"===e||"greekletter"===e||"otherletter"===e)continue}return[]}return[t]},e.generateBaselineConstraint=function(){const t=t=>t.map((t=>"ancestor::"+t)),e=t=>"not("+t+")",r=e(t(["subscript","superscript","tensor"]).join(" or ")),n=t(["relseq","multrel"]),o=t(["fraction","punctuation","fenced","sqrt","root"]);let i=[];for(let t,e=0;t=o[e];e++)i=i.concat(n.map((function(e){return t+"/"+e})));return[["ancestor::*/following-sibling::*",r,e(i.join(" | "))].join(" and ")]},e.removeParens=function(t){if(!t.childNodes.length||!t.childNodes[0].childNodes.length||!t.childNodes[0].childNodes[0].childNodes.length)return"";const e=t.childNodes[0].childNodes[0].childNodes[0].textContent;return e.match(/^\(.+\)$/)?e.slice(1,-1):e};const H=new Map([[3,"CSFleftsuperscript"],[4,"CSFleftsubscript"],[2,"CSFbaseline"],[1,"CSFrightsubscript"],[0,"CSFrightsuperscript"]]),b=new Map([[4,2],[3,3],[2,1],[1,4],[0,5]]);function v(t){const e=[];let r="",n="",o=parseInt(t,2);for(let t=0;t<5;t++){const i="children/*["+b.get(t)+"]";if(1&o){const e=H.get(t%5);r="[t] "+e+"Verbose; [n] "+i+";"+r,n="[t] "+e+"Brief; [n] "+i+";"+n}else e.unshift("name("+i+')="empty"');o>>=1}return[e,r,n]}e.generateTensorRules=function(t,e=!0){const r=["11111","11110","11101","11100","10111","10110","10101","10100","01111","01110","01101","01100"];for(let n,o=0;n=r[o];o++){let r="tensor"+n,[o,i,Q]=v(n);t.defineRule(r,"default",i,"self::tensor",...o),e&&(t.defineRule(r,"brief",Q,"self::tensor",...o),t.defineRule(r,"sbrief",Q,"self::tensor",...o));const T=H.get(2);i+="; [t]"+T+"Verbose",Q+="; [t]"+T+"Brief",r+="-baseline";const s="((.//*[not(*)])[last()]/@id)!=(((.//ancestor::fraction|ancestor::root|ancestor::sqrt|ancestor::cell|ancestor::line|ancestor::stree)[1]//*[not(*)])[last()]/@id)";t.defineRule(r,"default",i,"self::tensor",s,...o),e&&(t.defineRule(r,"brief",Q,"self::tensor",s,...o),t.defineRule(r,"sbrief",Q,"self::tensor",s,...o))}},e.smallRoot=function(t){let e=Object.keys(Q.LOCALE.MESSAGES.MSroots).length;if(!e)return[];if(e++,!t.childNodes||0===t.childNodes.length||!t.childNodes[0].childNodes)return[];const r=t.childNodes[0].childNodes[0].textContent;if(!/^\d+$/.test(r))return[];const n=parseInt(r,10);return n>1&&n<=e?[t]:[]}},6922:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.implicitIterator=e.relationIterator=e.propagateNumber=e.checkParent_=e.NUMBER_INHIBITORS_=e.NUMBER_PROPAGATORS_=e.enlargeFence=e.indexRadical=e.closingRadical=e.openingRadical=e.radicalNestingDepth=e.nestedRadical=e.overBevelledFraction=e.overFraction=e.closingFraction=e.openingFraction=void 0;const n=r(7052),o=r(5740),i=r(5274),Q=r(2105),T=r(5897),s=r(7630),a=r(9265),l=r(4356),c=r(1378);function u(t,e){const r=p(t);return 1===r?e:new Array(r).join(l.LOCALE.MESSAGES.MS.NESTED)+e}function p(t,e){const r=e||0;return t.parentNode?p(t.parentNode,"root"===t.tagName||"sqrt"===t.tagName?r+1:r):r}function h(t){const e="\u2820";if(1===t.length)return e+t;const r=t.split("");return r.every((function(t){return"\u2833"===t}))?e+r.join(e):t.slice(0,-1)+e+t.slice(-1)}function d(t,r){const n=t.parent;if(!n)return!1;const o=n.type;return-1!==e.NUMBER_PROPAGATORS_.indexOf(o)||"prefixop"===o&&"negative"===n.role&&!r.script||"prefixop"===o&&"geometry"===n.role||!("punctuated"!==o||r.enclosed&&"text"!==n.role)}function f(t,r){return t.childNodes.length?(-1!==e.NUMBER_INHIBITORS_.indexOf(t.type)&&(r.script=!0),"fenced"===t.type?(r.number=!1,r.enclosed=!0,["",r]):(d(t,r)&&(r.number=!0,r.enclosed=!1),["",r])):(d(t,r)&&(r.number=!0,r.script=!1,r.enclosed=!1),[r.number?"number":"",{number:!1,enclosed:r.enclosed,script:r.script}])}e.openingFraction=function(t){const e=c.fractionNestingDepth(t);return new Array(e).join(l.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+l.LOCALE.MESSAGES.MS.FRACTION_START},e.closingFraction=function(t){const e=c.fractionNestingDepth(t);return new Array(e).join(l.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+l.LOCALE.MESSAGES.MS.FRACTION_END},e.overFraction=function(t){const e=c.fractionNestingDepth(t);return new Array(e).join(l.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+l.LOCALE.MESSAGES.MS.FRACTION_OVER},e.overBevelledFraction=function(t){const e=c.fractionNestingDepth(t);return new Array(e).join(l.LOCALE.MESSAGES.MS.FRACTION_REPEAT)+"\u2838"+l.LOCALE.MESSAGES.MS.FRACTION_OVER},e.nestedRadical=u,e.radicalNestingDepth=p,e.openingRadical=function(t){return u(t,l.LOCALE.MESSAGES.MS.STARTROOT)},e.closingRadical=function(t){return u(t,l.LOCALE.MESSAGES.MS.ENDROOT)},e.indexRadical=function(t){return u(t,l.LOCALE.MESSAGES.MS.ROOTINDEX)},e.enlargeFence=h,Q.Grammar.getInstance().setCorrection("enlargeFence",h),e.NUMBER_PROPAGATORS_=["multirel","relseq","appl","row","line"],e.NUMBER_INHIBITORS_=["subscript","superscript","overscore","underscore"],e.checkParent_=d,e.propagateNumber=f,(0,s.register)(new a.SemanticVisitor("nemeth","number",f,{number:!0})),e.relationIterator=function(t,e){const r=t.slice(0);let Q,s=!0;return Q=t.length>0?i.evalXPath("../../content/*",t[0]):[],function(){const t=Q.shift(),i=r.shift(),a=r[0],u=e?[n.AuditoryDescription.create({text:e},{translate:!0})]:[];if(!t)return u;const p=i?c.nestedSubSuper(i,"",{sup:l.LOCALE.MESSAGES.MS.SUPER,sub:l.LOCALE.MESSAGES.MS.SUB}):"",h=i&&"EMPTY"!==o.tagName(i)||s&&t.parentNode.parentNode&&t.parentNode.parentNode.previousSibling?[n.AuditoryDescription.create({text:"\u2800"+p},{})]:[],d=a&&"EMPTY"!==o.tagName(a)||!Q.length&&t.parentNode.parentNode&&t.parentNode.parentNode.nextSibling?[n.AuditoryDescription.create({text:"\u2800"},{})]:[],f=T.default.evaluateNode(t);return s=!1,u.concat(h,f,d)}},e.implicitIterator=function(t,e){const r=t.slice(0);let Q;return Q=t.length>0?i.evalXPath("../../content/*",t[0]):[],function(){const t=r.shift(),i=r[0],T=Q.shift(),s=e?[n.AuditoryDescription.create({text:e},{translate:!0})]:[];if(!T)return s;const a=t&&"NUMBER"===o.tagName(t),l=i&&"NUMBER"===o.tagName(i);return s.concat(a&&l&&"space"===T.getAttribute("role")?[n.AuditoryDescription.create({text:"\u2800"},{})]:[])}}},8437:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.ordinalPosition=e.vulgarFraction=e.wordCounter=e.ordinalCounter=void 0;const n=r(9536),o=r(5740),i=r(4356),Q=r(4977);e.ordinalCounter=function(t,e){let r=0;return function(){return i.LOCALE.NUMBERS.numericOrdinal(++r)+" "+e}},e.wordCounter=function(t,e){let r=0;return function(){return i.LOCALE.NUMBERS.numberToOrdinal(++r,!1)+" "+e}},e.vulgarFraction=function(t){const e=(0,Q.convertVulgarFraction)(t,i.LOCALE.MESSAGES.MS.FRAC_OVER);return e.convertible&&e.enumerator&&e.denominator?[new n.Span(i.LOCALE.NUMBERS.numberToWords(e.enumerator),{extid:t.childNodes[0].childNodes[0].getAttribute("extid"),separator:""}),new n.Span(i.LOCALE.NUMBERS.vulgarSep,{separator:""}),new n.Span(i.LOCALE.NUMBERS.numberToOrdinal(e.denominator,1!==e.enumerator),{extid:t.childNodes[0].childNodes[1].getAttribute("extid")})]:[new n.Span(e.content||"",{extid:t.getAttribute("extid")})]},e.ordinalPosition=function(t){const e=o.toArray(t.parentNode.childNodes);return i.LOCALE.NUMBERS.numericOrdinal(e.indexOf(t)+1).toString()}},9284:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.BrailleRules=e.OtherRules=e.PrefixRules=void 0;const n=r(1676),o=r(365),i=r(1378),Q=r(6922),T=r(8437),s=r(7283);e.PrefixRules=function(){s.addStore("en.prefix.default","",{CSFordinalPosition:T.ordinalPosition})},e.OtherRules=function(){s.addStore("en.speech.chromevox","",{CTFnodeCounter:o.nodeCounter,CTFcontentIterator:o.contentIterator}),s.addStore("en.speech.emacspeak","en.speech.chromevox",{CQFvulgarFractionSmall:i.isSmallVulgarFraction,CSFvulgarFraction:T.vulgarFraction})},e.BrailleRules=function(){s.addStore("nemeth.braille.default",n.DynamicCstr.BASE_LOCALE+".speech.mathspeak",{CSFopenFraction:Q.openingFraction,CSFcloseFraction:Q.closingFraction,CSFoverFraction:Q.overFraction,CSFoverBevFraction:Q.overBevelledFraction,CSFopenRadical:Q.openingRadical,CSFcloseRadical:Q.closingRadical,CSFindexRadical:Q.indexRadical,CSFsubscript:i.subscriptVerbose,CSFsuperscript:i.superscriptVerbose,CSFbaseline:i.baselineVerbose,CGFtensorRules:t=>i.generateTensorRules(t,!1),CTFrelationIterator:Q.relationIterator,CTFimplicitIterator:Q.implicitIterator})}},7599:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.init=e.INIT_=void 0;const n=r(5425),o=r(9577),i=r(9284);e.INIT_=!1,e.init=function(){e.INIT_||((0,o.MathspeakRules)(),(0,n.ClearspeakRules)(),(0,i.PrefixRules)(),(0,i.OtherRules)(),(0,i.BrailleRules)(),e.INIT_=!0)}},7283:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.getStore=e.addStore=e.funcStore=void 0;const n=r(1676);e.funcStore=new Map,e.addStore=function(t,r,n){const o={};if(r){const t=e.funcStore.get(r)||{};Object.assign(o,t)}e.funcStore.set(t,Object.assign(o,n))},e.getStore=function(t,r,o){return e.funcStore.get([t,r,o].join("."))||e.funcStore.get([n.DynamicCstr.DEFAULT_VALUES[n.Axis.LOCALE],r,o].join("."))||e.funcStore.get([n.DynamicCstr.BASE_LOCALE,r,o].join("."))||{}}},7598:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.oneLeft=e.leftMostUnit=e.rightMostUnit=e.unitMultipliers=void 0;const n=r(7052),o=r(5274),i=r(4356);e.unitMultipliers=function(t,e){const r=t;let o=0;return function(){const t=n.AuditoryDescription.create({text:T(r[o])&&s(r[o+1])?i.LOCALE.MESSAGES.unitTimes:""},{});return o++,[t]}};const Q=["superscript","subscript","overscore","underscore"];function T(t){for(;t;){if("unit"===t.getAttribute("role"))return!0;const e=t.tagName,r=o.evalXPath("children/*",t);t=-1!==Q.indexOf(e)?r[0]:r[r.length-1]}return!1}function s(t){for(;t;){if("unit"===t.getAttribute("role"))return!0;t=o.evalXPath("children/*",t)[0]}return!1}e.rightMostUnit=T,e.leftMostUnit=s,e.oneLeft=function(t){for(;t;){if("number"===t.tagName&&"1"===t.textContent)return[t];if("infixop"!==t.tagName||"multiplication"!==t.getAttribute("role")&&"implicit"!==t.getAttribute("role"))return[];t=o.evalXPath("children/*",t)[0]}return[]}},3284:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.AbstractWalker=void 0;const n=r(7052),o=r(8290),i=r(5740),Q=r(4440),T=r(6828),s=r(8496),a=r(2298),l=r(4356),c=r(2105),u=r(5656),p=r(9552),h=r(9543),d=r(8504),f=r(7730),L=r(1214),m=r(179),y=r(1204),g=r(5274);class H{constructor(t,e,r,n){this.node=t,this.generator=e,this.highlighter=r,this.modifier=!1,this.keyMapping=new Map([[s.KeyCode.UP,this.up.bind(this)],[s.KeyCode.DOWN,this.down.bind(this)],[s.KeyCode.RIGHT,this.right.bind(this)],[s.KeyCode.LEFT,this.left.bind(this)],[s.KeyCode.TAB,this.repeat.bind(this)],[s.KeyCode.DASH,this.expand.bind(this)],[s.KeyCode.SPACE,this.depth.bind(this)],[s.KeyCode.HOME,this.home.bind(this)],[s.KeyCode.X,this.summary.bind(this)],[s.KeyCode.Z,this.detail.bind(this)],[s.KeyCode.V,this.virtualize.bind(this)],[s.KeyCode.P,this.previous.bind(this)],[s.KeyCode.U,this.undo.bind(this)],[s.KeyCode.LESS,this.previousRules.bind(this)],[s.KeyCode.GREATER,this.nextRules.bind(this)]]),this.cursors=[],this.xml_=null,this.rebuilt_=null,this.focus_=null,this.active_=!1,this.node.id?this.id=this.node.id:this.node.hasAttribute(H.SRE_ID_ATTR)?this.id=this.node.getAttribute(H.SRE_ID_ATTR):(this.node.setAttribute(H.SRE_ID_ATTR,H.ID_COUNTER.toString()),this.id=H.ID_COUNTER++),this.rootNode=y.getSemanticRoot(t),this.rootId=this.rootNode.getAttribute(a.Attribute.ID),this.xmlString_=n,this.moved=m.WalkerMoves.ENTER}getXml(){return this.xml_||(this.xml_=i.parseInput(this.xmlString_)),this.xml_}getRebuilt(){return this.rebuilt_||this.rebuildStree(),this.rebuilt_}isActive(){return this.active_}activate(){this.isActive()||(this.generator.start(),this.toggleActive_())}deactivate(){this.isActive()&&(m.WalkerState.setState(this.id,this.primaryId()),this.generator.end(),this.toggleActive_())}getFocus(t=!1){return this.focus_||(this.focus_=this.singletonFocus(this.rootId)),t&&this.updateFocus(),this.focus_}setFocus(t){this.focus_=t}getDepth(){return this.levels.depth()-1}isSpeech(){return this.generator.modality===a.Attribute.SPEECH}focusDomNodes(){return this.getFocus().getDomNodes()}focusSemanticNodes(){return this.getFocus().getSemanticNodes()}speech(){const t=this.focusDomNodes();if(!t.length)return"";const e=this.specialMove();if(null!==e)return e;switch(this.moved){case m.WalkerMoves.DEPTH:return this.depth_();case m.WalkerMoves.SUMMARY:return this.summary_();case m.WalkerMoves.DETAIL:return this.detail_();default:{const e=[],r=this.focusSemanticNodes();for(let n=0,o=t.length;n0}restoreState(){if(!this.highlighter)return;const t=m.WalkerState.getState(this.id);if(!t)return;let e=this.getRebuilt().nodeDict[t];const r=[];for(;e;)r.push(e.id),e=e.parent;for(r.pop();r.length>0;){this.down();const t=r.pop(),e=this.findFocusOnLevel(t);if(!e)break;this.setFocus(e)}this.moved=m.WalkerMoves.ENTER}updateFocus(){this.setFocus(f.Focus.factory(this.getFocus().getSemanticPrimary().id.toString(),this.getFocus().getSemanticNodes().map((t=>t.id.toString())),this.getRebuilt(),this.node))}rebuildStree(){this.rebuilt_=new L.RebuildStree(this.getXml()),this.rootId=this.rebuilt_.stree.root.id.toString(),this.generator.setRebuilt(this.rebuilt_),this.skeleton=u.SemanticSkeleton.fromTree(this.rebuilt_.stree),this.skeleton.populate(),this.focus_=this.singletonFocus(this.rootId),this.levels=this.initLevels(),h.connectMactions(this.node,this.getXml(),this.rebuilt_.xml)}previousLevel(){const t=this.getFocus().getDomPrimary();return t?y.getAttribute(t,a.Attribute.PARENT):this.getFocus().getSemanticPrimary().parent.id.toString()}nextLevel(){const t=this.getFocus().getDomPrimary();let e,r;if(t){e=y.splitAttribute(y.getAttribute(t,a.Attribute.CHILDREN)),r=y.splitAttribute(y.getAttribute(t,a.Attribute.CONTENT));const n=y.getAttribute(t,a.Attribute.TYPE),o=y.getAttribute(t,a.Attribute.ROLE);return this.combineContentChildren(n,o,r,e)}const n=t=>t.id.toString(),o=this.getRebuilt().nodeDict[this.primaryId()];return e=o.childNodes.map(n),r=o.contentNodes.map(n),0===e.length?[]:this.combineContentChildren(o.type,o.role,r,e)}singletonFocus(t){this.getRebuilt();const e=this.retrieveVisuals(t);return this.focusFromId(t,e)}retrieveVisuals(t){if(!this.skeleton)return[t];const e=parseInt(t,10),r=this.skeleton.subtreeNodes(e);if(!r.length)return[t];r.unshift(e);const n={},o=[];g.updateEvaluator(this.getXml());for(const t of r)n[t]||(o.push(t.toString()),n[t]=!0,this.subtreeIds(t,n));return o}subtreeIds(t,e){const r=g.evalXPath(`//*[@data-semantic-id="${t}"]`,this.getXml());g.evalXPath("*//@data-semantic-id",r[0]).forEach((t=>e[parseInt(t.textContent,10)]=!0))}focusFromId(t,e){return f.Focus.factory(t,e,this.getRebuilt(),this.node)}summary(){return this.moved=this.isSpeech()?m.WalkerMoves.SUMMARY:m.WalkerMoves.REPEAT,this.getFocus().clone()}detail(){return this.moved=this.isSpeech()?m.WalkerMoves.DETAIL:m.WalkerMoves.REPEAT,this.getFocus().clone()}specialMove(){return null}virtualize(t){return this.cursors.push({focus:this.getFocus(),levels:this.levels,undo:t||!this.cursors.length}),this.levels=this.levels.clone(),this.getFocus().clone()}previous(){const t=this.cursors.pop();return t?(this.levels=t.levels,t.focus):this.getFocus()}undo(){let t;do{t=this.cursors.pop()}while(t&&!t.undo);return t?(this.levels=t.levels,t.focus):this.getFocus()}update(t){this.generator.setOptions(t),(0,T.setup)(t).then((()=>p.generator("Tree").getSpeech(this.node,this.getXml())))}nextRules(){const t=this.generator.getOptions();return"speech"!==t.modality?this.getFocus():(Q.DOMAIN_TO_STYLES[t.domain]=t.style,t.domain="mathspeak"===t.domain?"clearspeak":"mathspeak",t.style=Q.DOMAIN_TO_STYLES[t.domain],this.update(t),this.moved=m.WalkerMoves.REPEAT,this.getFocus().clone())}nextStyle(t,e){if("mathspeak"===t){const t=["default","brief","sbrief"],r=t.indexOf(e);return-1===r?e:r>=t.length-1?t[0]:t[r+1]}if("clearspeak"===t){const t=d.ClearspeakPreferences.getLocalePreferences().en;if(!t)return"default";const r=d.ClearspeakPreferences.relevantPreferences(this.getFocus().getSemanticPrimary()),n=d.ClearspeakPreferences.findPreference(e,r),o=t[r].map((function(t){return t.split("_")[1]})),i=o.indexOf(n);if(-1===i)return e;const Q=i>=o.length-1?o[0]:o[i+1];return d.ClearspeakPreferences.addPreference(e,r,Q)}return e}previousRules(){const t=this.generator.getOptions();return"speech"!==t.modality?this.getFocus():(t.style=this.nextStyle(t.domain,t.style),this.update(t),this.moved=m.WalkerMoves.REPEAT,this.getFocus().clone())}refocus(){let t,e=this.getFocus();for(;!e.getNodes().length;){t=this.levels.peek();const r=this.up();if(!r)break;this.setFocus(r),e=this.getFocus(!0)}this.levels.push(t),this.setFocus(e)}toggleActive_(){this.active_=!this.active_}mergePrefix_(t,e=[]){const r=this.isSpeech()?this.prefix_():"";r&&t.unshift(r);const n=this.isSpeech()?this.postfix_():"";return n&&t.push(n),o.finalize(o.merge(e.concat(t)))}prefix_(){const t=this.getFocus().getDomNodes(),e=this.getFocus().getSemanticNodes();return t[0]?y.getAttribute(t[0],a.Attribute.PREFIX):h.retrievePrefix(e[0])}postfix_(){const t=this.getFocus().getDomNodes();return t[0]?y.getAttribute(t[0],a.Attribute.POSTFIX):""}depth_(){const t=c.Grammar.getInstance().getParameter("depth");c.Grammar.getInstance().setParameter("depth",!0);const e=this.getFocus().getDomPrimary(),r=this.expandable(e)?l.LOCALE.MESSAGES.navigate.EXPANDABLE:this.collapsible(e)?l.LOCALE.MESSAGES.navigate.COLLAPSIBLE:"",i=l.LOCALE.MESSAGES.navigate.LEVEL+" "+this.getDepth(),Q=this.getFocus().getSemanticNodes(),T=h.retrievePrefix(Q[0]),s=[new n.AuditoryDescription({text:i,personality:{}}),new n.AuditoryDescription({text:T,personality:{}}),new n.AuditoryDescription({text:r,personality:{}})];return c.Grammar.getInstance().setParameter("depth",t),o.finalize(o.markup(s))}actionable_(t){const e=null==t?void 0:t.parentNode;return e&&this.highlighter.isMactionNode(e)?e:null}summary_(){const t=this.getFocus().getSemanticPrimary().id.toString(),e=this.getRebuilt().xml.getAttribute("id")===t?this.getRebuilt().xml:i.querySelectorAllByAttrValue(this.getRebuilt().xml,"id",t)[0],r=h.retrieveSummary(e);return this.mergePrefix_([r])}detail_(){const t=this.getFocus().getSemanticPrimary().id.toString(),e=this.getRebuilt().xml.getAttribute("id")===t?this.getRebuilt().xml:i.querySelectorAllByAttrValue(this.getRebuilt().xml,"id",t)[0],r=e.getAttribute("alternative");e.removeAttribute("alternative");const n=h.computeMarkup(e),o=this.mergePrefix_([n]);return e.setAttribute("alternative",r),o}}e.AbstractWalker=H,H.ID_COUNTER=0,H.SRE_ID_ATTR="sre-explorer-id"},162:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.DummyWalker=void 0;const n=r(3284);class o extends n.AbstractWalker{up(){return null}down(){return null}left(){return null}right(){return null}repeat(){return null}depth(){return null}home(){return null}getDepth(){return 0}initLevels(){return null}combineContentChildren(t,e,r,n){return[]}findFocusOnLevel(t){return null}}e.DummyWalker=o},7730:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.Focus=void 0;const n=r(1204);class o{constructor(t,e){this.nodes=t,this.primary=e,this.domNodes=[],this.domPrimary_=null,this.allNodes=[]}static factory(t,e,r,i){const Q=t=>n.getBySemanticId(i,t),T=r.nodeDict,s=Q(t),a=e.map(Q),l=e.map((function(t){return T[t]})),c=new o(l,T[t]);return c.domNodes=a,c.domPrimary_=s,c.allNodes=o.generateAllVisibleNodes_(e,a,T,i),c}static generateAllVisibleNodes_(t,e,r,i){const Q=t=>n.getBySemanticId(i,t);let T=[];for(let n=0,s=t.length;n=e.length?null:e[t]}depth(){return this.level_.length}clone(){const t=new r;return t.level_=this.level_.slice(0),t}toString(){let t="";for(let e,r=0;e=this.level_[r];r++)t+="\n"+e.map((function(t){return t.toString()}));return t}}e.Levels=r},1214:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.RebuildStree=void 0;const n=r(5740),o=r(2298),i=r(3588),Q=r(6537),T=r(3308),s=r(5656),a=r(7075),l=r(4795),c=r(1204);class u{constructor(t){this.mathml=t,this.factory=new Q.SemanticNodeFactory,this.nodeDict={},this.mmlRoot=c.getSemanticRoot(t),this.streeRoot=this.assembleTree(this.mmlRoot),this.stree=a.SemanticTree.fromNode(this.streeRoot,this.mathml),this.xml=this.stree.xml(),T.default.getInstance().setNodeFactory(this.factory)}static addAttributes(t,e,r){r&&1===e.childNodes.length&&e.childNodes[0].nodeType!==n.NodeType.TEXT_NODE&&l.addAttributes(t,e.childNodes[0]),l.addAttributes(t,e)}static textContent(t,e,r){if(!r&&e.textContent)return void(t.textContent=e.textContent);const n=c.splitAttribute(c.getAttribute(e,o.Attribute.OPERATOR));n.length>1&&(t.textContent=n[1])}static isPunctuated(t){return!s.SemanticSkeleton.simpleCollapseStructure(t)&&t[1]&&s.SemanticSkeleton.contentCollapseStructure(t[1])}getTree(){return this.stree}assembleTree(t){const e=this.makeNode(t),r=c.splitAttribute(c.getAttribute(t,o.Attribute.CHILDREN)),n=c.splitAttribute(c.getAttribute(t,o.Attribute.CONTENT));if(u.addAttributes(e,t,!(r.length||n.length)),0===n.length&&0===r.length)return u.textContent(e,t),e;if(n.length>0){const t=c.getBySemanticId(this.mathml,n[0]);t&&u.textContent(e,t,!0)}e.contentNodes=n.map((t=>this.setParent(t,e))),e.childNodes=r.map((t=>this.setParent(t,e)));const i=c.getAttribute(t,o.Attribute.COLLAPSED);return i?this.postProcess(e,i):e}makeNode(t){const e=c.getAttribute(t,o.Attribute.TYPE),r=c.getAttribute(t,o.Attribute.ROLE),n=c.getAttribute(t,o.Attribute.FONT),i=c.getAttribute(t,o.Attribute.ANNOTATION)||"",Q=c.getAttribute(t,o.Attribute.ID),T=c.getAttribute(t,o.Attribute.EMBELLISHED),s=c.getAttribute(t,o.Attribute.FENCEPOINTER),a=this.createNode(parseInt(Q,10));return a.type=e,a.role=r,a.font=n||"unknown",a.parseAnnotation(i),s&&(a.fencePointer=s),T&&(a.embellished=T),a}makePunctuation(t){const e=this.createNode(t);return e.updateContent((0,i.invisibleComma)()),e.role="dummy",e}makePunctuated(t,e,r){const n=this.createNode(e[0]);n.type="punctuated",n.embellished=t.embellished,n.fencePointer=t.fencePointer,n.role=r;const o=e.splice(1,1)[0].slice(1);n.contentNodes=o.map(this.makePunctuation.bind(this)),this.collapsedChildren_(e)}makeEmpty(t,e,r){const n=this.createNode(e);n.type="empty",n.embellished=t.embellished,n.fencePointer=t.fencePointer,n.role=r}makeIndex(t,e,r){if(u.isPunctuated(e))return this.makePunctuated(t,e,r),void(e=e[0]);s.SemanticSkeleton.simpleCollapseStructure(e)&&!this.nodeDict[e.toString()]&&this.makeEmpty(t,e,r)}postProcess(t,e){const r=s.SemanticSkeleton.fromString(e).array;if("subsup"===t.type){const e=this.createNode(r[1][0]);return e.type="subscript",e.role="subsup",t.type="superscript",e.embellished=t.embellished,e.fencePointer=t.fencePointer,this.makeIndex(t,r[1][2],"rightsub"),this.makeIndex(t,r[2],"rightsuper"),this.collapsedChildren_(r),t}if("subscript"===t.type)return this.makeIndex(t,r[2],"rightsub"),this.collapsedChildren_(r),t;if("superscript"===t.type)return this.makeIndex(t,r[2],"rightsuper"),this.collapsedChildren_(r),t;if("tensor"===t.type)return this.makeIndex(t,r[2],"leftsub"),this.makeIndex(t,r[3],"leftsuper"),this.makeIndex(t,r[4],"rightsub"),this.makeIndex(t,r[5],"rightsuper"),this.collapsedChildren_(r),t;if("punctuated"===t.type){if(u.isPunctuated(r)){const e=r.splice(1,1)[0].slice(1);t.contentNodes=e.map(this.makePunctuation.bind(this))}return t}if("underover"===t.type){const e=this.createNode(r[1][0]);return"overaccent"===t.childNodes[1].role?(e.type="overscore",t.type="underscore"):(e.type="underscore",t.type="overscore"),e.role="underover",e.embellished=t.embellished,e.fencePointer=t.fencePointer,this.collapsedChildren_(r),t}return t}createNode(t){const e=this.factory.makeNode(t);return this.nodeDict[t.toString()]=e,e}collapsedChildren_(t){const e=t=>{const r=this.nodeDict[t[0]];r.childNodes=[];for(let n=1,o=t.length;ne.getSemanticPrimary().id===t))}}e.SemanticWalker=i},9806:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.SyntaxWalker=void 0;const n=r(707),o=r(3284),i=r(9797);class Q extends o.AbstractWalker{constructor(t,e,r,n){super(t,e,r,n),this.node=t,this.generator=e,this.highlighter=r,this.levels=null,this.restoreState()}initLevels(){const t=new i.Levels;return t.push([this.primaryId()]),t}up(){super.up();const t=this.previousLevel();return t?(this.levels.pop(),this.singletonFocus(t)):null}down(){super.down();const t=this.nextLevel();if(0===t.length)return null;const e=this.singletonFocus(t[0]);return e&&this.levels.push(t),e}combineContentChildren(t,e,r,o){switch(t){case"relseq":case"infixop":case"multirel":return(0,n.interleaveLists)(o,r);case"prefixop":return r.concat(o);case"postfixop":return o.concat(r);case"matrix":case"vector":case"fenced":return o.unshift(r[0]),o.push(r[1]),o;case"cases":return o.unshift(r[0]),o;case"punctuated":return"text"===e?(0,n.interleaveLists)(o,r):o;case"appl":return[o[0],r[0],o[1]];case"root":return[o[1],o[0]];default:return o}}left(){super.left();const t=this.levels.indexOf(this.primaryId());if(null===t)return null;const e=this.levels.get(t-1);return e?this.singletonFocus(e):null}right(){super.right();const t=this.levels.indexOf(this.primaryId());if(null===t)return null;const e=this.levels.get(t+1);return e?this.singletonFocus(e):null}findFocusOnLevel(t){return this.singletonFocus(t.toString())}focusDomNodes(){return[this.getFocus().getDomPrimary()]}focusSemanticNodes(){return[this.getFocus().getSemanticPrimary()]}}e.SyntaxWalker=Q},1799:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.TableWalker=void 0;const n=r(5740),o=r(8496),i=r(9806),Q=r(179);class T extends i.SyntaxWalker{constructor(t,e,r,n){super(t,e,r,n),this.node=t,this.generator=e,this.highlighter=r,this.firstJump=null,this.key_=null,this.row_=0,this.currentTable_=null,this.keyMapping.set(o.KeyCode.ZERO,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.ONE,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.TWO,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.THREE,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.FOUR,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.FIVE,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.SIX,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.SEVEN,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.EIGHT,this.jumpCell.bind(this)),this.keyMapping.set(o.KeyCode.NINE,this.jumpCell.bind(this))}move(t){this.key_=t;const e=super.move(t);return this.modifier=!1,e}up(){return this.moved=Q.WalkerMoves.UP,this.eligibleCell_()?this.verticalMove_(!1):super.up()}down(){return this.moved=Q.WalkerMoves.DOWN,this.eligibleCell_()?this.verticalMove_(!0):super.down()}jumpCell(){if(!this.isInTable_()||null===this.key_)return this.getFocus();if(this.moved===Q.WalkerMoves.ROW){this.moved=Q.WalkerMoves.CELL;const t=this.key_-o.KeyCode.ZERO;return this.isLegalJump_(this.row_,t)?this.jumpCell_(this.row_,t):this.getFocus()}const t=this.key_-o.KeyCode.ZERO;return t>this.currentTable_.childNodes.length?this.getFocus():(this.row_=t,this.moved=Q.WalkerMoves.ROW,this.getFocus().clone())}undo(){const t=super.undo();return t===this.firstJump&&(this.firstJump=null),t}eligibleCell_(){const t=this.getFocus().getSemanticPrimary();return this.modifier&&"cell"===t.type&&-1!==T.ELIGIBLE_CELL_ROLES.indexOf(t.role)}verticalMove_(t){const e=this.previousLevel();if(!e)return null;const r=this.getFocus(),n=this.levels.indexOf(this.primaryId()),o=this.levels.pop(),i=this.levels.indexOf(e),Q=this.levels.get(t?i+1:i-1);if(!Q)return this.levels.push(o),null;this.setFocus(this.singletonFocus(Q));const T=this.nextLevel();return T[n]?(this.levels.push(T),this.singletonFocus(T[n])):(this.setFocus(r),this.levels.push(o),null)}jumpCell_(t,e){this.firstJump?this.virtualize(!1):(this.firstJump=this.getFocus(),this.virtualize(!0));const r=this.currentTable_.id.toString();let n;do{n=this.levels.pop()}while(-1===n.indexOf(r));this.levels.push(n),this.setFocus(this.singletonFocus(r)),this.levels.push(this.nextLevel());const o=this.currentTable_.childNodes[t-1];return this.setFocus(this.singletonFocus(o.id.toString())),this.levels.push(this.nextLevel()),this.singletonFocus(o.childNodes[e-1].id.toString())}isLegalJump_(t,e){const r=n.querySelectorAllByAttrValue(this.getRebuilt().xml,"id",this.currentTable_.id.toString())[0];if(!r||r.hasAttribute("alternative"))return!1;const o=this.currentTable_.childNodes[t-1];if(!o)return!1;const i=n.querySelectorAllByAttrValue(r,"id",o.id.toString())[0];return!(!i||i.hasAttribute("alternative"))&&!(!o||!o.childNodes[e-1])}isInTable_(){let t=this.getFocus().getSemanticPrimary();for(;t;){if(-1!==T.ELIGIBLE_TABLE_TYPES.indexOf(t.type))return this.currentTable_=t,!0;t=t.parent}return!1}}e.TableWalker=T,T.ELIGIBLE_CELL_ROLES=["determinant","rowvector","binomial","squarematrix","multiline","matrix","vector","cases","table"],T.ELIGIBLE_TABLE_TYPES=["multiline","matrix","vector","cases","table"]},179:function(t,e){Object.defineProperty(e,"__esModule",{value:!0}),e.WalkerState=e.WalkerMoves=void 0,function(t){t.UP="up",t.DOWN="down",t.LEFT="left",t.RIGHT="right",t.REPEAT="repeat",t.DEPTH="depth",t.ENTER="enter",t.EXPAND="expand",t.HOME="home",t.SUMMARY="summary",t.DETAIL="detail",t.ROW="row",t.CELL="cell"}(e.WalkerMoves||(e.WalkerMoves={}));class r{static resetState(t){delete r.STATE[t]}static setState(t,e){r.STATE[t]=e}static getState(t){return r.STATE[t]}}e.WalkerState=r,r.STATE={}},3362:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.walkerMapping_=e.walker=void 0;const n=r(162),o=r(6295),i=r(9806),Q=r(1799);e.walker=function(t,r,n,o,i){return(e.walkerMapping_[t.toLowerCase()]||e.walkerMapping_.dummy)(r,n,o,i)},e.walkerMapping_={dummy:(t,e,r,o)=>new n.DummyWalker(t,e,r,o),semantic:(t,e,r,n)=>new o.SemanticWalker(t,e,r,n),syntax:(t,e,r,n)=>new i.SyntaxWalker(t,e,r,n),table:(t,e,r,n)=>new Q.TableWalker(t,e,r,n)}},1204:function(t,e,r){Object.defineProperty(e,"__esModule",{value:!0}),e.getBySemanticId=e.getSemanticRoot=e.getAttribute=e.splitAttribute=void 0;const n=r(5740),o=r(2298);e.splitAttribute=function(t){return t?t.split(/,/):[]},e.getAttribute=function(t,e){return t.getAttribute(e)},e.getSemanticRoot=function(t){if(t.hasAttribute(o.Attribute.TYPE)&&!t.hasAttribute(o.Attribute.PARENT))return t;const e=n.querySelectorAllByAttr(t,o.Attribute.TYPE);for(let t,r=0;t=e[r];r++)if(!t.hasAttribute(o.Attribute.PARENT))return t;return t},e.getBySemanticId=function(t,e){return t.getAttribute(o.Attribute.ID)===e?t:n.querySelectorAllByAttrValue(t,o.Attribute.ID,e)[0]}}},__webpack_module_cache__={};function __webpack_require__(t){var e=__webpack_module_cache__[t];if(void 0!==e)return e.exports;var r=__webpack_module_cache__[t]={exports:{}};return __webpack_modules__[t].call(r.exports,r,r.exports,__webpack_require__),r.exports}__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}();var __webpack_exports__={};!function(){var t=__webpack_require__(9515),e=__webpack_require__(3282),r=__webpack_require__(235),n=__webpack_require__(265),o=__webpack_require__(2388);function i(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r0&&void 0!==arguments[0]?arguments[0]:[],e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(MathJax.startup){e&&(MathJax.startup.registerConstructor("tex",MathJax._.input.tex_ts.TeX),MathJax.startup.useInput("tex")),MathJax.config.tex||(MathJax.config.tex={});var r=MathJax.config.tex.packages;MathJax.config.tex.packages=t,r&&(0,Mt.insert)(MathJax.config.tex,{packages:r})}}(["base","ams","newcommand","noundefined","require","autoload","configmacros"]);var ce=__webpack_require__(2892),ue=__webpack_require__(625),pe=__webpack_require__(2769);MathJax.loader&&MathJax.loader.checkVersion("input/mml",e.VERSION,"input"),(0,t.combineWithMathJax)({_:{input:{mathml_ts:ce,mathml:{FindMathML:ue,MathMLCompile:pe}}}}),MathJax.startup&&(MathJax.startup.registerConstructor("mml",ce.MathML),MathJax.startup.useInput("mml")),MathJax.loader&&MathJax.loader.pathFilters.add((function(t){return t.name=t.name.replace(/\/util\/entities\/.*?\.js/,"/input/mml/entities.js"),!0}));var he=__webpack_require__(5884),de=__webpack_require__(5552),fe=__webpack_require__(3055),Le=__webpack_require__(7519),me=__webpack_require__(4420),ye=__webpack_require__(9800),ge=__webpack_require__(1160),He=__webpack_require__(1956),be=__webpack_require__(7490),ve=__webpack_require__(7313),Me=__webpack_require__(7555),_e=__webpack_require__(2688),Oe=__webpack_require__(5636),Ve=__webpack_require__(5723),Se=__webpack_require__(8009),xe=__webpack_require__(5023),Ee=__webpack_require__(7096),Ae=__webpack_require__(6898),Ce=__webpack_require__(9086),Ne=__webpack_require__(8411),we=__webpack_require__(4126),Pe=__webpack_require__(258),Ie=__webpack_require__(4093),ke=__webpack_require__(905),Re=__webpack_require__(6237),je=__webpack_require__(5164),De=__webpack_require__(6319),Be=__webpack_require__(5766),Fe=__webpack_require__(1971),Ze=__webpack_require__(167),Ge=__webpack_require__(5806),Ue=__webpack_require__(4097),qe=__webpack_require__(2597),We=__webpack_require__(768),Xe=__webpack_require__(7620),ze=__webpack_require__(7079),Je=__webpack_require__(7826),Ke=__webpack_require__(6368),$e=__webpack_require__(131),Ye=__webpack_require__(640),tr=__webpack_require__(988),er=__webpack_require__(2438),rr=__webpack_require__(6614),nr=__webpack_require__(9375),or=__webpack_require__(6670),ir=__webpack_require__(5535),Qr=__webpack_require__(9645),Tr=__webpack_require__(1618),sr=__webpack_require__(9950),ar=__webpack_require__(5710),lr=__webpack_require__(5896),cr=__webpack_require__(7512),ur=__webpack_require__(3572),pr=__webpack_require__(7725),hr=__webpack_require__(3289),dr=__webpack_require__(3735),fr=__webpack_require__(6465),Lr=__webpack_require__(1107),mr=__webpack_require__(4445),yr=__webpack_require__(2558),gr=__webpack_require__(8926),Hr=__webpack_require__(3365),br=__webpack_require__(3006),vr=__webpack_require__(8835),Mr=__webpack_require__(6369),_r=__webpack_require__(2417);MathJax.loader&&MathJax.loader.checkVersion("output/svg",e.VERSION,"output"),(0,t.combineWithMathJax)({_:{output:{common:{FontData:he,Notation:de,OutputJax:fe,Wrapper:Le,WrapperFactory:me,Wrappers:{TeXAtom:ye,TextNode:ge,maction:He,math:be,menclose:ve,mfenced:Me,mfrac:_e,mglyph:Oe,mi:Ve,mmultiscripts:Se,mn:xe,mo:Ee,mpadded:Ae,mroot:Ce,mrow:Ne,ms:we,mspace:Pe,msqrt:Ie,msubsup:ke,mtable:Re,mtd:je,mtext:De,mtr:Be,munderover:Fe,scriptbase:Ze,semantics:Ge}},svg_ts:Ue,svg:{FontCache:qe,FontData:We,Notation:Xe,Wrapper:ze,WrapperFactory:Je,Wrappers_ts:Ke,Wrappers:{TeXAtom:$e,TextNode:Ye,maction:tr,math:er,menclose:rr,merror:nr,mfenced:or,mfrac:ir,mglyph:Qr,mi:Tr,mmultiscripts:sr,mn:ar,mo:lr,mpadded:cr,mphantom:ur,mroot:pr,mrow:hr,ms:dr,mspace:fr,msqrt:Lr,msubsup:mr,mtable:yr,mtd:gr,mtext:Hr,mtr:br,munderover:vr,scriptbase:Mr,semantics:_r}}}}}),MathJax.loader&&(0,t.combineDefaults)(MathJax.config.loader,"output/svg",{checkReady:function(){return MathJax.loader.load("output/svg/fonts/tex")}}),MathJax.startup&&(MathJax.startup.registerConstructor("svg",Ue.SVG),MathJax.startup.useOutput("svg"));var Or=__webpack_require__(3980),Vr=__webpack_require__(1103),Sr=__webpack_require__(9124),xr=__webpack_require__(6001),Er=__webpack_require__(3696),Ar=__webpack_require__(9587),Cr=__webpack_require__(8348),Nr=__webpack_require__(1376),wr=__webpack_require__(1439),Pr=__webpack_require__(331),Ir=__webpack_require__(4886),kr=__webpack_require__(4471),Rr=__webpack_require__(5181),jr=__webpack_require__(3526),Dr=__webpack_require__(5649),Br=__webpack_require__(7153),Fr=__webpack_require__(5745),Zr=__webpack_require__(1411),Gr=__webpack_require__(6384),Ur=__webpack_require__(6041),qr=__webpack_require__(8199),Wr=__webpack_require__(9848),Xr=__webpack_require__(7906),zr=__webpack_require__(2644),Jr=__webpack_require__(4926),Kr=__webpack_require__(42),$r=__webpack_require__(7040),Yr=__webpack_require__(2560),tn=__webpack_require__(6982),en=__webpack_require__(175),rn=__webpack_require__(5735),nn=__webpack_require__(8594),on=__webpack_require__(4749),Qn=__webpack_require__(9320),Tn=__webpack_require__(466),sn=__webpack_require__(9671),an=__webpack_require__(3746),ln=__webpack_require__(3240),cn=__webpack_require__(8652),un=__webpack_require__(5667),pn=__webpack_require__(5821),hn=__webpack_require__(957),dn=__webpack_require__(1044),fn=__webpack_require__(7292),Ln=__webpack_require__(2162),mn=__webpack_require__(9244),yn=__webpack_require__(2675);if(MathJax.loader&&MathJax.loader.checkVersion("output/svg/fonts/tex",e.VERSION,"svg-font"),(0,t.combineWithMathJax)({_:{output:{common:{fonts:{tex:{"bold-italic":Or,bold:Vr,delimiters:Sr,"double-struck":xr,"fraktur-bold":Er,fraktur:Ar,italic:Cr,largeop:Nr,monospace:wr,normal:Pr,"sans-serif-bold-italic":Ir,"sans-serif-bold":kr,"sans-serif-italic":Rr,"sans-serif":jr,"script-bold":Dr,script:Br,smallop:Fr,"tex-calligraphic-bold":Zr,"tex-calligraphic":Gr,"tex-mathit":Ur,"tex-oldstyle-bold":qr,"tex-oldstyle":Wr,"tex-size3":Xr,"tex-size4":zr,"tex-variant":Jr}}},svg:{fonts:{tex_ts:Kr,tex:{"bold-italic":$r,bold:Yr,"fraktur-bold":tn,fraktur:en,italic:rn,largeop:nn,monospace:on,normal:Qn,"sans-serif-bold-italic":Tn,"sans-serif-bold":sn,"sans-serif-italic":an,"sans-serif":ln,smallop:cn,"tex-calligraphic-bold":un,"tex-calligraphic":pn,"tex-mathit":hn,"tex-oldstyle-bold":dn,"tex-oldstyle":fn,"tex-size3":Ln,"tex-size4":mn,"tex-variant":yn}}}}}}),MathJax.startup){var gn=(0,Mt.selectOptionsFromKeys)(MathJax.config.svg||{},Kr.TeXFont.OPTIONS);(0,t.combineDefaults)(MathJax.config,"svg",{font:new Kr.TeXFont(gn)})}var Hn=__webpack_require__(5865),bn=__webpack_require__(8310),vn=__webpack_require__(4001),Mn=__webpack_require__(473),_n=__webpack_require__(4414);MathJax.loader&&MathJax.loader.checkVersion("ui/menu",e.VERSION,"ui"),(0,t.combineWithMathJax)({_:{ui:{menu:{MJContextMenu:Hn,Menu:bn,MenuHandler:vn,MmlVisitor:Mn,SelectableInfo:_n}}}}),MathJax.startup&&"undefined"!=typeof window&&MathJax.startup.extendHandler((function(t){return(0,vn.MenuHandler)(t)}),20);var On=__webpack_require__(351);function Vn(t,e){(null==e||e>t.length)&&(e=t.length);for(var r=0,n=new Array(e);r + + + + Test Chapter 1 + + +

Hello World

+

This is a test chapter for UI testing.

+

You can search for the word Espresso.

+

Another paragraph with the word espresso but lowercase.

+ + \ No newline at end of file diff --git a/app/src/main/assets/test_chapter_2.html b/app/src/main/assets/test_chapter_2.html new file mode 100644 index 0000000..1b5e2b5 --- /dev/null +++ b/app/src/main/assets/test_chapter_2.html @@ -0,0 +1,10 @@ + + + + + Test Chapter 2 + + +

This is the second chapter.

+ + \ No newline at end of file diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt new file mode 100644 index 0000000..7246d66 --- /dev/null +++ b/app/src/main/cpp/CMakeLists.txt @@ -0,0 +1,95 @@ +# CMakeLists.txt +# Sets the minimum version of CMake required. +cmake_minimum_required(VERSION 3.22.1) + +# Declares the project name. +project("reader-native") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,max-page-size=16384") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,max-page-size=16384") + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC") + +set(CMAKE_POSITION_INDEPENDENT_CODE ON) + +# --- CONFIGURE SUBPROJECTS --- +# Force subprojects to build as static libraries. This is critical for Android. +set(BUILD_SHARED_LIBS OFF CACHE BOOL "Build shared libraries" FORCE) +set(BROTLI_DISABLE_TESTS ON CACHE BOOL "Disable Brotli tests" FORCE) + + +# =================================================================== +# WOFF2 DEPENDENCY SETUP +# =================================================================== +# 1. Add the brotli project. This defines the `brotlidec-static` target. +add_subdirectory(woff2/brotli) + +# 2. Manually define the variables that the woff2/CMakeLists.txt script expects. +set(BROTLIDEC_FOUND TRUE) +set(BROTLIENC_FOUND TRUE) +set(BROTLIDEC_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/woff2/brotli/c/include) +set(BROTLIENC_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/woff2/brotli/c/include) +set(BROTLIDEC_LIBRARIES brotlidec-static) +set(BROTLIENC_LIBRARIES brotlienc-static) + +# 3. Add the woff2 project. This defines the `woff2dec` target. +add_subdirectory(woff2) + + +# =================================================================== +# LIBMOBI DEPENDENCY SETUP +# =================================================================== +# 4. Set libmobi options before adding it. +# We disable libxml2 to use the internal writer, simplifying dependencies. +# We also disable encryption for now for the same reason. +set(USE_LIBXML2 OFF CACHE BOOL "Use libxml2" FORCE) +set(USE_ENCRYPTION OFF CACHE BOOL "Enable encryption" FORCE) + +# Temporarily enable shared libs to build libmobi as a .so file for LGPL compliance. +set(BUILD_SHARED_LIBS ON) +# 5. Add the libmobi project. This will define the `mobi` target as a shared library. +add_subdirectory(libmobi) + +set_target_properties(mobi PROPERTIES VERSION "" SOVERSION "") +# Revert back to building static libs for any subsequent dependencies. +set(BUILD_SHARED_LIBS OFF) + +# Force all symbols in the mobi shared library to be visible. +# This is necessary because some internal functions we use (like mobi_determine_flowpart_type) +# are not explicitly exported by the library's public API for shared builds. +set_target_properties(mobi PROPERTIES C_VISIBILITY_PRESET default) + + +# =================================================================== +# FINAL NATIVE LIBRARY FOR THE APP +# =================================================================== +# 6. Define our final JNI wrapper library. +# This single .so file will be loaded by the Android app. +add_library( + native-lib + SHARED + Woff2Converter.cpp + mobi_jni_bridge.c # The placeholder file you created +) + +# 7. Tell our library where to find all necessary header files. +target_include_directories(native-lib + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR}/woff2/include + ${CMAKE_CURRENT_SOURCE_DIR}/libmobi/src +) + +# 8. Find the Android logging and zlib libraries. +find_library(log-lib log) +find_library(z-lib z) + +# 9. Link our final library against all the static libraries and Android libraries. +target_link_libraries( + native-lib + PRIVATE + woff2dec # From woff2 + mobi # From libmobi + ${log-lib} + ${z-lib} # libmobi requires zlib +) \ No newline at end of file diff --git a/app/src/main/cpp/Woff2Converter.cpp b/app/src/main/cpp/Woff2Converter.cpp new file mode 100644 index 0000000..9ba8ec6 --- /dev/null +++ b/app/src/main/cpp/Woff2Converter.cpp @@ -0,0 +1,56 @@ +#include +#include +#include + +// This is the correct header for the public API +#include + +extern "C" JNIEXPORT jbyteArray JNICALL +Java_com_aryan_reader_paginatedreader_Woff2Converter_convertWoff2ToTtf( + JNIEnv *env, + jobject /* this */, + jbyteArray woff2_data) { + + // Get the input WOFF2 data from the jbyteArray + jbyte* woff2_bytes = env->GetByteArrayElements(woff2_data, nullptr); + jsize woff2_size = env->GetArrayLength(woff2_data); + const uint8_t* woff2_input = reinterpret_cast(woff2_bytes); + + // Calculate the required size using the correct function name from your header + size_t ttf_size = woff2::ComputeWOFF2FinalSize(woff2_input, woff2_size); + if (ttf_size == 0) { + // This indicates an error in the input font data + env->ReleaseByteArrayElements(woff2_data, woff2_bytes, JNI_ABORT); + return nullptr; + } + + // Create the output buffer + std::vector ttf_output(ttf_size); + + // Perform the conversion using the deprecated function signature that matches your header + bool success = woff2::ConvertWOFF2ToTTF( + ttf_output.data(), ttf_size, + woff2_input, woff2_size + ); + + // Release the input byte array + env->ReleaseByteArrayElements(woff2_data, woff2_bytes, JNI_ABORT); + + // If conversion failed, return null + if (!success) { + return nullptr; + } + + // Create a new Java byte array for the result + jbyteArray ttf_data = env->NewByteArray(ttf_size); + if (ttf_data == nullptr) { + // Out of memory error + return nullptr; + } + + // Copy the converted data to the Java byte array + env->SetByteArrayRegion(ttf_data, 0, ttf_size, + reinterpret_cast(ttf_output.data())); + + return ttf_data; +} \ No newline at end of file diff --git a/app/src/main/cpp/libmobi/.github/workflows/build.yml b/app/src/main/cpp/libmobi/.github/workflows/build.yml new file mode 100644 index 0000000..e2f63c3 --- /dev/null +++ b/app/src/main/cpp/libmobi/.github/workflows/build.yml @@ -0,0 +1,101 @@ +name: Build + +on: + push: + branches: [ public ] + pull_request: + branches: [ public ] + +jobs: + unix-build: + + runs-on: ubuntu-latest + defaults: + run: + shell: bash + + strategy: + fail-fast: false + matrix: + config: + - name: default build with debug + options: --enable-debug + - name: bulid with internal libs + options: --with-zlib=no --with-libxml2=no + - name: build without encryption + options: --disable-encryption + + steps: + - uses: actions/checkout@v4 + - name: install dependencies + run: | + if [ "${{ runner.os }}" = "Linux" ]; then + sudo apt-get update -qq; + sudo apt-get install -y autotools-dev pkg-config automake autoconf libtool; + sudo apt-get install -y zlib1g-dev libxml2-dev; + elif [ "${{ runner.os }}" = "macOS" ]; then + brew update > /dev/null; + brew outdated autoconf || brew upgrade autoconf; + brew outdated automake || brew upgrade automake; + brew outdated libtool || brew upgrade libtool; + fi + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure ${{ matrix.config.options }} + - name: make + run: make -j `nproc` + - name: make check + run: make -j `nproc` check + - name: make distcheck + run: make -j `nproc` distcheck + - name: upload debug artifacts + uses: actions/upload-artifact@v4 + if: ${{ failure() }} + with: + name: test-logs-${{ matrix.runs-on }} + path: | + **/tests/test-suite.log + **/tests/samples/*.log + + win64-build: + + runs-on: windows-latest + defaults: + run: + shell: msys2 {0} + steps: + - name: setup-msys2 + uses: msys2/setup-msys2@v2 + with: + msystem: MINGW64 + path-type: minimal + update: true + install: >- + git + autotools + base-devel + mingw-w64-x86_64-toolchain + mingw-w64-x86_64-libtool + mingw-w64-x86_64-libxml2 + mingw-w64-x86_64-zlib + - name: checkout + uses: actions/checkout@v4 + - name: autogen + run: sh ./autogen.sh + - name: configure + run: ./configure --enable-debug + - name: make + run: make -j$(nproc) + - name: make check + run: make -j$(nproc) check + - name: make distcheck + run: make -j$(nproc) distcheck + - name: upload debug artifacts + uses: actions/upload-artifact@v4 + if: ${{ failure() }} + with: + name: test-logs-${{ matrix.runs-on }} + path: | + **/tests/test-suite.log + **/tests/samples/*.log diff --git a/app/src/main/cpp/libmobi/.github/workflows/codeql-analysis.yml b/app/src/main/cpp/libmobi/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..5367c0a --- /dev/null +++ b/app/src/main/cpp/libmobi/.github/workflows/codeql-analysis.yml @@ -0,0 +1,71 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ public ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ public ] + schedule: + - cron: '19 13 * * 3' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'cpp' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # â„¹ï¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # âœï¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/app/src/main/cpp/libmobi/.github/workflows/coverity-scan.yml b/app/src/main/cpp/libmobi/.github/workflows/coverity-scan.yml new file mode 100644 index 0000000..9094782 --- /dev/null +++ b/app/src/main/cpp/libmobi/.github/workflows/coverity-scan.yml @@ -0,0 +1,54 @@ +name: coverity-scan + +on: + push: + branches: [ public ] + +jobs: + coverity-build: + + runs-on: ubuntu-latest + defaults: + run: + shell: bash + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: install dependencies + run: | + sudo apt-get update -qq; + sudo apt-get install -y autotools-dev pkg-config automake autoconf libtool; + sudo apt-get install -y zlib1g-dev libxml2-dev; + - name: download coverity tools + run: | + curl -Lf \ + -o cov-analysis-linux64.tar.gz \ + --form project=bfabiszewski/libmobi \ + --form token=$TOKEN \ + https://scan.coverity.com/download/linux64 + mkdir cov-analysis-linux64 + tar xzf cov-analysis-linux64.tar.gz --strip 1 -C cov-analysis-linux64 + env: + TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }} + - name: autogen + run: ./autogen.sh + - name: configure + run: ./configure ${{ matrix.config.options }} + - name: build with cov-build + run: | + export PATH=`pwd`/cov-analysis-linux64/bin:$PATH + cov-build --dir cov-int make -j `nproc` + - name: upload results to coverity-scan + run: | + tar czvf cov-int.tgz cov-int + curl -Lf \ + --form token=$TOKEN \ + --form email=scan.coverity@fabiszewski.net \ + --form file=@cov-int.tgz \ + --form version="`git describe --tags`" \ + --form description="libmobi `git describe --tags`" \ + "https://scan.coverity.com/builds?project=bfabiszewski/libmobi" + env: + TOKEN: ${{ secrets.COVERITY_SCAN_TOKEN }} diff --git a/app/src/main/cpp/libmobi/.travis.yml b/app/src/main/cpp/libmobi/.travis.yml new file mode 100644 index 0000000..05e71aa --- /dev/null +++ b/app/src/main/cpp/libmobi/.travis.yml @@ -0,0 +1,39 @@ +os: +- linux +# - osx +language: c +compiler: +- clang +- gcc +before_install: +- if [ "$TRAVIS_OS_NAME" == "linux" ]; then + sudo apt-get update -qq; + sudo apt-get install -y autotools-dev pkg-config automake autoconf libtool; + sudo apt-get install -y zlib1g-dev libxml2-dev; + elif [ "$TRAVIS_OS_NAME" == "osx" ]; then + brew update > /dev/null; + brew outdated autoconf || brew upgrade autoconf; + brew outdated automake || brew upgrade automake; + brew outdated libtool || brew upgrade libtool; + fi +- git config --global user.name "Travis CI (libmobi)" +- git config --global user.email $HOSTNAME":not-for-mail@travis-ci.org" +script: +- ./autogen.sh +- ./configure --enable-debug && make && make test +- make clean +- ./configure --with-zlib=no --with-libxml2=no && make && make test + +env: + global: + - secure: "ShIL3IDvH59cJx4QAKWhVTs7ynCAfID11DqK8pIWJX2UtvXc4pdDQUq6U5ZRLUT0BR6kmLNxYrQUpUKvZ9sYnPuj4X5o9jzXzXsJPXTy/qpjiLK4MCZLIlI4OAHexfAuZTOVZHOoE/B8ABpk8nGYUXk02++LxlmwtE/fIWOOWHs=" + +addons: + coverity_scan: + project: + name: "bfabiszewski/libmobi" + description: "Build submitted via Travis CI" + notification_email: scan.coverity@fabiszewski.net + build_command_prepend: "./autogen.sh && ./configure" + build_command: "make -j 4" + branch_pattern: public diff --git a/app/src/main/cpp/libmobi/AUTHORS b/app/src/main/cpp/libmobi/AUTHORS new file mode 100644 index 0000000..e69de29 diff --git a/app/src/main/cpp/libmobi/CMakeLists.txt b/app/src/main/cpp/libmobi/CMakeLists.txt new file mode 100644 index 0000000..ca13f30 --- /dev/null +++ b/app/src/main/cpp/libmobi/CMakeLists.txt @@ -0,0 +1,118 @@ +# Copyright (c) 2022 Bartek Fabiszewski +# http://www.fabiszewski.net +# +# This file is part of libmobi. +# Licensed under LGPL, either version 3, or any later. +# See + +cmake_minimum_required(VERSION 3.12) + +project(LIBMOBI C) + +set(CMAKE_C_STANDARD 99) + +file(STRINGS ${LIBMOBI_SOURCE_DIR}/configure.ac VERSION_LINE REGEX "AC_INIT\\(\\[libmobi\\], \\[(.*)\\]\\)") +string(REGEX MATCH "([0-9]+\\.[0-9]+)" PACKAGE_VERSION "${VERSION_LINE}") +message(STATUS "libmobi version ${PACKAGE_VERSION}") +add_definitions(-DPACKAGE_VERSION="${PACKAGE_VERSION}") +string(REPLACE "." ";" VERSION_LIST ${PACKAGE_VERSION}) +list(GET VERSION_LIST 0 PACKAGE_VERSION_MAJOR) +list(GET VERSION_LIST 1 PACKAGE_VERSION_MINOR) + +# Option to enable encryption +option(USE_ENCRYPTION "Enable encryption" ON) + +# Option to enable static tools compilation +option(TOOLS_STATIC "Enable static tools compilation" OFF) + +# Option to use libxml2 +option(USE_LIBXML2 "Use libxml2 instead of internal xmlwriter" ON) + +# Option to use zlib +option(USE_ZLIB "Use zlib" ON) + +# Option to enable XMLWRITER +option(USE_XMLWRITER "Enable xmlwriter (for opf support)" ON) + +# Option to enable debug +option(MOBI_DEBUG "Enable debug" OFF) + +# Option to enable debug alloc +option(MOBI_DEBUG_ALLOC "Enable debug alloc" OFF) + +option(BUILD_SHARED_LIBS "Build using shared libraries" ON) + +if(TOOLS_STATIC) + set(BUILD_SHARED_LIBS OFF) +endif(TOOLS_STATIC) + +if(USE_ENCRYPTION) + add_definitions(-DUSE_ENCRYPTION) +endif(USE_ENCRYPTION) + +if(USE_XMLWRITER) + add_definitions(-DUSE_XMLWRITER) + if(USE_LIBXML2) + add_definitions(-DUSE_LIBXML2) + find_package(LibXml2 REQUIRED) + include_directories(${LIBXML2_INCLUDE_DIR}) + endif(USE_LIBXML2) +endif(USE_XMLWRITER) + +if(MOBI_DEBUG) + add_definitions(-DMOBI_DEBUG) + message(STATUS "CMAKE_CXX_COMPILER_ID=${CMAKE_C_COMPILER_ID}") + if(CMAKE_C_COMPILER_ID MATCHES "Clang|GNU") + add_compile_options(-pedantic -Wall -Wextra -Werror) + endif() +endif(MOBI_DEBUG) + +if(MOBI_DEBUG_ALLOC) + add_definitions(-DMOBI_DEBUG_ALLOC) +endif(MOBI_DEBUG_ALLOC) + +if(USE_ZLIB) + find_package(ZLIB REQUIRED) + include_directories(${ZLIB_INCLUDE_DIR}) +else() + add_definitions(-DUSE_MINIZ) +endif(USE_ZLIB) + +include(CheckIncludeFile) +include(CheckFunctionExists) +check_include_file(unistd.h HAVE_UNISTD_H) +if(HAVE_UNISTD_H) + add_definitions(-DHAVE_UNISTD_H) +endif(HAVE_UNISTD_H) +check_function_exists(getopt HAVE_GETOPT) +if(HAVE_GETOPT) + add_definitions(-DHAVE_GETOPT) +endif(HAVE_GETOPT) + +check_function_exists(strdup HAVE_STRDUP) +if(HAVE_STRDUP) + add_definitions(-DHAVE_STRDUP) +endif(HAVE_STRDUP) + +check_include_file(sys/resource.h HAVE_SYS_RESOURCE_H) +if(HAVE_SYS_RESOURCE_H) + add_definitions(-DHAVE_SYS_RESOURCE_H) +endif(HAVE_SYS_RESOURCE_H) + + +include(CheckCSourceCompiles) +foreach(keyword "inline" "__inline__" "__inline") + check_c_source_compiles("${keyword} void func(); void func() { } int main() { func(); return 0; }" HAVE_INLINE) + if(HAVE_INLINE) + add_definitions(-DMOBI_INLINE=${keyword}) + break() + endif(HAVE_INLINE) +endforeach(keyword) + +check_c_source_compiles("void func() { } __attribute__((noreturn)); int main() { func(); return 0; }" HAVE_ATTRIBUTE_NORETURN) +if(HAVE_ATTRIBUTE_NORETURN) + add_definitions(-DHAVE_ATTRIBUTE_NORETURN) +endif(HAVE_ATTRIBUTE_NORETURN) + +add_subdirectory(src) +# add_subdirectory(tools) diff --git a/app/src/main/cpp/libmobi/COPYING b/app/src/main/cpp/libmobi/COPYING new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/app/src/main/cpp/libmobi/COPYING @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/app/src/main/cpp/libmobi/ChangeLog b/app/src/main/cpp/libmobi/ChangeLog new file mode 100644 index 0000000..0b61d38 --- /dev/null +++ b/app/src/main/cpp/libmobi/ChangeLog @@ -0,0 +1,372 @@ +2024-10-29: Update github actions +2024-10-29: Fix CMake build, closes #49 +2024-07-04: Minor rewording in man page +2024-06-17: Fix typo +2024-06-17: Version 0.12 +2024-02-04: Fix: missing header with libxml2 >= 2.12 +2024-02-04: Max index count value is too low for some dictionaries +2023-08-10: Fix CMake debug build with MSVC, fixes #46 +2023-07-11: Clean up unused value +2023-07-11: Fix clang warning about missing function prototypes (-Wstrict-prototypes) +2023-02-21: Update Xcode project settings +2023-02-21: Replace deprecated functions +2023-02-21: Try to reconstruct sources even on broken indices +2023-02-05: Refactor mobi_buffer_get_varlen_internal to be compatible with other buffer functions. Update documentation with information about mobi_buffer_get_varlen_dec limitation. +2022-06-26: Fix undefined behavior with null pointer arithmetics in case of corrupt input +2022-05-28: Version 0.11 +2022-05-27: Fix potential null pointer dereference on corrupt input when inflections CNCX record is not initialized +2022-05-23: Fix index entries count +2022-05-23: Prevent leak of index entries on corrupt data +2022-05-23: Add checks for fragments part in case of corrupt data +2022-05-17: Fix potential integer overflow with corrupt data +2022-05-05: Fix: index entry label not being zero-terminated with corrupt input +2022-05-03: Fix boundary checking error in markup search, that could cause buffer over-read with corrupt input +2022-05-02: Fix typo in macro name +2022-04-27: Fix undefined behavior when passing null to strdup +2022-04-27: Fix wrong boundary checks in inflections parser resulting in stack buffer over-read with corrupt input +2022-04-26: Fix text formatting +2022-04-26: Fix array boundary check when parsing inflections which could result in buffer over-read with corrupt input +2022-04-23: Fix formatting +2022-04-23: Fix checking boundary of deobfuscation key which could cause buffer over-read with corrupt data +2022-04-23: Fix issue with corrupt data with empty lookup string which could lead to read beyond buffer +2022-04-23: Fix faulty checks for array boundary which caused buffer over-read with corrupt input +2022-04-23: Fix issue with corrupt files with tagvalues_count = 0 that caused null pointer dereference +2022-04-23: Fix issues when mobi_buffer_getpointer returns null. With corrupt data this could lead to out-of-bounds read +2022-04-13: Add packaging status [skip ci] +2022-04-10: Make random generation return proper error codes +2022-04-10: Rewrite randombytes for libmobi +2022-04-07: Add libsodium randombytes.c +2022-04-10: Fix "fallthrough" spelling +2022-04-10: Make declaration match definition +2022-04-10: Fix different sign comparison warning +2022-04-10: Update Xcode project +2022-04-10: Don't run tests if bash is missing +2022-04-10: Looking for libxml2, first try pkg-config +2022-04-04: Update MSVC project +2022-04-02: Add support for GNU/kFreeBSD and GNU/Hurd +2022-04-02: Check for inline, noreturn support in CMake +2022-03-27: Fix format truncation warning +2022-03-21: Version 0.10 +2022-03-21: Update Xcode project [skip ci] +2022-03-21: Add functions for retrieving orthographic index entries +2022-02-27: Add basic CMake support +2022-02-26: GHA: fetch tags with checkout +2022-02-26: Minor refactoring of file path manipulation function +2022-02-26: Fix memory handling issues +2022-02-26: Add coverity scan workflow +2022-02-25: Remove obsolete changelog +2022-02-25: Fix md5sum output on Windows +2022-02-25: Fix inconsistent separators in path on Windows builds +2022-02-25: GHA: fix log paths +2022-02-25: GHA: fix workflow syntax +2022-02-25: GHA: upload test logs on failure +2022-02-24: Fix printf format specifier +2022-02-24: Fix sample path in Makefile +2022-02-24: Missing autotools in mingw workflow +2022-02-24: Windows doesn't accept asterisk in file names +2022-02-24: Update workflow, add badge +2022-02-24: Add mingw workflow +2022-02-24: Fix tests in out-of-tree build +2022-02-24: Update man pages +2022-02-24: Replace non-portable strptime +2022-02-24: Make sure both validity period dates are set +2022-02-21: Fix strptime not found on linux build +2022-02-21: Add build github action +2022-02-21: Update README +2022-02-21: Minor code cleanups +2022-02-21: Unify boolean and static usage in tools +2022-02-21: mobimeta: fix null pointer dereference when parsing malformed option +2022-02-18: Add hybrid spit option to mobitool +2022-02-18: Update documentation +2022-02-18: Test both encrypted hybrid parts +2022-02-18: Fix: fast decryption routine fails for non-huffman compression +2022-02-18: Fix mobitool serial decryption +2022-02-18: Add DRM tests +2022-02-17: Fix build with encryption disabled +2022-02-17: Update tests samples +2022-02-16: Add -h option to tools, update man pages +2022-02-16: Update Xcode settings +2022-02-16: Restructure, cleanup encryption related code, add mobidrm tool +2021-11-19: Improve getopt loop, fix config.h to be accessible from all tools +2021-11-10: Update xcode project +2021-11-10: Add functions to split hybrid files +2021-11-10: Avoid modifying existing records, as caller may keep reference to them +2021-11-05: Fix: tests fail if pid contains asterisk +2021-11-05: Fix: decryption may fail for some records with standard compression +2021-11-05: Replace test samples with self-generated smaller ones +2021-11-05: Skip test in case of missing checksums +2021-10-20: Version 0.9 +2021-10-24: Fix out-of-tree build +2021-10-22: Fix mingw build, code formatting +2021-10-14: Fix gcc format truncation warning +2021-10-14: Include autogen.sh in distribution bundle +2021-10-14: Create codeql-analysis.yml +2021-10-14: Fix autoconf 2.70 warnings, clean up +2021-10-14: Build fails with autoconf 2.70 +2021-10-11: Version 0.8 +2021-10-11: Update Xcode project +2021-10-11: Fix warnings about changed signedness +2021-09-18: Fix potential out-of-buffer read while parsing corrupt file, closes #38 +2021-09-18: Fix potential out-of-buffer read while parsing corrupt file, closes #35, #36 +2021-09-09: Version 0.7 +2021-09-09: fix oob write bug inside libmobi +2021-06-07: Add reference to brew formula +2020-09-02: Fix null pointer dereference in case of broken fragment +2020-08-01: Update changelog +2020-08-01: Version 0.6 +2020-07-31: Fix typo +2020-07-31: Add Readme to dist package +2020-07-31: Remove anchor on truncated link +2020-07-31: Fix missing option in man page +2020-07-30: Include test samples in dist package +2020-07-25: Fix gcc 7+ warnings about implicit fall through and format truncation +2020-07-24: Unique names for internal functions to avoid confilicts with static linking +2020-06-24: Close file in error branch +2020-06-24: Fix static compilation with miniz on gcc +2020-06-24: Minor documentation fixes +2020-06-23: Version 0.5 +2020-06-23: mobitool: add dump cover option +2020-06-23: Minor documentation improvement +2020-06-23: Fix potential buffer over-read +2019-03-18: Fix: try also "name" attribute when searching for link anchor tags, closes #24 +2019-02-22: Add mobi_is_replica function +2019-02-22: Fix potential read beyond buffer +2019-02-22: Travis migration +2018-08-07: Fix: missing items in recreated ncx file +2018-06-20: Fix: printf format warning on some gcc versions +2018-06-20: Fix: make dist broken by nonexistent header files +2018-06-20: VERSION 0.4 +2018-06-20: Fix: buffer overflow (CVE-2018-11726) +2018-06-20: Fix: buffer overflow (CVE-2018-11724) +2018-06-20: Fix: read beyond buffer (CVE-2018-11725) +2018-06-20: Fix: buffer overflow (mobitool), closes #18 +2018-06-20: Fix: read beyond buffer with corrupted KF8 Boundary record, closes #19 +2018-06-20: Fix: read beyond buffer, closes #16, #17 +2018-06-20: Updated xcode project files +2018-04-03: Fix: ncx part was not scanned for links, fixes #12 +2018-04-02: Fix regression, potential use after free +2018-04-02: Skip broken resources, fixes #10 +2018-03-05: Allow processing zero length text records, fixes #9 +2017-12-25: Skip broken first resource offset instead of dying +2017-12-18: Skip broken links reconstruction instead of dying +2017-11-27: Disable travis OS X builds, as they usually time out +2017-11-16: Fix: increase max number of dictionary entries per record +2017-11-14: Fix for some encrypted documents with palmdoc encoding +2017-11-06: Fix: potential null pointer dereference +2017-10-16: Manpage cleanup +2017-09-27: Update README +2017-09-26: Increase maximum length of attribute name and value, closes #5 +2017-02-26: Remove obsolete files from VS build (closes #3) [ci skip] +2016-11-05: Mobitool: use epub extension if extracted source resource is epub +2016-06-10: Update docs +2016-06-10: Update test files +2016-06-10: Fix: out of bounds read in corrupt font resource +2016-06-10: Prevent memory leak in case of corrupt font resources +2016-06-10: Calculate deobfuscation buffer limit from key length +2016-06-10: Fix: USE_LIBXML2 macro was not included from config.h +2016-06-10: Fix: USE_LIBXML2 macro was not included from config.h +2016-06-09: Fix: memory leak in tools +2016-06-09: Fix: potential out of bounds read +2016-06-09: Fix: memory leak in internal xmlwriter +2016-06-01: Update README +2016-05-19: Feature: verify decryption key type +2016-05-19: Cleanup converting little endian buffer to 32-bit integer +2016-05-19: Feature: check drm expiration dates +2016-05-18: Fix: memory leaks in encryption +2016-05-18: Fix concurrent autotools builds +2016-05-18: use relative path, as $(top_srcdir) fails to be substituted (?) +2016-05-18: update vcxproj +2016-05-18: Include headers in automake sources +2016-05-18: Fix: automake out-of-tree miniz build +2016-05-18: Fix: wrongly detected fdst record broke some ancient documents +2016-05-18: Fix: improve index header parsing, some old dictionaries might not load +2016-05-18: Fix: convert encoding of opf strings from cp1252 indices +2016-05-18: Quiet warnings about unused values of wiped variables +2016-05-18: Fix: potential memory leak +2016-05-18: Fix: wrongly decoded "©" entity +2016-05-16: Fix: huffdic decompression fails in case of huge documents +2016-05-14: Simplify buffer_init_null() function +2016-05-14: Use ARRAYSIZE macro +2016-05-14: Feature: calculate pid for decryption from device serial number +2016-04-29: Use endian-independent byte swapping +2016-04-29: Exclude unused miniz functions from binary +2016-04-29: Add SHA-1 routines +2016-04-27: Fix miniz.c formatting +2016-04-27: Documentation +2016-04-20: Update changelog +2016-04-20: Fix potential null pointer dereference +2016-04-20: Remove useless check +2016-04-20: Fix text record size calculation +2016-04-20: Fix buffer checking and freeing +2016-04-19: Update docs +2016-04-19: Update ChangeLog +2016-04-19: Fix comparison between signed and unsigned integer +2016-04-19: use strdup on linux/glibc +2016-04-19: Add initial write and metadata editing support. Add mobimeta tool. +2016-04-19: Always check whether memory allocation succeeded +2016-04-18: Fix: guarantee array resize step is at least 1 +2016-04-13: Workaround to read some old mobipocket files +2016-04-13: Improve pdb dates resolving +2016-04-07: Minor documentation edit +2016-04-07: Update changelog +2016-04-06: Fix format warning +2016-04-06: Update test checksums +2016-04-06: Fix: "event" attribute needs "opf" namespace +2016-04-06: Fix: id attributes in ncx file should be unique +2016-04-06: Store full name in MOBIMobiHeader structure +2016-04-05: Fix formatting +2016-04-05: Fix signedness warning +2016-04-04: Fix potential buffer overflow, closes #2 +2016-04-04: Fix potential null pointer dereference +2016-03-23: Fix signedness warnings +2016-03-22: Fix: _mkdir needs direct.h on MinGW +2016-03-22: Fix tests on Windows +2016-03-22: Fix: palmdoc decompression may fail with zero byte in input buffer +2016-03-21: VERSION 03: internal xmlwriter, metadata handling functions, bug fixes +2016-03-21: Feature: add helper functions for metadata extraction +2016-03-21: Load also kf8 data when only kf7 version is requested +2016-03-21: Fix: wrong exth header length check could discard some valid headers +2016-03-20: Get rid of extended attributes in release archive on OS X +2016-03-19: Mobitool: add descriptive error messages based on libmobi return codes +2016-03-04: Add extra length check for CMET record extraction +2016-03-04: Always check buffer allocation result +2016-03-04: Add functions to extract conversion source and log, also add this feature to mobitool +2016-03-04: Remove some stray printfs +2016-03-03: Remove not used AC_FUNC_MALLOC/REALLOC macros that break cross-compilation +2016-03-03: Fix potential illegal memory access in miniz.c +2016-03-03: Fix potential dereference of null pointer in miniz.c +2016-03-03: Fix for Android bionic libc bug (SIZE_MAX missing in stdint.h) +2016-03-03: Fix mobitool compilation on MSVC++ +2016-03-03: Add EPUB creation feature to mobitool +2016-03-02: Fix potential buffer overflow, null pointer dereference +2016-03-02: Add travis test for no-external-dependency build +2016-03-02: Fix missing strdup on linux +2016-03-02: Add internal xmlwriter (as an alternative to libxml2) +2016-03-01: Feature: decode html entities in exth header strings +2016-02-29: Fix: potential buffer overflow +2016-02-29: Fix: wrong pid calculation (regression introduced in 0.2) +2016-02-26: VERSION 0.2: increased stability, lots of bugs fixed +2016-02-26: Add Xcode project file +2016-02-26: Preliminary support for MSVC++ compiler +2016-02-26: Do not use variable length arrays +2016-02-26: Refactor mobi_reconstruct_parts() to use MOBIFragment list +2016-02-26: Fix compiler warning about sign conversion +2016-02-26: Fix compiler warning about type conversion +2016-02-26: Check the result of malloc/calloc +2016-02-26: Fix inconsistent use of const between some definitions and declarations +2016-02-24: Fix inconsistence between function declaration and definition +2016-02-24: Fix various potential crashes in case of corrupt input (afl-fuzz) +2016-02-24: Fix dead code warnings in miniz +2015-11-26: Export mobi_get_first_resource_record() function +2015-11-26: Fix: double free on corrupt cdic +2015-11-02: Update docs +2015-11-02: Feature: add helper functions to find resources by flow id +2015-11-02: Feature: export MOBI_NOTSET macro +2015-11-02: Feature: give more options to parse rawml function +2015-10-24: Restore travis.yml +2015-10-24: Fix OSX travis build +2015-10-24: Fix OSX travis build +2015-10-24: Fix multiline inline script +2015-10-24: Enable multi-OS feature +2015-10-24: Fix: unique temporary name for parallel tests +2015-10-24: Fix: decoding video resources falsely reported as failed +2015-10-24: Fix: tests, some md5sum implementations insert double spaces +2015-10-24: Fix for automake < 1.13 +2015-10-23: Add simple tests framework +2015-10-23: Fix: increase max index entries per record count, as some rare samples fail +2015-10-22: Fix: incorrectly decoded video/audio resources +2015-10-22: Feature: add option to specify output path +2015-10-14: Add some internal functions to public API: mobi_get_flow_by_uid, mobi_get_resource_by_uid, mobi_get_part_by_uid, mobi_get_exthrecord_by_tag +2015-06-13: update changelog +2015-06-13: fix: various invalid memory access +2015-06-13: don't quit on invalid input, instead substitute with replacement character +2015-06-12: fix typo +2015-06-12: update changelog +2015-06-12: fix: reconstruction failed when there were gaps between fragments +2015-06-12: add EXTH tags +2015-06-12: prevent return of garbage value check return value in case of failed malloc +2015-06-12: fix invalid memory access +2015-04-12: Fix reconstruction of "kindle:embed" links without mime type (regression) +2015-04-12: Add sanity checks to link reconstruction functions, allow skipping some malformed patterns +2015-04-12: Fix infinite loop in guide build while unknown tag was found +2015-04-12: Increase max recursion level for huffman decompression +2015-03-28: update docs +2015-03-28: fix solaris studio compiler warnings +2015-03-28: fix solaris studio compiler build +2015-02-18: Fix "more than one: -compatibility_version specified" error on powerpc +2014-11-24: improve docs +2014-11-24: simplify public header +2014-11-21: changelog update [ci skip] +2014-11-21: README +2014-11-21: fix: add sanity checks +2014-11-21: Fix: add sanity checks +2014-11-21: add sanity check to huffcdic indices count +2014-11-21: fix number of leaks and other minor issues (by coverity scan) +2014-11-20: missing notification email kills coverity scan +2014-11-20: update travis.yml +2014-11-20: upgrade travis.ml with covert scan +2014-11-20: update README.md +2014-11-20: add .travis.yml +2014-11-20: update REAME.md +2014-11-20: update README.md +2014-11-20: update docs +2014-11-20: feature: add decryption support +2014-11-20: mkdir cleanup +2014-11-17: documentation +2014-11-17: strip unneeded tags +2014-11-16: fix: potential leak +2014-11-16: fix: regression, some image tags were not reconstructed +2014-11-16: fix: improve ligatures handling +2014-11-16: override darwin linker default versioning +2014-11-15: fix: get proper LIGT entries count from index header +2014-11-15: feature: unpack records into new folder +2014-11-14: make README readable on github +2014-11-14: add README for mobitool +2014-11-14: fix: dictionaries with large inflection rules failed +2014-11-14: feature: support encoded ligatures in index entry labels +2014-11-14: readme +2014-11-14: update changelog +2014-11-13: feature: support for older inflections scheme +2014-11-13: bug: files with short tagx header won't open +2014-11-13: cleanup unneeded include +2014-11-13: use strdup on linux/glibc +2014-11-13: debugging cleanup +2014-11-13: reorganize source files +2014-11-13: use strdup on linux/glibc +2014-11-11: update changelog +2014-11-11: update changeling +2014-11-11: fix: documents with text record size > 4096 failed to load +2014-11-11: add: function to decode flat index entries +2014-11-11: debug: add functions for debugging indices +2014-11-11: cleanup +2014-11-11: fix: variable length value wrongly calculated when going backwards +2014-11-08: update documentation +2014-11-08: update changelog +2014-11-08: add support for reconstructing inflections index entries +2014-11-08: parsing of exth header failed in some cases +2014-11-08: fix: some links reconstruction in kf7 failed +2014-11-08: improve debug info +2014-11-08: failed malloc false reports +2014-11-03: fix problem with uncompressed documents +2014-11-03: fix broken locales +2014-11-03: remove obsolete includes +2014-11-03: git log > changelog +2014-11-03: improved buffer handling +2014-11-03: improved OPF for dictionaries +2014-11-03: proper rawml->orth initialization and freeing +2014-11-03: fix subject field in opf +2014-11-03: handle UTF-16 surrogates, make ORDT lookups locale independent +2014-11-01: move dict reconstruction to separate function +2014-11-01: cleanup +2014-11-01: quiet gcc warning on printf format +2014-11-01: reconstruction of orth dictionary entries +2014-09-27: use mobi_list_del_all() +2014-09-25: postpone conversion to utf8 after all source reconstructions +2014-09-24: comment +2014-09-24: comments +2014-09-12: doxygen comment +2014-09-12: data size in comment +2014-09-05: MOBIArray data type fix +2014-09-05: config.h fixes +2014-06-29: merge master +2014-04-11: initial commit \ No newline at end of file diff --git a/app/src/main/cpp/libmobi/Makefile.am b/app/src/main/cpp/libmobi/Makefile.am new file mode 100644 index 0000000..7472fb5 --- /dev/null +++ b/app/src/main/cpp/libmobi/Makefile.am @@ -0,0 +1,12 @@ +# project Makefile.am + +SUBDIRS = src tools tests + +EXTRA_DIST = README.md autogen.sh + +test: check + +ACLOCAL_AMFLAGS = -I m4 + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libmobi.pc diff --git a/app/src/main/cpp/libmobi/NEWS b/app/src/main/cpp/libmobi/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/app/src/main/cpp/libmobi/README.md b/app/src/main/cpp/libmobi/README.md new file mode 100644 index 0000000..bfe1407 --- /dev/null +++ b/app/src/main/cpp/libmobi/README.md @@ -0,0 +1,142 @@ +# Libmobi + +C library for handling Mobipocket/Kindle (MOBI) ebook format documents. + +Library comes with several [command line tools](https://github.com/bfabiszewski/libmobi/tree/public/tools) for working with mobi ebooks. +The tools source may also be used as an example on how to use the library. + +## Features: +- reading and parsing: + - some older text Palmdoc formats (pdb), + - Mobipocket files (prc, mobi), + - newer MOBI files including KF8 format (azw, azw3), + - Replica Print files (azw4) +- recreating source files using indices +- reconstructing references (links and embedded) in html files +- reconstructing source structure that can be fed back to kindlegen +- reconstructing dictionary markup (orth, infl tags) +- writing back loaded documents +- metadata editing +- handling encrypted documents +- encrypting documents for use on eInk Kindles + +## Todo: +- improve writing +- serialize rawml into raw records +- process RESC records + +## Doxygen documentation: +- [functions](http://www.fabiszewski.net/libmobi/group__mobi__export.html), +- [structures for the raw, unparsed records metadata and data](http://www.fabiszewski.net/libmobi/group__raw__structs.html), +- [structures for the parsed records metadata and data](http://www.fabiszewski.net/libmobi/group__parsed__structs.html), +- [enums](http://www.fabiszewski.net/libmobi/group__mobi__enums.html) + +## Source: +- [on github](https://github.com/bfabiszewski/libmobi/) + +## Packages: +[![Packaging status](https://repology.org/badge/vertical-allrepos/libmobi.svg)](https://repology.org/project/libmobi/versions) + +## Installation: + + [for git] $ ./autogen.sh + $ ./configure + $ make + [optionally] $ make test + $ sudo make install + +On macOS, you can install via [Homebrew](https://brew.sh/) with `brew install libmobi`. + +## Alternative build systems +- The supported way of building project is by using autotools. +- Optionally project provides basic support for CMake, Xcode and MSVC++ systems. However these alternative configurations are not covering all options of autotools project. They are also not tested and not updated regularly. + +## Usage +- single include file: `#include ` +- linker flag: `-lmobi` +- basic usage: +```c +#include + +/* Initialize main MOBIData structure */ +/* Must be deallocated with mobi_free() when not needed */ +MOBIData *m = mobi_init(); +if (m == NULL) { + return ERROR; +} + +/* Open file for reading */ +FILE *file = fopen(fullpath, "rb"); +if (file == NULL) { + mobi_free(m); + return ERROR; +} + +/* Load file into MOBIData structure */ +/* This structure will hold raw data/metadata from mobi document */ +MOBI_RET mobi_ret = mobi_load_file(m, file); +fclose(file); +if (mobi_ret != MOBI_SUCCESS) { + mobi_free(m); + return ERROR; +} + +/* Initialize MOBIRawml structure */ +/* Must be deallocated with mobi_free_rawml() when not needed */ +/* In the next step this structure will be filled with parsed data */ +MOBIRawml *rawml = mobi_init_rawml(m); +if (rawml == NULL) { + mobi_free(m); + return ERROR; +} +/* Raw data from MOBIData will be converted to html, css, fonts, media resources */ +/* Parsed data will be available in MOBIRawml structure */ +mobi_ret = mobi_parse_rawml(rawml, m); +if (mobi_ret != MOBI_SUCCESS) { + mobi_free(m); + mobi_free_rawml(rawml); + return ERROR; +} + +/* Do something useful here */ +/* ... */ +/* For examples how to access data in MOBIRawml structure see mobitool.c */ + +/* Free MOBIRawml structure */ +mobi_free_rawml(rawml); + +/* Free MOBIData structure */ +mobi_free(m); + +return SUCCESS; +``` +- for examples of usage, see [tools](https://github.com/bfabiszewski/libmobi/tree/public/tools) + + +## Requirements +- compiler supporting C99 +- zlib (optional, configure --with-zlib=no to use included miniz.c instead) +- libxml2 (optional, configure --with-libxml2=no to use internal xmlwriter) +- tested with gcc (>=4.2.4), clang (llvm >=3.4), sun c (>=5.13), MSVC++ (2015) +- builds on Linux, MacOS, Windows (MSVC++, MinGW), Android, Solaris +- tested architectures: x86, x86-64, arm, ppc +- works cross-compiled on Kindle :) + +## Tests +- [![Github Action status](https://github.com/bfabiszewski/libmobi/actions/workflows/build.yml/badge.svg)](https://github.com/bfabiszewski/libmobi/actions) +- [![Travis status](https://travis-ci.com/bfabiszewski/libmobi.svg?branch=public)](https://travis-ci.com/bfabiszewski/libmobi) +- [![Coverity status](https://scan.coverity.com/projects/3521/badge.svg)](https://scan.coverity.com/projects/3521) + +## Projects using libmobi +- [KyBook 2 Reader](http://kybook-reader.com) +- [@Voice Aloud Reader](http://www.hyperionics.com/atVoice/) +- [QLMobi quicklook plugin](https://github.com/bfabiszewski/QLMobi/tree/master/QLMobi) +- [Librera Reader](http://librera.mobi) +- ... (let me know to include your project) + +## License: +- LGPL, either version 3, or any later + +## Credits: +- The huffman decompression and KF8 parsing algorithms were learned by studying python source code of [KindleUnpack](https://github.com/kevinhendricks/KindleUnpack). +- Thanks to all contributors of Mobileread [MOBI wiki](http://wiki.mobileread.com/wiki/MOBI) diff --git a/app/src/main/cpp/libmobi/autogen.sh b/app/src/main/cpp/libmobi/autogen.sh new file mode 100644 index 0000000..13c49e3 --- /dev/null +++ b/app/src/main/cpp/libmobi/autogen.sh @@ -0,0 +1,3 @@ +#!/bin/sh +mkdir -p m4 && \ +autoreconf --force --install -I m4 diff --git a/app/src/main/cpp/libmobi/configure.ac b/app/src/main/cpp/libmobi/configure.ac new file mode 100644 index 0000000..6e60cd6 --- /dev/null +++ b/app/src/main/cpp/libmobi/configure.ac @@ -0,0 +1,419 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.62]) +AC_INIT([libmobi], [0.12]) +AC_CONFIG_SRCDIR([src/buffer.c]) + +# Enable automake +AM_INIT_AUTOMAKE([1.11 -Wall foreign subdir-objects]) +# all defined C macros (HAVE_*) will be saved to this file +AC_CONFIG_HEADERS([config.h]) +AC_CONFIG_MACRO_DIR([m4]) + +# Checks for programs. +AC_PROG_CC +m4_version_prereq([2.70], [], [AC_PROG_CC_C99]) +AM_PROG_CC_C_O +AC_PROG_INSTALL +m4_ifdef([AM_PROG_AR], [AM_PROG_AR]) + +# Init libtool +m4_ifdef([LT_INIT], [LT_INIT], [AC_PROG_LIBTOOL]) + +# Checks for libraries. + +# Checks for header files. +AC_HEADER_STDBOOL +AC_CHECK_HEADERS([stdlib.h string.h utime.h unistd.h sys/resource.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_TYPE_INT32_T +AC_TYPE_INT64_T +AC_TYPE_INT8_T +AC_TYPE_SIZE_T +AC_TYPE_UINT16_T +AC_TYPE_UINT32_T +AC_TYPE_UINT64_T +AC_TYPE_UINT8_T + +# Checks for library functions. +AC_FUNC_MKTIME +AC_CHECK_FUNCS([memmove memset mkdir strdup strpbrk strrchr strstr strtoul utime]) + +# check for getopt() function +AC_MSG_CHECKING([for getopt]) +saved_CFLAGS="$CFLAGS" +CFLAGS="-Werror" +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#if HAVE_UNISTD_H + # include + #endif]], + [[return getopt(0, NULL, NULL);]])], + [have_getopt=yes + AC_DEFINE([HAVE_GETOPT], [1], [Define whether getopt() function is available])], + [have_getopt=no]) +CFLAGS="$saved_CFLAGS" +AC_MSG_RESULT([$have_getopt]) +AM_CONDITIONAL([USE_INTERNAL_GETOPT], [test x$have_getopt = xno]) + +# Check for oracle solaris studio c compiler +AC_CHECK_DECL([__SUNPRO_C], [SUNCC=yes], [SUNCC=no]) + +# Get rid of extended attributes in release archive on macOS +case "$host" in + *-*-darwin*) + am__tar="COPY_EXTENDED_ATTRIBUTES_DISABLE=1 COPYFILE_DISABLE=1 ${am__tar}" +esac + +# Check for -fvisibility=hidden to determine if we can do GNU-style +# visibility attributes for symbol export control +AC_MSG_CHECKING([for visibility hidden compiler flag]) +VISIBILITY_HIDDEN= +if test x$SUNCC = xyes; then + # check if we can use -xldscope=hidden + saved_CFLAGS="$CFLAGS" + CFLAGS="-xldscope=hidden" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [enable_fvisibility_hidden=yes], + [enable_fvisibility_hidden=no]) + CFLAGS="$saved_CFLAGS" + + AS_IF([test x$enable_fvisibility_hidden = xyes], [VISIBILITY_HIDDEN="-xldscope=hidden"]) +else + case "$host" in + *-*-mingw*) + # on mingw32 we do -fvisibility=hidden and __declspec(dllexport) + VISIBILITY_HIDDEN="-fvisibility=hidden" + ;; + *) + # on other compilers, check if we can do -fvisibility=hidden + saved_CFLAGS="$CFLAGS" + CFLAGS="-fvisibility=hidden -Werror" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [enable_fvisibility_hidden=yes], + [enable_fvisibility_hidden=no]) + CFLAGS="$saved_CFLAGS" + + AS_IF([test x$enable_fvisibility_hidden = xyes], [VISIBILITY_HIDDEN="-fvisibility=hidden"]) + ;; + esac +fi +AC_MSG_RESULT([$VISIBILITY_HIDDEN]) +AC_SUBST([VISIBILITY_HIDDEN]) + +# MinGW seems to need this +case "$host" in + *-*-mingw*) + NO_UNDEFINED="-no-undefined" + AVOID_VERSION="-avoid-version" + ISO99_SOURCE="-D_ISOC99_SOURCE=1" + WIN32=yes + ;; + *) + NO_UNDEFINED= + AVOID_VERSION= + ISO99_SOURCE= + WIN32=no + ;; +esac +AC_SUBST([NO_UNDEFINED]) +AC_SUBST([AVOID_VERSION]) +AC_SUBST([ISO99_SOURCE]) +AC_SUBST([WIN32]) + +# Override default versioning of Darwin linker +case "$host" in + *-*-darwin*) + case "$host" in + # exclude ppc as it breaks linker + ppc-* | powerpc-*) + DARWIN_LDFLAGS= + ;; + *) + MAJOR=`echo "${PACKAGE_VERSION}" | cut -d . -f 1` + DARWIN_LDFLAGS="-Wl,-compatibility_version,${MAJOR} -Wl,-current_version,${PACKAGE_VERSION}" + ;; + esac + ;; + *) + DARWIN_LDFLAGS= + ;; +esac +AC_SUBST([DARWIN_LDFLAGS]) + +# Check for --allow-multiple-definition support in linker +AC_MSG_CHECKING([whether linker supports --allow-multiple-definition flag]) +MOBI_ALLOW_MULTIPLE= +saved_CFLAGS="$CFLAGS" +CFLAGS="-Wl,--allow-multiple-definition -Werror" +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[]], [[]])], + [def_allow_multiple=yes], + [def_allow_multiple=no]) +CFLAGS="$saved_CFLAGS" +AS_IF([test x$def_allow_multiple = xyes], [MOBI_ALLOW_MULTIPLE="-Wl,--allow-multiple-definition"]) +AC_MSG_RESULT([$def_allow_multiple]) +AC_SUBST([MOBI_ALLOW_MULTIPLE]) + +# Check for non-broken inline under various spellings +AC_MSG_CHECKING([for inline keyword]) +def_inline="" +for inline_key in inline __inline__ __inline +do + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[]], + [[} $inline_key int foo() { return 0; } int bar() { return foo();]])], + [def_inline=$inline_key; break]) +done +AC_MSG_RESULT([$def_inline]) +AC_DEFINE_UNQUOTED([MOBI_INLINE], [$def_inline], [How to obtain function inlining.]) + +# Check for noreturn attribute support +AC_MSG_CHECKING([whether compiler supports noreturn attribute]) +AC_LINK_IFELSE( + [AC_LANG_PROGRAM([[]], [[void foo( void ) __attribute__((noreturn));]])], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_ATTRIBUTE_NORETURN], [1], [Define to 1 if compiler supports __attribute__((noreturn))])], + [AC_MSG_RESULT([no])] +) + +# Check --enable-xmlwriter +XMLWRITER_OPT="" +AC_MSG_CHECKING([whether enable xmlwriter (for opf support)]) +AC_ARG_ENABLE( + [xmlwriter], + [AS_HELP_STRING([--enable-xmlwriter], [enable xmlwriter (for opf support) @<:@default=yes@:>@])], + [case "$enableval" in + yes) xmlwriter=yes ;; + no) xmlwriter=no ;; + *) AC_MSG_ERROR([bad value $enableval for --enable-xmlwriter]) ;; + esac], + [xmlwriter=yes]) +AC_MSG_RESULT([$xmlwriter]) +AM_CONDITIONAL([USE_XMLWRITER], [test x$xmlwriter = xyes]) +if test x$xmlwriter = xyes; then + AC_DEFINE([USE_XMLWRITER], [1], [Define whether enable xmlwriter (for opf support)]) + + # test for --with-libxml2 + AC_MSG_CHECKING([whether compile with libxml2]) + AC_ARG_WITH( + [libxml2], + [AS_HELP_STRING([--with-libxml2], [Use libxml2 instead of internal xmlwriter @<:@default=yes@:>@])], + [if test "x$withval" = xyes; then use_libxml2=yes; else use_libxml2=no; fi], + [use_libxml2=yes]) + AC_MSG_RESULT([$use_libxml2]) + + if test x$use_libxml2 = xyes; then + AC_ARG_VAR([XML2_CONFIG], [path to xml2-config utility]) + AC_CHECK_PROGS([XML2_CONFIG], [xml2-config]) + AC_CHECK_PROGS([PKG_CONFIG], [pkg-config]) + AC_MSG_CHECKING([for libxml2 path supplier]) + if test -n "$PKG_CONFIG" && $PKG_CONFIG --exists libxml-2.0; then + LIBXML2_CFLAGS="`$PKG_CONFIG --cflags libxml-2.0`" + LIBXML2_LDFLAGS="`$PKG_CONFIG --libs libxml-2.0`" + AC_MSG_RESULT([pkg-config]) + elif test -n "$XML2_CONFIG"; then + LIBXML2_CFLAGS="`$XML2_CONFIG --cflags`" + LIBXML2_LDFLAGS="`$XML2_CONFIG --libs`" + AC_MSG_RESULT([xml2-config]) + else + LIBXML2_CFLAGS=-I/usr/include/libxml2 + LIBXML2_LDFLAGS=-lxml2 + AC_MSG_RESULT([generic]) + fi + saved_CPPFLAGS=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $LIBXML2_CFLAGS" + AC_CHECK_HEADER( + [libxml/xmlwriter.h], + [AC_DEFINE([USE_LIBXML2], [1], [Define if you want to use libxml2 library])], + [AC_MSG_ERROR([couldn't find libxml2])]) + CPPFLAGS=$saved_CPPFLAGS + else + LIBXML2_LDFLAGS= + LIBXML2_CFLAGS= + fi + AC_SUBST([LIBXML2_LDFLAGS]) + AC_SUBST([LIBXML2_CFLAGS]) + XMLWRITER_OPT="yes" +fi +AM_CONDITIONAL([USE_LIBXML2], [test x$use_libxml2 = xyes]) +AC_SUBST([XMLWRITER_OPT]) + +# Check --enable-encryption +ENCRYPTION_OPT="" +AC_MSG_CHECKING([whether enable encryption]) +AC_ARG_ENABLE( + [encryption], + [AS_HELP_STRING([--enable-encryption], [enable encryption @<:@default=yes@:>@])], + [case "$enableval" in + yes) encryption=yes ;; + no) encryption=no ;; + *) AC_MSG_ERROR([bad value $enableval for --enable-encryption]) ;; + esac], + [encryption=yes]) +AC_MSG_RESULT([$encryption]) +AM_CONDITIONAL([USE_ENCRYPTION], [test x$encryption = xyes]) +if test x$encryption = xyes; then + AC_DEFINE([USE_ENCRYPTION], [1], [Enable encryption]) + ENCRYPTION_OPT="yes" + + AC_CHECK_HEADERS([sys/random.h]) + AC_MSG_CHECKING([for getrandom with a standard API]) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM( + [[#include + #ifdef HAVE_UNISTD_H + # include + #endif + #ifdef HAVE_SYS_RANDOM_H + # include + #endif]], + [[unsigned char buf; + if (&getrandom != NULL) { + (void) getrandom((void *) &buf, 1U, 0U); + }]])], + [AC_MSG_RESULT([yes]) + AC_CHECK_FUNCS([getrandom])], + [AC_MSG_RESULT([no])]) + +fi +AC_SUBST([ENCRYPTION_OPT]) + +# Check --enable-debug +AC_MSG_CHECKING([whether enable debugging]) +AC_ARG_ENABLE( + [debug], + [AS_HELP_STRING([--enable-debug], [enable debugging @<:@default=no@:>@])], + [case "$enableval" in + yes) debug=yes ;; + no) debug=no ;; + *) AC_MSG_ERROR([bad value $enableval for --enable-debug]) ;; + esac], + [debug=no]) +AC_MSG_RESULT([$debug]) + +DEBUG_CFLAGS= +if test x$debug = xyes; then + AC_DEFINE([MOBI_DEBUG], [1], [Enable debugging]) + if test x$SUNCC = xyes; then + DEBUG_CFLAGS="-v -errwarn" + else + DEBUG_CFLAGS="-pedantic -Wall -Wextra -Werror" + fi +fi +AC_SUBST([DEBUG_CFLAGS]) + +# Check --enable-debug-alloc +AC_MSG_CHECKING([whether enable alloc debugging]) +AC_ARG_ENABLE( + [debug_alloc], + [AS_HELP_STRING([--enable-debug-alloc], [enable memory allocation debugging @<:@default=no@:>@])], + [case "$enableval" in + yes) debug_alloc=yes ;; + no) debug_alloc=no ;; + *) AC_MSG_ERROR([bad value $enableval for --enable-debug-alloc]) ;; + esac], + [debug_alloc=no]) +AC_MSG_RESULT([$debug_alloc]) + +if test x$debug_alloc = xyes; then + AC_DEFINE([MOBI_DEBUG_ALLOC], [1], [Enable alloc debugging]) +fi + +# Check --enable-tools-static +AC_MSG_CHECKING([whether link tools against static libmobi]) +AC_ARG_ENABLE( + [tools_static], + [AS_HELP_STRING([--enable-tools-static], [link tools against static libmobi @<:@default=no@:>@])], + [case "$enableval" in + yes) tools_static=yes ;; + no) tools_static=no ;; + *) AC_MSG_ERROR([bad value $enableval for --enable-tools-static]) ;; + esac], + [tools_static=no]) +AC_MSG_RESULT([$tools_static]) +TOOLS_STATIC= +if test x$tools_static = xyes; then + TOOLS_STATIC="-static" +fi +AC_SUBST([TOOLS_STATIC]) + +# test for --with-zlib +AC_MSG_CHECKING([whether compile with zlib]) +AC_ARG_WITH( + [zlib], + [AS_HELP_STRING([--with-zlib], [Use zlib instead of included miniz @<:@default=yes@:>@])], + [if test "x$withval" = xyes; then use_zlib=yes; else use_zlib=no; fi], + [use_zlib=yes]) +AC_MSG_RESULT([$use_zlib]) +AM_CONDITIONAL([USE_ZLIB], [test x$use_zlib = xyes]) +AM_CONDITIONAL([USE_MINIZ], [test x$use_zlib = xno]) +AM_CONDITIONAL([USE_STATIC], [test x$tools_static = xyes]) +if test x$use_zlib = xyes; then + AC_CHECK_HEADER( + [zlib.h], + [AC_DEFINE([USE_ZLIB], [1], [Define if you want to use system zlib library]) + LIBZ_LDFLAGS=-lz + MINIZ_CFLAGS=], + [AC_MSG_ERROR([couldn't find zlib header])]) +else + AC_DEFINE([USE_MINIZ], [1], [Define if you want to use included miniz library]) + MINIZ_CFLAGS="-D_POSIX_C_SOURCE=200112L" + LIBZ_LDFLAGS= +fi +AC_SUBST([LIBZ_LDFLAGS]) +AC_SUBST([MINIZ_CFLAGS]) + +# Check for md5 or md5sum program, needed for tests +AC_ARG_VAR([MD5PROG], [md5 hashing program executable]) +AS_IF([test -z "$MD5PROG"], [AC_CHECK_PROG([MD5PROG], [md5sum], [md5sum -t])], []) +AS_IF([test -z "$MD5PROG"], [AC_CHECK_PROG([MD5PROG], [md5], [md5 -r])], []) +AS_IF([test -z "$MD5PROG"], [AC_MSG_WARN([md5 hashing program not found, some tests will be skipped])], []) +AC_PATH_PROG([BASH_PATH], [bash]) +AS_IF( + [test -z "$BASH_PATH"], + [AC_MSG_WARN([bash not found, tests will be skipped]) + RUN_TESTS="no"], + [RUN_TESTS="yes" + AC_SUBST([BASH_PATH])]) +AC_SUBST([RUN_TESTS]) + +if test x$RUN_TESTS = xyes; then + # List test files + cur_dir=`pwd` + cd "$srcdir"/tests + + for sample_path in samples/*.mobi + do + TESTLIST="${TESTLIST} ${sample_path} \\ +" + done + for sample_path in samples/*.fail + do + TESTLIST="${TESTLIST} ${sample_path} \\ +" + FAILLIST="${FAILLIST} ${sample_path} \\ +" + done + cd $cur_dir +fi + +AC_SUBST([TESTLIST]) +AC_SUBST([FAILLIST]) + +AC_CONFIG_FILES([Makefile]) +AC_CONFIG_FILES([libmobi.pc]) +AC_CONFIG_FILES([src/Makefile]) +AC_CONFIG_FILES([tools/Makefile]) +AC_CONFIG_FILES([tools/mobitool.1]) +AC_CONFIG_FILES([tools/mobimeta.1]) +AC_CONFIG_FILES([tools/mobidrm.1]) +AC_CONFIG_FILES([tests/Makefile]) +AC_CONFIG_FILES([tests/test.sh], [chmod +x tests/test.sh]) + +AC_OUTPUT diff --git a/app/src/main/cpp/libmobi/libmobi.pc.in b/app/src/main/cpp/libmobi/libmobi.pc.in new file mode 100644 index 0000000..ccfb623 --- /dev/null +++ b/app/src/main/cpp/libmobi/libmobi.pc.in @@ -0,0 +1,13 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: libmobi +Description: MOBI ebook format handling library +URL: http://www.fabiszewski.net/libmobi +Version: @VERSION@ +Requires: +Libs: -L${libdir} -lmobi +Libs.private: @LIBZ_LDFLAGS@ @LIBXML2_LDFLAGS@ +Cflags: -I${includedir} diff --git a/app/src/main/cpp/libmobi/mobi.xcodeproj/project.pbxproj b/app/src/main/cpp/libmobi/mobi.xcodeproj/project.pbxproj new file mode 100644 index 0000000..04cb3d3 --- /dev/null +++ b/app/src/main/cpp/libmobi/mobi.xcodeproj/project.pbxproj @@ -0,0 +1,879 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1502448F1CD3A18F0075F4EC /* sha1.c in Sources */ = {isa = PBXBuildFile; fileRef = 1502448D1CD3A18F0075F4EC /* sha1.c */; }; + 150244901CD3A18F0075F4EC /* sha1.h in Headers */ = {isa = PBXBuildFile; fileRef = 1502448E1CD3A18F0075F4EC /* sha1.h */; }; + 1504FD851CBE880B002AA042 /* meta.c in Sources */ = {isa = PBXBuildFile; fileRef = 1504FD831CBE880B002AA042 /* meta.c */; }; + 1504FD861CBE880B002AA042 /* meta.h in Headers */ = {isa = PBXBuildFile; fileRef = 1504FD841CBE880B002AA042 /* meta.h */; }; + 150A318D18E19BF9001A7AD7 /* write.c in Sources */ = {isa = PBXBuildFile; fileRef = 150A318C18E19BF9001A7AD7 /* write.c */; }; + 151A46661909312900FAF3F4 /* miniz.c in Sources */ = {isa = PBXBuildFile; fileRef = 151A46651909312900FAF3F4 /* miniz.c */; settings = {COMPILER_FLAGS = "-w"; }; }; + 152FD1E6270509A900AF276A /* randombytes.h in Headers */ = {isa = PBXBuildFile; fileRef = 152FD1E4270509A900AF276A /* randombytes.h */; }; + 152FD1E7270509A900AF276A /* randombytes.c in Sources */ = {isa = PBXBuildFile; fileRef = 152FD1E5270509A900AF276A /* randombytes.c */; }; + 153D91DB18E9630000E807B6 /* memory.c in Sources */ = {isa = PBXBuildFile; fileRef = 153D91DA18E9630000E807B6 /* memory.c */; }; + 1543065B1CB78A45006AB398 /* mobimeta.c in Sources */ = {isa = PBXBuildFile; fileRef = 151185A31CB6C28500201C8A /* mobimeta.c */; }; + 1543065E1CB78BA8006AB398 /* libmobi.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 150039BB18E06BC100D33077 /* libmobi.dylib */; }; + 154C2D401CC64A170041DD0E /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = 154C2D3E1CC64A170041DD0E /* common.c */; }; + 154C2D411CC64A170041DD0E /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = 154C2D3E1CC64A170041DD0E /* common.c */; }; + 1550ADC318E427D7006F9257 /* buffer.c in Sources */ = {isa = PBXBuildFile; fileRef = 1550ADC218E427D7006F9257 /* buffer.c */; }; + 1550ADCE18E4B925006F9257 /* compression.c in Sources */ = {isa = PBXBuildFile; fileRef = 1550ADCD18E4B925006F9257 /* compression.c */; }; + 1553330118E359AE00334E23 /* read.c in Sources */ = {isa = PBXBuildFile; fileRef = 1553330018E359AE00334E23 /* read.c */; }; + 1553332118E37FC400334E23 /* libmobi.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 150039BB18E06BC100D33077 /* libmobi.dylib */; }; + 15603889192D2E1A002EDB1A /* opf.c in Sources */ = {isa = PBXBuildFile; fileRef = 15603888192D2E1A002EDB1A /* opf.c */; }; + 15615F0818F58C85004EBB6E /* mobitool.c in Sources */ = {isa = PBXBuildFile; fileRef = 15615F0718F58C85004EBB6E /* mobitool.c */; }; + 1563314718EC36A200D4B858 /* debug.c in Sources */ = {isa = PBXBuildFile; fileRef = 1563314618EC36A200D4B858 /* debug.c */; }; + 156AA65D1C81A3860085335A /* xmlwriter.c in Sources */ = {isa = PBXBuildFile; fileRef = 156AA65B1C81A3860085335A /* xmlwriter.c */; }; + 156AA65E1C81A3860085335A /* xmlwriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 156AA65C1C81A3860085335A /* xmlwriter.h */; }; + 157BEA732747BEDA004984B8 /* libmobi.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 150039BB18E06BC100D33077 /* libmobi.dylib */; }; + 157BEA852747BF13004984B8 /* mobidrm.c in Sources */ = {isa = PBXBuildFile; fileRef = 157BEA6B2747B4EC004984B8 /* mobidrm.c */; }; + 157BEA8A2747BF26004984B8 /* common.c in Sources */ = {isa = PBXBuildFile; fileRef = 154C2D3E1CC64A170041DD0E /* common.c */; }; + 157DF7AD191A514D00191502 /* index.c in Sources */ = {isa = PBXBuildFile; fileRef = 157DF7AC191A514D00191502 /* index.c */; }; + 15AB2CB419572C2800EB7F74 /* parse_rawml.c in Sources */ = {isa = PBXBuildFile; fileRef = 15AB2CB319572C2800EB7F74 /* parse_rawml.c */; }; + 15EA81DF1A14D5AC00138554 /* structure.c in Sources */ = {isa = PBXBuildFile; fileRef = 15EA81DE1A14D5AC00138554 /* structure.c */; }; + 15F1A1D118F4192D009CFE05 /* util.c in Sources */ = {isa = PBXBuildFile; fileRef = 15F1A1D018F4192D009CFE05 /* util.c */; }; + 15FB2BB21A1A32970052D5C5 /* encryption.c in Sources */ = {isa = PBXBuildFile; fileRef = 15FB2BB01A1A32970052D5C5 /* encryption.c */; }; + 15FB2BB31A1A32970052D5C5 /* encryption.h in Headers */ = {isa = PBXBuildFile; fileRef = 15FB2BB11A1A32970052D5C5 /* encryption.h */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 1543065C1CB78B78006AB398 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 150039B318E06BC100D33077 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 150039BA18E06BC100D33077; + remoteInfo = mobi; + }; + 1553331F18E37FB800334E23 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 150039B318E06BC100D33077 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 150039BA18E06BC100D33077; + remoteInfo = mobi; + }; + 157BEA6E2747BEDA004984B8 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 150039B318E06BC100D33077 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 150039BA18E06BC100D33077; + remoteInfo = mobi; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 154306521CB78A3D006AB398 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1/; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 1553331418E37F7000334E23 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; + 157BEA742747BEDA004984B8 /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = /usr/share/man/man1; + dstSubfolderSpec = 0; + files = ( + ); + runOnlyForDeploymentPostprocessing = 1; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 150039BB18E06BC100D33077 /* libmobi.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libmobi.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + 150039C218E06C1B00D33077 /* mobi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = mobi.h; path = src/mobi.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 1502448D1CD3A18F0075F4EC /* sha1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = sha1.c; path = src/sha1.c; sourceTree = ""; }; + 1502448E1CD3A18F0075F4EC /* sha1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = sha1.h; path = src/sha1.h; sourceTree = ""; }; + 1504FD831CBE880B002AA042 /* meta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = meta.c; path = src/meta.c; sourceTree = ""; }; + 1504FD841CBE880B002AA042 /* meta.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = meta.h; path = src/meta.h; sourceTree = ""; }; + 150A318B18E19BD8001A7AD7 /* write.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = write.h; path = src/write.h; sourceTree = ""; }; + 150A318C18E19BF9001A7AD7 /* write.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; lineEnding = 0; name = write.c; path = src/write.c; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.c; }; + 151185A31CB6C28500201C8A /* mobimeta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mobimeta.c; path = tools/mobimeta.c; sourceTree = SOURCE_ROOT; }; + 151A46641909302C00FAF3F4 /* miniz.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = miniz.h; path = src/miniz.h; sourceTree = ""; }; + 151A46651909312900FAF3F4 /* miniz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = miniz.c; path = src/miniz.c; sourceTree = ""; }; + 152D509E1BD79AE400E91C09 /* test.sh.in */ = {isa = PBXFileReference; explicitFileType = text.script.sh; name = test.sh.in; path = tests/test.sh.in; sourceTree = ""; }; + 152D50A01BD7A08300E91C09 /* Makefile.am */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; fileEncoding = 4; name = Makefile.am; path = tests/Makefile.am; sourceTree = ""; usesTabs = 1; xcLanguageSpecificationIdentifier = xcode.lang.sh; }; + 152E5D1218F5DEB100B05EC9 /* configure.ac */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = configure.ac; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.csh; }; + 152E5D1318F5DEB100B05EC9 /* Makefile.am */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; fileEncoding = 4; path = Makefile.am; sourceTree = ""; usesTabs = 1; }; + 152E5D1418F5DEC000B05EC9 /* Makefile.am */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; fileEncoding = 4; name = Makefile.am; path = src/Makefile.am; sourceTree = ""; usesTabs = 1; }; + 152E5D1518F5DECF00B05EC9 /* Makefile.am */ = {isa = PBXFileReference; explicitFileType = sourcecode.make; fileEncoding = 4; name = Makefile.am; path = tools/Makefile.am; sourceTree = ""; usesTabs = 1; }; + 152E5D1618F5E22000B05EC9 /* autogen.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = autogen.sh; sourceTree = ""; }; + 152ED797195EFBD900ACD1AD /* ChangeLog */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ChangeLog; sourceTree = ""; }; + 152FD1E4270509A900AF276A /* randombytes.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = randombytes.h; path = src/randombytes.h; sourceTree = ""; }; + 152FD1E5270509A900AF276A /* randombytes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = randombytes.c; path = src/randombytes.c; sourceTree = ""; }; + 153967601907C0AA00EDC923 /* COPYING */ = {isa = PBXFileReference; lastKnownFileType = text; path = COPYING; sourceTree = ""; }; + 153D91DA18E9630000E807B6 /* memory.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; lineEnding = 0; name = memory.c; path = src/memory.c; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.c; }; + 153D91DC18E9633500E807B6 /* memory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = memory.h; path = src/memory.h; sourceTree = ""; }; + 1542B8041C7FA5E800C5122F /* getopt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = getopt.c; path = tools/win32/getopt.c; sourceTree = SOURCE_ROOT; }; + 1542B8051C7FA5E900C5122F /* getopt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = getopt.h; path = tools/win32/getopt.h; sourceTree = SOURCE_ROOT; }; + 154306541CB78A3D006AB398 /* mobimeta */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mobimeta; sourceTree = BUILT_PRODUCTS_DIR; }; + 154C2D3E1CC64A170041DD0E /* common.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = common.c; path = tools/common.c; sourceTree = SOURCE_ROOT; }; + 154C2D3F1CC64A170041DD0E /* common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = common.h; path = tools/common.h; sourceTree = SOURCE_ROOT; }; + 1550ADC218E427D7006F9257 /* buffer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = buffer.c; path = src/buffer.c; sourceTree = ""; }; + 1550ADC418E42842006F9257 /* buffer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = buffer.h; path = src/buffer.h; sourceTree = ""; }; + 1550ADCD18E4B925006F9257 /* compression.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; lineEnding = 0; name = compression.c; path = src/compression.c; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.c; }; + 1550ADCF18E4BB83006F9257 /* compression.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = compression.h; path = src/compression.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 1553330018E359AE00334E23 /* read.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; lineEnding = 0; name = read.c; path = src/read.c; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.c; }; + 1553330218E359B900334E23 /* read.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = read.h; path = src/read.h; sourceTree = ""; }; + 1553331618E37F7000334E23 /* mobitool */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mobitool; sourceTree = BUILT_PRODUCTS_DIR; }; + 1559D790191BB06700636661 /* config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = config.h; path = src/config.h; sourceTree = ""; }; + 15603888192D2E1A002EDB1A /* opf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = opf.c; path = src/opf.c; sourceTree = ""; }; + 1560388A192D2E34002EDB1A /* opf.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = opf.h; path = src/opf.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.c; }; + 15615F0718F58C85004EBB6E /* mobitool.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; lineEnding = 0; name = mobitool.c; path = tools/mobitool.c; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.c; }; + 1563314518EC367300D4B858 /* debug.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = debug.h; path = src/debug.h; sourceTree = ""; }; + 1563314618EC36A200D4B858 /* debug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = debug.c; path = src/debug.c; sourceTree = ""; }; + 156AA65B1C81A3860085335A /* xmlwriter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = xmlwriter.c; path = src/xmlwriter.c; sourceTree = ""; }; + 156AA65C1C81A3860085335A /* xmlwriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = xmlwriter.h; path = src/xmlwriter.h; sourceTree = ""; }; + 157BEA6B2747B4EC004984B8 /* mobidrm.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = mobidrm.c; path = tools/mobidrm.c; sourceTree = SOURCE_ROOT; }; + 157BEA782747BEDA004984B8 /* mobidrm */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = mobidrm; sourceTree = BUILT_PRODUCTS_DIR; }; + 157DF7AC191A514D00191502 /* index.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = index.c; path = src/index.c; sourceTree = ""; }; + 157DF7AE191A51A400191502 /* index.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = index.h; path = src/index.h; sourceTree = ""; }; + 15843DFE19215D0400587C89 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = text; path = README.md; sourceTree = ""; }; + 158F44DC191E88010000F44A /* libmobi.pc.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = libmobi.pc.in; sourceTree = ""; }; + 15AB2CB319572C2800EB7F74 /* parse_rawml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parse_rawml.c; path = src/parse_rawml.c; sourceTree = ""; }; + 15AB2CB519572C4400EB7F74 /* parse_rawml.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = parse_rawml.h; path = src/parse_rawml.h; sourceTree = ""; }; + 15B4311D2767840300B7E6A7 /* mobidrm.1.in */ = {isa = PBXFileReference; explicitFileType = text.man; name = mobidrm.1.in; path = tools/mobidrm.1.in; sourceTree = SOURCE_ROOT; }; + 15D7CFD71A167A3A00F08927 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = tools/README.md; sourceTree = ""; }; + 15E5FAD91CC58B4D00F700D1 /* mobimeta.1.in */ = {isa = PBXFileReference; explicitFileType = text.man; name = mobimeta.1.in; path = tools/mobimeta.1.in; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.man; }; + 15E65B5E1A1DF1DA00B7FBBD /* mobitool.1.in */ = {isa = PBXFileReference; explicitFileType = text.man; fileEncoding = 4; name = mobitool.1.in; path = tools/mobitool.1.in; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.man; }; + 15E65B5F1A1E0FC100B7FBBD /* .travis.yml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = .travis.yml; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.simpleColoring; }; + 15EA81DD1A14D58500138554 /* structure.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = structure.h; path = src/structure.h; sourceTree = SOURCE_ROOT; }; + 15EA81DE1A14D5AC00138554 /* structure.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = structure.c; path = src/structure.c; sourceTree = ""; }; + 15F1A1D018F4192D009CFE05 /* util.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; lineEnding = 0; name = util.c; path = src/util.c; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.c; }; + 15F1A1D218F4195A009CFE05 /* util.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = util.h; path = src/util.h; sourceTree = ""; }; + 15FB2BB01A1A32970052D5C5 /* encryption.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = encryption.c; path = src/encryption.c; sourceTree = ""; }; + 15FB2BB11A1A32970052D5C5 /* encryption.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encryption.h; path = src/encryption.h; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 150039B818E06BC100D33077 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 154306511CB78A3D006AB398 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1543065E1CB78BA8006AB398 /* libmobi.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1553331318E37F7000334E23 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1553332118E37FC400334E23 /* libmobi.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 157BEA722747BEDA004984B8 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 157BEA732747BEDA004984B8 /* libmobi.dylib in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 150039B218E06BC100D33077 = { + isa = PBXGroup; + children = ( + 152D509F1BD79AED00E91C09 /* tests */, + 1539675F1907BC0600EDC923 /* docs */, + 1550ADC218E427D7006F9257 /* buffer.c */, + 1550ADC418E42842006F9257 /* buffer.h */, + 1550ADCD18E4B925006F9257 /* compression.c */, + 1550ADCF18E4BB83006F9257 /* compression.h */, + 1559D790191BB06700636661 /* config.h */, + 1563314618EC36A200D4B858 /* debug.c */, + 1563314518EC367300D4B858 /* debug.h */, + 15FB2BB01A1A32970052D5C5 /* encryption.c */, + 15FB2BB11A1A32970052D5C5 /* encryption.h */, + 157DF7AC191A514D00191502 /* index.c */, + 157DF7AE191A51A400191502 /* index.h */, + 153D91DA18E9630000E807B6 /* memory.c */, + 153D91DC18E9633500E807B6 /* memory.h */, + 1504FD831CBE880B002AA042 /* meta.c */, + 1504FD841CBE880B002AA042 /* meta.h */, + 151A46651909312900FAF3F4 /* miniz.c */, + 151A46641909302C00FAF3F4 /* miniz.h */, + 150039C218E06C1B00D33077 /* mobi.h */, + 15603888192D2E1A002EDB1A /* opf.c */, + 1560388A192D2E34002EDB1A /* opf.h */, + 15AB2CB319572C2800EB7F74 /* parse_rawml.c */, + 15AB2CB519572C4400EB7F74 /* parse_rawml.h */, + 152FD1E4270509A900AF276A /* randombytes.h */, + 152FD1E5270509A900AF276A /* randombytes.c */, + 1553330018E359AE00334E23 /* read.c */, + 1553330218E359B900334E23 /* read.h */, + 1502448D1CD3A18F0075F4EC /* sha1.c */, + 1502448E1CD3A18F0075F4EC /* sha1.h */, + 15EA81DE1A14D5AC00138554 /* structure.c */, + 15EA81DD1A14D58500138554 /* structure.h */, + 15F1A1D018F4192D009CFE05 /* util.c */, + 15F1A1D218F4195A009CFE05 /* util.h */, + 150A318C18E19BF9001A7AD7 /* write.c */, + 150A318B18E19BD8001A7AD7 /* write.h */, + 156AA65B1C81A3860085335A /* xmlwriter.c */, + 156AA65C1C81A3860085335A /* xmlwriter.h */, + 1553331718E37F7100334E23 /* tools */, + 150039BC18E06BC100D33077 /* Products */, + 152E5CFE18F5DB3200B05EC9 /* autotools */, + ); + sourceTree = ""; + }; + 150039BC18E06BC100D33077 /* Products */ = { + isa = PBXGroup; + children = ( + 150039BB18E06BC100D33077 /* libmobi.dylib */, + 1553331618E37F7000334E23 /* mobitool */, + 154306541CB78A3D006AB398 /* mobimeta */, + 157BEA782747BEDA004984B8 /* mobidrm */, + ); + name = Products; + sourceTree = ""; + }; + 152D509F1BD79AED00E91C09 /* tests */ = { + isa = PBXGroup; + children = ( + 152D509E1BD79AE400E91C09 /* test.sh.in */, + 152D50A01BD7A08300E91C09 /* Makefile.am */, + ); + name = tests; + sourceTree = ""; + }; + 152E5CFE18F5DB3200B05EC9 /* autotools */ = { + isa = PBXGroup; + children = ( + 152E5D1618F5E22000B05EC9 /* autogen.sh */, + 152E5D1218F5DEB100B05EC9 /* configure.ac */, + 158F44DC191E88010000F44A /* libmobi.pc.in */, + 152E5D1518F5DECF00B05EC9 /* Makefile.am */, + 152E5D1418F5DEC000B05EC9 /* Makefile.am */, + 152E5D1318F5DEB100B05EC9 /* Makefile.am */, + ); + name = autotools; + sourceTree = ""; + }; + 1539675F1907BC0600EDC923 /* docs */ = { + isa = PBXGroup; + children = ( + 152ED797195EFBD900ACD1AD /* ChangeLog */, + 15843DFE19215D0400587C89 /* README.md */, + 15D7CFD71A167A3A00F08927 /* README.md */, + 15E65B5F1A1E0FC100B7FBBD /* .travis.yml */, + 153967601907C0AA00EDC923 /* COPYING */, + 15B4311D2767840300B7E6A7 /* mobidrm.1.in */, + 15E65B5E1A1DF1DA00B7FBBD /* mobitool.1.in */, + 15E5FAD91CC58B4D00F700D1 /* mobimeta.1.in */, + ); + name = docs; + sourceTree = ""; + }; + 1553331718E37F7100334E23 /* tools */ = { + isa = PBXGroup; + children = ( + 151185A31CB6C28500201C8A /* mobimeta.c */, + 15615F0718F58C85004EBB6E /* mobitool.c */, + 1542B8041C7FA5E800C5122F /* getopt.c */, + 1542B8051C7FA5E900C5122F /* getopt.h */, + 154C2D3E1CC64A170041DD0E /* common.c */, + 154C2D3F1CC64A170041DD0E /* common.h */, + 157BEA6B2747B4EC004984B8 /* mobidrm.c */, + ); + name = tools; + path = test; + sourceTree = SOURCE_ROOT; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 150039B918E06BC100D33077 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 15FB2BB31A1A32970052D5C5 /* encryption.h in Headers */, + 152FD1E6270509A900AF276A /* randombytes.h in Headers */, + 150244901CD3A18F0075F4EC /* sha1.h in Headers */, + 156AA65E1C81A3860085335A /* xmlwriter.h in Headers */, + 1504FD861CBE880B002AA042 /* meta.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 150039BA18E06BC100D33077 /* mobi */ = { + isa = PBXNativeTarget; + buildConfigurationList = 150039BF18E06BC100D33077 /* Build configuration list for PBXNativeTarget "mobi" */; + buildPhases = ( + 150039B718E06BC100D33077 /* Sources */, + 150039B818E06BC100D33077 /* Frameworks */, + 150039B918E06BC100D33077 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = mobi; + productName = libmobi; + productReference = 150039BB18E06BC100D33077 /* libmobi.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; + 154306531CB78A3D006AB398 /* mobimeta */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1543065A1CB78A3D006AB398 /* Build configuration list for PBXNativeTarget "mobimeta" */; + buildPhases = ( + 154306501CB78A3D006AB398 /* Sources */, + 154306511CB78A3D006AB398 /* Frameworks */, + 154306521CB78A3D006AB398 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 1543065D1CB78B78006AB398 /* PBXTargetDependency */, + ); + name = mobimeta; + productName = write_test; + productReference = 154306541CB78A3D006AB398 /* mobimeta */; + productType = "com.apple.product-type.tool"; + }; + 1553331518E37F7000334E23 /* mobitool */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1553331C18E37F7100334E23 /* Build configuration list for PBXNativeTarget "mobitool" */; + buildPhases = ( + 1553331218E37F7000334E23 /* Sources */, + 1553331318E37F7000334E23 /* Frameworks */, + 1553331418E37F7000334E23 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 1553332018E37FB800334E23 /* PBXTargetDependency */, + ); + name = mobitool; + productName = test; + productReference = 1553331618E37F7000334E23 /* mobitool */; + productType = "com.apple.product-type.tool"; + }; + 157BEA6C2747BEDA004984B8 /* mobidrm */ = { + isa = PBXNativeTarget; + buildConfigurationList = 157BEA752747BEDA004984B8 /* Build configuration list for PBXNativeTarget "mobidrm" */; + buildPhases = ( + 157BEA6F2747BEDA004984B8 /* Sources */, + 157BEA722747BEDA004984B8 /* Frameworks */, + 157BEA742747BEDA004984B8 /* CopyFiles */, + ); + buildRules = ( + ); + dependencies = ( + 157BEA6D2747BEDA004984B8 /* PBXTargetDependency */, + ); + name = mobidrm; + productName = test; + productReference = 157BEA782747BEDA004984B8 /* mobidrm */; + productType = "com.apple.product-type.tool"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 150039B318E06BC100D33077 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1420; + ORGANIZATIONNAME = "Bartek Fabiszewski"; + TargetAttributes = { + 154306531CB78A3D006AB398 = { + CreatedOnToolsVersion = 7.3; + }; + }; + }; + buildConfigurationList = 150039B618E06BC100D33077 /* Build configuration list for PBXProject "mobi" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 150039B218E06BC100D33077; + productRefGroup = 150039BC18E06BC100D33077 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 150039BA18E06BC100D33077 /* mobi */, + 1553331518E37F7000334E23 /* mobitool */, + 154306531CB78A3D006AB398 /* mobimeta */, + 157BEA6C2747BEDA004984B8 /* mobidrm */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 150039B718E06BC100D33077 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 1550ADCE18E4B925006F9257 /* compression.c in Sources */, + 15EA81DF1A14D5AC00138554 /* structure.c in Sources */, + 1563314718EC36A200D4B858 /* debug.c in Sources */, + 15F1A1D118F4192D009CFE05 /* util.c in Sources */, + 1502448F1CD3A18F0075F4EC /* sha1.c in Sources */, + 15603889192D2E1A002EDB1A /* opf.c in Sources */, + 150A318D18E19BF9001A7AD7 /* write.c in Sources */, + 1550ADC318E427D7006F9257 /* buffer.c in Sources */, + 1553330118E359AE00334E23 /* read.c in Sources */, + 157DF7AD191A514D00191502 /* index.c in Sources */, + 153D91DB18E9630000E807B6 /* memory.c in Sources */, + 156AA65D1C81A3860085335A /* xmlwriter.c in Sources */, + 15AB2CB419572C2800EB7F74 /* parse_rawml.c in Sources */, + 152FD1E7270509A900AF276A /* randombytes.c in Sources */, + 15FB2BB21A1A32970052D5C5 /* encryption.c in Sources */, + 1504FD851CBE880B002AA042 /* meta.c in Sources */, + 151A46661909312900FAF3F4 /* miniz.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 154306501CB78A3D006AB398 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 154C2D411CC64A170041DD0E /* common.c in Sources */, + 1543065B1CB78A45006AB398 /* mobimeta.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 1553331218E37F7000334E23 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 154C2D401CC64A170041DD0E /* common.c in Sources */, + 15615F0818F58C85004EBB6E /* mobitool.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 157BEA6F2747BEDA004984B8 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 157BEA8A2747BF26004984B8 /* common.c in Sources */, + 157BEA852747BF13004984B8 /* mobidrm.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 1543065D1CB78B78006AB398 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 150039BA18E06BC100D33077 /* mobi */; + targetProxy = 1543065C1CB78B78006AB398 /* PBXContainerItemProxy */; + }; + 1553332018E37FB800334E23 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 150039BA18E06BC100D33077 /* mobi */; + targetProxy = 1553331F18E37FB800334E23 /* PBXContainerItemProxy */; + }; + 157BEA6D2747BEDA004984B8 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 150039BA18E06BC100D33077 /* mobi */; + targetProxy = 157BEA6E2747BEDA004984B8 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 150039BD18E06BC100D33077 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_GCD_PERFORMANCE = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_CXX_LIBRARY = "compiler-default"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ASSIGN_ENUM = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_COMPLETION_HANDLER_MISUSE = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_FRAMEWORK_INCLUDE_PRIVATE_FROM_PUBLIC = YES; + CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = "compiler-default"; + GCC_DYNAMIC_NO_PIC = NO; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; + GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_PEDANTIC = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + /usr/include/libxml2, + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + ONLY_ACTIVE_ARCH = YES; + OTHER_CFLAGS = ( + "-DHAVE_CONFIG_H", + "-DHAVE_STRDUP", + ); + OTHER_LDFLAGS = "-lz"; + SDKROOT = macosx; + USER_HEADER_SEARCH_PATHS = ""; + }; + name = Debug; + }; + 150039BE18E06BC100D33077 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_GCD_PERFORMANCE = YES; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; + CLANG_CXX_LANGUAGE_STANDARD = "compiler-default"; + CLANG_CXX_LIBRARY = "compiler-default"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ASSIGN_ENUM = NO; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_COMPLETION_HANDLER_MISUSE = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_FRAMEWORK_INCLUDE_PRIVATE_FROM_PUBLIC = YES; + CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NULLABLE_TO_NONNULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SEMICOLON_BEFORE_METHOD_BODY = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES_AGGRESSIVE; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = YES; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = "compiler-default"; + GCC_ENABLE_OBJC_EXCEPTIONS = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; + GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; + GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = NO; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_FOUR_CHARACTER_CONSTANTS = YES; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_PEDANTIC = YES; + GCC_WARN_SHADOW = YES; + GCC_WARN_SIGN_COMPARE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNKNOWN_PRAGMAS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; + GCC_WARN_UNUSED_PARAMETER = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + /usr/include/libxml2, + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + ONLY_ACTIVE_ARCH = NO; + OTHER_CFLAGS = ( + "-DHAVE_CONFIG_H", + "-DHAVE_STRDUP", + ); + OTHER_LDFLAGS = "-lz"; + SDKROOT = macosx; + USER_HEADER_SEARCH_PATHS = ""; + }; + name = Release; + }; + 150039C018E06BC100D33077 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; + EXECUTABLE_PREFIX = lib; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/libxml2, + ); + OTHER_CFLAGS = ( + "-DHAVE_CONFIG_H", + "-DHAVE_STRDUP", + ); + OTHER_LDFLAGS = ( + "-lxml2", + "-lz", + ); + PRODUCT_NAME = mobi; + }; + name = Debug; + }; + 150039C118E06BC100D33077 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COMBINE_HIDPI_IMAGES = YES; + DEAD_CODE_STRIPPING = YES; + EXECUTABLE_PREFIX = lib; + GCC_OPTIMIZATION_LEVEL = 3; + GCC_WARN_ABOUT_DEPRECATED_FUNCTIONS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/libxml2, + ); + OTHER_LDFLAGS = ( + "-lxml2", + "-lz", + ); + PRODUCT_NAME = mobi; + }; + name = Release; + }; + 154306581CB78A3D006AB398 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_IDENTITY = "-"; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ./src, + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 154306591CB78A3D006AB398 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_WARN_UNREACHABLE_CODE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = YES; + DEAD_CODE_STRIPPING = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + ./src, + ); + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 1553331D18E37F7100334E23 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; + CODE_SIGN_IDENTITY = "-"; + DEAD_CODE_STRIPPING = YES; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + HEADER_SEARCH_PATHS = ./src; + "HEADER_SEARCH_PATHS[arch=*]" = ./src; + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_NAME = mobitool; + }; + name = Debug; + }; + 1553331E18E37F7100334E23 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; + CODE_SIGN_IDENTITY = "-"; + DEAD_CODE_STRIPPING = YES; + FRAMEWORK_SEARCH_PATHS = ""; + HEADER_SEARCH_PATHS = ./src; + MACOSX_DEPLOYMENT_TARGET = 10.15; + PRODUCT_NAME = mobitool; + }; + name = Release; + }; + 157BEA762747BEDA004984B8 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; + CODE_SIGN_IDENTITY = "-"; + DEAD_CODE_STRIPPING = YES; + FRAMEWORK_SEARCH_PATHS = ""; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + HEADER_SEARCH_PATHS = ./src; + "HEADER_SEARCH_PATHS[arch=*]" = ./src; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 157BEA772747BEDA004984B8 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_SECURITY_FLOATLOOPCOUNTER = YES; + CODE_SIGN_IDENTITY = "-"; + DEAD_CODE_STRIPPING = YES; + FRAMEWORK_SEARCH_PATHS = ""; + HEADER_SEARCH_PATHS = ./src; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 150039B618E06BC100D33077 /* Build configuration list for PBXProject "mobi" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 150039BD18E06BC100D33077 /* Debug */, + 150039BE18E06BC100D33077 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 150039BF18E06BC100D33077 /* Build configuration list for PBXNativeTarget "mobi" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 150039C018E06BC100D33077 /* Debug */, + 150039C118E06BC100D33077 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1543065A1CB78A3D006AB398 /* Build configuration list for PBXNativeTarget "mobimeta" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 154306581CB78A3D006AB398 /* Debug */, + 154306591CB78A3D006AB398 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1553331C18E37F7100334E23 /* Build configuration list for PBXNativeTarget "mobitool" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1553331D18E37F7100334E23 /* Debug */, + 1553331E18E37F7100334E23 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 157BEA752747BEDA004984B8 /* Build configuration list for PBXNativeTarget "mobidrm" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 157BEA762747BEDA004984B8 /* Debug */, + 157BEA772747BEDA004984B8 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 150039B318E06BC100D33077 /* Project object */; +} diff --git a/app/src/main/cpp/libmobi/msvc/libmobi.sln b/app/src/main/cpp/libmobi/msvc/libmobi.sln new file mode 100644 index 0000000..21a1863 --- /dev/null +++ b/app/src/main/cpp/libmobi/msvc/libmobi.sln @@ -0,0 +1,97 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.32328.378 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libmobi", "libmobi.vcxproj", "{A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mobidrm", "mobidrm\mobidrm.vcxproj", "{288A84A9-2AFD-4995-A397-E4554C8087AE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mobitool", "mobitool\mobitool.vcxproj", "{D8E9C708-FBD0-400C-B5B6-F8555FDE8767}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "mobimeta", "mobimeta\mobimeta.vcxproj", "{2790D05E-6891-48E5-8450-F8D030763AD6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + NoDependenciesDebug|x64 = NoDependenciesDebug|x64 + NoDependenciesDebug|x86 = NoDependenciesDebug|x86 + NoDependenciesRelease|x64 = NoDependenciesRelease|x64 + NoDependenciesRelease|x86 = NoDependenciesRelease|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.Debug|x64.ActiveCfg = Debug|x64 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.Debug|x64.Build.0 = Debug|x64 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.Debug|x86.ActiveCfg = Debug|Win32 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.Debug|x86.Build.0 = Debug|Win32 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.NoDependenciesDebug|x64.ActiveCfg = NoDependenciesDebug|x64 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.NoDependenciesDebug|x64.Build.0 = NoDependenciesDebug|x64 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.NoDependenciesDebug|x86.ActiveCfg = NoDependenciesDebug|Win32 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.NoDependenciesDebug|x86.Build.0 = NoDependenciesDebug|Win32 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.NoDependenciesRelease|x64.ActiveCfg = NoDependenciesRelease|x64 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.NoDependenciesRelease|x64.Build.0 = NoDependenciesRelease|x64 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.NoDependenciesRelease|x86.ActiveCfg = NoDependenciesRelease|Win32 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.NoDependenciesRelease|x86.Build.0 = NoDependenciesRelease|Win32 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.Release|x64.ActiveCfg = Release|x64 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.Release|x64.Build.0 = Release|x64 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.Release|x86.ActiveCfg = Release|Win32 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F}.Release|x86.Build.0 = Release|Win32 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.Debug|x64.ActiveCfg = Debug|x64 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.Debug|x64.Build.0 = Debug|x64 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.Debug|x86.ActiveCfg = Debug|Win32 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.Debug|x86.Build.0 = Debug|Win32 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.NoDependenciesDebug|x64.ActiveCfg = Debug|x64 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.NoDependenciesDebug|x64.Build.0 = Debug|x64 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.NoDependenciesDebug|x86.ActiveCfg = Debug|Win32 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.NoDependenciesDebug|x86.Build.0 = Debug|Win32 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.NoDependenciesRelease|x64.ActiveCfg = Release|x64 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.NoDependenciesRelease|x64.Build.0 = Release|x64 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.NoDependenciesRelease|x86.ActiveCfg = Release|Win32 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.NoDependenciesRelease|x86.Build.0 = Release|Win32 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.Release|x64.ActiveCfg = Release|x64 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.Release|x64.Build.0 = Release|x64 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.Release|x86.ActiveCfg = Release|Win32 + {288A84A9-2AFD-4995-A397-E4554C8087AE}.Release|x86.Build.0 = Release|Win32 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.Debug|x64.ActiveCfg = Debug|x64 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.Debug|x64.Build.0 = Debug|x64 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.Debug|x86.ActiveCfg = Debug|Win32 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.Debug|x86.Build.0 = Debug|Win32 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.NoDependenciesDebug|x64.ActiveCfg = Debug|x64 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.NoDependenciesDebug|x64.Build.0 = Debug|x64 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.NoDependenciesDebug|x86.ActiveCfg = Debug|Win32 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.NoDependenciesDebug|x86.Build.0 = Debug|Win32 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.NoDependenciesRelease|x64.ActiveCfg = Release|x64 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.NoDependenciesRelease|x64.Build.0 = Release|x64 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.NoDependenciesRelease|x86.ActiveCfg = Release|Win32 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.NoDependenciesRelease|x86.Build.0 = Release|Win32 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.Release|x64.ActiveCfg = Release|x64 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.Release|x64.Build.0 = Release|x64 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.Release|x86.ActiveCfg = Release|Win32 + {D8E9C708-FBD0-400C-B5B6-F8555FDE8767}.Release|x86.Build.0 = Release|Win32 + {2790D05E-6891-48E5-8450-F8D030763AD6}.Debug|x64.ActiveCfg = Debug|x64 + {2790D05E-6891-48E5-8450-F8D030763AD6}.Debug|x64.Build.0 = Debug|x64 + {2790D05E-6891-48E5-8450-F8D030763AD6}.Debug|x86.ActiveCfg = Debug|Win32 + {2790D05E-6891-48E5-8450-F8D030763AD6}.Debug|x86.Build.0 = Debug|Win32 + {2790D05E-6891-48E5-8450-F8D030763AD6}.NoDependenciesDebug|x64.ActiveCfg = Debug|x64 + {2790D05E-6891-48E5-8450-F8D030763AD6}.NoDependenciesDebug|x64.Build.0 = Debug|x64 + {2790D05E-6891-48E5-8450-F8D030763AD6}.NoDependenciesDebug|x86.ActiveCfg = Debug|Win32 + {2790D05E-6891-48E5-8450-F8D030763AD6}.NoDependenciesDebug|x86.Build.0 = Debug|Win32 + {2790D05E-6891-48E5-8450-F8D030763AD6}.NoDependenciesRelease|x64.ActiveCfg = Release|x64 + {2790D05E-6891-48E5-8450-F8D030763AD6}.NoDependenciesRelease|x64.Build.0 = Release|x64 + {2790D05E-6891-48E5-8450-F8D030763AD6}.NoDependenciesRelease|x86.ActiveCfg = Release|Win32 + {2790D05E-6891-48E5-8450-F8D030763AD6}.NoDependenciesRelease|x86.Build.0 = Release|Win32 + {2790D05E-6891-48E5-8450-F8D030763AD6}.Release|x64.ActiveCfg = Release|x64 + {2790D05E-6891-48E5-8450-F8D030763AD6}.Release|x64.Build.0 = Release|x64 + {2790D05E-6891-48E5-8450-F8D030763AD6}.Release|x86.ActiveCfg = Release|Win32 + {2790D05E-6891-48E5-8450-F8D030763AD6}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {673B11AC-E877-465E-89D0-97CAA6C1B389} + EndGlobalSection +EndGlobal diff --git a/app/src/main/cpp/libmobi/msvc/libmobi.vcxproj b/app/src/main/cpp/libmobi/msvc/libmobi.vcxproj new file mode 100644 index 0000000..091b47d --- /dev/null +++ b/app/src/main/cpp/libmobi/msvc/libmobi.vcxproj @@ -0,0 +1,395 @@ + + + + + Debug + Win32 + + + NoDependenciesDebug + Win32 + + + NoDependenciesDebug + x64 + + + NoDependenciesRelease + Win32 + + + NoDependenciesRelease + x64 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + {A48F597C-ADBC-499E-B282-0F8A2B1A4B5F} + Win32Proj + 10.0.19041.0 + + + + StaticLibrary + true + v140 + + + StaticLibrary + true + v140 + + + StaticLibrary + true + v140 + + + StaticLibrary + false + v140 + + + StaticLibrary + true + v140 + + + StaticLibrary + true + v140 + + + StaticLibrary + true + v140 + + + StaticLibrary + false + v140 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + static + + + true + static + + + true + static + + + true + static + + + static + + + static + + + static + + + static + + + + HAVE_CONFIG_H;USE_XMLWRITER;USE_ENCRYPTION;MOBI_DEBUG=1;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + Level3 + ProgramDatabase + Disabled + + + MachineX86 + true + Windows + + + + + for /f "tokens=4 delims=[]" %%a in ('type "$(SolutionDir)..\configure.ac" ^| find "AC_INIT"') do ( + set version=%%a +) +echo Compiling libmobi version %version% +echo #define PACKAGE_VERSION "%version%" > "$(SolutionDir)..\config.h" + + + + + HAVE_CONFIG_H;USE_XMLWRITER;USE_ENCRYPTION;MOBI_DEBUG=1;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + Level3 + ProgramDatabase + Disabled + + + MachineX86 + true + Windows + + + + + for /f "tokens=4 delims=[]" %%a in ('type "$(SolutionDir)..\configure.ac" ^| find "AC_INIT"') do ( + set version=%%a +) +echo Compiling libmobi version %version% +echo #define PACKAGE_VERSION "%version%" > "$(SolutionDir)..\config.h" + + + + + HAVE_CONFIG_H;USE_XMLWRITER;USE_ENCRYPTION;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + Level3 + ProgramDatabase + MaxSpeed + Default + MultiThreadedDLL + false + + + MachineX86 + true + Windows + + + + + for /f "tokens=4 delims=[]" %%a in ('type "$(SolutionDir)..\configure.ac" ^| find "AC_INIT"') do ( + set version=%%a +) +echo Compiling libmobi version %version% +echo #define PACKAGE_VERSION "%version%" > "$(SolutionDir)..\config.h" + + + + + HAVE_CONFIG_H;USE_XMLWRITER;USE_ENCRYPTION;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + Level3 + ProgramDatabase + + + MachineX86 + true + Windows + true + true + + + + + for /f "tokens=4 delims=[]" %%a in ('type "$(SolutionDir)..\configure.ac" ^| find "AC_INIT"') do ( + set version=%%a +) +echo Compiling libmobi version %version% +echo #define PACKAGE_VERSION "%version%" > "$(SolutionDir)..\config.h" + + + + + + HAVE_CONFIG_H;USE_XMLWRITER;USE_ENCRYPTION;MOBI_DEBUG=1;%(PreprocessorDefinitions) + + + + + for /f "tokens=4 delims=[]" %%a in ('type "$(SolutionDir)..\configure.ac" ^| find "AC_INIT"') do ( + set version=%%a +) +echo Compiling libmobi version %version% +echo #define PACKAGE_VERSION "%version%" > "$(SolutionDir)..\config.h" + + + + + + HAVE_CONFIG_H;USE_XMLWRITER;USE_ENCRYPTION;MOBI_DEBUG=1;%(PreprocessorDefinitions) + + + + + for /f "tokens=4 delims=[]" %%a in ('type "$(SolutionDir)..\configure.ac" ^| find "AC_INIT"') do ( + set version=%%a +) +echo Compiling libmobi version %version% +echo #define PACKAGE_VERSION "%version%" > "$(SolutionDir)..\config.h" + + + + + + HAVE_CONFIG_H;USE_XMLWRITER;USE_ENCRYPTION;%(PreprocessorDefinitions) + Default + MultiThreadedDLL + ProgramDatabase + MaxSpeed + false + + + + + for /f "tokens=4 delims=[]" %%a in ('type "$(SolutionDir)..\configure.ac" ^| find "AC_INIT"') do ( + set version=%%a +) +echo Compiling libmobi version %version% +echo #define PACKAGE_VERSION "%version%" > "$(SolutionDir)..\config.h" + + + + + + HAVE_CONFIG_H;USE_XMLWRITER;USE_ENCRYPTION;%(PreprocessorDefinitions) + + + + + for /f "tokens=4 delims=[]" %%a in ('type "$(SolutionDir)..\configure.ac" ^| find "AC_INIT"') do ( + set version=%%a +) +echo Compiling libmobi version %version% +echo #define PACKAGE_VERSION "%version%" > "$(SolutionDir)..\config.h" + + + + + + + + + + + + true + false + false + true + true + false + false + true + + + + + + + + + + + true + false + false + true + true + false + false + true + + + + + + + + + + + + + true + false + false + true + true + false + false + true + + + + + + + + + + + + true + false + false + true + true + false + false + true + + + + + true + true + true + true + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/app/src/main/cpp/libmobi/msvc/mobidrm/mobidrm.vcxproj b/app/src/main/cpp/libmobi/msvc/mobidrm/mobidrm.vcxproj new file mode 100644 index 0000000..eaffde6 --- /dev/null +++ b/app/src/main/cpp/libmobi/msvc/mobidrm/mobidrm.vcxproj @@ -0,0 +1,182 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + {a48f597c-adbc-499e-b282-0f8a2b1a4b5f} + + + + + + + 16.0 + Win32Proj + {288a84a9-2afd-4995-a397-e4554c8087ae} + mobidrm + 10.0.19041.0 + + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + + + + + + + + + + + + + + + + + + + static + + + static + + + static + + + static + + + + Level3 + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;MOBI_DEBUG=1;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmtd.lib + + + + + Level3 + true + true + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + true + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmt.lib + + + + + Level3 + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;MOBI_DEBUG=1;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmtd.lib + + + + + Level3 + true + true + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + true + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmt.lib + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/app/src/main/cpp/libmobi/msvc/mobidrm/packages.config b/app/src/main/cpp/libmobi/msvc/mobidrm/packages.config new file mode 100644 index 0000000..47f6f2c --- /dev/null +++ b/app/src/main/cpp/libmobi/msvc/mobidrm/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/cpp/libmobi/msvc/mobimeta/mobimeta.vcxproj b/app/src/main/cpp/libmobi/msvc/mobimeta/mobimeta.vcxproj new file mode 100644 index 0000000..6d5ca02 --- /dev/null +++ b/app/src/main/cpp/libmobi/msvc/mobimeta/mobimeta.vcxproj @@ -0,0 +1,182 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + {a48f597c-adbc-499e-b282-0f8a2b1a4b5f} + + + + + + + 16.0 + Win32Proj + {2790d05e-6891-48e5-8450-f8d030763ad6} + mobimeta + 10.0.19041.0 + + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + + + + + + + + + + + + + + + + + + + static + + + static + + + static + + + static + + + + Level3 + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;MOBI_DEBUG=1;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmtd.lib + + + + + Level3 + true + true + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + true + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmt.lib + + + + + Level3 + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;MOBI_DEBUG=1;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmtd.lib + + + + + Level3 + true + true + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + true + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmt.lib + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/app/src/main/cpp/libmobi/msvc/mobimeta/packages.config b/app/src/main/cpp/libmobi/msvc/mobimeta/packages.config new file mode 100644 index 0000000..47f6f2c --- /dev/null +++ b/app/src/main/cpp/libmobi/msvc/mobimeta/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/cpp/libmobi/msvc/mobitool/mobitool.vcxproj b/app/src/main/cpp/libmobi/msvc/mobitool/mobitool.vcxproj new file mode 100644 index 0000000..37ae35f --- /dev/null +++ b/app/src/main/cpp/libmobi/msvc/mobitool/mobitool.vcxproj @@ -0,0 +1,184 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + + + + + + + + + + {a48f597c-adbc-499e-b282-0f8a2b1a4b5f} + + + + + + + 16.0 + Win32Proj + {d8e9c708-fbd0-400c-b5b6-f8555fde8767} + mobitool + 10.0.19041.0 + + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + Application + true + v140 + Unicode + + + Application + false + v140 + true + Unicode + + + + + + + + + + + + + + + + + + + + + static + + + static + + + static + + + static + + + + Level3 + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;MOBI_DEBUG=1;MOBI_DEBUG=1WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmtd.lib + + + + + Level3 + true + true + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + true + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmt.lib + + + + + Level3 + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;MOBI_DEBUG=1;MOBI_DEBUG=1_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmtd.lib + + + + + Level3 + true + true + true + USE_XMLWRITER;USE_ENCRYPTION;_CRT_SECURE_NO_WARNINGS;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + $(SolutionDir)\..\src + + + Console + true + true + true + ws2_32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + /NODEFAULTLIB:libcmt.lib + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + \ No newline at end of file diff --git a/app/src/main/cpp/libmobi/msvc/mobitool/packages.config b/app/src/main/cpp/libmobi/msvc/mobitool/packages.config new file mode 100644 index 0000000..47f6f2c --- /dev/null +++ b/app/src/main/cpp/libmobi/msvc/mobitool/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/cpp/libmobi/msvc/packages.config b/app/src/main/cpp/libmobi/msvc/packages.config new file mode 100644 index 0000000..47f6f2c --- /dev/null +++ b/app/src/main/cpp/libmobi/msvc/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/cpp/libmobi/src/CMakeLists.txt b/app/src/main/cpp/libmobi/src/CMakeLists.txt new file mode 100644 index 0000000..17cb530 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/CMakeLists.txt @@ -0,0 +1,87 @@ +# Copyright (c) 2022 Bartek Fabiszewski +# http://www.fabiszewski.net +# +# This file is part of libmobi. +# Licensed under LGPL, either version 3, or any later. +# See + +set(mobi_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/buffer.c + ${CMAKE_CURRENT_SOURCE_DIR}/buffer.h + ${CMAKE_CURRENT_SOURCE_DIR}/compression.c + ${CMAKE_CURRENT_SOURCE_DIR}/compression.h + ${CMAKE_CURRENT_SOURCE_DIR}/config.h + ${CMAKE_CURRENT_SOURCE_DIR}/debug.c + ${CMAKE_CURRENT_SOURCE_DIR}/debug.h + ${CMAKE_CURRENT_SOURCE_DIR}/index.c + ${CMAKE_CURRENT_SOURCE_DIR}/index.h + ${CMAKE_CURRENT_SOURCE_DIR}/memory.c + ${CMAKE_CURRENT_SOURCE_DIR}/memory.h + ${CMAKE_CURRENT_SOURCE_DIR}/meta.c + ${CMAKE_CURRENT_SOURCE_DIR}/meta.h + ${CMAKE_CURRENT_SOURCE_DIR}/mobi.h + ${CMAKE_CURRENT_SOURCE_DIR}/parse_rawml.c + ${CMAKE_CURRENT_SOURCE_DIR}/parse_rawml.h + ${CMAKE_CURRENT_SOURCE_DIR}/read.c + ${CMAKE_CURRENT_SOURCE_DIR}/read.h + ${CMAKE_CURRENT_SOURCE_DIR}/structure.c + ${CMAKE_CURRENT_SOURCE_DIR}/structure.h + ${CMAKE_CURRENT_SOURCE_DIR}/util.c + ${CMAKE_CURRENT_SOURCE_DIR}/util.h + ${CMAKE_CURRENT_SOURCE_DIR}/write.c + ${CMAKE_CURRENT_SOURCE_DIR}/write.h +) + +if(USE_ENCRYPTION) + list(APPEND mobi_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/encryption.c + ${CMAKE_CURRENT_SOURCE_DIR}/encryption.h + ${CMAKE_CURRENT_SOURCE_DIR}/sha1.c + ${CMAKE_CURRENT_SOURCE_DIR}/sha1.h + ${CMAKE_CURRENT_SOURCE_DIR}/randombytes.c + ${CMAKE_CURRENT_SOURCE_DIR}/randombytes.h) +endif(USE_ENCRYPTION) + +if(USE_XMLWRITER) + list(APPEND mobi_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/opf.c + ${CMAKE_CURRENT_SOURCE_DIR}/opf.h) + if(NOT USE_LIBXML2) + list(APPEND mobi_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/xmlwriter.c + ${CMAKE_CURRENT_SOURCE_DIR}/xmlwriter.h) + endif(NOT USE_LIBXML2) +endif(USE_XMLWRITER) + + +add_library(mobi ${mobi_SOURCES}) + +set_target_properties(mobi PROPERTIES + OUTPUT_NAME "mobi" + SOVERSION ${PACKAGE_VERSION_MAJOR} + VERSION "${PACKAGE_VERSION}" + POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS} + C_VISIBILITY_PRESET hidden + VISIBILITY_INLINES_HIDDEN ON + MACOSX_RPATH 1) + +if(USE_MINIZ) + set(miniz_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/miniz.c + ${CMAKE_CURRENT_SOURCE_DIR}/miniz.h + ) + add_library(miniz OBJECT ${miniz_SOURCES}) + target_compile_definitions(miniz PRIVATE + MINIZ_NO_STDIO + MINIZ_NO_ZLIB_COMPATIBLE_NAMES + MINIZ_NO_TIME + MINIZ_NO_ARCHIVE_APIS + MINIZ_NO_ARCHIVE_WRITING_APIS + _POSIX_C_SOURCE=200112L) + target_link_libraries(mobi PRIVATE miniz) +endif(USE_MINIZ) + +if(USE_LIBXML2) + target_link_libraries(mobi PUBLIC LibXml2::LibXml2) +endif(USE_LIBXML2) + +if(USE_ZLIB) + target_link_libraries(mobi PUBLIC ZLIB::ZLIB) +endif(USE_ZLIB) diff --git a/app/src/main/cpp/libmobi/src/Makefile.am b/app/src/main/cpp/libmobi/src/Makefile.am new file mode 100644 index 0000000..14b89f5 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/Makefile.am @@ -0,0 +1,27 @@ +# libmobi + +lib_LTLIBRARIES = libmobi.la +libmobi_la_SOURCES = buffer.c buffer.h compression.c compression.h config.h debug.c debug.h index.c index.h memory.c memory.h \ +meta.c meta.h parse_rawml.c parse_rawml.h read.c read.h structure.c structure.h util.c util.h write.c write.h + +if USE_XMLWRITER +libmobi_la_SOURCES += opf.c opf.h +if !USE_LIBXML2 +libmobi_la_SOURCES += xmlwriter.c xmlwriter.h +endif +endif +if USE_ENCRYPTION +libmobi_la_SOURCES += encryption.c encryption.h randombytes.c randombytes.h sha1.c sha1.h +endif +EXTRA_LTLIBRARIES = libminiz.la +libminiz_la_SOURCES = miniz.c miniz.h +libminiz_la_CFLAGS = $(VISIBILITY_HIDDEN) $(MINIZ_CFLAGS) \ +-DMINIZ_NO_STDIO -DMINIZ_NO_ZLIB_COMPATIBLE_NAMES \ +-DMINIZ_NO_TIME -DMINIZ_NO_ARCHIVE_APIS -DMINIZ_NO_ARCHIVE_WRITING_APIS +libminiz_la_LDFLAGS = +if USE_MINIZ +libmobi_la_LIBADD = libminiz.la +endif +include_HEADERS = mobi.h +libmobi_la_LDFLAGS = $(AVOID_VERSION) $(NO_UNDEFINED) $(DARWIN_LDFLAGS) $(LIBZ_LDFLAGS) $(LIBXML2_LDFLAGS) +libmobi_la_CFLAGS = $(VISIBILITY_HIDDEN) $(ISO99_SOURCE) $(DEBUG_CFLAGS) $(LIBXML2_CFLAGS) diff --git a/app/src/main/cpp/libmobi/src/buffer.c b/app/src/main/cpp/libmobi/src/buffer.c new file mode 100644 index 0000000..d469187 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/buffer.c @@ -0,0 +1,637 @@ +/** @file buffer.c + * @brief Functions to read/write raw big endian data + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#include +#include +#include "buffer.h" +#include "debug.h" + +/** + @brief Initializer for MOBIBuffer structure + + It allocates memory for structure and for data. + Memory should be freed with mobi_buffer_free(). + + @param[in] len Size of data to be allocated for the buffer + @return MOBIBuffer on success, NULL otherwise + */ +MOBIBuffer * mobi_buffer_init(const size_t len) { + unsigned char *data = malloc(len); + if (data == NULL) { + debug_print("%s", "Buffer data allocation failed\n"); + return NULL; + } + MOBIBuffer *buf = mobi_buffer_init_null(data, len); + if (buf == NULL) { + free(data); + } + return buf; +} + +/** + @brief Initializer for MOBIBuffer structure + + It allocates memory for structure but, unlike mobi_buffer_init(), it does not allocate memory for data. + Instead it works on external data. + Memory should be freed with mobi_buffer_free_null() (buf->data will not be deallocated). + + @param[in,out] data Set data as buffer data + @param[in] len Size of data held by the buffer + @return MOBIBuffer on success, NULL otherwise + */ +MOBIBuffer * mobi_buffer_init_null(unsigned char *data, const size_t len) { + MOBIBuffer *buf = malloc(sizeof(MOBIBuffer)); + if (buf == NULL) { + debug_print("%s", "Buffer allocation failed\n"); + return NULL; + } + buf->data = data; + buf->offset = 0; + buf->maxlen = len; + buf->error = MOBI_SUCCESS; + return buf; +} + +/** + @brief Resize buffer + + Smaller size than offset will cause data truncation. + + @param[in,out] buf MOBIBuffer structure to be filled with data + @param[in] newlen New buffer size + */ +void mobi_buffer_resize(MOBIBuffer *buf, const size_t newlen) { + unsigned char *tmp = realloc(buf->data, newlen); + if (tmp == NULL) { + debug_print("%s", "Buffer allocation failed\n"); + buf->error = MOBI_MALLOC_FAILED; + return; + } + buf->data = tmp; + buf->maxlen = newlen; + if (buf->offset >= newlen) { + buf->offset = newlen - 1; + } + debug_print("Buffer successfully resized to %zu\n", newlen); + buf->error = MOBI_SUCCESS; +} + +/** + @brief Adds 8-bit value to MOBIBuffer + + @param[in,out] buf MOBIBuffer structure to be filled with data + @param[in] data Integer to be put into the buffer + */ +void mobi_buffer_add8(MOBIBuffer *buf, const uint8_t data) { + if (buf->offset + 1 > buf->maxlen) { + debug_print("%s", "Buffer full\n"); + buf->error = MOBI_BUFFER_END; + return; + } + buf->data[buf->offset++] = data; +} + +/** + @brief Adds 16-bit value to MOBIBuffer + + @param[in,out] buf MOBIBuffer structure to be filled with data + @param[in] data Integer to be put into the buffer + */ +void mobi_buffer_add16(MOBIBuffer *buf, const uint16_t data) { + if (buf->offset + 2 > buf->maxlen) { + debug_print("%s", "Buffer full\n"); + buf->error = MOBI_BUFFER_END; + return; + } + unsigned char *buftr = buf->data + buf->offset; + *buftr++ = (uint8_t)((uint32_t)(data & 0xff00U) >> 8); + *buftr = (uint8_t)((uint32_t)(data & 0xffU)); + buf->offset += 2; +} + +/** + @brief Adds 32-bit value to MOBIBuffer + + @param[in,out] buf MOBIBuffer structure to be filled with data + @param[in] data Integer to be put into the buffer + */ +void mobi_buffer_add32(MOBIBuffer *buf, const uint32_t data) { + if (buf->offset + 4 > buf->maxlen) { + debug_print("%s", "Buffer full\n"); + buf->error = MOBI_BUFFER_END; + return; + } + unsigned char *buftr = buf->data + buf->offset; + *buftr++ = (uint8_t)((uint32_t)(data & 0xff000000U) >> 24); + *buftr++ = (uint8_t)((uint32_t)(data & 0xff0000U) >> 16); + *buftr++ = (uint8_t)((uint32_t)(data & 0xff00U) >> 8); + *buftr = (uint8_t)((uint32_t)(data & 0xffU)); + buf->offset += 4; +} + +/** + @brief Adds raw data to MOBIBuffer + + @param[in,out] buf MOBIBuffer structure to be filled with data + @param[in] data Pointer to read data + @param[in] len Size of the read data + */ +void mobi_buffer_addraw(MOBIBuffer *buf, const unsigned char* data, const size_t len) { + if (buf->offset + len > buf->maxlen) { + debug_print("%s", "Buffer full\n"); + buf->error = MOBI_BUFFER_END; + return; + } + memcpy(buf->data + buf->offset, data, len); + buf->offset += len; +} + +/** + @brief Adds string to MOBIBuffer without null terminator + + @param[in,out] buf MOBIBuffer structure to be filled with data + @param[in] str Pointer to string + */ +void mobi_buffer_addstring(MOBIBuffer *buf, const char *str) { + const size_t len = strlen(str); + mobi_buffer_addraw(buf, (const unsigned char *) str, len); +} + +/** + @brief Adds count of zeroes to MOBIBuffer + + @param[in,out] buf MOBIBuffer structure to be filled with data + @param[in] count Number of zeroes to be put into the buffer + */ +void mobi_buffer_addzeros(MOBIBuffer *buf, const size_t count) { + if (buf->offset + count > buf->maxlen) { + debug_print("%s", "Buffer full\n"); + buf->error = MOBI_BUFFER_END; + return; + } + memset(buf->data + buf->offset, 0, count); + buf->offset += count; +} + +/** + @brief Reads 8-bit value from MOBIBuffer + + @param[in] buf MOBIBuffer structure containing data + @return Read value, 0 if end of buffer is encountered + */ +uint8_t mobi_buffer_get8(MOBIBuffer *buf) { + if (buf->offset + 1 > buf->maxlen) { + debug_print("%s", "End of buffer\n"); + buf->error = MOBI_BUFFER_END; + return 0; + } + return buf->data[buf->offset++]; +} + +/** + @brief Reads 16-bit value from MOBIBuffer + + @param[in] buf MOBIBuffer structure containing data + @return Read value, 0 if end of buffer is encountered + */ +uint16_t mobi_buffer_get16(MOBIBuffer *buf) { + if (buf->offset + 2 > buf->maxlen) { + debug_print("%s", "End of buffer\n"); + buf->error = MOBI_BUFFER_END; + return 0; + } + uint16_t val; + val = (uint16_t)((uint16_t) buf->data[buf->offset] << 8 | (uint16_t) buf->data[buf->offset + 1]); + buf->offset += 2; + return val; +} + +/** + @brief Reads 32-bit value from MOBIBuffer + + @param[in] buf MOBIBuffer structure containing data + @return Read value, 0 if end of buffer is encountered + */ +uint32_t mobi_buffer_get32(MOBIBuffer *buf) { + if (buf->offset + 4 > buf->maxlen) { + debug_print("%s", "End of buffer\n"); + buf->error = MOBI_BUFFER_END; + return 0; + } + uint32_t val; + val = (uint32_t) buf->data[buf->offset] << 24 | (uint32_t) buf->data[buf->offset + 1] << 16 | (uint32_t) buf->data[buf->offset + 2] << 8 | (uint32_t) buf->data[buf->offset + 3]; + buf->offset += 4; + return val; +} + +/** + @brief Reads variable length value from MOBIBuffer + + Internal function for wrappers: + mobi_buffer_get_varlen(); + mobi_buffer_get_varlen_dec(); + + Reads maximum 4 bytes from the buffer. Stops when byte has bit 7 set. + + This function has a limitation while reading backwards. + In such case it will not read first byte in a buffer, as it would cause buffer offset to underflow. + That means that going bacwards it cannot read variable length values that are placed at the beginning of a buffer. + This will result in an error. + + @param[in] buf MOBIBuffer structure containing data + @param[out] len Value will be increased by number of bytes read + @param[in] direction 1 - read buffer forward, -1 - read buffer backwards + @return Read value, 0 if end of buffer is encountered + */ +static uint32_t mobi_buffer_get_varlen_internal(MOBIBuffer *buf, size_t *len, const int direction) { + bool has_stop = false; + uint32_t val = 0; + uint8_t byte_count = 0; + size_t max_count = direction == 1 ? buf->maxlen - buf->offset : buf->offset; + if (buf->offset < buf->maxlen && max_count) { + max_count = max_count < 4 ? max_count : 4; + uint8_t byte; + const uint8_t stop_flag = 0x80; + const uint8_t mask = 0x7f; + uint32_t shift = 0; + unsigned char *p = buf->data + buf->offset; + do { + if (direction == 1) { + byte = *p++; + val <<= 7; + val |= (byte & mask); + } else { + byte = *p--; + val = val | (uint32_t)(byte & mask) << shift; + shift += 7; + } + byte_count++; + has_stop = byte & stop_flag; + } while (!has_stop && (byte_count < max_count)); + } + if (!has_stop) { + debug_print("%s", "End of buffer\n"); + buf->error = MOBI_BUFFER_END; + return 0; + } + *len += byte_count; + buf->offset = direction == 1 ? buf->offset + byte_count : buf->offset - byte_count; + return val; +} + +/** + @brief Reads variable length value from MOBIBuffer + + Reads maximum 4 bytes from the buffer. Stops when byte has bit 7 set. + + @param[in] buf MOBIBuffer structure containing data + @param[out] len Value will be increased by number of bytes read + @return Read value, 0 if end of buffer is encountered + */ +uint32_t mobi_buffer_get_varlen(MOBIBuffer *buf, size_t *len) { + return mobi_buffer_get_varlen_internal(buf, len, 1); +} + +/** + @brief Reads variable length value from MOBIBuffer going backwards + + Reads maximum 4 bytes from the buffer. Stops when byte has bit 7 set. + + This function has a limitation. It will not read first byte in a buffer, as it would cause buffer offset to underflow. + That means that it cannot read variable length values that are placed at the beginning of a buffer. + This will result in an error. + + @param[in] buf MOBIBuffer structure containing data + @param[out] len Value will be increased by number of bytes read + @return Read value, 0 if end of buffer is encountered + */ +uint32_t mobi_buffer_get_varlen_dec(MOBIBuffer *buf, size_t *len) { + return mobi_buffer_get_varlen_internal(buf, len, -1); +} + +/** + @brief Reads raw data from MOBIBuffer and pads it with zero character + + @param[out] str Destination for string read from buffer. Length must be (len + 1) + @param[in] buf MOBIBuffer structure containing data + @param[in] len Length of the data to be read from buffer + */ +void mobi_buffer_getstring(char *str, MOBIBuffer *buf, const size_t len) { + if (!str) { + buf->error = MOBI_PARAM_ERR; + return; + } + if (buf->offset + len > buf->maxlen) { + debug_print("%s", "End of buffer\n"); + buf->error = MOBI_BUFFER_END; + str[0] = '\0'; + return; + } + memcpy(str, buf->data + buf->offset, len); + str[len] = '\0'; + buf->offset += len; +} + +/** + @brief Reads raw data from MOBIBuffer, appends it to a string and pads it with zero character + + @param[in,out] str A string to which data will be appended + @param[in] buf MOBIBuffer structure containing data + @param[in] len Length of the data to be read from buffer + */ +void mobi_buffer_appendstring(char *str, MOBIBuffer *buf, const size_t len) { + if (!str) { + buf->error = MOBI_PARAM_ERR; + return; + } + if (buf->offset + len > buf->maxlen) { + debug_print("%s", "End of buffer\n"); + buf->error = MOBI_BUFFER_END; + return; + } + size_t str_len = strlen(str); + memcpy(str + str_len, buf->data + buf->offset, len); + str[str_len + len] = '\0'; + buf->offset += len; +} + +/** + @brief Reads raw data from MOBIBuffer + + @param[out] data Destination to which data will be appended + @param[in] buf MOBIBuffer structure containing data + @param[in] len Length of the data to be read from buffer + */ +void mobi_buffer_getraw(void *data, MOBIBuffer *buf, const size_t len) { + if (!data) { + buf->error = MOBI_PARAM_ERR; + return; + } + if (buf->offset + len > buf->maxlen) { + debug_print("%s", "End of buffer\n"); + buf->error = MOBI_BUFFER_END; + return; + } + memcpy(data, buf->data + buf->offset, len); + buf->offset += len; +} + +/** + @brief Get pointer to MOBIBuffer data at offset + + @param[in] buf MOBIBuffer structure containing data + @param[in] len Check if requested length is available in buffer + @return Pointer to offset, or NULL on failure + */ +unsigned char * mobi_buffer_getpointer(MOBIBuffer *buf, const size_t len) { + if (buf->offset + len > buf->maxlen) { + debug_print("%s", "End of buffer\n"); + buf->error = MOBI_BUFFER_END; + return NULL; + } + buf->offset += len; + return buf->data + buf->offset - len; +} + +/** + @brief Read 8-bit value from MOBIBuffer into allocated memory + + Read 8-bit value from buffer into memory allocated by the function. + Returns pointer to the value, which must be freed later. + If the data is not accessible function will return null pointer. + + @param[out] val Pointer to value or null pointer on failure + @param[in] buf MOBIBuffer structure containing data + */ +void mobi_buffer_dup8(uint8_t **val, MOBIBuffer *buf) { + *val = NULL; + if (buf->offset + 1 > buf->maxlen) { + return; + } + *val = malloc(sizeof(uint8_t)); + if (*val == NULL) { + return; + } + **val = mobi_buffer_get8(buf); +} + +/** + @brief Read 16-bit value from MOBIBuffer into allocated memory + + Read 16-bit value from buffer into allocated memory. + Returns pointer to the value, which must be freed later. + If the data is not accessible function will return null pointer. + + @param[out] val Pointer to value or null pointer on failure + @param[in] buf MOBIBuffer structure containing data + */ +void mobi_buffer_dup16(uint16_t **val, MOBIBuffer *buf) { + *val = NULL; + if (buf->offset + 2 > buf->maxlen) { + return; + } + *val = malloc(sizeof(uint16_t)); + if (*val == NULL) { + return; + } + **val = mobi_buffer_get16(buf); +} + +/** + @brief Read 32-bit value from MOBIBuffer into allocated memory + + Read 32-bit value from buffer into allocated memory. + Returns pointer to the value, which must be freed later. + If the data is not accessible function will return null pointer. + + @param[out] val Pointer to value + @param[in] buf MOBIBuffer structure containing data + */ +void mobi_buffer_dup32(uint32_t **val, MOBIBuffer *buf) { + *val = NULL; + if (buf->offset + 4 > buf->maxlen) { + return; + } + *val = malloc(sizeof(uint32_t)); + if (*val == NULL) { + return; + } + **val = mobi_buffer_get32(buf); +} + +/** + @brief Copy 8-bit value from one MOBIBuffer into another + + @param[out] dest Destination buffer + @param[in] source Source buffer + */ +void mobi_buffer_copy8(MOBIBuffer *dest, MOBIBuffer *source) { + mobi_buffer_add8(dest, mobi_buffer_get8(source)); +} + +/** + @brief Copy raw value from one MOBIBuffer into another + + @param[out] dest Destination buffer + @param[in] source Source buffer + @param[in] len Number of bytes to copy + */ +void mobi_buffer_copy(MOBIBuffer *dest, MOBIBuffer *source, const size_t len) { + if (source->offset + len > source->maxlen) { + debug_print("%s", "End of buffer\n"); + source->error = MOBI_BUFFER_END; + return; + } + if (dest->offset + len > dest->maxlen) { + debug_print("%s", "End of buffer\n"); + dest->error = MOBI_BUFFER_END; + return; + } + memcpy(dest->data + dest->offset, source->data + source->offset, len); + dest->offset += len; + source->offset += len; +} + +/** + @brief Copy raw value within one MOBIBuffer + + Memmove len bytes from offset (relative to current position) + to current position in buffer and advance buffer position. + Data may overlap. + + @param[out] buf Buffer + @param[in] offset Offset to read from + @param[in] len Number of bytes to copy + */ +void mobi_buffer_move(MOBIBuffer *buf, const int offset, const size_t len) { + size_t aoffset = (size_t) abs(offset); + unsigned char *source = buf->data + buf->offset; + if (offset >= 0) { + if (buf->offset + aoffset + len > buf->maxlen) { + debug_print("%s", "End of buffer\n"); + buf->error = MOBI_BUFFER_END; + return; + } + source += aoffset; + } else { + if ( (buf->offset < aoffset) || (buf->offset + len > buf->maxlen) ) { + debug_print("%s", "Beyond start/end of buffer\n"); + buf->error = MOBI_BUFFER_END; + return; + } + source -= aoffset; + } + memmove(buf->data + buf->offset, source, len); + buf->offset += len; +} + +/** + @brief Check if buffer data header contains magic signature + + @param[in] buf MOBIBuffer buffer containing data + @param[in] magic Magic signature + @return boolean true on match, false otherwise + */ +bool mobi_buffer_match_magic(MOBIBuffer *buf, const char *magic) { + const size_t magic_length = strlen(magic); + if (buf->offset + magic_length > buf->maxlen) { + return false; + } + if (memcmp(buf->data + buf->offset, magic, magic_length) == 0) { + return true; + } + return false; +} + +/** + @brief Check if buffer contains magic signature at given offset + + @param[in] buf MOBIBuffer buffer containing data + @param[in] magic Magic signature + @param[in] offset Offset + @return boolean true on match, false otherwise + */ +bool mobi_buffer_match_magic_offset(MOBIBuffer *buf, const char *magic, const size_t offset) { + bool match = false; + if (offset <= buf->maxlen) { + const size_t save_offset = buf->offset; + buf->offset = offset; + match = mobi_buffer_match_magic(buf, magic); + buf->offset = save_offset; + } + return match; +} + +/** + @brief Move current buffer offset by diff bytes + + @param[in,out] buf MOBIBuffer buffer containing data + @param[in] diff Number of bytes by which the offset is adjusted + */ +void mobi_buffer_seek(MOBIBuffer *buf, const int diff) { + size_t adiff = (size_t) abs(diff); + if (diff >= 0) { + if (buf->offset + adiff <= buf->maxlen) { + buf->offset += adiff; + return; + } + } else { + if (buf->offset >= adiff) { + buf->offset -= adiff; + return; + } + } + buf->error = MOBI_BUFFER_END; + debug_print("%s", "End of buffer\n"); +} + +/** + @brief Set buffer offset to pos position + + @param[in,out] buf MOBIBuffer buffer containing data + @param[in] pos New position + */ +void mobi_buffer_setpos(MOBIBuffer *buf, const size_t pos) { + if (pos <= buf->maxlen) { + buf->offset = pos; + return; + } + buf->error = MOBI_BUFFER_END; + debug_print("%s", "End of buffer\n"); +} + +/** + @brief Free pointer to MOBIBuffer structure and pointer to data + + Free data initialized with mobi_buffer_init(); + + @param[in] buf MOBIBuffer structure + */ +void mobi_buffer_free(MOBIBuffer *buf) { + if (buf == NULL) { return; } + if (buf->data != NULL) { + free(buf->data); + } + free(buf); +} + +/** + @brief Free pointer to MOBIBuffer structure + + Free data initialized with mobi_buffer_init_null(); + Unlike mobi_buffer_free() it will not free pointer to buf->data + + @param[in] buf MOBIBuffer structure + */ +void mobi_buffer_free_null(MOBIBuffer *buf) { + if (buf == NULL) { return; } + free(buf); +} diff --git a/app/src/main/cpp/libmobi/src/buffer.h b/app/src/main/cpp/libmobi/src/buffer.h new file mode 100644 index 0000000..eecff21 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/buffer.h @@ -0,0 +1,58 @@ +/** @file buffer.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_buffer_h +#define libmobi_buffer_h + +#include "config.h" +#include "mobi.h" + +/** + @brief Buffer to read to/write from + */ +typedef struct { + size_t offset; /**< Current offset in respect to buffer start */ + size_t maxlen; /**< Length of the buffer data */ + unsigned char *data; /**< Pointer to buffer data */ + MOBI_RET error; /**< MOBI_SUCCESS = 0 if operation on buffer is successful, non-zero value on failure */ +} MOBIBuffer; + +MOBIBuffer * mobi_buffer_init(const size_t len); +MOBIBuffer * mobi_buffer_init_null(unsigned char *data, const size_t len); +void mobi_buffer_resize(MOBIBuffer *buf, const size_t newlen); +void mobi_buffer_add8(MOBIBuffer *buf, const uint8_t data); +void mobi_buffer_add16(MOBIBuffer *buf, const uint16_t data); +void mobi_buffer_add32(MOBIBuffer *buf, const uint32_t data); +void mobi_buffer_addraw(MOBIBuffer *buf, const unsigned char* data, const size_t len); +void mobi_buffer_addstring(MOBIBuffer *buf, const char *str); +void mobi_buffer_addzeros(MOBIBuffer *buf, const size_t count); +uint8_t mobi_buffer_get8(MOBIBuffer *buf); +uint16_t mobi_buffer_get16(MOBIBuffer *buf); +uint32_t mobi_buffer_get32(MOBIBuffer *buf); +uint32_t mobi_buffer_get_varlen(MOBIBuffer *buf, size_t *len); +uint32_t mobi_buffer_get_varlen_dec(MOBIBuffer *buf, size_t *len); +void mobi_buffer_dup8(uint8_t **val, MOBIBuffer *buf); +void mobi_buffer_dup16(uint16_t **val, MOBIBuffer *buf); +void mobi_buffer_dup32(uint32_t **val, MOBIBuffer *buf); +void mobi_buffer_getstring(char *str, MOBIBuffer *buf, const size_t len); +void mobi_buffer_appendstring(char *str, MOBIBuffer *buf, const size_t len); +void mobi_buffer_getraw(void *data, MOBIBuffer *buf, const size_t len); +unsigned char * mobi_buffer_getpointer(MOBIBuffer *buf, const size_t len); +void mobi_buffer_copy8(MOBIBuffer *dest, MOBIBuffer *source); +void mobi_buffer_move(MOBIBuffer *buf, const int offset, const size_t len); +void mobi_buffer_copy(MOBIBuffer *dest, MOBIBuffer *source, const size_t len); +bool mobi_buffer_match_magic(MOBIBuffer *buf, const char *magic); +bool mobi_buffer_match_magic_offset(MOBIBuffer *buf, const char *magic, const size_t offset); +void mobi_buffer_seek(MOBIBuffer *buf, const int diff); +void mobi_buffer_setpos(MOBIBuffer *buf, const size_t pos); +void mobi_buffer_free(MOBIBuffer *buf); +void mobi_buffer_free_null(MOBIBuffer *buf); + +#endif diff --git a/app/src/main/cpp/libmobi/src/compression.c b/app/src/main/cpp/libmobi/src/compression.c new file mode 100644 index 0000000..cf39232 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/compression.c @@ -0,0 +1,221 @@ +/** @file compression.c + * @brief Functions handling compression + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#include +#include "compression.h" +#include "buffer.h" +#include "mobi.h" +#include "debug.h" + + +/** + @brief Decompressor fo PalmDOC version of LZ77 compression + + Decompressor based on this algorithm: + http://en.wikibooks.org/wiki/Data_Compression/Dictionary_compression#PalmDoc + + @param[out] out Decompressed destination data + @param[in] in Compressed source data + @param[in,out] len_out Size of the memory reserved for decompressed data. + On return it is set to actual size of decompressed data + @param[in] len_in Size of compressed data + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_decompress_lz77(unsigned char *out, const unsigned char *in, size_t *len_out, const size_t len_in) { + MOBI_RET ret = MOBI_SUCCESS; + MOBIBuffer *buf_in = mobi_buffer_init_null((unsigned char *) in, len_in); + if (buf_in == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + MOBIBuffer *buf_out = mobi_buffer_init_null(out, *len_out); + if (buf_out == NULL) { + mobi_buffer_free_null(buf_in); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + while (ret == MOBI_SUCCESS && buf_in->offset < buf_in->maxlen) { + uint8_t byte = mobi_buffer_get8(buf_in); + /* byte pair: space + char */ + if (byte >= 0xc0) { + mobi_buffer_add8(buf_out, ' '); + mobi_buffer_add8(buf_out, byte ^ 0x80); + } + /* length, distance pair */ + /* 0x8000 + (distance << 3) + ((length-3) & 0x07) */ + else if (byte >= 0x80) { + uint8_t next = mobi_buffer_get8(buf_in); + uint16_t distance = ((((byte << 8) | ((uint8_t)next)) >> 3) & 0x7ff); + uint8_t length = (next & 0x7) + 3; + while (length--) { + mobi_buffer_move(buf_out, -distance, 1); + } + } + /* single char, not modified */ + else if (byte >= 0x09) { + mobi_buffer_add8(buf_out, byte); + } + /* val chars not modified */ + else if (byte >= 0x01) { + mobi_buffer_copy(buf_out, buf_in, byte); + } + /* char '\0', not modified */ + else { + mobi_buffer_add8(buf_out, byte); + } + if (buf_in->error || buf_out->error) { + ret = MOBI_BUFFER_END; + } + } + *len_out = buf_out->offset; + mobi_buffer_free_null(buf_out); + mobi_buffer_free_null(buf_in); + return ret; +} + +/** + @brief Read at most 8 bytes from buffer, big-endian + + If buffer data is shorter returned value is padded with zeroes + + @param[in] buf MOBIBuffer structure to read from + @return 64-bit value + */ +static MOBI_INLINE uint64_t mobi_buffer_fill64(MOBIBuffer *buf) { + uint64_t val = 0; + uint8_t i = 8; + size_t bytesleft = buf->maxlen - buf->offset; + unsigned char *ptr = buf->data + buf->offset; + while (i-- && bytesleft--) { + val |= (uint64_t) *ptr++ << (i * 8); + } + /* increase counter by 4 bytes only, 4 bytes overlap on each call */ + buf->offset += 4; + return val; +} + +/** + @brief Internal function for huff/cdic decompression + + Decompressor and HUFF/CDIC records parsing based on: + perl EBook::Tools::Mobipocket + python mobiunpack.py, calibre + + @param[out] buf_out MOBIBuffer structure with decompressed data + @param[in] buf_in MOBIBuffer structure with compressed data + @param[in] huffcdic MOBIHuffCdic structure with parsed data from huff/cdic records + @param[in] depth Depth of current recursion level + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_decompress_huffman_internal(MOBIBuffer *buf_out, MOBIBuffer *buf_in, const MOBIHuffCdic *huffcdic, size_t depth) { + if (depth > MOBI_HUFFMAN_MAXDEPTH) { + debug_print("Too many levels of recursion: %zu\n", depth); + return MOBI_DATA_CORRUPT; + } + MOBI_RET ret = MOBI_SUCCESS; + int8_t bitcount = 32; + /* this cast should be safe: max record size is 4096 */ + int bitsleft = (int) (buf_in->maxlen * 8); + uint8_t code_length = 0; + uint64_t buffer = mobi_buffer_fill64(buf_in); + while (ret == MOBI_SUCCESS) { + if (bitcount <= 0) { + bitcount += 32; + buffer = mobi_buffer_fill64(buf_in); + } + uint32_t code = (buffer >> bitcount) & 0xffffffffU; + /* lookup code in table1 */ + uint32_t t1 = huffcdic->table1[code >> 24]; + /* get maxcode and codelen from t1 */ + code_length = t1 & 0x1f; + uint32_t maxcode = (((t1 >> 8) + 1) << (32 - code_length)) - 1; + /* check termination bit */ + if (!(t1 & 0x80)) { + /* get offset from mincode, maxcode tables */ + while (code < huffcdic->mincode_table[code_length]) { + if (++code_length >= HUFF_CODETABLE_SIZE) { + debug_print("Wrong offset to mincode table: %hhu\n", code_length); + return MOBI_DATA_CORRUPT; + } + } + maxcode = huffcdic->maxcode_table[code_length]; + } + bitcount -= code_length; + bitsleft -= code_length; + if (bitsleft < 0) { + break; + } + /* get index for symbol offset */ + uint32_t index = (uint32_t) (maxcode - code) >> (32 - code_length); + /* check which part of cdic to use */ + uint16_t cdic_index = (uint16_t) ((uint32_t)index >> huffcdic->code_length); + if (index >= huffcdic->index_count) { + debug_print("Wrong symbol offsets index: %u\n", index); + return MOBI_DATA_CORRUPT; + } + /* get offset */ + uint32_t offset = huffcdic->symbol_offsets[index]; + uint32_t symbol_length = (uint32_t) huffcdic->symbols[cdic_index][offset] << 8 | (uint32_t) huffcdic->symbols[cdic_index][offset + 1]; + /* 1st bit is is_decompressed flag */ + int is_decompressed = symbol_length >> 15; + /* get rid of flag */ + symbol_length &= 0x7fff; + if (is_decompressed) { + /* symbol is at (offset + 2), 2 bytes used earlier for symbol length */ + mobi_buffer_addraw(buf_out, (huffcdic->symbols[cdic_index] + offset + 2), symbol_length); + ret = buf_out->error; + } else { + /* symbol is compressed */ + /* TODO cache uncompressed symbols? */ + MOBIBuffer buf_sym; + buf_sym.data = huffcdic->symbols[cdic_index] + offset + 2; + buf_sym.offset = 0; + buf_sym.maxlen = symbol_length; + buf_sym.error = MOBI_SUCCESS; + ret = mobi_decompress_huffman_internal(buf_out, &buf_sym, huffcdic, depth + 1); + } + } + return ret; +} + +/** + @brief Decompressor for huff/cdic compressed text records + + Decompressor and HUFF/CDIC records parsing based on: + perl EBook::Tools::Mobipocket + python mobiunpack.py, calibre + + @param[out] out Decompressed destination data + @param[in] in Compressed source data + @param[in,out] len_out Size of the memory reserved for decompressed data. + On return it is set to actual size of decompressed data + @param[in] len_in Size of compressed data + @param[in] huffcdic MOBIHuffCdic structure with parsed data from huff/cdic records + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_decompress_huffman(unsigned char *out, const unsigned char *in, size_t *len_out, size_t len_in, const MOBIHuffCdic *huffcdic) { + MOBIBuffer *buf_in = mobi_buffer_init_null((unsigned char *) in, len_in); + if (buf_in == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + MOBIBuffer *buf_out = mobi_buffer_init_null(out, *len_out); + if (buf_out == NULL) { + mobi_buffer_free_null(buf_in); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + MOBI_RET ret = mobi_decompress_huffman_internal(buf_out, buf_in, huffcdic, 0); + *len_out = buf_out->offset; + mobi_buffer_free_null(buf_out); + mobi_buffer_free_null(buf_in); + return ret; +} diff --git a/app/src/main/cpp/libmobi/src/compression.h b/app/src/main/cpp/libmobi/src/compression.h new file mode 100644 index 0000000..59e116e --- /dev/null +++ b/app/src/main/cpp/libmobi/src/compression.h @@ -0,0 +1,43 @@ +/** @file compression.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_compression_h +#define libmobi_compression_h + +#include "config.h" +#include "mobi.h" + +#ifndef MOBI_INLINE +#define MOBI_INLINE /**< Syntax for compiler inline keyword from config.h */ +#endif + +/* FIXME: what is the reasonable value? */ +#define MOBI_HUFFMAN_MAXDEPTH 20 /**< Maximal recursion level for huffman decompression routine */ +#define HUFF_CODETABLE_SIZE 33 /**< Size of min- and maxcode tables */ + + +/** + @brief Parsed data from HUFF and CDIC records needed to unpack huffman compressed text + */ +typedef struct { + size_t index_count; /**< Total number of indices in all CDIC records, stored in each CDIC record header */ + size_t index_read; /**< Number of indices parsed, used by parser */ + size_t code_length; /**< Code length value stored in CDIC record header */ + uint32_t table1[256]; /**< Table of big-endian indices from HUFF record data1 */ + uint32_t mincode_table[HUFF_CODETABLE_SIZE]; /**< Table of big-endian mincodes from HUFF record data2 */ + uint32_t maxcode_table[HUFF_CODETABLE_SIZE]; /**< Table of big-endian maxcodes from HUFF record data2 */ + uint16_t *symbol_offsets; /**< Index of symbol offsets parsed from CDIC records (index_count entries) */ + unsigned char **symbols; /**< Array of pointers to start of symbols data in each CDIC record (index = number of CDIC record) */ +} MOBIHuffCdic; + +MOBI_RET mobi_decompress_lz77(unsigned char *out, const unsigned char *in, size_t *len_out, const size_t len_in); +MOBI_RET mobi_decompress_huffman(unsigned char *out, const unsigned char *in, size_t *len_out, size_t len_in, const MOBIHuffCdic *huffcdic); + +#endif diff --git a/app/src/main/cpp/libmobi/src/config.h b/app/src/main/cpp/libmobi/src/config.h new file mode 100644 index 0000000..352fd4e --- /dev/null +++ b/app/src/main/cpp/libmobi/src/config.h @@ -0,0 +1,18 @@ +/** @file src/config.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef mobi_config_h +#define mobi_config_h + +#ifdef HAVE_CONFIG_H +#include "../config.h" +#endif + +#endif diff --git a/app/src/main/cpp/libmobi/src/debug.c b/app/src/main/cpp/libmobi/src/debug.c new file mode 100644 index 0000000..c364726 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/debug.c @@ -0,0 +1,159 @@ +/** @file debug.c + * @brief Debugging functions, enable by running configure --enable-debug + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#include + +#include "debug.h" +#include "index.h" + +/** + @brief Debugging wrapper for free(void *ptr) + + @param[in] ptr Pointer + @param[in] file Calling file + @param[in] line Calling line + */ +void debug_free(void *ptr, const char *file, const int line) { + printf("%s:%d: free(%p)\n",file, line, ptr); + (free)(ptr); +} + +/** + @brief Debugging wrapper for malloc(size_t size) + + @param[in] size Size of memory + @param[in] file Calling file + @param[in] line Calling line + @return A pointer to the allocated memory block on success, NULL on failure + + */ +void *debug_malloc(const size_t size, const char *file, const int line) { + void *ptr = (malloc)(size); + printf("%s:%d: malloc(%d)=%p\n", file, line, (int)size, ptr); + return ptr; +} + +/** + @brief Debugging wrapper for realloc(void* ptr, size_t size) + + @param[in] ptr Pointer + @param[in] size Size of memory + @param[in] file Calling file + @param[in] line Calling line + @return A pointer to the reallocated memory block on success, NULL on failure + */ +void *debug_realloc(void *ptr, const size_t size, const char *file, const int line) { + printf("%s:%d: realloc(%p", file, line, ptr); + void *rptr = (realloc)(ptr, size); + printf(", %d)=%p\n", (int)size, rptr); + return rptr; +} + +/** + @brief Debugging wrapper for calloc(size_t num, size_t size) + + @param[in] num Number of elements to allocate + @param[in] size Size of each element + @param[in] file Calling file + @param[in] line Calling line + @return A pointer to the allocated memory block on success, NULL on failure + */ +void *debug_calloc(const size_t num, const size_t size, const char *file, const int line) { + void *ptr = (calloc)(num, size); + printf("%s:%d: calloc(%d, %d)=%p\n", file, line, (int)num, (int)size, ptr); + return ptr; +} + +/** + @brief Dump index values + + @param[in] indx Parsed index +*/ +void print_indx(const MOBIIndx *indx) { + if (indx == NULL) { return; } + for (size_t i = 0; i < indx->entries_count; i++) { + MOBIIndexEntry e = indx->entries[i]; + printf("entry[%zu]: \"%s\"\n", i, e.label); + for (size_t j = 0; j < e.tags_count; j++) { + MOBIIndexTag t = e.tags[j]; + printf(" tag[%zu] ", t.tagid); + for (size_t k = 0; k < t.tagvalues_count; k++) { + printf("[%u] ", t.tagvalues[k]); + } + printf("\n"); + } + } +} + +/** + @brief Dump inflections index (old version) + + @param[in] indx Parsed index +*/ +void print_indx_infl_old(const MOBIIndx *indx) { + if (indx == NULL) { return; } + for (size_t i = 0; i < indx->entries_count; i++) { + MOBIIndexEntry e = indx->entries[i]; + printf("entry[%zu]: \"%s\"\n", i, e.label); + for (size_t j = 0; j < e.tags_count; j++) { + MOBIIndexTag t = e.tags[j]; + printf(" tag[%zu] ", t.tagid); + if (t.tagid == 7) { + for (size_t k = 0; k < t.tagvalues_count; k += 2) { + uint32_t len = t.tagvalues[k]; + uint32_t offset = t.tagvalues[k + 1]; + char *string = mobi_get_cncx_string_flat(indx->cncx_record, offset, len); + if (string) { + printf("\"%s\" [%u] [%u]", string, len, offset); + free(string); + } + } + } else { + for (size_t k = 0; k < t.tagvalues_count; k++) { + printf("[%u] ", t.tagvalues[k]); + } + } + printf("\n"); + } + } +} + +/** + @brief Dump orthographic index (old version) + + @param[in] indx Parsed index +*/ +void print_indx_orth_old(const MOBIIndx *indx) { + if (indx == NULL) { return; } + for (size_t i = 0; i < indx->entries_count; i++) { + MOBIIndexEntry e = indx->entries[i]; + printf("entry[%zu]: \"%s\"\n", i, e.label); + for (size_t j = 0; j < e.tags_count; j++) { + MOBIIndexTag t = e.tags[j]; + printf(" tag[%zu] ", t.tagid); + if (t.tagid >= 69) { + for (size_t k = 0; k < t.tagvalues_count; k++) { + uint32_t offset = t.tagvalues[k]; + char *string = mobi_get_cncx_string(indx->cncx_record, offset); + if (string) { + printf("\"%s\" [%u] ", string, t.tagvalues[k]); + free(string); + } + } + } else { + for (size_t k = 0; k < t.tagvalues_count; k++) { + printf("[%u] ", t.tagvalues[k]); + } + } + printf("\n"); + } + } +} diff --git a/app/src/main/cpp/libmobi/src/debug.h b/app/src/main/cpp/libmobi/src/debug.h new file mode 100644 index 0000000..75507d9 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/debug.h @@ -0,0 +1,57 @@ +/** @file debug.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_debug_h +#define libmobi_debug_h + +#include "config.h" +#include "mobi.h" + +#ifndef MOBI_DEBUG +#define MOBI_DEBUG 0 /**< Turn on debugging, set this on by running "configure --enable-debug" */ +#endif + +#if MOBI_DEBUG_ALLOC +/** + @defgroup mobi_debug Debug wrappers for memory allocation functions + + Set this on by running "configure --enable-debug-alloc" + @{ + */ +#define free(x) debug_free(x, __FILE__, __LINE__) +#define malloc(x) debug_malloc(x, __FILE__, __LINE__) +#define realloc(x, y) debug_realloc(x, y, __FILE__, __LINE__) +#define calloc(x, y) debug_calloc(x, y, __FILE__, __LINE__) +/** @} */ +#endif + +void debug_free(void *ptr, const char *file, const int line); +void *debug_malloc(const size_t size, const char *file, const int line); +void *debug_realloc(void *ptr, const size_t size, const char *file, const int line); +void *debug_calloc(const size_t num, const size_t size, const char *file, const int line); +void print_indx(const MOBIIndx *indx); +void print_indx_infl_old(const MOBIIndx *indx); +void print_indx_orth_old(const MOBIIndx *indx); + +/** + @brief Macro for printing debug info to stderr. Wrapper for fprintf + @param[in] fmt Format + @param[in] ... Additional arguments + */ +#if (MOBI_DEBUG) +#define debug_print(fmt, ...) { \ + fprintf(stderr, "%s:%d:%s(): " fmt, __FILE__, \ + __LINE__, __func__, __VA_ARGS__); \ +} +#else +#define debug_print(fmt, ...) +#endif + +#endif diff --git a/app/src/main/cpp/libmobi/src/encryption.c b/app/src/main/cpp/libmobi/src/encryption.c new file mode 100644 index 0000000..353dba2 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/encryption.c @@ -0,0 +1,1515 @@ +/** @file encryption.c + * @brief Functions to handle encryption + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +/* PC1 routines adapted from: + + * File PC1DEC.c + * written in Borland Turbo C 2.0 on PC + * PC1 Cipher Algorithm ( Pukall Cipher 1 ) + * By Alexander PUKALL 1991 + * free code no restriction to use + * please include the name of the Author in the final software + + * Mobi encryption algorithm learned from: + + * mobidedrm.py + * Copyright (c) 2008 The Dark Reverser + */ + +#include +#include +#include +#include "util.h" +#include "debug.h" +#include "randombytes.h" +#include "sha1.h" +#include "encryption.h" + +#define INTERNAL_READER_KEY ((unsigned char*) "\x72\x38\x33\xb0\xb4\xf2\xe3\xca\xdf\x09\x01\xd6\xe2\xe0\x3f\x96") +#define INTERNAL_PUBLISHER_KEY ((unsigned char*) "\x95\xda\x7b\xed\x90\x5e\x10\x2e\x44\x4c\xb5\xe5\xc0\x25\xdf\x2c") +#define INTERNAL_READER_KEY_V1 ((unsigned char*) "QDCVEPMU675RUBSZ") +#define PIDSIZE 10 +#define SERIALSIZE 16 +#define SERIALLONGSIZE 40 +#define KEYSIZE 16 +#define COOKIESIZE 32 +#define VOUCHERSIZE 48 +#define VOUCHERS_COUNT_MAX 1024 +#define VOUCHERS_SIZE_MIN 288 +#define pk1_swap(a, b) { uint16_t tmp = a; (a) = b; (b) = tmp; } + +/** + @brief Structure for PK1 routines + */ +typedef struct { + uint16_t si, x1a2, x1a0[8]; +} MOBIPk1; + + +/** + @brief Structure for parsed drm record in record 0 header + */ +typedef struct { + uint32_t verification; /**< Verification checksum */ + uint32_t size; /**< Voucher size */ + uint32_t type; /**< Voucher type */ + uint8_t checksum; /**< Temporary key checksum */ + unsigned char *cookie; /**< Encrypted part contains key, verificationÅ›, expiration dates, flags */ +} MOBIVoucher; + +/** + @brief Drm components extracted from EXTH records + */ +typedef struct { + unsigned char *data; /**< EXTH_TAMPERKEYS record data */ + unsigned char *token; /**< Drm token */ + size_t data_size; /**< Data size */ + size_t token_size; /**< Token size */ +} MOBIExthDrm; + +/** + @brief Helper function for PK1 encryption/decryption + + @param[in,out] pk1 PK1 structure + @param[in] i Iteration number + @return PK1 inter + */ +static uint16_t mobi_pk1_code(MOBIPk1 *pk1, const uint8_t i) { + uint16_t dx = pk1->x1a2 + i; + uint16_t ax = pk1->x1a0[i]; + uint16_t cx = 0x015a; + uint16_t bx = 0x4e35; + pk1_swap(ax, pk1->si); + pk1_swap(ax, dx); + if (ax) { ax *= bx; } + pk1_swap(ax, cx); + if (ax) { + ax *= pk1->si; + cx += ax; + } + pk1_swap(ax, pk1->si); + ax *= bx; + dx += cx; + ax += 1; + pk1->x1a2 = dx; + pk1->x1a0[i] = ax; + return ax ^ dx; +} + +/** + @brief Helper function for PK1 encryption/decryption + + @param[in,out] pk1 PK1 structure + @param[in] key 128-bit key + @return PK1 inter + */ +static uint16_t mobi_pk1_assemble(MOBIPk1 *pk1, const unsigned char key[KEYSIZE]) { + pk1->x1a0[0] = (key[0] * 256) + key[1]; + uint16_t inter = mobi_pk1_code(pk1, 0); + for (uint8_t i = 1; i < (KEYSIZE / 2); i++) { + pk1->x1a0[i] = pk1->x1a0[i - 1] ^ ((key[i * 2] * 256) + key[i * 2 + 1]); + inter ^= mobi_pk1_code(pk1, i); + } + return inter; +} + +/** + @brief Decrypt buffer with PK1 algorithm + + @param[in,out] out Decrypted buffer + @param[in] in Encrypted buffer + @param[in] length Buffer length + @param[in] key Key + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_pk1_decrypt(unsigned char *out, const unsigned char *in, size_t length, const unsigned char key[KEYSIZE]) { + if (!out || !in) { + return MOBI_INIT_FAILED; + } + unsigned char key_copy[KEYSIZE]; + memcpy(key_copy, key, KEYSIZE); + MOBIPk1 *pk1 = calloc(1, sizeof(MOBIPk1)); + while (length--) { + uint16_t inter = mobi_pk1_assemble(pk1, key_copy); + uint8_t cfc = inter >> 8; + uint8_t cfd = inter & 0xff; + uint8_t c = *in++; + c ^= (cfc ^ cfd); + for (size_t i = 0; i < KEYSIZE; i++) { + key_copy[i] ^= c; + } + *out++ = c; + } + free(pk1); + return MOBI_SUCCESS; +} + +/** + @brief Encrypt buffer with PK1 algorithm + + @param[in,out] out Decrypted buffer + @param[in] in Encrypted buffer + @param[in] length Buffer length + @param[in] key Key + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_pk1_encrypt(unsigned char *out, const unsigned char *in, size_t length, const unsigned char key[KEYSIZE]) { + if (!out || !in) { + return MOBI_INIT_FAILED; + } + MOBIPk1 *pk1 = calloc(1, sizeof(MOBIPk1)); + unsigned char key_copy[KEYSIZE]; + memcpy(key_copy, key, KEYSIZE); + while (length--) { + uint16_t inter = mobi_pk1_assemble(pk1, key_copy); + uint8_t cfc = inter >> 8; + uint8_t cfd = inter & 0xff; + uint8_t c = *in++; + for (size_t i = 0; i < KEYSIZE; i++) { + key_copy[i] ^= c; + } + c ^= (cfc ^ cfd); + *out++ = c; + } + free(pk1); + return MOBI_SUCCESS; +} + + +/** + @brief Initialize DRM structure + + @return Number of parsed records + */ +static MOBIDrm * mobi_drm_init(void) { + + MOBIDrm *drm = calloc(1, sizeof(MOBIDrm)); + if (drm == NULL) { + debug_print("%s", "Memory allocation for drm structure failed\n"); + } + return drm; +} + +/** + @brief Free DRM cookie structure + + @param[in,out] cookie Cookie + */ +static void mobi_free_cookie(MOBICookie *cookie) { + if (cookie) { + if (cookie->pid) { + free(cookie->pid); + cookie->pid = NULL; + } + free(cookie); + } +} + +/** + @brief Free DRM structure + + @param[in,out] m MOBIData structure with raw data and metadata + */ +void mobi_free_drm(MOBIData *m) { + if (m->internals) { + MOBIDrm *drm = m->internals; + if (drm->key) { + free(drm->key); + } + drm->key = NULL; + if (drm->cookies) { + while (drm->cookies_count--) { + mobi_free_cookie(drm->cookies[drm->cookies_count]); + } + free(drm->cookies); + } + drm->cookies = NULL; + free(m->internals); + m->internals = NULL; + } + +} + +/** + @brief Initialize DRM data with given key + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] key Key + @return Number of parsed records + */ +static MOBI_RET mobi_drmkey_init(MOBIData *m, const unsigned char key[KEYSIZE]) { + if (m->internals == NULL && (m->internals = mobi_drm_init()) == NULL) { + return MOBI_MALLOC_FAILED; + } + MOBIDrm *drm = m->internals; + if (drm->key == NULL) { + drm->key = malloc(KEYSIZE); + if (drm->key == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + } + memcpy(drm->key, key, KEYSIZE); + // remove in future versions, kept for backwards compatibility + m->drm_key = drm->key; + + debug_print("m->drm->key: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", + drm->key[0], drm->key[1], drm->key[2], drm->key[3], + drm->key[4], drm->key[5], drm->key[6], drm->key[7], + drm->key[8], drm->key[9], drm->key[10], drm->key[11], + drm->key[12], drm->key[13], drm->key[14], drm->key[15]); + + return MOBI_SUCCESS; +} + +/** + @brief Read drm records from Record0 header + + @param[in,out] drm MOBIDrm structure will hold parsed data + @param[in] m MOBIData structure with raw data and metadata + @return Number of parsed records + */ +static size_t mobi_vouchers_get(MOBIVoucher **drm, const MOBIData *m) { + if (!m || !m->mh) { + return 0; + } + uint32_t offset = *m->mh->drm_offset; + uint32_t count = *m->mh->drm_count; + uint32_t size = *m->mh->drm_size; + if (offset == MOBI_NOTSET || count == 0) { + return 0; + } + /* First record */ + MOBIPdbRecord *rec = m->rec; + MOBIBuffer *buf = mobi_buffer_init_null(rec->data, rec->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return 0; + } + if (offset + size > rec->size) { + mobi_buffer_free_null(buf); + return 0; + } + mobi_buffer_setpos(buf, offset); + debug_print("%s\n", "Parsing DRM data from record 0"); + for (size_t i = 0; i < count; i++) { + drm[i] = calloc(1, sizeof(MOBIVoucher)); + if (drm[i] == NULL) { + debug_print("%s\n", "Memory allocation failed"); + mobi_buffer_free_null(buf); + for (size_t j = 0; j < i; j++) { + free(drm[j]); + } + return 0; + } + drm[i]->verification = mobi_buffer_get32(buf); + drm[i]->size = mobi_buffer_get32(buf); + drm[i]->type = mobi_buffer_get32(buf); + drm[i]->checksum = mobi_buffer_get8(buf); + mobi_buffer_seek(buf, 3); + drm[i]->cookie = mobi_buffer_getpointer(buf, COOKIESIZE); + debug_print("drm[%zu] verification = %#x, size = %#x, type = %#x, checksum = %#x\n", + i, drm[i]->verification, drm[i]->size, drm[i]->type, drm[i]->checksum); + if (buf->error != MOBI_SUCCESS) { + debug_print("%s\n", "DRM data too short"); + mobi_buffer_free_null(buf); + for (size_t j = 0; j < i + 1; j++) { + free(drm[j]); + } + return 0; + } + } + mobi_buffer_free_null(buf); + return count; +} + +/** + @brief Calculate checksum for key + + @param[in] key Key + @return Checksum + */ +static uint8_t mobi_drmkey_checksum(const unsigned char key[KEYSIZE]) { + size_t sum = 0; + for (size_t i = 0; i < KEYSIZE; i++) { + sum += key[i]; + } + return (uint8_t) sum; +} + +/** + @brief Free MOBIDrm structure + + @param[in] drm MOBIDrm structure + */ +static void mobi_free_vouchers(MOBIVoucher **drm, const size_t count) { + for (size_t i = 0; i < count; i++) { + free(drm[i]); + } + free(drm); +} + +/** + @brief Check whether drm expired + + @param[in] from Cookie valid after (unix timestamp in minutes) + @param[in] to Cookie valid before (unix timestamp in minutes) + @return True if drm validation dates are present and expired, false otherwise + */ +static bool mobi_drm_is_expired(const uint32_t from, const uint32_t to) { + if (from == 0 || to == MOBI_NOTSET) { + /* expiration dates not set */ + return false; + } +#if (MOBI_DEBUG) + time_t debug_from = (time_t) from * 60; + time_t debug_to = (time_t) to * 60; + debug_print("Drm validity period from %s", ctime(&debug_from)); + debug_print(" to %s", ctime(&debug_to)); +#endif + size_t current_minutes = (size_t) time(NULL) / 60; + if (current_minutes >= UINT32_MAX) { + debug_print("Drm cannot be checked, current time outside valid range: %zu\n", current_minutes); + return false; + } + if (current_minutes < from || current_minutes > to) { + debug_print("%s\n", "Drm expired"); + return true; + } + return false; +} + +/** + @brief Verify decrypted cookie + + @param[in] drm_verification Checksum from drm header + @param[in] cookie Decrypted cookie + @param[in] key_type Key type + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_cookie_verify(const uint32_t drm_verification, const unsigned char cookie[COOKIESIZE], const uint8_t key_type) { + uint32_t verification = mobi_get32be(&cookie[0]); + uint32_t flags = mobi_get32be(&cookie[4]); + debug_print("%s\n", "Parsing decrypted data from record 0"); + debug_print("verification = %#x, flags = %#x\n", verification, flags); + if (verification == drm_verification && (flags & 0x1f) == key_type) { + uint32_t to = mobi_get32be(&cookie[24]); + uint32_t from = mobi_get32be(&cookie[28]); + debug_print("from = %#x, to = %#x\n", from, to); + if (mobi_drm_is_expired(from, to)) { + return MOBI_DRM_EXPIRED; + } + return MOBI_SUCCESS; + } + return MOBI_DRM_KEYNOTFOUND; +} + +/** + @brief Get key corresponding to encryption type 2 + + If PID is supplied main key is decrypted using PID key, otherwise internal reader key is used + + @param[in,out] key Key + @param[in] pid PID, NULL if not set + @param[in] m MOBIData structure with raw data and metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_drmkey_get_v2(unsigned char key[KEYSIZE], const unsigned char *pid, const MOBIData *m) { + + MOBI_RET ret; + unsigned char *device_key = NULL; + unsigned char pidkey[KEYSIZE] = "\0"; + if (pid) { + memcpy(pidkey, pid, PIDSIZE - 2); + + ret = mobi_pk1_encrypt(pidkey, pidkey, KEYSIZE, INTERNAL_READER_KEY); + if (ret != MOBI_SUCCESS) { + return ret; + } + device_key = pidkey; + } + + MOBIVoucher **drm = malloc(*m->mh->drm_count * sizeof(MOBIVoucher*)); + if (drm == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + size_t drm_count = mobi_vouchers_get(drm, m); + bool key_expired = false; + for (size_t i = 0; i < drm_count; i++) { + /* Try 1 uses pid key, try 2 - default key */ + size_t tries = 2; + while (tries) { + const unsigned char *try_key = (tries == 2) ? device_key : INTERNAL_READER_KEY; + const uint8_t try_type = (tries == 2) ? 1 : 3; + + if (try_key && drm[i]->checksum == mobi_drmkey_checksum(try_key)) { + + unsigned char cookie[COOKIESIZE]; + ret = mobi_pk1_decrypt(cookie, drm[i]->cookie, COOKIESIZE, try_key); + if (ret != MOBI_SUCCESS) { + // fatal error + mobi_free_vouchers(drm, drm_count); + return ret; + } + + ret = mobi_cookie_verify(drm[i]->verification, cookie, try_type); + if (ret == MOBI_SUCCESS) { + memcpy(key, &cookie[8], KEYSIZE); + mobi_free_vouchers(drm, drm_count); + if (tries == 2) { + debug_print("Cookie encrypted with pid key%s", "\n"); + } else { + debug_print("Cookie encrypted with default key%s", "\n"); + } + return MOBI_SUCCESS; + } + if (ret == MOBI_DRM_EXPIRED) { + key_expired = true; + } + } + tries--; + } + } + mobi_free_vouchers(drm, drm_count); + return key_expired ? MOBI_DRM_EXPIRED : MOBI_DRM_KEYNOTFOUND; +} + +/** + @brief Get key corresponding for encryption type 1 + + Main key is encrypted with internal reader key (old version) + + @param[in,out] key Key + @param[in] m MOBIData structure with raw data and metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_drmkey_get_v1(unsigned char key[KEYSIZE], const MOBIData *m) { + if (m == NULL || m->ph == NULL) { + return MOBI_DATA_CORRUPT; + } + /* First record */ + MOBIPdbRecord *rec = m->rec; + MOBIBuffer *buf = mobi_buffer_init_null(rec->data, rec->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + size_t mobi_version = mobi_get_fileversion(m); + + if (mobi_version > 1) { + /* offset mobi header + record 0 header (+ 12 in newer files) */ + if (m->mh == NULL || m->mh->header_length == NULL) { + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + size_t offset = 0; + if (mobi_version > 2) { + offset = 12; + } + mobi_buffer_setpos(buf, *m->mh->header_length + RECORD0_HEADER_LEN + offset); + } else { + /* offset 14 */ + mobi_buffer_setpos(buf, 14); + } + + unsigned char key_enc[KEYSIZE]; + mobi_buffer_getraw(key_enc, buf, KEYSIZE); + mobi_buffer_free_null(buf); + MOBI_RET ret = mobi_pk1_decrypt(key, key_enc, KEYSIZE, INTERNAL_READER_KEY_V1); + return ret; +} + +/** + @brief Get key corresponding to given pid + + @param[in,out] key Key + @param[in] pid PID + @param[in] m MOBIData structure with raw data and metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_drmkey_get(unsigned char key[KEYSIZE], const unsigned char *pid, const MOBIData *m) { + MOBI_RET ret; + if (m->rh && m->rh->encryption_type == MOBI_ENCRYPTION_V1) { + ret = mobi_drmkey_get_v1(key, m); + } else { + ret = mobi_drmkey_get_v2(key, pid, m); + } + return ret; +} + +/** + @brief Decrypt buffer with PK1 algorithm + + @param[in,out] out Decrypted buffer + @param[in] in Encrypted buffer + @param[in] length Buffer length + @param[in] m MOBIData structure with loaded key + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_buffer_decrypt(unsigned char *out, const unsigned char *in, const size_t length, const MOBIData *m) { + if (m == NULL || !mobi_has_drmkey(m)) { + return MOBI_INIT_FAILED; + } + MOBIDrm *drm = m->internals; + return mobi_pk1_decrypt(out, in, length, drm->key); +} + +/** + @brief Encrypt buffer with PK1 algorithm + + @param[in,out] out Encrypted buffer + @param[in] in Decrypted buffer + @param[in] length Buffer length + @param[in] m MOBIData structure with loaded key + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_buffer_encrypt(unsigned char *out, const unsigned char *in, const size_t length, const MOBIData *m) { + if (m == NULL || !mobi_has_drmkey(m)) { + return MOBI_INIT_FAILED; + } + + MOBIDrm *drm = m->internals; + return mobi_pk1_encrypt(out, in, length, drm->key); +} + +/** + @brief Calculate pid checksum + + @param[in] pid Pid + @param[out] checksum Calculated checksum + */ +static void mobi_drmpid_checksum(char checksum[2], const unsigned char *pid) { + const char map[] = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789"; + const uint8_t map_length = sizeof(map) - 1; + uint32_t crc = (uint32_t) ~m_crc32(0xffffffff, pid, PIDSIZE - 2); + crc ^= (crc >> 16); + for (size_t i = 0; i < 2; i++){ + uint8_t b = crc & 0xff; + uint8_t pos = (b / map_length) ^ (b % map_length); + checksum[i] = map[pos % map_length]; + crc >>= 8; + } +} + +/** + @brief Verify PID + + @param[in] pid PID + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_drmpid_verify(const unsigned char *pid) { + char checksum[2] = "\0"; + mobi_drmpid_checksum(checksum, pid); + if (memcmp(checksum, &pid[PIDSIZE - 2], 2) == 0) { + return MOBI_SUCCESS; + } + debug_print("checksum: %x%x, pid: %x%x\n", checksum[0], checksum[1], pid[PIDSIZE - 2], pid[PIDSIZE - 1]); + return MOBI_DRM_PIDINV; +} + +/** + @brief Verify serial number + + @param[in] serial Serial number + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_serial_verify(const char *serial) { + const size_t serial_length = strlen(serial); + if (serial_length != SERIALSIZE && serial_length != SERIALLONGSIZE) { + debug_print("Wrong serial length: %zu\n", serial_length); + return MOBI_DRM_PIDINV; + } + return MOBI_SUCCESS; +} + +/** + @brief Calculate PID from device serial number + + @param[in] serial Device serial number + @param[out] pid Pid + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_drmpid_from_serial(char pid[PIDSIZE + 1], const char *serial) { + memset(pid, 0, PIDSIZE + 1); + MOBI_RET ret = mobi_serial_verify(serial); + if (ret != MOBI_SUCCESS) { + return ret; + } + const char map[] = "ABCDEFGHIJKLMNPQRSTUVWXYZ123456789"; + unsigned char out[PIDSIZE - 2] = "\0"; + size_t out_length = sizeof(out); + const size_t serial_length = strlen(serial); + if (serial_length == SERIALSIZE) { + out_length--; + pid[out_length] = '*'; + } + uint32_t crc = (uint32_t) ~m_crc32(0xffffffff, (const unsigned char *) serial, (unsigned int) serial_length); + for (size_t i = 0; i < serial_length; i++) { + out[i % out_length] ^= serial[i]; + } + for (size_t i = 0; i < out_length; i++) { + uint8_t b = crc >> (24 - 8 * (i & 3)) & 0xff; + out[i] ^= b; + uint8_t pos = (out[i] >> 7) + ((out[i] >> 5 & 3) ^ (out[i] & 0x1f)); + /* pos max is 32 < map size */ + pid[i] = map[pos]; + } + char checksum[2] = "\0"; + mobi_drmpid_checksum(checksum, (unsigned char *) pid); + memcpy(&pid[PIDSIZE - 2], checksum, 2); + return MOBI_SUCCESS; +} + +/** + @brief Get drm components from EXTH records + + Must be deallocated after use with mobi_exthdrm_free() + + @param[in] m MOBIData structure + @return EXTHDrm structure (NULL or error) + */ +static MOBI_RET mobi_exthdrm_get(MOBIExthDrm **exth_drm, const MOBIData *m) { + if (m == NULL || m->eh == NULL || exth_drm == NULL) { + return MOBI_INIT_FAILED; + } + const MOBIExthHeader *meta = mobi_get_exthrecord_by_tag(m, EXTH_TAMPERKEYS); + + size_t token_size = 0; + unsigned char *token = NULL; + if (meta) { + MOBIBuffer *buf = mobi_buffer_init_null(meta->data, meta->size); + if (buf == NULL) { + return MOBI_MALLOC_FAILED; + } + + while (buf->offset < buf->maxlen) { + uint8_t exth_type = mobi_buffer_get8(buf); // 1 - string, 0 - binary + uint32_t exth_key = mobi_buffer_get32(buf); + const MOBIExthHeader *sub = mobi_get_exthrecord_by_tag(m, exth_key); + if (sub && sub->size) { + size_t size = sub->size; + unsigned char *data = sub->data; + char *data_converted = NULL; + if (exth_type == 1 && mobi_is_cp1252(m)) { + // FIXME: sample needed + size_t out_len = size * 3 + 1; + data_converted = malloc(out_len); + if (data_converted == NULL) { + free(token); + mobi_buffer_free_null(buf); + return MOBI_MALLOC_FAILED; + } + MOBI_RET ret = mobi_cp1252_to_utf8(data_converted, sub->data, &out_len, size); + if (ret == MOBI_SUCCESS) { + data = (unsigned char *) data_converted; + size = out_len; + } + } + size_t offset = token_size; + token_size += size; + unsigned char *tmp = realloc(token, token_size); + if (tmp == NULL) { + free(token); + free(data_converted); + mobi_buffer_free_null(buf); + return MOBI_MALLOC_FAILED; + } + token = tmp; + memcpy(token + offset, data, size); + free(data_converted); + } + } + mobi_buffer_free_null(buf); + } + + *exth_drm = malloc(sizeof(MOBIExthDrm)); + if (*exth_drm == NULL) { + free(token); + return MOBI_MALLOC_FAILED; + } + (*exth_drm)->data = meta ? meta->data : NULL; + (*exth_drm)->data_size = meta ? meta->size : 0; + (*exth_drm)->token = token; + (*exth_drm)->token_size = token_size; + + return MOBI_SUCCESS; +} + +/** + @brief Free EXTHDrm structure + + @param[in,out] exth_drm EXTHDrm to be freed + */ +static void mobi_free_exthdrm(MOBIExthDrm **exth_drm) { + if (exth_drm) { + if (*exth_drm) { + free((*exth_drm)->token); + (*exth_drm)->token = NULL; + } + free(*exth_drm); + *exth_drm = NULL; + } +} + +/** + @brief Calculate SHA-1 hash for given message + + @param[in] message Message + @param[in] message_length Message length + @param[out] hash Hash + */ +static void mobi_SHA1(unsigned char hash[SHA1_DIGEST_SIZE], size_t message_length, const unsigned char *message) { + SHA1_CTX ctx; + SHA1_Init(&ctx); + SHA1_Update(&ctx, message, message_length); + SHA1_Final(&ctx, hash); +} + +/** + @brief Calculate PID using device serial and values stored in EXTH records + + @param[in] serial Device serial number + @param[in] m MOBIData structure + @param[out] pid Pid + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_drmpid_from_serial_exth(char pid[PIDSIZE + 1], const MOBIData *m, const char *serial) { + memset(pid, 0, PIDSIZE + 1); + + MOBI_RET ret = mobi_serial_verify(serial); + if (ret != MOBI_SUCCESS) { + return ret; + } + + MOBIExthDrm *exth_drm = NULL; + ret = mobi_exthdrm_get(&exth_drm, m); + if (ret != MOBI_SUCCESS) { + return ret; + } + const size_t serial_length = strlen(serial); + size_t message_length = serial_length + exth_drm->token_size + exth_drm->data_size; + + unsigned char *message = malloc(message_length); + if (message == NULL) { + mobi_free_exthdrm(&exth_drm); + return MOBI_MALLOC_FAILED; + } + memcpy(message, serial, serial_length); + if (exth_drm->data_size) { + memcpy(&message[serial_length], exth_drm->data, exth_drm->data_size); + } + if (exth_drm->token_size) { + memcpy(&message[serial_length + exth_drm->data_size], exth_drm->token, exth_drm->token_size); + } + mobi_free_exthdrm(&exth_drm); + + unsigned char hash[SHA1_DIGEST_SIZE]; + mobi_SHA1(hash, message_length, message); + free(message); + + int bytes = 8; + uint64_t val = 0; + unsigned char *ptr = hash; + while (bytes--) { + val |= (uint64_t) *ptr++ << (bytes * 8); + } + const char map[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + for (size_t i = 0; i < 8; i++) { + uint8_t pos = (uint64_t) val >> 58; + val <<= 6; + pid[i] = map[pos]; + } + char checksum[2] = "\0"; + mobi_drmpid_checksum(checksum, (unsigned char *) pid); + memcpy(&pid[PIDSIZE - 2], checksum, 2); + return MOBI_SUCCESS; +} + +/** + @brief Store key for encryption in MOBIData stucture. + Pid will be calculated from device serial number. + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] serial Serial + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_drmkey_set_serial(MOBIData *m, const char *serial) { + char pid[PIDSIZE + 1]; + MOBI_RET ret = mobi_serial_verify(serial); + if (ret != MOBI_SUCCESS) { + return ret; + } + ret = mobi_drmpid_from_serial(pid, serial); + debug_print("Device pid: %s\n", pid); + if (ret == MOBI_SUCCESS && (ret = mobi_drmkey_set(m, pid)) == MOBI_SUCCESS) { + return MOBI_SUCCESS; + } + if (ret != MOBI_DRM_PIDINV && ret != MOBI_DRM_EXPIRED && ret != MOBI_DRM_KEYNOTFOUND) { + /* return in case of non-drm error */ + return ret; + } + bool isExpired = (ret == MOBI_DRM_EXPIRED); + ret = mobi_drmpid_from_serial_exth(pid, m, serial); + debug_print("Book pid: %s\n", pid); + if (ret == MOBI_SUCCESS && (ret = mobi_drmkey_set(m, pid) == MOBI_SUCCESS)) { + return MOBI_SUCCESS; + } + return isExpired ? MOBI_DRM_EXPIRED : ret; +} + +/** + @brief Store DRM cookie data in MOBIData stucture + + This data is needed to encrypt main key during DRM applying process + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] pid PID, NULL if not set + @param[in] valid_from Voucher validity start time, 0 if not set + @param[in] valid_to Voucher expire time, MOBI_NOTSET if not set + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_cookie_add(MOBIData *m, const unsigned char *pid, const uint32_t valid_from, const uint32_t valid_to) { + if (valid_from > valid_to) { + return MOBI_PARAM_ERR; + } + if (m->internals == NULL && (m->internals = mobi_drm_init()) == NULL) { + return MOBI_MALLOC_FAILED; + } + MOBIDrm *drm = m->internals; + if (drm->cookies_count == VOUCHERS_COUNT_MAX) { + debug_print("Maximum PID count reached (%d) %s", VOUCHERS_COUNT_MAX, "\n"); + return MOBI_PARAM_ERR; + } + if (drm->cookies_count == 0) { + drm->cookies = malloc(sizeof(*drm->cookies)); + } else { + MOBICookie **tmp = realloc(drm->cookies, (drm->cookies_count + 1) * sizeof(*drm->cookies)); + if (tmp == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + drm->cookies = tmp; + } + + MOBICookie *cookie = calloc(1, sizeof(MOBICookie)); + if (cookie == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + + cookie->valid_from = valid_from; + cookie->valid_to = valid_to; + if (pid) { + cookie->pid = malloc(PIDSIZE); + if (cookie->pid == NULL) { + debug_print("Memory allocation failed%s", "\n"); + free(cookie); + return MOBI_MALLOC_FAILED; + } + memcpy(cookie->pid, pid, PIDSIZE); + } + + drm->cookies[drm->cookies_count++] = cookie; + + return MOBI_SUCCESS; +} + +/** + @brief Store pid for encryption in MOBIData stucture + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] pid PID + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_drmpid_add(MOBIData *m, const unsigned char *pid) { + return mobi_cookie_add(m, pid, 0, MOBI_NOTSET); +} + +/** + @brief Adds tamperproof keys record to EXTH header + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] tamperkeys Array of tags to put in tamperproof record + @param[in] tamperkeys_count Tags count + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_tamperkeys_add(MOBIData *m, const MOBIExthTag *tamperkeys, const size_t tamperkeys_count) { + + if (m == NULL) { + return MOBI_INIT_FAILED; + } + if (tamperkeys_count == 0 || tamperkeys == NULL ) { + return MOBI_PARAM_ERR; + } + + // size of buffer is 5 bytes for each array member + const size_t record_size = tamperkeys_count * 5; + if (record_size >= UINT32_MAX) { + debug_print("Too many tamperkeys: %zu\n", record_size); + return MOBI_PARAM_ERR; + } + MOBIBuffer *buf = mobi_buffer_init(record_size); + if (buf == NULL) { + return MOBI_MALLOC_FAILED; + } + + for (size_t i = 0; i < tamperkeys_count; i++) { + MOBIExthHeader *tag = mobi_get_exthrecord_by_tag(m, tamperkeys[i]); + if (tag == NULL) { + debug_print("Missing EXTH record with tag %u\n", tamperkeys[i]); + mobi_buffer_free(buf); + return MOBI_PARAM_ERR; + } + MOBIExthMeta meta = mobi_get_exthtagmeta_by_tag(tamperkeys[i]); + uint8_t tag_type = meta.type == EXTH_STRING ? 1 : 0; + mobi_buffer_add8(buf, tag_type); + mobi_buffer_add32(buf, tamperkeys[i]); + } + + mobi_delete_exthrecord_by_tag(m, EXTH_TAMPERKEYS); + MOBI_RET ret = mobi_add_exthrecord(m, EXTH_TAMPERKEYS, (uint32_t) record_size, buf->data); + + mobi_buffer_free(buf); + + return ret; +} + +/** + @brief Add DRM voucher + + @see mobi_drm_addvoucher + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] serial Device serial number + @param[in] valid_from Voucher validity start time, -1 if not set + @param[in] valid_to Voucher expire time, -1 if not set + @param[in] tamperkeys Array of EXTH tags to include in PID generation, NULL if none + @param[in] tamperkeys_count Count of EXTH tags + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_voucher_add(MOBIData *m, const char *serial, const time_t valid_from, const time_t valid_to, + const MOBIExthTag *tamperkeys, const size_t tamperkeys_count) { + + if (tamperkeys_count) { + mobi_tamperkeys_add(m, tamperkeys, tamperkeys_count); + } + + // calculate PID if serial is provided + char serial_pid[PIDSIZE + 1]; + unsigned char *pid = NULL; + if (serial) { + MOBI_RET ret = mobi_drmpid_from_serial(serial_pid, serial); + debug_print("Pid for device serial %s: %s\n", serial, serial_pid); + if (ret != MOBI_SUCCESS) { + return ret; + } + pid = (unsigned char *) serial_pid; + } + + // convert time values to mobi format + uint32_t from = 0; + if (valid_from > 0 && (size_t) (valid_from / 60) <= UINT32_MAX) { + from = (uint32_t) (valid_from / 60); + } + uint32_t to = MOBI_NOTSET; + if (valid_to >= 0 && (size_t) (valid_to / 60) <= UINT32_MAX) { + to = (uint32_t) (valid_to / 60); + } + + // Verification on Kindles requires both dates to be set but we allow users to set just one. + // Set missing range limit if necessary. + if (from != 0 && to == MOBI_NOTSET) { + to = UINT32_MAX - 1; + } + if (to != MOBI_NOTSET && from == 0) { + from = 1; + } + + return mobi_cookie_add(m, pid, from, to); +} + +/** + @brief Store key for encryption in MOBIData stucture + + In case of encrypted document key is extracted from document. PID may be needed. + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] pid PID, may be NULL in case of encryption type 1, which does not use PID + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_drmkey_set(MOBIData *m, const char *pid) { + if (m == NULL || m->rh == NULL) { + return MOBI_INIT_FAILED; + } + + MOBI_RET ret; + unsigned char *drm_pid = (unsigned char *) pid; + if (pid) { + const size_t pid_length = strlen(pid); + if (pid_length != PIDSIZE) { + debug_print("PID size is wrong (%zu)\n", pid_length); + return MOBI_DRM_PIDINV; + } + ret = mobi_drmpid_verify(drm_pid); + if (ret != MOBI_SUCCESS) { + debug_print("PID is invalid%s", "\n"); + return ret; + } + if (!mobi_is_encrypted(m)) { + debug_print("Document not encrypted, adding voucher%s", "\n"); + mobi_drmpid_add(m, drm_pid); + return MOBI_SUCCESS; + } + } + + if (drm_pid && m->rh->encryption_type == MOBI_ENCRYPTION_V1) { + /* PID not needed */ + debug_print("Encryption doesn't require PID%s", "\n"); + drm_pid = NULL; + } + unsigned char key[KEYSIZE]; + ret = mobi_drmkey_get(key, drm_pid, m); + if (ret != MOBI_SUCCESS) { + debug_print("Key not found%s", "\n"); + return ret; + } + ret = mobi_drmkey_init(m, key); + if (ret != MOBI_SUCCESS) { + return ret; + } + + if (m->rh->encryption_type > 1) { + ret = mobi_drmpid_add(m, drm_pid); + } + + return ret; +} + +/** + @brief Remove key from MOBIData structure + + @param[in,out] m MOBIData structure with raw data and metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_drmkey_delete(MOBIData *m) { + if (m == NULL) { + return MOBI_INIT_FAILED; + } + mobi_free_drm(m); + return MOBI_SUCCESS; +} + +/** + @brief Mark document as encrypted + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] encryption_type Encryption type + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_drm_set(MOBIData *m, const uint16_t encryption_type) { + + m->rh->encryption_type = encryption_type; + + if (encryption_type == MOBI_ENCRYPTION_V2) { + if (m->mh == NULL) { + return MOBI_DATA_CORRUPT; + } + if (m->mh->drm_size == NULL) { + m->mh->drm_size = malloc(sizeof(uint32_t)); + if (m->mh->drm_size == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + } + if (m->mh->drm_offset == NULL) { + m->mh->drm_offset = malloc(sizeof(uint32_t)); + if (m->mh->drm_offset == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + } + if (m->mh->drm_count == NULL) { + m->mh->drm_count = malloc(sizeof(uint32_t)); + if (m->mh->drm_count == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + } + if (m->mh->drm_flags == NULL) { + m->mh->drm_flags = malloc(sizeof(uint32_t)); + if (m->mh->drm_flags == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + } + + size_t drm_size = VOUCHERS_SIZE_MIN; + MOBIDrm *drm = m->internals; + if (drm->cookies_count * VOUCHERSIZE > VOUCHERS_SIZE_MIN) { + drm_size = drm->cookies_count * VOUCHERSIZE; + } + *m->mh->drm_size = (uint32_t) drm_size; + /* initial offset set to unknown */ + *m->mh->drm_offset = MOBI_NOTSET; + /* flags: b0 = 1 internal key? */ + *m->mh->drm_flags = 2048; + *m->mh->drm_count = drm->cookies_count; + } + + return MOBI_SUCCESS; +} + +/** + @brief Mark document as decrypted + + @param[in,out] m MOBIData structure with raw data and metadata + */ +static void mobi_drm_unset(MOBIData *m) { + if (m->rh->encryption_type == MOBI_ENCRYPTION_V2 && m->mh) { + if (m->mh->drm_offset) { + *m->mh->drm_offset = MOBI_NOTSET; + } + if (m->mh->drm_size) { + *m->mh->drm_size = 0; + } + if (m->mh->drm_count) { + *m->mh->drm_count = 0; + } + if (m->mh->drm_flags) { + *m->mh->drm_flags = 0; + } + } + m->rh->encryption_type = MOBI_ENCRYPTION_NONE; + + mobi_drmkey_delete(m); +} + +/** + @brief Decrypt or encrypt records + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] is_decryption Should we decrypt or encrypt + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_drm_records(MOBIData *m, const bool is_decryption) { + + /* FIXME: hybrid files are not encrypted, are they? */ + size_t text_rec_index = 1; + + if (!is_decryption) { + const size_t offset = mobi_get_kf8offset(m); + if (m->rh == NULL || m->rh->text_record_count == 0) { + debug_print("%s", "Text records not found in MOBI header\n"); + return MOBI_DATA_CORRUPT; + } + text_rec_index = 1 + offset; + } + + size_t text_rec_count = m->rh->text_record_count; + const uint16_t compression_type = m->rh->compression_type; + uint16_t extra_flags = 0; + if (m->mh && m->mh->extra_flags) { + extra_flags = *m->mh->extra_flags; + } + if (compression_type != MOBI_COMPRESSION_HUFFCDIC) { + /* encrypt also multibyte extra data */ + extra_flags &= 0xfffe; + } + /* get first text record */ + const MOBIPdbRecord *curr = mobi_get_record_by_seqnumber(m, text_rec_index); + + while (text_rec_count-- && curr) { + size_t extra_size = 0; + if (extra_flags) { + extra_size = mobi_get_record_extrasize(curr, extra_flags); + if (extra_size == MOBI_NOTSET || extra_size >= curr->size) { + return MOBI_DATA_CORRUPT; + } + } + + size_t decrypt_size = curr->size - extra_size;; + unsigned char *decrypted = malloc(decrypt_size); + if (decrypted == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + + MOBI_RET ret; + if (is_decryption) { + ret = mobi_buffer_decrypt(decrypted, curr->data, decrypt_size, m); + } else { + ret = mobi_buffer_encrypt(decrypted, curr->data, decrypt_size, m); + } + if (ret != MOBI_SUCCESS) { + free(decrypted); + return ret; + } + memcpy(curr->data, decrypted, decrypt_size); + free(decrypted); + curr = curr->next; + } + + return MOBI_SUCCESS; +} + +/** + @brief Decrypt document. + + It is not necessary to call this function in order to parse encrypted document. + If pid is set document will be decrypted automatically during uncompression. + The reason for this function is to load and resave decrypted document without parsing. + + @param[in,out] m MOBIData structure with raw data and metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_drm_decrypt(MOBIData *m) { + if (m == NULL) { + return MOBI_INIT_FAILED; + } + if (!mobi_is_encrypted(m)) { + debug_print("%s\n", "Document not encrypted"); + return MOBI_SUCCESS; + } + if (m->rh == NULL || m->rh->text_record_count == 0) { + debug_print("%s\n", "No records to decrypt"); + return MOBI_SUCCESS; + } + + MOBI_RET ret; + if (!mobi_has_drmkey(m)) { + /* try to set key */ + debug_print("%s\n", "Trying to set key for encryption without device PID"); + ret = mobi_drm_setkey(m, NULL); + if (ret != MOBI_SUCCESS) { + debug_print("%s\n", "Key setting failed"); + return ret; + } + } + + ret = mobi_drm_records(m, true); + if (ret != MOBI_SUCCESS) { + return ret; + } + + mobi_drm_unset(m); + + return MOBI_SUCCESS; +} + +/** + @brief Serialize encryption voucher + + This supports key types 1 and 3, used on eInk devices + + @param[in,out] buf Output buffer + @param[in] key Main encryption key + @param[in] cookie Voucher cookie data + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_voucher_serialize(MOBIBuffer *buf, const unsigned char *key, const MOBICookie *cookie) { + + MOBI_RET ret; + // Notes on reversing flags + // 5 first bits (flags & 0x1f) mean key type: + // type 1 - device serial + exth key, + // type 2 - device generic type id (no samples, not used any more?), + // type 3 – internal key. + // If drm flags in mobi header have bit 0 set then additional user password is used (probably not used any more). + // In case of password protection temporary key is additionally encrypted with password (bit 4 must be set?) + // In case of key types 1 and 2 bit 11 (0x800) must be set, unless there is additional password + // Bit 6 (0x40) must be set, otherwise found key is not used. + uint32_t flags; + unsigned char pidkey[KEYSIZE] = "\0"; + if (cookie->pid) { + flags = 0x841; // key type 1 + memcpy(pidkey, cookie->pid, PIDSIZE - 2); + ret = mobi_pk1_encrypt(pidkey, pidkey, KEYSIZE, INTERNAL_READER_KEY); + if (ret != MOBI_SUCCESS) { + return ret; + } + } else { + memcpy(pidkey, INTERNAL_READER_KEY, KEYSIZE); + flags = 0x43; // key type 3 + } + + uint8_t pidkey_checksum = mobi_drmkey_checksum(pidkey); + uint32_t verification = 0x43; // always same in real files, why??? + + mobi_buffer_add32(buf, verification); // 0: verification + mobi_buffer_add32(buf, VOUCHERSIZE); // 4: size + mobi_buffer_add32(buf, 1); // 8: always 1 ? + mobi_buffer_add8(buf, pidkey_checksum); // 12: pid checksum + mobi_buffer_addzeros(buf, 3); + // start of encrypted part - cookie + unsigned char *cookie_buf = buf->data + buf->offset; + mobi_buffer_add32(buf, verification); // 16: verification + mobi_buffer_add32(buf, flags); // 20: flags + mobi_buffer_addraw(buf, key, KEYSIZE); // 24: key + mobi_buffer_add32(buf, cookie->valid_to); // 40: valid to + mobi_buffer_add32(buf, cookie->valid_from); // 44: valid from + + ret = mobi_pk1_encrypt(cookie_buf, cookie_buf, COOKIESIZE, pidkey); + if (ret != MOBI_SUCCESS) { + return ret; + } + + return MOBI_SUCCESS; +} + +/** + @brief Serialize encryption scheme version 2 + + @param[in,out] buf Output buffer + @param[in] m MOBIData structure with raw data and metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_drm_serialize_v2(MOBIBuffer *buf, const MOBIData *m) { + if (!m || !m->mh || m->internals == NULL) { + return MOBI_INIT_FAILED; + } + + size_t saved_offset = buf->offset; + + mobi_buffer_setpos(buf, *m->mh->drm_offset); + + MOBIDrm *drm = m->internals; + for (size_t i = 0; i < drm->cookies_count; i++) { + MOBI_RET ret = mobi_voucher_serialize(buf, drm->key, drm->cookies[i]); + if (ret != MOBI_SUCCESS) { + return ret; + } + } + size_t cookies_count_min = VOUCHERS_SIZE_MIN / VOUCHERSIZE; + if (drm->cookies_count < cookies_count_min) { + // pad with zeros + mobi_buffer_addzeros(buf, (cookies_count_min - drm->cookies_count) * VOUCHERSIZE); + } + + mobi_buffer_setpos(buf, saved_offset); + + return MOBI_SUCCESS; +} + +/** + @brief Serialize encryption scheme version 1 + + @param[in,out] buf Output buffer + @param[in] m MOBIData structure with raw data and metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_drm_serialize_v1(MOBIBuffer *buf, const MOBIData *m) { + + size_t saved_offset = buf->offset; + + size_t mobi_version = mobi_get_fileversion(m); + + if (mobi_version > 1) { + /* offset mobi header + record 0 header (+ 12 in newer files) */ + if (m->mh == NULL || m->mh->header_length == NULL) { + return MOBI_DATA_CORRUPT; + } + size_t offset = 0; + if (mobi_version > 2) { + offset = 12; + } + mobi_buffer_setpos(buf, *m->mh->header_length + RECORD0_HEADER_LEN + offset); + } else { + /* offset 14 */ + mobi_buffer_setpos(buf, 14); + } + + MOBIDrm *drm = m->internals; + + uint8_t key_type = 1; // 1 - simple, 2 - verification password, 4 - verification key + unsigned char *key_offset = buf->data + buf->offset; + mobi_buffer_addraw(buf, drm->key, KEYSIZE); // 0 + mobi_buffer_addzeros(buf, 1); // 16 + // meta + unsigned char *meta_offset = buf->data + buf->offset; + mobi_buffer_add8(buf, key_type); // 17: key type + mobi_buffer_addzeros(buf, 1); // 18 + // simple: no verification + mobi_buffer_addzeros(buf, 32); // 19: password + // 25: verfication key + + MOBI_RET ret = mobi_pk1_encrypt(key_offset, key_offset, KEYSIZE + 1, INTERNAL_READER_KEY_V1); + if (ret != MOBI_SUCCESS) { + return ret; + } + ret = mobi_pk1_encrypt(meta_offset, meta_offset, 34, drm->key); + if (ret != MOBI_SUCCESS) { + return ret; + } + + mobi_buffer_setpos(buf, saved_offset); + + return MOBI_SUCCESS; +} + +/** + @brief Initializes random key + + @param[in,out] m MOBIData structure with raw data and metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_drm_generate_key(MOBIData *m) { + + unsigned char buf[KEYSIZE]; + + MOBI_RET ret = mobi_randombytes(buf, KEYSIZE); + if (ret != MOBI_SUCCESS) { + debug_print("Getting random buffer failed%s", "\n"); + return ret; + } + + return mobi_drmkey_init(m, buf); +} + +/** + @brief Encrypt document + + DRM vouchers must be added in order to use device serial number in encryption + + @param[in,out] m MOBIData structure with raw data and metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_drm_encrypt(MOBIData *m) { + + if (m == NULL) { + return MOBI_INIT_FAILED; + } + + uint16_t encryption_type = MOBI_ENCRYPTION_V2; + if (mobi_get_fileversion(m) < 4 || m->eh == NULL) { + encryption_type = MOBI_ENCRYPTION_V1; + } + debug_print("Encryption type: %u\n", encryption_type); + + MOBI_RET ret; + if (!mobi_has_drmkey(m)) { + ret = mobi_drm_generate_key(m); + if (ret != MOBI_SUCCESS) { + return ret; + } + } + + if (encryption_type == MOBI_ENCRYPTION_V2 && !mobi_has_drmcookies(m)) { + mobi_cookie_add(m, NULL, 0, MOBI_NOTSET); + } + + ret = mobi_drm_records(m, false); + if (ret != MOBI_SUCCESS) { + return ret; + } + + return mobi_drm_set(m, encryption_type); +} diff --git a/app/src/main/cpp/libmobi/src/encryption.h b/app/src/main/cpp/libmobi/src/encryption.h new file mode 100644 index 0000000..290525c --- /dev/null +++ b/app/src/main/cpp/libmobi/src/encryption.h @@ -0,0 +1,47 @@ +/** @file encryption.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef mobi_encryption_h +#define mobi_encryption_h + +#include "config.h" +#include "mobi.h" +#include "buffer.h" + +/** + @brief Drm cookie data + */ +typedef struct { + unsigned char *pid; /**< PIDs for decryption, NULL if not set */ + uint32_t valid_from; /**< validity period start time, unix time in minutes, 0 if not set */ + uint32_t valid_to; /**< validity period end time, unix time in minutes, MOBI_NOTSET if not set */ +} MOBICookie; + +/** + @brief Drm data + */ + +typedef struct { + unsigned char *key; /**< key for decryption, NULL if not set */ + uint32_t cookies_count; /**< Cookies count */ + MOBICookie **cookies; /**< DRM cookie */ +} MOBIDrm; + +void mobi_free_drm(MOBIData *m); +MOBI_RET mobi_buffer_decrypt(unsigned char *out, const unsigned char *in, const size_t length, const MOBIData *m); +MOBI_RET mobi_drmkey_set(MOBIData *m, const char *pid); +MOBI_RET mobi_drmkey_set_serial(MOBIData *m, const char *serial); +MOBI_RET mobi_drmkey_delete(MOBIData *m); +MOBI_RET mobi_voucher_add(MOBIData *m, const char *serial, const time_t valid_from, const time_t valid_to, + const MOBIExthTag *tamperkeys, const size_t tamperkeys_count); +MOBI_RET mobi_drm_serialize_v1(MOBIBuffer *buf, const MOBIData *m); +MOBI_RET mobi_drm_serialize_v2(MOBIBuffer *buf, const MOBIData *m); + +#endif /* defined(mobi_encryption_h) */ diff --git a/app/src/main/cpp/libmobi/src/index.c b/app/src/main/cpp/libmobi/src/index.c new file mode 100644 index 0000000..f8ad74f --- /dev/null +++ b/app/src/main/cpp/libmobi/src/index.c @@ -0,0 +1,1092 @@ +/** @file index.c + * @brief Functions to parse index records + * + * Copyright (c) 2020 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#define _GNU_SOURCE 1 +#ifndef __USE_BSD +#define __USE_BSD /* for strdup on linux/glibc */ +#endif + +#include +#include +#include + +#include "index.h" +#include "util.h" +#include "memory.h" +#include "debug.h" +#include "buffer.h" + + + +/** + @brief Read index entry label from buffer pointing at index record data + + @param[in,out] output Output buffer (INDX_LABEL_SIZEMAX + 1 bytes) + @param[in,out] buf MOBIBuffer structure, offset pointing at index entry label + @param[in] length Number of bytes to be read + @param[in] has_ligatures Decode ligatures if true + @return Length of output string (without null terminator), on error buf->error set to MOBI_RET status + */ +size_t mobi_indx_get_label(unsigned char *output, MOBIBuffer *buf, const size_t length, const size_t has_ligatures) { + if (!output) { + buf->error = MOBI_PARAM_ERR; + return 0; + } + if (buf->offset + length > buf->maxlen) { + debug_print("%s", "End of buffer\n"); + buf->error = MOBI_BUFFER_END; + return 0; + } + const unsigned char replacement = 0x3f; + size_t output_length = 0; + size_t i = 0; + while (i < length && output_length < INDX_LABEL_SIZEMAX) { + unsigned char c = mobi_buffer_get8(buf); + i++; + if (c == 0) { + /* FIXME: is it safe to replace zeroes? */ + debug_print("Invalid character: %u\n", c); + c = replacement; + } + if (c <= 5 && has_ligatures) { + unsigned char c2 = mobi_buffer_get8(buf); + c = mobi_ligature_to_cp1252(c, c2); + if (c == 0) { + debug_print("Invalid ligature sequence%s", "\n"); + mobi_buffer_seek(buf, -1); + c = replacement; + } else { + i++; + } + } + *output++ = c; + output_length++; + } + *output = '\0'; + return output_length; +} + +/** + @brief Parser of ORDT section of INDX record + + @param[in,out] buf MOBIBuffer structure, offset pointing at beginning of TAGX section + @param[in,out] ordt MOBIOrdt structure to be filled by the function + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_parse_ordt(MOBIBuffer *buf, MOBIOrdt *ordt) { + /* read ORDT1 */ + mobi_buffer_setpos(buf, ordt->ordt1_pos); + if (mobi_buffer_match_magic(buf, ORDT_MAGIC)) { + debug_print("%s\n", "ORDT1 section found"); + mobi_buffer_seek(buf, 4); + if (ordt->offsets_count + buf->offset > buf->maxlen) { + debug_print("ORDT1 section too long (%zu)", ordt->offsets_count); + return MOBI_DATA_CORRUPT; + } + ordt->ordt1 = malloc(ordt->offsets_count * sizeof(*ordt->ordt1)); + if (ordt->ordt1 == NULL) { + debug_print("%s", "Memory allocation failed for ORDT1 offsets\n"); + return MOBI_MALLOC_FAILED; + } + size_t i = 0; + while (i < ordt->offsets_count) { + ordt->ordt1[i++] = mobi_buffer_get8(buf); + } + debug_print("ORDT1: read %zu entries\n", ordt->offsets_count); + } + /* read ORDT2 */ + mobi_buffer_setpos(buf, ordt->ordt2_pos); + if (mobi_buffer_match_magic(buf, ORDT_MAGIC)) { + debug_print("%s\n", "ORDT2 section found"); + mobi_buffer_seek(buf, 4); + if (ordt->offsets_count * 2 + buf->offset > buf->maxlen) { + debug_print("ORDT2 section too long (%zu)", ordt->offsets_count); + return MOBI_DATA_CORRUPT; + } + ordt->ordt2 = malloc(ordt->offsets_count * sizeof(*ordt->ordt2)); + if (ordt->ordt2 == NULL) { + debug_print("%s", "Memory allocation failed for ORDT2 offsets\n"); + return MOBI_MALLOC_FAILED; + } + size_t i = 0; + while (i < ordt->offsets_count) { + ordt->ordt2[i++] = mobi_buffer_get16(buf); + } + debug_print("ORDT2: read %zu entries\n", ordt->offsets_count); + } + return MOBI_SUCCESS; +} + +/** + @brief Parser of TAGX section of INDX record + + @param[in,out] buf MOBIBuffer structure, offset pointing at beginning of TAGX section + @param[in,out] tagx MOBITagx structure to be filled by the function + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_parse_tagx(MOBIBuffer *buf, MOBITagx *tagx) { + tagx->control_byte_count = 0; + tagx->tags_count = 0; + tagx->tags = NULL; + mobi_buffer_seek(buf, 4); /* skip header */ + uint32_t tagx_record_length = mobi_buffer_get32(buf); + if (tagx_record_length < 12) { + debug_print("INDX record too short: %u\n", tagx_record_length); + return MOBI_DATA_CORRUPT; + } + tagx->control_byte_count = mobi_buffer_get32(buf); + tagx_record_length -= 12; + if (tagx_record_length + buf->offset > buf->maxlen) { + debug_print("INDX record too long: %u\n", tagx_record_length); + return MOBI_DATA_CORRUPT; + } + tagx->tags = malloc(tagx_record_length * sizeof(TAGXTags)); + if (tagx->tags == NULL) { + debug_print("%s", "Memory allocation failed for TAGX tags\n"); + return MOBI_MALLOC_FAILED; + } + size_t i = 0; + const size_t tagx_data_length = tagx_record_length / 4; + size_t control_byte_count = 0; + while (i < tagx_data_length) { + tagx->tags[i].tag = mobi_buffer_get8(buf); + tagx->tags[i].values_count = mobi_buffer_get8(buf); + tagx->tags[i].bitmask = mobi_buffer_get8(buf); + const uint8_t control_byte = mobi_buffer_get8(buf); + if (control_byte) { control_byte_count++; } + tagx->tags[i].control_byte = control_byte; + debug_print("tagx[%zu]:\t%i\t%i\t%i\t%i\n", i, tagx->tags[i].tag, tagx->tags[i].values_count, tagx->tags[i].bitmask, control_byte); + i++; + } + if (tagx->control_byte_count != control_byte_count) { + debug_print("Wrong count of control bytes: %zu != %zu\n", tagx->control_byte_count, control_byte_count); + free(tagx->tags); + tagx->tags = NULL; + tagx->control_byte_count = 0; + return MOBI_DATA_CORRUPT; + } + tagx->tags_count = i; + return MOBI_SUCCESS; +} + +/** + @brief Parser of IDXT section of INDX record + + @param[in,out] buf MOBIBuffer structure, offset pointing at beginning of TAGX section + @param[in,out] idxt MOBITagx structure to be filled by the function + @param[in] entries_count Number of index entries + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_parse_idxt(MOBIBuffer *buf, MOBIIdxt *idxt, const size_t entries_count) { + const uint32_t idxt_offset = (uint32_t) buf->offset; + idxt->offsets_count = 0; + char idxt_magic[5]; + mobi_buffer_getstring(idxt_magic, buf, 4); + if (strncmp(idxt_magic, IDXT_MAGIC, 4) != 0) { + debug_print("IDXT wrong magic: %s\n", idxt_magic); + return MOBI_DATA_CORRUPT; + } + size_t i = 0; + while (i < entries_count) { + /* entry offsets */ + idxt->offsets[i++] = mobi_buffer_get16(buf); + } + /* last entry end position is IDXT tag offset */ + idxt->offsets[i] = idxt_offset; + idxt->offsets_count = i; + return MOBI_SUCCESS; +} + +/** + @brief Get encoded character from dictionary index + The characters are offsets into ORDT table + + @param[in] ordt MOBIOrdt structure (ORDT data and metadata) + @param[in,out] buf MOBIBuffer structure with index data + @param[in,out] offset Value read from buffer + @return Number of bytes read (zero in case of error) + */ +size_t mobi_ordt_getbuffer(const MOBIOrdt *ordt, MOBIBuffer *buf, uint16_t *offset) { + size_t i = 0; + if (ordt->type == 1) { + *offset = mobi_buffer_get8(buf); + i++; + } else { + *offset = mobi_buffer_get16(buf); + i += 2; + } + return i; +} + +/** + @brief Fetch UTF-16 value from ORDT2 table + + @param[in] ordt MOBIOrdt structure (ORDT data and metadata) + @param[in] offset Offset in ORDT2 table + @return UTF-16 code point + */ +uint16_t mobi_ordt_lookup(const MOBIOrdt *ordt, const uint16_t offset) { + uint16_t utf16; + if (offset < ordt->offsets_count) { + utf16 = ordt->ordt2[offset]; + } else { + utf16 = offset; + } + return utf16; +} + +/** + @brief Get UTF-8 string from buffer, decoded by lookups in ORDT2 table + + @param[in] ordt MOBIOrdt structure (ORDT data and metadata) + @param[in,out] buf MOBIBuffer structure with input string + @param[in,out] output Output buffer (INDX_LABEL_SIZEMAX + 1 bytes) + @param[in] length Length of input string contained in buf + @return Length of output string (without null terminator) + */ +size_t mobi_getstring_ordt(const MOBIOrdt *ordt, MOBIBuffer *buf, unsigned char *output, size_t length) { + size_t i = 0; + size_t output_length = 0; + const uint32_t bytemask = 0xbf; + const uint32_t bytemark = 0x80; + const uint32_t uni_replacement = 0xfffd; + const uint32_t surrogate_offset = 0x35fdc00; + static const uint8_t init_byte[7] = { 0x00, 0x00, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc }; + while (i < length) { + uint16_t offset; + i += mobi_ordt_getbuffer(ordt, buf, &offset); + uint32_t codepoint = mobi_ordt_lookup(ordt, offset); + if (codepoint <= 5) { + size_t k = mobi_ordt_getbuffer(ordt, buf, &offset); + uint32_t codepoint2 = mobi_ordt_lookup(ordt, offset); + codepoint = mobi_ligature_to_utf16(codepoint, codepoint2); + if (codepoint == uni_replacement) { + /* rewind buffer to codepoint2 */ + debug_print("Invalid ligature sequence%s", "\n"); + mobi_buffer_seek(buf, - (int) k); + } else { + i += k; + } + } + /* convert UTF-16 surrogates into UTF-32 */ + if (codepoint >= 0xd800 && codepoint <= 0xdbff) { + size_t k = mobi_ordt_getbuffer(ordt, buf, &offset); + uint32_t codepoint2 = mobi_ordt_lookup(ordt, offset); + if (codepoint2 >= 0xdc00 && codepoint2 <= 0xdfff) { + i += k; + codepoint = (codepoint << 10) + codepoint2 - surrogate_offset; + } else { + /* illegal unpaired high surrogate */ + /* rewind buffer to codepoint2 */ + debug_print("Invalid code point: %u\n", codepoint); + mobi_buffer_seek(buf, - (int) k); + codepoint = uni_replacement; + } + } + if ((codepoint >= 0xdc00 && codepoint <= 0xdfff) /* unpaired low surrogate */ + || (codepoint >= 0xfdd0 && codepoint <= 0xfdef) /* invalid characters */ + || (codepoint & 0xfffe) == 0xfffe /* reserved characters */ + || codepoint == 0 /* remove zeroes */) { + codepoint = uni_replacement; + debug_print("Invalid code point: %u\n", codepoint); + } + /* Conversion routine based on unicode's ConvertUTF.c */ + size_t bytes; + if (codepoint < 0x80) { bytes = 1; } + else if (codepoint < 0x800) { bytes = 2; } + else if (codepoint < 0x10000) { bytes = 3; } + else if (codepoint < 0x110000) { bytes = 4; } + else { + bytes = 3; + codepoint = uni_replacement; + debug_print("Invalid code point: %u\n", codepoint); + } + if (output_length + bytes >= INDX_LABEL_SIZEMAX) { + debug_print("%s\n", "INDX label too long"); + break; + } + output += bytes; + switch (bytes) { + case 4: *--output = (uint8_t)((codepoint | bytemark) & bytemask); codepoint >>= 6; /* falls through */ + case 3: *--output = (uint8_t)((codepoint | bytemark) & bytemask); codepoint >>= 6; /* falls through */ + case 2: *--output = (uint8_t)((codepoint | bytemark) & bytemask); codepoint >>= 6; /* falls through */ + case 1: *--output = (uint8_t)(codepoint | init_byte[bytes]); + } + output += bytes; + output_length += bytes; + } + *output = '\0'; + return output_length; +} + +/** + @brief Parser of INDX index entry + + @param[in,out] indx MOBIIndx structure, to be filled with parsed data + @param[in] idxt MOBIIdxt structure with parsed IDXT index + @param[in] tagx MOBITagx structure with parsed TAGX index + @param[in,out] buf MOBIBuffer structure with index data + @param[in] curr_number Sequential number of an index entry for current record + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_parse_index_entry(MOBIIndx *indx, const MOBIIdxt idxt, const MOBITagx *tagx, const MOBIOrdt *ordt, MOBIBuffer *buf, const size_t curr_number) { + if (indx == NULL) { + debug_print("%s", "INDX structure not initialized\n"); + return MOBI_INIT_FAILED; + } + const size_t entry_offset = indx->entries_count; + const size_t entry_length = idxt.offsets[curr_number + 1] - idxt.offsets[curr_number]; + mobi_buffer_setpos(buf, idxt.offsets[curr_number]); + size_t entry_number = curr_number + entry_offset; + if (entry_number >= indx->total_entries_count) { + debug_print("Entry number beyond array: %zu\n", entry_number); + return MOBI_DATA_CORRUPT; + } + /* save original record maxlen */ + const size_t buf_maxlen = buf->maxlen; + if (buf->offset + entry_length >= buf_maxlen) { + debug_print("Entry length too long: %zu\n", entry_length); + return MOBI_DATA_CORRUPT; + } + buf->maxlen = buf->offset + entry_length; + size_t label_length = mobi_buffer_get8(buf); + if (label_length > entry_length) { + debug_print("Label length too long: %zu\n", label_length); + return MOBI_DATA_CORRUPT; + } + char text[INDX_LABEL_SIZEMAX + 1]; + /* FIXME: what is ORDT1 for? */ + if (ordt->ordt2) { + label_length = mobi_getstring_ordt(ordt, buf, (unsigned char*) text, label_length); + } else { + label_length = mobi_indx_get_label((unsigned char*) text, buf, label_length, indx->ligt_entries_count); + if (buf->error != MOBI_SUCCESS) { + debug_print("Buffer error reading label: %d\n", buf->error); + return MOBI_DATA_CORRUPT; + } + } + indx->entries[entry_number].label = malloc(label_length + 1); + if (indx->entries[entry_number].label == NULL) { + debug_print("Memory allocation failed (%zu bytes)\n", label_length); + return MOBI_MALLOC_FAILED; + } + strncpy(indx->entries[entry_number].label, text, label_length + 1); + //debug_print("tag label[%zu]: %s\n", entry_number, indx->entries[entry_number].label); + unsigned char *control_bytes; + control_bytes = buf->data + buf->offset; + mobi_buffer_seek(buf, (int) tagx->control_byte_count); + indx->entries[entry_number].tags_count = 0; + indx->entries[entry_number].tags = NULL; + if (tagx->tags_count > 0) { + typedef struct { + uint8_t tag; + uint8_t tag_value_count; + uint32_t value_count; + uint32_t value_bytes; + } MOBIPtagx; + MOBIPtagx *ptagx = malloc(tagx->tags_count * sizeof(MOBIPtagx)); + if (ptagx == NULL) { + debug_print("Memory allocation failed (%zu bytes)\n", tagx->tags_count * sizeof(MOBIPtagx)); + free(indx->entries[entry_number].label); + indx->entries[entry_number].label = NULL; + return MOBI_MALLOC_FAILED; + } + uint32_t ptagx_count = 0; + size_t len; + size_t i = 0; + while (i < tagx->tags_count) { + if (tagx->tags[i].control_byte == 1) { + control_bytes++; + i++; + continue; + } + uint32_t value = control_bytes[0] & tagx->tags[i].bitmask; + if (value != 0) { + /* FIXME: is it safe to use MOBI_NOTSET? */ + uint32_t value_count = MOBI_NOTSET; + uint32_t value_bytes = MOBI_NOTSET; + /* all bits of masked value are set */ + if (value == tagx->tags[i].bitmask) { + /* more than 1 bit set */ + if (mobi_bitcount(tagx->tags[i].bitmask) > 1) { + /* read value bytes from entry */ + len = 0; + value_bytes = mobi_buffer_get_varlen(buf, &len); + } else { + value_count = 1; + } + } else { + uint8_t mask = tagx->tags[i].bitmask; + while ((mask & 1) == 0) { + mask >>= 1; + value >>= 1; + } + value_count = value; + } + ptagx[ptagx_count].tag = tagx->tags[i].tag; + ptagx[ptagx_count].tag_value_count = tagx->tags[i].values_count; + ptagx[ptagx_count].value_count = value_count; + ptagx[ptagx_count].value_bytes = value_bytes; + ptagx_count++; + } + i++; + } + indx->entries[entry_number].tags = malloc(tagx->tags_count * sizeof(MOBIIndexTag)); + if (indx->entries[entry_number].tags == NULL) { + debug_print("Memory allocation failed (%zu bytes)\n", tagx->tags_count * sizeof(MOBIIndexTag)); + free(indx->entries[entry_number].label); + indx->entries[entry_number].label = NULL; + free(ptagx); + return MOBI_MALLOC_FAILED; + } + i = 0; + while (i < ptagx_count) { + uint32_t tagvalues_count = 0; + /* FIXME: is it safe to use MOBI_NOTSET? */ + /* value count is set */ + uint32_t tagvalues[INDX_TAGVALUES_MAX]; + if (ptagx[i].value_count != MOBI_NOTSET) { + size_t count = ptagx[i].value_count * ptagx[i].tag_value_count; + while (count-- && tagvalues_count < INDX_TAGVALUES_MAX) { + len = 0; + const uint32_t value_bytes = mobi_buffer_get_varlen(buf, &len); + tagvalues[tagvalues_count++] = value_bytes; + } + /* value count is not set */ + } else { + /* read value_bytes bytes */ + len = 0; + while (len < ptagx[i].value_bytes && tagvalues_count < INDX_TAGVALUES_MAX) { + const uint32_t value_bytes = mobi_buffer_get_varlen(buf, &len); + tagvalues[tagvalues_count++] = value_bytes; + } + } + if (tagvalues_count) { + const size_t arr_size = tagvalues_count * sizeof(*indx->entries[entry_number].tags[i].tagvalues); + indx->entries[entry_number].tags[i].tagvalues = malloc(arr_size); + if (indx->entries[entry_number].tags[i].tagvalues == NULL) { + debug_print("Memory allocation failed (%zu bytes)\n", arr_size); + free(indx->entries[entry_number].label); + indx->entries[entry_number].label = NULL; + for (size_t j = 0; j < i; j++) { + free(indx->entries[entry_number].tags[j].tagvalues); + } + free(indx->entries[entry_number].tags); + indx->entries[entry_number].tags = NULL; + free(ptagx); + return MOBI_MALLOC_FAILED; + } + memcpy(indx->entries[entry_number].tags[i].tagvalues, tagvalues, arr_size); + } else { + indx->entries[entry_number].tags[i].tagvalues = NULL; + } + indx->entries[entry_number].tags[i].tagid = ptagx[i].tag; + indx->entries[entry_number].tags[i].tagvalues_count = tagvalues_count; + indx->entries[entry_number].tags_count++; + i++; + } + free(ptagx); + } + /* restore buffer maxlen */ + buf->maxlen = buf_maxlen; + return MOBI_SUCCESS; +} + +/** + @brief Parser of INDX record + + @param[in] indx_record MOBIPdbRecord structure with INDX record + @param[in,out] indx MOBIIndx structure to be filled with parsed entries + @param[in,out] tagx MOBITagx structure, will be filled with parsed TAGX section data if present in the INDX record, otherwise TAGX data will be used to parse the record + @param[in,out] ordt MOBIOrdt structure, will be filled with parsed ORDT sections + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_indx(const MOBIPdbRecord *indx_record, MOBIIndx *indx, MOBITagx *tagx, MOBIOrdt *ordt) { + if (indx_record == NULL || indx == NULL || tagx == NULL || ordt == NULL) { + debug_print("%s", "index structure not initialized\n"); + return MOBI_INIT_FAILED; + } + MOBI_RET ret = MOBI_SUCCESS; + MOBIBuffer *buf = mobi_buffer_init_null(indx_record->data, indx_record->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + char indx_magic[5]; + mobi_buffer_getstring(indx_magic, buf, 4); /* 0: INDX magic */ + const uint32_t header_length = mobi_buffer_get32(buf); /* 4: header length */ + if (strncmp(indx_magic, INDX_MAGIC, 4) != 0 || + header_length == 0 || header_length > indx_record->size) { + debug_print("INDX wrong magic: %s or header length: %u\n", indx_magic, header_length); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + mobi_buffer_seek(buf, 4); /* 8: unk, usually zeroes */ + const uint32_t type = mobi_buffer_get32(buf); /* 12: 0 - normal, 2 - inflection */ + mobi_buffer_seek(buf, 4); /* 16: unk */ + const uint32_t idxt_offset = mobi_buffer_get32(buf); /* 20: IDXT offset */ + const uint32_t entries_count = mobi_buffer_get32(buf); /* 24: entries count */ + if (entries_count > INDX_RECORD_MAXCNT) { + debug_print("Too many index entries (%u)\n", entries_count); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + /* if record contains TAGX section, read it (and ORDT) and return */ + if (mobi_buffer_match_magic_offset(buf, TAGX_MAGIC, header_length) && indx->total_entries_count == 0) { + buf->maxlen = header_length; + /* TAGX metadata */ + uint32_t encoding = mobi_buffer_get32(buf); /* 28: encoding */ + if (encoding == MOBI_NOTSET) { encoding = MOBI_CP1252; } + mobi_buffer_seek(buf, 4); /* 32 */ + const uint32_t total_entries_count = mobi_buffer_get32(buf); /* 36: total entries count */ + if (total_entries_count > INDX_TOTAL_MAXCNT) { + debug_print("Too many total index entries (%u)\n", total_entries_count); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + uint32_t ordt_offset = mobi_buffer_get32(buf); /* 40: ORDT offset; currently not used */ + if (ordt_offset + ORDT_RECORD_MAXCNT + 4 > indx_record->size) { + ordt_offset = 0; + } + uint32_t ligt_offset = mobi_buffer_get32(buf); /* 44: LIGT offset; currently static table used instead */ + uint32_t ligt_entries_count = mobi_buffer_get32(buf); /* 48: LIGT entries count */ + if (ligt_offset + 4 * ligt_entries_count + 4 > indx_record->size) { + ligt_offset = 0; + ligt_entries_count = 0; + } + const uint32_t cncx_records_count = mobi_buffer_get32(buf); /* 52: CNCX entries count */ + if (cncx_records_count > CNCX_RECORD_MAXCNT) { + debug_print("Too many CNCX records (%u)\n", cncx_records_count); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + /* 56: unk count */ + /* 60-148: phonetizer */ + uint32_t ordt_type = 0; + uint32_t ordt_entries_count = 0; + uint32_t ordt1_offset = 0; + uint32_t ordt2_offset = 0; + uint32_t index_name_offset = 0; + uint32_t index_name_length = 0; + if (header_length >= 180) { + mobi_buffer_setpos(buf, 164); + ordt_type = mobi_buffer_get32(buf); /* 164: ORDT type */ + ordt_entries_count = mobi_buffer_get32(buf); /* 168: ORDT entries count */ + ordt1_offset = mobi_buffer_get32(buf); /* 172: ORDT1 offset; currently not used */ + ordt2_offset = mobi_buffer_get32(buf); /* 176: ORDT2 offset */ + const size_t entry_size = (ordt_type == 0) ? 1 : 2; + if (ordt1_offset + entry_size * ordt_entries_count > indx_record->size + || ordt2_offset + 2 * ordt_entries_count > indx_record->size) { + ordt1_offset = 0; + ordt2_offset = 0; + ordt_entries_count = 0; + } + index_name_offset = mobi_buffer_get32(buf); /* 180: Index name offset */ + index_name_length = mobi_buffer_get32(buf); /* 184: Index name length */ + } + buf->maxlen = indx_record->size; + mobi_buffer_setpos(buf, header_length); + ret = mobi_parse_tagx(buf, tagx); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free_null(buf); + return ret; + } + if (ordt_entries_count > 0) { + /* parse ORDT sections */ + ordt->offsets_count = ordt_entries_count; + ordt->type = ordt_type; + ordt->ordt1_pos = ordt1_offset; + ordt->ordt2_pos = ordt2_offset; + ret = mobi_parse_ordt(buf, ordt); + debug_print("ORDT: %u, %u, %u, %u\n", ordt_type, ordt_entries_count, ordt1_offset, ordt2_offset); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free_null(buf); + return ret; + } + } + if (index_name_offset > 0 && index_name_length > 0) { + if (index_name_length <= header_length - index_name_offset && index_name_length < INDX_NAME_SIZEMAX) { + mobi_buffer_setpos(buf, index_name_offset); + char *name = malloc(index_name_length + 1); + if (name == NULL) { + debug_print("%s", "Memory allocation failed\n"); + mobi_buffer_free_null(buf); + return MOBI_MALLOC_FAILED; + } + mobi_buffer_getstring(name, buf, index_name_length); + indx->orth_index_name = name; + debug_print("Orth index name: %s\n", name); + } + } + indx->encoding = encoding; + indx->type = type; + indx->entries_count = entries_count; + indx->total_entries_count = total_entries_count; + if (ligt_entries_count != 0 && !mobi_buffer_match_magic_offset(buf, LIGT_MAGIC, ligt_offset)) { + ligt_offset = 0; + ligt_entries_count = 0; + } + indx->ligt_offset = ligt_offset; + indx->ligt_entries_count = ligt_entries_count; + indx->ordt_offset = ordt_offset; + indx->cncx_records_count = cncx_records_count; + } else { + /* else parse IDXT entries offsets */ + if (idxt_offset == 0) { + debug_print("%s", "Missing IDXT offset\n"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + if (idxt_offset + 2 * entries_count + 4 > indx_record->size ) { + debug_print("IDXT entries beyond record end%s", "\n"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + mobi_buffer_setpos(buf, idxt_offset); + MOBIIdxt idxt; + uint32_t *offsets = malloc((entries_count + 1) * sizeof(uint32_t)); + if (offsets == NULL) { + mobi_buffer_free_null(buf); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + idxt.offsets = offsets; + ret = mobi_parse_idxt(buf, &idxt, entries_count); + if (ret != MOBI_SUCCESS) { + debug_print("%s", "IDXT parsing failed\n"); + mobi_buffer_free_null(buf); + free(offsets); + return ret; + } + /* parse entries */ + if (entries_count > 0) { + if (indx->entries == NULL) { + indx->entries = malloc(indx->total_entries_count * sizeof(MOBIIndexEntry)); + if (indx->entries == NULL) { + mobi_buffer_free_null(buf); + free(offsets); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + } + size_t i = 0; + while (i < entries_count) { + ret = mobi_parse_index_entry(indx, idxt, tagx, ordt, buf, i); + if (ret != MOBI_SUCCESS) { + indx->entries_count += i; + mobi_buffer_free_null(buf); + free(offsets); + return ret; + } + i++; + } + indx->entries_count += entries_count; + } + free(offsets); + } + mobi_buffer_free_null(buf); + return MOBI_SUCCESS; +} + +/** + @brief Parser of a set of index records + + @param[in] m MOBIData structure containing MOBI file metadata and data + @param[in,out] indx MOBIIndx structure to be filled with parsed entries + @param[in] indx_record_number Number of the first record of the set + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_index(const MOBIData *m, MOBIIndx *indx, const size_t indx_record_number) { + MOBI_RET ret; + /* tagx->tags array will be allocated in mobi_parse_tagx */ + MOBITagx *tagx = calloc(1, sizeof(MOBITagx)); + if (tagx == NULL) { + mobi_free_indx(indx); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + /* ordt->ordt1 and ordt.ordt2 arrays will be allocated in mobi_parse_ordt */ + MOBIOrdt *ordt = calloc(1, sizeof(MOBIOrdt)); + if (ordt == NULL) { + mobi_free_indx(indx); + mobi_free_tagx(tagx); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + /* parse first meta INDX record */ + MOBIPdbRecord *record = mobi_get_record_by_seqnumber(m, indx_record_number); + ret = mobi_parse_indx(record, indx, tagx, ordt); + if (ret != MOBI_SUCCESS) { + mobi_free_indx(indx); + mobi_free_tagx(tagx); + mobi_free_ordt(ordt); + return ret; + } + /* parse remaining INDX records for the index */ + size_t count = indx->entries_count; + indx->entries_count = 0; + while (count--) { + record = record->next; + ret = mobi_parse_indx(record, indx, tagx, ordt); + if (ret != MOBI_SUCCESS) { + mobi_free_indx(indx); + mobi_free_tagx(tagx); + mobi_free_ordt(ordt); + return ret; + } + } + if (indx->entries_count != indx->total_entries_count) { + debug_print("Entries count %zu != total entries count %zu\n", indx->entries_count, indx->total_entries_count); + mobi_free_indx(indx); + mobi_free_tagx(tagx); + mobi_free_ordt(ordt); + return MOBI_DATA_CORRUPT; + } + /* copy pointer to first cncx record if present and set info from first record */ + if (indx->cncx_records_count) { + indx->cncx_record = record->next; + } + mobi_free_tagx(tagx); + mobi_free_ordt(ordt); + return MOBI_SUCCESS; +} + +/** + @brief Get a value of tag[tagid][tagindex] for given index entry + + @param[in,out] tagvalue Will be set to a tag value + @param[in] entry Index entry to be search for the value + @param[in] tag_arr Array: tag_arr[0] = tagid, tag_arr[1] = tagindex + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_indxentry_tagvalue(uint32_t *tagvalue, const MOBIIndexEntry *entry, const unsigned tag_arr[]) { + if (entry == NULL) { + debug_print("%s", "INDX entry not initialized\n"); + return MOBI_INIT_FAILED; + } + size_t i = 0; + while (i < entry->tags_count) { + if (entry->tags[i].tagid == tag_arr[0]) { + if (entry->tags[i].tagvalues_count > tag_arr[1]) { + *tagvalue = entry->tags[i].tagvalues[tag_arr[1]]; + return MOBI_SUCCESS; + } + break; + } + i++; + } + //debug_print("tag[%i][%i] not found in entry: %s\n", tag_arr[0], tag_arr[1], entry->label); + return MOBI_DATA_CORRUPT; +} + +/** + @brief Get array of tagvalues of tag[tagid] for given index entry + + @param[in,out] tagarr Pointer to tagvalues array + @param[in] entry Index entry to be search for the value + @param[in] tagid Id of the tag + @return Size of the array (zero on failure) + */ +size_t mobi_get_indxentry_tagarray(uint32_t **tagarr, const MOBIIndexEntry *entry, const size_t tagid) { + if (entry == NULL) { + debug_print("%s", "INDX entry not initialized\n"); + return 0; + } + size_t i = 0; + while (i < entry->tags_count) { + if (entry->tags[i].tagid == tagid) { + *tagarr = entry->tags[i].tagvalues; + return entry->tags[i].tagvalues_count; + } + i++; + } + //debug_print("tag[%zu] not found in entry: %s\n", tagid, entry->label); + return 0; +} + +/** + @brief Get entry start offset for the orth entry + @param[in] entry MOBIIndexEntry structure + @return Start offset, MOBI_NOTSET on failure + */ +uint32_t mobi_get_orth_entry_offset(const MOBIIndexEntry *entry) { + + uint32_t entry_startpos; + MOBI_RET ret = mobi_get_indxentry_tagvalue(&entry_startpos, entry, INDX_TAG_ORTH_POSITION); + if (ret != MOBI_SUCCESS) { + return MOBI_NOTSET; + } + + return entry_startpos; +} + +/** + @brief Get text length for the orth entry + @param[in] entry MOBIIndexEntry structure + @return Text length, MOBI_NOTSET on failure + */ +uint32_t mobi_get_orth_entry_length(const MOBIIndexEntry *entry) { + + uint32_t entry_textlen; + MOBI_RET ret = mobi_get_indxentry_tagvalue(&entry_textlen, entry, INDX_TAG_ORTH_LENGTH); + if (ret != MOBI_SUCCESS) { + return MOBI_NOTSET; + } + + return entry_textlen; +} + +/** + @brief Check if given tagid is present in the index + + @param[in] indx Index MOBIIndx structure + @param[in] tagid Id of the tag + @return True on success, false otherwise + */ +bool mobi_indx_has_tag(const MOBIIndx *indx, const size_t tagid) { + if (indx) { + for (size_t i = 0; i < indx->entries_count; i++) { + MOBIIndexEntry entry = indx->entries[i]; + for(size_t j = 0; j < entry.tags_count; j++) { + if (entry.tags[j].tagid == tagid) { + return true; + } + } + } + } + return false; +} + +/** + @brief Get compiled index entry string + + Allocates memory for the string. Must be freed by caller. + + @param[in] cncx_record MOBIPdbRecord structure with cncx record + @param[in] cncx_offset Offset of string entry from the beginning of the record + @return Entry string or null if malloc failed + */ +char * mobi_get_cncx_string(const MOBIPdbRecord *cncx_record, const uint32_t cncx_offset) { + /* TODO: handle multiple cncx records */ + MOBIBuffer *buf = mobi_buffer_init_null(cncx_record->data, cncx_record->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return NULL; + } + mobi_buffer_setpos(buf, cncx_offset); + size_t len = 0; + const uint32_t string_length = mobi_buffer_get_varlen(buf, &len); + char *string = malloc(string_length + 1); + if (string) { + mobi_buffer_getstring(string, buf, string_length); + } + mobi_buffer_free_null(buf); + return string; +} + +/** + @brief Get compiled index entry string, converted to utf8 encoding + + Allocates memory for the string. Must be freed by caller. + + @param[in] cncx_record MOBIPdbRecord structure with cncx record + @param[in] cncx_offset Offset of string entry from the beginning of the record + @param[in] cncx_encoding Encoding + @return Entry string or null if malloc failed + */ +char * mobi_get_cncx_string_utf8(const MOBIPdbRecord *cncx_record, const uint32_t cncx_offset, MOBIEncoding cncx_encoding) { + char *string = mobi_get_cncx_string(cncx_record, cncx_offset); + if (string != NULL && cncx_encoding == MOBI_CP1252) { + size_t in_len = strlen(string); + size_t out_len = in_len * 3 + 1; + char *decoded = malloc(out_len); + if (decoded) { + mobi_cp1252_to_utf8(decoded, string, &out_len, in_len); + free(string); + string = strdup(decoded); + free(decoded); + } + } + return string; +} + +/** + @brief Get flat index entry string + + Allocates memory for the string. Must be freed by caller. + + @param[in] cncx_record MOBIPdbRecord structure with cncx record + @param[in] cncx_offset Offset of string entry from the beginning of the record + @param[in] length Length of the string to be extracted + @return Entry string + */ +char * mobi_get_cncx_string_flat(const MOBIPdbRecord *cncx_record, const uint32_t cncx_offset, const size_t length) { + /* TODO: handle multiple cncx records */ + MOBIBuffer *buf = mobi_buffer_init_null(cncx_record->data, cncx_record->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return NULL; + } + mobi_buffer_setpos(buf, cncx_offset); + char *string = malloc(length + 1); + if (string) { + mobi_buffer_getstring(string, buf, length); + } + mobi_buffer_free_null(buf); + return string; +} + +/** + @brief Decode compiled infl index entry + + Buffer decoded must be initialized with basic index entry. + Basic index entry will be transformed into inflected form, + based on compiled rule. + Min. size of input buffer (decoded) must be INDX_INFLBUF_SIZEMAX + 1 + + @param[in,out] decoded Decoded entry string + @param[in,out] decoded_size Decoded entry size + @param[in] rule Compiled rule + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_decode_infl(unsigned char *decoded, int *decoded_size, const unsigned char *rule) { + int pos = *decoded_size; + char mod = 'i'; + char dir = '<'; + char olddir; + unsigned char c; + while ((c = *rule++)) { + if (c <= 4) { + mod = (c <= 2) ? 'i' : 'd'; /* insert, delete */ + olddir = dir; + dir = (c & 2) ? '<' : '>'; /* left, right */ + if (olddir != dir && olddir) { + pos = (c & 2) ? *decoded_size : 0; + } + } + else if (c > 10 && c < 20) { + if (dir == '>') { + pos = *decoded_size; + } + pos -= c - 10; + dir = 0; + } + else { + if (mod == 'i') { + const unsigned char *s = decoded + pos; + unsigned char *d = decoded + pos + 1; + const int l = *decoded_size - pos; + if (pos < 0 || l < 0 || d + l > decoded + INDX_INFLBUF_SIZEMAX) { + debug_print("Out of buffer in %s at pos: %i\n", decoded, pos); + return MOBI_DATA_CORRUPT; + } + memmove(d, s, (size_t) l); + decoded[pos] = c; + (*decoded_size)++; + if (dir == '>') { pos++; } + } else { + if (dir == '<') { pos--; } + const unsigned char *s = decoded + pos + 1; + unsigned char *d = decoded + pos; + const int l = *decoded_size - pos; + if (pos < 0 || l < 0 || s + l > decoded + INDX_INFLBUF_SIZEMAX) { + debug_print("Out of buffer in %s at pos: %i\n", decoded, pos); + return MOBI_DATA_CORRUPT; + } + if (decoded[pos] != c) { + debug_print("Character mismatch in %s at pos: %i (%c != %c)\n", decoded, pos, decoded[pos], c); + return MOBI_DATA_CORRUPT; + } + memmove(d, s, (size_t) l); + (*decoded_size)--; + } + } + } + return MOBI_SUCCESS; +} + +/** + @brief Get all matches for given string from trie structure + + Matches are made agains reversed string and all its substrings + + @param[in,out] infl_strings Array of returned strings + @param[in] root Root node of the tree + @param[in] string Index entry number + @return Number of returned strings + */ +size_t mobi_trie_get_inflgroups(char **infl_strings, MOBITrie * const root, const char *string) { + /* travers trie and get values for each substring */ + if (root == NULL) { + return 0; + } + size_t count = 0; + size_t length = strlen(string); + MOBITrie *node = root; + while (node && length > 0) { + char **values = NULL; + size_t values_count = 0; + node = mobi_trie_get_next(&values, &values_count, node, string[length - 1]); + length--; + for (size_t j = 0; j < values_count; j++) { + if (count == INDX_INFLSTRINGS_MAX) { + debug_print("Inflection strings array too small (%d)\n", INDX_INFLSTRINGS_MAX); + break; + } + char infl_string[INDX_LABEL_SIZEMAX + 1]; + const size_t suffix_length = strlen(values[j]); + if (length + suffix_length > INDX_LABEL_SIZEMAX) { + debug_print("Label too long (%zu + %zu)\n", length, suffix_length); + continue; + } + memcpy(infl_string, string, length); + memcpy(infl_string + length, values[j], suffix_length); + infl_string[length + suffix_length] = '\0'; + infl_strings[count++] = strdup(infl_string); + } + } + return count; +} + +/** + @brief Insert inversed inlection string for given entry into trie structure + + @param[in,out] root Root node of the tree, created if NULL + @param[in] indx MOBIIndx infl index records + @param[in] i Index entry number + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_trie_insert_infl(MOBITrie **root, const MOBIIndx *indx, size_t i) { + if (indx->cncx_record == NULL) { + return MOBI_DATA_CORRUPT; + } + MOBIIndexEntry e = indx->entries[i]; + char *inflected = e.label; + for (size_t j = 0; j < e.tags_count; j++) { + MOBIIndexTag t = e.tags[j]; + if (t.tagid == INDX_TAGARR_INFL_PARTS_V1) { + for (size_t k = 0; k + 1 < t.tagvalues_count; k += 2) { + uint32_t len = t.tagvalues[k]; + uint32_t offset = t.tagvalues[k + 1]; + char *base = mobi_get_cncx_string_flat(indx->cncx_record, offset, len); + if (base == NULL) { + return MOBI_MALLOC_FAILED; + } + MOBI_RET ret = mobi_trie_insert_reversed(root, base, inflected); + free(base); + if (ret != MOBI_SUCCESS) { + return ret; + } + } + } + } + return MOBI_SUCCESS; +} diff --git a/app/src/main/cpp/libmobi/src/index.h b/app/src/main/cpp/libmobi/src/index.h new file mode 100644 index 0000000..5491cac --- /dev/null +++ b/app/src/main/cpp/libmobi/src/index.h @@ -0,0 +1,128 @@ +/** @file index.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef mobi_index_h +#define mobi_index_h + +#include "config.h" +#include "structure.h" +#include "mobi.h" + +/** + @defgroup index_tag Predefined tag arrays: {tagid, tagindex} for mobi_get_indxentry_tagvalue() + @{ + */ +#define INDX_TAG_GUIDE_TITLE_CNCX (unsigned[]) {1, 0} /**< Guide title CNCX offset */ + +#define INDX_TAG_NCX_FILEPOS (unsigned[]) {1, 0} /**< NCX filepos offset */ +#define INDX_TAG_NCX_TEXT_CNCX (unsigned[]) {3, 0} /**< NCX text CNCX offset */ +#define INDX_TAG_NCX_LEVEL (unsigned[]) {4, 0} /**< NCX level */ +#define INDX_TAG_NCX_KIND_CNCX (unsigned[]) {5, 0} /**< NCX kind CNCX offset */ +#define INDX_TAG_NCX_POSFID (unsigned[]) {6, 0} /**< NCX pos:fid */ +#define INDX_TAG_NCX_POSOFF (unsigned[]) {6, 1} /**< NCX pos:off */ +#define INDX_TAG_NCX_PARENT (unsigned[]) {21, 0} /**< NCX parent */ +#define INDX_TAG_NCX_CHILD_START (unsigned[]) {22, 0} /**< NCX start child */ +#define INDX_TAG_NCX_CHILD_END (unsigned[]) {23, 0} /**< NCX last child */ + +#define INDX_TAG_SKEL_COUNT (unsigned[]) {1, 0} /**< Skel fragments count */ +#define INDX_TAG_SKEL_POSITION (unsigned[]) {6, 0} /**< Skel position */ +#define INDX_TAG_SKEL_LENGTH (unsigned[]) {6, 1} /**< Skel length */ + +#define INDX_TAG_FRAG_AID_CNCX (unsigned[]) {2, 0} /**< Frag aid CNCX offset */ +#define INDX_TAG_FRAG_FILE_NR (unsigned[]) {3, 0} /**< Frag file number */ +#define INDX_TAG_FRAG_SEQUENCE_NR (unsigned[]) {4, 0} /**< Frag sequence number */ +#define INDX_TAG_FRAG_POSITION (unsigned[]) {6, 0} /**< Frag position */ +#define INDX_TAG_FRAG_LENGTH (unsigned[]) {6, 1} /**< Frag length */ + +#define INDX_TAG_ORTH_POSITION (unsigned[]) {1, 0} /**< Orth entry start position */ +#define INDX_TAG_ORTH_LENGTH (unsigned[]) {2, 0} /**< Orth entry end position */ + +#define INDX_TAGARR_ORTH_INFL 42 /**< Inflection groups for orth entry */ +#define INDX_TAGARR_INFL_GROUPS 5 /**< Inflection groups in infl index */ +#define INDX_TAGARR_INFL_PARTS_V2 26 /**< Inflection particles in infl index */ + +#define INDX_TAGARR_INFL_PARTS_V1 7 /**< Inflection particles in old type infl index */ +/** @} */ + +#define INDX_LABEL_SIZEMAX 1000 /**< Max size of index label */ +#define INDX_INFLTAG_SIZEMAX 25000 /**< Max size of inflections tags per entry */ +#define INDX_INFLBUF_SIZEMAX 500 /**< Max size of index label */ +#define INDX_INFLSTRINGS_MAX 500 /**< Max number of inflected strings */ +#define ORDT_RECORD_MAXCNT 256 /* max entries count in old ordt */ +#define CNCX_RECORD_MAXCNT 0xf /* max entries count */ +#define INDX_RECORD_MAXCNT 10000 /* max index entries per record */ +#define INDX_TOTAL_MAXCNT ((size_t) INDX_RECORD_MAXCNT * 0xffff) /* max total index entries */ +#define INDX_NAME_SIZEMAX 0xff + +/** + @brief Maximum value of tag values in index entry (MOBIIndexTag) + */ +#define INDX_TAGVALUES_MAX 100 + +/** + @brief Tag entries in TAGX section (for internal INDX parsing) + */ +typedef struct { + uint8_t tag; /**< Tag */ + uint8_t values_count; /**< Number of values */ + uint8_t bitmask; /**< Bitmask */ + uint8_t control_byte; /**< EOF control byte */ +} TAGXTags; + +/** + @brief Parsed TAGX section (for internal INDX parsing) + + TAGX tags hold metadata of index entries. + It is present in the first index record. + */ +typedef struct { + TAGXTags *tags; /**< Array of tag entries */ + size_t tags_count; /**< Number of tag entries */ + size_t control_byte_count; /**< Number of control bytes */ +} MOBITagx; + +/** + @brief Parsed IDXT section (for internal INDX parsing) + + IDXT section holds offsets to index entries + */ +typedef struct { + uint32_t *offsets; /**< Offsets to index entries */ + size_t offsets_count; /**< Offsets count */ +} MOBIIdxt; + +/** + @brief Parsed ORDT sections (for internal INDX parsing) + + ORDT sections hold data for decoding index labels. + It is mapping of encoded chars to unicode. + */ +typedef struct { + uint8_t *ordt1; /**< ORDT1 offsets */ + uint16_t *ordt2; /**< ORDT2 offsets */ + size_t type; /**< Type (0: 16, 1: 8 bit offsets) */ + size_t ordt1_pos; /**< Offset of ORDT1 data */ + size_t ordt2_pos; /**< Offset of ORDT2 data */ + size_t offsets_count; /**< Offsets count */ +} MOBIOrdt; + +MOBI_RET mobi_parse_index(const MOBIData *m, MOBIIndx *indx, const size_t indx_record_number); +MOBI_RET mobi_parse_indx(const MOBIPdbRecord *indx_record, MOBIIndx *indx, MOBITagx *tagx, MOBIOrdt *ordt); +MOBI_RET mobi_get_indxentry_tagvalue(uint32_t *tagvalue, const MOBIIndexEntry *entry, const unsigned tag_arr[]); +size_t mobi_get_indxentry_tagarray(uint32_t **tagarr, const MOBIIndexEntry *entry, const size_t tagid); +bool mobi_indx_has_tag(const MOBIIndx *indx, const size_t tagid); +char * mobi_get_cncx_string(const MOBIPdbRecord *cncx_record, const uint32_t cncx_offset); +char * mobi_get_cncx_string_utf8(const MOBIPdbRecord *cncx_record, const uint32_t cncx_offset, MOBIEncoding cncx_encoding); +char * mobi_get_cncx_string_flat(const MOBIPdbRecord *cncx_record, const uint32_t cncx_offset, const size_t length); +MOBI_RET mobi_decode_infl(unsigned char *decoded, int *decoded_size, const unsigned char *rule); +MOBI_RET mobi_trie_insert_infl(MOBITrie **root, const MOBIIndx *indx, size_t i); +size_t mobi_trie_get_inflgroups(char **infl_strings, MOBITrie * const root, const char *string); + +#endif diff --git a/app/src/main/cpp/libmobi/src/memory.c b/app/src/main/cpp/libmobi/src/memory.c new file mode 100644 index 0000000..2956dbf --- /dev/null +++ b/app/src/main/cpp/libmobi/src/memory.c @@ -0,0 +1,444 @@ +/** @file memory.c + * @brief Functions for initializing and releasing structures and data containers + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#include +#include "memory.h" +#include "debug.h" +#include "util.h" + +/** + @brief Initializer for MOBIData structure + + It allocates memory for structure. + Memory should be freed with mobi_free(). + + @return MOBIData on success, NULL otherwise + */ +MOBIData * mobi_init(void) { + MOBIData *m = NULL; + m = calloc(1, sizeof(MOBIData)); + if (m == NULL) { return NULL; } + m->use_kf8 = true; + m->kf8_boundary_offset = MOBI_NOTSET; + m->drm_key = NULL; + m->ph = NULL; + m->rh = NULL; + m->mh = NULL; + m->eh = NULL; + m->rec = NULL; + m->next = NULL; + m->internals = NULL; + return m; +} + +/** + @brief Free MOBIMobiHeader structure + + @param[in] mh MOBIMobiHeader structure + */ +void mobi_free_mh(MOBIMobiHeader *mh) { + if (mh == NULL) { + return; + } + free(mh->header_length); + free(mh->mobi_type); + free(mh->text_encoding); + free(mh->uid); + free(mh->version); + free(mh->orth_index); + free(mh->infl_index); + free(mh->names_index); + free(mh->keys_index); + free(mh->extra0_index); + free(mh->extra1_index); + free(mh->extra2_index); + free(mh->extra3_index); + free(mh->extra4_index); + free(mh->extra5_index); + free(mh->non_text_index); + free(mh->full_name_offset); + free(mh->full_name_length); + free(mh->locale); + free(mh->dict_input_lang); + free(mh->dict_output_lang); + free(mh->min_version); + free(mh->image_index); + free(mh->huff_rec_index); + free(mh->huff_rec_count); + free(mh->datp_rec_index); + free(mh->datp_rec_count); + free(mh->exth_flags); + free(mh->unknown6); + free(mh->drm_offset); + free(mh->drm_count); + free(mh->drm_size); + free(mh->drm_flags); + free(mh->fdst_index); + free(mh->first_text_index); + free(mh->last_text_index); + free(mh->fdst_section_count); + //free(mh->unknown9); + free(mh->fcis_index); + free(mh->fcis_count); + free(mh->flis_index); + free(mh->flis_count); + free(mh->unknown10); + free(mh->unknown11); + free(mh->srcs_index); + free(mh->srcs_count); + free(mh->unknown12); + free(mh->unknown13); + free(mh->extra_flags); + free(mh->ncx_index); + free(mh->fragment_index); + free(mh->skeleton_index); + free(mh->unknown14); + free(mh->unknown15); + free(mh->datp_index); + free(mh->guide_index); + free(mh->unknown16); + free(mh->unknown17); + free(mh->unknown18); + free(mh->unknown19); + free(mh->unknown20); + free(mh->full_name); + free(mh); + mh = NULL; +} + +/** + @brief Free all MOBIPdbRecord structures and its respective data attached to MOBIData structure + + Each MOBIPdbRecord structure holds metadata and data for each pdb record + + @param[in,out] m MOBIData structure + */ +void mobi_free_rec(MOBIData *m) { + MOBIPdbRecord *curr, *tmp; + curr = m->rec; + while (curr != NULL) { + tmp = curr; + curr = curr->next; + free(tmp->data); + free(tmp); + tmp = NULL; + } + m->rec = NULL; +} + +/** + @brief Free all MOBIExthHeader structures and its respective data attached to MOBIData structure + + Each MOBIExthHeader structure holds metadata and data for each EXTH record + + @param[in,out] m MOBIData structure + */ +void mobi_free_eh(MOBIData *m) { + MOBIExthHeader *curr, *tmp; + curr = m->eh; + while (curr != NULL) { + tmp = curr; + curr = curr->next; + free(tmp->data); + free(tmp); + tmp = NULL; + } + m->eh = NULL; +} + +/** + @brief Free MOBIData structure for currenly unused hybrid part and all its children + + @param[in] m MOBIData structure + */ +void mobi_free_next(MOBIData *m) { + if (m && m->next) { + mobi_free_mh(m->next->mh); + mobi_free_eh(m->next); + free(m->next->rh); + free(m->next); + m->next = NULL; + } +} + +/** + @brief Free MOBIData structure and all its children + + @param[in] m MOBIData structure + */ +void mobi_free(MOBIData *m) { + if (m == NULL) { + return; + } + mobi_free_mh(m->mh); + mobi_free_eh(m); + mobi_free_rec(m); + free(m->ph); + free(m->rh); + mobi_free_next(m); + mobi_free_internals(m); + free(m); + m = NULL; +} + +/** + @brief Initialize and return MOBIHuffCdic structure. + + MOBIHuffCdic structure holds parsed data from HUFF, CDIC records. + It is used for huffman decompression. + Initialized structure is a child of MOBIData structure. + It must be freed with mobi_free_huffcdic(). + + @return MOBIHuffCdic on success, NULL otherwise + */ +MOBIHuffCdic * mobi_init_huffcdic(void) { + MOBIHuffCdic *huffcdic = calloc(1, sizeof(MOBIHuffCdic)); + if (huffcdic == NULL) { + debug_print("%s", "Memory allocation for huffcdic structure failed\n"); + return NULL; + } + return huffcdic; +} + +/** + @brief Free MOBIHuffCdic structure and all its children + + @param[in] huffcdic MOBIData structure + */ +void mobi_free_huffcdic(MOBIHuffCdic *huffcdic) { + if (huffcdic == NULL) { + return; + } + free(huffcdic->symbol_offsets); + free(huffcdic->symbols); + free(huffcdic); + huffcdic = NULL; +} + +/** + @brief Initialize and return MOBIRawml structure. + + MOBIRawml structure holds parsed text record metadata. + It is used in the process of parsing rawml text data. + It must be freed with mobi_free_rawml(). + + @param[in] m Initialized MOBIData structure + @return MOBIRawml on success, NULL otherwise + */ +MOBIRawml * mobi_init_rawml(const MOBIData *m) { + MOBIRawml *rawml = malloc(sizeof(MOBIRawml)); + if (rawml == NULL) { + debug_print("%s", "Memory allocation failed for rawml structure\n"); + return NULL; + } + rawml->version = mobi_get_fileversion(m); + rawml->fdst = NULL; + rawml->skel = NULL; + rawml->frag = NULL; + rawml->guide = NULL; + rawml->ncx = NULL; + rawml->orth = NULL; + rawml->infl = NULL; + rawml->flow = NULL; + rawml->markup = NULL; + rawml->resources = NULL; + return rawml; +} + +/** + @brief Free MOBIFdst structure and all its children + + @param[in] fdst MOBIFdst structure + */ +void mobi_free_fdst(MOBIFdst *fdst) { + if (fdst == NULL) { + return; + } + if (fdst->fdst_section_count > 0) { + free(fdst->fdst_section_starts); + free(fdst->fdst_section_ends); + } + free(fdst); + fdst = NULL; +} + +/** + @brief Initialize and return MOBIIndx structure. + + MOBIIndx structure holds INDX index record entries. + Must be freed with mobi_free_indx() + + @return MOBIIndx on success, NULL otherwise + */ +MOBIIndx * mobi_init_indx(void) { + MOBIIndx *indx = calloc(1, sizeof(MOBIIndx)); + if (indx == NULL) { + debug_print("%s", "Memory allocation failed for indx structure\n"); + return NULL; + } + indx->entries = NULL; + indx->cncx_record = NULL; + indx->orth_index_name = NULL; + return indx; +} + +/** + @brief Free index entries data and all its children + + @param[in] indx MOBIIndx structure that holds indx->entries + */ +void mobi_free_index_entries(MOBIIndx *indx) { + if (indx == NULL || indx->entries == NULL) { + return; + } + size_t i = 0; + while (i < indx->entries_count) { + free(indx->entries[i].label); + if (indx->entries[i].tags != NULL) { + size_t j = 0; + while (j < indx->entries[i].tags_count) { + free(indx->entries[i].tags[j++].tagvalues); + } + free(indx->entries[i].tags); + } + i++; + } + free(indx->entries); + indx->entries = NULL; +} + +/** + @brief Free MOBIIndx structure and all its children + + @param[in] indx MOBIIndx structure that holds indx->entries + */ +void mobi_free_indx(MOBIIndx *indx) { + if (indx == NULL) { + return; + } + mobi_free_index_entries(indx); + if (indx->orth_index_name) { + free(indx->orth_index_name); + } + free(indx); + indx = NULL; +} + +/** + @brief Free MOBITagx structure and all its children + + @param[in] tagx MOBITagx structure + */ +void mobi_free_tagx(MOBITagx *tagx) { + if (tagx == NULL) { + return; + } + free(tagx->tags); + free(tagx); + tagx = NULL; +} + +/** + @brief Free MOBIOrdt structure and all its children + + @param[in] ordt MOBIOrdt structure + */ +void mobi_free_ordt(MOBIOrdt *ordt) { + if (ordt == NULL) { + return; + } + free(ordt->ordt1); + free(ordt->ordt2); + free(ordt); + ordt = NULL; +} + +/** + @brief Free MOBIPart structure + + Pointer to data may point to memory area also used by record->data. + So we need a flag to leave the memory allocated, while freeing MOBIPart structure + + @param[in] part MOBIPart structure + @param[in] free_data Flag, if set - a pointer to part->data is also released, otherwise not released + */ +void mobi_free_part(MOBIPart *part, int free_data) { + MOBIPart *curr, *tmp; + curr = part; + while (curr != NULL) { + tmp = curr; + curr = curr->next; + if (free_data) { free(tmp->data); } + free(tmp); + } + part = NULL; +} + +/** + @brief Free MOBIPart structure for opf and ncx data + + @param[in] part MOBIPart structure + */ +void mobi_free_opf_data(MOBIPart *part) { + while (part != NULL) { + if (part->type == T_NCX || part->type == T_OPF) { + free(part->data); + } + part = part->next; + } +} + +/** + @brief Free MOBIPart structure for decoded font data + + @param[in] part MOBIPart structure + */ +void mobi_free_font_data(MOBIPart *part) { + while (part != NULL) { + if (part->type == T_OTF || part->type == T_TTF) { + free(part->data); + } + part = part->next; + } +} + +/** + @brief Free MOBIRawml structure allocated by mobi_init_rawml() + + Pointer to data may point to memory area also used by record->data. + So we need a flag to leave the memory allocated, while freeing MOBIPart structure + + @param[in] rawml MOBIRawml structure + */ +void mobi_free_rawml(MOBIRawml *rawml) { + if (rawml == NULL) { + return; + } + mobi_free_fdst(rawml->fdst); + mobi_free_indx(rawml->skel); + mobi_free_indx(rawml->frag); + mobi_free_indx(rawml->guide); + mobi_free_indx(rawml->ncx); + mobi_free_indx(rawml->orth); + mobi_free_indx(rawml->infl); + mobi_free_part(rawml->flow, true); + mobi_free_part(rawml->markup,true); + /* do not free resources data, these are links to records data */ + /* only free opf and ncx data */ + mobi_free_opf_data(rawml->resources); + /* and free decoded fonts data */ + mobi_free_font_data(rawml->resources); + mobi_free_part(rawml->resources, false); + free(rawml); + rawml = NULL; +} + + diff --git a/app/src/main/cpp/libmobi/src/memory.h b/app/src/main/cpp/libmobi/src/memory.h new file mode 100644 index 0000000..5aa2909 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/memory.h @@ -0,0 +1,33 @@ +/** @file memory.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_memory_h +#define libmobi_memory_h + +#include "config.h" +#include "index.h" +#include "compression.h" +#include "mobi.h" + +void mobi_free_mh(MOBIMobiHeader *mh); +void mobi_free_rec(MOBIData *m); +void mobi_free_eh(MOBIData *m); +void mobi_free_next(MOBIData *m); + +MOBIHuffCdic * mobi_init_huffcdic(void); +void mobi_free_huffcdic(MOBIHuffCdic *huffcdic); + +MOBIIndx * mobi_init_indx(void); +void mobi_free_indx(MOBIIndx *indx); +void mobi_free_tagx(MOBITagx *tagx); +void mobi_free_ordt(MOBIOrdt *ordt); +void mobi_free_index_entries(MOBIIndx *indx); + +#endif diff --git a/app/src/main/cpp/libmobi/src/meta.c b/app/src/main/cpp/libmobi/src/meta.c new file mode 100644 index 0000000..309e73f --- /dev/null +++ b/app/src/main/cpp/libmobi/src/meta.c @@ -0,0 +1,864 @@ +/** @file meta.c + * @brief Functions for metadata manipulation + * + * Copyright (c) 2016 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#define _GNU_SOURCE 1 +#ifndef __USE_BSD +#define __USE_BSD /* for strdup on linux/glibc */ +#endif + +#include +#include +#include +#include "meta.h" +#include "util.h" + +/** + @brief Get document metadata from exth string + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @param[in] exth_tag MOBIExthTag + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_exthstring(const MOBIData *m, const MOBIExthTag exth_tag) { + char *string = NULL; + + MOBIExthHeader *exth; + MOBIExthHeader *start = NULL; + while ((exth = mobi_next_exthrecord_by_tag(m, exth_tag, &start))) { + char *exth_string = mobi_decode_exthstring(m, exth->data, exth->size); + if (string == NULL) { + string = exth_string; + } else if (exth_string) { + const char *separator = "; "; + size_t new_length = strlen(string) + strlen(exth_string) + strlen(separator) + 1; + char *new = malloc(new_length); + if (new == NULL) { + free(string); + free(exth_string); + return NULL; + } + strcpy(new, string); + strcat(new, separator); + strcat(new, exth_string); + free(string); + free(exth_string); + string = new; + } + if (start == NULL) { + break; + } + } + return string; +} + +/** + @brief Get document title metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_title(const MOBIData *m) { + if (m == NULL) { + return NULL; + } + char *title = mobi_meta_get_exthstring(m, EXTH_UPDATEDTITLE); + if (title) { + return title; + } + char fullname[MOBI_TITLE_SIZEMAX + 1]; + MOBI_RET ret = mobi_get_fullname(m, fullname, MOBI_TITLE_SIZEMAX); + if (ret == MOBI_SUCCESS) { + title = strdup(fullname); + } else if (m->ph) { + title = strdup(m->ph->name); + } + return title; +} + +/** + @brief Add document title metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] title String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_title(MOBIData *m, const char *title) { + if (title == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(title), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_UPDATEDTITLE, (uint32_t) size, title); +} + +/** + @brief Delete all title metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_title(MOBIData *m) { + if (mobi_exists_mobiheader(m) && m->mh->full_name) { + m->mh->full_name[0] = '\0'; + } + if (mobi_is_hybrid(m) && mobi_exists_mobiheader(m->next) && m->next->mh->full_name) { + m->next->mh->full_name[0] = '\0'; + } + return mobi_delete_exthrecord_by_tag(m, EXTH_UPDATEDTITLE); +} + +/** + @brief Set document title metadata + + Replaces all title metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] title String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_title(MOBIData *m, const char *title) { + if (title == NULL) { + return MOBI_PARAM_ERR; + } + /* set title in mobi header */ + MOBI_RET ret = mobi_set_fullname(m, title); + if (ret != MOBI_SUCCESS) { + return ret; + } + /* set title in palm header */ + ret = mobi_set_pdbname(m, title); + if (ret != MOBI_SUCCESS) { + return ret; + } + /* set title in exth header */ + ret = mobi_delete_exthrecord_by_tag(m, EXTH_UPDATEDTITLE); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_title(m, title); + } + return ret; +} + +/** + @brief Get document author metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_author(const MOBIData *m) { + return mobi_meta_get_exthstring(m, EXTH_AUTHOR); +} + +/** + @brief Add document author metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] author String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_author(MOBIData *m, const char *author) { + if (author == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(author), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_AUTHOR, (uint32_t) size, author); +} + +/** + @brief Delete all author metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_author(MOBIData *m) { + return mobi_delete_exthrecord_by_tag(m, EXTH_AUTHOR); +} + +/** + @brief Set document author metadata + + Replaces all author metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] author String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_author(MOBIData *m, const char *author) { + if (author == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_author(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_author(m, author); + } + return ret; +} + +/** + @brief Get document subject metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_subject(const MOBIData *m) { + return mobi_meta_get_exthstring(m, EXTH_SUBJECT); +} + +/** + @brief Add document subject metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] subject String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_subject(MOBIData *m, const char *subject) { + if (subject == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(subject), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_SUBJECT, (uint32_t) size, subject); +} + +/** + @brief Delete all subject metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_subject(MOBIData *m) { + return mobi_delete_exthrecord_by_tag(m, EXTH_SUBJECT); +} + +/** + @brief Set document subject metadata + + Replaces all subject metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] subject String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_subject(MOBIData *m, const char *subject) { + if (subject == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_subject(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_subject(m, subject); + } + return ret; +} + +/** + @brief Get document publisher metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_publisher(const MOBIData *m) { + return mobi_meta_get_exthstring(m, EXTH_PUBLISHER); +} + +/** + @brief Add document publisher metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] publisher String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_publisher(MOBIData *m, const char *publisher) { + if (publisher == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(publisher), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_PUBLISHER, (uint32_t) size, publisher); +} + +/** + @brief Delete all publisher metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_publisher(MOBIData *m) { + return mobi_delete_exthrecord_by_tag(m, EXTH_PUBLISHER); +} + +/** + @brief Set document publisher metadata + + Replaces all publisher metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] publisher String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_publisher(MOBIData *m, const char *publisher) { + if (publisher == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_publisher(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_publisher(m, publisher); + } + return ret; +} + +/** + @brief Get document publishing date metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_publishdate(const MOBIData *m) { + return mobi_meta_get_exthstring(m, EXTH_PUBLISHINGDATE); +} + +/** + @brief Add document publishdate metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] publishdate String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_publishdate(MOBIData *m, const char *publishdate) { + if (publishdate == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(publishdate), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_PUBLISHINGDATE, (uint32_t) size, publishdate); +} + +/** + @brief Delete all publishdate metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_publishdate(MOBIData *m) { + return mobi_delete_exthrecord_by_tag(m, EXTH_PUBLISHINGDATE); +} + +/** + @brief Set document publishdate metadata + + Replaces all publishdate metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] publishdate String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_publishdate(MOBIData *m, const char *publishdate) { + if (publishdate == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_publishdate(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_publishdate(m, publishdate); + } + return ret; +} + +/** + @brief Get document description metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_description(const MOBIData *m) { + return mobi_meta_get_exthstring(m, EXTH_DESCRIPTION); +} + +/** + @brief Add document description metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] description String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_description(MOBIData *m, const char *description) { + if (description == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(description), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_DESCRIPTION, (uint32_t) size, description); +} + +/** + @brief Delete all description metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_description(MOBIData *m) { + return mobi_delete_exthrecord_by_tag(m, EXTH_DESCRIPTION); +} + +/** + @brief Set document description metadata + + Replaces all description metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] description String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_description(MOBIData *m, const char *description) { + if (description == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_description(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_description(m, description); + } + return ret; +} + +/** + @brief Get document imprint metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_imprint(const MOBIData *m) { + return mobi_meta_get_exthstring(m, EXTH_IMPRINT); +} + +/** + @brief Add document imprint metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] imprint String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_imprint(MOBIData *m, const char *imprint) { + if (imprint == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(imprint), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_IMPRINT, (uint32_t) size, imprint); +} + +/** + @brief Delete all imprint metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_imprint(MOBIData *m) { + return mobi_delete_exthrecord_by_tag(m, EXTH_IMPRINT); +} + +/** + @brief Set document imprint metadata + + Replaces all imprint metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] imprint String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_imprint(MOBIData *m, const char *imprint) { + if (imprint == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_imprint(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_imprint(m, imprint); + } + return ret; +} + +/** + @brief Get document contributor metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_contributor(const MOBIData *m) { + return mobi_meta_get_exthstring(m, EXTH_CONTRIBUTOR); +} + +/** + @brief Add document contributor metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] contributor String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_contributor(MOBIData *m, const char *contributor) { + if (contributor == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(contributor), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_CONTRIBUTOR, (uint32_t) size, contributor); +} + +/** + @brief Delete all contributor metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_contributor(MOBIData *m) { + return mobi_delete_exthrecord_by_tag(m, EXTH_CONTRIBUTOR); +} + +/** + @brief Set document contributor metadata + + Replaces all contributor metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] contributor String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_contributor(MOBIData *m, const char *contributor) { + if (contributor == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_contributor(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_contributor(m, contributor); + } + return ret; +} + +/** + @brief Get document review metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_review(const MOBIData *m) { + return mobi_meta_get_exthstring(m, EXTH_REVIEW); +} + +/** + @brief Add document review metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] review String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_review(MOBIData *m, const char *review) { + if (review == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(review), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_REVIEW, (uint32_t) size, review); +} + +/** + @brief Delete all review metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_review(MOBIData *m) { + return mobi_delete_exthrecord_by_tag(m, EXTH_REVIEW); +} + +/** + @brief Set document review metadata + + Replaces all review metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] review String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_review(MOBIData *m, const char *review) { + if (review == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_review(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_review(m, review); + } + return ret; +} + +/** + @brief Get document copyright metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_copyright(const MOBIData *m) { + return mobi_meta_get_exthstring(m, EXTH_RIGHTS); +} + +/** + @brief Add document copyright metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] copyright String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_copyright(MOBIData *m, const char *copyright) { + if (copyright == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(copyright), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_RIGHTS, (uint32_t) size, copyright); +} + +/** + @brief Delete all copyright metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_copyright(MOBIData *m) { + return mobi_delete_exthrecord_by_tag(m, EXTH_RIGHTS); +} + +/** + @brief Set document copyright metadata + + Replaces all copyright metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] copyright String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_copyright(MOBIData *m, const char *copyright) { + if (copyright == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_copyright(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_copyright(m, copyright); + } + return ret; +} + +/** + @brief Get document ISBN metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_isbn(const MOBIData *m) { + return mobi_meta_get_exthstring(m, EXTH_ISBN); +} + +/** + @brief Add document isbn metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] isbn String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_isbn(MOBIData *m, const char *isbn) { + if (isbn == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(isbn), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_ISBN, (uint32_t) size, isbn); +} + +/** + @brief Delete all isbn metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_isbn(MOBIData *m) { + return mobi_delete_exthrecord_by_tag(m, EXTH_ISBN); +} + +/** + @brief Set document isbn metadata + + Replaces all isbn metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] isbn String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_isbn(MOBIData *m, const char *isbn) { + if (isbn == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_isbn(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_isbn(m, isbn); + } + return ret; +} + +/** + @brief Get document ASIN metadata + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_asin(const MOBIData *m) { + return mobi_meta_get_exthstring(m, EXTH_ASIN); +} + +/** + @brief Add document asin metadata + + @param[in,out] m MOBIData structure with loaded data + @param[in] asin String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_asin(MOBIData *m, const char *asin) { + if (asin == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(asin), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_ASIN, (uint32_t) size, asin); +} + +/** + @brief Delete all asin metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_asin(MOBIData *m) { + return mobi_delete_exthrecord_by_tag(m, EXTH_ASIN); +} + +/** + @brief Set document asin metadata + + Replaces all asin metadata with new string + + @param[in,out] m MOBIData structure with loaded data + @param[in] asin String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_asin(MOBIData *m, const char *asin) { + if (asin == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_asin(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_asin(m, asin); + } + return ret; +} + +/** + @brief Get document language code metadata + + Locale strings are based on IANA language-subtag registry with some custom Mobipocket modifications. + See mobi_locale array. + + Returned string must be deallocated by caller + + @param[in] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +char * mobi_meta_get_language(const MOBIData *m) { + if (m == NULL) { + return NULL; + } + char *lang = mobi_meta_get_exthstring(m, EXTH_LANGUAGE); + if(lang == NULL && m->mh && m->mh->locale && *m->mh->locale) { + const char *locale_string = mobi_get_locale_string(*m->mh->locale); + if (locale_string) { + lang = strdup(locale_string); + } + } + return lang; +} + +/** + @brief Add document language code metadata + + Locale strings are based on IANA language-subtag registry with some custom Mobipocket modifications. + See mobi_locale array. + + @param[in,out] m MOBIData structure with loaded data + @param[in] language String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_add_language(MOBIData *m, const char *language) { + if (language == NULL) { + return MOBI_PARAM_ERR; + } + size_t size = min(strlen(language), UINT32_MAX); + return mobi_add_exthrecord(m, EXTH_LANGUAGE, (uint32_t) size, language); +} + +/** + @brief Delete all language code metadata + + @param[in,out] m MOBIData structure with loaded data + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_delete_language(MOBIData *m) { + if(mobi_exists_mobiheader(m) && m->mh->locale) { + *m->mh->locale = 0; + } + if(mobi_is_hybrid(m) && mobi_exists_mobiheader(m->next) && m->next->mh->locale) { + *m->next->mh->locale = 0; + } + return mobi_delete_exthrecord_by_tag(m, EXTH_LANGUAGE); +} + +/** + @brief Set document language code metadata + + Replaces all language metadata with new string + Locale strings are based on IANA language-subtag registry with some custom Mobipocket modifications. + See mobi_locale array. + + @param[in,out] m MOBIData structure with loaded data + @param[in] language String value + @return Pointer to null terminated string, NULL on failure + */ +MOBI_RET mobi_meta_set_language(MOBIData *m, const char *language) { + if (language == NULL) { + return MOBI_PARAM_ERR; + } + MOBI_RET ret = mobi_meta_delete_language(m); + if (ret == MOBI_SUCCESS) { + ret = mobi_meta_add_language(m, language); + } + if(mobi_exists_mobiheader(m) && m->mh->locale) { + *m->mh->locale = (uint32_t) mobi_get_locale_number(language); + } + if(mobi_is_hybrid(m) && mobi_exists_mobiheader(m->next) && m->next->mh->locale) { + *m->next->mh->locale = (uint32_t) mobi_get_locale_number(language); + } + return ret; +} diff --git a/app/src/main/cpp/libmobi/src/meta.h b/app/src/main/cpp/libmobi/src/meta.h new file mode 100644 index 0000000..0d6814f --- /dev/null +++ b/app/src/main/cpp/libmobi/src/meta.h @@ -0,0 +1,17 @@ +/** @file meta.h + * + * Copyright (c) 2016 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_meta_h +#define libmobi_meta_h + +#include "config.h" +#include "mobi.h" + +#endif /* libmobi_meta_h */ diff --git a/app/src/main/cpp/libmobi/src/miniz.c b/app/src/main/cpp/libmobi/src/miniz.c new file mode 100644 index 0000000..5e76730 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/miniz.c @@ -0,0 +1,5164 @@ +/* miniz.c v1.15 - public domain deflate/inflate, zlib-subset, ZIP reading/writing/appending, PNG writing + See "unlicense" statement at the end of this file. + Rich Geldreich , last updated Oct. 13, 2013 + Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt + + Most API's defined in miniz.c are optional. For aryan, to disable the archive related functions just define + MINIZ_NO_ARCHIVE_APIS, or to get rid of all stdio usage define MINIZ_NO_STDIO (see the list below for more macros). + + * Change History + 10/13/13 v1.15 r4 - Interim bugfix release while I work on the next major release with Zip64 support (almost there!): + - Critical fix for the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY bug (thanks kahmyong.moon@hp.com) which could cause locate files to not find files. This bug + would only have occured in earlier versions if you explicitly used this flag, OR if you used mz_zip_extract_archive_file_to_heap() or mz_zip_add_mem_to_archive_file_in_place() + (which used this flag). If you can't switch to v1.15 but want to fix this bug, just remove the uses of this flag from both helper funcs (and of course don't use the flag). + - Bugfix in mz_zip_reader_extract_to_mem_no_alloc() from kymoon when pUser_read_buf is not NULL and compressed size is > uncompressed size + - Fixing mz_zip_reader_extract_*() funcs so they don't try to extract compressed data from directory entries, to account for weird zipfiles which contain zero-size compressed data on dir entries. + Hopefully this fix won't cause any issues on weird zip archives, because it assumes the low 16-bits of zip external attributes are DOS attributes (which I believe they always are in practice). + - Fixing mz_zip_reader_is_file_a_directory() so it doesn't check the internal attributes, just the filename and external attributes + - mz_zip_reader_init_file() - missing MZ_FCLOSE() call if the seek failed + - Added cmake support for Linux builds which builds all the examples, tested with clang v3.3 and gcc v4.6. + - Clang fix for tdefl_write_image_to_png_file_in_memory() from toffaletti + - Merged MZ_FORCEINLINE fix from hdeanclark + - Fix include before config #ifdef, thanks emil.brink + - Added tdefl_write_image_to_png_file_in_memory_ex(): supports Y flipping (super useful for OpenGL apps), and explicit control over the compression level (so you can + set it to 1 for real-time compression). + - Merged in some compiler fixes from paulharris's github repro. + - Retested this build under Windows (VS 2010, including static analysis), tcc 0.9.26, gcc v4.6 and clang v3.3. + - Added example6.c, which dumps an image of the mandelbrot set to a PNG file. + - Modified example2 to help test the MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY flag more. + - In r3: Bugfix to mz_zip_writer_add_file() found during merge: Fix possible src file fclose() leak if alignment bytes+local header file write faiiled + - In r4: Minor bugfix to mz_zip_writer_add_from_zip_reader(): Was pushing the wrong central dir header offset, appears harmless in this release, but it became a problem in the zip64 branch + 5/20/12 v1.14 - MinGW32/64 GCC 4.6.1 compiler fixes: added MZ_FORCEINLINE, #include (thanks fermtect). + 5/19/12 v1.13 - From jason@cornsyrup.org and kelwert@mtu.edu - Fix mz_crc32() so it doesn't compute the wrong CRC-32's when mz_ulong is 64-bit. + - Temporarily/locally slammed in "typedef unsigned long mz_ulong" and re-ran a randomized regression test on ~500k files. + - Eliminated a bunch of warnings when compiling with GCC 32-bit/64. + - Ran all examples, miniz.c, and tinfl.c through MSVC 2008's /analyze (static analysis) option and fixed all warnings (except for the silly + "Use of the comma-operator in a tested expression.." analysis warning, which I purposely use to work around a MSVC compiler warning). + - Created 32-bit and 64-bit Codeblocks projects/workspace. Built and tested Linux executables. The codeblocks workspace is compatible with Linux+Win32/x64. + - Added miniz_tester solution/project, which is a useful little app derived from LZHAM's tester app that I use as part of the regression test. + - Ran miniz.c and tinfl.c through another series of regression testing on ~500,000 files and archives. + - Modified example5.c so it purposely disables a bunch of high-level functionality (MINIZ_NO_STDIO, etc.). (Thanks to corysama for the MINIZ_NO_STDIO bug report.) + - Fix ftell() usage in examples so they exit with an error on files which are too large (a limitation of the examples, not miniz itself). + 4/12/12 v1.12 - More comments, added low-level example5.c, fixed a couple minor level_and_flags issues in the archive API's. + level_and_flags can now be set to MZ_DEFAULT_COMPRESSION. Thanks to Bruce Dawson for the feedback/bug report. + 5/28/11 v1.11 - Added statement from unlicense.org + 5/27/11 v1.10 - Substantial compressor optimizations: + - Level 1 is now ~4x faster than before. The L1 compressor's throughput now varies between 70-110MB/sec. on a + - Core i7 (actual throughput varies depending on the type of data, and x64 vs. x86). + - Improved baseline L2-L9 compression perf. Also, greatly improved compression perf. issues on some file types. + - Refactored the compression code for better readability and maintainability. + - Added level 10 compression level (L10 has slightly better ratio than level 9, but could have a potentially large + drop in throughput on some files). + 5/15/11 v1.09 - Initial stable release. + + * Low-level Deflate/Inflate implementation notes: + + Compression: Use the "tdefl" API's. The compressor supports raw, static, and dynamic blocks, lazy or + greedy parsing, match length filtering, RLE-only, and Huffman-only streams. It performs and compresses + approximately as well as zlib. + + Decompression: Use the "tinfl" API's. The entire decompressor is implemented as a single function + coroutine: see tinfl_decompress(). It supports decompression into a 32KB (or larger power of 2) wrapping buffer, or into a memory + block large enough to hold the entire file. + + The low-level tdefl/tinfl API's do not make any use of dynamic memory allocation. + + * zlib-style API notes: + + miniz.c implements a fairly large subset of zlib. There's enough functionality present for it to be a drop-in + zlib replacement in many apps: + The z_stream struct, optional memory allocation callbacks + deflateInit/deflateInit2/deflate/deflateReset/deflateEnd/deflateBound + inflateInit/inflateInit2/inflate/inflateEnd + compress, compress2, compressBound, uncompress + CRC-32, Adler-32 - Using modern, minimal code size, CPU cache friendly routines. + Supports raw deflate streams or standard zlib streams with adler-32 checking. + + Limitations: + The callback API's are not implemented yet. No support for gzip headers or zlib static dictionaries. + I've tried to closely emulate zlib's various flavors of stream flushing and return status codes, but + there are no guarantees that miniz.c pulls this off perfectly. + + * PNG writing: See the tdefl_write_image_to_png_file_in_memory() function, originally written by + Alex Evans. Supports 1-4 bytes/pixel images. + + * ZIP archive API notes: + + The ZIP archive API's where designed with simplicity and efficiency in mind, with just enough abstraction to + get the job done with minimal fuss. There are simple API's to retrieve file information, read files from + existing archives, create new archives, append new files to existing archives, or clone archive data from + one archive to another. It supports archives located in memory or the heap, on disk (using stdio.h), + or you can specify custom file read/write callbacks. + + - Archive reading: Just call this function to read a single file from a disk archive: + + void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, + size_t *pSize, mz_uint zip_flags); + + For more complex cases, use the "mz_zip_reader" functions. Upon opening an archive, the entire central + directory is located and read as-is into memory, and subsequent file access only occurs when reading individual files. + + - Archives file scanning: The simple way is to use this function to scan a loaded archive for a specific file: + + int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); + + The locate operation can optionally check file comments too, which (as one aryan) can be used to identify + multiple versions of the same file in an archive. This function uses a simple linear search through the central + directory, so it's not very fast. + + Alternately, you can iterate through all the files in an archive (using mz_zip_reader_get_num_files()) and + retrieve detailed info on each file by calling mz_zip_reader_file_stat(). + + - Archive creation: Use the "mz_zip_writer" functions. The ZIP writer immediately writes compressed file data + to disk and builds an exact image of the central directory in memory. The central directory image is written + all at once at the end of the archive file when the archive is finalized. + + The archive writer can optionally align each file's local header and file data to any power of 2 alignment, + which can be useful when the archive will be read from optical media. Also, the writer supports placing + arbitrary data blobs at the very beginning of ZIP archives. Archives written using either feature are still + readable by any ZIP tool. + + - Archive appending: The simple way to add a single file to an archive is to call this function: + + mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, + const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); + + The archive will be created if it doesn't already exist, otherwise it'll be appended to. + Note the appending is done in-place and is not an atomic operation, so if something goes wrong + during the operation it's possible the archive could be left without a central directory (although the local + file headers and file data will be fine, so the archive will be recoverable). + + For more complex archive modification scenarios: + 1. The safest way is to use a mz_zip_reader to read the existing archive, cloning only those bits you want to + preserve into a new archive using using the mz_zip_writer_add_from_zip_reader() function (which compiles the + compressed file data as-is). When you're done, delete the old archive and rename the newly written archive, and + you're done. This is safe but requires a bunch of temporary disk space or heap memory. + + 2. Or, you can convert an mz_zip_reader in-place to an mz_zip_writer using mz_zip_writer_init_from_reader(), + append new files as needed, then finalize the archive which will write an updated central directory to the + original archive. (This is basically what mz_zip_add_mem_to_archive_file_in_place() does.) There's a + possibility that the archive's central directory could be lost with this method if anything goes wrong, though. + + - ZIP archive support limitations: + No zip64 or spanning support. Extraction functions can only handle unencrypted, stored or deflated files. + Requires streams capable of seeking. + + * This is a header file library, like stb_image.c. To get only a header file, either cut and paste the + below header, or create miniz.h, #define MINIZ_HEADER_FILE_ONLY, and then include miniz.c from it. + + * Important: For best perf. be sure to customize the below macros for your target platform: + #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 + #define MINIZ_LITTLE_ENDIAN 1 + #define MINIZ_HAS_64BIT_REGISTERS 1 + + * On platforms using glibc, Be sure to "#define _LARGEFILE64_SOURCE 1" before including miniz.c to ensure miniz + uses the 64-bit variants: fopen64(), stat64(), etc. Otherwise you won't be able to process large files + (i.e. 32-bit stat() fails for me on files > 0x7FFFFFFF bytes). + */ + +#ifndef MINIZ_HEADER_INCLUDED +#define MINIZ_HEADER_INCLUDED + +#include + +// Defines to completely disable specific portions of miniz.c: +// If all macros here are defined the only functionality remaining will be CRC-32, adler-32, tinfl, and tdefl. + +// Define MINIZ_NO_STDIO to disable all usage and any functions which rely on stdio for file I/O. +//#define MINIZ_NO_STDIO + +// If MINIZ_NO_TIME is specified then the ZIP archive functions will not be able to get the current time, or +// get/set file times, and the C run-time funcs that get/set times won't be called. +// The current downside is the times written to your archives will be from 1979. +//#define MINIZ_NO_TIME + +// Define MINIZ_NO_ARCHIVE_APIS to disable all ZIP archive API's. +//#define MINIZ_NO_ARCHIVE_APIS + +// Define MINIZ_NO_ARCHIVE_APIS to disable all writing related ZIP archive API's. +//#define MINIZ_NO_ARCHIVE_WRITING_APIS + +// Define MINIZ_NO_ZLIB_APIS to remove all ZLIB-style compression/decompression API's. +//#define MINIZ_NO_ZLIB_APIS + +// Define MINIZ_NO_ZLIB_COMPATIBLE_NAME to disable zlib names, to prevent conflicts against stock zlib. +//#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +// Define MINIZ_NO_MALLOC to disable all calls to malloc, free, and realloc. +// Note if MINIZ_NO_MALLOC is defined then the user must always provide custom user alloc/free/realloc +// callbacks to the zlib and archive API's, and a few stand-alone helper API's which don't provide custom user +// functions (such as tdefl_compress_mem_to_heap() and tinfl_decompress_mem_to_heap()) won't work. +//#define MINIZ_NO_MALLOC + +#if defined(__TINYC__) && (defined(__linux) || defined(__linux__)) +// TODO: Work around "error: include file 'sys\utime.h' when compiling with tcc on Linux +#define MINIZ_NO_TIME +#endif + +#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS) +#include +#endif + +#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || defined(__x86_64__) +// MINIZ_X86_OR_X64_CPU is only used to help set the below macros. +#define MINIZ_X86_OR_X64_CPU 1 +#endif + +#if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU +// Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian. +#define MINIZ_LITTLE_ENDIAN 1 +#endif + +#if MINIZ_X86_OR_X64_CPU +// Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 on CPU's that permit efficient integer loads and stores from unaligned addresses. +#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1 +#endif + +#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__) +// Set MINIZ_HAS_64BIT_REGISTERS to 1 if operations on 64-bit integers are reasonably fast (and don't involve compiler generated calls to helper functions). +#define MINIZ_HAS_64BIT_REGISTERS 1 +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + // ------------------- zlib-style API Definitions. + + // For more compatibility with zlib, miniz.c uses unsigned long for some parameters/struct members. Beware: mz_ulong can be either 32 or 64-bits! + typedef unsigned long mz_ulong; + + // mz_free() internally uses the MZ_FREE() macro (which by default calls free() unless you've modified the MZ_MALLOC macro) to release a block allocated from the heap. + void mz_free(void *p); + +#define MZ_ADLER32_INIT (1) + // mz_adler32() returns the initial adler-32 value to use when called with ptr==NULL. + mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len); + +#define MZ_CRC32_INIT (0) + // mz_crc32() returns the initial CRC-32 value to use when called with ptr==NULL. + mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len); + + // Compression strategies. + enum { MZ_DEFAULT_STRATEGY = 0, MZ_FILTERED = 1, MZ_HUFFMAN_ONLY = 2, MZ_RLE = 3, MZ_FIXED = 4 }; + + // Method +#define MZ_DEFLATED 8 + +#ifndef MINIZ_NO_ZLIB_APIS + + // Heap allocation callbacks. + // Note that mz_alloc_func parameter types purpsosely differ from zlib's: items/size is size_t, not unsigned long. + typedef void *(*mz_alloc_func)(void *opaque, size_t items, size_t size); + typedef void (*mz_free_func)(void *opaque, void *address); + typedef void *(*mz_realloc_func)(void *opaque, void *address, size_t items, size_t size); + +#define MZ_VERSION "9.1.15" +#define MZ_VERNUM 0x91F0 +#define MZ_VER_MAJOR 9 +#define MZ_VER_MINOR 1 +#define MZ_VER_REVISION 15 +#define MZ_VER_SUBREVISION 0 + + // Flush values. For typical usage you only need MZ_NO_FLUSH and MZ_FINISH. The other values are for advanced use (refer to the zlib docs). + enum { MZ_NO_FLUSH = 0, MZ_PARTIAL_FLUSH = 1, MZ_SYNC_FLUSH = 2, MZ_FULL_FLUSH = 3, MZ_FINISH = 4, MZ_BLOCK = 5 }; + + // Return status codes. MZ_PARAM_ERROR is non-standard. + enum { MZ_OK = 0, MZ_STREAM_END = 1, MZ_NEED_DICT = 2, MZ_ERRNO = -1, MZ_STREAM_ERROR = -2, MZ_DATA_ERROR = -3, MZ_MEM_ERROR = -4, MZ_BUF_ERROR = -5, MZ_VERSION_ERROR = -6, MZ_PARAM_ERROR = -10000 }; + + // Compression levels: 0-9 are the standard zlib-style levels, 10 is best possible compression (not zlib compatible, and may be very slow), MZ_DEFAULT_COMPRESSION=MZ_DEFAULT_LEVEL. + enum { MZ_NO_COMPRESSION = 0, MZ_BEST_SPEED = 1, MZ_BEST_COMPRESSION = 9, MZ_UBER_COMPRESSION = 10, MZ_DEFAULT_LEVEL = 6, MZ_DEFAULT_COMPRESSION = -1 }; + + // Window bits +#define MZ_DEFAULT_WINDOW_BITS 15 + + struct mz_internal_state; + + // Compression/decompression stream struct. + typedef struct mz_stream_s { + const unsigned char *next_in; // pointer to next byte to read + unsigned int avail_in; // number of bytes available at next_in + mz_ulong total_in; // total number of bytes consumed so far + + unsigned char *next_out; // pointer to next byte to write + unsigned int avail_out; // number of bytes that can be written to next_out + mz_ulong total_out; // total number of bytes produced so far + + char *msg; // error msg (unused) + struct mz_internal_state *state; // internal state, allocated by zalloc/zfree + + mz_alloc_func zalloc; // optional heap allocation function (defaults to malloc) + mz_free_func zfree; // optional heap free function (defaults to free) + void *opaque; // heap alloc function user pointer + + int data_type; // data_type (unused) + mz_ulong adler; // adler32 of the source or uncompressed data + mz_ulong reserved; // not used + } mz_stream; + + typedef mz_stream *mz_streamp; + + // Returns the version string of miniz.c. + const char *mz_version(void); + + // mz_deflateInit() initializes a compressor with default options: + // Parameters: + // pStream must point to an initialized mz_stream struct. + // level must be between [MZ_NO_COMPRESSION, MZ_BEST_COMPRESSION]. + // level 1 enables a specially optimized compression function that's been optimized purely for performance, not ratio. + // (This special func. is currently only enabled when MINIZ_USE_UNALIGNED_LOADS_AND_STORES and MINIZ_LITTLE_ENDIAN are defined.) + // Return values: + // MZ_OK on success. + // MZ_STREAM_ERROR if the stream is bogus. + // MZ_PARAM_ERROR if the input parameters are bogus. + // MZ_MEM_ERROR on out of memory. + int mz_deflateInit(mz_streamp pStream, int level); + + // mz_deflateInit2() is like mz_deflate(), except with more control: + // Additional parameters: + // method must be MZ_DEFLATED + // window_bits must be MZ_DEFAULT_WINDOW_BITS (to wrap the deflate stream with zlib header/adler-32 footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate/no header or footer) + // mem_level must be between [1, 9] (it's checked but ignored by miniz.c) + int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy); + + // Quickly resets a compressor without having to reallocate anything. Same as calling mz_deflateEnd() followed by mz_deflateInit()/mz_deflateInit2(). + int mz_deflateReset(mz_streamp pStream); + + // mz_deflate() compresses the input to output, consuming as much of the input and producing as much output as possible. + // Parameters: + // pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. + // flush may be MZ_NO_FLUSH, MZ_PARTIAL_FLUSH/MZ_SYNC_FLUSH, MZ_FULL_FLUSH, or MZ_FINISH. + // Return values: + // MZ_OK on success (when flushing, or if more input is needed but not available, and/or there's more output to be written but the output buffer is full). + // MZ_STREAM_END if all input has been consumed and all output bytes have been written. Don't call mz_deflate() on the stream anymore. + // MZ_STREAM_ERROR if the stream is bogus. + // MZ_PARAM_ERROR if one of the parameters is invalid. + // MZ_BUF_ERROR if no forward progress is possible because the input and/or output buffers are empty. (Fill up the input buffer or free up some output space and try again.) + int mz_deflate(mz_streamp pStream, int flush); + + // mz_deflateEnd() deinitializes a compressor: + // Return values: + // MZ_OK on success. + // MZ_STREAM_ERROR if the stream is bogus. + int mz_deflateEnd(mz_streamp pStream); + + // mz_deflateBound() returns a (very) conservative upper bound on the amount of data that could be generated by deflate(), assuming flush is set to only MZ_NO_FLUSH or MZ_FINISH. + mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len); + + // Single-call compression functions mz_compress() and mz_compress2(): + // Returns MZ_OK on success, or one of the error codes from mz_deflate() on failure. + int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); + int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level); + + // mz_compressBound() returns a (very) conservative upper bound on the amount of data that could be generated by calling mz_compress(). + mz_ulong mz_compressBound(mz_ulong source_len); + + // Initializes a decompressor. + int mz_inflateInit(mz_streamp pStream); + + // mz_inflateInit2() is like mz_inflateInit() with an additional option that controls the window size and whether or not the stream has been wrapped with a zlib header/footer: + // window_bits must be MZ_DEFAULT_WINDOW_BITS (to parse zlib header/footer) or -MZ_DEFAULT_WINDOW_BITS (raw deflate). + int mz_inflateInit2(mz_streamp pStream, int window_bits); + + // Decompresses the input stream to the output, consuming only as much of the input as needed, and writing as much to the output as possible. + // Parameters: + // pStream is the stream to read from and write to. You must initialize/update the next_in, avail_in, next_out, and avail_out members. + // flush may be MZ_NO_FLUSH, MZ_SYNC_FLUSH, or MZ_FINISH. + // On the first call, if flush is MZ_FINISH it's assumed the input and output buffers are both sized large enough to decompress the entire stream in a single call (this is slightly faster). + // MZ_FINISH implies that there are no more source bytes available beside what's already in the input buffer, and that the output buffer is large enough to hold the rest of the decompressed data. + // Return values: + // MZ_OK on success. Either more input is needed but not available, and/or there's more output to be written but the output buffer is full. + // MZ_STREAM_END if all needed input has been consumed and all output bytes have been written. For zlib streams, the adler-32 of the decompressed data has also been verified. + // MZ_STREAM_ERROR if the stream is bogus. + // MZ_DATA_ERROR if the deflate stream is invalid. + // MZ_PARAM_ERROR if one of the parameters is invalid. + // MZ_BUF_ERROR if no forward progress is possible because the input buffer is empty but the inflater needs more input to continue, or if the output buffer is not large enough. Call mz_inflate() again + // with more input data, or with more room in the output buffer (except when using single call decompression, described above). + int mz_inflate(mz_streamp pStream, int flush); + + // Deinitializes a decompressor. + int mz_inflateEnd(mz_streamp pStream); + + // Single-call decompression. + // Returns MZ_OK on success, or one of the error codes from mz_inflate() on failure. + int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len); + + // Returns a string description of the specified error code, or NULL if the error code is invalid. + const char *mz_error(int err); + + // Redefine zlib-compatible names to miniz equivalents, so miniz.c can be used as a drop-in replacement for the subset of zlib that miniz.c supports. + // Define MINIZ_NO_ZLIB_COMPATIBLE_NAMES to disable zlib-compatibility if you use zlib in the same project. +#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES + typedef unsigned char Byte; + typedef unsigned int uInt; + typedef mz_ulong uLong; + typedef Byte Bytef; + typedef uInt uIntf; + typedef char charf; + typedef int intf; + typedef void *voidpf; + typedef uLong uLongf; + typedef void *voidp; + typedef void *const voidpc; +#define Z_NULL 0 +#define Z_NO_FLUSH MZ_NO_FLUSH +#define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH +#define Z_SYNC_FLUSH MZ_SYNC_FLUSH +#define Z_FULL_FLUSH MZ_FULL_FLUSH +#define Z_FINISH MZ_FINISH +#define Z_BLOCK MZ_BLOCK +#define Z_OK MZ_OK +#define Z_STREAM_END MZ_STREAM_END +#define Z_NEED_DICT MZ_NEED_DICT +#define Z_ERRNO MZ_ERRNO +#define Z_STREAM_ERROR MZ_STREAM_ERROR +#define Z_DATA_ERROR MZ_DATA_ERROR +#define Z_MEM_ERROR MZ_MEM_ERROR +#define Z_BUF_ERROR MZ_BUF_ERROR +#define Z_VERSION_ERROR MZ_VERSION_ERROR +#define Z_PARAM_ERROR MZ_PARAM_ERROR +#define Z_NO_COMPRESSION MZ_NO_COMPRESSION +#define Z_BEST_SPEED MZ_BEST_SPEED +#define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION +#define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION +#define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY +#define Z_FILTERED MZ_FILTERED +#define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY +#define Z_RLE MZ_RLE +#define Z_FIXED MZ_FIXED +#define Z_DEFLATED MZ_DEFLATED +#define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS +#define alloc_func mz_alloc_func +#define free_func mz_free_func +#define internal_state mz_internal_state +#define z_stream mz_stream +#define deflateInit mz_deflateInit +#define deflateInit2 mz_deflateInit2 +#define deflateReset mz_deflateReset +#define deflate mz_deflate +#define deflateEnd mz_deflateEnd +#define deflateBound mz_deflateBound +#define compress mz_compress +#define compress2 mz_compress2 +#define compressBound mz_compressBound +#define inflateInit mz_inflateInit +#define inflateInit2 mz_inflateInit2 +#define inflate mz_inflate +#define inflateEnd mz_inflateEnd +#define uncompress mz_uncompress +#define crc32 mz_crc32 +#define adler32 mz_adler32 +#define MAX_WBITS 15 +#define MAX_MEM_LEVEL 9 +#define zError mz_error +#define ZLIB_VERSION MZ_VERSION +#define ZLIB_VERNUM MZ_VERNUM +#define ZLIB_VER_MAJOR MZ_VER_MAJOR +#define ZLIB_VER_MINOR MZ_VER_MINOR +#define ZLIB_VER_REVISION MZ_VER_REVISION +#define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION +#define zlibVersion mz_version +#define zlib_version mz_version() +#endif // #ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES + +#endif // MINIZ_NO_ZLIB_APIS + + // ------------------- Types and macros + + typedef unsigned char mz_uint8; + typedef signed short mz_int16; + typedef unsigned short mz_uint16; + typedef unsigned int mz_uint32; + typedef unsigned int mz_uint; + typedef long long mz_int64; + typedef unsigned long long mz_uint64; + typedef int mz_bool; + +#define MZ_FALSE (0) +#define MZ_TRUE (1) + + // An attempt to work around MSVC's spammy "warning C4127: conditional expression is constant" message. +#ifdef _MSC_VER +#define MZ_MACRO_END while (0, 0) +#else +#define MZ_MACRO_END while (0) +#endif + + // ------------------- ZIP archive reading/writing + +#ifndef MINIZ_NO_ARCHIVE_APIS + + enum { + MZ_ZIP_MAX_IO_BUF_SIZE = 64 * 1024, + MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE = 260, + MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE = 256 + }; + + typedef struct { + mz_uint32 m_file_index; + mz_uint32 m_central_dir_ofs; + mz_uint16 m_version_made_by; + mz_uint16 m_version_needed; + mz_uint16 m_bit_flag; + mz_uint16 m_method; +#ifndef MINIZ_NO_TIME + time_t m_time; +#endif + mz_uint32 m_crc32; + mz_uint64 m_comp_size; + mz_uint64 m_uncomp_size; + mz_uint16 m_internal_attr; + mz_uint32 m_external_attr; + mz_uint64 m_local_header_ofs; + mz_uint32 m_comment_size; + char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE]; + char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE]; + } mz_zip_archive_file_stat; + + typedef size_t (*mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n); + typedef size_t (*mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n); + + struct mz_zip_internal_state_tag; + typedef struct mz_zip_internal_state_tag mz_zip_internal_state; + + typedef enum { + MZ_ZIP_MODE_INVALID = 0, + MZ_ZIP_MODE_READING = 1, + MZ_ZIP_MODE_WRITING = 2, + MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED = 3 + } mz_zip_mode; + + typedef struct mz_zip_archive_tag { + mz_uint64 m_archive_size; + mz_uint64 m_central_directory_file_ofs; + mz_uint m_total_files; + mz_zip_mode m_zip_mode; + + mz_uint m_file_offset_alignment; + + mz_alloc_func m_pAlloc; + mz_free_func m_pFree; + mz_realloc_func m_pRealloc; + void *m_pAlloc_opaque; + + mz_file_read_func m_pRead; + mz_file_write_func m_pWrite; + void *m_pIO_opaque; + + mz_zip_internal_state *m_pState; + + } mz_zip_archive; + + typedef enum { + MZ_ZIP_FLAG_CASE_SENSITIVE = 0x0100, + MZ_ZIP_FLAG_IGNORE_PATH = 0x0200, + MZ_ZIP_FLAG_COMPRESSED_DATA = 0x0400, + MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY = 0x0800 + } mz_zip_flags; + + // ZIP archive reading + + // Inits a ZIP archive reader. + // These functions read and validate the archive's central directory. + mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags); + mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags); + +#ifndef MINIZ_NO_STDIO + mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags); +#endif + + // Returns the total number of files in the archive. + mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip); + + // Returns detailed information about an archive file entry. + mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat); + + // Determines if an archive file entry is a directory entry. + mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index); + mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index); + + // Retrieves the filename of an archive file entry. + // Returns the number of bytes written to pFilename, or if filename_buf_size is 0 this function returns the number of bytes needed to fully store the filename. + mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size); + + // Attempts to locates a file in the archive's central directory. + // Valid flags: MZ_ZIP_FLAG_CASE_SENSITIVE, MZ_ZIP_FLAG_IGNORE_PATH + // Returns -1 if the file cannot be found. + int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags); + + // Extracts a archive file to a memory buffer using no memory allocation. + mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size); + mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size); + + // Extracts a archive file to a memory buffer. + mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags); + mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags); + + // Extracts a archive file to a dynamically allocated heap buffer. + void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags); + void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags); + + // Extracts a archive file using a callback function to output the file's data. + mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags); + mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags); + +#ifndef MINIZ_NO_STDIO + // Extracts a archive file to a disk file and sets its last accessed and modified times. + // This function only extracts files, not archive directory records. + mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags); + mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags); +#endif + + // Ends archive reading, freeing all allocations, and closing the input archive file if mz_zip_reader_init_file() was used. + mz_bool mz_zip_reader_end(mz_zip_archive *pZip); + + // ZIP archive writing + +#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + + // Inits a ZIP archive writer. + mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size); + mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size); + +#ifndef MINIZ_NO_STDIO + mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning); +#endif + + // Converts a ZIP archive reader object into a writer object, to allow efficient in-place file appends to occur on an existing archive. + // For archives opened using mz_zip_reader_init_file, pFilename must be the archive's filename so it can be reopened for writing. If the file can't be reopened, mz_zip_reader_end() will be called. + // For archives opened using mz_zip_reader_init_mem, the memory block must be growable using the realloc callback (which defaults to realloc unless you've overridden it). + // Finally, for archives opened using mz_zip_reader_init, the mz_zip_archive's user provided m_pWrite function cannot be NULL. + // Note: In-place archive modification is not recommended unless you know what you're doing, because if execution stops or something goes wrong before + // the archive is finalized the file's central directory will be hosed. + mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename); + + // Adds the contents of a memory buffer to an archive. These functions record the current local time into the archive. + // To add a directory entry, call this method with an archive name ending in a forwardslash with empty buffer. + // level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. + mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags); + mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32); + +#ifndef MINIZ_NO_STDIO + // Adds the contents of a disk file to an archive. This function also records the disk file's modified time into the archive. + // level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. + mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); +#endif + + // Adds a file to an archive by fully cloning the data from another archive. + // This function fully clones the source file's compressed data (no recompression), along with its full filename, extra data, and comment fields. + mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index); + + // Finalizes the archive by writing the central directory records followed by the end of central directory record. + // After an archive is finalized, the only valid call on the mz_zip_archive struct is mz_zip_writer_end(). + // An archive must be manually finalized by calling this function for it to be valid. + mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip); + mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize); + + // Ends archive writing, freeing all allocations, and closing the output file if mz_zip_writer_init_file() was used. + // Note for the archive to be valid, it must have been finalized before ending. + mz_bool mz_zip_writer_end(mz_zip_archive *pZip); + + // Misc. high-level helper functions: + + // mz_zip_add_mem_to_archive_file_in_place() efficiently (but not atomically) appends a memory blob to a ZIP archive. + // level_and_flags - compression level (0-10, see MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc.) logically OR'd with zero or more mz_zip_flags, or just set to MZ_DEFAULT_COMPRESSION. + mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags); + + // Reads a single file from an archive into a heap block. + // Returns NULL on failure. + void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags); + +#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +#endif // #ifndef MINIZ_NO_ARCHIVE_APIS + + // ------------------- Low-level Decompression API Definitions + + // Decompression flags used by tinfl_decompress(). + // TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream. + // TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input. + // TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB). + // TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes. + enum { + TINFL_FLAG_PARSE_ZLIB_HEADER = 1, + TINFL_FLAG_HAS_MORE_INPUT = 2, + TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4, + TINFL_FLAG_COMPUTE_ADLER32 = 8 + }; + + // High level decompression functions: + // tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc(). + // On entry: + // pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress. + // On return: + // Function returns a pointer to the decompressed data, or NULL on failure. + // *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data. + // The caller must call mz_free() on the returned block when it's no longer needed. + void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags); + + // tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory. + // Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success. +#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1)) + size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); + + // tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer. + // Returns 1 on success or 0 on failure. + typedef int (*tinfl_put_buf_func_ptr)(const void *pBuf, int len, void *pUser); + int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + + struct tinfl_decompressor_tag; + typedef struct tinfl_decompressor_tag tinfl_decompressor; + + // Max size of LZ dictionary. +#define TINFL_LZ_DICT_SIZE 32768 + + // Return status. + typedef enum { + TINFL_STATUS_BAD_PARAM = -3, + TINFL_STATUS_ADLER32_MISMATCH = -2, + TINFL_STATUS_FAILED = -1, + TINFL_STATUS_DONE = 0, + TINFL_STATUS_NEEDS_MORE_INPUT = 1, + TINFL_STATUS_HAS_MORE_OUTPUT = 2 + } tinfl_status; + + // Initializes the decompressor to its initial state. +#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END +#define tinfl_get_adler32(r) (r)->m_check_adler32 + + // Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability. + // This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output. + tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags); + + // Internal/private bits follow. + enum { + TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19, + TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS + }; + + typedef struct { + mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0]; + mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2]; + } tinfl_huff_table; + +#if MINIZ_HAS_64BIT_REGISTERS +#define TINFL_USE_64BIT_BITBUF 1 +#endif + +#if TINFL_USE_64BIT_BITBUF + typedef mz_uint64 tinfl_bit_buf_t; +#define TINFL_BITBUF_SIZE (64) +#else + typedef mz_uint32 tinfl_bit_buf_t; +#define TINFL_BITBUF_SIZE (32) +#endif + + struct tinfl_decompressor_tag { + mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES]; + tinfl_bit_buf_t m_bit_buf; + size_t m_dist_from_out_buf_start; + tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES]; + mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137]; + }; + + // ------------------- Low-level Compression API Definitions + + // Set TDEFL_LESS_MEMORY to 1 to use less memory (compression will be slightly slower, and raw/dynamic blocks will be output more frequently). +#define TDEFL_LESS_MEMORY 0 + + // tdefl_init() compression flags logically OR'd together (low 12 bits contain the max. number of probes per dictionary search): + // TDEFL_DEFAULT_MAX_PROBES: The compressor defaults to 128 dictionary probes per dictionary search. 0=Huffman only, 1=Huffman+LZ (fastest/crap compression), 4095=Huffman+LZ (slowest/best compression). + enum { + TDEFL_HUFFMAN_ONLY = 0, TDEFL_DEFAULT_MAX_PROBES = 128, TDEFL_MAX_PROBES_MASK = 0xFFF + }; + + // TDEFL_WRITE_ZLIB_HEADER: If set, the compressor outputs a zlib header before the deflate data, and the Adler-32 of the source data at the end. Otherwise, you'll get raw deflate data. + // TDEFL_COMPUTE_ADLER32: Always compute the adler-32 of the input data (even when not writing zlib headers). + // TDEFL_GREEDY_PARSING_FLAG: Set to use faster greedy parsing, instead of more efficient lazy parsing. + // TDEFL_NONDETERMINISTIC_PARSING_FLAG: Enable to decrease the compressor's initialization time to the minimum, but the output may vary from run to run given the same input (depending on the contents of memory). + // TDEFL_RLE_MATCHES: Only look for RLE matches (matches with a distance of 1) + // TDEFL_FILTER_MATCHES: Discards matches <= 5 chars if enabled. + // TDEFL_FORCE_ALL_STATIC_BLOCKS: Disable usage of optimized Huffman tables. + // TDEFL_FORCE_ALL_RAW_BLOCKS: Only use raw (uncompressed) deflate blocks. + // The low 12 bits are reserved to control the max # of hash probes per dictionary lookup (see TDEFL_MAX_PROBES_MASK). + enum { + TDEFL_WRITE_ZLIB_HEADER = 0x01000, + TDEFL_COMPUTE_ADLER32 = 0x02000, + TDEFL_GREEDY_PARSING_FLAG = 0x04000, + TDEFL_NONDETERMINISTIC_PARSING_FLAG = 0x08000, + TDEFL_RLE_MATCHES = 0x10000, + TDEFL_FILTER_MATCHES = 0x20000, + TDEFL_FORCE_ALL_STATIC_BLOCKS = 0x40000, + TDEFL_FORCE_ALL_RAW_BLOCKS = 0x80000 + }; + + // High level compression functions: + // tdefl_compress_mem_to_heap() compresses a block in memory to a heap block allocated via malloc(). + // On entry: + // pSrc_buf, src_buf_len: Pointer and size of source block to compress. + // flags: The max match finder probes (default is 128) logically OR'd against the above flags. Higher probes are slower but improve compression. + // On return: + // Function returns a pointer to the compressed data, or NULL on failure. + // *pOut_len will be set to the compressed data's size, which could be larger than src_buf_len on uncompressible data. + // The caller must free() the returned block when it's no longer needed. + void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags); + + // tdefl_compress_mem_to_mem() compresses a block in memory to another block in memory. + // Returns 0 on failure. + size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags); + + // Compresses an image to a compressed PNG file in memory. + // On entry: + // pImage, w, h, and num_chans describe the image to compress. num_chans may be 1, 2, 3, or 4. + // The image pitch in bytes per scanline will be w*num_chans. The leftmost pixel on the top scanline is stored first in memory. + // level may range from [0,10], use MZ_NO_COMPRESSION, MZ_BEST_SPEED, MZ_BEST_COMPRESSION, etc. or a decent default is MZ_DEFAULT_LEVEL + // If flip is true, the image will be flipped on the Y axis (useful for OpenGL apps). + // On return: + // Function returns a pointer to the compressed data, or NULL on failure. + // *pLen_out will be set to the size of the PNG image file. + // The caller must mz_free() the returned heap block (which will typically be larger than *pLen_out) when it's no longer needed. + void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip); + void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out); + + // Output stream interface. The compressor uses this interface to write compressed data. It'll typically be called TDEFL_OUT_BUF_SIZE at a time. + typedef mz_bool (*tdefl_put_buf_func_ptr)(const void *pBuf, int len, void *pUser); + + // tdefl_compress_mem_to_output() compresses a block to an output stream. The above helpers use this function internally. + mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + + enum { TDEFL_MAX_HUFF_TABLES = 3, TDEFL_MAX_HUFF_SYMBOLS_0 = 288, TDEFL_MAX_HUFF_SYMBOLS_1 = 32, TDEFL_MAX_HUFF_SYMBOLS_2 = 19, TDEFL_LZ_DICT_SIZE = 32768, TDEFL_LZ_DICT_SIZE_MASK = TDEFL_LZ_DICT_SIZE - 1, TDEFL_MIN_MATCH_LEN = 3, TDEFL_MAX_MATCH_LEN = 258 }; + + // TDEFL_OUT_BUF_SIZE MUST be large enough to hold a single entire compressed output block (using static/fixed Huffman codes). +#if TDEFL_LESS_MEMORY + enum { TDEFL_LZ_CODE_BUF_SIZE = 24 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 12, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; +#else + enum { TDEFL_LZ_CODE_BUF_SIZE = 64 * 1024, TDEFL_OUT_BUF_SIZE = (TDEFL_LZ_CODE_BUF_SIZE * 13 ) / 10, TDEFL_MAX_HUFF_SYMBOLS = 288, TDEFL_LZ_HASH_BITS = 15, TDEFL_LEVEL1_HASH_SIZE_MASK = 4095, TDEFL_LZ_HASH_SHIFT = (TDEFL_LZ_HASH_BITS + 2) / 3, TDEFL_LZ_HASH_SIZE = 1 << TDEFL_LZ_HASH_BITS }; +#endif + + // The low-level tdefl functions below may be used directly if the above helper functions aren't flexible enough. The low-level functions don't make any heap allocations, unlike the above helper functions. + typedef enum { + TDEFL_STATUS_BAD_PARAM = -2, + TDEFL_STATUS_PUT_BUF_FAILED = -1, + TDEFL_STATUS_OKAY = 0, + TDEFL_STATUS_DONE = 1, + } tdefl_status; + + // Must map to MZ_NO_FLUSH, MZ_SYNC_FLUSH, etc. enums + typedef enum { + TDEFL_NO_FLUSH = 0, + TDEFL_SYNC_FLUSH = 2, + TDEFL_FULL_FLUSH = 3, + TDEFL_FINISH = 4 + } tdefl_flush; + + // tdefl's compression state structure. + typedef struct { + tdefl_put_buf_func_ptr m_pPut_buf_func; + void *m_pPut_buf_user; + mz_uint m_flags, m_max_probes[2]; + int m_greedy_parsing; + mz_uint m_adler32, m_lookahead_pos, m_lookahead_size, m_dict_size; + mz_uint8 *m_pLZ_code_buf, *m_pLZ_flags, *m_pOutput_buf, *m_pOutput_buf_end; + mz_uint m_num_flags_left, m_total_lz_bytes, m_lz_code_buf_dict_pos, m_bits_in, m_bit_buffer; + mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished, m_block_index, m_wants_to_finish; + tdefl_status m_prev_return_status; + const void *m_pIn_buf; + void *m_pOut_buf; + size_t *m_pIn_buf_size, *m_pOut_buf_size; + tdefl_flush m_flush; + const mz_uint8 *m_pSrc; + size_t m_src_buf_left, m_out_buf_ofs; + mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE + TDEFL_MAX_MATCH_LEN - 1]; + mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]; + mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE]; + mz_uint16 m_next[TDEFL_LZ_DICT_SIZE]; + mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE]; + mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE]; + } tdefl_compressor; + + // Initializes the compressor. + // There is no corresponding deinit() function because the tdefl API's do not dynamically allocate memory. + // pBut_buf_func: If NULL, output data will be supplied to the specified callback. In this case, the user should call the tdefl_compress_buffer() API for compression. + // If pBut_buf_func is NULL the user should always call the tdefl_compress() API. + // flags: See the above enums (TDEFL_HUFFMAN_ONLY, TDEFL_WRITE_ZLIB_HEADER, etc.) + tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags); + + // Compresses a block of data, consuming as much of the specified input buffer as possible, and writing as much compressed data to the specified output buffer as possible. + tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush); + + // tdefl_compress_buffer() is only usable when the tdefl_init() is called with a non-NULL tdefl_put_buf_func_ptr. + // tdefl_compress_buffer() always consumes the entire input buffer. + tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush); + + tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d); + mz_uint32 tdefl_get_adler32(tdefl_compressor *d); + + // Can't use tdefl_create_comp_flags_from_zip_params if MINIZ_NO_ZLIB_APIS isn't defined, because it uses some of its macros. +#ifndef MINIZ_NO_ZLIB_APIS + // Create tdefl_compress() flags given zlib-style compression parameters. + // level may range from [0,10] (where 10 is absolute max compression, but may be much slower on some files) + // window_bits may be -15 (raw deflate) or 15 (zlib) + // strategy may be either MZ_DEFAULT_STRATEGY, MZ_FILTERED, MZ_HUFFMAN_ONLY, MZ_RLE, or MZ_FIXED + mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy); +#endif // #ifndef MINIZ_NO_ZLIB_APIS + +#ifdef __cplusplus +} +#endif + +#endif // MINIZ_HEADER_INCLUDED + +// ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.) + +#ifndef MINIZ_HEADER_FILE_ONLY + +// Ignore strict-aliasing warning on MinGW gcc +#if defined(__GNUC__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-aliasing" +#endif +// Ignore conversion warnings on clang +#if defined(__clang__) +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wconversion" +#endif + +typedef unsigned char mz_validate_uint16[sizeof(mz_uint16) == 2 ? 1 : -1]; +typedef unsigned char mz_validate_uint32[sizeof(mz_uint32) == 4 ? 1 : -1]; +typedef unsigned char mz_validate_uint64[sizeof(mz_uint64) == 8 ? 1 : -1]; + +#include +#define NDEBUG +#include + +#define MZ_ASSERT(x) assert(x) + +#ifdef MINIZ_NO_MALLOC +#define MZ_MALLOC(x) NULL +#define MZ_FREE(x) (void)x, ((void)0) +#define MZ_REALLOC(p, x) NULL +#else +#define MZ_MALLOC(x) malloc(x) +#define MZ_FREE(x) free(x) +#define MZ_REALLOC(p, x) realloc(p, x) +#endif + +#define MZ_MAX(a,b) (((a)>(b))?(a):(b)) +#define MZ_MIN(a,b) (((a)<(b))?(a):(b)) +#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj)) + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN +#define MZ_READ_LE16(p) *((const mz_uint16 *)(p)) +#define MZ_READ_LE32(p) *((const mz_uint32 *)(p)) +#else +#define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U)) +#define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U)) +#endif + +#ifdef _MSC_VER +#define MZ_FORCEINLINE __forceinline +#elif defined(__GNUC__) +#define MZ_FORCEINLINE inline __attribute__((__always_inline__)) +#else +#define MZ_FORCEINLINE inline +#endif + +#ifdef __cplusplus +extern "C" { +#endif + + // ------------------- zlib-style API's + + mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len) { + mz_uint32 i, s1 = (mz_uint32)(adler & 0xffff), s2 = (mz_uint32)(adler >> 16); + size_t block_len = buf_len % 5552; + if (!ptr) { + return MZ_ADLER32_INIT; + } + while (buf_len) { + for (i = 0; i + 7 < block_len; i += 8, ptr += 8) { + s1 += ptr[0], s2 += s1; + s1 += ptr[1], s2 += s1; + s1 += ptr[2], s2 += s1; + s1 += ptr[3], s2 += s1; + s1 += ptr[4], s2 += s1; + s1 += ptr[5], s2 += s1; + s1 += ptr[6], s2 += s1; + s1 += ptr[7], s2 += s1; + } + for ( ; i < block_len; ++i) { + s1 += *ptr++, s2 += s1; + } + s1 %= 65521U, s2 %= 65521U; + buf_len -= block_len; + block_len = 5552; + } + return (s2 << 16) + s1; + } + + // Karl Malbrain's compact CRC-32. See "A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed": http://www.geocities.com/malbrain/ + mz_ulong mz_crc32(mz_ulong crc, const mz_uint8 *ptr, size_t buf_len) { + static const mz_uint32 s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c + }; + mz_uint32 crcu32 = (mz_uint32)crc; + if (!ptr) { + return MZ_CRC32_INIT; + } + crcu32 = ~crcu32; + while (buf_len--) { + mz_uint8 b = *ptr++; + crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; + crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; + } + return ~crcu32; + } + + void mz_free(void *p) { + MZ_FREE(p); + } + +#ifndef MINIZ_NO_ZLIB_APIS + + static void *def_alloc_func(void *opaque, size_t items, size_t size) { + (void)opaque, (void)items, (void)size; + return MZ_MALLOC(items * size); + } + static void def_free_func(void *opaque, void *address) { + (void)opaque, (void)address; + MZ_FREE(address); + } + static void *def_realloc_func(void *opaque, void *address, size_t items, size_t size) { + (void)opaque, (void)address, (void)items, (void)size; + return MZ_REALLOC(address, items * size); + } + + const char *mz_version(void) { + return MZ_VERSION; + } + + int mz_deflateInit(mz_streamp pStream, int level) { + return mz_deflateInit2(pStream, level, MZ_DEFLATED, MZ_DEFAULT_WINDOW_BITS, 9, MZ_DEFAULT_STRATEGY); + } + + int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy) { + tdefl_compressor *pComp; + mz_uint comp_flags = TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params(level, window_bits, strategy); + if (!pStream) { + return MZ_STREAM_ERROR; + } + if ((method != MZ_DEFLATED) || ((mem_level < 1) || (mem_level > 9)) || ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS))) { + return MZ_PARAM_ERROR; + } + pStream->data_type = 0; + pStream->adler = MZ_ADLER32_INIT; + pStream->msg = NULL; + pStream->reserved = 0; + pStream->total_in = 0; + pStream->total_out = 0; + if (!pStream->zalloc) { + pStream->zalloc = def_alloc_func; + } + if (!pStream->zfree) { + pStream->zfree = def_free_func; + } + pComp = (tdefl_compressor *)pStream->zalloc(pStream->opaque, 1, sizeof(tdefl_compressor)); + if (!pComp) { + return MZ_MEM_ERROR; + } + pStream->state = (struct mz_internal_state *)pComp; + if (tdefl_init(pComp, NULL, NULL, comp_flags) != TDEFL_STATUS_OKAY) { + mz_deflateEnd(pStream); + return MZ_PARAM_ERROR; + } + return MZ_OK; + } + + int mz_deflateReset(mz_streamp pStream) { + if ((!pStream) || (!pStream->state) || (!pStream->zalloc) || (!pStream->zfree)) { + return MZ_STREAM_ERROR; + } + pStream->total_in = pStream->total_out = 0; + tdefl_init((tdefl_compressor *)pStream->state, NULL, NULL, ((tdefl_compressor *)pStream->state)->m_flags); + return MZ_OK; + } + + int mz_deflate(mz_streamp pStream, int flush) { + size_t in_bytes, out_bytes; + mz_ulong orig_total_in, orig_total_out; + int mz_status = MZ_OK; + if ((!pStream) || (!pStream->state) || (flush < 0) || (flush > MZ_FINISH) || (!pStream->next_out)) { + return MZ_STREAM_ERROR; + } + if (!pStream->avail_out) { + return MZ_BUF_ERROR; + } + if (flush == MZ_PARTIAL_FLUSH) { + flush = MZ_SYNC_FLUSH; + } + if (((tdefl_compressor *)pStream->state)->m_prev_return_status == TDEFL_STATUS_DONE) { + return (flush == MZ_FINISH) ? MZ_STREAM_END : MZ_BUF_ERROR; + } + orig_total_in = pStream->total_in; + orig_total_out = pStream->total_out; + for ( ; ; ) { + tdefl_status defl_status; + in_bytes = pStream->avail_in; + out_bytes = pStream->avail_out; + defl_status = tdefl_compress((tdefl_compressor *)pStream->state, pStream->next_in, &in_bytes, pStream->next_out, &out_bytes, (tdefl_flush)flush); + pStream->next_in += (mz_uint)in_bytes; + pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; + pStream->adler = tdefl_get_adler32((tdefl_compressor *)pStream->state); + pStream->next_out += (mz_uint)out_bytes; + pStream->avail_out -= (mz_uint)out_bytes; + pStream->total_out += (mz_uint)out_bytes; + if (defl_status < 0) { + mz_status = MZ_STREAM_ERROR; + break; + } else if (defl_status == TDEFL_STATUS_DONE) { + mz_status = MZ_STREAM_END; + break; + } else if (!pStream->avail_out) { + break; + } else if ((!pStream->avail_in) && (flush != MZ_FINISH)) { + if ((flush) || (pStream->total_in != orig_total_in) || (pStream->total_out != orig_total_out)) { + break; + } + return MZ_BUF_ERROR; // Can't make forward progress without some input. + } + } + return mz_status; + } + + int mz_deflateEnd(mz_streamp pStream) { + if (!pStream) { + return MZ_STREAM_ERROR; + } + if (pStream->state) { + pStream->zfree(pStream->opaque, pStream->state); + pStream->state = NULL; + } + return MZ_OK; + } + + mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len) { + (void)pStream; + // This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.) + return MZ_MAX(128 + (source_len * 110) / 100, 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5); + } + + int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level) { + int status; + mz_stream stream; + memset(&stream, 0, sizeof(stream)); + // In case mz_ulong is 64-bits (argh I hate longs). + if ((source_len | *pDest_len) > 0xFFFFFFFFU) { + return MZ_PARAM_ERROR; + } + stream.next_in = pSource; + stream.avail_in = (mz_uint32)source_len; + stream.next_out = pDest; + stream.avail_out = (mz_uint32) * pDest_len; + status = mz_deflateInit(&stream, level); + if (status != MZ_OK) { + return status; + } + status = mz_deflate(&stream, MZ_FINISH); + if (status != MZ_STREAM_END) { + mz_deflateEnd(&stream); + return (status == MZ_OK) ? MZ_BUF_ERROR : status; + } + *pDest_len = stream.total_out; + return mz_deflateEnd(&stream); + } + + int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) { + return mz_compress2(pDest, pDest_len, pSource, source_len, MZ_DEFAULT_COMPRESSION); + } + + mz_ulong mz_compressBound(mz_ulong source_len) { + return mz_deflateBound(NULL, source_len); + } + + typedef struct { + tinfl_decompressor m_decomp; + mz_uint m_dict_ofs, m_dict_avail, m_first_call, m_has_flushed; + int m_window_bits; + mz_uint8 m_dict[TINFL_LZ_DICT_SIZE]; + tinfl_status m_last_status; + } inflate_state; + + int mz_inflateInit2(mz_streamp pStream, int window_bits) { + inflate_state *pDecomp; + if (!pStream) { + return MZ_STREAM_ERROR; + } + if ((window_bits != MZ_DEFAULT_WINDOW_BITS) && (-window_bits != MZ_DEFAULT_WINDOW_BITS)) { + return MZ_PARAM_ERROR; + } + pStream->data_type = 0; + pStream->adler = 0; + pStream->msg = NULL; + pStream->total_in = 0; + pStream->total_out = 0; + pStream->reserved = 0; + if (!pStream->zalloc) { + pStream->zalloc = def_alloc_func; + } + if (!pStream->zfree) { + pStream->zfree = def_free_func; + } + pDecomp = (inflate_state *)pStream->zalloc(pStream->opaque, 1, sizeof(inflate_state)); + if (!pDecomp) { + return MZ_MEM_ERROR; + } + pStream->state = (struct mz_internal_state *)pDecomp; + tinfl_init(&pDecomp->m_decomp); + pDecomp->m_dict_ofs = 0; + pDecomp->m_dict_avail = 0; + pDecomp->m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT; + pDecomp->m_first_call = 1; + pDecomp->m_has_flushed = 0; + pDecomp->m_window_bits = window_bits; + return MZ_OK; + } + + int mz_inflateInit(mz_streamp pStream) { + return mz_inflateInit2(pStream, MZ_DEFAULT_WINDOW_BITS); + } + + int mz_inflate(mz_streamp pStream, int flush) { + inflate_state *pState; + mz_uint n, first_call, decomp_flags = TINFL_FLAG_COMPUTE_ADLER32; + size_t in_bytes, out_bytes, orig_avail_in; + tinfl_status status; + if ((!pStream) || (!pStream->state)) { + return MZ_STREAM_ERROR; + } + if (flush == MZ_PARTIAL_FLUSH) { + flush = MZ_SYNC_FLUSH; + } + if ((flush) && (flush != MZ_SYNC_FLUSH) && (flush != MZ_FINISH)) { + return MZ_STREAM_ERROR; + } + pState = (inflate_state *)pStream->state; + if (pState->m_window_bits > 0) { + decomp_flags |= TINFL_FLAG_PARSE_ZLIB_HEADER; + } + orig_avail_in = pStream->avail_in; + first_call = pState->m_first_call; + pState->m_first_call = 0; + if (pState->m_last_status < 0) { + return MZ_DATA_ERROR; + } + if (pState->m_has_flushed && (flush != MZ_FINISH)) { + return MZ_STREAM_ERROR; + } + pState->m_has_flushed |= (flush == MZ_FINISH); + if ((flush == MZ_FINISH) && (first_call)) { + // MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file. + decomp_flags |= TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF; + in_bytes = pStream->avail_in; + out_bytes = pStream->avail_out; + status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pStream->next_out, pStream->next_out, &out_bytes, decomp_flags); + pState->m_last_status = status; + pStream->next_in += (mz_uint)in_bytes; + pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; + pStream->adler = tinfl_get_adler32(&pState->m_decomp); + pStream->next_out += (mz_uint)out_bytes; + pStream->avail_out -= (mz_uint)out_bytes; + pStream->total_out += (mz_uint)out_bytes; + if (status < 0) { + return MZ_DATA_ERROR; + } else if (status != TINFL_STATUS_DONE) { + pState->m_last_status = TINFL_STATUS_FAILED; + return MZ_BUF_ERROR; + } + return MZ_STREAM_END; + } + // flush != MZ_FINISH then we must assume there's more input. + if (flush != MZ_FINISH) { + decomp_flags |= TINFL_FLAG_HAS_MORE_INPUT; + } + if (pState->m_dict_avail) { + n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); + memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); + pStream->next_out += n; + pStream->avail_out -= n; + pStream->total_out += n; + pState->m_dict_avail -= n; + pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); + return ((pState->m_last_status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; + } + for ( ; ; ) { + in_bytes = pStream->avail_in; + out_bytes = TINFL_LZ_DICT_SIZE - pState->m_dict_ofs; + status = tinfl_decompress(&pState->m_decomp, pStream->next_in, &in_bytes, pState->m_dict, pState->m_dict + pState->m_dict_ofs, &out_bytes, decomp_flags); + pState->m_last_status = status; + pStream->next_in += (mz_uint)in_bytes; + pStream->avail_in -= (mz_uint)in_bytes; + pStream->total_in += (mz_uint)in_bytes; + pStream->adler = tinfl_get_adler32(&pState->m_decomp); + pState->m_dict_avail = (mz_uint)out_bytes; + n = MZ_MIN(pState->m_dict_avail, pStream->avail_out); + memcpy(pStream->next_out, pState->m_dict + pState->m_dict_ofs, n); + pStream->next_out += n; + pStream->avail_out -= n; + pStream->total_out += n; + pState->m_dict_avail -= n; + pState->m_dict_ofs = (pState->m_dict_ofs + n) & (TINFL_LZ_DICT_SIZE - 1); + if (status < 0) { + return MZ_DATA_ERROR; // Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well). + } else if ((status == TINFL_STATUS_NEEDS_MORE_INPUT) && (!orig_avail_in)) { + return MZ_BUF_ERROR; // Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH. + } else if (flush == MZ_FINISH) { + // The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH. + if (status == TINFL_STATUS_DONE) { + return pState->m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END; + } + // status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong. + else if (!pStream->avail_out) { + return MZ_BUF_ERROR; + } + } else if ((status == TINFL_STATUS_DONE) || (!pStream->avail_in) || (!pStream->avail_out) || (pState->m_dict_avail)) { + break; + } + } + return ((status == TINFL_STATUS_DONE) && (!pState->m_dict_avail)) ? MZ_STREAM_END : MZ_OK; + } + + int mz_inflateEnd(mz_streamp pStream) { + if (!pStream) { + return MZ_STREAM_ERROR; + } + if (pStream->state) { + pStream->zfree(pStream->opaque, pStream->state); + pStream->state = NULL; + } + return MZ_OK; + } + + int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len) { + mz_stream stream; + int status; + memset(&stream, 0, sizeof(stream)); + // In case mz_ulong is 64-bits (argh I hate longs). + if ((source_len | *pDest_len) > 0xFFFFFFFFU) { + return MZ_PARAM_ERROR; + } + stream.next_in = pSource; + stream.avail_in = (mz_uint32)source_len; + stream.next_out = pDest; + stream.avail_out = (mz_uint32) * pDest_len; + status = mz_inflateInit(&stream); + if (status != MZ_OK) { + return status; + } + status = mz_inflate(&stream, MZ_FINISH); + if (status != MZ_STREAM_END) { + mz_inflateEnd(&stream); + return ((status == MZ_BUF_ERROR) && (!stream.avail_in)) ? MZ_DATA_ERROR : status; + } + *pDest_len = stream.total_out; + return mz_inflateEnd(&stream); + } + + const char *mz_error(int err) { + static struct { + int m_err; + const char *m_pDesc; + } s_error_descs[] = { + { MZ_OK, "" }, { MZ_STREAM_END, "stream end" }, { MZ_NEED_DICT, "need dictionary" }, { MZ_ERRNO, "file error" }, { MZ_STREAM_ERROR, "stream error" }, + { MZ_DATA_ERROR, "data error" }, { MZ_MEM_ERROR, "out of memory" }, { MZ_BUF_ERROR, "buf error" }, { MZ_VERSION_ERROR, "version error" }, { MZ_PARAM_ERROR, "parameter error" } + }; + mz_uint i; + for (i = 0; i < sizeof(s_error_descs) / sizeof(s_error_descs[0]); ++i) if (s_error_descs[i].m_err == err) { + return s_error_descs[i].m_pDesc; + } + return NULL; + } + +#endif //MINIZ_NO_ZLIB_APIS + + // ------------------- Low-level Decompression (completely independent from all compression API's) + +#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l) +#define TINFL_MEMSET(p, c, l) memset(p, c, l) + +#define TINFL_CR_BEGIN switch(r->m_state) { case 0: +#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END +#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END +#define TINFL_CR_FINISH } + + // TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never + // reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario. +#define TINFL_GET_BYTE(state_index, c) do { \ +if (pIn_buf_cur >= pIn_buf_end) { \ +for ( ; ; ) { \ +if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \ +TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \ +if (pIn_buf_cur < pIn_buf_end) { \ +c = *pIn_buf_cur++; \ +break; \ +} \ +} else { \ +c = 0; \ +break; \ +} \ +} \ +} else c = *pIn_buf_cur++; } MZ_MACRO_END + +#define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n)) +#define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END +#define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END + + // TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2. + // It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a + // Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the + // bit buffer contains >=15 bits (deflate's max. Huffman code size). +#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \ +do { \ +temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \ +if (temp >= 0) { \ +code_len = temp >> 9; \ +if ((code_len) && (num_bits >= code_len)) \ +break; \ +} else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \ +code_len = TINFL_FAST_LOOKUP_BITS; \ +do { \ +temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \ +} while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \ +} TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \ +} while (num_bits < 15); + + // TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read + // beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully + // decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32. + // The slow path is only executed at the very end of the input buffer. +#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \ +int temp; mz_uint code_len, c; \ +if (num_bits < 15) { \ +if ((pIn_buf_end - pIn_buf_cur) < 2) { \ +TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \ +} else { \ +bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \ +} \ +} \ +if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \ +code_len = temp >> 9, temp &= 511; \ +else { \ +code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \ +} sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END + + tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags) { + static const int s_length_base[31] = { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 }; + static const int s_length_extra[31] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0 }; + static const int s_dist_base[32] = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0}; + static const int s_dist_extra[32] = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; + static const mz_uint8 s_length_dezigzag[19] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; + static const int s_min_table_sizes[3] = { 257, 1, 4 }; + tinfl_status status = TINFL_STATUS_FAILED; + mz_uint32 num_bits, dist, counter, num_extra; + tinfl_bit_buf_t bit_buf; + const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size; + mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size; + size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t) - 1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start; + // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter). + if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { + *pIn_buf_size = *pOut_buf_size = 0; + return TINFL_STATUS_BAD_PARAM; + } + num_bits = r->m_num_bits; + bit_buf = r->m_bit_buf; + dist = r->m_dist; + counter = r->m_counter; + num_extra = r->m_num_extra; + dist_from_out_buf_start = r->m_dist_from_out_buf_start; + TINFL_CR_BEGIN + bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; + r->m_z_adler32 = r->m_check_adler32 = 1; + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) { + TINFL_GET_BYTE(1, r->m_zhdr0); + TINFL_GET_BYTE(2, r->m_zhdr1); + counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8)); + if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) { + counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4))))); + } + if (counter) { + TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); + } + } + do { + TINFL_GET_BITS(3, r->m_final, 3); + r->m_type = r->m_final >> 1; + if (r->m_type == 0) { + TINFL_SKIP_BITS(5, num_bits & 7); + for (counter = 0; counter < 4; ++counter) { + if (num_bits) { + TINFL_GET_BITS(6, r->m_raw_header[counter], 8); + } else { + TINFL_GET_BYTE(7, r->m_raw_header[counter]); + } + } + if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { + TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); + } + while ((counter) && (num_bits)) { + TINFL_GET_BITS(51, dist, 8); + while (pOut_buf_cur >= pOut_buf_end) { + TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); + } + *pOut_buf_cur++ = (mz_uint8)dist; + counter--; + } + while (counter) { + size_t n; + while (pOut_buf_cur >= pOut_buf_end) { + TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); + } + while (pIn_buf_cur >= pIn_buf_end) { + if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { + TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT); + } else { + TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED); + } + } + n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter); + TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); + pIn_buf_cur += n; + pOut_buf_cur += n; + counter -= (mz_uint)n; + } + } else if (r->m_type == 3) { + TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED); + } else { + if (r->m_type == 1) { + mz_uint8 *p = r->m_tables[0].m_code_size; + mz_uint i; + r->m_table_sizes[0] = 288; + r->m_table_sizes[1] = 32; + TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32); + for ( i = 0; i <= 143; ++i) { + *p++ = 8; + } + for ( ; i <= 255; ++i) { + *p++ = 9; + } + for ( ; i <= 279; ++i) { + *p++ = 7; + } + for ( ; i <= 287; ++i) { + *p++ = 8; + } + } else { + for (counter = 0; counter < 3; counter++) { + TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); + r->m_table_sizes[counter] += s_min_table_sizes[counter]; + } + MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); + for (counter = 0; counter < r->m_table_sizes[2]; counter++) { + mz_uint s; + TINFL_GET_BITS(14, s, 3); + r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; + } + r->m_table_sizes[2] = 19; + } + for ( ; (int)r->m_type >= 0; r->m_type--) { + int tree_next, tree_cur; + tinfl_huff_table *pTable; + mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; + pTable = &r->m_tables[r->m_type]; + MZ_CLEAR_OBJ(total_syms); + MZ_CLEAR_OBJ(pTable->m_look_up); + MZ_CLEAR_OBJ(pTable->m_tree); + for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) { + total_syms[pTable->m_code_size[i]]++; + } + used_syms = 0, total = 0; + next_code[0] = next_code[1] = 0; + for (i = 1; i <= 15; ++i) { + used_syms += total_syms[i]; + next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); + } + if ((65536 != total) && (used_syms > 1)) { + TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED); + } + for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index) { + mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; + if (!code_size) { + continue; + } + cur_code = next_code[code_size]++; + for (l = code_size; l > 0; l--, cur_code >>= 1) { + rev_code = (rev_code << 1) | (cur_code & 1); + } + if (code_size <= TINFL_FAST_LOOKUP_BITS) { + mz_int16 k = (mz_int16)((code_size << 9) | sym_index); + while (rev_code < TINFL_FAST_LOOKUP_SIZE) { + pTable->m_look_up[rev_code] = k; + rev_code += (1 << code_size); + } + continue; + } + if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { + pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; + tree_cur = tree_next; + tree_next -= 2; + } + rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1); + for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--) { + tree_cur -= ((rev_code >>= 1) & 1); + if (!pTable->m_tree[-tree_cur - 1]) { + pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; + tree_cur = tree_next; + tree_next -= 2; + } else { + tree_cur = pTable->m_tree[-tree_cur - 1]; + } + } + tree_cur -= ((rev_code >>= 1) & 1); + pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index; + } + if (r->m_type == 2) { + for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); ) { + mz_uint s; + TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); + if (dist < 16) { + r->m_len_codes[counter++] = (mz_uint8)dist; + continue; + } + if ((dist == 16) && (!counter)) { + TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED); + } + num_extra = "\02\03\07"[dist - 16]; + TINFL_GET_BITS(18, s, num_extra); + s += "\03\03\013"[dist - 16]; + TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); + counter += s; + } + if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter) { + TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED); + } + TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); + TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]); + } + } + for ( ; ; ) { + mz_uint8 *pSrc; + for ( ; ; ) { + if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2)) { + TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]); + if (counter >= 256) { + break; + } + while (pOut_buf_cur >= pOut_buf_end) { + TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); + } + *pOut_buf_cur++ = (mz_uint8)counter; + } else { + int sym2; + mz_uint code_len; +#if TINFL_USE_64BIT_BITBUF + if (num_bits < 30) { + bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); + pIn_buf_cur += 4; + num_bits += 32; + } +#else + if (num_bits < 15) { + bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); + pIn_buf_cur += 2; + num_bits += 16; + } +#endif + if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) { + code_len = sym2 >> 9; + } else { + code_len = TINFL_FAST_LOOKUP_BITS; + do { + sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; + } while (sym2 < 0); + } + counter = sym2; + bit_buf >>= code_len; + num_bits -= code_len; + if (counter & 256) { + break; + } +#if !TINFL_USE_64BIT_BITBUF + if (num_bits < 15) { + bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); + pIn_buf_cur += 2; + num_bits += 16; + } +#endif + if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) { + code_len = sym2 >> 9; + } else { + code_len = TINFL_FAST_LOOKUP_BITS; + do { + sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; + } while (sym2 < 0); + } + bit_buf >>= code_len; + num_bits -= code_len; + pOut_buf_cur[0] = (mz_uint8)counter; + if (sym2 & 256) { + pOut_buf_cur++; + counter = sym2; + break; + } + pOut_buf_cur[1] = (mz_uint8)sym2; + pOut_buf_cur += 2; + } + } + if ((counter &= 511) == 256) { + break; + } + num_extra = s_length_extra[counter - 257]; + counter = s_length_base[counter - 257]; + if (num_extra) { + mz_uint extra_bits; + TINFL_GET_BITS(25, extra_bits, num_extra); + counter += extra_bits; + } + TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]); + num_extra = s_dist_extra[dist]; + dist = s_dist_base[dist]; + if (num_extra) { + mz_uint extra_bits; + TINFL_GET_BITS(27, extra_bits, num_extra); + dist += extra_bits; + } + dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start; + if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) { + TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED); + } + pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask); + if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end) { + while (counter--) { + while (pOut_buf_cur >= pOut_buf_end) { + TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); + } + *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask]; + } + continue; + } +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES + else if ((counter >= 9) && (counter <= dist)) { + const mz_uint8 *pSrc_end = pSrc + (counter & ~7); + do { + ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0]; + ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1]; + pOut_buf_cur += 8; + } while ((pSrc += 8) < pSrc_end); + if ((counter &= 7) < 3) { + if (counter) { + pOut_buf_cur[0] = pSrc[0]; + if (counter > 1) { + pOut_buf_cur[1] = pSrc[1]; + } + pOut_buf_cur += counter; + } + continue; + } + } +#endif + do { + pOut_buf_cur[0] = pSrc[0]; + pOut_buf_cur[1] = pSrc[1]; + pOut_buf_cur[2] = pSrc[2]; + pOut_buf_cur += 3; + pSrc += 3; + } while ((int)(counter -= 3) > 2); + if ((int)counter > 0) { + pOut_buf_cur[0] = pSrc[0]; + if ((int)counter > 1) { + pOut_buf_cur[1] = pSrc[1]; + } + pOut_buf_cur += counter; + } + } + } + } while (!(r->m_final & 1)); + if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) { + TINFL_SKIP_BITS(32, num_bits & 7); + for (counter = 0; counter < 4; ++counter) { + mz_uint s; + if (num_bits) { + TINFL_GET_BITS(41, s, 8); + } else { + TINFL_GET_BYTE(42, s); + } + r->m_z_adler32 = (r->m_z_adler32 << 8) | s; + } + } + TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE); + TINFL_CR_FINISH + common_exit: + r->m_num_bits = num_bits; + r->m_bit_buf = bit_buf; + r->m_dist = dist; + r->m_counter = counter; + r->m_num_extra = num_extra; + r->m_dist_from_out_buf_start = dist_from_out_buf_start; + *pIn_buf_size = pIn_buf_cur - pIn_buf_next; + *pOut_buf_size = pOut_buf_cur - pOut_buf_next; + if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0)) { + const mz_uint8 *ptr = pOut_buf_next; + size_t buf_len = *pOut_buf_size; + mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; + size_t block_len = buf_len % 5552; + while (buf_len) { + for (i = 0; i + 7 < block_len; i += 8, ptr += 8) { + s1 += ptr[0], s2 += s1; + s1 += ptr[1], s2 += s1; + s1 += ptr[2], s2 += s1; + s1 += ptr[3], s2 += s1; + s1 += ptr[4], s2 += s1; + s1 += ptr[5], s2 += s1; + s1 += ptr[6], s2 += s1; + s1 += ptr[7], s2 += s1; + } + for ( ; i < block_len; ++i) { + s1 += *ptr++, s2 += s1; + } + s1 %= 65521U, s2 %= 65521U; + buf_len -= block_len; + block_len = 5552; + } + r->m_check_adler32 = (s2 << 16) + s1; + if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) { + status = TINFL_STATUS_ADLER32_MISMATCH; + } + } + return status; + } + + // Higher level helper functions. + void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) { + tinfl_decompressor decomp; + void *pBuf = NULL, *pNew_buf; + size_t src_buf_ofs = 0, out_buf_capacity = 0; + *pOut_len = 0; + tinfl_init(&decomp); + for ( ; ; ) { + size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity; + tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL, &dst_buf_size, + (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) { + MZ_FREE(pBuf); + *pOut_len = 0; + return NULL; + } + src_buf_ofs += src_buf_size; + *pOut_len += dst_buf_size; + if (status == TINFL_STATUS_DONE) { + break; + } + new_out_buf_capacity = out_buf_capacity * 2; + if (new_out_buf_capacity < 128) { + new_out_buf_capacity = 128; + } + pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity); + if (!pNew_buf) { + MZ_FREE(pBuf); + *pOut_len = 0; + return NULL; + } + pBuf = pNew_buf; + out_buf_capacity = new_out_buf_capacity; + } + return pBuf; + } + + size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) { + tinfl_decompressor decomp; + tinfl_status status; + tinfl_init(&decomp); + status = tinfl_decompress(&decomp, (const mz_uint8 *)pSrc_buf, &src_buf_len, (mz_uint8 *)pOut_buf, (mz_uint8 *)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF); + return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len; + } + + int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) { + int result = 0; + tinfl_decompressor decomp; + mz_uint8 *pDict = (mz_uint8 *)MZ_MALLOC(TINFL_LZ_DICT_SIZE); + size_t in_buf_ofs = 0, dict_ofs = 0; + if (!pDict) { + return TINFL_STATUS_FAILED; + } + tinfl_init(&decomp); + for ( ; ; ) { + size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs; + tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8 *)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size, + (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))); + in_buf_ofs += in_buf_size; + if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user))) { + break; + } + if (status != TINFL_STATUS_HAS_MORE_OUTPUT) { + result = (status == TINFL_STATUS_DONE); + break; + } + dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1); + } + MZ_FREE(pDict); + *pIn_buf_size = in_buf_ofs; + return result; + } + + // ------------------- Low-level Compression (independent from all decompression API's) + + // Purposely making these tables static for faster init and thread safety. + static const mz_uint16 s_tdefl_len_sym[256] = { + 257, 258, 259, 260, 261, 262, 263, 264, 265, 265, 266, 266, 267, 267, 268, 268, 269, 269, 269, 269, 270, 270, 270, 270, 271, 271, 271, 271, 272, 272, 272, 272, + 273, 273, 273, 273, 273, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274, 275, 275, 275, 275, 275, 275, 275, 275, 276, 276, 276, 276, 276, 276, 276, 276, + 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, 278, + 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 279, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, 280, + 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, 281, + 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, + 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 284, 285 + }; + + static const mz_uint8 s_tdefl_len_extra[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 0 + }; + + static const mz_uint8 s_tdefl_small_dist_sym[512] = { + 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17 + }; + + static const mz_uint8 s_tdefl_small_dist_extra[512] = { + 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7 + }; + + static const mz_uint8 s_tdefl_large_dist_sym[128] = { + 0, 0, 18, 19, 20, 20, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29 + }; + + static const mz_uint8 s_tdefl_large_dist_extra[128] = { + 0, 0, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13 + }; + + // Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted values. + typedef struct { + mz_uint16 m_key, m_sym_index; + } tdefl_sym_freq; + static tdefl_sym_freq *tdefl_radix_sort_syms(mz_uint num_syms, tdefl_sym_freq *pSyms0, tdefl_sym_freq *pSyms1) { + mz_uint32 total_passes = 2, pass_shift, pass, i, hist[256 * 2]; + tdefl_sym_freq *pCur_syms = pSyms0, *pNew_syms = pSyms1; + MZ_CLEAR_OBJ(hist); + for (i = 0; i < num_syms; i++) { + mz_uint freq = pSyms0[i].m_key; + hist[freq & 0xFF]++; + hist[256 + ((freq >> 8) & 0xFF)]++; + } + while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) { + total_passes--; + } + for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8) { + const mz_uint32 *pHist = &hist[pass << 8]; + mz_uint offsets[256], cur_ofs = 0; + for (i = 0; i < 256; i++) { + offsets[i] = cur_ofs; + cur_ofs += pHist[i]; + } + for (i = 0; i < num_syms; i++) { + pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i]; + } + { + tdefl_sym_freq *t = pCur_syms; + pCur_syms = pNew_syms; + pNew_syms = t; + } + } + return pCur_syms; + } + + // tdefl_calculate_minimum_redundancy() originally written by: Alistair Moffat, alistair@cs.mu.oz.au, Jyrki Katajainen, jyrki@diku.dk, November 1996. + static void tdefl_calculate_minimum_redundancy(tdefl_sym_freq *A, int n) { + int root, leaf, next, avbl, used, dpth; + if (n == 0) { + return; + } else if (n == 1) { + A[0].m_key = 1; + return; + } + A[0].m_key += A[1].m_key; + root = 0; + leaf = 2; + for (next = 1; next < n - 1; next++) { + if (leaf >= n || A[root].m_key < A[leaf].m_key) { + A[next].m_key = A[root].m_key; + A[root++].m_key = (mz_uint16)next; + } else { + A[next].m_key = A[leaf++].m_key; + } + if (leaf >= n || (root < next && A[root].m_key < A[leaf].m_key)) { + A[next].m_key = (mz_uint16)(A[next].m_key + A[root].m_key); + A[root++].m_key = (mz_uint16)next; + } else { + A[next].m_key = (mz_uint16)(A[next].m_key + A[leaf++].m_key); + } + } + A[n - 2].m_key = 0; + for (next = n - 3; next >= 0; next--) { + A[next].m_key = A[A[next].m_key].m_key + 1; + } + avbl = 1; + used = dpth = 0; + root = n - 2; + next = n - 1; + while (avbl > 0) { + while (root >= 0 && (int)A[root].m_key == dpth) { + used++; + root--; + } + while (avbl > used) { + A[next--].m_key = (mz_uint16)(dpth); + avbl--; + } + avbl = 2 * used; + dpth++; + used = 0; + } + } + + // Limits canonical Huffman code table's max code size. + enum { TDEFL_MAX_SUPPORTED_HUFF_CODESIZE = 32 }; + static void tdefl_huffman_enforce_max_code_size(int *pNum_codes, int code_list_len, int max_code_size) { + int i; + mz_uint32 total = 0; + if (code_list_len <= 1) { + return; + } + for (i = max_code_size + 1; i <= TDEFL_MAX_SUPPORTED_HUFF_CODESIZE; i++) { + pNum_codes[max_code_size] += pNum_codes[i]; + } + for (i = max_code_size; i > 0; i--) { + total += (((mz_uint32)pNum_codes[i]) << (max_code_size - i)); + } + while (total != (1UL << max_code_size)) { + pNum_codes[max_code_size]--; + for (i = max_code_size - 1; i > 0; i--) if (pNum_codes[i]) { + pNum_codes[i]--; + pNum_codes[i + 1] += 2; + break; + } + total--; + } + } + + static void tdefl_optimize_huffman_table(tdefl_compressor *d, int table_num, int table_len, int code_size_limit, int static_table) { + int i, j, l, num_codes[1 + TDEFL_MAX_SUPPORTED_HUFF_CODESIZE]; + mz_uint next_code[TDEFL_MAX_SUPPORTED_HUFF_CODESIZE + 1]; + MZ_CLEAR_OBJ(num_codes); + if (static_table) { + for (i = 0; i < table_len; i++) { + num_codes[d->m_huff_code_sizes[table_num][i]]++; + } + } else { + tdefl_sym_freq syms0[TDEFL_MAX_HUFF_SYMBOLS], syms1[TDEFL_MAX_HUFF_SYMBOLS], *pSyms; + int num_used_syms = 0; + const mz_uint16 *pSym_count = &d->m_huff_count[table_num][0]; + for (i = 0; i < table_len; i++) if (pSym_count[i]) { + syms0[num_used_syms].m_key = (mz_uint16)pSym_count[i]; + syms0[num_used_syms++].m_sym_index = (mz_uint16)i; + } + pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); + tdefl_calculate_minimum_redundancy(pSyms, num_used_syms); + for (i = 0; i < num_used_syms; i++) { + num_codes[pSyms[i].m_key]++; + } + tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit); + MZ_CLEAR_OBJ(d->m_huff_code_sizes[table_num]); + MZ_CLEAR_OBJ(d->m_huff_codes[table_num]); + for (i = 1, j = num_used_syms; i <= code_size_limit; i++) + for (l = num_codes[i]; l > 0; l--) { + d->m_huff_code_sizes[table_num][pSyms[--j].m_sym_index] = (mz_uint8)(i); + } + } + next_code[1] = 0; + for (j = 0, i = 2; i <= code_size_limit; i++) { + next_code[i] = j = ((j + num_codes[i - 1]) << 1); + } + for (i = 0; i < table_len; i++) { + mz_uint rev_code = 0, code, code_size; + if ((code_size = d->m_huff_code_sizes[table_num][i]) == 0) { + continue; + } + code = next_code[code_size]++; + for (l = code_size; l > 0; l--, code >>= 1) { + rev_code = (rev_code << 1) | (code & 1); + } + d->m_huff_codes[table_num][i] = (mz_uint16)rev_code; + } + } + +#define TDEFL_PUT_BITS(b, l) do { \ +mz_uint bits = b; mz_uint len = l; MZ_ASSERT(bits <= ((1U << len) - 1U)); \ +d->m_bit_buffer |= (bits << d->m_bits_in); d->m_bits_in += len; \ +while (d->m_bits_in >= 8) { \ +if (d->m_pOutput_buf < d->m_pOutput_buf_end) \ +*d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer); \ +d->m_bit_buffer >>= 8; \ +d->m_bits_in -= 8; \ +} \ +} MZ_MACRO_END + +#define TDEFL_RLE_PREV_CODE_SIZE() { if (rle_repeat_count) { \ +if (rle_repeat_count < 3) { \ +d->m_huff_count[2][prev_code_size] = (mz_uint16)(d->m_huff_count[2][prev_code_size] + rle_repeat_count); \ +while (rle_repeat_count--) packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \ +} else { \ +d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); packed_code_sizes[num_packed_code_sizes++] = 16; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_repeat_count - 3); \ +} rle_repeat_count = 0; } } + +#define TDEFL_RLE_ZERO_CODE_SIZE() { if (rle_z_count) { \ +if (rle_z_count < 3) { \ +d->m_huff_count[2][0] = (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \ +} else if (rle_z_count <= 10) { \ +d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); packed_code_sizes[num_packed_code_sizes++] = 17; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 3); \ +} else { \ +d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); packed_code_sizes[num_packed_code_sizes++] = 18; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 11); \ +} rle_z_count = 0; } } + + static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; + + static void tdefl_start_dynamic_block(tdefl_compressor *d) { + int num_lit_codes, num_dist_codes, num_bit_lengths; + mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, rle_repeat_count, packed_code_sizes_index; + mz_uint8 code_sizes_to_pack[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], packed_code_sizes[TDEFL_MAX_HUFF_SYMBOLS_0 + TDEFL_MAX_HUFF_SYMBOLS_1], prev_code_size = 0xFF; + d->m_huff_count[0][256] = 1; + tdefl_optimize_huffman_table(d, 0, TDEFL_MAX_HUFF_SYMBOLS_0, 15, MZ_FALSE); + tdefl_optimize_huffman_table(d, 1, TDEFL_MAX_HUFF_SYMBOLS_1, 15, MZ_FALSE); + for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--) if (d->m_huff_code_sizes[0][num_lit_codes - 1]) { + break; + } + for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--) if (d->m_huff_code_sizes[1][num_dist_codes - 1]) { + break; + } + memcpy(code_sizes_to_pack, &d->m_huff_code_sizes[0][0], num_lit_codes); + memcpy(code_sizes_to_pack + num_lit_codes, &d->m_huff_code_sizes[1][0], num_dist_codes); + total_code_sizes_to_pack = num_lit_codes + num_dist_codes; + num_packed_code_sizes = 0; + rle_z_count = 0; + rle_repeat_count = 0; + memset(&d->m_huff_count[2][0], 0, sizeof(d->m_huff_count[2][0]) * TDEFL_MAX_HUFF_SYMBOLS_2); + for (i = 0; i < total_code_sizes_to_pack; i++) { + mz_uint8 code_size = code_sizes_to_pack[i]; + if (!code_size) { + TDEFL_RLE_PREV_CODE_SIZE(); + if (++rle_z_count == 138) { + TDEFL_RLE_ZERO_CODE_SIZE(); + } + } else { + TDEFL_RLE_ZERO_CODE_SIZE(); + if (code_size != prev_code_size) { + TDEFL_RLE_PREV_CODE_SIZE(); + d->m_huff_count[2][code_size] = (mz_uint16)(d->m_huff_count[2][code_size] + 1); + packed_code_sizes[num_packed_code_sizes++] = code_size; + } else if (++rle_repeat_count == 6) { + TDEFL_RLE_PREV_CODE_SIZE(); + } + } + prev_code_size = code_size; + } + if (rle_repeat_count) { + TDEFL_RLE_PREV_CODE_SIZE(); + } else { + TDEFL_RLE_ZERO_CODE_SIZE(); + } + tdefl_optimize_huffman_table(d, 2, TDEFL_MAX_HUFF_SYMBOLS_2, 7, MZ_FALSE); + TDEFL_PUT_BITS(2, 2); + TDEFL_PUT_BITS(num_lit_codes - 257, 5); + TDEFL_PUT_BITS(num_dist_codes - 1, 5); + for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--) if (d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]]) { + break; + } + num_bit_lengths = MZ_MAX(4, (num_bit_lengths + 1)); + TDEFL_PUT_BITS(num_bit_lengths - 4, 4); + for (i = 0; (int)i < num_bit_lengths; i++) { + TDEFL_PUT_BITS(d->m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[i]], 3); + } + for (packed_code_sizes_index = 0; packed_code_sizes_index < num_packed_code_sizes; ) { + mz_uint code = packed_code_sizes[packed_code_sizes_index++]; + MZ_ASSERT(code < TDEFL_MAX_HUFF_SYMBOLS_2); + TDEFL_PUT_BITS(d->m_huff_codes[2][code], d->m_huff_code_sizes[2][code]); + if (code >= 16) { + TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++], "\02\03\07"[code - 16]); + } + } + } + + static void tdefl_start_static_block(tdefl_compressor *d) { + mz_uint i; + mz_uint8 *p = &d->m_huff_code_sizes[0][0]; + for (i = 0; i <= 143; ++i) { + *p++ = 8; + } + for ( ; i <= 255; ++i) { + *p++ = 9; + } + for ( ; i <= 279; ++i) { + *p++ = 7; + } + for ( ; i <= 287; ++i) { + *p++ = 8; + } + memset(d->m_huff_code_sizes[1], 5, 32); + tdefl_optimize_huffman_table(d, 0, 288, 15, MZ_TRUE); + tdefl_optimize_huffman_table(d, 1, 32, 15, MZ_TRUE); + TDEFL_PUT_BITS(1, 2); + } + + static const mz_uint mz_bitmasks[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF }; + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS + static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) { + mz_uint flags; + mz_uint8 *pLZ_codes; + mz_uint8 *pOutput_buf = d->m_pOutput_buf; + mz_uint8 *pLZ_code_buf_end = d->m_pLZ_code_buf; + mz_uint64 bit_buffer = d->m_bit_buffer; + mz_uint bits_in = d->m_bits_in; +#define TDEFL_PUT_BITS_FAST(b, l) { bit_buffer |= (((mz_uint64)(b)) << bits_in); bits_in += (l); } + flags = 1; + for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; flags >>= 1) { + if (flags == 1) { + flags = *pLZ_codes++ | 0x100; + } + if (flags & 1) { + mz_uint s0, s1, n0, n1, sym, num_extra_bits; + mz_uint match_len = pLZ_codes[0], match_dist = *(const mz_uint16 *)(pLZ_codes + 1); + pLZ_codes += 3; + MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); + // This sequence coaxes MSVC into using cmov's vs. jmp's. + s0 = s_tdefl_small_dist_sym[match_dist & 511]; + n0 = s_tdefl_small_dist_extra[match_dist & 511]; + s1 = s_tdefl_large_dist_sym[match_dist >> 8]; + n1 = s_tdefl_large_dist_extra[match_dist >> 8]; + sym = (match_dist < 512) ? s0 : s1; + num_extra_bits = (match_dist < 512) ? n0 : n1; + MZ_ASSERT(d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); + } else { + mz_uint lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) { + flags >>= 1; + lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end)) { + flags >>= 1; + lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS_FAST(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + } + } + } + if (pOutput_buf >= d->m_pOutput_buf_end) { + return MZ_FALSE; + } + *(mz_uint64 *)pOutput_buf = bit_buffer; + pOutput_buf += (bits_in >> 3); + bit_buffer >>= (bits_in & ~7); + bits_in &= 7; + } +#undef TDEFL_PUT_BITS_FAST + d->m_pOutput_buf = pOutput_buf; + d->m_bits_in = 0; + d->m_bit_buffer = 0; + while (bits_in) { + mz_uint32 n = MZ_MIN(bits_in, 16); + TDEFL_PUT_BITS((mz_uint)bit_buffer & mz_bitmasks[n], n); + bit_buffer >>= n; + bits_in -= n; + } + TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); + return (d->m_pOutput_buf < d->m_pOutput_buf_end); + } +#else + static mz_bool tdefl_compress_lz_codes(tdefl_compressor *d) { + mz_uint flags; + mz_uint8 *pLZ_codes; + flags = 1; + for (pLZ_codes = d->m_lz_code_buf; pLZ_codes < d->m_pLZ_code_buf; flags >>= 1) { + if (flags == 1) { + flags = *pLZ_codes++ | 0x100; + } + if (flags & 1) { + mz_uint sym, num_extra_bits; + mz_uint match_len = pLZ_codes[0], match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); + pLZ_codes += 3; + MZ_ASSERT(d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS(d->m_huff_codes[0][s_tdefl_len_sym[match_len]], d->m_huff_code_sizes[0][s_tdefl_len_sym[match_len]]); + TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]); + if (match_dist < 512) { + sym = s_tdefl_small_dist_sym[match_dist]; + num_extra_bits = s_tdefl_small_dist_extra[match_dist]; + } else { + sym = s_tdefl_large_dist_sym[match_dist >> 8]; + num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8]; + } + MZ_ASSERT(d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS(d->m_huff_codes[1][sym], d->m_huff_code_sizes[1][sym]); + TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits); + } else { + mz_uint lit = *pLZ_codes++; + MZ_ASSERT(d->m_huff_code_sizes[0][lit]); + TDEFL_PUT_BITS(d->m_huff_codes[0][lit], d->m_huff_code_sizes[0][lit]); + } + } + TDEFL_PUT_BITS(d->m_huff_codes[0][256], d->m_huff_code_sizes[0][256]); + return (d->m_pOutput_buf < d->m_pOutput_buf_end); + } +#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS + + static mz_bool tdefl_compress_block(tdefl_compressor *d, mz_bool static_block) { + if (static_block) { + tdefl_start_static_block(d); + } else { + tdefl_start_dynamic_block(d); + } + return tdefl_compress_lz_codes(d); + } + + static int tdefl_flush_block(tdefl_compressor *d, int flush) { + mz_uint saved_bit_buf, saved_bits_in; + mz_uint8 *pSaved_output_buf; + mz_bool comp_block_succeeded = MZ_FALSE; + int n, use_raw_block = ((d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS) != 0) && (d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size; + mz_uint8 *pOutput_buf_start = ((d->m_pPut_buf_func == NULL) && ((*d->m_pOut_buf_size - d->m_out_buf_ofs) >= TDEFL_OUT_BUF_SIZE)) ? ((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs) : d->m_output_buf; + d->m_pOutput_buf = pOutput_buf_start; + d->m_pOutput_buf_end = d->m_pOutput_buf + TDEFL_OUT_BUF_SIZE - 16; + MZ_ASSERT(!d->m_output_flush_remaining); + d->m_output_flush_ofs = 0; + d->m_output_flush_remaining = 0; + *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> d->m_num_flags_left); + d->m_pLZ_code_buf -= (d->m_num_flags_left == 8); + if ((d->m_flags & TDEFL_WRITE_ZLIB_HEADER) && (!d->m_block_index)) { + TDEFL_PUT_BITS(0x78, 8); + TDEFL_PUT_BITS(0x01, 8); + } + TDEFL_PUT_BITS(flush == TDEFL_FINISH, 1); + pSaved_output_buf = d->m_pOutput_buf; + saved_bit_buf = d->m_bit_buffer; + saved_bits_in = d->m_bits_in; + if (!use_raw_block) { + comp_block_succeeded = tdefl_compress_block(d, (d->m_flags & TDEFL_FORCE_ALL_STATIC_BLOCKS) || (d->m_total_lz_bytes < 48)); + } + // If the block gets expanded, forget the current contents of the output buffer and send a raw block instead. + if ( ((use_raw_block) || ((d->m_total_lz_bytes) && ((d->m_pOutput_buf - pSaved_output_buf + 1U) >= d->m_total_lz_bytes))) && + ((d->m_lookahead_pos - d->m_lz_code_buf_dict_pos) <= d->m_dict_size) ) { + mz_uint i; + d->m_pOutput_buf = pSaved_output_buf; + d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; + TDEFL_PUT_BITS(0, 2); + if (d->m_bits_in) { + TDEFL_PUT_BITS(0, 8 - d->m_bits_in); + } + for (i = 2; i; --i, d->m_total_lz_bytes ^= 0xFFFF) { + TDEFL_PUT_BITS(d->m_total_lz_bytes & 0xFFFF, 16); + } + for (i = 0; i < d->m_total_lz_bytes; ++i) { + TDEFL_PUT_BITS(d->m_dict[(d->m_lz_code_buf_dict_pos + i) & TDEFL_LZ_DICT_SIZE_MASK], 8); + } + } + // Check for the extremely unlikely (if not impossible) case of the compressed block not fitting into the output buffer when using dynamic codes. + else if (!comp_block_succeeded) { + d->m_pOutput_buf = pSaved_output_buf; + d->m_bit_buffer = saved_bit_buf, d->m_bits_in = saved_bits_in; + tdefl_compress_block(d, MZ_TRUE); + } + if (flush) { + if (flush == TDEFL_FINISH) { + if (d->m_bits_in) { + TDEFL_PUT_BITS(0, 8 - d->m_bits_in); + } + if (d->m_flags & TDEFL_WRITE_ZLIB_HEADER) { + mz_uint i, a = d->m_adler32; + for (i = 0; i < 4; i++) { + TDEFL_PUT_BITS((a >> 24) & 0xFF, 8); + a <<= 8; + } + } + } else { + mz_uint i, z = 0; + TDEFL_PUT_BITS(0, 3); + if (d->m_bits_in) { + TDEFL_PUT_BITS(0, 8 - d->m_bits_in); + } + for (i = 2; i; --i, z ^= 0xFFFF) { + TDEFL_PUT_BITS(z & 0xFFFF, 16); + } + } + } + MZ_ASSERT(d->m_pOutput_buf < d->m_pOutput_buf_end); + memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); + memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); + d->m_pLZ_code_buf = d->m_lz_code_buf + 1; + d->m_pLZ_flags = d->m_lz_code_buf; + d->m_num_flags_left = 8; + d->m_lz_code_buf_dict_pos += d->m_total_lz_bytes; + d->m_total_lz_bytes = 0; + d->m_block_index++; + if ((n = (int)(d->m_pOutput_buf - pOutput_buf_start)) != 0) { + if (d->m_pPut_buf_func) { + *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; + if (!(*d->m_pPut_buf_func)(d->m_output_buf, n, d->m_pPut_buf_user)) { + return (d->m_prev_return_status = TDEFL_STATUS_PUT_BUF_FAILED); + } + } else if (pOutput_buf_start == d->m_output_buf) { + int bytes_to_copy = (int)MZ_MIN((size_t)n, (size_t)(*d->m_pOut_buf_size - d->m_out_buf_ofs)); + memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf, bytes_to_copy); + d->m_out_buf_ofs += bytes_to_copy; + if ((n -= bytes_to_copy) != 0) { + d->m_output_flush_ofs = bytes_to_copy; + d->m_output_flush_remaining = n; + } + } else { + d->m_out_buf_ofs += n; + } + } + return d->m_output_flush_remaining; + } + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES +#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16*)(p) + static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) { + mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; + mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; + const mz_uint16 *s = (const mz_uint16 *)(d->m_dict + pos), *p, *q; + mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD(s); + MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); + if (max_match_len <= match_len) { + return; + } + for ( ; ; ) { + for ( ; ; ) { + if (--num_probes_left == 0) { + return; + } +#define TDEFL_PROBE \ +next_probe_pos = d->m_next[probe_pos]; \ +if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \ +probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ +if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) break; + TDEFL_PROBE; + TDEFL_PROBE; + TDEFL_PROBE; + } + if (!dist) { + break; + } + q = (const mz_uint16 *)(d->m_dict + probe_pos); + if (TDEFL_READ_UNALIGNED_WORD(q) != s01) { + continue; + } + p = s; + probe_len = 32; + do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) ); + if (!probe_len) { + *pMatch_dist = dist; + *pMatch_len = MZ_MIN(max_match_len, TDEFL_MAX_MATCH_LEN); + break; + } else if ((probe_len = ((mz_uint)(p - s) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q)) > match_len) { + *pMatch_dist = dist; + if ((*pMatch_len = match_len = MZ_MIN(max_match_len, probe_len)) == max_match_len) { + break; + } + c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]); + } + } + } +#else + static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len) { + mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len; + mz_uint num_probes_left = d->m_max_probes[match_len >= 32]; + const mz_uint8 *s = d->m_dict + pos, *p, *q; + mz_uint8 c0 = d->m_dict[pos + match_len], c1 = d->m_dict[pos + match_len - 1]; + MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN); + if (max_match_len <= match_len) { + return; + } + for ( ; ; ) { + for ( ; ; ) { + if (--num_probes_left == 0) { + return; + } +#define TDEFL_PROBE \ +next_probe_pos = d->m_next[probe_pos]; \ +if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \ +probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \ +if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) break; + TDEFL_PROBE; + TDEFL_PROBE; + TDEFL_PROBE; + } + if (!dist) { + break; + } + p = s; + q = d->m_dict + probe_pos; + for (probe_len = 0; probe_len < max_match_len; probe_len++) if (*p++ != *q++) { + break; + } + if (probe_len > match_len) { + *pMatch_dist = dist; + if ((*pMatch_len = match_len = probe_len) == max_match_len) { + return; + } + c0 = d->m_dict[pos + match_len]; + c1 = d->m_dict[pos + match_len - 1]; + } + } + } +#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES + +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + static mz_bool tdefl_compress_fast(tdefl_compressor *d) { + // Faster, minimally featured LZRW1-style match+parse loop with better register utilization. Intended for applications where raw throughput is valued more highly than ratio. + mz_uint lookahead_pos = d->m_lookahead_pos, lookahead_size = d->m_lookahead_size, dict_size = d->m_dict_size, total_lz_bytes = d->m_total_lz_bytes, num_flags_left = d->m_num_flags_left; + mz_uint8 *pLZ_code_buf = d->m_pLZ_code_buf, *pLZ_flags = d->m_pLZ_flags; + mz_uint cur_pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; + while ((d->m_src_buf_left) || ((d->m_flush) && (lookahead_size))) { + const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096; + mz_uint dst_pos = (lookahead_pos + lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; + mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(d->m_src_buf_left, TDEFL_COMP_FAST_LOOKAHEAD_SIZE - lookahead_size); + d->m_src_buf_left -= num_bytes_to_process; + lookahead_size += num_bytes_to_process; + while (num_bytes_to_process) { + mz_uint32 n = MZ_MIN(TDEFL_LZ_DICT_SIZE - dst_pos, num_bytes_to_process); + memcpy(d->m_dict + dst_pos, d->m_pSrc, n); + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) { + memcpy(d->m_dict + TDEFL_LZ_DICT_SIZE + dst_pos, d->m_pSrc, MZ_MIN(n, (TDEFL_MAX_MATCH_LEN - 1) - dst_pos)); + } + d->m_pSrc += n; + dst_pos = (dst_pos + n) & TDEFL_LZ_DICT_SIZE_MASK; + num_bytes_to_process -= n; + } + dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - lookahead_size, dict_size); + if ((!d->m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE)) { + break; + } + while (lookahead_size >= 4) { + mz_uint cur_match_dist, cur_match_len = 1; + mz_uint8 *pCur_dict = d->m_dict + cur_pos; + mz_uint first_trigram = (*(const mz_uint32 *)pCur_dict) & 0xFFFFFF; + mz_uint hash = (first_trigram ^ (first_trigram >> (24 - (TDEFL_LZ_HASH_BITS - 8)))) & TDEFL_LEVEL1_HASH_SIZE_MASK; + mz_uint probe_pos = d->m_hash[hash]; + d->m_hash[hash] = (mz_uint16)lookahead_pos; + if (((cur_match_dist = (mz_uint16)(lookahead_pos - probe_pos)) <= dict_size) && ((*(const mz_uint32 *)(d->m_dict + (probe_pos &= TDEFL_LZ_DICT_SIZE_MASK)) & 0xFFFFFF) == first_trigram)) { + const mz_uint16 *p = (const mz_uint16 *)pCur_dict; + const mz_uint16 *q = (const mz_uint16 *)(d->m_dict + probe_pos); + mz_uint32 probe_len = 32; + do { } while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && + (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) ); + cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q); + if (!probe_len) { + cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0; + } + if ((cur_match_len < TDEFL_MIN_MATCH_LEN) || ((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U * 1024U))) { + cur_match_len = 1; + *pLZ_code_buf++ = (mz_uint8)first_trigram; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + d->m_huff_count[0][(mz_uint8)first_trigram]++; + } else { + mz_uint32 s0, s1; + cur_match_len = MZ_MIN(cur_match_len, lookahead_size); + MZ_ASSERT((cur_match_len >= TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 1) && (cur_match_dist <= TDEFL_LZ_DICT_SIZE)); + cur_match_dist--; + pLZ_code_buf[0] = (mz_uint8)(cur_match_len - TDEFL_MIN_MATCH_LEN); + *(mz_uint16 *)(&pLZ_code_buf[1]) = (mz_uint16)cur_match_dist; + pLZ_code_buf += 3; + *pLZ_flags = (mz_uint8)((*pLZ_flags >> 1) | 0x80); + s0 = s_tdefl_small_dist_sym[cur_match_dist & 511]; + s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8]; + d->m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++; + if ((cur_match_len - TDEFL_MIN_MATCH_LEN) < sizeof(s_tdefl_len_sym) / sizeof(s_tdefl_len_sym[0])) { + d->m_huff_count[0][s_tdefl_len_sym[cur_match_len - TDEFL_MIN_MATCH_LEN]]++; + } + } + } else { + *pLZ_code_buf++ = (mz_uint8)first_trigram; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + d->m_huff_count[0][(mz_uint8)first_trigram]++; + } + if (--num_flags_left == 0) { + num_flags_left = 8; + pLZ_flags = pLZ_code_buf++; + } + total_lz_bytes += cur_match_len; + lookahead_pos += cur_match_len; + dict_size = MZ_MIN(dict_size + cur_match_len, TDEFL_LZ_DICT_SIZE); + cur_pos = (cur_pos + cur_match_len) & TDEFL_LZ_DICT_SIZE_MASK; + MZ_ASSERT(lookahead_size >= cur_match_len); + lookahead_size -= cur_match_len; + if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) { + int n; + d->m_lookahead_pos = lookahead_pos; + d->m_lookahead_size = lookahead_size; + d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; + d->m_pLZ_code_buf = pLZ_code_buf; + d->m_pLZ_flags = pLZ_flags; + d->m_num_flags_left = num_flags_left; + if ((n = tdefl_flush_block(d, 0)) != 0) { + return (n < 0) ? MZ_FALSE : MZ_TRUE; + } + total_lz_bytes = d->m_total_lz_bytes; + pLZ_code_buf = d->m_pLZ_code_buf; + pLZ_flags = d->m_pLZ_flags; + num_flags_left = d->m_num_flags_left; + } + } + while (lookahead_size) { + mz_uint8 lit = d->m_dict[cur_pos]; + total_lz_bytes++; + *pLZ_code_buf++ = lit; + *pLZ_flags = (mz_uint8)(*pLZ_flags >> 1); + if (--num_flags_left == 0) { + num_flags_left = 8; + pLZ_flags = pLZ_code_buf++; + } + d->m_huff_count[0][lit]++; + lookahead_pos++; + dict_size = MZ_MIN(dict_size + 1, TDEFL_LZ_DICT_SIZE); + cur_pos = (cur_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; + lookahead_size--; + if (pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) { + int n; + d->m_lookahead_pos = lookahead_pos; + d->m_lookahead_size = lookahead_size; + d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; + d->m_pLZ_code_buf = pLZ_code_buf; + d->m_pLZ_flags = pLZ_flags; + d->m_num_flags_left = num_flags_left; + if ((n = tdefl_flush_block(d, 0)) != 0) { + return (n < 0) ? MZ_FALSE : MZ_TRUE; + } + total_lz_bytes = d->m_total_lz_bytes; + pLZ_code_buf = d->m_pLZ_code_buf; + pLZ_flags = d->m_pLZ_flags; + num_flags_left = d->m_num_flags_left; + } + } + } + d->m_lookahead_pos = lookahead_pos; + d->m_lookahead_size = lookahead_size; + d->m_dict_size = dict_size; + d->m_total_lz_bytes = total_lz_bytes; + d->m_pLZ_code_buf = pLZ_code_buf; + d->m_pLZ_flags = pLZ_flags; + d->m_num_flags_left = num_flags_left; + return MZ_TRUE; + } +#endif // MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + + static MZ_FORCEINLINE void tdefl_record_literal(tdefl_compressor *d, mz_uint8 lit) { + d->m_total_lz_bytes++; + *d->m_pLZ_code_buf++ = lit; + *d->m_pLZ_flags = (mz_uint8)(*d->m_pLZ_flags >> 1); + if (--d->m_num_flags_left == 0) { + d->m_num_flags_left = 8; + d->m_pLZ_flags = d->m_pLZ_code_buf++; + } + d->m_huff_count[0][lit]++; + } + + static MZ_FORCEINLINE void tdefl_record_match(tdefl_compressor *d, mz_uint match_len, mz_uint match_dist) { + mz_uint32 s0, s1; + MZ_ASSERT((match_len >= TDEFL_MIN_MATCH_LEN) && (match_dist >= 1) && (match_dist <= TDEFL_LZ_DICT_SIZE)); + d->m_total_lz_bytes += match_len; + d->m_pLZ_code_buf[0] = (mz_uint8)(match_len - TDEFL_MIN_MATCH_LEN); + match_dist -= 1; + d->m_pLZ_code_buf[1] = (mz_uint8)(match_dist & 0xFF); + d->m_pLZ_code_buf[2] = (mz_uint8)(match_dist >> 8); + d->m_pLZ_code_buf += 3; + *d->m_pLZ_flags = (mz_uint8)((*d->m_pLZ_flags >> 1) | 0x80); + if (--d->m_num_flags_left == 0) { + d->m_num_flags_left = 8; + d->m_pLZ_flags = d->m_pLZ_code_buf++; + } + s0 = s_tdefl_small_dist_sym[match_dist & 511]; + s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127]; + d->m_huff_count[1][(match_dist < 512) ? s0 : s1]++; + if (match_len >= TDEFL_MIN_MATCH_LEN) { + d->m_huff_count[0][s_tdefl_len_sym[match_len - TDEFL_MIN_MATCH_LEN]]++; + } + } + + static mz_bool tdefl_compress_normal(tdefl_compressor *d) { + const mz_uint8 *pSrc = d->m_pSrc; + size_t src_buf_left = d->m_src_buf_left; + tdefl_flush flush = d->m_flush; + while ((src_buf_left) || ((flush) && (d->m_lookahead_size))) { + mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos; + // Update dictionary and hash chains. Keeps the lookahead size equal to TDEFL_MAX_MATCH_LEN. + if ((d->m_lookahead_size + d->m_dict_size) >= (TDEFL_MIN_MATCH_LEN - 1)) { + mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK, ins_pos = d->m_lookahead_pos + d->m_lookahead_size - 2; + mz_uint hash = (d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK]; + mz_uint num_bytes_to_process = (mz_uint)MZ_MIN(src_buf_left, TDEFL_MAX_MATCH_LEN - d->m_lookahead_size); + const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process; + src_buf_left -= num_bytes_to_process; + d->m_lookahead_size += num_bytes_to_process; + while (pSrc != pSrc_end) { + mz_uint8 c = *pSrc++; + d->m_dict[dst_pos] = c; + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) { + d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; + } + hash = ((hash << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); + d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; + d->m_hash[hash] = (mz_uint16)(ins_pos); + dst_pos = (dst_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK; + ins_pos++; + } + } else { + while ((src_buf_left) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) { + mz_uint8 c = *pSrc++; + mz_uint dst_pos = (d->m_lookahead_pos + d->m_lookahead_size) & TDEFL_LZ_DICT_SIZE_MASK; + src_buf_left--; + d->m_dict[dst_pos] = c; + if (dst_pos < (TDEFL_MAX_MATCH_LEN - 1)) { + d->m_dict[TDEFL_LZ_DICT_SIZE + dst_pos] = c; + } + if ((++d->m_lookahead_size + d->m_dict_size) >= TDEFL_MIN_MATCH_LEN) { + mz_uint ins_pos = d->m_lookahead_pos + (d->m_lookahead_size - 1) - 2; + mz_uint hash = ((d->m_dict[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] << (TDEFL_LZ_HASH_SHIFT * 2)) ^ (d->m_dict[(ins_pos + 1) & TDEFL_LZ_DICT_SIZE_MASK] << TDEFL_LZ_HASH_SHIFT) ^ c) & (TDEFL_LZ_HASH_SIZE - 1); + d->m_next[ins_pos & TDEFL_LZ_DICT_SIZE_MASK] = d->m_hash[hash]; + d->m_hash[hash] = (mz_uint16)(ins_pos); + } + } + } + d->m_dict_size = MZ_MIN(TDEFL_LZ_DICT_SIZE - d->m_lookahead_size, d->m_dict_size); + if ((!flush) && (d->m_lookahead_size < TDEFL_MAX_MATCH_LEN)) { + break; + } + // Simple lazy/greedy parsing state machine. + len_to_move = 1; + cur_match_dist = 0; + cur_match_len = d->m_saved_match_len ? d->m_saved_match_len : (TDEFL_MIN_MATCH_LEN - 1); + cur_pos = d->m_lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK; + if (d->m_flags & (TDEFL_RLE_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS)) { + if ((d->m_dict_size) && (!(d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) { + mz_uint8 c = d->m_dict[(cur_pos - 1) & TDEFL_LZ_DICT_SIZE_MASK]; + cur_match_len = 0; + while (cur_match_len < d->m_lookahead_size) { + if (d->m_dict[cur_pos + cur_match_len] != c) { + break; + } + cur_match_len++; + } + if (cur_match_len < TDEFL_MIN_MATCH_LEN) { + cur_match_len = 0; + } else { + cur_match_dist = 1; + } + } + } else { + tdefl_find_match(d, d->m_lookahead_pos, d->m_dict_size, d->m_lookahead_size, &cur_match_dist, &cur_match_len); + } + if (((cur_match_len == TDEFL_MIN_MATCH_LEN) && (cur_match_dist >= 8U * 1024U)) || (cur_pos == cur_match_dist) || ((d->m_flags & TDEFL_FILTER_MATCHES) && (cur_match_len <= 5))) { + cur_match_dist = cur_match_len = 0; + } + if (d->m_saved_match_len) { + if (cur_match_len > d->m_saved_match_len) { + tdefl_record_literal(d, (mz_uint8)d->m_saved_lit); + if (cur_match_len >= 128) { + tdefl_record_match(d, cur_match_len, cur_match_dist); + d->m_saved_match_len = 0; + len_to_move = cur_match_len; + } else { + d->m_saved_lit = d->m_dict[cur_pos]; + d->m_saved_match_dist = cur_match_dist; + d->m_saved_match_len = cur_match_len; + } + } else { + tdefl_record_match(d, d->m_saved_match_len, d->m_saved_match_dist); + len_to_move = d->m_saved_match_len - 1; + d->m_saved_match_len = 0; + } + } else if (!cur_match_dist) { + tdefl_record_literal(d, d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]); + } else if ((d->m_greedy_parsing) || (d->m_flags & TDEFL_RLE_MATCHES) || (cur_match_len >= 128)) { + tdefl_record_match(d, cur_match_len, cur_match_dist); + len_to_move = cur_match_len; + } else { + d->m_saved_lit = d->m_dict[MZ_MIN(cur_pos, sizeof(d->m_dict) - 1)]; + d->m_saved_match_dist = cur_match_dist; + d->m_saved_match_len = cur_match_len; + } + // Move the lookahead forward by len_to_move bytes. + d->m_lookahead_pos += len_to_move; + MZ_ASSERT(d->m_lookahead_size >= len_to_move); + d->m_lookahead_size -= len_to_move; + d->m_dict_size = MZ_MIN(d->m_dict_size + len_to_move, TDEFL_LZ_DICT_SIZE); + // Check if it's time to flush the current LZ codes to the internal output buffer. + if ( (d->m_pLZ_code_buf > &d->m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE - 8]) || + ( (d->m_total_lz_bytes > 31 * 1024) && (((((mz_uint)(d->m_pLZ_code_buf - d->m_lz_code_buf) * 115) >> 7) >= d->m_total_lz_bytes) || (d->m_flags & TDEFL_FORCE_ALL_RAW_BLOCKS))) ) { + int n; + d->m_pSrc = pSrc; + d->m_src_buf_left = src_buf_left; + if ((n = tdefl_flush_block(d, 0)) != 0) { + return (n < 0) ? MZ_FALSE : MZ_TRUE; + } + } + } + d->m_pSrc = pSrc; + d->m_src_buf_left = src_buf_left; + return MZ_TRUE; + } + + static tdefl_status tdefl_flush_output_buffer(tdefl_compressor *d) { + if (d->m_pIn_buf_size) { + *d->m_pIn_buf_size = d->m_pSrc - (const mz_uint8 *)d->m_pIn_buf; + } + if (d->m_pOut_buf_size) { + size_t n = MZ_MIN(*d->m_pOut_buf_size - d->m_out_buf_ofs, d->m_output_flush_remaining); + memcpy((mz_uint8 *)d->m_pOut_buf + d->m_out_buf_ofs, d->m_output_buf + d->m_output_flush_ofs, n); + d->m_output_flush_ofs += (mz_uint)n; + d->m_output_flush_remaining -= (mz_uint)n; + d->m_out_buf_ofs += n; + *d->m_pOut_buf_size = d->m_out_buf_ofs; + } + return (d->m_finished && !d->m_output_flush_remaining) ? TDEFL_STATUS_DONE : TDEFL_STATUS_OKAY; + } + + tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush) { + if (!d) { + if (pIn_buf_size) { + *pIn_buf_size = 0; + } + if (pOut_buf_size) { + *pOut_buf_size = 0; + } + return TDEFL_STATUS_BAD_PARAM; + } + d->m_pIn_buf = pIn_buf; + d->m_pIn_buf_size = pIn_buf_size; + d->m_pOut_buf = pOut_buf; + d->m_pOut_buf_size = pOut_buf_size; + d->m_pSrc = (const mz_uint8 *)(pIn_buf); + d->m_src_buf_left = pIn_buf_size ? *pIn_buf_size : 0; + d->m_out_buf_ofs = 0; + d->m_flush = flush; + if ( ((d->m_pPut_buf_func != NULL) == ((pOut_buf != NULL) || (pOut_buf_size != NULL))) || (d->m_prev_return_status != TDEFL_STATUS_OKAY) || + (d->m_wants_to_finish && (flush != TDEFL_FINISH)) || (pIn_buf_size && *pIn_buf_size && !pIn_buf) || (pOut_buf_size && *pOut_buf_size && !pOut_buf) ) { + if (pIn_buf_size) { + *pIn_buf_size = 0; + } + if (pOut_buf_size) { + *pOut_buf_size = 0; + } + return (d->m_prev_return_status = TDEFL_STATUS_BAD_PARAM); + } + d->m_wants_to_finish |= (flush == TDEFL_FINISH); + if ((d->m_output_flush_remaining) || (d->m_finished)) { + return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); + } +#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + if (((d->m_flags & TDEFL_MAX_PROBES_MASK) == 1) && + ((d->m_flags & TDEFL_GREEDY_PARSING_FLAG) != 0) && + ((d->m_flags & (TDEFL_FILTER_MATCHES | TDEFL_FORCE_ALL_RAW_BLOCKS | TDEFL_RLE_MATCHES)) == 0)) { + if (!tdefl_compress_fast(d)) { + return d->m_prev_return_status; + } + } else +#endif // #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN + { + if (!tdefl_compress_normal(d)) { + return d->m_prev_return_status; + } + } + if ((d->m_flags & (TDEFL_WRITE_ZLIB_HEADER | TDEFL_COMPUTE_ADLER32)) && (pIn_buf)) { + d->m_adler32 = (mz_uint32)mz_adler32(d->m_adler32, (const mz_uint8 *)pIn_buf, d->m_pSrc - (const mz_uint8 *)pIn_buf); + } + if ((flush) && (!d->m_lookahead_size) && (!d->m_src_buf_left) && (!d->m_output_flush_remaining)) { + if (tdefl_flush_block(d, flush) < 0) { + return d->m_prev_return_status; + } + d->m_finished = (flush == TDEFL_FINISH); + if (flush == TDEFL_FULL_FLUSH) { + MZ_CLEAR_OBJ(d->m_hash); + MZ_CLEAR_OBJ(d->m_next); + d->m_dict_size = 0; + } + } + return (d->m_prev_return_status = tdefl_flush_output_buffer(d)); + } + + tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush) { + MZ_ASSERT(d->m_pPut_buf_func); + return tdefl_compress(d, pIn_buf, &in_buf_size, NULL, NULL, flush); + } + + tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) { + d->m_pPut_buf_func = pPut_buf_func; + d->m_pPut_buf_user = pPut_buf_user; + d->m_flags = (mz_uint)(flags); + d->m_max_probes[0] = 1 + ((flags & 0xFFF) + 2) / 3; + d->m_greedy_parsing = (flags & TDEFL_GREEDY_PARSING_FLAG) != 0; + d->m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3; + if (!(flags & TDEFL_NONDETERMINISTIC_PARSING_FLAG)) { + MZ_CLEAR_OBJ(d->m_hash); + } + d->m_lookahead_pos = d->m_lookahead_size = d->m_dict_size = d->m_total_lz_bytes = d->m_lz_code_buf_dict_pos = d->m_bits_in = 0; + d->m_output_flush_ofs = d->m_output_flush_remaining = d->m_finished = d->m_block_index = d->m_bit_buffer = d->m_wants_to_finish = 0; + d->m_pLZ_code_buf = d->m_lz_code_buf + 1; + d->m_pLZ_flags = d->m_lz_code_buf; + d->m_num_flags_left = 8; + d->m_pOutput_buf = d->m_output_buf; + d->m_pOutput_buf_end = d->m_output_buf; + d->m_prev_return_status = TDEFL_STATUS_OKAY; + d->m_saved_match_dist = d->m_saved_match_len = d->m_saved_lit = 0; + d->m_adler32 = 1; + d->m_pIn_buf = NULL; + d->m_pOut_buf = NULL; + d->m_pIn_buf_size = NULL; + d->m_pOut_buf_size = NULL; + d->m_flush = TDEFL_NO_FLUSH; + d->m_pSrc = NULL; + d->m_src_buf_left = 0; + d->m_out_buf_ofs = 0; + memset(&d->m_huff_count[0][0], 0, sizeof(d->m_huff_count[0][0]) * TDEFL_MAX_HUFF_SYMBOLS_0); + memset(&d->m_huff_count[1][0], 0, sizeof(d->m_huff_count[1][0]) * TDEFL_MAX_HUFF_SYMBOLS_1); + return TDEFL_STATUS_OKAY; + } + + tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d) { + return d->m_prev_return_status; + } + + mz_uint32 tdefl_get_adler32(tdefl_compressor *d) { + return d->m_adler32; + } + + mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags) { + tdefl_compressor *pComp; + mz_bool succeeded; + if (((buf_len) && (!pBuf)) || (!pPut_buf_func)) { + return MZ_FALSE; + } + pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); + if (!pComp) { + return MZ_FALSE; + } + succeeded = (tdefl_init(pComp, pPut_buf_func, pPut_buf_user, flags) == TDEFL_STATUS_OKAY); + succeeded = succeeded && (tdefl_compress_buffer(pComp, pBuf, buf_len, TDEFL_FINISH) == TDEFL_STATUS_DONE); + MZ_FREE(pComp); + return succeeded; + } + + typedef struct { + size_t m_size, m_capacity; + mz_uint8 *m_pBuf; + mz_bool m_expandable; + } tdefl_output_buffer; + + static mz_bool tdefl_output_buffer_putter(const void *pBuf, int len, void *pUser) { + tdefl_output_buffer *p = (tdefl_output_buffer *)pUser; + size_t new_size = p->m_size + len; + if (new_size > p->m_capacity) { + size_t new_capacity = p->m_capacity; + mz_uint8 *pNew_buf; + if (!p->m_expandable) { + return MZ_FALSE; + } + do { + new_capacity = MZ_MAX(128U, new_capacity << 1U); + } while (new_size > new_capacity); + pNew_buf = (mz_uint8 *)MZ_REALLOC(p->m_pBuf, new_capacity); + if (!pNew_buf) { + return MZ_FALSE; + } + p->m_pBuf = pNew_buf; + p->m_capacity = new_capacity; + } + memcpy((mz_uint8 *)p->m_pBuf + p->m_size, pBuf, len); + p->m_size = new_size; + return MZ_TRUE; + } + + void *tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags) { + tdefl_output_buffer out_buf; + MZ_CLEAR_OBJ(out_buf); + if (!pOut_len) { + return MZ_FALSE; + } else { + *pOut_len = 0; + } + out_buf.m_expandable = MZ_TRUE; + if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) { + return NULL; + } + *pOut_len = out_buf.m_size; + return out_buf.m_pBuf; + } + + size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags) { + tdefl_output_buffer out_buf; + MZ_CLEAR_OBJ(out_buf); + if (!pOut_buf) { + return 0; + } + out_buf.m_pBuf = (mz_uint8 *)pOut_buf; + out_buf.m_capacity = out_buf_len; + if (!tdefl_compress_mem_to_output(pSrc_buf, src_buf_len, tdefl_output_buffer_putter, &out_buf, flags)) { + return 0; + } + return out_buf.m_size; + } + +#ifndef MINIZ_NO_ZLIB_APIS + static const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 }; + + // level may actually range from [0,10] (10 is a "hidden" max level, where we want a bit more compression and it's fine if throughput to fall off a cliff on some files). + mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy) { + mz_uint comp_flags = s_tdefl_num_probes[(level >= 0) ? MZ_MIN(10, level) : MZ_DEFAULT_LEVEL] | ((level <= 3) ? TDEFL_GREEDY_PARSING_FLAG : 0); + if (window_bits > 0) { + comp_flags |= TDEFL_WRITE_ZLIB_HEADER; + } + if (!level) { + comp_flags |= TDEFL_FORCE_ALL_RAW_BLOCKS; + } else if (strategy == MZ_FILTERED) { + comp_flags |= TDEFL_FILTER_MATCHES; + } else if (strategy == MZ_HUFFMAN_ONLY) { + comp_flags &= ~TDEFL_MAX_PROBES_MASK; + } else if (strategy == MZ_FIXED) { + comp_flags |= TDEFL_FORCE_ALL_STATIC_BLOCKS; + } else if (strategy == MZ_RLE) { + comp_flags |= TDEFL_RLE_MATCHES; + } + return comp_flags; + } +#endif //MINIZ_NO_ZLIB_APIS + +#ifdef _MSC_VER +#pragma warning (push) +#pragma warning (disable:4204) // nonstandard extension used : non-constant aggregate initializer (also supported by GNU C and C99, so no big deal) +#endif + + // Simple PNG writer function by Alex Evans, 2011. Released into the public domain: https://gist.github.com/908299, more context at + // http://altdevblogaday.org/2011/04/06/a-smaller-jpg-encoder/. + // This is actually a modification of Alex's original code so PNG files generated by this function pass pngcheck. + void *tdefl_write_image_to_png_file_in_memory_ex(const void *pImage, int w, int h, int num_chans, size_t *pLen_out, mz_uint level, mz_bool flip) { + // Using a local copy of this array here in case MINIZ_NO_ZLIB_APIS was defined. + static const mz_uint s_tdefl_png_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 }; + tdefl_compressor *pComp = (tdefl_compressor *)MZ_MALLOC(sizeof(tdefl_compressor)); + tdefl_output_buffer out_buf; + int i, bpl = w * num_chans, y, z; + mz_uint32 c; + *pLen_out = 0; + if (!pComp) { + return NULL; + } + MZ_CLEAR_OBJ(out_buf); + out_buf.m_expandable = MZ_TRUE; + out_buf.m_capacity = 57 + MZ_MAX(64, (1 + bpl) * h); + if (NULL == (out_buf.m_pBuf = (mz_uint8 *)MZ_MALLOC(out_buf.m_capacity))) { + MZ_FREE(pComp); + return NULL; + } + // write dummy header + for (z = 41; z; --z) { + tdefl_output_buffer_putter(&z, 1, &out_buf); + } + // compress image data + tdefl_init(pComp, tdefl_output_buffer_putter, &out_buf, s_tdefl_png_num_probes[MZ_MIN(10, level)] | TDEFL_WRITE_ZLIB_HEADER); + for (y = 0; y < h; ++y) { + tdefl_compress_buffer(pComp, &z, 1, TDEFL_NO_FLUSH); + tdefl_compress_buffer(pComp, (mz_uint8 *)pImage + (flip ? (h - 1 - y) : y) * bpl, bpl, TDEFL_NO_FLUSH); + } + if (tdefl_compress_buffer(pComp, NULL, 0, TDEFL_FINISH) != TDEFL_STATUS_DONE) { + MZ_FREE(pComp); + MZ_FREE(out_buf.m_pBuf); + return NULL; + } + // write real header + *pLen_out = out_buf.m_size - 41; + { + static const mz_uint8 chans[] = {0x00, 0x00, 0x04, 0x02, 0x06}; + mz_uint8 pnghdr[41] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0, 0, (mz_uint8)(w >> 8), (mz_uint8)w, 0, 0, (mz_uint8)(h >> 8), (mz_uint8)h, 8, chans[num_chans], 0, 0, 0, 0, 0, 0, 0, + (mz_uint8)(*pLen_out >> 24), (mz_uint8)(*pLen_out >> 16), (mz_uint8)(*pLen_out >> 8), (mz_uint8) *pLen_out, 0x49, 0x44, 0x41, 0x54 + }; + c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, pnghdr + 12, 17); + for (i = 0; i < 4; ++i, c <<= 8) { + ((mz_uint8 *)(pnghdr + 29))[i] = (mz_uint8)(c >> 24); + } + memcpy(out_buf.m_pBuf, pnghdr, 41); + } + // write footer (IDAT CRC-32, followed by IEND chunk) + if (!tdefl_output_buffer_putter("\0\0\0\0\0\0\0\0\x49\x45\x4e\x44\xae\x42\x60\x82", 16, &out_buf)) { + *pLen_out = 0; + MZ_FREE(pComp); + MZ_FREE(out_buf.m_pBuf); + return NULL; + } + c = (mz_uint32)mz_crc32(MZ_CRC32_INIT, out_buf.m_pBuf + 41 - 4, *pLen_out + 4); + for (i = 0; i < 4; ++i, c <<= 8) { + (out_buf.m_pBuf + out_buf.m_size - 16)[i] = (mz_uint8)(c >> 24); + } + // compute final size of file, grab compressed data buffer and return + *pLen_out += 57; + MZ_FREE(pComp); + return out_buf.m_pBuf; + } + void *tdefl_write_image_to_png_file_in_memory(const void *pImage, int w, int h, int num_chans, size_t *pLen_out) { + // Level 6 corresponds to TDEFL_DEFAULT_MAX_PROBES or MZ_DEFAULT_LEVEL (but we can't depend on MZ_DEFAULT_LEVEL being available in case the zlib API's where #defined out) + return tdefl_write_image_to_png_file_in_memory_ex(pImage, w, h, num_chans, pLen_out, 6, MZ_FALSE); + } + +#ifdef _MSC_VER +#pragma warning (pop) +#endif + + // ------------------- .ZIP archive reading + +#ifndef MINIZ_NO_ARCHIVE_APIS + +#ifdef MINIZ_NO_STDIO +#define MZ_FILE void * +#else +#include +#include + +#if defined(_MSC_VER) || defined(__MINGW64__) + static FILE *mz_fopen(const char *pFilename, const char *pMode) { + FILE *pFile = NULL; + fopen_s(&pFile, pFilename, pMode); + return pFile; + } + static FILE *mz_freopen(const char *pPath, const char *pMode, FILE *pStream) { + FILE *pFile = NULL; + if (freopen_s(&pFile, pPath, pMode, pStream)) { + return NULL; + } + return pFile; + } +#ifndef MINIZ_NO_TIME +#include +#endif +#define MZ_FILE FILE +#define MZ_FOPEN mz_fopen +#define MZ_FCLOSE fclose +#define MZ_FREAD fread +#define MZ_FWRITE fwrite +#define MZ_FTELL64 _ftelli64 +#define MZ_FSEEK64 _fseeki64 +#define MZ_FILE_STAT_STRUCT _stat +#define MZ_FILE_STAT _stat +#define MZ_FFLUSH fflush +#define MZ_FREOPEN mz_freopen +#define MZ_DELETE_FILE remove +#elif defined(__MINGW32__) +#ifndef MINIZ_NO_TIME +#include +#endif +#define MZ_FILE FILE +#define MZ_FOPEN(f, m) fopen(f, m) +#define MZ_FCLOSE fclose +#define MZ_FREAD fread +#define MZ_FWRITE fwrite +#define MZ_FTELL64 ftello64 +#define MZ_FSEEK64 fseeko64 +#define MZ_FILE_STAT_STRUCT _stat +#define MZ_FILE_STAT _stat +#define MZ_FFLUSH fflush +#define MZ_FREOPEN(f, m, s) freopen(f, m, s) +#define MZ_DELETE_FILE remove +#elif defined(__TINYC__) +#ifndef MINIZ_NO_TIME +#include +#endif +#define MZ_FILE FILE +#define MZ_FOPEN(f, m) fopen(f, m) +#define MZ_FCLOSE fclose +#define MZ_FREAD fread +#define MZ_FWRITE fwrite +#define MZ_FTELL64 ftell +#define MZ_FSEEK64 fseek +#define MZ_FILE_STAT_STRUCT stat +#define MZ_FILE_STAT stat +#define MZ_FFLUSH fflush +#define MZ_FREOPEN(f, m, s) freopen(f, m, s) +#define MZ_DELETE_FILE remove +#elif defined(__GNUC__) && _LARGEFILE64_SOURCE +#ifndef MINIZ_NO_TIME +#include +#endif +#define MZ_FILE FILE +#define MZ_FOPEN(f, m) fopen64(f, m) +#define MZ_FCLOSE fclose +#define MZ_FREAD fread +#define MZ_FWRITE fwrite +#define MZ_FTELL64 ftello64 +#define MZ_FSEEK64 fseeko64 +#define MZ_FILE_STAT_STRUCT stat64 +#define MZ_FILE_STAT stat64 +#define MZ_FFLUSH fflush +#define MZ_FREOPEN(p, m, s) freopen64(p, m, s) +#define MZ_DELETE_FILE remove +#else +#ifndef MINIZ_NO_TIME +#include +#endif +#define MZ_FILE FILE +#define MZ_FOPEN(f, m) fopen(f, m) +#define MZ_FCLOSE fclose +#define MZ_FREAD fread +#define MZ_FWRITE fwrite +#define MZ_FTELL64 ftello +#define MZ_FSEEK64 fseeko +#define MZ_FILE_STAT_STRUCT stat +#define MZ_FILE_STAT stat +#define MZ_FFLUSH fflush +#define MZ_FREOPEN(f, m, s) freopen(f, m, s) +#define MZ_DELETE_FILE remove +#endif // #ifdef _MSC_VER +#endif // #ifdef MINIZ_NO_STDIO + +#define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c)) + + // Various ZIP archive enums. To completely avoid cross platform compiler alignment and platform endian issues, miniz.c doesn't use structs for any of this stuff. + enum { + // ZIP archive identifiers and record sizes + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG = 0x06054b50, MZ_ZIP_CENTRAL_DIR_HEADER_SIG = 0x02014b50, MZ_ZIP_LOCAL_DIR_HEADER_SIG = 0x04034b50, + MZ_ZIP_LOCAL_DIR_HEADER_SIZE = 30, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE = 46, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE = 22, + // Central directory header record offsets + MZ_ZIP_CDH_SIG_OFS = 0, MZ_ZIP_CDH_VERSION_MADE_BY_OFS = 4, MZ_ZIP_CDH_VERSION_NEEDED_OFS = 6, MZ_ZIP_CDH_BIT_FLAG_OFS = 8, + MZ_ZIP_CDH_METHOD_OFS = 10, MZ_ZIP_CDH_FILE_TIME_OFS = 12, MZ_ZIP_CDH_FILE_DATE_OFS = 14, MZ_ZIP_CDH_CRC32_OFS = 16, + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS = 20, MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS = 24, MZ_ZIP_CDH_FILENAME_LEN_OFS = 28, MZ_ZIP_CDH_EXTRA_LEN_OFS = 30, + MZ_ZIP_CDH_COMMENT_LEN_OFS = 32, MZ_ZIP_CDH_DISK_START_OFS = 34, MZ_ZIP_CDH_INTERNAL_ATTR_OFS = 36, MZ_ZIP_CDH_EXTERNAL_ATTR_OFS = 38, MZ_ZIP_CDH_LOCAL_HEADER_OFS = 42, + // Local directory header offsets + MZ_ZIP_LDH_SIG_OFS = 0, MZ_ZIP_LDH_VERSION_NEEDED_OFS = 4, MZ_ZIP_LDH_BIT_FLAG_OFS = 6, MZ_ZIP_LDH_METHOD_OFS = 8, MZ_ZIP_LDH_FILE_TIME_OFS = 10, + MZ_ZIP_LDH_FILE_DATE_OFS = 12, MZ_ZIP_LDH_CRC32_OFS = 14, MZ_ZIP_LDH_COMPRESSED_SIZE_OFS = 18, MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS = 22, + MZ_ZIP_LDH_FILENAME_LEN_OFS = 26, MZ_ZIP_LDH_EXTRA_LEN_OFS = 28, + // End of central directory offsets + MZ_ZIP_ECDH_SIG_OFS = 0, MZ_ZIP_ECDH_NUM_THIS_DISK_OFS = 4, MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS = 6, MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS = 8, + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS = 10, MZ_ZIP_ECDH_CDIR_SIZE_OFS = 12, MZ_ZIP_ECDH_CDIR_OFS_OFS = 16, MZ_ZIP_ECDH_COMMENT_SIZE_OFS = 20, + }; + + typedef struct { + void *m_p; + size_t m_size, m_capacity; + mz_uint m_element_size; + } mz_zip_array; + + struct mz_zip_internal_state_tag { + mz_zip_array m_central_dir; + mz_zip_array m_central_dir_offsets; + mz_zip_array m_sorted_central_dir_offsets; + MZ_FILE *m_pFile; + void *m_pMem; + size_t m_mem_size; + size_t m_mem_capacity; + }; + +#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) (array_ptr)->m_element_size = element_size +#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) ((element_type *)((array_ptr)->m_p))[index] + + static MZ_FORCEINLINE void mz_zip_array_clear(mz_zip_archive *pZip, mz_zip_array *pArray) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pArray->m_p); + memset(pArray, 0, sizeof(mz_zip_array)); + } + + static mz_bool mz_zip_array_ensure_capacity(mz_zip_archive *pZip, mz_zip_array *pArray, size_t min_new_capacity, mz_uint growing) { + void *pNew_p; + size_t new_capacity = min_new_capacity; + MZ_ASSERT(pArray->m_element_size); + if (pArray->m_capacity >= min_new_capacity) { + return MZ_TRUE; + } + if (growing) { + new_capacity = MZ_MAX(1, pArray->m_capacity); + while (new_capacity < min_new_capacity) { + new_capacity *= 2; + } + } + if (NULL == (pNew_p = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pArray->m_p, pArray->m_element_size, new_capacity))) { + return MZ_FALSE; + } + pArray->m_p = pNew_p; + pArray->m_capacity = new_capacity; + return MZ_TRUE; + } + + static MZ_FORCEINLINE mz_bool mz_zip_array_reserve(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_capacity, mz_uint growing) { + if (new_capacity > pArray->m_capacity) { + if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing)) { + return MZ_FALSE; + } + } + return MZ_TRUE; + } + + static MZ_FORCEINLINE mz_bool mz_zip_array_resize(mz_zip_archive *pZip, mz_zip_array *pArray, size_t new_size, mz_uint growing) { + if (new_size > pArray->m_capacity) { + if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing)) { + return MZ_FALSE; + } + } + pArray->m_size = new_size; + return MZ_TRUE; + } + + static MZ_FORCEINLINE mz_bool mz_zip_array_ensure_room(mz_zip_archive *pZip, mz_zip_array *pArray, size_t n) { + return mz_zip_array_reserve(pZip, pArray, pArray->m_size + n, MZ_TRUE); + } + + static MZ_FORCEINLINE mz_bool mz_zip_array_push_back(mz_zip_archive *pZip, mz_zip_array *pArray, const void *pElements, size_t n) { + size_t orig_size = pArray->m_size; + if (!mz_zip_array_resize(pZip, pArray, orig_size + n, MZ_TRUE)) { + return MZ_FALSE; + } + memcpy((mz_uint8 *)pArray->m_p + orig_size * pArray->m_element_size, pElements, n * pArray->m_element_size); + return MZ_TRUE; + } + +#ifndef MINIZ_NO_TIME + static time_t mz_zip_dos_to_time_t(int dos_time, int dos_date) { + struct tm tm; + memset(&tm, 0, sizeof(tm)); + tm.tm_isdst = -1; + tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900; + tm.tm_mon = ((dos_date >> 5) & 15) - 1; + tm.tm_mday = dos_date & 31; + tm.tm_hour = (dos_time >> 11) & 31; + tm.tm_min = (dos_time >> 5) & 63; + tm.tm_sec = (dos_time << 1) & 62; + return mktime(&tm); + } + + static void mz_zip_time_to_dos_time(time_t time, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date) { +#ifdef _MSC_VER + struct tm tm_struct; + struct tm *tm = &tm_struct; + errno_t err = localtime_s(tm, &time); + if (err) { + *pDOS_date = 0; + *pDOS_time = 0; + return; + } +#else + struct tm *tm = localtime(&time); +#endif + *pDOS_time = (mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) + ((tm->tm_sec) >> 1)); + *pDOS_date = (mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday); + } +#endif + +#ifndef MINIZ_NO_STDIO + static mz_bool mz_zip_get_file_modified_time(const char *pFilename, mz_uint16 *pDOS_time, mz_uint16 *pDOS_date) { +#ifdef MINIZ_NO_TIME + (void)pFilename; + *pDOS_date = *pDOS_time = 0; +#else + struct MZ_FILE_STAT_STRUCT file_stat; + // On Linux with x86 glibc, this call will fail on large files (>= 0x80000000 bytes) unless you compiled with _LARGEFILE64_SOURCE. Argh. + if (MZ_FILE_STAT(pFilename, &file_stat) != 0) { + return MZ_FALSE; + } + mz_zip_time_to_dos_time(file_stat.st_mtime, pDOS_time, pDOS_date); +#endif // #ifdef MINIZ_NO_TIME + return MZ_TRUE; + } + +#ifndef MINIZ_NO_TIME + static mz_bool mz_zip_set_file_times(const char *pFilename, time_t access_time, time_t modified_time) { + struct utimbuf t; + t.actime = access_time; + t.modtime = modified_time; + return !utime(pFilename, &t); + } +#endif // #ifndef MINIZ_NO_TIME +#endif // #ifndef MINIZ_NO_STDIO + + static mz_bool mz_zip_reader_init_internal(mz_zip_archive *pZip, mz_uint32 flags) { + (void)flags; + if ((!pZip) || (pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) { + return MZ_FALSE; + } + if (!pZip->m_pAlloc) { + pZip->m_pAlloc = def_alloc_func; + } + if (!pZip->m_pFree) { + pZip->m_pFree = def_free_func; + } + if (!pZip->m_pRealloc) { + pZip->m_pRealloc = def_realloc_func; + } + pZip->m_zip_mode = MZ_ZIP_MODE_READING; + pZip->m_archive_size = 0; + pZip->m_central_directory_file_ofs = 0; + pZip->m_total_files = 0; + if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) { + return MZ_FALSE; + } + memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32)); + return MZ_TRUE; + } + + static MZ_FORCEINLINE mz_bool mz_zip_reader_filename_less(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, mz_uint r_index) { + const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE; + const mz_uint8 *pR = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, r_index)); + mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS), r_len = MZ_READ_LE16(pR + MZ_ZIP_CDH_FILENAME_LEN_OFS); + mz_uint8 l = 0, r = 0; + pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + pR += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + pE = pL + MZ_MIN(l_len, r_len); + while (pL < pE) { + if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) { + break; + } + pL++; + pR++; + } + return (pL == pE) ? (l_len < r_len) : (l < r); + } + +#define MZ_SWAP_UINT32(a, b) do { mz_uint32 t = a; a = b; b = t; } MZ_MACRO_END + + // Heap sort of lowercased filenames, used to help accelerate plain central directory searches by mz_zip_reader_locate_file(). (Could also use qsort(), but it could allocate memory.) + static void mz_zip_reader_sort_central_dir_offsets_by_filename(mz_zip_archive *pZip) { + mz_zip_internal_state *pState = pZip->m_pState; + const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; + const mz_zip_array *pCentral_dir = &pState->m_central_dir; + mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0); + const int size = pZip->m_total_files; + int start = (size - 2) >> 1, end; + while (start >= 0) { + int child, root = start; + for ( ; ; ) { + if ((child = (root << 1) + 1) >= size) { + break; + } + child += (((child + 1) < size) && (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1]))); + if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child])) { + break; + } + MZ_SWAP_UINT32(pIndices[root], pIndices[child]); + root = child; + } + start--; + } + end = size - 1; + while (end > 0) { + int child, root = 0; + MZ_SWAP_UINT32(pIndices[end], pIndices[0]); + for ( ; ; ) { + if ((child = (root << 1) + 1) >= end) { + break; + } + child += (((child + 1) < end) && mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1])); + if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child])) { + break; + } + MZ_SWAP_UINT32(pIndices[root], pIndices[child]); + root = child; + } + end--; + } + } + + static mz_bool mz_zip_reader_read_central_dir(mz_zip_archive *pZip, mz_uint32 flags) { + mz_uint cdir_size, num_this_disk, cdir_disk_index; + mz_uint64 cdir_ofs; + mz_int64 cur_file_ofs; + const mz_uint8 *p; + mz_uint32 buf_u32[4096 / sizeof(mz_uint32)]; + mz_uint8 *pBuf = (mz_uint8 *)buf_u32; + mz_bool sort_central_dir = ((flags & MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY) == 0); + // Basic sanity checks - reject files which are too small, and check the first 4 bytes of the file to make sure a local header is there. + if (pZip->m_archive_size < MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) { + return MZ_FALSE; + } + // Find the end of central directory record by scanning the file from the end towards the beginning. + cur_file_ofs = MZ_MAX((mz_int64)pZip->m_archive_size - (mz_int64)sizeof(buf_u32), 0); + for ( ; ; ) { + int i, n = (int)MZ_MIN(sizeof(buf_u32), pZip->m_archive_size - cur_file_ofs); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, n) != (mz_uint)n) { + return MZ_FALSE; + } + for (i = n - 4; i >= 0; --i) + if (MZ_READ_LE32(pBuf + i) == MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) { + break; + } + if (i >= 0) { + cur_file_ofs += i; + break; + } + if ((!cur_file_ofs) || ((pZip->m_archive_size - cur_file_ofs) >= (0xFFFF + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE))) { + return MZ_FALSE; + } + cur_file_ofs = MZ_MAX(cur_file_ofs - (sizeof(buf_u32) - 3), 0); + } + // Read and verify the end of central directory record. + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) { + return MZ_FALSE; + } + if ((MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_SIG_OFS) != MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG) || + ((pZip->m_total_files = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS)) != MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS))) { + return MZ_FALSE; + } + num_this_disk = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_THIS_DISK_OFS); + cdir_disk_index = MZ_READ_LE16(pBuf + MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS); + if (((num_this_disk | cdir_disk_index) != 0) && ((num_this_disk != 1) || (cdir_disk_index != 1))) { + return MZ_FALSE; + } + if ((cdir_size = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_SIZE_OFS)) < pZip->m_total_files * MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) { + return MZ_FALSE; + } + cdir_ofs = MZ_READ_LE32(pBuf + MZ_ZIP_ECDH_CDIR_OFS_OFS); + if ((cdir_ofs + (mz_uint64)cdir_size) > pZip->m_archive_size) { + return MZ_FALSE; + } + pZip->m_central_directory_file_ofs = cdir_ofs; + if (pZip->m_total_files) { + mz_uint i, n; + // Read the entire central directory into a heap block, and allocate another heap block to hold the unsorted central dir file record offsets, and another to hold the sorted indices. + if ((!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir, cdir_size, MZ_FALSE)) || + (!mz_zip_array_resize(pZip, &pZip->m_pState->m_central_dir_offsets, pZip->m_total_files, MZ_FALSE))) { + return MZ_FALSE; + } + if (sort_central_dir) { + if (!mz_zip_array_resize(pZip, &pZip->m_pState->m_sorted_central_dir_offsets, pZip->m_total_files, MZ_FALSE)) { + return MZ_FALSE; + } + } + if (pZip->m_pRead(pZip->m_pIO_opaque, cdir_ofs, pZip->m_pState->m_central_dir.m_p, cdir_size) != cdir_size) { + return MZ_FALSE; + } + // Now create an index into the central directory file records, do some basic sanity checking on each record, and check for zip64 entries (which are not yet supported). + p = (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p; + for (n = cdir_size, i = 0; i < pZip->m_total_files; ++i) { + mz_uint total_header_size, comp_size, decomp_size, disk_index; + if ((n < MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) || (MZ_READ_LE32(p) != MZ_ZIP_CENTRAL_DIR_HEADER_SIG)) { + return MZ_FALSE; + } + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, i) = (mz_uint32)(p - (const mz_uint8 *)pZip->m_pState->m_central_dir.m_p); + if (sort_central_dir) { + MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_sorted_central_dir_offsets, mz_uint32, i) = i; + } + comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + decomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + if (((!MZ_READ_LE32(p + MZ_ZIP_CDH_METHOD_OFS)) && (decomp_size != comp_size)) || (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) || (comp_size == 0xFFFFFFFF)) { + return MZ_FALSE; + } + disk_index = MZ_READ_LE16(p + MZ_ZIP_CDH_DISK_START_OFS); + if ((disk_index != num_this_disk) && (disk_index != 1)) { + return MZ_FALSE; + } + if (((mz_uint64)MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS) + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + comp_size) > pZip->m_archive_size) { + return MZ_FALSE; + } + if ((total_header_size = MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS)) > n) { + return MZ_FALSE; + } + n -= total_header_size; + p += total_header_size; + } + } + if (sort_central_dir) { + mz_zip_reader_sort_central_dir_offsets_by_filename(pZip); + } + return MZ_TRUE; + } + + mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags) { + if ((!pZip) || (!pZip->m_pRead)) { + return MZ_FALSE; + } + if (!mz_zip_reader_init_internal(pZip, flags)) { + return MZ_FALSE; + } + pZip->m_archive_size = size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; + } + + static size_t mz_zip_mem_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) { + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + size_t s = (file_ofs >= pZip->m_archive_size) ? 0 : (size_t)MZ_MIN(pZip->m_archive_size - file_ofs, n); + memcpy(pBuf, (const mz_uint8 *)pZip->m_pState->m_pMem + file_ofs, s); + return s; + } + + mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags) { + if (!mz_zip_reader_init_internal(pZip, flags)) { + return MZ_FALSE; + } + pZip->m_archive_size = size; + pZip->m_pRead = mz_zip_mem_read_func; + pZip->m_pIO_opaque = pZip; +#ifdef __cplusplus + pZip->m_pState->m_pMem = const_cast(pMem); +#else + pZip->m_pState->m_pMem = (void *)pMem; +#endif + pZip->m_pState->m_mem_size = size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; + } + +#ifndef MINIZ_NO_STDIO + static size_t mz_zip_file_read_func(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n) { + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); + if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) { + return 0; + } + return MZ_FREAD(pBuf, 1, n, pZip->m_pState->m_pFile); + } + + mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags) { + mz_uint64 file_size; + MZ_FILE *pFile = MZ_FOPEN(pFilename, "rb"); + if (!pFile) { + return MZ_FALSE; + } + if (MZ_FSEEK64(pFile, 0, SEEK_END)) { + MZ_FCLOSE(pFile); + return MZ_FALSE; + } + file_size = MZ_FTELL64(pFile); + if (!mz_zip_reader_init_internal(pZip, flags)) { + MZ_FCLOSE(pFile); + return MZ_FALSE; + } + pZip->m_pRead = mz_zip_file_read_func; + pZip->m_pIO_opaque = pZip; + pZip->m_pState->m_pFile = pFile; + pZip->m_archive_size = file_size; + if (!mz_zip_reader_read_central_dir(pZip, flags)) { + mz_zip_reader_end(pZip); + return MZ_FALSE; + } + return MZ_TRUE; + } +#endif // #ifndef MINIZ_NO_STDIO + + mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip) { + return pZip ? pZip->m_total_files : 0; + } + + static MZ_FORCEINLINE const mz_uint8 *mz_zip_reader_get_cdh(mz_zip_archive *pZip, mz_uint file_index) { + if ((!pZip) || (!pZip->m_pState) || (file_index >= pZip->m_total_files) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) { + return NULL; + } + return &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index)); + } + + mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index) { + mz_uint m_bit_flag; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) { + return MZ_FALSE; + } + m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); + return (m_bit_flag & 1); + } + + mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index) { + mz_uint filename_len, external_attr; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) { + return MZ_FALSE; + } + // First see if the filename ends with a '/' character. + filename_len = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); + if (filename_len) { + if (*(p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_len - 1) == '/') { + return MZ_TRUE; + } + } + // Bugfix: This code was also checking if the internal attribute was non-zero, which wasn't correct. + // Most/all zip writers (hopefully) set DOS file/directory attributes in the low 16-bits, so check for the DOS directory flag and ignore the source OS ID in the created by field. + // FIXME: Remove this check? Is it necessary - we already check the filename. + external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); + if ((external_attr & 0x10) != 0) { + return MZ_TRUE; + } + return MZ_FALSE; + } + + mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat) { + mz_uint n; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if ((!p) || (!pStat)) { + return MZ_FALSE; + } + // Unpack the central directory record. + pStat->m_file_index = file_index; + pStat->m_central_dir_ofs = MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index); + pStat->m_version_made_by = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_MADE_BY_OFS); + pStat->m_version_needed = MZ_READ_LE16(p + MZ_ZIP_CDH_VERSION_NEEDED_OFS); + pStat->m_bit_flag = MZ_READ_LE16(p + MZ_ZIP_CDH_BIT_FLAG_OFS); + pStat->m_method = MZ_READ_LE16(p + MZ_ZIP_CDH_METHOD_OFS); +#ifndef MINIZ_NO_TIME + pStat->m_time = mz_zip_dos_to_time_t(MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_TIME_OFS), MZ_READ_LE16(p + MZ_ZIP_CDH_FILE_DATE_OFS)); +#endif + pStat->m_crc32 = MZ_READ_LE32(p + MZ_ZIP_CDH_CRC32_OFS); + pStat->m_comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + pStat->m_uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + pStat->m_internal_attr = MZ_READ_LE16(p + MZ_ZIP_CDH_INTERNAL_ATTR_OFS); + pStat->m_external_attr = MZ_READ_LE32(p + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS); + pStat->m_local_header_ofs = MZ_READ_LE32(p + MZ_ZIP_CDH_LOCAL_HEADER_OFS); + // Copy as much of the filename and comment as possible. + n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); + n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE - 1); + memcpy(pStat->m_filename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); + pStat->m_filename[n] = '\0'; + n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS); + n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1); + pStat->m_comment_size = n; + memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS), n); + pStat->m_comment[n] = '\0'; + return MZ_TRUE; + } + + mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size) { + mz_uint n; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + if (!p) { + if (filename_buf_size) { + pFilename[0] = '\0'; + } + return 0; + } + n = MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS); + if (filename_buf_size) { + n = MZ_MIN(n, filename_buf_size - 1); + memcpy(pFilename, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n); + pFilename[n] = '\0'; + } + return n + 1; + } + + static MZ_FORCEINLINE mz_bool mz_zip_reader_string_equal(const char *pA, const char *pB, mz_uint len, mz_uint flags) { + mz_uint i; + if (flags & MZ_ZIP_FLAG_CASE_SENSITIVE) { + return 0 == memcmp(pA, pB, len); + } + for (i = 0; i < len; ++i) + if (MZ_TOLOWER(pA[i]) != MZ_TOLOWER(pB[i])) { + return MZ_FALSE; + } + return MZ_TRUE; + } + + static MZ_FORCEINLINE int mz_zip_reader_filename_compare(const mz_zip_array *pCentral_dir_array, const mz_zip_array *pCentral_dir_offsets, mz_uint l_index, const char *pR, mz_uint r_len) { + const mz_uint8 *pL = &MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_array, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(pCentral_dir_offsets, mz_uint32, l_index)), *pE; + mz_uint l_len = MZ_READ_LE16(pL + MZ_ZIP_CDH_FILENAME_LEN_OFS); + mz_uint8 l = 0, r = 0; + pL += MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + pE = pL + MZ_MIN(l_len, r_len); + while (pL < pE) { + if ((l = MZ_TOLOWER(*pL)) != (r = MZ_TOLOWER(*pR))) { + break; + } + pL++; + pR++; + } + return (pL == pE) ? (int)(l_len - r_len) : (l - r); + } + + static int mz_zip_reader_locate_file_binary_search(mz_zip_archive *pZip, const char *pFilename) { + mz_zip_internal_state *pState = pZip->m_pState; + const mz_zip_array *pCentral_dir_offsets = &pState->m_central_dir_offsets; + const mz_zip_array *pCentral_dir = &pState->m_central_dir; + mz_uint32 *pIndices = &MZ_ZIP_ARRAY_ELEMENT(&pState->m_sorted_central_dir_offsets, mz_uint32, 0); + const int size = pZip->m_total_files; + const mz_uint filename_len = (mz_uint)strlen(pFilename); + int l = 0, h = size - 1; + while (l <= h) { + int m = (l + h) >> 1, file_index = pIndices[m], comp = mz_zip_reader_filename_compare(pCentral_dir, pCentral_dir_offsets, file_index, pFilename, filename_len); + if (!comp) { + return file_index; + } else if (comp < 0) { + l = m + 1; + } else { + h = m - 1; + } + } + return -1; + } + + int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags) { + mz_uint file_index; + size_t name_len, comment_len; + if ((!pZip) || (!pZip->m_pState) || (!pName) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) { + return -1; + } + if (((flags & (MZ_ZIP_FLAG_IGNORE_PATH | MZ_ZIP_FLAG_CASE_SENSITIVE)) == 0) && (!pComment) && (pZip->m_pState->m_sorted_central_dir_offsets.m_size)) { + return mz_zip_reader_locate_file_binary_search(pZip, pName); + } + name_len = strlen(pName); + if (name_len > 0xFFFF) { + return -1; + } + comment_len = pComment ? strlen(pComment) : 0; + if (comment_len > 0xFFFF) { + return -1; + } + for (file_index = 0; file_index < pZip->m_total_files; file_index++) { + const mz_uint8 *pHeader = &MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir, mz_uint8, MZ_ZIP_ARRAY_ELEMENT(&pZip->m_pState->m_central_dir_offsets, mz_uint32, file_index)); + mz_uint filename_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_FILENAME_LEN_OFS); + const char *pFilename = (const char *)pHeader + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE; + if (filename_len < name_len) { + continue; + } + if (comment_len) { + mz_uint file_extra_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_EXTRA_LEN_OFS), file_comment_len = MZ_READ_LE16(pHeader + MZ_ZIP_CDH_COMMENT_LEN_OFS); + const char *pFile_comment = pFilename + filename_len + file_extra_len; + if ((file_comment_len != comment_len) || (!mz_zip_reader_string_equal(pComment, pFile_comment, file_comment_len, flags))) { + continue; + } + } + if ((flags & MZ_ZIP_FLAG_IGNORE_PATH) && (filename_len)) { + int ofs = filename_len - 1; + do { + if ((pFilename[ofs] == '/') || (pFilename[ofs] == '\\') || (pFilename[ofs] == ':')) { + break; + } + } while (--ofs >= 0); + ofs++; + pFilename += ofs; + filename_len -= ofs; + } + if ((filename_len == name_len) && (mz_zip_reader_string_equal(pName, pFilename, filename_len, flags))) { + return file_index; + } + } + return -1; + } + + mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) { + int status = TINFL_STATUS_DONE; + mz_uint64 needed_size, cur_file_ofs, comp_remaining, out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail; + mz_zip_archive_file_stat file_stat; + void *pRead_buf; + mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; + mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + tinfl_decompressor inflator; + if ((buf_size) && (!pBuf)) { + return MZ_FALSE; + } + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) { + return MZ_FALSE; + } + // Empty file, or a directory (but not always a directory - I've seen odd zips with directories that have compressed data which inflates to 0 bytes) + if (!file_stat.m_comp_size) { + return MZ_TRUE; + } + // Entry is a subdirectory (I've seen old zips with dir entries which have compressed deflate data which inflates to 0 bytes, but these entries claim to uncompress to 512 bytes in the headers). + // I'm torn how to handle this case - should it fail instead? + if (mz_zip_reader_is_file_a_directory(pZip, file_index)) { + return MZ_TRUE; + } + // Encryption and patch files are not supported. + if (file_stat.m_bit_flag & (1 | 32)) { + return MZ_FALSE; + } + // This function only supports stored and deflate. + if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED)) { + return MZ_FALSE; + } + // Ensure supplied output buffer is large enough. + needed_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? file_stat.m_comp_size : file_stat.m_uncomp_size; + if (buf_size < needed_size) { + return MZ_FALSE; + } + // Read and parse the local directory entry. + cur_file_ofs = file_stat.m_local_header_ofs; + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) { + return MZ_FALSE; + } + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) { + return MZ_FALSE; + } + cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) { + return MZ_FALSE; + } + if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) { + // The file is stored or the caller has requested the compressed data. + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pBuf, (size_t)needed_size) != needed_size) { + return MZ_FALSE; + } + return ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) != 0) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) == file_stat.m_crc32); + } + // Decompress the file either directly from memory or from a file input buffer. + tinfl_init(&inflator); + if (pZip->m_pState->m_pMem) { + // Read directly from the archive in memory. + pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; + read_buf_size = read_buf_avail = file_stat.m_comp_size; + comp_remaining = 0; + } else if (pUser_read_buf) { + // Use a user provided read buffer. + if (!user_read_buf_size) { + return MZ_FALSE; + } + pRead_buf = (mz_uint8 *)pUser_read_buf; + read_buf_size = user_read_buf_size; + read_buf_avail = 0; + comp_remaining = file_stat.m_comp_size; + } else { + // Temporarily allocate a read buffer. + read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE); +#ifdef _MSC_VER + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF)) +#else + if (((sizeof(size_t) == sizeof(mz_uint32))) && (read_buf_size > 0x7FFFFFFF)) +#endif + return MZ_FALSE; + if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size))) { + return MZ_FALSE; + } + read_buf_avail = 0; + comp_remaining = file_stat.m_comp_size; + } + do { + size_t in_buf_size, out_buf_size = (size_t)(file_stat.m_uncomp_size - out_buf_ofs); + if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + read_buf_ofs = 0; + } + in_buf_size = (size_t)read_buf_avail; + status = tinfl_decompress(&inflator, (mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pBuf, (mz_uint8 *)pBuf + out_buf_ofs, &out_buf_size, TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF | (comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0)); + read_buf_avail -= in_buf_size; + read_buf_ofs += in_buf_size; + out_buf_ofs += out_buf_size; + } while (status == TINFL_STATUS_NEEDS_MORE_INPUT); + if (status == TINFL_STATUS_DONE) { + // Make sure the entire file was decompressed, and check its CRC. + if ((out_buf_ofs != file_stat.m_uncomp_size) || (mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, (size_t)file_stat.m_uncomp_size) != file_stat.m_crc32)) { + status = TINFL_STATUS_FAILED; + } + } + if ((!pZip->m_pState->m_pMem) && (!pUser_read_buf)) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + } + return status == TINFL_STATUS_DONE; + } + + mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size) { + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) { + return MZ_FALSE; + } + return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, pUser_read_buf, user_read_buf_size); + } + + mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags) { + return mz_zip_reader_extract_to_mem_no_alloc(pZip, file_index, pBuf, buf_size, flags, NULL, 0); + } + + mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags) { + return mz_zip_reader_extract_file_to_mem_no_alloc(pZip, pFilename, pBuf, buf_size, flags, NULL, 0); + } + + void *mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags) { + mz_uint64 comp_size, uncomp_size, alloc_size; + const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index); + void *pBuf; + if (pSize) { + *pSize = 0; + } + if (!p) { + return NULL; + } + comp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + uncomp_size = MZ_READ_LE32(p + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS); + alloc_size = (flags & MZ_ZIP_FLAG_COMPRESSED_DATA) ? comp_size : uncomp_size; +#ifdef _MSC_VER + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF)) +#else + if (((sizeof(size_t) == sizeof(mz_uint32))) && (alloc_size > 0x7FFFFFFF)) +#endif + return NULL; + if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)alloc_size))) { + return NULL; + } + if (!mz_zip_reader_extract_to_mem(pZip, file_index, pBuf, (size_t)alloc_size, flags)) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return NULL; + } + if (pSize) { + *pSize = (size_t)alloc_size; + } + return pBuf; + } + + void *mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags) { + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) { + if (pSize) { + *pSize = 0; + } + return MZ_FALSE; + } + return mz_zip_reader_extract_to_heap(pZip, file_index, pSize, flags); + } + + mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags) { + int status = TINFL_STATUS_DONE; + mz_uint file_crc32 = MZ_CRC32_INIT; + mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining, out_buf_ofs = 0, cur_file_ofs; + mz_zip_archive_file_stat file_stat; + void *pRead_buf = NULL; + void *pWrite_buf = NULL; + mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; + mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) { + return MZ_FALSE; + } + // Empty file, or a directory (but not always a directory - I've seen odd zips with directories that have compressed data which inflates to 0 bytes) + if (!file_stat.m_comp_size) { + return MZ_TRUE; + } + // Entry is a subdirectory (I've seen old zips with dir entries which have compressed deflate data which inflates to 0 bytes, but these entries claim to uncompress to 512 bytes in the headers). + // I'm torn how to handle this case - should it fail instead? + if (mz_zip_reader_is_file_a_directory(pZip, file_index)) { + return MZ_TRUE; + } + // Encryption and patch files are not supported. + if (file_stat.m_bit_flag & (1 | 32)) { + return MZ_FALSE; + } + // This function only supports stored and deflate. + if ((!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (file_stat.m_method != 0) && (file_stat.m_method != MZ_DEFLATED)) { + return MZ_FALSE; + } + // Read and parse the local directory entry. + cur_file_ofs = file_stat.m_local_header_ofs; + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) { + return MZ_FALSE; + } + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) { + return MZ_FALSE; + } + cur_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + if ((cur_file_ofs + file_stat.m_comp_size) > pZip->m_archive_size) { + return MZ_FALSE; + } + // Decompress the file either directly from memory or from a file input buffer. + if (pZip->m_pState->m_pMem) { + pRead_buf = (mz_uint8 *)pZip->m_pState->m_pMem + cur_file_ofs; + read_buf_size = read_buf_avail = file_stat.m_comp_size; + comp_remaining = 0; + } else { + read_buf_size = MZ_MIN(file_stat.m_comp_size, MZ_ZIP_MAX_IO_BUF_SIZE); + if (NULL == (pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)read_buf_size))) { + return MZ_FALSE; + } + read_buf_avail = 0; + comp_remaining = file_stat.m_comp_size; + } + if ((flags & MZ_ZIP_FLAG_COMPRESSED_DATA) || (!file_stat.m_method)) { + // The file is stored or the caller has requested the compressed data. + if (pZip->m_pState->m_pMem) { +#ifdef _MSC_VER + if (((0, sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF)) +#else + if (((sizeof(size_t) == sizeof(mz_uint32))) && (file_stat.m_comp_size > 0xFFFFFFFF)) +#endif + return MZ_FALSE; + if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)file_stat.m_comp_size) != file_stat.m_comp_size) { + status = TINFL_STATUS_FAILED; + } else if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) { + file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)file_stat.m_comp_size); + } + //cur_file_ofs += file_stat.m_comp_size; + out_buf_ofs += file_stat.m_comp_size; + //comp_remaining = 0; + } else { + while (comp_remaining) { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) { + status = TINFL_STATUS_FAILED; + break; + } + if (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) { + file_crc32 = (mz_uint32)mz_crc32(file_crc32, (const mz_uint8 *)pRead_buf, (size_t)read_buf_avail); + } + if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + out_buf_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + } + } + } else { + tinfl_decompressor inflator; + tinfl_init(&inflator); + if (NULL == (pWrite_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, TINFL_LZ_DICT_SIZE))) { + status = TINFL_STATUS_FAILED; + } else { + do { + mz_uint8 *pWrite_buf_cur = (mz_uint8 *)pWrite_buf + (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); + size_t in_buf_size, out_buf_size = TINFL_LZ_DICT_SIZE - (out_buf_ofs & (TINFL_LZ_DICT_SIZE - 1)); + if ((!read_buf_avail) && (!pZip->m_pState->m_pMem)) { + read_buf_avail = MZ_MIN(read_buf_size, comp_remaining); + if (pZip->m_pRead(pZip->m_pIO_opaque, cur_file_ofs, pRead_buf, (size_t)read_buf_avail) != read_buf_avail) { + status = TINFL_STATUS_FAILED; + break; + } + cur_file_ofs += read_buf_avail; + comp_remaining -= read_buf_avail; + read_buf_ofs = 0; + } + in_buf_size = (size_t)read_buf_avail; + status = tinfl_decompress(&inflator, (const mz_uint8 *)pRead_buf + read_buf_ofs, &in_buf_size, (mz_uint8 *)pWrite_buf, pWrite_buf_cur, &out_buf_size, comp_remaining ? TINFL_FLAG_HAS_MORE_INPUT : 0); + read_buf_avail -= in_buf_size; + read_buf_ofs += in_buf_size; + if (out_buf_size) { + if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) != out_buf_size) { + status = TINFL_STATUS_FAILED; + break; + } + file_crc32 = (mz_uint32)mz_crc32(file_crc32, pWrite_buf_cur, out_buf_size); + if ((out_buf_ofs += out_buf_size) > file_stat.m_uncomp_size) { + status = TINFL_STATUS_FAILED; + break; + } + } + } while ((status == TINFL_STATUS_NEEDS_MORE_INPUT) || (status == TINFL_STATUS_HAS_MORE_OUTPUT)); + } + } + if ((status == TINFL_STATUS_DONE) && (!(flags & MZ_ZIP_FLAG_COMPRESSED_DATA))) { + // Make sure the entire file was decompressed, and check its CRC. + if ((out_buf_ofs != file_stat.m_uncomp_size) || (file_crc32 != file_stat.m_crc32)) { + status = TINFL_STATUS_FAILED; + } + } + if (!pZip->m_pState->m_pMem) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + } + if (pWrite_buf) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pWrite_buf); + } + return status == TINFL_STATUS_DONE; + } + + mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags) { + int file_index = mz_zip_reader_locate_file(pZip, pFilename, NULL, flags); + if (file_index < 0) { + return MZ_FALSE; + } + return mz_zip_reader_extract_to_callback(pZip, file_index, pCallback, pOpaque, flags); + } + +#ifndef MINIZ_NO_STDIO + static size_t mz_zip_file_write_callback(void *pOpaque, mz_uint64 ofs, const void *pBuf, size_t n) { + (void)ofs; + return MZ_FWRITE(pBuf, 1, n, (MZ_FILE *)pOpaque); + } + + mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags) { + mz_bool status; + mz_zip_archive_file_stat file_stat; + MZ_FILE *pFile; + if (!mz_zip_reader_file_stat(pZip, file_index, &file_stat)) { + return MZ_FALSE; + } + pFile = MZ_FOPEN(pDst_filename, "wb"); + if (!pFile) { + return MZ_FALSE; + } + status = mz_zip_reader_extract_to_callback(pZip, file_index, mz_zip_file_write_callback, pFile, flags); + if (MZ_FCLOSE(pFile) == EOF) { + return MZ_FALSE; + } +#ifndef MINIZ_NO_TIME + if (status) { + mz_zip_set_file_times(pDst_filename, file_stat.m_time, file_stat.m_time); + } +#endif + return status; + } +#endif // #ifndef MINIZ_NO_STDIO + + mz_bool mz_zip_reader_end(mz_zip_archive *pZip) { + if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) { + return MZ_FALSE; + } + if (pZip->m_pState) { + mz_zip_internal_state *pState = pZip->m_pState; + pZip->m_pState = NULL; + mz_zip_array_clear(pZip, &pState->m_central_dir); + mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); + mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); +#ifndef MINIZ_NO_STDIO + if (pState->m_pFile) { + MZ_FCLOSE(pState->m_pFile); + pState->m_pFile = NULL; + } +#endif // #ifndef MINIZ_NO_STDIO + pZip->m_pFree(pZip->m_pAlloc_opaque, pState); + } + pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; + return MZ_TRUE; + } + +#ifndef MINIZ_NO_STDIO + mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags) { + int file_index = mz_zip_reader_locate_file(pZip, pArchive_filename, NULL, flags); + if (file_index < 0) { + return MZ_FALSE; + } + return mz_zip_reader_extract_to_file(pZip, file_index, pDst_filename, flags); + } +#endif + + // ------------------- .ZIP archive writing + +#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + + static void mz_write_le16(mz_uint8 *p, mz_uint16 v) { + p[0] = (mz_uint8)v; + p[1] = (mz_uint8)(v >> 8); + } + static void mz_write_le32(mz_uint8 *p, mz_uint32 v) { + p[0] = (mz_uint8)v; + p[1] = (mz_uint8)(v >> 8); + p[2] = (mz_uint8)(v >> 16); + p[3] = (mz_uint8)(v >> 24); + } +#define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v)) +#define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v)) + + mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size) { + if ((!pZip) || (pZip->m_pState) || (!pZip->m_pWrite) || (pZip->m_zip_mode != MZ_ZIP_MODE_INVALID)) { + return MZ_FALSE; + } + if (pZip->m_file_offset_alignment) { + // Ensure user specified file offset alignment is a power of 2. + if (pZip->m_file_offset_alignment & (pZip->m_file_offset_alignment - 1)) { + return MZ_FALSE; + } + } + if (!pZip->m_pAlloc) { + pZip->m_pAlloc = def_alloc_func; + } + if (!pZip->m_pFree) { + pZip->m_pFree = def_free_func; + } + if (!pZip->m_pRealloc) { + pZip->m_pRealloc = def_realloc_func; + } + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; + pZip->m_archive_size = existing_size; + pZip->m_central_directory_file_ofs = 0; + pZip->m_total_files = 0; + if (NULL == (pZip->m_pState = (mz_zip_internal_state *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(mz_zip_internal_state)))) { + return MZ_FALSE; + } + memset(pZip->m_pState, 0, sizeof(mz_zip_internal_state)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir, sizeof(mz_uint8)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_central_dir_offsets, sizeof(mz_uint32)); + MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(&pZip->m_pState->m_sorted_central_dir_offsets, sizeof(mz_uint32)); + return MZ_TRUE; + } + + static size_t mz_zip_heap_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n) { + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_zip_internal_state *pState = pZip->m_pState; + mz_uint64 new_size = MZ_MAX(file_ofs + n, pState->m_mem_size); +#ifdef _MSC_VER + if ((!n) || ((0, sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF))) +#else + if ((!n) || ((sizeof(size_t) == sizeof(mz_uint32)) && (new_size > 0x7FFFFFFF))) +#endif + return 0; + if (new_size > pState->m_mem_capacity) { + void *pNew_block; + size_t new_capacity = MZ_MAX(64, pState->m_mem_capacity); + while (new_capacity < new_size) { + new_capacity *= 2; + } + if (NULL == (pNew_block = pZip->m_pRealloc(pZip->m_pAlloc_opaque, pState->m_pMem, 1, new_capacity))) { + return 0; + } + pState->m_pMem = pNew_block; + pState->m_mem_capacity = new_capacity; + } + memcpy((mz_uint8 *)pState->m_pMem + file_ofs, pBuf, n); + pState->m_mem_size = (size_t)new_size; + return n; + } + + mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size) { + pZip->m_pWrite = mz_zip_heap_write_func; + pZip->m_pIO_opaque = pZip; + if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) { + return MZ_FALSE; + } + if (0 != (initial_allocation_size = MZ_MAX(initial_allocation_size, size_to_reserve_at_beginning))) { + if (NULL == (pZip->m_pState->m_pMem = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, initial_allocation_size))) { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + pZip->m_pState->m_mem_capacity = initial_allocation_size; + } + return MZ_TRUE; + } + +#ifndef MINIZ_NO_STDIO + static size_t mz_zip_file_write_func(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n) { + mz_zip_archive *pZip = (mz_zip_archive *)pOpaque; + mz_int64 cur_ofs = MZ_FTELL64(pZip->m_pState->m_pFile); + if (((mz_int64)file_ofs < 0) || (((cur_ofs != (mz_int64)file_ofs)) && (MZ_FSEEK64(pZip->m_pState->m_pFile, (mz_int64)file_ofs, SEEK_SET)))) { + return 0; + } + return MZ_FWRITE(pBuf, 1, n, pZip->m_pState->m_pFile); + } + + mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning) { + MZ_FILE *pFile; + pZip->m_pWrite = mz_zip_file_write_func; + pZip->m_pIO_opaque = pZip; + if (!mz_zip_writer_init(pZip, size_to_reserve_at_beginning)) { + return MZ_FALSE; + } + if (NULL == (pFile = MZ_FOPEN(pFilename, "wb"))) { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + pZip->m_pState->m_pFile = pFile; + if (size_to_reserve_at_beginning) { + mz_uint64 cur_ofs = 0; + char buf[4096]; + MZ_CLEAR_OBJ(buf); + do { + size_t n = (size_t)MZ_MIN(sizeof(buf), size_to_reserve_at_beginning); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_ofs, buf, n) != n) { + mz_zip_writer_end(pZip); + return MZ_FALSE; + } + cur_ofs += n; + size_to_reserve_at_beginning -= n; + } while (size_to_reserve_at_beginning); + } + return MZ_TRUE; + } +#endif // #ifndef MINIZ_NO_STDIO + + mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename) { + mz_zip_internal_state *pState; + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_READING)) { + return MZ_FALSE; + } + // No sense in trying to write to an archive that's already at the support max size + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + MZ_ZIP_LOCAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) { + return MZ_FALSE; + } + pState = pZip->m_pState; + if (pState->m_pFile) { +#ifdef MINIZ_NO_STDIO + pFilename; + return MZ_FALSE; +#else + // Archive is being read from stdio - try to reopen as writable. + if (pZip->m_pIO_opaque != pZip) { + return MZ_FALSE; + } + if (!pFilename) { + return MZ_FALSE; + } + pZip->m_pWrite = mz_zip_file_write_func; + if (NULL == (pState->m_pFile = MZ_FREOPEN(pFilename, "r+b", pState->m_pFile))) { + // The mz_zip_archive is now in a bogus state because pState->m_pFile is NULL, so just close it. + mz_zip_reader_end(pZip); + return MZ_FALSE; + } +#endif // #ifdef MINIZ_NO_STDIO + } else if (pState->m_pMem) { + // Archive lives in a memory block. Assume it's from the heap that we can resize using the realloc callback. + if (pZip->m_pIO_opaque != pZip) { + return MZ_FALSE; + } + pState->m_mem_capacity = pState->m_mem_size; + pZip->m_pWrite = mz_zip_heap_write_func; + } + // Archive is being read via a user provided read function - make sure the user has specified a write function too. + else if (!pZip->m_pWrite) { + return MZ_FALSE; + } + // Start writing new files at the archive's current central directory location. + pZip->m_archive_size = pZip->m_central_directory_file_ofs; + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING; + pZip->m_central_directory_file_ofs = 0; + return MZ_TRUE; + } + + mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags) { + return mz_zip_writer_add_mem_ex(pZip, pArchive_name, pBuf, buf_size, NULL, 0, level_and_flags, 0, 0); + } + + typedef struct { + mz_zip_archive *m_pZip; + mz_uint64 m_cur_archive_file_ofs; + mz_uint64 m_comp_size; + } mz_zip_writer_add_state; + + static mz_bool mz_zip_writer_add_put_buf_callback(const void *pBuf, int len, void *pUser) { + mz_zip_writer_add_state *pState = (mz_zip_writer_add_state *)pUser; + if ((int)pState->m_pZip->m_pWrite(pState->m_pZip->m_pIO_opaque, pState->m_cur_archive_file_ofs, pBuf, len) != len) { + return MZ_FALSE; + } + pState->m_cur_archive_file_ofs += len; + pState->m_comp_size += len; + return MZ_TRUE; + } + + static mz_bool mz_zip_writer_create_local_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date) { + (void)pZip; + memset(pDst, 0, MZ_ZIP_LOCAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_SIG_OFS, MZ_ZIP_LOCAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_VERSION_NEEDED_OFS, method ? 20 : 0); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_BIT_FLAG_OFS, bit_flags); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_METHOD_OFS, method); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_TIME_OFS, dos_time); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILE_DATE_OFS, dos_date); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_CRC32_OFS, uncomp_crc32); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_COMPRESSED_SIZE_OFS, comp_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS, uncomp_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_FILENAME_LEN_OFS, filename_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_LDH_EXTRA_LEN_OFS, extra_size); + return MZ_TRUE; + } + + static mz_bool mz_zip_writer_create_central_dir_header(mz_zip_archive *pZip, mz_uint8 *pDst, mz_uint16 filename_size, mz_uint16 extra_size, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes) { + (void)pZip; + memset(pDst, 0, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_SIG_OFS, MZ_ZIP_CENTRAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_VERSION_NEEDED_OFS, method ? 20 : 0); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_BIT_FLAG_OFS, bit_flags); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_METHOD_OFS, method); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_TIME_OFS, dos_time); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILE_DATE_OFS, dos_date); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_CRC32_OFS, uncomp_crc32); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS, comp_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS, uncomp_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_FILENAME_LEN_OFS, filename_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_EXTRA_LEN_OFS, extra_size); + MZ_WRITE_LE16(pDst + MZ_ZIP_CDH_COMMENT_LEN_OFS, comment_size); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_EXTERNAL_ATTR_OFS, ext_attributes); + MZ_WRITE_LE32(pDst + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_header_ofs); + return MZ_TRUE; + } + + static mz_bool mz_zip_writer_add_to_central_dir(mz_zip_archive *pZip, const char *pFilename, mz_uint16 filename_size, const void *pExtra, mz_uint16 extra_size, const void *pComment, mz_uint16 comment_size, mz_uint64 uncomp_size, mz_uint64 comp_size, mz_uint32 uncomp_crc32, mz_uint16 method, mz_uint16 bit_flags, mz_uint16 dos_time, mz_uint16 dos_date, mz_uint64 local_header_ofs, mz_uint32 ext_attributes) { + mz_zip_internal_state *pState = pZip->m_pState; + mz_uint32 central_dir_ofs = (mz_uint32)pState->m_central_dir.m_size; + size_t orig_central_dir_size = pState->m_central_dir.m_size; + mz_uint8 central_dir_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; + // No zip64 support yet + if ((local_header_ofs > 0xFFFFFFFF) || (((mz_uint64)pState->m_central_dir.m_size + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + filename_size + extra_size + comment_size) > 0xFFFFFFFF)) { + return MZ_FALSE; + } + if (!mz_zip_writer_create_central_dir_header(pZip, central_dir_header, filename_size, extra_size, comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_header_ofs, ext_attributes)) { + return MZ_FALSE; + } + if ((!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_dir_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pFilename, filename_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pExtra, extra_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pComment, comment_size)) || + (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, ¢ral_dir_ofs, 1))) { + // Try to push the central directory array back into its original state. + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); + return MZ_FALSE; + } + return MZ_TRUE; + } + + static mz_bool mz_zip_writer_validate_archive_name(const char *pArchive_name) { + // Basic ZIP archive filename validity checks: Valid filenames cannot start with a forward slash, cannot contain a drive letter, and cannot use DOS-style backward slashes. + if (*pArchive_name == '/') { + return MZ_FALSE; + } + while (*pArchive_name) { + if ((*pArchive_name == '\\') || (*pArchive_name == ':')) { + return MZ_FALSE; + } + pArchive_name++; + } + return MZ_TRUE; + } + + static mz_uint mz_zip_writer_compute_padding_needed_for_file_alignment(mz_zip_archive *pZip) { + mz_uint32 n; + if (!pZip->m_file_offset_alignment) { + return 0; + } + n = (mz_uint32)(pZip->m_archive_size & (pZip->m_file_offset_alignment - 1)); + return (pZip->m_file_offset_alignment - n) & (pZip->m_file_offset_alignment - 1); + } + + static mz_bool mz_zip_writer_write_zeros(mz_zip_archive *pZip, mz_uint64 cur_file_ofs, mz_uint32 n) { + char buf[4096]; + memset(buf, 0, MZ_MIN(sizeof(buf), n)); + while (n) { + mz_uint32 s = MZ_MIN(sizeof(buf), n); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_file_ofs, buf, s) != s) { + return MZ_FALSE; + } + cur_file_ofs += s; + n -= s; + } + return MZ_TRUE; + } + + mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32) { + if (!pZip) { + return MZ_FALSE; + } + mz_uint16 method = 0, dos_time = 0, dos_date = 0; + mz_uint level, ext_attributes = 0, num_alignment_padding_bytes; + mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, comp_size = 0; + size_t archive_name_size; + mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; + tdefl_compressor *pComp = NULL; + mz_bool store_data_uncompressed; + mz_zip_internal_state *pState; + if ((int)level_and_flags < 0) { + level_and_flags = MZ_DEFAULT_LEVEL; + } + level = level_and_flags & 0xF; + store_data_uncompressed = ((!level) || (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)); + if ((!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || ((buf_size) && (!pBuf)) || (!pArchive_name) || ((comment_size) && (!pComment)) || (pZip->m_total_files == 0xFFFF) || (level > MZ_UBER_COMPRESSION)) { + return MZ_FALSE; + } + pState = pZip->m_pState; + if ((!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) && (uncomp_size)) { + return MZ_FALSE; + } + // No zip64 support yet + if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF)) { + return MZ_FALSE; + } + if (!mz_zip_writer_validate_archive_name(pArchive_name)) { + return MZ_FALSE; + } +#ifndef MINIZ_NO_TIME + { + time_t cur_time; + time(&cur_time); + mz_zip_time_to_dos_time(cur_time, &dos_time, &dos_date); + } +#endif // #ifndef MINIZ_NO_TIME + archive_name_size = strlen(pArchive_name); + if (archive_name_size > 0xFFFF) { + return MZ_FALSE; + } + num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF)) { + return MZ_FALSE; + } + if ((archive_name_size) && (pArchive_name[archive_name_size - 1] == '/')) { + // Set DOS Subdirectory attribute bit. + ext_attributes |= 0x10; + // Subdirectories cannot contain data. + if ((buf_size) || (uncomp_size)) { + return MZ_FALSE; + } + } + // Try to do any allocations before writing to the archive, so if an allocation fails the file remains unmodified. (A good idea if we're doing an in-place modification.) + if ((!mz_zip_array_ensure_room(pZip, &pState->m_central_dir, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + archive_name_size + comment_size)) || (!mz_zip_array_ensure_room(pZip, &pState->m_central_dir_offsets, 1))) { + return MZ_FALSE; + } + if ((!store_data_uncompressed) && (buf_size)) { + if (NULL == (pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)))) { + return MZ_FALSE; + } + } + if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header))) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + local_dir_header_ofs += num_alignment_padding_bytes; + if (pZip->m_file_offset_alignment) { + MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); + } + cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header); + MZ_CLEAR_OBJ(local_dir_header); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + cur_archive_file_ofs += archive_name_size; + if (!(level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA)) { + uncomp_crc32 = (mz_uint32)mz_crc32(MZ_CRC32_INIT, (const mz_uint8 *)pBuf, buf_size); + uncomp_size = buf_size; + if (uncomp_size <= 3) { + level = 0; + store_data_uncompressed = MZ_TRUE; + } + } + if (store_data_uncompressed) { + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pBuf, buf_size) != buf_size) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + cur_archive_file_ofs += buf_size; + comp_size = buf_size; + if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) { + method = MZ_DEFLATED; + } + } else if (buf_size) { + mz_zip_writer_add_state state; + state.m_pZip = pZip; + state.m_cur_archive_file_ofs = cur_archive_file_ofs; + state.m_comp_size = 0; + if ((tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) || + (tdefl_compress_buffer(pComp, pBuf, buf_size, TDEFL_FINISH) != TDEFL_STATUS_DONE)) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + return MZ_FALSE; + } + comp_size = state.m_comp_size; + cur_archive_file_ofs = state.m_cur_archive_file_ofs; + method = MZ_DEFLATED; + } + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + pComp = NULL; + // no zip64 support yet + if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF)) { + return MZ_FALSE; + } + if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date)) { + return MZ_FALSE; + } + if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) { + return MZ_FALSE; + } + if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes)) { + return MZ_FALSE; + } + pZip->m_total_files++; + pZip->m_archive_size = cur_archive_file_ofs; + return MZ_TRUE; + } + +#ifndef MINIZ_NO_STDIO + mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags) { + if (!pZip) { + return MZ_FALSE; + } + mz_uint uncomp_crc32 = MZ_CRC32_INIT, level, num_alignment_padding_bytes; + mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0; + mz_uint64 local_dir_header_ofs = pZip->m_archive_size, cur_archive_file_ofs = pZip->m_archive_size, uncomp_size = 0, comp_size = 0; + size_t archive_name_size; + mz_uint8 local_dir_header[MZ_ZIP_LOCAL_DIR_HEADER_SIZE]; + MZ_FILE *pSrc_file = NULL; + if ((int)level_and_flags < 0) { + level_and_flags = MZ_DEFAULT_LEVEL; + } + level = level_and_flags & 0xF; + if ((!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) || (!pArchive_name) || ((comment_size) && (!pComment)) || (level > MZ_UBER_COMPRESSION)) { + return MZ_FALSE; + } + if (level_and_flags & MZ_ZIP_FLAG_COMPRESSED_DATA) { + return MZ_FALSE; + } + if (!mz_zip_writer_validate_archive_name(pArchive_name)) { + return MZ_FALSE; + } + archive_name_size = strlen(pArchive_name); + if (archive_name_size > 0xFFFF) { + return MZ_FALSE; + } + num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE + comment_size + archive_name_size) > 0xFFFFFFFF)) { + return MZ_FALSE; + } + if (!mz_zip_get_file_modified_time(pSrc_filename, &dos_time, &dos_date)) { + return MZ_FALSE; + } + pSrc_file = MZ_FOPEN(pSrc_filename, "rb"); + if (!pSrc_file) { + return MZ_FALSE; + } + MZ_FSEEK64(pSrc_file, 0, SEEK_END); + uncomp_size = MZ_FTELL64(pSrc_file); + MZ_FSEEK64(pSrc_file, 0, SEEK_SET); + if (uncomp_size > 0xFFFFFFFF) { + // No zip64 support yet + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + if (uncomp_size <= 3) { + level = 0; + } + if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes + sizeof(local_dir_header))) { + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + local_dir_header_ofs += num_alignment_padding_bytes; + if (pZip->m_file_offset_alignment) { + MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); + } + cur_archive_file_ofs += num_alignment_padding_bytes + sizeof(local_dir_header); + MZ_CLEAR_OBJ(local_dir_header); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size) { + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + cur_archive_file_ofs += archive_name_size; + if (uncomp_size) { + mz_uint64 uncomp_remaining = uncomp_size; + void *pRead_buf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, MZ_ZIP_MAX_IO_BUF_SIZE); + if (!pRead_buf) { + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + if (!level) { + while (uncomp_remaining) { + mz_uint n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, uncomp_remaining); + if ((MZ_FREAD(pRead_buf, 1, n, pSrc_file) != n) || (pZip->m_pWrite(pZip->m_pIO_opaque, cur_archive_file_ofs, pRead_buf, n) != n)) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, n); + uncomp_remaining -= n; + cur_archive_file_ofs += n; + } + comp_size = uncomp_size; + } else { + mz_bool result = MZ_FALSE; + mz_zip_writer_add_state state; + tdefl_compressor *pComp = (tdefl_compressor *)pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, sizeof(tdefl_compressor)); + if (!pComp) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + state.m_pZip = pZip; + state.m_cur_archive_file_ofs = cur_archive_file_ofs; + state.m_comp_size = 0; + if (tdefl_init(pComp, mz_zip_writer_add_put_buf_callback, &state, tdefl_create_comp_flags_from_zip_params(level, -15, MZ_DEFAULT_STRATEGY)) != TDEFL_STATUS_OKAY) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + for ( ; ; ) { + size_t in_buf_size = (mz_uint32)MZ_MIN(uncomp_remaining, MZ_ZIP_MAX_IO_BUF_SIZE); + tdefl_status status; + if (MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size) { + break; + } + uncomp_crc32 = (mz_uint32)mz_crc32(uncomp_crc32, (const mz_uint8 *)pRead_buf, in_buf_size); + uncomp_remaining -= in_buf_size; + status = tdefl_compress_buffer(pComp, pRead_buf, in_buf_size, uncomp_remaining ? TDEFL_NO_FLUSH : TDEFL_FINISH); + if (status == TDEFL_STATUS_DONE) { + result = MZ_TRUE; + break; + } else if (status != TDEFL_STATUS_OKAY) { + break; + } + } + pZip->m_pFree(pZip->m_pAlloc_opaque, pComp); + if (!result) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + MZ_FCLOSE(pSrc_file); + return MZ_FALSE; + } + comp_size = state.m_comp_size; + cur_archive_file_ofs = state.m_cur_archive_file_ofs; + method = MZ_DEFLATED; + } + pZip->m_pFree(pZip->m_pAlloc_opaque, pRead_buf); + } + MZ_FCLOSE(pSrc_file); + pSrc_file = NULL; + // no zip64 support yet + if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF)) { + return MZ_FALSE; + } + if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date)) { + return MZ_FALSE; + } + if (pZip->m_pWrite(pZip->m_pIO_opaque, local_dir_header_ofs, local_dir_header, sizeof(local_dir_header)) != sizeof(local_dir_header)) { + return MZ_FALSE; + } + if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes)) { + return MZ_FALSE; + } + pZip->m_total_files++; + pZip->m_archive_size = cur_archive_file_ofs; + return MZ_TRUE; + } +#endif // #ifndef MINIZ_NO_STDIO + + mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index) { + mz_uint n, bit_flags, num_alignment_padding_bytes; + mz_uint64 comp_bytes_remaining, local_dir_header_ofs; + mz_uint64 cur_src_file_ofs, cur_dst_file_ofs; + mz_uint32 local_header_u32[(MZ_ZIP_LOCAL_DIR_HEADER_SIZE + sizeof(mz_uint32) - 1) / sizeof(mz_uint32)]; + mz_uint8 *pLocal_header = (mz_uint8 *)local_header_u32; + mz_uint8 central_header[MZ_ZIP_CENTRAL_DIR_HEADER_SIZE]; + size_t orig_central_dir_size; + mz_zip_internal_state *pState; + void *pBuf; + const mz_uint8 *pSrc_central_header; + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING)) { + return MZ_FALSE; + } + if (NULL == (pSrc_central_header = mz_zip_reader_get_cdh(pSource_zip, file_index))) { + return MZ_FALSE; + } + pState = pZip->m_pState; + num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip); + // no zip64 support yet + if ((pZip->m_total_files == 0xFFFF) || ((pZip->m_archive_size + num_alignment_padding_bytes + MZ_ZIP_LOCAL_DIR_HEADER_SIZE + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) { + return MZ_FALSE; + } + cur_src_file_ofs = MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS); + cur_dst_file_ofs = pZip->m_archive_size; + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) { + return MZ_FALSE; + } + if (MZ_READ_LE32(pLocal_header) != MZ_ZIP_LOCAL_DIR_HEADER_SIG) { + return MZ_FALSE; + } + cur_src_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; + if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs, num_alignment_padding_bytes)) { + return MZ_FALSE; + } + cur_dst_file_ofs += num_alignment_padding_bytes; + local_dir_header_ofs = cur_dst_file_ofs; + if (pZip->m_file_offset_alignment) { + MZ_ASSERT((local_dir_header_ofs & (pZip->m_file_offset_alignment - 1)) == 0); + } + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pLocal_header, MZ_ZIP_LOCAL_DIR_HEADER_SIZE) != MZ_ZIP_LOCAL_DIR_HEADER_SIZE) { + return MZ_FALSE; + } + cur_dst_file_ofs += MZ_ZIP_LOCAL_DIR_HEADER_SIZE; + n = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_EXTRA_LEN_OFS); + comp_bytes_remaining = n + MZ_READ_LE32(pSrc_central_header + MZ_ZIP_CDH_COMPRESSED_SIZE_OFS); + if (NULL == (pBuf = pZip->m_pAlloc(pZip->m_pAlloc_opaque, 1, (size_t)MZ_MAX(sizeof(mz_uint32) * 4, MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining))))) { + return MZ_FALSE; + } + while (comp_bytes_remaining) { + n = (mz_uint)MZ_MIN(MZ_ZIP_MAX_IO_BUF_SIZE, comp_bytes_remaining); + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, n) != n) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + cur_src_file_ofs += n; + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + cur_dst_file_ofs += n; + comp_bytes_remaining -= n; + } + bit_flags = MZ_READ_LE16(pLocal_header + MZ_ZIP_LDH_BIT_FLAG_OFS); + if (bit_flags & 8) { + // Copy data descriptor + if (pSource_zip->m_pRead(pSource_zip->m_pIO_opaque, cur_src_file_ofs, pBuf, sizeof(mz_uint32) * 4) != sizeof(mz_uint32) * 4) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + n = sizeof(mz_uint32) * ((MZ_READ_LE32(pBuf) == 0x08074b50) ? 4 : 3); + if (pZip->m_pWrite(pZip->m_pIO_opaque, cur_dst_file_ofs, pBuf, n) != n) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + return MZ_FALSE; + } + //cur_src_file_ofs += n; + cur_dst_file_ofs += n; + } + pZip->m_pFree(pZip->m_pAlloc_opaque, pBuf); + // no zip64 support yet + if (cur_dst_file_ofs > 0xFFFFFFFF) { + return MZ_FALSE; + } + orig_central_dir_size = pState->m_central_dir.m_size; + memcpy(central_header, pSrc_central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE); + MZ_WRITE_LE32(central_header + MZ_ZIP_CDH_LOCAL_HEADER_OFS, local_dir_header_ofs); + if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, central_header, MZ_ZIP_CENTRAL_DIR_HEADER_SIZE)) { + return MZ_FALSE; + } + n = MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_FILENAME_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_EXTRA_LEN_OFS) + MZ_READ_LE16(pSrc_central_header + MZ_ZIP_CDH_COMMENT_LEN_OFS); + if (!mz_zip_array_push_back(pZip, &pState->m_central_dir, pSrc_central_header + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE, n)) { + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); + return MZ_FALSE; + } + if (pState->m_central_dir.m_size > 0xFFFFFFFF) { + return MZ_FALSE; + } + n = (mz_uint32)orig_central_dir_size; + if (!mz_zip_array_push_back(pZip, &pState->m_central_dir_offsets, &n, 1)) { + mz_zip_array_resize(pZip, &pState->m_central_dir, orig_central_dir_size, MZ_FALSE); + return MZ_FALSE; + } + pZip->m_total_files++; + pZip->m_archive_size = cur_dst_file_ofs; + return MZ_TRUE; + } + + mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip) { + mz_zip_internal_state *pState; + mz_uint64 central_dir_ofs, central_dir_size; + mz_uint8 hdr[MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE]; + if ((!pZip) || (!pZip->m_pState) || (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING)) { + return MZ_FALSE; + } + pState = pZip->m_pState; + // no zip64 support yet + if ((pZip->m_total_files > 0xFFFF) || ((pZip->m_archive_size + pState->m_central_dir.m_size + MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE) > 0xFFFFFFFF)) { + return MZ_FALSE; + } + central_dir_ofs = 0; + central_dir_size = 0; + if (pZip->m_total_files) { + // Write central directory + central_dir_ofs = pZip->m_archive_size; + central_dir_size = pState->m_central_dir.m_size; + pZip->m_central_directory_file_ofs = central_dir_ofs; + if (pZip->m_pWrite(pZip->m_pIO_opaque, central_dir_ofs, pState->m_central_dir.m_p, (size_t)central_dir_size) != central_dir_size) { + return MZ_FALSE; + } + pZip->m_archive_size += central_dir_size; + } + // Write end of central directory record + MZ_CLEAR_OBJ(hdr); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_SIG_OFS, MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG); + MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS, pZip->m_total_files); + MZ_WRITE_LE16(hdr + MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS, pZip->m_total_files); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_SIZE_OFS, central_dir_size); + MZ_WRITE_LE32(hdr + MZ_ZIP_ECDH_CDIR_OFS_OFS, central_dir_ofs); + if (pZip->m_pWrite(pZip->m_pIO_opaque, pZip->m_archive_size, hdr, sizeof(hdr)) != sizeof(hdr)) { + return MZ_FALSE; + } +#ifndef MINIZ_NO_STDIO + if ((pState->m_pFile) && (MZ_FFLUSH(pState->m_pFile) == EOF)) { + return MZ_FALSE; + } +#endif // #ifndef MINIZ_NO_STDIO + pZip->m_archive_size += sizeof(hdr); + pZip->m_zip_mode = MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED; + return MZ_TRUE; + } + + mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize) { + if ((!pZip) || (!pZip->m_pState) || (!pBuf) || (!pSize)) { + return MZ_FALSE; + } + if (pZip->m_pWrite != mz_zip_heap_write_func) { + return MZ_FALSE; + } + if (!mz_zip_writer_finalize_archive(pZip)) { + return MZ_FALSE; + } + *pBuf = pZip->m_pState->m_pMem; + *pSize = pZip->m_pState->m_mem_size; + pZip->m_pState->m_pMem = NULL; + pZip->m_pState->m_mem_size = pZip->m_pState->m_mem_capacity = 0; + return MZ_TRUE; + } + + mz_bool mz_zip_writer_end(mz_zip_archive *pZip) { + mz_zip_internal_state *pState; + mz_bool status = MZ_TRUE; + if ((!pZip) || (!pZip->m_pState) || (!pZip->m_pAlloc) || (!pZip->m_pFree) || ((pZip->m_zip_mode != MZ_ZIP_MODE_WRITING) && (pZip->m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED))) { + return MZ_FALSE; + } + pState = pZip->m_pState; + pZip->m_pState = NULL; + mz_zip_array_clear(pZip, &pState->m_central_dir); + mz_zip_array_clear(pZip, &pState->m_central_dir_offsets); + mz_zip_array_clear(pZip, &pState->m_sorted_central_dir_offsets); +#ifndef MINIZ_NO_STDIO + if (pState->m_pFile) { + MZ_FCLOSE(pState->m_pFile); + pState->m_pFile = NULL; + } +#endif // #ifndef MINIZ_NO_STDIO + if ((pZip->m_pWrite == mz_zip_heap_write_func) && (pState->m_pMem)) { + pZip->m_pFree(pZip->m_pAlloc_opaque, pState->m_pMem); + pState->m_pMem = NULL; + } + pZip->m_pFree(pZip->m_pAlloc_opaque, pState); + pZip->m_zip_mode = MZ_ZIP_MODE_INVALID; + return status; + } + +#ifndef MINIZ_NO_STDIO + mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags) { + mz_bool status, created_new_archive = MZ_FALSE; + mz_zip_archive zip_archive; + struct MZ_FILE_STAT_STRUCT file_stat; + MZ_CLEAR_OBJ(zip_archive); + if ((int)level_and_flags < 0) { + level_and_flags = MZ_DEFAULT_LEVEL; + } + if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) || ((comment_size) && (!pComment)) || ((level_and_flags & 0xF) > MZ_UBER_COMPRESSION)) { + return MZ_FALSE; + } + if (!mz_zip_writer_validate_archive_name(pArchive_name)) { + return MZ_FALSE; + } + if (MZ_FILE_STAT(pZip_filename, &file_stat) != 0) { + // Create a new archive. + if (!mz_zip_writer_init_file(&zip_archive, pZip_filename, 0)) { + return MZ_FALSE; + } + created_new_archive = MZ_TRUE; + } else { + // Append to an existing archive. + if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, level_and_flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY)) { + return MZ_FALSE; + } + if (!mz_zip_writer_init_from_reader(&zip_archive, pZip_filename)) { + mz_zip_reader_end(&zip_archive); + return MZ_FALSE; + } + } + status = mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size, pComment, comment_size, level_and_flags, 0, 0); + // Always finalize, even if adding failed for some reason, so we have a valid central directory. (This may not always succeed, but we can try.) + if (!mz_zip_writer_finalize_archive(&zip_archive)) { + status = MZ_FALSE; + } + if (!mz_zip_writer_end(&zip_archive)) { + status = MZ_FALSE; + } + if ((!status) && (created_new_archive)) { + // It's a new archive and something went wrong, so just delete it. + int ignoredStatus = MZ_DELETE_FILE(pZip_filename); + (void)ignoredStatus; + } + return status; + } + + void *mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint flags) { + int file_index; + mz_zip_archive zip_archive; + void *p = NULL; + if (pSize) { + *pSize = 0; + } + if ((!pZip_filename) || (!pArchive_name)) { + return NULL; + } + MZ_CLEAR_OBJ(zip_archive); + if (!mz_zip_reader_init_file(&zip_archive, pZip_filename, flags | MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY)) { + return NULL; + } + if ((file_index = mz_zip_reader_locate_file(&zip_archive, pArchive_name, NULL, flags)) >= 0) { + p = mz_zip_reader_extract_to_heap(&zip_archive, file_index, pSize, flags); + } + mz_zip_reader_end(&zip_archive); + return p; + } + +#endif // #ifndef MINIZ_NO_STDIO + +#endif // #ifndef MINIZ_NO_ARCHIVE_WRITING_APIS + +#endif // #ifndef MINIZ_NO_ARCHIVE_APIS + +#ifdef __cplusplus +} +#endif + + +// Ignore strict-aliasing warning on MinGW gcc +#if defined(__GNUC__) +#pragma GCC diagnostic pop +#endif +// Ignore conversion warnings on clang +#if defined(__clang__) +#pragma clang diagnostic pop +#endif + +#endif // MINIZ_HEADER_FILE_ONLY + +/* + This is free and unencumbered software released into the public domain. + + Anyone is free to copy, modify, publish, use, compile, sell, or + distribute this software, either in source code form or as a compiled + binary, for any purpose, commercial or non-commercial, and by any + means. + + In jurisdictions that recognize copyright laws, the author or authors + of this software dedicate any and all copyright interest in the + software to the public domain. We make this dedication for the benefit + of the public at large and to the detriment of our heirs and + successors. We intend this dedication to be an overt act of + relinquishment in perpetuity of all present and future rights to this + software under copyright law. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + OTHER DEALINGS IN THE SOFTWARE. + + For more information, please refer to + */ diff --git a/app/src/main/cpp/libmobi/src/miniz.h b/app/src/main/cpp/libmobi/src/miniz.h new file mode 100644 index 0000000..50b3259 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/miniz.h @@ -0,0 +1,24 @@ +/** @file miniz.h + * @brief header file for third party miniz.c, zlib replacement + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_miniz_h +#define libmobi_miniz_h + +#define MINIZ_HEADER_FILE_ONLY +#define MINIZ_NO_STDIO +#define MINIZ_NO_ARCHIVE_APIS +#define MINIZ_NO_ZLIB_COMPATIBLE_NAMES +#define MINIZ_NO_TIME +#define MINIZ_NO_ARCHIVE_WRITING_APIS + +#include "miniz.c" + +#endif diff --git a/app/src/main/cpp/libmobi/src/mobi.h b/app/src/main/cpp/libmobi/src/mobi.h new file mode 100644 index 0000000..2ccb1f7 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/mobi.h @@ -0,0 +1,623 @@ +/** @file mobi.h + * @brief Libmobi main header file + * + * This file is installed with the library. + * Include it in your project with "#include ". + * See aryan of usage in mobitool.c, mobimeta.c, mobidrm.c + * + * Copyright (c) 2014-2022 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_mobi_h +#define libmobi_mobi_h + +#include +#include +#include +#include + +/** @brief Visibility attributes for symbol export */ +#if defined (__CYGWIN__) || defined (__MINGW32__) +#define MOBI_EXPORT __attribute__((visibility("default"))) __declspec(dllexport) extern +#elif defined (_WIN32) +#define MOBI_EXPORT __declspec(dllexport) +#else +#define MOBI_EXPORT __attribute__((__visibility__("default"))) +#endif + +/** + @brief Usually 32-bit values in mobi records + with value 0xffffffff mean "value not set" + */ +#define MOBI_NOTSET UINT32_MAX + +#define MOBI_ENCRYPTION_NONE 0 /**< Text record encryption type: none */ +#define MOBI_ENCRYPTION_V1 1 /**< Text record encryption type: old mobipocket */ +#define MOBI_ENCRYPTION_V2 2 /**< Text record encryption type: mobipocket */ + +#define MOBI_COMPRESSION_NONE 1 /**< Text record compression type: none */ +#define MOBI_COMPRESSION_PALMDOC 2 /**< Text record compression type: palmdoc */ +#define MOBI_COMPRESSION_HUFFCDIC 17480 /**< Text record compression type: huff/cdic */ + +#ifdef __cplusplus +extern "C" +{ +#endif + /** + @defgroup mobi_enums Exported enums + @{ + */ + + /** + @brief Error codes returned by functions + */ + typedef enum { + MOBI_SUCCESS = 0, /**< Generic success return value */ + MOBI_ERROR = 1, /**< Generic error return value */ + MOBI_PARAM_ERR = 2, /**< Wrong function parameter */ + MOBI_DATA_CORRUPT = 3, /**< Corrupted data */ + MOBI_FILE_NOT_FOUND = 4, /**< File not found */ + MOBI_FILE_ENCRYPTED = 5, /**< Unsupported encrypted data */ + MOBI_FILE_UNSUPPORTED = 6, /**< Unsupported document type */ + MOBI_MALLOC_FAILED = 7, /**< Memory allocation error */ + MOBI_INIT_FAILED = 8, /**< Initialization error */ + MOBI_BUFFER_END = 9, /**< Out of buffer error */ + MOBI_XML_ERR = 10, /**< XMLwriter error */ + MOBI_DRM_PIDINV = 11, /**< Invalid DRM PID */ + MOBI_DRM_KEYNOTFOUND = 12, /**< Key not found */ + MOBI_DRM_UNSUPPORTED = 13, /**< DRM support not included */ + MOBI_WRITE_FAILED = 14, /**< Writing to file failed */ + MOBI_DRM_EXPIRED = 15, /**< DRM expired */ + MOBI_DRM_RANDOM_ERR = 16 /**< DRM random bytes generation failed */ + } MOBI_RET; + + /** + @brief EXTH record types + */ + typedef enum { + EXTH_NUMERIC = 0, + EXTH_STRING = 1, + EXTH_BINARY = 2 + } MOBIExthType; + + /** + @brief EXTH record tags + */ + typedef enum { + EXTH_DRMSERVER = 1, + EXTH_DRMCOMMERCE = 2, + EXTH_DRMEBOOKBASE = 3, + + EXTH_TITLE = 99, /**< */ + EXTH_AUTHOR = 100, /**< */ + EXTH_PUBLISHER = 101, /**< */ + EXTH_IMPRINT = 102, /**< */ + EXTH_DESCRIPTION = 103, /**< */ + EXTH_ISBN = 104, /**< */ + EXTH_SUBJECT = 105, /**< */ + EXTH_PUBLISHINGDATE = 106, /**< */ + EXTH_REVIEW = 107, /**< */ + EXTH_CONTRIBUTOR = 108, /**< */ + EXTH_RIGHTS = 109, /**< */ + EXTH_SUBJECTCODE = 110, /**< */ + EXTH_TYPE = 111, /**< */ + EXTH_SOURCE = 112, /**< */ + EXTH_ASIN = 113, + EXTH_VERSION = 114, + EXTH_SAMPLE = 115, + EXTH_STARTREADING = 116, /**< Start reading */ + EXTH_ADULT = 117, /**< */ + EXTH_PRICE = 118, /**< */ + EXTH_CURRENCY = 119, /**< */ + EXTH_KF8BOUNDARY = 121, + EXTH_FIXEDLAYOUT = 122, /**< */ + EXTH_BOOKTYPE = 123, /**< */ + EXTH_ORIENTATIONLOCK = 124, /**< */ + EXTH_COUNTRESOURCES = 125, + EXTH_ORIGRESOLUTION = 126, /**< */ + EXTH_ZEROGUTTER = 127, /**< */ + EXTH_ZEROMARGIN = 128, /**< */ + EXTH_KF8COVERURI = 129, + EXTH_RESCOFFSET = 131, + EXTH_REGIONMAGNI = 132, /**< */ + + EXTH_DICTNAME = 200, /**< */ + EXTH_COVEROFFSET = 201, /**< */ + EXTH_THUMBOFFSET = 202, + EXTH_HASFAKECOVER = 203, + EXTH_CREATORSOFT = 204, + EXTH_CREATORMAJOR = 205, + EXTH_CREATORMINOR = 206, + EXTH_CREATORBUILD = 207, + EXTH_WATERMARK = 208, + EXTH_TAMPERKEYS = 209, + + EXTH_FONTSIGNATURE = 300, + + EXTH_CLIPPINGLIMIT = 401, + EXTH_PUBLISHERLIMIT = 402, + EXTH_UNK403 = 403, + EXTH_TTSDISABLE = 404, + EXTH_READFORFREE = 405, // uint32_t, rental related, ReadForFree + EXTH_RENTAL = 406, // uint64_t + EXTH_UNK407 = 407, + EXTH_UNK450 = 450, + EXTH_UNK451 = 451, + EXTH_UNK452 = 452, + EXTH_UNK453 = 453, + + EXTH_DOCTYPE = 501, /**< PDOC - Personal Doc; EBOK - ebook; EBSP - ebook sample; */ + EXTH_LASTUPDATE = 502, + EXTH_UPDATEDTITLE = 503, + EXTH_ASIN504 = 504, + EXTH_TITLEFILEAS = 508, + EXTH_CREATORFILEAS = 517, + EXTH_PUBLISHERFILEAS = 522, + EXTH_LANGUAGE = 524, /**< */ + EXTH_ALIGNMENT = 525, /**< */ + EXTH_CREATORSTRING = 526, + EXTH_PAGEDIR = 527, + EXTH_OVERRIDEFONTS = 528, /**< */ + EXTH_SORCEDESC = 529, + EXTH_DICTLANGIN = 531, + EXTH_DICTLANGOUT = 532, + EXTH_INPUTSOURCE = 534, + EXTH_CREATORBUILDREV = 535, + } MOBIExthTag; + + /** + @brief Types of files stored in database records + */ + typedef enum { + T_UNKNOWN, /**< unknown */ + /* markup */ + T_HTML, /**< html */ + T_CSS, /**< css */ + T_SVG, /**< svg */ + T_OPF, /**< opf */ + T_NCX, /**< ncx */ + /* images */ + T_JPG, /**< jpg */ + T_GIF, /**< gif */ + T_PNG, /**< png */ + T_BMP, /**< bmp */ + /* fonts */ + T_OTF, /**< otf */ + T_TTF, /**< ttf */ + /* media */ + T_MP3, /**< mp3 */ + T_MPG, /**< mp3 */ + T_PDF, /**< pdf */ + /* generic types */ + T_FONT, /**< encoded font */ + T_AUDIO, /**< audio resource */ + T_VIDEO, /**< video resource */ + T_BREAK /**< end of file */ + } MOBIFiletype; + + /** + @brief Metadata of file types + */ + typedef struct { + MOBIFiletype type; /**< MOBIFiletype type */ + char extension[5]; /**< file extension */ + char mime_type[30]; /**< mime-type */ + } MOBIFileMeta; + + /** + @brief Encoding types in MOBI header (offset 28) + */ + typedef enum { + MOBI_CP1252 = 1252, /**< cp-1252 encoding */ + MOBI_UTF8 = 65001, /**< utf-8 encoding */ + MOBI_UTF16 = 65002, /**< utf-16 encoding */ + } MOBIEncoding; + + /** @} */ + + /** + @defgroup raw_structs Exported structures for the raw, unparsed records metadata and data + @{ + */ + + /** + @brief Header of palmdoc database file + */ + typedef struct { + char name[33]; /**< 0: Database name, zero terminated, trimmed title (+author) */ + uint16_t attributes; /**< 32: Attributes bitfield, PALMDB_ATTRIBUTE_DEFAULT */ + uint16_t version; /**< 34: File version, PALMDB_VERSION_DEFAULT */ + uint32_t ctime; /**< 36: Creation time */ + uint32_t mtime; /**< 40: Modification time */ + uint32_t btime; /**< 44: Backup time */ + uint32_t mod_num; /**< 48: Modification number, PALMDB_MODNUM_DEFAULT */ + uint32_t appinfo_offset; /**< 52: Offset to application info (if present) or zero, PALMDB_APPINFO_DEFAULT */ + uint32_t sortinfo_offset; /**< 56: Offset to sort info (if present) or zero, PALMDB_SORTINFO_DEFAULT */ + char type[5]; /**< 60: Database type, zero terminated, PALMDB_TYPE_DEFAULT */ + char creator[5]; /**< 64: Creator type, zero terminated, PALMDB_CREATOR_DEFAULT */ + uint32_t uid; /**< 68: Used internally to identify record */ + uint32_t next_rec; /**< 72: Used only when database is loaded into memory, PALMDB_NEXTREC_DEFAULT */ + uint16_t rec_count; /**< 76: Number of records in the file */ + } MOBIPdbHeader; + + /** + @brief Metadata and data of a record. All records form a linked list. + */ + typedef struct MOBIPdbRecord { + uint32_t offset; /**< Offset of the record data from the start of the database */ + size_t size; /**< Calculated size of the record data */ + uint8_t attributes; /**< Record attributes */ + uint32_t uid; /**< Record unique id, usually sequential even numbers */ + unsigned char *data; /**< Record data */ + struct MOBIPdbRecord *next; /**< Pointer to the next record or NULL */ + } MOBIPdbRecord; + + /** + @brief Metadata and data of a EXTH record. All records form a linked list. + */ + typedef struct MOBIExthHeader { + uint32_t tag; /**< Record tag */ + uint32_t size; /**< Data size */ + void *data; /**< Record data */ + struct MOBIExthHeader *next; /**< Pointer to the next record or NULL */ + } MOBIExthHeader; + + /** + @brief EXTH tag metadata + */ + typedef struct { + MOBIExthTag tag; /**< Record tag id */ + MOBIExthType type; /**< EXTH_NUMERIC, EXTH_STRING or EXTH_BINARY */ + char *name; /**< Tag name */ + } MOBIExthMeta; + + /** + @brief Header of the Record 0 meta-record + */ + typedef struct { + /* PalmDOC header (extended), offset 0, length 16 */ + uint16_t compression_type; /**< 0; 1 == no compression, 2 = PalmDOC compression, 17480 = HUFF/CDIC compression */ + /* uint16_t unused; // 2; 0 */ + uint32_t text_length; /**< 4; uncompressed length of the entire text of the book */ + uint16_t text_record_count; /**< 8; number of PDB records used for the text of the book */ + uint16_t text_record_size; /**< 10; maximum size of each record containing text, always 4096 */ + uint16_t encryption_type; /**< 12; 0 == no encryption, 1 = Old Mobipocket Encryption, 2 = Mobipocket Encryption */ + uint16_t unknown1; /**< 14; usually 0 */ + } MOBIRecord0Header; + + /** + @brief MOBI header which follows Record 0 header + + All MOBI header fields are pointers. Some fields are not present in the header, then the pointer is NULL. + */ + typedef struct { + /* MOBI header, offset 16 */ + char mobi_magic[5]; /**< 16: M O B I { 77, 79, 66, 73 }, zero terminated */ + uint32_t *header_length; /**< 20: the length of the MOBI header, including the previous 4 bytes */ + uint32_t *mobi_type; /**< 24: mobipocket file type */ + MOBIEncoding *text_encoding; /**< 28: 1252 = CP1252, 65001 = UTF-8 */ + uint32_t *uid; /**< 32: unique id */ + uint32_t *version; /**< 36: mobipocket format */ + uint32_t *orth_index; /**< 40: section number of orthographic meta index. MOBI_NOTSET if index is not available. */ + uint32_t *infl_index; /**< 44: section number of inflection meta index. MOBI_NOTSET if index is not available. */ + uint32_t *names_index; /**< 48: section number of names meta index. MOBI_NOTSET if index is not available. */ + uint32_t *keys_index; /**< 52: section number of keys meta index. MOBI_NOTSET if index is not available. */ + uint32_t *extra0_index; /**< 56: section number of extra 0 meta index. MOBI_NOTSET if index is not available. */ + uint32_t *extra1_index; /**< 60: section number of extra 1 meta index. MOBI_NOTSET if index is not available. */ + uint32_t *extra2_index; /**< 64: section number of extra 2 meta index. MOBI_NOTSET if index is not available. */ + uint32_t *extra3_index; /**< 68: section number of extra 3 meta index. MOBI_NOTSET if index is not available. */ + uint32_t *extra4_index; /**< 72: section number of extra 4 meta index. MOBI_NOTSET if index is not available. */ + uint32_t *extra5_index; /**< 76: section number of extra 5 meta index. MOBI_NOTSET if index is not available. */ + uint32_t *non_text_index; /**< 80: first record number (starting with 0) that's not the book's text */ + uint32_t *full_name_offset; /**< 84: offset in record 0 (not from start of file) of the full name of the book */ + uint32_t *full_name_length; /**< 88: length of the full name */ + uint32_t *locale; /**< 92: first byte is main language: 09 = English, next byte is dialect, 08 = British, 04 = US */ + uint32_t *dict_input_lang; /**< 96: input language for a dictionary */ + uint32_t *dict_output_lang; /**< 100: output language for a dictionary */ + uint32_t *min_version; /**< 104: minimum mobipocket version support needed to read this file. */ + uint32_t *image_index; /**< 108: first record number (starting with 0) that contains an image (sequential) */ + uint32_t *huff_rec_index; /**< 112: first huffman compression record */ + uint32_t *huff_rec_count; /**< 116: huffman compression records count */ + uint32_t *datp_rec_index; /**< 120: section number of DATP record */ + uint32_t *datp_rec_count; /**< 124: DATP records count */ + uint32_t *exth_flags; /**< 128: bitfield. if bit 6 (0x40) is set, then there's an EXTH record */ + /* 32 unknown bytes, usually 0, related to encryption and unknown6 */ + /* unknown2 */ + /* unknown3 */ + /* unknown4 */ + /* unknown5 */ + uint32_t *unknown6; /**< 164: use MOBI_NOTSET , related to encryption*/ + uint32_t *drm_offset; /**< 168: offset to DRM key info in DRMed files. MOBI_NOTSET if no DRM */ + uint32_t *drm_count; /**< 172: number of entries in DRM info */ + uint32_t *drm_size; /**< 176: number of bytes in DRM info */ + uint32_t *drm_flags; /**< 180: some flags concerning DRM info, bit 0 set if password encryption */ + /* 8 unknown bytes 0? */ + /* unknown7 */ + /* unknown8 */ + uint16_t *first_text_index; /**< 192: section number of first text record */ + uint16_t *last_text_index; /**< 194: */ + uint32_t *fdst_index; /**< 192 (KF8) section number of FDST record */ + //uint32_t *unknown9; /**< 196: */ + uint32_t *fdst_section_count; /**< 196 (KF8) */ + uint32_t *fcis_index; /**< 200: section number of FCIS record */ + uint32_t *fcis_count; /**< 204: FCIS records count */ + uint32_t *flis_index; /**< 208: section number of FLIS record */ + uint32_t *flis_count; /**< 212: FLIS records count */ + uint32_t *unknown10; /**< 216: */ + uint32_t *unknown11; /**< 220: */ + uint32_t *srcs_index; /**< 224: section number of SRCS record */ + uint32_t *srcs_count; /**< 228: SRCS records count */ + uint32_t *unknown12; /**< 232: */ + uint32_t *unknown13; /**< 236: */ + /* uint16_t fill 0 */ + uint16_t *extra_flags; /**< 242: extra flags */ + uint32_t *ncx_index; /**< 244: section number of NCX record */ + uint32_t *unknown14; /**< 248: */ + uint32_t *fragment_index; /**< 248 (KF8) section number of fragments record */ + uint32_t *unknown15; /**< 252: */ + uint32_t *skeleton_index; /**< 252 (KF8) section number of SKEL record */ + uint32_t *datp_index; /**< 256: section number of DATP record */ + uint32_t *unknown16; /**< 260: */ + uint32_t *guide_index; /**< 260 (KF8) section number of guide record */ + uint32_t *unknown17; /**< 264: */ + uint32_t *unknown18; /**< 268: */ + uint32_t *unknown19; /**< 272: */ + uint32_t *unknown20; /**< 276: */ + char *full_name; /**< variable offset (full_name_offset): full name */ + } MOBIMobiHeader; + + /** + @brief Main structure holding all metadata and unparsed records data + + In case of hybrid KF7/KF8 file there are two Records 0. + In such case MOBIData is a circular linked list of two independent records, one structure per each Record 0 header. + Records data (MOBIPdbRecord structure) is not duplicated in such case - each struct holds same pointers to all records data. + */ + typedef struct MOBIData { + bool use_kf8; /**< Flag: if set to true (default), KF8 part of hybrid file is parsed, if false - KF7 part will be parsed */ + uint32_t kf8_boundary_offset; /**< Set to KF8 boundary rec number if present, otherwise: MOBI_NOTSET */ + unsigned char *drm_key; /**< @deprecated Will be removed in future versions */ + MOBIPdbHeader *ph; /**< Palmdoc database header structure or NULL if not loaded */ + MOBIRecord0Header *rh; /**< Record0 header structure or NULL if not loaded */ + MOBIMobiHeader *mh; /**< MOBI header structure or NULL if not loaded */ + MOBIExthHeader *eh; /**< Linked list of EXTH records or NULL if not loaded */ + MOBIPdbRecord *rec; /**< Linked list of palmdoc database records or NULL if not loaded */ + struct MOBIData *next; /**< Pointer to the other part of hybrid file or NULL if not a hybrid file */ + void *internals; /**< Used internally*/ + } MOBIData; + + /** @} */ // end of raw_structs group + + /** + @defgroup parsed_structs Exported structures for the parsed records metadata and data + @{ + */ + + /** + @brief Parsed FDST record + + FDST record contains offsets of main sections in RAWML - raw text data. + The sections are usually html part, css parts, svg part. + */ + typedef struct { + size_t fdst_section_count; /**< Number of main sections */ + uint32_t *fdst_section_starts; /**< Array of section start offsets */ + uint32_t *fdst_section_ends; /**< Array of section end offsets */ + } MOBIFdst; + + /** + @brief Parsed tag for an index entry + */ + typedef struct { + size_t tagid; /**< Tag id */ + size_t tagvalues_count; /**< Number of tag values */ + uint32_t *tagvalues; /**< Array of tag values */ + } MOBIIndexTag; + + /** + @brief Parsed INDX index entry + */ + typedef struct { + char *label; /**< Entry string, zero terminated */ + size_t tags_count; /**< Number of tags */ + MOBIIndexTag *tags; /**< Array of tags */ + } MOBIIndexEntry; + + /** + @brief Parsed INDX record + */ + typedef struct { + size_t type; /**< Index type: 0 - normal, 2 - inflection */ + size_t entries_count; /**< Index entries count */ + MOBIEncoding encoding; /**< Index encoding */ + size_t total_entries_count; /**< Total index entries count */ + size_t ordt_offset; /**< ORDT offset */ + size_t ligt_offset; /**< LIGT offset */ + size_t ligt_entries_count; /**< LIGT index entries count */ + size_t cncx_records_count; /**< Number of compiled NCX records */ + MOBIPdbRecord *cncx_record; /**< Link to CNCX record */ + MOBIIndexEntry *entries; /**< Index entries array */ + char *orth_index_name; /**< Orth index name */ + } MOBIIndx; + + /** + @brief Reconstructed source file. + + All file parts are organized in a linked list. + */ + typedef struct MOBIPart { + size_t uid; /**< Unique id */ + MOBIFiletype type; /**< File type */ + size_t size; /**< File size */ + unsigned char *data; /**< File data */ + struct MOBIPart *next; /**< Pointer to next part or NULL */ + } MOBIPart; + + /** + @brief Main structure containing reconstructed source parts and indices + */ + typedef struct { + size_t version; /**< Version of Mobipocket document */ + MOBIFdst *fdst; /**< Parsed FDST record or NULL if not present */ + MOBIIndx *skel; /**< Parsed skeleton index or NULL if not present */ + MOBIIndx *frag; /**< Parsed fragments index or NULL if not present */ + MOBIIndx *guide; /**< Parsed guide index or NULL if not present */ + MOBIIndx *ncx; /**< Parsed NCX index or NULL if not present */ + MOBIIndx *orth; /**< Parsed orth index or NULL if not present */ + MOBIIndx *infl; /**< Parsed infl index or NULL if not present */ + MOBIPart *flow; /**< Linked list of reconstructed main flow parts or NULL if not present */ + MOBIPart *markup; /**< Linked list of reconstructed markup files or NULL if not present */ + MOBIPart *resources; /**< Linked list of reconstructed resources files or NULL if not present */ + } MOBIRawml; + + /** @} */ // end of parsed_structs group + + /** + @defgroup mobi_export Functions exported by the library + @{ + */ + MOBI_EXPORT const char * mobi_version(void); + MOBI_EXPORT MOBI_RET mobi_load_file(MOBIData *m, FILE *file); + MOBI_EXPORT MOBI_RET mobi_load_filename(MOBIData *m, const char *path); + + MOBI_EXPORT MOBIData * mobi_init(void); + MOBI_EXPORT void mobi_free(MOBIData *m); + + MOBI_EXPORT MOBI_RET mobi_parse_kf7(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_parse_kf8(MOBIData *m); + + MOBI_EXPORT MOBI_RET mobi_parse_rawml(MOBIRawml *rawml, const MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_parse_rawml_opt(MOBIRawml *rawml, const MOBIData *m, bool parse_toc, bool parse_dict, bool reconstruct); + + MOBI_EXPORT MOBI_RET mobi_get_rawml(const MOBIData *m, char *text, size_t *len); + MOBI_EXPORT MOBI_RET mobi_dump_rawml(const MOBIData *m, FILE *file); + MOBI_EXPORT MOBI_RET mobi_decode_font_resource(unsigned char **decoded_font, size_t *decoded_size, MOBIPart *part); + MOBI_EXPORT MOBI_RET mobi_decode_audio_resource(unsigned char **decoded_resource, size_t *decoded_size, MOBIPart *part); + MOBI_EXPORT MOBI_RET mobi_decode_video_resource(unsigned char **decoded_resource, size_t *decoded_size, MOBIPart *part); + MOBI_EXPORT MOBI_RET mobi_get_embedded_source(unsigned char **data, size_t *size, const MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_get_embedded_log(unsigned char **data, size_t *size, const MOBIData *m); + + MOBI_EXPORT MOBIPdbRecord * mobi_get_record_by_uid(const MOBIData *m, const size_t uid); + MOBI_EXPORT MOBIPdbRecord * mobi_get_record_by_seqnumber(const MOBIData *m, const size_t uid); + MOBI_EXPORT MOBIPart * mobi_get_flow_by_uid(const MOBIRawml *rawml, const size_t uid); + MOBI_EXPORT MOBIPart * mobi_get_flow_by_fid(const MOBIRawml *rawml, const char *fid); + MOBI_EXPORT MOBIPart * mobi_get_resource_by_uid(const MOBIRawml *rawml, const size_t uid); + MOBI_EXPORT MOBIPart * mobi_get_resource_by_fid(const MOBIRawml *rawml, const char *fid); + MOBI_EXPORT MOBIPart * mobi_get_part_by_uid(const MOBIRawml *rawml, const size_t uid); + MOBI_EXPORT MOBI_RET mobi_get_fullname(const MOBIData *m, char *fullname, const size_t len); + MOBI_EXPORT size_t mobi_get_first_resource_record(const MOBIData *m); + MOBI_EXPORT size_t mobi_get_text_maxsize(const MOBIData *m); + MOBI_EXPORT uint16_t mobi_get_textrecord_maxsize(const MOBIData *m); + MOBI_EXPORT size_t mobi_get_kf8offset(const MOBIData *m); + MOBI_EXPORT size_t mobi_get_kf8boundary_seqnumber(const MOBIData *m); + MOBI_EXPORT size_t mobi_get_record_extrasize(const MOBIPdbRecord *record, const uint16_t flags); + MOBI_EXPORT size_t mobi_get_record_mb_extrasize(const MOBIPdbRecord *record, const uint16_t flags); + MOBI_EXPORT size_t mobi_get_fileversion(const MOBIData *m); + MOBI_EXPORT size_t mobi_get_fdst_record_number(const MOBIData *m); + MOBI_EXPORT MOBIExthHeader * mobi_get_exthrecord_by_tag(const MOBIData *m, const MOBIExthTag tag); + MOBI_EXPORT MOBIExthHeader * mobi_next_exthrecord_by_tag(const MOBIData *m, const MOBIExthTag tag, MOBIExthHeader **start); + MOBI_EXPORT MOBI_RET mobi_delete_exthrecord_by_tag(MOBIData *m, const MOBIExthTag tag); + MOBI_EXPORT MOBI_RET mobi_add_exthrecord(MOBIData *m, const MOBIExthTag tag, const uint32_t size, const void *value); + MOBI_EXPORT MOBIExthMeta mobi_get_exthtagmeta_by_tag(const MOBIExthTag tag); + MOBI_EXPORT MOBIFileMeta mobi_get_filemeta_by_type(const MOBIFiletype type); + MOBI_EXPORT uint32_t mobi_decode_exthvalue(const unsigned char *data, const size_t size); + MOBI_EXPORT char * mobi_decode_exthstring(const MOBIData *m, const unsigned char *data, const size_t size); + MOBI_EXPORT struct tm * mobi_pdbtime_to_time(const long pdb_time); + MOBI_EXPORT const char * mobi_get_locale_string(const uint32_t locale); + MOBI_EXPORT size_t mobi_get_locale_number(const char *locale_string); + MOBI_EXPORT uint32_t mobi_get_orth_entry_offset(const MOBIIndexEntry *entry); + MOBI_EXPORT uint32_t mobi_get_orth_entry_length(const MOBIIndexEntry *entry); + MOBI_EXPORT MOBI_RET mobi_remove_hybrid_part(MOBIData *m, const bool remove_kf8); + + MOBI_EXPORT bool mobi_exists_mobiheader(const MOBIData *m); + MOBI_EXPORT bool mobi_exists_fdst(const MOBIData *m); + MOBI_EXPORT bool mobi_exists_skel_indx(const MOBIData *m); + MOBI_EXPORT bool mobi_exists_frag_indx(const MOBIData *m); + MOBI_EXPORT bool mobi_exists_guide_indx(const MOBIData *m); + MOBI_EXPORT bool mobi_exists_ncx(const MOBIData *m); + MOBI_EXPORT bool mobi_exists_orth(const MOBIData *m); + MOBI_EXPORT bool mobi_exists_infl(const MOBIData *m); + MOBI_EXPORT bool mobi_is_hybrid(const MOBIData *m); + MOBI_EXPORT bool mobi_is_encrypted(const MOBIData *m); + MOBI_EXPORT bool mobi_is_mobipocket(const MOBIData *m); + MOBI_EXPORT bool mobi_is_dictionary(const MOBIData *m); + MOBI_EXPORT bool mobi_is_kf8(const MOBIData *m); + MOBI_EXPORT bool mobi_is_replica(const MOBIData *m); + MOBI_EXPORT bool mobi_is_rawml_kf8(const MOBIRawml *rawml); + MOBI_EXPORT MOBIRawml * mobi_init_rawml(const MOBIData *m); + MOBI_EXPORT void mobi_free_rawml(MOBIRawml *rawml); + + MOBI_EXPORT char * mobi_meta_get_title(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_author(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_publisher(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_imprint(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_description(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_isbn(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_subject(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_publishdate(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_review(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_contributor(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_copyright(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_asin(const MOBIData *m); + MOBI_EXPORT char * mobi_meta_get_language(const MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_title(MOBIData *m, const char *title); + MOBI_EXPORT MOBI_RET mobi_meta_add_title(MOBIData *m, const char *title); + MOBI_EXPORT MOBI_RET mobi_meta_delete_title(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_author(MOBIData *m, const char *author); + MOBI_EXPORT MOBI_RET mobi_meta_add_author(MOBIData *m, const char *author); + MOBI_EXPORT MOBI_RET mobi_meta_delete_author(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_publisher(MOBIData *m, const char *publisher); + MOBI_EXPORT MOBI_RET mobi_meta_add_publisher(MOBIData *m, const char *publisher); + MOBI_EXPORT MOBI_RET mobi_meta_delete_publisher(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_imprint(MOBIData *m, const char *imprint); + MOBI_EXPORT MOBI_RET mobi_meta_add_imprint(MOBIData *m, const char *imprint); + MOBI_EXPORT MOBI_RET mobi_meta_delete_imprint(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_description(MOBIData *m, const char *description); + MOBI_EXPORT MOBI_RET mobi_meta_add_description(MOBIData *m, const char *description); + MOBI_EXPORT MOBI_RET mobi_meta_delete_description(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_isbn(MOBIData *m, const char *isbn); + MOBI_EXPORT MOBI_RET mobi_meta_add_isbn(MOBIData *m, const char *isbn); + MOBI_EXPORT MOBI_RET mobi_meta_delete_isbn(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_subject(MOBIData *m, const char *subject); + MOBI_EXPORT MOBI_RET mobi_meta_add_subject(MOBIData *m, const char *subject); + MOBI_EXPORT MOBI_RET mobi_meta_delete_subject(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_publishdate(MOBIData *m, const char *publishdate); + MOBI_EXPORT MOBI_RET mobi_meta_add_publishdate(MOBIData *m, const char *publishdate); + MOBI_EXPORT MOBI_RET mobi_meta_delete_publishdate(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_review(MOBIData *m, const char *review); + MOBI_EXPORT MOBI_RET mobi_meta_add_review(MOBIData *m, const char *review); + MOBI_EXPORT MOBI_RET mobi_meta_delete_review(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_contributor(MOBIData *m, const char *contributor); + MOBI_EXPORT MOBI_RET mobi_meta_add_contributor(MOBIData *m, const char *contributor); + MOBI_EXPORT MOBI_RET mobi_meta_delete_contributor(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_copyright(MOBIData *m, const char *copyright); + MOBI_EXPORT MOBI_RET mobi_meta_add_copyright(MOBIData *m, const char *copyright); + MOBI_EXPORT MOBI_RET mobi_meta_delete_copyright(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_asin(MOBIData *m, const char *asin); + MOBI_EXPORT MOBI_RET mobi_meta_add_asin(MOBIData *m, const char *asin); + MOBI_EXPORT MOBI_RET mobi_meta_delete_asin(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_meta_set_language(MOBIData *m, const char *language); + MOBI_EXPORT MOBI_RET mobi_meta_add_language(MOBIData *m, const char *language); + MOBI_EXPORT MOBI_RET mobi_meta_delete_language(MOBIData *m); + + MOBI_EXPORT MOBI_RET mobi_drm_setkey(MOBIData *m, const char *pid); + MOBI_EXPORT MOBI_RET mobi_drm_setkey_serial(MOBIData *m, const char *serial); + MOBI_EXPORT MOBI_RET mobi_drm_addvoucher(MOBIData *m, const char *serial, const time_t valid_from, const time_t valid_to, + const MOBIExthTag *tamperkeys, const size_t tamperkeys_count); + MOBI_EXPORT MOBI_RET mobi_drm_delkey(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_drm_decrypt(MOBIData *m); + MOBI_EXPORT MOBI_RET mobi_drm_encrypt(MOBIData *m); + + MOBI_EXPORT MOBI_RET mobi_write_file(FILE *file, MOBIData *m); + /** @} */ // end of mobi_export group + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/app/src/main/cpp/libmobi/src/opf.c b/app/src/main/cpp/libmobi/src/opf.c new file mode 100644 index 0000000..35262bb --- /dev/null +++ b/app/src/main/cpp/libmobi/src/opf.c @@ -0,0 +1,2059 @@ +/** @file opf.c + * @brief Functions for handling OPF structures + * + * Copyright (c) 2020 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#define _GNU_SOURCE 1 +#ifndef __USE_BSD +#define __USE_BSD /* for strdup on linux/glibc */ +#endif + +#include +#include +#include "opf.h" +#ifdef USE_LIBXML2 +#ifdef __clang__ +#pragma clang diagnostic push +/* suppress clang documentation warning for libxml headers */ +#pragma clang diagnostic ignored "-Wdocumentation" +#endif +#include +#include +#include +#ifdef __clang__ +#pragma clang diagnostic pop +#endif +#else +#include "xmlwriter.h" +#endif +#include "index.h" +#include "util.h" +#include "parse_rawml.h" +#include "debug.h" + +/** + @brief Array of valid OPF guide types + + http://www.idpf.org/epub/20/spec/OPF_2.0.1_draft.htm#Section2.6 + */ +const char *mobi_guide_types[] = { + "cover", /**< the book cover(s), jacket information, etc. */ + "title-page", /**< page with possibly title, author, publisher, and other metadata */ + "toc", /**< table of contents */ + "index", /**< back-of-book style index */ + "glossary", /**< glossary */ + "acknowledgements", /**< acknowledgements */ + "bibliography", /**< bibliography */ + "colophon", /**< colophon */ + "copyright-page", /**< copyright page */ + "dedication", /**< dedication */ + "epigraph", /**< epigraph */ + "foreword", /**< foreword */ + "loi", /**< list of illustrations */ + "lot", /**< list of tables */ + "notes", /**< notes */ + "preface", /**< preface */ + "text", /**< First "real" page of content (e.g. "Chapter 1") */ + NULL /**< eof */ +}; + +/** + @brief Check if type is valid OPF guide element + + Compares types with elements of mobi_guide_types[] array + + @param[in] type OPF guide type + @return True if type is valid guide type, false otherwise + */ +bool mobi_is_guide_type(const char *type) { + size_t i = 0; + size_t type_length = strlen(type); + while (mobi_guide_types[i]) { + if (strncmp(mobi_guide_types[i++], type, type_length) == 0) { + return true; + } + } + /* check if "other" type */ + if (strncmp(type, "other.", 6) == 0) { return true; } + return false; +} + +/** + @brief Reconstruct guide part of the OPF file + + @param[in,out] opf Structure OPF->OPFguide will be filled with parsed data + @param[in] rawml Structure MOBIRawml will be parsed + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_build_opf_guide(OPF *opf, const MOBIRawml *rawml) { + /* parse guide data */ + if (rawml == NULL || rawml->guide == NULL) { + debug_print("%s\n", "Initialization failed"); + return MOBI_INIT_FAILED; + } + size_t i = 0; + size_t j = 0; + MOBI_RET ret; + size_t count = rawml->guide->entries_count; + if (count == 0) { + return MOBI_SUCCESS; + } + if (rawml->frag == NULL) { + debug_print("%s\n", "Missing frag part"); + return MOBI_DATA_CORRUPT; + } + opf->guide = malloc(sizeof(OPFguide)); + if (opf->guide == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + OPFreference **reference = malloc((count + 1) * sizeof(OPFreference*)); + if (reference == NULL) { + free(opf->guide); + opf->guide = NULL; + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + if (rawml->guide->cncx_record == NULL) { + free(reference); + free(opf->guide); + opf->guide = NULL; + debug_print("%s\n", "Missing cncx record"); + return MOBI_DATA_CORRUPT; + } + while (i < count) { + const MOBIIndexEntry *guide_entry = &rawml->guide->entries[i]; + const char *type = guide_entry->label; + uint32_t cncx_offset; + ret = mobi_get_indxentry_tagvalue(&cncx_offset, guide_entry, INDX_TAG_GUIDE_TITLE_CNCX); + if (ret != MOBI_SUCCESS) { + free(reference); + free(opf->guide); + opf->guide = NULL; + return ret; + } + const MOBIPdbRecord *cncx_record = rawml->guide->cncx_record; + char *ref_title = mobi_get_cncx_string_utf8(cncx_record, cncx_offset, rawml->guide->encoding); + if (ref_title == NULL) { + free(reference); + free(opf->guide); + opf->guide = NULL; + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + uint32_t frag_number = MOBI_NOTSET; + ret = mobi_get_indxentry_tagvalue(&frag_number, guide_entry, INDX_TAG_FRAG_POSITION); + if (ret != MOBI_SUCCESS) { + debug_print("INDX_TAG_FRAG_POSITION not found (%i)\n", ret); + free(ref_title); + i++; + continue; + /* FIXME: I need some examples which use other tags */ + //mobi_get_indxentry_tagvalue(&frag_number, guide_entry, INDX_TAG_FRAG_FILE_NR); + } + if (frag_number >= rawml->frag->entries_count) { + debug_print("Wrong frag entry index (%i)\n", frag_number); + free(ref_title); + i++; + continue; + } + const MOBIIndexEntry *frag_entry = &rawml->frag->entries[frag_number]; + uint32_t file_number; + ret = mobi_get_indxentry_tagvalue(&file_number, frag_entry, INDX_TAG_FRAG_FILE_NR); + if (ret != MOBI_SUCCESS) { + free(reference); + free(opf->guide); + free(ref_title); + opf->guide = NULL; + return ret; + } + /* check if valid guide type */ + char *ref_type; + size_t type_size = strlen(type); + if (!mobi_is_guide_type(type)) { + /* prepend "other." prefix */ + type_size += 6; + ref_type = malloc(type_size + 1); + if (ref_type == NULL) { + free(reference); + free(opf->guide); + opf->guide = NULL; + free(ref_title); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + snprintf(ref_type, type_size + 1, "other.%s", type); + } else { + ref_type = malloc(type_size + 1); + if (ref_type == NULL) { + free(reference); + free(opf->guide); + opf->guide = NULL; + free(ref_title); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + memcpy(ref_type, type, type_size); + ref_type[type_size] = '\0'; + } + debug_print("", ref_type, ref_title, file_number); + char href[FILENAME_MAX + 1]; + snprintf(href, sizeof(href), "part%05u.html", file_number); + char *ref_href = strdup(href); + reference[j] = calloc(1, sizeof(OPFreference)); + *reference[j] = (OPFreference) { ref_type, ref_title, ref_href }; + i++; + j++; + } + /* terminate array with NULL */ + reference[j] = NULL; + opf->guide->reference = reference; + return MOBI_SUCCESS; +} + +/** + @brief Write entries for given ncx level + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] ncx Array of NCX structures with ncx content + @param[in] level TOC level + @param[in] from First entry in NCX array to copy from + @param[in] to Last entry in NCX array to copy from + @param[in] seq Sequential number for playOrder attribute + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_write_ncx_level(xmlTextWriterPtr writer, const NCX *ncx, const size_t level, const size_t from, const size_t to, size_t *seq) { + for (size_t i = from; i <= to; i++) { + if (level != ncx[i].level) { + continue; + } + /* start */ + char playorder[10 + 1]; + snprintf(playorder, 11, "%u", (uint32_t) (*seq)++); + + /* id string (max 10 digits and dash) for each level + "toc" + terminator */ + size_t id_size = 11 * (level + 1) + 3 + 1; + char *id = malloc(id_size); + if (id == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + strcpy(id, "toc"); + size_t curr_id = i; + while (curr_id != MOBI_NOTSET) { + size_t parent_id = ncx[curr_id].parent; + if (parent_id == curr_id) { + debug_print("%s\n", "Skip id of corrupt ncx entry"); + break; + } + size_t curr_from = 0; + if (parent_id != MOBI_NOTSET && ncx[parent_id].first_child != MOBI_NOTSET) { + curr_from = ncx[parent_id].first_child; + } + char level_id[10 + 1]; + snprintf(level_id, 11, "%u", (uint32_t) (curr_id - curr_from + 1)); + char *id_copy = strdup(id + 3); + if (id_copy == NULL) { + debug_print("%s\n", "Memory allocation failed"); + free(id); + return MOBI_MALLOC_FAILED; + } + snprintf(id, id_size, "toc-%s%s", level_id, id_copy); + free(id_copy); + curr_id = parent_id; + } + + int xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "navPoint"); + if (xml_ret < 0) { + free(id); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "id", BAD_CAST id); + free(id); + if (xml_ret < 0) { return MOBI_XML_ERR; } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "playOrder", BAD_CAST playorder); + if (xml_ret < 0) { return MOBI_XML_ERR; } + /* write */ + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "navLabel"); + if (xml_ret < 0) { return MOBI_XML_ERR; } + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "text"); + if (xml_ret < 0) { return MOBI_XML_ERR; } + xml_ret = xmlTextWriterWriteString(writer, BAD_CAST ncx[i].text); + if (xml_ret < 0) { return MOBI_XML_ERR; } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { return MOBI_XML_ERR; } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { return MOBI_XML_ERR; } + /* write */ + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "content"); + if (xml_ret < 0) { return MOBI_XML_ERR; } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "src", BAD_CAST ncx[i].target); + if (xml_ret < 0) { return MOBI_XML_ERR; } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { return MOBI_XML_ERR; } + debug_print("%s - %s\n", ncx[i].text, ncx[i].target); + if (ncx[i].first_child != MOBI_NOTSET && ncx[i].last_child != MOBI_NOTSET) { + MOBI_RET ret = mobi_write_ncx_level(writer, ncx, level + 1, ncx[i].first_child, ncx[i].last_child, seq); + if (ret != MOBI_SUCCESS) { + return ret; + } + } + /* end */ + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { return MOBI_XML_ERR; } + } + return MOBI_SUCCESS; +} + +/** + @brief Write element to XML buffer + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] name Attribute name + @param[in] content Attribute content + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_meta(xmlTextWriterPtr writer, const char *name, const char *content) { + int xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "meta"); + if (xml_ret < 0) { + debug_print("XML error: %i (name: %s, content: %s)\n", xml_ret, name, content); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "name", BAD_CAST name); + if (xml_ret < 0) { + debug_print("XML error: %i (name: %s, content: %s)\n", xml_ret, name, content); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "content", BAD_CAST content); + if (xml_ret < 0) { + debug_print("XML error: %i (name: %s, content: %s)\n", xml_ret, name, content); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { + debug_print("XML error: %i (name: %s, content: %s)\n", xml_ret, name, content); + return MOBI_XML_ERR; + } + return MOBI_SUCCESS; +} + + +/** + @brief Add reconstruced opf part to rawml + + @param[in] opf_xml OPF xml string + @param[in,out] rawml New data will be added to MOBIRawml rawml->resources structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_opf_add_to_rawml(const char *opf_xml, MOBIRawml *rawml) { + MOBIPart *opf_part; + size_t uid = 0; + if (rawml->resources) { + MOBIPart *part = rawml->resources; + while (part->next) { + part = part->next; + } + uid = part->uid + 1; + part->next = calloc(1, sizeof(MOBIPart)); + opf_part = part->next; + } + else { + rawml->resources = calloc(1, sizeof(MOBIPart)); + opf_part = rawml->resources; + } + if (opf_part == NULL) { + return MOBI_MALLOC_FAILED; + } + opf_part->uid = uid; + opf_part->next = NULL; + opf_part->data = (unsigned char *) strdup(opf_xml); + if (opf_part->data == NULL) { + free(opf_part); + opf_part = NULL; + return MOBI_MALLOC_FAILED; + } + opf_part->size = strlen(opf_xml); + opf_part->type = T_OPF; + return MOBI_SUCCESS; +} + +/** + @brief Add reconstruced ncx part to rawml + + @param[in] ncx_xml OPF xml string + @param[in,out] rawml New data will be added to MOBIRawml rawml->resources structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_ncx_add_to_rawml(const char *ncx_xml, MOBIRawml *rawml) { + MOBIPart *ncx_part; + size_t uid = 0; + if (rawml->resources) { + MOBIPart *part = rawml->resources; + while (part->next) { + part = part->next; + } + uid = part->uid + 1; + part->next = calloc(1, sizeof(MOBIPart)); + ncx_part = part->next; + } + else { + rawml->resources = calloc(1, sizeof(MOBIPart)); + ncx_part = rawml->resources; + } + if (ncx_part == NULL) { + return MOBI_MALLOC_FAILED; + } + ncx_part->uid = uid; + ncx_part->next = NULL; + ncx_part->data = (unsigned char *) strdup(ncx_xml); + if (ncx_part->data == NULL) { + free(ncx_part); + ncx_part = NULL; + return MOBI_MALLOC_FAILED; + } + ncx_part->size = strlen(ncx_xml); + ncx_part->type = T_NCX; + return MOBI_SUCCESS; +} + +/** + @brief Write ncx header + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] opf OPF structure to fetch some data + @param[in] maxlevel Value of dtb:depth attribute + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_write_ncx_header(xmlTextWriterPtr writer, const OPF *opf, uint32_t maxlevel) { + /* write header */ + char depth[10 + 1]; + snprintf(depth, 11, "%d", maxlevel); + + /* */ + int xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "head"); + if (xml_ret < 0) { return MOBI_XML_ERR; } + /* meta uid */ + MOBI_RET ret = mobi_xml_write_meta(writer, "dtb:uid", opf->metadata->dc_meta->identifier[0]->value); + if (ret != MOBI_SUCCESS) { return ret; } + /* meta depth */ + ret = mobi_xml_write_meta(writer, "dtb:depth", depth); + if (ret != MOBI_SUCCESS) { return ret; } + /* meta pagecount */ + ret = mobi_xml_write_meta(writer, "dtb:totalPageCount", "0"); + if (ret != MOBI_SUCCESS) { return ret; } + /* meta pagenumber */ + ret = mobi_xml_write_meta(writer, "dtb:maxPageNumber", "0"); + if (ret != MOBI_SUCCESS) { return ret; } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { return MOBI_XML_ERR; } + // + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "docTitle"); + if (xml_ret < 0) { return MOBI_XML_ERR; } + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "text"); + if (xml_ret < 0) { return MOBI_XML_ERR; } + xml_ret = xmlTextWriterWriteString(writer, BAD_CAST opf->metadata->dc_meta->title[0]); + if (xml_ret < 0) { return MOBI_XML_ERR; } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { return MOBI_XML_ERR; } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { return MOBI_XML_ERR; } + return MOBI_SUCCESS; +} + +/** + @brief Build ncx document using libxml2 and append it to rawml + + @param[in,out] rawml MOBIRawml structure + @param[in] ncx Array of NCX structures with ncx content + @param[in] opf OPF structure to fetch some data + @param[in] maxlevel Value of dtb:depth attribute + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_write_ncx(MOBIRawml *rawml, const NCX *ncx, const OPF *opf, uint32_t maxlevel) { + const xmlChar * NCXNamespace = BAD_CAST "http://www.daisy.org/z3986/2005/ncx/"; + xmlBufferPtr buf = xmlBufferCreate(); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + xmlTextWriterPtr writer = xmlNewTextWriterMemory(buf, 0); + if (writer == NULL) { + xmlBufferFree(buf); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + xmlTextWriterSetIndent(writer, 1); + int xml_ret = xmlTextWriterStartDocument(writer, NULL, NULL, NULL); + if (xml_ret < 0) { goto cleanup; } + xml_ret = xmlTextWriterStartElementNS(writer, NULL, BAD_CAST "ncx", NCXNamespace); + if (xml_ret < 0) { goto cleanup; } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "version", BAD_CAST "2005-1"); + if (xml_ret < 0) { goto cleanup; } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "xml:lang", BAD_CAST opf->metadata->dc_meta->language[0]); + if (xml_ret < 0) { goto cleanup; } + + MOBI_RET ret = mobi_write_ncx_header(writer, opf, maxlevel); + if (ret != MOBI_SUCCESS) { goto cleanup; } + + /* start */ + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "navMap"); + if (xml_ret < 0) { goto cleanup; } + if (ncx && rawml->ncx->entries_count > 0) { + const size_t count = rawml->ncx->entries_count; + size_t seq = 1; + ret = mobi_write_ncx_level(writer, ncx, 0, 0, count - 1, &seq); + if (ret != MOBI_SUCCESS) { goto cleanup; } + } + + /* end */ + xml_ret = xmlTextWriterEndDocument(writer); + if (xml_ret < 0) { goto cleanup; } + xmlFreeTextWriter(writer); + const char *ncx_xml = (const char *) buf->content; + mobi_ncx_add_to_rawml(ncx_xml, rawml); + xmlBufferFree(buf); + return MOBI_SUCCESS; + +cleanup: + xmlFreeTextWriter(writer); + xmlBufferFree(buf); + debug_print("%s\n", "XML writing failed"); + return MOBI_XML_ERR; +} + + +/** + @brief Free array of ncx entries + + @param[in] ncx Array of NCX structures with ncx content + @param[in] count Size of the array + */ +void mobi_free_ncx(NCX *ncx, size_t count) { + if (ncx) { + while (count--) { + free(ncx[count].target); + free(ncx[count].text); + } + free(ncx); + } +} + +/** + @brief Parse ncx index, recreate ncx document and append it to rawml + + @param[in,out] rawml MOBIRawml structure + @param[in] opf OPF structure to fetch some data + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_build_ncx(MOBIRawml *rawml, const OPF *opf) { + /* parse ncx data */ + if (rawml == NULL) { + debug_print("%s\n", "Initialization failed"); + return MOBI_INIT_FAILED; + } + if (rawml->ncx && rawml->ncx->cncx_record) { + size_t i = 0; + uint32_t maxlevel = 0; + MOBI_RET ret; + const size_t count = rawml->ncx->entries_count; + if (count == 0) { + return MOBI_SUCCESS; + } + NCX *ncx = malloc(count * sizeof(NCX)); + if (ncx == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + MOBIAttrType pref_attr = ATTR_ID; + while (i < count) { + const MOBIIndexEntry *ncx_entry = &rawml->ncx->entries[i]; + const char *label = ncx_entry->label; + const size_t id = strtoul(label, NULL, 16); + uint32_t cncx_offset; + ret = mobi_get_indxentry_tagvalue(&cncx_offset, ncx_entry, INDX_TAG_NCX_TEXT_CNCX); + if (ret != MOBI_SUCCESS) { + mobi_free_ncx(ncx, i); + return ret; + } + const MOBIPdbRecord *cncx_record = rawml->ncx->cncx_record; + char *text = mobi_get_cncx_string_utf8(cncx_record, cncx_offset, rawml->ncx->encoding); + if (text == NULL) { + mobi_free_ncx(ncx, i); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + char *target = malloc(MOBI_ATTRNAME_MAXSIZE + 1); + if (target == NULL) { + free(text); + mobi_free_ncx(ncx, i); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + if (mobi_is_rawml_kf8(rawml)) { + uint32_t posfid; + ret = mobi_get_indxentry_tagvalue(&posfid, ncx_entry, INDX_TAG_NCX_POSFID); + if (ret != MOBI_SUCCESS) { + free(text); + free(target); + mobi_free_ncx(ncx, i); + return ret; + } + uint32_t posoff; + ret = mobi_get_indxentry_tagvalue(&posoff, ncx_entry, INDX_TAG_NCX_POSOFF); + if (ret != MOBI_SUCCESS) { + free(text); + free(target); + mobi_free_ncx(ncx, i); + return ret; + } + uint32_t filenumber; + char targetid[MOBI_ATTRNAME_MAXSIZE + 1]; + ret = mobi_get_id_by_posoff(&filenumber, targetid, rawml, posfid, posoff, &pref_attr); + if (ret != MOBI_SUCCESS) { + free(text); + free(target); + mobi_free_ncx(ncx, i); + return ret; + } + /* FIXME: posoff == 0 means top of file? */ + if (posoff) { + int n = snprintf(target, MOBI_ATTRNAME_MAXSIZE + 1, "part%05u.html#%s", filenumber, targetid); + if (n > MOBI_ATTRVALUE_MAXSIZE + 1) { + debug_print("Warning: truncated target: %s\n", target); + snprintf(target, MOBI_ATTRNAME_MAXSIZE + 1, "part%05u.html", filenumber); + } + } else { + snprintf(target, MOBI_ATTRNAME_MAXSIZE + 1, "part%05u.html", filenumber); + } + + } else { + uint32_t filepos; + ret = mobi_get_indxentry_tagvalue(&filepos, ncx_entry, INDX_TAG_NCX_FILEPOS); + if (ret != MOBI_SUCCESS) { + free(text); + free(target); + mobi_free_ncx(ncx, i); + return ret; + } + snprintf(target, MOBI_ATTRNAME_MAXSIZE + 1, "part00000.html#%010u", filepos); + } + uint32_t level; + ret = mobi_get_indxentry_tagvalue(&level, ncx_entry, INDX_TAG_NCX_LEVEL); + if (ret != MOBI_SUCCESS) { + free(text); + free(target); + mobi_free_ncx(ncx, i); + return ret; + } + if (level > maxlevel) { + maxlevel = level; + } + uint32_t parent = MOBI_NOTSET; + ret = mobi_get_indxentry_tagvalue(&parent, ncx_entry, INDX_TAG_NCX_PARENT); + if (ret == MOBI_INIT_FAILED) { + free(text); + free(target); + mobi_free_ncx(ncx, i); + return ret; + } + uint32_t first_child = MOBI_NOTSET; + ret = mobi_get_indxentry_tagvalue(&first_child, ncx_entry, INDX_TAG_NCX_CHILD_START); + if (ret == MOBI_INIT_FAILED) { + free(text); + free(target); + mobi_free_ncx(ncx, i); + return ret; + } + uint32_t last_child = MOBI_NOTSET; + ret = mobi_get_indxentry_tagvalue(&last_child, ncx_entry, INDX_TAG_NCX_CHILD_END); + if (ret == MOBI_INIT_FAILED) { + free(text); + free(target); + mobi_free_ncx(ncx, i); + return ret; + } + if ((first_child != MOBI_NOTSET && first_child >= rawml->ncx->entries_count) || + (last_child != MOBI_NOTSET && last_child >= rawml->ncx->entries_count) || + (parent != MOBI_NOTSET && parent >= rawml->ncx->entries_count)) { + free(text); + free(target); + mobi_free_ncx(ncx, i); + return MOBI_DATA_CORRUPT; + } + debug_print("seq=%zu, id=%zu, text='%s', target='%s', level=%u, parent=%u, fchild=%u, lchild=%u\n", i, id, text, target, level, parent, first_child, last_child); + ncx[i++] = (NCX) {id, text, target, level, parent, first_child, last_child}; + } + mobi_write_ncx(rawml, ncx, opf, maxlevel); + mobi_free_ncx(ncx, count); + } else { + mobi_write_ncx(rawml, NULL, opf, 1); + } + return MOBI_SUCCESS; +} + +/** + @brief Copy text data from EXTH record to array of strings + + It will allocate memory for the array if not already allocated. + It will find first array index that is not already used + + @param[in] m MOBIData structure + @param[in] exth MOBIExthHeader record + @param[in,out] array Array into which text string will be inserted + */ +static void mobi_opf_fill_tag(const MOBIData *m, const MOBIExthHeader *exth, char ***array) { + if (*array == NULL) { + *array = calloc(OPF_META_MAX_TAGS, sizeof(**array)); + if (*array == NULL) { + return; + } + } + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + /* find first free slot */ + if((*array)[i] != NULL) { i++; continue; } + MOBIExthMeta exth_tag = mobi_get_exthtagmeta_by_tag(exth->tag); + char *value = NULL; + if (exth_tag.type == EXTH_NUMERIC) { + value = malloc(10 + 1); + if (value) { + const uint32_t val32 = mobi_decode_exthvalue(exth->data, exth->size); + snprintf(value, 10 + 1, "%d", val32); + } + } else if (exth_tag.type == EXTH_STRING) { + value = mobi_decode_exthstring(m, exth->data, exth->size); + } + if (value) { + (*array)[i] = value; + } + return; + } + /* not enough tags */ + debug_print("OPF_META_MAX_TAGS = %i reached\n", OPF_META_MAX_TAGS); +} + +/** + @brief Set values for attributes of OPF tag + + It will allocate memory for the OPFmeta members: name and content. + It will find first array index that is not already used + + @param[in,out] meta Array of OPFmeta structures to be filled with data + @param[in] name Value of the name attribute + @param[in] content Value of the content attribute + */ +static void mobi_opf_set_meta(OPFmeta **meta, const char *name, const char *content) { + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + /* find first free slot */ + if(meta[i] != NULL) { i++; continue; } + meta[i] = malloc(sizeof(OPFmeta)); + if (meta[i] == NULL) { + return; + } + meta[i]->name = strdup(name); + meta[i]->content = strdup(content); + if (meta[i]->name == NULL || meta[i]->content == NULL) { + free(meta[i]); + meta[i] = NULL; + } + return; + } + /* not enough tags */ + debug_print("OPF_META_MAX_TAGS = %i reached\n", OPF_META_MAX_TAGS); +} + +/** + @brief Set values for attributes of OPF tag + + It will allocate memory for the OPFmeta members: name and content. + Content attribute will be copied from EXTH record. + It will find first array index that is not already used + + @param[in] m MOBIData structure + @param[in] exth MOBIExthHeader structure containing EXTH records + @param[in,out] meta Array of OPFmeta structures to be filled with data + @param[in] name Value of the name attribute + */ +static void mobi_opf_copy_meta(const MOBIData *m, const MOBIExthHeader *exth, OPFmeta **meta, const char *name) { + MOBIExthMeta exth_tag = mobi_get_exthtagmeta_by_tag(exth->tag); + char *content = NULL; + if (exth_tag.tag == EXTH_COVEROFFSET) { + content = malloc(13 + 1); + if (content) { + const uint32_t val32 = mobi_decode_exthvalue(exth->data, exth->size); + snprintf(content, 14, "resource%05d", val32); + } + } else if (exth_tag.type == EXTH_NUMERIC) { + content = malloc(10 + 1); + if (content) { + const uint32_t val32 = mobi_decode_exthvalue(exth->data, exth->size); + snprintf(content, 11, "%d", val32); + } + } else if (exth_tag.type == EXTH_STRING) { + char *string = mobi_decode_exthstring(m, exth->data, exth->size); + content = string; + } + if (content) { + mobi_opf_set_meta(meta, name, content); + free(content); + } +} + +/** + @brief Set values for attributes of OPF manifest tag + + It will allocate memory for the OPFitem members: id, href and media-type. + It will find first array index that is not already used + + @param[in,out] meta Array of OPFmeta structures to be filled with data + @param[in] name Value of the name attribute + @param[in] content Value of the content attribute + */ +void mobi_opf_set_item(OPFmeta **meta, const char *name, const char *content) { + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + /* find first free slot */ + if(meta[i] != NULL) { i++; continue; } + meta[i] = malloc(sizeof(OPFmeta)); + if (meta[i] == NULL) { + return; + } + meta[i]->name = strdup(name); + meta[i]->content = strdup(content); + if (meta[i]->name == NULL || meta[i]->content == NULL) { + free(meta[i]); + meta[i] = NULL; + } + return; + } + /* not enough tags */ + debug_print("OPF_META_MAX_TAGS = %i reached\n", OPF_META_MAX_TAGS); +} + +/** + @brief Copy text data from EXTH record to "member_name" member of a structure with given type + + Data will copied from curr->data. + It will allocate memory for the array of structures if not already allocated. + It will find first array index that is not already used + + @param[in] mobidata Mobidata structure + @param[in] struct_type Structure type defined with typedef + @param[in] struct_element Member member_name of this structure will be set to EXTH data + @param[in] member_name Structure member name that will be modified + */ +#define mobi_opf_copy_tagtype(mobidata, struct_type, struct_element, member_name) { \ + if (struct_element == NULL) { \ + struct_element = calloc(OPF_META_MAX_TAGS, sizeof(*struct_element)); \ + if(struct_element == NULL) { \ + debug_print("%s\n", "Memory allocation failed"); \ + return MOBI_MALLOC_FAILED; \ + } \ + } \ + struct_type **element = struct_element; \ + size_t i = 0; \ + while (i < OPF_META_MAX_TAGS) { \ + /* find first free slot */ \ + if(element[i] != NULL) { \ + if(element[i]->member_name != NULL) { i++; continue; } \ + } else { \ + element[i] = calloc(1, sizeof(*element[i])); \ + if(element[i] == NULL) { \ + debug_print("%s\n", "Memory allocation failed"); \ + return MOBI_MALLOC_FAILED; \ + } \ + } \ + MOBIExthMeta exth_tag = mobi_get_exthtagmeta_by_tag(curr->tag); \ + char *value = NULL; \ + MOBI_RET error_ret = MOBI_DATA_CORRUPT; \ + if (exth_tag.type == EXTH_NUMERIC) { \ + value = malloc(10 + 1); \ + if (value) { \ + const uint32_t val32 = mobi_decode_exthvalue(curr->data, curr->size); \ + snprintf(value, 10 + 1, "%d", val32); \ + } else { \ + error_ret = MOBI_MALLOC_FAILED; \ + } \ + } else if (exth_tag.type == EXTH_STRING) { \ + value = mobi_decode_exthstring(mobidata, curr->data, curr->size); \ + } \ + if(value == NULL) { \ + free(element[i]); \ + element[i] = NULL; \ + debug_print("%s\n", "Decoding failed"); \ + return error_ret; \ + } \ + element[i]->member_name = value; \ + break; \ + } \ + if (i == OPF_META_MAX_TAGS) { \ + /* not enough tags */ \ + debug_print("OPF_META_MAX_TAGS = %i reached\n", OPF_META_MAX_TAGS); \ + } \ +} + +/** + @brief Set "member_name" member of a structure with given type to string value + + It will allocate memory for the array of structures if not already allocated. + It will find first array index that is not already used + + @param[in] struct_type Structure type defined with typedef + @param[in] struct_element Member member_name of this structure will be set to EXTH data + @param[in] member_name Structure member name that will be modified + @param[in] string String value that will be assigned to the structure memeber + */ +#define mobi_opf_set_tagtype(struct_type, struct_element, member_name, string) { \ + if (struct_element == NULL) { \ + struct_element = calloc(OPF_META_MAX_TAGS, sizeof(*struct_element)); \ + if(struct_element == NULL) { \ + debug_print("%s\n", "Memory allocation failed"); \ + return MOBI_MALLOC_FAILED; \ + } \ + } \ + struct_type **element = struct_element; \ + size_t i = 0; \ + while (i < OPF_META_MAX_TAGS) { \ + /* find first free slot */ \ + if(element[i] != NULL) { \ + if(element[i]->member_name != NULL) { i++; continue; } \ + } else { \ + element[i] = calloc(1, sizeof(*element[i])); \ + if(element[i] == NULL) { \ + debug_print("%s\n", "Memory allocation failed"); \ + return MOBI_MALLOC_FAILED; \ + } \ + } \ + element[i]->member_name = strdup(string); \ + if(element[i]->member_name == NULL) { \ + free(element[i]); \ + element[i] = NULL; \ + debug_print("%s\n", "Memory allocation failed"); \ + return MOBI_MALLOC_FAILED; \ + } \ + break; \ + } \ + if (i == OPF_META_MAX_TAGS) { \ + /* not enough tags */ \ + debug_print("OPF_META_MAX_TAGS = %i reached\n", OPF_META_MAX_TAGS); \ + } \ +} + +/** + @brief Copy text data from EXTH record to OPFmetadata tags structure + + @param[in,out] metadata Structure OPFmetadata will be filled with parsed data + @param[in] m MOBIData structure with loaded data + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_opf_from_exth(OPFmetadata *metadata, const MOBIData *m) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + if (m->eh == NULL) { + return MOBI_INIT_FAILED; + } + MOBIExthHeader *curr = m->eh; + /* iterate through EXTH records */ + while (curr != NULL) { + switch (curr->tag) { + /* */ + case EXTH_DESCRIPTION: + mobi_opf_fill_tag(m, curr, &metadata->dc_meta->description); + break; + case EXTH_LANGUAGE: + mobi_opf_fill_tag(m, curr, &metadata->dc_meta->language); + break; + case EXTH_PUBLISHER: + mobi_opf_fill_tag(m, curr, &metadata->dc_meta->publisher); + break; + case EXTH_RIGHTS: + mobi_opf_fill_tag(m, curr, &metadata->dc_meta->rights); + break; + case EXTH_SOURCE: + mobi_opf_fill_tag(m, curr, &metadata->dc_meta->source); + break; + case EXTH_TITLE: + case EXTH_UPDATEDTITLE: + mobi_opf_fill_tag(m, curr, &metadata->dc_meta->title); + break; + case EXTH_TYPE: + mobi_opf_fill_tag(m, curr, &metadata->dc_meta->type); + break; + case EXTH_AUTHOR: + mobi_opf_copy_tagtype(m, OPFcreator, metadata->dc_meta->creator, value); + break; + case EXTH_CONTRIBUTOR: + mobi_opf_copy_tagtype(m, OPFcreator, metadata->dc_meta->contributor, value); + break; + case EXTH_SUBJECT: + mobi_opf_copy_tagtype(m, OPFsubject, metadata->dc_meta->subject, value); + break; + case EXTH_SUBJECTCODE: + mobi_opf_copy_tagtype(m, OPFsubject, metadata->dc_meta->subject, basic_code); + break; + case EXTH_ISBN: + mobi_opf_copy_tagtype(m, OPFidentifier, metadata->dc_meta->identifier, value); + mobi_opf_set_tagtype(OPFidentifier, metadata->dc_meta->identifier, scheme, "ISBN"); + break; + case EXTH_PUBLISHINGDATE: + mobi_opf_copy_tagtype(m, OPFdate, metadata->dc_meta->date, value); + mobi_opf_set_tagtype(OPFdate, metadata->dc_meta->date, event, "publication"); + break; + /* */ + case EXTH_ADULT: + mobi_opf_fill_tag(m, curr, &metadata->x_meta->adult); + break; + case EXTH_DICTNAME: + mobi_opf_fill_tag(m, curr, &metadata->x_meta->dict_short_name); + break; + case EXTH_DICTLANGIN: + mobi_opf_fill_tag(m, curr, &metadata->x_meta->dictionary_in_lang); + break; + case EXTH_DICTLANGOUT: + mobi_opf_fill_tag(m, curr, &metadata->x_meta->dictionary_out_lang); + break; + case EXTH_IMPRINT: + mobi_opf_fill_tag(m, curr, &metadata->x_meta->imprint); + break; + case EXTH_REVIEW: + mobi_opf_fill_tag(m, curr, &metadata->x_meta->review); + break; + case EXTH_PRICE: + mobi_opf_copy_tagtype(m, OPFsrp, metadata->x_meta->srp, value); + break; + case EXTH_CURRENCY: + mobi_opf_copy_tagtype(m, OPFsrp, metadata->x_meta->srp, currency); + break; + /* */ + case EXTH_FIXEDLAYOUT: + mobi_opf_copy_meta(m, curr, metadata->meta, "fixed-layout"); + break; + case EXTH_BOOKTYPE: + mobi_opf_copy_meta(m, curr, metadata->meta, "book-type"); + break; + case EXTH_ORIENTATIONLOCK: + mobi_opf_copy_meta(m, curr, metadata->meta, "orientation-lock"); + break; + case EXTH_ORIGRESOLUTION: + mobi_opf_copy_meta(m, curr, metadata->meta, "original-resolution"); + break; + case EXTH_ZEROGUTTER: + mobi_opf_copy_meta(m, curr, metadata->meta, "zero-gutter"); + break; + case EXTH_ZEROMARGIN: + mobi_opf_copy_meta(m, curr, metadata->meta, "zero-margin"); + break; + case EXTH_REGIONMAGNI: + mobi_opf_copy_meta(m, curr, metadata->meta, "region-mag"); + break; + case EXTH_ALIGNMENT: + mobi_opf_copy_meta(m, curr, metadata->meta, "primary-writing-mode"); + break; + case EXTH_OVERRIDEFONTS: + mobi_opf_copy_meta(m, curr, metadata->meta, "override-kindle-fonts"); + break; + case EXTH_COVEROFFSET: + mobi_opf_copy_meta(m, curr, metadata->meta, "cover"); + break; + default: + break; + } + curr = curr->next; + } + return MOBI_SUCCESS; +} + +/** + @brief Recreate OPF structure + + @param[in,out] opf Structure OPF->OPFmetadata will be filled with parsed data + @param[in] m MOBIData structure containing document metadata + @param[in] rawml MOBIRawml structure containing parsed records + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_build_opf_metadata(OPF *opf, const MOBIData *m, const MOBIRawml *rawml) { + if (m == NULL) { + debug_print("%s\n", "Initialization failed"); + return MOBI_INIT_FAILED; + } + opf->metadata = calloc(1, sizeof(OPFmetadata)); + if (opf->metadata == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + /* initialize metadata sub-elements */ + opf->metadata->meta = calloc(OPF_META_MAX_TAGS, sizeof(OPFmeta*)); + if (opf->metadata->meta == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + opf->metadata->dc_meta = calloc(1, sizeof(OPFdcmeta)); + if (opf->metadata->dc_meta == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + opf->metadata->x_meta = calloc(1, sizeof(OPFxmeta)); + if (opf->metadata->x_meta == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + if (m->eh) { + MOBI_RET ret = mobi_get_opf_from_exth(opf->metadata, m); + if (ret != MOBI_SUCCESS) { + return ret; + } + } + /* check for required elements */ + if (opf->metadata->dc_meta->identifier == NULL) { + /* default id will be "0" */ + char uid_string[11] = "0"; + if (m->mh && m->mh->uid) { + snprintf(uid_string, 11, "%u", *m->mh->uid); + } + mobi_opf_set_tagtype(OPFidentifier, opf->metadata->dc_meta->identifier, value, uid_string); + mobi_opf_set_tagtype(OPFidentifier, opf->metadata->dc_meta->identifier, id, "uid"); + } else { + opf->metadata->dc_meta->identifier[0]->id = strdup("uid"); + } + if (opf->metadata->dc_meta->title == NULL) { + opf->metadata->dc_meta->title = calloc(OPF_META_MAX_TAGS, sizeof(char*)); + if (opf->metadata->dc_meta->title == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + char *title = mobi_meta_get_title(m); + if (title == NULL) { + title = strdup("Unknown"); + } + opf->metadata->dc_meta->title[0] = title; + } + if (opf->metadata->dc_meta->language == NULL) { + opf->metadata->dc_meta->language = calloc(OPF_META_MAX_TAGS, sizeof(char*)); + if (opf->metadata->dc_meta->language == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + const char *lang_string = NULL; + if (m->mh && m->mh->locale) { + uint32_t lang_code = *m->mh->locale; + lang_string = mobi_get_locale_string(lang_code); + } + if (lang_string) { + opf->metadata->dc_meta->language[0] = strdup(lang_string); + } else { + opf->metadata->dc_meta->language[0] = strdup("en"); + } + } + /* write optional elements */ + if (mobi_is_dictionary(m)) { + if (opf->metadata->x_meta->dictionary_in_lang == NULL) { + if (m->mh && m->mh->dict_input_lang) { + uint32_t dict_lang_in = *m->mh->dict_input_lang; + const char *lang = mobi_get_locale_string(dict_lang_in); + if (lang) { + opf->metadata->x_meta->dictionary_in_lang = calloc(OPF_META_MAX_TAGS, sizeof(char*)); + if (opf->metadata->x_meta->dictionary_in_lang == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + opf->metadata->x_meta->dictionary_in_lang[0] = strdup(lang); + } + } + } + if (opf->metadata->x_meta->dictionary_out_lang == NULL) { + if (m->mh && m->mh->dict_output_lang) { + uint32_t dict_lang_out = *m->mh->dict_output_lang; + const char *lang = mobi_get_locale_string(dict_lang_out); + if (lang) { + opf->metadata->x_meta->dictionary_out_lang = calloc(OPF_META_MAX_TAGS, sizeof(char*)); + if (opf->metadata->x_meta->dictionary_out_lang == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + opf->metadata->x_meta->dictionary_out_lang[0] = strdup(lang); + } + } + } + if (rawml->orth && rawml->orth->orth_index_name) { + opf->metadata->x_meta->default_lookup_index = calloc(OPF_META_MAX_TAGS, sizeof(char*)); + if (opf->metadata->x_meta->default_lookup_index == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + opf->metadata->x_meta->default_lookup_index[0] = strdup(rawml->orth->orth_index_name); + } + } + return MOBI_SUCCESS; +} + +/** + @brief Write array of xml elements of given name to XML buffer + + Wrapper for libxml2 xmlTextWriterWriteElementNS() function. + Writes xml element for each not-null entry in the input array. + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] name XML element name + @param[in] content Array of XML element contents + @param[in] ns XML namespace string or NULL if empty + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_element_ns(xmlTextWriterPtr writer, const char *name, const char **content, const char *ns) { + if (content) { + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + if (content[i] == NULL) { + break; + } + xmlChar *namespace = NULL; + if (ns) { + namespace = BAD_CAST ns; + } + int xml_ret = xmlTextWriterWriteElementNS(writer, namespace, BAD_CAST name, NULL, BAD_CAST content[i]); + if (xml_ret < 0) { + debug_print("XML error: %i (name: %s, content: %s)\n", xml_ret, name, content[i]); + return MOBI_XML_ERR; + } + i++; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Write array of Dublin Core elements of given name to XML buffer + + Wrapper for libxml2 xmlTextWriterWriteElementNS() function. + Writes xml element for each not-null entry in the input array. + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] name XML element name + @param[in] content Array of XML element contents + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_dcmeta(xmlTextWriterPtr writer, const char *name, const char **content) { + return mobi_xml_write_element_ns(writer, name, content, "dc"); +} + +/** + @brief Write array of custom MOBI elements of given name to XML buffer + + Wrapper for libxml2 xmlTextWriterWriteElementNS() function. + Writes xml element for each not-null entry in the input array. + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] name XML element name + @param[in] content Array of XML element contents + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_xmeta(xmlTextWriterPtr writer, const char *name, const char **content) { + return mobi_xml_write_element_ns(writer, name, content, NULL); +} + +/** + @brief Write array of elements to XML buffer + + Wrapper for libxml2 xmlTextWriterWriteElement() function. + Writes xml element for each not-null entry in the input array. + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] meta Array of OPFmeta structures + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_opfmeta(xmlTextWriterPtr writer, const OPFmeta **meta) { + if (meta) { + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + if (meta[i] == NULL) { + break; + } + MOBI_RET ret = mobi_xml_write_meta(writer, meta[i]->name, meta[i]->content); + if (ret != MOBI_SUCCESS) { + return ret; + } + i++; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Write array of elements to XML buffer + + Wrapper for libxml2 xmlTextWriterWriteElement() function. + Writes xml element for each not-null entry in the input array. + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] reference Array of OPFreference structures + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_reference(xmlTextWriterPtr writer, const OPFreference **reference) { + if (reference) { + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + if (reference[i] == NULL) { + break; + } + int xml_ret; + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "reference"); + if (xml_ret < 0) { + debug_print("XML error: %i (reference type: %s)\n", xml_ret, reference[i]->type); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "type", BAD_CAST reference[i]->type); + if (xml_ret < 0) { + debug_print("XML error: %i (reference type: %s)\n", xml_ret, reference[i]->type); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "title", BAD_CAST reference[i]->title); + if (xml_ret < 0) { + debug_print("XML error: %i (reference type: %s)\n", xml_ret, reference[i]->type); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "href", BAD_CAST reference[i]->href); + if (xml_ret < 0) { + debug_print("XML error: %i (reference type: %s)\n", xml_ret, reference[i]->type); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { + debug_print("XML error: %i (reference type: %s)\n", xml_ret, reference[i]->type); + return MOBI_XML_ERR; + } + i++; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Write single element to XML buffer + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] id Attribute "id" + @param[in] href Attribute "href" + @param[in] media_type Attribute "media-type" + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_item(xmlTextWriterPtr writer, const char *id, const char *href, const char *media_type) { + int xml_ret; + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "item"); + if (xml_ret < 0) { + debug_print("XML error: %i (item id: %s)\n", xml_ret, id); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "id", BAD_CAST id); + if (xml_ret < 0) { + debug_print("XML error: %i (item id: %s)\n", xml_ret, id); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "href", BAD_CAST href); + if (xml_ret < 0) { + debug_print("XML error: %i (item id: %s)\n", xml_ret, id); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "media-type", BAD_CAST media_type); + if (xml_ret < 0) { + debug_print("XML error: %i (item id: %s)\n", xml_ret, id); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { + debug_print("XML error: %i (item id: %s)\n", xml_ret, id); + return MOBI_XML_ERR; + } + return MOBI_SUCCESS; +} + +/** + @brief Write opf part to XML buffer + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] rawml MOBIRawml structure containing parts metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_spine(xmlTextWriterPtr writer, const MOBIRawml *rawml) { + if (!rawml || !rawml->resources || !rawml->markup || !writer) { + return MOBI_INIT_FAILED; + } + /* get toc id */ + char ncxid[13 + 1]; + MOBIPart *curr = rawml->resources; + while (curr != NULL && curr->type != T_NCX) { + curr = curr->next; + } + if (curr) { + snprintf(ncxid, sizeof(ncxid), "resource%05zu", curr->uid); + } else { + return MOBI_DATA_CORRUPT; + } + int xml_ret; + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "spine"); + if (xml_ret < 0) { + debug_print("XML error: %i (spine)\n", xml_ret); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "toc", BAD_CAST ncxid); + if (xml_ret < 0) { + debug_print("XML error: %i (spine toc: %s)\n", xml_ret, ncxid); + return MOBI_XML_ERR; + } + char id[9 + 1]; + curr = rawml->markup; + while (curr != NULL) { + snprintf(id, sizeof(id), "part%05zu", curr->uid); + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "itemref"); + if (xml_ret < 0) { + debug_print("XML error: %i (itemref)\n", xml_ret); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "idref", BAD_CAST id); + if (xml_ret < 0) { + debug_print("XML error: %i (idref: %s)\n", xml_ret, id); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { + debug_print("XML error: %i (idref: %s)\n", xml_ret, id); + return MOBI_XML_ERR; + } + curr = curr->next; + } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { + debug_print("XML error: %i (spine)\n", xml_ret); + return MOBI_XML_ERR; + } + return MOBI_SUCCESS; +} + +/** + @brief Write all manifest elements to XML buffer + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] rawml MOBIRawml structure containing parts metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_manifest(xmlTextWriterPtr writer, const MOBIRawml *rawml) { + char href[256]; + char id[256]; + if (rawml->flow != NULL) { + MOBIPart *curr = rawml->flow; + /* skip first raw html part */ + curr = curr->next; + while (curr != NULL) { + MOBIFileMeta file_meta = mobi_get_filemeta_by_type(curr->type); + snprintf(href, sizeof(href), "flow%05zu.%s", curr->uid, file_meta.extension); + snprintf(id, sizeof(id), "flow%05zu", curr->uid); + MOBI_RET ret = mobi_xml_write_item(writer, id, href, file_meta.mime_type); + if (ret != MOBI_SUCCESS) { + return ret; + } + curr = curr->next; + } + } + if (rawml->markup != NULL) { + MOBIPart *curr = rawml->markup; + while (curr != NULL) { + MOBIFileMeta file_meta = mobi_get_filemeta_by_type(curr->type); + snprintf(href, sizeof(href), "part%05zu.%s", curr->uid, file_meta.extension); + snprintf(id, sizeof(id), "part%05zu", curr->uid); + MOBI_RET ret = mobi_xml_write_item(writer, id, href, file_meta.mime_type); + if (ret != MOBI_SUCCESS) { + return ret; + } + curr = curr->next; + } + } + if (rawml->resources != NULL) { + MOBIPart *curr = rawml->resources; + while (curr != NULL) { + MOBIFileMeta file_meta = mobi_get_filemeta_by_type(curr->type); + snprintf(href, sizeof(href), "resource%05zu.%s", curr->uid, file_meta.extension); + snprintf(id, sizeof(id), "resource%05zu", curr->uid); + MOBI_RET ret = mobi_xml_write_item(writer, id, href, file_meta.mime_type); + if (ret != MOBI_SUCCESS) { + return ret; + } + curr = curr->next; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Write array of Dublin Core identifier elements to XML buffer + + Wrapper for libxml2 xmlTextWriterWriteElementNS() function. + Writes xml element for each not-null entry in the input array. + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] identifier OPFidentifier structure representing identifier element + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_dcmeta_identifier(xmlTextWriterPtr writer, const OPFidentifier **identifier) { + if (identifier) { + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + if (identifier[i] == NULL || identifier[i]->value == NULL) { + break; + } + int xml_ret; + xml_ret = xmlTextWriterStartElementNS(writer, BAD_CAST "dc", BAD_CAST "identifier", NULL); + if (xml_ret < 0) { + debug_print("XML error: %i (identifier value: %s)\n", xml_ret, identifier[i]->value); + return MOBI_XML_ERR; + } + if (identifier[i]->id) { + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "id", BAD_CAST identifier[i]->id); + if (xml_ret < 0) { + debug_print("XML error: %i (identifier id: %s)\n", xml_ret, identifier[i]->id); + return MOBI_XML_ERR; + } + } + if (identifier[i]->scheme) { + xml_ret = xmlTextWriterWriteAttributeNS(writer, BAD_CAST "opf", BAD_CAST "scheme", NULL, BAD_CAST identifier[i]->scheme); + if (xml_ret < 0) { + debug_print("XML error: %i (identifier value: %s)\n", xml_ret, identifier[i]->value); + return MOBI_XML_ERR; + } + } + xml_ret = xmlTextWriterWriteString(writer, BAD_CAST identifier[i]->value); + if (xml_ret < 0) { + debug_print("XML error: %i (identifier value: %s)\n", xml_ret, identifier[i]->value); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { + debug_print("XML error: %i (identifier value: %s)\n", xml_ret, identifier[i]->value); + return MOBI_XML_ERR; + } + i++; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Write array of Dublin Core creator/contributor elements to XML buffer + + Wrapper for libxml2 xmlTextWriterWriteElementNS() function. + Writes xml element for each not-null entry in the input array. + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] creator OPFcreator structure representing creator/contributor element + @param[in] name OPF creator value + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_dcmeta_creator(xmlTextWriterPtr writer, const OPFcreator **creator, const char *name) { + if (creator) { + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + if (creator[i] == NULL || creator[i]->value == NULL) { + break; + } + int xml_ret; + xml_ret = xmlTextWriterStartElementNS(writer, BAD_CAST "dc", BAD_CAST name, NULL); + if (xml_ret < 0) { + debug_print("XML error: %i (creator value: %s)\n", xml_ret, creator[i]->value); + return MOBI_XML_ERR; + } + if (creator[i]->role) { + xml_ret = xmlTextWriterWriteAttributeNS(writer, BAD_CAST "opf", BAD_CAST "role", NULL, BAD_CAST creator[i]->role); + if (xml_ret < 0) { + debug_print("XML error: %i (creator role: %s)\n", xml_ret, creator[i]->role); + return MOBI_XML_ERR; + } + } + if (creator[i]->file_as) { + xml_ret = xmlTextWriterWriteAttributeNS(writer, BAD_CAST "opf", BAD_CAST "file-as", NULL, BAD_CAST creator[i]->file_as); + if (xml_ret < 0) { + debug_print("XML error: %i (creator file-as: %s)\n", xml_ret, creator[i]->file_as); + return MOBI_XML_ERR; + } + } + xml_ret = xmlTextWriterWriteString(writer, BAD_CAST creator[i]->value); + if (xml_ret < 0) { + debug_print("XML error: %i (creator value: %s)\n", xml_ret, creator[i]->value); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { + debug_print("XML error: %i (creator value: %s)\n", xml_ret, creator[i]->value); + return MOBI_XML_ERR; + } + i++; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Write array of Dublin Core subject elements to XML buffer + + Wrapper for libxml2 xmlTextWriterWriteElementNS() function. + Writes xml element for each not-null entry in the input array. + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] subject OPFsubject structure representing subject element + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_dcmeta_subject(xmlTextWriterPtr writer, const OPFsubject **subject) { + if (subject) { + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + if (subject[i] == NULL || subject[i]->value == NULL) { + break; + } + int xml_ret; + xml_ret = xmlTextWriterStartElementNS(writer, BAD_CAST "dc", BAD_CAST "subject", NULL); + if (xml_ret < 0) { + debug_print("XML error: %i (subject value: %s)\n", xml_ret, subject[i]->value); + return MOBI_XML_ERR; + } + if (subject[i]->basic_code) { + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "BASICCode", BAD_CAST subject[i]->basic_code); + if (xml_ret < 0) { + debug_print("XML error: %i (subject BASICCode: %s)\n", xml_ret, subject[i]->basic_code); + return MOBI_XML_ERR; + } + } + xml_ret = xmlTextWriterWriteString(writer, BAD_CAST subject[i]->value); + if (xml_ret < 0) { + debug_print("XML error: %i (subject value: %s)\n", xml_ret, subject[i]->value); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { + debug_print("XML error: %i (subject value: %s)\n", xml_ret, subject[i]->value); + return MOBI_XML_ERR; + } + i++; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Write array of Dublin Core date elements to XML buffer + + Wrapper for libxml2 xmlTextWriterWriteElementNS() function. + Writes xml element for each not-null entry in the input array. + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] date OPFdate structure representing date element + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_dcmeta_date(xmlTextWriterPtr writer, const OPFdate **date) { + if (date) { + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + if (date[i] == NULL || date[i]->value == NULL) { + break; + } + int xml_ret; + xml_ret = xmlTextWriterStartElementNS(writer, BAD_CAST "dc", BAD_CAST "date", NULL); + if (xml_ret < 0) { + debug_print("XML error: %i (date value: %s)\n", xml_ret, date[i]->value); + return MOBI_XML_ERR; + } + if (date[i]->event) { + xml_ret = xmlTextWriterWriteAttributeNS(writer, BAD_CAST "opf", BAD_CAST "event", NULL, BAD_CAST date[i]->event); + if (xml_ret < 0) { + debug_print("XML error: %i (date event: %s)\n", xml_ret, date[i]->event); + return MOBI_XML_ERR; + } + } + xml_ret = xmlTextWriterWriteString(writer, BAD_CAST date[i]->value); + if (xml_ret < 0) { + debug_print("XML error: %i (date value: %s)\n", xml_ret, date[i]->value); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { + debug_print("XML error: %i (date value: %s)\n", xml_ret, date[i]->value); + return MOBI_XML_ERR; + } + i++; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Write array of custom srp elements to XML buffer + + Wrapper for libxml2 xmlTextWriterWriteElementNS() function. + Writes xml element for each not-null entry in the input array. + + @param[in,out] writer xmlTextWriterPtr to write to + @param[in] srp OPFsrp structure representing srp element + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_xml_write_xmeta_srp(xmlTextWriterPtr writer, const OPFsrp **srp) { + if (srp) { + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + if (srp[i] == NULL || srp[i]->value == NULL) { + break; + } + int xml_ret; + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "srp"); + if (xml_ret < 0) { + debug_print("XML error: %i (srp value: %s)\n", xml_ret, srp[i]->value); + return MOBI_XML_ERR; + } + if (srp[i]->currency) { + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "currency", BAD_CAST srp[i]->currency); + if (xml_ret < 0) { + debug_print("XML error: %i (srp currency: %s)\n", xml_ret, srp[i]->currency); + return MOBI_XML_ERR; + } + } + xml_ret = xmlTextWriterWriteString(writer, BAD_CAST srp[i]->value); + if (xml_ret < 0) { + debug_print("XML error: %i (srp value: %s)\n", xml_ret, srp[i]->value); + return MOBI_XML_ERR; + } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { + debug_print("XML error: %i (srp value: %s)\n", xml_ret, srp[i]->value); + return MOBI_XML_ERR; + } + i++; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Free array of OPF sturcture members + + @param[in] array Array + */ +void mobi_free_opf_array(char **array) { + if (array) { + size_t i = 0; + while (i < OPF_META_MAX_TAGS) { + if (array[i] == NULL) { + break; + } + free(array[i]); + i++; + } + free(array); + } +} + +/** + @brief Macro to free generic OPF structure with two members + + @param[in] struct_array Structure name + @param[in] struct_member1 Structure member 1 + @param[in] struct_member2 Structure member 2 + */ +#define mobi_free_opf_struct_2el(struct_array, struct_member1, struct_member2) { \ + if (struct_array) { \ + size_t i = 0; \ + while (i < OPF_META_MAX_TAGS) { \ + if (struct_array[i] == NULL) { \ + break; \ + } \ + free(struct_array[i]->struct_member1); \ + free(struct_array[i]->struct_member2); \ + free(struct_array[i]); \ + i++; \ + } \ + free(struct_array); \ + } \ +} + +/** + @brief Macro to free generic OPF structure with three members + + @param[in] struct_array Structure name + @param[in] struct_member1 Structure member 1 + @param[in] struct_member2 Structure member 2 + @param[in] struct_member3 Structure member 3 + */ +#define mobi_free_opf_struct_3el(struct_array, struct_member1, struct_member2, struct_member3) { \ + if (struct_array) { \ + size_t i = 0; \ + while (i < OPF_META_MAX_TAGS) { \ + if (struct_array[i] == NULL) { \ + break; \ + } \ + free(struct_array[i]->struct_member1); \ + free(struct_array[i]->struct_member2); \ + free(struct_array[i]->struct_member3); \ + free(struct_array[i]); \ + i++; \ + } \ + free(struct_array); \ + } \ +} + +/** + @brief Free OPF metadata structure and data + + @param[in] metadata OPF opf->metadata structure + */ +void mobi_free_opf_metadata(OPFmetadata *metadata) { + if (metadata) { + /* */ + mobi_free_opf_struct_2el(metadata->meta, name, content); + /* */ + mobi_free_opf_struct_3el(metadata->dc_meta->contributor, value, file_as, role); + mobi_free_opf_struct_3el(metadata->dc_meta->creator, value, file_as, role); + mobi_free_opf_struct_3el(metadata->dc_meta->identifier, value, id, scheme); + mobi_free_opf_struct_2el(metadata->dc_meta->subject, value, basic_code); + mobi_free_opf_struct_2el(metadata->dc_meta->date, value, event); + mobi_free_opf_array(metadata->dc_meta->description); + mobi_free_opf_array(metadata->dc_meta->language); + mobi_free_opf_array(metadata->dc_meta->publisher); + mobi_free_opf_array(metadata->dc_meta->rights); + mobi_free_opf_array(metadata->dc_meta->source); + mobi_free_opf_array(metadata->dc_meta->title); + mobi_free_opf_array(metadata->dc_meta->type); + free(metadata->dc_meta); + /* */ + mobi_free_opf_struct_2el(metadata->x_meta->srp, value, currency); + mobi_free_opf_array(metadata->x_meta->adult); + mobi_free_opf_array(metadata->x_meta->default_lookup_index); + mobi_free_opf_array(metadata->x_meta->dict_short_name); + mobi_free_opf_array(metadata->x_meta->dictionary_in_lang); + mobi_free_opf_array(metadata->x_meta->dictionary_out_lang); + mobi_free_opf_array(metadata->x_meta->embedded_cover); + mobi_free_opf_array(metadata->x_meta->imprint); + mobi_free_opf_array(metadata->x_meta->review); + free(metadata->x_meta); + free(metadata); + } +} + +/** + @brief Free OPFmanifest structure and data + + @param[in] manifest OPF opf->manifest structure + */ +void mobi_free_opf_manifest(OPFmanifest *manifest) { + if (manifest) { + mobi_free_opf_struct_3el(manifest->item, id, href, media_type); + free(manifest); + } +} + +/** + @brief Free OPFspine structure and data + + @param[in] spine OPF opf->spine structure + */ +void mobi_free_opf_spine(OPFspine *spine) { + if (spine) { + mobi_free_opf_array(spine->itemref); + free(spine->toc); + free(spine); + } +} + +/** + @brief Free OPFguide structure and data + + @param[in] guide OPF opf->guide structure + */ +void mobi_free_opf_guide(OPFguide *guide) { + if (guide) { + mobi_free_opf_struct_3el(guide->reference, type, title, href); + free(guide); + } +} + +/** + @brief Free OPF structure and data + + @param[in] opf OPF structure + */ +void mobi_free_opf(OPF *opf) { + mobi_free_opf_metadata(opf->metadata); + mobi_free_opf_manifest(opf->manifest); + mobi_free_opf_spine(opf->spine); + mobi_free_opf_guide(opf->guide); +} + +/** + @brief Recreate OPF structure + + This function will fill OPF structure with parsed index data and convert it to xml file. The file will be stored in MOBIRawml structure. + + @param[in,out] rawml OPF xml file will be appended to rawml->markup linked list + @param[in] m MOBIData structure containing document metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_build_opf(MOBIRawml *rawml, const MOBIData *m) { + debug_print("Reconstructing opf%s", "\n"); + /* initialize libXML2 */ + LIBXML_TEST_VERSION + /* initialize OPF structure */ + OPF opf = { + .metadata = NULL, + .manifest = NULL, + .guide = NULL, + .spine = NULL + }; + MOBI_RET ret = mobi_build_opf_metadata(&opf, m, rawml); + if (ret != MOBI_SUCCESS) { + mobi_free_opf(&opf); + return ret; + } + mobi_build_ncx(rawml, &opf); + if (rawml->guide) { + ret = mobi_build_opf_guide(&opf, rawml); + if (ret != MOBI_SUCCESS) { + mobi_free_opf(&opf); + return ret; + } + } + + /* build OPF xml document */ + int xml_ret; + const xmlChar * OPFNamespace = BAD_CAST "http://www.idpf.org/2007/opf"; + const xmlChar * DCNamespace = BAD_CAST "http://purl.org/dc/elements/1.1/"; + xmlBufferPtr buf = xmlBufferCreate(); + if (buf == NULL) { + mobi_free_opf(&opf); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + xmlTextWriterPtr writer = xmlNewTextWriterMemory(buf, 0); + if (writer == NULL) { + xmlBufferFree(buf); + mobi_free_opf(&opf); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + xmlTextWriterSetIndent(writer, 1); + xml_ret = xmlTextWriterStartDocument(writer, NULL, NULL, NULL); + if (xml_ret < 0) { goto cleanup; } + /* */ + xml_ret = xmlTextWriterStartElementNS(writer, NULL, BAD_CAST "package", OPFNamespace); + if (xml_ret < 0) { goto cleanup; } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "version", BAD_CAST "2.0"); + if (xml_ret < 0) { goto cleanup; } + xml_ret = xmlTextWriterWriteAttribute(writer, BAD_CAST "unique-identifier", BAD_CAST "uid"); + if (xml_ret < 0) { goto cleanup; } + /* */ + xml_ret = xmlTextWriterStartElementNS(writer, NULL, BAD_CAST "metadata", NULL); + if (xml_ret < 0) { goto cleanup; } + /* */ + //xml_ret = xmlTextWriterStartElementNS(writer, NULL, BAD_CAST "dc-metadata", NULL); + //if (xml_ret < 0) { goto cleanup; } + xml_ret = xmlTextWriterWriteAttributeNS(writer, BAD_CAST "xmlns", BAD_CAST "opf", NULL, OPFNamespace); + if (xml_ret < 0) { goto cleanup; } + xml_ret = xmlTextWriterWriteAttributeNS(writer, BAD_CAST "xmlns", BAD_CAST "dc", NULL, DCNamespace); + if (xml_ret < 0) { goto cleanup; } + /* Dublin Core elements */ + OPFdcmeta *dc_meta = opf.metadata->dc_meta; + ret = mobi_xml_write_dcmeta(writer, "title", (const char **) dc_meta->title); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_dcmeta(writer, "description", (const char **) dc_meta->description); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_dcmeta(writer, "language", (const char **) dc_meta->language); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_dcmeta(writer, "publisher", (const char **) dc_meta->publisher); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_dcmeta(writer, "rights", (const char **) dc_meta->rights); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_dcmeta(writer, "source", (const char **) dc_meta->source); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_dcmeta(writer, "type", (const char **) dc_meta->type); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_dcmeta_identifier(writer, (const OPFidentifier **) dc_meta->identifier); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_dcmeta_creator(writer, (const OPFcreator **) dc_meta->creator, "creator"); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_dcmeta_creator(writer, (const OPFcreator **) dc_meta->contributor, "contributor"); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_dcmeta_subject(writer, (const OPFsubject **) dc_meta->subject); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_dcmeta_date(writer, (const OPFdate **) dc_meta->date); + if (ret != MOBI_SUCCESS) { goto cleanup; } + //xml_ret = xmlTextWriterEndElement(writer); + //if (xml_ret < 0) { goto cleanup; } + /* */ + //xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "x-metadata"); + //if (xml_ret < 0) { goto cleanup; } + OPFxmeta *x_meta = opf.metadata->x_meta; + /* custom elements */ + ret = mobi_xml_write_xmeta_srp(writer, (const OPFsrp **) x_meta->srp); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_xmeta(writer, "adult", (const char **) x_meta->adult); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_xmeta(writer, "DefaultLookupIndex", (const char **) x_meta->default_lookup_index); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_xmeta(writer, "DictionaryVeryShortName", (const char **) x_meta->dict_short_name); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_xmeta(writer, "DictionaryInLanguage", (const char **) x_meta->dictionary_in_lang); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_xmeta(writer, "DictionaryOutLanguage", (const char **) x_meta->dictionary_out_lang); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_xmeta(writer, "EmbeddedCover", (const char **) x_meta->embedded_cover); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_xmeta(writer, "imprint", (const char **) x_meta->imprint); + if (ret != MOBI_SUCCESS) { goto cleanup; } + ret = mobi_xml_write_xmeta(writer, "review", (const char **) x_meta->review); + if (ret != MOBI_SUCCESS) { goto cleanup; } + /* */ + ret = mobi_xml_write_opfmeta(writer, (const OPFmeta **) opf.metadata->meta); + if (ret != MOBI_SUCCESS) { goto cleanup; } + //xml_ret = xmlTextWriterEndElement(writer); + //if (xml_ret < 0) { goto cleanup; } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { goto cleanup; } + /* */ + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "manifest"); + if (xml_ret < 0) { goto cleanup; } + ret = mobi_xml_write_manifest(writer, rawml); + if (ret != MOBI_SUCCESS) { goto cleanup; } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { goto cleanup; } + /* */ + ret = mobi_xml_write_spine(writer, rawml); + if (ret != MOBI_SUCCESS) { goto cleanup; } + /* */ + if (opf.guide) { + xml_ret = xmlTextWriterStartElement(writer, BAD_CAST "guide"); + if (xml_ret < 0) { goto cleanup; } + ret = mobi_xml_write_reference(writer, (const OPFreference **) opf.guide->reference); + if (ret != MOBI_SUCCESS) { goto cleanup; } + xml_ret = xmlTextWriterEndElement(writer); + if (xml_ret < 0) { goto cleanup; } + } + xml_ret = xmlTextWriterEndDocument(writer); + if (xml_ret < 0) { goto cleanup; } + + xmlFreeTextWriter(writer); + const char *opf_xml = (const char *) buf->content; + mobi_opf_add_to_rawml(opf_xml, rawml); + xmlBufferFree(buf); + mobi_free_opf(&opf); + /* cleanup function for the XML library */ + xmlCleanupParser(); + return MOBI_SUCCESS; + +cleanup: + xmlFreeTextWriter(writer); + xmlBufferFree(buf); + mobi_free_opf(&opf); + xmlCleanupParser(); + debug_print("%s\n", "XML writing failed"); + return MOBI_XML_ERR; +} diff --git a/app/src/main/cpp/libmobi/src/opf.h b/app/src/main/cpp/libmobi/src/opf.h new file mode 100644 index 0000000..52b6c2d --- /dev/null +++ b/app/src/main/cpp/libmobi/src/opf.h @@ -0,0 +1,164 @@ +/** @file opf.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_opf_h +#define libmobi_opf_h + +#include "config.h" +#include "mobi.h" + +/** @brief Maximum number of opf meta tags */ +#define OPF_META_MAX_TAGS 256 + +/** + @defgroup mobi_opf OPF handling structures + @{ + */ + +/** @brief OPF element structure + + At least one identifier must have an id specified, + so it can be referenced from the package unique-identifier attribute. + */ +typedef struct { + char *value; /**< element value */ + char *id; /**< id attribute */ + char *scheme; /**< opf:scheme (optional) */ +} OPFidentifier; + +/** @brief OPF element structure + + Also applies to element + */ +typedef struct { + char *value; /**< element value */ + char *file_as; /**< opf:file-as attribute (optional) */ + char *role; /**< opf:role attribute (optional) */ +} OPFcreator; + +/** @brief OPF element structure */ +typedef struct { + char *value; /**< element value */ + char *basic_code; /**< BASICCode attribute (optional, non-standard) */ +} OPFsubject; + +/** @brief OPF element structure + + Format: YYYY[-MM[-DD]] + */ +typedef struct { + char *value; /**< element value */ + char *event; /**< opf:event attribute (optional) */ +} OPFdate; + +/** @brief OPF element structure */ +typedef struct { + OPFcreator **contributor; /**< element (optional) */ + OPFcreator **creator; /**< element (optional) */ + OPFidentifier **identifier; /**< element (required) */ + OPFsubject **subject; /**< element (optional) */ + OPFdate **date; /**< element (optional) */ + char **description; /**< element (optional) */ + char **language; /**< element (required) */ + char **publisher; /**< element (optional) */ + char **rights; /**< element (optional) */ + char **source; /**< element (optional) */ + char **title; /**< element (required) */ + char **type; /**< element (optional) */ +} OPFdcmeta; + +/** @brief OPF element structure */ +typedef struct { + char *value; /**< element value */ + char *currency; /**< currency attribute */ +} OPFsrp; + +/** @brief OPF element structure */ +typedef struct { + OPFsrp **srp; /**< element */ + char **adult; /**< element */ + char **default_lookup_index; /**< element */ + char **dict_short_name; /**< element */ + char **dictionary_in_lang; /**< element */ + char **dictionary_out_lang; /**< element */ + char **embedded_cover; /**< element */ + char **imprint; /**< element */ + char **review; /**< element */ +} OPFxmeta; + +/** @brief OPF element structure */ +typedef struct { + char *name; /**< name attribute (required) */ + char *content; /**< content attribute (required) */ +} OPFmeta; + +/** @brief OPF element structure */ +typedef struct { + OPFmeta **meta; /**< element (optional) */ + OPFdcmeta *dc_meta; /**< element */ + OPFxmeta *x_meta; /**< element */ +} OPFmetadata; + +/** @brief OPF element structure */ +typedef struct { + char *id; /**< id attribute (required) */ + char *href; /**< href attribute (required) */ + char *media_type; /**< media-type attribute (required) */ +} OPFitem; + +/** @brief OPF element structure */ +typedef struct { + OPFitem **item; /**< element */ +} OPFmanifest; + +/** @brief OPF element structure */ +typedef struct { + char *toc; /**< toc attribute (required) */ + char **itemref; /**< element */ +} OPFspine; + +/** @brief OPF tag structure */ +typedef struct { + char *type; /**< type attribute (required) */ + char *title; /**< title attribute */ + char *href; /**< href attribute (required) */ +} OPFreference; + +/** @brief OPF element structure */ +typedef struct { + OPFreference **reference; /**< element tag */ +} OPFguide; + +/** @brief OPF element structure */ +typedef struct { + //char *uid; /**< */ + OPFmetadata *metadata; /**< (required) */ + OPFmanifest *manifest; /**< (required) */ + OPFspine *spine; /**< (required) */ + OPFguide *guide; /**< (optional) */ +} OPF; + +/** @brief NCX index entry structure */ +typedef struct { + size_t id; /**< Sequential id */ + char *text; /**< Entry text content */ + char *target; /**< Entry target reference */ + size_t level; /**< Entry level */ + size_t parent; /**< Entry parent */ + size_t first_child; /**< First child id */ + size_t last_child; /**< Last child id */ +} NCX; +/** @} */ + + +MOBI_RET mobi_build_opf(MOBIRawml *rawml, const MOBIData *m); +MOBI_RET mobi_build_ncx(MOBIRawml *rawml, const OPF *opf); + +#endif diff --git a/app/src/main/cpp/libmobi/src/parse_rawml.c b/app/src/main/cpp/libmobi/src/parse_rawml.c new file mode 100644 index 0000000..08afaf6 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/parse_rawml.c @@ -0,0 +1,2199 @@ +/** @file parse_rawml.c + * @brief Functions for parsing rawml markup + * + * Copyright (c) 2020 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#define _GNU_SOURCE 1 +#ifndef __USE_BSD +#define __USE_BSD /* for strdup on linux/glibc */ +#endif + +#include +#include +#include +#include "parse_rawml.h" +#include "util.h" +#include "opf.h" +#include "structure.h" +#include "index.h" +#include "debug.h" +#if defined(__BIONIC__) && !defined(SIZE_MAX) +#include /* for SIZE_MAX */ +#endif + +/** + @brief Convert kindle:pos:fid:x:off:y to offset in rawml raw text file + + @param[in] rawml MOBIRawml parsed records structure + @param[in] pos_fid X value of pos:fid:x + @param[in] pos_off Y value of off:y + @return Offset in rawml buffer on success, SIZE_MAX otherwise + */ +size_t mobi_get_rawlink_location(const MOBIRawml *rawml, const uint32_t pos_fid, const uint32_t pos_off) { + if (!rawml || !rawml->frag || !rawml->frag->entries ) { + debug_print("%s", "Initialization failed\n"); + return SIZE_MAX; + } + if (pos_fid >= rawml->frag->entries_count) { + debug_print("%s", "pos_fid not found\n"); + return SIZE_MAX; + } + const MOBIIndexEntry *entry = &rawml->frag->entries[pos_fid]; + const size_t insert_position = strtoul(entry->label, NULL, 10); + size_t file_offset = insert_position + pos_off; + return file_offset; +} + +/** + @brief Find first occurence of attribute to be replaced in KF7 html + + It searches for filepos and recindex attributes + + @param[in,out] result MOBIResult structure will be filled with found data + @param[in] data_start Beginning of the memory area to search in + @param[in] data_end End of the memory area to search in + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_search_links_kf7(MOBIResult *result, const unsigned char *data_start, const unsigned char *data_end) { + if (!result) { + debug_print("Result structure is null%s", "\n"); + return MOBI_PARAM_ERR; + } + result->start = result->end = NULL; + *(result->value) = '\0'; + if (!data_start || !data_end) { + debug_print("Data is null%s", "\n"); + return MOBI_PARAM_ERR; + } + const char *needle1 = "filepos="; + const char *needle2 = "recindex="; + const size_t needle1_length = strlen(needle1); + const size_t needle2_length = strlen(needle2); + const size_t needle_length = max(needle1_length,needle2_length); + if (data_start + needle_length > data_end) { + return MOBI_SUCCESS; + } + unsigned char *data = (unsigned char *) data_start; + const unsigned char tag_open = '<'; + const unsigned char tag_close = '>'; + unsigned char last_border = tag_open; + while (data <= data_end) { + if (*data == tag_open || *data == tag_close) { + last_border = *data; + } + if (data + needle_length <= data_end && + (memcmp(data, needle1, needle1_length) == 0 || + memcmp(data, needle2, needle2_length) == 0)) { + /* found match */ + if (last_border != tag_open) { + /* opening char not found, not an attribute */ + data += needle_length; + continue; + } + /* go to attribute beginning */ + while (data >= data_start && !isspace(*data) && *data != tag_open) { + data--; + } + result->start = ++data; + /* now go forward */ + int i = 0; + while (data <= data_end && !isspace(*data) && *data != tag_close && i < MOBI_ATTRVALUE_MAXSIZE) { + result->value[i++] = (char) *data++; + } + /* self closing tag '/>' */ + if (data <= data_end && *(data - 1) == '/' && *data == '>') { + --data; --i; + } + result->end = data; + result->value[i] = '\0'; + return MOBI_SUCCESS; + } + data++; + } + return MOBI_SUCCESS; +} + +/** + @brief Find first occurence of markup attribute with given value + + @param[in,out] result MOBIResult structure will be filled with found data + @param[in] data_start Beginning of the memory area to search in + @param[in] data_end End of the memory area to search in + @param[in] type Type of data (T_HTML or T_CSS) + @param[in] needle String to find (len <= MOBI_ATTRNAME_MAXSIZE) + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_find_attrvalue(MOBIResult *result, const unsigned char *data_start, const unsigned char *data_end, const MOBIFiletype type, const char *needle) { + if (!result) { + debug_print("Result structure is null%s", "\n"); + return MOBI_PARAM_ERR; + } + result->start = result->end = NULL; + *(result->value) = '\0'; + if (!data_start || !data_end) { + debug_print("Data is null%s", "\n"); + return MOBI_PARAM_ERR; + } + size_t needle_length = strlen(needle); + if (needle_length > MOBI_ATTRNAME_MAXSIZE) { + debug_print("Attribute too long: %zu\n", needle_length); + return MOBI_PARAM_ERR; + } + if (data_start + needle_length > data_end) { + return MOBI_SUCCESS; + } + unsigned char *data = (unsigned char *) data_start; + unsigned char tag_open; + unsigned char tag_close; + if (type == T_CSS) { + tag_open = '{'; + tag_close = '}'; + } else { + tag_open = '<'; + tag_close = '>'; + } + unsigned char last_border = tag_close; + while (data <= data_end) { + if (*data == tag_open || *data == tag_close) { + last_border = *data; + } + if (data + needle_length <= data_end && memcmp(data, needle, needle_length) == 0) { + /* found match */ + if (last_border != tag_open) { + /* opening char not found, not an attribute */ + data += needle_length; + continue; + } + /* go to attribute value beginning */ + while (data >= data_start && !isspace(*data) && *data != tag_open && *data != '=' && *data != '(') { + data--; + } + result->is_url = (*data == '('); + result->start = ++data; + /* now go forward */ + int i = 0; + while (data <= data_end && !isspace(*data) && *data != tag_close && *data != ')' && i < MOBI_ATTRVALUE_MAXSIZE) { + result->value[i++] = (char) *data++; + } + /* self closing tag '/>' */ + if (data <= data_end && *(data - 1) == '/' && *data == '>') { + --data; --i; + } + result->end = data; + result->value[i] = '\0'; + return MOBI_SUCCESS; + } + data++; + } + return MOBI_SUCCESS; +} + +/** + @brief Find first occurence of markup attribute with given name + + @param[in,out] result MOBIResult structure will be filled with found data + @param[in] data_start Beginning of the memory area to search in + @param[in] data_end End of the memory area to search in + @param[in] attrname String to find (len < MOBI_ATTRNAME_MAXSIZE) + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_find_attrname(MOBIResult *result, const unsigned char *data_start, const unsigned char *data_end, const char *attrname) { + if (!result) { + debug_print("Result structure is null%s", "\n"); + return MOBI_PARAM_ERR; + } + result->start = result->end = NULL; + *(result->value) = '\0'; + if (!data_start || !data_end) { + debug_print("Data is null%s", "\n"); + return MOBI_PARAM_ERR; + } + char needle[MOBI_ATTRNAME_MAXSIZE + 1]; + snprintf(needle, MOBI_ATTRNAME_MAXSIZE + 1, "%s=", attrname); + size_t needle_length = strlen(needle); + if (data_start + needle_length > data_end) { + return MOBI_SUCCESS; + } + unsigned char *data = (unsigned char *) data_start; + const unsigned char quote = '"'; + const unsigned char tag_open = '<'; + const unsigned char tag_close = '>'; + unsigned char last_border = tag_close; + while (data <= data_end) { + if (*data == tag_open || *data == tag_close) { + last_border = *data; + } + if (data + needle_length + 2 <= data_end && memcmp(data, needle, needle_length) == 0) { + /* found match */ + if (last_border != tag_open) { + /* opening char not found, not an attribute */ + data += needle_length; + continue; + } + /* go to attribute name beginning */ + if (data > data_start) { + data--; + if (!isspace(*data) && *data != tag_open) { + /* wrong name */ + data += needle_length; + continue; + } + } + result->start = ++data; + /* now go forward */ + data += needle_length; + if (*data++ != quote) { + /* not well formed attribute */ + result->start = NULL; + continue; + } + while (data <= data_end) { + if (*data == quote) { + result->end = ++data; + return MOBI_SUCCESS; + } + data++; + } + result->start = NULL; + } + data++; + } + return MOBI_SUCCESS; +} + +/** + @brief Find first occurence of attribute part to be replaced in KF8 html/css + + It searches for "kindle:" value in attributes + + @param[in,out] result MOBIResult structure will be filled with found data + @param[in] data_start Beginning of the memory area to search in + @param[in] data_end End of the memory area to search in + @param[in] type Type of data (T_HTML or T_CSS) + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_search_links_kf8(MOBIResult *result, const unsigned char *data_start, const unsigned char *data_end, const MOBIFiletype type) { + return mobi_find_attrvalue(result, data_start, data_end, type, "kindle:"); +} + +/** + @brief Get value and offset of the first found attribute with given name + + @param[in,out] value String value of the attribute, will be filled by the function, zero length if not found + @param[in] data Data to search in + @param[in] size Data size + @param[in] attribute Attribute name + @param[in] only_quoted Require the value to be quoted if true, allow no quotes (eg. filepos=00001) if false + @return Offset from the beginning of the data, SIZE_MAX if not found + */ +size_t mobi_get_attribute_value(char *value, const unsigned char *data, const size_t size, const char *attribute, bool only_quoted) { + /* FIXME: this function could be replaced by mobi_find_attrvalue()? */ + if (!data) { + debug_print("Data is null%s", "\n"); + return SIZE_MAX; + } + size_t length = size; + size_t attr_length = strlen(attribute); + if (attr_length > MOBI_ATTRNAME_MAXSIZE) { + debug_print("Attribute too long: %zu\n", attr_length); + return SIZE_MAX; + } + char attr[MOBI_ATTRNAME_MAXSIZE + 2]; + strcpy(attr, attribute); + strcat(attr, "="); + attr_length++; + if (size < attr_length) { + return SIZE_MAX; + } + /* FIXME: search may start inside tag, so it is a safer option */ + unsigned char last_border = '\0'; + do { + if (*data == '<' || *data == '>') { + last_border = *data; + } + if (length > attr_length + 1 && memcmp(data, attr, attr_length) == 0) { + /* found match */ + size_t offset = size - length; + if (last_border == '>') { + /* We are in tag contents */ + data += attr_length; + length -= attr_length - 1; + continue; + } + /* previous character should be white space or opening tag */ + if (offset > 0) { + if (data[-1] != '<' && !isspace(data[-1])) { + data += attr_length; + length -= attr_length - 1; + continue; + } + } + /* now go forward */ + data += attr_length; + length -= attr_length; + unsigned char separator; + if (*data != '\'' && *data != '"') { + if (only_quoted) { + continue; + } + separator = ' '; + } else { + separator = *data; + data++; + length--; + } + size_t j; + for (j = 0; j < MOBI_ATTRVALUE_MAXSIZE && length && *data != separator && *data != '>'; j++) { + *value++ = (char) *data++; + length--; + } + /* self closing tag '/>' */ + if (length && *(data - 1) == '/' && *data == '>') { + value--; + } + *value = '\0'; + /* return offset to the beginning of the attribute value string */ + return size - length - j; + } + data++; + } while (--length); + value[0] = '\0'; + return SIZE_MAX; +} + +/** + @brief Get offset of the given value of an "aid" attribute in a given part + + @param[in] aid String value of "aid" attribute + @param[in] html MOBIPart html part + @return Offset from the beginning of the html part data, SIZE_MAX on failure + */ +size_t mobi_get_aid_offset(const MOBIPart *html, const char *aid) { + size_t length = html->size; + const char *data = (char *) html->data; + const size_t aid_length = strlen(aid); + const size_t attr_length = 5; /* "aid='" length */ + do { + if (length > (aid_length + attr_length) && memcmp(data, "aid=", attr_length - 1) == 0) { + data += attr_length; + length -= attr_length; + if (memcmp(data, aid, aid_length) == 0) { + if (data[aid_length] == '\'' || data[aid_length] == '"') { + return html->size - length; + } + } + } + data++; + } while (--length); + return SIZE_MAX; +} + +/** + @brief Convert kindle:pos:fid:x:off:y to skeleton part number and offset from the beginning of the part + + @param[in,out] file_number Will be set to file number value + @param[in,out] offset Offset from the beginning of the skeleton part + @param[in] rawml MOBIRawml parsed records structure + @param[in] pos_fid X value of pos:fid:x + @param[in] pos_off X value of pos:off:x + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_offset_by_posoff(uint32_t *file_number, size_t *offset, const MOBIRawml *rawml, const size_t pos_fid, const size_t pos_off) { + if (!rawml || !rawml->frag || !rawml->frag->entries || + !rawml->skel || !rawml->skel->entries) { + debug_print("%s", "Initialization failed\n"); + return MOBI_INIT_FAILED; + } + MOBI_RET ret; + if (pos_fid >= rawml->frag->entries_count) { + debug_print("Entry for pos:fid:%zu doesn't exist\n", pos_fid); + return MOBI_DATA_CORRUPT; + } + const MOBIIndexEntry entry = rawml->frag->entries[pos_fid]; + *offset = strtoul(entry.label, NULL, 10); + uint32_t file_nr; + ret = mobi_get_indxentry_tagvalue(&file_nr, &entry, INDX_TAG_FRAG_FILE_NR); + if (ret != MOBI_SUCCESS) { + return ret; + } + if (file_nr >= rawml->skel->entries_count) { + debug_print("Entry for skeleton part no %u doesn't exist\n", file_nr); + return MOBI_DATA_CORRUPT; + + } + const MOBIIndexEntry skel_entry = rawml->skel->entries[file_nr]; + uint32_t skel_position; + ret = mobi_get_indxentry_tagvalue(&skel_position, &skel_entry, INDX_TAG_SKEL_POSITION); + if (ret != MOBI_SUCCESS) { + return ret; + } + *offset -= skel_position; + *offset += pos_off; + *file_number = file_nr; + return MOBI_SUCCESS; +} + +/** + @brief Get value of the closest "aid" attribute following given offset in a given part + + @param[in,out] aid String value of "aid" attribute + @param[in] html MOBIPart html part + @param[in] offset Offset from the beginning of the part data + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_aid_by_offset(char *aid, const MOBIPart *html, const size_t offset) { + if (!aid || !html) { + debug_print("Parameter error (aid (%p), html (%p)\n", (void *) aid, (void *) html); + return MOBI_PARAM_ERR; + } + if (offset > html->size) { + debug_print("Parameter error: offset (%zu) > part size (%zu)\n", offset, html->size); + return MOBI_PARAM_ERR; + } + const unsigned char *data = html->data; + data += offset; + size_t length = html->size - offset; + + size_t off = mobi_get_attribute_value(aid, data, length, "aid", true); + if (off == SIZE_MAX) { + return MOBI_DATA_CORRUPT; + } + return MOBI_SUCCESS; +} + +/** + @brief Get value of the closest "id" or "name" attribute following given offset in a given part + + @param[in,out] id String value of found attribute + @param[in] html MOBIPart html part + @param[in] offset Offset from the beginning of the part data + @param[in,out] pref_attr Preferred attribute to link to (id or name) + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_id_by_offset(char *id, const MOBIPart *html, const size_t offset, MOBIAttrType *pref_attr) { + if (!id || !html) { + debug_print("Parameter error (id (%p), html (%p)\n", (void *) id, (void *) html); + return MOBI_PARAM_ERR; + } + if (offset > html->size) { + debug_print("Parameter error: offset (%zu) > part size (%zu)\n", offset, html->size); + return MOBI_PARAM_ERR; + } + const unsigned char *data = html->data; + data += offset; + size_t length = html->size - offset; + static const char * attributes[] = { + [ATTR_ID] = "id", + [ATTR_NAME] = "name", + }; + size_t off = mobi_get_attribute_value(id, data, length, attributes[*pref_attr], true); + if (off == SIZE_MAX) { + // try optional attribute + const MOBIAttrType opt_attr = (*pref_attr == ATTR_ID) ? ATTR_NAME : ATTR_ID; + off = mobi_get_attribute_value(id, data, length, attributes[opt_attr], true); + if (off == SIZE_MAX) { + id[0] = '\0'; + } else { + // save optional attribute as preferred + *pref_attr = opt_attr; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Convert kindle:pos:fid:x:off:y to html file number and closest "aid" attribute following the position + + @param[in,out] file_number Will be set to file number value + @param[in,out] aid String value of "aid" attribute + @param[in] rawml MOBIRawml parsed records structure + @param[in] pos_fid X value of pos:fid:x + @param[in] pos_off Y value of off:y + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_aid_by_posoff(uint32_t *file_number, char *aid, const MOBIRawml *rawml, const size_t pos_fid, const size_t pos_off) { + size_t offset; + MOBI_RET ret = mobi_get_offset_by_posoff(file_number, &offset, rawml, pos_fid, pos_off); + if (ret != MOBI_SUCCESS) { + return MOBI_DATA_CORRUPT; + } + const MOBIPart *html = mobi_get_part_by_uid(rawml, *file_number); + if (html == NULL) { + return MOBI_DATA_CORRUPT; + } + ret = mobi_get_aid_by_offset(aid, html, offset); + if (ret != MOBI_SUCCESS) { + return MOBI_DATA_CORRUPT; + } + return MOBI_SUCCESS; +} + +/** + @brief Convert kindle:pos:fid:x:off:y to html file number and closest "id" attribute following the position + + @param[in,out] file_number Will be set to file number value + @param[in,out] id String value of "id" attribute + @param[in] rawml MOBIRawml parsed records structure + @param[in] pos_fid X value of pos:fid:x + @param[in] pos_off Y value of off:y + @param[in,out] pref_attr Attribute to link to + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_id_by_posoff(uint32_t *file_number, char *id, const MOBIRawml *rawml, const size_t pos_fid, const size_t pos_off, MOBIAttrType *pref_attr) { + size_t offset; + MOBI_RET ret = mobi_get_offset_by_posoff(file_number, &offset, rawml, pos_fid, pos_off); + if (ret != MOBI_SUCCESS) { + return MOBI_DATA_CORRUPT; + } + const MOBIPart *html = mobi_get_part_by_uid(rawml, *file_number); + if (html == NULL) { + return MOBI_DATA_CORRUPT; + } + ret = mobi_get_id_by_offset(id, html, offset, pref_attr); + if (ret != MOBI_SUCCESS) { + return MOBI_DATA_CORRUPT; + } + return MOBI_SUCCESS; +} + +/** + @brief Parse resource records (images, fonts etc), determine their type, link to rawml + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @param[in,out] rawml Structure rawml->resources will be filled with parsed resources metadata and linked records data + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_reconstruct_resources(const MOBIData *m, MOBIRawml *rawml) { + size_t first_res_seqnumber = mobi_get_first_resource_record(m); + if (first_res_seqnumber == MOBI_NOTSET) { + /* search all records */ + first_res_seqnumber = 0; + } + const MOBIPdbRecord *curr_record = mobi_get_record_by_seqnumber(m, first_res_seqnumber); + if (curr_record == NULL) { + debug_print("First resource record not found at %zu, skipping resources\n", first_res_seqnumber); + return MOBI_SUCCESS; + } + size_t i = 0; + MOBIPart *head = NULL; + while (curr_record != NULL) { + const MOBIFiletype filetype = mobi_determine_resource_type(curr_record); + if (filetype == T_UNKNOWN) { + curr_record = curr_record->next; + i++; + continue; + } + if (filetype == T_BREAK) { + break; + } + + MOBIPart *curr_part = calloc(1, sizeof(MOBIPart));; + if (curr_part == NULL) { + debug_print("%s\n", "Memory allocation for flow part failed"); + return MOBI_MALLOC_FAILED; + } + curr_part->data = curr_record->data; + curr_part->size = curr_record->size; + curr_part->uid = i++; + curr_part->next = NULL; + + MOBI_RET ret = MOBI_SUCCESS; + if (filetype == T_FONT) { + ret = mobi_add_font_resource(curr_part); + if (ret != MOBI_SUCCESS) { + debug_print("%s\n", "Decoding font resource failed"); + } + } else if (filetype == T_AUDIO) { + ret = mobi_add_audio_resource(curr_part); + if (ret != MOBI_SUCCESS) { + debug_print("%s\n", "Decoding audio resource failed"); + } + } else if (filetype == T_VIDEO) { + ret = mobi_add_video_resource(curr_part); + if (ret != MOBI_SUCCESS) { + debug_print("%s\n", "Decoding video resource failed"); + } + } else { + curr_part->type = filetype; + } + + curr_record = curr_record->next; + + if (ret != MOBI_SUCCESS) { + free(curr_part); + curr_part = NULL; + } else if (head) { + head->next = curr_part; + head = curr_part; + } else { + rawml->resources = curr_part; + head = curr_part; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Parse Replica Print ebook (azw4). Extract pdf. + @todo Parse remaining data from the file + + @param[in,out] pdf Memory area will be filled with extracted pdf data + @param[in] text Raw decompressed text to be parsed + @param[in,out] length Text length. Will be updated with pdf_length on return + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_process_replica(unsigned char *pdf, const char *text, size_t *length) { + MOBI_RET ret = MOBI_SUCCESS; + MOBIBuffer *buf = mobi_buffer_init_null((unsigned char*) text, *length); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + mobi_buffer_setpos(buf, 12); + size_t pdf_offset = mobi_buffer_get32(buf); /* offset 12 */ + size_t pdf_length = mobi_buffer_get32(buf); /* 16 */ + if (pdf_length > *length) { + debug_print("PDF size from replica header too large: %zu", pdf_length); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + mobi_buffer_setpos(buf, pdf_offset); + mobi_buffer_getraw(pdf, buf, pdf_length); + ret = buf->error; + mobi_buffer_free_null(buf); + *length = pdf_length; + return ret; +} + +/** + @brief Parse raw text into flow parts + + @param[in,out] rawml Structure rawml->flow will be filled with parsed flow text parts + @param[in] text Raw decompressed text to be parsed + @param[in] length Text length + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_reconstruct_flow(MOBIRawml *rawml, const char *text, const size_t length) { + /* KF8 */ + if (rawml->fdst != NULL) { + rawml->flow = calloc(1, sizeof(MOBIPart)); + if (rawml->flow == NULL) { + debug_print("%s", "Memory allocation for flow part failed\n"); + return MOBI_MALLOC_FAILED; + } + /* split text into fdst structure parts */ + MOBIPart *curr = rawml->flow; + size_t i = 0; + const size_t section_count = rawml->fdst->fdst_section_count; + while (i < section_count) { + if (i > 0) { + curr->next = calloc(1, sizeof(MOBIPart)); + if (curr->next == NULL) { + debug_print("%s", "Memory allocation for flow part failed\n"); + return MOBI_MALLOC_FAILED; + } + curr = curr->next; + } + const uint32_t section_start = rawml->fdst->fdst_section_starts[i]; + const uint32_t section_end = rawml->fdst->fdst_section_ends[i]; + const size_t section_length = section_end - section_start; + if (section_start + section_length > length) { + debug_print("Wrong fdst section length: %zu\n", section_length); + return MOBI_DATA_CORRUPT; + } + unsigned char *section_data = malloc(section_length); + if (section_data == NULL) { + debug_print("%s", "Memory allocation failed\n"); + return MOBI_MALLOC_FAILED; + } + memcpy(section_data, (text + section_start), section_length); + curr->uid = i; + curr->data = section_data; + curr->type = mobi_determine_flowpart_type(rawml, i); + curr->size = section_length; + curr->next = NULL; + i++; + } + } else { + /* No FDST or FDST parts count = 1 */ + /* single flow part */ + rawml->flow = calloc(1, sizeof(MOBIPart)); + if (rawml->flow == NULL) { + debug_print("%s", "Memory allocation for flow part failed\n"); + return MOBI_MALLOC_FAILED; + } + MOBIPart *curr = rawml->flow; + size_t section_length = 0; + MOBIFiletype section_type = T_HTML; + unsigned char *section_data; + /* check if raw text is Print Replica */ + if (memcmp(text, REPLICA_MAGIC, 4) == 0) { + debug_print("%s", "Print Replica book\n"); + /* print replica */ + unsigned char *pdf = malloc(length); + if (pdf == NULL) { + debug_print("%s", "Memory allocation for flow part failed\n"); + return MOBI_MALLOC_FAILED; + } + section_length = length; + section_type = T_PDF; + const MOBI_RET ret = mobi_process_replica(pdf, text, §ion_length); + if (ret != MOBI_SUCCESS) { + free(pdf); + return ret; + } + section_data = malloc(section_length); + if (section_data == NULL) { + debug_print("%s", "Memory allocation failed\n"); + free(pdf); + return MOBI_MALLOC_FAILED; + } + memcpy(section_data, pdf, section_length); + free(pdf); + } else { + /* text data */ + section_length = length; + section_data = malloc(section_length); + if (section_data == NULL) { + debug_print("%s", "Memory allocation failed\n"); + return MOBI_MALLOC_FAILED; + } + memcpy(section_data, text, section_length); + } + curr->uid = 0; + curr->data = section_data; + curr->type = section_type; + curr->size = section_length; + curr->next = NULL; + } + return MOBI_SUCCESS; +} + +/** + @brief Parse raw html into html parts. Use index entries if present to parse file + + @param[in,out] rawml Structure rawml->markup will be filled with reconstructed html parts + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_reconstruct_parts(MOBIRawml *rawml) { + MOBI_RET ret; + if (rawml->flow == NULL) { + debug_print("%s", "Flow structure not initialized\n"); + return MOBI_INIT_FAILED; + } + /* take first part, xhtml */ + MOBIBuffer *buf = mobi_buffer_init_null(rawml->flow->data, rawml->flow->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + rawml->markup = calloc(1, sizeof(MOBIPart)); + if (rawml->markup == NULL) { + debug_print("%s", "Memory allocation for markup part failed\n"); + mobi_buffer_free_null(buf); + return MOBI_MALLOC_FAILED; + } + MOBIPart *curr = rawml->markup; + /* not skeleton data, just copy whole part to markup */ + if (rawml->skel == NULL || rawml->skel->entries_count == 0) { + unsigned char *data = malloc(buf->maxlen); + if (data == NULL) { + debug_print("%s", "Memory allocation failed\n"); + mobi_buffer_free_null(buf); + return MOBI_MALLOC_FAILED; + } + memcpy(data, buf->data, buf->maxlen); + curr->uid = 0; + curr->size = buf->maxlen; + curr->data = data; + curr->type = rawml->flow->type; + curr->next = NULL; + mobi_buffer_free_null(buf); + return MOBI_SUCCESS; + } + if (rawml->frag == NULL) { + debug_print("%s", "Missing frag part\n"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + /* parse skeleton data */ + size_t i = 0; + size_t j = 0; + size_t curr_position = 0; + size_t total_fragments_count = rawml->frag->total_entries_count; + while (i < rawml->skel->entries_count) { + const MOBIIndexEntry *entry = &rawml->skel->entries[i]; + uint32_t fragments_count; + ret = mobi_get_indxentry_tagvalue(&fragments_count, entry, INDX_TAG_SKEL_COUNT); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free_null(buf); + return ret; + } + if (fragments_count > total_fragments_count) { + debug_print("%s", "Wrong count of fragments\n"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + total_fragments_count -= fragments_count; + uint32_t skel_position; + ret = mobi_get_indxentry_tagvalue(&skel_position, entry, INDX_TAG_SKEL_POSITION); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free_null(buf); + return ret; + } + uint32_t skel_length; + ret = mobi_get_indxentry_tagvalue(&skel_length, entry, INDX_TAG_SKEL_LENGTH); + if (ret != MOBI_SUCCESS || skel_position + skel_length > buf->maxlen) { + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + debug_print("%zu\t%s\t%i\t%i\t%i\n", i, entry->label, fragments_count, skel_position, skel_length); + mobi_buffer_setpos(buf, skel_position); + + unsigned char *frag_buffer = mobi_buffer_getpointer(buf, skel_length); + if (frag_buffer == NULL) { + debug_print("%s\n", "Fragment data beyond buffer"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + MOBIFragment *first_fragment = mobi_list_add(NULL, 0, frag_buffer, skel_length, false); + MOBIFragment *current_fragment = first_fragment; + while (fragments_count--) { + entry = &rawml->frag->entries[j]; + uint32_t insert_position = (uint32_t) strtoul(entry->label, NULL, 10); + if (insert_position < curr_position) { + debug_print("Insert position (%u) before part start (%zu)\n", insert_position, curr_position); + mobi_buffer_free_null(buf); + mobi_list_del_all(first_fragment); + return MOBI_DATA_CORRUPT; + } + uint32_t file_number; + ret = mobi_get_indxentry_tagvalue(&file_number, entry, INDX_TAG_FRAG_FILE_NR); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free_null(buf); + mobi_list_del_all(first_fragment); + return ret; + } + if (file_number != i) { + debug_print("%s", "SKEL part number and fragment sequence number don't match\n"); + mobi_buffer_free_null(buf); + mobi_list_del_all(first_fragment); + return MOBI_DATA_CORRUPT; + } + uint32_t frag_length; + ret = mobi_get_indxentry_tagvalue(&frag_length, entry, INDX_TAG_FRAG_LENGTH); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free_null(buf); + mobi_list_del_all(first_fragment); + return ret; + } +#if (MOBI_DEBUG) + /* FIXME: this fragment metadata is currently unused */ + uint32_t seq_number; + ret = mobi_get_indxentry_tagvalue(&seq_number, entry, INDX_TAG_FRAG_SEQUENCE_NR); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free_null(buf); + mobi_list_del_all(first_fragment); + return ret; + } + uint32_t frag_position; + ret = mobi_get_indxentry_tagvalue(&frag_position, entry, INDX_TAG_FRAG_POSITION); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free_null(buf); + mobi_list_del_all(first_fragment); + return ret; + } + uint32_t cncx_offset; + ret = mobi_get_indxentry_tagvalue(&cncx_offset, entry, INDX_TAG_FRAG_AID_CNCX); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free_null(buf); + mobi_list_del_all(first_fragment); + return ret; + } + const MOBIPdbRecord *cncx_record = rawml->frag->cncx_record; + char *aid_text = mobi_get_cncx_string(cncx_record, cncx_offset); + if (aid_text == NULL) { + mobi_buffer_free_null(buf); + debug_print("%s\n", "Memory allocation failed"); + mobi_list_del_all(first_fragment); + return MOBI_MALLOC_FAILED; + } + debug_print("posfid[%zu]\t%i\t%i\t%s\t%i\t%i\t%i\t%i\n", j, insert_position, cncx_offset, aid_text, file_number, seq_number, frag_position, frag_length); + free(aid_text); +#endif + + insert_position -= curr_position; + if (skel_length < insert_position) { + debug_print("Insert position (%u) after part end (%u)\n", insert_position, skel_length); + /* FIXME: shouldn't the fragment be ignored? */ + /* For now insert it at the end. */ + insert_position = skel_length; + } + + frag_buffer = mobi_buffer_getpointer(buf, frag_length); + if (frag_buffer == NULL) { + debug_print("%s\n", "Fragment data beyond buffer"); + mobi_buffer_free_null(buf); + mobi_list_del_all(first_fragment); + return MOBI_DATA_CORRUPT; + } + + ret = mobi_list_insert(¤t_fragment, insert_position, frag_buffer, frag_length, false, insert_position); + if (ret == MOBI_SUCCESS) { + skel_length += frag_length; + } else if (ret != MOBI_DATA_CORRUPT) { + /* give up; on data corrupt try to skip broken entry */ + mobi_buffer_free_null(buf); + mobi_list_del_all(first_fragment); + return ret; + } + j++; + + } + char *skel_text = malloc(skel_length); + if (skel_text == NULL) { + debug_print("%s", "Memory allocation for markup data failed\n"); + mobi_buffer_free_null(buf); + mobi_list_del_all(first_fragment); + return MOBI_MALLOC_FAILED; + } + char *p = skel_text; + while (first_fragment) { + if (first_fragment->fragment) { + memcpy(p, first_fragment->fragment, first_fragment->size); + p += first_fragment->size; + } else { + debug_print("Skipping broken fragment in part %zu\n", i); + } + first_fragment = mobi_list_del(first_fragment); + } + if (i > 0) { + curr->next = calloc(1, sizeof(MOBIPart)); + if (curr->next == NULL) { + debug_print("%s", "Memory allocation for markup part failed\n"); + free(skel_text); + mobi_buffer_free_null(buf); + return MOBI_MALLOC_FAILED; + } + curr = curr->next; + } + curr->uid = i; + curr->size = skel_length; + curr->data = (unsigned char *) skel_text; + curr->type = T_HTML; + curr->next = NULL; + curr_position += skel_length; + i++; + } + mobi_buffer_free_null(buf); + return MOBI_SUCCESS; +} + +/** + @brief Scan html part and build array of filepos link target offsets + + @param[in,out] links MOBIArray structure for link target offsets array + @param[in] part MOBIPart html part structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_filepos_array(MOBIArray *links, const MOBIPart *part) { + if (!links || !part) { + return MOBI_INIT_FAILED; + } + size_t offset = 0; + size_t size = part->size; + unsigned char *data = part->data; + while (true) { + char val[MOBI_ATTRVALUE_MAXSIZE + 1]; + size -= offset; + data += offset; + offset = mobi_get_attribute_value(val, data, size, "filepos", false); + if (offset == SIZE_MAX) { break; } + size_t filepos = strtoul(val, NULL, 10); + if (filepos > UINT32_MAX || filepos == 0) { + debug_print("Filepos out of range: %zu\n", filepos); + continue; + } + MOBI_RET ret = array_insert(links, (uint32_t) filepos); + if (ret != MOBI_SUCCESS) { + return ret; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Scan ncx part and build array of filepos link target offsets. + + @param[in,out] links MOBIArray structure for link target offsets array + @param[in] rawml MOBIRawml parsed records structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_ncx_filepos_array(MOBIArray *links, const MOBIRawml *rawml) { + if (!links || !rawml) { + return MOBI_PARAM_ERR; + } + MOBIPart *part = rawml->resources; + while (part) { + if (part->type == T_NCX) { + size_t offset = 0; + size_t size = part->size; + unsigned char *data = part->data; + while (true) { + char val[MOBI_ATTRVALUE_MAXSIZE + 1]; + size -= offset; + data += offset; + offset = mobi_get_attribute_value(val, data, size, "src", false); + if (offset == SIZE_MAX) { break; } + /* part00000.html#0000000000 */ + uint32_t filepos = 0; + sscanf(val + 15, "%10u", &filepos); + MOBI_RET ret = array_insert(links, filepos); + if (ret != MOBI_SUCCESS) { + return ret; + } + } + } + part = part->next; + } + return MOBI_SUCCESS; +} + +/** + @brief Replace kindle:pos link with html href + + @param[in,out] link Memory area which will be filled with "part00000.html#customid", including quotation marks + @param[in] rawml Structure rawml + @param[in] value String kindle:pos:fid:0000:off:0000000000, without quotation marks + @param[in,out] pref_attr Preferred attribute to link to (id or name) + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_posfid_to_link(char *link, const MOBIRawml *rawml, const char *value, MOBIAttrType *pref_attr) { + /* "kindle:pos:fid:0000:off:0000000000" */ + /* extract fid and off */ + if (strlen(value) < (sizeof("kindle:pos:fid:0000:off:0000000000") - 1)) { + debug_print("Skipping too short link: %s\n", value); + *link = '\0'; + return MOBI_SUCCESS; + } + value += (sizeof("kindle:pos:fid:") - 1); + if (value[4] != ':') { + debug_print("Skipping malformed link: kindle:pos:fid:%s\n", value); + *link = '\0'; + return MOBI_SUCCESS; + } + char str_fid[4 + 1]; + strncpy(str_fid, value, 4); + str_fid[4] = '\0'; + char str_off[10 + 1]; + value += (sizeof("0001:off:") - 1); + strncpy(str_off, value, 10); + str_off[10] = '\0'; + + /* get file number and id value */ + uint32_t pos_off; + uint32_t pos_fid; + MOBI_RET ret = mobi_base32_decode(&pos_off, str_off); + if (ret != MOBI_SUCCESS) { + return ret; + } + ret = mobi_base32_decode(&pos_fid, str_fid); + if (ret != MOBI_SUCCESS) { + return ret; + } + uint32_t part_id; + char id[MOBI_ATTRVALUE_MAXSIZE + 1]; + ret = mobi_get_id_by_posoff(&part_id, id, rawml, pos_fid, pos_off, pref_attr); + if (ret != MOBI_SUCCESS) { + return ret; + } + /* FIXME: pos_off == 0 means top of file? */ + if (pos_off) { + int n = snprintf(link, MOBI_ATTRVALUE_MAXSIZE + 1, "\"part%05u.html#%s\"", part_id, id); + if (n > MOBI_ATTRVALUE_MAXSIZE + 1) { + debug_print("Skipping truncated link: %s\n", link); + *link = '\0'; + return MOBI_SUCCESS; + } + } else { + snprintf(link, MOBI_ATTRVALUE_MAXSIZE + 1, "\"part%05u.html\"", part_id); + } + return MOBI_SUCCESS; +} + +/** + @brief Replace kindle:flow link with html href + + @param[in,out] link Memory area which will be filled with "part00000.ext", including quotation marks + @param[in] rawml Structure rawml + @param[in] value String kindle:flow:0000?mime=type, without quotation marks + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_flow_to_link(char *link, const MOBIRawml *rawml, const char *value) { + /* "kindle:flow:0000?mime=" */ + *link = '\0'; + if (strlen(value) < (sizeof("kindle:flow:0000?mime=") - 1)) { + debug_print("Skipping too short link: %s\n", value); + return MOBI_SUCCESS; + } + value += (sizeof("kindle:flow:") - 1); + if (value[4] != '?') { + debug_print("Skipping broken link: kindle:flow:%s\n", value); + return MOBI_SUCCESS; + } + char str_fid[4 + 1]; + strncpy(str_fid, value, 4); + str_fid[4] = '\0'; + + MOBIPart *flow = mobi_get_flow_by_fid(rawml, str_fid); + if (flow == NULL) { + debug_print("Skipping broken link (missing resource): kindle:flow:%s\n", value); + return MOBI_SUCCESS; + } + MOBIFileMeta meta = mobi_get_filemeta_by_type(flow->type); + char *extension = meta.extension; + snprintf(link, MOBI_ATTRVALUE_MAXSIZE + 1, "\"flow%05zu.%s\"", flow->uid, extension); + return MOBI_SUCCESS; +} + +/** + @brief Replace kindle:embed link with html href + + @param[in,out] link Memory area which will be filled with "resource00000.ext", including quotation marks + @param[in] rawml Structure rawml + @param[in] value String kindle:embed:0000?mime=type, with optional quotation marks + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_embed_to_link(char *link, const MOBIRawml *rawml, const char *value) { + /* "kindle:embed:0000[?mime=]" */ + /* skip quotation marks or spaces */ + while (*value == '"' || *value == '\'' || isspace(*value)) { + value++; + } + *link = '\0'; + if (strlen(value) < (sizeof("kindle:embed:0000") - 1)) { + debug_print("Skipping too short link: %s\n", value); + return MOBI_SUCCESS; + } + value += (sizeof("kindle:embed:") - 1); + char str_fid[4 + 1]; + strncpy(str_fid, value, 4); + str_fid[4] = '\0'; + + /* get file number */ + uint32_t part_id; + MOBI_RET ret = mobi_base32_decode(&part_id, str_fid); + if (ret != MOBI_SUCCESS) { + debug_print("Skipping broken link (corrupt base32): kindle:embed:%s\n", value); + return MOBI_SUCCESS; + } + part_id--; + MOBIPart *resource = mobi_get_resource_by_uid(rawml, part_id); + if (resource == NULL) { + debug_print("Skipping broken link (missing resource): kindle:embed:%s\n", value); + return MOBI_SUCCESS; + } + MOBIFileMeta meta = mobi_get_filemeta_by_type(resource->type); + char *extension = meta.extension; + snprintf(link, MOBI_ATTRVALUE_MAXSIZE + 1, "\"resource%05u.%s\"", part_id, extension); + return MOBI_SUCCESS; +} + +/** + @brief Replace offset-links with html-links in KF8 markup + + @param[in,out] rawml Structure rawml will be filled with reconstructed parts and resources + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_reconstruct_links_kf8(const MOBIRawml *rawml) { + MOBIResult result; + + typedef struct NEWData { + size_t part_group; + size_t part_uid; + MOBIFragment *list; + size_t size; + struct NEWData *next; + } NEWData; + + NEWData *partdata = NULL; + NEWData *curdata = NULL; + MOBIPart *parts[] = { + rawml->markup, /* html files */ + rawml->flow->next /* css, skip first unparsed html part */ + }; + size_t i; + for (i = 0; i < 2; i++) { + MOBIPart *part = parts[i]; + while (part) { + if (part->data == NULL || part->size == 0) { + debug_print("Skipping empty part%s", "\n"); + part = part->next; + continue; + } + unsigned char *data_in = part->data; + result.start = part->data; + const unsigned char *data_end = part->data + part->size - 1; + MOBIFragment *first = NULL; + MOBIFragment *curr = NULL; + size_t part_size = 0; + MOBIAttrType pref_attr = ATTR_ID; + while (true) { + mobi_search_links_kf8(&result, result.start, data_end, part->type); + if (result.start == NULL) { + break; + } + char *value = (char *) result.value; + unsigned char *data_cur = result.start; + char *target = NULL; + if (data_cur < data_in) { + mobi_list_del_all(first); + return MOBI_DATA_CORRUPT; + } + size_t size = (size_t) (data_cur - data_in); + char link[MOBI_ATTRVALUE_MAXSIZE + 1]; + if ((target = strstr(value, "kindle:pos:fid:")) != NULL) { + /* "kindle:pos:fid:0001:off:0000000000" */ + /* replace link with href="part00000.html#00" */ + /* FIXME: this requires present target id or name attribute */ + MOBI_RET ret = mobi_posfid_to_link(link, rawml, target, &pref_attr); + if (ret != MOBI_SUCCESS) { + mobi_list_del_all(first); + return ret; + } + } else if ((target = strstr(value, "kindle:flow:")) != NULL) { + /* kindle:flow:0000?mime=text/css */ + /* replace link with href="flow00000.ext" */ + MOBI_RET ret = mobi_flow_to_link(link, rawml, target); + if (ret != MOBI_SUCCESS) { + mobi_list_del_all(first); + return ret; + } + } else if ((target = strstr(value, "kindle:embed:")) != NULL) { + /* kindle:embed:0000?mime=image/jpg */ + /* kindle:embed:0000 (font resources) */ + /* replace link with href="resource00000.ext" */ + MOBI_RET ret = mobi_embed_to_link(link, rawml, target); + if (ret != MOBI_SUCCESS) { + mobi_list_del_all(first); + return ret; + } + } + if (target && *link != '\0') { + /* first chunk */ + curr = mobi_list_add(curr, (size_t) (data_in - part->data), data_in, size, false); + if (curr == NULL) { + mobi_list_del_all(first); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + if (!first) { first = curr; } + part_size += curr->size; + /* second chunk */ + /* strip quotes if is_url */ + curr = mobi_list_add(curr, SIZE_MAX, + (unsigned char *) strdup(link + result.is_url), + strlen(link) - 2 * result.is_url, true); + if (curr == NULL) { + mobi_list_del_all(first); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + part_size += curr->size; + data_in = result.end; + } + } + if (first && first->fragment) { + /* last chunk */ + if (part->data + part->size < data_in) { + mobi_list_del_all(first); + return MOBI_DATA_CORRUPT; + } + size_t size = (size_t) (part->data + part->size - data_in); + curr = mobi_list_add(curr, (size_t) (data_in - part->data), data_in, size, false); + if (curr == NULL) { + mobi_list_del_all(first); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + part_size += curr->size; + /* save */ + if (!curdata) { + curdata = calloc(1, sizeof(NEWData)); + partdata = curdata; + } else { + curdata->next = calloc(1, sizeof(NEWData)); + curdata = curdata->next; + } + curdata->part_group = i; + curdata->part_uid = part->uid; + curdata->list = first; + curdata->size = part_size; + } + part = part->next; + } + } + /* now update parts */ + debug_print("Inserting links%s", "\n"); + for (i = 0; i < 2; i++) { + MOBIPart *part = parts[i]; + while (part) { + if (partdata && part->uid == partdata->part_uid && i == partdata->part_group) { + MOBIFragment *fragdata = partdata->list; + unsigned char *new_data = malloc(partdata->size); + if (new_data == NULL) { + mobi_list_del_all(fragdata); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + unsigned char *data_out = new_data; + while (fragdata) { + memcpy(data_out, fragdata->fragment, fragdata->size); + data_out += fragdata->size; + fragdata = mobi_list_del(fragdata); + } + free(part->data); + part->data = new_data; + part->size = partdata->size; + NEWData *partused = partdata; + partdata = partdata->next; + free(partused); + } + part = part->next; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Get infl index markup for given orth entry + + @param[in,out] outstring Reconstructed tag + @param[in] infl MOBIIndx structure with parsed infl index + @param[in] orth_entry Orth index entry + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_reconstruct_infl(char *outstring, const MOBIIndx *infl, const MOBIIndexEntry *orth_entry) { + const char *label = orth_entry->label; + uint32_t *infl_groups = NULL; + size_t infl_count = mobi_get_indxentry_tagarray(&infl_groups, orth_entry, INDX_TAGARR_ORTH_INFL); + + if (infl_count == 0 || !infl_groups) { + return MOBI_SUCCESS; + } + const char *start_tag = ""; + const char *end_tag = ""; + const char *iform_tag = ""; + char name_attr[INDX_INFLBUF_SIZEMAX + 1]; + char infl_tag[INDX_INFLBUF_SIZEMAX + 1]; + strcpy(outstring, start_tag); + size_t initlen = strlen(start_tag) + strlen(end_tag); + size_t outlen = initlen; + size_t label_length = strlen(label); + if (label_length > INDX_INFLBUF_SIZEMAX) { + debug_print("Entry label too long (%s)\n", label); + return MOBI_DATA_CORRUPT; + } + if (infl->cncx_record == NULL) { + debug_print("%s\n", "Missing cncx record"); + return MOBI_DATA_CORRUPT; + } + for (size_t i = 0; i < infl_count; i++) { + size_t offset = infl_groups[i]; + if (offset >= infl->entries_count) { + debug_print("%s\n", "Invalid entry offset"); + return MOBI_DATA_CORRUPT; + } + uint32_t *groups; + size_t group_cnt = mobi_get_indxentry_tagarray(&groups, &infl->entries[offset], INDX_TAGARR_INFL_GROUPS); + uint32_t *parts; + size_t part_cnt = mobi_get_indxentry_tagarray(&parts, &infl->entries[offset], INDX_TAGARR_INFL_PARTS_V2); + if (group_cnt != part_cnt) { + return MOBI_DATA_CORRUPT; + } + for (size_t j = 0; j < part_cnt; j++) { + name_attr[0] = '\0'; + char *group_name = mobi_get_cncx_string(infl->cncx_record, groups[j]); + if (group_name == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + if (strlen(group_name)) { + snprintf(name_attr, INDX_INFLBUF_SIZEMAX, " name=\"%s\"", group_name); + } + free(group_name); + + unsigned char decoded[INDX_INFLBUF_SIZEMAX + 1]; + memset(decoded, 0, INDX_INFLBUF_SIZEMAX + 1); + if (parts[j] >= infl->entries_count) { + debug_print("%s\n", "Invalid entry offset"); + return MOBI_DATA_CORRUPT; + } + unsigned char *rule = (unsigned char *) infl->entries[parts[j]].label; + memcpy(decoded, label, label_length); + int decoded_length = (int) label_length; + MOBI_RET ret = mobi_decode_infl(decoded, &decoded_length, rule); + if (ret != MOBI_SUCCESS) { + return ret; + } + if (decoded_length == 0) { + continue; + } + int n = snprintf(infl_tag, INDX_INFLBUF_SIZEMAX, iform_tag, name_attr, decoded); + if (n > INDX_INFLBUF_SIZEMAX) { + debug_print("Skipping truncated tag: %s\n", infl_tag); + continue; + } + outlen += strlen(infl_tag); + if (outlen > INDX_INFLTAG_SIZEMAX) { + debug_print("Inflections text in %s too long (%zu)\n", label, outlen); + return MOBI_ERROR; + } + strcat(outstring, infl_tag); + } + } + if (outlen == initlen) { + outstring[0] = '\0'; + } else { + strcat(outstring, end_tag); + } + return MOBI_SUCCESS; +} + +/** + @brief Get infl index markup for given orth entry + + This function is inflections scheme used in older mobipocket dictionaries + + @param[in,out] outstring Reconstructed tag + @param[in] infl_tree MOBITrie structure with inflection rules + @param[in] orth_entry Orth index entry + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_reconstruct_infl_v1(char *outstring, MOBITrie * const infl_tree, const MOBIIndexEntry *orth_entry) { + const char *label = orth_entry->label; + const size_t label_length = strlen(label); + if (label_length > INDX_INFLBUF_SIZEMAX) { + debug_print("Entry label too long (%s)\n", label); + return MOBI_DATA_CORRUPT; + } + char *infl_strings[INDX_INFLSTRINGS_MAX]; + size_t infl_count = mobi_trie_get_inflgroups(infl_strings, infl_tree, label); + + if (infl_count == 0) { + return MOBI_SUCCESS; + } + + const char *start_tag = ""; + const char *end_tag = ""; + const char *iform_tag = ""; + char infl_tag[INDX_INFLBUF_SIZEMAX + 1]; + strcpy(outstring, start_tag); + size_t initlen = strlen(start_tag) + strlen(end_tag); + size_t outlen = initlen; + for (size_t i = 0; i < infl_count; i++) { + char *decoded = infl_strings[i]; + size_t decoded_length = strlen(decoded); + + if (decoded_length == 0) { + free(decoded); + continue; + } + int n = snprintf(infl_tag, INDX_INFLBUF_SIZEMAX, iform_tag, decoded); + /* allocated in mobi_trie_get_inflgroups() */ + free(decoded); + if (n > INDX_INFLBUF_SIZEMAX) { + debug_print("Skipping too long tag: %s\n", infl_tag); + continue; + } + outlen += strlen(infl_tag); + if (outlen > INDX_INFLTAG_SIZEMAX) { + debug_print("Inflections text in %s too long (%zu)\n", label, outlen); + break; + } + strcat(outstring, infl_tag); + } + if (outlen == initlen) { + outstring[0] = '\0'; + } else { + strcat(outstring, end_tag); + } + return MOBI_SUCCESS; +} + +/** + @brief Insert orth index markup to linked list of fragments + + @param[in] rawml Structure rawml contains orth index data + @param[in,out] first First element of the linked list + @param[in,out] new_size Counter to be updated with inserted fragments size + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_reconstruct_orth(const MOBIRawml *rawml, MOBIFragment *first, size_t *new_size) { + MOBITrie *infl_trie = NULL; + bool is_infl_v2 = mobi_indx_has_tag(rawml->orth, INDX_TAGARR_ORTH_INFL); + bool is_infl_v1 = false; + if (is_infl_v2 == false) { + is_infl_v1 = mobi_indx_has_tag(rawml->infl, INDX_TAGARR_INFL_PARTS_V1); + } + debug_print("Reconstructing orth index %s\n", (is_infl_v1)?"(infl v1)":(is_infl_v2)?"(infl v2)":""); + if (is_infl_v1) { + size_t total = rawml->infl->entries_count; + size_t j = 0; + while (j < total) { + MOBI_RET ret = mobi_trie_insert_infl(&infl_trie, rawml->infl, j++); + if (ret != MOBI_SUCCESS || infl_trie == NULL) { + debug_print("Building trie for inflections failed%s", "\n"); + mobi_trie_free(infl_trie); + is_infl_v1 = false; + } + } + } + + MOBIFragment *curr = first; + size_t i = 0; + const size_t count = rawml->orth->entries_count; + const char *start_tag1 = "%s"; + const char *start_tag2 = "%s"; + const char *end_tag = ""; + const size_t start_tag1_len = strlen(start_tag1) - 4; + const size_t start_tag2_len = strlen(start_tag2) - 4; + const size_t end_tag_len = strlen(end_tag); + uint32_t prev_startpos = 0; + while (i < count) { + const MOBIIndexEntry *orth_entry = &rawml->orth->entries[i]; + const char *label = orth_entry->label; + uint32_t entry_startpos; + MOBI_RET ret = mobi_get_indxentry_tagvalue(&entry_startpos, orth_entry, INDX_TAG_ORTH_POSITION); + if (ret != MOBI_SUCCESS) { + i++; + continue; + } + size_t entry_length = 0; + uint32_t entry_textlen = 0; + mobi_get_indxentry_tagvalue(&entry_textlen, orth_entry, INDX_TAG_ORTH_LENGTH); + char *start_tag; + if (entry_textlen == 0) { + entry_length += start_tag1_len + strlen(label); + start_tag = (char *) start_tag1; + } else { + entry_length += start_tag2_len + strlen(label); + start_tag = (char *) start_tag2; + } + + char *entry_text; + if (rawml->infl) { + char *infl_tag = malloc(INDX_INFLTAG_SIZEMAX + 1); + if (infl_tag == NULL) { + debug_print("%s\n", "Memory allocation failed"); + mobi_trie_free(infl_trie); + return MOBI_MALLOC_FAILED; + } + infl_tag[0] = '\0'; + if (is_infl_v2) { + ret = mobi_reconstruct_infl(infl_tag, rawml->infl, orth_entry); + } else if (is_infl_v1) { + ret = mobi_reconstruct_infl_v1(infl_tag, infl_trie, orth_entry); + } else { + debug_print("Unknown inflection scheme?%s", "\n"); + } + if (ret != MOBI_SUCCESS) { + free(infl_tag); + return ret; + } + entry_length += strlen(infl_tag); + + entry_text = malloc(entry_length + 1); + if (entry_text == NULL) { + debug_print("%s\n", "Memory allocation failed"); + mobi_trie_free(infl_trie); + free(infl_tag); + return MOBI_MALLOC_FAILED; + } + snprintf(entry_text, entry_length + 1, start_tag, label, infl_tag); + free(infl_tag); + } else { + entry_text = malloc(entry_length + 1); + if (entry_text == NULL) { + debug_print("%s\n", "Memory allocation failed"); + mobi_trie_free(infl_trie); + return MOBI_MALLOC_FAILED; + } + snprintf(entry_text, entry_length + 1, start_tag, label, ""); + } + + if (entry_startpos < prev_startpos) { + curr = first; + } + + ret = mobi_list_insert(&curr, SIZE_MAX, + (unsigned char *) entry_text, + entry_length, true, entry_startpos); + prev_startpos = entry_startpos; + + if (ret == MOBI_SUCCESS) { + *new_size += curr->size; + if (entry_textlen > 0) { + /* FIXME: avoid end_tag duplication */ + ret = mobi_list_insert(&curr, SIZE_MAX, + (unsigned char *) strdup(end_tag), + end_tag_len, true, entry_startpos + entry_textlen); + if (ret == MOBI_SUCCESS) { + *new_size += curr->size; + } else if (ret != MOBI_DATA_CORRUPT) { + mobi_trie_free(infl_trie); + return ret; + } + + } + } else if (ret != MOBI_DATA_CORRUPT) { + /* give up; on data corrupt try to skip broken entry */ + mobi_trie_free(infl_trie); + return ret; + } + i++; + } + mobi_trie_free(infl_trie); + return MOBI_SUCCESS; +} + +/** + @brief Replace offset-links with html-links in KF7 markup. + Also reconstruct dictionary markup if present + + @param[in,out] rawml Structure rawml will be filled with reconstructed parts and resources + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_reconstruct_links_kf7(const MOBIRawml *rawml) { + MOBIResult result; + MOBIArray *links = array_init(25); + if (links == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + MOBIPart *part = rawml->markup; + /* get array of link target offsets */ + MOBI_RET ret = mobi_get_filepos_array(links, part); + if (ret != MOBI_SUCCESS) { + array_free(links); + return ret; + } + ret = mobi_get_ncx_filepos_array(links, rawml); + if (ret != MOBI_SUCCESS) { + array_free(links); + return ret; + } + array_sort(links, true); + unsigned char *data_in = part->data; + MOBIFragment *first = NULL; + MOBIFragment *curr = NULL; + size_t new_size = 0; + /* build MOBIResult list */ + result.start = part->data; + const unsigned char *data_end = part->data + part->size - 1; + while (true) { + mobi_search_links_kf7(&result, result.start, data_end); + if (result.start == NULL) { + break; + } + char *attribute = (char *) result.value; + unsigned char *data_cur = result.start; + result.start = result.end; + char link[MOBI_ATTRVALUE_MAXSIZE + 1]; + const char *numbers = "0123456789"; + char *value = strpbrk(attribute, numbers); + if (value == NULL) { + debug_print("Unknown link target: %s\n", attribute); + continue; + } + size_t target; + switch (attribute[0]) { + case 'f': + /* filepos=0000000000 */ + /* replace link with href="#0000000000" */ + target = strtoul(value, NULL, 10); + snprintf(link, MOBI_ATTRVALUE_MAXSIZE + 1, "href=\"#%010u\"", (uint32_t)target); + break; + case 'h': + case 'l': + data_cur += 2; + /* falls through */ + case 'r': + /* (hi|lo)recindex="00000" */ + /* replace link with src="resource00000.ext" */ + target = strtoul(value, NULL, 10); + if (target > 0) { + target--; + } + MOBIFiletype filetype = mobi_get_resourcetype_by_uid(rawml, target); + MOBIFileMeta filemeta = mobi_get_filemeta_by_type(filetype); + snprintf(link, MOBI_ATTRVALUE_MAXSIZE + 1, "src=\"resource%05u.%s\"", (uint32_t) target, filemeta.extension); + break; + default: + debug_print("Unknown link target: %s\n", attribute); + continue; + } + + /* first chunk */ + if (data_cur < data_in) { + mobi_list_del_all(first); + array_free(links); + return MOBI_DATA_CORRUPT; + } + size_t size = (size_t) (data_cur - data_in); + size_t raw_offset = (size_t) (data_in - part->data); + curr = mobi_list_add(curr, raw_offset, data_in, size, false); + if (curr == NULL) { + mobi_list_del_all(first); + array_free(links); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + if (!first) { first = curr; } + new_size += curr->size; + /* second chunk */ + curr = mobi_list_add(curr, SIZE_MAX, + (unsigned char *) strdup(link), + strlen(link), true); + if (curr == NULL) { + mobi_list_del_all(first); + array_free(links); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + new_size += curr->size; + data_in = result.end; + } + if (first) { + /* last chunk */ + if (part->data + part->size < data_in) { + mobi_list_del_all(first); + array_free(links); + return MOBI_DATA_CORRUPT; + } + size_t size = (size_t) (part->data + part->size - data_in); + size_t raw_offset = (size_t) (data_in - part->data); + curr = mobi_list_add(curr, raw_offset, data_in, size, false); + if (curr == NULL) { + mobi_list_del_all(first); + array_free(links); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + new_size += curr->size; + } else { + /* add whole part as one fragment */ + first = mobi_list_add(first, 0, part->data, part->size, false); + if (first == NULL) { + array_free(links); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + new_size += first->size; + } + /* insert chunks from links array */ + curr = first; + size_t i = 0; + while (i < links->size) { + const uint32_t offset = links->data[i]; + char anchor[MOBI_ATTRVALUE_MAXSIZE + 1]; + snprintf(anchor, MOBI_ATTRVALUE_MAXSIZE + 1, "", offset); + + ret = mobi_list_insert(&curr, SIZE_MAX, + (unsigned char *) strdup(anchor), + strlen(anchor), true, offset); + if (ret == MOBI_SUCCESS) { + new_size += curr->size; + } else if (ret != MOBI_DATA_CORRUPT) { + /* give up; on data corrupt try to skip broken entry */ + mobi_list_del_all(first); + array_free(links); + return ret; + } + + i++; + } + array_free(links); + /* insert dictionary markup if present */ + if (rawml->orth) { + ret = mobi_reconstruct_orth(rawml, first, &new_size); + if (ret != MOBI_SUCCESS) { + mobi_list_del_all(first); + return ret; + } + } + if (first && first->next) { + /* save */ + debug_print("Inserting links%s", "\n"); + unsigned char *new_data = malloc(new_size); + if (new_data == NULL) { + mobi_list_del_all(first); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + unsigned char *data_out = new_data; + MOBIFragment *fragdata = first; + while (fragdata) { + memcpy(data_out, fragdata->fragment, fragdata->size); + data_out += fragdata->size; + fragdata = mobi_list_del(fragdata); + } + free(part->data); + part->data = new_data; + part->size = new_size; + } else { + mobi_list_del(first); + } + return MOBI_SUCCESS; +} + +/** + @brief Replace offset-links with html-links + + @param[in,out] rawml Structure rawml will be filled with reconstructed parts and resources + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_reconstruct_links(const MOBIRawml *rawml) { + debug_print("Reconstructing links%s", "\n"); + if (rawml == NULL) { + debug_print("%s\n", "Rawml not initialized\n"); + return MOBI_INIT_FAILED; + } + MOBI_RET ret; + if (mobi_is_rawml_kf8(rawml)) { + /* kf8 gymnastics */ + ret = mobi_reconstruct_links_kf8(rawml); + } else { + /* kf7 format and older */ + ret = mobi_reconstruct_links_kf7(rawml); + } + return ret; +} + +/** + @brief Call callback function for each text record + + @param[in,out] rawml Structure rawml will be filled with reconstructed parts and resources + @param[in,out] cb Callback function + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_iterate_txtparts(MOBIRawml *rawml, MOBI_RET (*cb) (MOBIPart *)) { + MOBIPart *parts[] = { + rawml->markup, /* html files */ + rawml->flow->next /* css, skip first unparsed html part */ + }; + size_t i; + for (i = 0; i < 2; i++) { + MOBIPart *part = parts[i]; + while (part) { + if (part->type == T_HTML || part->type == T_CSS) { + MOBI_RET ret = cb(part); + if (ret != MOBI_SUCCESS) { + return ret; + } + } + part = part->next; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Convert MOBIPart part data to utf8 + + @param[in,out] part MOBIPart part + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_markup_to_utf8(MOBIPart *part) { + if (part == NULL) { + return MOBI_INIT_FAILED; + } + unsigned char *text = part->data; + size_t length = part->size; + /* extreme case in which each input character is converted + to 3-byte utf-8 sequence */ + size_t out_length = 3 * length + 1; + char *out_text = malloc(out_length); + if (out_text == NULL) { + debug_print("%s", "Memory allocation failed\n"); + return MOBI_MALLOC_FAILED; + } + MOBI_RET ret = mobi_cp1252_to_utf8(out_text, (const char *) text, &out_length, length); + free(text); + if (ret != MOBI_SUCCESS || out_length == 0) { + debug_print("%s", "conversion from cp1252 to utf8 failed\n"); + free(out_text); + part->data = NULL; + return MOBI_DATA_CORRUPT; + } + text = malloc(out_length); + if (text == NULL) { + debug_print("%s", "Memory allocation failed\n"); + free(out_text); + part->data = NULL; + return MOBI_MALLOC_FAILED; + } + memcpy(text, out_text, out_length); + free(out_text); + part->data = text; + part->size = out_length; + return MOBI_SUCCESS; +} + +/** + @brief Strip unneeded tags from html. Currently only + + @param[in,out] part MOBIPart structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_strip_mobitags(MOBIPart *part) { + if (part == NULL || part->data == NULL) { + return MOBI_INIT_FAILED; + } + if (part->type != T_HTML) { + return MOBI_SUCCESS; + } + MOBIResult result; + unsigned char *data_in = part->data; + result.start = part->data; + const unsigned char *data_end = part->data + part->size - 1; + MOBIFragment *first = NULL; + MOBIFragment *curr = NULL; + size_t part_size = 0; + while (true) { + mobi_find_attrname(&result, result.start, data_end, "aid"); + if (result.start == NULL) { + break; + } + unsigned char *data_cur = result.start; + result.start = result.end; + if (data_cur < data_in) { + mobi_list_del_all(first); + return MOBI_DATA_CORRUPT; + } + size_t size = (size_t) (data_cur - data_in); + /* first chunk */ + curr = mobi_list_add(curr, (size_t) (data_in - part->data ), data_in, size, false); + if (curr == NULL) { + mobi_list_del_all(first); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + if (!first) { first = curr; } + part_size += curr->size; + data_in = result.end; + } + if (first) { + /* last chunk */ + if (part->data + part->size < data_in) { + mobi_list_del_all(first); + return MOBI_DATA_CORRUPT; + } + size_t size = (size_t) (part->data + part->size - data_in); + curr = mobi_list_add(curr, (size_t) (data_in - part->data ), data_in, size, false); + if (curr == NULL) { + mobi_list_del_all(first); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + part_size += curr->size; + + unsigned char *new_data = malloc(part_size); + if (new_data == NULL) { + mobi_list_del_all(first); + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + unsigned char *data_out = new_data; + while (first) { + memcpy(data_out, first->fragment, first->size); + data_out += first->size; + first = mobi_list_del(first); + } + free(part->data); + part->data = new_data; + part->size = part_size; + } + return MOBI_SUCCESS; +} + +/** + @brief Parse raw records into html flow parts, markup parts, resources and indices + + @param[in,out] rawml Structure rawml will be filled with reconstructed parts and resources + @param[in] m MOBIData structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_rawml(MOBIRawml *rawml, const MOBIData *m) { + return mobi_parse_rawml_opt(rawml, m, true, true, true); +} + +/** + @brief Parse raw records into html flow parts, markup parts, resources and indices. + Individual stages of the parsing may be turned on/off. + + @param[in,out] rawml Structure rawml will be filled with reconstructed parts and resources + @param[in] m MOBIData structure + @param[in] parse_toc bool Parse content indices if true + @param[in] parse_dict bool Parse dictionary indices if true + @param[in] reconstruct bool Recounstruct links, build opf, strip mobi-specific tags if true + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_rawml_opt(MOBIRawml *rawml, const MOBIData *m, bool parse_toc, bool parse_dict, bool reconstruct) { + + MOBI_RET ret; + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + if (rawml == NULL) { + return MOBI_INIT_FAILED; + } + + /* Get maximal size of text data */ + const size_t maxlen = mobi_get_text_maxsize(m); + if (maxlen == MOBI_NOTSET) { + debug_print("%s", "Insane text length\n"); + return MOBI_DATA_CORRUPT; + } + char *text = malloc(maxlen + 1); + if (text == NULL) { + debug_print("%s", "Memory allocation failed\n"); + return MOBI_MALLOC_FAILED; + } + /* Extract text records, unpack, merge and copy it to text string */ + size_t length = maxlen; + ret = mobi_get_rawml(m, text, &length); + if (ret != MOBI_SUCCESS) { + debug_print("%s", "Error parsing text\n"); + free(text); + return ret; + } + + if (mobi_exists_fdst(m)) { + /* Skip parsing if section count less or equal than 1 */ + if (m->mh->fdst_section_count && *m->mh->fdst_section_count > 1) { + ret = mobi_parse_fdst(m, rawml); + if (ret != MOBI_SUCCESS) { + free(text); + return ret; + } + } + } + ret = mobi_reconstruct_flow(rawml, text, length); + free(text); + if (ret != MOBI_SUCCESS) { + return ret; + } + ret = mobi_reconstruct_resources(m, rawml); + if (ret != MOBI_SUCCESS) { + return ret; + } + const size_t offset = mobi_get_kf8offset(m); + /* skeleton index */ + if (mobi_exists_skel_indx(m) && mobi_exists_frag_indx(m)) { + const size_t indx_record_number = *m->mh->skeleton_index + offset; + /* to be freed in mobi_free_rawml */ + MOBIIndx *skel_meta = mobi_init_indx(); + ret = mobi_parse_index(m, skel_meta, indx_record_number); + if (ret != MOBI_SUCCESS) { + return ret; + } + rawml->skel = skel_meta; + } + + /* fragment index */ + if (mobi_exists_frag_indx(m)) { + MOBIIndx *frag_meta = mobi_init_indx(); + const size_t indx_record_number = *m->mh->fragment_index + offset; + ret = mobi_parse_index(m, frag_meta, indx_record_number); + if (ret != MOBI_SUCCESS) { + return ret; + } + rawml->frag = frag_meta; + } + + if (parse_toc) { + /* guide index */ + if (mobi_exists_guide_indx(m)) { + MOBIIndx *guide_meta = mobi_init_indx(); + const size_t indx_record_number = *m->mh->guide_index + offset; + ret = mobi_parse_index(m, guide_meta, indx_record_number); + if (ret != MOBI_SUCCESS) { + return ret; + } + rawml->guide = guide_meta; + } + + /* ncx index */ + if (mobi_exists_ncx(m)) { + MOBIIndx *ncx_meta = mobi_init_indx(); + const size_t indx_record_number = *m->mh->ncx_index + offset; + ret = mobi_parse_index(m, ncx_meta, indx_record_number); + if (ret != MOBI_SUCCESS) { + return ret; + } + rawml->ncx = ncx_meta; + } + } + + if (parse_dict && mobi_is_dictionary(m)) { + /* orth */ + MOBIIndx *orth_meta = mobi_init_indx(); + size_t indx_record_number = *m->mh->orth_index + offset; + ret = mobi_parse_index(m, orth_meta, indx_record_number); + if (ret != MOBI_SUCCESS) { + return ret; + } + rawml->orth = orth_meta; + /* infl */ + if (mobi_exists_infl(m)) { + MOBIIndx *infl_meta = mobi_init_indx(); + indx_record_number = *m->mh->infl_index + offset; + ret = mobi_parse_index(m, infl_meta, indx_record_number); + if (ret != MOBI_SUCCESS) { + return ret; + } + rawml->infl = infl_meta; + } + } + + ret = mobi_reconstruct_parts(rawml); + if (ret != MOBI_SUCCESS) { + return ret; + } + if (reconstruct) { +#ifdef USE_XMLWRITER + ret = mobi_build_opf(rawml, m); + if (ret != MOBI_SUCCESS) { + return ret; + } +#endif + ret = mobi_reconstruct_links(rawml); + if (ret != MOBI_SUCCESS) { + return ret; + } + if (mobi_is_kf8(m)) { + debug_print("Stripping unneeded tags%s", "\n"); + ret = mobi_iterate_txtparts(rawml, mobi_strip_mobitags); + if (ret != MOBI_SUCCESS) { + return ret; + } + } + + } + if (mobi_is_cp1252(m)) { + debug_print("Converting cp1252 to utf8%s", "\n"); + ret = mobi_iterate_txtparts(rawml, mobi_markup_to_utf8); + if (ret != MOBI_SUCCESS) { + return ret; + } + } + return MOBI_SUCCESS; +} diff --git a/app/src/main/cpp/libmobi/src/parse_rawml.h b/app/src/main/cpp/libmobi/src/parse_rawml.h new file mode 100644 index 0000000..6d698ff --- /dev/null +++ b/app/src/main/cpp/libmobi/src/parse_rawml.h @@ -0,0 +1,42 @@ +/** @file parse_rawml.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef mobi_parse_rawml_h +#define mobi_parse_rawml_h + +#include "config.h" +#include "mobi.h" + +#define MOBI_ATTRNAME_MAXSIZE 150 /**< Maximum length of tag attribute name, like "href" */ +#define MOBI_ATTRVALUE_MAXSIZE 150 /**< Maximum length of tag attribute value */ + +/** + @brief Result data returned by mobi_search_links_kf7() and mobi_search_links_kf8() + */ +typedef struct { + unsigned char *start; /**< Beginning data to be replaced */ + unsigned char *end; /**< End of data to be replaced */ + char value[MOBI_ATTRVALUE_MAXSIZE + 1]; /**< Attribute value */ + bool is_url; /**< True if value is part of css url attribute */ +} MOBIResult; + +/** + @brief HTML attribute type + */ +typedef enum { + ATTR_ID = 0, /**< Attribute 'id' */ + ATTR_NAME /**< Attribute 'name' */ +} MOBIAttrType; + + +MOBI_RET mobi_get_id_by_posoff(uint32_t *file_number, char *id, const MOBIRawml *rawml, const size_t pos_fid, const size_t pos_off, MOBIAttrType *pref_attr); +MOBI_RET mobi_find_attrvalue(MOBIResult *result, const unsigned char *data_start, const unsigned char *data_end, const MOBIFiletype type, const char *needle); + +#endif diff --git a/app/src/main/cpp/libmobi/src/randombytes.c b/app/src/main/cpp/libmobi/src/randombytes.c new file mode 100644 index 0000000..0f97106 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/randombytes.c @@ -0,0 +1,375 @@ +/** @file randombytes.c + * @brief Portable function for generating random data + * + * Copyright (c) 2022 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + * + * This code is based on libsodium's randombytes_buf function + * We just extract the single function we need from libsodium and adjust it for our use. + * Most of the code originates from: + * https://github.com/jedisct1/libsodium/blob/d250858c7445b7de94e912b529b81defe20d4aaa/src/libsodium/randombytes/sysrandom/randombytes_sysrandom.c + * Original code uses following license: + * + * ISC License + * + * Copyright (c) 2013-2022 + * Frank Denis + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include +#include +#ifndef _WIN32 +# include +#endif +#include + +#include "config.h" +#include "randombytes.h" +#include "debug.h" + +#include +#ifndef _WIN32 +# include +# include +#endif +#ifdef __linux__ +# define _LINUX_SOURCE +#endif +#ifdef HAVE_SYS_RANDOM_H +# include +#endif +#ifdef __linux__ +# define BLOCK_ON_DEV_RANDOM +# include +# ifdef HAVE_GETRANDOM +# define HAVE_LINUX_COMPATIBLE_GETRANDOM +# else +# include +# if defined(SYS_getrandom) && defined(__NR_getrandom) +# define getrandom(B, S, F) syscall(SYS_getrandom, (B), (int) (S), (F)) +# define HAVE_LINUX_COMPATIBLE_GETRANDOM +# endif +# endif +#elif defined(__FreeBSD__) || defined(__DragonFly__) +# include +# if (defined(__FreeBSD_version) && __FreeBSD_version >= 1200000) || \ + (defined(__DragonFly_version) && __DragonFly_version >= 500700) +# define HAVE_LINUX_COMPATIBLE_GETRANDOM +# endif +#endif + +#define UNUSED(x) (void)(x) + +typedef struct { + int random_data_source_fd; + int getrandom_available; +} MOBIRandom; + +#ifdef _WIN32 + +# include +# define RtlGenRandom SystemFunction036 +# if defined(__cplusplus) +extern "C" +# endif +BOOLEAN NTAPI RtlGenRandom(PVOID RandomBuffer, ULONG RandomBufferLength); +# ifdef _MSC_VER +# pragma comment(lib, "advapi32.lib") +# endif +#endif + +#if defined(__OpenBSD__) || defined(__CloudABI__) || defined(__wasi__) +# define HAVE_SAFE_ARC4RANDOM +#endif + +#ifdef HAVE_SAFE_ARC4RANDOM + +/** + @brief Read a buffer of random bytes using arc4random_buf call + + @param[in,out] handle Handle + @param[in,out] buf Buffer + @param[in] size Buffer size + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_randombytes_sysrandom_buf(MOBIRandom *handle, void *buf, const size_t size) { + UNUSED(handle); + arc4random_buf(buf, size); + return MOBI_SUCCESS; +} + +#else /* HAVE_SAFE_ARC4RANDOM */ + +# ifndef _WIN32 +/** + @brief Read a buffer of random bytes from file descriptoir + + @param[in] fd File descriptior + @param[in,out] buf_ Buffer + @param[in] size Buffer size + @return Number of bytes read + */ +static ssize_t mobi_safe_read(const int fd, void *buf_, size_t size) { + unsigned char *buf = (unsigned char *) buf_; + ssize_t readnb; + + do { + while ((readnb = read(fd, buf, size)) < (ssize_t) 0 && (errno == EINTR || errno == EAGAIN)); + if (readnb < (ssize_t) 0) { + return readnb; + } + if (readnb == (ssize_t) 0) { + break; + } + size -= (size_t) readnb; + buf += readnb; + } while (size > (ssize_t) 0); + + return (ssize_t) (buf - (unsigned char *) buf_); +} + +# ifdef BLOCK_ON_DEV_RANDOM +/** + @brief Block on /dev/random until enough entropy is available + + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_randombytes_block_on_dev_random(void) { + int fd = open("/dev/random", O_RDONLY); + if (fd == -1) { + return MOBI_SUCCESS; + } + struct pollfd pfd; + pfd.fd = fd; + pfd.events = POLLIN; + pfd.revents = 0; + int pret; + do { + pret = poll(&pfd, 1, -1); + } while (pret < 0 && (errno == EINTR || errno == EAGAIN)); + if (pret != 1) { + (void) close(fd); + errno = EIO; + return MOBI_DRM_RANDOM_ERR; + } + if (close(fd) != 0) { + return MOBI_DRM_RANDOM_ERR; + } + return MOBI_SUCCESS; +} +# endif /* BLOCK_ON_DEV_RANDOM */ + +/** + @brief Open random device, wait for enough entropy if supported + + @return Random device file descriptor + */ +static int mobi_randombytes_sysrandom_random_dev_open(void) { + +# ifdef BLOCK_ON_DEV_RANDOM + if (mobi_randombytes_block_on_dev_random() != MOBI_SUCCESS) { + return -1; + } +# endif + + static const char *devices[] = { + "/dev/urandom", + "/dev/random", NULL + }; + const char **device = devices; + + do { + int fd = open(*device, O_RDONLY); + if (fd != -1) { + struct stat st; + if (fstat(fd, &st) == 0 && +# ifdef S_ISNAM + (S_ISNAM(st.st_mode) || S_ISCHR(st.st_mode)) +# else + S_ISCHR(st.st_mode) +# endif + ) { +# if defined(F_SETFD) && defined(FD_CLOEXEC) + (void) fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); +# endif + return fd; + } + (void) close(fd); + } else if (errno == EINTR) { + continue; + } + device++; + } while (*device != NULL); + + errno = EIO; + return -1; +} + +# ifdef HAVE_LINUX_COMPATIBLE_GETRANDOM +/** + @brief Read a buffer of random bytes using getrandom system call + In libmobi we only need small KEYSIZE buffer, so we don't have to handle buffers over 256 bytes and read chunks + + @param[in,out] buf Buffer + @param[in] size Buffer size (up to 256 bytes) + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_randombytes_linux_getrandom(void *buf, const size_t size) { + + if (size > 256U) { + debug_print("This function can only handle buffer size up to 256 bytes (%zu requested)\n", size); + return MOBI_PARAM_ERR; + } + int readnb; + do { + readnb = getrandom(buf, size, 0); + } while (readnb < 0 && (errno == EINTR || errno == EAGAIN)); + + if (readnb != (int) size) { + debug_print("Getrandom failed (%s)\n", strerror(errno)); + return MOBI_DRM_RANDOM_ERR; + } + return MOBI_SUCCESS; +} + +# endif /* HAVE_LINUX_COMPATIBLE_GETRANDOM */ + +/** + @brief Initialize random data source + + @param[in,out] handle Handle + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_randombytes_sysrandom_init(MOBIRandom *handle) { +# define NEEDS_INIT + const int errno_save = errno; + +# ifdef HAVE_LINUX_COMPATIBLE_GETRANDOM + { + unsigned char fodder[16]; + + if (mobi_randombytes_linux_getrandom(fodder, sizeof fodder) == MOBI_SUCCESS) { + handle->getrandom_available = 1; + errno = errno_save; + return MOBI_SUCCESS; + } + handle->getrandom_available = 0; + } +# endif + + if ((handle->random_data_source_fd = mobi_randombytes_sysrandom_random_dev_open()) == -1) { + debug_print("Couldn't open random device (%s)\n", strerror(errno)); + return MOBI_DRM_RANDOM_ERR; + } + errno = errno_save; + return MOBI_SUCCESS; +} + +/** + @brief Initialize random data source + + @param[in,out] handle Handle + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_randombytes_sysrandom_close(MOBIRandom *handle) { +# define NEEDS_CLOSE + MOBI_RET ret = MOBI_DRM_RANDOM_ERR; + if (handle->random_data_source_fd != -1 && close(handle->random_data_source_fd) == 0) { + handle->random_data_source_fd = -1; + ret = MOBI_SUCCESS; + } +# ifdef HAVE_LINUX_COMPATIBLE_GETRANDOM + if (handle->getrandom_available != 0) { + ret = MOBI_SUCCESS; + } +# endif + return ret; +} + +# endif /* _WIN32 */ + +/** + @brief Read a buffer of random bytes + + @param[in,out] handle Handle + @param[in,out] buf Buffer + @param[in] size Buffer size (up to 256 bytes) + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_randombytes_sysrandom_buf(MOBIRandom *handle, void *buf, const size_t size) { +# ifndef _WIN32 +# ifdef HAVE_LINUX_COMPATIBLE_GETRANDOM + if (handle->getrandom_available != 0) { + return mobi_randombytes_linux_getrandom(buf, size); + } +# endif + if (handle->random_data_source_fd == -1 || + mobi_safe_read(handle->random_data_source_fd, buf, size) != (ssize_t) size) { + return MOBI_DRM_RANDOM_ERR; + } +# else /* _WIN32 */ + UNUSED(handle); + if (! RtlGenRandom((PVOID) buf, (ULONG) size)) { + return MOBI_DRM_RANDOM_ERR; + } +# endif /* _WIN32 */ + return MOBI_SUCCESS; +} + +#endif /* HAVE_SAFE_ARC4RANDOM */ + +/** + @brief Fill buffer with random bytes + + @param[in,out] buf Buffer + @param[in] size Buffer size (up to 256 bytes) + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_randombytes(void *buf, const size_t size) { + + MOBIRandom handle = { + .random_data_source_fd = -1, + .getrandom_available = 0 + }; + + MOBI_RET ret; +#ifdef NEEDS_INIT + ret = mobi_randombytes_sysrandom_init(&handle); + if (ret != MOBI_SUCCESS) { + return ret; + } +#endif + + if (size > (size_t) 0U) { + ret = mobi_randombytes_sysrandom_buf(&handle, buf, size); + if (ret != MOBI_SUCCESS) { + debug_print("%s\n", "Generating random data failed"); + return ret; + } + } +#ifdef NEEDS_CLOSE + if (mobi_randombytes_sysrandom_close(&handle) != MOBI_SUCCESS) { + debug_print("%s\n", "Closing random data source failed"); + } +#endif + return MOBI_SUCCESS; +} diff --git a/app/src/main/cpp/libmobi/src/randombytes.h b/app/src/main/cpp/libmobi/src/randombytes.h new file mode 100644 index 0000000..3a114f0 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/randombytes.h @@ -0,0 +1,25 @@ +/** @file randombytes.h + * + * Copyright (c) 2021 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_randombytes_h +#define libmobi_randombytes_h + +#include "mobi.h" + +/** + @brief Write n random bytes of high quality to buf + + @param[in,out] buf Buffer to be filled with random bytes + @param[in] len Buffer length + @return On success returns MOBI_SUCCESS + */ +MOBI_RET mobi_randombytes(void *buf, const size_t len); + +#endif diff --git a/app/src/main/cpp/libmobi/src/read.c b/app/src/main/cpp/libmobi/src/read.c new file mode 100644 index 0000000..baa78b3 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/read.c @@ -0,0 +1,924 @@ +/** @file read.c + * @brief Functions for reading and parsing of MOBI document + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + + +#include +#include +#include +#include "read.h" +#include "util.h" +#include "index.h" +#include "debug.h" + +/** + @brief Read palm database header from file into MOBIData structure (MOBIPdbHeader) + + @param[in,out] m MOBIData structure to be filled with read data + @param[in] file Filedescriptor to read from + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_load_pdbheader(MOBIData *m, FILE *file) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + if (!file) { + return MOBI_FILE_NOT_FOUND; + } + MOBIBuffer *buf = mobi_buffer_init(PALMDB_HEADER_LEN); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + const size_t len = fread(buf->data, 1, PALMDB_HEADER_LEN, file); + if (len != PALMDB_HEADER_LEN) { + mobi_buffer_free(buf); + return MOBI_DATA_CORRUPT; + } + m->ph = calloc(1, sizeof(MOBIPdbHeader)); + if (m->ph == NULL) { + debug_print("%s", "Memory allocation for pdb header failed\n"); + mobi_buffer_free(buf); + return MOBI_MALLOC_FAILED; + } + /* parse header */ + mobi_buffer_getstring(m->ph->name, buf, PALMDB_NAME_SIZE_MAX); + m->ph->attributes = mobi_buffer_get16(buf); + m->ph->version = mobi_buffer_get16(buf); + m->ph->ctime = mobi_buffer_get32(buf); + m->ph->mtime = mobi_buffer_get32(buf); + m->ph->btime = mobi_buffer_get32(buf); + m->ph->mod_num = mobi_buffer_get32(buf); + m->ph->appinfo_offset = mobi_buffer_get32(buf); + m->ph->sortinfo_offset = mobi_buffer_get32(buf); + mobi_buffer_getstring(m->ph->type, buf, 4); + mobi_buffer_getstring(m->ph->creator, buf, 4); + m->ph->uid = mobi_buffer_get32(buf); + m->ph->next_rec = mobi_buffer_get32(buf); + m->ph->rec_count = mobi_buffer_get16(buf); + mobi_buffer_free(buf); + return MOBI_SUCCESS; +} + +/** + @brief Read list of database records from file into MOBIData structure (MOBIPdbRecord) + + @param[in,out] m MOBIData structure to be filled with read data + @param[in] file Filedescriptor to read from + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_load_reclist(MOBIData *m, FILE *file) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + if (!file) { + debug_print("%s", "File not ready\n"); + return MOBI_FILE_NOT_FOUND; + } + m->rec = calloc(1, sizeof(MOBIPdbRecord)); + if (m->rec == NULL) { + debug_print("%s", "Memory allocation for pdb record failed\n"); + return MOBI_MALLOC_FAILED; + } + MOBIPdbRecord *curr = m->rec; + for (int i = 0; i < m->ph->rec_count; i++) { + MOBIBuffer *buf = mobi_buffer_init(PALMDB_RECORD_INFO_SIZE); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + const size_t len = fread(buf->data, 1, PALMDB_RECORD_INFO_SIZE, file); + if (len != PALMDB_RECORD_INFO_SIZE) { + mobi_buffer_free(buf); + return MOBI_DATA_CORRUPT; + } + if (i > 0) { + curr->next = calloc(1, sizeof(MOBIPdbRecord)); + if (curr->next == NULL) { + debug_print("%s", "Memory allocation for pdb record failed\n"); + mobi_buffer_free(buf); + return MOBI_MALLOC_FAILED; + } + curr = curr->next; + } + curr->offset = mobi_buffer_get32(buf); + curr->attributes = mobi_buffer_get8(buf); + const uint8_t h = mobi_buffer_get8(buf); + const uint16_t l = mobi_buffer_get16(buf); + curr->uid = (uint32_t) h << 16 | l; + curr->next = NULL; + mobi_buffer_free(buf); + } + return MOBI_SUCCESS; +} + +/** + @brief Read record data and size from file into MOBIData structure (MOBIPdbRecord) + + @param[in,out] m MOBIData structure to be filled with read data + @param[in] file Filedescriptor to read from + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_load_rec(MOBIData *m, FILE *file) { + MOBI_RET ret; + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + MOBIPdbRecord *curr = m->rec; + while (curr != NULL) { + MOBIPdbRecord *next; + size_t size; + if (curr->next != NULL) { + next = curr->next; + size = next->offset - curr->offset; + } else { + fseek(file, 0, SEEK_END); + long diff = ftell(file) - curr->offset; + if (diff <= 0) { + debug_print("Wrong record size: %li\n", diff); + return MOBI_DATA_CORRUPT; + } + size = (size_t) diff; + next = NULL; + } + + curr->size = size; + ret = mobi_load_recdata(curr, file); + if (ret != MOBI_SUCCESS) { + debug_print("Error loading record uid %i data\n", curr->uid); + mobi_free_rec(m); + return ret; + } + curr = next; + } + return MOBI_SUCCESS; +} + +/** + @brief Read record data from file into MOBIPdbRecord structure + + @param[in,out] rec MOBIPdbRecord structure to be filled with read data + @param[in] file Filedescriptor to read from + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_load_recdata(MOBIPdbRecord *rec, FILE *file) { + const int ret = fseek(file, rec->offset, SEEK_SET); + if (ret != 0) { + debug_print("Record %i not found\n", rec->uid); + return MOBI_DATA_CORRUPT; + } + rec->data = malloc(rec->size); + if (rec->data == NULL) { + debug_print("%s", "Memory allocation for pdb record data failed\n"); + return MOBI_MALLOC_FAILED; + } + const size_t len = fread(rec->data, 1, rec->size, file); + if (len < rec->size) { + debug_print("Truncated data in record %i\n", rec->uid); + return MOBI_DATA_CORRUPT; + } + return MOBI_SUCCESS; +} + +/** + @brief Parse EXTH header from Record 0 into MOBIData structure (MOBIExthHeader) + + @param[in,out] m MOBIData structure to be filled with parsed data + @param[in] buf MOBIBuffer buffer to read from + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_extheader(MOBIData *m, MOBIBuffer *buf) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + char exth_magic[5]; + const size_t header_length = 12; + mobi_buffer_getstring(exth_magic, buf, 4); + const size_t exth_length = mobi_buffer_get32(buf) - header_length; + const size_t rec_count = mobi_buffer_get32(buf); + if (strncmp(exth_magic, EXTH_MAGIC, 4) != 0 || + exth_length + buf->offset > buf->maxlen || + rec_count == 0 || rec_count > MOBI_EXTH_MAXCNT) { + debug_print("%s", "Sanity checks for EXTH header failed\n"); + return MOBI_DATA_CORRUPT; + } + const size_t saved_maxlen = buf->maxlen; + buf->maxlen = exth_length + buf->offset; + m->eh = calloc(1, sizeof(MOBIExthHeader)); + if (m->eh == NULL) { + debug_print("%s", "Memory allocation for EXTH header failed\n"); + return MOBI_MALLOC_FAILED; + } + MOBIExthHeader *curr = m->eh; + for (size_t i = 0; i < rec_count; i++) { + if (curr->data) { + curr->next = calloc(1, sizeof(MOBIExthHeader)); + if (curr->next == NULL) { + debug_print("%s", "Memory allocation for EXTH header failed\n"); + mobi_free_eh(m); + return MOBI_MALLOC_FAILED; + } + curr = curr->next; + } + curr->tag = mobi_buffer_get32(buf); + /* data size = record size minus 8 bytes for uid and size */ + curr->size = mobi_buffer_get32(buf) - 8; + if (curr->size == 0) { + debug_print("Skip record %i, data too short\n", curr->tag); + continue; + } + if (buf->offset + curr->size > buf->maxlen) { + debug_print("Record %i too long\n", curr->tag); + mobi_free_eh(m); + return MOBI_DATA_CORRUPT; + } + curr->data = malloc(curr->size); + if (curr->data == NULL) { + debug_print("Memory allocation for EXTH record %i failed\n", curr->tag); + mobi_free_eh(m); + return MOBI_MALLOC_FAILED; + } + mobi_buffer_getraw(curr->data, buf, curr->size); + curr->next = NULL; + } + buf->maxlen = saved_maxlen; + return MOBI_SUCCESS; +} + +/** + @brief Parse MOBI header from Record 0 into MOBIData structure (MOBIMobiHeader) + + @param[in,out] m MOBIData structure to be filled with parsed data + @param[in] buf MOBIBuffer buffer to read from + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_mobiheader(MOBIData *m, MOBIBuffer *buf) { + int isKF8 = 0; + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + m->mh = calloc(1, sizeof(MOBIMobiHeader)); + if (m->mh == NULL) { + debug_print("%s", "Memory allocation for MOBI header failed\n"); + return MOBI_MALLOC_FAILED; + } + mobi_buffer_getstring(m->mh->mobi_magic, buf, 4); + mobi_buffer_dup32(&m->mh->header_length, buf); + if (strcmp(m->mh->mobi_magic, MOBI_MAGIC) != 0 || m->mh->header_length == NULL) { + debug_print("%s", "MOBI header not found\n"); + mobi_free_mh(m->mh); + m->mh = NULL; + return MOBI_DATA_CORRUPT; + } + const size_t saved_maxlen = buf->maxlen; + /* some old files declare zero length mobi header, try to read first 24 bytes anyway */ + uint32_t header_length = (*m->mh->header_length > 0) ? *m->mh->header_length : 24; + /* read only declared MOBI header length (curr offset minus 8 already read bytes) */ + const size_t left_length = header_length + buf->offset - 8; + buf->maxlen = saved_maxlen < left_length ? saved_maxlen : left_length; + mobi_buffer_dup32(&m->mh->mobi_type, buf); + uint32_t encoding = mobi_buffer_get32(buf); + if (encoding == 1252) { + m->mh->text_encoding = malloc(sizeof(MOBIEncoding)); + if (m->mh->text_encoding == NULL) { + debug_print("%s", "Memory allocation for MOBI header failed\n"); + return MOBI_MALLOC_FAILED; + } + *m->mh->text_encoding = MOBI_CP1252; + } + else if (encoding == 65001) { + m->mh->text_encoding = malloc(sizeof(MOBIEncoding)); + if (m->mh->text_encoding == NULL) { + debug_print("%s", "Memory allocation for MOBI header failed\n"); + return MOBI_MALLOC_FAILED; + } + *m->mh->text_encoding = MOBI_UTF8; + } else { + debug_print("Unknown encoding in mobi header: %i\n", encoding); + } + mobi_buffer_dup32(&m->mh->uid, buf); + mobi_buffer_dup32(&m->mh->version, buf); + if (header_length >= MOBI_HEADER_V7_SIZE + && m->mh->version && *m->mh->version == 8) { + isKF8 = 1; + } + mobi_buffer_dup32(&m->mh->orth_index, buf); + mobi_buffer_dup32(&m->mh->infl_index, buf); + mobi_buffer_dup32(&m->mh->names_index, buf); + mobi_buffer_dup32(&m->mh->keys_index, buf); + mobi_buffer_dup32(&m->mh->extra0_index, buf); + mobi_buffer_dup32(&m->mh->extra1_index, buf); + mobi_buffer_dup32(&m->mh->extra2_index, buf); + mobi_buffer_dup32(&m->mh->extra3_index, buf); + mobi_buffer_dup32(&m->mh->extra4_index, buf); + mobi_buffer_dup32(&m->mh->extra5_index, buf); + mobi_buffer_dup32(&m->mh->non_text_index, buf); + mobi_buffer_dup32(&m->mh->full_name_offset, buf); + mobi_buffer_dup32(&m->mh->full_name_length, buf); + mobi_buffer_dup32(&m->mh->locale, buf); + mobi_buffer_dup32(&m->mh->dict_input_lang, buf); + mobi_buffer_dup32(&m->mh->dict_output_lang, buf); + mobi_buffer_dup32(&m->mh->min_version, buf); + mobi_buffer_dup32(&m->mh->image_index, buf); + mobi_buffer_dup32(&m->mh->huff_rec_index, buf); + mobi_buffer_dup32(&m->mh->huff_rec_count, buf); + mobi_buffer_dup32(&m->mh->datp_rec_index, buf); + mobi_buffer_dup32(&m->mh->datp_rec_count, buf); + mobi_buffer_dup32(&m->mh->exth_flags, buf); + mobi_buffer_seek(buf, 32); /* 32 unknown bytes */ + mobi_buffer_dup32(&m->mh->unknown6, buf); + mobi_buffer_dup32(&m->mh->drm_offset, buf); + mobi_buffer_dup32(&m->mh->drm_count, buf); + mobi_buffer_dup32(&m->mh->drm_size, buf); + mobi_buffer_dup32(&m->mh->drm_flags, buf); + mobi_buffer_seek(buf, 8); /* 8 unknown bytes */ + if (isKF8) { + mobi_buffer_dup32(&m->mh->fdst_index, buf); + } else { + mobi_buffer_dup16(&m->mh->first_text_index, buf); + mobi_buffer_dup16(&m->mh->last_text_index, buf); + } + mobi_buffer_dup32(&m->mh->fdst_section_count, buf); + mobi_buffer_dup32(&m->mh->fcis_index, buf); + mobi_buffer_dup32(&m->mh->fcis_count, buf); + mobi_buffer_dup32(&m->mh->flis_index, buf); + mobi_buffer_dup32(&m->mh->flis_count, buf); + mobi_buffer_dup32(&m->mh->unknown10, buf); + mobi_buffer_dup32(&m->mh->unknown11, buf); + mobi_buffer_dup32(&m->mh->srcs_index, buf); + mobi_buffer_dup32(&m->mh->srcs_count, buf); + mobi_buffer_dup32(&m->mh->unknown12, buf); + mobi_buffer_dup32(&m->mh->unknown13, buf); + mobi_buffer_seek(buf, 2); /* 2 byte fill */ + mobi_buffer_dup16(&m->mh->extra_flags, buf); + mobi_buffer_dup32(&m->mh->ncx_index, buf); + if (isKF8) { + mobi_buffer_dup32(&m->mh->fragment_index, buf); + mobi_buffer_dup32(&m->mh->skeleton_index, buf); + } else { + mobi_buffer_dup32(&m->mh->unknown14, buf); + mobi_buffer_dup32(&m->mh->unknown15, buf); + } + mobi_buffer_dup32(&m->mh->datp_index, buf); + if (isKF8) { + mobi_buffer_dup32(&m->mh->guide_index, buf); + } else { + mobi_buffer_dup32(&m->mh->unknown16, buf); + } + mobi_buffer_dup32(&m->mh->unknown17, buf); + mobi_buffer_dup32(&m->mh->unknown18, buf); + mobi_buffer_dup32(&m->mh->unknown19, buf); + mobi_buffer_dup32(&m->mh->unknown20, buf); + if (buf->maxlen > buf->offset) { + debug_print("Skipping %zu unknown bytes in MOBI header\n", (buf->maxlen - buf->offset)); + mobi_buffer_setpos(buf, buf->maxlen); + } + buf->maxlen = saved_maxlen; + /* get full name stored at m->mh->full_name_offset */ + if (m->mh->full_name_offset && m->mh->full_name_length) { + const size_t saved_offset = buf->offset; + const uint32_t full_name_length = min(*m->mh->full_name_length, MOBI_TITLE_SIZEMAX); + mobi_buffer_setpos(buf, *m->mh->full_name_offset); + m->mh->full_name = malloc(full_name_length + 1); + if (m->mh->full_name == NULL) { + debug_print("%s", "Memory allocation for full name failed\n"); + return MOBI_MALLOC_FAILED; + } + if (full_name_length) { + mobi_buffer_getstring(m->mh->full_name, buf, full_name_length); + } else { + m->mh->full_name[0] = '\0'; + } + mobi_buffer_setpos(buf, saved_offset); + } + return MOBI_SUCCESS; +} + +/** + @brief Parse Record 0 into MOBIData structure + + This function will parse MOBIRecord0Header, MOBIMobiHeader and MOBIExthHeader + + @param[in,out] m MOBIData structure to be filled with parsed data + @param[in] seqnumber Sequential number of the palm database record + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_record0(MOBIData *m, const size_t seqnumber) { + MOBI_RET ret; + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + const MOBIPdbRecord *record0 = mobi_get_record_by_seqnumber(m, seqnumber); + if (record0 == NULL) { + debug_print("%s", "Record 0 not loaded\n"); + return MOBI_DATA_CORRUPT; + } + if (record0->size < RECORD0_HEADER_LEN) { + debug_print("%s", "Record 0 too short\n"); + return MOBI_DATA_CORRUPT; + } + MOBIBuffer *buf = mobi_buffer_init_null(record0->data, record0->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + m->rh = calloc(1, sizeof(MOBIRecord0Header)); + if (m->rh == NULL) { + debug_print("%s", "Memory allocation for record 0 header failed\n"); + mobi_buffer_free_null(buf); + return MOBI_MALLOC_FAILED; + } + /* parse palmdoc header */ + const uint16_t compression = mobi_buffer_get16(buf); + mobi_buffer_seek(buf, 2); // unused 2 bytes, zeroes + if ((compression != MOBI_COMPRESSION_NONE && + compression != MOBI_COMPRESSION_PALMDOC && + compression != MOBI_COMPRESSION_HUFFCDIC)) { + debug_print("Wrong record0 header: %c%c%c%c\n", record0->data[0], record0->data[1], record0->data[2], record0->data[3]); + mobi_buffer_free_null(buf); + free(m->rh); + m->rh = NULL; + return MOBI_DATA_CORRUPT; + } + m->rh->compression_type = compression; + m->rh->text_length = mobi_buffer_get32(buf); + m->rh->text_record_count = mobi_buffer_get16(buf); + m->rh->text_record_size = mobi_buffer_get16(buf); + m->rh->encryption_type = mobi_buffer_get16(buf); + m->rh->unknown1 = mobi_buffer_get16(buf); + if (mobi_is_mobipocket(m)) { + /* parse mobi header if present */ + ret = mobi_parse_mobiheader(m, buf); + if (ret == MOBI_SUCCESS) { + /* parse exth header if present */ + mobi_parse_extheader(m, buf); + } + } + mobi_buffer_free_null(buf); + return MOBI_SUCCESS; +} + +/** + @brief Calculate the size of extra bytes at the end of text record + + @param[in] record MOBIPdbRecord structure containing the record + @param[in] flags Flags from MOBI header (extra_flags) + @return The size of trailing bytes, MOBI_NOTSET on failure + */ +size_t mobi_get_record_extrasize(const MOBIPdbRecord *record, const uint16_t flags) { + size_t extra_size = 0; + MOBIBuffer *buf = mobi_buffer_init_null(record->data, record->size); + if (buf == NULL) { + debug_print("%s", "Buffer init in extrasize failed\n"); + return MOBI_NOTSET; + } + /* set pointer at the end of the record data */ + mobi_buffer_setpos(buf, buf->maxlen - 1); + for (int bit = 15; bit > 0; bit--) { + if (flags & (1 << bit)) { + /* bit is set */ + size_t len = 0; + /* size contains varlen itself and optional data */ + const uint32_t size = mobi_buffer_get_varlen_dec(buf, &len); + /* skip data */ + /* TODO: read and store in record struct */ + mobi_buffer_seek(buf, - (int)(size - len)); + extra_size += size; + } + } + /* check bit 0 */ + if (flags & 1) { + const uint8_t b = mobi_buffer_get8(buf); + /* two first bits hold size */ + extra_size += (b & 0x3) + 1; + } + mobi_buffer_free_null(buf); + return extra_size; +} + +/** + @brief Calculate the size of extra multibyte section at the end of text record + + @param[in] record MOBIPdbRecord structure containing the record + @param[in] flags Flags from MOBI header (extra_flags) + @return The size of trailing bytes, MOBI_NOTSET on failure + */ +size_t mobi_get_record_mb_extrasize(const MOBIPdbRecord *record, const uint16_t flags) { + size_t extra_size = 0; + if (flags & 1) { + MOBIBuffer *buf = mobi_buffer_init_null(record->data, record->size); + if (buf == NULL) { + debug_print("%s", "Buffer init in extrasize failed\n"); + return MOBI_NOTSET; + } + /* set pointer at the end of the record data */ + mobi_buffer_setpos(buf, buf->maxlen - 1); + for (int bit = 15; bit > 0; bit--) { + if (flags & (1 << bit)) { + /* bit is set */ + size_t len = 0; + /* size contains varlen itself and optional data */ + const uint32_t size = mobi_buffer_get_varlen_dec(buf, &len); + /* skip data */ + /* TODO: read and store in record struct */ + mobi_buffer_seek(buf, - (int)(size - len)); + } + } + /* read multibyte section */ + const uint8_t b = mobi_buffer_get8(buf); + /* two first bits hold size */ + extra_size += (b & 0x3) + 1; + mobi_buffer_free_null(buf); + } + return extra_size; +} + +/** + @brief Parse HUFF record into MOBIHuffCdic structure + + @param[in,out] huffcdic MOBIHuffCdic structure to be filled with parsed data + @param[in] record MOBIPdbRecord structure containing the record + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_huff(MOBIHuffCdic *huffcdic, const MOBIPdbRecord *record) { + MOBIBuffer *buf = mobi_buffer_init_null(record->data, record->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + char huff_magic[5]; + mobi_buffer_getstring(huff_magic, buf, 4); + const size_t header_length = mobi_buffer_get32(buf); + if (strncmp(huff_magic, HUFF_MAGIC, 4) != 0 || header_length < HUFF_HEADER_LEN) { + debug_print("HUFF wrong magic: %s\n", huff_magic); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + const size_t data1_offset = mobi_buffer_get32(buf); + const size_t data2_offset = mobi_buffer_get32(buf); + /* skip little-endian table offsets */ + mobi_buffer_setpos(buf, data1_offset); + if (buf->offset + (256 * 4) > buf->maxlen) { + debug_print("%s", "HUFF data1 too short\n"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + /* read 256 indices from data1 big-endian */ + for (int i = 0; i < 256; i++) { + huffcdic->table1[i] = mobi_buffer_get32(buf); + } + mobi_buffer_setpos(buf, data2_offset); + if (buf->offset + (64 * 4) > buf->maxlen) { + debug_print("%s", "HUFF data2 too short\n"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + /* read 32 mincode-maxcode pairs from data2 big-endian */ + huffcdic->mincode_table[0] = 0; + huffcdic->maxcode_table[0] = 0xFFFFFFFF; + for (int i = 1; i < HUFF_CODETABLE_SIZE; i++) { + const uint32_t mincode = mobi_buffer_get32(buf); + const uint32_t maxcode = mobi_buffer_get32(buf); + huffcdic->mincode_table[i] = mincode << (32 - i); + huffcdic->maxcode_table[i] = ((maxcode + 1) << (32 - i)) - 1; + } + mobi_buffer_free_null(buf); + return MOBI_SUCCESS; +} + +/** + @brief Parse CDIC record into MOBIHuffCdic structure + + @param[in,out] huffcdic MOBIHuffCdic structure to be filled with parsed data + @param[in] record MOBIPdbRecord structure containing the record + @param[in] num Number of CDIC record in a set, starting from zero + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_cdic(MOBIHuffCdic *huffcdic, const MOBIPdbRecord *record, const size_t num) { + MOBIBuffer *buf = mobi_buffer_init_null(record->data, record->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + char cdic_magic[5]; + mobi_buffer_getstring(cdic_magic, buf, 4); + const size_t header_length = mobi_buffer_get32(buf); + if (strncmp(cdic_magic, CDIC_MAGIC, 4) != 0 || header_length < CDIC_HEADER_LEN) { + debug_print("CDIC wrong magic: %s or declared header length: %zu\n", cdic_magic, header_length); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + /* variables in huffcdic initialized to zero with calloc */ + /* save initial count and length */ + size_t index_count = mobi_buffer_get32(buf); + const size_t code_length = mobi_buffer_get32(buf); + if (huffcdic->code_length && huffcdic->code_length != code_length) { + debug_print("CDIC different code length %zu in record %i, previous was %zu\n", huffcdic->code_length, record->uid, code_length); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + if (huffcdic->index_count && huffcdic->index_count != index_count) { + debug_print("CDIC different index count %zu in record %i, previous was %zu\n", huffcdic->index_count, record->uid, index_count); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + if (code_length == 0 || code_length > HUFF_CODELEN_MAX) { + debug_print("Code length exceeds sanity checks (%zu)\n", code_length); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + huffcdic->code_length = code_length; + huffcdic->index_count = index_count; + if (index_count == 0) { + debug_print("%s", "CDIC index count is null"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + /* allocate memory for symbol offsets if not already allocated */ + if (num == 0) { + if (index_count > (1 << HUFF_CODELEN_MAX) * CDIC_RECORD_MAXCNT) { + debug_print("CDIC index count too large %zu\n", index_count); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + huffcdic->symbol_offsets = malloc(index_count * sizeof(*huffcdic->symbol_offsets)); + if (huffcdic->symbol_offsets == NULL) { + debug_print("%s", "CDIC cannot allocate memory"); + mobi_buffer_free_null(buf); + return MOBI_MALLOC_FAILED; + } + } + index_count -= huffcdic->index_read; + /* limit number of records read to code_length bits */ + if (index_count >> code_length) { + index_count = (1 << code_length); + } + if (buf->offset + (index_count * 2) > buf->maxlen) { + debug_print("%s", "CDIC indices data too short\n"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + /* read i * 2 byte big-endian indices */ + while (index_count--) { + const uint16_t offset = mobi_buffer_get16(buf); + const size_t saved_pos = buf->offset; + mobi_buffer_setpos(buf, offset + CDIC_HEADER_LEN); + const size_t len = mobi_buffer_get16(buf) & 0x7fff; + if (buf->error != MOBI_SUCCESS || buf->offset + len > buf->maxlen) { + debug_print("%s", "CDIC offset beyond buffer\n"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + mobi_buffer_setpos(buf, saved_pos); + huffcdic->symbol_offsets[huffcdic->index_read++] = offset; + } + if (buf->offset + code_length > buf->maxlen) { + debug_print("%s", "CDIC dictionary data too short\n"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + /* copy pointer to data */ + huffcdic->symbols[num] = record->data + CDIC_HEADER_LEN; + /* free buffer */ + mobi_buffer_free_null(buf); + return MOBI_SUCCESS; +} + +/** + @brief Parse a set of HUFF and CDIC records into MOBIHuffCdic structure + + @param[in] m MOBIData structure with loaded MOBI document + @param[in,out] huffcdic MOBIHuffCdic structure to be filled with parsed data + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_huffdic(const MOBIData *m, MOBIHuffCdic *huffcdic) { + MOBI_RET ret; + const size_t offset = mobi_get_kf8offset(m); + if (m->mh == NULL || m->mh->huff_rec_index == NULL || m->mh->huff_rec_count == NULL) { + debug_print("%s", "HUFF/CDIC records metadata not found in MOBI header\n"); + return MOBI_DATA_CORRUPT; + } + const size_t huff_rec_index = *m->mh->huff_rec_index + offset; + const size_t huff_rec_count = *m->mh->huff_rec_count; + if (huff_rec_count > HUFF_RECORD_MAXCNT) { + debug_print("Too many HUFF record (%zu)\n", huff_rec_count); + return MOBI_DATA_CORRUPT; + } + const MOBIPdbRecord *curr = mobi_get_record_by_seqnumber(m, huff_rec_index); + if (curr == NULL || huff_rec_count < 2) { + debug_print("%s", "HUFF/CDIC record not found\n"); + return MOBI_DATA_CORRUPT; + } + if (curr->size < HUFF_RECORD_MINSIZE) { + debug_print("HUFF record too short (%zu b)\n", curr->size); + return MOBI_DATA_CORRUPT; + } + ret = mobi_parse_huff(huffcdic, curr); + if (ret != MOBI_SUCCESS) { + debug_print("%s", "HUFF parsing failed\n"); + return ret; + } + curr = curr->next; + /* allocate memory for symbols data in each CDIC record */ + huffcdic->symbols = malloc((huff_rec_count - 1) * sizeof(*huffcdic->symbols)); + if (huffcdic->symbols == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + /* get following CDIC records */ + size_t i = 0; + while (i < huff_rec_count - 1) { + if (curr == NULL) { + debug_print("%s\n", "CDIC record not found"); + return MOBI_DATA_CORRUPT; + } + ret = mobi_parse_cdic(huffcdic, curr, i++); + if (ret != MOBI_SUCCESS) { + debug_print("%s", "CDIC parsing failed\n"); + return ret; + } + curr = curr->next; + } + if (huffcdic->index_count != huffcdic->index_read) { + debug_print("CDIC: wrong read index count: %zu, total: %zu\n", huffcdic->index_read, huffcdic->index_count); + return MOBI_DATA_CORRUPT; + } + return MOBI_SUCCESS; +} + +/** + @brief Parse FDST record into MOBIRawml structure (MOBIFdst member) + + @param[in] m MOBIData structure with loaded MOBI document + @param[in,out] rawml MOBIRawml structure to be filled with parsed data + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_fdst(const MOBIData *m, MOBIRawml *rawml) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + const size_t fdst_record_number = mobi_get_fdst_record_number(m); + if (fdst_record_number == MOBI_NOTSET) { + return MOBI_DATA_CORRUPT; + } + const MOBIPdbRecord *fdst_record = mobi_get_record_by_seqnumber(m, fdst_record_number); + if (fdst_record == NULL) { + return MOBI_DATA_CORRUPT; + } + MOBIBuffer *buf = mobi_buffer_init_null(fdst_record->data, fdst_record->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + char fdst_magic[5]; + mobi_buffer_getstring(fdst_magic, buf, 4); + const size_t data_offset = mobi_buffer_get32(buf); + const size_t section_count = mobi_buffer_get32(buf); + if (strncmp(fdst_magic, FDST_MAGIC, 4) != 0 || + section_count <= 1 || + section_count != *m->mh->fdst_section_count || + data_offset != 12) { + debug_print("FDST wrong magic: %s, sections count: %zu or data offset: %zu\n", fdst_magic, section_count, data_offset); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + if ((buf->maxlen - buf->offset) < section_count * 8) { + debug_print("%s", "Record FDST too short\n"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + rawml->fdst = malloc(sizeof(MOBIFdst)); + if (rawml->fdst == NULL) { + debug_print("%s\n", "Memory allocation failed"); + mobi_buffer_free_null(buf); + return MOBI_MALLOC_FAILED; + } + rawml->fdst->fdst_section_count = section_count; + rawml->fdst->fdst_section_starts = malloc(sizeof(*rawml->fdst->fdst_section_starts) * section_count); + if (rawml->fdst->fdst_section_starts == NULL) { + debug_print("%s\n", "Memory allocation failed"); + mobi_buffer_free_null(buf); + free(rawml->fdst); + rawml->fdst = NULL; + return MOBI_MALLOC_FAILED; + } + rawml->fdst->fdst_section_ends = malloc(sizeof(*rawml->fdst->fdst_section_ends) * section_count); + if (rawml->fdst->fdst_section_ends == NULL) { + debug_print("%s\n", "Memory allocation failed"); + mobi_buffer_free_null(buf); + free(rawml->fdst->fdst_section_starts); + free(rawml->fdst); + rawml->fdst = NULL; + return MOBI_MALLOC_FAILED; + } + size_t i = 0; + while (i < section_count) { + rawml->fdst->fdst_section_starts[i] = mobi_buffer_get32(buf); + rawml->fdst->fdst_section_ends[i] = mobi_buffer_get32(buf); + debug_print("FDST[%zu]:\t%i\t%i\n", i, rawml->fdst->fdst_section_starts[i], rawml->fdst->fdst_section_ends[i]); + i++; + } + mobi_buffer_free_null(buf); + return MOBI_SUCCESS; +} + +/** + @brief Read MOBI document from file into MOBIData structure + + @param[in,out] m MOBIData structure to be filled with read data + @param[in] file File descriptor to read from + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_load_file(MOBIData *m, FILE *file) { + MOBI_RET ret; + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + ret = mobi_load_pdbheader(m, file); + if (ret != MOBI_SUCCESS) { + return ret; + } + if (strcmp(m->ph->type, "BOOK") != 0 && strcmp(m->ph->type, "TEXt") != 0) { + debug_print("Unsupported file type: %s\n", m->ph->type); + return MOBI_FILE_UNSUPPORTED; + } + if (m->ph->rec_count == 0) { + debug_print("%s", "No records found\n"); + return MOBI_DATA_CORRUPT; + } + ret = mobi_load_reclist(m, file); + if (ret != MOBI_SUCCESS) { + return ret; + } + ret = mobi_load_rec(m, file); + if (ret != MOBI_SUCCESS) { + return ret; + } + ret = mobi_parse_record0(m, 0); + if (ret != MOBI_SUCCESS) { + return ret; + } + if (m->rh && m->rh->encryption_type == MOBI_ENCRYPTION_V1) { + /* try to set key for encryption type 1 */ + debug_print("Trying to set key for encryption type 1%s", "\n"); + mobi_drm_setkey(m, NULL); + } + /* if EXTH is loaded parse KF8 record0 for hybrid KF7/KF8 file */ + if (m->eh) { + const size_t boundary_rec_number = mobi_get_kf8boundary_seqnumber(m); + if (boundary_rec_number != MOBI_NOTSET && boundary_rec_number < UINT32_MAX) { + /* it is a hybrid KF7/KF8 file */ + m->kf8_boundary_offset = (uint32_t) boundary_rec_number; + m->next = mobi_init(); + /* link pdb header and records data to KF8data structure */ + m->next->ph = m->ph; + m->next->rec = m->rec; + m->next->drm_key = m->drm_key; + m->next->internals = m->internals; + /* close next loop */ + m->next->next = m; + ret = mobi_parse_record0(m->next, boundary_rec_number + 1); + if (ret != MOBI_SUCCESS) { + return ret; + } + /* swap to kf8 part if use_kf8 flag is set */ + if (m->use_kf8) { + mobi_swap_mobidata(m); + } + } + } + return MOBI_SUCCESS; +} + +/** + @brief Read MOBI document from a path into MOBIData structure + + @param[in,out] m MOBIData structure to be filled with read data + @param[in] path Path to a MOBI document on disk (eg. /home/me/test.mobi) + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_load_filename(MOBIData *m, const char *path) { + FILE *file = fopen(path, "rb"); + if (file == NULL) { + debug_print("%s", "File not found\n"); + return MOBI_FILE_NOT_FOUND; + } + const MOBI_RET ret = mobi_load_file(m, file); + fclose(file); + return ret; +} diff --git a/app/src/main/cpp/libmobi/src/read.h b/app/src/main/cpp/libmobi/src/read.h new file mode 100644 index 0000000..cbeff71 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/read.h @@ -0,0 +1,28 @@ +/** @file read.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_read_h +#define libmobi_read_h + +#include "config.h" +#include "mobi.h" +#include "memory.h" +#include "compression.h" + +#define MOBI_EXTH_MAXCNT 1024 + +MOBI_RET mobi_parse_fdst(const MOBIData *m, MOBIRawml *rawml); +MOBI_RET mobi_parse_huffdic(const MOBIData *m, MOBIHuffCdic *cdic); +MOBI_RET mobi_load_pdbheader(MOBIData *m, FILE *file); +MOBI_RET mobi_load_reclist(MOBIData *m, FILE *file); +MOBI_RET mobi_load_rec(MOBIData *m, FILE *file); +MOBI_RET mobi_load_recdata(MOBIPdbRecord *rec, FILE *file); + +#endif diff --git a/app/src/main/cpp/libmobi/src/sha1.c b/app/src/main/cpp/libmobi/src/sha1.c new file mode 100644 index 0000000..3c7f873 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/sha1.c @@ -0,0 +1,281 @@ +/* + SHA-1 in C + By Steve Reid + 100% Public Domain + ----------------- + Modified 7/98 + By James H. Brown + Still 100% Public Domain + Corrected a problem which generated improper hash values on 16 bit machines + Routine SHA1Update changed from + void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int + len) + to + void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned + long len) + The 'len' parameter was declared an int which works fine on 32 bit machines. + However, on 16 bit machines an int is too small for the shifts being done + against + it. This caused the hash function to generate incorrect values if len was + greater than 8191 (8K - 1) due to the 'len << 3' on line 3 of SHA1Update(). + Since the file IO in main() reads 16K at a time, any file 8K or larger would + be guaranteed to generate the wrong hash (e.g. Test Vector #3, a million + "a"s). + I also changed the declaration of variables i & j in SHA1Update to + unsigned long from unsigned int for the same reason. + These changes should make no difference to any 32 bit implementations since + an + int and a long are the same size in those environments. + -- + I also corrected a few compiler warnings generated by Borland C. + 1. Added #include for exit() prototype + 2. Removed unused variable 'j' in SHA1Final + 3. Changed exit(0) to return(0) at end of main. + ALL changes I made can be located by searching for comments containing 'JHB' + ----------------- + Modified 8/98 + By Steve Reid + Still 100% public domain + 1- Removed #include and used return() instead of exit() + 2- Fixed overwriting of finalcount in SHA1Final() (discovered by Chris Hall) + 3- Changed email address from steve@edmweb.com to sreid@sea-to-sky.net + ----------------- + Modified 4/01 + By Saul Kravitz + Still 100% PD + Modified to run on Compaq Alpha hardware. + ----------------- + Modified 07/2002 + By Ralph Giles + Still 100% public domain + modified for use with stdint types, autoconf + code cleanup, removed attribution comments + switched SHA1Final() argument order for consistency + use SHA1_ prefix for public api + move public api to sha1.h + */ + +/* + Test Vectors (from FIPS PUB 180-1) + "abc" + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D + "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 + A million repetitions of "a" + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F + */ + +/* #define SHA1HANDSOFF */ + +#include +#include +#include + +#include "sha1.h" +#define UNUSED(x) (void)(x) + +void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64]); + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +#define blk0(i) (block->l[i] = (((uint32_t)block->c[i*4 ] << 24) | \ + ((uint32_t)block->c[i*4 + 1] << 16) | \ + ((uint32_t)block->c[i*4 + 2] << 8) | \ + ((uint32_t)block->c[i*4 + 3] ))) +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ +^block->l[(i+2)&15]^block->l[i&15],1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); +#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); +#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); + + +#ifdef VERBOSE /* SAK */ +void SHAPrintContext(SHA1_CTX *context, char *msg) { + printf("%s (%d,%d) %x %x %x %x %x\n", + msg, + context->count[0], context->count[1], + context->state[0], + context->state[1], + context->state[2], + context->state[3], + context->state[4]); +} +#endif /* VERBOSE */ + +/* Hash a single 512-bit block. This is the core of the algorithm. */ +void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64]) { + uint32_t a, b, c, d, e; + typedef union { + uint8_t c[64]; + uint32_t l[16]; + } CHAR64LONG16; + CHAR64LONG16* block; + +#ifdef SHA1HANDSOFF + static uint8_t workspace[64]; + block = (CHAR64LONG16*) workspace; + memcpy(block, buffer, 64); +#else + block = (CHAR64LONG16*) buffer; +#endif + + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); + R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); + R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); + R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); + R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); + R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); + R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); + R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); + R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); + R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); + R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); + R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); + R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); + R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); + R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); + R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); + R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); + R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); + R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); + R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); + + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + + /* Wipe variables */ + a = b = c = d = e = 0; + UNUSED(a);UNUSED(b);UNUSED(c);UNUSED(d);UNUSED(e); +} + + +/* SHA1Init - Initialize new context */ +void SHA1_Init(SHA1_CTX* context) { + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; +} + + +/* Run your data through this. */ +void SHA1_Update(SHA1_CTX* context, const uint8_t* data, const size_t len) { + size_t i, j; + +#ifdef VERBOSE + SHAPrintContext(context, "before"); +#endif + + j = (context->count[0] >> 3) & 63; + if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; + context->count[1] += (len >> 29); + if ((j + len) > 63) { + memcpy(&context->buffer[j], data, (i = 64-j)); + SHA1_Transform(context->state, context->buffer); + for ( ; i + 63 < len; i += 64) { + SHA1_Transform(context->state, data + i); + } + j = 0; + } + else i = 0; + memcpy(&context->buffer[j], &data[i], len - i); + +#ifdef VERBOSE + SHAPrintContext(context, "after "); +#endif +} + + +/* Add padding and return the message digest. */ +void SHA1_Final(SHA1_CTX* context, uint8_t digest[SHA1_DIGEST_SIZE]) { + uint32_t i; + uint8_t finalcount[8]; + + for (i = 0; i < 8; i++) { + finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] + >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ + } + SHA1_Update(context, (uint8_t *)"\200", 1); + while ((context->count[0] & 504) != 448) { + SHA1_Update(context, (uint8_t *)"\0", 1); + } + SHA1_Update(context, finalcount, 8); /* Should cause a SHA1_Transform() */ + for (i = 0; i < SHA1_DIGEST_SIZE; i++) { + digest[i] = (uint8_t) + ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); + } + + /* Wipe variables */ + i = 0; + UNUSED(i); + memset(context->buffer, 0, 64); + memset(context->state, 0, 20); + memset(context->count, 0, 8); + memset(finalcount, 0, 8); /* SWR */ + +#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite its own static vars */ + SHA1_Transform(context->state, context->buffer); +#endif +} + +/*************************************************************/ + +#ifdef TEST +int main(int argc, char** argv) { + int i, j; + SHA1_CTX context; + unsigned char digest[SHA1_DIGEST_SIZE], buffer[16384]; + FILE* file; + if (argc > 2) { + puts("Public domain SHA-1 implementation - by Steve Reid "); + puts("Modified for 16 bit environments 7/98 - by James H. Brown "); /* JHB */ + puts("Produces the SHA-1 hash of a file, or stdin if no file is specified."); + return(0); + } + if (argc < 2) { + file = stdin; + } + else { + if (!(file = fopen(argv[1], "rb"))) { + fputs("Unable to open file.", stderr); + return(-1); + } + } + SHA1_Init(&context); + while (!feof(file)) { /* note: what if ferror(file) */ + i = fread(buffer, 1, 16384, file); + SHA1_Update(&context, buffer, i); + } + SHA1_Final(&context, digest); + fclose(file); + for (i = 0; i < SHA1_DIGEST_SIZE/4; i++) { + for (j = 0; j < 4; j++) { + printf("%02X", digest[i*4+j]); + } + putchar(' '); + } + putchar('\n'); + return(0); /* JHB */ +} +#endif diff --git a/app/src/main/cpp/libmobi/src/sha1.h b/app/src/main/cpp/libmobi/src/sha1.h new file mode 100644 index 0000000..6093006 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/sha1.h @@ -0,0 +1,27 @@ +/** @file sha1.h + * @brief Header for sha1.c + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef mobi_sha1_h +#define mobi_sha1_h + +typedef struct { + uint32_t state[5]; + uint32_t count[2]; + uint8_t buffer[64]; +} SHA1_CTX; + +#define SHA1_DIGEST_SIZE 20 + +void SHA1_Init(SHA1_CTX *context); +void SHA1_Update(SHA1_CTX *context, const uint8_t *data, const size_t len); +void SHA1_Final(SHA1_CTX *context, uint8_t digest[SHA1_DIGEST_SIZE]); + +#endif /* sha1_h */ diff --git a/app/src/main/cpp/libmobi/src/structure.c b/app/src/main/cpp/libmobi/src/structure.c new file mode 100644 index 0000000..4ed6529 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/structure.c @@ -0,0 +1,566 @@ +/** @file structure.c + * @brief Data structures + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#include +#include +#include "structure.h" +#include "debug.h" +#if defined(__BIONIC__) && !defined(SIZE_MAX) +#include /* for SIZE_MAX */ +#endif + +/** + @brief Initializer for MOBIArray structure + + It allocates memory for structure and for data: array of uint32_t variables. + Memory should be freed with array_free(). + + @param[in] len Initial size of the array + @return MOBIArray on success, NULL otherwise + */ +MOBIArray * array_init(const size_t len) { + MOBIArray *arr = NULL; + arr = malloc(sizeof(MOBIArray)); + if (arr == NULL) { + debug_print("%s", "Array allocation failed\n"); + return NULL; + } + arr->data = malloc(len * sizeof(*arr->data)); + if (arr->data == NULL) { + free(arr); + debug_print("%s", "Array data allocation failed\n"); + return NULL; + } + arr->maxsize = len; + arr->step = len ? len : 1; + arr->size = 0; + return arr; +} + +/** + @brief Inserts value into MOBIArray array + + @param[in,out] arr MOBIArray array + @param[in] value Value to be inserted + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET array_insert(MOBIArray *arr, const uint32_t value) { + if (!arr || arr->maxsize == 0) { + return MOBI_INIT_FAILED; + } + if (arr->maxsize == arr->size) { + arr->maxsize += arr->step; + uint32_t *tmp = realloc(arr->data, arr->maxsize * sizeof(*arr->data)); + if (!tmp) { + free(arr->data); + arr->data = NULL; + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + arr->data = tmp; + } + arr->data[arr->size] = value; + arr->size++; + return MOBI_SUCCESS; +} + +/** + @brief Helper for qsort in array_sort() function. + + @param[in] a First element to compare + @param[in] b Second element to compare + @return -1 if a < b; 1 if a > b; 0 if a = b + */ +static int array_compare(const void *a, const void *b) { + if (*(uint32_t *) a < *(uint32_t *) b) { + return -1; + }; + if (*(uint32_t *) a > *(uint32_t *) b) { + return 1; + }; + return 0; +} + +/** + @brief Sort MOBIArray in ascending order. + + When unique is set to true, duplicate values are discarded. + + @param[in,out] arr MOBIArray array + @param[in] unique Discard duplicate values if true + */ +void array_sort(MOBIArray *arr, const bool unique) { + if (!arr || !arr->data || arr->size == 0) { + return; + } + qsort(arr->data, arr->size, sizeof(*arr->data), array_compare); + if (unique) { + size_t i = 1; + size_t j = 1; + while (i < arr->size) { + if (arr->data[j - 1] == arr->data[i]) { + i++; + continue; + } + arr->data[j++] = arr->data[i++]; + } + arr->size = j; + } +} + +/** + @brief Get size of the array + + @param[in] arr MOBIArray structure + @return Array size + */ +size_t array_size(MOBIArray *arr) { + return arr->size; +} + +/** + @brief Free MOBIArray structure and contained data + + Free data initialized with array_init(); + + @param[in] arr MOBIArray structure + */ +void array_free(MOBIArray *arr) { + if (!arr) { return; } + if (arr->data) { + free(arr->data); + } + free(arr); +} + + +/** + @brief Create and return MOBITrie structure + + @return MOBITrie stucture initialized with zeroes + */ +static MOBITrie * mobi_trie_mknode(void) { + MOBITrie *node = calloc(1, sizeof(MOBITrie)); + if (node == NULL) { + debug_print("Memory allocation failed%s", "\n"); + } + return node; +} + +/** + @brief Recursively free MOBITrie trie starting from node + + @param[in] node Starting node + */ +void mobi_trie_free(MOBITrie *node) { + if (node) { + mobi_trie_free(node->next); + mobi_trie_free(node->children); + free(node->values); + free(node); + } +} + +/** + @brief Insert value into array at given MOBITrie node + + @param[in,out] node Starting node + @param[in] value Value to be inserted + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_trie_addvalue(MOBITrie *node, char *value) { + if (node->values) { + size_t cnt = ++node->values_count; + void *new_values = realloc(node->values, cnt * sizeof(*node->values)); + if (new_values == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + node->values = new_values; + node->values[cnt - 1] = value; + } else { + node->values = malloc(sizeof(*node->values)); + if (node->values == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + node->values[0] = value; + node->values_count = 1; + } + return MOBI_SUCCESS; +} + +/** + @brief Insert key character and value (if given) at MOBITrie node + + @param[in,out] node Starting node + @param[in] c Key character + @param[in] value Value to be inserted at terminal node, or NULL if not terminal + @return MOBITrie node: current node if value inserted (terminal), + children node (if transitional) or NULL on error + */ +static MOBITrie * mobi_trie_insert_char(MOBITrie *node, char c, char *value) { + if (!node) { return NULL; } + while (true) { + if (node->c == c) { + break; + } + if (node->next == NULL) { + node->next = mobi_trie_mknode(); + node = node->next; + break; + } + node = node->next; + } + if (node->c == 0) { + node->c = c; + } + if (value) { + /* terminal node */ + if (mobi_trie_addvalue(node, value) == MOBI_SUCCESS) { + return node; + } + return NULL; + } + if (node->children == NULL) { + node->children = mobi_trie_mknode(); + } + return node->children; +} + +/** + @brief Insert reversed string into MOBITrie trie + + @param[in,out] root Root node + @param[in] string String to be inserted + @param[in] value Value associated with the string + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_trie_insert_reversed(MOBITrie **root, char *string, char *value) { + size_t length = strlen(string); + if (length == 0) { + debug_print("Skipping empty lookup string in trie node%s", "\n"); + return MOBI_SUCCESS; + } + if (*root == NULL) { + *root = mobi_trie_mknode(); + if (*root == NULL) { + return MOBI_MALLOC_FAILED; + } + } + MOBITrie *node = *root; + while (length > 1) { + node = mobi_trie_insert_char(node, string[length - 1], NULL); + if (node == NULL) { + return MOBI_MALLOC_FAILED; + } + length--; + } + node = mobi_trie_insert_char(node, string[length - 1], value); + if (node == NULL) { + return MOBI_MALLOC_FAILED; + } + return MOBI_SUCCESS; +} + +/** + @brief Fetch values for key c from MOBITrie trie's current level starting at node + + @param[in,out] values Array of values to be fetched + @param[in,out] values_count Array size + @param[in] node MOBITrie node to start search + @param[in] c Key character + @return MOBITrie children node of the node with c key or NULL if not found + */ +MOBITrie * mobi_trie_get_next(char ***values, size_t *values_count, const MOBITrie *node, const char c) { + if (!node) { return NULL; } + while (node) { + if (node->c == c) { + *values = (char**) node->values; + *values_count = node->values_count; + return node->children; + } + node = node->next; + } + return NULL; +} + +#if 0 +/* Simple imprementation of binary tree, storing key strings + and associated arrays of values + currently not used, save for later */ + +typedef struct MOBIBtree { + char *key; /**< key */ + char **array; /**< array of strings */ + size_t value_count; /**< strings count */ + struct MOBIBtree *left; /**< left child */ + struct MOBIBtree *right; /**< right child */ +} MOBIBtree; + +/** + @brief Search MOBIBtree tree for string key + + @param[in] node MOBIBtree node to start search + @param[in] key Key string + @return MOBIBtree node or NULL if not found + */ +MOBIBtree *mobi_btree_search(MOBIBtree *node, const char *key) { + MOBIBtree *found = NULL; + int compare = strcmp(key, node->key); + if (compare < 0) { + found = mobi_btree_search(node->left, key); + } else if (compare > 0) { + found = mobi_btree_search(node->right, key); + } else { + found = node; + } + return found; +} + +/** + @brief Insert key and value (into array) into MOBIBtree tree + + @param[in] node MOBIBtree root node + @param[in] key Key string + @param[in] value Value string will be inserted into array + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_btree_insert(MOBIBtree **node, char *key, char *value) { + MOBI_RET ret = MOBI_SUCCESS; + if (*node == NULL) { + *node = malloc(sizeof(MOBIBtree)); + if (*node == NULL) { + return MOBI_MALLOC_FAILED; + } + (*node)->key = key; + (*node)->value_count = 1; + (*node)->array = malloc(sizeof(*(*node)->array)); + if ((*node)->array == NULL) { + free(*node); + return MOBI_MALLOC_FAILED; + } + (*node)->array[0] = value; + (*node)->left = NULL; + (*node)->right = NULL; + return MOBI_SUCCESS; + } + int compare = strcmp(key, (*node)->key); + if (compare < 0) { + ret = mobi_btree_insert(&(*node)->left, key, value); + } else if (compare > 0) { + ret = mobi_btree_insert(&(*node)->right, key, value); + } else { + size_t cnt = ++(*node)->value_count; + char **new_array = realloc((*node)->array, cnt * sizeof(*(*node)->array)); + if (new_array) { + (*node)->array = new_array; + (*node)->array[cnt - 1] = value; + } else { + return MOBI_MALLOC_FAILED; + } + } + return ret; +} +#endif + + +/** + @brief Allocate fragment, fill with data and return + + @param[in] raw_offset Fragment offset in raw markup, + SIZE_MAX if not present in original markup + @param[in] fragment Fragment data + @param[in] size Size data + @param[in] is_malloc is_maloc data + @return Fragment structure filled with data + */ +static MOBIFragment * mobi_list_init(size_t raw_offset, unsigned char *fragment, const size_t size, const bool is_malloc) { + MOBIFragment *curr = calloc(1, sizeof(MOBIFragment)); + if (curr == NULL) { + if (is_malloc) { + free(fragment); + } + return NULL; + } + curr->raw_offset = raw_offset; + curr->fragment = fragment; + curr->size = size; + curr->is_malloc = is_malloc; + return curr; +} + +/** + @brief Allocate fragment, fill with data, append to linked list + + @param[in] curr Last fragment in linked list + @param[in] raw_offset Fragment offset in raw markup, + SIZE_MAX if not present in original markup + @param[in] fragment Fragment data + @param[in] size Size data + @param[in] is_malloc is_maloc data + @return Fragment structure filled with data + */ +MOBIFragment * mobi_list_add(MOBIFragment *curr, size_t raw_offset, unsigned char *fragment, const size_t size, const bool is_malloc) { + if (!curr) { + return mobi_list_init(raw_offset, fragment, size, is_malloc); + } + curr->next = calloc(1, sizeof(MOBIFragment)); + if (curr->next == NULL) { + if (is_malloc) { + free(fragment); + } + return NULL; + } + MOBIFragment *next = curr->next; + next->raw_offset = raw_offset; + next->fragment = fragment; + next->size = size; + next->is_malloc = is_malloc; + return next; +} + +/** + @brief Allocate fragment, fill with data, + insert into linked list at given offset + + Starts to search for offset at given fragment. The pointer to input fragment will be replaced by newly added one. + + @param[in,out] fragment Fragment where search starts, on success pointer to new fragment structure filled with data + @param[in] raw_offset Fragment offset in raw markup, SIZE_MAX if not present in original markup + @param[in] data Fragment data + @param[in] size Size data + @param[in] is_malloc is_maloc data + @param[in] offset offset where new chunk will be inserted + @return MOBI_RET status code (on success MOBI_SUCCESS, on offset not found MOBI_DATA_CORRUPT) + */ +MOBI_RET mobi_list_insert(MOBIFragment **fragment, size_t raw_offset, unsigned char *data, const size_t size, const bool is_malloc, const size_t offset) { + MOBIFragment *curr = *fragment; + MOBIFragment *prev = NULL; + while (curr) { + if (curr->raw_offset != SIZE_MAX && curr->raw_offset <= offset && curr->raw_offset + curr->size >= offset ) { + break; + } + prev = curr; + curr = curr->next; + } + if (!curr) { + debug_print("Offset not found: %zu\n", offset); + if (is_malloc) { + free(data); + } + return MOBI_DATA_CORRUPT; + } + MOBIFragment *new = calloc(1, sizeof(MOBIFragment)); + if (new == NULL) { + if (is_malloc) { + free(data); + } + return MOBI_MALLOC_FAILED; + } + new->raw_offset = raw_offset; + new->fragment = data; + new->size = size; + new->is_malloc = is_malloc; + MOBIFragment *new2 = NULL; + if (curr->raw_offset == offset) { + /* prepend chunk */ + if (prev) { + prev->next = new; + new->next = curr; + } else { + /* save curr */ + MOBIFragment tmp; + tmp.raw_offset = curr->raw_offset; + tmp.fragment = curr->fragment; + tmp.size = curr->size; + tmp.is_malloc = curr->is_malloc; + tmp.next = curr->next; + /* move new to curr */ + curr->raw_offset = new->raw_offset; + curr->fragment = new->fragment; + curr->size = new->size; + curr->is_malloc = new->is_malloc; + curr->next = new; + /* restore tmp to new */ + new->raw_offset = tmp.raw_offset; + new->fragment = tmp.fragment; + new->size = tmp.size; + new->is_malloc = tmp.is_malloc; + new->next = tmp.next; + *fragment = curr; + return MOBI_SUCCESS; + } + } else if (curr->raw_offset + curr->size == offset) { + /* append chunk */ + new->next = curr->next; + curr->next = new; + } else { + /* split fragment and insert new chunk */ + new2 = calloc(1, sizeof(MOBIFragment)); + if (new2 == NULL) { + free(new); + if (is_malloc) { + free(data); + } + return MOBI_MALLOC_FAILED; + } + size_t rel_offset = offset - curr->raw_offset; + new2->next = curr->next; + new2->size = curr->size - rel_offset; + new2->raw_offset = offset; + new2->fragment = curr->fragment + rel_offset; + new2->is_malloc = false; + curr->next = new; + curr->size = rel_offset; + new->next = new2; + } + /* correct offsets */ + if (raw_offset != SIZE_MAX) { + curr = new->next; + while (curr) { + if (curr->raw_offset != SIZE_MAX) { + curr->raw_offset += new->size; + } + curr = curr->next; + } + } + *fragment = new; + return MOBI_SUCCESS; +} + +/** + @brief Delete fragment from linked list + + @param[in] curr Fragment to be deleted + @return Next fragment in the linked list or NULL if absent + */ +MOBIFragment * mobi_list_del(MOBIFragment *curr) { + MOBIFragment *del = curr; + curr = curr->next; + if (del->is_malloc) { + free(del->fragment); + } + free(del); + del = NULL; + return curr; +} + +/** + @brief Delete all fragments from linked list + + @param[in] first First fragment from the list + */ +void mobi_list_del_all(MOBIFragment *first) { + while (first) { + first = mobi_list_del(first); + } +} diff --git a/app/src/main/cpp/libmobi/src/structure.h b/app/src/main/cpp/libmobi/src/structure.h new file mode 100644 index 0000000..0c65320 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/structure.h @@ -0,0 +1,66 @@ +/** @file structure.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef mobi_structure_h +#define mobi_structure_h + +#include "config.h" +#include "mobi.h" + +/** + @brief Dynamic array of uint32_t values structure + */ +typedef struct { + uint32_t *data; /**< Array */ + size_t maxsize; /**< Allocated size */ + size_t step; /**< Step by which array will be enlarged if out of memory */ + size_t size; /**< Current size */ +} MOBIArray; + +MOBIArray * array_init(const size_t len); +MOBI_RET array_insert(MOBIArray *arr, const uint32_t value); +void array_sort(MOBIArray *arr, const bool unique); +size_t array_size(MOBIArray *arr); +void array_free(MOBIArray *arr); + +/** + @brief Trie storing arrays of values for character keys + */ +typedef struct MOBITrie { + char c; /**< Key character */ + void **values; /**< Array of values */ + size_t values_count; /**< Array size */ + struct MOBITrie *next; /**< Next node at the same level */ + struct MOBITrie *children; /**< Link to children nodes, lower level */ +} MOBITrie; + +MOBI_RET mobi_trie_insert_reversed(MOBITrie **root, char *string, char *value); +MOBITrie * mobi_trie_get_next(char ***values, size_t *values_count, const MOBITrie *node, const char c); +void mobi_trie_free(MOBITrie *node); + +/** + @brief Structure for links reconstruction. + + Linked list of Fragment structures forms whole document part + */ +typedef struct MOBIFragment { + size_t raw_offset; /**< fragment offset in raw markup, SIZE_MAX if not present in original markup */ + unsigned char *fragment; /**< Fragment data */ + size_t size; /**< Fragment size */ + bool is_malloc; /**< Is it needed to free this fragment or is it just an alias to part data */ + struct MOBIFragment *next; /**< Link to next fragment */ +} MOBIFragment; + +MOBIFragment * mobi_list_add(MOBIFragment *curr, size_t raw_offset, unsigned char *fragment, const size_t size, const bool is_malloc); +MOBIFragment * mobi_list_del(MOBIFragment *curr); +MOBI_RET mobi_list_insert(MOBIFragment **curr, size_t raw_offset, unsigned char *fragment, const size_t size, const bool is_malloc, const size_t offset); +void mobi_list_del_all(MOBIFragment *first); + +#endif diff --git a/app/src/main/cpp/libmobi/src/util.c b/app/src/main/cpp/libmobi/src/util.c new file mode 100644 index 0000000..acc5b77 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/util.c @@ -0,0 +1,3561 @@ +/** @file util.c + * @brief Various helper functions + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#define _GNU_SOURCE 1 +#ifndef __USE_BSD +#define __USE_BSD /* for strdup on linux/glibc */ +#endif + +#include +#include +#include +#include "util.h" +#include "parse_rawml.h" +#include "index.h" +#include "debug.h" + +#ifdef USE_ENCRYPTION +#include "encryption.h" +#endif + +#ifdef USE_XMLWRITER +#include "opf.h" +#endif + +#define MOBI_FONT_OBFUSCATED_BUFFER_COUNT 52 + +/** @brief Lookup table for cp1252 to utf8 encoding conversion */ +static const unsigned char cp1252_to_utf8[32][3] = { + {0xe2,0x82,0xac}, + {0}, + {0xe2,0x80,0x9a}, + {0xc6,0x92,0}, + {0xe2,0x80,0x9e}, + {0xe2,0x80,0xa6}, + {0xe2,0x80,0xa0}, + {0xe2,0x80,0xa1}, + {0xcb,0x86,0}, + {0xe2,0x80,0xb0}, + {0xc5,0xa0,0}, + {0xe2,0x80,0xb9}, + {0xc5,0x92,0}, + {0}, + {0xc5,0xbd,0}, + {0}, + {0}, + {0xe2,0x80,0x98}, + {0xe2,0x80,0x99}, + {0xe2,0x80,0x9c}, + {0xe2,0x80,0x9d}, + {0xe2,0x80,0xa2}, + {0xe2,0x80,0x93}, + {0xe2,0x80,0x94}, + {0xcb,0x9c,0}, + {0xe2,0x84,0xa2}, + {0xc5,0xa1,0}, + {0xe2,0x80,0xba}, + {0xc5,0x93,0}, + {0}, + {0xc5,0xbe,0}, + {0xc5,0xb8,0}, +}; + +/** + @brief Get libmobi version + + @return String version + */ +const char * mobi_version(void) { +#ifndef PACKAGE_VERSION +# define PACKAGE_VERSION "unknown" +#endif + return PACKAGE_VERSION; +} + +/** + @brief Convert unicode codepoint to utf-8 sequence + + @param[in,out] output Output string + @param[in] codepoint Unicode codepoint + @return Length of utf-8 sequence (maximum 4 bytes), zero on failure + */ +uint8_t mobi_unicode_to_utf8(char *output, const size_t codepoint) { + if (!output) { + return 0; + } + unsigned char *bytes = (unsigned char *) output; + + if (codepoint < 0x80) { + bytes[0] = (unsigned char) codepoint; + return 1; + } + if (codepoint < 0x800) { + bytes[1] = (unsigned char) ((2 << 6) | (codepoint & 0x3f)); + bytes[0] = (unsigned char) ((6 << 5) | (codepoint >> 6)); + return 2; + } + if (codepoint < 0x10000) { + bytes[2] = (unsigned char) ((2 << 6) | (codepoint & 0x3f)); + bytes[1] = (unsigned char) ((2 << 6) | ((codepoint >> 6) & 0x3f)); + bytes[0] = (unsigned char) ((14 << 4) | (codepoint >> 12)); + return 3; + } + if (codepoint < 0x11000) { + bytes[3] = (unsigned char) ((2 << 6) | (codepoint & 0x3f)); + bytes[2] = (unsigned char) ((2 << 6) | ((codepoint >> 6) & 0x3f)); + bytes[1] = (unsigned char) ((2 << 6) | ((codepoint >> 12) & 0x3f)); + bytes[0] = (unsigned char) ((30 << 3) | (codepoint >> 18)); + return 4; + } + return 0; +} + +/** + @brief Convert cp1252 encoded string to utf-8 + + Maximum length of output string is 3 * (input string length) + 1 + Output string will be null terminated (even if truncated) + + @param[in,out] output Output string + @param[in,out] input Input string + @param[in,out] outsize Size of the allocated output buffer, will be set to output string length (without null terminator) on return + @param[in] insize Length of the input string. + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_cp1252_to_utf8(char *output, const char *input, size_t *outsize, const size_t insize) { + if (!output || !input) { + return MOBI_PARAM_ERR; + } + const unsigned char *in = (unsigned char *) input; + unsigned char *out = (unsigned char *) output; + const unsigned char *outend = out + *outsize - 1; /* leave space for null terminator */ + const unsigned char *inend = in + insize; + while (in < inend && out < outend && *in) { + if (*in < 0x80) { + *out++ = *in++; + } + else if (*in < 0xa0) { + /* table lookup */ + size_t i = 0; + while (i < 3 && out < outend) { + unsigned char c = cp1252_to_utf8[*in - 0x80][i]; + if (c == 0) { + break; + } + *out++ = c; + i++; + } + if (i == 0) { + /* unmappable character in input */ + /* substitute with utf-8 replacement character */ + if (out >= outend - 1) { break; } + *out++ = 0xff; + *out++ = 0xfd; + debug_print("Invalid character found: %c\n", *in); + } + in++; + } + else if (*in < 0xc0) { + if (out >= outend - 1) { break; } + *out++ = 0xc2; + *out++ = *in++; + } + else { + if (out >= outend - 1) { break; } + *out++ = 0xc3; + *out++ = (*in++ & 0x3f) + 0x80; + } + } + *out = '\0'; + *outsize = (size_t) (out - (unsigned char *) output); + return MOBI_SUCCESS; +} + +/** + @brief Convert utf-8 encoded string to cp1252 + + Characters out of range will be replaced with substitute character + + @param[in,out] output Output string + @param[in,out] input Input string + @param[in,out] outsize Size of the allocated output buffer, will be set to output string length (without null terminator) on return + @param[in] insize Length of the input string. + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_utf8_to_cp1252(char *output, const char *input, size_t *outsize, const size_t insize) { + if (!output || !input) { + return MOBI_PARAM_ERR; + } + const unsigned char *in = (unsigned char *) input; + unsigned char *out = (unsigned char *) output; + const unsigned char *outend = out + *outsize - 1; /* leave space for null terminator */ + const unsigned char *inend = in + insize; + while (in < inend && out < outend && *in) { + /* one byte */ + if (*in < 0x80) { + *out++ = *in++; + } + /* two bytes */ + else if ((*in & 0xe0) == 0xc0) { + if (in > inend - 2) { break; } + if (in[0] == 0xc2 && (in[1] >= 0xa0 && in[1] <= 0xbf)) { + *out++ = in[1]; + } else if (in[0] == 0xc3 && (in[1] >= 0x80 && in[1] <= 0xbf)) { + *out++ = in[1] + 0x40; + } else if (in[0] == 0xc5) { + switch (in[1]) { + case 0xa0: + *out++ = 0x8a; + break; + case 0x92: + *out++ = 0x8c; + break; + case 0xbd: + *out++ = 0x8e; + break; + case 0xa1: + *out++ = 0x9a; + break; + case 0x93: + *out++ = 0x9c; + break; + case 0xbe: + *out++ = 0x9e; + break; + case 0xb8: + *out++ = 0x9f; + break; + default: + *out++ = '?'; + break; + } + } else if (in[0] == 0xc6 && in[1] == 0x92) { + *out++ = 0x83; + } else if (in[0] == 0xcb && in[1] == 0x86) { + *out++ = 0x88; + } else { + *out++ = '?'; + } + in += 2; + } + /* three bytes */ + else if ((*in & 0xf0) == 0xe0) { + if (in > inend - 3) { break; } + if (in[0] == 0xe2 && in[1] == 0x80) { + switch (in[2]) { + case 0x9a: + *out++ = 0x82; + break; + case 0x9e: + *out++ = 0x84; + break; + case 0xa6: + *out++ = 0x85; + break; + case 0xa0: + *out++ = 0x86; + break; + case 0xb0: + *out++ = 0x89; + break; + case 0xb9: + *out++ = 0x8b; + break; + case 0x98: + *out++ = 0x91; + break; + case 0x99: + *out++ = 0x92; + break; + case 0x9c: + *out++ = 0x93; + break; + case 0x9d: + *out++ = 0x94; + break; + case 0xa2: + *out++ = 0x95; + break; + case 0x93: + *out++ = 0x86; + break; + case 0x94: + *out++ = 0x97; + break; + case 0xba: + *out++ = 0x9b; + break; + default: + *out++ = '?'; + break; + } + } else if (in[0] == 0xe2 && in[1] == 0x82 && in[2] == 0xac) { + *out++ = 0x80; + } else if (in[0] == 0xe2 && in[1] == 0x84 && in[2] == 0xa2) { + *out++ = 0x99; + } else { + *out++ = '?'; + } + in += 3; + } + /* four bytes */ + else if ((*in & 0xf8) == 0xf0) { + if (in > inend - 4) { break; } + *out++ = '?'; + in += 4; + } + /* skip error */ + else { + *out++ = '?'; + in++; + } + } + *out = '\0'; + *outsize = (size_t) (out - (unsigned char *) output); + return MOBI_SUCCESS; +} + +/** @brief Decode ligature to cp1252 + + Some latin ligatures are encoded in indices to facilitate search + They are listed in LIGT header, but it seems every LIGT header contains + same 5 ligatures (even if not all of them are used). + So, instead of parsing header, we use static replacements. + Invalid control characters are skipped + + @param[in] byte1 First byte - control character + @param[in] byte2 Second byte of the ligature + @return Ligature in cp1252 encoding, zero if not found + */ +uint8_t mobi_ligature_to_cp1252(const uint8_t byte1, const uint8_t byte2) { + uint8_t ligature = 0; + const uint8_t lig_OE = 0x8c; + const uint8_t lig_oe = 0x9c; + const uint8_t lig_AE = 0xc6; + const uint8_t lig_ae = 0xe6; + const uint8_t lig_ss = 0xdf; + switch (byte1) { + case 1: + if (byte2 == 0x45) { ligature = lig_OE; } + break; + case 2: + if (byte2 == 0x65) { ligature = lig_oe; } + break; + case 3: + if (byte2 == 0x45) { ligature = lig_AE; } + break; + case 4: + if (byte2 == 0x65) { ligature = lig_ae; } + break; + case 5: + if (byte2 == 0x73) { ligature = lig_ss; } + break; + } + return ligature; +} + +/** @brief Decode ligature to utf-16 + + @param[in] byte1 First byte - control character, should be <= 5 + @param[in] byte2 Second byte of the ligature + @return Ligature in utf-16 encoding, uni_replacement if not found + */ +uint16_t mobi_ligature_to_utf16(const uint32_t byte1, const uint32_t byte2) { + const uint16_t uni_replacement = 0xfffd; + uint16_t ligature = uni_replacement; + const uint16_t lig_OE = 0x152; + const uint16_t lig_oe = 0x153; + const uint16_t lig_AE = 0xc6; + const uint16_t lig_ae = 0xe6; + const uint16_t lig_ss = 0xdf; + switch (byte1) { + case 1: + if (byte2 == 0x45) { ligature = lig_OE; } + break; + case 2: + if (byte2 == 0x65) { ligature = lig_oe; } + break; + case 3: + if (byte2 == 0x45) { ligature = lig_AE; } + break; + case 4: + if (byte2 == 0x65) { ligature = lig_ae; } + break; + case 5: + if (byte2 == 0x73) { ligature = lig_ss; } + break; + } + return ligature; +} + +/** @brief Get text encoding of mobi document + + @param[in] m MOBIData structure holding document data and metadata + @return MOBIEncoding text encoding (MOBI_UTF8 or MOBI_CP1252) + */ +MOBIEncoding mobi_get_encoding(const MOBIData *m) { + if (m && m->mh) { + if (m->mh->text_encoding) { + if (*m->mh->text_encoding == MOBI_UTF8) { + return MOBI_UTF8; + } + } + } + return MOBI_CP1252; +} + +/** @brief Check if document's text is cp1252 encoded + + @param[in] m MOBIData structure holding document data and metadata + @return True or false + */ +bool mobi_is_cp1252(const MOBIData *m) { + return (mobi_get_encoding(m) == MOBI_CP1252); +} + +/** + @brief strdup replacement + + Returned pointer must be freed by caller + + @param[in] s Input string + @return Duplicated string + */ +char * mobi_strdup(const char *s) { + char *p = malloc(strlen(s) + 1); + if (p) { strcpy(p, s); } + return p; +} + +#define MOBI_LANG_MAX 99 /**< number of entries in mobi_locale array */ +#define MOBI_REGION_MAX 21 /**< maximum number of entries in each language array */ + +/**< @brief Table of Mobipocket language-region codes + + Based on IANA language-subtag registry with some custom Mobipocket modifications. + http://www.iana.org/assignments/language-subtag-registry/language-subtag-registry + */ +static const char *mobi_locale[MOBI_LANG_MAX][MOBI_REGION_MAX] = { + {"neutral"}, + { + "ar", /**< Arabic >*/ + "ar-sa", /**< Arabic (Saudi Arabia) >*/ + "ar", /**< Arabic (Unknown) */ + "ar-eg", /**< Arabic (Egypt) >*/ + "ar", /**< Arabic (Unknown) */ + "ar-dz", /**< Arabic (Algeria) >*/ + "ar-ma", /**< Arabic (Morocco) >*/ + "ar-tn", /**< Arabic (Tunisia) >*/ + "ar-om", /**< Arabic (Oman) >*/ + "ar-ye", /**< Arabic (Yemen) >*/ + "ar-sy", /**< Arabic (Syria) >*/ + "ar-jo", /**< Arabic (Jordan) >*/ + "ar-lb", /**< Arabic (Lebanon) >*/ + "ar-kw", /**< Arabic (Kuwait) >*/ + "ar-ae", /**< Arabic (UAE) >*/ + "ar-bh", /**< Arabic (Bahrain) >*/ + "ar-qa", /**< Arabic (Qatar) >*/ + }, + {"bg"}, /**< Bulgarian >*/ + {"ca"}, /**< Catalan >*/ + { + "zh", /**< Chinese >*/ + "zh-tw", /**< Chinese (Taiwan) >*/ + "zh-cn", /**< Chinese (PRC) >*/ + "zh-hk", /**< Chinese (Hong Kong) >*/ + "zh-sg", /**< Chinese (Singapore) >*/ + }, + {"cs"}, /**< Czech >*/ + {"da"}, /**< Danish >*/ + { + "de", /**< German >*/ + "de-de", /**< German (Germany) >*/ + "de-ch", /**< German (Switzerland) >*/ + "de-at", /**< German (Austria) >*/ + "de-lu", /**< German (Luxembourg) >*/ + "de-li", /**< German (Liechtenstein) >*/ + }, + {"el"}, /**< Greek (modern) >*/ + { + "en", /**< English >*/ + "en-us", /**< English (United States) >*/ + "en-gb", /**< English (United Kingdom) >*/ + "en-au", /**< English (Australia) >*/ + "en-ca", /**< English (Canada) >*/ + "en-nz", /**< English (New Zealand) >*/ + "en-ie", /**< English (Ireland) >*/ + "en-za", /**< English (South Africa) >*/ + "en-jm", /**< English (Jamaica) >*/ + "en", /**< English (Unknown) >*/ + "en-bz", /**< English (Belize) >*/ + "en-tt", /**< English (Trinidad) >*/ + "en-zw", /**< English (Zimbabwe) >*/ + "en-ph", /**< English (Philippines) >*/ + }, + { + "es", /**< Spanish >*/ + "es-es", /**< Spanish (Spain) >*/ + "es-mx", /**< Spanish (Mexico) >*/ + "es", /**< Spanish (Unknown) >*/ + "es-gt", /**< Spanish (Guatemala) >*/ + "es-cr", /**< Spanish (Costa Rica) >*/ + "es-pa", /**< Spanish (Panama) >*/ + "es-do", /**< Spanish (Dominican Republic) >*/ + "es-ve", /**< Spanish (Venezuela) >*/ + "es-co", /**< Spanish (Colombia) >*/ + "es-pe", /**< Spanish (Peru) >*/ + "es-ar", /**< Spanish (Argentina) >*/ + "es-ec", /**< Spanish (Ecuador) >*/ + "es-cl", /**< Spanish (Chile) >*/ + "es-uy", /**< Spanish (Uruguay) >*/ + "es-py", /**< Spanish (Paraguay) >*/ + "es-bo", /**< Spanish (Bolivia) >*/ + "es-sv", /**< Spanish (El Salvador) >*/ + "es-hn", /**< Spanish (Honduras) >*/ + "es-ni", /**< Spanish (Nicaragua) >*/ + "es-pr", /**< Spanish (Puerto Rico) >*/ + }, + {"fi"}, /**< Finnish >*/ + { + "fr", /**< French >*/ + "fr-fr", /**< French (France) >*/ + "fr-be", /**< French (Belgium) >*/ + "fr-ca", /**< French (Canada) >*/ + "fr-ch", /**< French (Switzerland) >*/ + "fr-lu", /**< French (Luxembourg) >*/ + "fr-mc", /**< French (Monaco) >*/ + }, + {"he"}, /**< Hebrew (also code iw) >*/ + {"hu"}, /**< Hungarian >*/ + {"is"}, /**< Icelandic >*/ + { + "it", /**< Italian >*/ + "it-it", /**< Italian (Italy) >*/ + "it-ch", /**< Italian (Switzerland) >*/ + }, + {"ja"}, /**< Japanese >*/ + {"ko"}, /**< Korean >*/ + { + "nl", /**< Dutch / Flemish >*/ + "nl-nl", /**< Dutch (Netherlands) >*/ + "nl-be", /**< Dutch (Belgium) >*/ + }, + {"no"}, /**< Norwegian >*/ + {"pl"}, /**< Polish >*/ + { + "pt", /**< Portuguese >*/ + "pt-br", /**< Portuguese (Brazil) >*/ + "pt-pt", /**< Portuguese (Portugal) >*/ + }, + {"rm"}, /**< Romansh >*/ + {"ro"}, /**< Romanian >*/ + {"ru"}, /**< Russian >*/ + { + "hr", /**< Croatian >*/ + "sr", /**< Serbian >*/ + "sr", /**< Serbian (Unknown) >*/ + "sr", /**< Serbian (Unknown) >*/ + "sr", /**< Serbian (Serbia) >*/ + }, + {"sk"}, /**< Slovak >*/ + {"sq"}, /**< Albanian >*/ + { + "sv", /**< Swedish >*/ + "sv-se", /**< Swedish (Sweden) >*/ + "sv-fi", /**< Swedish (Finland) >*/ + }, + {"th"}, /**< Thai >*/ + {"tr"}, /**< Turkish >*/ + {"ur"}, /**< Urdu >*/ + {"id"}, /**< Indonesian >*/ + {"uk"}, /**< Ukrainian >*/ + {"be"}, /**< Belarusian >*/ + {"sl"}, /**< Slovenian >*/ + {"et"}, /**< Estonian >*/ + {"lv"}, /**< Latvian >*/ + {"lt"}, /**< Lithuanian >*/ + [41] = {"fa"}, /**< Farsi / Persian >*/ + {"vi"}, /**< Vietnamese >*/ + {"hy"}, /**< Armenian >*/ + {"az"}, /**< Azerbaijani >*/ + {"eu"}, /**< Basque >*/ + {"sb"}, /**< "Sorbian" >*/ + {"mk"}, /**< Macedonian >*/ + {"sx"}, /**< "Sutu" >*/ + {"ts"}, /**< Tsonga >*/ + {"tn"}, /**< Tswana >*/ + [52] = {"xh"}, /**< Xhosa >*/ + {"zu"}, /**< Zulu >*/ + {"af"}, /**< Afrikaans >*/ + {"ka"}, /**< Georgian >*/ + {"fo"}, /**< Faroese >*/ + {"hi"}, /**< Hindi >*/ + {"mt"}, /**< Maltese >*/ + {"sz"}, /**<"Sami (Lappish)" >*/ + {"ga"}, /**< Irish */ + [62] = {"ms"}, /**< Malay >*/ + {"kk"}, /**< Kazakh >*/ + [65] = {"sw"}, /**< Swahili >*/ + [67] = { + "uz", /**< Uzbek >*/ + "uz", /**< Uzbek (Unknown) >*/ + "uz-uz", /**< Uzbek (Uzbekistan) >*/ + }, + {"tt"}, /**< Tatar >*/ + {"bn"}, /**< Bengali >*/ + {"pa"}, /**< Punjabi >*/ + {"gu"}, /**< Gujarati >*/ + {"or"}, /**< Oriya >*/ + {"ta"}, /**< Tamil >*/ + {"te"}, /**< Telugu >*/ + {"kn"}, /**< Kannada >*/ + {"ml"}, /**< Malayalam >*/ + {"as"}, /**< Assamese (not accepted in kindlegen >*/ + {"mr"}, /**< Marathi >*/ + {"sa"}, /**< Sanskrit >*/ + [82] = { + "cy", /**< Welsh */ + "cy-gb" /**< Welsh (UK) */ + }, + { + "gl", /**< Galician */ + "gl-es" /**< Galician (Spain) */ + }, + [87] = {"x-kok"}, /**< Konkani (real language code is kok) >*/ + [97] = {"ne"}, /**< Nepali >*/ + {"fy"}, /**< Northern Frysian >*/ +}; + +/** + @brief Get pointer to locale tag for a given Mobipocket locale number + + Locale strings are based on IANA language-subtag registry with some custom Mobipocket modifications. + See mobi_locale array. + + @param[in] locale_number Mobipocket locale number (as stored in MOBI header) + @return Pointer to locale string in mobi_locale array or NULL on error + */ +const char * mobi_get_locale_string(const uint32_t locale_number) { + uint8_t lang_code = locale_number & 0xffU; + uint32_t region_code = (locale_number >> 8) / 4; + if (lang_code >= MOBI_LANG_MAX || region_code >= MOBI_REGION_MAX) { + return NULL; + } + const char *string = mobi_locale[lang_code][region_code]; + if (string == NULL || strlen(string) == 0 ) { + return NULL; + } + return string; +} + +/** + @brief Get Mobipocket locale number for a given string tag + + Locale strings are based on IANA language-subtag registry with some custom Mobipocket modifications. + See mobi_locale array. + + @param[in] locale_string Locale string tag + @return Mobipocket locale number + */ +size_t mobi_get_locale_number(const char *locale_string) { + if (locale_string == NULL || strlen(locale_string) < 2) { + return 0; + } + size_t lang_code = 0; + while (lang_code < MOBI_LANG_MAX) { + char *p = (char *) mobi_locale[lang_code][0]; + if (p == NULL) { + lang_code++; + continue; + } + + if (tolower(locale_string[0]) != p[0] || + tolower(locale_string[1]) != p[1]) { + lang_code++; + continue; + } + size_t region_code = 0; + while (region_code < MOBI_REGION_MAX) { + p = (char *) mobi_locale[lang_code][region_code]; + if (p == NULL) { break; } + for (int i = 2;; i++) { + if (tolower(locale_string[i]) != p[i]) { break; } + if (p[i] == 0) { + return (region_code * 4) << 8 | lang_code; + } + } + region_code++; + } + return lang_code; + } + return 0; +} + +/** + @brief Array of known file types, their extensions and mime-types. + */ +const MOBIFileMeta mobi_file_meta[] = { + {T_HTML, "html", "application/xhtml+xml"}, + {T_CSS, "css", "text/css"}, + {T_SVG, "svg", "image/svg+xml"}, + {T_JPG, "jpg", "image/jpeg"}, + {T_GIF, "gif", "image/gif"}, + {T_PNG, "png", "image/png"}, + {T_BMP, "bmp", "image/bmp"}, + {T_OTF, "otf", "application/vnd.ms-opentype"}, + {T_TTF, "ttf", "application/x-font-truetype"}, + {T_MP3, "mp3", "audio/mpeg"}, + {T_MPG, "mpg", "video/mpeg"}, + {T_PDF, "pdf", "application/pdf"}, + {T_OPF, "opf", "application/oebps-package+xml"}, + {T_NCX, "ncx", "application/x-dtbncx+xml"}, + /* termination struct */ + {T_UNKNOWN, "dat", "application/unknown"} +}; + +/** + @brief Get MOBIFileMeta tag structure by MOBIFiletype type + + @param[in] type MOBIFiletype type + @return MOBIExthMeta structure for given type, .type = T_UNKNOWN on failure + */ +MOBIFileMeta mobi_get_filemeta_by_type(const MOBIFiletype type) { + size_t i = 0; + while (mobi_file_meta[i].type != T_UNKNOWN) { + if (mobi_file_meta[i].type == type) { + return mobi_file_meta[i]; + } + i++; + } + return mobi_file_meta[i]; +} + +/** + @brief Get ebook full name stored in Record 0 at offset given in MOBI header + + @param[in] m MOBIData structure with loaded data + @param[in,out] fullname Memory area to be filled with zero terminated full name string + @param[in] len Maximum length of the string without null terminator + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_fullname(const MOBIData *m, char *fullname, const size_t len) { + if (fullname == NULL || len == 0) { + return MOBI_PARAM_ERR; + } + fullname[0] = '\0'; + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + if (m->mh == NULL || m->mh->full_name == NULL) { + return MOBI_INIT_FAILED; + } + if (mobi_is_cp1252(m)) { + size_t out_len = len + 1; + mobi_cp1252_to_utf8(fullname, m->mh->full_name, &out_len, strlen(m->mh->full_name)); + } else { + strncpy(fullname, m->mh->full_name, len); + fullname[len] = '\0'; + } + return MOBI_SUCCESS; +} + +/** + @brief Set ebook full name stored in Record 0 at offset given in MOBI header + + @param[in,out] m MOBIData structure with loaded data + @param[in] fullname Memory area to be filled with zero terminated full name string + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_set_fullname(MOBIData *m, const char *fullname) { + if (mobi_exists_mobiheader(m) && m->mh->full_name) { + size_t title_length = min(strlen(fullname), MOBI_TITLE_SIZEMAX); + char *new_title = malloc(title_length + 1); + if (new_title == NULL) { + return MOBI_MALLOC_FAILED; + } + if (mobi_is_cp1252(m)) { + size_t new_size = title_length + 1; + MOBI_RET ret = mobi_utf8_to_cp1252(new_title, fullname, &new_size, title_length); + if (ret != MOBI_SUCCESS) { + free(new_title); + return ret; + } + } else { + memcpy(new_title, fullname, title_length); + new_title[title_length] = '\0'; + } + free(m->mh->full_name); + m->mh->full_name = new_title; + if (mobi_is_hybrid(m) && mobi_exists_mobiheader(m->next) && m->next->mh->full_name) { + char *new_title2 = strdup(new_title); + if (new_title2 == NULL) { + return MOBI_MALLOC_FAILED; + } + free(m->next->mh->full_name); + m->next->mh->full_name = new_title2; + } + } + return MOBI_SUCCESS; +} + +/** + @brief Set palm database name + + @param[in,out] m MOBIData structure with loaded data + @param[in] name Name + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_set_pdbname(MOBIData *m, const char *name) { + if (m == NULL || m->ph == NULL) { + return MOBI_INIT_FAILED; + } + char dbname[PALMDB_NAME_SIZE_MAX + 1]; + if (mobi_is_cp1252(m)) { + size_t size = PALMDB_NAME_SIZE_MAX + 1; + MOBI_RET ret = mobi_utf8_to_cp1252(dbname, name, &size, strlen(name)); + if (ret != MOBI_SUCCESS) { + return ret; + } + } else { + memcpy(dbname, name, PALMDB_NAME_SIZE_MAX); + dbname[PALMDB_NAME_SIZE_MAX] = '\0'; + } + char c; + int i = 0; + while ((c = dbname[i])) { + if (!isalnum(c)) { + c = '_'; + } + m->ph->name[i++] = c; + } + m->ph->name[i] = '\0'; + return MOBI_SUCCESS; +} + +/** + @brief Get palm database record with given unique id + + @param[in] m MOBIData structure with loaded data + @param[in] uid Unique id + @return Pointer to MOBIPdbRecord record structure, NULL on failure + */ +MOBIPdbRecord * mobi_get_record_by_uid(const MOBIData *m, const size_t uid) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return NULL; + } + if (m->rec == NULL) { + return NULL; + } + MOBIPdbRecord *curr = m->rec; + while (curr != NULL) { + if (curr->uid == uid) { + return curr; + } + curr = curr->next; + } + return NULL; +} + +/** + @brief Get rawml->markup MOBIPart part by uid + + @param[in] rawml MOBIRawml structure with loaded data + @param[in] uid Unique id + @return Pointer to MOBIPart structure, NULL on failure + */ +MOBIPart * mobi_get_part_by_uid(const MOBIRawml *rawml, const size_t uid) { + if (rawml == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return NULL; + } + if (rawml->markup == NULL) { + return NULL; + } + MOBIPart *part = rawml->markup; + while (part != NULL) { + if (part->uid == uid) { + return part; + } + part = part->next; + } + return NULL; +} + +/** + @brief Get rawml->flow MOBIPart part by uid + + @param[in] rawml MOBIRawml structure with loaded data + @param[in] uid Unique id + @return Pointer to MOBIPart structure, NULL on failure + */ +MOBIPart * mobi_get_flow_by_uid(const MOBIRawml *rawml, const size_t uid) { + if (rawml == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return NULL; + } + if (rawml->flow == NULL) { + return NULL; + } + MOBIPart *part = rawml->flow; + while (part != NULL) { + if (part->uid == uid) { + return part; + } + part = part->next; + } + return NULL; +} + +/** + @brief Find flow part by flow id (fid) from kindle:flow:fid link. + Flow fid is base32 encoded part uid. + + @param[in] rawml Structure MOBIRawml + @param[in] fid String four character base32 fid + @return Pointer to MOBIPart structure, NULL on failure + */ +MOBIPart * mobi_get_flow_by_fid(const MOBIRawml *rawml, const char *fid) { + /* get file number */ + uint32_t part_id; + MOBI_RET ret = mobi_base32_decode(&part_id, fid); + if (ret != MOBI_SUCCESS) { + return NULL; + } + return mobi_get_flow_by_uid(rawml, part_id); +} + +/** + @brief Get MOBIPart resource record with given unique id + + @param[in] rawml MOBIRawml structure with loaded data + @param[in] uid Unique id + @return Pointer to MOBIPart resource structure, NULL on failure + */ +MOBIPart * mobi_get_resource_by_uid(const MOBIRawml *rawml, const size_t uid) { + if (rawml == NULL) { + debug_print("%s", "Rawml structure not initialized\n"); + return NULL; + } + if (rawml->resources == NULL) { + debug_print("%s", "Rawml structure not initialized\n"); + return NULL; + } + MOBIPart *curr = rawml->resources; + while (curr != NULL) { + if (curr->uid == uid) { + return curr; + } + curr = curr->next; + } + return NULL; +} + +/** + @brief Find resource by flow id (fid) from kindle:embed:fid link. + Flow fid is base32 encoded part uid. + + @param[in] rawml Structure MOBIRawml + @param[in] fid String four character base32 fid + @return Pointer to MOBIPart structure, NULL on failure + */ +MOBIPart * mobi_get_resource_by_fid(const MOBIRawml *rawml, const char *fid) { + /* get file number */ + uint32_t part_id; + MOBI_RET ret = mobi_base32_decode(&part_id, fid); + if (ret != MOBI_SUCCESS) { + return NULL; + } + part_id--; + return mobi_get_resource_by_uid(rawml, part_id); +} + +/** + @brief Get MOBIFiletype type of MOBIPart resource record with given unique id + + @param[in] rawml MOBIRawml structure with loaded data + @param[in] uid Unique id + @return Pointer to MOBIPart resource structure, NULL on failure + */ +MOBIFiletype mobi_get_resourcetype_by_uid(const MOBIRawml *rawml, const size_t uid) { + if (rawml == NULL) { + debug_print("%s", "Rawml structure not initialized\n"); + return T_UNKNOWN; + } + if (rawml->resources == NULL) { + debug_print("%s", "Rawml structure not initialized\n"); + return T_UNKNOWN; + } + MOBIPart *curr = rawml->resources; + while (curr != NULL) { + if (curr->uid == uid) { + return curr->type; + } + curr = curr->next; + } + return T_UNKNOWN; +} + +/** + @brief Get palm database record with given sequential number (first record has number 0) + + @param[in] m MOBIData structure with loaded data + @param[in] num Sequential number + @return Pointer to MOBIPdbRecord record structure, NULL on failure + */ +MOBIPdbRecord * mobi_get_record_by_seqnumber(const MOBIData *m, const size_t num) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return NULL; + } + if (m->rec == NULL) { + return NULL; + } + MOBIPdbRecord *curr = m->rec; + size_t i = 0; + while (curr != NULL) { + if (i++ == num) { + return curr; + } + curr = curr->next; + } + return NULL; +} + +/** + @brief Get palm database record with data header starting with given 4-byte magic string + + @param[in] m MOBIData structure with loaded data + @param[in] magic Magic header + @return Pointer to MOBIPdbRecord record structure, NULL if not found or on failure + */ +MOBIPdbRecord * mobi_get_record_by_magic(const MOBIData *m, const unsigned char magic[4]) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return NULL; + } + + MOBIPdbRecord *curr = m->rec; + while (curr != NULL) { + if (curr->size >= 4 && memcmp(curr->data, magic, 4) != 0) { + return curr; + } + curr = curr->next; + } + return NULL; +} + + +/** + @brief Extract palm count database records starting with given sequential number from MOBIData structure + + Extracted records are removed from palm database. + Number of extracted records may be less then given count, if there are not enough records in database. + + @param[in,out] m MOBIData structure with loaded data + @param[in] num Sequential number + @param[in,out] count Records count, updated with number of records effectively extracted + @return Pointer to MOBIPdbRecord record structure, NULL if not found or on failure + */ +MOBIPdbRecord * mobi_extract_records_by_seqnumber(MOBIData *m, const size_t num, size_t *count) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return NULL; + } + + MOBIPdbRecord *root = NULL; + MOBIPdbRecord *prev = NULL; + MOBIPdbRecord *curr = NULL; + if (num > 0) { + root = mobi_get_record_by_seqnumber(m, num - 1); + if (root) { + curr = root->next; + } + } else { + curr = m->rec; + } + + MOBIPdbRecord *extracted = curr; + + size_t i = 0; + while (curr != NULL && i < *count) { + i++; + prev = curr; + curr = curr->next; + } + + if (prev == NULL) { + return NULL; + } + + if (root == NULL) { + m->rec = prev->next; + } else { + root->next = prev->next; + } + prev->next = NULL; + + *count = i; + if (m->ph->rec_count >= i) { + m->ph->rec_count -= i; + } else { + debug_print("%s\n", "Real record count differs from header value"); + m->ph->rec_count = 0; + } + + debug_print("Extracted %zu records starting with index = %zu\n", *count, num); + + return extracted; +} + + +/** + @brief Insert palm database records at given sequential number + + @param[in,out] m MOBIData structure with loaded data + @param[in,out] record Linked list of records + @param[in] num Sequential number + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_insert_records_by_seqnumber(MOBIData *m, MOBIPdbRecord *record, const size_t num) { + if (m == NULL || m->rec == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + if (record == NULL) { + return MOBI_SUCCESS; + } + + MOBIPdbRecord *curr = record; + size_t count = 1; + while (curr->next != NULL) { + curr = curr->next; + count++; + } + + if (m->ph->rec_count + count > UINT16_MAX) { + debug_print("%s", "Number of records beyond database limit\n"); + return MOBI_DATA_CORRUPT; + } + + MOBIPdbRecord *next = NULL; + if (num == 0) { + next = m->rec; + m->rec = record; + } else { + MOBIPdbRecord *prev = mobi_get_record_by_seqnumber(m, num - 1); + if (prev == NULL) { + debug_print("%s", "Insert point not found\n"); + return MOBI_DATA_CORRUPT; + } + next = prev->next; + prev->next = record; + } + curr->next = next; + m->ph->rec_count += count; + + debug_print("Inserted %zu records at index = %zu\n", count, num); + + return MOBI_SUCCESS; +} + +/** + @brief Delete palm count database records starting with given sequential number from MOBIData structure + + Number of deleted records may be less then given count, if there are not enough records in database. + + @param[in,out] m MOBIData structure with loaded data + @param[in] num Sequential number + @param[in,out] count Records count, updated wth number of records effectively extracted + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_delete_records_by_seqnumber(MOBIData *m, const size_t num, size_t *count) { + + // extract records + MOBIPdbRecord *curr = mobi_extract_records_by_seqnumber(m, num, count); + + // delete them + while (curr != NULL) { + MOBIPdbRecord *tmp = curr; + curr = curr->next; + free(tmp->data); + free(tmp); + tmp = NULL; + } + + debug_print("Deleted %zu records starting with index = %zu\n", *count, num); + + return MOBI_SUCCESS; +} + +/** + @brief Delete palm database record with given sequential number from MOBIData structure + + @param[in,out] m MOBIData structure with loaded data + @param[in] num Sequential number + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_delete_record_by_seqnumber(MOBIData *m, const size_t num) { + size_t count = 1; + return mobi_delete_records_by_seqnumber(m, num, &count); +} + +/** + @brief Get EXTH record with given MOBIExthTag tag + + @param[in] m MOBIData structure with loaded data + @param[in] tag MOBIExthTag EXTH record tag + @return Pointer to MOBIExthHeader record structure + */ +MOBIExthHeader * mobi_get_exthrecord_by_tag(const MOBIData *m, const MOBIExthTag tag) { + debug_print("Loading EXTH record with tag %i\n", tag); + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return NULL; + } + if (m->eh == NULL) { + return NULL; + } + MOBIExthHeader *curr = m->eh; + while (curr != NULL) { + if (curr->tag == tag) { + return curr; + } + curr = curr->next; + } + return NULL; +} + +/** + @brief Get EXTH record with given MOBIExthTag tag. Start list search at given record. + + If start_tag is NULL search will start from the root of the linked list. + After successfull search start will be set to next record in the list. + + @param[in] m MOBIData structure with loaded data + @param[in] tag MOBIExthTag EXTH record tag + @param[in,out] start MOBIExthHeader EXTH record to begin search with + @return Pointer to MOBIExthHeader record structure + */ +MOBIExthHeader * mobi_next_exthrecord_by_tag(const MOBIData *m, const MOBIExthTag tag, MOBIExthHeader **start) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return NULL; + } + if (m->eh == NULL) { + return NULL; + } + MOBIExthHeader *curr; + if (*start) { + curr = *start; + *start = NULL; + } else { + curr = m->eh; + } + while (curr != NULL) { + if (curr->tag == tag) { + *start = curr->next; + return curr; + } + curr = curr->next; + } + return NULL; +} + +/** + @brief Add new EXTH record with given tag and value. + + @param[in,out] m MOBIData structure with loaded data + @param[in] tag MOBIExthTag EXTH record tag + @param[in] size Value size + @param[in] value Value + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_add_exthrecord(MOBIData *m, const MOBIExthTag tag, const uint32_t size, const void *value) { + if (size == 0) { + debug_print("%s\n", "Record size is zero"); + return MOBI_PARAM_ERR; + } + size_t count = 2; + while (m && count--) { + if (m->mh == NULL) { + debug_print("%s\n", "Mobi header must be initialized"); + return MOBI_INIT_FAILED; + } + MOBIExthMeta meta = mobi_get_exthtagmeta_by_tag(tag); + MOBIExthHeader *record = calloc(1, sizeof(MOBIExthHeader)); + if (record == NULL) { + debug_print("%s\n", "Memory allocation for EXTH record failed"); + return MOBI_MALLOC_FAILED; + } + record->tag = tag; + record->size = size; + record->data = malloc(size); + if (record->data == NULL) { + debug_print("%s\n", "Memory allocation for EXTH data failed"); + free(record); + return MOBI_MALLOC_FAILED; + } + if (meta.type == EXTH_STRING && mobi_is_cp1252(m)) { + debug_print("%s\n", "Adding CP1252 string data"); + char *data = malloc(size + 1); + if (data == NULL) { + free(record->data); + free(record); + return MOBI_MALLOC_FAILED; + } + size_t data_size = size + 1; + MOBI_RET ret = mobi_utf8_to_cp1252(data, value, &data_size, size); + if (ret != MOBI_SUCCESS) { + free(record->data); + free(record); + free(data); + return ret; + } + memcpy(record->data, data, data_size); + record->size = (uint32_t) data_size; + free(data); + } else if (meta.name && meta.type == EXTH_NUMERIC && size == sizeof(uint32_t)) { + debug_print("%s\n", "Adding numeric data"); + MOBIBuffer *buf = mobi_buffer_init_null(record->data, size); + if (buf == NULL) { + free(record->data); + free(record); + return MOBI_MALLOC_FAILED; + } + mobi_buffer_add32(buf, *(uint32_t *) value); + mobi_buffer_free_null(buf); + } else { + debug_print("%s\n", "Adding raw data"); + memcpy(record->data, value, size); + } + debug_print("Added record %u (%u bytes)\n", meta.tag, size); + + record->next = NULL; + if (m->eh == NULL) { + if (m->mh->exth_flags == NULL) { + m->mh->exth_flags = malloc(sizeof(uint32_t)); + if (m->mh->exth_flags == NULL) { + debug_print("%s\n", "Memory allocation failed"); + free(record->data); + free(record); + return MOBI_MALLOC_FAILED; + } + } + *m->mh->exth_flags = 0x40; + m->eh = record; + } else { + MOBIExthHeader *curr = m->eh; + while(curr->next) { + curr = curr->next; + } + curr->next = record; + } + m = m->next; + } + return MOBI_SUCCESS; +} + +/** + @brief Delete EXTH record. + + @param[in,out] m MOBIData structure with loaded data + @param[in] record Record to be deleted + @return Pointer to next record in the linked list (NULL if none) + */ +MOBIExthHeader * mobi_delete_exthrecord(MOBIData *m, MOBIExthHeader *record) { + if (record == NULL || m == NULL || m->eh == NULL) { + return NULL; + } + MOBIExthHeader *next = record->next; + if (next) { + /* not last */ + MOBIExthHeader *curr = m->eh; + if (curr == record) { + /* first */ + m->eh = next; + } else { + /* not first */ + while (curr) { + if (curr->next == record) { + curr->next = next; + break; + } + curr = curr->next; + } + } + free(record->data); + free(record); + } else if (m->eh == record) { + /* last && first */ + free(m->eh->data); + free(m->eh); + m->eh = NULL; + } else { + /* last */ + MOBIExthHeader *curr = m->eh; + while (curr) { + if (curr->next == record) { + curr->next = NULL; + break; + } + curr = curr->next; + } + free(record->data); + free(record); + } + return next; +} + +/** + @brief Delete all EXTH records with given MOBIExthTag tag + + @param[in,out] m MOBIData structure with loaded data + @param[in] tag MOBIExthTag EXTH record tag + @return Pointer to MOBIExthHeader record structure + */ +MOBI_RET mobi_delete_exthrecord_by_tag(MOBIData *m, const MOBIExthTag tag) { + size_t count = 2; + while (m && count--) { + if (m->eh == NULL) { + debug_print("%s", "No exth records\n"); + return MOBI_SUCCESS; + } + MOBIExthHeader *curr = m->eh; + while (curr) { + if (curr->tag == tag) { + curr = mobi_delete_exthrecord(m, curr); + } else { + curr = curr->next; + } + } + m = m->next; + } + return MOBI_SUCCESS; +} + +/** + @brief Array of known EXTH tags. + Name strings shamelessly copied from KindleUnpack + */ +const MOBIExthMeta mobi_exth_tags[] = { + /* numeric */ + {EXTH_SAMPLE, EXTH_NUMERIC, "Sample"}, + {EXTH_STARTREADING, EXTH_NUMERIC, "Start offset"}, + {EXTH_KF8BOUNDARY, EXTH_NUMERIC, "K8 boundary offset"}, + {EXTH_COUNTRESOURCES, EXTH_NUMERIC, "K8 count of resources, fonts, images"}, + {EXTH_RESCOFFSET, EXTH_NUMERIC, "RESC offset"}, + {EXTH_COVEROFFSET, EXTH_NUMERIC, "Cover offset"}, + {EXTH_THUMBOFFSET, EXTH_NUMERIC, "Thumbnail offset"}, + {EXTH_HASFAKECOVER, EXTH_NUMERIC, "Has fake cover"}, + {EXTH_CREATORSOFT, EXTH_NUMERIC, "Creator software"}, + {EXTH_CREATORMAJOR, EXTH_NUMERIC, "Creator major version"}, + {EXTH_CREATORMINOR, EXTH_NUMERIC, "Creator minor version"}, + {EXTH_CREATORBUILD, EXTH_NUMERIC, "Creator build number"}, + {EXTH_CLIPPINGLIMIT, EXTH_NUMERIC, "Clipping limit"}, + {EXTH_PUBLISHERLIMIT, EXTH_NUMERIC, "Publisher limit"}, + {EXTH_TTSDISABLE, EXTH_NUMERIC, "Text to speech disabled"}, + {EXTH_READFORFREE, EXTH_NUMERIC, "Read for Free"}, + /* strings */ + {EXTH_DRMSERVER, EXTH_STRING, "Drm server id"}, + {EXTH_DRMCOMMERCE, EXTH_STRING, "Drm commerce id"}, + {EXTH_DRMEBOOKBASE, EXTH_STRING, "Drm Ebookbase book id"}, + {EXTH_TITLE, EXTH_STRING, "Title"}, + {EXTH_AUTHOR, EXTH_STRING, "Creator"}, + {EXTH_PUBLISHER, EXTH_STRING, "Publisher"}, + {EXTH_IMPRINT, EXTH_STRING, "Imprint"}, + {EXTH_DESCRIPTION, EXTH_STRING, "Description"}, + {EXTH_ISBN, EXTH_STRING, "ISBN"}, + {EXTH_SUBJECT, EXTH_STRING, "Subject"}, + {EXTH_PUBLISHINGDATE, EXTH_STRING, "Published"}, + {EXTH_REVIEW, EXTH_STRING, "Review"}, + {EXTH_CONTRIBUTOR, EXTH_STRING, "Contributor"}, + {EXTH_RIGHTS, EXTH_STRING, "Rights"}, + {EXTH_SUBJECTCODE, EXTH_STRING, "Subject code"}, + {EXTH_TYPE, EXTH_STRING, "Type"}, + {EXTH_SOURCE, EXTH_STRING, "Source"}, + {EXTH_ASIN, EXTH_STRING, "ASIN"}, + {EXTH_VERSION, EXTH_STRING, "Version number"}, + {EXTH_ADULT, EXTH_STRING, "Adult"}, + {EXTH_PRICE, EXTH_STRING, "Price"}, + {EXTH_CURRENCY, EXTH_STRING, "Currency"}, + {EXTH_FIXEDLAYOUT, EXTH_STRING, "Fixed layout"}, + {EXTH_BOOKTYPE, EXTH_STRING, "Book type"}, + {EXTH_ORIENTATIONLOCK, EXTH_STRING, "Orientation lock"}, + {EXTH_ORIGRESOLUTION, EXTH_STRING, "Original resolution"}, + {EXTH_ZEROGUTTER, EXTH_STRING, "Zero gutter"}, + {EXTH_ZEROMARGIN, EXTH_STRING, "Zero margin"}, + {EXTH_KF8COVERURI, EXTH_STRING, "K8 masthead/cover image"}, + {EXTH_REGIONMAGNI, EXTH_STRING, "Region magnification"}, + {EXTH_DICTNAME, EXTH_STRING, "Dictionary short name"}, + {EXTH_WATERMARK, EXTH_STRING, "Watermark"}, + {EXTH_DOCTYPE, EXTH_STRING, "Document type"}, + {EXTH_LASTUPDATE, EXTH_STRING, "Last update time"}, + {EXTH_UPDATEDTITLE, EXTH_STRING, "Updated title"}, + {EXTH_ASIN504, EXTH_STRING, "ASIN (504)"}, + {EXTH_TITLEFILEAS, EXTH_STRING, "Title file as"}, + {EXTH_CREATORFILEAS, EXTH_STRING, "Creator file as"}, + {EXTH_PUBLISHERFILEAS, EXTH_STRING, "Publisher file as"}, + {EXTH_LANGUAGE, EXTH_STRING, "Language"}, + {EXTH_ALIGNMENT, EXTH_STRING, "Primary writing mode"}, + {EXTH_PAGEDIR, EXTH_STRING, "Page progression direction"}, + {EXTH_OVERRIDEFONTS, EXTH_STRING, "Override kindle fonts"}, + {EXTH_SORCEDESC, EXTH_STRING, "Original source description"}, + {EXTH_DICTLANGIN, EXTH_STRING, "Dictionary input language"}, + {EXTH_DICTLANGOUT, EXTH_STRING, "Dictionary output language"}, + {EXTH_INPUTSOURCE, EXTH_STRING, "Input source type"}, + {EXTH_CREATORBUILDREV, EXTH_STRING, "Creator build revision"}, + {EXTH_CREATORSTRING, EXTH_STRING, "Creator software string"}, + /* binary */ + {EXTH_TAMPERKEYS, EXTH_BINARY, "Tamper proof keys"}, + {EXTH_FONTSIGNATURE, EXTH_BINARY, "Font signature"}, + {EXTH_RENTAL, EXTH_BINARY, "Rental indicator"}, // uint64_t + {EXTH_UNK403, EXTH_BINARY, "Unknown (403)"}, + {EXTH_UNK407, EXTH_BINARY, "Unknown (407)"}, + {EXTH_UNK450, EXTH_BINARY, "Unknown (450)"}, + {EXTH_UNK451, EXTH_BINARY, "Unknown (451)"}, + {EXTH_UNK452, EXTH_BINARY, "Unknown (452)"}, + {EXTH_UNK453, EXTH_BINARY, "Unknown (453)"}, + /* end */ + {0, 0, NULL}, +}; + +/** + @brief Get MOBIExthMeta tag structure by MOBIExthTag tag id + + @param[in] tag Tag id + @return MOBIExthMeta structure for given tag id, zeroed structure on failure + */ +MOBIExthMeta mobi_get_exthtagmeta_by_tag(const MOBIExthTag tag) { + size_t i = 0; + while (mobi_exth_tags[i].tag > 0) { + if (mobi_exth_tags[i].tag == tag) { + return mobi_exth_tags[i]; + } + i++; + } + return (MOBIExthMeta) {0, 0, NULL}; +} + +/** + @brief Decode big-endian value stored in EXTH record + + Only for EXTH records storing numeric values + + @param[in] data Memory area storing EXTH record data + @param[in] size Size of EXTH record data + @return 32-bit value + */ +uint32_t mobi_decode_exthvalue(const unsigned char *data, const size_t size) { + /* FIXME: EXTH numeric data is max 32-bit? */ + uint32_t val = 0; + size_t i = min(size, 4); + while (i--) { + val |= (uint32_t) *data++ << (i * 8); + } + return val; +} + +#define MOBI_UTF8_MAXBYTES 4 +/** + @brief Html entity mapping to utf-8 sequence + */ +typedef struct { + const char *name; /**< Html entity name */ + const char utf8_bytes[MOBI_UTF8_MAXBYTES + 1]; /**< Utf-8 sequence */ +} HTMLEntity; + +/** + @brief Basic named html entities mapping to utf-8 sequences + */ +const HTMLEntity entities[] = { + { """, "\"" }, + { "&", "&" }, + { "<", "<" }, + { ">", ">" }, + { "'", "'" }, + { " ", "\xc2\xa0" }, + { "©", "\xc2\xa9" }, + { "®", "\xc2\xae" }, + { "¢", "\xc2\xa2" }, + { "£", "\xc2\xa3" }, + { "§", "\xc2\xa7" }, + { "«", "\xc2\xab" }, + { "»", "\xc2\xbb" }, + { "°", "\xc2\xb0" }, + { "±", "\xc2\xb1" }, + { "·", "\xc2\xb7" }, + { "½", "\xc2\xbd" }, + { "–", "\xe2\x80\x93" }, + { "—", "\xe2\x80\x94" }, + { "‘", "\xe2\x80\x98" }, + { "‚", "\xe2\x80\x9a" }, + { "“", "\xe2\x80\x9c" }, + { "”", "\xe2\x80\x9d" }, + { "„", "\xe2\x80\x9e" }, + { "†", "\xe2\x80\xa0" }, + { "‡", "\xe2\x80\xa1" }, + { "•", "\xe2\x80\xa2" }, + { "…", "\xe2\x80\xa6" }, + { "′", "\xe2\x80\xb2" }, + { "″", "\xe2\x80\xb3" }, + { "€", "\xe2\x82\xac" }, + { "™", "\xe2\x84\xa2" } +}; + +/** + @brief Convert html entities in string to utf-8 characters + + @param[in] input Input string + @return Converted string + */ +char * mobi_decode_htmlentities(const char *input) { + if (!input) { + return NULL; + } + const size_t codepoint_max = 0x10ffff; + size_t output_length = strlen(input) + 1; + char *in = (char *) input; + /* output size will be less or equal to input */ + char *output = malloc(output_length); + char *out = output; + if (output == NULL) { + debug_print("Memory allocation failed (%zu bytes)\n", output_length); + return NULL; + } + char *offset = in; + while ((in = strchr(in, '&'))) { + size_t decoded_length = 0; + char *end = NULL; + char decoded[MOBI_UTF8_MAXBYTES + 1] = { 0 }; + if (in[1] == '#' && (in[2] == 'x' || in[2] == 'X')) { + // hex entity + size_t codepoint = strtoul(in + 3, &end, 16); + if (*end++ == ';' && codepoint <= codepoint_max) { + decoded_length = mobi_unicode_to_utf8(decoded, codepoint); + } + } else if (in[1] == '#') { + // dec entity + size_t codepoint = strtoul(in + 2, &end, 10); + if (*end++ == ';' && codepoint <= codepoint_max) { + decoded_length = mobi_unicode_to_utf8(decoded, codepoint); + } + } else { + // named entity + for (size_t i = 0; i < ARRAYSIZE(entities); i++) { + if (strncmp(in, entities[i].name, strlen(entities[i].name)) == 0) { + int ret = snprintf(decoded, MOBI_UTF8_MAXBYTES + 1, "%s", entities[i].utf8_bytes); + if (ret > 0) { + decoded_length = (size_t) ret; + end = in + strlen(entities[i].name); + break; + } + } + } + } + if (decoded_length) { + size_t len = (size_t) (in - offset); + memcpy(out, offset, len); + offset = end; + out += len; + memcpy(out, decoded, decoded_length); + out += decoded_length; + } + in += decoded_length + 1; + } + strcpy(out, offset); + return output; +} + +/** + @brief Decode string stored in EXTH record + + Only for EXTH records storing string values + + @param[in] m MOBIData structure loaded with MOBI data + @param[in] data Memory area storing EXTH record data + @param[in] size Size of EXTH record data + @return String from EXTH record in utf-8 encoding + */ +char * mobi_decode_exthstring(const MOBIData *m, const unsigned char *data, const size_t size) { + if (!m || !data) { + return NULL; + } + size_t out_length = 3 * size + 1; + size_t in_length = size; + char *exth_string = malloc(out_length); + if (exth_string == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return NULL; + } + if (mobi_is_cp1252(m)) { + MOBI_RET ret = mobi_cp1252_to_utf8(exth_string, (const char *) data, &out_length, in_length); + if (ret != MOBI_SUCCESS) { + free(exth_string); + return NULL; + } + } else { + memcpy(exth_string, data, size); + out_length = size; + } + exth_string[out_length] = '\0'; + char *exth_decoded = mobi_decode_htmlentities(exth_string); + if (exth_decoded != NULL) { + free(exth_string); + return exth_decoded; + } + return exth_string; +} + +/** + @brief Swap endianness of 32-bit value + + @param[in] val 4-byte unsigned integer + @return Integer with swapped endianness + */ +uint32_t mobi_swap32(const uint32_t val) { + return ((((val) >> 24) & 0x000000ff) | + (((val) >> 8) & 0x0000ff00) | + (((val) << 8) & 0x00ff0000) | + (((val) << 24) & 0xff000000)); + +} + +/** + @brief Convert time values from palmdoc header to time tm struct + + Older files set time in mac format. Newer ones in unix time. + + @param[in] pdb_time Time value from PDB header + @return Time structure struct tm of time.h + */ +struct tm * mobi_pdbtime_to_time(const long pdb_time) { + time_t time = pdb_time; + const int unix1996 = 820454400; + if (time < unix1996 && time > 0) { + /* sometimes dates are stored as little endian */ + time = mobi_swap32((uint32_t) time); + } + const uint32_t mactime_flag = (uint32_t) (1U << 31); + if (time & mactime_flag) { + debug_print("%s\n", "mac time"); + time -= EPOCH_MAC_DIFF; + } + return localtime(&time); +} + +/** + @brief Lookup table for number of bits set in a single byte + */ +static const char setbits[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8, +}; + +/** + @brief Get number of bits set in a given byte + + @param[in] byte A byte + @return Number of bits set + */ +int mobi_bitcount(const uint8_t byte) { + return setbits[byte]; +} + +/** + @brief Decompress text record (internal). + + Internal function for mobi_get_rawml and mobi_dump_rawml. + Decompressed output is stored either in a file or in a text string + + @param[in] m MOBIData structure loaded with MOBI data + @param[in,out] text Memory area to be filled with decompressed output + @param[in,out] file If not NULL output is written to the file, otherwise to text string + @param[in,out] len Length of the memory allocated for the text string, on return set to decompressed text length + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_decompress_content(const MOBIData *m, char *text, FILE *file, size_t *len) { + int dump = false; + if (file != NULL) { + dump = true; + } + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + if (mobi_is_encrypted(m) && !mobi_has_drmkey(m)) { + debug_print("%s", "Document is encrypted\n"); + return MOBI_FILE_ENCRYPTED; + } + const size_t offset = mobi_get_kf8offset(m); + if (m->rh == NULL || m->rh->text_record_count == 0) { + debug_print("%s", "Text records not found in MOBI header\n"); + return MOBI_DATA_CORRUPT; + } + const size_t text_rec_index = 1 + offset; + size_t text_rec_count = m->rh->text_record_count; + const uint16_t compression_type = m->rh->compression_type; + /* check for extra data at the end of text files */ + uint16_t extra_flags = 0; + if (m->mh && m->mh->extra_flags) { + extra_flags = *m->mh->extra_flags; + } + /* get first text record */ + const MOBIPdbRecord *curr = mobi_get_record_by_seqnumber(m, text_rec_index); + MOBIHuffCdic *huffcdic = NULL; + if (compression_type == MOBI_COMPRESSION_HUFFCDIC) { + /* load huff/cdic tables */ + huffcdic = mobi_init_huffcdic(); + if (huffcdic == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + MOBI_RET ret = mobi_parse_huffdic(m, huffcdic); + if (ret != MOBI_SUCCESS) { + mobi_free_huffcdic(huffcdic); + return ret; + } + } + /* get following CDIC records */ + size_t text_length = 0; + while (text_rec_count-- && curr) { + size_t extra_size = 0; + if (extra_flags) { + extra_size = mobi_get_record_extrasize(curr, extra_flags); + if (extra_size == MOBI_NOTSET) { + mobi_free_huffcdic(huffcdic); + return MOBI_DATA_CORRUPT; + } + } + size_t decompressed_size = mobi_get_textrecord_maxsize(m); + unsigned char *decompressed = malloc(decompressed_size); + if (decompressed == NULL) { + mobi_free_huffcdic(huffcdic); + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + MOBI_RET ret = MOBI_SUCCESS; +#ifdef USE_ENCRYPTION + if (mobi_is_encrypted(m) && mobi_has_drmkey(m)) { + if (compression_type != MOBI_COMPRESSION_HUFFCDIC) { + /* decrypt also multibyte extra data */ + extra_size = mobi_get_record_extrasize(curr, extra_flags & 0xfffe); + } + if (extra_size == MOBI_NOTSET || extra_size > curr->size) { + mobi_free_huffcdic(huffcdic); + free(decompressed); + return MOBI_DATA_CORRUPT; + } + const size_t decrypt_size = curr->size - extra_size; + if (decrypt_size > decompressed_size) { + if (decrypt_size <= curr->size) { + unsigned char *tmp = realloc(decompressed, decrypt_size); + if (tmp == NULL) { + debug_print("%s\n", "Memory allocation failed"); + mobi_free_huffcdic(huffcdic); + free(decompressed); + return MOBI_MALLOC_FAILED; + } + decompressed = tmp; + } else { + debug_print("Record too large: %zu\n", decrypt_size); + mobi_free_huffcdic(huffcdic); + free(decompressed); + return MOBI_DATA_CORRUPT; + } + } + if (decrypt_size) { + ret = mobi_buffer_decrypt(decompressed, curr->data, decrypt_size, m); + if (ret != MOBI_SUCCESS) { + mobi_free_huffcdic(huffcdic); + free(decompressed); + return ret; + } + memcpy(curr->data, decompressed, decrypt_size); + } + if (compression_type != MOBI_COMPRESSION_HUFFCDIC && (extra_flags & 1)) { + // update multibyte data size after decryption + extra_size = mobi_get_record_extrasize(curr, extra_flags); + if (extra_size == MOBI_NOTSET) { + free(decompressed); + return MOBI_DATA_CORRUPT; + } + } + } +#endif + if (extra_size > curr->size) { + debug_print("Wrong record size: -%zu\n", extra_size - curr->size); + mobi_free_huffcdic(huffcdic); + free(decompressed); + return MOBI_DATA_CORRUPT; + } + if (extra_size == curr->size) { + debug_print("Skipping empty record%s", "\n"); + free(decompressed); + curr = curr->next; + continue; + } + const size_t record_size = curr->size - extra_size; + switch (compression_type) { + case MOBI_COMPRESSION_NONE: + /* no compression */ + if (record_size > decompressed_size) { + debug_print("Record too large: %zu\n", record_size); + free(decompressed); + return MOBI_DATA_CORRUPT; + } + memcpy(decompressed, curr->data, record_size); + decompressed_size = record_size; + if (mobi_exists_mobiheader(m) && mobi_get_fileversion(m) <= 3) { + /* workaround for some old files with null characters inside record */ + mobi_remove_zeros(decompressed, &decompressed_size); + } + break; + case MOBI_COMPRESSION_PALMDOC: + /* palmdoc lz77 compression */ + ret = mobi_decompress_lz77(decompressed, curr->data, &decompressed_size, record_size); + if (ret != MOBI_SUCCESS) { + free(decompressed); + return ret; + } + break; + case MOBI_COMPRESSION_HUFFCDIC: + /* mobi huffman compression */ + ret = mobi_decompress_huffman(decompressed, curr->data, &decompressed_size, record_size, huffcdic); + if (ret != MOBI_SUCCESS) { + free(decompressed); + mobi_free_huffcdic(huffcdic); + return ret; + } + break; + default: + debug_print("%s", "Unknown compression type\n"); + mobi_free_huffcdic(huffcdic); + free(decompressed); + return MOBI_DATA_CORRUPT; + } + curr = curr->next; + if (dump) { + fwrite(decompressed, 1, decompressed_size, file); + } else { + if (text_length + decompressed_size > *len) { + debug_print("%s", "Text buffer too small\n"); + /* free huff/cdic tables */ + mobi_free_huffcdic(huffcdic); + free(decompressed); + return MOBI_PARAM_ERR; + } + memcpy(text + text_length, decompressed, decompressed_size); + text_length += decompressed_size; + text[text_length] = '\0'; + } + free(decompressed); + } + /* free huff/cdic tables */ + mobi_free_huffcdic(huffcdic); + if (len) { + *len = text_length; + } + return MOBI_SUCCESS; +} + +/** + @brief Decompress text to a text buffer. + + @param[in] m MOBIData structure loaded with MOBI data + @param[in,out] text Memory area to be filled with decompressed output + @param[in,out] len Length of the memory allocated for the text string, on return will be set to decompressed text length + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_rawml(const MOBIData *m, char *text, size_t *len) { + if (text == NULL || len == NULL) { + debug_print("%s", "Parameter error: text or len is NULL\n"); + return MOBI_PARAM_ERR; + } + if (m->rh->text_length > *len) { + debug_print("%s", "Text buffer smaller then text size declared in record0 header\n"); + return MOBI_PARAM_ERR; + } + text[0] = '\0'; + return mobi_decompress_content(m, text, NULL, len); +} + +/** + @brief Decompress text record to an open file descriptor. + + Internal function for mobi_get_rawml and mobi_dump_rawml. + Decompressed output is stored either in a file or in a text string + + @param[in] m MOBIData structure loaded with MOBI data + @param[in,out] file File descriptor + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_dump_rawml(const MOBIData *m, FILE *file) { + if (file == NULL) { + debug_print("%s", "File descriptor is NULL\n"); + return MOBI_FILE_NOT_FOUND; + } + return mobi_decompress_content(m, NULL, file, NULL); +} + +/** + @brief Check if MOBI header is loaded / present in the loaded file + + @param[in] m MOBIData structure loaded with MOBI data + @return true on success, false otherwise + */ +bool mobi_exists_mobiheader(const MOBIData *m) { + if (m == NULL || m->mh == NULL) { + return false; + } + return true; +} + +/** + @brief Check if skeleton INDX is present in the loaded file + + @param[in] m MOBIData structure loaded with MOBI data + @return true on success, false otherwise + */ +bool mobi_exists_skel_indx(const MOBIData *m) { + if (!mobi_exists_mobiheader(m)) { + return false; + } + if (m->mh->skeleton_index == NULL || *m->mh->skeleton_index == MOBI_NOTSET) { + debug_print("%s", "SKEL INDX record not found\n"); + return false; + } + return true; +} + +/** + @brief Check if FDST record is present in the loaded file + + @param[in] m MOBIData structure loaded with MOBI data + @return true on success, false otherwise + */ +bool mobi_exists_fdst(const MOBIData *m) { + if (!mobi_exists_mobiheader(m) || mobi_get_fileversion(m) <= 3) { + return false; + } + if (mobi_get_fileversion(m) >= 8) { + if (m->mh->fdst_index && *m->mh->fdst_index != MOBI_NOTSET) { + return true; + } + } else { + if ((m->mh->fdst_section_count && *m->mh->fdst_section_count > 1) + && (m->mh->last_text_index && *m->mh->last_text_index != (uint16_t) -1)) { + return true; + } + } + debug_print("%s", "FDST record not found\n"); + return false; +} + +/** + @brief Get sequential number of FDST record + + @param[in] m MOBIData structure loaded with MOBI data + @return Record number on success, MOBI_NOTSET otherwise + */ +size_t mobi_get_fdst_record_number(const MOBIData *m) { + if (!mobi_exists_mobiheader(m)) { + return MOBI_NOTSET; + } + const size_t offset = mobi_get_kf8offset(m); + if (m->mh->fdst_index && *m->mh->fdst_index != MOBI_NOTSET) { + if (m->mh->fdst_section_count && *m->mh->fdst_section_count > 1) { + return *m->mh->fdst_index + offset; + } + } + if (m->mh->fdst_section_count && *m->mh->fdst_section_count > 1) { + /* FIXME: if KF7, is it safe to asume last_text_index has fdst index */ + if (m->mh->last_text_index) { + return *m->mh->last_text_index; + } + } + return MOBI_NOTSET; +} + +/** + @brief Check if fragments INDX is present in the loaded file + + @param[in] m MOBIData structure loaded with MOBI data + @return true on success, false otherwise + */ +bool mobi_exists_frag_indx(const MOBIData *m) { + if (!mobi_exists_mobiheader(m)) { + return false; + } + if (m->mh->fragment_index == NULL || *m->mh->fragment_index == MOBI_NOTSET) { + return false; + } + debug_print("%s", "Fragments INDX found\n"); + return true; +} + +/** + @brief Check if guide INDX is present in the loaded file + + @param[in] m MOBIData structure loaded with MOBI data + @return true on success, false otherwise + */ +bool mobi_exists_guide_indx(const MOBIData *m) { + if (!mobi_exists_mobiheader(m)) { + return false; + } + if (m->mh->guide_index == NULL || *m->mh->guide_index == MOBI_NOTSET) { + return false; + } + debug_print("%s", "Guide INDX found\n"); + return true; +} + +/** + @brief Check if ncx INDX is present in the loaded file + + @param[in] m MOBIData structure loaded with MOBI data + @return true on success, false otherwise + */ +bool mobi_exists_ncx(const MOBIData *m) { + if (!mobi_exists_mobiheader(m)) { + return false; + } + if (m->mh->ncx_index == NULL || *m->mh->ncx_index == MOBI_NOTSET) { + return false; + } + debug_print("%s", "NCX INDX found\n"); + return true; +} + +/** + @brief Check if orth INDX is present in the loaded file + + @param[in] m MOBIData structure loaded with MOBI data + @return true on success, false otherwise + */ +bool mobi_exists_orth(const MOBIData *m) { + if (!mobi_exists_mobiheader(m)) { + return false; + } + if (m->mh->orth_index == NULL || *m->mh->orth_index == MOBI_NOTSET) { + return false; + } + debug_print("%s", "ORTH INDX found\n"); + return true; +} + +/** + @brief Check if infl INDX is present in the loaded file + + @param[in] m MOBIData structure loaded with MOBI data + @return true on success, false otherwise + */ +bool mobi_exists_infl(const MOBIData *m) { + if (!mobi_exists_mobiheader(m)) { + return false; + } + if (m->mh->infl_index == NULL || *m->mh->infl_index == MOBI_NOTSET) { + return false; + } + debug_print("%s", "INFL INDX found\n"); + return true; +} + +/** + @brief Get file type of given part with number [part_number] + + @param[in] rawml MOBIRawml parsed records structure + @param[in] part_number Sequential number of the part within rawml structure + @return MOBIFiletype file type + */ +MOBIFiletype mobi_determine_flowpart_type(const MOBIRawml *rawml, const size_t part_number) { + if (part_number == 0 || mobi_is_rawml_kf8(rawml) == false) { + return T_HTML; + } + if (part_number > 9999) { + debug_print("Corrupt part number: %zu\n", part_number); + return T_UNKNOWN; + } + char target[30]; + snprintf(target, 30, "\"kindle:flow:%04zu?mime=", part_number); + unsigned char *data_start = rawml->flow->data; + unsigned char *data_end = data_start + rawml->flow->size - 1; + MOBIResult result; + MOBI_RET ret = mobi_find_attrvalue(&result, data_start, data_end, T_HTML, target); + if (ret == MOBI_SUCCESS && result.start) { + if (strstr(result.value, "text/css")) { + return T_CSS; + } + if (strstr(result.value, "image/svg+xml")) { + return T_SVG; + } + } + return T_UNKNOWN; +} + +/** + @brief Get font type of given font resource + + @param[in] font_data Font resource data + @param[in] font_size Font resource size + @return MOBIFiletype file type + */ +MOBIFiletype mobi_determine_font_type(const unsigned char *font_data, const size_t font_size) { + const char otf_magic[] = "OTTO"; + const char ttf_magic[] = "\0\1\0\0"; + const char ttf2_magic[] = "true"; + + if (font_size >= 4) { + if (memcmp(font_data, otf_magic, 4) == 0) { + return T_OTF; + } + if (memcmp(font_data, ttf_magic, 4) == 0) { + return T_TTF; + } + if (memcmp(font_data, ttf2_magic, 4) == 0) { + return T_TTF; + } + } + debug_print("Unknown font resource type%s", "\n"); + return T_UNKNOWN; +} + +/** + @brief Replace part data with decoded audio data + + @param[in,out] part MOBIPart structure containing font resource, decoded part type will be set in the structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_add_audio_resource(MOBIPart *part) { + unsigned char *data = NULL; + size_t size = 0; + MOBI_RET ret = mobi_decode_audio_resource(&data, &size, part); + if (ret != MOBI_SUCCESS) { + return ret; + } + part->data = data; + part->size = size; + /* FIXME: the only possible audio type is mp3 */ + part->type = T_MP3; + + return MOBI_SUCCESS; +} + +/** + @brief Decode audio resource + + @param[in,out] decoded_resource Pointer to data offset in mobipocket record. + @param[in,out] decoded_size Decoded resource data size + @param[in,out] part MOBIPart structure containing resource, decoded part type will be set in the structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_decode_audio_resource(unsigned char **decoded_resource, size_t *decoded_size, MOBIPart *part) { + if (part->size < MEDIA_HEADER_LEN) { + debug_print("Audio resource record too short (%zu)\n", part->size); + return MOBI_DATA_CORRUPT; + } + MOBIBuffer *buf = mobi_buffer_init_null(part->data, part->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + char magic[5]; + mobi_buffer_getstring(magic, buf, 4); + if (strncmp(magic, AUDI_MAGIC, 4) != 0) { + debug_print("Wrong magic for audio resource: %s\n", magic); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + uint32_t offset = mobi_buffer_get32(buf); + mobi_buffer_setpos(buf, offset); + *decoded_size = buf->maxlen - buf->offset; + *decoded_resource = mobi_buffer_getpointer(buf, *decoded_size); + mobi_buffer_free_null(buf); + return MOBI_SUCCESS; +} + +/** + @brief Replace part data with decoded video data + + @param[in,out] part MOBIPart structure containing font resource, decoded part type will be set in the structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_add_video_resource(MOBIPart *part) { + unsigned char *data = NULL; + size_t size = 0; + MOBI_RET ret = mobi_decode_video_resource(&data, &size, part); + if (ret != MOBI_SUCCESS) { + return ret; + } + part->data = data; + part->size = size; + part->type = T_MPG; /* FIXME: other types? */ + + return MOBI_SUCCESS; +} + +/** + @brief Decode video resource + + @param[in,out] decoded_resource Pointer to data offset in mobipocket record. + @param[in,out] decoded_size Decoded resource data size + @param[in,out] part MOBIPart structure containing resource, decoded part type will be set in the structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_decode_video_resource(unsigned char **decoded_resource, size_t *decoded_size, MOBIPart *part) { + if (part->size < MEDIA_HEADER_LEN) { + debug_print("Video resource record too short (%zu)\n", part->size); + return MOBI_DATA_CORRUPT; + } + MOBIBuffer *buf = mobi_buffer_init_null(part->data, part->size); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + char magic[5]; + mobi_buffer_getstring(magic, buf, 4); + if (strncmp(magic, VIDE_MAGIC, 4) != 0) { + debug_print("Wrong magic for video resource: %s\n", magic); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + uint32_t offset = mobi_buffer_get32(buf); + /* offset is always(?) 12, next four bytes are unknown */ + mobi_buffer_setpos(buf, offset); + *decoded_size = buf->maxlen - buf->offset; + *decoded_resource = mobi_buffer_getpointer(buf, *decoded_size); + mobi_buffer_free_null(buf); + return MOBI_SUCCESS; +} + +/** + @brief Get embedded source archive + + Some mobi creator software store original conversion source as a zip archive. + The function may return MOBI_SUCCESS even if the data was not found, + so it is neccessary to check whether returned data pointer is not NULL. + + @param[in,out] data Pointer to data offset in pdb record. + @param[in,out] size Pointer to data size + @param[in] m MOBIData structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_embedded_source(unsigned char **data, size_t *size, const MOBIData *m) { + *data = NULL; + *size = 0; + if (m == NULL) { + return MOBI_INIT_FAILED; + } + MOBIMobiHeader *header = m->mh; + if (mobi_is_hybrid(m) && m->use_kf8 && m->next) { + /* SRCS index is in KF7 header */ + header = m->next->mh; + } + if (header == NULL || header->srcs_index == NULL || header->srcs_count == NULL || + *header->srcs_index == MOBI_NOTSET || *header->srcs_count == 0) { + return MOBI_SUCCESS; + } + uint32_t index = *header->srcs_index; + + const MOBIPdbRecord *srcs_record = mobi_get_record_by_seqnumber(m, index); + if (srcs_record == NULL) { + return MOBI_SUCCESS; + } + const size_t archive_offset = 16; + + if (srcs_record->size <= archive_offset) { + debug_print("Wrong size of SRCS resource: %zu\n", srcs_record->size); + return MOBI_DATA_CORRUPT; + } + + if (memcmp(srcs_record->data, SRCS_MAGIC, 4) != 0) { + debug_print("Wrong magic for SRCS resource: %c%c%c%c\n", + srcs_record->data[0], srcs_record->data[1], srcs_record->data[2], srcs_record->data[3]); + return MOBI_DATA_CORRUPT; + } + + *data = srcs_record->data + archive_offset; + *size = srcs_record->size - archive_offset; + + return MOBI_SUCCESS; +} + +/** + @brief Get embedded conversion log + + Some mobi creator software store original conversion log together with source archive. + The function may return MOBI_SUCCESS even if the data was not found, + so it is neccessary to check whether returned data pointer is not NULL. + + @param[in,out] data Pointer to data offset in pdb record. + @param[in,out] size Pointer to data size + @param[in] m MOBIData structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_get_embedded_log(unsigned char **data, size_t *size, const MOBIData *m) { + *data = NULL; + *size = 0; + if (m == NULL) { + return MOBI_INIT_FAILED; + } + MOBIMobiHeader *header = m->mh; + if (mobi_is_hybrid(m) && m->use_kf8 && m->next) { + /* SRCS index is in KF7 header */ + header = m->next->mh; + } + if (header == NULL || header->srcs_index == NULL || header->srcs_count == NULL || + *header->srcs_index == MOBI_NOTSET || *header->srcs_count < 2) { + return MOBI_SUCCESS; + } + uint32_t index = *header->srcs_index + 1; + + const MOBIPdbRecord *srcs_record = mobi_get_record_by_seqnumber(m, index); + if (srcs_record == NULL) { + return MOBI_SUCCESS; + } + const size_t log_offset = 12; + if (srcs_record->size <= log_offset) { + debug_print("Wrong size of CMET resource: %zu\n", srcs_record->size); + return MOBI_DATA_CORRUPT; + } + MOBIBuffer *buf = mobi_buffer_init_null(srcs_record->data, srcs_record->size); + if (buf == NULL) { + return MOBI_MALLOC_FAILED; + } + if (mobi_buffer_match_magic(buf, CMET_MAGIC) == false) { + debug_print("%s\n", "Wrong magic for CMET resource"); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + mobi_buffer_setpos(buf, 8); + uint32_t log_length = mobi_buffer_get32(buf); + unsigned char *log_data = mobi_buffer_getpointer(buf, log_length); + if (buf->error != MOBI_SUCCESS) { + debug_print("CMET resource too short: %zu (log size: %u)\n", srcs_record->size, log_length); + mobi_buffer_free_null(buf); + return MOBI_DATA_CORRUPT; + } + + *data = log_data; + *size = log_length; + + mobi_buffer_free_null(buf); + return MOBI_SUCCESS; +} + +/** + @brief Replace part data with decoded font data + + @param[in,out] part MOBIPart structure containing font resource, decoded part type will be set in the structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_add_font_resource(MOBIPart *part) { + unsigned char *data = NULL; + size_t size = 0; + MOBI_RET ret = mobi_decode_font_resource(&data, &size, part); + if (ret != MOBI_SUCCESS) { + return ret; + } + part->data = data; + part->size = size; + part->type = mobi_determine_font_type(data, size); + /* FIXME: mark unknown font types as ttf (shouldn't happen). + This will allow proper font resource deallocation. */ + if (part->type == T_UNKNOWN) { part->type = T_TTF; } + return MOBI_SUCCESS; +} + +/** + @brief Deobfuscator and decompressor for font resources + + @param[in,out] decoded_font Pointer to memory to write to. Will be allocated. Must be freed by caller + @param[in,out] decoded_size Decoded font data size + @param[in,out] part MOBIPart structure containing font resource, decoded part type will be set in the structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_decode_font_resource(unsigned char **decoded_font, size_t *decoded_size, MOBIPart *part) { + if (part->size < FONT_HEADER_LEN) { + debug_print("Font resource record too short (%zu)\n", part->size); + return MOBI_DATA_CORRUPT; + } + MOBIBuffer *buf = mobi_buffer_init(part->size); + if (buf == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + memcpy(buf->data, part->data, part->size); + struct header { + char magic[5]; + uint32_t decoded_size; + uint32_t flags; + uint32_t data_offset; + uint32_t xor_key_len; + uint32_t xor_key_offset; + }; + struct header h; + mobi_buffer_getstring(h.magic, buf, 4); + if (strncmp(h.magic, FONT_MAGIC, 4) != 0) { + debug_print("Wrong magic for font resource: %s\n", h.magic); + mobi_buffer_free(buf); + return MOBI_DATA_CORRUPT; + } + h.decoded_size = mobi_buffer_get32(buf); + if (h.decoded_size == 0 || h.decoded_size > FONT_SIZEMAX) { + debug_print("Invalid declared font resource size: %u\n", h.decoded_size); + mobi_buffer_free(buf); + return MOBI_DATA_CORRUPT; + } + h.flags = mobi_buffer_get32(buf); + h.data_offset = mobi_buffer_get32(buf); + h.xor_key_len = mobi_buffer_get32(buf); + h.xor_key_offset = mobi_buffer_get32(buf); + const uint32_t zlib_flag = 1; /* bit 0 */ + const uint32_t xor_flag = 2; /* bit 1 */ + if (h.flags & xor_flag && h.xor_key_len > 0) { + /* deobfuscate */ + if (h.data_offset > buf->maxlen || h.xor_key_len > buf->maxlen || h.xor_key_offset > buf->maxlen - h.xor_key_len) { + debug_print("%s\n", "Invalid obfuscated font data offsets"); + mobi_buffer_free(buf); + return MOBI_DATA_CORRUPT; + } + mobi_buffer_setpos(buf, h.data_offset); + const unsigned char *xor_key = buf->data + h.xor_key_offset; + size_t i = 0; + const size_t xor_limit = h.xor_key_len * MOBI_FONT_OBFUSCATED_BUFFER_COUNT; + while (buf->offset < buf->maxlen && i < xor_limit) { + buf->data[buf->offset++] ^= xor_key[i % h.xor_key_len]; + i++; + } + } + mobi_buffer_setpos(buf, h.data_offset); + *decoded_size = h.decoded_size; + *decoded_font = malloc(h.decoded_size); + if (*decoded_font == NULL) { + mobi_buffer_free(buf); + debug_print("%s", "Memory allocation failed\n"); + return MOBI_MALLOC_FAILED; + } + const unsigned char *encoded_font = buf->data + buf->offset; + const unsigned long encoded_size = buf->maxlen - buf->offset; + if (h.flags & zlib_flag) { + /* unpack */ + int ret = m_uncompress(*decoded_font, (unsigned long *) decoded_size, encoded_font, encoded_size); + if (ret != M_OK) { + mobi_buffer_free(buf); + free(*decoded_font); + debug_print("%s", "Font resource decompression failed\n"); + return MOBI_DATA_CORRUPT; + } + if (*decoded_size != h.decoded_size) { + mobi_buffer_free(buf); + free(*decoded_font); + debug_print("Decompressed font size (%zu) differs from declared (%i)\n", *decoded_size, h.decoded_size); + return MOBI_DATA_CORRUPT; + } + } else { + if (*decoded_size < encoded_size) { + mobi_buffer_free(buf); + free(*decoded_font); + debug_print("Font size in record (%lu) larger then declared (%zu)\n", encoded_size, *decoded_size); + return MOBI_DATA_CORRUPT; + } + memcpy(*decoded_font, encoded_font, encoded_size); + } + + mobi_buffer_free(buf); + return MOBI_SUCCESS; +} + +/** + @brief Get resource type (image, font) by checking its magic header + + @param[in] record MOBIPdbRecord structure containing unknown record type + @return MOBIFiletype file type, T_UNKNOWN if not determined, T_BREAK if end of records mark found + */ +MOBIFiletype mobi_determine_resource_type(const MOBIPdbRecord *record) { + /* Kindle supports GIF, BMP, JPG, PNG, SVG images. */ + /* GIF: 47 49 46 38 37 61 (GIF87a), 47 49 46 38 39 61 (GIF89a) */ + /* BMP: 42 4D (BM) + 4 byte file length le */ + /* JPG: FF D8 FF (header) + FF D9 (trailer) */ + /* PNG: 89 50 4E 47 0D 0A 1A 0A */ + /* SVG is XML-based format, so stored in flow parts */ + /* FONT: must be decoded */ + if (record->size < 4) { + return T_UNKNOWN; + } + const unsigned char jpg_magic[] = "\xff\xd8\xff"; + const unsigned char gif_magic[] = "\x47\x49\x46\x38"; + const unsigned char png_magic[] = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a"; + const unsigned char bmp_magic[] = "\x42\x4d"; + const unsigned char font_magic[] = FONT_MAGIC; + const unsigned char audio_magic[] = AUDI_MAGIC; + const unsigned char video_magic[] = VIDE_MAGIC; + const unsigned char boundary_magic[] = BOUNDARY_MAGIC; + const unsigned char eof_magic[] = EOF_MAGIC; + if (memcmp(record->data, jpg_magic, 3) == 0) { + return T_JPG; + } + if (memcmp(record->data, gif_magic, 4) == 0) { + return T_GIF; + } + if (record->size >= 8 && memcmp(record->data, png_magic, 8) == 0) { + return T_PNG; + } + if (memcmp(record->data, font_magic, 4) == 0) { + return T_FONT; + } + if (record->size >= 8 && memcmp(record->data, boundary_magic, 8) == 0) { + return T_BREAK; + } + if (memcmp(record->data, eof_magic, 4) == 0) { + return T_BREAK; + } + if (record->size >= 6 && memcmp(record->data, bmp_magic, 2) == 0) { + const size_t bmp_size = mobi_get32le(&record->data[2]); + if (record->size == bmp_size) { + return T_BMP; + } + } else if (memcmp(record->data, audio_magic, 4) == 0) { + return T_AUDIO; + } else if (memcmp(record->data, video_magic, 4) == 0) { + return T_VIDEO; + } + return T_UNKNOWN; +} + +/** + @brief Check if loaded MOBI data is KF7/KF8 hybrid file + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return true or false + */ +bool mobi_is_hybrid(const MOBIData *m) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return false; + } + if (m->kf8_boundary_offset != MOBI_NOTSET) { + return true; + } + return false; +} + +/** + @brief Check if loaded document is MOBI/BOOK Mobipocket format + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return true or false + */ +bool mobi_is_mobipocket(const MOBIData *m) { + if (m == NULL || m->ph == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return false; + } + if (strcmp(m->ph->type, "BOOK") == 0 && + strcmp(m->ph->creator, "MOBI") == 0) { + return true; + } + return false; +} + +/** + @brief Check if loaded document is TEXt/REAd format + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return true or false + */ +bool mobi_is_textread(const MOBIData *m) { + if (m == NULL || m->ph == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return false; + } + if (strcmp(m->ph->type, "TEXt") == 0 && + strcmp(m->ph->creator, "REAd") == 0) { + return true; + } + return false; +} + +/** + @brief Check if loaded document is dictionary + + @param[in] m MOBIData structure with loaded mobi header + @return true or false + */ +bool mobi_is_dictionary(const MOBIData *m) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return false; + } + /* FIXME: works only for old non-KF8 formats */ + if (mobi_get_fileversion(m) < 8 && mobi_exists_orth(m)) { + debug_print("%s", "Dictionary detected\n"); + return true; + } + return false; +} + +/** + @brief Check if loaded document is encrypted + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return true or false + */ +bool mobi_is_encrypted(const MOBIData *m) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return false; + } + if ((mobi_is_mobipocket(m) || mobi_is_textread(m)) && m->rh && + (m->rh->encryption_type == MOBI_ENCRYPTION_V1 || + m->rh->encryption_type == MOBI_ENCRYPTION_V2)) { + return true; + } + return false; +} + +/** + @brief Check if DRM key is set for the document + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return true or false + */ +bool mobi_has_drmkey(const MOBIData *m) { +#ifdef USE_ENCRYPTION + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return false; + } + MOBIDrm *drm = m->internals; + return drm != NULL && drm->key != NULL; +#else + UNUSED(m); + return false; +#endif +} + +/** + @brief Check if DRM cookies are set for the document + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return true or false + */ +bool mobi_has_drmcookies(const MOBIData *m) { +#ifdef USE_ENCRYPTION + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return false; + } + MOBIDrm *drm = m->internals; + return drm != NULL && drm->cookies_count > 0; +#else + UNUSED(m); + return false; +#endif +} + +/** + @brief Check if loaded document is Print Replica type + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return true or false + */ +bool mobi_is_replica(const MOBIData *m) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return false; + } + if (m->rec && m->rh && m->rh->compression_type == MOBI_COMPRESSION_NONE) { + MOBIPdbRecord *rec = m->rec->next; + if (rec && rec->size >= sizeof(REPLICA_MAGIC)) { + return memcmp(rec->data, REPLICA_MAGIC, sizeof(REPLICA_MAGIC) - 1) == 0; + } + } + return false; +} + +/** + @brief Get mobi file version + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return MOBI document version, 1 if ancient version (no MOBI header) or MOBI_NOTSET if error + */ +size_t mobi_get_fileversion(const MOBIData *m) { + size_t version = 1; + if (m == NULL || m->ph == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_NOTSET; + } + if (strcmp(m->ph->type, "BOOK") == 0 && strcmp(m->ph->creator, "MOBI") == 0) { + if (m->mh && m->mh->header_length) { + uint32_t header_length = *m->mh->header_length; + if (header_length < MOBI_HEADER_V2_SIZE) { + version = 2; + } else if (m->mh->version && *m->mh->version > 1) { + if ((*m->mh->version > 2 && header_length < MOBI_HEADER_V3_SIZE) + || (*m->mh->version > 3 && header_length < MOBI_HEADER_V4_SIZE) + ||(*m->mh->version > 5 && header_length < MOBI_HEADER_V5_SIZE)) { + return MOBI_NOTSET; + } + version = *m->mh->version; + } + } + } + return version; +} + +/** + @brief Is file version 8 or above + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return True if file version is 8 or greater + */ +bool mobi_is_kf8(const MOBIData *m) { + const size_t version = mobi_get_fileversion(m); + if (version != MOBI_NOTSET && version >= 8) { + return true; + } + return false; +} + +/** + @brief Is file version 8 or above + + @param[in] rawml MOBIRawml structure with parsed document + @return True if file version is 8 or greater + */ +bool mobi_is_rawml_kf8(const MOBIRawml *rawml) { + if (rawml && rawml->version != MOBI_NOTSET && rawml->version >= 8) { + return true; + } + return false; +} + +/** + @brief Get maximal size of uncompressed text record + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return Size of text or MOBI_NOTSET if error + */ +uint16_t mobi_get_textrecord_maxsize(const MOBIData *m) { + uint16_t max_record_size = RECORD0_TEXT_SIZE_MAX; + if (m && m->rh) { + if (m->rh->text_record_size > RECORD0_TEXT_SIZE_MAX) { + max_record_size = m->rh->text_record_size; + } + if (mobi_exists_mobiheader(m) && mobi_get_fileversion(m) <= 3) { + /* workaround for some old files with records larger than declared record size */ + size_t text_length = (size_t) max_record_size * m->rh->text_record_count; + if (text_length <= RAWTEXT_SIZEMAX && m->rh->text_length > text_length) { + max_record_size = RECORD0_TEXT_SIZE_MAX * 2; + } + } + } + return max_record_size; +} + +/** + @brief Get maximal size of all uncompressed text records + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return Size of text or MOBI_NOTSET if error + */ +size_t mobi_get_text_maxsize(const MOBIData *m) { + if (m && m->rh) { + /* FIXME: is it safe to use data from Record 0 header? */ + if (m->rh->text_record_count > 0) { + uint16_t max_record_size = mobi_get_textrecord_maxsize(m); + size_t maxsize = (size_t) m->rh->text_record_count * (size_t) max_record_size; + if (mobi_exists_mobiheader(m) && mobi_get_fileversion(m) <= 3) { + /* workaround for some old files with records larger than declared record size */ + if (m->rh->text_length > maxsize) { + maxsize = m->rh->text_length; + } + } + if (maxsize > RAWTEXT_SIZEMAX) { + debug_print("Raw text too large (%zu)\n", maxsize); + return MOBI_NOTSET; + } + return maxsize; + } + } + return MOBI_NOTSET; +} + +/** + @brief Get sequential number of first resource record (image/font etc) + + @param[in] m MOBIData structure with loaded Record(s) 0 headers + @return Record number or MOBI_NOTSET if not set + */ +size_t mobi_get_first_resource_record(const MOBIData *m) { + /* is it hybrid file? */ + if (mobi_is_hybrid(m) && m->use_kf8) { + /* get first image index from KF7 mobi header */ + if (m->next->mh->image_index) { + return *m->next->mh->image_index; + } + } + /* try to get it from currently set mobi header */ + if (m->mh && m->mh->image_index) { + return *m->mh->image_index; + } + return MOBI_NOTSET; +} + + +/** + @brief Calculate exponentiation for unsigned base and exponent + + @param[in] base Base + @param[in] exp Exponent + @return Result of base raised by the exponent exp + */ +size_t mobi_pow(unsigned base, unsigned exp) { + size_t result = 1; + while(exp) { + if (exp & 1) { + result *= base; + } + exp >>= 1; + base *= base; + } + return result; +} + +/** + @brief Decode positive number from base 32 to base 10. + + Base 32 characters must be upper case. + Maximal supported value is VVVVVV. + + @param[in,out] decoded Base 10 output number + @param[in] encoded Base 32 input number + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_base32_decode(uint32_t *decoded, const char *encoded) { + if (!encoded || !decoded) { + debug_print("Error, null parameter (decoded: %p, encoded: %p)\n", (void *) decoded, (void *) encoded); + return MOBI_PARAM_ERR; + } + /* strip leading zeroes */ + while (*encoded == '0') { + encoded++; + } + size_t encoded_length = strlen(encoded); + /* Let's limit input to 6 chars. VVVVVV(32) is 0x3FFFFFFF */ + if (encoded_length > 6) { + debug_print("Base 32 number too big: %s\n", encoded); + return MOBI_PARAM_ERR; + } + const unsigned char *c = (unsigned char *) encoded; + unsigned len = (unsigned) encoded_length; + const unsigned base = 32; + *decoded = 0; + unsigned value; + while (*c) { + /* FIXME: not portable, should we care? */ + if (*c >= 'A' && *c <= 'V') { + value = *c - 'A' + 10; + } + else if (*c >= '0' && *c <= '9') { + value = *c - '0'; + } + else { + debug_print("Illegal character: \"%c\"\n", *c); + return MOBI_DATA_CORRUPT; + } + *decoded += value * mobi_pow(base, --len); + c++; + } + return MOBI_SUCCESS; +} + + +/** + @brief Get offset of KF8 Boundary for KF7/KF8 hybrid file cached in MOBIData structure + + @param[in] m MOBIData structure + @return KF8 Boundary sequential number or zero if not found + */ +size_t mobi_get_kf8offset(const MOBIData *m) { + /* check if we want to parse KF8 part of joint file */ + if (m->use_kf8 && m->kf8_boundary_offset != MOBI_NOTSET) { + return m->kf8_boundary_offset + 1; + } + return 0; +} + +/** + @brief Get sequential number of KF8 Boundary record for KF7/KF8 hybrid file + + This function gets KF8 boundary offset from EXTH header + + @param[in] m MOBIData structure + @return KF8 Boundary record sequential number or MOBI_NOTSET if not found + */ +size_t mobi_get_kf8boundary_seqnumber(const MOBIData *m) { + if (m == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_NOTSET; + } + const MOBIExthHeader *exth_tag = mobi_get_exthrecord_by_tag(m, EXTH_KF8BOUNDARY); + if (exth_tag != NULL) { + uint32_t rec_number = mobi_decode_exthvalue(exth_tag->data, exth_tag->size); + rec_number--; + const MOBIPdbRecord *record = mobi_get_record_by_seqnumber(m, rec_number); + if (record && record->size >= sizeof(BOUNDARY_MAGIC) - 1) { + if (memcmp(record->data, BOUNDARY_MAGIC, sizeof(BOUNDARY_MAGIC) - 1) == 0) { + return rec_number; + } + } + } + return MOBI_NOTSET; +} + +/** + @brief Get size of serialized exth record including padding + + @param[in] m MOBIData structure + @return Size of exth record, zero on failure + */ +uint32_t mobi_get_exthsize(const MOBIData *m) { + if (m == NULL || m->eh == NULL) { + return 0; + } + size_t size = 0; + MOBIExthHeader *curr = m->eh; + while (curr) { + size += curr->size + 8; + curr = curr->next; + } + if (size > 0) { + /* add header size */ + size += 12; + /* add padding */ + size += size % 4; + } + if (size > UINT32_MAX) { + return 0; + } + return (uint32_t) size; +} + +/** + @brief Get size of serialized DRM data + + @param[in] m MOBIData structure + @return Size of DRM data, zero on failure + */ +uint32_t mobi_get_drmsize(const MOBIData *m) { + if (m == NULL || !mobi_is_encrypted(m)) { + return 0; + } + size_t size = 0; + + if (m->rh->encryption_type == MOBI_ENCRYPTION_V1) { + size = 51; + } else if (m->mh && m->mh->drm_size && *m->mh->drm_size > 0) { + size = *m->mh->drm_size; + } + + if (size > UINT32_MAX) { + return 0; + } + return (uint32_t) size; +} + +/** + @brief Get count of palm database records + + @param[in] m MOBIData structure + @return Count of records, zero on failure + */ +uint16_t mobi_get_records_count(const MOBIData *m) { + size_t count = 0; + if (m->rec) { + MOBIPdbRecord *curr = m->rec; + while (curr) { + count++; + curr = curr->next; + } + } + if (count > UINT16_MAX) { + return 0; + } + return (uint16_t) count; +} + +/** + @brief Remove null characters from char buffer + + @param[in,out] buffer Character buffer + @param[in,out] len Size of buffer, will be updated with new length + */ +void mobi_remove_zeros(unsigned char *buffer, size_t *len) { + size_t length = *len; + unsigned char *end = buffer + length; + unsigned char *buf = memchr(buffer, 0, length); + if (buf == NULL) { + return; + } + buf++; + size_t distance = 1; + while (buf < end) { + if (*buf) { + *(buf - distance) = *buf; + } else { + distance++; + } + buf++; + } + *len -= distance; +} + +/** + @brief Loader will parse KF7 part of hybrid file + + @param[in,out] m MOBIData structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_kf7(MOBIData *m) { + if (m == NULL) { + return MOBI_INIT_FAILED; + } + m->use_kf8 = false; + return MOBI_SUCCESS; +} + +/** + @brief Loader will parse KF8 part of hybrid file + + This is the default option. + + @param[in,out] m MOBIData structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_parse_kf8(MOBIData *m) { + if (m == NULL) { + return MOBI_INIT_FAILED; + } + m->use_kf8 = true; + return MOBI_SUCCESS; +} + +/** + @brief Remove KF7 version from hybrid file + + @param[in,out] m MOBIData structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_remove_part_kf7(MOBIData *m) { + + // move resource records to KF8 part + + size_t start_kf7 = MOBI_NOTSET; + size_t start_kf8 = MOBI_NOTSET; + size_t count_kf7 = MOBI_NOTSET; + size_t count_kf8 = MOBI_NOTSET; + + // switch to KF7 data + if (m->use_kf8) { + mobi_swap_mobidata(m); + m->use_kf8 = false; + } + if (m->mh == NULL) { + debug_print("%s\n", "Mobi header for version 7 missing"); + return MOBI_INIT_FAILED; + } + if (m->mh->image_index) { + start_kf7 = *m->mh->image_index; + } + MOBIExthHeader *exth = mobi_get_exthrecord_by_tag(m, EXTH_COUNTRESOURCES); + if (exth) { + count_kf7 = mobi_decode_exthvalue(exth->data, exth->size); + } + + // switch back to KF8 + mobi_swap_mobidata(m); + m->use_kf8 = true; + + if (m->mh == NULL || m->kf8_boundary_offset == MOBI_NOTSET) { + debug_print("%s\n", "Mobi header for version 8 missing"); + return MOBI_INIT_FAILED; + } + + if (m->mh->image_index) { + start_kf8 = *m->mh->image_index; + } + + MOBIExthHeader *exth_resources = mobi_get_exthrecord_by_tag(m, EXTH_COUNTRESOURCES); + if (exth_resources) { + count_kf8 = mobi_decode_exthvalue(exth_resources->data, exth_resources->size); + } + + if (start_kf7 == MOBI_NOTSET || start_kf8 == MOBI_NOTSET || + count_kf7 == MOBI_NOTSET || count_kf8 == MOBI_NOTSET || + m->kf8_boundary_offset < count_kf7) { + return MOBI_DATA_CORRUPT; + } + + // move resources to KF8 part + MOBIPdbRecord *extracted = mobi_extract_records_by_seqnumber(m, start_kf7, &count_kf7); + + m->kf8_boundary_offset -= count_kf7; + start_kf8 += m->kf8_boundary_offset + 1; + + MOBI_RET ret = mobi_insert_records_by_seqnumber(m, extracted, start_kf8); + if (ret != MOBI_SUCCESS) { + return ret; + } + + // delete records from beginning to boundary (inclusive) + size_t count = m->kf8_boundary_offset + 1; + + ret = mobi_delete_records_by_seqnumber(m, 0, &count); + if (ret != MOBI_SUCCESS) { + return ret; + } + m->kf8_boundary_offset = MOBI_NOTSET; + mobi_free_next(m); + + // update EXTH tags + + // update EXTH Count of Resources tag + count_kf8 += count_kf7; + if (exth_resources && exth_resources->size == 4 && count_kf8 <= UINT32_MAX) { + uint32_t value = (uint32_t) count_kf8; + unsigned char *p = exth_resources->data; + *p++ = (uint8_t)((uint32_t)(value & 0xff000000U) >> 24); + *p++ = (uint8_t)((uint32_t)(value & 0xff0000U) >> 16); + *p++ = (uint8_t)((uint32_t)(value & 0xff00U) >> 8); + *p = (uint8_t)((uint32_t)(value & 0xffU)); + } + + // check that EXTH Start Reading tag points to text, delete otherwise + MOBIExthHeader *exth_start = NULL; + while ((exth = mobi_next_exthrecord_by_tag(m, EXTH_STARTREADING, &exth_start))) { + uint32_t offset = mobi_decode_exthvalue(exth->data, exth->size); + if (offset > m->rh->text_record_count) { + mobi_delete_exthrecord(m, exth); + } + } + + // reset KF8 related EXTH flags + if (m->mh->exth_flags) { + *m->mh->exth_flags &= 0x7ff; + *m->mh->exth_flags |= 0x800; + } + + // adjust record offsets + if (m->mh->fdst_index && *m->mh->fdst_index + count_kf7 < UINT32_MAX) { + *m->mh->fdst_index += count_kf7; + } + if (m->mh->fcis_index && *m->mh->fcis_index + count_kf7 < UINT32_MAX) { + *m->mh->fcis_index += count_kf7; + } + if (m->mh->flis_index && *m->mh->flis_index + count_kf7 < UINT32_MAX) { + *m->mh->flis_index += count_kf7; + } + if (m->mh->datp_index && *m->mh->datp_index + count_kf7 < UINT32_MAX) { + *m->mh->datp_index += count_kf7; + } + if (m->mh->datp_rec_index && *m->mh->datp_rec_index + count_kf7 < UINT32_MAX) { + *m->mh->datp_rec_index += count_kf7; + } + + return MOBI_SUCCESS; +} + + +/** + @brief Remove KF8 version from hybrid file + + @param[in,out] m MOBIData structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_remove_part_kf8(MOBIData *m) { + + if (m->use_kf8) { + mobi_swap_mobidata(m); + m->use_kf8 = false; + } + + if (m->mh == NULL) { + debug_print("%s\n", "Mobi header missing"); + return MOBI_INIT_FAILED; + } + + // delete records from boundary (inclusive) up to last eof (exclusive) + size_t start = m->kf8_boundary_offset; + size_t count = mobi_get_records_count(m); + if (start == MOBI_NOTSET || count <= start) { + debug_print("%s\n", "Bad records range data"); + return MOBI_DATA_CORRUPT; + } + count -= start + 1; + MOBI_RET ret = mobi_delete_records_by_seqnumber(m, start, &count); + if (ret != MOBI_SUCCESS) { + return ret; + } + + // delete source and logs records + if (m->mh->srcs_index && m->mh->srcs_count) { + start = *m->mh->srcs_index; + count = *m->mh->srcs_count; + if (start != MOBI_NOTSET && count != MOBI_NOTSET) { + ret = mobi_delete_records_by_seqnumber(m, start, &count); + if (ret != MOBI_SUCCESS) { + return ret; + } + *m->mh->srcs_index = MOBI_NOTSET; + *m->mh->srcs_count = 0; + } + } + + // truncate obsolete FONT, RESC records + if (m->mh->image_index && (start = *m->mh->image_index) != MOBI_NOTSET) { + MOBIPdbRecord *curr = mobi_get_record_by_seqnumber(m, start); + while (curr != NULL) { + if (curr->data && curr->size > 4 && + (memcmp(curr->data, FONT_MAGIC, 4) == 0 || + memcmp(curr->data, RESC_MAGIC, 4) == 0)) { + unsigned char *tmp = realloc(curr->data, 4); + if (tmp == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + curr->data = tmp; + curr->size = 4; + } + curr = curr->next; + } + } + + mobi_free_next(m); + + // update EXTH tags + MOBIExthHeader *exth = mobi_get_exthrecord_by_tag(m, EXTH_KF8BOUNDARY); + if (exth != NULL && exth->size == sizeof(uint32_t)) { + const uint32_t value = MOBI_NOTSET; + memcpy(exth->data, &value, exth->size); + } + + ret = mobi_delete_exthrecord_by_tag(m, EXTH_KF8COVERURI); + if (ret != MOBI_SUCCESS) { + return ret; + } + + // reset KF8 related EXTH flags + if (m->mh->exth_flags){ + *m->mh->exth_flags &= 0x7ff; + } + + return MOBI_SUCCESS; +} + +/** + @brief Remove one version from hybrid file + + Hybrid file contains two document versions: KF8 version for devices that support new format and a version for older devices. + + @param[in,out] m MOBIData structure + @param[in] remove_kf8 Remove new KF8 part if true, old part if false + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_remove_hybrid_part(MOBIData *m, const bool remove_kf8) { + if (m == NULL) { + return MOBI_INIT_FAILED; + } + if (!mobi_is_hybrid(m)) { + debug_print("%s\n", "Not a hybrid, skip removing part"); + return MOBI_SUCCESS; + } + if (remove_kf8) { + return mobi_remove_part_kf8(m); + } + return mobi_remove_part_kf7(m); +} + +/** + @brief Swap KF7 and KF8 MOBIData structures in a hybrid file + + MOBIData structures form a circular linked list in case of hybrid files. + By default KF8 structure is first one in the list. + This function puts KF7 structure on the first place, so that it starts to be used by default. + + @param[in,out] m MOBIData structure + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_swap_mobidata(MOBIData *m) { + MOBIData *tmp = malloc(sizeof(MOBIData)); + if (tmp == NULL) { + debug_print("%s", "Memory allocation failed while swaping data\n"); + return MOBI_MALLOC_FAILED; + } + tmp->rh = m->rh; + tmp->mh = m->mh; + tmp->eh = m->eh; + m->rh = m->next->rh; + m->mh = m->next->mh; + m->eh = m->next->eh; + m->next->rh = tmp->rh; + m->next->mh = tmp->mh; + m->next->eh = tmp->eh; + free(tmp); + tmp = NULL; + return MOBI_SUCCESS; +} + +/** + @brief Store PID for encryption in MOBIData stucture. + PID will be calculated from device serial number. + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] serial Device serial number + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_drm_setkey_serial(MOBIData *m, const char *serial) { +#ifdef USE_ENCRYPTION + return mobi_drmkey_set_serial(m, serial); +#else + UNUSED(m); + UNUSED(serial); + debug_print("Libmobi compiled without encryption support%s", "\n"); + return MOBI_DRM_UNSUPPORTED; +#endif +} + +/** + @brief Add DRM voucher + + DRM vouncher will be used to generate pid key which is used to encrypt main encryption key. + Pid key is based on device serial number. + Optionally it is possible to set validity of the key. The key will be valid only within the period. + Optionally the pid key may be generated not only from serial number but also from contents + of selected EXTH headers. In such case the headers should be added (@see mobi_add_exthrecord) + before calling this function and array of header tags passed as function parameter. + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] serial Device serial number + @param[in] valid_from DRM validity start time, -1 if not set + @param[in] valid_to DRM validity end time, -1 if not set + @param[in] tamperkeys Array of EXTH tags to include in PID generation, NULL if none + @param[in] tamperkeys_count Count of EXTH tags + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_drm_addvoucher(MOBIData *m, const char *serial, const time_t valid_from, const time_t valid_to, + const MOBIExthTag *tamperkeys, const size_t tamperkeys_count) { +#ifdef USE_ENCRYPTION + return mobi_voucher_add(m, serial, valid_from, valid_to, tamperkeys, tamperkeys_count); + +#else + UNUSED(m); + UNUSED(serial); + UNUSED(valid_from); + UNUSED(valid_to); + UNUSED(tamperkeys); + UNUSED(tamperkeys_count); + debug_print("Libmobi compiled without encryption support%s", "\n"); + return MOBI_DRM_UNSUPPORTED; +#endif +} + +/** + @brief Store PID for encryption in MOBIData stucture + + @param[in,out] m MOBIData structure with raw data and metadata + @param[in] pid PID + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_drm_setkey(MOBIData *m, const char *pid) { +#ifdef USE_ENCRYPTION + return mobi_drmkey_set(m, pid); +#else + UNUSED(m); + UNUSED(pid); + debug_print("Libmobi compiled without encryption support%s", "\n"); + return MOBI_DRM_UNSUPPORTED; +#endif +} + +/** + @brief Remove PID stored for encryption from MOBIData structure + + @param[in,out] m MOBIData structure with raw data and metadata + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +MOBI_RET mobi_drm_delkey(MOBIData *m) { +#ifdef USE_ENCRYPTION + return mobi_drmkey_delete(m); +#else + UNUSED(m); + debug_print("Libmobi compiled without encryption support%s", "\n"); + return MOBI_DRM_UNSUPPORTED; +#endif +} + +/** + @brief Free internals + + @param[in,out] m MOBIData structure with raw data and metadata + */ +void mobi_free_internals(MOBIData *m) { +#ifdef USE_ENCRYPTION + mobi_free_drm(m); +#else + UNUSED(m); +#endif +} + +/** + @brief Convert char buffer to 32-bit unsigned integer big endian + + @param[in] buf Input buffer + @return Converted value + */ +uint32_t mobi_get32be(const unsigned char buf[4]) { + uint32_t val = (uint32_t) buf[0] << 24; + val |= (uint32_t) buf[1] << 16; + val |= (uint32_t) buf[2] << 8; + val |= (uint32_t) buf[3]; + return val; +} + +/** + @brief Convert char buffer to 32-bit unsigned integer little endian + + @param[in] buf Input buffer + @return Converted value + */ +uint32_t mobi_get32le(const unsigned char buf[4]) { + uint32_t val = (uint32_t) buf[0]; + val |= (uint32_t) buf[1] << 8; + val |= (uint32_t) buf[2] << 16; + val |= (uint32_t) buf[3] << 24; + return val; +} diff --git a/app/src/main/cpp/libmobi/src/util.h b/app/src/main/cpp/libmobi/src/util.h new file mode 100644 index 0000000..98b1698 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/util.h @@ -0,0 +1,157 @@ +/** @file util.h + * + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_util_h +#define libmobi_util_h + +#include "config.h" +#include "mobi.h" +#include "memory.h" +#include "buffer.h" +#include "read.h" +#include "compression.h" + +#ifndef HAVE_STRDUP +/** @brief strdup replacement */ +#define strdup mobi_strdup +#endif + +#ifdef USE_MINIZ +#include "miniz.h" +#define m_uncompress mz_uncompress +#define m_crc32 mz_crc32 +#define M_OK MZ_OK +#else +#include +#define m_uncompress uncompress +#define m_crc32 crc32 +#define M_OK Z_OK +#endif + +#define UNUSED(x) (void)(x) + +/** @brief Magic numbers of records */ +#define AUDI_MAGIC "AUDI" +#define CDIC_MAGIC "CDIC" +#define CMET_MAGIC "CMET" +#define EXTH_MAGIC "EXTH" +#define FDST_MAGIC "FDST" +#define FONT_MAGIC "FONT" +#define HUFF_MAGIC "HUFF" +#define IDXT_MAGIC "IDXT" +#define INDX_MAGIC "INDX" +#define LIGT_MAGIC "LIGT" +#define MOBI_MAGIC "MOBI" +#define ORDT_MAGIC "ORDT" +#define RESC_MAGIC "RESC" +#define SRCS_MAGIC "SRCS" +#define TAGX_MAGIC "TAGX" +#define VIDE_MAGIC "VIDE" +#define BOUNDARY_MAGIC "BOUNDARY" +#define EOF_MAGIC "\xe9\x8e\r\n" +#define REPLICA_MAGIC "%MOP" + +/** @brief Difference in seconds between epoch time and mac time */ +#define EPOCH_MAC_DIFF 2082844800UL + +/** + @defgroup mobi_pdb Params for pdb record header structure + @{ + */ +#define PALMDB_HEADER_LEN 78 /**< Length of header without record info headers */ +#define PALMDB_NAME_SIZE_MAX 32 /**< Max length of db name stored at offset 0 */ +#define PALMDB_RECORD_INFO_SIZE 8 /**< Record info header size of each pdb record */ +/** @} */ + +/** + @defgroup mobi_pdb_defs Default values for pdb record header structure + @{ + */ +#define PALMDB_ATTRIBUTE_DEFAULT 0 +#define PALMDB_VERSION_DEFAULT 0 +#define PALMDB_MODNUM_DEFAULT 0 +#define PALMDB_APPINFO_DEFAULT 0 +#define PALMDB_SORTINFO_DEFAULT 0 +#define PALMDB_TYPE_DEFAULT "BOOK" +#define PALMDB_CREATOR_DEFAULT "MOBI" +#define PALMDB_NEXTREC_DEFAULT 0 +/** @} */ + +/** + @defgroup mobi_rec0 Params for record0 header structure + @{ + */ +#define RECORD0_HEADER_LEN 16 /**< Length of Record 0 header */ +#define RECORD0_TEXT_SIZE_MAX 4096 /**< Max size of uncompressed text record */ +#define RECORD0_FULLNAME_SIZE_MAX 1024 /**< Max size to full name string */ +/** @} */ + +/** + @defgroup mobi_len Header length / size of records + @{ + */ +#define CDIC_HEADER_LEN 16 +#define CDIC_RECORD_MAXCNT 1024 +#define HUFF_CODELEN_MAX 16 +#define HUFF_HEADER_LEN 24 +#define HUFF_RECORD_MAXCNT 1024 +#define HUFF_RECORD_MINSIZE 2584 +#define FONT_HEADER_LEN 24 +#define MEDIA_HEADER_LEN 12 +#define FONT_SIZEMAX (50 * 1024 * 1024) +#define RAWTEXT_SIZEMAX 0xfffffff +#define MOBI_HEADER_V2_SIZE 0x18 +#define MOBI_HEADER_V3_SIZE 0x74 +#define MOBI_HEADER_V4_SIZE 0xd0 +#define MOBI_HEADER_V5_SIZE 0xe4 +#define MOBI_HEADER_V6_SIZE 0xe4 +#define MOBI_HEADER_V6_EXT_SIZE 0xe8 +#define MOBI_HEADER_V7_SIZE 0xe4 +/** @} */ + +#ifndef max +#define max(a, b) ((a) > (b) ? (a) : (b)) +#endif +#ifndef min +#define min(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0])) + +#define MOBI_TITLE_SIZEMAX 1024 + +int mobi_bitcount(const uint8_t byte); +MOBI_RET mobi_delete_record_by_seqnumber(MOBIData *m, const size_t num); +MOBI_RET mobi_swap_mobidata(MOBIData *m); +char * mobi_strdup(const char *s); +bool mobi_is_cp1252(const MOBIData *m); +bool mobi_has_drmkey(const MOBIData *m); +bool mobi_has_drmcookies(const MOBIData *m); +MOBI_RET mobi_cp1252_to_utf8(char *output, const char *input, size_t *outsize, const size_t insize); +MOBI_RET mobi_utf8_to_cp1252(char *output, const char *input, size_t *outsize, const size_t insize); +uint8_t mobi_ligature_to_cp1252(const uint8_t byte1, const uint8_t byte2); +uint16_t mobi_ligature_to_utf16(const uint32_t byte1, const uint32_t byte2); +MOBIFiletype mobi_determine_resource_type(const MOBIPdbRecord *record); +MOBIFiletype mobi_determine_flowpart_type(const MOBIRawml *rawml, const size_t part_number); +MOBI_RET mobi_base32_decode(uint32_t *decoded, const char *encoded); +MOBIFiletype mobi_get_resourcetype_by_uid(const MOBIRawml *rawml, const size_t uid); +uint32_t mobi_get_exthsize(const MOBIData *m); +uint32_t mobi_get_drmsize(const MOBIData *m); +uint16_t mobi_get_records_count(const MOBIData *m); +void mobi_remove_zeros(unsigned char *buffer, size_t *len); +MOBI_RET mobi_add_audio_resource(MOBIPart *part); +MOBI_RET mobi_add_video_resource(MOBIPart *part); +MOBI_RET mobi_add_font_resource(MOBIPart *part); +MOBI_RET mobi_set_fullname(MOBIData *m, const char *fullname); +MOBI_RET mobi_set_pdbname(MOBIData *m, const char *name); +void mobi_free_internals(MOBIData *m); +uint32_t mobi_get32be(const unsigned char buf[4]); +uint32_t mobi_get32le(const unsigned char buf[4]); +#endif diff --git a/app/src/main/cpp/libmobi/src/write.c b/app/src/main/cpp/libmobi/src/write.c new file mode 100644 index 0000000..b626e03 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/write.c @@ -0,0 +1,540 @@ +/** @file write.c + * @brief Writing functions + * + * Copyright (c) 2016 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#include +#include +#include + +#include "write.h" +#include "util.h" +#include "debug.h" +#ifdef USE_ENCRYPTION +#include "encryption.h" +#endif + +#define MOBI_HEADER_MAXLEN 280 +#define MOBI_RECORD0_PADDING 0x2002 + +/** + @brief Write buffer contents to file + + @param[in,out] file File descriptor + @param[in] buf Buffer + @return MOBI_RET status code (MOBI_SUCCESS on success) + */ +MOBI_RET mobi_write_buffer(FILE *file, const MOBIBuffer *buf) { + const size_t written = fwrite(buf->data, 1, buf->maxlen, file); + if (written != buf->maxlen) { + debug_print("Writing failed (%s)\n", strerror(errno)); + return MOBI_WRITE_FAILED; + } + return MOBI_SUCCESS; +} + +/** + @brief Write palm database header to file + + @param[in,out] file File descriptor + @param[in] m MOBIData structure + @return MOBI_RET status code (MOBI_SUCCESS on success) + */ +MOBI_RET mobi_write_pdbheader(FILE *file, const MOBIData *m) { + if (m == NULL || m->ph == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + if (file == NULL) { + debug_print("%s", "File not initialized\n"); + return MOBI_PARAM_ERR; + } + MOBIBuffer *buf = mobi_buffer_init(PALMDB_HEADER_LEN); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + mobi_buffer_addstring(buf, m->ph->name); + size_t len = strlen(m->ph->name); + mobi_buffer_addzeros(buf, PALMDB_NAME_SIZE_MAX - len); + mobi_buffer_add16(buf, m->ph->attributes); + mobi_buffer_add16(buf, m->ph->version); + mobi_buffer_add32(buf, m->ph->ctime); + mobi_buffer_add32(buf, m->ph->mtime); + mobi_buffer_add32(buf, m->ph->btime); + mobi_buffer_add32(buf, m->ph->mod_num); + mobi_buffer_add32(buf, m->ph->appinfo_offset); + mobi_buffer_add32(buf, m->ph->sortinfo_offset); + mobi_buffer_addstring(buf, m->ph->type); + mobi_buffer_addstring(buf, m->ph->creator); + mobi_buffer_add32(buf, m->ph->uid); + mobi_buffer_add32(buf, m->ph->next_rec); + m->ph->rec_count = mobi_get_records_count(m); + if (m->ph->rec_count == 0) { + mobi_buffer_free(buf); + debug_print("%s", "Zero records count\n"); + return MOBI_DATA_CORRUPT; + } + mobi_buffer_add16(buf, m->ph->rec_count); + if (buf->error != MOBI_SUCCESS) { + mobi_buffer_free(buf); + return MOBI_DATA_CORRUPT; + } + MOBI_RET ret = mobi_write_buffer(file, buf); + mobi_buffer_free(buf); + return ret; +} + +/** + @brief Serialize mobi header to buffer + + @param[in,out] buf output buffer + @param[in] m MOBIData structure + @param[in] exthsize Size of exth record + @return MOBI_RET status code (MOBI_SUCCESS on success) + */ +MOBI_RET mobi_serialize_mobiheader(MOBIBuffer *buf, const MOBIData *m, const uint32_t exthsize) { + if (m == NULL || m->mh == NULL || buf == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + size_t buffer_init = buf->offset; + mobi_buffer_addstring(buf, m->mh->mobi_magic); + if (buf->offset > UINT32_MAX) { + debug_print("Offset too large: %zu\n", buf->offset); + return MOBI_DATA_CORRUPT; + } + uint32_t length_offset = (uint32_t) buf->offset; + uint32_t name_offset = 0; + uint32_t drm_offset = 0; + mobi_buffer_add32(buf, 0); /* dummy length */ + if (m->mh->mobi_type) { mobi_buffer_add32(buf, *m->mh->mobi_type); } else { goto finalize; } + if (m->mh->text_encoding) { mobi_buffer_add32(buf, *m->mh->text_encoding); } else { goto finalize; } + if (m->mh->uid) { mobi_buffer_add32(buf, *m->mh->uid); } else { goto finalize; } + bool isKF8 = false; + if (m->mh->version) { + mobi_buffer_add32(buf, *m->mh->version); + if (*m->mh->version == 8) { + isKF8 = true; + } + } else { goto finalize; } + if (m->mh->orth_index) { mobi_buffer_add32(buf, *m->mh->orth_index); } else { goto finalize; } + if (m->mh->infl_index) { mobi_buffer_add32(buf, *m->mh->infl_index); } else { goto finalize; } + if (m->mh->names_index) { mobi_buffer_add32(buf, *m->mh->names_index); } else { goto finalize; } + if (m->mh->keys_index) { mobi_buffer_add32(buf, *m->mh->keys_index); } else { goto finalize; } + if (m->mh->extra0_index) { mobi_buffer_add32(buf, *m->mh->extra0_index); } else { goto finalize; } + if (m->mh->extra1_index) { mobi_buffer_add32(buf, *m->mh->extra1_index); } else { goto finalize; } + if (m->mh->extra2_index) { mobi_buffer_add32(buf, *m->mh->extra2_index); } else { goto finalize; } + if (m->mh->extra3_index) { mobi_buffer_add32(buf, *m->mh->extra3_index); } else { goto finalize; } + if (m->mh->extra4_index) { mobi_buffer_add32(buf, *m->mh->extra4_index); } else { goto finalize; } + if (m->mh->extra5_index) { mobi_buffer_add32(buf, *m->mh->extra5_index); } else { goto finalize; } + if (m->mh->non_text_index) { mobi_buffer_add32(buf, *m->mh->non_text_index); } else { goto finalize; } + if (m->mh->full_name) { + if (buf->offset > UINT32_MAX) { + debug_print("Offset too large: %zu\n", buf->offset); + return MOBI_DATA_CORRUPT; + } + name_offset = (uint32_t) buf->offset; + mobi_buffer_add32(buf, MOBI_NOTSET); + mobi_buffer_add32(buf, 0); + } else { goto finalize; } + if (m->mh->locale) { mobi_buffer_add32(buf, *m->mh->locale); } else { goto finalize; } + if (m->mh->dict_input_lang) { mobi_buffer_add32(buf, *m->mh->dict_input_lang); } else { goto finalize; } + if (m->mh->dict_output_lang) { mobi_buffer_add32(buf, *m->mh->dict_output_lang); } else { goto finalize; } + if (m->mh->min_version) { mobi_buffer_add32(buf, *m->mh->min_version); } else { goto finalize; } + if (m->mh->image_index) { mobi_buffer_add32(buf, *m->mh->image_index); } else { goto finalize; } + if (m->mh->huff_rec_index) { mobi_buffer_add32(buf, *m->mh->huff_rec_index); } else { goto finalize; } + if (m->mh->huff_rec_count) { mobi_buffer_add32(buf, *m->mh->huff_rec_count); } else { goto finalize; } + if (m->mh->datp_rec_index) { mobi_buffer_add32(buf, *m->mh->datp_rec_index); } else { goto finalize; } + if (m->mh->datp_rec_count) { mobi_buffer_add32(buf, *m->mh->datp_rec_count); } else { goto finalize; } + if (m->mh->exth_flags) { mobi_buffer_add32(buf, *m->mh->exth_flags); } else { goto finalize; } + mobi_buffer_addzeros(buf, 32); /* 32 unknown bytes */ + if (m->mh->unknown6) { mobi_buffer_add32(buf, *m->mh->unknown6); } else { goto finalize; } + if (m->mh->drm_offset) { + drm_offset = (uint32_t) buf->offset; + mobi_buffer_add32(buf, *m->mh->drm_offset); + } else { goto finalize; } + if (m->mh->drm_count) { mobi_buffer_add32(buf, *m->mh->drm_count); } else { goto finalize; } + if (m->mh->drm_size) { mobi_buffer_add32(buf, *m->mh->drm_size); } else { goto finalize; } + if (m->mh->drm_flags) { mobi_buffer_add32(buf, *m->mh->drm_flags); } else { goto finalize; } + mobi_buffer_addzeros(buf, 8); /* 8 unknown bytes */ + if (isKF8) { + if (m->mh->fdst_index) { mobi_buffer_add32(buf, *m->mh->fdst_index); } else { goto finalize; } + } else { + if (m->mh->first_text_index) { mobi_buffer_add16(buf, *m->mh->first_text_index); } else { goto finalize; } + if (m->mh->last_text_index) { mobi_buffer_add16(buf, *m->mh->last_text_index); } else { goto finalize; } + } + if (m->mh->fdst_section_count) { mobi_buffer_add32(buf, *m->mh->fdst_section_count); } else { goto finalize; } + if (m->mh->fcis_index) { mobi_buffer_add32(buf, *m->mh->fcis_index); } else { goto finalize; } + if (m->mh->fcis_count) { mobi_buffer_add32(buf, *m->mh->fcis_count); } else { goto finalize; } + if (m->mh->flis_index) { mobi_buffer_add32(buf, *m->mh->flis_index); } else { goto finalize; } + if (m->mh->flis_count) { mobi_buffer_add32(buf, *m->mh->flis_count); } else { goto finalize; } + if (m->mh->unknown10) { mobi_buffer_add32(buf, *m->mh->unknown10); } else { goto finalize; } + if (m->mh->unknown11) { mobi_buffer_add32(buf, *m->mh->unknown11); } else { goto finalize; } + if (m->mh->srcs_index) { mobi_buffer_add32(buf, *m->mh->srcs_index); } else { goto finalize; } + if (m->mh->srcs_count) { mobi_buffer_add32(buf, *m->mh->srcs_count); } else { goto finalize; } + if (m->mh->unknown12) { mobi_buffer_add32(buf, *m->mh->unknown12); } else { goto finalize; } + if (m->mh->unknown13) { mobi_buffer_add32(buf, *m->mh->unknown13); } else { goto finalize; } + mobi_buffer_addzeros(buf, 2); /* 2 unknown bytes */ + if (m->mh->extra_flags) { mobi_buffer_add16(buf, *m->mh->extra_flags); } else { goto finalize; } + if (m->mh->ncx_index) { mobi_buffer_add32(buf, *m->mh->ncx_index); } else { goto finalize; } + if (isKF8) { + if (m->mh->fragment_index) { mobi_buffer_add32(buf, *m->mh->fragment_index); } else { goto finalize; } + if (m->mh->skeleton_index) { mobi_buffer_add32(buf, *m->mh->skeleton_index); } else { goto finalize; } + } else { + if (m->mh->unknown14) { mobi_buffer_add32(buf, *m->mh->unknown14); } else { goto finalize; } + if (m->mh->unknown15) { mobi_buffer_add32(buf, *m->mh->unknown15); } else { goto finalize; } + } + if (m->mh->datp_index) { mobi_buffer_add32(buf, *m->mh->datp_index); } else { goto finalize; } + if (isKF8) { + if (m->mh->guide_index) { mobi_buffer_add32(buf, *m->mh->guide_index); } else { goto finalize; } + } else { + if (m->mh->unknown16) { mobi_buffer_add32(buf, *m->mh->unknown16); } else { goto finalize; } + } + if (m->mh->unknown17) { mobi_buffer_add32(buf, *m->mh->unknown17); } else { goto finalize; } + if (m->mh->unknown18) { mobi_buffer_add32(buf, *m->mh->unknown18); } else { goto finalize; } + if (m->mh->unknown19) { mobi_buffer_add32(buf, *m->mh->unknown19); } else { goto finalize; } + if (m->mh->unknown20) { mobi_buffer_add32(buf, *m->mh->unknown20); } else { goto finalize; } + +finalize: + if (buf->error != MOBI_SUCCESS) { + return MOBI_DATA_CORRUPT; + } + size_t headersize = buf->offset - buffer_init; + if (headersize > UINT32_MAX) { + debug_print("Header too large: %zu\n", headersize); + return MOBI_DATA_CORRUPT; + } + size_t saved_offset = buf->offset; + /* write header length at offset 20 */ + mobi_buffer_setpos(buf, length_offset); + mobi_buffer_add32(buf, (uint32_t) headersize); + *m->mh->header_length = (uint32_t) headersize; + uint32_t drmsize = 0; +#ifdef USE_ENCRYPTION + if (m->rh->encryption_type == MOBI_ENCRYPTION_V2 && + m->mh->drm_size && m->mh->drm_offset && *m->mh->drm_size > 0) { + drmsize = mobi_get_drmsize(m); + *m->mh->drm_offset = RECORD0_HEADER_LEN + (uint32_t) headersize + exthsize; + mobi_buffer_setpos(buf, drm_offset); + mobi_buffer_add32(buf, *m->mh->drm_offset); + } else if (m->rh->encryption_type == MOBI_ENCRYPTION_V1) { + drmsize = mobi_get_drmsize(m); + } +#endif + + if (m->mh->full_name) { + /* full name's offset is after exth records */ + uint32_t fullname_offset = RECORD0_HEADER_LEN + (uint32_t) headersize + exthsize + drmsize; + size_t fullname_length = strlen(m->mh->full_name); + if (fullname_length > MOBI_TITLE_SIZEMAX) { + fullname_length = MOBI_TITLE_SIZEMAX; + m->mh->full_name[MOBI_TITLE_SIZEMAX] = '\0'; + } + /* write fullname offset and length */ + mobi_buffer_setpos(buf, name_offset); + mobi_buffer_add32(buf, fullname_offset); + mobi_buffer_add32(buf, (uint32_t) fullname_length); + if (m->mh->full_name_offset == NULL) { + m->mh->full_name_offset = malloc(sizeof(uint32_t)); + if (m->mh->full_name_offset == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + } + *m->mh->full_name_offset = fullname_offset; + if (m->mh->full_name_length == NULL) { + m->mh->full_name_length = malloc(sizeof(uint32_t)); + if (m->mh->full_name_length == NULL) { + debug_print("Memory allocation failed%s", "\n"); + return MOBI_MALLOC_FAILED; + } + } + *m->mh->full_name_length = (uint32_t) fullname_length; + } + mobi_buffer_setpos(buf, saved_offset); + if (buf->error != MOBI_SUCCESS) { + return MOBI_DATA_CORRUPT; + } + return MOBI_SUCCESS; +} + +/** + @brief Serialize exth header to buffer + + @param[in,out] buf output buffer + @param[in] m MOBIData structure + @return MOBI_RET status code (MOBI_SUCCESS on success) + */ +MOBI_RET mobi_serialize_extheader(MOBIBuffer *buf, const MOBIData *m) { + if (m == NULL || m->eh == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + MOBIExthHeader *curr = m->eh; + mobi_buffer_addstring(buf, EXTH_MAGIC); + const size_t length_offset = buf->offset; + size_t length = 12; /* start with header length */ + mobi_buffer_add32(buf, 0); + const size_t count_offset = buf->offset; + size_t count = 0; + mobi_buffer_add32(buf, 0); + while (curr) { + /* total size = data size plus 8 bytes for uid and size */ + const uint32_t size = curr->size + 8; + length += size; + count++; + mobi_buffer_add32(buf, curr->tag); + mobi_buffer_add32(buf, size); + mobi_buffer_addraw(buf, curr->data, curr->size); + if (buf->error != MOBI_SUCCESS) { + return MOBI_DATA_CORRUPT; + } + curr = curr->next; + } + if (length > UINT32_MAX || count > UINT32_MAX) { + debug_print("Length (%zu) or count (%zu) too large\n", length, count); + return MOBI_DATA_CORRUPT; + } + /* add padding */ + const size_t padding_size = length % 4; + length += padding_size; + mobi_buffer_addzeros(buf, padding_size); + const size_t saved_offset = buf->offset; + mobi_buffer_setpos(buf, length_offset); + mobi_buffer_add32(buf, (uint32_t) length); + mobi_buffer_setpos(buf, count_offset); + mobi_buffer_add32(buf, (uint32_t) count); + mobi_buffer_setpos(buf, saved_offset); + return MOBI_SUCCESS; +} + +/** + @brief Serialize record0 and update record in MOBIData structure. + + Record0 sequential number may be greater than zero in case + of hybrid file with two info records + + @param[in,out] m MOBIData structure + @param[in] seqnumber Record0 sequential number + @return MOBI_RET status code (MOBI_SUCCESS on success) + */ +MOBI_RET mobi_update_record0(MOBIData *m, const size_t seqnumber) { + if (m == NULL || m->rh == NULL || m->rec == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + size_t padding = MOBI_RECORD0_PADDING; + if (!mobi_exists_mobiheader(m)) { + padding = 0; + } else if (mobi_get_fileversion(m) < 8) { + padding -= 12; + } + size_t record0_maxlen = RECORD0_HEADER_LEN + MOBI_HEADER_MAXLEN; + uint32_t exthsize = mobi_get_exthsize(m); + uint32_t drmsize = mobi_get_drmsize(m); + record0_maxlen += exthsize; + record0_maxlen += drmsize; + record0_maxlen += MOBI_TITLE_SIZEMAX; + record0_maxlen += padding; + MOBIBuffer *buf = mobi_buffer_init(record0_maxlen); + if (buf == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return MOBI_MALLOC_FAILED; + } + mobi_buffer_add16(buf, m->rh->compression_type); + mobi_buffer_addzeros(buf, 2); + mobi_buffer_add32(buf, m->rh->text_length); + mobi_buffer_add16(buf, m->rh->text_record_count); + mobi_buffer_add16(buf, m->rh->text_record_size); + mobi_buffer_add16(buf, m->rh->encryption_type); + mobi_buffer_add16(buf, m->rh->unknown1); + + if (m->mh) { + MOBI_RET ret = mobi_serialize_mobiheader(buf, m, exthsize); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free(buf); + return ret; + } + if (m->eh) { + ret = mobi_serialize_extheader(buf, m); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free(buf); + return ret; + } + } + +#ifdef USE_ENCRYPTION + if (m->rh->encryption_type == MOBI_ENCRYPTION_V1) { + ret = mobi_drm_serialize_v1(buf, m); + } else if (m->rh->encryption_type == MOBI_ENCRYPTION_V2) { + ret = mobi_drm_serialize_v2(buf, m); + } + if (ret != MOBI_SUCCESS) { + mobi_buffer_free(buf); + return ret; + } +#endif + if (m->mh->full_name && m->mh->full_name_offset) { + mobi_buffer_setpos(buf, *m->mh->full_name_offset); + mobi_buffer_addstring(buf, m->mh->full_name); + if (buf->error != MOBI_SUCCESS) { + mobi_buffer_free(buf); + return MOBI_DATA_CORRUPT; + } + } + } +#ifdef USE_ENCRYPTION + else if (m->rh->encryption_type == MOBI_ENCRYPTION_V1) { + MOBI_RET ret = mobi_drm_serialize_v1(buf, m); + if (ret != MOBI_SUCCESS) { + mobi_buffer_free(buf); + return ret; + } + mobi_buffer_setpos(buf, 14 + drmsize); + } +#endif + + mobi_buffer_addzeros(buf, padding); + if (buf->error) { + mobi_buffer_free(buf); + return MOBI_DATA_CORRUPT; + } + + MOBIPdbRecord *record0 = mobi_get_record_by_seqnumber(m, seqnumber); + if (record0 == NULL) { + debug_print("%s", "Record 0 not initialized\n"); + mobi_buffer_free(buf); + return MOBI_DATA_CORRUPT; + } + unsigned char *data = malloc(buf->offset); + if (data == NULL) { + mobi_buffer_free(buf); + return MOBI_MALLOC_FAILED; + } + memcpy(data, buf->data, buf->offset); + record0->size = buf->offset; + mobi_buffer_free(buf); + if (record0->data) { + free(record0->data); + } + record0->data = data; + return MOBI_SUCCESS; +} + +/** + @brief Write palm database records to file + + @param[in,out] file File descriptor + @param[in] m MOBIData structure + @return MOBI_RET status code (MOBI_SUCCESS on success) + */ +MOBI_RET mobi_write_records(FILE *file, const MOBIData *m) { + if (m == NULL || m->rec == NULL) { + debug_print("%s", "Mobi structure not initialized\n"); + return MOBI_INIT_FAILED; + } + if (file == NULL) { + return MOBI_PARAM_ERR; + } + long pos = ftell(file); + if (pos < 0) { + return MOBI_WRITE_FAILED; + } + uint32_t offset = (uint32_t) pos; + /* 8 bytes per record meta plus 2 bytes padding */ + offset += 8 * m->ph->rec_count + 2; + MOBIPdbRecord *curr = m->rec; + uint32_t i = 0; + while (curr) { + if (offset > UINT32_MAX) { + return MOBI_DATA_CORRUPT; + } + MOBIBuffer *buf = mobi_buffer_init(PALMDB_RECORD_INFO_SIZE); + if (buf == NULL) { + return MOBI_MALLOC_FAILED; + } + mobi_buffer_add32(buf, (uint32_t) offset); + offset += curr->size; + mobi_buffer_add8(buf, curr->attributes); + curr->uid = 2 * i++; + const uint8_t h = (uint8_t) ((curr->uid & 0xff0000U) >> 16); + const uint16_t l = (uint16_t) (curr->uid & 0xffffU); + mobi_buffer_add8(buf, h); + mobi_buffer_add16(buf, l); + if (buf->error != MOBI_SUCCESS) { + mobi_buffer_free(buf); + return MOBI_DATA_CORRUPT; + } + MOBI_RET ret = mobi_write_buffer(file, buf); + mobi_buffer_free(buf); + if (ret != MOBI_SUCCESS) { + return ret; + } + curr = curr->next; + } + char padding[2] = { 0 }; + size_t written = fwrite(padding, 1, sizeof(padding), file); + if (written != sizeof(padding)) { + debug_print("Writing failed (%s)\n", strerror(errno)); + return MOBI_WRITE_FAILED; + } + + curr = m->rec; + while (curr) { + written = fwrite(curr->data, 1, curr->size, file); + if (written != curr->size) { + debug_print("Writing failed (%s)\n", strerror(errno)); + return MOBI_WRITE_FAILED; + } + curr = curr->next; + } + return MOBI_SUCCESS; +} + +/** + @brief Write mobi document to file. + + Serializes metadata from MOBIData into raw records also stored in MOBIData (m->rec). + Later writes palm database to file. + + @param[in,out] file File descriptor + @param[in,out] m MOBIData structure + @return MOBI_RET status code (MOBI_SUCCESS on success) + */ +MOBI_RET mobi_write_file(FILE *file, MOBIData *m) { + MOBI_RET ret = mobi_write_pdbheader(file, m); + if (ret != MOBI_SUCCESS) { + return ret; + } + MOBIData *m_kf7 = m; + if (mobi_is_hybrid(m) && m->next) { + MOBIData *m_kf8 = m; + if (m->use_kf8 == false) { + m_kf8 = m->next; + } else { + m_kf7 = m->next; + } + const size_t record0_kf8_offset = m_kf8->kf8_boundary_offset + 1; + ret = mobi_update_record0(m_kf8, record0_kf8_offset); + if (ret != MOBI_SUCCESS) { + return ret; + } + } + ret = mobi_update_record0(m_kf7, 0); + if (ret != MOBI_SUCCESS) { + return ret; + } + ret = mobi_write_records(file, m); + if (ret != MOBI_SUCCESS) { + return ret; + } + return MOBI_SUCCESS; + +} diff --git a/app/src/main/cpp/libmobi/src/write.h b/app/src/main/cpp/libmobi/src/write.h new file mode 100644 index 0000000..4eed087 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/write.h @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2014 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef libmobi_write_h +#define libmobi_write_h + +#include "config.h" +#include "mobi.h" +#include "buffer.h" + + +#endif diff --git a/app/src/main/cpp/libmobi/src/xmlwriter.c b/app/src/main/cpp/libmobi/src/xmlwriter.c new file mode 100644 index 0000000..8c8fe4f --- /dev/null +++ b/app/src/main/cpp/libmobi/src/xmlwriter.c @@ -0,0 +1,918 @@ +/** @file xmlwriter.c + * @brief Implements a simplified subset of libxml2 functions used in libmobi. + * + * Copyright (c) 2016 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#define _GNU_SOURCE 1 +#ifndef __USE_BSD +#define __USE_BSD /* for strdup on linux/glibc */ +#endif + +#include +#include +#include "xmlwriter.h" +#include "debug.h" +#include "util.h" +#include "parse_rawml.h" + +#define MOBI_XML_BUFFERSIZE 4096 +#define MOBI_XML_STATESSIZE 200 +#define XML_ERROR -1 +#define XML_OK 0 + +/** + @brief Initiate xml states with first name and mode pair + + @param[in] name MOBIRawml State element name + @param[in] mode MOBIRawml State mode + @return New state + */ +static MOBIXmlState * mobi_xml_state_init(const char *name, const MOBI_XML_MODE mode) { + MOBIXmlState *curr = calloc(1, sizeof(MOBIXmlState)); + if (curr == NULL) { + return NULL; + } + curr->name = strdup(name); + if (curr->name == NULL) { + free(curr); + return NULL; + } + curr->mode = mode; + return curr; +} + +/** + @brief Get current active state from the list + + @param[in] writer xmlTextWriter + @return State + */ +static MOBIXmlState * mobi_xml_state_current(const xmlTextWriterPtr writer) { + return writer->states; +} + +/** + @brief Add new state to the list + + @param[in,out] writer xmlTextWriter + @param[in] name MOBIRawml State element name + @param[in] mode MOBIRawml State mode + @return Added state + */ +static MOBIXmlState * mobi_xml_state_push(xmlTextWriterPtr writer, const char *name, const MOBI_XML_MODE mode) { + MOBIXmlState *new = mobi_xml_state_init(name, mode); + MOBIXmlState *first = writer->states; + if (!first) { + writer->states = new; + } else { + new->next = first; + writer->states = new; + } + return writer->states; +} + +/** + @brief Remove state from the list + + @param[in] state State structure that will be deleted + @return Next state in the list or NULL if not present + */ +static MOBIXmlState * mobi_xml_state_del(MOBIXmlState *state) { + MOBIXmlState *del = state; + state = state->next; + free(del->name); + free(del); + del = NULL; + return state; +} + +/** + @brief Remove state from the beginning of the list + + @param[in,out] writer xmlTextWriter + @return Next state or NULL if not present + */ +static MOBIXmlState * mobi_xml_state_pop(xmlTextWriterPtr writer) { + writer->states = mobi_xml_state_del(writer->states); + return writer->states; +} + +/** + @brief Remove all states from the list + + @param[in,out] first First state from the list + */ +static void mobi_xml_state_delall(MOBIXmlState *first) { + while (first) { + first = mobi_xml_state_del(first); + } +} + +/** + @brief Get current level of nested element + + @param[in] writer xmlTextWriter + @return Level + */ +static size_t mobi_xml_level(const xmlTextWriterPtr writer) { + MOBIXmlState *curr = writer->states; + size_t level = 0; + while (curr) { + level++; + if (curr->next == NULL) { + break; + } + curr = curr->next; + } + return level; +} + +/** + @brief Write string to xml buffer + + @param[in,out] writer xmlTextWriter + @param[in] string String + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_xml_buffer_addstring(xmlTextWriterPtr writer, const char *string) { + if (writer == NULL || writer->xmlbuf == NULL || writer->xmlbuf->mobibuffer == NULL || string == NULL) { + return MOBI_INIT_FAILED; + } + MOBIBuffer *buf = writer->xmlbuf->mobibuffer; + mobi_buffer_addstring(buf, string); + if (buf->error == MOBI_BUFFER_END) { + mobi_buffer_resize(buf, buf->maxlen * 2); + if (buf->error != MOBI_SUCCESS) { + return buf->error; + } + /* update xmlbuf->content */ + writer->xmlbuf->content = writer->xmlbuf->mobibuffer->data; + mobi_xml_buffer_addstring(writer, string); + } + return buf->error; +} + +/** + @brief Write character to xml buffer + + @param[in,out] writer xmlTextWriter + @param[in] c Character + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_xml_buffer_addchar(xmlTextWriterPtr writer, const unsigned char c) { + if (writer == NULL || writer->xmlbuf == NULL || writer->xmlbuf->mobibuffer == NULL) { + return MOBI_INIT_FAILED; + } + MOBIBuffer *buf = writer->xmlbuf->mobibuffer; + mobi_buffer_add8(buf, c); + if (buf->error == MOBI_BUFFER_END) { + mobi_buffer_resize(buf, buf->maxlen * 2); + if (buf->error != MOBI_SUCCESS) { + return buf->error; + } + /* update xmlbuf->content */ + writer->xmlbuf->content = writer->xmlbuf->mobibuffer->data; + mobi_xml_buffer_addchar(writer, c); + } + return buf->error; +} + +/** + @brief Write terminating null character to xml buffer + + @param[in,out] writer xmlTextWriter + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_xml_buffer_flush(xmlTextWriterPtr writer) { + return mobi_xml_buffer_addchar(writer, '\0'); +} + +/** + @brief Write string with encoded reserved characters to xml buffer + + @param[in,out] writer xmlTextWriter + @param[in] string String + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_xml_buffer_addencoded(xmlTextWriterPtr writer, const char *string) { + if (string == NULL) { + return MOBI_INIT_FAILED; + } + MOBI_RET ret = MOBI_SUCCESS; + unsigned char *p = (unsigned char *)string; + unsigned char c; + while ((c = *p++)) { + switch (c) { + case '<': + ret = mobi_xml_buffer_addstring(writer, "<"); + break; + case '>': + ret = mobi_xml_buffer_addstring(writer, ">"); + break; + case '&': + ret = mobi_xml_buffer_addstring(writer, "&"); + break; + case '"': + ret = mobi_xml_buffer_addstring(writer, """); + break; + case '\r': + ret = mobi_xml_buffer_addstring(writer, " "); + break; + default: + ret = mobi_xml_buffer_addchar(writer, c); + break; + } + if (ret != MOBI_SUCCESS) { + break; + } + } + return ret; +} + +/** + @brief Write attribute value with encoded reserved characters to xml buffer + + @param[in,out] writer xmlTextWriter + @param[in] string String + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_xml_buffer_addencoded_attr(xmlTextWriterPtr writer, const char *string) { + if (string == NULL) { + return MOBI_INIT_FAILED; + } + MOBI_RET ret = MOBI_SUCCESS; + unsigned char *p = (unsigned char *)string; + unsigned char c; + while ((c = *p++)) { + switch (c) { + case '<': + ret = mobi_xml_buffer_addstring(writer, "<"); + break; + case '>': + ret = mobi_xml_buffer_addstring(writer, ">"); + break; + case '&': + ret = mobi_xml_buffer_addstring(writer, "&"); + break; + case '"': + ret = mobi_xml_buffer_addstring(writer, """); + break; + case '\r': + ret = mobi_xml_buffer_addstring(writer, " "); + break; + case '\n': + ret = mobi_xml_buffer_addstring(writer, " "); + break; + case '\t': + ret = mobi_xml_buffer_addstring(writer, " "); + break; + default: + ret = mobi_xml_buffer_addchar(writer, c); + break; + } + if (ret != MOBI_SUCCESS) { + break; + } + } + return ret; +} + +/** + @brief Write indent to xml buffer + + @param[in,out] writer xmlTextWriter + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_xml_write_indent(xmlTextWriterPtr writer) { + if (writer == NULL) { + debug_print("%s\n", "XML writer init failed"); + return MOBI_INIT_FAILED; + } + size_t levels_count = mobi_xml_level(writer); + if (levels_count > 0) { + /* don't indent first level */ + levels_count--; + } + MOBI_RET ret = MOBI_SUCCESS; + while (levels_count--) { + ret = mobi_xml_buffer_addchar(writer, ' '); + if (ret != MOBI_SUCCESS) { + break; + } + } + return ret; +} + +/** + @brief Write namespace declaration if needed + + @param[in,out] writer xmlTextWriter + */ +static void mobi_xml_write_ns(xmlTextWriterPtr writer) { + if (writer && writer->nsname && writer->nsvalue) { + xmlTextWriterWriteAttribute(writer, (unsigned char *) writer->nsname, (unsigned char *) writer->nsvalue); + free(writer->nsname); + writer->nsname = NULL; + free(writer->nsvalue); + writer->nsvalue = NULL; + } +} + +/** + @brief Save namespace declaration parameters + + @param[in,out] writer xmlTextWriter + @param[in] nsname NS attribute name + @param[in] nsvalue NS attribute value + @return MOBI_RET status code (on success MOBI_SUCCESS) + */ +static MOBI_RET mobi_xml_save_ns(xmlTextWriterPtr writer, const char *nsname, const char *nsvalue) { + /* Only one declaration should be enough for libmobi */ + if (writer && writer->nsname == NULL && writer->nsvalue == NULL) { + writer->nsname = strdup(nsname); + if (writer->nsname == NULL) { + return MOBI_MALLOC_FAILED; + } + writer->nsvalue = strdup(nsvalue); + if (writer->nsvalue == NULL) { + return MOBI_MALLOC_FAILED; + } + } + return MOBI_SUCCESS; +} + + +/* + + Libxml2 compatible functions + + */ + +/** + @brief Create xml buffer + + Libxml2 compatibility wrapper for MOBIBuffer structure. + Must be deallocated with xmlBufferFree + + @return Buffer pointer + */ +xmlBufferPtr xmlBufferCreate(void) { + xmlBufferPtr xmlbuf = NULL; + xmlbuf = malloc(sizeof(xmlBuffer)); + if (xmlbuf == NULL) { + debug_print("%s", "Buffer allocation failed\n"); + return NULL; + } + unsigned int size = MOBI_XML_BUFFERSIZE; + MOBIBuffer *buf = mobi_buffer_init(size); + if (buf == NULL) { + free(xmlbuf); + return NULL; + } + xmlbuf->content = buf->data; + xmlbuf->mobibuffer = buf; + return xmlbuf; +} + +/** + @brief Free XML buffer + + @param[in,out] buf XML buffer + */ +void xmlBufferFree(xmlBufferPtr buf) { + if (buf == NULL) { return; } + if (buf->mobibuffer != NULL) { + mobi_buffer_free(buf->mobibuffer); + } + free(buf); +} + +/** + @brief Initialize TextWriter structure + + @param[in] xmlbuf Initialized xml output buffer + @param[in] compression Unused + @return TextWriter pointer + */ +xmlTextWriterPtr xmlNewTextWriterMemory(xmlBufferPtr xmlbuf, int compression) { + UNUSED(compression); + if (xmlbuf == NULL) { + debug_print("%s", "XML buffer not initialized\n"); + return NULL; + } + xmlTextWriterPtr writer = NULL; + writer = malloc(sizeof(xmlTextWriter)); + if (writer == NULL) { + debug_print("%s", "XML writer allocation failed\n"); + return NULL; + } + writer->xmlbuf = xmlbuf; + writer->states = NULL; + writer->nsname = NULL; + writer->nsvalue = NULL; + writer->indent_enable = false; + writer->indent_next = false; + return writer; +} + +/** + @brief Deallocate TextWriter instance and all its resources + + @param[in,out] writer TextWriter + */ +void xmlFreeTextWriter(xmlTextWriterPtr writer) { + if (writer == NULL) { return; } + if (writer->states != NULL) { + mobi_xml_state_delall(writer->states); + writer->states = NULL; + } + free(writer->nsname); + free(writer->nsvalue); + free(writer); +} + +/** + @brief Start xml document + + Only utf-8 encoding supported. + + @param[in] writer TextWriter + @param[in] version Value of version attribute, "1.0" if NULL + @param[in] encoding Unused, defaults to utf-8 + @param[in] standalone Unused, omitted in declaration + @return TextWriter pointer + */ +int xmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version, + const char *encoding, const char *standalone) { + UNUSED(encoding); + UNUSED(standalone); + if (writer == NULL) { + debug_print("%s\n", "XML writer init failed"); + return XML_ERROR; + } + if (mobi_xml_level(writer) > 0) { + debug_print("%s\n", "XML document already started"); + return XML_ERROR; + } + MOBI_RET ret = mobi_xml_buffer_addstring(writer, "\n"); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + return XML_OK; +} + +/** + @brief End xml document + + All open elements will be closed. + xmlBuffer will be flushed. + + @param[in] writer TextWriter + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterEndDocument(xmlTextWriterPtr writer) { + if (writer == NULL) { + debug_print("%s\n", "XML writer init failed"); + return XML_ERROR; + } + MOBIXmlState *state = NULL; + while((state = mobi_xml_state_current(writer))) { + switch (state->mode) { + case MOBI_XMLMODE_NAME: + case MOBI_XMLMODE_ATTR: + case MOBI_XMLMODE_TEXT: + xmlTextWriterEndElement(writer); + break; + + default: + break; + } + } + MOBI_RET ret; + if (!writer->indent_enable) { + ret = mobi_xml_buffer_addstring(writer, "\n"); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + } + ret = mobi_xml_buffer_flush(writer); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + return XML_OK; +} + +/** + @brief Start xml element + + @param[in,out] writer TextWriter + @param[in] name Element name + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar *name) { + if (writer == NULL || name == NULL || *name == '\0') { + debug_print("%s\n", "XML writer init failed"); + return XML_ERROR; + } + MOBI_RET ret = MOBI_SUCCESS; + MOBIXmlState *state = mobi_xml_state_current(writer); + if (state) { + switch (state->mode) { + case MOBI_XMLMODE_ATTR: + if (xmlTextWriterEndAttribute(writer) == XML_ERROR) { return XML_ERROR; } + /* fallthrough */ + case MOBI_XMLMODE_NAME: + /* TODO: output ns declarations */ + mobi_xml_write_ns(writer); + ret = mobi_xml_buffer_addstring(writer, ">"); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + if (writer->indent_enable) { + ret = mobi_xml_buffer_addstring(writer, "\n"); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + } + state->mode = MOBI_XMLMODE_TEXT; + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + break; + + default: + break; + } + } + mobi_xml_state_push(writer, (char *) name, MOBI_XMLMODE_NAME); + if (writer->indent_enable) { + ret = mobi_xml_write_indent(writer); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + } + ret = mobi_xml_buffer_addstring(writer, "<"); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + ret = mobi_xml_buffer_addstring(writer, (const char *) name); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + return XML_OK; +} + +/** + @brief End current element + + @param[in] writer TextWriter + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterEndElement(xmlTextWriterPtr writer) { + if (writer == NULL) { + debug_print("%s\n", "XML writer init failed"); + return XML_ERROR; + } + MOBI_RET ret = MOBI_SUCCESS; + MOBIXmlState *state = mobi_xml_state_current(writer); + if (state == NULL) { return XML_ERROR; } + switch (state->mode) { + case MOBI_XMLMODE_ATTR: + if (xmlTextWriterEndAttribute(writer) == XML_ERROR) { return XML_ERROR; } + mobi_xml_state_pop(writer); + /* fallthrough */ + case MOBI_XMLMODE_NAME: + /* output namespace declarations */ + mobi_xml_write_ns(writer); + if (writer->indent_enable) { + writer->indent_next = true; + } + ret = mobi_xml_buffer_addstring(writer, "/>"); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + break; + case MOBI_XMLMODE_TEXT: + if (writer->indent_enable && writer->indent_next) { + ret = mobi_xml_write_indent(writer); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + writer->indent_next = true; + } else { + writer->indent_next = true; + } + ret = mobi_xml_buffer_addstring(writer, "name); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + ret = mobi_xml_buffer_addstring(writer, ">"); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + break; + + default: + break; + } + if (writer->indent_enable) { + ret = mobi_xml_buffer_addstring(writer, "\n"); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + } + mobi_xml_state_pop(writer); + return XML_OK; +} + +/** + @brief Start attribute for current xml element + + @param[in,out] writer TextWriter + @param[in] name Attribute name + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterStartAttribute(xmlTextWriterPtr writer, const xmlChar *name) { + if (writer == NULL) { + debug_print("%s\n", "XML writer init failed"); + return XML_ERROR; + } + if (name == NULL || *name == '\0') { + debug_print("%s\n", "XML writer init failed"); + return XML_ERROR; + } + MOBI_RET ret = MOBI_SUCCESS; + MOBIXmlState *state = mobi_xml_state_current(writer); + if (state) { + switch (state->mode) { + case MOBI_XMLMODE_ATTR: + if (xmlTextWriterEndAttribute(writer) == XML_ERROR) { return XML_ERROR; } + /* fallthrough */ + case MOBI_XMLMODE_NAME: + ret = mobi_xml_buffer_addstring(writer, " "); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + ret = mobi_xml_buffer_addstring(writer, (const char *) name); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + ret = mobi_xml_buffer_addstring(writer, "=\""); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + state->mode = MOBI_XMLMODE_ATTR; + break; + + default: + return XML_ERROR; + } + } + return XML_OK; +} + +/** + @brief End current attribute + + @param[in,out] writer TextWriter + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterEndAttribute(xmlTextWriterPtr writer) { + if (writer == NULL) { + debug_print("%s\n", "XML writer init failed"); + return XML_ERROR; + } + MOBI_RET ret = MOBI_SUCCESS; + MOBIXmlState *state = mobi_xml_state_current(writer); + if (state) { + switch (state->mode) { + case MOBI_XMLMODE_ATTR: + state->mode = MOBI_XMLMODE_NAME; + ret = mobi_xml_buffer_addstring(writer, "\""); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + break; + + default: + return XML_ERROR; + } + } + return XML_OK; +} + +/** + @brief Write attribute with given name and content + + @param[in,out] writer TextWriter + @param[in] name Attribute name + @param[in] content Attribute content + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar *name, + const xmlChar * content) { + if (xmlTextWriterStartAttribute(writer, name) == XML_ERROR) { return XML_ERROR; } + if (xmlTextWriterWriteString(writer, content) == XML_ERROR) { return XML_ERROR; } + if (xmlTextWriterEndAttribute(writer) == XML_ERROR) { return XML_ERROR; } + return XML_OK; +} + +/** + @brief Start attribute with namespace support for current xml element + + @param[in,out] writer TextWriter + @param[in] prefix Namespace prefix or NULL + @param[in] name Attribute name + @param[in] namespaceURI Namespace uri or NULL + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterStartAttributeNS(xmlTextWriterPtr writer, + const xmlChar *prefix, const xmlChar *name, + const xmlChar *namespaceURI) { + if (writer == NULL || name == NULL || *name == '\0') { + debug_print("%s\n", "XML writer init failed"); + return XML_ERROR; + } + if (namespaceURI != NULL) { + char namespace[] = "xmlns"; + if (prefix != NULL) { + size_t length = sizeof(namespace) - 1 + strlen((char *) prefix) + 1; /* add one for ":" */ + char *prefixed = malloc(length + 1); + if (prefixed == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return XML_ERROR; + } + snprintf(prefixed, length + 1, "%s:%s", namespace, prefix); + MOBI_RET ret = mobi_xml_save_ns(writer, prefixed, (char *) namespaceURI); + free(prefixed); + if (ret != MOBI_SUCCESS) { + return XML_ERROR; + } + } else { + MOBI_RET ret = mobi_xml_save_ns(writer, namespace, (char *) namespaceURI); + if (ret != MOBI_SUCCESS) { + return XML_ERROR; + } + } + + } + if (prefix != NULL) { + size_t length = strlen((char *) prefix) + strlen((char *) name) + 1; /* add one for ":" */ + char *prefixed = malloc(length + 1); + if (prefixed == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return XML_ERROR; + } + snprintf(prefixed, length + 1, "%s:%s", prefix, name); + int ret = xmlTextWriterStartAttribute(writer, (xmlChar *)prefixed); + free(prefixed); + if (ret == XML_ERROR) { + return XML_ERROR; + } + } else { + int ret = xmlTextWriterStartAttribute(writer, name); + if (ret == XML_ERROR) { + return XML_ERROR; + } + } + return XML_OK; +} + +/** + @brief Write attribute with namespace support + + @param[in,out] writer TextWriter + @param[in] prefix Namespace prefix or NULL + @param[in] name Attribute name + @param[in] namespaceURI Namespace uri or NULL + @param[in] content Attribute content + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer, + const xmlChar *prefix, const xmlChar *name, + const xmlChar *namespaceURI, + const xmlChar *content) { + + if (xmlTextWriterStartAttributeNS(writer, prefix, name, namespaceURI) == XML_ERROR) { return XML_ERROR; } + if (xmlTextWriterWriteString(writer, content) == XML_ERROR) { return XML_ERROR; } + if (xmlTextWriterEndAttribute(writer) == XML_ERROR) { return XML_ERROR; } + return XML_OK; +} + +/** + @brief Start element with namespace support + + @param[in,out] writer TextWriter + @param[in] prefix Namespace prefix or NULL + @param[in] name Element name + @param[in] namespaceURI Namespace uri or NULL + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterStartElementNS(xmlTextWriterPtr writer, + const xmlChar *prefix, const xmlChar *name, + const xmlChar *namespaceURI) { + if (writer == NULL || name == NULL || *name == '\0') { + debug_print("%s\n", "XML writer init failed"); + return XML_ERROR; + } + if (prefix != NULL) { + size_t length = strlen((char *) prefix) + strlen((char *) name) + 1; + char *prefixed = malloc(length + 1); + if (prefixed == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return XML_ERROR; + } + snprintf(prefixed, length + 1, "%s:%s", prefix, name); + int ret = xmlTextWriterStartElement(writer, (xmlChar *)prefixed); + free(prefixed); + if (ret == XML_ERROR) { return XML_ERROR; } + } else { + if (xmlTextWriterStartElement(writer, name) == XML_ERROR) { return XML_ERROR; } + } + if (namespaceURI != NULL) { + char namespace[] = "xmlns"; + if (prefix != NULL) { + size_t length = sizeof(namespace) - 1 + strlen((char *) prefix) + 1; + char *prefixed = malloc(length + 1); + if (prefixed == NULL) { + debug_print("%s\n", "Memory allocation failed"); + return XML_ERROR; + } + snprintf(prefixed, length + 1, "%s:%s", namespace, prefix); + MOBI_RET ret = mobi_xml_save_ns(writer, prefixed, (char *) namespaceURI); + free(prefixed); + if (ret != MOBI_SUCCESS) { + return XML_ERROR; + } + } else { + MOBI_RET ret = mobi_xml_save_ns(writer, namespace, (char *) namespaceURI); + if (ret != MOBI_SUCCESS) { + return XML_ERROR; + } + } + } + return XML_OK; +} + +/** + @brief Write element with namespace support + + @param[in,out] writer TextWriter + @param[in] prefix Namespace prefix or NULL + @param[in] name Element name + @param[in] namespaceURI Namespace uri or NULL + @param[in] content Element content + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterWriteElementNS(xmlTextWriterPtr writer, const xmlChar *prefix, + const xmlChar *name, const xmlChar *namespaceURI, + const xmlChar *content) { + if (xmlTextWriterStartElementNS(writer, prefix, name, namespaceURI) == XML_ERROR) { return XML_ERROR; } + if (xmlTextWriterWriteString(writer, content) == XML_ERROR) { return XML_ERROR; } + if (xmlTextWriterEndElement(writer) == XML_ERROR) { return XML_ERROR; } + return XML_OK; +} + +/** + @brief Write xml string + + @param[in,out] writer TextWriter + @param[in] content Attribute content + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar *content) { + if (writer == NULL || content == NULL) { + debug_print("%s\n", "XML writer init failed"); + return XML_ERROR; + } + MOBI_RET ret = MOBI_SUCCESS; + MOBI_XML_MODE mode = MOBI_XMLMODE_NONE; + MOBIXmlState *state = mobi_xml_state_current(writer); + if (state != NULL) { + mode = state->mode; + } + switch (mode) { + case MOBI_XMLMODE_NAME: + // output namespace decl + mobi_xml_write_ns(writer); + ret = mobi_xml_buffer_addstring(writer, ">"); + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + state->mode = MOBI_XMLMODE_TEXT; + /* fallthrough */ + case MOBI_XMLMODE_TEXT: + ret = mobi_xml_buffer_addencoded(writer, (const char *) content); + if (writer->indent_enable) { + writer->indent_next = false; + } + break; + case MOBI_XMLMODE_ATTR: + ret = mobi_xml_buffer_addencoded_attr(writer, (const char *) content); + break; + + default: + ret = mobi_xml_buffer_addstring(writer, (const char *) content); + if (writer->indent_enable) { + writer->indent_next = false; + } + break; + } + if (ret != MOBI_SUCCESS) { return XML_ERROR; } + return XML_OK; +} + +/** + @brief Set indentation option + + @param[in,out] writer TextWriter + @param[in] indent Indent output if value greater than zero + @return XML_OK (0) on success, XML_ERROR (-1) on failure + */ +int xmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent) { + if (writer == NULL) { + debug_print("%s\n", "XML writer init failed"); + return XML_ERROR; + } + writer->indent_enable = (indent != 0); + writer->indent_next = true; + return XML_OK; +} diff --git a/app/src/main/cpp/libmobi/src/xmlwriter.h b/app/src/main/cpp/libmobi/src/xmlwriter.h new file mode 100644 index 0000000..72a2059 --- /dev/null +++ b/app/src/main/cpp/libmobi/src/xmlwriter.h @@ -0,0 +1,94 @@ +/** @file xmlwriter.h + * + * Copyright (c) 2016 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * This file is part of libmobi. + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef mobi_minixml_h +#define mobi_minixml_h + +#include +#include "buffer.h" +#include "structure.h" + +#define BAD_CAST (xmlChar *) +#define LIBXML_TEST_VERSION + +#define xmlCleanupParser() + +typedef unsigned char xmlChar; + +/** + @brief Buffer for xml output. + For libxml2 compatibility, it is a wrapper for MOBIBuffer + */ +typedef struct { + xmlChar *content; /**< Points to mobibuffer->data */ + MOBIBuffer *mobibuffer; /**< Dynamic buffer */ +} xmlBuffer; +typedef xmlBuffer *xmlBufferPtr; + +/** + @brief Xml writer states + */ +typedef enum { + MOBI_XMLMODE_NONE = 0, + MOBI_XMLMODE_NAME, + MOBI_XMLMODE_ATTR, + MOBI_XMLMODE_TEXT +} MOBI_XML_MODE; + +/** + @brief Xml writer states list structure + First element in the list is currently processed element. + Last element is root of the document + */ +typedef struct MOBIXmlState { + char *name; /**< Element name */ + MOBI_XML_MODE mode; /**< State mode */ + struct MOBIXmlState *next; /**< Next list item */ +} MOBIXmlState; + +/** + @brief Xml TextWriter structure + */ +typedef struct { + xmlBufferPtr xmlbuf; /**< XML buffer */ + MOBIXmlState *states; /**< TextWriter states list */ + char *nsname; /**< Namespace attribute name */ + char *nsvalue; /**< Namespace attribute value */ + bool indent_enable; /**< Enable indentation */ + bool indent_next; /**< Indentation needed */ +} xmlTextWriter; +typedef xmlTextWriter *xmlTextWriterPtr; + +xmlBufferPtr xmlBufferCreate(void); +void xmlBufferFree(xmlBufferPtr buf); +xmlTextWriterPtr xmlNewTextWriterMemory(xmlBufferPtr xmlbuf, int compression); +void xmlFreeTextWriter(xmlTextWriterPtr writer); +int xmlTextWriterStartDocument(xmlTextWriterPtr writer, const char *version, + const char *encoding, const char *standalone); +int xmlTextWriterEndDocument(xmlTextWriterPtr writer); +int xmlTextWriterStartElement(xmlTextWriterPtr writer, const xmlChar *name); +int xmlTextWriterEndElement(xmlTextWriterPtr writer); +int xmlTextWriterWriteAttribute(xmlTextWriterPtr writer, const xmlChar *name, + const xmlChar *content); +int xmlTextWriterEndAttribute(xmlTextWriterPtr writer); +int xmlTextWriterWriteAttributeNS(xmlTextWriterPtr writer, + const xmlChar * prefix, const xmlChar * name, + const xmlChar * namespaceURI, + const xmlChar * content); +int xmlTextWriterStartElementNS(xmlTextWriterPtr writer, + const xmlChar *prefix, const xmlChar *name, + const xmlChar * namespaceURI); +int xmlTextWriterWriteElementNS(xmlTextWriterPtr writer, const xmlChar *prefix, + const xmlChar *name, const xmlChar *namespaceURI, + const xmlChar *content); +int xmlTextWriterWriteString(xmlTextWriterPtr writer, const xmlChar *content); +int xmlTextWriterSetIndent(xmlTextWriterPtr writer, int indent); + +#endif diff --git a/app/src/main/cpp/libmobi/tests/Makefile.am b/app/src/main/cpp/libmobi/tests/Makefile.am new file mode 100644 index 0000000..36b0363 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/Makefile.am @@ -0,0 +1,42 @@ +# Parallel tests suite + +# Files for testing should be placed in samples directory. +# Normal files must have ".mobi" extension. +# Files that are expected to fail the tests should have ".fail" extension. +# Test script will try to recreate markup sources and dump rawml file. +# Script may additionally check md5 checksums of the produced output. +# In order to enable md5 verification files with checksums must be present in md5 directory. +# Name of the file with md5 checksums is md5 checksum of the sample file plus +# suffix "_rawml" for rawml checksum and "_markup" for all markup files checksums. +# Re-run ./configure after adding new samples + +# Exclude large samples from dist package +EXTRA_DIST = md5 \ + samples/sample-cp1252.mobi \ + samples/sample-dict-infl2.mobi \ + samples/sample-drm_pidLTKULBB^5V-v2.mobi \ + samples/sample-drm-v1.mobi \ + samples/sample-multimedia.mobi \ + samples/sample-ncx.mobi \ + samples/sample-obfuscated-fonts.mobi \ + samples/sample-textread.mobi \ + samples/sample-unicode-huffdic.mobi \ + samples/sample-unicode-uncompressed.mobi \ + samples/sample-invalid-indx.fail +AUTOMAKE_OPTIONS = parallel-tests +TESTS = @TESTLIST@ +XFAIL_TESTS = @FAILLIST@ +TEST_EXTENSIONS = .mobi .fail +MOBI_LOG_COMPILER = ./test.sh +FAIL_LOG_COMPILER = ./test.sh + +clean-local: + -rm -rf tmp + +all-local: + @if test x@RUN_TESTS@ = xno; then \ + echo "============================================================================"; \ + echo "WARNING: All tests will be skipped, because bash was not found in your PATH."; \ + echo " Please install bash and rerun configure script."; \ + echo "============================================================================"; \ + fi diff --git a/app/src/main/cpp/libmobi/tests/md5/1cddff555949348d7ca76c367e01b90a_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/1cddff555949348d7ca76c367e01b90a_markup.md5 new file mode 100644 index 0000000..35b9706 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/1cddff555949348d7ca76c367e01b90a_markup.md5 @@ -0,0 +1,6 @@ +4a7d6afd2ce8bac1333c6d46f74773a4 part00000.html +0945cf5525eab95452b12e396d4f5ae4 resource00000.jpg +0945cf5525eab95452b12e396d4f5ae4 resource00001.jpg +90fdcc4e447f9e8babb418e9a8677311 resource00002.jpg +62a722e40769ec8b222b6c788b8f3463 resource00003.ncx +e2ba461f8530066d31572a57dde6129a resource00004.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/1cddff555949348d7ca76c367e01b90a_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/1cddff555949348d7ca76c367e01b90a_rawml.md5 new file mode 100644 index 0000000..34168cd --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/1cddff555949348d7ca76c367e01b90a_rawml.md5 @@ -0,0 +1 @@ +9f397e35c0608a9777e02efa416665a0 diff --git a/app/src/main/cpp/libmobi/tests/md5/25f2ef9bd45ffa68e8eaf6ecad0ca5a4_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/25f2ef9bd45ffa68e8eaf6ecad0ca5a4_markup.md5 new file mode 100644 index 0000000..e7408bc --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/25f2ef9bd45ffa68e8eaf6ecad0ca5a4_markup.md5 @@ -0,0 +1,6 @@ +5af19c35a5bcc1443bd661f4d226ea27 part00000.html +2eb4a36ae5534b3e0d976ddc459d209a resource00000.jpg +7ab80fa12ddee2f2bfc16498da537028 resource00001.jpg +688aeffb0a078da56295bbc37ab2d28d resource00002.jpg +a480fcdcf016467f646f283140457d1c resource00003.ncx +2815cf0ccbf3acbbb2649200f337567a resource00004.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/25f2ef9bd45ffa68e8eaf6ecad0ca5a4_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/25f2ef9bd45ffa68e8eaf6ecad0ca5a4_rawml.md5 new file mode 100644 index 0000000..067b063 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/25f2ef9bd45ffa68e8eaf6ecad0ca5a4_rawml.md5 @@ -0,0 +1 @@ +14118d6e0c526b307b94cec17d8d5395 diff --git a/app/src/main/cpp/libmobi/tests/md5/29876458364495f42187000189b6b15b_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/29876458364495f42187000189b6b15b_markup.md5 new file mode 100644 index 0000000..24f5d57 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/29876458364495f42187000189b6b15b_markup.md5 @@ -0,0 +1,5 @@ +72912a00456b9b3c194de09e651c70bc part00000.html +b19e40b775c1727a8ff0311caeb5b098 part00001.html +1ea860339fc7c535a801566dea0d5901 part00002.html +547d4f2b211ddabc77fe1db54143b087 resource00000.ncx +70b805f6b13dd9366bfc0d94c2f4f785 resource00001.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/29876458364495f42187000189b6b15b_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/29876458364495f42187000189b6b15b_rawml.md5 new file mode 100644 index 0000000..885c048 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/29876458364495f42187000189b6b15b_rawml.md5 @@ -0,0 +1 @@ +448a891b3bd94fb78045704fbb5988cc diff --git a/app/src/main/cpp/libmobi/tests/md5/31c42c70c3503fde5353c89ffa4e67ea_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/31c42c70c3503fde5353c89ffa4e67ea_markup.md5 new file mode 100644 index 0000000..7493f7e --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/31c42c70c3503fde5353c89ffa4e67ea_markup.md5 @@ -0,0 +1,8 @@ +f03d1a71d2ef80b53d9d48823e2aad2d part00000.html +dd2fab65a653934d60369b0f9c4b84ee resource00000.jpg +48e11be0e511cd31d5c1aca1dc52a644 resource00001.jpg +8bf1a77a6df6333344bc0a97012d8ccb resource00002.jpg +bf2727a10ab068bb5d3eafa0b7ace4e0 resource00004.jpg +bbc069268a93c1153286924bf72a82b1 resource00005.jpg +b898ff28a9c8236ea6fdc41aadadd527 resource00006.ncx +3e5ae3fdd385fc6c9e7e592e66e5e255 resource00007.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/31c42c70c3503fde5353c89ffa4e67ea_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/31c42c70c3503fde5353c89ffa4e67ea_rawml.md5 new file mode 100644 index 0000000..9a563ca --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/31c42c70c3503fde5353c89ffa4e67ea_rawml.md5 @@ -0,0 +1 @@ +c4158a8a1cf16101dd6ceeee53b6aef1 diff --git a/app/src/main/cpp/libmobi/tests/md5/3248d6140918d441d8050861a05a85cb_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/3248d6140918d441d8050861a05a85cb_markup.md5 new file mode 100644 index 0000000..89893b8 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/3248d6140918d441d8050861a05a85cb_markup.md5 @@ -0,0 +1,4 @@ +51d871a7dd9269977d26d8d3c48ca2d6 part00000.html +3eb21f0515c65686a1339136bd70fc67 resource00025.bmp +df1392d0768b9aa2a359af03f91224ed resource00026.ncx +7c12f209822e2566e66173d1bfb74edf resource00027.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/3248d6140918d441d8050861a05a85cb_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/3248d6140918d441d8050861a05a85cb_rawml.md5 new file mode 100644 index 0000000..f780975 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/3248d6140918d441d8050861a05a85cb_rawml.md5 @@ -0,0 +1 @@ +a644174e53c23cd0ac108b91200e0ff7 diff --git a/app/src/main/cpp/libmobi/tests/md5/520361f44c43edfae98f44cbf57b3fce_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/520361f44c43edfae98f44cbf57b3fce_markup.md5 new file mode 100644 index 0000000..e7408bc --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/520361f44c43edfae98f44cbf57b3fce_markup.md5 @@ -0,0 +1,6 @@ +5af19c35a5bcc1443bd661f4d226ea27 part00000.html +2eb4a36ae5534b3e0d976ddc459d209a resource00000.jpg +7ab80fa12ddee2f2bfc16498da537028 resource00001.jpg +688aeffb0a078da56295bbc37ab2d28d resource00002.jpg +a480fcdcf016467f646f283140457d1c resource00003.ncx +2815cf0ccbf3acbbb2649200f337567a resource00004.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/520361f44c43edfae98f44cbf57b3fce_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/520361f44c43edfae98f44cbf57b3fce_rawml.md5 new file mode 100644 index 0000000..067b063 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/520361f44c43edfae98f44cbf57b3fce_rawml.md5 @@ -0,0 +1 @@ +14118d6e0c526b307b94cec17d8d5395 diff --git a/app/src/main/cpp/libmobi/tests/md5/53eac2194ef1addee323d2a7d149ddff_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/53eac2194ef1addee323d2a7d149ddff_markup.md5 new file mode 100644 index 0000000..5cf684a --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/53eac2194ef1addee323d2a7d149ddff_markup.md5 @@ -0,0 +1,9446 @@ +7bcb1e5a7a4595021518beb56904f665 flow00001.html +d345327dc30ddc88c3732fa56f50239f flow00002.html +07c5b45e3d9667bf6ed497f4548b589c flow00003.html +07c5b45e3d9667bf6ed497f4548b589c flow00004.html +7bcb1e5a7a4595021518beb56904f665 flow00005.html +d345327dc30ddc88c3732fa56f50239f flow00006.html +07c5b45e3d9667bf6ed497f4548b589c flow00007.html +07c5b45e3d9667bf6ed497f4548b589c flow00008.html +7bcb1e5a7a4595021518beb56904f665 flow00009.html +d345327dc30ddc88c3732fa56f50239f flow00010.html +7bcb1e5a7a4595021518beb56904f665 flow00011.html +d345327dc30ddc88c3732fa56f50239f flow00012.html +7bcb1e5a7a4595021518beb56904f665 flow00013.html +d345327dc30ddc88c3732fa56f50239f flow00014.html +7bcb1e5a7a4595021518beb56904f665 flow00015.html +d345327dc30ddc88c3732fa56f50239f flow00016.html +7bcb1e5a7a4595021518beb56904f665 flow00017.html +d345327dc30ddc88c3732fa56f50239f flow00018.html +7bcb1e5a7a4595021518beb56904f665 flow00019.html +d345327dc30ddc88c3732fa56f50239f flow00020.html +7bcb1e5a7a4595021518beb56904f665 flow00021.html +d345327dc30ddc88c3732fa56f50239f flow00022.html +7bcb1e5a7a4595021518beb56904f665 flow00023.html +d345327dc30ddc88c3732fa56f50239f flow00024.html +7bcb1e5a7a4595021518beb56904f665 flow00025.html +d345327dc30ddc88c3732fa56f50239f flow00026.html +7bcb1e5a7a4595021518beb56904f665 flow00027.html +d345327dc30ddc88c3732fa56f50239f flow00028.html +7bcb1e5a7a4595021518beb56904f665 flow00029.html +d345327dc30ddc88c3732fa56f50239f flow00030.html +7bcb1e5a7a4595021518beb56904f665 flow00031.html +d345327dc30ddc88c3732fa56f50239f flow00032.html +7bcb1e5a7a4595021518beb56904f665 flow00033.html +d345327dc30ddc88c3732fa56f50239f flow00034.html +7bcb1e5a7a4595021518beb56904f665 flow00035.html +d345327dc30ddc88c3732fa56f50239f flow00036.html +7bcb1e5a7a4595021518beb56904f665 flow00037.html +d345327dc30ddc88c3732fa56f50239f flow00038.html +7bcb1e5a7a4595021518beb56904f665 flow00039.html +d345327dc30ddc88c3732fa56f50239f flow00040.html +7bcb1e5a7a4595021518beb56904f665 flow00041.html +d345327dc30ddc88c3732fa56f50239f flow00042.html +7bcb1e5a7a4595021518beb56904f665 flow00043.html +d345327dc30ddc88c3732fa56f50239f flow00044.html +7bcb1e5a7a4595021518beb56904f665 flow00045.html +d345327dc30ddc88c3732fa56f50239f flow00046.html +7bcb1e5a7a4595021518beb56904f665 flow00047.html +d345327dc30ddc88c3732fa56f50239f flow00048.html +7bcb1e5a7a4595021518beb56904f665 flow00049.html +d345327dc30ddc88c3732fa56f50239f flow00050.html +7bcb1e5a7a4595021518beb56904f665 flow00051.html +d345327dc30ddc88c3732fa56f50239f flow00052.html +7bcb1e5a7a4595021518beb56904f665 flow00053.html +d345327dc30ddc88c3732fa56f50239f flow00054.html +7bcb1e5a7a4595021518beb56904f665 flow00055.html +d345327dc30ddc88c3732fa56f50239f flow00056.html +7bcb1e5a7a4595021518beb56904f665 flow00057.html +d345327dc30ddc88c3732fa56f50239f flow00058.html +2bbd8dac58f8ff6e85c779131b108131 flow00059.html +0cc04ae3977625a30c22bd89a85c4cd5 flow00060.html +7bcb1e5a7a4595021518beb56904f665 flow00061.html +d345327dc30ddc88c3732fa56f50239f flow00062.html +07c5b45e3d9667bf6ed497f4548b589c flow00063.html +07c5b45e3d9667bf6ed497f4548b589c flow00064.html +81c0a2262036a3c60fbcd84971e9ed4c part00000.html +e83eaa95bf982ee9aa5221eb98e41590 resource00000.gif +687cca8148caa1cab758fb93cc6de6cc resource00001.gif +86fc9708711db521c0eccf76aa3e1394 resource00002.gif +efa20fa0be0dc4cddddf421f80dc3903 resource00003.gif +8ba740845e6e8ed4770459c5627d5c04 resource00004.gif +0bf7515153937edda2c7f37de8ac9d0b resource00005.gif +82bba15229dfbd644cd4cd2232625f42 resource00006.gif +0fa51c09f4c779a4a9158e8a99318545 resource00007.gif +9a5546e28182d68805c030debde052bc resource00008.gif +492e38ed374c985d5704c998bc815bf4 resource00009.gif +ab940aa42d687489c6fbc61ded2e1156 resource00010.gif +8e7903e11a91b9fa8f4b5a500a205948 resource00011.gif +2f7f1275e91715cc531d85cff3fcf32f resource00012.gif +712c8d7ea6e0e6e674fb375ffc86ecb4 resource00013.gif +712c8d7ea6e0e6e674fb375ffc86ecb4 resource00014.gif +55240db0aa2718c39f578b4c2a62010b resource00015.gif +55240db0aa2718c39f578b4c2a62010b resource00016.gif +2185acb39cd479b4d7f767a18e336ae4 resource00017.gif +1aea5bea3ccf5ab5f631451cffc8f591 resource00018.gif +65f0167eaf23f7b3b228a7a0b8eda749 resource00019.gif +2a6fa8ca2af97fcb2b43aa2bc6f6aece resource00020.gif +802d4916230f5c9de762263464744765 resource00021.gif +fd185b8a77eec39e8abb102b84bfdccc resource00022.gif +ae267e72c3517dee7b7f02f63d1af5c4 resource00023.gif +dae2cd4c1822994bc05494e96ea50de7 resource00024.gif +802d4916230f5c9de762263464744765 resource00025.gif +4e6b4eae1d83bd979e0d9c2e6e120752 resource00026.gif +a716822b22caa08ba1c8dd679dd372a4 resource00027.gif +c5f00ee01035aeeafe180f3b29169a11 resource00028.gif +98c519006b2dadd7e6ec950a71d8c346 resource00029.gif +9abf6d355ee6929342a6b9b6fd4c75c9 resource00030.gif +1d87b64206223da6930ad9bd0a1edfc5 resource00031.gif +ea2c9f1efc7c07d9b3513a5c55bb14aa resource00032.gif +b269864e617b05abeb3837fdb5a075c4 resource00033.gif +5f9c19a056177de66809d304b62b6ed1 resource00034.gif +dae8e9d17dae3e0a0ae796a8e8c3ec48 resource00035.gif +eb99b3d10a392ad61352454b60525faa resource00036.gif +de26fc318172a5f0a6e3761b55fde92d resource00037.gif +c722ba00788f852974cf0c5f2eb3404c resource00038.gif +9101d7c5ae2f89e07cdbe9702e436f7d resource00039.gif +9de40d1c7198f4df45eca8344c3987cd resource00040.gif +e960a286a3dfba0253ef6fb9f2be121e resource00041.gif +3c7d00822f512e48d9e5697fb35ae6c6 resource00042.gif +a93ed3a821b20f66bec4f500c5cdbe05 resource00043.gif +8fe28ed37ebc3d97eaffe98fb93cab25 resource00044.gif +2552080c1e0715296a9aa30e5778bc94 resource00045.gif +d2d631d013c70eba3d1f65acf9ce0962 resource00046.gif +81d952a703340fb64107a3023d5d77e8 resource00047.gif +ef7575c1b516f46a2f6c95c3782d16d5 resource00048.gif +55c03d97be7da3e29dcbced36e5a4c6a resource00049.gif +293598fcd6fa0054c530d7282850083c resource00050.gif +ccd91ff657528598a0d9c2b61ce95a33 resource00051.gif +ae758880be74abaffd6d2fd0dd5c802e resource00052.gif +bfc2c763b640d0416fbd15a27d40dbb3 resource00053.gif +281b4ac57374b4f4f0357adce0bc49e5 resource00054.gif +fa7d6c031c4d96c78c8c2fd36192d817 resource00055.gif +5a446a7d6721e7296503ddb0bcb83238 resource00056.gif +cbce897746c35ac8e31f20717ce6f494 resource00057.gif +ecf9784d6f74ba133e82528d03467d0a resource00058.gif +449cffc8d96deb76f23642850c90a8f8 resource00059.gif +85462a9ebb0d2c19d1d7f4ed5406c754 resource00060.gif +1efb3f21f4cecae5c557c6bff646fe44 resource00061.gif +8ae2a12526852423b11f6bfbba83a5ae resource00062.gif +6e237ae82db2c6e80e4978e7b8061a68 resource00063.gif +2590fd9773c273430439e816547301c3 resource00064.gif +9807c4474c6d7ab9bed5d939cb498224 resource00065.gif +e18a586f83f9e62ebf013a69bb85e97d resource00066.gif +2d1f4231e06a58b0274826e35c5c4673 resource00067.gif +a949db9b0a1b6bedfd077a952a52a77e resource00068.gif +e75f7d5728ae171ca0ee0fe6c6f3798d resource00069.gif +d35a1cb79b0ad336fbbda0328671e1ef resource00070.gif +825dde7e4cd0ed5e970cf1ca3d1d02f1 resource00071.gif +aa48814aabb2338be684a8b60cd4a7a0 resource00072.gif +c76a5abd1aeccf6905d580847052536e resource00073.gif +603878ead8e88386c5152b3d18d5f8f4 resource00074.gif +bd4b290b40c32fb3c3a5f8b7656edfed resource00075.gif +123e9ea2952aa7a3fd9031b25a1cc428 resource00076.gif +547f3efa163184fc93d5cd0718842433 resource00077.gif +4efc616940165a2ceb779d03c3a5560f resource00078.gif +3a309da532001b1a150d324ce8f168fc resource00079.gif +d4c2cb7d779bbafbd5727ac0b74f7e61 resource00080.gif +86d413c51ef83cbaebb0b09398d91aed resource00081.gif +25550b3949aae2e2abc145c503a5915e resource00082.gif +edbdcfba0116c71db19b4daf72a5d4c5 resource00083.gif +21e014cb15ac54b11e388d4eb9630268 resource00084.gif +8e0ce95b589e5025f8033194e8be93ff resource00085.gif +c9bfe9181df6e2aeb9359244f72f2b1a resource00086.gif +34a52cefaca714b495bbc96d8755fa20 resource00087.gif +390a931ec37b9bc7840a79ecdf178d89 resource00088.gif +2ef90a990696a4ebf35d6f20002bcc7c resource00089.gif +b13a2c22a22257756f7af88978417c2f resource00090.gif +1cf21422d9ce12dc6a339900fafe65eb resource00091.gif +4b4af5df6ebd45dfc6b453a20f3dc69e resource00092.gif +d0a36cf2979f8d49b2dd4aa1d865bcc7 resource00093.gif +9e3318ac4eeae48f791c2c7cc045d78d resource00094.gif +c43e179f1193bd7c35ca732811de74a0 resource00095.gif +04ae8ba136a52a1e2036b328379d8515 resource00096.gif +704532b9f45bbf2d94f43c931378568e resource00097.gif +1c853be107228a7039797be2f42097d3 resource00098.gif +a55ceb29cb6b3e2a919658c39c91d199 resource00099.gif +687d5c0b5e0baf9791817344f0c138bd resource00100.gif +93b23a9d9af0408315b0c03cec7b96d3 resource00101.gif +4a9f92d4c5a2809ae4bb793e6992558a resource00102.gif +ffc6482bd653517f726da58861251828 resource00103.gif +731eb67df6258161dbd0bc20d2a8bc77 resource00104.gif +1fc5ff5000af02c3aad1da87e3e812b6 resource00105.gif +24b873e84a683d699f9c253cfb6dedd9 resource00106.gif +cb374d940720de594483a1e03316b7ae resource00107.gif +d33b1662c96dfce7729b0e745904c07d resource00108.gif +9ff8fb2da95554f7ca3f87b5e61fc004 resource00109.gif +9eada5897654707ce9a2fb4cbf6326a3 resource00110.gif +948c86304025ca7c55044ff869e11604 resource00111.gif +72f3b64a2ecc7182f9dddabd6e9f1f9a resource00112.gif +322299c07f3fff38121e8755652cf604 resource00113.gif +654c76f0fa7c53b0d95a7f35784f5606 resource00114.gif +33855d8f7cfb34f22f2f9a3f25eff6b7 resource00115.gif +e68cb760bb73d8d6e8e1d36dfa790892 resource00116.gif +dca5d0c9f404b025d9b971c3ddd8f68e resource00117.gif +55b93ed0896e549ca7acf42f3d6b17a1 resource00118.gif +99bc0b10e194193fa50544fc2562d58b resource00119.gif +91dfa1f6faf1c176d457de0f9491d16f resource00120.gif +0db0dd0841788953d0cf5135407c6fb2 resource00121.gif +1fce0d71c076c3f9e3cf267979723d29 resource00122.gif +4b9f5e18dbae00c6f62c21b2e0cc696f resource00123.gif +81cf3d65aceceeae9de25305453de287 resource00124.gif +21ff8a630129b03501998de15273f4c5 resource00125.gif +ff59b1c43ffdf7445f0823536e2222b5 resource00126.gif +4049c30e42f86c4b58eb4fb032a09515 resource00127.gif +7f22ee99fa4395eab2f4727fcbc6b7fd resource00128.gif +f4047111ec57e083c93f25aa374587e9 resource00129.gif +7f209e00adba61759f53cfbea62731dd resource00130.gif +025405f91adfaa01999fb238d4cf3dbc resource00131.gif +d031acb0045a60d11cab59ae317761e8 resource00132.gif +79717efef515f4f5c661c38dbb71303a resource00133.gif +409cb47848be7637f726c492a6bd9bc6 resource00134.gif +f6722dceafaa7ccb4a0fd0d395c5d6ae resource00135.gif +2960f30c3a612c63d43ce2421e53852d resource00136.gif +d1a9221fdda8f9c115c4f3a04be1fbc1 resource00137.gif +ace91895416b7184585d413447dced33 resource00138.gif +688661b6dc24ed23f180bc2c7b920bc0 resource00139.gif +1d622b146c7545d768372731f392c216 resource00140.gif +2bd96120d44ee05ce634d5c214ef3b8a resource00141.gif +89442737f063fc255bcca792b2811695 resource00142.gif +9776b2634f933ee73f2eecf521561adb resource00143.gif +eed6c9ee1f8dfb33aa9e63b2d81f9427 resource00144.gif +b2954e70b277ed93d3efec5c8c91fbc1 resource00145.gif +4ed7fa4f2bd25695005807829be6c0c4 resource00146.gif +442b98e38ba08d1bbb7215a2bbd1ffa6 resource00147.gif +826ae3c009badeafc0242cc54faffe20 resource00148.gif +d4849961630a36c4a9bef58ff4bd5a5a resource00149.gif +63969ccca2ffa804b7b1d6d1168a3e14 resource00150.gif +a4aaac02f0d2c345b0f87c36b18765ba resource00151.gif +a4aaac02f0d2c345b0f87c36b18765ba resource00152.gif +45b8689fb14beb1a9dca83156a8f53ed resource00153.gif +8ac127256ffda86b7f5d3952ca8b5750 resource00154.gif +0b2f59b2a585fd313b9220aa49ad1ae9 resource00155.gif +2fa0090cac29174a71f414f6df002c6d resource00156.gif +fa700c8e17f5dc3e192c8ffa6f4088a0 resource00157.gif +60c444c917d976252c4247b2172a0db5 resource00158.gif +cdcfa53a045f1bcc27710fc9d5e324b8 resource00159.gif +8ea0c8dd985af8a5675ede9894ce1dac resource00160.gif +919d3db9e6da9a41855d9a33eef6e529 resource00161.gif +d655c89dbe2c44d614050a78f44dfe99 resource00162.gif +062e3ccbd7f53a698979e005e2044b28 resource00163.gif +9e4506753cd1d619bee6cc5416a59ebb resource00164.gif +d2d0c5dbdde45a76a602a471807a9aea resource00165.gif +67ffa6013c69d12091f834ea6c3cb28e resource00166.gif +b99f72352f7477e1022d3baac04ae30a resource00167.gif +79500af34e459a68440b73e935d902f8 resource00168.gif +3624605173fd5887a73f2523faec31a3 resource00169.gif +f38323c1024619f43c66ef40b3990b8e resource00170.gif +09996dbf6d287139e052e9926c71341d resource00171.gif +11d65ae1d9d156f39ff2f3bfbbe19120 resource00172.gif +3559b0ff126de55d79c533555085e7bf resource00173.gif +26eebb52358b5bdc6d134825aa844075 resource00174.gif +264630122144aa029576203255083f87 resource00175.gif +cee3ff95e4b62cfbf7fabf94dcb82481 resource00176.gif +987866874969db7f0f668eea79a6f492 resource00177.gif +dda77fc1f61d2f1fdbaa538103489bdc resource00178.gif +499d8009219c1134217ee408b0b66385 resource00179.gif +ee762da0d82306d54df2d33f73f59128 resource00180.gif +d18d5a9208d557b0dd1b75b346dcc431 resource00181.gif +607bf432604136397f93a2379ffd6fa7 resource00182.gif +18f56ed3c574f8cf71015d24cd287e62 resource00183.gif +fd7365524383bf59384417434551d3b1 resource00184.gif +aa8fc2ceaedf2afcb6af6f7d22c2e4b4 resource00185.gif +bac40256c86dead5e1a22bfe6c721509 resource00186.gif +40113a06c91c77caff1418573cca2ad3 resource00187.gif +b3939ea7fef0940b8edd501862ce5dcd resource00188.gif +856357c9e7cc5a735cf289dc2ec21f86 resource00189.gif +f8b74c6bb38aac55163ce2e2cab813e1 resource00190.gif +7b1fb46a7a9017e8af6ab132ab31a4cb resource00191.gif +b4cfa8b3bfec3065599fe8c13161458d resource00192.gif +88523774eec65f0f7c2cd7a5318ea6e2 resource00193.gif +cb23dee4f44d5e8197b1ac66b40f6bf6 resource00194.gif +1514b9f41271cf713423d9cf7747ae01 resource00195.gif +31f702cef00bac2a21f06a2186266325 resource00196.gif +2f9891ac2c7ba5615478d453508faebb resource00197.gif +ea80702866e67f84ee10329b0cb392ee resource00198.gif +fe1df1b94b87a4f214d6d1fb11441d91 resource00199.gif +b4c305b3b86df61298135f3c2cbb7b69 resource00200.gif +53c0c5f3e03ba736e3ce24bfa3ed6656 resource00201.gif +d7b7e20898f8559c5a368701dd9534b8 resource00202.gif +1ef17c9d38adead005c9a26a49b77a8b resource00203.gif +7d7a699c30f26342272accd54a8585d3 resource00204.gif +798f5461b3be944197f49e630531e6fb resource00205.gif +6a9502f0f3335d1dd66823815de629da resource00206.gif +39a59af1a6de0fd80e9124779dec57a0 resource00207.gif +4d5c234ef5f2ab425497b0aca9ddc0b1 resource00208.gif +c4ceea4fbcc894bfd1f1c45a1c4732cf resource00209.gif +87e0f223f8584bccc523685c225a7df6 resource00210.gif +68a48a53b3763fc234670daf075eaa01 resource00211.gif +33018fb5631f9a8696ee5a3473c0e5a1 resource00212.gif +4e70855e091ab3d876651d1a3f904cfb resource00213.gif +305245b72b5d4abe484fd9646332054d resource00214.gif +9fb898372ae837d55c684635dd275bf3 resource00215.gif +ebae258c7bbba687925d3ebf3aa11544 resource00216.gif +00f88305dbeb8c0da9ea174d4bd99508 resource00217.gif +cb2fb1b951bf2de812f30b92a3d1ca8d resource00218.gif +fb0f77de8303f07c9b4d9db6a4ffe95f resource00219.gif +22fc3e59c9b86fcdd09aadae30ee4609 resource00220.gif +b90182ce3d027b80e4d5859a85b2e3dc resource00221.gif +ba7161f895d9864e5670fac48f14badb resource00222.gif +6dbf8972ad61b2f7996c53bc4cd01612 resource00223.gif +f5f062b12416d9cbfcee0918224de03e resource00224.gif +e424a596d8f6473fd1888d4c5112bd82 resource00225.gif +706dfea5c0a5801e081f52dfd0bedabd resource00226.gif +2346c114f13d0807930e75831ca83b4b resource00227.gif +2186dd1c436ff4f533f3f896b9189b70 resource00228.gif +f7e9017812a5ea9604cc3a5dbe34dc2c resource00229.gif +16cbd7ce46a20d493ecd49589bf0b069 resource00230.gif +4020275e33ba3b7b76221b742f740baa resource00231.gif +e2b8371cd0887382f580f52cf1c0fa04 resource00232.gif +be0788d10f67b71367e5c4fcf573d0a0 resource00233.gif +890602eb0801ed8e6f096dfa9001dee0 resource00234.gif +f2e73718bcc36a4f623a667ea647dbcd resource00235.gif +ee52143be0191977a4106f3f595ce5fb resource00236.gif +3f95ada25e0e6f7f28764151a7e08c07 resource00237.gif +553dadcf7085fa5fc8272a0d2becf4fd resource00238.gif +73c04bf93bfd896d1e39c07d22524cc3 resource00239.gif +458097813dc10f5f969a159ec221a315 resource00240.gif +8388f955b5ec4dbad3f35260bb877ad8 resource00241.gif +eb24839efa9afa8cb9dc617b30206253 resource00242.gif +26543b7dca51f6db7313094ee2a37b42 resource00243.gif +fc2df3553232da9c7554bd2a1cab1b9d resource00244.gif +e21a7e41a5de6bdfe8023b31ff451132 resource00245.gif +98a232569b62cd1fa02d50b5c72dadf2 resource00246.gif +bb8203cbf6b6a20249d7728c7ca10a50 resource00247.gif +d4e911e5f093cbb120db3ca8a4606e57 resource00248.gif +e584bd504537749febd4a581bd9d1663 resource00249.gif +6f18b87c6ef4d1710d89e08dad17727a resource00250.gif +74d1ea398f745df573db93a6aede4f12 resource00251.gif +e2e50af21b5a29d76321fa5f85f7840d resource00252.gif +21def9ea07ddb7758da041070e9794c7 resource00253.gif +937f45e86fe4cdc1a2fddc40eeddb2ea resource00254.gif +0b1647f17503520272e8236b1274f319 resource00255.gif +85aa6b9f5964af403bd4cdd2f7b7e966 resource00256.gif +a36409834099f7ec186972ff63eb4125 resource00257.gif +038b2899c406f6234714b85b15d96e85 resource00258.gif +86f7237b95925494c6ff8603baed1cca resource00259.gif +c05f7c3534276e27e3784e200ee58049 resource00260.gif +9dfba0cdea7c8a2873d351294189ec80 resource00261.gif +a2765687feb86988457a55e1026bffe9 resource00262.gif +54914265be9fafa980ca648eb5d926e7 resource00263.gif +c9ac7980307768158e3172a5b4e810b0 resource00264.gif +da3e48b99a41ae8ba0a914344495060a resource00265.gif +3d942b42a0747a51d2a3ca4242d29aa4 resource00266.gif +8f613ec0a4604a396494fec24833cd7f resource00267.gif +e2f39b81ede8b23b41802714e87ffba9 resource00268.gif +b276c986821b8dba57d732b71322f23f resource00269.gif +c6477febf41ac183642c226f14b176fa resource00270.gif +c00e3c56dcd1211a125cc8a258d7ca6d resource00271.gif +e064c0ca0fdac6729eea30efd559e8e1 resource00272.gif +9922b6ab7bc281c5fd4d3343d7baca7c resource00273.gif +d20599f7e55d18114518a1f5a04adaf7 resource00274.gif +65c6fdea2419bff915846334810d63c1 resource00275.gif +9746661622e4c7bfb9a2fb1271183afe resource00276.gif +e19678d8c80751e079117fc4415c95bd resource00277.gif +3438561a0240414b6a84bea57501e20c resource00278.gif +524079932a9d3e911972e4333791a9c1 resource00279.gif +118d98e8e3fbad4425583f8f438b520e resource00280.gif +2061afa4974ca51fd9ad5ea9ca0a9f68 resource00281.gif +049953f86f535305cc388f5ce2d54c2e resource00282.gif +84906b4ce9cf1b5abb6441229ee2ed8e resource00283.gif +f97f629789f6511e31050df883849930 resource00284.gif +8704f2fb6f633971dfe9782217c12ed2 resource00285.gif +1bd1c0e3dc47bc6c3baf692abb59bd64 resource00286.gif +ea60cea751fca730f4942339bcca0739 resource00287.gif +5660fdff0d1c0bc4a925841776ddf9d8 resource00288.gif +eb48f003c4aef1c0ef7a21b471c66345 resource00289.gif +130d05f963808a10298e330747b0b7bd resource00290.gif +c3d56fc5a7106d9160bd851e08bb9253 resource00291.gif +3ec0b9153d3cc145cacff858bdedf2b0 resource00292.gif +31fa0ade31e9109edcb67458b27c97d8 resource00293.gif +9afbfa5afdd98731a49318e539827bc4 resource00294.gif +7e76afc1e0ee53a0deca12d02ba71d4e resource00295.gif +d9bfb17d611037a8b2dd3fc70a4e8709 resource00296.gif +1979d76db2b615f886e53594c75fffba resource00297.gif +35a5724baa31a1b65fa8a75cfa462ddb resource00298.gif +1770769d37f2e801e2fb101156f8f7fb resource00299.gif +cf21b9714a9c327bf2171f7be2c39623 resource00300.gif +0de8edf3674857c1264c765e74299573 resource00301.gif +d28a12555cef304a0c6fe4fadac4987b resource00302.gif +a93f1e0a27463ee1421d267e338331e8 resource00303.gif +4a72f77f747bc261b5610083abf31174 resource00304.gif +0f77071cbffffb344cb72a9cd0b45af6 resource00305.gif +b79ea1e734ebbab9a4138a2ac85b2881 resource00306.gif +63e7ab571274522a1a74b2b542d8857d resource00307.gif +625ee3a5f410865a261df94635cbe6f7 resource00308.gif +55d107d9813aceb4994836922b15e337 resource00309.gif +ea61186f1a6c90c0856254dda87a5465 resource00310.gif +31d9c383db40eedaaccd102408221a65 resource00311.gif +964e662a5cbf37a8c9a32e5273ab1e91 resource00312.gif +716bfdeb7f68fe1178b9c91803c289bf resource00313.gif +96186721a27407bd0901dd14b9f9edc2 resource00314.gif +6c84e51244ff20e071041f60082dd962 resource00315.gif +55c4951ce890421143f6bc6dfdeb1a90 resource00316.gif +6306a9534f0d3c0f7a1f7365776272f0 resource00317.gif +84c3fd6fada3d6f9ceb782f4b004b7cf resource00318.gif +d4d229b6f752d6a9fbde8c00ad2f2c95 resource00319.gif +76c9d4afa76610a9c24d277a427b082c resource00320.gif +566e619c6797138bd1f2ee3eb05b07f6 resource00321.gif +5e97d0237d2d92f077dd7f12ac5c56bd resource00322.gif +f1c18a54834f4c4e7fae8ecc8a61101a resource00323.gif +72e4a9e6cdc046cd5f83d936d542d2ba resource00324.gif +f5114a8770bf345387e9674eaeead862 resource00325.gif +ca5624d232c8e4c35b312ee52ab18d42 resource00326.gif +84f007db1e7618b5e6bee5396480cc2f resource00327.gif +1c352c730b140880ed322d0613565024 resource00328.gif +168a62431f472fccd931bb53a0d26e04 resource00329.gif +2dd58e953a955c7f212d6d788a42d150 resource00330.gif +163c267d8942a98c29729c6bf5ef8858 resource00331.gif +186dbcc48a246944d49781a8c60082b9 resource00332.gif +38ce78afe58d9b774048eec7472fe4f0 resource00333.gif +31c7d0ecd7f19944fca48b8537ea010b resource00334.gif +29962978c0a9b1dd94dbf6dd9931da3c resource00335.gif +ab7d550f52c668023f05b7e40c28b3f7 resource00336.gif +145c0038e24a9ba971e877a029cff7ce resource00337.gif +76e65ed7b27ab1222d61d8351dd4bf66 resource00338.gif +cb420bce81c352ad0cac747613972c5d resource00339.gif +52ff8992da989418e36d38b8d7fc2e21 resource00340.gif +5adae7311831f81b07e55326595d8435 resource00341.gif +51868ae90704af5957738ee81817a832 resource00342.gif +6e2d8be0f436b5a44b1b7df80533d9cd resource00343.gif +64aab56c00b8bd7be190e45a83bd4ef1 resource00344.gif +725a89e9c1b218ff528224675e40ba42 resource00345.gif +39b85263dd811564083425433307fe22 resource00346.gif +0fc3dc06a30c3327d0a8ddccb144add6 resource00347.gif +9e9eef9a52f4dbeae13fd44533f5f322 resource00348.gif +6a616a2f203808c92855d273b79ca00d resource00349.gif +231b3a538fe15f66219213c8d620e928 resource00350.gif +9ce0696ea1fb792b00c35de44ff3b85b resource00351.gif +7d37ef38e052e2c535e27dfb5c342f2c resource00352.gif +5cda024d5b423d60b25ffe9ccf5c8055 resource00353.gif +6b4d5a3d890cacb9b1cf981f39928d8f resource00354.gif +09147a0e57f16d9cfba8b60d75899aff resource00355.gif +39c9c21dc938576514e7eb10da5cf4b3 resource00356.gif +777fcea98da9960051278f4211f97c44 resource00357.gif +f23dcd94ce7a9181527ecd5ecec91d9a resource00358.gif +793af865a39d1500852285f30c298ec5 resource00359.gif +40a913b71ae3043d5b8cf41d375162a7 resource00360.gif +5ba51e0ed0567f6750e1288be2f08422 resource00361.gif +436efc628142670fe8b55d21c6441b75 resource00362.gif +ef9e5fa39d6ba109dee4655cea0d5432 resource00363.gif +cf09c901f0908b9cffe9587abf37f38b resource00364.gif +4e292381074d05f5ac54da5cb8529eb0 resource00365.gif +5d3f4be93e0f031987e12d75c6eb148c resource00366.gif +e8391dcaf05fe58828696bb462a749b9 resource00367.gif +38d1727b703eb702e287b545f7eb212c resource00368.gif +9289f2cafd30864bdb29b0f1c388ff28 resource00369.gif +783ddc103ea6eca887b20675efefd6c4 resource00370.gif +6e53ce4c382273c9ae306146e33a0dd2 resource00371.gif +f414a9697695a2cc9db79ff54344d25e resource00372.gif +b812ed5c003e815629c4f4f952e4c824 resource00373.gif +fe3343ef2b877f7acf3421060f5c4b64 resource00374.gif +3d37ff79b20ff3e94c53742ab8243d40 resource00375.gif +cb5eba356ea04999f44ea7c858d03a9f resource00376.gif +c548215fd769328e5c7f9c14f9cdf821 resource00377.gif +47791fbd03236547f870edad986cce71 resource00378.gif +373f8f0cf7b50036f2576fa670b23c2b resource00379.gif +187a865ada0a3c5a3ca0f5bc45333483 resource00380.gif +ecb9e2d71f4d36141f2eb45da6c72467 resource00381.gif +f35d77b8afdfe7ceba0c1dc88cab6671 resource00382.gif +37893fd8b08fac0cfbc1dca4095cb8bb resource00383.gif +8e764f812aee5bd61d34bf0a09f7e575 resource00384.gif +cf1a39cdf0190fced5b0a2378e5255ab resource00385.gif +a0e581a472f88ea12a6db7f24fc771c0 resource00386.gif +670bbed6cc3715c15d03137ab58b3966 resource00387.gif +a45b58c2899cf443d2eb842b2fe15cf8 resource00388.gif +5c24b91991f27a65f580f1299473e7c4 resource00389.gif +6217b33e999d5097abe8a8d73c74291e resource00390.gif +6275baeccf9714394ed17aef18aab62a resource00391.gif +98cd6376685e293312b3c8c4b6c26d69 resource00392.gif +31f41589382dbdd428cbfac6e092630c resource00393.gif +6f0fa536508adf6d692fb694166ba14d resource00394.gif +11064be81915076b670e3f4070fafe72 resource00395.gif +5766af1b7bb81713cf3f924bbaba7d80 resource00396.gif +3602213d9ca3a6011c1ab4c3c63248d7 resource00397.gif +bb945f88cdad7f260e3878410ba6216f resource00398.gif +a9a5761844ee355345178036a06a9a9b resource00399.gif +39b0ff815f8069aaa95106d646a259a2 resource00400.gif +5a53f65485e93775ad72487b59828917 resource00401.gif +2a8ceb9d723b2b5b046eac126070e791 resource00402.gif +b7960524a07926eeb1b191ab73cc2e63 resource00403.gif +f656f7fd6d79467d4795ac85067a23be resource00404.gif +8b8725028a23770ff7bf7a28bb8286e1 resource00405.gif +8243d54454015324bc0286dd855ec35e resource00406.gif +c796ea6094f815d88498835e8964f132 resource00407.gif +4d17c4f4526813eb4d86209d1019af06 resource00408.gif +3ccb62e8e69a54c929996ae5b2e26b42 resource00409.gif +e42f8a818d619edf3aca7e73a364826e resource00410.gif +2dd3a30c1438997b65462144d3950809 resource00411.gif +2a4ef916ca2ab8f9bd61ec0b2583148b resource00412.gif +81372670871b801937253940985fe76a resource00413.gif +855dbead7f3e3e58afafe0fbc3e461f8 resource00414.gif +cc95aabf4f9f8ed70785f0e350e65d4d resource00415.gif +41f7485f937fec61135f39e187a266e1 resource00416.gif +c57a53949ee62e740b4dd9368806c929 resource00417.gif +ed5842b806f972a2292ea47bfe5bfcbc resource00418.gif +c89b6ddde6fce764dc3a0fc1a0ac515f resource00419.gif +3741a6f0b4138290cea619f42842e84d resource00420.gif +8f1cb4625afe1096f8277639ad7f8f1c resource00421.gif +caf0ec788e8f1d659e7c479cf12b01ac resource00422.gif +84b5ea035eead8d389d8288543153e51 resource00423.gif +cb4739505573bb5f319835f05eecf72d resource00424.gif +8bedba8136b0c3b4759cd755a8c236eb resource00425.gif +fc7a211fea91ec71c0a632c6157557d4 resource00426.gif +f9da5ea9f53ea6e1082b4391d3c2b811 resource00427.gif +e6819b07652f4d4e495451beb97396fe resource00428.gif +964049c34dadf88e6714e4278d3c617b resource00429.gif +79b67ba44258a4f031928a6230b2df1d resource00430.gif +0e04a565b6dcd714fff8d6f5be9a9aa4 resource00431.gif +573944349860ddff846e14444fd125b8 resource00432.gif +c236582c7490a48f3345ede0cb9e01ac resource00433.gif +71e74ebd716b9a8252f343343689517c resource00434.gif +d019a92b3a090b1d0a928cb9d0b13abb resource00435.gif +049b0dc34ec8ca26d12f88e5117aed27 resource00436.gif +91532aac1bd45a0209ad741db129b7eb resource00437.gif +9574792f5d225bb2278a4f5dd791c5f7 resource00438.gif +ce78cc13e13b9be9dc5d1b1771c5c997 resource00439.gif +a3fadf2507f0141ddbda43dee781d9c7 resource00440.gif +a7311b31eec35ce6f676e1dc0852931e resource00441.gif +cc8afc2546e00953ed6f49c8f07983a5 resource00442.gif +5e94e4665f6c86808ab78a1d9016c9e7 resource00443.gif +1545858bc15ea1e305bf0a0084ce16ef resource00444.gif +00cb8cb6c642d478b8df2adb29b575c8 resource00445.gif +760f277601452cd89cc1b58539f50807 resource00446.gif +e9535a4073bbd88b74e84864bd3f34cd resource00447.gif +8b78a71975b6040d8e8c1bd00519ac30 resource00448.gif +473843634d472e33ebc54a8acdff330a resource00449.gif +41b5a2fb95a398e02c7065adb7a6939a resource00450.gif +c6c192d1c40950c9f7532fa5af77e1aa resource00451.gif +3c3d288ce07e1aa69ae52526bc30efe8 resource00452.gif +1c513f033aed7d983572e7a7554dde5b resource00453.gif +6868a4e124fc89f91ad70b14876ff3cd resource00454.gif +4219c776bdafe277678b139a1b92d9d0 resource00455.gif +312c9f0c1052e5553b4f2f5a914b8597 resource00456.gif +bd4d0ac3e3983496752bb60bfa63afaf resource00457.gif +95d5bfcca84fd02a2a8ed380261911ec resource00458.gif +8b257f7f72fa8d89595664438e171af9 resource00459.gif +5498fb45a09b5c7fd0662bfac525a74b resource00460.gif +21fdb0d891e9cde5347df5d8ee0949fa resource00461.gif +8dda7267ffa34e472b9584a1f5700699 resource00462.gif +4c171c5bf4e641bfbe9bbcc9e765b839 resource00463.gif +087c7eb04649b6dcce31b435249891fd resource00464.gif +b4ca6005a4fda18429fd77d5dd66e650 resource00465.gif +80d8b142b7eec49b6348cf3b7d4d6275 resource00466.gif +8f5566c0e2741694e3b73a843b2d86f9 resource00467.gif +7b302b7cbc9fb88423742ee45f022d3d resource00468.gif +ecc6e25287564fd38025442efb36fc93 resource00469.gif +71f900a1c9f168cf1ccc755279e94591 resource00470.gif +b697f9c499a3cce25672ee0d04bbcc19 resource00471.gif +cc60ec9408a7a30894bf5a9a745a9f32 resource00472.gif +fa1291914266ae401d7b6b3f9b426ab8 resource00473.gif +fc49b265b7c87cf64b32477ac44bbab7 resource00474.gif +fbd4040ee7054b10cf658895d7edd8c4 resource00475.gif +727318e3a07be72b125d41b79fda76d4 resource00476.gif +6b754d2097c8e775879b91a9c99e85b9 resource00477.gif +e5ccadfe9350166b33516f6a24b9a1f4 resource00478.gif +86f84b88439173ae7e55ce8af8f262b6 resource00479.gif +92e1506f329dd02dda586b48f142e1a2 resource00480.gif +20659eaf9243dea46c942ca4170f40fa resource00481.gif +5aec1000e2d0c43b3fee32b9d78c9b52 resource00482.gif +702d8b92144596b2843b6dccf4d81f41 resource00483.gif +a642fd2743e899dedb4b5f4b2245212f resource00484.gif +150245c0f7d2a50cd1bdc52b5968904f resource00485.gif +37fe43a611484988a5d49b497893bf73 resource00486.gif +e4e2c92f1b75ff41e6abf934d91be6d3 resource00487.gif +3511b206b7cda63208d64930b79d72dc resource00488.gif +a68ace281698a0aa71011658b6db6bba resource00489.gif +d2f0fdeb2c167aa57faa4c612c8dc987 resource00490.gif +ddf5ec6a2dccf06b8a8c09aa0186e344 resource00491.gif +4fba259a54e0f39556614013e3c5e5ff resource00492.gif +9212fdeb516d8fb9c51b85ba849f0b8b resource00493.gif +8e81b336333c814bfdf3a51dc0907d05 resource00494.gif +70c92ed85d3d6c6a9cb4177a1f5a3159 resource00495.gif +c19c5fcffb9272328723dc680200191a resource00496.gif +f1fdc2d028d39ab8bdea25b9881fbf85 resource00497.gif +ecd3d14184f8626585e794ab5a767ef7 resource00498.gif +9a35fde0a99c4393007f0b7bfffae6b0 resource00499.gif +df1a49a2259397b4e3f7d2d01c57e9b4 resource00500.gif +0c39e08e6abdcf308244b2b41bce8485 resource00501.gif +2f1eb2a30fe74a22135d2764affc414a resource00502.gif +35ee48ae6bf7935e4fb8206a2d594aed resource00503.gif +b1fe4ee1a14dd8a4712cae16bbebfd27 resource00504.gif +8ab075bd7d5c7f6a96204bc3c8c949fa resource00505.gif +8999db42786b40206b392a459b5565e3 resource00506.gif +9c2588c6657a2105b75c99d5f4e08bcc resource00507.gif +d164a375bcd2381811a0c69ecdb37299 resource00508.gif +0f1a224013faf4cd9f348ea8d7ad2ea3 resource00509.gif +c62e607e2a35243aeca55484a0668ee3 resource00510.gif +8d30045a11d107053543801d285e50ca resource00511.gif +3e6cc0f34914f2eb863317430cf0f780 resource00512.gif +c5c1d2fde5cdbaa98b5b2fd5cd80b28f resource00513.gif +14bd512840f088bdf17805b9fc2a5baa resource00514.gif +af870a6731695f32a7406f88ffa65500 resource00515.gif +f3b494d1bae8a6451cf5f6e98b1d1cb9 resource00516.gif +07beb06eccac864aeca8617bd505c256 resource00517.gif +0efbfed0c2457abdfa0b02f95574f487 resource00518.gif +24bf41a694366205d65d7f9449b5e83d resource00519.gif +58140dd61d306b291b77bcfac4044a8d resource00520.gif +be5ee701d8e3d93464bedd187ffb7a8c resource00521.gif +bf683b058e876f05909fd4ae70f7c5ab resource00522.gif +f6f1629b5369d7cb9b25fb2e68fac8f7 resource00523.gif +90f665459b5533237bcda46c8c1d0037 resource00524.gif +7a11c16e54c79bc2b77ab02a308e8b8c resource00525.gif +b4e89376c8e008df76a879552a6e865e resource00526.gif +557c0dcb2fc79d8dedbd1ca6cdaec3b7 resource00527.gif +ddb00dafb19206f66855342bdcb17721 resource00528.gif +589edc83a89849b2055548185b17fc88 resource00529.gif +5f85310594890eaf836749d400b3d880 resource00530.gif +71e9bf1869b40cf76750b38c2a0d2e48 resource00531.gif +f00142f42e54fe67fd787f377a293a13 resource00532.gif +14afa087a8768653cec10c4268b7976e resource00533.gif +74c3e9b4617fa11fc337c876f7367ae0 resource00534.gif +9bf086982a259593017122127c48e3df resource00535.gif +3a4f730e937513797bc0386b923339c7 resource00536.gif +59e86609d0248d8f25d00d4931e24e8c resource00537.gif +98723c7d5b69edf26a11f49ba9042e02 resource00538.gif +aedec3bba26ce5dca5361326d996aad8 resource00539.gif +272bcb090675ba83803b68d6f53cd287 resource00540.gif +c372b3a8f551be730bba9520a947a2dd resource00541.gif +1ad509944085881704c9d8771c9a9714 resource00542.gif +09287a07d5d96c86ad7f6064cd5ec0fa resource00543.gif +feb3fa88c7b56240552e002d55526171 resource00544.gif +64d55ecfcfbde9261fcf44ec62e1af1b resource00545.gif +c1f498be03b1b6e1ec51be416c74e625 resource00546.gif +40d43af31b72597996f6cd873145d190 resource00547.gif +5793a23cd1ac5c42637aa2afa72b170b resource00548.gif +5e36a5faa40c2404584a5de8f1aabfd1 resource00549.gif +65b194ce944aa226e219adfef7cf7f7b resource00550.gif +4068f3a8ab0127f0ec86deb1e279a8f2 resource00551.gif +743a2186166099d7ef3c0e73153461f2 resource00552.gif +f8f993e7451b88d40f8e5c6caa4addc7 resource00553.gif +2af4093d7886aed1315e4d04438c763d resource00554.gif +d967fbc2b0973e4f76e7c4cd0493969e resource00555.gif +57e2169e1f195ef30bd038988fcd4174 resource00556.gif +3b351aa77d2d1e39a02f05de1c8a9c92 resource00557.gif +e4cd6d557ecd7d157f93e9a05b60e285 resource00558.gif +ca44b9fd6fdc13347087cf0dff0aa6f7 resource00559.gif +2903b6166a0efcfc2249b6568b023299 resource00560.gif +967a8c518e192a6805b5899dfe877d50 resource00561.gif +b7bad0d3189ce9fda98efaa857e59fa4 resource00562.gif +e2ee4e275fca44bb07b93b1faf0c012c resource00563.gif +846515706ec123049e09c8750c534a00 resource00564.gif +f66d173c60b9fe40faa48f5a03ae4dc4 resource00565.gif +6ac0cabef93e8e896deae449d5c0efb0 resource00566.gif +86b5333589fe9829c430c7a063181798 resource00567.gif +8588b91221424f3c5d38252603297863 resource00568.gif +88fb12dd82c51704c70f38fd4bd70f3a resource00569.gif +a41db8884c50061aad4dd56f1dd56a38 resource00570.gif +244163eda8bd38311a52d80845b28a3b resource00571.gif +d0eb02f6a822cb8ad7635cef365ee822 resource00572.gif +93667dfca52bbcc288d30d8fa34610e7 resource00573.gif +dfe2ff8701098d3180a58f1ab7deda77 resource00574.gif +546a2abb4dcf100c7f802d7531bcf0cd resource00575.gif +253925625dccdda23fb5c82e1f941d1c resource00576.gif +818ac93af01bc7ccef679cbc65ca935c resource00577.gif +61c60ea3d2feb3daf7396c9f88f68f8e resource00578.gif +8c92e25a1639375dea7a27cae4c3933c resource00579.gif +3d8bfb3ef222f54f80188523db11e49b resource00580.gif +86101bf55a51b3895260b7d42b3cebee resource00581.gif +97c1afcaf746fea9ffbf038101291800 resource00582.gif +0fca56d04539a2917e0ea16da8ee50f2 resource00583.gif +5f7917cb1baf6a3fd8cacd6c141eb2fa resource00584.gif +e1e31aa3038ebd8d7fcdaaf60926a76f resource00585.gif +ce26d550ef5b46d6288257ac1eded560 resource00586.gif +e4417768c64e4efbc127f3f14a127a47 resource00587.gif +4cf1a608f5767eb9d2ce296db05f82bf resource00588.gif +ac19467532f6d6d92e5d292c237c69d4 resource00589.gif +6e99e9540790d104430e686c8b4ba55d resource00590.gif +1687d4f4d274bf8d9022c594b0cd3ef1 resource00591.gif +2ef17c37de69e00cff205e5b0d2aaeab resource00592.gif +240b3f38853d11248a3c221a15420548 resource00593.gif +10a9d6b5021d62a8307ec13d7b126dbd resource00594.gif +ca9ed61f4736abb04237f71082eb5f8a resource00595.gif +1758d1ffaea581876d98765f8a64cba5 resource00596.gif +d2281e1f90a514d8d2ca859f4d944d1f resource00597.gif +562bc3ec88719fea3f2903cb9968fb69 resource00598.gif +df120d9e4dfc55f0798b7e68fc38b805 resource00599.gif +5a845947321fb17e35b081077c703564 resource00600.gif +1909f47358b5e914bb8617de5ef87ee0 resource00601.gif +de638901ad7850849b00f13cc53107f6 resource00602.gif +4b7bc77c9923ef4f5ce04c78ac13bc65 resource00603.gif +5f2bbaf862005ad5d03bf3219d80dc54 resource00604.gif +a43316a203910c6a8ac41d77a73eb9d4 resource00605.gif +9d53d63bb3399110795553782b6af002 resource00606.gif +7c5dbc6c3f59f314997bfcb8749ecf04 resource00607.gif +29ad486a2e677085af2ca5ded7950986 resource00608.gif +ee6c3461465eadc0955c4579ab4898af resource00609.gif +d5eb545fe4f3ae17aca3fd415f7891a7 resource00610.gif +5f346b24237f55ecd27e40cec01146d3 resource00611.gif +0f79d948a6056c44fc9b2b663cc07a9f resource00612.gif +76f9a7bb279b7ef724fdb5d566b6fdee resource00613.gif +0d1d7ae0537b930179eb2db03ab91e42 resource00614.gif +de3bbab607f3e4b32f80b931d42dd7bf resource00615.gif +a94f4a36f99a99211ed5db9612e650bf resource00616.gif +ff94d611a0696866942537066ba8a6cb resource00617.gif +5b749810e12d2617581e012674aaadb1 resource00618.gif +1e36e14d7ebeb0dfd0bb196854b3c5d9 resource00619.gif +63649895db58097831fa32d94e784af2 resource00620.gif +b7139f4461d4aba78d085594cf9ebb1c resource00621.gif +c8cb46384a17e739d40f03b22659f5e8 resource00622.gif +5003883300806ce205d3022200931dfb resource00623.gif +dd565a85a8e15da3d0de641ea9fbd81e resource00624.gif +e64190bd27e72eb9eaa42b4d75c4944e resource00625.gif +1825478c777cbe00911a45a4a4667748 resource00626.gif +7f8cda0515b59dfad69cb233fa7a576a resource00627.gif +8ca3547e9868cf8d30f166fc66fefb8b resource00628.gif +edda5c24f4c618b8efd158b9c1a335fe resource00629.gif +7d35c7ee3b331b46e51b18607775149f resource00630.gif +6114a513875956af334eb97ccb1487c9 resource00631.gif +3369cb5a313aa6930fb4fe54ada5de98 resource00632.gif +45a9c834cf518137a18007f42b949f2e resource00633.gif +079785427e6ed84b9ba37efc5da26d62 resource00634.gif +2c439ff9528f18e95260c325b7fbe02e resource00635.gif +77f119f25a28dd9f54e5ccd734594fa4 resource00636.gif +6a9d9a85e50c6629d14b7a25ba5b62f7 resource00637.gif +a84a91ee0786ca0471c70b4003faa435 resource00638.gif +fa1962ded9a54186fed7d794a8d1d4dc resource00639.gif +17d2c85d189c5fda07ab2ca57ce532b3 resource00640.gif +ca1709ce6e2adea3ef8b9b7a7af7198b resource00641.gif +1d06e96492e9bdc88e5a2b55c046a9c6 resource00642.gif +7546d841d63706c8c7aaf90275882015 resource00643.gif +929ecfc2c16d7b0f4b58663aad205aff resource00644.gif +d262dd2eedb44a2f17baaa5fa11da65e resource00645.gif +6365bad721f9bb0454b27e71fea61349 resource00646.gif +e5a055b85aec877032f7f3380bad7312 resource00647.gif +6c9ef986b2fd914adbad523e0ab718d6 resource00648.gif +a7b1bed700a69c3ab6badaa4d773251e resource00649.gif +e54f0464c6ca6d41a7e371d2a9c2d28e resource00650.gif +9340cb6282fffa9a1db8d98efe1b98c5 resource00651.gif +dfe50828802e312029dd2a2d0dcd9b1b resource00652.gif +82e780acb6cc9495ebb0cdc429de0ab6 resource00653.gif +0f48933232af3837ee8977790dfc12d7 resource00654.gif +fd4dc6c6197a611da1592a081d1a8db9 resource00655.gif +b08e219a50efa488169e5dd3633ba8b6 resource00656.gif +1a706c7180cb1473eb7c1426f7d92bff resource00657.gif +ceab78416d46624dea256dff5639c6c6 resource00658.gif +2b49e29a68dec19b8496b39ae4859d21 resource00659.gif +4cfe4e6eee2b5ec2f199d8414ea64db8 resource00660.gif +7a36e02a2b9e4daa02baec04aad3f148 resource00661.gif +fd8ddbedb1cdbc971be1035f812aaf01 resource00662.gif +35dcde7ac58ecce5fe9a7a8467a5899b resource00663.gif +999e1997cf28faed3e69072c958f55ea resource00664.gif +5efa44dd6a203d3283556c1cbe14ab25 resource00665.gif +83b27dee0c1cd7c82defe984c1cbb21a resource00666.gif +3b73e6ddcbf3bab230856c965b087d83 resource00667.gif +7c908eba3b7f4112f8668013cfad3043 resource00668.gif +575f41552e6d0709d51e9dc29ddc6caa resource00669.gif +1cdd1790a974faf3c48761ae3f2b3f53 resource00670.gif +7f7d8a52ab1e0715a6111b433c04a772 resource00671.gif +ec3bc702d08457715e9337df241c035d resource00672.gif +9ea559f94f10be5a5acb7d550bf74d0a resource00673.gif +942cb78198254a4b3c2d3b10c7e10851 resource00674.gif +d387207483c37ef5e970562f02be2b4a resource00675.gif +97147d18b7dbcc9ed24be38a581809df resource00676.gif +edbdcfba0116c71db19b4daf72a5d4c5 resource00677.gif +21e014cb15ac54b11e388d4eb9630268 resource00678.gif +c504494d6ef569394d33d99b68cef6ce resource00679.gif +735bc9ad05cbc97d8e4c62907148aa6c resource00680.gif +05809659ecc8485c751b03b8d7a1b314 resource00681.gif +baec85ab0ce9e43a82c59ed58a4c747a resource00682.gif +5d31cb4b580e17b6ab1f5701eadbdca6 resource00683.gif +b07af700129878f11c86168a614f8cda resource00684.gif +00ffc6dcb1e9bdf5d816c064de45ef1c resource00685.gif +4c68c96d360f0b66774fb345a951fb5d resource00686.gif +7613346dcaa2ae49d751fd0811317840 resource00687.gif +d4539d23b8c00fc35cd902d5c387732b resource00688.gif +2603cc99db68dea3d702c4c7820668a1 resource00689.gif +385d63af8f4a48e6de95b35b96bf9c76 resource00690.gif +169fa4008518fe3f922997486f775277 resource00691.gif +198a116afe7e5491f5ac5b4b2c7569fa resource00692.gif +381728db283a7d883075c4bf5441ecc9 resource00693.gif +c150ad7af5ad5ac2c4092fc811cd205d resource00694.gif +0b074aa6b3ffa9bd56714f1d593bd5a2 resource00695.gif +341bd25274c262029d797cce99e355fd resource00696.gif +df9a616e212213497a5c9bbdcdf02dfd resource00697.gif +986589520c650026b87217f845826a9e resource00698.gif +8ecf84f13ced7991389baf2f3a76c36f resource00699.gif +5093ab21e23f06aa8fadeb892cc7ee24 resource00700.gif +95e4cacf885e57954e736588ac3a1f1a resource00701.gif +f6d54f9a80285218bfae639030b70d57 resource00702.gif +d55f2552aafb3952ef64ca09f5566143 resource00703.gif +8720d20f32a23eca4dfba4401092fe26 resource00704.gif +ddb96bc4575b52106f2e02d4dab43641 resource00705.gif +7b0104a52bac6023667d788548e9811f resource00706.gif +d1ab50b9812a08f8a0227fa7a60d8fc9 resource00707.gif +6f235c9e76badc94ed8627fd8a555859 resource00708.gif +5f1f949a1411938888a6fc903a6cf9a0 resource00709.gif +52df9c506d54335b7ca3382a1af08a6a resource00710.gif +b7e75281e4fdc1a4cfdcea8b47aa1684 resource00711.gif +a3df88cdd5d6f541fd48e664ef687a8c resource00712.gif +4ad84f6d4f7e585dc0484ada1f372311 resource00713.gif +e1415b905bed093526827c4b90ff4e9c resource00714.gif +55e8c3f8af4c37835825276c7d26d82f resource00715.gif +4f5dbd76ed2aa90a20f530dce46ad837 resource00716.gif +7c48ede82c8f3f88172c692917ffdee9 resource00717.gif +6b81a0a689ff2015e27428c2422d67a5 resource00718.gif +cef970bdd2339de6a51caffb50c11701 resource00719.gif +7c6f255af539f8001031cb2c7e7eea44 resource00720.gif +2a46f7ecf42f4a410897475a43c3f1e5 resource00721.gif +7e6a8acc853ee4565e3bd69095e55957 resource00722.gif +c6243c68ad2158b65ef84426a1426953 resource00723.gif +2b7910ebaa44c34e0a885bc9dc67683e resource00724.gif +6e03c058ceb79e099ed27a94326e65c3 resource00725.gif +ff1d606a305e98725678871908318d78 resource00726.gif +212e9d46b0b94392b1deacff42ec2022 resource00727.gif +8dde4413f7f4adf7616f14633ff38cba resource00728.gif +8b3da567dc78fef729c511cb0e190eb2 resource00729.gif +ecadefb53cf30a10aa614104e6a61ea7 resource00730.gif +eeecd87dd5558d559309d2bc692bed6a resource00731.gif +7245a0b067f8901f76fefec4c84434a4 resource00732.gif +ef0dddf35d6811fcbd22f6c31e240321 resource00733.gif +256bebf576f1b8e817441ed46f0f3a1d resource00734.gif +f77d4c8d12be1cd7884fac5d06322045 resource00735.gif +70c4412b3b163b71097d5d5ca0515589 resource00736.gif +d94505a01feb83c891983b1fd449d841 resource00737.gif +b2b5d0e2e4bf11554af0010e5397db6e resource00738.gif +73ac339004d6a83b8d889c56d9cf9f9d resource00739.gif +ef2de91817a571b78a54c336b299d43d resource00740.gif +f21ebfdba37a216ee255d6b88cad6cc9 resource00741.gif +853f299c31cae7bcf0d712328e40a76e resource00742.gif +9e41ea3d65f8c807ee666a0146b3e4db resource00743.gif +4738087228a386c0ee189a8b81bba432 resource00744.gif +e329f428d38b3e14eb64b5c239d6f773 resource00745.gif +572503fb85fbd9fc7ee25280edee8a81 resource00746.gif +d8183ea960437b743efa3d84a0f52b5f resource00747.gif +27c9468de4ae1bc69bcff1d827a5281f resource00748.gif +05e333098a4ed486cadf62c8c6390acf resource00749.gif +8676ae147f5c4ea5c2019a59dc555843 resource00750.gif +90cf8537d853999b0ab36201f82718e7 resource00751.gif +15111df2d6aa6fc3de70964abb3b0b96 resource00752.gif +1ed48960654d7b32667d97fc6f4cb192 resource00753.gif +51e079787a06bcb3bb828521cb8c5f30 resource00754.gif +546365c422843504bf5570200b500438 resource00755.gif +a284a097345801818021125c9a346500 resource00756.gif +8329c314ae9557c2f11aab6a767e59e0 resource00757.gif +063d6785974dce5a1e065ac352c8ac1f resource00758.gif +98c7a9e098589270853f99af2d67bcb1 resource00759.gif +515bcfbd5f1b1c516a1e4178d1f11482 resource00760.gif +1348de9441eac5c8af20dc68a758e9b4 resource00761.gif +39fb7784043b79fcb06e13e556ef0efa resource00762.gif +11f993d1ae843864b18b726b9ff89457 resource00763.gif +6f0e1ba319b0f6deb45192c026745ff9 resource00764.gif +92a4b406ebe7824468eb91e4d1428fab resource00765.gif +872a05e82a346651c962248eefbae3e2 resource00766.gif +7097370fce6cd5ca9d96608bd26ff4e0 resource00767.gif +c6387a92400ce654432e5f8b4cf81a7d resource00768.gif +347f44e201cd694432561d1fb2e5780f resource00769.gif +3c5469c3126fa1b9e68b006962d35a2e resource00770.gif +8cebbaebf9ee6d80d0df64f06d57cd36 resource00771.gif +7c7602e3a0a466473a83925950a62356 resource00772.gif +91c3acc942a935add9a44ad0f98f4d0b resource00773.gif +41f761bfe91ee0dca2494f00ca1b362f resource00774.gif +af0653155e2fa6e49d46d56e513e5cc6 resource00775.gif +7be65c57b749d7aa8cb51281d69b34e7 resource00776.gif +00f68e93068d16a63cecb9b01d847936 resource00777.gif +6635a661bf39f1ac290134113ba380fa resource00778.gif +da80ff2c610151b9ed89519bc4c6b951 resource00779.gif +02c5afdcdd50d7dd6cb26cc46765fc97 resource00780.gif +11f23a0302875745df378178ab23fa83 resource00781.gif +439d020c01cb69e222f7d85c18ade345 resource00782.gif +0f03c738f04dae1d360ef53ce38f9a77 resource00783.gif +482eae1dbacbc042b87cae9efd12e07a resource00784.gif +00bc707b14e6910b8db502fde617e628 resource00785.gif +2089f05a6ddb7977d9a9ca9362622a6d resource00786.gif +9bc8e2c90e7aace1acf340c187e8c021 resource00787.gif +98ad8f5d52c4ab623ffdbe046a1b6d39 resource00788.gif +3da70061758361e60e779da38d9729da resource00789.gif +29ee5c02b6fa43b09f56975dcd8ad94e resource00790.gif +ec395a8abbe2bf151189d2a07092e5af resource00791.gif +329471a3039641cdaaef701182babeb7 resource00792.gif +c34729b4092c9cb854432819defd181b resource00793.gif +b535a8746bed1049f148461ca5b8b0a7 resource00794.gif +1c8ebd5763518e047b6403de2af2d72f resource00795.gif +b17ab02ea98e79181874db73dc9906f0 resource00796.gif +c50d0adafd97240dfe1fbe93ce1f1d45 resource00797.gif +e967feebbc8947f72de1bde7c4391380 resource00798.gif +16a4a15c771c94f4cba7b967b0ac464c resource00799.gif +15046eb2d884ff3c63fc70e9a32a1dd5 resource00800.gif +8e2b15cc17a2c0eeb11e7e4d8e774015 resource00801.gif +9a47e64e37c0b9f0d4c88128675f1d44 resource00802.gif +56451903e856be6c61740f3ca0d6e0b9 resource00803.gif +61456d790767d6e165ddab7c7e3f1bb7 resource00804.gif +2a3ce8514ead42161bf053fbf5cdd32b resource00805.gif +1f732817770920177e4841cf8b75a0ff resource00806.gif +9aa0eab4167048e645a390813bd0368f resource00807.gif +59df03c5776758377d8e8d0f1c6bf210 resource00808.gif +70fb9da51069e63758f0057f7630a80c resource00809.gif +a7abe3ec6f94e9816e237d2be0ff3f3f resource00810.gif +97e80978c2378530510ef87143d3c8e1 resource00811.gif +14e56c2a1f553f003f1a90a8fe771249 resource00812.gif +adb570d2e23c6705f4b305876f1f2c8b resource00813.gif +210a9a0f59d53f44c365843975a03461 resource00814.gif +c51902689efcabc1777ff85a8cd804d8 resource00815.gif +fdd1900f5a5db3d70d21c085f06a6109 resource00816.gif +8ffaf2a9ed9b2c2470d3c9e94af155cb resource00817.gif +292175cd657d4c9e32b6bec42c2ca391 resource00818.gif +ffd2b6c5c3e6515faa4fd6c99403457c resource00819.gif +544c80e32e83b85d69d5c091c4ad1f4e resource00820.gif +e1920c8dc0e4c26db8eed903cf4b4d5d resource00821.gif +4ee4d23d829cfa8b476c609210c18deb resource00822.gif +08d248158e8eee750c3fc33827a51f49 resource00823.gif +b54aa89efbc14420cb9d4ee58689ca4d resource00824.gif +afbdb69161d2206d7635121c9720fce8 resource00825.gif +06ec12342c601b6ac0844ac5dc66746e resource00826.gif +534241bceb3555289cafbd8fd8b0b0ef resource00827.gif +1704e17391ea1746654cfd6d0d60644b resource00828.gif +67719c04ea5b0345f505535d59776b55 resource00829.gif +d247d13be329162c4b46d3478c080559 resource00830.gif +7cb63373e519b3fba3f7eaa862450283 resource00831.gif +267a8ee77830482f7ce11c00bb6a6ac0 resource00832.gif +22d6324f83af2930dd8876c59fa4a14b resource00833.gif +c1727b762cbccf589c199f19721c2504 resource00834.gif +6fd8f63b6694ac19f68fe21436941660 resource00835.gif +47162a345828d57445f215851898cbeb resource00836.gif +51264a15856d3cf4657bf41256af5a1e resource00837.gif +27ecdc8d21d38f6a54dd56b542566a1f resource00838.gif +526a41563d96fd32470864cf042be6fb resource00839.gif +6b083123aeb100b4d5e3acfae93f634f resource00840.gif +eca731dde0201e5b567c7e79e8e3f39c resource00841.gif +61da113285b3fdbbba2e2ea95589a18a resource00842.gif +1c71339356c9c1211d84ecfbac225b00 resource00843.gif +9c9d8c832524ca8e5f71b8c183b2b70f resource00844.gif +dfe81c01658b0830cfbaf74df076d904 resource00845.gif +11c367b31d178ef93ad1a782a3e6e21c resource00846.gif +1bac1d762bd5a9f2c8df2462c281f3fd resource00847.gif +21057bfe753b34ba1ad7b4e4d4ef6fca resource00848.gif +6c535e586cecbff5a6a86236c381801e resource00849.gif +f08d924702560974787fd0fb20c25ada resource00850.gif +4f1b8bb042504a107fd3211e067f19a9 resource00851.gif +84f0c48bfa1faab0872045d65615e28f resource00852.gif +5ab9610dddfe53f55436c87e65bd79ee resource00853.gif +57e73f746388d45047a638141f78d9fb resource00854.gif +bb824c000ca0dc5f675f4f64a23fc671 resource00855.gif +998a49b1b40b59d6b64e9ca9048af744 resource00856.gif +a7715c480468e280fa131cf36bdb84ba resource00857.gif +49167a5250c2db70cd0e37181edeeca7 resource00858.gif +04aa4dfcadac5df495dc38da607cd2f1 resource00859.gif +a3b262bbed8d89e0e2bd26fd3fc55ed8 resource00860.gif +46ab3c218528910957b66082886097a7 resource00861.gif +cbf884a05c20e87be90a31736162d39f resource00862.gif +f9d62b1a51ca84ec5312a904a2327b4a resource00863.gif +e6d7334317aefe1ecce010267e5ee68c resource00864.gif +d0d30b862a6a2b649bb4969ade7cbdaa resource00865.gif +a60eb7bc19e4aed7f3ac4f4841ff84e6 resource00866.gif +283d0dcf3ce6580e073d8023b64eea73 resource00867.gif +78eeb684944bbeab07b0d042bb6a4450 resource00868.gif +1dedd42d91bb37f0b032fb6148fc218b resource00869.gif +c6a051b7e6216b69ba8176d3561a369a resource00870.gif +106b95684971aa0068df876838081cdc resource00871.gif +30b18dee2aa9ee7a07606937df73ba6c resource00872.gif +ecfffb29f9bad580ab3f4b8bf0ee5724 resource00873.gif +bb1df309683a430be92deff7b7e463a4 resource00874.gif +7ef59db9e064b470140ba64f6720926c resource00875.gif +460766d06ce5ed1fdf422345ecb9fe4d resource00876.gif +a0bee917194897de456f9067cad8c50d resource00877.gif +1df0e4d7e77b4a5ef812441f63e03b93 resource00878.gif +5180dbfef3e9af34f42379798b439824 resource00879.gif +bb8fe8a749d9fde3fb6506872029c471 resource00880.gif +93f1c2eb3c18c3ed9d50a3939c322779 resource00881.gif +e2d7b72a9980e3b9486fdda0e773264b resource00882.gif +6d33dd8f9a6adaa9f2234a1dd4f4e42d resource00883.gif +f0658e904f9241877ec4bf6074eb66f6 resource00884.gif +f04794fcde9c102dcbf948955f4b746d resource00885.gif +e9e728f2e83d0a307e6f415f53590b91 resource00886.gif +b2041ced46d981c78e12e04f838886d0 resource00887.gif +85acb871ca755cc88809fcf2bd9bba84 resource00888.gif +fc910cfcdb5c5638ab07d535787c9c46 resource00889.gif +db9f84e15af228f9dc797398af911927 resource00890.gif +8496004f873607e2d6ca5bc1437806ca resource00891.gif +dd2f1a575028a6f2c7473fe4f79abcb7 resource00892.gif +7ff9b4a1494daca47a5e12ef8e387565 resource00893.gif +90c8f5b9cc5efb9967d6b3dad8e49c22 resource00894.gif +639ef2a029f8ae06ff39992032e32bdf resource00895.gif +81292538c2da0d7096567c81e94dfc2a resource00896.gif +0eb46e71f2ad54374cc32bc1b1a0a556 resource00897.gif +7079251d1e5d89c314fce10cd7d80e4d resource00898.gif +9bb61c34b148f12ce796fa99ab455dfd resource00899.gif +ffcc2e5baba317d6e56c817423fd5e46 resource00900.gif +9aa0cfd81f7eb46716a24ff7dfcc2842 resource00901.gif +51b0a15a5324b64c4a7c4f4eb45f7714 resource00902.gif +5a66e6358efe06a3fa29817efd296ef1 resource00903.gif +59e8d96ce3b1885c71ac38bc9c686164 resource00904.gif +df5b31f2af49b3ddb1570bbf6883b6ce resource00905.gif +4c60169026963957db2e79bf3bcb22f3 resource00906.gif +4ad125e7c4958bd4b82dbcb7340aec28 resource00907.gif +01baaa1498d29c818b6eb607c964fb4a resource00908.gif +c96e36aba15f55cfa1ef1520e11715c3 resource00909.gif +1d982c693c551793cedb819a4cdd7ab8 resource00910.gif +3931be767beae8d8bcbeb6ff343b76ca resource00911.gif +343e80075fa72d063dab61698aa94782 resource00912.gif +7bd8f9f880a7b71053cfc5928ee32005 resource00913.gif +efbd5eac9e586e3218ed193563b68b25 resource00914.gif +9aab3da3ef3530dd24900732f4f9c116 resource00915.gif +9f7abdd08a949a71a624b00a16ea3ad6 resource00916.gif +de8269d410ff9bac9587091db41ab5ca resource00917.gif +751d360eb19df299082f0d6c1b6e6241 resource00918.gif +04f84d1ad4841adaa144e7ae1fbff941 resource00919.gif +43457172cfabd913b4d5446b75b23b25 resource00920.gif +a61fd85290113a126bce288c550c463a resource00921.gif +11804e7c321f52ee8c658463af6d2495 resource00922.gif +a11b553e53d92aa942177e7089c2222e resource00923.gif +542f9aa6ca7f6be9b1963a3ec026bf88 resource00924.gif +188d1f628521eab8d8553f29c9913ace resource00925.gif +3fb1ecdea749f57f779f35a5fa1394b4 resource00926.gif +851390c9751cae22f232c1f3d2d99f4a resource00927.gif +ca6f7a7b146d590f4b2f380092d640cf resource00928.gif +6100132f878b13e47140f94796f0334c resource00929.gif +ba5319ea24ebbc273a5f3912dbe8b6bf resource00930.gif +aea039f533872cde6afafa3d3359aaae resource00931.gif +84809858798b7ad4e3834c282c61f693 resource00932.gif +14def573fe3b7474f3961d36ce29c587 resource00933.gif +eaab2568fc9403970b05b6fc2ebd19ea resource00934.gif +144e8270d32d21e86d5dec6acbc8b572 resource00935.gif +031e001c1f2519bde349d7e97b8b465d resource00936.gif +25ce0fa9836efb2764e38c81ceebfc57 resource00937.gif +c26c327148acb472ea3784f56348fe49 resource00938.gif +ffa77db1adb63adc2805bc55cf15b651 resource00939.gif +f7e7f0b7dbe63bbcc71274848b96086a resource00940.gif +b09de8bc7d22a56692a3f578facfb617 resource00941.gif +3f5ad5eba42c699de7e66398e1879e71 resource00942.gif +e65b10aaf7e952697fa690862f188d91 resource00943.gif +b76a7ce3a7d85f3c10c91a752f6d61c0 resource00944.gif +13858d511f4c4f454772952bc3729917 resource00945.gif +f403f13d6c953fd1256bddba60826e35 resource00946.gif +83e2606fa5dc2fb74bc20da4f55917c7 resource00947.gif +714749757720c91536284f25aea08401 resource00948.gif +fbe8064a01fb1e03db74f8a18ac934ff resource00949.gif +2ff40676017db8878c1ddc829b1047ab resource00950.gif +eb05f042c4145088532cffee3851bde0 resource00951.gif +becfdcb6d3091378c96dae66d6b8a6d1 resource00952.gif +6a2f4e8fb49ca01667fbf32db2f702b8 resource00953.gif +e1cb727720158884a5410b13f0fccc4e resource00954.gif +238b7d523f6fddd8c789fdba3bb24674 resource00955.gif +e3f3442497b38ed3d28bb6dd57c19541 resource00956.gif +3301487330faa3e4c3a01173b586381b resource00957.gif +fb4d11369b4e5956c9af9e19d410498f resource00958.gif +d2d1cc362f60099906e280f228805a64 resource00959.gif +75aff5411d57ef9e5be55279e9d590ae resource00960.gif +acf8ac3bfd13d7ccd5caa1c7dfd00495 resource00961.gif +9dd14329993caf250141e6640b5d6010 resource00962.gif +b020af930d5fd681e2327729ca2ae5c6 resource00963.gif +ef1e7397f3fd138cd19ff6028b9885a6 resource00964.gif +6bafdeb2aa2722c0807abb8d3a06bf61 resource00965.gif +ad8649663d6a0217bb45e56baca3531d resource00966.gif +dfdbaa5c5bf14bb3329fb4b0627165d6 resource00967.gif +57f5bae8b180ed002ef3c68b6f890a1c resource00968.gif +3ce9f9b719320a7969b122dbbe8aa1a1 resource00969.gif +6148c046b62a3bdb6bd4ed8402d1c613 resource00970.gif +8a5ddd62d79e694ca02e12b6b3a2d854 resource00971.gif +883d8d79deea9feae063033f44d6a4cd resource00972.gif +cc9de9aa8c57dd569afaf026af5afaa6 resource00973.gif +a6f3defac0ff6cc7cb6f326241e46220 resource00974.gif +4b866269be679764764b31de0f18c076 resource00975.gif +fed08cd24d1e455cdfe2d661aa83b6b7 resource00976.gif +c0c7b9dd4f450f6da3bbc4f6c05f4436 resource00977.gif +76c5c99ff1bc7157c38c0e6c711a5fa4 resource00978.gif +7e1e5041870eb310a00fe482a94382ef resource00979.gif +c01fb42c241ac670c4d6b4634ce99417 resource00980.gif +7f11585a051416a2100916f549965b16 resource00981.gif +43d4209d7e052e72f8d9723b6427de43 resource00982.gif +b296fe629e7896ef8b553c2c8f704ef0 resource00983.gif +70654f1b4edcd2896ba7b7d58ec63587 resource00984.gif +b23c73b5535a28703664c87f8624311a resource00985.gif +da8f3b962d6eb38b8affe4935605fc3a resource00986.gif +902fa2136542b4a696a03a32201374e5 resource00987.gif +42314916da023c1474b46c312b41142a resource00988.gif +50dd2a5096e5ca57c27d598c90af421e resource00989.gif +2dd585be6276b87137bab5c1caf47d34 resource00990.gif +ab0894c8a9c255909ddc51b7230cbfdf resource00991.gif +1b124f4986e8e9e150c25e0408458fda resource00992.gif +030e5d8875d9f7a7fa156c4b8f2d0f77 resource00993.gif +b5e4fd10f07d2f404c17739c733a20ba resource00994.gif +5da789213c6d49e5a6cc09e45e85c620 resource00995.gif +a82e4b5cec1c25b73a286614724f57db resource00996.gif +b84a647f9e7d1c20f46940499f2d0ac4 resource00997.gif +02cd243301772ef6f84b443e114acf7a resource00998.gif +91add33c8dea09604e8e499fcc2a30f9 resource00999.gif +04a08ceaf9f0b9a80d2bcdbb82da9c21 resource01000.gif +ad664497da52d1844c3cf289def0e712 resource01001.gif +21e18117160847ba2c49894dac63ad1e resource01002.gif +66f55895e52575ad6c978196f18c2521 resource01003.gif +0311728c54d051ab8ea576b4bee8fe26 resource01004.gif +eb4754eada42fab00ef165445a0f3a3f resource01005.gif +c9a4b6ee84c3c17b5499d7ffada9f99e resource01006.gif +98924aa19accea2634729f3a48f0241d resource01007.gif +74c39dccd9ca263ffee8095319dd5bdf resource01008.gif +d3ecb5c270d24ec852128aad62695e8d resource01009.gif +aed56d59ed07d083abf38af11960602e resource01010.gif +5942e3cc97f85b22b69bee32911d5e67 resource01011.gif +bbeeb6570f14a2f17e7e39b76874539a resource01012.gif +6b08cb804c76e4ee89f588ba56b30285 resource01013.gif +415e261ce6818abab802a5d16bc1d3b0 resource01014.gif +2a57f1ad3f9df353a562a5efce18ca08 resource01015.gif +b0b3bcf6f1fe36f0c4885eec1c2e14d2 resource01016.gif +3e17fba73660ab24e7aceb479d80eb02 resource01017.gif +f64c8a74088b06f34a1c46aa2b155c01 resource01018.gif +1a153c6fc154946b975b4749068f84c7 resource01019.gif +4ea43a25359a5629b3f9b75df86d55ee resource01020.gif +94a456f2f3d79127dfcdeea66d515f59 resource01021.gif +702b3bc51ac1543bf122fbbd47d87a84 resource01022.gif +4e0646699daab82b9b504cc2a102acdc resource01023.gif +eb123ae9f224c8bf327d3a19bed96e0a resource01024.gif +351d233863817dcf62f853e05f7f21a8 resource01025.gif +97261eb7000e440536514d37e0d78c40 resource01026.gif +887968d9d4ef65ff101a6f8c80ecdc68 resource01027.gif +8736da0ce40638dd78986262bb005060 resource01028.gif +66109ffea86ff33e74ceb20ca4541531 resource01029.gif +50d42bf6b141f59b4602c2dae451f5a2 resource01030.gif +af1db61631fc05d3ace87c834ea3b3e7 resource01031.gif +be557888e384ca89a4bf85b4f128251e resource01032.gif +59db7623cf50cf2fb58f5251425e0a30 resource01033.gif +ea3881c34cdbda8cd390e32aeab561d1 resource01034.gif +ed084a25ec4d756a9498a43602f97eaf resource01035.gif +46572bb9acba8486396be54fd1ba2561 resource01036.gif +7af567f322f65703c3362866445df8d3 resource01037.gif +4a5bc0bb431f293b8bf6dc9b59ed69ed resource01038.gif +576b6e899b25b1647ed86b67a9754706 resource01039.gif +5d0975a3565d322643ba3bc8b2d461e6 resource01040.gif +9cd230a90eebaf3498ba5230c18c3c43 resource01041.gif +5f1d7984be7f176beccb86881e18e14b resource01042.gif +b6486fc1bf32cc7ab19d58e8468df36e resource01043.gif +4d7e14475202d357055423618b29c617 resource01044.gif +da54872e06a36c4c8af60f03537ca887 resource01045.gif +55ef66131a23d2430a11d317fb8fbe88 resource01046.gif +2ab33d613a854f4611f7699290bd1c17 resource01047.gif +763b760cce6e8c6443435dce5ea4297a resource01048.gif +ac1b25f85d439674aa167592b36c69a8 resource01049.gif +ddb0d9a9d1aa05e4863cf8c2e28f18ea resource01050.gif +be31be5d21a99e7a327f4dcb4629803f resource01051.gif +d008b616fed02bf37c726d27529c3d98 resource01052.gif +daf58bc51315887135550741f8ad032c resource01053.gif +c01ee1eeb8858a40ab94df8168e0aa5c resource01054.gif +161d604526b49d6ccabaaa248ba4331c resource01055.gif +351fe82c7086aaf3d0d9d4b8ed4e07e2 resource01056.gif +6b5b53a24801de9eb6d54833ef805b4e resource01057.gif +8ec6d965e3e9e5d6c88c322e993a2cbf resource01058.gif +828a5594abc135a19c919b3b082d9611 resource01059.gif +46c8d44cb2c6b3b46604ab9e0af50ec7 resource01060.gif +8ee87dad02970e539e1cecb9e0c17ff1 resource01061.gif +01881398fc7539c95fe1e7c31fa2ac0a resource01062.gif +aef4120baf1c743930ccb2da57014928 resource01063.gif +a8a1b3640d2cafa5bae87eb542b9d2e4 resource01064.gif +03f82b6e54856ae8a455f8f69e6a5add resource01065.gif +5545efc6a41a6cd0286252814ddf0e6f resource01066.gif +042953a24cc941d9689d6d3cdfe35953 resource01067.gif +395d882ee93c9aa52723ffc95af4ec33 resource01068.gif +6b9675d5baf26a04902c28472802dd02 resource01069.gif +2266d44db1a979b710d06e3196fd50dc resource01070.gif +3d34aba9b8444e162a2d2607299ba8b8 resource01071.gif +64df1063b459460d6a1083725ed81aae resource01072.gif +4b11d7c7ab43833f6ad0e9caccdf0b3b resource01073.gif +03cc1efa9c9dcb701b5a8be0c2a85240 resource01074.gif +7c63d07e76111fa358c619874a7b1fe6 resource01075.gif +2550b364dcb958dc41d8d772c2fcb539 resource01076.gif +cdadb7aa6a5dc8ce1bf91edb6292ed92 resource01077.gif +9c870b93ce45989b587630e8226eb4a0 resource01078.gif +80496663f6e914bf4c1c17751e5ce7c3 resource01079.gif +fc9ffa52e1fbae771c3e2e3d39336bfd resource01080.gif +2ee71ea633d0f032d25c0513a7c72ba5 resource01081.gif +04b3dd7f7697c50783e6872de411149e resource01082.gif +23a24e9283317b4b09a546e34fd22c17 resource01083.gif +9d3d6d91a7db49b630f5e7f9ab908bae resource01084.gif +ff118f212d561c7652e07b8b96ac6bd5 resource01085.gif +1ee07ea2ebf8f34288a5681ff17a8db6 resource01086.gif +bf8bb7855400340cfd4a0bbddfbf3b83 resource01087.gif +11cbee9361fda2b796fa438189109bd9 resource01088.gif +fe6ef5f6c7337158ec4e43a59378ad6a resource01089.gif +01ace04133d0af3946d935cf57e4d503 resource01090.gif +6085fc2ab1a2cf951c3a8816beb3b93e resource01091.gif +8af6c8fea6b1634fbb1a44d1cda9d703 resource01092.gif +25580f9129b0383c780a97ddad4bb83b resource01093.gif +0b786e0aa5a348789edf1f8b4da9db46 resource01094.gif +dbf854ce5dad0d777f35036f0e485d63 resource01095.gif +120df41f52b4d77cf4efa56d1c6aa05a resource01096.gif +ddd071bc6f793f7b08f7732f90b58b43 resource01097.gif +c635979c94a7b26d368fae3b620b1afc resource01098.gif +22b1a70673bcc281f7a8de3df23098b5 resource01099.gif +011262ad0d7ccc99d6e53f55a7c08039 resource01100.gif +fb50cd86ccaa76f2e2ff3c3259281ffb resource01101.gif +b4fdb1243279e7892a23b4d05e5f4ce0 resource01102.gif +8fb9b742d4be6b84ae36e1ecd130a668 resource01103.gif +6c74cee2f347e04ee2563c1a33c4595a resource01104.gif +5926e22469bc1bab08e6143495cfea58 resource01105.gif +4feb93c52a4c15ca74fa65e3d665a21b resource01106.gif +c5fa014ab2c4fb8d7ff1e9090ee826f5 resource01107.gif +5ef99c7f38da2a9d4aa49948a147c642 resource01108.gif +5b1ebe1fa7286138e5f566c65a1d19ac resource01109.gif +4df7fcdb93f86efeeddf8718aacdfc95 resource01110.gif +e706c3eadc59f53020464225e8218e84 resource01111.gif +1513754dc9c9a579ee738cc9e21b1f88 resource01112.gif +c92521f37bcf07680df33170b8f3bcc4 resource01113.gif +5ae5429d89e6a2bba0e08f53e8a66497 resource01114.gif +30b7a8c6ada67be5132b6ff6653bdffb resource01115.gif +467370d7a0baed057c57a76dbac38e24 resource01116.gif +b73b436c38915dbaac2e7eb04e2b84b8 resource01117.gif +2d46d65dc994545c6262b83525f07216 resource01118.gif +8348118b29d6f43ba2128d301bdcd02c resource01119.gif +84d82d9490dac7bd2506275a746c8338 resource01120.gif +59414ef3f0cb8e6cf4ba1581a48dc9df resource01121.gif +c8f438b9549d6c255475cc303c81a8d4 resource01122.gif +2622e19cc4a6a75632828b47809f632e resource01123.gif +09138217ad62c24a89994fd2f8777ca7 resource01124.gif +bf67be1c7dbd56ff12af3199dabf9c99 resource01125.gif +7ff9b12e3f1417b030155f349234e99b resource01126.gif +917473ab4ba14ffc3d16519160b54cdb resource01127.gif +961e50280d720d019ab143df3434a2e8 resource01128.gif +7bd80de6f7a686b16f337818e34d092c resource01129.gif +b6b4516aebf4e6ed4766c24aabdb7bf8 resource01130.gif +a80e78d193bb4b69bb854bc9f52e9f6e resource01131.gif +5615ab936a0562347c16d0d3d0e90d3e resource01132.gif +547870e6b078dc4d3accb5fc3d1dd1ab resource01133.gif +9684d37551af340e293fcd198dabd20f resource01134.gif +65d36b6dd9388ce1d3f64f775161318a resource01135.gif +9f149fd2c54c3e1041d16be9e86bf430 resource01136.gif +e391444d188b7b885f76c7748edc37a5 resource01137.gif +8a850d7d92c6e1802a7050eb284d707d resource01138.gif +033539b6bc6750736629d3b4cdeaf20d resource01139.gif +51d739c92256057dee53d970d3332479 resource01140.gif +f66c0bde5f05612c9026c07fe506fce6 resource01141.gif +d9c857075924538d53e83509574d71da resource01142.gif +4c73e9ba51ec34a80d602ae75151a26e resource01143.gif +aea335dffba3711f4f4f3f7000ef64a1 resource01144.gif +f6aef11dc432a599033d1eb3b472933a resource01145.gif +8e25b73d625a2add6776a32165199bff resource01146.gif +30528a201bd9c607e823afc1c8dc80ac resource01147.gif +9482fcfeab027435236c05f8f9dc315f resource01148.gif +90741b433c329d57004860157fc3027c resource01149.gif +a9b158bbc0c5e849f3a8a69da4c3d777 resource01150.gif +4a17aa10a2ac9927a21880ed85e7cd48 resource01151.gif +0b63f75eca77483dd4b86a784f27acf9 resource01152.gif +b1859787ba331dcdf8094a787395fc20 resource01153.gif +d40823e02a9a41741f466dec8e412537 resource01154.gif +684c9c9e5aee1bfe237970f81e7cdcfc resource01155.gif +a098cc6f8dfef0ef09075703f32144f3 resource01156.gif +72738911d69a2e0a9b0cc4901be97442 resource01157.gif +5d9d77accdfc9e5900200fce2678e2af resource01158.gif +e02fa58932cdb593d3ababf3d054907a resource01159.gif +846a0d6f7c6717d82fcded665cb03c6b resource01160.gif +3368bd76af85b7cecc4d7373b4904797 resource01161.gif +33aff431697f696e16f57776c9e4baa8 resource01162.gif +afa64b71918efe84271447d2bd921dde resource01163.gif +69568f8ff47fd881a9fc5756ae498c1f resource01164.gif +dcdfa793177430a75d339172d6d7de7f resource01165.gif +30889b9c8c9972294a1971c1b374c77c resource01166.gif +c9ef6cc638bc04c8c7dcf8c0d7424b7e resource01167.gif +795c32939b8f93784645e2ae2b2e48d0 resource01168.gif +c12a736ca204b2fe0ab8b3426fde2d71 resource01169.gif +993b038694ee84b4c0acf591f80c413e resource01170.gif +acff809dc8e98542a43193df015434ea resource01171.gif +742d68c7277f95411ac9a27cf5c79d4c resource01172.gif +43a46ff14d514612536e501e2c7a5b50 resource01173.gif +666a8354836ac7a29b4bc427926cb253 resource01174.gif +48b6f88f5583c78eac1040442f5aec87 resource01175.gif +baadb016e57b8303ef3f2eb99e9b7ba9 resource01176.gif +2ac24541e33c95bd8d51501d050b6328 resource01177.gif +1cbeb9ee6d6cb98c70d2985763049b13 resource01178.gif +e6304547bdbf113c8f9c0764d2dfca0c resource01179.gif +17b0b735c735ade08040d4b5795338a7 resource01180.gif +b14bbccafb886032ca328df64d87d4ce resource01181.gif +21d45587a3471889148857c8f586088d resource01182.gif +909b0e36db49b97fdfec05dc09350105 resource01183.gif +b361521cf492fbdc3449c6fffe495b7b resource01184.gif +1ee8145078a4eab321293298df79104f resource01185.gif +19f4e7d9c4ac46f8c510b2c02de9592b resource01186.gif +a2a05d7bf2e383fcf02e8d103f82ea0e resource01187.gif +5d04ee973eb06b0e1c9bd02b7cb831b4 resource01188.gif +a46daa37f66c209030088eb703e8a6e4 resource01189.gif +7f9164b3dadb5f8ed8a0355b62882d37 resource01190.gif +dc6f6717eeeaa8e763b69a3c7090b04f resource01191.gif +94ca2e4afb85c84b2eb869f8a48ac76b resource01192.gif +04056dcc48d8fb78e845814d525f2160 resource01193.gif +61631d71bc61c0b73fe2cdb327f44fc8 resource01194.gif +50751e1ccb0bf16924f2cdc8eb4d9636 resource01195.gif +1fbd218e520e449c7c35abbe10a9db6c resource01196.gif +cb8ae0d67072ee0a3de9aaafe70ed761 resource01197.gif +d84bfbc224004112f5bbee5322c9daec resource01198.gif +0ba90ddd30b102da066467ddc638ee2b resource01199.gif +03b89a494875890d29bac8a4646e1d6c resource01200.gif +fad4f76ae6891f36e84ee0a387b008b6 resource01201.gif +9fe8fd11527610a9aae440d10f8d76ce resource01202.gif +e7677365785be0987bce0ea4408c3790 resource01203.gif +de074fd8a4ea4ce8ef1732f43e5200b5 resource01204.gif +f36353c4143ed899233274971e675d50 resource01205.gif +65e2a92d2f17f349724e24e0bdd80c98 resource01206.gif +b0ed61ecbfe4db6db14f8b48e4fd7ad6 resource01207.gif +7325abb180662601918cf8b9e7d8a66a resource01208.gif +f6efb03209e9e620557993ff444be10f resource01209.gif +25fc87e6a5241f1def2878aba0400cba resource01210.gif +9308843d82d9aa8e814bcf1cbf49e9d2 resource01211.gif +8c5ebf463cb592b1ed355a86b6fc91ff resource01212.gif +dc830289e161315a5036b8b37b8b44f3 resource01213.gif +0c6f5231ef3e454981b273b486d282fa resource01214.gif +9fe8b7b5f6917c305671952dfb7f2e1b resource01215.gif +7f120ae8503db210a501e646c21a8848 resource01216.gif +a9cd2d3b21e28326f805a664314f6709 resource01217.gif +9a932ca9f3f1ba1296a9eaf66406386b resource01218.gif +5f8347872e6a04d084b0c68cc11e55fd resource01219.gif +cb79a835831b5a915a1a28e2c8595661 resource01220.gif +1d30442cfe1d460ead13078ff799c8bb resource01221.gif +e6a454e01ed7fb4ff0e6b3d42e33ef68 resource01222.gif +4e85664b98d339acd9ce80f8ec4b6239 resource01223.gif +cd608450c19ef97253a2a58edda3ce47 resource01224.gif +48f0fde3c947465e3097229a4abf01b0 resource01225.gif +c3e205a11d2f650b0f5b4aed7a736e80 resource01226.gif +38c026d1060c058d87ac6156a8fe114c resource01227.gif +66fa946f30e26e3c68e7e5bff922ac4e resource01228.gif +029c71ffe860c8b8f76389817a27b24c resource01229.gif +dae59b21200aa82474e406fcad00a440 resource01230.gif +9dabd01dde49b8d0cdb6db555027e567 resource01231.gif +b292affa1bcf551686be29edb0e8dfec resource01232.gif +427130b68c808612cf00126e3855e00b resource01233.gif +5db6e8fe40453dcdf1a4e7cdb10a33be resource01234.gif +5bd035ef0f06934ccf9a97101bdb5d7f resource01235.gif +8e063b9167bec9cd9e8a5ec2c73e1444 resource01236.gif +c061e9ff408a7de892783ca402e2c784 resource01237.gif +2e0abf3633d695609b072e1c674cfc4d resource01238.gif +d271f632631529ae8d6354b1f8493ca2 resource01239.gif +4c3f69688d2266e7cb3c335df314f844 resource01240.gif +f4cce196a6263c7bcaa7e0c5f4203e49 resource01241.gif +6891dd61c8985c33d652a0e6b2f61742 resource01242.gif +ad3273ad304411bcc513e540617081ae resource01243.gif +11445745f1d12a6bab6602bde514c5c8 resource01244.gif +b7433e060ef6035dbed2369c8660e836 resource01245.gif +e7e3e549c08295e4d593fb8e61cfeea7 resource01246.gif +aa200cb1d8d83a450fc9ddd51c712615 resource01247.gif +b86e489b0ac966b652cee6c41e1dc84d resource01248.gif +e552d3c1f7dee74832398a2585334261 resource01249.gif +1c1d296e4204d928932dfe714687fe3b resource01250.gif +e77992bac12ac4f34779ea135042856e resource01251.gif +1292face60fb0f1393ccd0f2c82f5a8c resource01252.gif +93505561633b73a1d508b7b5be9a3937 resource01253.gif +e5754f500b51e8fd838b00fc23445ba4 resource01254.gif +4d22912193a3159dc6f5748aa7ac74fd resource01255.gif +92b144a16cfb1a2bad2f6f953b3e389f resource01256.gif +158bd74faf7f66db10010eb6e206f6d4 resource01257.gif +50683a0e38240130175267e4c5f5d1d2 resource01258.gif +f0c2c04ee8a2a4a877bc507cab0e3ad6 resource01259.gif +ee752aa8af0c2775756931034dec0a0e resource01260.gif +3571dfcfef75594b3be0afe1d82e7dc5 resource01261.gif +f19223e22ffde92a9ee5c490d3377657 resource01262.gif +30c5b8bd8a8398ab08108b26e43fe4be resource01263.gif +b176473a28b396b7b78c70f4071e7820 resource01264.gif +45f8b48bf8053e26fd8850069c2f4bf9 resource01265.gif +b83aa67173f49d14a8345b0f5b54ed8b resource01266.gif +80cedbc6269d06f867f4fda630d634ba resource01267.gif +e537557b56b7ef36907367e1b3896e60 resource01268.gif +a3caad693460272e74a1696452c372bb resource01269.gif +179f810862720b0a8988ff5c53e23073 resource01270.gif +0496ee0c31857db20db73a66d5305885 resource01271.gif +432bd54d6c7034d6311b9719e4a591a2 resource01272.gif +6c5b0d3c4d5bc10e0dd99b2a1daa8fa2 resource01273.gif +aa1e663db3a659ba8c01c1fb280983c5 resource01274.gif +01702fa6dcaa05f5ccb05d9c36987f0c resource01275.gif +476c411133c60d16f33daf3c348afa5a resource01276.gif +9712a2c9eb78c682450a2154207db6f8 resource01277.gif +67c4f897bff991df79d51c7710f4e9b8 resource01278.gif +483a8d874e5a8817f9e61d6c8ce1a015 resource01279.gif +e4b7f81e1d13a9fcb01b1036062c9a92 resource01280.gif +b4bec1798f3bdced70c6e5aae9342255 resource01281.gif +f5de45fb59d36153958d9fdaa3794551 resource01282.gif +97dd056215543102c8c616bea94d7017 resource01283.gif +215b8cb7ba12bf1537e2638e9d66c1bc resource01284.gif +9f0092b78b8781cfcf39e30e6d3e9bb5 resource01285.gif +95cb82390ea33c161d8b513813aa3a8e resource01286.gif +530f173d69e1522ace4acdfedd2c5bed resource01287.gif +11176438c82610f24f297214552cbb69 resource01288.gif +60ac316e75db18ff3307876d7793506f resource01289.gif +26423f78573ef0353c7fce1750eb60e2 resource01290.gif +a03445a3e29fcdad9865fac7cf319e2e resource01291.gif +e48683ab70bafde71cb00983abd3f423 resource01292.gif +8b7a109a88c91cad445834b83e97c487 resource01293.gif +7dd12ebdfbc54a044d2cb8541dfe668a resource01294.gif +1ce144e7c20487322c7a20d6e49f0c46 resource01295.gif +f69c1c6320f87ef90ad1da5aaa22fe9d resource01296.gif +f73ccbd400615703e0c82ada1f123ba0 resource01297.gif +3b4afe547cadc52d12d8516c0e0b91d4 resource01298.gif +e6a7aae8a25ff95f641776caa47a9034 resource01299.gif +ac84714f7fe0873eea69a43ad2530a59 resource01300.gif +360d2a35975c90c50f1c2788baaec9f9 resource01301.gif +8c81f93eb2a1619bf6bc27cf5e57840d resource01302.gif +f9014f372faac14eb0d5cccf614f9efb resource01303.gif +43d2f8ed509d5d408d983e8c1c052157 resource01304.gif +c22917d95a90af62e589d01b185595e6 resource01305.gif +401261c4af87c5beb4e71d0e8514dfcd resource01306.gif +db58c385419cabc548c9d51e27889e72 resource01307.gif +5bc492719c39c605839c5ed67c8506db resource01308.gif +7f93a6f66b14b8a44e02e304e2cf6413 resource01309.gif +f931d596c4a34359799a2bcecbb5b381 resource01310.gif +cc973d5f447d520127cd1a7d4b62ac1d resource01311.gif +a2c37463e38c31164c6f02e957d17c5c resource01312.gif +98fe863119830c2a2fa5147556125d13 resource01313.gif +37d8009f21c0191cf20a4102accc5635 resource01314.gif +5061d98a5f6be1b738c5d3e8845a53b3 resource01315.gif +5a6bfd84905fe20adac5b8245dc5f077 resource01316.gif +0631dad2a023569b82da521801230593 resource01317.gif +50b3a4b60cbc8d421fe1c4dde663d80f resource01318.gif +632c4c6741ad4fa0c23a6b35f456682b resource01319.gif +fabf177f59222c1638ac1409361d279a resource01320.gif +5477b076d57f290adfa0f73fd69fe930 resource01321.gif +58870d6c825c1a950e3afd56f8af58d6 resource01322.gif +ca717caa1feb57e1a2b57dc12532fa3d resource01323.gif +f7f607bfc2ebde125264b0f9e5e009fe resource01324.gif +a5ba50a511eeb0c5d0712c31505795d5 resource01325.gif +ec2505bb00d0d0951c57b6b2e0998a48 resource01326.gif +9c3d34cabdffaa98d7c220bfad9f8920 resource01327.gif +80eddd836b2f195afe111e334b0bbf44 resource01328.gif +3e9fd9c64fdee0c2041c7e193ffbeec2 resource01329.gif +a1d30e1a8dca88a67994a45e281f4582 resource01330.gif +f3e833fcfb33baca2b763dc6c7b75fa9 resource01331.gif +ec1efe22f7d686cd5de83258bb753bb0 resource01332.gif +d2c58853a953899815a66c16792c570d resource01333.gif +d562460436741422cfe70722a65d24f9 resource01334.gif +2c77ae1bb82a5f52d4ce710b9724c230 resource01335.gif +6990dbd0c7faeac662ac243e36c5e23e resource01336.gif +7a6544e55af268f28bd98887bae05731 resource01337.gif +48c80aaad3e02a4d3a71aad3498be1dd resource01338.gif +e80917bd0b16cafc2a5ce7c61f62703a resource01339.gif +f62cee8d6e499cd9b0ed1a794018f755 resource01340.gif +92bce3cc242256f4f22bc30dece7ad04 resource01341.gif +6f20ed2b0ad152087fce6e9993327c87 resource01342.gif +bd3f7b374a8097f2d72bc5d97778927c resource01343.gif +2b9de7eb3c79a6347fdd71ce14a69435 resource01344.gif +57d4caa1c2a86e353b01ef6ddce4a1bc resource01345.gif +3ebaf96bb92148a67978084deb8f1a50 resource01346.gif +3ba6cb060760f1fee2117be871d557fb resource01347.gif +b5f9015e617e8b020d82ca8a250891b5 resource01348.gif +d3d4613f77fed178d462e067cd92dd1e resource01349.gif +12bf12a6a3d1c82c3ddd1decf04a9992 resource01350.gif +70a265a38fef34bd4a5cc302fce7f09e resource01351.gif +266b3417fad5e78205e50d018041e0b5 resource01352.gif +fc6fafb38f5f9fbe5572530f8e761c65 resource01353.gif +6638684e8401b056a492a9567be9c2ba resource01354.gif +a30a9595ba72100791492d54e57aa381 resource01355.gif +39b49dd6d43bd3d006a787d0de115127 resource01356.gif +74e0b832b5d6ceeb1bc402550b87c003 resource01357.gif +8064a6dce799504fb5f8ca123d3ab6a9 resource01358.gif +a769fe5a256907ac6b8b85ddf36c5562 resource01359.gif +a564d2f17a2e95c4a1725363db2fd62e resource01360.gif +ced873e79eda650bd6895e03c5822332 resource01361.gif +640e77bdbd15beedb972c10798fc8bac resource01362.gif +40cbad67253cf3ba3cac9551b4711505 resource01363.gif +401f79b9ddc842f3f0d2336309a398b4 resource01364.gif +490477893d1ec3299a1ec63bf7a514a0 resource01365.gif +6d3912979b06d068ad4f379f8c7e57bc resource01366.gif +cd950c68c2822746036d2816c318687f resource01367.gif +fc5025566555b46c2005aeef9609c016 resource01368.gif +7b92beb7571fdfb3dea82c5bf6a4f6b2 resource01369.gif +cfea2ce8ff12c7131bbb6bf23e9c5921 resource01370.gif +6ed8fdfe008b25dea2ca16a2537de7e8 resource01371.gif +9c2e10338ef32cead8e8224e7629eca5 resource01372.gif +4ddad9f16982dc81b0a5b5e4969dfb84 resource01373.gif +746c712c08038d1d975f48455a860aa3 resource01374.gif +47b3f052d96e4fa393ad66ff20a9b333 resource01375.gif +e5664ef91c16f1806d737f35d78633bd resource01376.gif +ad3cb6ab6cbce9306ea10b297a8eb2a5 resource01377.gif +b4d5610e23f9d6e606db8b0fd253b141 resource01378.gif +07190bbe8f5067a676e69777af07fb87 resource01379.gif +55050628f60706d9e2c21d85ec62ef07 resource01380.gif +0aaa0e1e7c04d9ff13602c8e74f967f6 resource01381.gif +4c04054c0199501e522a8e2087e8d1fd resource01382.gif +997588dca48cbf652d47f5918fc72d84 resource01383.gif +8a22925e8410a0aec14b964b272bc6b2 resource01384.gif +de90c21f0a3ca27cde0c8b4a7ffa9cb8 resource01385.gif +9d898e576a295c7a5de1cfc2cd49e1ad resource01386.gif +c70d0cf2394c007bfebae9d84f876cb3 resource01387.gif +065c6d3e98a5a1e696755ca0e70fa5a4 resource01388.gif +167393fc65f317bb27d35f392151c58a resource01389.gif +39f49c8428abc45b3cb641be0c0dcca6 resource01390.gif +25241c9943d4293a674925a9fb8d1d45 resource01391.gif +be9740551176ceb3ee182d8556520c82 resource01392.gif +36e54b92f5b3d1d14fab853045089aae resource01393.gif +a01637690dcc44dc5a9f05504e79ecb4 resource01394.gif +b78a6a9849b9b4b16e4eadf8ccb61f9b resource01395.gif +5f75b019f71e8fd2a610588d685a3822 resource01396.gif +ffc611d5c3bd37f429933e2c85ce3eaf resource01397.gif +7c36fd091a106cec63a8b9094b63187a resource01398.gif +61a2f9d3b473c2eda98bdc6894e88795 resource01399.gif +0c346cd10488ae0a4d91c9d06dc5dbaf resource01400.gif +178b835127284f7dd1c4864b9182c6ed resource01401.gif +07fb36b92c1dc5f16549248b08f14737 resource01402.gif +ebb4dbc6d8b32b7d2a052e01920a9959 resource01403.gif +c6347b996a7fcb175fdb4c7ef385ac0b resource01404.gif +0b06dfd79d509a97c8e4c11681410cb0 resource01405.gif +434fd639e3f9d8a82c9ce5212218bd64 resource01406.gif +66ec1209ac89101d34973cc2853686c5 resource01407.gif +025bf902bbb48d5ada098559b2222dda resource01408.gif +44bfda7a064a2d7a19913429c782774d resource01409.gif +b47bb55afafa791d52b3ec9646bcc30e resource01410.gif +da1bf8f18f7d5b0fd0074e9890bf9fce resource01411.gif +6968cc54397f2f7344668957e20d33e8 resource01412.gif +b76b24f6d8a54a7f82277c736d4974d0 resource01413.gif +b99bac6db185b278465471084be64baa resource01414.gif +a5f0a74d2d6bcfab63301878e139531b resource01415.gif +4d04a22eaa91f5f685143ddf856008ef resource01416.gif +c1e3a441bc0f9134fc87868ac8914e6d resource01417.gif +dc6c304a7ed7c32ffc121c69a5604b08 resource01418.gif +2d4bc1cf8d5e331a88172602237ec5d2 resource01419.gif +f3ae3d7e0d66d4e4b6142d7c8218e70d resource01420.gif +0eb9ce2c06b8c083ed37c1bd65e98353 resource01421.gif +c1cafb975c3e1c07e58b3ccea1dceb0b resource01422.gif +9dc163fa1a006077bb6854ebd1c042cc resource01423.gif +b75dfad3346ecf12f12712a05aa87acc resource01424.gif +b5c55c2f9d9d8c7978c75d4c01927dc0 resource01425.gif +3445afd8ee8edd5412d2bd47df61d94a resource01426.gif +ebd56d1fd02550e07829f3e52d972ae1 resource01427.gif +945f7b5373d121ee0e0335fdd4f495ce resource01428.gif +962cc54f1de98bdecbdbc41fbd31c1c0 resource01429.gif +5a4db0dd912be376616951bf46517f35 resource01430.gif +e9abc7d6d0d837cd631cabe9d25d39f1 resource01431.gif +3bef0b2f0e978aa6186d092d74526f8c resource01432.gif +9c6dc2f9a909c3fe07cc29d9a5a06f3e resource01433.gif +5e9f360ceb056d299e1dcee03275ace0 resource01434.gif +9e238539ed0ddb28047db5772f6d5fbb resource01435.gif +174027b6cd3229aa52e66eba1e685c12 resource01436.gif +58c049ba2d6da7477ad509e60b2e6ac1 resource01437.gif +4c3a3f8e5f49d1cf481adfff5abffe49 resource01438.gif +6e367d94c1ce2e0cd29109bd3bcb2133 resource01439.gif +1bfcf4ae4a55a5eeec435a7b2f779827 resource01440.gif +8953927d7bbe0151e4f5687b2594bb4a resource01441.gif +28d54a25a4d04f3138333b631578532d resource01442.gif +235efb6a013e9ac4dd861965f907638e resource01443.gif +6e81bf4c064533bb305d60491fa5419a resource01444.gif +43919657c2cfb434211abccc69278724 resource01445.gif +efa183b9e49a365797956a1748e1bac4 resource01446.gif +a813c2dd3005d698136eb395a3496836 resource01447.gif +0e686b7eb6832b5e4c2d54804fb0269b resource01448.gif +ea7bda3463d46995e4422b00dc743223 resource01449.gif +92c956b5b28c9942eb5bf3d00f0e3f43 resource01450.gif +ac58ebb7a706aa17fcbb7c9c7f24aa3f resource01451.gif +90a205ea5eacf51d98659221259cc914 resource01452.gif +85359b3cda663b087a94015ed0d368d0 resource01453.gif +2c92917ea5e0682555dfb4e22d44de34 resource01454.gif +ed618ef7333cf82159570171363e68d1 resource01455.gif +30f0fe66b4f0d77721c8819997cb826e resource01456.gif +a92c5110878b11969b851f6f28e8ff9b resource01457.gif +f720f4384f1827f01a1cd32eee980e52 resource01458.gif +067ebf37742a1230aaa422f28e3d6d17 resource01459.gif +fd34da81a343e353375ffacd154d1fa7 resource01460.gif +e3db3bde35ae3300ab48cbe517694563 resource01461.gif +8c9a90f7073825097bcdb250b9559ef2 resource01462.gif +65e802416f32d9d50ef8ef951d08a5bd resource01463.gif +9fb8faa9a2f79d3224e38b6c77471efa resource01464.gif +af4f3d82d2cc0c49b8dbee9b3e98cb5e resource01465.gif +1a3089ac9f4c6a83afd0d544c6073857 resource01466.gif +11e5e8be0352e9d919ef81f227eee9af resource01467.gif +31293ae8dda200b9a413d3b631dfffea resource01468.gif +429c348609a220b3547257cb03b948ab resource01469.gif +b4ae43b83473ad3539b38bbf98520342 resource01470.gif +8766946a2200d6db29de8201262fec82 resource01471.gif +e98821a0e8bc9ef141640471525fa6cd resource01472.gif +944b276001e8691059a177dd0e609f70 resource01473.gif +87053f3afde45ea0aaed57d9be7f393c resource01474.gif +0e77de2f85026df5ccf5adb7372f814b resource01475.gif +72638efda34aa513d0c87d28a2a3f831 resource01476.gif +ca5c138d6398fd5b9541aec75a0bc0c4 resource01477.gif +756168ac1fca00c7d6e5114f0953a8ec resource01478.gif +bf0b522294e64bca9ac75731202ab5e5 resource01479.gif +4807aa62ccc307ba85dc932ffdfc19b7 resource01480.gif +bbf9a3f2cb3ebfadbf2912929a2e8d5d resource01481.gif +ed944664fc37319f32ba9ce5c092deda resource01482.gif +76f65c012e5ac539dbcbe1ee32d57f33 resource01483.gif +8418d3180f165e0fe275881f75ef61ff resource01484.gif +051f9c5ca4b38415e259152bb6e3dc1c resource01485.gif +041fbc6f8be44053bf2f700e4ee8fb39 resource01486.gif +6eecb0811e04c349c73f94eec496cae3 resource01487.gif +afa2957b851131a40c475bd2743465b6 resource01488.gif +5c700d85dce7fddea3981a7467871844 resource01489.gif +9973b298f11f39f8d3be25ea5d1f6d1f resource01490.gif +5ce40c4f31b349d646a0eb8c37d67e69 resource01491.gif +17fe9022c96e4de0817b67d790ee465d resource01492.gif +8e1c171cd00f498789e3f09e9e83a860 resource01493.gif +ed6005b7d30e23f4bd8765d9f4241549 resource01494.gif +a800fd193cbbdd011039f3e067c36071 resource01495.gif +e7963fa736bbf307b9fd6e1e31372248 resource01496.gif +d36967d5125b7bd24914874feeeb1c21 resource01497.gif +0a16c84cd50f05c118578185f1ac0ba2 resource01498.gif +1b2ff6924aa3f5e87a0eb089ea4afb78 resource01499.gif +7f1b00d26c154cf2bdd93ab07af209ac resource01500.gif +fa189d7d774b899d3932640ca9e3848f resource01501.gif +f046b7c469b154bd37dc04cea2ae3f57 resource01502.gif +aef2e1cfa32492d94336afceab934df3 resource01503.gif +d47996baf4e03c71a8e951a4557d8e3d resource01504.gif +6a24857c101b72d66d246a2cb5e955d9 resource01505.gif +d323febc974607d33cb86248b4d19e2c resource01506.gif +b3afc818a90f80bbad8865530ada259c resource01507.gif +c119b9a5f6b27ec987844b687e81818b resource01508.gif +d87f10e6bd7ab0895f83971fda82ea06 resource01509.gif +87811601817fa1d65f2c7f76f3eec688 resource01510.gif +736cc49e49a7c5aaf16cee1fc8753cd0 resource01511.gif +63c660d2557568172bdee470e6c25b21 resource01512.gif +ab5c2b6b4344789904d1d0984f173938 resource01513.gif +e404272b63642cba7ccf712af46ad1a9 resource01514.gif +487128309e2241cf20e4f2c71dacc846 resource01515.gif +6449a06c2f48cadf3cb965a06b91b228 resource01516.gif +3f21ffb05814d5040e92c9c9ee1fd447 resource01517.gif +3e03e22ed08aabe8c56e72d190194142 resource01518.gif +6572db73e2fe0635315fcd9146a47821 resource01519.gif +e762a0a96f9bb56dc0d232c2907ccc7b resource01520.gif +46ea30611de16c2deb4908c883ca7491 resource01521.gif +223126c6b312921e0e341f91e8dce040 resource01522.gif +c13b592f530d2eb6b5015981eaf6a853 resource01523.gif +fc23bce9bd5bd73ff6d48b8249a6215b resource01524.gif +58c40b8e54b5b2c4f1a2af6d9c2090a1 resource01525.gif +fe030744e8301eb672b78a6ea6e52e5e resource01526.gif +6ebd04436d6979c13c1b230523b636f1 resource01527.gif +268101bb0a63dde1295afb56830a7bff resource01528.gif +a3fcc8ae111e2b66dbba66b6ef4a2ef9 resource01529.gif +f490cb2c2f8ec33badbe4a6558da4932 resource01530.gif +b2711b16de559ce75210dd1865980434 resource01531.gif +1d42a069b3654f3d220c213825fbe129 resource01532.gif +55f4c05dc1e0d5fa98f3022e56d87d19 resource01533.gif +b0570fd0454999aab2eb9039ad10e286 resource01534.gif +78c2e2d4b61574d98e67a9ae239857ac resource01535.gif +12b4b8b243904a6df61058f8854b9d05 resource01536.gif +ef053c0e3cd5e4f6bee07173a57f52b7 resource01537.gif +5a62c08d83231247cb072e69a0fe3c62 resource01538.gif +aec790604e10e1b4d68d22c3fc8817c9 resource01539.gif +3ec59a8e1793f0fca3c57f2a30a58546 resource01540.gif +5216a224cafd9aeb90fe6673994434f5 resource01541.gif +3f7890ead66e52e26fed00025f0c681a resource01542.gif +09844d7a8633023780faa8a23cf0bf3a resource01543.gif +0f6846a75b32c4d6eb949f252fa6a584 resource01544.gif +8b85ccde6a1a158c191c942c679702ce resource01545.gif +e056f92435f8fab217a4526849350cb6 resource01546.gif +2e7bc78cee434987cd8472d01588d7ce resource01547.gif +369a0aa2ba31a251717b68609c674b81 resource01548.gif +68b579a0f56892c4d06537bead53f753 resource01549.gif +940ae2e8362cba032f03a8ea36a35a51 resource01550.gif +648021e02b07d91207a3a7e52d45fc76 resource01551.gif +2152c47fefb13df104ec1d8a931e4487 resource01552.gif +30cf48aa5a818db27d0ae6f6ce3d2bc7 resource01553.gif +2ef99c24478400375f8c37a9eac46f9d resource01554.gif +1116b1b1cb23a2d91372b08007613290 resource01555.gif +e732618543fe658fc3db3a14a7fae702 resource01556.gif +95161e185a7724bd584a55142db2b343 resource01557.gif +70b3350dc103b3d7677a8de0a014afbb resource01558.gif +ae44dde004148e8cb1ab9a663e956752 resource01559.gif +890021b88fd301ac75fe1efca0ceadfe resource01560.gif +563e47b40531c186b9b3988adc6850be resource01561.gif +a2e6f33acee13be0fe579a694a976af5 resource01562.gif +56359f5d83490b516e7a2ec3ff4f2af5 resource01563.gif +6bf52b72e886fbf37d31117140d6c0eb resource01564.gif +6c0d02c3af6c3735f2948c50708af013 resource01565.gif +c4b327fafc2da0eb8bde392c1848ae28 resource01566.gif +5bbad854d579111c89add1f8bc35937a resource01567.gif +6d0b668dbd0eb26af846fe486517699a resource01568.gif +55d74651f2ccbe65cc2495ac2da1bae5 resource01569.gif +0157238fef8dd711772432a0907cb5ce resource01570.gif +de199968619c115f0068bd10d0d613c0 resource01571.gif +f656ee61fd3fc31baa5cd8513e4e40d2 resource01572.gif +65168422470e038c6990a600a7189bc4 resource01573.gif +bc5bde583d712acadac0d6bae5589830 resource01574.gif +1f6111264cb1ae64400eb048ec90429c resource01575.gif +edfeed0927903eefbb75be431b18e9d3 resource01576.gif +303db05571bf7811203c56f0573802b7 resource01577.gif +75876aee5ea139057572e1b2b976621c resource01578.gif +13f060d193e7761042f09cf94dac84ce resource01579.gif +7507c09d4aadf383306e9bdd3bc87d6a resource01580.gif +ddd4b48b9e7ced27e58c5cfbdab30a12 resource01581.gif +f6229b9f6cdf61c361add69aee2dee96 resource01582.gif +bb592437b5b148fde37e4ce7e7911932 resource01583.gif +8d441250c624d6352ed9da58e91396d5 resource01584.gif +67dcad631de94b5026ffb19c91816e66 resource01585.gif +fe4709225098b25a670df5bf959db3ec resource01586.gif +5fb83a633108df0c972bba61899687ba resource01587.gif +bb75bd0e54d3b28744923a978ecdf6c6 resource01588.gif +f9da49c2ed639d46e4a33159eb33cddf resource01589.gif +4eb5106c1ef508dd526150dfcd31696b resource01590.gif +5aaf585c6e4b079e9665059e1397178b resource01591.gif +25f84b6ed555349fce1f02482fcfff45 resource01592.gif +f38cffa5c4da41f274df40446fec0a26 resource01593.gif +20f3b7f786ed084c90756efd16301e5f resource01594.gif +4335bcc17e19f3955cf9a802349b9529 resource01595.gif +abf439e2e290af4a60e2c07b949fae19 resource01596.gif +ed679abef2807d6c1045e524f7203a63 resource01597.gif +29464b07f70d15310194c79a92d532f4 resource01598.gif +3ade8061627b2c8944554a5f5b113dbd resource01599.gif +0f7ee38bae2f2cf5547a0271536748a5 resource01600.gif +5807edc7405712bf7fc00b0c6d4d9ba7 resource01601.gif +b5c160d89a65d6dcb4605ae9275ebd10 resource01602.gif +732e03430cee9ba9b584e72cf3bc651c resource01603.gif +a10028331706ad07db4bdd97d72606f6 resource01604.gif +2a30becee8b819f86c6d35743ab56325 resource01605.gif +5aaabdf9d900c7056d84eb758357444f resource01606.gif +5430b7bb49189c6d3b3c7ed27be3dad4 resource01607.gif +3324e71fef98e3009e5a239613e7dca7 resource01608.gif +4e085fb04e538a6117c87be08aa3ab88 resource01609.gif +10f10debb0b0df5214eb31ac6c7ac7ca resource01610.gif +52ae45c0d4d02692d3cf8e19c6a2b6bb resource01611.gif +c6a3bd0dfa10d515f64d99a1fd52f817 resource01612.gif +264581d39a31114c7cfc3b77754ff146 resource01613.gif +bb6adff9c4507835e33b1c5b4748427b resource01614.gif +fa6786a73c3565ce795328d39f78f8f5 resource01615.gif +0c41c414f32a19ce6f91218f21c53c0f resource01616.gif +42786f28f8075d7aaa8bbeaace004080 resource01617.gif +5feb0d47e60a6635afa875976c3c1cd1 resource01618.gif +872c41c1afbb4e6981170ece5be4da68 resource01619.gif +d08638ebb84d8a86b1f8b6cdb5b4d720 resource01620.gif +8bcd4d5ecc81cb0100059fe6feec84ef resource01621.gif +c44049105507f8e6b959594bbd70713f resource01622.gif +98f5d1d422a56ab11e82db9dd6096742 resource01623.gif +02d6d34825a26f4fffc3d01875168ed5 resource01624.gif +0b35118b545928675866569fa651af1e resource01625.gif +cb6711a658dbf411f94c95a52cad83a2 resource01626.gif +f308f6e147eae76689535b72ba9018bc resource01627.gif +198e921d3edbb0dc2fb67e6d29b9f022 resource01628.gif +027f837357bdb7f32c8ecfbabcb00a38 resource01629.gif +fdb194f52c3e0b848b5eafdb8061e417 resource01630.gif +7a25564d0be00822a5c7186d94c25370 resource01631.gif +97de10de60d1f6d63f5ca97580f491b9 resource01632.gif +029f535f348975d710df8d07475c673a resource01633.gif +889f9970cda5b558963e5e6d019636e5 resource01634.gif +d74bb302948969e1fa1531cb2d3339e2 resource01635.gif +b3e12beb4f5791a2c5e482dc3d326b2f resource01636.gif +10024a2ff2b1abb863b0ae5db8614dff resource01637.gif +be5988e2076613a2c4aa8641f5e903fe resource01638.gif +2cf4624bf5068883cc4e78ca9653c172 resource01639.gif +941d1a18f5eea7884c7884ae67862127 resource01640.gif +3c703b45e4d5e5ccee043e723b01d880 resource01641.gif +d3d104e5b6152dbfa16d2ba8e3f1666a resource01642.gif +bf326c40486bcb58603e4602517b8436 resource01643.gif +a291f72248d64ccb9fdb6a4a7090e9a0 resource01644.gif +2cf1b5d60aac05f1cc752a220d0dc208 resource01645.gif +b45ba8b55274c7a488c50f1adcfcfcda resource01646.gif +628878dcf6d941413f3439094a73957e resource01647.gif +5a5e7f416dfcb44b18f2bbacbd32c793 resource01648.gif +e7cca46e145df5864d7abe56c80b3802 resource01649.gif +bdc94dc3b406fdf5cdeb02bffb5206cb resource01650.gif +f37c1f27f1b93f354fdd1322cdb2adcc resource01651.gif +3ab56e2d3672dba710dc460b6ba9fa3c resource01652.gif +66a8b8506aac2b00687386415f7cc738 resource01653.gif +49ccbdf6c4fdaab4315ad538db0a1cbf resource01654.gif +5edae9e0981e9de9d73d1f002a0343bc resource01655.gif +08a3493c45e3148603ede1422b513fe1 resource01656.gif +e380badd3372588d3a90b15e8393d7e0 resource01657.gif +16a66918336c5dafa77edfb51036f522 resource01658.gif +eb909a947c05846aa85ba864c6f8a7a4 resource01659.gif +542b3fa0998c2339db322e8e9f152037 resource01660.gif +a4f9807dbff35e98626e83aa795786db resource01661.gif +462e3e307f683a7118d7abd581571422 resource01662.gif +8fbd24e0851490ca6740c48228fef50a resource01663.gif +0f70730caa8dad66e007ae105d28a700 resource01664.gif +e79546b35da85e7a410ed1f65a1b9bcc resource01665.gif +819ba9d90e7d19d86e5df494ae6ea0cd resource01666.gif +c66c4dc2a9b9bf79b583fe58bd08daa6 resource01667.gif +fd4766764fa21e90b2520ac5915cc61e resource01668.gif +de156b628c4d8c30df3975a1ceb39c07 resource01669.gif +26d58fc68271366f5c4b37f38ce4bee8 resource01670.gif +3e98d6101abf79a90d055d2179ed8228 resource01671.gif +36c6d2a8ee5da4ec11b0c9e1209fe7b6 resource01672.gif +be3f9ec68bebff9651cd0dd95ed6592a resource01673.gif +83b341cd05632b61a9bd41a3323ca242 resource01674.gif +0e36b991bceed3474227b6c69b3fa95b resource01675.gif +a195676dd8dda9e5720bb5d2c4a857b5 resource01676.gif +50fa47785f72cc69d865e15412384303 resource01677.gif +0e8c049652fdafed353121fa3fe734bf resource01678.gif +3589f5122d3ee56b86bfe0a9f2e2295f resource01679.gif +a9c6f9c9356e3ab6869934b99859f9c8 resource01680.gif +3f5ebc2c6f3a54530db7d7ea9c54689b resource01681.gif +05f1e4665422fc5a25e4801e6408b809 resource01682.gif +5383af46422a4221f9835209b302e5d7 resource01683.gif +5237d1d6348852aef0bc974011e71724 resource01684.gif +67eb87734aa37c89429697bbd93148f7 resource01685.gif +2e25c63f2cc69da0719ece1bd96535a0 resource01686.gif +4d7ad3195bc783c366cafb9480421008 resource01687.gif +7d945fd845b8c32e1926c49334286699 resource01688.gif +6a559d4522b03158da3967a78a6a753a resource01689.gif +7ecea90b118c4f8145705f31ebc90e76 resource01690.gif +444ccba2e0f93ed084ae8d95b1eb3f8e resource01691.gif +1cd85c5302211674c40e34cea51976ab resource01692.gif +c4ced13edeb6c5205f74b6565d269426 resource01693.gif +0a06c601956e135a46b532e72c2f0d31 resource01694.gif +9065b31f3bdde19056d5cffbe4f039b9 resource01695.gif +4a2fcf138fbcf37479920660a9ccd35f resource01696.gif +b52f85c9e6589251f5ff55a6968031fb resource01697.gif +899fbc1fa6a73798a11c51836cafb743 resource01698.gif +de90fe5dda00e7a96ba2e686edc54886 resource01699.gif +5a5f04ae1c71d707c9b97bcc065d6269 resource01700.gif +1929b49f0df1227dd0ed6b3b11fc5971 resource01701.gif +522026737d273d05d8736eac36c6a568 resource01702.gif +89c72e6d658d42c199204ef9115ae6a5 resource01703.gif +58fe9dc169127ea1858253fe961952bc resource01704.gif +61d46d2b004e1b3440441ee8ca931b0c resource01705.gif +311fb8d1179e4d63da94743953f406e5 resource01706.gif +19793a92d0ea9702932bffc80e690362 resource01707.gif +b740e3c67ea9791d602be9f19310d623 resource01708.gif +2ab80481372b61f344376f84ffb3dd80 resource01709.gif +eb88a06639531bd359baeefde460c2b5 resource01710.gif +1d97555557233e42d5cb1c184796e9d9 resource01711.gif +468b86ed8ef413b88665e089974d1744 resource01712.gif +064da1ea45e7d7c97530ea2926d6bf94 resource01713.gif +0241e84d50535f90ad8e9aa8033b74a9 resource01714.gif +979a83f90be8431fa239b507752ede9b resource01715.gif +869ed19f5ae1ea1d43bf8aee3e86e56e resource01716.gif +bdb2e71f7a030cb90203293c010188e9 resource01717.gif +e62f7a7db234a822de63568de453dac0 resource01718.gif +de17fec6d600836e5187afcb582e1517 resource01719.gif +8bcc5a2df239be78b44d5cbdf9926425 resource01720.gif +e2a309723de0862891506fa1061dbbad resource01721.gif +5ebeb08887fb28274e72aa741b2a6ca4 resource01722.gif +c9d80da2957d66016c4fd836380311c5 resource01723.gif +7e0cf3ffe165c58435ced536f46ca5c0 resource01724.gif +0670a18415c43d20b96e0bd7a2180f0d resource01725.gif +a6f45977e295c050736af320f602f5c4 resource01726.gif +c2b25f867e68194a6d6c59292f432598 resource01727.gif +73dc560e085d1ceba79f0567ad5d1073 resource01728.gif +d75e161b1b7eadedb58403e2c04766a8 resource01729.gif +a732633add0ec3747eae38438c4c1e21 resource01730.gif +b99bc889bd83a00ed3a0270454395aed resource01731.gif +4a201616929e821766d9b2b4dcf80783 resource01732.gif +9f577fa04f1661011136ce68c0fd6591 resource01733.gif +801e0f35a02eca009804e9d9af7d2e6d resource01734.gif +3f51095d6afea07acf39def876c93f46 resource01735.gif +5668e1fe26393a653371229b77179af2 resource01736.gif +24f33fb0c1a485ce332ea6bfe6ef6ce6 resource01737.gif +6d5ad7d367ba9761ce2d174a7ec8f511 resource01738.gif +553a033711f785a93ff4de2652f52087 resource01739.gif +b59a3d530640a65c30b47a3e75d8e4b8 resource01740.gif +20958fd0f5f664cf2c8688d72060924f resource01741.gif +362023ff7b748ff114d806bf6cbcb4a6 resource01742.gif +bcd2ac74faa65371e483a5a4130c0036 resource01743.gif +8e4dfd0ba4fa9415781ceeb51b0bea3c resource01744.gif +c7a5b58e87bfa1be0d7fedfeab47588c resource01745.gif +dd4ecdcf9cdba97a6e019f1108d8194c resource01746.gif +6bffcabbbcc91f23db2336e95d1b2c92 resource01747.gif +7359a7f8ea6f86e497533010a18deec3 resource01748.gif +f2b21f742fc05581bb8c08133951a798 resource01749.gif +7e5c231d4d2dfba6b7144268afbec12e resource01750.gif +4e9fe0dc271ec07da5dd20aae4b51334 resource01751.gif +bd4b818f97c0d409dd118e30e846eed0 resource01752.gif +45ef51c7e4a7843b0d9713f2d6feb30f resource01753.gif +223d2f5c522adc688c325ac91be6a7ff resource01754.gif +d4e70a6b1f636eb7c1cddf5f0c7681de resource01755.gif +cb793d3ba5dc0a906ecb365b0cf40c0d resource01756.gif +a57ff01b964a7ddf6a06ddaf733a5397 resource01757.gif +effc1aa2c12be562f5a22b29b0089c22 resource01758.gif +48b965637026bd6e39f2327e85485583 resource01759.gif +b22e599cc05acd2a4897ad90621a59ed resource01760.gif +29e8adcdcddbd5384cf0aa5651a5cd4c resource01761.gif +aeffb0c8f090070d47f10d30ff9ff58e resource01762.gif +83ae1f5c4cac4a22af4b797e2e5c9f2d resource01763.gif +bb8624ebf53b16125e5b863b49161fb9 resource01764.gif +899e30a6d437353cffb129067d647f67 resource01765.gif +bfe356981efe03d024ca7076541475bf resource01766.gif +be9363d92c5c79764f53b4e305ca475a resource01767.gif +ad285edaab387a97e2c4eb87bcfc06d9 resource01768.gif +d677bd8d195fd3a6906f700550598d3f resource01769.gif +e41c0f95f1d577da83691fa8cb80a7bb resource01770.gif +803c5975b5091d3d63a24329d61d4b71 resource01771.gif +feb79a22ec47b3a8a31889c12f992874 resource01772.gif +0238339ce7c458413d1ce8a301baa128 resource01773.gif +a47b2ea63edefcb99743578bac52feac resource01774.gif +309fba95532ada9423321b15bcd185e7 resource01775.gif +892c65a1d91c6663aad37445dfe86142 resource01776.gif +c247648f794e6374c6ae24158f5f025d resource01777.gif +ba2689c4caefdc0bdd280d03e437b70f resource01778.gif +d89683c52cdb5db64a3200e04a85651c resource01779.gif +c202b3e8f0265da965413b42c37983eb resource01780.gif +f3558dfc2df663b1105af880237959a1 resource01781.gif +027938eb60cb56bbaa664ffccc447a7e resource01782.gif +64720d7e6d0b8f949b5dc5e7a48fe05d resource01783.gif +7f0871c706569072fbbcb8cd12e23d4f resource01784.gif +498351f29cdb47b4b5dc273d5b6b47e9 resource01785.gif +0b1db06ef1d852ee7dda9564f5de15ee resource01786.gif +ff8d8e8a65d761960e9913ffd0f84a02 resource01787.gif +b2bbeb03c5f8c489c9e04f15c255eae3 resource01788.gif +a0753a6e88a6c7100676aef4ca43438e resource01789.gif +3092573af33eaaecc3222af2b8864642 resource01790.gif +6d39a3f0d46ef806aa79662785cc438f resource01791.gif +c39b87e1fc3938ee5c2893cb26972ac3 resource01792.gif +1ca4481e580a24257e6403cf38c1886b resource01793.gif +ee779c0cf6b9edd76b6eb39361fb9f40 resource01794.gif +8764b18e02bc7a55b7d1c8a2ede6e780 resource01795.gif +652bb029598750d204a90fd271729861 resource01796.gif +985e5b7273dbaec869dbd80f6b90c0ab resource01797.gif +51bb1d63571836bfccb98fcf14ca9d37 resource01798.gif +262d1a1356a3be7953769e20734060ff resource01799.gif +4f1fd43a8928f4409300d5f34ea395ae resource01800.gif +c6dcce650c712c7048eb3c25dc676283 resource01801.gif +af81d5e339ed75601c6538fbd23eaaad resource01802.gif +65b4eb02238a65f90b4e1d12b3e0f51d resource01803.gif +8c486dd08e6c135863678c620bcf682a resource01804.gif +ff728a086aff0b9a2e12f12a89f0d899 resource01805.gif +c7e5fb9e41386013e639235055f05317 resource01806.gif +f27ae399e578db2a18a31575a7a3db29 resource01807.gif +3d18b72256c22f0ae7aa4cf0b3ad88a2 resource01808.gif +f10b91ddd9bed05ff24d18abfdd96e59 resource01809.gif +f867bec8494de743ac0c51f4d0b09515 resource01810.gif +51a445ecb5099efa77b8aaf9db579808 resource01811.gif +ee7f92e74b0cb4632d89f2bf451c2a51 resource01812.gif +176d900f493dc81d81bdcc5982d6ee5a resource01813.gif +778afd0d4a8a0e27e4d8860e20d4f315 resource01814.gif +18a36d3c910d6d4de17d073f748dd1b1 resource01815.gif +2418baea250382fe34638c77a9870168 resource01816.gif +7f735307ce10ff2788b14970eef45ba7 resource01817.gif +9f73d0ce15b7869b58fd76d618fe6bd4 resource01818.gif +cf3a2c4c16fea9c3b0d320d602304ad6 resource01819.gif +61fc2454f0bdbfd3e1ed88e2b7fc2deb resource01820.gif +ae5e6c0a7041f56f777b53666ca197c1 resource01821.gif +198f2085f1f63da856337d64e6e7bda5 resource01822.gif +189a36b1440c23062fdeb6e1879028db resource01823.gif +f69fa35fbe5ac1def62d743fa1f93f5c resource01824.gif +80603aa9ad2db848af1372bbf9ffc507 resource01825.gif +7c187cfdf94f48bdf871c9384da4f180 resource01826.gif +6c2f7e6e4324980dc3473a979374c18f resource01827.gif +b935c5032e5a0d06108a1996cfb55b63 resource01828.gif +e9ccaf11953bb183f29b13db8e808fdd resource01829.gif +91522324b16e565b76f08780e23c30dd resource01830.gif +345a4ff5f4904aa3024ee806ffcf67dd resource01831.gif +6550d1acb82f7a5d577895d8cb9704e2 resource01832.gif +f4928c6b756c61df2beb0c69211f2131 resource01833.gif +f6739d6ff6da5cfa671fc28754111693 resource01834.gif +7552d3648a0d8832d82ad7b81c3747cc resource01835.gif +f2d90074feee2aa9d14ea716824e9129 resource01836.gif +bd3ee7827706a5ed4fbed290d3799784 resource01837.gif +42e08e1914aeca6e792674e87ab07794 resource01838.gif +682468462a433f4c285136ee4ae6ea6f resource01839.gif +e71cb718cb426d5b134fef7cb395aebd resource01840.gif +efae124a1e203894a3325d9ca92e1984 resource01841.gif +33dade538125986e68b906b28a328b44 resource01842.gif +847cffa1cdf0a086335a9be612757db7 resource01843.gif +7d14c25535edb9ce9f10ac4db91bb7b7 resource01844.gif +7ed957aa4d9066b9e6779a3bbd5a8a48 resource01845.gif +3dbf5cbbc15d621e685dccb844d3b085 resource01846.gif +54ed2c45f84e234252f59f4c62cd4e74 resource01847.gif +2e96f4e8296b311421184bfec5d81c6b resource01848.gif +bae8efae11076f8465b54d0e26d4b470 resource01849.gif +3f8bafa9563f8e9b4df1d92775d7fbd5 resource01850.gif +476a09929b6ed3977b513e839bf6b364 resource01851.gif +55f89a06bd8ec48a42e9c597ed703beb resource01852.gif +ed0657bfa8cc39a93e3d7768744376b1 resource01853.gif +505e18c10b6e4f9915eac4b2a1d264d9 resource01854.gif +64b9a9a10dbabd938af96a23f43eae55 resource01855.gif +3aa99892d373243515016192414b4e20 resource01856.gif +19e30ffe98bfa8821ae60f5d8f7e50b4 resource01857.gif +5a71ba6c5efa5d95bb328b6f63138841 resource01858.gif +080da0595acae82a31587f5734419139 resource01859.gif +776b4681bf521a39edc2385182f45a21 resource01860.gif +c6ef06536a16ee02a055cf2db4475108 resource01861.gif +61143d2012457bad21594e617a754355 resource01862.gif +6a381e77dbbf109570c017abc470ceb0 resource01863.gif +e397ccc67a3383e6187cbbdb35ee275c resource01864.gif +7caf65b76965b63b3fcf3080b87e6379 resource01865.gif +2640be95198ba90d8e36f8fa4ac819a8 resource01866.gif +6d1056d078738ff6de040dfb9bb3123c resource01867.gif +6c1fb7652fedc108e3c78b98c8e6fcd1 resource01868.gif +56f8ba58755c30d8c7ad7cd86c01b298 resource01869.gif +7d929043b844e0318d66d3b2b64b3244 resource01870.gif +d1ff1dd29b5a3549a60b0853779f984c resource01871.gif +db0be5614b0292db621e86adb0f4628e resource01872.gif +918fb69facbe3e6637c6bf024ed6ea26 resource01873.gif +b27dc50b9189d2d945ed9ed0dce85d6f resource01874.gif +79589d5221e9d9d48aa3f1f2299db43d resource01875.gif +01ee48826a9f81ab6a2317308e1db139 resource01876.gif +2eae14dbc425d683bee70b68e4cc32e0 resource01877.gif +655ad204761ac17540f358c214384538 resource01878.gif +8340fa95ea6cdbe739c0e5fd8427ab3e resource01879.gif +b4b60ee52b69b9b9831d8290e9bf1299 resource01880.gif +e9a7447b760236ef8fc0c70039a2f298 resource01881.gif +f01a94154d8947a2400eb2a504e76b12 resource01882.gif +a7b0ebb435a0fda559e1db56b0f68f15 resource01883.gif +71b24c452ba7777cb0361417bfe240bd resource01884.gif +1fdd8f8d53951cd2a98b98aefb346738 resource01885.gif +605e2dfc13132a5f34fea76bb49e69c1 resource01886.gif +11834386ecb85c894f7d88fb25118e14 resource01887.gif +5aa03370e50d6b0a14b5d0ccbc3e9a7d resource01888.gif +93fd8a3ada884dbc8deeb9744375420c resource01889.gif +ee523480aa4c88801123be6d8d541583 resource01890.gif +d7ecb2116dfa3b486e7bd917d6a4083b resource01891.gif +1cde9dabc4a25b9b6159d7ef70a3e38d resource01892.gif +24b77680b28384b130d84f8107f2feb3 resource01893.gif +8362ccbcca0b5ce1d7b2627f3cb36643 resource01894.gif +4dca145fcf64cf564a20b9525ba5b959 resource01895.gif +92b61fb4daef697f4d9e2d9997e9ddce resource01896.gif +f559b0c85a684f234dadd8f6d3ade620 resource01897.gif +57ca2a84898831ccfacd29196a6045d0 resource01898.gif +84cd744e1206075ad327cbd5db872409 resource01899.gif +95bf4e0c193ac104e459b26d1be1ba27 resource01900.gif +c598ea49a03c8c8d82db0ad8d13f42d7 resource01901.gif +aaff2b0cd8e9ef6aff1eb33a5741a7ae resource01902.gif +b01327745dc6584d863094f75f5e7438 resource01903.gif +b9d8abf0859aaa81326a26c3c7bbbb6c resource01904.gif +c95691510efb36a31eb69b20d9bd7989 resource01905.gif +559c18a6f7068b7a9b498456f07e7eeb resource01906.gif +8e1b97c59a5c82fec60d5754db85cbd9 resource01907.gif +b1a49d2baa548d10fa6abe91d8f5bdb5 resource01908.gif +3c6d739a9979971aa8c8bee08a041554 resource01909.gif +0081fc635692dcb0158cc4f897d28190 resource01910.gif +109108d94723efde06f99e0a9c354954 resource01911.gif +1d5932f4d4ef45aea26a074eb9a9f189 resource01912.gif +caadc5c7334d5f5b2b6f590363481b35 resource01913.gif +b3215c27b707d46c8ab3f1664dd62152 resource01914.gif +dc827fc030dd3e95be996ee020d5378c resource01915.gif +84a8b3405e80eea9e5fc3b6cd8230eb6 resource01916.gif +faca9c06adea62d8f0ae8902f6819c1d resource01917.gif +9df548aca901a468bd5b5d41397b2ce2 resource01918.gif +d057752c389caac83d9e950a294a7ec6 resource01919.gif +d9958610da216cbb2b0da7c063d24d71 resource01920.gif +314060285114b12f12628e64c0fc944b resource01921.gif +15805ab62ed836e70009b46f4cdad7ea resource01922.gif +6645fc8a050eed64554447b938f63ff8 resource01923.gif +a83792a228c2f73d1e6561b5151d4b38 resource01924.gif +6edce125684860b8156a0a70a7351ce5 resource01925.gif +9ae438afb960fb914b191ff3c6e9fd35 resource01926.gif +b5bfebf8d2dac84c8874038c2f3e052f resource01927.gif +e0d57292ab05b3ff6e00f59840ca3753 resource01928.gif +753baa92f5d6834ac81f840204fd29b3 resource01929.gif +e648ecad4d8c1eeb65a24cf3b1a36f73 resource01930.gif +090331cf905f017b9537723b53ee5eae resource01931.gif +e428a10153e94c0ba85380e7069e5f03 resource01932.gif +705bc75cc3d4d54fb9025f093d935f9f resource01933.gif +1df9b07186e06e50ac22aeddaf77d1be resource01934.gif +855aa3350312b4d31a206d1dbf12e25e resource01935.gif +d23783a23ea51f5ec277f03e119e63b8 resource01936.gif +90f9e9563b35cf85c641e8e68770436b resource01937.gif +52c3e13ef163e5af99da4aa82116860a resource01938.gif +f9a63106a6f649e3634e307119273cab resource01939.gif +9b3010519c7022485274ea3942833ba2 resource01940.gif +e09eb7c4fda6467e05263a99be56440a resource01941.gif +16e0623b9d6652f429b92e9f8a3dbc26 resource01942.gif +2715e21c46525aca094bc4973bd99304 resource01943.gif +4869c899e281085a509b76bd0fdfd0bb resource01944.gif +a26549c8ee5f5b4fa59dde68e66ce8ce resource01945.gif +6185c7eba1c10842050d562046dff0c1 resource01946.gif +5780a18f81df4e630154e0f4af87b913 resource01947.gif +82012e5d535ab948d43abe832cad11a8 resource01948.gif +6cac82641f42af6433155a838246075f resource01949.gif +34b226fb1a25ce38d7faa3c8279c9bd3 resource01950.gif +e10dfc0281f539df3ce46bed527c5a0d resource01951.gif +05b49e936ef0f58b62c5bbcac8953b1d resource01952.gif +89ab218ac8dd8ed3b16689153aa4e94c resource01953.gif +faf3b8d056fb7894482112dbd5e020c5 resource01954.gif +8336e3073867256e505a4f16577308e4 resource01955.gif +8ec35ee0497dc914bdd491fe755c4ea5 resource01956.gif +264c9a97a8d69ff567c3ce54b5ee8b4f resource01957.gif +f20e1fd1366002d104f14032b181ef19 resource01958.gif +1e73f05dbb1a37e88f6d37b8e93f16cc resource01959.gif +8b59f24553ed7b871cf27fb5381fcf39 resource01960.gif +8388f8a2c6da9fe3d112777bbb4c0fc5 resource01961.gif +71f7e51d4f9c57dacaa12e57302832cf resource01962.gif +74f72e4df6080b828bb9f48ac17ed852 resource01963.gif +a1d42ccbac0a33d54b0582dcf72542a4 resource01964.gif +cad9133018d1f063abdac33cac61b42b resource01965.gif +8c42d1632ae292ec1101ac2c8d67bd6e resource01966.gif +4fc6320c6277aac950b09f0b08faf752 resource01967.gif +104bf5cc843bdce22698012f8f148772 resource01968.gif +278a96e66a0270bf3ce56fee9b0674e6 resource01969.gif +1c7204bc826b8c69d0092ca630daf4a2 resource01970.gif +fe15a54c9c81ed895ec7083adf8b0224 resource01971.gif +da4db865365801b2dd07f4d7426ef5f9 resource01972.gif +8cad2f4b854bce1e17027d2d2a4b3f2a resource01973.gif +031964393a50f22ac6f92e327cec8fc2 resource01974.gif +142fed2bdf50aee77214d188288d4231 resource01975.gif +ac8800c33bad5e812f4bb8ef62069b97 resource01976.gif +0b1e87822e7fbae323105ad217b728d7 resource01977.gif +ba6508bd08301d17f1c131f271a71cf1 resource01978.gif +6c62ff351db359fbd709d1d22dcde8a9 resource01979.gif +72cdf56b4ff19f0864243bf4245362ab resource01980.gif +4517df45f55913d1652d8ad30d80b8d6 resource01981.gif +e8ca8662ef6d7a607a8d2d385555e344 resource01982.gif +179ab4b1a1bb5a428c38e4c748a1e626 resource01983.gif +657261ddcf0b2769fc274ecd4adb4032 resource01984.gif +66102e9979327fe90a34cc5bd9908d00 resource01985.gif +c476ebb9eebd623ab7c3fb2f9dd6c2d8 resource01986.gif +53297f33e75633a8c4eacfb6f09bb0e0 resource01987.gif +fcda02dcf0ae76f0adc1eb06a6742106 resource01988.gif +00812a0d3ce8fa94472ec94dfb3dc276 resource01989.gif +e55daa8c5a9332f1b10710e988e8fac5 resource01990.gif +73c67c4b8966693bf5721af4374fc524 resource01991.gif +c7012ce24929198e74aea26ade3141c0 resource01992.gif +93d6691a7c74f82cbe2c14ece4038a57 resource01993.gif +3d25f934f6a213c1a123208e0d46cccf resource01994.gif +dbc1d7dabde0270b3b4e548132387b61 resource01995.gif +e8ca63c48eba047dce02514938c39d01 resource01996.gif +2a424f95b79cf0c3b0ce942cc98b5d00 resource01997.gif +a923eb205a266693e20f46258e8f8bb4 resource01998.gif +6af670f1d117edd1ce211c7629986bc7 resource01999.gif +9639c4b246db2967845bfd9c049b184d resource02000.gif +a19c9a3f174bd79d5fbd9891de3ebe6c resource02001.gif +89f05e1b190fe058cc9a89e1af330c37 resource02002.gif +faa6b629ceda5a27c559197e45e4751c resource02003.gif +6f5a463bae3a6e72392cd057806af690 resource02004.gif +c630775df9cdeafb200cbab485837ac7 resource02005.gif +1f5eb46b6ace02c51c16f437db287f0d resource02006.gif +471de18eff26955f920b1a9c5971e918 resource02007.gif +a0ed7cd245b5a47b0ddc1d024ecd2503 resource02008.gif +7cc9588f09e0c730c30c579aa41ab699 resource02009.gif +85fd11186efbabf03450295a490241c5 resource02010.gif +f94f05a1857022efccb7f9979edf1e47 resource02011.gif +f8bc7660f73452ae42e49421c4b1830c resource02012.gif +a2738dbb1a4a3339846504abaef1aec0 resource02013.gif +269bb067564a1f81bf6273c183f037f3 resource02014.gif +bb48e512efdff1045d35ea432d47ce68 resource02015.gif +d08fe5a8702bf50cb6910f005524db35 resource02016.gif +dc89f2ad3f380bf6f158a0d6d30d4228 resource02017.gif +fe3e63d07c36d50f61d959084479ea37 resource02018.gif +a5efbceadbcaa1b09e3f067cb205215b resource02019.gif +3e7b717bdb9661272713febadf17ca0f resource02020.gif +eddc499daf18a6926f5ffdb947c778fe resource02021.gif +d86eb06f5760b40f00a68741ae9b3a66 resource02022.gif +dc498887d908dc690f71f2804fd8871e resource02023.gif +22c56a12357e58823dfd5302628e37cf resource02024.gif +e31f7613361e1c6eec88cf983d28b531 resource02025.gif +3cee1e908b6a61559eeb8845815b756b resource02026.gif +939f2025ed17bc52dda6c8cdd348c1c3 resource02027.gif +d4e2a4f344a857dd29dbe4f6b5cf079e resource02028.gif +fe4af4be56f9a246374d1f573ac65153 resource02029.gif +dce69924f79d9b586860d6f08441688e resource02030.gif +2560bd35dc0f75ecdaf6906c858246a9 resource02031.gif +58327e0407bce85b95fc94f098da7ddd resource02032.gif +ee17e4563d682fae5958be09265d07d5 resource02033.gif +02af223598c4c393291e0bc1941de276 resource02034.gif +b08249ff91a93ff5dce6333b50a6a62a resource02035.gif +c83f736edb64b6db6edf764656ab452e resource02036.gif +8ce2e95077b11cf39a20589609deab13 resource02037.gif +b97108a292245626acfc2e3b6ba37637 resource02038.gif +94d189b1862623e2696442d3ca01664f resource02039.gif +4b924bcc8bc1339f8a7f8274db67ede2 resource02040.gif +a23a72faf419dc1d4ecd084e59ee050d resource02041.gif +57624f8b043660b2cfb7381618e796da resource02042.gif +9bbc42b41baa83260ce03aa25e2ec6cc resource02043.gif +bdc8127f61b44428b17f4212a6d79124 resource02044.gif +6869db9c176f3d5313112d0bd7da46b4 resource02045.gif +1ee74795782c8be138ae9603cc1a610d resource02046.gif +565c22537234e0d94e49dea7b0c28564 resource02047.gif +82658b4523823db2bfe450ebd3bd0cca resource02048.gif +c4b3813c3b0cf42f630d9ff640160e81 resource02049.gif +747eec9f9d39dd2dd0c95c7c5d434195 resource02050.gif +b2a4768fa865e46c7ea02d3b41bdd501 resource02051.gif +5819910ceadded15043f35b1e4a57254 resource02052.gif +485b1073dad59b6bb342cec05062e59e resource02053.gif +89a21baf1d17c070b60fa1290adf138e resource02054.gif +310154d0e1759a4f4c1c203069d9070b resource02055.gif +9861197f478fea5325a93d09ff39772b resource02056.gif +5296fe3c0c56202a0b086145d133b900 resource02057.gif +c8594e8e5ee34b4ff902bafb7fac7016 resource02058.gif +542514e9d54fc0fabf9ffb7871e97284 resource02059.gif +953a41be8af10600398b37429921fffa resource02060.gif +a3e085c3e6a1c9861739d027f4d600ac resource02061.gif +1ca42c460a888307a959b30c27447dbe resource02062.gif +886aea79cb190d2d3f28bc6d142dcd8f resource02063.gif +9fdeea81df765f7893856d545c875ef9 resource02064.gif +1e8e34c0b174e7fe7e27f42e3a32124a resource02065.gif +39b6c54c0ad0e3729400e9b2e7c48013 resource02066.gif +7bf9acedcf8ee0cf3542f337a7e83571 resource02067.gif +68cf2c0ca3563afed1c6df6c36de7246 resource02068.gif +035916b54fdf4a27dc027c1be61d86e4 resource02069.gif +851ecece81b7928ec17a9566d067b363 resource02070.gif +c68415bf3dbbc5cd841256cc71b0a7fa resource02071.gif +1f696f95b6593ac0731b6db205652ce7 resource02072.gif +2df9c26a7bbb0a6b559080a8d2fad356 resource02073.gif +c1047f499eaea02ed72915288caa0b68 resource02074.gif +91fe6f7a4b8fc940bfb1e1f3084ffad5 resource02075.gif +358ee165a317e85e6932f4983ab0d939 resource02076.gif +ae5aeb392f11a5af750f7a5158166379 resource02077.gif +c2f4d37ffe7f2e2d503d1337535c9c38 resource02078.gif +4395711ed22f41af99df63c7827838f4 resource02079.gif +d418c149e58c6bf1bbcc7b0e7f981d4b resource02080.gif +c7d8c8b6cb5437ff68f601c3f5e4fd0c resource02081.gif +f088c83ee9a1d48c8f485591573c7f8f resource02082.gif +5f49c449521daae728e73a9c14fb9a37 resource02083.gif +a53127a9686b790c5913b2c98d880c66 resource02084.gif +549f8f290021d473eda10fe014d1ee00 resource02085.gif +b9208f5b1708b80dac842437821eefe7 resource02086.gif +b0b85d99f3390172c3769f3cdc501eb4 resource02087.gif +ad49ea940408e0e252e0cb5c807d3676 resource02088.gif +55409013b61d23b76d382d59db512f06 resource02089.gif +2bd33580877ddd1010feb65d437039cd resource02090.gif +aab95e9170c7ab4146ca78003f3bb15d resource02091.gif +c10363e545470ea57c7b037e9352c77d resource02092.gif +f34fe5dd4ae4b61d7deac0fdaf4661d0 resource02093.gif +57ebcd7699f5a1d7f66bf64e487de2a4 resource02094.gif +debb01ec77be72f170825e8b7d207f96 resource02095.gif +9a992dd4e1b7a2b44c65e469ff8486eb resource02096.gif +a4c09bc623351c8acb9ab5c7ff25d9a9 resource02097.gif +acfe078eaf34251eaf86a93d6fdfdd53 resource02098.gif +e66ee632ebfa9c6e173ebcc206530278 resource02099.gif +e65065d09e9a535ef5ff6f0a9c9156f0 resource02100.gif +40fd0f1e92134437945d0947c3a5d487 resource02101.gif +0789a2b8058d198caef191547eedcd66 resource02102.gif +bc12a58d748f7757fbadf4f947672cdb resource02103.gif +98607804483639d972501e8e63c13e55 resource02104.gif +9791b18c94e6941daa16b7ecb0129d5d resource02105.gif +7fddb081970aa7569c16fd70210a75c8 resource02106.gif +a110ab7c3dad5d4f6c0f4ebd00d4e890 resource02107.gif +d1ab26b75c6938d6f999c5bf6f9a25c9 resource02108.gif +d19520e18d5d949c91673383f23a6dc6 resource02109.gif +8d7eaaf35eacb8fdb399d6155e8cf747 resource02110.gif +ba90ed5ca9fa5f56f65eb4cf68db3730 resource02111.gif +b6d10a4306918dfc53a0a46991d51ec8 resource02112.gif +c4868d6da205780706c3dcf19fe6319a resource02113.gif +295c723a62e97bba1fdf1e41ab33da44 resource02114.gif +19c16fc5b65b3e29d0aede0e8103a64a resource02115.gif +eca948aff83cd41042d6763bb5dfdf86 resource02116.gif +f72d9c4d788804064f7052306927371f resource02117.gif +ee9c84115cb50ee0268878cf25614e21 resource02118.gif +0b5bf40ceee23988c2f7ce40a2f8f4aa resource02119.gif +cba1d3acb4ebab38b76567909a6860f0 resource02120.gif +95572b5380e4162155b11246226af0d7 resource02121.gif +b427a5b5c514ab08cbd9dbf67130ce64 resource02122.gif +205ee3cff5eb79c6c7391f37b6c27634 resource02123.gif +7a428e5743f9bf55852401628f73a327 resource02124.gif +9e3d71d4906e5986c88c8ce8036bafa1 resource02125.gif +3372f8b03991c44cda9fd39a6d20ba86 resource02126.gif +8eadcc180e70c0fc154f7baf6a9735f9 resource02127.gif +bf8f75de9e7bff5f0509be505cedda08 resource02128.gif +2c21c01498a543842eb5b882874cd0bf resource02129.gif +91f6457d4099206c308770b77e50e58f resource02130.gif +2ba7a7e99b3b6640fab5018498cb4dd8 resource02131.gif +9d58e869f5a742017ea5b21d9dc0cd5e resource02132.gif +274bd0c4e4fe07779e5d0aca5827f310 resource02133.gif +75ef6129a1d96d163eb54224409d9952 resource02134.gif +a72fc4ed6167c01308950df0fdea903d resource02135.gif +6575bd17e8a5e5d637d16e0866452cb4 resource02136.gif +8b6693776e137cbfe8a2284318a1d3c3 resource02137.gif +bbf4bfd1a30530d8685fd61c0e986afc resource02138.gif +7329bb5f74f43ef08a65a24cec779ffe resource02139.gif +c282a90a4228a02e001215f634e8372a resource02140.gif +ad6db8202f5f5a9bf601be07325bc377 resource02141.gif +abfae6ad68d38749cd2c9afcc98c9a7b resource02142.gif +ceb0ef4498cbb5c5ec3103ae6dbb8dba resource02143.gif +022df4d0e8c9ae548f20b2870e147311 resource02144.gif +d9a0987de0f50e52c8937d717d1a1bc9 resource02145.gif +39b25f2598d961312770fa6cdb562df7 resource02146.gif +7e96f9bd2e1446398acb0384aaf9b840 resource02147.gif +0f9c702a5de76f0f6d692e90a5cfc2a9 resource02148.gif +33032d4db4b9f55c66b41503ab0bf22a resource02149.gif +efee6aeacc12c297d081591292ca6162 resource02150.gif +4b03ac581ef64c350e095bae08a57d95 resource02151.gif +0bd5c81a96cdafe713ffec38d9ddc4c9 resource02152.gif +a95e3f4a8104caa332fd542afa2554a3 resource02153.gif +0a0326b2a4fccfe10e3d408596c4c8df resource02154.gif +27446613a24014e08e27a5fddf0e4b24 resource02155.gif +365db073687ef93cc827bb6409b2dd1f resource02156.gif +8143a62da3ca0d6ccd784b893702a5ab resource02157.gif +7d77b8426716084f4040371e017cf9b7 resource02158.gif +eb0548d4b4367be3fda9e466d55095ca resource02159.gif +e7ea135ce9906e55b31587ef43b38b37 resource02160.gif +752ead459532bc11226f4a25a445ba74 resource02161.gif +f5f92f9d7d92cbb7559c28164b90bb8c resource02162.gif +991de19d8860c92f23f5c4c824cf9ae2 resource02163.gif +c58cdbaf45824719b9e3b89c48c94195 resource02164.gif +cdcd67beb8ae59459beead722543b569 resource02165.gif +69cb0d1006566734ed4046a4fefcb480 resource02166.gif +c195ac5360e6f230235b3066b5eec385 resource02167.gif +e5f5f09a3aff9b261f5888a2d2ab381d resource02168.gif +91de82ef19c93a40091f0edd6bf68b95 resource02169.gif +617ac4fb406ab0f60d4f5102113cad89 resource02170.gif +abbe5b0036a8de5c093b2b5c20378804 resource02171.gif +81af89d8efbe5bfb584908450a9bfd3b resource02172.gif +5be64d349b81cebf3bf759add401b83c resource02173.gif +954a45ac6f579c024196d5f3862d2f2a resource02174.gif +fe3b783501c06666e942ba5351d377c1 resource02175.gif +fef32d6d28ffbbd3836a33c036baa781 resource02176.gif +8ff7f93ccc7d392ae16fc82df4b189f9 resource02177.gif +1c8dc636e0c43b3b6cc55d9c15c1a552 resource02178.gif +be1890c9e51c3473826a86754a32e228 resource02179.gif +861f202cdfb380e40b5fc00dadadd411 resource02180.gif +66b59e18f9c7676eecb2819e540f1774 resource02181.gif +4c669c4f9aecb20e9adb46e20418e791 resource02182.gif +82edb48a6c3106690ba5c7f56021db79 resource02183.gif +ae9b0c38bb945448b1befd5b3d4bf05e resource02184.gif +7c7726b45d8327f333ba50b369738d37 resource02185.gif +067bfd4556d63ad66538e4647909acd9 resource02186.gif +72c936635c2ecf4ab38fe5a59bb63e01 resource02187.gif +f41d6c242e54624c733ad375c7711dc2 resource02188.gif +2187c0bc7f9ef0822a0c1af62b5f5ee0 resource02189.gif +fac27b1e831e752f8b1755a1625bcc63 resource02190.gif +c2fac17446617331167220a51fe4f218 resource02191.gif +daa02d5b8cafb85b995fd18a656b4a95 resource02192.gif +b0b0baf6d331af61ae6413682adb65de resource02193.gif +1622476eb52c65ba4cfa4276fae181cd resource02194.gif +697394086c0b836a1898118633e32927 resource02195.gif +8256edb881a5c87bccc614bd0903aa37 resource02196.gif +0eb5ad9b8258d8446750571aae3b4699 resource02197.gif +bdc87d44cefaecd017be1ab469090fb3 resource02198.gif +15db564e420860999c99dcc38bf9e738 resource02199.gif +d47cb623113e28c29994912275ea3f3b resource02200.gif +d27d9148126ec3a05a4782413f9b3999 resource02201.gif +1a2d1dfe5c065381ebc3a5c2ff03d74b resource02202.gif +385277025acd4cd26861b055d3fcf5be resource02203.gif +e642dd64130d9026f0d995aa63911a89 resource02204.gif +129efe299d06961ac007f620e59d3b52 resource02205.gif +5f10a9292981e77f33e52a9cc550012e resource02206.gif +2240ef31b99d16f69f4412b29199e9a6 resource02207.gif +e9ed134347e54afabf967889847cad58 resource02208.gif +b89dbe5e7e101ece85af96a59ece4548 resource02209.gif +8673980fe45ce0a0ed36517534de5cd2 resource02210.gif +a5cda04b8d5531bffa5a168e7dac83be resource02211.gif +e34c38f50b341a0545418174f658076e resource02212.gif +cfed9e04302a6a98ea176f0013f07450 resource02213.gif +4f177232f4f80d93a3fb97a0176b01a2 resource02214.gif +158eeb610835fd701d9271075d4de10e resource02215.gif +878a22d963231569e3303ae64b68e778 resource02216.gif +8112063143b1022de6c06324e1f6ac0b resource02217.gif +338b50ee192aea8686d542c42b141b3f resource02218.gif +ad214145cb97fdf76cc797b1f0bdf758 resource02219.gif +1b78df71078214e45024fa801258e311 resource02220.gif +a9eb7a5dc85ab3c87a80a11fc637aaf3 resource02221.gif +ac0af45679bff4ebc11874150b9db7e4 resource02222.gif +efde4001589f9b8186e09faaafda887b resource02223.gif +c026e4514ab8c5f49856207bc6efd15d resource02224.gif +95a2251b6a5f37c6b0d5891c1104bf33 resource02225.gif +24f5778185b8183c25393b7b0cb3bf6c resource02226.gif +676b64a9c00eb2e73e3823e46ba283a2 resource02227.gif +dc2bcd93d7d80461c8cf93566d0f1f0f resource02228.gif +b4eeda82cd4cd3b7438d5109157038fd resource02229.gif +df9b62c2a7406f93d912141227de158f resource02230.gif +fe9e8dd8bfd226808a65559ba7061138 resource02231.gif +d4ef0e33401ba92a2dd329c97b8a423b resource02232.gif +5c6d51f74d6aef91ee79fdfe6ab93b66 resource02233.gif +4ab7b1bf0a2b4046791f8b787cdb15e5 resource02234.gif +fe60dd882eeb1929dd2d0894c1f92aaf resource02235.gif +a68902bd1d356c7b9a9a749da159f683 resource02236.gif +9a9880f9a2437f235d659456d0514775 resource02237.gif +7bb01a814145c37e7aa8ac5604bfbdc2 resource02238.gif +102c5558ca93cf9fa97896804676de4d resource02239.gif +16e24bc4426efb7b02cef8706ae5c859 resource02240.gif +7a100a6dfd5ae74447303d416c87f896 resource02241.gif +783b8dd734ef11bf6cab912dcc21e140 resource02242.gif +8b8d15a5b35e78147ed7bbf809badc2a resource02243.gif +92f0118a4ad584cd622b9ee83e98cf22 resource02244.gif +8a5dfb1ae596c41007e3a667517c79a5 resource02245.gif +957c8792c36ff77ec0caf97589e8e6e7 resource02246.gif +56c6265df34886c3b2ae3df6928e2adb resource02247.gif +62f622df960f367b102dc1a16145a7af resource02248.gif +2b55df9de92b7510a9076f81c51e8d1d resource02249.gif +c1c59d2a7a4ac431a56bbb35b35ec9c7 resource02250.gif +1e066e51e1d866304073c9e02ecbec53 resource02251.gif +96e62c334a901e1907b15832368f99cd resource02252.gif +3b569daebfc42a654f6fd34fdc6bf122 resource02253.gif +a4723f50500768abb821de810cad2a71 resource02254.gif +392a88cd84f2ed31b983545bbf5d66bf resource02255.gif +11d138361f724765cef3aa4f3cac646a resource02256.gif +391958b597030203a41d021d069c2c22 resource02257.gif +16bb0e0b50b7e53b64cada04932a53a2 resource02258.gif +ebaa39ed3bd53e760b50cf54c6feb6de resource02259.gif +1becb35ce632371e1d4ad4c0838a578a resource02260.gif +c6b63169b5fc401dc46b20e42a0b4844 resource02261.gif +365a76676cc143690e769d563e30f460 resource02262.gif +6d77bb4ff4e873ec263ed26750ec0556 resource02263.gif +7e2c80f217727066d01936158008a9d4 resource02264.gif +eb1c2c6cdf398de7a83c5490fedf6654 resource02265.gif +a98789d5cf67f1a19263b916ddff0727 resource02266.gif +a6bc3fe5d33f4825cf8812d9becd87e8 resource02267.gif +6193da75980bc6b8eca8a2de7bac5e89 resource02268.gif +3b3a814655d18289c04b1550c05fb674 resource02269.gif +0577f8a105df7ac593b42e6ba0a8b1d3 resource02270.gif +85758009ec9297048c260ec59225a3b2 resource02271.gif +399ddae23053198338dafa434cfd9e7d resource02272.gif +f92958390671c9ced2cd9265d99a99d9 resource02273.gif +502e75ba6e7e4d4ef86661a45b0b1545 resource02274.gif +10d26ff77bedecb4a1074594b6669370 resource02275.gif +5af8e05d0834a44b62e6bdfd62be28f5 resource02276.gif +2ef1aba5ca5c88567d82ced3029d6e77 resource02277.gif +3d8645ecb8c08c38c5676eadc81bbdeb resource02278.gif +d7b4d4464581e3b495b4ba0cdbe0a474 resource02279.gif +5869cb089bb5e0ed98f37b7259a9663d resource02280.gif +4ce9ed5c2a126750c3e6ae7232b0fc37 resource02281.gif +3c1b4fafe8c48a8751f1acc115826a23 resource02282.gif +8af5fa15693c5ff158c41619fd19742a resource02283.gif +3b949a4b0199105cdfd9399954d65056 resource02284.gif +d38e687f657c63135931a13c2935896b resource02285.gif +736be38b60717c89d6875213162c83e4 resource02286.gif +df6ecd8741302055d91272a4860ffc6c resource02287.gif +62dc5ad51d8fbac190c88b22a1c2b098 resource02288.gif +55d33f11fb44d630542f1b74019f35e0 resource02289.gif +721ccb78d4ee46f8471a5cdac88c3f3c resource02290.gif +dd148cbf5b6c907edba5858082c9606a resource02291.gif +b686819a3f832f169d98a5173d8052f6 resource02292.gif +e767bf6ad9d46a25f287798f0ccfaba1 resource02293.gif +5898007048f32ec1ab112d7d125a649c resource02294.gif +eb85b5f1a45bc377b38e458ef3883d56 resource02295.gif +01660e22956fb0d847ddca01c9f34b35 resource02296.gif +00afd58b8dd29926dcc1d650161aee77 resource02297.gif +d49936719a409525e168e26dfaca8b06 resource02298.gif +4d2985cfec129302873258294c71caba resource02299.gif +94910e254bdc71c0193160afc98a7a87 resource02300.gif +b6014d3f0f35f44a8fa9f1f0a38944a2 resource02301.gif +0f0af82dca36a4eab072a201bdd62b01 resource02302.gif +03024191266d089488cb6d5f4139f970 resource02303.gif +1e9c296dd2d608612ce0267b3e41d59b resource02304.gif +725d4630969e405a754a9f548b1c38e4 resource02305.gif +8d9270399b047755c6207ce821c2c4a2 resource02306.gif +efb5d7fb00fd04a46b266ac35dd6d46f resource02307.gif +a4684795d45022cfb660dbabb0abaf1a resource02308.gif +07dc2ae9a3dc2932327626b7d42e662b resource02309.gif +1b9fafffc604d609b53971619ba5711d resource02310.gif +8c0c3e038bc6a52e0b2e434e2f726732 resource02311.gif +20088779d61d17429510af9b141f6fd5 resource02312.gif +d20d7e522395aae18dda883bff077e44 resource02313.gif +3ae45166719849cb8080f409551a8811 resource02314.gif +b7c80d2ea2786f7f9a4e186c8618d623 resource02315.gif +bce20b63675224c525df0217587ba0ca resource02316.gif +e09314a2ea5daee57d8d87c441c496b4 resource02317.gif +716de2e2c5a886ef84283ece58cc5fb1 resource02318.gif +6f7482bf388450efd77c16e3b0e1e0b8 resource02319.gif +8723dae2d3e4f38d8cff3e2e856c8147 resource02320.gif +5522b647c08e13709b269f1387070d0f resource02321.gif +0e77c86b5d965d3b11f9e391c9527ff9 resource02322.gif +897067718854f494473f201f5ea8b966 resource02323.gif +d41f23e0ea2f19921f4a248c315e3f0c resource02324.gif +dbcbee299dbb7521b528ade5a98e364c resource02325.gif +abc897b663f1aae37096129b40bacc0e resource02326.gif +7300e482dbb5a2dd4f0c33ba45395361 resource02327.gif +374f86b15fd3d7429354f1072226c157 resource02328.gif +33da654fb65c168efbdf7ce60eb79d24 resource02329.gif +87d4b5709c1bcde00c09c3f1353317f1 resource02330.gif +759ad675c2ff656082d11cf47ba7e11b resource02331.gif +6036ceff1940a268656f8455ca8b9638 resource02332.gif +8f30bf7f9c18f600047ec459fd426b0f resource02333.gif +74366abcb6914950883f21a4674927cb resource02334.gif +1b1a210a02b05b00bf0442f029a7fe48 resource02335.gif +c296b592f94d64a4506d9ad09120653c resource02336.gif +501e699f976770d72c14d4ad895d8af6 resource02337.gif +bec0e2e05852bb345f0a872a4c61b390 resource02338.gif +c32340c290967d3bea0a932011cfba27 resource02339.gif +f79443fe1881d175ceacb9825228779e resource02340.gif +06eff49f0a758d3d4d473edd2b493cd0 resource02341.gif +fe7b9c34ebf20350b1d0488566c9e33c resource02342.gif +a94336cdc41c17bf3d19f0780298faa0 resource02343.gif +d58a67acd5aed00cf3b10c360c2abf9c resource02344.gif +5a571fcbd1b5614ebccf6722cbb09d34 resource02345.gif +19692cdb6c3695d210bdc7e3a4113dd4 resource02346.gif +ba3ff6e4763e5c66d8cb91bd8b325b63 resource02347.gif +81aea9d0c5226bafddfa5ad51081a30d resource02348.gif +7baddceb5e45902158f98474be9fd7b1 resource02349.gif +349ce0da6b7190b1614d5ac8cb173ee6 resource02350.gif +977855a5f8a118081fcdee98feeffd62 resource02351.gif +6917d0d0cbcd2e35b190d23d0571a1d7 resource02352.gif +c7b9e2c2e867d4607212aaf425dcb3c5 resource02353.gif +b854598c86a64e113db24c36a9079504 resource02354.gif +c029230157ab1a835d2a3f7c16a70087 resource02355.gif +5bf2ab64d6e3951978614827b47897e1 resource02356.gif +18d6def8fe1895b4bab943ae5fd1b318 resource02357.gif +f68403ed141f5c5530871143eded91d8 resource02358.gif +a384f33949a042da9775c3163f8d1f37 resource02359.gif +e6ccfd49adbda87e1d69ec5db3f0b43b resource02360.gif +a2a3441335455d2a02c12904592e0b54 resource02361.gif +6e0e9c4b7fe29438b7087a58f32776bd resource02362.gif +06201fb313525bcec336271b15711940 resource02363.gif +14304397c45214f4489c090a633fe024 resource02364.gif +d011d75262a0a1b13914c922ecee73fa resource02365.gif +a82d349324aa706b8d6e2c04ab954b77 resource02366.gif +098ace3364671e712b3bb2a344816837 resource02367.gif +34d66d6f27354e970a3b3bf78fddc623 resource02368.gif +c9fea405ed163672ce473bec6af31e59 resource02369.gif +69a45dfd66ad5944f1935b4a084c5c80 resource02370.gif +f20f2d75d314ed16447bfb82424b8b5c resource02371.gif +b2c67f0e2e6625e9e24f95e8cc3b62a5 resource02372.gif +409b7732459a525f6fa7e3628e26b1ef resource02373.gif +35624fcb034c51a6bd060757ec92b852 resource02374.gif +0a4b3d3937b4d913c0a7b6955a5cb173 resource02375.gif +24d1501d0fe9f1e0e4d51c157d924e07 resource02376.gif +d39c209f0e298fdd223f5c163f5603c1 resource02377.gif +ae54b6af147c3fee6e5a64fe69080ac3 resource02378.gif +e745998dd6a4330843a20e7ed5921578 resource02379.gif +9dd2138caad025abc8dce6a10d1a3577 resource02380.gif +d1b07e97019db35b7c39222e03d64cfc resource02381.gif +8ec4fd8ebb4760d7bed6ae7f294c8355 resource02382.gif +d87b29b7303f3ba3d48461eff10933e1 resource02383.gif +af809849fdd355b61b44acda3b693259 resource02384.gif +cf3062d103e07f68da7bacede1c69202 resource02385.gif +8aa5c6670af95b6fe7e5ecd61601ea4c resource02386.gif +e56bd5626f3b21d5a7e9562f40734533 resource02387.gif +4b6f73283f21ba8636f2c5d45a3d6f45 resource02388.gif +f62d7eeafb9b94ac4149261d8f1a1747 resource02389.gif +3714533dc8e4b238d63f73cc89b0a02c resource02390.gif +a415a82778e54e580198639662099369 resource02391.gif +cf5a7c338ae907e3c8d7f5dfde24259e resource02392.gif +52a49ad75e76e1439e6bf0ea48ebdeb5 resource02393.gif +b0d32a27910063845600b51362bba186 resource02394.gif +b0bb6db29517334c06aaec64204a72ec resource02395.gif +c6ef228c30b05e12a1c572db416061b7 resource02396.gif +dfc1277d116af593755b15feeea7447e resource02397.gif +aa0f55a2c4d9ae4fa77fd6bdbb25436c resource02398.gif +b5cdddca7ce2b793993b6ac9ce9f6dc4 resource02399.gif +a55bac06c7750e4cbfa1679e8daf50db resource02400.gif +5843a87383a4d1ae47c4cb43edffaf20 resource02401.gif +4aa2d0b915c78a617d2c22f099c0cc1e resource02402.gif +ae10b43d198935d5cba4222264666e67 resource02403.gif +970a980735a42719b7250c44af417f37 resource02404.gif +aac9b3f52211166c0a65a547ecc3a156 resource02405.gif +b31b52aef3ccd5762c7759f491cc78c0 resource02406.gif +0a2f2f8078d1adcf9d343b90f2edf473 resource02407.gif +b2630453c31a0b561211672b5c2a3548 resource02408.gif +fbacd88abf2c08869a75071d6db4f839 resource02409.gif +a13bd5405977fe6c795502a5fd651816 resource02410.gif +2a84497606768e364fafc06089183830 resource02411.gif +8b422001570a21142ca18bff4e14dce3 resource02412.gif +9a7037a56833460cb0ef854f66b4a247 resource02413.gif +6dc5989319f8bbe5e7850184b342a5d9 resource02414.gif +511727c4f780d9664e47c8fde6755999 resource02415.gif +a452698d3b98daae587779777ccec631 resource02416.gif +915ae19551a752a9ae39d6cd9adab516 resource02417.gif +ced340ea19fa02c9f6c42fc8f1e86da5 resource02418.gif +99a4bbecdfb239dc4fa46163f1118da2 resource02419.gif +aa5b1b86f3aa771d110445d7ffbcc25f resource02420.gif +0445690d2f7a77a0959e54e3176a061e resource02421.gif +7d49520f31ded8346ee6837fef7c5937 resource02422.gif +63627e1299361ff9e605fd8d8a34ade4 resource02423.gif +e227eb53aaadbf6ce3c6a1a5ae197a22 resource02424.gif +65949e9af75f905e8fe476cc6f52aa06 resource02425.gif +f7358554c2a5e2c72845eb54479d57be resource02426.gif +b1f6907b8cd14a23a74c5bf1f81f544d resource02427.gif +f2fd7096ba2c39002e42a623cd0adfb0 resource02428.gif +10df0e090c62ef0d6294b7b8f2b58440 resource02429.gif +3c18b6cb6efe8bc83d1e91cba0088c64 resource02430.gif +98575153642ef1b9e107f4cdfcbe79af resource02431.gif +e87a4d685702fe2a05cf1a06e908a4f6 resource02432.gif +21fde0394ed8423e70ae6a87b88977ca resource02433.gif +dd3ea3f774cbbfb6c5e587fcd87efd06 resource02434.gif +f4c3470f830b31aca73a8d0c59afce6f resource02435.gif +3c2b3259a7ccb03e6eb133ec6506d207 resource02436.gif +d3186748bcf554be658db43a4f826282 resource02437.gif +803184f9b219fb04dde609c11a0a55ac resource02438.gif +cc7c7e28d13be0250e6d096a2f50fefa resource02439.gif +a08b68d064318575f304b3d90f892f33 resource02440.gif +9b4d6f35a08a58cc1af9feb94f3a0dc8 resource02441.gif +8d1cc179e58b06985f741b06aa369034 resource02442.gif +0345a14bceb7cbca2e83cfd41d71b040 resource02443.gif +32466a01382250ee4a1527b9fbe4aa93 resource02444.gif +800f0a285cb31c093cd60bc3e88fa2de resource02445.gif +ef7738419073d902d5b4f013ac2f54da resource02446.gif +9023e67859c6dfa51fd3585a9ed88116 resource02447.gif +22a7c38a9ad89cec2f346764516affd5 resource02448.gif +fe115afe799533f44e5e08e417f2f47d resource02449.gif +c15c57372908fca339d771a8f159898b resource02450.gif +a9bfb4cc8e0ab7accb0a901a6741099d resource02451.gif +3974ae2b77d2d64551111388759836cb resource02452.gif +7aa7a88d49b310703e9515d37edcb7e5 resource02453.gif +530182d635886c411b78c2b659cbd49d resource02454.gif +1c9e9265bcd97e2886b6844877455d2d resource02455.gif +4e5d40d4affcffabc998c2800263d342 resource02456.gif +b434bda410ddd1c415066af0d8c808b9 resource02457.gif +03efd545f06c3515c3962d32ad73a425 resource02458.gif +64fd5701b67591d856233ffe062b42b4 resource02459.gif +93a513a1335c3fb8833e629ad7f8046b resource02460.gif +3ca6c44e78fc35a2bf664ab975235b20 resource02461.gif +eae2afc49aff5387e5ae0d9825199f42 resource02462.gif +1ea9ed40cf014c38b36e90dddfd5f3f4 resource02463.gif +5e6e24c30fc0ff72cf7baf55f1c76a7b resource02464.gif +0e48da25aa22295c210745987ccef129 resource02465.gif +75a02876ffb18602b1b4498880306815 resource02466.gif +9566112df4a712330d3ee519622039b9 resource02467.gif +524fec242327810a6cfb0dabc8d84793 resource02468.gif +661a6db07d939fe5bb78dd3d59a4f5c4 resource02469.gif +4b82b4db8597dab5b44d753bfd0498d0 resource02470.gif +9a86e4bb323a2f6dc89281a060ff5d05 resource02471.gif +c26d747b9aa67b62ade98485c6bf2a32 resource02472.gif +9b1527b551c1d9e5eafa5b700f2854e1 resource02473.gif +2b9eabdd265b5a783f2fbf9257bb169a resource02474.gif +0ec1c32b9160b840190e7e3ba6d1575f resource02475.gif +63d088c0ade57373f1231eeae666777f resource02476.gif +678a3a1815db4a0a3675e3544314c60b resource02477.gif +13cd35a7b72ab556ec7137ab63fcec43 resource02478.gif +c3a9ced2b33aaa76e4abf6c66ddf91e9 resource02479.gif +63d33b993429f156ff773cf80474c8fe resource02480.gif +fe41ae62db94386a76cfcee180b926b8 resource02481.gif +2f2abe682cc13d0cce97637f66dbb553 resource02482.gif +25de9692406abbd4e808460a18ae4405 resource02483.gif +2e5c04108d962ddc04973c2c654b5cbe resource02484.gif +331cacf96731088793934b16ad969d1d resource02485.gif +e9595a7ff4476d396a7a62ff8e294257 resource02486.gif +f0ef72620a8cb668634f70f65c0b688d resource02487.gif +a221658084bdbe72b582ccd222969b68 resource02488.gif +937630cf07d18e6bc2926ca8a0b429c1 resource02489.gif +b0a2ce354903a1a0d87d0302c7deb908 resource02490.gif +d442a9c9a909f9d8936495704cca5585 resource02491.gif +5a84a16230b0499645ddfcd484b8a4db resource02492.gif +a2a4bfb71cb21080a008dbaa8206cb03 resource02493.gif +b2f51dd87e3be4316143e34588396274 resource02494.gif +59ed473006ec05c2f59e15bd21e9e0ce resource02495.gif +37145adff975a715aa287b0adc9cc13b resource02496.gif +e6c6e321ba2d33dada29e7122076b692 resource02497.gif +a8992fdd69482a1ec7dac49090a1cd6f resource02498.gif +0e266c47b7d21c59d3ea2e3cc71935cf resource02499.gif +35a365e0a28e18c604a2c6c02d23e9fd resource02500.gif +d7bef82e62a933a0a1bb9f3a9f03d80d resource02501.gif +46d18edaa387c7a9eebe61080d5397d2 resource02502.gif +1e03471f5f1f45f20f96294a91dfc054 resource02503.gif +a15b276afd210ee1de9cb59a19c7bae8 resource02504.gif +abe6b21c2f1165fb03dba35e0ad75ff9 resource02505.gif +181fd4704be40973699e475699963430 resource02506.gif +9d80861b303398558ee209a85151f1ec resource02507.gif +cbe4347039d8246f699ab02f0a780cc1 resource02508.gif +7b2ae30ec841dbeaeb4a21b5ce057a66 resource02509.gif +60e6eec6e5b9aa634632afb9657237b9 resource02510.gif +a78f8de76a42aac830a6a8330d81da1e resource02511.gif +0d6b1b664a40831de27d3c2157a2fd13 resource02512.gif +85a64944d42ac28ee02c8c9ae6ae9acc resource02513.gif +679119a725060547b6e841768793198d resource02514.gif +d4fb20e5cbad95a6c3aa979befa9326e resource02515.gif +58b0a19938f1538d6bc91c747f094c77 resource02516.gif +e6b7d54c626ed539ea3a2d786718068d resource02517.gif +46bf826de7eafb0abafff64d0fe80b73 resource02518.gif +442936ba6ac3eaa2a59a31364f154e8a resource02519.gif +e76d5b8122cc4422b4c9174fdd1236c6 resource02520.gif +c00a93eca01fd215f98254af9be797e3 resource02521.gif +4d620673e7d603d64524b8948846c34f resource02522.gif +539ef001493ffec10de44f9b21a95b64 resource02523.gif +71057e1657209bc64619ab7e6396d85b resource02524.gif +c06e001e45d2c498012f49acf15db39a resource02525.gif +0c8c01090dc8c1a0672e37f29bb27828 resource02526.gif +100d885fbf4c3c83b66305a0b0dd2f7d resource02527.gif +1880d66cbc758d4774b4e4d507747f08 resource02528.gif +3900e42e26d0afbd283c11c100deba64 resource02529.gif +96d3f9bbfebecb8620ad5aba8b6bf493 resource02530.gif +1935fc848009a069cff4dc62339f3f8f resource02531.gif +5d077dc042b857701f53966bc07273e3 resource02532.gif +ef5a3ac306106b46ca0aee0f85c44786 resource02533.gif +6da2e8f6de04b8b12b0dca4b2b087975 resource02534.gif +19f1049c819d600bb6f2fe805704ea9f resource02535.gif +cfc56b88828d684c4e29a30510031a13 resource02536.gif +8fbc3c05a800c0b1a7c6b286c30629f2 resource02537.gif +53ee5be6a9547dc34096e87447d3394f resource02538.gif +cd92f10a1478ce81e49a43ebaff4c7c4 resource02539.gif +38c44740f0d63f941738034eddb5f991 resource02540.gif +6674ebcb86f3156ca1c804eed455804a resource02541.gif +52d5aefe090dd350d36bffb0dd6edb11 resource02542.gif +3b4bb11f605805bb6d71591ec664a226 resource02543.gif +cc759d2d58c40f73a8df1fe0c39e330b resource02544.gif +f3e9bec0cddd27b0624beaf1e2b5b8c8 resource02545.gif +5d0b483b20edef8415f78a04cd80cf53 resource02546.gif +af75df8df02e38a4ebd4851b3e691596 resource02547.gif +6c320afe93f3babca15bbacee56a8104 resource02548.gif +791357ade041aa11a968941c18fbce9c resource02549.gif +26b3ef16e31f6610c57e2737168a7e5c resource02550.gif +247f5efa355800a4a6759f7dcbe2759c resource02551.gif +a5faf82e4ccf25861ca27d57e5b7eb97 resource02552.gif +9ecdc3e836c8d55c2feabd6caedf41ff resource02553.gif +0632f449d770ce7126e3b38cb643e5a1 resource02554.gif +a6fb273b9bef78b2e5b3f59d0d5b4297 resource02555.gif +00b40b426566d38371113ec72694d6d8 resource02556.gif +4a1092dd6a0c6af971a391d3e31fb916 resource02557.gif +697c71383a37e1b2fd7b5a140169c6f7 resource02558.gif +c4213793f48c61ed5ecfddc9235f8404 resource02559.gif +9ecedbd7f27cf4ddb65289abcb3ec7af resource02560.gif +51044e8cb42488893e8e0a2998037eb1 resource02561.gif +e2b629ccb4c6dbbcd12d9c64e427a349 resource02562.gif +3a30917cdee859548efe7ff821b5915c resource02563.gif +2bb4b65132c775a2d2c12f70a147df6b resource02564.gif +7452851ef3e670adaef549529b8a2dfe resource02565.gif +c29bc842f2c63cceca40841a6da2c7cd resource02566.gif +1b4c55628d26bb2fef53dfdb4a1b1333 resource02567.gif +004b28af07066962b9b9a58d0fbf5e59 resource02568.gif +3617a9db428b4de9cfbc0a075feac3cb resource02569.gif +f277c9e0584a88b6032d7c5a86f4544a resource02570.gif +e5612dfd9ff73cbc0e80b3a85eb2f824 resource02571.gif +9fba4add964f1001f055eeddbe559b97 resource02572.gif +0d911d858fa688db7a963e08d89e3f19 resource02573.gif +b8542339c45ed1e2dd121a3bdd928215 resource02574.gif +93e30c382d656c8cb790ac7d7c07fd57 resource02575.gif +9c8601f0157d158313e630a32d02a4ac resource02576.gif +c5dfc5d42a665ef61d67ae6fd969159d resource02577.gif +96a43d88f194478910940da3643bf9fc resource02578.gif +33af10bc896d744f93497178b5df9731 resource02579.gif +3f9b9b6eb476fd4cd45fd15a78c2c4cd resource02580.gif +d97c18b22658b3943570a2bd8358c637 resource02581.gif +bdc6df30b2321fdf8cc76c7d22eedb8e resource02582.gif +c26f7a8e5571772d9fb6f2842611b7df resource02583.gif +de90812a30949f226629832c58510830 resource02584.gif +0a9ea343ab329930b1ba5d946daa19a5 resource02585.gif +dd804bb6a0b9d51d35a9caf645786854 resource02586.gif +70c4eeb9bb109a569dec5186171bee06 resource02587.gif +5e735b1d973fada1ba74f57dddaf54f7 resource02588.gif +8c1cf1694575dc1acbd2998c300c4ea9 resource02589.gif +9e4cf9430d2b45be95eb903a80a6ffe4 resource02590.gif +5fd89d6ccb5b5a228eff7582ac504e71 resource02591.gif +523f593e1b304555ea4d466cca11ebab resource02592.gif +1b5045ac736e6acc57613b9b11cb644a resource02593.gif +5db3cd0122e7cb06e8679c091a939630 resource02594.gif +122661161734e3f1dd6724bd8b6c0278 resource02595.gif +43b7e18db8f4fb80adb189845553cc1e resource02596.gif +ffd8f912d1c34ffdf58de2c6c1ed2de5 resource02597.gif +624286933bd0bcf94342fe68e3940b6f resource02598.gif +b17a9eea991b3cf4b7ce7dc4f6294537 resource02599.gif +cddd5b8696ce8375702785451e87ec2f resource02600.gif +40cc44f0d83fdb07a5df05abe3c76551 resource02601.gif +6e309f4d97f0fac3870abc89bc1e2e0d resource02602.gif +ca3f11e090456fc935b249ba62ae6be2 resource02603.gif +ee99240e3f1a20fd033ef9774a6d955c resource02604.gif +145b7550c7dbfc10657cb97725e7215a resource02605.gif +755f9271695f463420f62dc8de93de48 resource02606.gif +eb3bc8a3ae257c6d5a2fafc2a0e8cc98 resource02607.gif +f7dc38c308cd714a973f213621b5e0c9 resource02608.gif +d1ac84744612fda4684c2e7eb6fdebc0 resource02609.gif +492823caed6254f4223281c483812064 resource02610.gif +85e2c0dde4f90e2fcd0abed245dc1c2d resource02611.gif +e3ca21726fdc191f3c86bd18d4a6a11f resource02612.gif +0ecd413fdc9488d4ebd739f1c6c6722f resource02613.gif +8e89f3206e3ae1011ec925e83a7433f5 resource02614.gif +e541f4d978e4acfc0a1c7700cfe564fa resource02615.gif +84fd0ae0afdee616621c03736caf026a resource02616.gif +d7e5b310442da5e82859eada10f03101 resource02617.gif +ec6918fcf51ab2bf76c5b75e7980dd90 resource02618.gif +036bb29d8a8510580c40461340f8a6c0 resource02619.gif +99dc9ba5507e2b58a4b926ab44114b6f resource02620.gif +71a10e0491b721fcbb582a1c275932ea resource02621.gif +072afe4c305686f4052df43b57f9e830 resource02622.gif +8e4af6989032bfbc7ef8ec90c81289de resource02623.gif +545362b985106958b1ab19a9184b34c1 resource02624.gif +ce79a1e3ffae668bde756e805c90f858 resource02625.gif +fb49f23e2974203bd339b29ac18b69b3 resource02626.gif +9e2c6334a9366658d09adc237a9a1740 resource02627.gif +839b7002d4a4ddb5dc7266acac05ecbf resource02628.gif +c92cf9abb8cd209ebbf5e23136361ac5 resource02629.gif +f65afaf02076957fbcaff91660a54a6a resource02630.gif +bb8725bd9fee4983c5411a9c2dd74ce0 resource02631.gif +2292aec0d98160b2ce447d6dc1ec64c7 resource02632.gif +8505e15acb0676e5ec6efc79d67dd97a resource02633.gif +60286036b222c203f419848be3aed87a resource02634.gif +88fe0be2bfddb259d668372897d094be resource02635.gif +7b447b79f16aa284cf090a87abab635d resource02636.gif +8786ae17b11db2c5a92865d50840658d resource02637.gif +9d7026f235bbdaf35aa5b0b0dbeeed2f resource02638.gif +e270da7073c051f98ec7ae008415e57f resource02639.gif +240d299e869c3b82e542e4d05364bd86 resource02640.gif +cc5f0e30fd552b94edd51d6077e035e0 resource02641.gif +5039798b66c396e787293f5ff78ed699 resource02642.gif +dbf8b2b5bc960b9be8173ff897b3687e resource02643.gif +2664ac0e12f2c9855ae369180a38ed17 resource02644.gif +f73d8497c1fe0e51e2a20d72253631ad resource02645.gif +531f2955fd539662c3ebf6f53a7bdae0 resource02646.gif +2ea9fe677bd45b821c4b08e7cf4243ef resource02647.gif +2ea9fe677bd45b821c4b08e7cf4243ef resource02648.gif +6c8baff148a41618e0b003b9d53dc51b resource02649.gif +ee4d210003bd1bb9784381186f58e551 resource02650.gif +f2fbcd1356b1b6f45383f06ad4bbfacf resource02651.gif +3ccfbac9cee15b3b6076f93c28187bc4 resource02652.gif +ab5651a96bc7b6c8807fa83f62efab57 resource02653.gif +0f8ef108fc1d325f69d3c6f4492f42e1 resource02654.gif +a6357caa7e58e5a6ba95680b9496cd31 resource02655.gif +89e9e8985baa3f6eba056b90f36929b3 resource02656.gif +910f4387315f9334c450ce7a2e5d2cf7 resource02657.gif +e430dd0257f39897b3c4e353211f3951 resource02658.gif +8cfa11ae40773cdb8b69a66bfe16c7ec resource02659.gif +35e511129e6f09ed941f513268daab43 resource02660.gif +77e66321ffa46a98360177628fbcb477 resource02661.gif +beb44c38cb542cbcea81051c3ac958b5 resource02662.gif +d5276f300110d8e82cb8cc96affdd315 resource02663.gif +d58697cf5d47753968bdd4758b5244f6 resource02664.gif +ce7467caf759c2146ba4029a16042de5 resource02665.gif +f52c0146db8bc3d024d3c3f5373cf8fb resource02666.gif +1be7a03bfc6dbc813dba86a97ff14111 resource02667.gif +55c3d73cda83e20f97d263b66a9ba245 resource02668.gif +c7eac04cf1d6763425b686dd0d60ee78 resource02669.gif +4f0e5c5a31f972ae7057bae31a4ccae5 resource02670.gif +999d0ae325917d6f66c1408ca438cbca resource02671.gif +e61b2f656a4b0218b52423fbdef81465 resource02672.gif +81b053b4af0a91ebfdfa5d18456ef7b2 resource02673.gif +3a09c7bea7b26d4b1d0c5838037ea176 resource02674.gif +e0f2cfbe31682e501b4b82d4082a6f41 resource02675.gif +2b123796e305592e58ea7bf7c0ba0d4c resource02676.gif +be831b44394a22a6ecf6361913dbbae1 resource02677.gif +22eabfa38e5d3b8a60359ea834dd14ac resource02678.gif +c31a7b08a4bd8a7b5b94a01d75f66375 resource02679.gif +41a37557e468ceed12b55b4bcb0970bc resource02680.gif +69e6e37360033a44d154d52c1c1d4f69 resource02681.gif +fa662bf6d3909f3c86fd867732a4b333 resource02682.gif +a3feb5e0954c56b6d49671a7d3bdbe18 resource02683.gif +7674f4ba920e90e21df47d2045baf96f resource02684.gif +e7097a1bea12f60877eb919dd7be62ad resource02685.gif +09e39e04120ba9e5a638c245e8d75d9b resource02686.gif +55b9810729333e128aee7c1469c4609c resource02687.gif +727a3b2d8644ae244e1e64995a18ed8a resource02688.gif +116fb9d1d0a282ed1abd25f2331875e6 resource02689.gif +9f597fa538e7ca122337681e22d46ed5 resource02690.gif +c0f0a43330ed67f1a01d5a5d02b2424c resource02691.gif +1dc9098da17e7ed7b480717511a1fcdf resource02692.gif +d5467804349767503fcb94b5c20a365a resource02693.gif +3cee58db3c197660ad5d2cee35c4143d resource02694.gif +1c3a012394b183646a610e9f4a71854b resource02695.gif +f504f56ca938aabc119c8859e67301e2 resource02696.gif +842c24c838e805ff7786d0df7106efdf resource02697.gif +01e81cba472bdaa26574a72ce1d7944c resource02698.gif +d9429b592406028b1a13c16423b64618 resource02699.gif +c2c93791e1c53ef332ee2ee7d58432ae resource02700.gif +3c28faa8f0d82ab95d8d97db2ca247cf resource02701.gif +94b55d77286b705637a57bb2f816a670 resource02702.gif +ce2de4e72419f494fa173016d144bf9b resource02703.gif +b538d38374bf6d3dc493f2e8cb49ac1d resource02704.gif +48380b98d4f6e7cd67e877c0dc156b2d resource02705.gif +0a937e106d8c515c892579f6acd6371c resource02706.gif +6af4a5ec35d290734e12a4105f654676 resource02707.gif +8451d2928bb16e4931c6d65bb5104a70 resource02708.gif +e7d07681d4e833d183eb3f50eadd8a26 resource02709.gif +d71d4aa1266ef53e730effd9e190063a resource02710.gif +c0dbab1bedd6b51259a67a73229d330c resource02711.gif +e7bc50f10628c28eff5f99c2842ea902 resource02712.gif +e881584d48679c28274562a63f519c86 resource02713.gif +eef7682d89bae4ba3753978e721ac5fd resource02714.gif +d9606427c83ff31c56e8b1537a8d16a8 resource02715.gif +5a2ba6f685577163dd16c563f8e36c6d resource02716.gif +76413eef47cc4ddd5a1eeb6cfa10629d resource02717.gif +328b3284e3ee318c07334b3320c9c3a5 resource02718.gif +1d958a9b7dc3dcc25fcd28664927e3af resource02719.gif +3f80698ff1eb10825a95770de2349948 resource02720.gif +635db68cdd06aa49b2e7454942659568 resource02721.gif +e4785f8ecab6df538bb666fc8b902421 resource02722.gif +3514882b8b48c1b9acd7f2fb51e3b731 resource02723.gif +309cc77cf6b298489333c5db384f5ecb resource02724.gif +cb77a1595275218b22f1ada1d55f5e01 resource02725.gif +0db68374497ab245cd94c3742dc09755 resource02726.gif +bab04d9121c774d6e2abc08a7d5732d7 resource02727.gif +ca6fcdd7bdf66bb4007dc5fd36e3f3b7 resource02728.gif +b4ad3e6b9116120dee3209e1e3fb4143 resource02729.gif +34ce163540aec6b83a343a9e26a666eb resource02730.gif +2cf039c1e8d7ca324533247ba791dfab resource02731.gif +fb6a3c3dd2ba4a6b7fc697f019d46d3b resource02732.gif +3d26bbf0a497327f19fe8d9dd68f7187 resource02733.gif +55088dd24d4a9f49938d7607a32d7fd9 resource02734.gif +89789089a55f5cb8ca7cb2ec2f3b6a1d resource02735.gif +fc4d60824aa59cab5b53cf6aadc7f869 resource02736.gif +2bc4071c6dac3f4214289e216e0e5115 resource02737.gif +11284bf5be73eecb9c2441359aec253e resource02738.gif +166c0ebec940bf7484d946677c864220 resource02739.gif +146bc4470f509e331a4289e17f823bd7 resource02740.gif +d37f3fe73aabb80146525cc4799b1486 resource02741.gif +abbcd3c5e0ee9447b4193653e24b50ee resource02742.gif +f14af9e3d5297b8004ebe357cc0c2a6f resource02743.gif +c157c81441ec85e70d3ac4ab4b946f0e resource02744.gif +871ae909bba37d058f469d43cdb26a09 resource02745.gif +0bb213e70aeab52fd274c693cab5174c resource02746.gif +dd85eaf2ca1b531962a5963a3e599352 resource02747.gif +ebd70f21276c3f3e6f08e813aa645d31 resource02748.gif +b49ef760342dc5d70dce4fe6e7eb579c resource02749.gif +3c70f61c238a474900b71b5d28dcdb77 resource02750.gif +da7ac1adf1f07b9dfad39e4d60a7e97c resource02751.gif +da77f56ea6c3d02d0ac1002065b6bab2 resource02752.gif +27e140f98f3da17bbf21ed672519d698 resource02753.gif +230bb1386ec69b151bbb2a1474bea33f resource02754.gif +ff3f6b44e5de2e2b955198ccadf03420 resource02755.gif +e6e3f2484a30a477cb87914216b4e2e0 resource02756.gif +6f029f2c387ea89a12bb9560f35d2b83 resource02757.gif +65b2c24a6efdce829c41fc9302ac3208 resource02758.gif +743b769fe0edb7197e373992e1dbc47f resource02759.gif +9f2cba2adb8469b931b7ad978466c2bd resource02760.gif +de7cd08a4bdc872279c45a93a71a237e resource02761.gif +cece531cd6ddbbe950894777abc6d77f resource02762.gif +ea828d3b2ca8f92577b5896920e1a729 resource02763.gif +5b5c26c6dad5a45609a5d5bb953a26df resource02764.gif +9831528f4a23128d5dc833d3f0885552 resource02765.gif +d21a480e1b1ef63f417d12f247685ac9 resource02766.gif +2b3c40a2961e29766c3ac7b1a04aebfb resource02767.gif +d41dc83d5b13589adc3253e878422286 resource02768.gif +eb08210e2ebaa1f3494e783e4b452395 resource02769.gif +805ebcb12c06a7c5b5e84a9383651a53 resource02770.gif +7e16e8ada5f1ea412715cded5125db02 resource02771.gif +dfb6a30868536da1a9048a3653793b27 resource02772.gif +cb2a34abe09c5988300b77ef7dead0ef resource02773.gif +16264ab853ca157bf5eb3fbc12dc7ca2 resource02774.gif +1425bb8f2f27de7982c73e725dbfc302 resource02775.gif +cf6073e0620a1c23ff95f17c2bf8ef6e resource02776.gif +6d004928db35d14cfbfdacb2f7e7409b resource02777.gif +68f5bdd6ab6da273a87674adf382373c resource02778.gif +9405d93df03b2936e319a0bfb5a25d0c resource02779.gif +9829836295365294836bc95495546d95 resource02780.gif +170019229261e0763965dc2d104fe651 resource02781.gif +42612ab673fb60ef726078f0b1bfe4f8 resource02782.gif +fa18ff4db51c90e19ae3ae129f962973 resource02783.gif +24f995e287246a645a7ae4ffe52da53f resource02784.gif +479c686d15c85d08714d9c2f9954ea12 resource02785.gif +6166ab7a3a72e095bccc3f57587a6457 resource02786.gif +58184570cd84be754322c65070ec8549 resource02787.gif +3c15dfc1c99c96f1681763777933d2de resource02788.gif +34ee65177848a582004319a56aec0c82 resource02789.gif +92ca5ac46265f4d1a7221c5db8e771b1 resource02790.gif +92efc44d8a150478204bd08874e31fe6 resource02791.gif +2867f00f6e71eb6378d352766a2bef0e resource02792.gif +9858805f80549d3fad25efd8212d1825 resource02793.gif +aabd1c702eb4597d5e8e3e69fdfe68b5 resource02794.gif +49f7200278bf28f7aff8cbdbb1a01f7f resource02795.gif +d4c2a48373d76a61de9a43a4ad850291 resource02796.gif +74df3369e7088be49a92b769eb176960 resource02797.gif +8149951f1ad1304381cd6c954c006a4e resource02798.gif +6df38d65f5a17766dab7a6a29b3095f3 resource02799.gif +5b673e0863632d10784421a40963748b resource02800.gif +f095bc64a2f95d060d5f22bbcfc8c949 resource02801.gif +0d5e00160baaac468777cc6ea1c2b5cd resource02802.gif +fa21cc529700ebee43d2ee3ae82820fc resource02803.gif +0d5dfbe9f7b00fde36413df7d62e2fca resource02804.gif +53802f376455f950fa27a587c28e0a18 resource02805.gif +4789a2903c161c83e8ce8522d476771c resource02806.gif +4d2a7d3da6f55b5f3ac4007c21945102 resource02807.gif +ba52435e55d436238ef7f6651094a523 resource02808.gif +41513143835525df9b853a3e115192e0 resource02809.gif +c0d60262fb99b88eda397f57628699a1 resource02810.gif +826e88c8dc2bc57e9f555a20cdb94eac resource02811.gif +c0941b9b3dcc6719c30e630043afdf98 resource02812.gif +53d2594bd8c13315c45d92eb3f9e8d13 resource02813.gif +968447ae222fb02c6617ec3f1d7c458e resource02814.gif +0e318fa435736b8dd2f3bf6017f87234 resource02815.gif +93a9ccc7656a337eb00dfedf1a05fd2d resource02816.gif +be1776af21f2ba246ad301297b42a62c resource02817.gif +9587c383fc2fdc55026c022187d18fbe resource02818.gif +de534ef357e8639c2a7fcb9c80c3ec02 resource02819.gif +cce8a6a7b419886c9cc53a9de6f14860 resource02820.gif +38cc6e2d6e2287496cfd40dbb4802b54 resource02821.gif +a45f6bd342d82b1a75eabb2dbd86475b resource02822.gif +ca5073d09fad4f81800d751ed204de3c resource02823.gif +250158a543b5611709154c979991c151 resource02824.gif +6b83c17efd4b5e0e4b98d1fc8c9043be resource02825.gif +970f91836bdd2502a8443c07b9b25599 resource02826.gif +59386f7316bdfb568c6765dc6a0e323c resource02827.gif +25d8da2eff4b489a5c24ddb8bf5989c0 resource02828.gif +8db36f9a2cf9f080b335b7f9fc14db72 resource02829.gif +c8c9ae751f4ea1ec9e27ad13c764c149 resource02830.gif +25c9a35258da0bff843ef18ddcd23b08 resource02831.gif +9f13fdceb53ed623c3e79efcafe44245 resource02832.gif +fba9fb97a88d9105380c057bfcdb9c19 resource02833.gif +f3dd275b8b640abfa6eb4202168048c5 resource02834.gif +e46b4e7e9dd1c2714f83a4355f53b00c resource02835.gif +f8a48750914cd0de090d74bc68f8c8c7 resource02836.gif +dba5d6c0ee688ee46bc284812e8a5425 resource02837.gif +09e5386ce7c4e14e69efe7c91cb1359f resource02838.gif +7553d020c2bacd4d61590d53315751be resource02839.gif +c8a43416b38066c6a887c1610302d0b8 resource02840.gif +57a4c12fe856d22deba4c69752f847d9 resource02841.gif +f0623a7dfbf71499775f4905057ac221 resource02842.gif +81ed2be63920a22aff8fbc635776182b resource02843.gif +85d2689f1b40c70da9e3698902bacd43 resource02844.gif +f00173e0ea76ecbc595f06f7e455a643 resource02845.gif +b9636631f0de2edeba22ba03a7a7d8c3 resource02846.gif +542f8daf38f42a3d96417153338f4bcb resource02847.gif +f5071715de306c493ee9d42d65409dd6 resource02848.gif +5a41d82d4c4baa4c8fe881bdbc8df405 resource02849.gif +abfc0c514f66332f7405774792e2073d resource02850.gif +229e770bc8bea96e584a73cdcb6ddcf4 resource02851.gif +550e4979b9bc8439239fe1d545290429 resource02852.gif +ca0671bb775cb947ba2980bb895dfb96 resource02853.gif +9172a800fc2a3e82aa29556241b050e5 resource02854.gif +45735d47c9f6e9bc16885115ee24defb resource02855.gif +93b4a9ed048364158b03ad67f54f3e31 resource02856.gif +a668a5d376ab0ccb06910623b3424ce8 resource02857.gif +3ef90cd5dea9d05c33b1315aa07060e7 resource02858.gif +62b41d338a7dd743445a1ebbcc6a9217 resource02859.gif +3fbcfe8e40578ccfdb2eb91ebf4f1bf7 resource02860.gif +bb574ad428d8dcd1082756c4f639a50d resource02861.gif +816279f3012dacb066729889f53aa73b resource02862.gif +e45b262c981aad8010b6cfe23ee64104 resource02863.gif +24ccf75e710864a186356a7dc0aa3262 resource02864.gif +42441e119b36c3b8a4c81f3835117541 resource02865.gif +327321093aed390c19daddc22fbf81a2 resource02866.gif +b1ecc9e442f01eeb2de00a45fdc1814c resource02867.gif +327b250a66af5f9f06cd6a468fd24f96 resource02868.gif +86d006fe97ad0fbbb82b5d6352a223e1 resource02869.gif +95cdc3d0dc170c44c0ff3f4579defaea resource02870.gif +09d7548db73fbb6ff4ef9155aa266a6d resource02871.gif +14e1d0bd0c5afa4a1ad47238ef261fc6 resource02872.gif +c6a50342d41d5931b0f9fa3d86a9261f resource02873.gif +81d80163a54db02a08a9dfe5117629d2 resource02874.gif +30dc945dcbd236a0641f32b7d9649fdf resource02875.gif +2300d70369beca238e0076fb7428a061 resource02876.gif +cc6f2eb1c50c3595df96adda84a8be8e resource02877.gif +173d80b02d6119c3994d27157e0fa199 resource02878.gif +3d7822a2f7398e272feb06f5494f3504 resource02879.gif +025417a9cee59818f7b53e21de4fa1d4 resource02880.gif +31e40ea75f90bedc40ea975bad8cb117 resource02881.gif +970ffa93e237fe724cad47b084a78e7f resource02882.gif +dde017b8daaf00615802856622ea230b resource02883.gif +bd1035d761ae4e03b9e9d12330ef57a1 resource02884.gif +fee58023195b65a7d2cc4fc404cd50d5 resource02885.gif +7639b0426c8a995a42e058621c4302fe resource02886.gif +5aeb8bb62059c9e00026dc49f80ea16c resource02887.gif +98f42abafa70ed3b7b2c7242c2ce938f resource02888.gif +ed3b743fd6bd8137e53b231b4bfd4368 resource02889.gif +c8245866e3bf0ee13a54cda7c8aee1a2 resource02890.gif +de47d462b30d139cc975ad68d186ab39 resource02891.gif +d7cdc4794793acbc92816e9429d3db3d resource02892.gif +9dbce52e4c05efd20f95d557187f53cb resource02893.gif +c32720f39640b74c7244ea6f6fe22029 resource02894.gif +786904e4635f48594996213ea3055f97 resource02895.gif +1ddf9b6608434abf321dde24005640a3 resource02896.gif +94c5535be6e5b950fc9faf3f34a9d504 resource02897.gif +4e5600b44fc304a686472d6a48966563 resource02898.gif +1162a8e1c6d53e8910581c2ecc8d8846 resource02899.gif +3850c39614e6923419541f98712a940a resource02900.gif +fd91c1d5667ea3ce3bf526d3e0efeaa5 resource02901.gif +8e1d4e643e5082183cdd5ea926b7ab04 resource02902.gif +ba24e381feaa907a803ffc25828bb50d resource02903.gif +d076b28627a9465c1dcd0aedc59d46e5 resource02904.gif +718509eeaedaafa3aa8989dae3b33449 resource02905.gif +cb28cabc59328be7aa4c4032fdbbfa51 resource02906.gif +2cb56b9f22ff1a08f2cf12f662e73636 resource02907.gif +e52aa37436cdd7941d89188cb008c119 resource02908.gif +d94ae4a0cee7c441c28bec1910621fa3 resource02909.gif +c2c3d75efa3ac12de337f21b733859d0 resource02910.gif +133d9f9a2448fbd6c5a84c3f877d4ccb resource02911.gif +e9ebf87bb1501962f0c0d381b09c1b78 resource02912.gif +4a87c310b0577b865b2fdfd7c708f1ab resource02913.gif +ace1182ac97638aa7a2815b2f83ecaae resource02914.gif +0bf179ae76ebbbb3173307ec2e1a3ccf resource02915.gif +e2a85412c610217fc6b3a2a6710d8c6b resource02916.gif +82b988f6818a5e6fcd83f764e5b98b4e resource02917.gif +2c956216e281cf8b949d1607ffed8e24 resource02918.gif +d0fb78deb0ed003e4275e16921e22669 resource02919.gif +0a307234be536973b1ddaa124bf287f6 resource02920.gif +c3ca5051fc25c05a2bbd15c880324721 resource02921.gif +8439a42a29a06a0a1eaf1091a4b1cc12 resource02922.gif +2b8654b38d5f91f42de6e0c0244bbeb9 resource02923.gif +2bf115d190ce1d8ae72a94e3242605dd resource02924.gif +204e1ea742933b3e2a569533923516af resource02925.gif +ab96645f3f9cf236540fc27ad5d114cb resource02926.gif +3787b63e59f369b62ccd6498c2ce5266 resource02927.gif +4bc021deb4799e06b2c118aadc07ff39 resource02928.gif +edf476a35a89e5fa70776ff7218b578d resource02929.gif +c1e02f4cae4da17634966888b4c57e12 resource02930.gif +39ac5ea1e383002f469e1191decb2102 resource02931.gif +d0ff1761426f79342dd4e08c6fcab091 resource02932.gif +0fa2406573194450e60d21fbc2843cfc resource02933.gif +d614e50ec6ba3c1c0179f337ee015611 resource02934.gif +8bbe5354c94d9050ac829a6db5b96e0c resource02935.gif +4470267dbea163cb5dc9eba6e95590af resource02936.gif +a06ebe35d43f57fc277211716178cf4b resource02937.gif +4b0013695b076ba47acdfa297b609a07 resource02938.gif +5e24480b814cd80d02dd065c84fde6e5 resource02939.gif +909fbbcd6ade418e665f45ba3b44c0da resource02940.gif +b0f1fd063c4d0734c11d966ed9245e6d resource02941.gif +515d708039b6e69f55c513c53a4a5573 resource02942.gif +498f65b55b319659ce4d648e120deea7 resource02943.gif +86792ba7cb52e674db84de1d47da352e resource02944.gif +79d1f40459f53f7c2d4f06e0ae691eb2 resource02945.gif +b8e98b3f20aa09042bbde085c845a8e6 resource02946.gif +c07cd878d4ed187a6f51a4f56ed1b921 resource02947.gif +aa7a590d88d67e75798934bc91c4df48 resource02948.gif +98f70984421dc8ed99126a2015f664f9 resource02949.gif +ba548638e9ee8ad5a521487d833309be resource02950.gif +f18280e577772f74964e3c4e10fc6c90 resource02951.gif +7432240e5f8e817bde4446b832ade301 resource02952.gif +235111234e8bdd191d142c87fc12addd resource02953.gif +1025a6cc370b3d8bad2051b499b0c295 resource02954.gif +b3f056fc21f445ca333a3b2625c49ec3 resource02955.gif +842ff38b818c517bc7043847412cdf5c resource02956.gif +e7fba9affe603a3ad06227e3c641d6da resource02957.gif +e1700c04db6499424e8e66102d39c167 resource02958.gif +7e93f7ef856a3528e1ee210c755bcf8a resource02959.gif +3c15605ab8b4fa910ad2f229ca7bce7a resource02960.gif +9d5b5763ec66da9573abdcdb29efb006 resource02961.gif +9c44ba1f344cbf8b32c746e73fd12fc9 resource02962.gif +01f3f60ee969967fb2180e848ef72430 resource02963.gif +0d8c50a3929e9c9997afc764014492b5 resource02964.gif +00b942183155a9659559f44d94cfa888 resource02965.gif +45f7d490626270eb8de41498ad7a7005 resource02966.gif +acbc113882674e033883b4598ded9780 resource02967.gif +1db78956a0656c42182c5fa2c369141a resource02968.gif +55e93ddd8a8dd73ead270648b124c477 resource02969.gif +cc0250f58f589b0a2bfb122b4ed95ea1 resource02970.gif +21815a858d9ad7698319285e83e0a02f resource02971.gif +8a6c8c1c47e2bcf831f66db0a02a9896 resource02972.gif +2986b507fff0d71f01274aeff7ee2719 resource02973.gif +b633f3af360dd98b233277c61696bd3f resource02974.gif +260eb1a0e1c4dc41d62acaadeadce027 resource02975.gif +b7cb7e51269a71b171be1410809ae3c1 resource02976.gif +c193a7f300ad0ff50f950b2642a276b0 resource02977.gif +8f4812631b009aacc7472aa1b7400cae resource02978.gif +954908a853122f5940d33e045e97a00c resource02979.gif +0e52859cb6f5b5483bd26623d59e0b78 resource02980.gif +3aaf268bd4e97183b1397589a53a2d47 resource02981.gif +83afb8d2e631e8531c1997d8367fa5a3 resource02982.gif +c7243ae036389be8073e47a50e28ff44 resource02983.gif +3c98c27ff80c342964c3034b9f261eb8 resource02984.gif +bf3ca572128a82878ed514e03358be73 resource02985.gif +910d70827fa919fecd03e2604a5d3f62 resource02986.gif +e38e10632a02f585736755d10b10871c resource02987.gif +9e038bcf6d9a0e4c745c17fe68a91cad resource02988.gif +09efde2bc712a4c411c8478e8c841417 resource02989.gif +e8758b1f3829a7c220804649be963f58 resource02990.gif +f27fc34d2e78a099706a1390892bee81 resource02991.gif +08faeeff76e44e9e4604d6559b7f0fc9 resource02992.gif +b7cb16a6e47593500cac477afa2a1664 resource02993.gif +99a8f59481c90a9c93c75aaa98796ac5 resource02994.gif +63996afdd97b4289e062d0e5a28defdd resource02995.gif +af0a7fe3202329abd81b77278efdfb2f resource02996.gif +67055c6de6575710a7cc72dc5a21b226 resource02997.gif +3c5df8aa5539ea6dceb20be3afba78a0 resource02998.gif +a1b38913b5632b0c5f506328f16eb195 resource02999.gif +7f87f9be788d491892ea70d2f6ede4df resource03000.gif +93fc69d9ca4975bcc080f6f4ab3103ae resource03001.gif +a1226ecc58d2f4e0f3539a40c0e935ba resource03002.gif +0e1bf8dabd5bd137aeed8b7323be3365 resource03003.gif +879d32d45839ccf6ac54bfd8b9732e8c resource03004.gif +63e6beb65cd33df15c5c450a94f33653 resource03005.gif +b3596acd75b5879de250c46b569f3a47 resource03006.gif +4152da7763df951a7d812f8600217b2a resource03007.gif +2c8f0f087c67720c37391548eecefde4 resource03008.gif +9e4e16fd69eabb75aa051a60d376bd6f resource03009.gif +df1e8dcbb0146fe0b9d3fa0bbc9fa153 resource03010.gif +fa0ef3096adeff93dcc33361dd75febe resource03011.gif +228b95b21871fc537850268bfe8d5fc5 resource03012.gif +a50f1fcf1e64d7d7b19c0718d62f29a9 resource03013.gif +ad1e2610fd168fc4906ec490151c69f9 resource03014.gif +ec5ec6909371e82ecd8d92a518179747 resource03015.gif +89c97d2a38775c43a21cd870bd74ed5d resource03016.gif +053837426378817bbbe35f8b4b7add8f resource03017.gif +de8aeb8f1810283cf9bae939914fc015 resource03018.gif +a999aaf691f27aff08edc67c1c20e082 resource03019.gif +67d9ee4fdff04bfd2eef2df3c8a9ef1e resource03020.gif +fb57afe48cf36d64798b16e56a6786cc resource03021.gif +09a604648aff9c881f7320b5b3b3d0e0 resource03022.gif +d7b758c07f926aa8839637fed5e507df resource03023.gif +78381ce515ac52958d6ff78c5cbcedb2 resource03024.gif +9560845ea5940b0e0d12693251801c74 resource03025.gif +536d94f9325a6eca63cdcf53b367e895 resource03026.gif +8cf719379de4ad139d19a41ae7e2be03 resource03027.gif +2e8943281886803a378cbd826ec447cc resource03028.gif +ec2ac47352065ff9324d5ebb52b0a57d resource03029.gif +7082dca5f8ca5841998c3955e9aba294 resource03030.gif +1a76cfd14ded52140eb9a8991cf43276 resource03031.gif +c540e3bcd0804b5260a26e4be3ea0f81 resource03032.gif +bb58379997de0de4baf673de8db90d19 resource03033.gif +a93c475a551e4c786c56c793cb78c580 resource03034.gif +117b2df397cc6b83b9170c1d0b1a96c7 resource03035.gif +57ea75ead0dd49f93f2b97674e99462c resource03036.gif +8a33ea515d7a09d2c971199b5b0d4430 resource03037.gif +7fa28a84a2e975a1e219f63bce671858 resource03038.gif +081ee9eb3aef0b18c98c9e858b1d33c7 resource03039.gif +50a03bb6f32b8d22d0d909cf2386f475 resource03040.gif +7c0819e2d27a79ea3d424a0dcf59193b resource03041.gif +2d388e3858c4c3dc73cd1c92a69bf083 resource03042.gif +77b9e33d77b6716114e463456f35a5b0 resource03043.gif +257f1237dc37dca91cd09f3929367b87 resource03044.gif +a76e70f11bb54b4ea410114bcd2a5620 resource03045.gif +61584ce9aca2a3fcad3758dfe1933421 resource03046.gif +dc6ef162912fe65fa994e3f16435e9e2 resource03047.gif +67d8c4c0a057e42bb4d78a4ffda911ed resource03048.gif +040c262e3c2925512489c424131a82aa resource03049.gif +020c0174378133eb3611c7c2615f1663 resource03050.gif +cc2a4c740ba748c8d0f5a8c68319db97 resource03051.gif +acc9bffddf795ce94d81b55f1c6efdcb resource03052.gif +ffa85ebf7a8701bc90e7d5c7aa3036d2 resource03053.gif +05ad5a06d5d568dc5233256a87ae3753 resource03054.gif +b73e6fe3050bd6e1cb2ac2f16aa46eae resource03055.gif +e2583c28db2136df2dce4b350b733e6d resource03056.gif +7e4886909de0f613f82c94bcaf0521dc resource03057.gif +5432a0cc8dd63d0d1fba0c43dec6493b resource03058.gif +6cd5ab5acae147eb75ea1474cbe69ba5 resource03059.gif +91342ccc528839703949495d40b32887 resource03060.gif +7bfdac980ee2f4e7e7a89f8e818e62c7 resource03061.gif +00e619f8cf79d175c818e58f0b10f5c6 resource03062.gif +251a26118c8e2bce926ad8b38bb68f49 resource03063.gif +5b13204069f9238c6835e66a28acd4b7 resource03064.gif +1548c281aae5f147d902c6ab26a660b7 resource03065.gif +0928ae0a45b408fc1d27d401beadae92 resource03066.gif +2c86a066d62f4111a0869f2c67a48720 resource03067.gif +8c49d8ccfd026b070bedfd1edef7b349 resource03068.gif +45cd55c9e4b02d059fed9dccc5c138f4 resource03069.gif +2e8a80d68ede6403f852e70b889e754d resource03070.gif +0e8d1b6ee8f825365fade95b5ca4c47b resource03071.gif +0511678e277687efad7cae22f4ba070e resource03072.gif +7b743c780bcc9d679b5ac4401f7778c6 resource03073.gif +4aed9f3858a239f05bada4a383818b6b resource03074.gif +e725dccaec279f050d342616f0b5b5f3 resource03075.gif +d27a7afd5aacd2c52534ae7bdcbf7255 resource03076.gif +fe6368e413db248d3dd80f227a33d42f resource03077.gif +17b2511119acbac87e79ff6339cc77f9 resource03078.gif +12661d58315273920b1b28c5ddcb9002 resource03079.gif +47bf9c0f1f180ae5e3f7d46407103fcb resource03080.gif +d1a99bc34d009217988f889aa215e1f0 resource03081.gif +0ad7ba691b067fe44e6c824afe07f55d resource03082.gif +f6dbcd63da799ae1c2ca057fcb09dc4d resource03083.gif +e03ede80aef67aaeacbe8c955cc2e13b resource03084.gif +a3d639a65f2c92ce4bdef18ee1804d2c resource03085.gif +2dde24a7216f3c9370c5116391da8f63 resource03086.gif +331eaf668ae1d837b8df3e28300083e0 resource03087.gif +556d841044d60e8b580aa9eaeb39ed9b resource03088.gif +b8bf3a48729e108c1a1d8c96a2828cad resource03089.gif +9b9e1ea02a3454c30d678ad978e6e13f resource03090.gif +54c4a1592179894eb7772134be99cc6c resource03091.gif +8473f21a2c2104244f575b14aafa6f47 resource03092.gif +74e1f68253a1f78b3ef6c043a62f5569 resource03093.gif +16023c0f8f2d8908abecea168f58cc2a resource03094.gif +0d9fd1edc17b19013ad983b2f2e8b974 resource03095.gif +03afac8bd9ba90588cd4dc949dff2a9c resource03096.gif +c60116f7261ab6ff1a3832e3cf25d36a resource03097.gif +b76a820805354cba0f86e0d6f0b9f580 resource03098.gif +12edd9f59d33121c23c94baa971c337a resource03099.gif +fecde7b086532bc622a5adf979c8bec6 resource03100.gif +a06bd7625a046b09924f48c8e38fe6cf resource03101.gif +c5b58af20f348c17d1f299923504ad39 resource03102.gif +02ee8084158ee3c21b8b0ae29003fa48 resource03103.gif +d5589f06ef6bc1277a6f1a12dcd1b24f resource03104.gif +b7afd7e7768af3fbf710af919f02e79d resource03105.gif +164933056ed6bd51e9a2db036379f8ee resource03106.gif +8237e77b07d9ce665951db7954241b1d resource03107.gif +9a7e5bbec0a2d6d7c733184bc4ebd877 resource03108.gif +441009aecc8b6fabd53d88bb71083974 resource03109.gif +4bdeb22838c4d38dcb8c0b374e01b90a resource03110.gif +a1beab6b44e36a160fd70bb4240ee287 resource03111.gif +52f5427fe31120576a03ed17650fec16 resource03112.gif +40ecc7d9535a1387f48982ff0da6ecc9 resource03113.gif +a76e855122d67ff9691eb3b0d7f7672f resource03114.gif +8cd05c8d67fdfeed216db368e8807103 resource03115.gif +097957ff4484b49426c10f51836182df resource03116.gif +e6ef49a26090a8edae3f3b9d19d08214 resource03117.gif +06f0b6493714add2daf4ee6fda3a2822 resource03118.gif +fe3d0f9f76e65f1fc43f931d58ba37eb resource03119.gif +7e31b7c181beb782b89f9bd1560f4e94 resource03120.gif +4141f7975232f7cfe65f2fcd1a68a49c resource03121.gif +968013d23ffce2e6bd6a4b3faa53213e resource03122.gif +123e8bc8707746309c07d190a739b5a5 resource03123.gif +cca97072764651c0ba52104f297b5955 resource03124.gif +1007d5601713144486225a2d15716d87 resource03125.gif +4ab20d945dc878b53e947de857b10a12 resource03126.gif +bdf56bc8df0ae89fcfb49d090f1eb27e resource03127.gif +203fa6c27d5e52b9a7f60bc1237a1e60 resource03128.gif +7900acfeaf4cee4e8d8aec6136bc68f9 resource03129.gif +0b5db1e4796bebd304f89c74f29cdc47 resource03130.gif +33dac04436d5f4eb168b84664f1e3588 resource03131.gif +2f624bd875180d7798207977dbfe2ef1 resource03132.gif +3fcea0e56db4d283ca888ad0f7408495 resource03133.gif +1d832f39211e329b43e771cee613c89e resource03134.gif +e5c90aa8f2b56c224a53945b85ba7835 resource03135.gif +aba7091429ebe39074ceb2e00ec91838 resource03136.gif +60c6174f89912b676fc35f055b4c6b97 resource03137.gif +1d30d9edf265983d1d596d185cdc7fc8 resource03138.gif +73d298bafc556f0aa9d7a13dba032020 resource03139.gif +d5b4f6a987e26f3d35b1f07bd4817df9 resource03140.gif +284967c931399b2c10f47c7cc4146b70 resource03141.gif +9829099b87b961d1cc4a238e388e9cb2 resource03142.gif +4a877589c451d0f09817eb2d30b2c01f resource03143.gif +9445d82e37e4b7b33e3fb35454884bf6 resource03144.gif +0503f910c626a8194b1f5c7d97a80410 resource03145.gif +7e90d6b391640b4e5d2d7c05d6baaa9a resource03146.gif +58b587f4a60770ca597722758f4505d7 resource03147.gif +af626ff7749a0ef39f337dd87c9ed55a resource03148.gif +ffcb326c9cc47374e32d1a18f4099469 resource03149.gif +501d0ee4707bcf662ca1c707304ddae0 resource03150.gif +addd7d7d3851bca7fabca74cb8cbf118 resource03151.gif +f23edef9915f0aa7cb70175752724fda resource03152.gif +f6daea587039412653c2c47c7f0426b0 resource03153.gif +ee199e5bb151d71c3c292af4faa69c59 resource03154.gif +b0c1afdbfff1f5e23fc1fccd7bcc5425 resource03155.gif +a6b5e085f0ad5712aebe595eca109b74 resource03156.gif +9dd640a4ddc7cf9efa1efe463a6ddb1c resource03157.gif +31e9fdd602ff255c2352cc2704cf8ac9 resource03158.gif +43c3c2e524d3d2d60b05bcea2c9a5ed8 resource03159.gif +53eb2d48b124e6a420fecc0d889be092 resource03160.gif +6b11441b9cc49f8e04826a21a2223b54 resource03161.gif +ddd4247b5274711b36a96215b1258747 resource03162.gif +168172611165a2a4f3af90a40f474600 resource03163.gif +3f2117fa2deced6937662a5abd48cb94 resource03164.gif +314397b2086e796bbcd44bd1060c6971 resource03165.gif +10a000c3afcd5b2436a44f8fe3a9be7b resource03166.gif +4b79ed8723d2da30208474a53860c460 resource03167.gif +8efda6ff0ecaabdb41627e60bc3a6362 resource03168.gif +6428bfbf21f2d87fc706e6097e8dafb6 resource03169.gif +9f14fd18833a94b22c83d76627480669 resource03170.gif +698992d12733f8ae05862ce43a9f00e3 resource03171.gif +d996e083213baf80261b74303040c89c resource03172.gif +19edb99eb18005460d449bbb03f9ae2b resource03173.gif +eabef38f2192d9cf1b119efd716284b3 resource03174.gif +266f93150fb00f735d7415109adaa094 resource03175.gif +e3b15be0db61adb2679db9ba30db13fd resource03176.gif +b589d471075012e0c9889ac6b40a6c07 resource03177.gif +1f540e9640846134a01026171027b793 resource03178.gif +a2e2081c04fd2d5d11e7b508da48782e resource03179.gif +dfc34a13a5445b4cdeabef833f3cacaf resource03180.gif +d00a31c764018a9e0e404fe132f39ec1 resource03181.gif +5877c24490a5b80242cbc4d845fb8c82 resource03182.gif +e17263e205440ff804166b981b2933b8 resource03183.gif +2fb33f5891f8279a61231c0af04d302e resource03184.gif +ab37b0e3563afd49946674525bb51847 resource03185.gif +eb79772df3510d3a0a97c8cc0a2b0f08 resource03186.gif +b772ef30f73aec8a030245ce9ce44093 resource03187.gif +203a9ee6455aeaad4392a6b376bd1fd4 resource03188.gif +ce79d429fd072a10b961781a681f9c94 resource03189.gif +b5d4f04d2820f4e632430b0804c79c1e resource03190.gif +b4031a7063d350ed235b59c13326ef9c resource03191.gif +012c3d0840b997967ed3f84a88b82634 resource03192.gif +a322a49fce2a399c22467ca9a0a6a3c5 resource03193.gif +deb0139df482b9a306e5274ab55a029c resource03194.gif +19867acef4a6b2f0f63b3c68399f1c83 resource03195.gif +94951a632e3161a8b5175947f2982ed5 resource03196.gif +ab0368bbc8d1e37795588b7e4021d1ff resource03197.gif +1ed0a3a794bd4336bd53f588d8bedea5 resource03198.gif +b1cf53bc0c5b30f643b5be8dd73c7d9c resource03199.gif +c11049e029ef3eb7a55137ec2ee15683 resource03200.gif +e4045f75179d2f75136838e7c14b661b resource03201.gif +25e3ea855754f1dfe70696bb5e2b0529 resource03202.gif +4e8ed9a3f7c7e058a3b282d75d690335 resource03203.gif +ed45144d65f30da167becb0dfdcc5800 resource03204.gif +4161b78c419d1c42d52be172c5cdd0fc resource03205.gif +4f018d2abbc24e9548d73e3f64a3940a resource03206.gif +4817436437f75a4ed020a05767f392b1 resource03207.gif +e115a4c61f52c3bbcd28e4d3b0da0437 resource03208.gif +1bc52431f4bf0f68f7d682663aebe6ff resource03209.gif +39289baa7562c11a39e83ff21988490e resource03210.gif +598d4c1d24907c0f71415d6bf49dd5ba resource03211.gif +37b4306cf399bb1a9c6095e9287537ef resource03212.gif +ac6d06af6218a08383fdda172168a67c resource03213.gif +154d5a8e11b7dfdeaf8d9dd93e5066fe resource03214.gif +593e9daee36d10e29d6e21c87e1f9b5c resource03215.gif +02ab2c97c732bcd446611f691075df63 resource03216.gif +18b20cfdebd8fae186d4475be4906d00 resource03217.gif +01fb912e322cab5e34ecca279213443f resource03218.gif +1aa94b65e1a28f9daf168d8fad634785 resource03219.gif +28a71946fc583a598b46c83276262792 resource03220.gif +211429ffa8f162aee9f3850286e84461 resource03221.gif +67279dfee435f0fac3bd13a29e17794a resource03222.gif +6e5af04a9d2770092b4d9dd7acd1944e resource03223.gif +e95f976a09c8a4b9e776347e27637d6f resource03224.gif +e9f9ffe33c37c43a2bac678e955050da resource03225.gif +1170be4ec4eec4c61e02e1895a926b85 resource03226.gif +515be3b0a63a43dbc532242d3364524e resource03227.gif +fef3b3e44387328309be03efe6af7ba5 resource03228.gif +e8d7ee9f50413625f7e14a7a42d13d6d resource03229.gif +cd7b9fabd00cd5276bf455d9c1346d63 resource03230.gif +20eb3409fb217d21b2857d056e733f9b resource03231.gif +c9e0e7d1133d711baff54db723c4a15b resource03232.gif +3554345d0b346ff56aeafa50e6a72784 resource03233.gif +7a6f1550e9f7a24fba107d610a43efbc resource03234.gif +1a6b4ad5088271567aa6e3799bb85156 resource03235.gif +33a087240c614bcdd4d52431f75b4899 resource03236.gif +0f3ec707232810a3eed57d6a70ef8411 resource03237.gif +f67005c19e40e176bc8fe967b2d7c5a2 resource03238.gif +abb4d6bd9bab59ab59d717b21688c60c resource03239.gif +f161228936930ef70628f977c7905439 resource03240.gif +7186dd68f7d86ef4c9fc9a6364449a83 resource03241.gif +e8ada648de3a2dd95db1e5114b015953 resource03242.gif +8be894b335f3ba9a54c679a606cf6a68 resource03243.gif +3c64ebc6b69fb862e2e7acfa3fcc3631 resource03244.gif +337bb9dda6a5901e85bbf1df87b628b6 resource03245.gif +88f68360e3be5cabc6936283b86345ea resource03246.gif +8a556de5d93c6402ee3a7c398c4e6498 resource03247.gif +beb6fcd16b4df8935436b1577013f632 resource03248.gif +7dd7bc6c5136910939b57096e512acf2 resource03249.gif +4549a6006a7856e2e01728bc0302d68a resource03250.gif +e3d3bec131d4acce7da14519fbc43c35 resource03251.gif +38feb39a3dc40ca735e259fabdef9834 resource03252.gif +22165b4777a496945121361fbf2ce0da resource03253.gif +deafc3bc4249ab58bae82f040d8ef5ab resource03254.gif +bdf1f05bee9cf1035c5e69b0484f973c resource03255.gif +3f9070a05b5f1ee56ccd673f35d5d5d3 resource03256.gif +7a2897f61c1f5de140a57d156ab8084b resource03257.gif +ff0b52bc1d6293f744ca7f9646df9e43 resource03258.gif +bcfc7b5b25fa82f2946a43531a1e3452 resource03259.gif +934397b1682881d3a42b774adb433793 resource03260.gif +7b2bbf3f3f4c181e48ea99157d31a39d resource03261.gif +1f32204bd03849f534d310cc30d4b9f8 resource03262.gif +93e9c3974210e7f6e1edb0b30b54c4a0 resource03263.gif +0b2d70975a2bc0c5fb73c95a52b5328a resource03264.gif +a0df97991cef4a3796606b93f5e19079 resource03265.gif +9337f34be8d77dc4c987241e579ab061 resource03266.gif +5a6a5a15ae51125c2e7711924db54352 resource03267.gif +3d392a82e39507cb013b1f4abcba594c resource03268.gif +27bf0f699f6f6eb2972a9a1e8578a458 resource03269.gif +3587321749164df76cb861073b942181 resource03270.gif +4c2011b3894ec2818fccd62af6d7d4f4 resource03271.gif +56ad1db216bc3012de01cd1de9410ad1 resource03272.gif +9c382dabb0e02073329b276970af233c resource03273.gif +9c604038b385b82418a2eb11de98d860 resource03274.gif +b0879b675f74007021d28205c399db44 resource03275.gif +c0904ed8b7fb570b97468b688d0b65c3 resource03276.gif +34faf0e44160e2c2c207669f9a1c69a4 resource03277.gif +09e818c6b6fd9f1c0e04a2ddd2df3ec1 resource03278.gif +749c385d991774cbb316d5f14e6a897c resource03279.gif +2e6d86b7c0cecdc572fdf71526640801 resource03280.gif +9a6e0f02c1d815831778b8b7d2c9fe22 resource03281.gif +58b2406fa4a564fa219b72c2dc880f58 resource03282.gif +c0ed8b1a470e5135ef4664c2ccd3fea6 resource03283.gif +96ce3eb8d2336e175e5e3fcceb4515f1 resource03284.gif +76cfe7707b53e9908add0412e42fc41c resource03285.gif +d94c5eb68eb804fb67a28c8d805cc363 resource03286.gif +ce3846933cfb2a18f4dba291265e9694 resource03287.gif +f4cae2cf94577d0cac43de6eb611b7e2 resource03288.gif +86ac8850b2f48b1ed73ed1e518e5ca17 resource03289.gif +2d1ff800517bee16ab103be307d6287f resource03290.gif +ce2ce948bf60b561f8ddfbfa2e0afbf9 resource03291.gif +0bb4406b969b12c9bc7e024fa7f5cca3 resource03292.gif +2bc20ae0c97cea92ce091d8fe685fd28 resource03293.gif +d1f2b0a42546c3e56d79fe8a9f7d92f0 resource03294.gif +64d05bff4701a7f1b31b2e59d70a5229 resource03295.gif +717c7fa393b741af7304e5c8194d964d resource03296.gif +623ab59d0f5da532451c2eb3ee1e216f resource03297.gif +2dec5275dd7f130993ed905e21233b6f resource03298.gif +1c45c31a84601961a0331f591b145b45 resource03299.gif +f5a5b1a759ae1b4315494bbbca0261af resource03300.gif +8a13fb348c650a9153379667f0e6b7a3 resource03301.gif +e9d9fa0530582bfb0491ffb3d15b24b0 resource03302.gif +1ffb3a55923fa2b92ea94ff7430d62d3 resource03303.gif +a0c39a698987d10b6e31be20319839de resource03304.gif +adf62d7ff22efe69d2d39c3175fe6aa1 resource03305.gif +5b33932fd7c858889bd08fa4c9ce780a resource03306.gif +aa5975f2988675986992d19d31375006 resource03307.gif +11b5e659c7fcc4a8c88308145b07c05b resource03308.gif +330b1df53578d34ae71bba58f49b2f1c resource03309.gif +0c722f7edd7ba0c09ea0cd9e5bdf55f3 resource03310.gif +7280a44e8278a7bfc36b2b712da16da6 resource03311.gif +a839f9b6c474ce0def5faa54ae933b88 resource03312.gif +9e35c5e8af5a2bdb090d704196dfa2b0 resource03313.gif +5ce8ef7b47eb3b72602814aeff98c526 resource03314.gif +55505b606ed299c289e757c762ae530e resource03315.gif +6e9df7c266dc0ed681060ffc78ceb0ee resource03316.gif +8d5ef03de56da5cd7084ae6706c483e2 resource03317.gif +e1557b0eb022de9e2bd828b734b72b34 resource03318.gif +4109a5eb730f91ea0377482c6812b6d1 resource03319.gif +f1266540f149fb64d3bc4ab8fbf0494c resource03320.gif +5a49226330d8164a9b4ea4a7837a18b4 resource03321.gif +54b00424f1e3e6b9c27dcc1cfde798fa resource03322.gif +5d46eef3b78748621c53b421ac7780f1 resource03323.gif +0a805e94e793a7a69cedd151ee52c92a resource03324.gif +3e53e8adde6d1b121aa3d3fbaea81c64 resource03325.gif +6ae1849427b9ee12287c2d191fa99e5b resource03326.gif +14675cf66f23f8c7c2643b480047a7da resource03327.gif +9527d4c8e2abf2bd99076dbacde0170a resource03328.gif +d341c5638075882f5aba19b32b906d6d resource03329.gif +9e09cd81391243506264439b037dafec resource03330.gif +77182c05cfff82a3c778511c39dde1c9 resource03331.gif +4363fd6da032dccecf8e847c34a26f5a resource03332.gif +d7d8f400d6989020d34764ac196927d8 resource03333.gif +ed42961dc07ab6aaade180270773061e resource03334.gif +bccb5e06af9eeb1a9f115fb4b5ab0142 resource03335.gif +87cc45020b14d52d82a346d744509dd5 resource03336.gif +78d5cd97a1587cfb689ccb2971879452 resource03337.gif +f69c2bbe359ba5a132e383799b8f5f2e resource03338.gif +dfe2edd677e076ecd3aa0dc59090cb73 resource03339.gif +7d40aa9b31cfc9b71ec2e6cbacdcdfce resource03340.gif +222e19376806988ef788069d7e928521 resource03341.gif +c7ff106770a121c742c6838358914c72 resource03342.gif +6434423805f419e9b5bfcc5eccc66890 resource03343.gif +b10655cdcaec5b8d9618f3f531c2a1b2 resource03344.gif +d50e099440055f09af37e52ff4a62038 resource03345.gif +07314a3ffa72bee45a94b7e2363a9324 resource03346.gif +8ec2eb4a9e7e11b6a92f10b8fbeeba9c resource03347.gif +b015298355d7d953159562382a9a5af9 resource03348.gif +2f97c41c5b298065edcdd048b1526f86 resource03349.gif +c19ee9903b0ac57fc10aaa30adaf1c75 resource03350.gif +280d312468ed803bba16528b275e65dc resource03351.gif +a22c97bb79f623cdf65d03ee2f1ffd79 resource03352.gif +54768fb74ca9a16e0354e51cf60136d1 resource03353.gif +f2d48492df7af2f8b72bf38fffd21148 resource03354.gif +fe92c8c2c59a7684b7da1766ceccf4bb resource03355.gif +1fbf9ea6f2218606aad2b455d43bc61d resource03356.gif +d3773949bfcdf5d96ab8355d29023831 resource03357.gif +d39434e00cc38b825a0068af3cb486f3 resource03358.gif +af2cc3bee085f0cc7fc667db39395d4b resource03359.gif +6b88d8d0d056662b7742c0204aeb922a resource03360.gif +61fee654c9694399141e7bfe7cb94316 resource03361.gif +68445b00dd7c4e29adfc22e9c9abb065 resource03362.gif +81bb146132661c1e7a68c7dd8ff67d3b resource03363.gif +ff7a0bde65b235c8f5ca3c166682f4be resource03364.gif +f8d32593f307d994f1def51050f634d2 resource03365.gif +e42464293319ca68857ae4b74720ad66 resource03366.gif +c1f0043ae43211a77f11034e061243e2 resource03367.gif +89c0fa283712bc5b12442b14e324a712 resource03368.gif +bd913bc335f8bee508377d6bcafc18d2 resource03369.gif +ed73da3477f233bcd601dfe2a0e3d6e8 resource03370.gif +4ff797d87e9591f8b4f827701d37d58f resource03371.gif +e8ce74747186a438dd28c84b441753b5 resource03372.gif +3585d5622c66c1c80fb05e6bdfc96305 resource03373.gif +3b2b2628d83d7407a5cc259f3e7577d0 resource03374.gif +c3598ffdf4f16b018f5957e2996fb0fb resource03375.gif +e79f4a06ce8e1557259cefce57eaa223 resource03376.gif +f1b2fb9bbbdee87b313ce8e45720fda8 resource03377.gif +4499954c77cea3f8371fd6ecab5fb8b7 resource03378.gif +e4b8066b6a94f1527c141ea01bf1aa07 resource03379.gif +ca852b8b2befe8913affd57220f45a85 resource03380.gif +16f45f1c987b67b6820edf2266516a59 resource03381.gif +4d1f9be2f6d2a752a9cba03fe8819957 resource03382.gif +bad88c8d6c756a3249ecf71048fa865f resource03383.gif +5582fab1219600ce5316ac79609cc0e1 resource03384.gif +310e52aa0bafa1cc5362b69bf36228ed resource03385.gif +13eea89aaf003e078b59d0fb3e8a2b8b resource03386.gif +06e4ccdaa97f87d1e2c625b4945986c3 resource03387.gif +df85dfe62628eb0361a8c07d30cc1569 resource03388.gif +3788c0db42efbf13e009afd057f70f85 resource03389.gif +bb9d0a27ef290dbcabb2094b6607d388 resource03390.gif +7a0dfcecd5eba428736a4f759663c97c resource03391.gif +010b574cded3d4bf2af719d06f49a181 resource03392.gif +fef334efd88fefc88bc7b7155245f43e resource03393.gif +f8dd882f7e9f58e9a1a52fe8777f8357 resource03394.gif +6163a1dd83166f03d935a6519dbb28fd resource03395.gif +7e06461218a97e91b5933ed1654946da resource03396.gif +7acb3a403ffa855272e5afc2d1fe3956 resource03397.gif +1b48591eecaa91e3cce297b10ed9ecc8 resource03398.gif +b92e90410777523cda3487373935a052 resource03399.gif +23834af5721240c746b32b6d78221a17 resource03400.gif +aeed86fe2c17d568e623fa021314a85b resource03401.gif +e18d303dfe019a3715b1a1cdf63bbc90 resource03402.gif +bc7b1c078f63c363872cfa58844143c2 resource03403.gif +33fb9b31302de7d39d571848d07d7e3f resource03404.gif +578989430824a1c89464d9e68dac7801 resource03405.gif +ca06924cc0dd7a3189f61b6c91ffcff6 resource03406.gif +d011aa479b9b0ed01daaa832f3327e3b resource03407.gif +80a6bd5ba1749f631b7711181001f5e7 resource03408.gif +d598d462281ae0029291dbc9498d9008 resource03409.gif +dd4625de44394b81fd1820d86bcbab8e resource03410.gif +4b992d3a664b24c29b144326cfac3734 resource03411.gif +6aeb43043f9210a300d2fcbd9b6e775c resource03412.gif +98b42fde3652d5c230bf8b8592c77119 resource03413.gif +73f13fd614ee5c50bcc8715e20ae1dcb resource03414.gif +b7eae0a6b47b0e315fd5a2cc43cbb6cb resource03415.gif +d4b6c95c2941f3db6eb745aa73e8522c resource03416.gif +50885b9efdc4c9cf8b2155557ba11cdf resource03417.gif +083eb78d4158fbeeb1a42fb54345db8e resource03418.gif +90a5679a568782f49423d4e68ac92725 resource03419.gif +ea15a59e63b747a1e20842109df5dff6 resource03420.gif +7d4b8cd88a74094fe72edaee7648038a resource03421.gif +3fb4df8b69de811d47018336e1149dcf resource03422.gif +8c4d0803c24b03f0aaf2bf2ee0bd2b67 resource03423.gif +2a7880f719816946fd1a407fbea8f0a8 resource03424.gif +85c3dae3483d642c4227be0376e197b4 resource03425.gif +1cc3bf8a65e65990611fc44edfb74501 resource03426.gif +bc5e3e5f6c8dc197ddf8c495bc959327 resource03427.gif +41b095744b7312bcaf8be9178481edf4 resource03428.gif +268173ad756735f5cd0270439ba99113 resource03429.gif +98fed043529973ad630168c4770cd3ea resource03430.gif +c6c31836559fc72c2317d7b0dc32627b resource03431.gif +57c02c9c4d732f3a498c4d4f55f8b9a5 resource03432.gif +b63df8d7f1c891e66ac9bd13202fd7ff resource03433.gif +016e11dd9ed73675dd5aca0c58a61ef9 resource03434.gif +42dc5c467ab6c0130023ca835578b8b1 resource03435.gif +b18b718e5d1ef2606845bd75a66782f7 resource03436.gif +4b335a3e7a85a449004ff92d541c7432 resource03437.gif +4d5b5eb0164f7773c401786367111736 resource03438.gif +e1ed32bb62588b208b5cae4f67dbd6f5 resource03439.gif +25c86a459b59770a907def0a8b05a12e resource03440.gif +2de88d9d9da39ccf12aa3472170e4480 resource03441.gif +43c58c24b99e2c428b3cb02383524c99 resource03442.gif +0cc5af8e208622ae684c6cf9c34318db resource03443.gif +31cb97eb491f3b532c6cc7eabe66dd14 resource03444.gif +3151949638a37c1708660cff00f6e164 resource03445.gif +9bd96f9742ff6d0180306e99cacdab23 resource03446.gif +6af69fa9a259b09967e6380a6609d3dd resource03447.gif +f87cd5ab9386c3bffe2aabe39aa98400 resource03448.gif +b90c2259be78ea42369557cd64b96224 resource03449.gif +7d556f34a1833c191d5e041e03894a8d resource03450.gif +7af6126f9e1cbf3ceec2340f0b6e18ae resource03451.gif +7b3edf25c85f6bd82ac070db96feb176 resource03452.gif +9f3ada8562b88a13ba72a3b608b073ba resource03453.gif +6f9b982b5ea21bebfdbfd13d386da2ec resource03454.gif +841b90c1b55cbb37462d4f289ec2ab4a resource03455.gif +9681ee49ace5522d98e3fb442f9abd5b resource03456.gif +5f0e63831258584972e872d2841624d9 resource03457.gif +d11e0d1f9333390be224a640d955f615 resource03458.gif +6ffc49d0b370353d76306e67431ece4e resource03459.gif +86c0fcda2b2f3162f1cde8824babfd1d resource03460.gif +0651ce2a216a6bd7b15e4dcd0f86a866 resource03461.gif +b5222b723cb05931bf3930ba0fb25767 resource03462.gif +d0b4eecd026b0c65ba9d0091c92be37b resource03463.gif +01bb8733c62120f006006ce9dc988c94 resource03464.gif +11359777ff1557a173e92b4bc94b1d87 resource03465.gif +a9748944002a8bff8841ab246bcc64cc resource03466.gif +ea776a930c82441e517907bd24bcd449 resource03467.gif +4fe966aa7fcc95f831e01b863c9854c9 resource03468.gif +5013c064624a7c9a34bd23e92c1ffbf5 resource03469.gif +59d023a9238f7de02c1c5cc88c1cd30a resource03470.gif +b7be65d5200b479eb68ea2b97be88fc1 resource03471.gif +dd32acb07a4cc1b33ca683b0c9cd107f resource03472.gif +d639f0d3935945334c61bcabf3eacf6f resource03473.gif +05e9d0b9fda07b555f391de028bed29a resource03474.gif +29f56d05a01408363f0813da06e069a7 resource03475.gif +485f07ccf42690d18abd6c15afd938e6 resource03476.gif +80ee559915611d593044d2a1e91a2154 resource03477.gif +b2751efa33b9e1a33ca03ea5f12ffa65 resource03478.gif +37b7a8cc879f13cc510528a7b6e11993 resource03479.gif +501a906247803f149c26ab9dcaa397a9 resource03480.gif +fbd9fc42183539733d7ded793f0fa9d2 resource03481.gif +8a5cde8af17ced21cb06ed665259a6c9 resource03482.gif +866b33a4eddaaed32d89dc297c6d8592 resource03483.gif +0d0cbd314842657946baa65f26b89988 resource03484.gif +7597868c5f3ed18e20aeb72ee3a79d60 resource03485.gif +c14e7aa6ae5e62306f73d7dc686679c3 resource03486.gif +a1774ffd713560d5423c2216434b30fe resource03487.gif +b4a84977aafd363403ddb2f76119bbe4 resource03488.gif +a159b14edf0e2328d5b2e6d01b4af7e6 resource03489.gif +ef1aa76b324dab365246bd74882fb632 resource03490.gif +f242438e633041e97dfc087afdf5b5f6 resource03491.gif +ccd7d015114ba6318972a9331db26b16 resource03492.gif +a162c14c896cf6f502244cf00e8f1a25 resource03493.gif +072cde3ae8bcb3ff83814e2a4fbc0290 resource03494.gif +f6bb5e9955cf4a25a1f755afb5b6903f resource03495.gif +ef0e9dd01efa2a4682660c107c23d2be resource03496.gif +c557e4565522609330688bad595818aa resource03497.gif +1cb76facd04c719bb62ced584f48d308 resource03498.gif +b302624e0370b18b47d619f03813d1c4 resource03499.gif +f6b1560143dee4cfec1974681e4a6a57 resource03500.gif +8627dc80a4e670fafe113fa4318cba80 resource03501.gif +6f480e7760f81d068e0a35cf211e164f resource03502.gif +bddfc099114dd5b6c1324b5468ec7093 resource03503.gif +bbac140a51a9aa531756cbb72b643b75 resource03504.gif +fb6c37c732eb2ea068f0313cbbf2ff24 resource03505.gif +1378736e6dd9b8a25096773ef9702abb resource03506.gif +9afafda29e1cd64e3cf80cf87bd6df81 resource03507.gif +765262ecbe751a657b720badd6335837 resource03508.gif +a3b9c8fb5e2ce236decee937c834aeab resource03509.gif +ac101a5400ba7b540a800b4ca2fc852a resource03510.gif +db3fb18d5bed36f39df975b1ca2bc1b8 resource03511.gif +eedd6723273cb68d5e27e1da97c8a732 resource03512.gif +7e9e07a1c27e4279b4fa835afd165f50 resource03513.gif +9d89e5a764cfe1766ec1f86bb2c1eede resource03514.gif +10b3b1256852005ed27d9a9ba44a5bfb resource03515.gif +688838cc651c6f623c678f2c5fec12f3 resource03516.gif +dfebc5c3ca5fea361e5358d471e7ee62 resource03517.gif +d7c18762d52c7c975fbef5616b2a7d5c resource03518.gif +fcba853ba680e1f51ac890592fbac343 resource03519.gif +0bf0e52fb68c16c3d0ef45e6c6887118 resource03520.gif +6d549126e173d2ba113236650348e7b1 resource03521.gif +5e88e85d89c23b75b5864ffacc059efd resource03522.gif +7f63e5604836e9cdbd95e0547e087546 resource03523.gif +6529d02f4d0e222c9845a01321181370 resource03524.gif +4764be0dea02883890f5811d77f2f5b5 resource03525.gif +9a89dac8a76ad6be6a1c3389438336b8 resource03526.gif +df5c498ebd324ce9c1727c62c8274afb resource03527.gif +8f6da473e2eda9711915e14155c906a0 resource03528.gif +57ede5a196059604ea00d90095c5b4f6 resource03529.gif +66128d2100dfaf43297d447ed53626a6 resource03530.gif +55f4a7a66c472ecfa6cfc5a08b300758 resource03531.gif +7ca9d7ed874778bb49ba48b68d1f8c64 resource03532.gif +d8a0ba3a3e903077adde83da44c23fcc resource03533.gif +6f5bcdf27af222f67e554fc658f8a1c4 resource03534.gif +6777cd8c742cc3f4c02e5fb4edc19266 resource03535.gif +684c481fe862db25c3df2da06813a556 resource03536.gif +4cd0ff878d28b639c98ea0d87e368962 resource03537.gif +44ea462043285fa5919a5f1ac5f13d43 resource03538.gif +fee522e02be0408443918490b5e9c88e resource03539.gif +4f16598b60d3ff1c525846f42c7529c7 resource03540.gif +d6bd88907f4d6aa85e3ec3833ff2987c resource03541.gif +e175fc1c94b815b1da0738853bb38512 resource03542.gif +46bc5f5121e25a44a4eeabccb73a3c30 resource03543.gif +9b7a1af6f4e3704c69caea819052bd86 resource03544.gif +73b5d0a26a53b7f78921c6645a111977 resource03545.gif +d2d358c28c4bcda19e6b584365654d2e resource03546.gif +0d4a0cc3c779cfd2906598e79bef16ee resource03547.gif +9daba2dc95df8197a9b7bccf7de439e1 resource03548.gif +f9d652ad7064c6b924e7963b7028fe56 resource03549.gif +aee06a600c38ca14304faebd3ff230a4 resource03550.gif +215bc02aacbc88dd07695822f4e3de44 resource03551.gif +d8d71e2c4206c4c5b3ec529ee8846f20 resource03552.gif +d2cd1bdf97430bcedece04f0db9d1ca5 resource03553.gif +96eee2648e914e1a51bfe0d5b52cc822 resource03554.gif +c872da588111a8d450b755ef0f2e8bb2 resource03555.gif +59377b7c5138d845f735d56f1e83ea15 resource03556.gif +9a41406a4a62e0b1750a588b1a0bc320 resource03557.gif +0fb72ba1c1b80856a6b5715a81846a65 resource03558.gif +7ca750dc42cd34708e4d3f09c7d94ab8 resource03559.gif +fa5bcce8ef21ecfd149083b10707f3df resource03560.gif +a4604f99acfe126b78f0ee87949c3cbb resource03561.gif +eeff532214108273b27062aa66f4679f resource03562.gif +38d310bbaebaa5cbb8f205d8d9b7ab4e resource03563.gif +9a6992ab4836a54b30a601b27f3118bc resource03564.gif +2743735c6e7f6b067b73f5c2a348767d resource03565.gif +009b11d1fc727f0e7f2dde5a2a44a1b7 resource03566.gif +d4b5f6c8cf02d550954fef4daa88edd1 resource03567.gif +6684d46742974354cd8ac0d4e2f4be66 resource03568.gif +07b9b9a36ce7d732288216cb2a90b32e resource03569.gif +e936f3a56b1bb925d083bc986072c174 resource03570.gif +1f22618a331d733890ab0a5283a095d0 resource03571.gif +42933f978a8040543dc45da22de39f1a resource03572.gif +4db6ad46c80b558856c57ddac20237e6 resource03573.gif +82850546e4dd7389491bc7f0a8b4a7df resource03574.gif +e06ae6976b3dd99ac974c8ffec54cd83 resource03575.gif +465886d14b19f324dca5c33892fd4d4e resource03576.gif +23ef38c72f2f080dec93fe7fbf61a65e resource03577.gif +67c2ecd1031a4813316e87a6a545c944 resource03578.gif +0e3d50e5b2c7da06bdb8ec3ff3b970ce resource03579.gif +774bf5bcc7ac53096d76a070fcfb81ee resource03580.gif +b174ca082a1b7504b679572f133b7d13 resource03581.gif +e1b211ac69f7095bdab9f91365d6af4d resource03582.gif +d8d22d5d1afebb2e9219581b60e8d0ef resource03583.gif +343c4052f00fdecf8c175312afc7045e resource03584.gif +be583975d03de2eb6836e8b99f506f4d resource03585.gif +8afe0145873097431ff831e0e573160b resource03586.gif +733f898c065d47256e854a9790c65977 resource03587.gif +01b552410a2edfbdccefd7cf26a0f26d resource03588.gif +2e5b8f8bc00dca07d167f7c0b7ea2fcd resource03589.gif +52e992964353458cf900222932d9214b resource03590.gif +318bd0595aa23333d450bcd6469d6a42 resource03591.gif +06ae409cb0cd3b24b7826f117989e29a resource03592.gif +89bc0e97c59539e1a86fe2d97f78215a resource03593.gif +6f1f6eea9dce0b96a0050866676091d1 resource03594.gif +6fe682466427a5c7120a6bb6d38e6d41 resource03595.gif +0e6509f26ff6a06f70ee87ad8d07c982 resource03596.gif +c02ab95c89f8f267f6246e67ee2df1c0 resource03597.gif +cb369514b3e80ba2f516b3e819d8ccc2 resource03598.gif +ef038f4d95e7318154674f8eac3e944b resource03599.gif +99353dced99b8169c1ac43c768bac9a2 resource03600.gif +d02a88158da0393c5b46c4d5236a4f52 resource03601.gif +a61afb9ee229897be15041b0d91887be resource03602.gif +dcbef40d97c324e50ec1d0d65df0f803 resource03603.gif +19fae44f96085487388db207291ff34f resource03604.gif +111eb731178eb3b8fd5e969f3a77184d resource03605.gif +f9184159ffec3daa9aab67505881e0d1 resource03606.gif +64c538f4a3c637937780396db9a38de2 resource03607.gif +24129644389a83ba34230c9a7004c62f resource03608.gif +0ed7a101f8e07029878621e4d0d5b0bd resource03609.gif +29b3d4d9883352d50114e7e1e04db835 resource03610.gif +c24003ef4e1fc8590ae7e33651759da8 resource03611.gif +12e3b305a12fff2f171caf0be3f0fd2a resource03612.gif +f3ae633bab1f78f8bcd2cdd1f95cfe35 resource03613.gif +a3a1fd1c79f10b145746c5fff2fbb2d8 resource03614.gif +7fbe204579a510cc8e11d40e5c8d74ed resource03615.gif +b4bc0e2aa467de40d237831bc0517028 resource03616.gif +7cfdcdeb984b10b932fbcad0ae46ec9d resource03617.gif +2f2e85cf81ed0613f9b5358a64f46fd3 resource03618.gif +2036c059c89cc1d9f3e2c08cc49cb793 resource03619.gif +9ef8fbdedcfe3a4de76ae7653bd76fcc resource03620.gif +384c8704f9f0f36be2e7084fd5e89c96 resource03621.gif +c0e19ccb888285bacb753181c2c50625 resource03622.gif +09bb88cac86002e8fb79847983e744a5 resource03623.gif +51549ae25040810d273a4d91031b49df resource03624.gif +1a1a1f61fade8317998099bee74ed0d0 resource03625.gif +33025a2fa8442693d15cabfc5ec99a07 resource03626.gif +36e0a5b162738e906b34a5b41c6b9119 resource03627.gif +129e026fb047637c8c320e8ceab5e81b resource03628.gif +813147aa3fc9c077f3ca33edae404e78 resource03629.gif +c73778063defd9183d9f7a072b582624 resource03630.gif +5cc3f376a018c78db2abd7bed3a107ce resource03631.gif +d9070c8b460bb00fc18d2f2b8c950d76 resource03632.gif +a5fb360fc4669cb8b13dd0e3b49bc082 resource03633.gif +0e3d9b59ffb9b3b3a1f8361fdbe4d6c5 resource03634.gif +4ad20ee864d39442066542df65c5c898 resource03635.gif +b6da4a7789520b0eedf4412c828e2e53 resource03636.gif +eee57252e61d575d69b3c59060a9531d resource03637.gif +aa5eea5334daeb7b6696eff1a7098dc8 resource03638.gif +257ae1fad7947a908595d16803753ca5 resource03639.gif +6e012671cf0ab82c769564025af4b597 resource03640.gif +4073bdf2b61069ea3cdb173d31e9ebc0 resource03641.gif +bc089e86a06374fc1bac22146f7d0444 resource03642.gif +1880e0f8ba4445bc73d6334751c79b37 resource03643.gif +56d1f671675721c50e8ed87b703b0ad8 resource03644.gif +7c9f2929acd60c1bf76df8208e5fbc6c resource03645.gif +eb7c3aea959a57afd44e47e86c8235b8 resource03646.gif +be07cedac7c2c9dd0a369be3ceada962 resource03647.gif +572ef89f71033ad642964fc200a8114a resource03648.gif +ae1ab838dd1de44aa2d5b17c687d2e6f resource03649.gif +5c687138d09f462c77a4da3918e69125 resource03650.gif +1baac32bf95e5879b9c2964317841bf1 resource03651.gif +8370a5507da9ff7e6ad81dfd9b1a2237 resource03652.gif +6128ebcba5d3d0e17250c8cddbdad0d9 resource03653.gif +3abb5edd0bdae00b00a9cd4ab7c10256 resource03654.gif +beaddd5228a53db92df5dfd31e3ec3b5 resource03655.gif +3489041055c16331040a9907acd284e4 resource03656.gif +110ee87eb41158a1a7da033118f93c60 resource03657.gif +30ff4319237933b163d585d73dc03d7f resource03658.gif +9388a73ad4f99615d68a21b065bf8a67 resource03659.gif +6be4e63c5115e88b6cd7230e79533d3b resource03660.gif +dcc47298d81d979e748364184b5321f3 resource03661.gif +f13ea25eef152a002be4da595bedbedd resource03662.gif +e2327f9eabaefd6b370ab30a78af4f3d resource03663.gif +0043cd011ccd9b013ffa4f12038cc0ce resource03664.gif +0248cf82cd60fae15620032e3229d4c8 resource03665.gif +04623447acb036526b86e80534d67759 resource03666.gif +6f5c20db654cb1e612e014f30b99dcd1 resource03667.gif +1c3803080d0956990c024748c22b9466 resource03668.gif +c394b71afb78f41acbefa6a4664c106b resource03669.gif +4eb00f889de71f821547a664c7aacc15 resource03670.gif +9b845a16c0f706b99cbf6cfdd4ca7284 resource03671.gif +83623b189147a0231450de4e445a3a2b resource03672.gif +5106d4730c2ccf51b393c8d63e87f137 resource03673.gif +acfc0c605d8f12d9874baeba214b4de7 resource03674.gif +f4de97cdfd3f100f17f079f523c76ac4 resource03675.gif +f5d86c44b1d0e0c306e797eebd4d15f7 resource03676.gif +822e1b5a13bbfbdd8152c5a94289d413 resource03677.gif +f1e29784d47f7c025ed3516c4820657f resource03678.gif +4612a93c1043d0d869317b67867239ca resource03679.gif +7d8ad0af54b39dc67936be94ec644bb6 resource03680.gif +c7f35e016d9cd540cec1503e8e0e97c6 resource03681.gif +59a26afd73fae6f392489ed4aa5ae232 resource03682.gif +25ed5eef75fb0fd310fa742c840e2037 resource03683.gif +9dbdf163acae2d7e2155e1446bf41ed8 resource03684.gif +a4abb535f7b3f5bd3c8ef1438d109bd5 resource03685.gif +93956edf1002bd508ed2fe8446a85a7d resource03686.gif +881264c6557b2c87c1503d3fa630cb24 resource03687.gif +cfd3fb3081820576b46af2e5f2d3731d resource03688.gif +47c36a38771df851b220e011455d12c6 resource03689.gif +98246f3b8bdfb1c4cba46ee589457482 resource03690.gif +29984e7e24aa9afc0ac3a55845455a72 resource03691.gif +dda3989d08689c5301e6c611ad0085a5 resource03692.gif +3b42bf6f4d1bff2890ce9eed55649914 resource03693.gif +d674726f813e040d7035e914f2a450ab resource03694.gif +08e3b8f6d7665c6ee4007ae39c06c58d resource03695.gif +24f4bf62b4a87995372566324e2c104d resource03696.gif +1057ff305e59b9b6691c568c7d32f82d resource03697.gif +5c2d4aba76163266b17ba71444d55d73 resource03698.gif +e6429b410a08202c98f731e739224818 resource03699.gif +3a88980f38a1221b59edf4838b99f3a2 resource03700.gif +30b20f8c47f6058d58fe98e81f29e87d resource03701.gif +6aba828f354e51db74ea85ddd551b4fc resource03702.gif +f5b2a94c08dfa10d536095b71a9a99c1 resource03703.gif +7dbc141f555c86267aecad05c0623295 resource03704.gif +ba246b1d32e2864533e932155aaf68fc resource03705.gif +642f6f00a34fe54ca02c4a966f2e09ca resource03706.gif +36f63d1e9bea256c0b9a8ba3d44ee8ea resource03707.gif +62d8024d9c55ed6beb9765e540599279 resource03708.gif +88d9e0e85de6556a6da93b85a0504d4b resource03709.gif +441f30950fdcf4c9c0722c3be576ff87 resource03710.gif +91686ee85a2b40342876e2dcfeef6aed resource03711.gif +ad1af498a98635a96bf73f25faaf4b7d resource03712.gif +0da046a7b9d863901657202ba459812d resource03713.gif +3ae3e51a2a6d4d3cd89d2d209a4a0de3 resource03714.gif +f41bc57d1ef004258d4bfa42dc9af1b4 resource03715.gif +ffaccfdbc8efe5fab25260e44218d23c resource03716.gif +0efadb6f0267e8828dd6363a39495cdc resource03717.gif +d88fb92a804efe86310215121b01af92 resource03718.gif +21b3f3bbd4dca682c942e4c08f898417 resource03719.gif +6dcf02307b49654bd85e1108ffe5c2bd resource03720.gif +60ae56ee89ff8dc78a001471536091bc resource03721.gif +c608fd061cbe46e94db8a7099f5df115 resource03722.gif +ee25c0aef58b599cedd6acba0268c031 resource03723.gif +b66bcd52734062f24e0930b33554d342 resource03724.gif +69d4f2ee1ae0a6f1358108c1abf97a57 resource03725.gif +16b80752bd47df63ab279e6e77911fbd resource03726.gif +859bfd6712a6d48f7fe4e9acc1d55c6d resource03727.gif +f6e1dd195d061ab44f5625a4eba82634 resource03728.gif +c226144c47066bd705abf3a4cce8ce8b resource03729.gif +1d38cdcc13a667f558ac1a766e58eb6b resource03730.gif +72606eb476036ac5a9f572bb130cd5ba resource03731.gif +e883ddf07cd44fa5e9b2f84abfe45dc2 resource03732.gif +cdd4519ad5debbf27f6fa712676d9d9e resource03733.gif +190a2a8f5c1e0b9b7a2b7b1ee0dc391b resource03734.gif +fc4e48a56feb258aba26db74ee5d15e5 resource03735.gif +6ed29371c78eab6486bccd14b8a219b7 resource03736.gif +66fffc331d7214db653c621fe61bb3ae resource03737.gif +e996605a4230c755bd5719ee98cca18a resource03738.gif +47aca8b82e4421b658d32aec99e7f797 resource03739.gif +a24457e2f3fff75581336999d725a0fb resource03740.gif +03589d99344d89b1c33cf63c77a82a5c resource03741.gif +227bb3dd4aee245f332878dc534a3dda resource03742.gif +6caa745511f3e2b135241e438ab6d05a resource03743.gif +2fb987424bcfd01aca910fbd03c308f6 resource03744.gif +4ab9cf7832184b46e5770794874bf52e resource03745.gif +c61a5631d6d66d1bfa76865ee2af21e7 resource03746.gif +ecc74e51f80bbf299585dbb0f6b7b208 resource03747.gif +ae9af5cc27d478a0f431d145bf209131 resource03748.gif +a567673f00cacb26f79cc340da24862f resource03749.gif +1c5aa0330b2cf330617171f8a33cce3b resource03750.gif +66fd775bd73b2a786749991a59d73327 resource03751.gif +52f44e9d56f7282fe08bcbcafd3e32e7 resource03752.gif +479c8dd0cf984a98da94d14dceb2f023 resource03753.gif +845b31de9ebb2f0e90c40feaa6323c64 resource03754.gif +1d9fc0b1f6b6d947de90d37d66aea62c resource03755.gif +cdd5e8fc3e2b7e98338a0ab16dc2b041 resource03756.gif +4cdc9db88d7da5704f3799b52066e8c7 resource03757.gif +f52d607f74efa34b9d7c9887c43ec76c resource03758.gif +d8a50bbede12afc67b2bd113ff64d2d0 resource03759.gif +9c950a87ba6e5aa750e79c6a2422ad1d resource03760.gif +036983c22b02fba0442c158b28b0d3a2 resource03761.gif +447432e92d87fbf79fe4a0f27c54f414 resource03762.gif +de7e84097685a8b3fe5d8d92c0a846fe resource03763.gif +744dbbfe1a40959e8dfcee2b0292b6e0 resource03764.gif +59250d288c9a9e6ffec8392ebc7f08ca resource03765.gif +3019939659fb9dbf0ca19a398e1bdae2 resource03766.gif +ae87ce830692e96ac3f64bc648cbc5cf resource03767.gif +b2a5a567096b057cea919780f7d8965c resource03768.gif +c2913b0c07668ead73273c0ac59f72ef resource03769.gif +8f3cfa31601289b8418ebb99966f9e54 resource03770.gif +fb623a25ae49f023ded7b99ee9bc1a81 resource03771.gif +8d45c3ed74e206acdc536610bad8a632 resource03772.gif +f833d78858628e5e6aed2fdbe92b5adc resource03773.gif +b6a20831348ada6a9e9ac67d342aa044 resource03774.gif +f22d952f4819c9cf9bf6e9eb2e7da03b resource03775.gif +47deeb796c45fa03daeb54e1d91af482 resource03776.gif +99e7304af0862bbbd9df6e24f42232b1 resource03777.gif +098d0e13ff816ab59b987f0f91aa4f78 resource03778.gif +3f86dcb345bcb2802bab9e92a6fe6e75 resource03779.gif +8636a2980511c81ca5e2d07b2f63c31b resource03780.gif +e8eb08ffcf25f7b078f51a3fa2fe7622 resource03781.gif +0a209351f1664a44480d2a9fbbec4308 resource03782.gif +e4fa2473f1b3cba47f5af2baa97adeab resource03783.gif +2bd7906c418d914245a5f3d5b6468ecc resource03784.gif +2bb7b58240949fee48dde7c591ef0c82 resource03785.gif +ff9b38dbab477ea377c026dfdcaa93f1 resource03786.gif +a2cf9140d0aa36c06b08e5d69b488a94 resource03787.gif +2c4039c916537819914559bbe59dd690 resource03788.gif +17adc9014cef4282a820f4023ade72ab resource03789.gif +d9d3946db0f5e256f248795c7addccb0 resource03790.gif +d53cda1335bcfdac9bc02fd974b291ac resource03791.gif +ce6461022bfe189fcf4b12aade01708b resource03792.gif +c8c5ea115db06b8896e694a81a2f5674 resource03793.gif +7b7f7627d3d65cf13bff38a1d72d2b6f resource03794.gif +1108bc84f510ff3cd5d50cdafbbd924e resource03795.gif +6b7585be60535132c6bffab8a7543307 resource03796.gif +bc7b1f2c273a8a29e143adc45b12dd8f resource03797.gif +1623f26885c8d7ff2ca32885373ae19f resource03798.gif +5b8e621774728c4401d3a963277e92af resource03799.gif +ddd4d91b50ac27c78f602341350d7efe resource03800.gif +a45723c1ceb614fad4c9c10dadff44a1 resource03801.gif +203fcf4fd3f70fcfd82c6c08fced10a4 resource03802.gif +5fb17dc9eacc063a676ef34b69a3b089 resource03803.gif +ebae5f2caaa232c7882ab9f035646c8f resource03804.gif +051d3ff1b41a12344deebb6b4d46ae70 resource03805.gif +a5c89ad3e0e72a1bc47e61035d5e8a4c resource03806.gif +25d5c094cfb710f4f7cb397bb5b45f7e resource03807.gif +5b293978c6400dbc44406690e64fe120 resource03808.gif +599eec2c9e6cb60140763b98b9739edb resource03809.gif +7c54cb88f20da459f9222acb2cc2a4be resource03810.gif +5110c2274d3812fea7db5ef7c0f5ad11 resource03811.gif +fbe12d12ccdec6a8c1202f7baf07771e resource03812.gif +0065b3300353a578425f8c356bafad14 resource03813.gif +f9fe91a887f7e23aa8e77463d8e16bc8 resource03814.gif +aba168ab89c60fae176e248ae58f4ce3 resource03815.gif +e7260722c9c133dc7642bd143c5a21a0 resource03816.gif +89258175e24f8f51aabdbe0a8fa0c8a1 resource03817.gif +b95f30c30d1bc58e4a7bb1bbf55273c7 resource03818.gif +6b787ea4ab5e7ee923faf627a712a96e resource03819.gif +9ca5f44d58bc13e726db43b4b071e16f resource03820.gif +130dba7d18fcf7e068d762da201553d3 resource03821.gif +0b361fa7766e3e0904121dc95d3f73e4 resource03822.gif +9ac2f702e45f33f5936c2145bb6e2908 resource03823.gif +1c5bcd9273d1a2dc26823cc32f19bb88 resource03824.gif +bc4790e0e0042da5ddcaaa0a09667052 resource03825.gif +22106f493fc674d9d55da91d1f47267e resource03826.gif +2c5c4c8e381b4a0d6eb719e0c3db5c1b resource03827.gif +747fef96bac206a59b7f17c2d4dcb290 resource03828.gif +512ce63f55267da7b27141c3a37709f8 resource03829.gif +c0d7467bedbc7482313067ad082338cf resource03830.gif +324cdb6f302fb5b1ac5863d837306e5f resource03831.gif +476e2a1e6ce713a6ff796dd440219f0b resource03832.gif +e0329b14c18103888e27f0c38c6ed7fa resource03833.gif +3c0042a83a28c7114646b8e85f667719 resource03834.gif +a07396d320ee8242e65949940b78de58 resource03835.gif +9bc18983a18f2d3c6a940b872a46a697 resource03836.gif +9b44a567aedc7316118c29b68017d5f3 resource03837.gif +a75eb6a3bfc812bd9ce52f432e11e1d2 resource03838.gif +4d99dacf3e00d20f7bfba8fdc060f7b6 resource03839.gif +d1a1dad074277c5539af3a146a680d4d resource03840.gif +c83d51a08b4081688ab3837265593117 resource03841.gif +6efd913a1d117fb5e2afa1ebd8038c29 resource03842.gif +a4f4f0532a05eab9b46cf4c58111f494 resource03843.gif +9d373ffb06e668dc9f6fb555f05c554b resource03844.gif +c08c1a08047ba43449eb478778b9e378 resource03845.gif +f00d672921059530c8ad4cd3446f19dd resource03846.gif +8307ca5cc93a9bc57050fd549e905eb6 resource03847.gif +f2d87de3d7090373685f13fc77a17f75 resource03848.gif +cb4a505d027e53a0b7e67176fa292215 resource03849.gif +712d39e86ae16654c719653b663dea7f resource03850.gif +024c5930bbfa33a390fde783dde0093c resource03851.gif +d6c6e3a06f7c979386edb243af6bbcb8 resource03852.gif +c8e51d9754951715aa9f60bddf503b46 resource03853.gif +d569fcd046a164307e6e3326bfd60bb4 resource03854.gif +a3d7a3a15cb2458851126a827a9464b4 resource03855.gif +b073c4c7005aab7ff096d7aaa2f46a03 resource03856.gif +dc7aeef61c8c3d39accf13227cba1bd4 resource03857.gif +850731e3c74d3d841966cf34466bbcf3 resource03858.gif +943af0fd3f864c96234c3b50e5c7657d resource03859.gif +b6f68396a43bec63d9a092a4ce28d5af resource03860.gif +e4fc40a81b592287dc1655ae4edf2fa2 resource03861.gif +027d8556ccdd0c21fa70787ea010ae4e resource03862.gif +a289a4036651da3b8052e883510e13f4 resource03863.gif +8eccdc51ecedbf40c1ac84b41254748d resource03864.gif +04f1e2750458b8ce8505005b80b3d5ec resource03865.gif +a9aaa7212549f1c818f2932572670d52 resource03866.gif +531acab6dee0fd4d1c7750ef6ba5c8a9 resource03867.gif +1ce4b92472955a58883f1e699e29fdbf resource03868.gif +29cc5af6ddcd2a5696756f78c30dec9f resource03869.gif +26c0c669156b52dd6133a3790c59382c resource03870.gif +f710fc71d3664fbe61118608417463ac resource03871.gif +71c7c543da2295a5e35e4514fc42686f resource03872.gif +114b9f2c976c21b2a9a17fd996cae2d6 resource03873.gif +1a28dcc428e11dc3bbb78878535e77cd resource03874.gif +e24bf8c9703714f1c4983387fb38b0ef resource03875.gif +08a28b7a56c5bb79ee5ec5ac13bbf79d resource03876.gif +331a8008aa25e3239960894998bc1c68 resource03877.gif +cc9b72e910a4a4545e1bf6fef2854ed3 resource03878.gif +0f649de066c01ad0e19c9bc637f654d3 resource03879.gif +d1aedc5a9d8189bff6fdb5f2bf14e35a resource03880.gif +3b0e8f2fe4bb726077152912e72ec918 resource03881.gif +32a5afc22f6bafead539a558074b08f8 resource03882.gif +1da753148761aa1b1cbd672d9401f509 resource03883.gif +d348f5a04a02a1bed34a88589e84228b resource03884.gif +1fa63c25b1bf561bb291346ce04bee0d resource03885.gif +fdc132a032da911109b329671021bde3 resource03886.gif +760df67bd300fd2a4fb370a9985eda8b resource03887.gif +d4be13c866c5f7444ec949d4cb3cb66c resource03888.gif +72cb8b435afc910aeaf413053880f135 resource03889.gif +4ae13ee4690009f17bfb5771387c9fe0 resource03890.gif +2fa4cb45858db2a6466e1ee30543d871 resource03891.gif +3c8ea34c23ad4787e9343c727516ac32 resource03892.gif +f64c100661574b205731c1f738ec2cdf resource03893.gif +49cf6b006a601b4443278c0268d9c844 resource03894.gif +a4c99ccc770ba299e81dabe04d54ee27 resource03895.gif +1dd311c7ca8f910bdca9cadb6a74f6f1 resource03896.gif +59b0af40f53cafb5be59c922a7fbba87 resource03897.gif +26fe9cd3fc961574e89069e989d1da35 resource03898.gif +e48280800bf6020d5768a9b8242fa964 resource03899.gif +aac9e245f4fa37d71b9cce31b636aee2 resource03900.gif +256962153d3adab4e5612ef2fdbe6bc6 resource03901.gif +90a7eace7ee58b810a509e8c66bd5ecf resource03902.gif +8ebd4b17552c546e19568ac825c49dac resource03903.gif +55d55f496d3ea5eb65f153273bb9a5f7 resource03904.gif +11bfcc41563f073f72a2f7edebf17d95 resource03905.gif +7218d52a83813500175862fa319e6d55 resource03906.gif +d236db72203bac4acd5e0b65818b940f resource03907.gif +2e54e30f3b50683f802ac1dd965bd1b5 resource03908.gif +c942dab4271903429270383e4e62c09f resource03909.gif +035817dadfaa504fa4764c0d8d7e13f1 resource03910.gif +753382aa560a127bc4eb511c346119ae resource03911.gif +b529d066ced5d741efb313bc77dad2de resource03912.gif +1d6da677b3c46594176653bb34639cfb resource03913.gif +cb668b94562345d8473660b92aea0146 resource03914.gif +3c799ef830d10fcd0979b4da55ac43c8 resource03915.gif +c0121749b8eb0a9b1384df1932f6d9b6 resource03916.gif +78e20b70b3ffac195c2de022663ec2ea resource03917.gif +78e20b70b3ffac195c2de022663ec2ea resource03918.gif +1ab247cd42faef6f4bce3648e234bca2 resource03919.gif +005c92f6c5025f1d3dfa565405a7cabe resource03920.gif +2da2f2f0039594dc5332b4e379a28a49 resource03921.gif +a34229372ef88a38dd1dc22bd84cd683 resource03922.gif +625d7c511d6d41de01890bb971eaa643 resource03923.gif +19b2893d6d746b3448b102fa7b8d302c resource03924.gif +b752a14e4126601c819f1b54273eee41 resource03925.gif +23850730c9f6b6250e966b25ee193e93 resource03926.gif +b3672391a2b2241df0662eb906f8059d resource03927.gif +8ebb3710fbbffa5d351e0161496c5f07 resource03928.gif +a2735e1454a3ab7016e51a19ee607d65 resource03929.gif +2ed606186a83edfcd2814d209c64518a resource03930.gif +1b480a24738a6827f946cbe5f0b580eb resource03931.gif +e16aa356abcb2f37fa2d3ae8878507e0 resource03932.gif +ffe43c7a595908e4dd550f27e080ae55 resource03933.gif +f25c7defe2516bfea866bf5fcfd19a65 resource03934.gif +38e4c8988addaa8c3387b9b7460c1138 resource03935.gif +87c57ac5e338016a72889e6ba4875577 resource03936.gif +6a3cb4b28ef92f133436b21cf58a247f resource03937.gif +51aeb72deb5342238da1c5203303f5e9 resource03938.gif +71dacc0f178f7c4818f803e89402ad7d resource03939.gif +7714a6afa0e548cf944716f6a5e7216f resource03940.gif +68df1415e7f41b8a4626c75dac5eeeef resource03941.gif +3a6bb8fa8b3bc844f7a8b063c3f27760 resource03942.gif +c52e4b0bdb32bec06c23cf8cdc60964f resource03943.gif +74ab02aa7b9d424dfe35d7c8aa521020 resource03944.gif +c1f54829ef7b9acf3a5af5d29b0df741 resource03945.gif +547d4c746be9b4245a7738f1930f0922 resource03946.gif +8284f4f3fd67c99d603e4b43991c7145 resource03947.gif +2847f2b0151b9aa8f101a62bb96c22e0 resource03948.gif +e4772a132fcc5978671a6d0a55231632 resource03949.gif +14f06c141f642197334ae37e42432fb7 resource03950.gif +69998fb621266834a12c2ba5638c4033 resource03951.gif +56d365e05bf9ae6ebbace08c224f26bb resource03952.gif +7503d33713ffa83ce1e5989701142a7c resource03953.gif +1933a750ef09f10aba23a518cb969030 resource03954.gif +29c7117a47fca1fb279786fe7b76b42e resource03955.gif +d613543db3959126362d7ed4461469af resource03956.gif +ba6b1830998f59b466f5e047723c4854 resource03957.gif +0c0736169ee6d6b67f2c46c27d9415b9 resource03958.gif +e3c6d66550047d101a1d9db73ae948ea resource03959.gif +089c497ee16f86cf98c287d516d5e4e3 resource03960.gif +e8396809605969438d13e9840a90ebe4 resource03961.gif +ebdf6bb5376a622e44d990da5e5fafef resource03962.gif +80591d7351584cc11afee3a439f9944a resource03963.gif +6489a6f2df0d5c407c0229a073207ca7 resource03964.gif +a683de62f6ac28bab08d3a9ebeb36e98 resource03965.gif +3d6a5d36a88059ce2677912e1efa15a0 resource03966.gif +63dacd8535b87b033b88e086d51be84a resource03967.gif +4fbfc96f32ca2d5cfb4f078035047c46 resource03968.gif +9bc8cd03fae0e1b91660598bd06200bd resource03969.gif +13ea22e26967c4e78853d2f0f87e4568 resource03970.gif +b3d7f5a952e29664e97aee3a7ec32e90 resource03971.gif +d58c24dd1d16b063c22a8d57e796ddd7 resource03972.gif +3ebbd14d8b34ddb5fc8f5bbad52f1e9a resource03973.gif +1b828588febcf7cf47e56ad46e1b7b2b resource03974.gif +87f9119a2ac044eb64adc97627ff9e32 resource03975.gif +f5e39985e8e96e245e528048c069032a resource03976.gif +e5fe24dfba11ad883eea56273856fef0 resource03977.gif +8708214e527e72a12e098184078008c2 resource03978.gif +6272ae7363266eb195f2a5127a011651 resource03979.gif +eb1748f3748c3b9bcc94075404808b9e resource03980.gif +6c894b37ab333e275f127af0d1eb9093 resource03981.gif +7310e8ec74da932a5c6bfbaa121c2a80 resource03982.gif +27eb129aef118b0b3ff6ae9dc7634dcf resource03983.gif +0e8b6562b5ae3858febd200b0a9d70aa resource03984.gif +1883851a66719a3f7c90444c102b5acf resource03985.gif +f9a0ffae9e7107403d23359724f65d35 resource03986.gif +69d53ca2af5395eecfbf45fc00308883 resource03987.gif +d3b3950f4dd4ea94ebfae3cc2b7211f1 resource03988.gif +5f32a204a6195c95256de715d470c3f6 resource03989.gif +586382846a85238c696e23bfa29d5774 resource03990.gif +374a34c450aefe4c3fc21069e8b40293 resource03991.gif +d4841f7706d758b5a3b6e878dab133f9 resource03992.gif +751a6518991cc5f49bf45ba3a285f0be resource03993.gif +8f1021569049966f1b11010002e9ab62 resource03994.gif +435f6946c0a4cb11622d4afac3a39276 resource03995.gif +ef7713e726cce2a1c77deaadf27309fe resource03996.gif +22a86cf96d204ebc6ed68562d283a0a8 resource03997.gif +47a66318b8f9dacda03951fae7969b4e resource03998.gif +95ad1ee9a06c1c8eedfed943221a35de resource03999.gif +1c3d9bc20f87c10df4b187af1ca81769 resource04000.gif +9fc85e0b253e7767a626bbb001027c37 resource04001.gif +ca134d4ed3c334a2c41bd720e838c512 resource04002.gif +7423060b1398e200244ecd1323e03d36 resource04003.gif +27fa298f5f65fb839c09cd058ceea227 resource04004.gif +f66637d49a8b5497b0883fc1cd89fd9c resource04005.gif +e146cab7ae0e2d558280e90e4fb52043 resource04006.gif +b1b3cd8b9c00811cff39068f93fdc40e resource04007.gif +770ca0dd6b6f17bb8d5dd3298539fcc7 resource04008.gif +eb01363463a38a62660e2d587a2e07ae resource04009.gif +93724d3f962ffde28b759593c649bc10 resource04010.gif +e61c431cc946ff67f6e5095bb1b7a9db resource04011.gif +f2a768ba398793441c529e688baa4ab6 resource04012.gif +5f36e9957390c4e13b1c4c7e34ebb537 resource04013.gif +d417b77135254a82764910aef01359fd resource04014.gif +36caf6d4ad5db252f53716a189b585b8 resource04015.gif +37d24bd160bf91a08db4e1e80de560d2 resource04016.gif +8879cffe5a8fc770e3f5a0b3c394863a resource04017.gif +98ed8b9e1b5005adf14f7329e8631ab8 resource04018.gif +ff98fc55dfd4b211e3efb7bdf0b55bfd resource04019.gif +60e454f23d4cc18152dcd2a04b30831e resource04020.gif +c437ecd62c3570cdd1ec6358d5d9acd6 resource04021.gif +6be0768ac14a2000c7881513f8d0100b resource04022.gif +3eb7a894049751abc1916fb1650e93b6 resource04023.gif +4009c03586b3ec904dcbda6bced87bc5 resource04024.gif +c06982827ca699e903ff8897468e565e resource04025.gif +9217dd1306e379cc92fadab3ae809bad resource04026.gif +b6612cbc98ee2cbd8edbc03503cdfd4a resource04027.gif +15ea6eee8724d0647446d13048eff916 resource04028.gif +960269c73c86c335d4785ce144e3324a resource04029.gif +66cde6b600d6fe1e56e7388d264dc09b resource04030.gif +ac8f87f229079c9a3fe8ffb24a209c55 resource04031.gif +830376d8c4b7ea71c371360616b2270b resource04032.gif +3968fa86a390e57ff4ad0486c4a88ab7 resource04033.gif +619944e5d5e4d730829c0781188ddf16 resource04034.gif +597b428000a1d6bc3c44408e5de024c5 resource04035.gif +699c48a2e2fcc03dd6a1007dd86d1dee resource04036.gif +e898b18dcf521cf4496f4f910955a962 resource04037.gif +0d9382af14b51d4827861945bdd2a5dc resource04038.gif +0c959c2e27f8955c7a05de3b00c4ae0f resource04039.gif +cab9cb69a5d00d56d65516e64ca06a56 resource04040.gif +74539a6d89128d9fff57343efdc17f3b resource04041.gif +6cf606a820395d515a87e437dfa733ac resource04042.gif +56cbfdaf47c74b693a68475ce9d7380b resource04043.gif +fd7a8afbda9989c5eae7260d354bfb4a resource04044.gif +6736a830b1be8845fdcb88646d8dc74b resource04045.gif +326b9382e72e9e3992d7bf2a72397ee8 resource04046.gif +ea40763601bbb1d572d41aa690c83b96 resource04047.gif +79378e3b887dac5b4c40cef8fd3cfc53 resource04048.gif +edcfdcdf6b3d610139b699df419c959a resource04049.gif +2c6e38edda9c83d26ddd40579934ec1d resource04050.gif +619364200c12199d25c3905571a3ff90 resource04051.gif +d9ec2f5f8e8ef1b1c6014d28f477924e resource04052.gif +548aadd59d4a64f4077904d0eb84b226 resource04053.gif +71141decde9ac3735dcbe3b057ac5712 resource04054.gif +24dca958cb2bf8c68e291386007cf2f2 resource04055.gif +c7d19891175a457292d53b4ef8310ebc resource04056.gif +86f1c139de9ab49df8015bc4dd14adad resource04057.gif +c58e5e12da30b51035b2a44debb75d9e resource04058.gif +590cac0f0581283462480207c262ddd4 resource04059.gif +c78c47bd1d3d2b9b3b1d57552c2fe1a3 resource04060.gif +09d5d673bc6e9045322ec32252daa3a2 resource04061.gif +4493d16d46d85a6aea77209a3e90836a resource04062.gif +e8c4ece6343029e78af166f03d9768f5 resource04063.gif +db7f4859ee1182d96b5a29cdb3b95e1e resource04064.gif +c8032bb6cd93e16a79a7d4e0d8e4e51f resource04065.gif +9a8211a36081413a2cfece0f449436e7 resource04066.gif +bc77591e783817a16fbaf0e1a5725c93 resource04067.gif +60f23183787753c99ebdc24d607a82f4 resource04068.gif +bcdaedca352175b69c7faa6f2aeef562 resource04069.gif +2d6e4db1e3beb67a5ff3b7cc5df7715b resource04070.gif +1c2844f2834caba00649a61559b6ca23 resource04071.gif +e0124ee8ca71882e4390bce4192a2089 resource04072.gif +6df45634ea2aeaf00c7eb315cd1e61f1 resource04073.gif +eb9cf00261879f851f7f9ce87c289d7a resource04074.gif +22d485e5cbe7a0dfcf3d59306ab82851 resource04075.gif +efcfc70396fe5b26b714be573ca4c953 resource04076.gif +d33bf3e7879982afe88d0df90366ee8c resource04077.gif +0f3e78f6dd26e7b989b0763d55861bd0 resource04078.gif +4fbbc372c68344276e5cfe75a40c9881 resource04079.gif +62025c875cd56123f04d43e38838fa72 resource04080.gif +45569b950918986505659d828de87c23 resource04081.gif +747373449e9142cd08043226c6e95f04 resource04082.gif +265f39f4f45b0e000cc080cd93396bc6 resource04083.gif +bc99509c267a8c006b0d0ac2c2f2399a resource04084.gif +94fd556f7583e254743d938718ebc764 resource04085.gif +ba241126dfe2793502aee2dd6a1c04b1 resource04086.gif +4f4c3dd6af5b679464df4a085a5095b7 resource04087.gif +edf173b052f87d3da19439af9af59a38 resource04088.gif +857d5e28dc314ac30e704968f519787e resource04089.gif +2652965fa8296e08d060f655469e41a3 resource04090.gif +521bd816212ab4137f49fb4931a857c5 resource04091.gif +90616bf6941aa3e1771b6fdd0325c46e resource04092.gif +1b47a460a7722dd173023986e8bdf674 resource04093.gif +bf59ec9fbafb8db0c45d203cb71e40b6 resource04094.gif +9adebd7f5060a6e08cbf4f5c633591f3 resource04095.gif +6dba38b6d2650a6e59fe3464c43d77ca resource04096.gif +e57c0fcd2ce2693e8cb841eb4c629d79 resource04097.gif +7edf563364348e8f29ce4dcdef476175 resource04098.gif +ac054242b9767f6da063319cb81442ca resource04099.gif +bdb79dcd7f2fe77a6ad0bb94656c91a9 resource04100.gif +f833941091a9c36b85faff81919c4849 resource04101.gif +11f05ef18b7505d8cce05f108c9bad4a resource04102.gif +5ab79ee4cdb5caae1b3494568f9cefdc resource04103.gif +b2b1e8f77bc5fa675a97a826940ed6dc resource04104.gif +45a22dd88550de638aa7dd38c3113eb1 resource04105.gif +4a4780c11c4da826adf39c5949e6b72d resource04106.gif +44659f750d3d58413abaeab29466b3b2 resource04107.gif +452ee41c7e0c6f42c766df7e23857927 resource04108.gif +a91a1b71eb9364b21d3b40c7a28f7369 resource04109.gif +c918bf39f4086d95196563e31e13ce60 resource04110.gif +21261653b10e7bbb118941dd59ad69aa resource04111.gif +df0e7fb8cdd96a69e140e01a6bfa29aa resource04112.gif +dae1d96432e9e03e9ef45466c421d82b resource04113.gif +6eacb6d53e6dc5c5dd53a714b4e511f0 resource04114.gif +7937d5396479cc4aff75c71787181418 resource04115.gif +8914366f82d4bdc19365c736966f6ccd resource04116.gif +3a9b3a7c90346e10cf68329c3cb8cd9b resource04117.gif +6566254554fc82b481ae90484a187011 resource04118.gif +b873d64b9ca3c3482a7600e8d2b7c678 resource04119.gif +92d21faee76d5cada040be86f2deb77e resource04120.gif +8cbbf656cc81aa0d21b7e5dd5beef967 resource04121.gif +f8d496b9cce74ae6c14fe269f8f3d6b4 resource04122.gif +2f5af8489a486233abdae78585653646 resource04123.gif +7991958201461addd03295e3e597af30 resource04124.gif +9f5eca50727dd794ca2f165728410dec resource04125.gif +48f6faec00b01d07658ac0101f65dd40 resource04126.gif +99f7f36e092d9f11ca53ef3a3184cc1a resource04127.gif +73ae7623c66e54aaa03efb90318a29cc resource04128.gif +1a31f3ac7d6f54a001beca8fe8b1b823 resource04129.gif +322af065252c2a50e2f1a75de78fb263 resource04130.gif +f344d0f04f371f1a704f79b493e35e5d resource04131.gif +8ad07dfa7bd1b2109c4d1d788ea400f2 resource04132.gif +1ec4e6117243dd9aa47258cea7462bbf resource04133.gif +062d0595da6b611916014cda24fcff8d resource04134.gif +8211c58564db4ca01f5ee62cf915a618 resource04135.gif +d7e52bbae172d4da450991117376c461 resource04136.gif +a1a0ee53a6128a52ae345ac3499b7a38 resource04137.gif +38894a4a1c0a4272120645643a601afb resource04138.gif +cefd6f2511badce2fade994f5257e9ad resource04139.gif +84c08594e611ad982f8f9fd21a9c1145 resource04140.gif +587a6886481414603c6515f47ef0d5ac resource04141.gif +4b3daad4a82b223946f9c66abb3730b4 resource04142.gif +ed652fdec1144d491fda6f32e4bb9e5d resource04143.gif +57ffed61dce482a1baf5f97c3bc2f46a resource04144.gif +d8bd30499d3f56bb6598760fcb3f2a3d resource04145.gif +7f758a57220c6aab84bc7b5d9ac47f2f resource04146.gif +5ec33be08565594de7b8a1fec8d98453 resource04147.gif +66edadf06af1f81f8832c8537ecb7f08 resource04148.gif +619ac223158e1e411ff1532c3580e32f resource04149.gif +474bd5144ad1e4b9ad4625c5cd1beae8 resource04150.gif +7f338c8b90240f0b0bf3bd405a8a61bb resource04151.gif +50c189c64f00cc8933d30d474000e8bf resource04152.gif +f2a35c72eff3840c3cd62db40297385b resource04153.gif +d2fcf2db3af68ea9396c3f4697271f74 resource04154.gif +01aa4640f76cb83272522d75d4cb74b5 resource04155.gif +d193e9f0378478f8896e3ca3eca48f25 resource04156.gif +eca80418daa442d7cdd465e07c94c8dd resource04157.gif +1dc08b509af2f4efb67a250a1736551f resource04158.gif +7dd2154f113d00dbd5ede216cf91d748 resource04159.gif +307c633c9a16e7ea3dacb8d6634d5e55 resource04160.gif +704d40f863fbe1412aed3db58c4e665a resource04161.gif +0c5ac99c52d49cec86405adddc27cf45 resource04162.gif +aca8a890eb2ccba588c5cf58ab91c338 resource04163.gif +6d9960f2125670917ab6dc5f64d92c1c resource04164.gif +85497f8fee27479b8e66de177f4152d7 resource04165.gif +effcdbb3f5f214471c3097d1ff3e5e04 resource04166.gif +1ddb490acf872956b5da94e90c50c358 resource04167.gif +af2e32368cc716f84a1814b67d1d7b74 resource04168.gif +4f735025acc0a7f465cc65e368657fb8 resource04169.gif +e32f5c89b43d3b3cc0698ef9f2694fcd resource04170.gif +af6f307bdc3eeaf735c21fe8dd98ee54 resource04171.gif +90139e2eddfa9484e836c780e5633623 resource04172.gif +273613a2f5d96a52dd537971c0732d8a resource04173.gif +f65b71e0a54092109b976d796eefe70a resource04174.gif +0b6dcc8e0dde609f79573d67848cab17 resource04175.gif +2e401b99c820d6fedea19bf49f861662 resource04176.gif +0548cd5b8f1bf4a3167fb73b9aed4d37 resource04177.gif +b675fceb2d8fe81e6431803cc10b17f4 resource04178.gif +1a197bb7835aaa9abae3558cb7fe8ef0 resource04179.gif +ef1d94f2aa9e7ae26d18b332d758d55a resource04180.gif +99519f3127bc1728ac4d502eba3e9af6 resource04181.gif +b9e1a86d113179ed69d2b073395e0282 resource04182.gif +646d241384b02f2a99cd8e9f45c178f2 resource04183.gif +a23cab52a3d036f297d96f5c890de487 resource04184.gif +135737507abef7aab8b1590d4b15b6a8 resource04185.gif +faa5836616ddb7ec09d8c11f7e3d5a56 resource04186.gif +61d56c086017acf29a75a25a9e2fbbfc resource04187.gif +bb3771f6a82e1d280775f13f61d0b382 resource04188.gif +5b1b8734904b0b6b69e4429612a9b2c6 resource04189.gif +424300068fc6a6a3f2e69733c445d7c8 resource04190.gif +0ca4b6b7a0c8c1c9a9e2a3a0bd625ae8 resource04191.gif +6e9a929823dd57f4abf22da7f4b57b09 resource04192.gif +36c18327760b24b92fa9642653cf66ff resource04193.gif +b4d921393f39921b90a154a8b5f99cfb resource04194.gif +0971ef858e795a9170d94d82a28eda1b resource04195.gif +2b65635ad92250a1e37a531db67de1a2 resource04196.gif +bd9097045459da498bd168a4b34af3f6 resource04197.gif +676a96514523ab290db01410091dc69e resource04198.gif +87adec5e4635bf770c792c4b711e57e7 resource04199.gif +8fd01639fea9df78dd4bb6eb552e0176 resource04200.gif +3aab5ba63cb1888c77d49fc5bf22f2b6 resource04201.gif +7215cf6fba086d82bd80fa95035cf3bb resource04202.gif +664b8d15c917fc31503edd824979514c resource04203.gif +adb159f7f8d970194b5621197fa8affb resource04204.gif +73fffed2c52bc06fa5e5bfdd37fc13f3 resource04205.gif +b57df8c4276ca8445ab1b4d050ef84ff resource04206.gif +51a93cbbeb02b7175c89196f1ff545b3 resource04207.gif +2376d06b9c3e1137273cc6efb032a4d2 resource04208.gif +63b85cda6428c5cee9972f7b7a39f3ab resource04209.gif +f8ebac6637e8264b53365829db951373 resource04210.gif +be34a0cb28549d9ebf1ab51f64ee86e9 resource04211.gif +bb58f9fafd3a2fd1b97b494842e08fd7 resource04212.gif +f8419a90cbd0cfa6d74bcee457a8a1c7 resource04213.gif +7c766b47a8ade21fd5452137338e1913 resource04214.gif +5df89ab6c87ac3869481b307d216e22a resource04215.gif +14d4ba879d3ed0208eb5e35addfa88e3 resource04216.gif +94f62fd7cf7be42a7b06c85ff4a07da1 resource04217.gif +bb6d9bcb34448a05efcdc9bd4e4e607a resource04218.gif +ecba2849066d6f220dc1047e15e202ae resource04219.gif +f2e9ba0cf5e8eed9e5b65198a8fab652 resource04220.gif +7c413a16a88d758e3ca6462aa882f818 resource04221.gif +55fccbc117d3588044632c4b90453858 resource04222.gif +963418c90988afeb1bded1db502337b2 resource04223.gif +e7819e124d7f1aa8559a990df60d2146 resource04224.gif +5b3929e2f89344820ab252c89ace94f1 resource04225.gif +f2f02966ff027519fbf5764c93ae5824 resource04226.gif +4fc40af530262eb583f77af83159d2a6 resource04227.gif +44978624a5666001798225ec67eef30a resource04228.gif +ea301a3b3531c8f822f42745fcb63c18 resource04229.gif +cfd540fcd3c85d6fd508861813b384dd resource04230.gif +ae565b1df5c52a6b36a8c2634468d310 resource04231.gif +a548509f71d84a03fe956fa568029ac8 resource04232.gif +17084ceefe7fd8da7d95012a3073faf7 resource04233.gif +12884841226a9bd63d4666d846f9f583 resource04234.gif +d61a85c9cf88e4add625820bc2a566e8 resource04235.gif +7b6578f1e7b5b1c7b57fc51d07cadcb8 resource04236.gif +4be03bc2aaf749d33c5c26d100e16175 resource04237.gif +915ab45971fc3247145e96899b0a24f9 resource04238.gif +860c5f2986d219f5399867c6415cbcfc resource04239.gif +1899d219b9fae032e25056a4fc6c94b3 resource04240.gif +a99dcb9cb3ab35b05b2532368f3be371 resource04241.gif +54ec70b23b0047da9ab448f50cc2cd64 resource04242.gif +3b9c3dd62f0217380360b6be53c98e22 resource04243.gif +865111edbb73aa83ec29e43d557f9747 resource04244.gif +ca687f71f75fa349208f3cc584190484 resource04245.gif +be7f771e1b21369f3b038aa347652d03 resource04246.gif +794e0c703a5f52717d0442f7cc8f031e resource04247.gif +af7e4dd44ad8b4f76d521eb8e36c0ed5 resource04248.gif +c3e84fd1a4f5d668ba0022b025faab2d resource04249.gif +0a0adb3ccbe6b068c583a6d6e312897c resource04250.gif +57a1a84e467a64234d6cd78ac07f23c6 resource04251.gif +d9566dad2e48b8245177e786c9eb2dbc resource04252.gif +2670538812145b6e8cfe07cd2dd012da resource04253.gif +20bccbed9b5f9728eec9f3439ee2827c resource04254.gif +5ef0092f3b2a6a0341bf289ecc43c484 resource04255.gif +a8f065510bbbcd07094e080c40d9de0e resource04256.gif +035db7e22e3f7c46f8be9fe0c4d9dad3 resource04257.gif +f2c1fdd42f1bfefbe5e3adb2317eb69a resource04258.gif +a023655e0ea189438fd7bcfd20eb741d resource04259.gif +fd699a39565f8f34d80fcce70b5e870b resource04260.gif +d807b2645a0bed5c1e586c184dbea846 resource04261.gif +e57a8a8c086847fd76a20f2d83855e5a resource04262.gif +e47435ebee81ca24be0f9f039510d02b resource04263.gif +1bd65dab09cc28596b3039f53886fe10 resource04264.gif +595c30c8440eeeeb624d162be6ac275d resource04265.gif +413a12d70ef37f8b66f6d72df590e324 resource04266.gif +7dafd5da8e9d55e8817c49121182e252 resource04267.gif +ff386f1766c4ad44fe16bf3ec0a12b2e resource04268.gif +be888562aff488b6f6e5157beefd8725 resource04269.gif +726c1505ac68dacfcfa414b79cef697c resource04270.gif +c9c2b605ac9fedbfecc68fa451133249 resource04271.gif +d961ace941ab4f9210b90d98d6e57e2b resource04272.gif +5703c638471828fa2bcaaafd7fa6abb8 resource04273.gif +597796238e5f241cacf3aea495bbafe3 resource04274.gif +d55258057ece337e7e7b4a4ad5a9202f resource04275.gif +4815feff221c396b3e4f88298754a795 resource04276.gif +0e2a619242d238f4385dc578912c05c8 resource04277.gif +ae3a14d13b50ec051b912a6df241f456 resource04278.gif +59d068a5620b3353819923bb3e556234 resource04279.gif +f24ae256939bc8ef9dc5d0c06effcf76 resource04280.gif +d6c549b6b5cde28955cb8bbff2b6cc67 resource04281.gif +b116f126a94b616a66fc5ddb89de41c8 resource04282.gif +d61f5ee86f578a8921c7a339c83beab4 resource04283.gif +ef0e05d336e8a9ef853afe87213e3834 resource04284.gif +59bf401651d0ff9dfba85d987dddac57 resource04285.gif +bf10a4f267f4ccd4cc1971b00427dbd3 resource04286.gif +24aa03b23d896eac43a3e7b972140ced resource04287.gif +2212661c3e509e0505248aa95db59e26 resource04288.gif +533bcd248f3040e13aebb3840eb6171c resource04289.gif +1960986506025e99cf02c163ca248704 resource04290.gif +6a794f7c0d09738b35fa6f9604354517 resource04291.gif +d30bb5dc35252d788624fa03ab47f6b4 resource04292.gif +0fefa906d118e4885d8c0af83c034654 resource04293.gif +e69ca91d663a98c5932f8a030ea139e2 resource04294.gif +b9e4ad1540887112bf0c39f2aa3adc78 resource04295.gif +14d847fd62e5bfc28a07327335079f90 resource04296.gif +396f16e6eaa8d6dd2614ce20d2fa83f1 resource04297.gif +27e447edace1b16707e815534f81e36c resource04298.gif +90464baf8c3841ce911cf738c9069499 resource04299.gif +fb0153cf12841379f4f4a7fa1bb32110 resource04300.gif +a55c02ba4147212c0c9c289299721395 resource04301.gif +1689609bd27adee3aa12cf35fe919abb resource04302.gif +b90079848c86436763855302a38d4c84 resource04303.gif +d8d45ba0856c0b9b9ddf1da2db21a8dc resource04304.gif +c48a4c684fd4db1f534284fa1f36deb1 resource04305.gif +0fa911d3d11abf2396cf9ba68c45ae5d resource04306.gif +ba233d175f4df8f446346f0a3005deed resource04307.gif +8358e5b33338c30a32163784628155de resource04308.gif +7df8dec905978c5f111f7411aa4534e6 resource04309.gif +b78cd449299cf4cb69adbe0c306b79bc resource04310.gif +c9828f4935074b5252e8b72f5dca40dc resource04311.gif +e4305c7220de7bc6fb5f8938ad14d2f1 resource04312.gif +796d900284dd575b65d581004b47bb2a resource04313.gif +2d9ff5bb7181fe4e3da2e983cc4942e7 resource04314.gif +4d2b8ab529884c5c1dab28bd68941dc0 resource04315.gif +8ac5ff18cdb96ec16f68a34a2dda1fdd resource04316.gif +7608f55524dadcbbad8e3a4382f9730e resource04317.gif +0aff1cbe6dac61cf9e54f3e719325507 resource04318.gif +30648b0abaafb54afe4cd99d4327df32 resource04319.gif +19c2515a4b0d50a1bacdea3a1f71233c resource04320.gif +4d173d864a711188ae4c2d7dd64adc65 resource04321.gif +c92f363331f219cec6334c2b093b91d4 resource04322.gif +73c4c57964fef86c1e9f72d9df554b7d resource04323.gif +0d1badba1827bb2845562d53e895c84a resource04324.gif +e99f9a33e17202fe6dee7514a0fd7979 resource04325.gif +10f8a6063ac8da23998dc4e1c40f22e4 resource04326.gif +7481d1ffe76a19e4367d87cd22d0e259 resource04327.gif +1170c67dde45496512872fba676ea1a6 resource04328.gif +e8e85f5d62b2ee47927b4aa10bdf3768 resource04329.gif +ff6aad89ebff602af5ed57361e1c43c4 resource04330.gif +a761b8d2d7ad09b698adecccf3a07b80 resource04331.gif +f6f739f29d20d0c7a4135619b3f1c334 resource04332.gif +12fcca31f2514cf8580c525604a51a8f resource04333.gif +c44215439026c7d9aa21b58b5fa60f72 resource04334.gif +b051232de621d3e389e84e1a3b1bb916 resource04335.gif +7b28390e3f081a1d5c8284f22039a240 resource04336.gif +0562c9a0aed24256ffaf159b6e0d3001 resource04337.gif +d64bbf40ba40ab65a4d0c6c8285f28be resource04338.gif +75da617fdad6cbcee95466439ff5f448 resource04339.gif +4116476577853019e3caeed05f964820 resource04340.gif +7f2142636be847097b99e86b07590af9 resource04341.gif +baae3e845f0242758f56af5442cd8c13 resource04342.gif +9a3811e81da27f9f88c038c195ecf573 resource04343.gif +b484e0099489cf5097c50df17eafb965 resource04344.gif +7657c9c84e3b065a732b829f75d7ef73 resource04345.gif +874645d9b2489c1ad870bdafbf0a99f4 resource04346.gif +f977f2910b57d883f7b1f392d93d5326 resource04347.gif +5219523bd17388e536a139d2bb117dec resource04348.gif +c86caf646e9330a46b33842d993d2abf resource04349.gif +7e96a3b79dd4d58324936b8bc8de9d16 resource04350.gif +e1686c8bfdb90acec732253cb0ec0507 resource04351.gif +5d8d1ef2a54c1cf69df10db82c6fb446 resource04352.gif +e975a09f8669817342816843f1f08aa5 resource04353.gif +38ac7682caf0109c990584012c7cb6af resource04354.gif +6c43c6c506b63146f939a60ad17828bf resource04355.gif +f64da7256f80514d2f407df09ca1cbf0 resource04356.gif +c70d2428a9b3aa8e9dbc88e0b68f34de resource04357.gif +cdfa49abf003e7fb0beea2d045343560 resource04358.gif +512575fc49a33f97e354f6813daaf9af resource04359.gif +a758447a08a1aa2a751d2b3f63c89215 resource04360.gif +be9de6df99a03459bd3cde89deae45f2 resource04361.gif +763c6920cede6637e508e1eccdc1f7a0 resource04362.gif +2ff939cbb57d0130a183a85d3120d7fd resource04363.gif +a3279f02590d5dcc51ef9ebbcb659445 resource04364.gif +c0d920c1f9eafd25dd192432a143d4f6 resource04365.gif +0cb644173abcd7d9188b5d7820c83278 resource04366.gif +8da3aacd98797e63e6ffa7df0ffdaa75 resource04367.gif +bd9c61639dee8f0e0c6e3ca708309be3 resource04368.gif +78f5e6330de15e205438ceb4281ece6f resource04369.gif +f29c00683252ff9d6d414b6eed2b841f resource04370.gif +f97760ca5bc8f9c081304cd53d45dcfd resource04371.gif +d9a4845efe6cd2936dc249a0f98c2a96 resource04372.gif +6c1012be2224e84c1935a614b14d0ea8 resource04373.gif +400db540102bc43e1c11c143271c4714 resource04374.gif +13a90d9ff61ffe32dd6cc89d5b6ee0b4 resource04375.gif +c2ffcbcccb6fa0ff3063dfa3ebcf73c8 resource04376.gif +52351fa89df3e4e5ce692ff3ec59c0c3 resource04377.gif +2a1649ce31fe847e559b9067cc83dc92 resource04378.gif +f686f191aa6edea8a1abb29c7dc52d25 resource04379.gif +4aa3c049bb042955b6d7dd5c89ca36c4 resource04380.gif +5fb4e19312c21c4866720713351d27b2 resource04381.gif +4f81464c01d6538117d35409355eecc2 resource04382.gif +9914bdc59072f8ad6fe1c7f5eb49606c resource04383.gif +827b1f502f9c2220d9c7e05c2f2e880d resource04384.gif +cd68a404436275820dc9de410de0f088 resource04385.gif +59f66e0bc7676b60cd08052b4faf554c resource04386.gif +b00b808d22b88ed2f11e06a0a479fc3f resource04387.gif +1b94f227ebb66ba25e006a302a794856 resource04388.gif +b94da755d02a8898f8351d63ec1c2f65 resource04389.gif +d288da44374dc4760b539d2f2d8fdfdf resource04390.gif +1c7c2c0373078d2efc190a0c0cbefbab resource04391.gif +4b9dcd4d61efd5ed1da6df6de154eb90 resource04392.gif +62816bcb27a41356ff5e335432d9cd7f resource04393.gif +3cfe4773af1e02485d6300c335dab25c resource04394.gif +591842b4b955aeddbf488bbadf1a5923 resource04395.gif +18c3cae9f1a18f4c390101742813fb6f resource04396.gif +0f28d3c67ebcad11d1e061d899640b06 resource04397.gif +e0170159ee670d843f140e7717c96247 resource04398.gif +a2cc2e8370fd9bb0fbb9b483cfb7b7ac resource04399.gif +f96eb34534174c503376f802bbfa831f resource04400.gif +8c859ebdd3eec7fb91ceba8bd66906b8 resource04401.gif +0044a8335f464377d7c6ebb450e4b677 resource04402.gif +449ff27098023122e340215abdbe4575 resource04403.gif +9d315358364488761954683b1008f4ea resource04404.gif +e562f75a7c1c7fff556145053b221332 resource04405.gif +87c7774414f7167a1aebdfd62223c35d resource04406.gif +9c8968dfa720c5af40eaa8e99acb51d9 resource04407.gif +2bd2476c28a97c060fa965532997cf35 resource04408.gif +0dd5b4e36abf40c939578c690c52118e resource04409.gif +6df6294cfddf1251e6b9747864e9c11a resource04410.gif +268202b303b101917b2fdecb740b4fef resource04411.gif +4c86b254361ee4d03fae9171fe4997f4 resource04412.gif +8855be1440d31ceae136aa3382e06a8c resource04413.gif +29be3e82db2e913a0322da4148818ab6 resource04414.gif +1272c7eb38c03dce7f2a8dc088fb5c61 resource04415.gif +70101784a06b52e5fb7507332f14d2df resource04416.gif +1464a19ab26a3d1774ddaed8f78ea6bc resource04417.gif +098463db5ef7d21d7de354b9dc212ddc resource04418.gif +4f50a48e647875c8ff8f3896a4e653b1 resource04419.gif +dc99f3e7281bf90701d05236d48a1068 resource04420.gif +b288740cbf34332a4405864c39243a2f resource04421.gif +136ffac2156a9e02ba36a39f9bbade85 resource04422.gif +523fb207e70be6abc60a23058f1ef544 resource04423.gif +2a65ecb137d30d2724e04e1e7f04821c resource04424.gif +3485ea02264d1e04465cfe58b71186b1 resource04425.gif +cd605c64199b2d9f020cf774ef849c48 resource04426.gif +30020443e20cbe5e821f53c1dc5a53f6 resource04427.gif +533d0d8337f5b57491bef24f6311ccfa resource04428.gif +9a35213ebe2108d860f7e8d6dc949a1f resource04429.gif +c54534a4bea9b4f6cf626b5ddf43b057 resource04430.gif +69b31883e58a5010303290d15fc75ab8 resource04431.gif +1500efc7517e8ff6ffba3a3f152eaae1 resource04432.gif +d533df9fe9fdf99918fe999f89b49ec5 resource04433.gif +1b72259174040e9e2e04d23ecc55a732 resource04434.gif +d5d96ed788505dee23fc22436fc7fefd resource04435.gif +a4032ecc2048bfd44b7d81487c131de4 resource04436.gif +7b939b32726c4758bb2d3af0ccd16ef6 resource04437.gif +8d8aa2c82b4a3d7fa350f1d2601559b8 resource04438.gif +900213c1fe6125c2028dd6ad7f72d4bd resource04439.gif +68aaaa2671f677c48306e485aaec59a0 resource04440.gif +e218d2da6f9ab7b26a7b7208eb0e535f resource04441.gif +2a3bae2e4b876afaf66f2d2b290c46ec resource04442.gif +c711825c5aee6b7ed4b7af886c945a89 resource04443.gif +ff740028f46a1f4821606d04083ee7f3 resource04444.gif +a2e56031e25abd2246b66a26b4c30410 resource04445.gif +b8f351757a587d343a16be51686a6bb8 resource04446.gif +3cda70c335553530355ab79f7878de1f resource04447.gif +0fa60cb1e74b4f09ede8884512c36990 resource04448.gif +20e06943a6a2c283c30ace29e061de46 resource04449.gif +cd7beb8158918f3fa2a2c9f0b83047c9 resource04450.gif +dfde8c426d9a09a21a5bca2c271917f7 resource04451.gif +973f3da4d33318533ac018fc69e4501d resource04452.gif +e3edd3f79eeb17d8e88536f96543661b resource04453.gif +dce3ab3b06cdc8a9303b61b5239e1f3e resource04454.gif +de8da635b86c5146b014754fc50182ee resource04455.gif +278837720c8380a78aeb2f3a1054ad6b resource04456.gif +20a1de0c8793d7ee9f07cbdc233b5efc resource04457.gif +7a017e79b8c3c5928847f010e86a4e28 resource04458.gif +1496d1da2ff89d872156fb39d88ee2f8 resource04459.gif +3822b1f4ae9c5d5ec8d18743a3c3fecd resource04460.gif +c85a7bad0973ea42b6351657e7e48cd4 resource04461.gif +4236a0480f7a2054c0f44151c1dfacc4 resource04462.gif +2bdeda811fdfe2fce2fa05ff78cbbc2b resource04463.gif +f1de041802dc89ea4fe4bb0eeedc0d87 resource04464.gif +daecec757b483ae6f556833b7790d4af resource04465.gif +7a4f89bd4bc0d6f130b74e44d8287952 resource04466.gif +01b7519066fec37c2484eca623f8648d resource04467.gif +cc2930237ffbec580e054c35457db877 resource04468.gif +c1ae1d1460e830f0ed54375dd4a44501 resource04469.gif +63d7b4c4ba6b9edb8e124caad47feab0 resource04470.gif +624bd28af644abc933bf1ef81264f621 resource04471.gif +9aa9be2f824690e1f5d9facaf2122059 resource04472.gif +99e8e2ee0e6845f4baa9bc0d24b70209 resource04473.gif +8c15dca41ff608b9b034d96f5bfe4d14 resource04474.gif +e66c2d666bfe383369fa17cce073d633 resource04475.gif +2d3a3a1ae321a86ed920ff6756b13c30 resource04476.gif +a37a322395d1a54827545d68a89c8e51 resource04477.gif +331ca657170498b3ea29f8a6000fe6a2 resource04478.gif +350c10a173689ba3edee15921b3e92d5 resource04479.gif +205d87420de3180859a144932301abd4 resource04480.gif +a79004741bfd8d42deeb5e237417bfd5 resource04481.gif +ed1f87bd3e533702f87e47046f7239f8 resource04482.gif +b72a02f39deac70644024cc58dcc1905 resource04483.gif +70a396968f2ec3a1e89f086d1bdd0399 resource04484.gif +ee682401b0e387b1e29e93dbdf759d6e resource04485.gif +2ad1da0575c19cf66469ec1c83f417ec resource04486.gif +bca4de66141d140da041eb8a699b863f resource04487.gif +8efa91278d08fb8ba479b82d3ab20fae resource04488.gif +bc8de1ec822e9ccdf48f49b57c869b9f resource04489.gif +05f0750f4ee9f648b62d86b0fe8ea42a resource04490.gif +af69a4a974fa5103346da2cf78167a5f resource04491.gif +cee667f99457383d0769be72024fff95 resource04492.gif +d512ea90d412221e4374d3c2301bbe60 resource04493.gif +67e124eb90d1543a93a0462e5f74ae3b resource04494.gif +3c48dc7407dcc7f7d80594aa3fdd9ed9 resource04495.gif +6eb9c4fffecdb097a995c1015c64e1f3 resource04496.gif +de1d6a63044b05e24768bf88a0471990 resource04497.gif +2a4d3579f9029efcc8e60c11eac4ce13 resource04498.gif +9e16944c05c9aa5ce1d35bfeea94b0fd resource04499.gif +85944e9192fbd86635c876538f9bfcbe resource04500.gif +d644d10c2ae313d16817cf9fa3569797 resource04501.gif +919fed9ff3040d7578390920de0f436d resource04502.gif +2d1790128bccd2fcc2db31933d906461 resource04503.gif +aa498c3df778ff4aae60a934c210a19c resource04504.gif +a196ee720e7789af0006e158d9ebbd05 resource04505.gif +0663e939d7651005403a83b4329b20b3 resource04506.gif +4cbf1d0134c78b9b2fd74388473bf7e2 resource04507.gif +2e6c0311e68991b682838e92ab438dc3 resource04508.gif +8aa153c355bd0a1ae04466537daca955 resource04509.gif +a2308dd46bdd099e37d52dd7ac14af14 resource04510.gif +37898f0a4198c749bca0d9fb6e88c5be resource04511.gif +2f045419e71332ad6ff15509725cc8af resource04512.gif +019a14f57a492ebba337361fff566f2a resource04513.gif +4eece9d1e65b34cb9b09387e3969c6cc resource04514.gif +5b457caeec407402804ee8e28579895b resource04515.gif +4df4695304dc9182a491ff43b64838e8 resource04516.gif +809dba2afb13ffa79733c47febab42f0 resource04517.gif +53ea38ffc8ac15d9305d5b33db8b7a2c resource04518.gif +4f588664cb11bef23884cd7c78cd730d resource04519.gif +323f266894968c89c61362215e3b4986 resource04520.gif +04532f23f42c001be7ccbd9249aee8bc resource04521.gif +79cda2843b21e69de99bafdc55ff472d resource04522.gif +48e944f36966cc72ccf9e8d418fd27bf resource04523.gif +5fde7b18f7448bcfbad3b76b24d77532 resource04524.gif +f0b579974b75184b4bc3e144a3540885 resource04525.gif +64ed54bebe89a757d2a765f678dc8a1a resource04526.gif +60325ab786c1220d9117e1a68f23a85d resource04527.gif +b8dbd62ae68f708bd2874e4543b3ace9 resource04528.gif +6f98b347c7ae71c15ffb71c36202abbe resource04529.gif +fdfdc599cd43e6cd6f7ff2e9f6df969b resource04530.gif +0ebb9e02a4aca00ac69fd77cc7b83c18 resource04531.gif +d6aa4ba45f2e29b03601b180a44fffb3 resource04532.gif +22d5cfd75051d11247f5c2f0633a2665 resource04533.gif +fc255ef6624949329cd515f3c55274b7 resource04534.gif +e5cfe244afb5e095930503e61862b2c4 resource04535.gif +d945ad70bd0933ff483cfee471d74527 resource04536.gif +cee9a21aa529a303e2c8d1d42f952d1d resource04537.gif +d4e8184dfe75dc243baea5ebfd4aeae4 resource04538.gif +4114040b73e90c78a824c238c8770fcc resource04539.gif +91bd97e20a5022bf1550b842be7293f3 resource04540.gif +54a5c1809eede7f629604b29a40b3632 resource04541.gif +e1a893e3fc9dfe1c91f93b4ee88e3f27 resource04542.gif +81db8630ba8e87a1675ef8182ff73f89 resource04543.gif +06545c07bf22c84da58fb75edb14a8e8 resource04544.gif +637305d4f7d007fc8d27952f0930e6e4 resource04545.gif +f643bc0d2f2ad88b5155345e3e4f4e99 resource04546.gif +a317c27a306cf918ecae04089ca872b8 resource04547.gif +dcfe02b406480a582cbcc6f8f54083b9 resource04548.gif +2fa8797afd78587b5accf3698c156d66 resource04549.gif +4f138e774354e2767cc92e1a7a4ad533 resource04550.gif +7880a101a37c18875d53f87031778c4b resource04551.gif +60bc8747db10d55cf52ef24148033483 resource04552.gif +43d01dbd6e9f748bd4aa0747f9e6d470 resource04553.gif +a25f2c3ca3d0dd4007887a718616a0ef resource04554.gif +c62ef6467bf49910aa9fc732d3ed6117 resource04555.gif +73901c7adb9a130f283080c605a2dd21 resource04556.gif +be3f476014ce8a7c5af570b3b079fdcb resource04557.gif +521990d3b0febd47ac0fe5a1aff70e5a resource04558.gif +43cbb049f4185bcd28358d1a039d8fc8 resource04559.gif +c20fcdabfedd55a850d713ee791a5447 resource04560.gif +28f53e37304ef5f0cce1ae1abf998303 resource04561.gif +f27ad1a8e4c53af7523b039fb23fb0a7 resource04562.gif +2dae55bc824ea2db4132abc4dae40a6a resource04563.gif +7ccecb5ad93a89861802bf28d6c3f663 resource04564.gif +0d301cd42e83b5b928fd587d6d1c31c2 resource04565.gif +98f58a2a08a512a5bc36b34a9d195342 resource04566.gif +15d906bfb90b45b1befd25e5b8f3d82d resource04567.gif +b39f528acf8481ef47d6b11efdfa0d91 resource04568.gif +723e08d2a0f301791aaaf5b04773c6d1 resource04569.gif +ad27736cf6806cbe2c86a2940bb5a20d resource04570.gif +d2eb39f4b61e8cc42baf66969d54b8d2 resource04571.gif +6e6bd8a2bfe8d36353a8253b766d740e resource04572.gif +2e6b3b0d624776cd17047e57d05de5d2 resource04573.gif +1d7a889eb93713018ac4ee56299886d0 resource04574.gif +471cfc2b996ef26fdc2047ab9caada3a resource04575.gif +6439e8bd33987b27cc1b18c78c3e9efc resource04576.gif +9dcab9c8551746f2f364a9627e8efce7 resource04577.gif +6402a2abae6f8c5e26afb63b8d3e76be resource04578.gif +b00a921f1817a64fd9d7c0f31573ef32 resource04579.gif +66d24aa8f5df7fa68f9358686b65a40c resource04580.gif +1a15372350e32bfa0a968b8d6c076f2e resource04581.gif +d4727c131a94d14da1df45d959f0627c resource04582.gif +246a63be8a2fd3b65bbb28827ec17787 resource04583.gif +ec0ff1398395255e59c53579110b8751 resource04584.gif +27606ccd48e7007e37ef7632373b03b7 resource04585.gif +c6d7e00fed4be5a9dfb4d5ef0f72abb3 resource04586.gif +9ce7370a73025a5c6762e55d6d348f56 resource04587.gif +330773f7c85f790fe5727f834c032b70 resource04588.gif +5660e29b77668a6c4dc7a0badbddebe7 resource04589.gif +0ffd626ee6af1e497239445cd74620a4 resource04590.gif +aaf49adad6e88d83309f27b7f846b274 resource04591.gif +b28e70fe7b4ea2520f753652fe17d7fd resource04592.gif +259cf4b5a5c1327a2d3eb1f5aaf88b0c resource04593.gif +ec60cfc909f6f93e18c28049035d6c91 resource04594.gif +72c7ada7dd9fc1019b8803321e1b7304 resource04595.gif +51cd50ede16e5327abcf44049efb47d9 resource04596.gif +95b7a4a784920aa4b6955e904cd3eade resource04597.gif +5113145b5e61b7c48143927987cfddd9 resource04598.gif +eb55784218cd0df6a904b6883f1e2011 resource04599.gif +438b3954473bb0a51730706b358cb008 resource04600.gif +bb22cfbbebc648707d8ded80e29d86d6 resource04601.gif +e98ceb3b9718eabbf36e0ee0e37184df resource04602.gif +7750033985743572b694a7ee8cf1c6a4 resource04603.gif +5e0c26b841daea46db57e2a8dd3e1db9 resource04604.gif +dad7293e96fd2bf07f1ac8237880e811 resource04605.gif +74203b54cda76a3bf3670dad8eddc646 resource04606.gif +8aeec44aae5378b29048e2b9e2adb7cf resource04607.gif +45f85ed0fd5bc1c756f3748306e81f57 resource04608.gif +a11460993960bd26cb11cc61964348e6 resource04609.gif +9a5a6f209ccfacb683b4814f77250c4b resource04610.gif +cc0a441deae6b8262728b6ebcf42d9c4 resource04611.gif +55407cd2bb5ad9ff2cdb15fc81b59cc0 resource04612.gif +cc255a233663908354d7c308b2109e2e resource04613.gif +1f374a92812d0c47f3851502e27ecf9d resource04614.gif +34679e60aa48170220814f7725cc315a resource04615.gif +4b48807108501a3cc05cc983cd3e0437 resource04616.gif +2950de6afbe3afbce19117b55cecd7af resource04617.gif +1718314fc7e25c3323cd0ff27a2550c1 resource04618.gif +9a190afe7c5ac855675f812cd114488f resource04619.gif +f35f1740e49363794cbf890a9609c4f6 resource04620.gif +17103f34f5e20de7192198f0f72b45e4 resource04621.gif +0a2447f524d966e1ddec9dbedb0e2aab resource04622.gif +992f401b8f341627f58a2e8aa053cba3 resource04623.gif +d66af031aa112d4cf3a3c4e39d297fc5 resource04624.gif +ebd6716e1beb9312a11f486ef372c68c resource04625.gif +70612ba08fc3e2d85a55c1c374bfbc73 resource04626.gif +ac05937b0885111253d0dc39c61189e4 resource04627.gif +b3137062d74c9e2c0717767c0828c887 resource04628.gif +ae7ddcb40a178afb5ceb03eb85669c7f resource04629.gif +b92cc9d0336135609370dbab57736e3e resource04630.gif +d2d29c57ef160ccd5630229382584a00 resource04631.gif +14c041efde56a7b16bc90fafd05c0908 resource04632.gif +0448e3151f357148de0d799c2ddc55e2 resource04633.gif +2a5da737f8498ee7298b3413122e3299 resource04634.gif +1348cf14a42c8a34f0d207a2818f85e7 resource04635.gif +01177e850b8dbd758a8f42c55a699e51 resource04636.gif +9e3211242cd814b278b676d4c9b72c8e resource04637.gif +249fa940aa29512cbb4d2e6d6db0b0c4 resource04638.gif +3c83ae2d2c9baa8fb138d0c7bc139b10 resource04639.gif +7d76efa2ffd8eacd56cda55817da3b11 resource04640.gif +49b0560de32cb496653ffbed5920129b resource04641.gif +2faab84cfea605762ed26ada63f01da1 resource04642.gif +89fcf393a658827242f160e89336939e resource04643.gif +ca85e941d5ad6a6ebc234fbe912284ea resource04644.gif +2bc5c2ed776c1f64c0f15ca14cd72276 resource04645.gif +979feba40329ba1216a9a0a54ab34695 resource04646.gif +67fcd227d58bd4f00d444c1e9c19bd02 resource04647.gif +877e73f1b4199da93311172d834fc8e4 resource04648.gif +e3483ca206c696d9e07bcb9a924254ef resource04649.gif +4e708fac6a8ad71a631f93dca306e526 resource04650.gif +e87bdc4b92ef69ffc40c21f4b5917b7c resource04651.gif +072f0538b879e95da59786298ba43399 resource04652.gif +692d8ae95345f4b1a8922514dcb0185d resource04653.gif +402913880fc667275e70618892de0a70 resource04654.gif +6d50427cc8b6e3c16d1c8b0913949e03 resource04655.gif +0d62470defd8bdd588eecb9464f82dd1 resource04656.gif +71e67024effdcf7e68a04117b6bec1db resource04657.gif +ab74a20a5624876370931afffdfeaa04 resource04658.gif +924c6e6c7f57b00d355a413b806ac4bc resource04659.gif +f907d287f1a3c7949fd32eb1df40afe3 resource04660.gif +727cd50a0d3f63426307b78f760bb38e resource04661.gif +e3a8d954cdc2971dd620ff653a3b4db5 resource04662.gif +0844c349db42de7429e70b467cc191d5 resource04663.gif +52589479d96914f94d2490c3bfd46f04 resource04664.gif +3390ba15122ff8f67bef946c56216957 resource04665.gif +f5f694c6ea0bd3c7238400b54a3ca9ca resource04666.gif +36b2c2244b3b818f48d71e24301c127b resource04667.gif +fe16ad8bb27cead481e70c1835c74e03 resource04668.gif +744ea644e667bb6182f886f7a02fede2 resource04669.gif +8d54d72282d16a9e37beed816c0949ff resource04670.gif +3ef9ec79d33a2f1e9f00d5b454adf083 resource04671.gif +3d78bc69d19b943263c181152647a1db resource04672.gif +ee0387ab701bd77fdebe86ed41e3e4f0 resource04673.gif +3988775922c4020887b12a66b1f31a41 resource04674.gif +f131da3ea4ac67f21b4cf0c0047e05cc resource04675.gif +ef937b8dfaa320176df73ae9cee55935 resource04676.gif +527933282da2a5f50e4d92e4905b376f resource04677.gif +90810e6b1c03fa9f45492fd901e01aa6 resource04678.gif +a5a5b5bd7ef9d0c40837fd112de9ab85 resource04679.gif +f90afd95d1ee29feb22860044e5b55e7 resource04680.gif +603f17b51e382a65660feb449ca74d3c resource04681.gif +b11e837050b943057c5e06d8ea0149e3 resource04682.gif +f62d713edcf678cd3dd804d578c17300 resource04683.gif +b0b0389745934e4cbe0ff28012589bd1 resource04684.gif +b0c813fba7338e6abc1b73fb55096c6f resource04685.gif +1ebc0be5ae81d0c178c383088da5ffa3 resource04686.gif +5a490749cd957d60d05d56dbb090f65f resource04687.gif +1c0ad3fe85be5f940d56edcae561d7ad resource04688.gif +d0a983dccb8335c284d4fbd68af8cbed resource04689.gif +b72a6bb4bd209d3804871a7112b54366 resource04690.gif +89f170d7f7ab583b891a6701665d3a13 resource04691.gif +e040960b4f04493fe75c73125b5c7412 resource04692.gif +e8f825c56fa800407ecc4157475e3af6 resource04693.gif +20fe16e5a1ffcd3037f9d7308f66c2c8 resource04694.gif +57eba79e66e5930ba1341d19f09491f9 resource04695.gif +e4231e733cfb5cb2603220b2760339ef resource04696.gif +df3d1a9e6239e3888d82541b2a003b7a resource04697.gif +a3d0f29c4e0b08a28490f063edf40b42 resource04698.gif +6eca796445d7139b9e2be362b2d87c7c resource04699.gif +97edf3bef9c3645a1b4f378078df00c8 resource04700.gif +655fd9425a6bc5b973eedb081c0d5e4b resource04701.gif +d2708c5d401b748369061cc583553dca resource04702.gif +08e4097732b82196423008ecf0ba3d0e resource04703.gif +e4eaa99a607c3b027c94bcab3d47370c resource04704.gif +78c7df7c223a2faf07df782678e20baf resource04705.gif +3b33fc8a324f61886fd9dc6e8d1e33bc resource04706.gif +8d39b6cce753b5fb5be51499c95e8788 resource04707.gif +cf9ddf01be4ac069bc21e3334513b981 resource04708.gif +e2ca479cf2071213eac5d94bed77f61d resource04709.gif +0680b53bdffa13e4a07739ceef4dfcc7 resource04710.gif +19131e35d979ce33403fc77c3a240817 resource04711.gif +451f021e90157e80733ab403e3839073 resource04712.gif +d43dd4c774f30d623e538c111706c694 resource04713.gif +13064cff0f9aee31913fab406266ac18 resource04714.gif +84fddecd16d394bd972ab54dcbe136ad resource04715.gif +4fe1ba2ec987d9c1b86f820fa0ab162b resource04716.gif +547d9ea9181e58f458b057d653e7291d resource04717.gif +ee29492358a3512a13acc4a37042951f resource04718.gif +003b97aa93b1ad8d3b40ac092c6e6998 resource04719.gif +b98f8c44f7863fc39d2da9e6948d512f resource04720.gif +190b1226eea7e34dafec6781b47a5b5e resource04721.gif +550f2a467650245eaa62a8a2a921c0af resource04722.gif +02aa02a08d5d9aa1a9cb70d3645b0fee resource04723.gif +6569b94db78ff10d15e0039883bdb884 resource04724.gif +5c3472d97a610e338ea6114d4eb3d5a1 resource04725.gif +487dd4defda6e8e5f16e43f0db00e4c7 resource04726.gif +8660f78d3dabdd697dce9201baf9774a resource04727.gif +1fb0b19d9cde561a1d61a9de8339a1d8 resource04728.gif +38fb82edd466dce93764929c31e7340d resource04729.gif +a305a8e317e608c2dbd89f622eb1c1a6 resource04730.gif +2d32bc8324a3e4687c159abfbf19c07c resource04731.gif +08561f4e8e3e242a34ac12b02b881150 resource04732.gif +33ed811dabff9d560ec6ffdc364d657c resource04733.gif +c20c7b2cbb1589802d1f347ab4170335 resource04734.gif +e7d8550b0eca64840ce7fa0350dedc11 resource04735.gif +9a155e3cfc73a643d81736f1e0856848 resource04736.gif +912955a72b8b89ac324d40ffb14fa406 resource04737.gif +a101461f93aef32dc7d58c6acc0fd709 resource04738.gif +bce2c04c8307b006ba290516e2bef4d7 resource04739.gif +42d1c5f745e2e947767ebba47b88a9fd resource04740.gif +7d63d3156f5aeb137fcd584ba169a05c resource04741.gif +846c8a8bad8581b536a1bf1c9c6acbd8 resource04742.gif +7f0a7a87955892c9070b5189b5e4cb91 resource04743.gif +7d753187d0885c0eca28eaebe506d52a resource04744.gif +8346f84a4d1c04b0c3be135ab52398dd resource04745.gif +dc7c00e32a6c3772286285b0c2e67a4a resource04746.gif +a528ac9af6cc97a3487a2e9e71de6517 resource04747.gif +e6521d89a2d526433afc1229e813c98a resource04748.gif +d22c4c8ff2b28ba08d7afaaff77e0dcc resource04749.gif +880a0481b2ee6ee7caaff86796c4574b resource04750.gif +1de4f9608a3ccaa78db9e6c429a97357 resource04751.gif +4b0e1c6bcf4c8d36c36e441004fc2174 resource04752.gif +d4ef7cf96f04c44354ccc961e70c5b4e resource04753.gif +f31ed6bbf04004b8bc213ed1786f24de resource04754.gif +302185ae2ae1985bcb21c61ed9bb948b resource04755.gif +05b3f9a3f594c8714b0e399a4e524f8d resource04756.gif +8ec01d3a47bc45a38667b1d81d13a700 resource04757.gif +5a5cec672d9594fa8672e81f4f0aa276 resource04758.gif +23543e91e4fcd343c8878895c72bec7a resource04759.gif +f00e4c48c30eddf56ddfbb7603690575 resource04760.gif +8aa3d3d55a9cc73d7cec69fea0b4b053 resource04761.gif +e3fc1716c20aaad6c86e2e05fd6f3d59 resource04762.gif +ce9eca40848628ae6098b4150b69b4ef resource04763.gif +ee18ad73b72678f8d396f6b4293231a4 resource04764.gif +19b71d7d7f9a84442059636440b81a52 resource04765.gif +7ea8ef25777232cf674c1f5c79db9f22 resource04766.gif +0bbd90016807dfa37eab61f01d86560e resource04767.gif +6cbe5ad37e4c664d71955a96601a7161 resource04768.gif +33196880d6386d24bdd0ef1c18ee15d6 resource04769.gif +f66b888b9d83e125938b18bd9b3e1629 resource04770.gif +50335b4eb46fb399de363b8b21ef2d1e resource04771.gif +c8a65d01fd66b2d152dc845daaa3eeff resource04772.gif +7d3f1e4f1c12723a99429298322b5779 resource04773.gif +4f17b5b6c0729e079b01b874488cba82 resource04774.gif +14ad8410baea8d49a1b5ca1511836883 resource04775.gif +1427bb2d5a2544a96353ee23510928d0 resource04776.gif +f920a5ab0730246aaff730b7bb117fc3 resource04777.gif +3142053c4ea9314ca9707d020bcbfd8f resource04778.gif +79ea478ba0657a443284f77606dcdade resource04779.gif +881eccc02a8fb9a26dbc51dd5e24ae75 resource04780.gif +6255d56ec6b8e4774d097e8f8be6a842 resource04781.gif +510562aa03d26478040cdf2c781ec1d7 resource04782.gif +4b0c0d98a3dc47735f10fde0ef2c7330 resource04783.gif +9eaf1b93bd8c247a96141ede19f286df resource04784.gif +b11f02f289c13d364429a95949430b2d resource04785.gif +9640bc58ec84db1de9ffabd012d9da54 resource04786.gif +8ffd713274eba6c1945aaeccb93f0aaa resource04787.gif +60b3f5d9798e01f022f7f292e7f5c5d9 resource04788.gif +1a243702174cb7b44fafa32284fd1063 resource04789.gif +4f9a367aef1d5fb11bf101a6f2c0941f resource04790.gif +ba46e0bebca009f0a27f3cfa7f396913 resource04791.gif +f97db49a0afbea7fdd63c4203015bb46 resource04792.gif +9413c839f9dabf9b5d7840821dfa6bb0 resource04793.gif +41cdafd4b5383aaab63d84ce8d0d61dd resource04794.gif +7cbc566dfbc56d068a042b2bd2bef25c resource04795.gif +aedf9374446d1c979180f02e243604c5 resource04796.gif +6992c0e14165ed30710223bb785a0c6e resource04797.gif +f556b38fb12913011fe58cdf84c786e2 resource04798.gif +0768180ac35719adee87989f16b91618 resource04799.gif +391adbac3cf90f5ef9d74e687f70d5f1 resource04800.gif +b1cfc19ff4235f21c5e2f89d14805bfb resource04801.gif +89daee1fb5ff255a09b6a25c0d53199c resource04802.gif +e26e6e6c0272b259fb07c200a9171af7 resource04803.gif +7c59402f432ef2a563ccad0db7230a07 resource04804.gif +8d709783549e44643a571c3a5b96656d resource04805.gif +59faad3b0772d41965b50ae1cef388db resource04806.gif +4262d536db0feaad95afccbddcb0ca14 resource04807.gif +50c865d0f7050b658e4e13198f008fb0 resource04808.gif +27e080df3e151b912c47fd5bf13f5424 resource04809.gif +78fd13572c28da34c08f1a7925738220 resource04810.gif +a07cf1d614dab5fa93b3cb45da701426 resource04811.gif +412f5b4791ba2c029997fd040cc51a8c resource04812.gif +254fcd73d6ec0451df1ac08c527b8d5e resource04813.gif +b08b3acb6438fba84d120aac0779aee5 resource04814.gif +15d7fc724bab51dec7145ed9c85bf6fb resource04815.gif +b1378cd9f41cc714c5beff3aea5af592 resource04816.gif +ecb6523804dc25c2ae8e32f0fea7318a resource04817.gif +170677044aa698635b578cb833af94cf resource04818.gif +45efbcbf9500052b73ad90cacfa08659 resource04819.gif +adadc670e224d4267c758c3132f9bf14 resource04820.gif +c548733b30e400043b36a7f777081244 resource04821.gif +fbea92bcfc9be96e19733e4ba21d02ca resource04822.gif +2f43b88fc04dc4f614d8457c33692d58 resource04823.gif +e3888481462050e000bc8b9cd87549c3 resource04824.gif +58772e83c7a81f42b57ee7858efb4071 resource04825.gif +c287bfabd42a6c2bc497cea5b6cc3a62 resource04826.gif +c566fe1a4a8d1b42f6d9ff141aebf36a resource04827.gif +96b110d72025625cfc00fe0721a88ea3 resource04828.gif +815acc4d76a107c2f378c2ecab9965a9 resource04829.gif +3e176220bc46f54242aa6be62da55f30 resource04830.gif +7b55acdb63a7ed6125d616ca1ff984e3 resource04831.gif +8f3144593c0ef1d69ca060d2bc8b336c resource04832.gif +cd939f5fe380ded383f56722c9ef255a resource04833.gif +8255d7e0dfb830c8c1c882673317f4d6 resource04834.gif +f4bf086a0ff2b5407578f11d09bf9973 resource04835.gif +f1cae7e1b91c235b4af0073cafc8e627 resource04836.gif +7e45022c1e88393c09c82d42f2e2acb7 resource04837.gif +f8c5740accda486f5bc9716b0d6c45e4 resource04838.gif +88d53d5c6492f8bf1d3b899dae07474b resource04839.gif +4d7f72f53230ff2295dc6d1327cc97c7 resource04840.gif +4544b84942962d5ed2b541bf31a829c8 resource04841.gif +e9777a3c0393f11b2acb0940005665e5 resource04842.gif +84cfaab8213d891f9580a688d1e62813 resource04843.gif +1f4bfd25f8ca9642d7e98bf43c3a8e96 resource04844.gif +43deefc0bf4585e8408556c2eb0af242 resource04845.gif +5917369d5480e58c67b4508c041adccb resource04846.gif +47218c4d04e9fa924ad0bfc1036aa8dc resource04847.gif +f13f725ba35a22655b03ea6aec1256c0 resource04848.gif +bbeea5d5cab683995de970a272de089d resource04849.gif +27d15538e1b8f4b4a5bef8fe2a102a1b resource04850.gif +00446dd10322ba9fb2de164f79c82db1 resource04851.gif +ba3713283d439b52e49e226872b0784b resource04852.gif +0181c8a3003b41c677f69c3a021a6c06 resource04853.gif +4648638c5b3ef73b89b84a52a9617424 resource04854.gif +651f4b4778528bb0815c92b7562fb7c4 resource04855.gif +1649ed0a5bbab64d57106148d3426594 resource04856.gif +fd97fdda621d195a9864946319af437f resource04857.gif +93da9fc8fe2d2824d0eaf1a6c86e2535 resource04858.gif +06a94a2e59210713660f577aaa7f0462 resource04859.gif +305e048c900a3c2b29094c637a7a3233 resource04860.gif +15d7fc724bab51dec7145ed9c85bf6fb resource04861.gif +b1378cd9f41cc714c5beff3aea5af592 resource04862.gif +3ba06b2494f4feb93805e1ebf6555c1d resource04863.gif +a30f550f29e656534b06659335de2a8e resource04864.gif +7967017324b350dbd81c2d63b6c95cd5 resource04865.gif +1cf55900335a0f7beead041d10e48b78 resource04866.gif +a142470f9e6f43716001f89c36d7d96a resource04867.gif +9447493f8bc1f05dd4ceb77267b7c2c7 resource04868.gif +ecc96baba66571d4427539105a904b2d resource04869.gif +206db7fbbae4918ee017ce73be478855 resource04870.gif +956619c96b9cf97c13a71fc36ac29996 resource04871.gif +22a553d8df33832ae4cb80dd9972ad4a resource04872.gif +a24aa1531cda711ea3e0c8fa35d66c8f resource04873.gif +bafc6fd62529220007844822b8c22356 resource04874.gif +226bd4be5c6840adeec53e5d07d3072f resource04875.gif +f131c6107ca7c897d9688bdb15b75cc8 resource04876.gif +ce3191b0ed931be8a4a881619deb5507 resource04877.gif +c39b8d5a814f95fa2b4141ca344b4aa2 resource04878.gif +c8c259b625ec49a64f5400d12b8c74ee resource04879.gif +433a4100aeb619bac1347bb437d59de3 resource04880.gif +4bbd42821d5ed928c5d6cd2444259e43 resource04881.gif +8e51a2ce46a0f327e8d897652a6d184d resource04882.gif +8e418948a9a48066f33b43a236a1af08 resource04883.gif +4fe89abebc10f6911dc6bc4727825f84 resource04884.gif +23b089cc600a594306c6c427c84f8ca5 resource04885.gif +81a253c63dd05cb4ab20191c6ec1cc57 resource04886.gif +45790d663b00b367deda75f48ff526c4 resource04887.gif +bf305e0e07db3df8fa75f1e77edd18b5 resource04888.gif +1a943b2012c9adf7a9bb4255144f58bd resource04889.gif +7cbdf8da05e4f33a0540091ca45409d0 resource04890.gif +39c1e0b87f1483cec4e6b9db41e1b6c3 resource04891.gif +e6bd6a50a50e0a6866ce02c48c223e9d resource04892.gif +fa593085e053b7c5496c2ce32b0e6a5f resource04893.gif +1f628e7b8bf24d9486bac25d83a6e227 resource04894.gif +d546365b3ea9a6c525d03a44f3ba2d4a resource04895.gif +4e84ac7002686d570ebbfcd3b00d0869 resource04896.gif +70543c9554951cb382277859ab5edeeb resource04897.gif +9eae4b84f5a22cc97ae952d96e3130cc resource04898.gif +5be26ec2fca36b9dfecd95d07715b429 resource04899.gif +d92e3d762f78c993e6f11ee257a8a75e resource04900.gif +353bb6073759a3b3c616319712951f27 resource04901.gif +573533e5cc81369bb83b5091fed28f16 resource04902.gif +697534fc0f127e4286445f3d9ea9df0c resource04903.gif +78570982a95eb8097b923032cdb4417a resource04904.gif +8fca5c9850bed70e65dee6fcf2f1119f resource04905.gif +07f8035a35a8f6f8430118a56d1444b8 resource04906.gif +a38dc00c8aba8587a65b347614b69a29 resource04907.gif +3b6d6045623d80372becf8a77402c9c1 resource04908.gif +51c3e57647cb6165a2ed7583e537e973 resource04909.gif +ce88a0bf0e5f5df5f81b47dbc2f4c008 resource04910.gif +d6549db2c8055792cc70a5c3892b4104 resource04911.gif +84c4b9482235ef0ad6264f18d87f89f8 resource04912.gif +8c2d3f26ad83a16882cad3d0e6880b30 resource04913.gif +a0d872598d74ff67d7cdfd2b4a3ed41d resource04914.gif +22bc08cfc2ff5418fd1a82891af894ed resource04915.gif +5902606b297490da8eb479128250757a resource04916.gif +6914b888326296d653670cd92955d9cd resource04917.gif +7399616d66065856697d9974a7f67367 resource04918.gif +cf0859c72b5b459ea5d94f3222bbf532 resource04919.gif +69887ef7919400f6859ec06857a16452 resource04920.gif +317fff02a2bee651fb7d79b4de0e8466 resource04921.gif +03238096d3fac95edfa57ffe603d6b0f resource04922.gif +489d50df6a0a3b34882b4084b4bfc929 resource04923.gif +42309674750f6ee828e8159af126dc5c resource04924.gif +f636fad3665b2a9e8bca8853c4af89ce resource04925.gif +c39da17850d069f169ccbc55760808f5 resource04926.gif +9dc6aeba34e7ee209f61d6287522dace resource04927.gif +db08ba8d682b5c060f39faf0cc3b3d48 resource04928.gif +00cf8aa77fde898dcef63c3e91b86b89 resource04929.gif +a3340df17bd83785aeee896b5e570930 resource04930.gif +fe5c66827576449e9b12f2337c7af058 resource04931.gif +f45bc6c741638fff2efc72642a597c01 resource04932.gif +09aa3a992b1fc818a3f808284688945b resource04933.gif +d60cce8e5d7c9cdc56670053c3a4a1fd resource04934.gif +448a47b67141c04e354d5bdd0c386f61 resource04935.gif +ac4c0311e33fae84ebfaf9dafa6dca55 resource04936.gif +c5774db7897c6438292eb75d064a79b1 resource04937.gif +8bae5c61b86b9b1efb96c8a02a3bfad0 resource04938.gif +fd9127d0362bbc5430049ea6e20fc3d0 resource04939.gif +e37d2581ca7e230e328b960c7261bbb3 resource04940.gif +1ede433d1860755060d2af86384f096f resource04941.gif +12c5e2db187bd29f7e819a22886eeda1 resource04942.gif +a7fa42391b92d72f57cca2b95c0dfede resource04943.gif +6c8c75ff11068ea9d4273d0db5332eeb resource04944.gif +227c96e8da83beb633f96b00cf5dc9b5 resource04945.gif +880219701479ee95946527c5179709a0 resource04946.gif +a07a458877bd4edd8468e3ef26d33eca resource04947.gif +d09a5957c015734b6682468c3c0a983e resource04948.gif +9fae7f88c1c323fc9436d562ef843382 resource04949.gif +2cc70e000e3d3d9fb0f235b343ce40a8 resource04950.gif +ff2fb233a8b54c66a9b32e37361d86bf resource04951.gif +049b64c16fa5b1409a3daa6333940cf6 resource04952.gif +2f54075db28b5249450d450f48f1ad9c resource04953.gif +66ad2035bd88a34585dee457e8fac316 resource04954.gif +9116ec22f74092f3c2e2b87b5e31f554 resource04955.gif +e06de512f9aff1fa4e5ff37bc6846a32 resource04956.gif +545662263b33ee705f04109b0dca68e1 resource04957.gif +14e504be65606e576dd87297ddcb5b42 resource04958.gif +1e6d0cc9e4600090fd1112601693bd38 resource04959.gif +ee5c3ff853503eb60fc4fe662419a575 resource04960.gif +f76be67408a36f5dc7ce890cf7da489e resource04961.gif +de6f22f4ef56824c6e4b2aa1231886b8 resource04962.gif +5bf8ac7c8922b8affdd185d1fbbde1ff resource04963.gif +c6f05dfdf615ba59ea815ea4ef504040 resource04964.gif +38108a1ce01c25718e362a5178b0d44a resource04965.gif +9916b20075e2a1e928a27a77d2d008be resource04966.gif +2d61cd749812a1a57906a244111b4d72 resource04967.gif +96738440d4c73fa0f8b29989d854d2ba resource04968.gif +cff0696c6239b6198a5832c3eb85b968 resource04969.gif +eb61a4e3a5231fe3bab19a19c117d26b resource04970.gif +bc9634c006db076ca5b55c91860e8da9 resource04971.gif +144338c589fa6da789783e187f54cbb5 resource04972.gif +738dc668ea55f2d7103442637c2fbafa resource04973.gif +6f84a5fbec5fb730b5acda53d07d5c97 resource04974.gif +1f1facabd816853834735bc746fb39a8 resource04975.gif +17ea6316f6784161dd25b207f2b59106 resource04976.gif +d59b91e873650f873498587c4ae9ef7b resource04977.gif +66bc94e928207d551bfa6af522c03bca resource04978.gif +b186e3cba571edcbd98186107335a0f3 resource04979.gif +0a39ae50ce331e6ac6700ac0425ce7e9 resource04980.gif +095a977328db7b0c500baa7dc72cd2c7 resource04981.gif +f51fd21dd295fd7a52d39142240a5017 resource04982.gif +9671d85cc6aa1d34fc8151bc146177ee resource04983.gif +8cb82dc40751da055202771c99f1be93 resource04984.gif +9fbc3f29041a54b87ff14d92758856cf resource04985.gif +4c25577237448ff4959f339bd66dc566 resource04986.gif +829a24ac3f628e46ce8af0ed26148707 resource04987.gif +745c8a6f100ba10e3b625cf4705b3227 resource04988.gif +1d4c8e638e877c8c08a100d52044e01e resource04989.gif +c91e7ff4b5f9708050e90217694256fa resource04990.gif +726bbce7d149ad309724a7e18eccd602 resource04991.gif +1ed12cdc7e94552bbec6b250bcb22149 resource04992.gif +1072324a5713966450e89b737dd5900c resource04993.gif +37ad1879c1989f954ec173902aa1d2ba resource04994.gif +3de17d8137224fc1a99a2d0353bc2b4b resource04995.gif +c737dffe139d050d2fc16844a23937b8 resource04996.gif +96c42181231e42385a138d8b3f2f84ab resource04997.gif +d8373328249065057dc861d8ced16aeb resource04998.gif +b4b5f904258738f034272b30e0e07809 resource04999.gif +3f19dd0ea7e835b5a63ca03d9b625ae7 resource05000.gif +15108a8604082724c1084753e9ab7364 resource05001.gif +687f7847ec18ab930629181631c6ffea resource05002.gif +670332ac87b4140932473d3389f45bf7 resource05003.gif +b860b535f5489e55d6bd87be16b0f559 resource05004.gif +f7e74c9264169677d055bc9fa6da641c resource05005.gif +f498989f87d2d3e0c40617ce5373e40b resource05006.gif +2ef60f3cbf45c824697ef560cad5ecd0 resource05007.gif +ae2565432cae4cf2846c22f380bbae8b resource05008.gif +1e768f2aeb5af4aadc0dddea3fb4227b resource05009.gif +6ee3073e0ff61a766213ab0ac92056d3 resource05010.gif +a7cff8c61d03c60ffed06f86d9c50077 resource05011.gif +edbbd80c7e3cf9cb228387538960b959 resource05012.gif +8d83133c088a09460b5567ed3ad47fcf resource05013.gif +ab261b1d6f68ada85c2bec89ba757f3b resource05014.gif +f3d95fd863da4544c57b39efa5db0cf8 resource05015.gif +b77c7cdef720981233b42ce50e0d4247 resource05016.gif +d2c03fb1f4f74dd0a58980b096b97a1e resource05017.gif +221cc8ad381a2e4b94709b3293884bcb resource05018.gif +36266adac155c418ce2fddab2778c692 resource05019.gif +93764b0cdb0493bb02bcbaee0cc97aa4 resource05020.gif +10a9a3bf73a1815289151e489026f108 resource05021.gif +ae137f39852bafae3107d17990c4bfde resource05022.gif +dec5a02fcbeebbf6d7802b71a7613167 resource05023.gif +b01ff521800e103663d30522f77b2ef5 resource05024.gif +4ec84e581109d8aa913a699d7e49fb5a resource05025.gif +3ad101d0128dc1d721ecd54cbe38888b resource05026.gif +5be92f5cd79b05c730b73328a48a2d9e resource05027.gif +aa41dd6c5a95b48b10bb291fec3c3e72 resource05028.gif +38d53b90dc3e30c7d71e50f26a3d04ca resource05029.gif +f504010f1c64235ed0e724559768ecc5 resource05030.gif +21dcd71ba343cda6717e91fcc567f6a8 resource05031.gif +7e3878db56658bd0df6b5b489f0683bd resource05032.gif +ffe31cc9e32b2fb37fc97f5dde8f340a resource05033.gif +5de452685aab3d8a0e1337425979ff7c resource05034.gif +da963f09489a68f7de1431ff1a754a08 resource05035.gif +fba4c20414e0473a4c50346c04a6d8a2 resource05036.gif +9df1ba275636adfe9265f4138960705a resource05037.gif +1bc61ac0ff8f2b05ef66fa018f9a9977 resource05038.gif +8de9dfcb64258c8ce941cb20babdcc2c resource05039.gif +1eb2a57168794283833edb2f5a084318 resource05040.gif +8d47e2ab1fcf641e83df2cf267700576 resource05041.gif +1e48f3fadf5e8075425162ca2bec0c9c resource05042.gif +020758c7e514a58bb801098c7ee37e10 resource05043.gif +28aa9eee70e9527d14c2a993d94ee86a resource05044.gif +a95719c563c1a71bc6029b6572795b12 resource05045.gif +f8f6de0b63956e07dd73bac9feb8951b resource05046.gif +332bf7c677215f4f52755593676e8b9b resource05047.gif +af31c37a876f604c0691885c8a020ea8 resource05048.gif +7f522abc7ea736f5947194cecbf8a746 resource05049.gif +288b28c4f96a7de0928971154d99db8d resource05050.gif +38bb92b3b2e2654856e35d326b1db536 resource05051.gif +94ca81ab33cbad3f01805a50ad947258 resource05052.gif +4bf3e30eae884e7a56b87ec0d98fc248 resource05053.gif +f766882e8b10b516e2ebca051518a8d5 resource05054.gif +093bfb1e54a5bd04cadf6f10e29d3341 resource05055.gif +89439ea17de513688b634c41985c546d resource05056.gif +3384bf683ec41de95ba7947f0d53a25d resource05057.gif +d31201510e15bf93f888ac4777c4cd8a resource05058.gif +35c43fc4add54ec591fdabfd5f93d9b1 resource05059.gif +07777bf7516182a6a88044bd4b4126ae resource05060.gif +9a1587c24158319e8033a77c95f2e84c resource05061.gif +a5ffcae1bc94f529e79f9bc3f00777e7 resource05062.gif +3784d608d5e9bd2eadaef8dcfcfde002 resource05063.gif +95b4df3271c82ced82c640da50944b09 resource05064.gif +0969bccb5ca89756c7b315fe7cf211c2 resource05065.gif +6a15395f3c4f89faa1a6d2ebe1e329e2 resource05066.gif +758502571ae0d3b90fb94639dc4b664f resource05067.gif +1204b14e0eaf1962027445a2277af0a1 resource05068.gif +1be9114ff9820cb0b681803c4cc50603 resource05069.gif +8592380cf32dc8a49c678e39a5eac151 resource05070.gif +b631c5ca0545ef038064b2c33e65e4a4 resource05071.gif +66bf9e73ef863f97ea06ccf5ba3b3484 resource05072.gif +dc30ef127ae473730b35f873c3f040d9 resource05073.gif +52dc766a7f5caa0da83b4b25dece1acd resource05074.gif +dfa61d5685e28a3f3a3b70d89851127c resource05075.gif +6d650ec07accb4ade4b040477bc5d465 resource05076.gif +a692921c36aad6fb61ffb700bf7ac8d1 resource05077.gif +3e6a22ba2799820907818dc706293c34 resource05078.gif +18ca226e6c9274cbf9b16ba7e18350fc resource05079.gif +f3420f1bc35fb5d50660c506128a848e resource05080.gif +28d8bf83de297870db926ffe318632f3 resource05081.gif +3f5cbb2a91915dc2b447672b44deb77e resource05082.gif +878d5ae0b3c877757a2a3b4f7315ee1e resource05083.gif +a6e6f269a427ab2521c9630da02a829a resource05084.gif +bec689184db8dbaf5a3c0c2380038fdd resource05085.gif +8fb22ada0b4a229b5a206d120a59b275 resource05086.gif +09c13168df411a6565392081bedad12d resource05087.gif +3510517e40499a0f10195f4a148081f9 resource05088.gif +07ce7fce6faf6cd0970bfecc0068c9d3 resource05089.gif +420c13dbbda1db4ea314e874051fd90b resource05090.gif +2fc981d9fc4cd5913f2035c89c663f92 resource05091.gif +19e19a9684c354974b34ceb8bac8b311 resource05092.gif +ba171d7c9a80b8d8e79445726e2b9369 resource05093.gif +6c2291965d5910e88f3bab05ae1c2071 resource05094.gif +7f99bb8fd835ce7a84748192ff76a4e4 resource05095.gif +b024705b872c3affb40323ba20a6bb08 resource05096.gif +aa8551fcb574345d41871db6e32794e5 resource05097.gif +a4a61acfa98958d08486d7e48a302047 resource05098.gif +b0dd5d77c211d45abb591a6483910e1c resource05099.gif +ec9b8dff4965af66fb88559ccf60df43 resource05100.gif +4a61c81a728431cc56353b40871345ba resource05101.gif +a512e4e38a39dae41ca2149812020812 resource05102.gif +b38da75c9ee2ce4bf62dc7405c8794a0 resource05103.gif +766b6c63f4fdf052ae32953d77cad177 resource05104.gif +194e7f8c8ea03d5892e09591995f4a38 resource05105.gif +197242fc0074a49e7683bd5f65e2f870 resource05106.gif +4de0f8d530c36df394f645eb20d30629 resource05107.gif +e67bb441c5c1f211d1f17677483e296d resource05108.gif +b76326cfb5ae4d86cf156c58ab0fd844 resource05109.gif +78bb2a619e29ccc1d24914f3dcafad1a resource05110.gif +32ec005967ab2e9c0447bbfeb75efdeb resource05111.gif +62e0a20ef93da1ead1726c386d6c7d29 resource05112.gif +dd8a8d37e052f3441e31e6af0826d1a9 resource05113.gif +9c855924f8ef66b18affddcb5d0e752e resource05114.gif +b3a09aba8085dd6765dce0a877d8f922 resource05115.gif +dabb3ed8c0abdfe160a338738c1342d6 resource05116.gif +b438c5dfda72663900023106d703acd4 resource05117.gif +07ab7272bc44587cfd8d77130643ab21 resource05118.gif +33612ba87b03f7aaec024d9dc6235224 resource05119.gif +1a82dfd4d61c0367a064ad012baba5f4 resource05120.gif +3dc9cb47cf73362de2da439cd807b3a6 resource05121.gif +8a6216a81fd32a060fd222d15a828058 resource05122.gif +b2c41249d1f6df9b43a2c028a71e151f resource05123.gif +4323c5941ccd3c53ed010fdae37b16ea resource05124.gif +d0f05c240e5f1cbb15985768ed9552f6 resource05125.gif +25e4649379fcafa459bbc663b02609f7 resource05126.gif +62ce181e8fcfe666c83b6aacc478796f resource05127.gif +2b81fee532447c14f82428f438c711cf resource05128.gif +4e0ac707fabcee8d4a5713d55b1326d7 resource05129.gif +82b89ac05fcbb26517041f8fe2d44677 resource05130.gif +bc4ea7167d9a8c5f14e17ab656e84664 resource05131.gif +0817cbd2e3b5b3778b4aadb43efd8235 resource05132.gif +a3feeefc80d9ecd7cf900c2a41384505 resource05133.gif +432a9ef16086f9bfa39a401a6dc0f3aa resource05134.gif +3723195b14872383949cd272a238203d resource05135.gif +a4be3085de9529b2532dea31b0f5da15 resource05136.gif +9dd0148642ba272bd03d2e58fdc79afc resource05137.gif +2b26f8fb3e6912b1dfaf0c1228bb2dcb resource05138.gif +787682650391ce7fe2bc70cb025c7a9c resource05139.gif +72074c7d0aab60a186160cc870674273 resource05140.gif +2242df9ae0f608616393132b4b5777c4 resource05141.gif +29f11404d141c940c5461efce676482a resource05142.gif +b1a83b12e6c327896b4d8f35ec19c356 resource05143.gif +107093ade5c4170dcf441660c24c1344 resource05144.gif +ccccbc1248270dc793a8c8a74d386006 resource05145.gif +a756d134714092a83ec4f718f5065f66 resource05146.gif +34c801b2f60dc0f75ab5e9a6a49d22e0 resource05147.gif +5a9cd2055a1b38cb503c4b2f545adfb2 resource05148.gif +469e02420978823c435efbe6e29ab3fc resource05149.gif +1e6c525ffcf9cdc1c3d5175f256849d3 resource05150.gif +14ebdb5a56e9992d6ab8f24c428747a4 resource05151.gif +f0aec57298eb3e947f940e2226d95ed5 resource05152.gif +9424842e1918bcf73e2507b462c8c6cc resource05153.gif +7dbc31c8587f50f158fe4927d9b000d6 resource05154.gif +da3a2fef5b53bbd0f7b11ea93d91c367 resource05155.gif +76a24f14d9b7b94453d0b1f6a51ed989 resource05156.gif +e1f2a75d792552c5b48f59407645137f resource05157.gif +b9e685914c96c628c32314185c9afc9a resource05158.gif +79245f976cda8f9a36986836df2cf1fe resource05159.gif +670281a8e761d1b548ba43b4254e3854 resource05160.gif +cecdddae5b60d7e82518ab1be96a8f09 resource05161.gif +1f669f14dc4a2a1f759f9734669c2f5d resource05162.gif +d695fdcab994ba300ff5a3d4e9982a90 resource05163.gif +9929501ecaef20bfaa42889d6bcc50db resource05164.gif +30d3273aa9e1e71d53775a65912a106e resource05165.gif +6f8e5d02993eb5680f4fc4aaf07093a1 resource05166.gif +b2e81325393c414fd8d6bd904b642ef8 resource05167.gif +c65f566b42f9d57a378ad9f1f0e8541c resource05168.gif +4234540fc9aa60acf0e243ba48bf34bf resource05169.gif +a245e1e371a3e5d06bcf3a9c0d8ba953 resource05170.gif +91fb6ec525123fbfb042b9eee9bb2361 resource05171.gif +b8857e546b6f794b513e3952c5395c15 resource05172.gif +c5306c32330053ccfea72c382466ba69 resource05173.gif +656dff1a4cbb5e7db7ec45440524e9a5 resource05174.gif +52027e41722d10e619393c4bcd47c24c resource05175.gif +e87e30dbae244bcf3141dc25cffb3ddd resource05176.gif +eba90301ad374721d1c51eb49c7312a5 resource05177.gif +2b66d9faf21f5056e3ac17b9879d4438 resource05178.gif +c4406c7ee3ffe772ef3b2e4ad742c1a8 resource05179.gif +f8e294ade7db073cd8f3cabd75c4743e resource05180.gif +1157c8f063a6d57d6bd088671cca306c resource05181.gif +7ab6dc2d2e828221fb76f1511536c9d5 resource05182.gif +fb2e702b65655fd8d156bc1393a2f1fd resource05183.gif +6410fa6e59b330856bcfd9afac8edc07 resource05184.gif +1a86b24d9ed0351d870e7359d0ecbcea resource05185.gif +b8324da33260cc238cee6e46a604bf6d resource05186.gif +d07ef790866b98e177d4411b4387069d resource05187.gif +bfe801c3366a32046c83ecec01fba905 resource05188.gif +6ad9a8c5baf895a28e31d47a03acaf8b resource05189.gif +1df2a8506714f8b2aeb6a82a94a8b070 resource05190.gif +cf93c176e4788c4931917baba6f10181 resource05191.gif +bdc86669bdc61cb5e62f7384212ab116 resource05192.gif +e14f7378265dca2c6291c7c204e8c69a resource05193.gif +79b722f991dbbf3c6b3178462fb2563d resource05194.gif +4bd861a886bc902d934e275bfe275b82 resource05195.gif +ad970d93e7b9699ec3a03e86159abb41 resource05196.gif +f9f43c2a0074f7b752cd2fcd38f7f69c resource05197.gif +f098df777b7fda522914a157da4c5715 resource05198.gif +ce04f6d8dfd4a0251289e76ecbd6d33e resource05199.gif +780218cb659a5c8ead9da6738b45d283 resource05200.gif +fbc244a2fd3e771853ca621714c378c0 resource05201.gif +4909ab600a355f3ee994826d8763873f resource05202.gif +413d2ff0c6cf0004a0d30a0517ad9aa2 resource05203.gif +299d82ea06db70d3b9e46b7a311f2541 resource05204.gif +4f9bbb7f4836a6757f1d3f443cad78d4 resource05205.gif +e14537189590d061414d943879f2a04f resource05206.gif +20c47d0c24d931ebfac6cc8f05f6bc8a resource05207.gif +092c69453c598aefdf8900ddb2d498e5 resource05208.gif +a385d91074d717b9231572668e0a696d resource05209.gif +33800cc25716516ba0ad4fec3862caca resource05210.gif +ce3ff9cb8792c8dfdade82bdf11a6f05 resource05211.gif +fef400c8ed83b88dd0aee13c086b9d4f resource05212.gif +2ccab64da952ef464b800ca3e9f598de resource05213.gif +d46c06b27cc7d3d6cd6ca4f5619b187f resource05214.gif +809e4b33f0edef65725c1e4f882c2849 resource05215.gif +4fb8a475d89d311e5ec747beda931f0f resource05216.gif +983ecad942253f719a138dee3751c546 resource05217.gif +b6f007005ffb2bd5de5411372b26156e resource05218.gif +0a98f096c92fa4f5657e3def2901380d resource05219.gif +7b9d28bfd79024a1481e75f5d9ff17e3 resource05220.gif +fc164297ecc34bbca793af46de27968e resource05221.gif +b03f785c3631926163291405c03c9202 resource05222.gif +76b95bf054e62759c7065697a2c025c0 resource05223.gif +e82744fd284cf77194db45daa70fa3ca resource05224.gif +17139448ba6b630e4b22c5f1dcd51a43 resource05225.gif +279b69fdb1e65f9ee70bd1d2e9b20cae resource05226.gif +e16a770dc54e12350964db74949ab522 resource05227.gif +0d029d32f457b3a654d28b50f67b633d resource05228.gif +56bc5382baa0dc1603561062a3a61cf5 resource05229.gif +92a2330f9cbbefb3e6c7b987e0a0b565 resource05230.gif +5ca39ed1005243a07cb0cc09b37a6b67 resource05231.gif +e1200b4ae2957400a87673dffcd692ad resource05232.gif +03de91b2c13f5492f7cb0eb6bc271884 resource05233.gif +2864ce7c3ce9b68cd9325b0991d8f993 resource05234.gif +edfe907b5e9c6761839c6be1ce0c0c70 resource05235.gif +97178b5d7b673f74a22e43737458d226 resource05236.gif +7fad3585937471cc849e8520baaf8d5d resource05237.gif +cdfb78c69f7a7d9997c72f9ad6c2e5c5 resource05238.gif +6fd1766d0bd3a588c9dcea5be66d0def resource05239.gif +9ee09b4d92c8d1442e31e3b9e79741a2 resource05240.gif +958bc1da0139c6b5c16a9c28464bccd4 resource05241.gif +685cab2968a0b985b4f969dc408a5285 resource05242.gif +eac4576d7f30ee8eedc3c1a25de1399d resource05243.gif +e64c5f7460d880f9ba0c92a314a3e570 resource05244.gif +6acb8b41a9fb442ab55606a058ebea18 resource05245.gif +2daab331334f743c309cb8587161a3c8 resource05246.gif +ef4818559b16430720b604f236b306ce resource05247.gif +01e2b65a6fbadee735c82b37c3f43769 resource05248.gif +c60a28275d7625fb69d12003fe97749e resource05249.gif +83bb7f55bb60aa689667cc2f62ac1ad0 resource05250.gif +4c708c0e21d7836b813a946970eb24ee resource05251.gif +fad32c90a35ba2c27b4edabefb948d79 resource05252.gif +4c89ef2f445d38a7e305c25e2724053c resource05253.gif +78cbfdc5a3b5e8228b302117488c2478 resource05254.gif +bd31f0f9c5d88bddc110ba17972011c1 resource05255.gif +39e2fb48129c87415532278cc4b5e002 resource05256.gif +348b5bca9425351a31c33fe4ce0b25df resource05257.gif +2d7e4eeb4d51513df7a98a268babe75a resource05258.gif +cb8e257dab1a7c3b061b1e2279063bfa resource05259.gif +0af51a79598831e651864ca4bfb875a4 resource05260.gif +57c612fcf0772a075365167009718a6b resource05261.gif +de52b61b4d882f38b2800b5bd9182350 resource05262.gif +139d09cddf93a31cb26629a40a2497d2 resource05263.gif +8625817ce34474fa92e48b02fb53d18d resource05264.gif +2032d4a25d88f6d3d0bb197fc374b366 resource05265.gif +afa05afe1fca90afe476809c025ffff2 resource05266.gif +455ae794d280a94fb0024535d6b1f850 resource05267.gif +47da95cd610d21d7af6ce46feb9178e4 resource05268.gif +33da0fdfff0fdcd2bdb9f79c42813042 resource05269.gif +29de882b1891fb231f29428412c57567 resource05270.gif +049c8950de85bb5733d7f85b07f3b5e2 resource05271.gif +3bb808b1ba06590909317cd9f1674bda resource05272.gif +9f99a56137be907e1a514aadf88eb5ba resource05273.gif +83eb52b10a5051adcecb50a9b63a09b9 resource05274.gif +4cdd91ee42d1a6ecdc12a7fcefd9ca92 resource05275.gif +4409b496417f39bdf5e0981ff576fe95 resource05276.gif +cf4d8fb40c27fa82c6a18688430e279b resource05277.gif +d33865bd71c4e2a274673f4569c9fb99 resource05278.gif +9ca096be7b266486f2bbc5a9a65459cc resource05279.gif +f413316bd2a559a0a91a2e193b364296 resource05280.gif +ca0c8a9f5d27d96ffc39259dc04b60bf resource05281.gif +13b2ff324469dbce1d5345e310a3c2e1 resource05282.gif +976428059da7dbe6230fe6a6c047f1ee resource05283.gif +d2f5b2d758cdd28732ab10d4c6f4757c resource05284.gif +a24b685d26678562cfc01aa05dbf0557 resource05285.gif +c94e4878db9b8018da0a249b59b4f6b5 resource05286.gif +1beabb9cf4607654eb322cef32cadf2e resource05287.gif +778f6186e29357a63e29d4502691e04b resource05288.gif +2b90b39c6496ff4cac65ea0f2ff7752d resource05289.gif +c43254141e5c90e62086073b77859e98 resource05290.gif +fbfe026486e20a9b2331bc2e1149676d resource05291.gif +c6287bc3f5d074382b8bbf55a031aef5 resource05292.gif +b79cdd992422913813b85e4187ca4b5e resource05293.gif +7b306e64c9b1080f82455f233ddb39a7 resource05294.gif +843fc01796a5aa8502721705f2acfe68 resource05295.gif +3624f6050598e7a09f80af7d628ac859 resource05296.gif +a2958bf6d000adbe68e2f6f4aaf4919e resource05297.gif +cb8d9144c19f13873f513e5183e15462 resource05298.gif +a901b116cd37be8df7224783001bd870 resource05299.gif +1078a260244d24a8c693d73d92932cf5 resource05300.gif +f65daa69b9126adb82074f9e8326ba03 resource05301.gif +cddf5b40d2f20a029f6aea67385c52f8 resource05302.gif +94af0505eba3096265311908a366c648 resource05303.gif +4bf4dbc8e424eb0ada5a225f447e4f64 resource05304.gif +b06ab71ad4b2e1737064779bd0e38a75 resource05305.gif +4e43690c3ddd9ca7c3ea4d766ca6e20d resource05306.gif +ce728916bcf5f7a0d16eb7fcc4db4d33 resource05307.gif +7ac15e505481279ad061b2aa76f61b7d resource05308.gif +b2ac4a3a60763c46958774acb85a35c3 resource05309.gif +43c42aa55b63bf54a6d3fef42f71295e resource05310.gif +0ad9462a03f7e6ef66046f641e8e7f5c resource05311.gif +94df7c97e8a01680c17a77807b204d3a resource05312.gif +1819653687ebc12d29131181faccc5e2 resource05313.gif +9519e9a604433109d6a9e89cb950f63a resource05314.gif +fef0931ed9ef146abeb3bad210f868c7 resource05315.gif +ec9ef4909e71e230088b6d2fea2f2b1f resource05316.gif +5d33a130dce9b3cfbbfebc24c56bcafc resource05317.gif +03981415e6e4b02b7bc9c0fdd42b5186 resource05318.gif +5f35b26cad5960493efe00f5c990f2a3 resource05319.gif +2bb1a08aae7fe4f5907b9032da811b8d resource05320.gif +0d8d369d8c06330344544d0da64e83b4 resource05321.gif +f59ebfe853b421421b882c814bdb2b1b resource05322.gif +8f1dd046cfa79ad25bc7a995ab01a537 resource05323.gif +8d63235fda7c60dc8628938a3eeed651 resource05324.gif +79c7a9db9e66be5f6e9e5b15ded3173c resource05325.gif +d22318d95866e3c4dc3680edbc5b05ae resource05326.gif +490017199b93337b3dd611dc20b28982 resource05327.gif +0810a1189df32aa1e6ad3a6857c73868 resource05328.gif +b0e35103972edf9cde5aa5ddbb54edad resource05329.gif +d0ab01a16bad1e717117e15e38e3d1ac resource05330.gif +71d0b1b4ed96255e3f51d56774625b27 resource05331.gif +48ecfaaca2f2a8010536eee4430cec6e resource05332.gif +b124fdd7ceb2594cc91435c1414e2985 resource05333.gif +a76d07b301af36e75384295978408cb1 resource05334.gif +8e363903031ebe478a98152af40e4b77 resource05335.gif +d7395c6c12a39de417a492ca8a77c5e0 resource05336.gif +941894f32a81a64749b13f0800e01aeb resource05337.gif +438c3734ef3b79d2229cd5327390ca7b resource05338.gif +72e8299adc507c1b370f88bc82e1847f resource05339.gif +3cfd88d7f07ee94ed9af097d2b500529 resource05340.gif +b2f5e5d44a741b98f51fb15967ba30e3 resource05341.gif +b93b6b19c96852376afadc23faa8a7bc resource05342.gif +903728bc93c8de803bd551e5e4cc2c10 resource05343.gif +d2fdb987f8efccab2f2b7658acf00f61 resource05344.gif +278b6ec698f5acea1e9ea19b62215381 resource05345.gif +f1818a0365e0d75f8ce2af9a818b4e0d resource05346.gif +fb1d09ecd805e300eac175989de8dddd resource05347.gif +bf8f70f9b4aa4d697e314c22508a246c resource05348.gif +70e927d8862e1d6564831c80e73677fd resource05349.gif +8b1ed8c5c1433cb828354802f1cbefc5 resource05350.gif +9691343adda9fb43bd06b7efb0c1634d resource05351.gif +81d7beeadc0380a706fda9528cfdc765 resource05352.gif +2c2c17344a663207b9ab9201543775b6 resource05353.gif +604bf38a99bd99aa9d2e03d2d03b4be9 resource05354.gif +8fab7ac80bff0538a7929ff10e27515c resource05355.gif +759ae7a9504810e6bfda9b0c5bc15ccc resource05356.gif +3913d65dd3be6a18a386568173e4b59f resource05357.gif +2e2e203495690f4964a9319d85b9639b resource05358.gif +2568cab107efc72ec66bfa4a081cbf24 resource05359.gif +21f16464284fbca93944661ea29d7afb resource05360.gif +4f2811b5db232cbec91051b5d80afaaa resource05361.gif +85c7c6e9c8c8812e4b937e53bc38842d resource05362.gif +c068a99e96ea524d3b3fdfceffc39d17 resource05363.gif +e4cd94c7f09a6be39ce78f75675a2a6c resource05364.gif +fe887d6a2bacb995b915cf753f3aa8b3 resource05365.gif +6864648fc605fba6fd3fdfcba8e8bc29 resource05366.gif +315d851f863f5301d42ad659d7cdab0d resource05367.gif +01ef8b07507e2b10d63a951151d550c1 resource05368.gif +d47f3c08817a9acbfb2e5f594f0b4b04 resource05369.gif +72b4b367fb7ea80a35143dc01c425df9 resource05370.gif +07308ac7d3f101069ab465394ebfc9c0 resource05371.gif +6c58ddb63e0e362dd8ada1753c850b6a resource05372.gif +2b750b4b34f7cf9106995c5495510957 resource05373.gif +04a5c80fab8116930b353c5dee389812 resource05374.gif +dec045fe5559026a8e1f3d1079847732 resource05375.gif +04e2ac598c569d073024462e9898919a resource05376.gif +623c487cad4708c2d046812fadbd9102 resource05377.gif +2e217212d270e841c3636be6449faee9 resource05378.gif +621ce3d6d215735acf742b32a4f1b177 resource05379.gif +a7e2ebb421150cc7e749842bd74c2f44 resource05380.gif +a243a1c08a00f57fca1fcfe9e1f73b75 resource05381.gif +b926b285a3199bc25dbe5769f40658ac resource05382.gif +462327276365dc8664daf14b86ecff2f resource05383.gif +8a2a44afd47a678214454d2baec895b3 resource05384.gif +4f7dc4aaa28c9441529372cc372c214a resource05385.gif +2e40a969dc20e9929981185a26b16bd6 resource05386.gif +84393e549c1092a3d0ef27d056cac89d resource05387.gif +9c2be637cd22eddb93b809498d0b1e18 resource05388.gif +75b30e048a3c24362ca6ca5286242a09 resource05389.gif +4b1b93294c6c429947a848ad7962e92e resource05390.gif +56a6c08ecec57a517c4e3c484caba7b0 resource05391.gif +37ad8adef3d850ffe5e1c18efa47425c resource05392.gif +19e988df499eab2c95f1659b8f192625 resource05393.gif +c979e1c0aa1d82cc0183420fd901fc5a resource05394.gif +468426aa554b6efcf840b25898c32d75 resource05395.gif +826f4d2a12aced15b30c6cb11afc96d3 resource05396.gif +98d26a630b58b367f4bc6c139476ce8e resource05397.gif +ad2254112faf6f85f7a65de609bc6efb resource05398.gif +1c3fabe9e0b2e6641e3c834d35de3c1c resource05399.gif +d3762f3c72eb7bf28b7c7b8712c05399 resource05400.gif +70c559d796fd3f25721845d9a6a2c426 resource05401.gif +95890d8df692861c2bf0731a5e042193 resource05402.gif +4af5174a45780a8d3c0e0a91948fe1c6 resource05403.gif +846d9cfd951d4f796744cf8ca34051a7 resource05404.gif +a27d19e519cb16b9359e9f5726213318 resource05405.gif +d4b705316b202c9425e505844a8bd80f resource05406.gif +4ae71e3fb695420a28747a7e72089e66 resource05407.gif +5b055e340ccb146fa1c124c42631a62d resource05408.gif +567df6f9c366521e87f7734eb13337f7 resource05409.gif +e5029ec0d5eafc4752871e178b502371 resource05410.gif +466f2709ad3da81c20938c5c44e354c6 resource05411.gif +4dbc82b3265724bd73afaa520420ccfb resource05412.gif +1c6e113427e3a54adb9afcfa34a2425f resource05413.gif +40a85df8fe2babfd53b83c01c82ebf36 resource05414.gif +88dcdcb024af41ed1902c2cb013de94f resource05415.gif +59bad9c99c23b1922281a5dad1e26152 resource05416.gif +e3ca5895aa3c92ef73b6bbbe13f8281a resource05417.gif +66727d672deef8dcbadcc45438e9fe99 resource05418.gif +a01ccbd0a920057aa10ea82bc3966528 resource05419.gif +9f1d4c8fc29f0b14ec4ca15aab2374fb resource05420.gif +82a38e8c0aca5b7ebc37fc391323ad4c resource05421.gif +17d89dceb18578352344e6684ae8b5d0 resource05422.gif +d7934127bdd7fd5ff3ac629d2ae1abae resource05423.gif +26d941a11d16de67f51f2c8c577265ac resource05424.gif +5af1e67fdee1644a53b4cf10bcae95fd resource05425.gif +23ff12657e3ac0ab61d6daaadd74de3f resource05426.gif +33a333a0eec6d9440e869ac98e09aab7 resource05427.gif +bdd541ce07d6a10a816cf1b0d5126f4f resource05428.gif +75193d84840dbacc03ab8eaa147736f3 resource05429.gif +009ae1ff445360032c57e95f40e4e8ec resource05430.gif +dd8da04b99f14bc00a160a5b20b3252c resource05431.gif +0ffdfd592cfd74c13e322ef12d2238ac resource05432.gif +dbf39cf2a079f3f6d960b42e31ac4024 resource05433.gif +ca47a61e31b66308c95e16447c8bf97d resource05434.gif +ea545c471a3137203a28acfb776e3420 resource05435.gif +64066462ef4e3037cc3e089686e42d3f resource05436.gif +7d113ebd20df5694cb3f03089bea1f27 resource05437.gif +145ccfbf1c990c0bc32acc0fb1f013a2 resource05438.gif +b3d66ffb5c251853272cac26f215189d resource05439.gif +79d70395a78bfd20fe998b6a312f7d22 resource05440.gif +af60b6f20e14e4814041faf851ead649 resource05441.gif +9046ba48434bf9ffb019578f1e06df8f resource05442.gif +b0f9ebdccdd371bb04b1a7cb74a4ac17 resource05443.gif +df4543df8ef2ff35cfe7e504278ba89c resource05444.gif +ace2d13b73010d425a479e488eefad15 resource05445.gif +6efd228110dcd5c8926620015c0e16c9 resource05446.gif +59c43b65f9530f737cbae2161d23cd65 resource05447.gif +fe62c370605a31431926c59ffe7ef162 resource05448.gif +c45538ee8d25a7d9729acd5732f85fae resource05449.gif +f1df23fd7e17c14dabc64a37f826c6eb resource05450.gif +e3a6a015b654578a5061bf71e5211dd0 resource05451.gif +f014adf3e9e355e0d7c90547ab058cd1 resource05452.gif +20eacc2a7f24101cd7d3df5892edbd52 resource05453.gif +2adcbae1bb2b80ad51c4b598af57812a resource05454.gif +74dc6baf694ef4c8bb618e99c60d39c4 resource05455.gif +574b713c12e9a13cfa8a1d72fd775ec3 resource05456.gif +6347e9fb7ee87406e01f718a92462dac resource05457.gif +20d1eb4698f4751d983cd75a2bf7ce7c resource05458.gif +2a2fcbae54177bb2be57be18882c459b resource05459.gif +fb884a461a42dfa7e80981ac97ecd6e3 resource05460.gif +a44ab5da043a330e4cd05a523bccb63e resource05461.gif +41de12c1610f562722f71d9ecca4ef01 resource05462.gif +57ede42e21ce6304f6ba69e16dbf8a82 resource05463.gif +67b9581ff4477705797a6bb351c8d5ff resource05464.gif +cd307a601402a1510ee60bb81a371f0b resource05465.gif +386838e799f0ed3df85525ce7c7b6ecf resource05466.gif +cad3f55315446d63a83f9e3cb1b70fcf resource05467.gif +362723f5c0e204b615e1a55ae21f700b resource05468.gif +dd7f485a4fea073d5cf9f33c8ecacccd resource05469.gif +999c907c82a812e4c3d3b14ce6de1656 resource05470.gif +f2fc88069a44d30d59b8816e0afd4fe0 resource05471.gif +6c8f4b9356d1568726a049833c932c90 resource05472.gif +5a69fd3c476df8997bd8f96518c035a1 resource05473.gif +e864b240e9cb156bd1b8a4be0c1ee88c resource05474.gif +6d2d6ff6ce1845f820d0a07a23c00f71 resource05475.gif +e66531ba6c5e268d728c2ef74fff0e6d resource05476.gif +54dd39b518c490e09d6c00106859371b resource05477.gif +23d53fe2797b76f5bbdb009a4999cb77 resource05478.gif +8567330e7aa3f532715b4ac4fde566a4 resource05479.gif +dbc440005600a4ce6aa21869ab494aa1 resource05480.gif +a93b359d51488f9f749a829004b72f34 resource05481.gif +aa47c4cfbed3e0bbd5f7153c7db042db resource05482.gif +e69c25d76da50610fedfc8513bfaa500 resource05483.gif +a41e52b458f90b6c48b62abd13e03a8d resource05484.gif +cf2393244b13dda1de2ad824606d8298 resource05485.gif +1029bc3c565ea4bb5383035a5c6d463b resource05486.gif +68025bdaef1caf81d3b8268bd05459f9 resource05487.gif +012afbdfade43cd3ae52245aebe5056b resource05488.gif +0261e9b5725ed0f3de22ef3f3c4b3e74 resource05489.gif +cf51929adca1aeb9304d5ea21d21bc55 resource05490.gif +db9416537269dff8a8d3e0defd7b0806 resource05491.gif +5f79c38c5eadb6a3c2f2f2715d6dfe14 resource05492.gif +8f80956985119dd4ab4188558e241696 resource05493.gif +23517e52b5c859a2429761962c7a546e resource05494.gif +a24c455697a5c2912c0da949c2816a3c resource05495.gif +749c6d2f34865fb71498b18fbb1ea387 resource05496.gif +f6ae0827444b9e5d5a1866ec5d71f33f resource05497.gif +0debc3b59379ef13f87d321a54ec45f4 resource05498.gif +3ead027b6e77a8b1c85ff0a7f84d4fd3 resource05499.gif +cfd1a6653e3c9e94f3a183e30e6a5ad1 resource05500.gif +d8e682c34b8fdcb2ff4b07c0bd53ce4b resource05501.gif +69b044b45e92bb7e53c669db7e70ece3 resource05502.gif +6f5ad5696c8d6ef94204ce2b3411b92b resource05503.gif +6cb7a788d49c29f2b41ba7ca534d4018 resource05504.gif +a4729ce6b9d905f1063a16057651cedd resource05505.gif +c03b931a9f22bf1f9f65b3127b73d884 resource05506.gif +afe9e66af85922cd0651aadd9b4f81dd resource05507.gif +80f3d741ee5ceeb8a3bbb98701a09bc1 resource05508.gif +976d5105eda5055b4e31e65195a99fcc resource05509.gif +3313c0d2d1063a784826cd61848a4c58 resource05510.gif +dcbbd23ef44b6afc24bf0471deee0bff resource05511.gif +f9ba3a6d164afc40810aa5fab6350b52 resource05512.gif +5ba079e8fb8f290f717b9fda991a2eb2 resource05513.gif +e8a962fbe6519a601205f8b6c03ece57 resource05514.gif +c18d35411a8a5b526ab64574b6a175e0 resource05515.gif +9add7583d9a174014e58d409bb6b9fab resource05516.gif +616feb675c75f701d58f528ae190e530 resource05517.gif +1041eb709692037c8594558a19f41a06 resource05518.gif +780df04d55b19492f536a4921d539873 resource05519.gif +a6e0dbd83ba105c17d38bb30c7e7ea06 resource05520.gif +152ec35f3b6313457b0898972eb05402 resource05521.gif +a37446e9c16fe015de23c9684029cc0b resource05522.gif +2116d8f3707474c898d431aaa67cfb65 resource05523.gif +3db90535522577f8bc1009792f4705c3 resource05524.gif +6e5fec0eb4390f85fa622925bceba6ef resource05525.gif +98fb5dd041e1ba223dec8a909d4f0ab1 resource05526.gif +e2156f6723b592b01c932e5edbbff856 resource05527.gif +faa0df6f3da80ef9e1fe60068f016f9d resource05528.gif +1f94c1892439a83ac5656d00f933ed7f resource05529.gif +c6adebd4a9799bedaca20a9c3e49b638 resource05530.gif +718872c7afc0ac972d1c1e112eef4787 resource05531.gif +0c3fdb814e29c80f5977d6fe12bcadc0 resource05532.gif +60dabc56a2df09332dc9f262477a3048 resource05533.gif +5c1c74d024446d438fa333a44677e7c3 resource05534.gif +95816bf6c26ab272c9f59ba004ee6b98 resource05535.gif +fb9a958f5ee32809b66b139470efb116 resource05536.gif +4b4058ce73db8cea5277d899c5249057 resource05537.gif +e7796ba4090ed69f64cb5075c817630d resource05538.gif +cfb3715bf4b1d8cf638c04fd74a54d7c resource05539.gif +80a767d24853ab303781a47bc4130a51 resource05540.gif +30e1eb2eef5122fdf45c903631e25ed9 resource05541.gif +01ec8a36be57991aabf9fff0f0dcf4bb resource05542.gif +56e257180f997e45c1fa2e4dcd7ebc19 resource05543.gif +f5e96d56501d871c5f9eea0ccd5ddbfe resource05544.gif +0d417c3d0815e1076e768cf84897fa16 resource05545.gif +001b0a5d251b042973ef118faf7bf4f2 resource05546.gif +c16a6bda2024ff262579e4631e339e85 resource05547.gif +91520551f38273d611c4cb55f2d14419 resource05548.gif +21e790ed977f5b97b05779d83386afdb resource05549.gif +e44b1d2fc1b5645026dd6e16d36b9418 resource05550.gif +3dfd75a84b473ffc04b0d7b1f99ac259 resource05551.gif +697197b4aa685dce5a20f36148f81555 resource05552.gif +9e56544335f13c42039c303e87ea970e resource05553.gif +fcd683c7aa1d6f1529c1e81770b626ac resource05554.gif +9d1478a0e66c78e400548865522ccb3d resource05555.gif +d8ea8d9c669048e61d8f7deb1579127c resource05556.gif +689f76965f8d55df145215cf8ab983d8 resource05557.gif +166d473497c9af52d20b5e0d03e189a3 resource05558.gif +e8b91dc0e452506476f97a28adebca1f resource05559.gif +4ecab543b9fb1545c3a792887263492f resource05560.gif +c30259eb8bff81a9e62244ac558ef265 resource05561.gif +e25737d811ff1aeca3fab9b40fbf48c9 resource05562.gif +75c20a9559364e1487c283e8d564cda3 resource05563.gif +17284ee083f890d355fd68b653c4397c resource05564.gif +4c8952e118d814e0f38b467fc7e6eef3 resource05565.gif +2e5f1554132890a581de3524bd3c5293 resource05566.gif +ba178a742cc8418862421f798fb867c5 resource05567.gif +914609be1e9f6df659628e02d5642bea resource05568.gif +c417a06f6595b7b9e4f6242b12a93e22 resource05569.gif +cc8bd27876dd6911785fe0495982811f resource05570.gif +5cdb559c8049621097b8b4497e9fab74 resource05571.gif +0999188ef3214e41db9e9e286e597916 resource05572.gif +c098d5dabfb5972b14b89fb7554bf529 resource05573.gif +d6b774c521da5342dfc6e81564bd6c87 resource05574.gif +2166c05e9a5eac5a1e19e664159f0951 resource05575.gif +3f0313257729d813bf6a7c87a3f71b89 resource05576.gif +346a6157154a17f3836150b1bd3800c5 resource05577.gif +6681300caea32a842a395b02df5d7b03 resource05578.gif +b059d1d3c2ede3c48ff269359273a30f resource05579.gif +b772b36a67ffdd48a1a758cfddfc0bb0 resource05580.gif +68933706b3eb9b04e40482542ca88340 resource05581.gif +2bf3b3a306eedff4ddf12042b3860bf6 resource05582.gif +80e48e53070b26e3b228ba972d1761a0 resource05583.gif +4d01c935665dcb768c0a38875768198a resource05584.gif +e88af479721af1b04ff6b2d19afabbb5 resource05585.gif +ffae046308367f82353afe6eba7748ad resource05586.gif +c1590bb53372d60f2e3371d62c415534 resource05587.gif +da421288e25ffc3b9a78ff457d38bd8d resource05588.gif +2b1a929892281832d9adb0b1f78d41de resource05589.gif +c40ad75c35265a0b174f0f160f9f7f00 resource05590.gif +b399fb19eda61c86d6b69f8b8b7bd5d4 resource05591.gif +7c0570ef3301e26b355e3e1460188879 resource05592.gif +0e977ea28ae3935b340516b65030ae75 resource05593.gif +652a772dcf1c9323751a398cfb9e088b resource05594.gif +cb89cbf8ecf7060f9ee795451d7a76e2 resource05595.gif +5a59f2bfd80850584854c45c581c9c86 resource05596.gif +37889aa3e1edd441b9c37f64376d3386 resource05597.gif +6f9eae0c2b8952a450188f7880e7a767 resource05598.gif +b09802408fb40517db9343a060496598 resource05599.gif +c4e8869931fb0927a98fc0c3e8e33905 resource05600.gif +93cc8313945c4bc78f44c0fda1e1049a resource05601.gif +235bc2268fd87a11606d2ac11f452fbf resource05602.gif +b106f448f0d5c31b82424f884e65fc07 resource05603.gif +3cb65e8b4022aed84e72ce97e2a37ce0 resource05604.gif +daf5902556d8befbf5f379579bdfb968 resource05605.gif +b12702d5974518fc4570e477c5f2f55c resource05606.gif +ef4f86ce3a362177cb75cca2d976384f resource05607.gif +33cb77b4cee249550d8fd3b8232ad2b3 resource05608.gif +5efa0af0223e2fac67cba2da58dad37d resource05609.gif +8746b76f13d76d500c8f021e49553601 resource05610.gif +ed8cf47c861c2aad3a990bc211496cca resource05611.gif +8737e767275b70b76d21ce47af78058c resource05612.gif +3fc9e40757c23edc974ebbe2d6843292 resource05613.gif +aa7424a14fc21c6456b16ad14ff7e51f resource05614.gif +8c2b26e9625b21d4dd88a71cb09194be resource05615.gif +11570b8bb48d1046933e4d8442f61e94 resource05616.gif +5ce75fc721b279d80f608c70415d8194 resource05617.gif +3b218fab90f1299f12321cf832859c29 resource05618.gif +72587156f3c5a345ef0311d0ed6f1e4a resource05619.gif +85c1bc0dce754368d3d779371778d429 resource05620.gif +1c12a29b69a1dce4bf53527ec62025b7 resource05621.gif +53882c12e7e832b6b1e3a144e751d3f2 resource05622.gif +327906f6b9500d61029075d4631c2964 resource05623.gif +e25e346cef1c20f0e7629b7eb597c737 resource05624.gif +32b719fa45a1a5cb737de73803ce157b resource05625.gif +83f08d893523158ea2f7a4b4a05c834e resource05626.gif +7179dd394644dc3fe8878eefc0b22487 resource05627.gif +20e67eab20e259f1b5d83d93079d21ff resource05628.gif +a3971774e98460f05ce980bb5d02b9b2 resource05629.gif +51a92b18ef5a865d1221c75075c5f6a6 resource05630.gif +1c6cb2d3e22c5813aa0f64af226161ac resource05631.gif +3e70af8a03521548629bf5be1ba9897f resource05632.gif +10d779c93537020b7a7cda4ba715a5f7 resource05633.gif +f5483c37b321fe0b529cb659dfbfada5 resource05634.gif +e3665f794ca38bfb6e2a450db4b33f6f resource05635.gif +a13c6f76e791e179660ca6fd0e59ae89 resource05636.gif +1523f2769b84b39db85a9123d26ef6cf resource05637.gif +6083cacbda070d75ffa5386c839d01ca resource05638.gif +56e5bfcb840abd44cb71e6fdb7841a4f resource05639.gif +f1f45ccfe6799453ec5f180d227484a4 resource05640.gif +65492d7cba2387fd52cc6883ade4b1f6 resource05641.gif +1702495b1792ef3b4ae382758e3aaf84 resource05642.gif +1414ab1691e741ca52067f346e558267 resource05643.gif +b4b41a95aff95be60675a412734deee3 resource05644.gif +007a305eabc3b5a252a82300b497ac61 resource05645.gif +6ea5bdd5b0006b8869ba7caa67f0cbb3 resource05646.gif +5fd81790cbaf9e6568b1c0989d811d20 resource05647.gif +96fdab47ec010e77daaea2fc100c5d28 resource05648.gif +519c3240e55852b28b7e509d717354f6 resource05649.gif +984cd642ae3173d04938a27430c51f5c resource05650.gif +50fd00927f4f446bef637f0e5abe6e92 resource05651.gif +4abcac69d5433d9fa0d8428a102f0834 resource05652.gif +04c959781cf1e952f883be789ba46f6a resource05653.gif +c98f792495bd52f5e28cf61123d1e240 resource05654.gif +290c13e2f6db2409040a300f5dd46354 resource05655.gif +cbe94d71876ba40dec828ca819099bbd resource05656.gif +4abf519c161c8cfa933881d3e8b4488d resource05657.gif +c80beba12f592ef9543d4eac51be564d resource05658.gif +1b74795a02b6f319988e21dbad966004 resource05659.gif +f2823ad30d39c14f633b3ea75a72d5c9 resource05660.gif +c8695f8420aaf9bae890a33886256ef5 resource05661.gif +f20e77944d1069a6489ad86224ad60d0 resource05662.gif +7d807a8eb9f30e2fa30b58e92d3507c8 resource05663.gif +8d6b8a014799b765d4f664906d6cea57 resource05664.gif +8cebe10cbe739c662d35ae4e0c1b0620 resource05665.gif +8cb6473d46b9991b0d92b80401c84d1a resource05666.gif +e4ba8a8dfbe3cf40db9bcb260b0ad1c4 resource05667.gif +f92f459cee204d9a24a6bf28d25d9376 resource05668.gif +56a50e63611dc68f51eaa6771d7c989d resource05669.gif +d129a2ce13b6ffd1bd315eaf7a3005ad resource05670.gif +8825a87b89c0727c1328ff10fd502d50 resource05671.gif +a88869823000f25b2a20f128b4f81f8b resource05672.gif +c5ec7894efb9b552364b6bef13847c7f resource05673.gif +b82a530c01141c3b4d8cf337a6022780 resource05674.gif +606565213cce29e3e1e5b80e93c5d353 resource05675.gif +3124dccb1276b6c7464fc538bcbb0a2d resource05676.gif +3f90121be86befa628f1c199410b8f07 resource05677.gif +1d743f627bddecbdfdbced0e65e7af56 resource05678.gif +78c56337649b3336801aee4884fda6cb resource05679.gif +3e01656403894a023c328e257bc3eff8 resource05680.gif +f66d3a9f9ef36fe67f67284e4f7488e5 resource05681.gif +241304e237c77f354d1655d65996c4c0 resource05682.gif +ff9013378fd06c868b28549e1d2241cd resource05683.gif +bd6c4a9f544e7c570998fb6546fda83c resource05684.gif +bcf98ede79380bd8605699fcc4247bdd resource05685.gif +a25b7936dd4ef6e4851d49841f0bf306 resource05686.gif +e982661257e4656e81ebf84979eb4d5b resource05687.gif +8ebae8ca6713ca17162f9504f5f364ff resource05688.gif +5b1a2707f13bda79c03c1c494618c7a5 resource05689.gif +9e7111134e37c81e2fc1aeb4fedd80dc resource05690.gif +8972f75f51c5764e8e876e1aed2e75a5 resource05691.gif +67f26a0dc4611defe419e04cc86a7f51 resource05692.gif +bad1a8e239187d431c0093bc4e322471 resource05693.gif +10e7771a40343e1ab9adda81c01bd7fc resource05694.gif +1b965a31365127ed6d3f959820195a19 resource05695.gif +3fa5391d658ea90053335b5533cfb0d0 resource05696.gif +bc7aee2629b4e5a1a93ae07dec9a0b3b resource05697.gif +3d7fe9f192ca58720425517689216f8c resource05698.gif +a1c1797a4b7f208afba73dca931cb673 resource05699.gif +71381f33e9d6007996ec1ac65c8603ce resource05700.gif +2ea1634c411b0f958dc2cdd28095fc57 resource05701.gif +1c6060070dabd07f1719e95f315a5360 resource05702.gif +c6216bb6bb09b4966f08cceb949408a8 resource05703.gif +bff1d16b390ee24630590909c4584af8 resource05704.gif +ce56e627770b2162a41653b28b70d56e resource05705.gif +5d663aa364951d1f2a23ac80c4b1db6b resource05706.gif +1c3ae7af15dd8f9a026dd074f42d5e8a resource05707.gif +321755dad32a7e34cc7e4c1d2e42c59c resource05708.gif +c01faca5d8d7bf4986f9aa2a8a20cbdd resource05709.gif +fcf3ceb3fb3f0525590d595de2cc2fd3 resource05710.gif +c497150af67ecefc2923ccee0595e3c9 resource05711.gif +c1bbd7371ff756f8c83a85031129b4e7 resource05712.gif +2a6bbcfe8271716db8202ff2a745c24f resource05713.gif +2871243338d8ef8e02ce1175a5d9b425 resource05714.gif +538c203367a99b815c5d9b68164d5e45 resource05715.gif +7171be35980e79361b623af4b1842387 resource05716.gif +b30fe08ce45cab8d9aa9388501687bfb resource05717.gif +c1dbe43e300f714840614bc61c57d6b1 resource05718.gif +07950eeccadf9d325527ebd565596b58 resource05719.gif +719e29a8741c6252d456cf02c27ef8d8 resource05720.gif +d4ee2c109a0226ac71ab15ddce3d5264 resource05721.gif +bca6dcc7eca32c4c5b1f8ae896885d60 resource05722.gif +9233d6eb8123aa965722bd5e122c5a41 resource05723.gif +adabb7eaa61f7d4a00b0036ef035cf34 resource05724.gif +2f146b3cc75faa2fb72df7951c5f6f7d resource05725.gif +fa142be728322f1bf798338cb5cf107f resource05726.gif +25699ca60be30c7a0d46e31cc896acf2 resource05727.gif +ec2079181e7e9df61bbc82001a6b6251 resource05728.gif +6b2566d0019bbe55d9bbe29a0afa18eb resource05729.gif +67aee6aa80e229198010ce2e2e777f7d resource05730.gif +51a2abe23faab087bf297d21a77e2413 resource05731.gif +29deba3b0bbbff801d102d799f186028 resource05732.gif +70d1d9efe27c0d745c74793dca607b94 resource05733.gif +c0d4bf2db20d3aa49559b6414be319b5 resource05734.gif +5c8b8c95fd6aeba715d3d7a86545a54d resource05735.gif +c42c9c976fe90e17ec60cc252dc5d679 resource05736.gif +606c411e1b1fc26999c2acd9c392fa8f resource05737.gif +ab68f3c5dc629f43bad3e4c31c4e3476 resource05738.gif +e0f1a21bd6e158b357556fbd53d8bef5 resource05739.gif +c5b6c85713d536cd730480a80143d6d1 resource05740.gif +ee0f79cc8b34cc8cf82a8da2a2a992c3 resource05741.gif +cd082729e64fd40b70210c9784991fb0 resource05742.gif +6caecfb430b5770cb2df82fb56857c39 resource05743.gif +d46288e2cccb15b1b3721c502455a1cd resource05744.gif +2c33b47302846e91dd6a723efe55f02d resource05745.gif +5335c062a15d75c67b310860bd6fefad resource05746.gif +193eb2444115b165bc8bfaf3a0d5032c resource05747.gif +917daf234fb06505d29a385a7368d233 resource05748.gif +3debd02c73c72cb56c074e2db0a33151 resource05749.gif +16376060a1e12fd540599cbbdc771a66 resource05750.gif +c17559ffd12017e6f2a6be64f0094368 resource05751.gif +5ca4bd8cd3dcbb41c38ff6dff7deb5f1 resource05752.gif +29a4756138b48e0828cc866d3cd6b49c resource05753.gif +751a28541a48247c561683ffc62d4420 resource05754.gif +0eeade80720d177f0022950dc8d85605 resource05755.gif +8583baf10073c8179fe2268864060cdd resource05756.gif +601d0e18d61d65d9c8af3515a3aaf54a resource05757.gif +d76c1d214dd1a1836144e7269f69fc64 resource05758.gif +8016f22718fc17ce8d68d845692c6ac2 resource05759.gif +3510f72366be4b6a576a82da485d936e resource05760.gif +44ff012a5487eb25066eb0b487f1145a resource05761.gif +c27b85a8da485050f0bdb92f5bfef356 resource05762.gif +55fb375580bab5ac2f13d4baecde1446 resource05763.gif +21159ffa101c5f4cb852064e24667512 resource05764.gif +a8073728d9e67d2c747cbdc5a588038b resource05765.gif +b164b2ed2ca943d12e8ae624de98a5a0 resource05766.gif +3752aafb6a052f1bd327ceef8dda6eb6 resource05767.gif +3db64c90f1e63f1cd8f914efab782fbf resource05768.gif +3b4fdfedc017bde2f90459aba38fc9f5 resource05769.gif +4e3b09ae2933333738b00f43d222f06e resource05770.gif +e252a73abfe3d585dd78570368527a9d resource05771.gif +4add8dedfabad66ec62ba901fe7109a3 resource05772.gif +78ef71d8dcdc344e77de2334c076da59 resource05773.gif +204b1c279b96ab9dd95433dce4c684d8 resource05774.gif +b61464759bf5a917c4c8e5bdf4f2dddc resource05775.gif +0656dff2bab90c4f0560cc7925be0c84 resource05776.gif +249259f97b383132c30c2f7f5b1d5cd8 resource05777.gif +79a51f85fd206748c4a1973f1fdef51c resource05778.gif +fc4ea901f86abcd0bfe1d22ecb2ad074 resource05779.gif +44d7491a2a31336160b3817e679fa51f resource05780.gif +e8d12a5f4015704efaceede8f38cc11a resource05781.gif +8d370da771e45488080d5a1635be6ef4 resource05782.gif +d01a005eecd9e3c3b5e7dd30b5cc7098 resource05783.gif +ef5b55bc0475dedca636943b1debc113 resource05784.gif +f22fb6dfb7de7d395d6ddab44536d470 resource05785.gif +46851e024817bc5b1e6ba280722dbe7a resource05786.gif +26921e26674e6f0e26508517a2c48f5d resource05787.gif +976af041fde248625130fb6385f21374 resource05788.gif +f427ed0f2f98f09be5f1c3f2af544501 resource05789.gif +1fdb3534ca216c5adad2cd8eae9b3bfd resource05790.gif +61b6bf000bb736eeff2f4a5df8b28405 resource05791.gif +4b69d8c6f2f78339bfc1c8ec25317bf0 resource05792.gif +5642a8c0329bda25fe373daab842985f resource05793.gif +4d381b2be5aab2300589d3180a50b24f resource05794.gif +dfe81d5cfde1be8ecd5d5265b3da5fb7 resource05795.gif +3f1c1f315c513e0c2030296a15caa6c3 resource05796.gif +3bd44ed82a3ea4dffe26574b2daabcce resource05797.gif +da27cf852e23bd51883568a1c467d6b1 resource05798.gif +69d5360df59eeeb4edd5b0c8997af49a resource05799.gif +7553384cf17ed6ef0ca2062e2658d169 resource05800.gif +6771e1090cf4c7bcf508bf0eb05354c0 resource05801.gif +3450425e1141623532b119ec3d32d0f4 resource05802.gif +d8e330b61a2322f6d375199e8bdd2088 resource05803.gif +decff895b660d750a86d60997eec2804 resource05804.gif +71e0aff79ba12cb3823f708e1004397e resource05805.gif +0f6c125918bc3962cfc9080fb2418a94 resource05806.gif +5feb0debbf30a5b28d57bdad8999909a resource05807.gif +27fe930f2b143ee45ab1fca2da9e646e resource05808.gif +c063d05370d2eff5f76f91613c9579d1 resource05809.gif +4cfab36e0e9d855dbce258fb5b2c5442 resource05810.gif +98b51e0f0ad7dc2b8ad940493c31e919 resource05811.gif +2f97b81b9af2e17493b48c2a1ffd3230 resource05812.gif +91ab26b69c78d69301737f1e319fdf5e resource05813.gif +2b7dcb3d25e9095831a36d8dc4b82083 resource05814.gif +a2a860625e453fcb513b6cbbdfd4fa11 resource05815.gif +e0d5212fa8f8a3fe7309cc61ee837b28 resource05816.gif +af74910737e8686554e6588060ae00dd resource05817.gif +ef60edd5cccbeeecb0793caa2447d47a resource05818.gif +fcafccab1a4ce40a5b2fc5ae74f718d9 resource05819.gif +fdf1870b3f9f9acb859f1f511c5f8f18 resource05820.gif +26c29496e49e56b8b035504486a5680f resource05821.gif +d7a7e0a509186502b1e1b241bd1233b2 resource05822.gif +802be6d0f6cd966217c395939e8b0d40 resource05823.gif +fed127357758c0483374b906eda9fd8d resource05824.gif +04a110566130ee68c7c8e7c997dd55d6 resource05825.gif +3d7fba56145fc99585f9c07fe0bd7f0b resource05826.gif +672ba662519e0193c57338978b7cd65d resource05827.gif +31c5008fcd5c203634edc9297154df42 resource05828.gif +eed46489659b41f196e29189d1d2466e resource05829.gif +b851ac6f801c479a515aa7012d9c0fea resource05830.gif +3192ca6374c7ad4762f477e827d36015 resource05831.gif +4bb904f6f5334c8740d74a910b720865 resource05832.gif +2518ac21aae82315635a8b0132b8d350 resource05833.gif +db622e38f3f5606d009493f1c5b08329 resource05834.gif +069d8886e6f3763ed2ff34f011ec2170 resource05835.gif +3941534ce0e7f76d5763b09ecffea537 resource05836.gif +d6a7cbd79b6c2253011681c9bc400e03 resource05837.gif +d949c6df2f53c8acdd9b2497709852b9 resource05838.gif +c4928456ba2a0feecf47522e86ea408e resource05839.gif +1421b082ea76107894ab67033fe4af92 resource05840.gif +900149e5f65e0ac459e8bb20cdecade7 resource05841.gif +f5c7ebc629d9beaa1136850405e25648 resource05842.gif +6e8811c27389c46b9b573a910246c7b2 resource05843.gif +db7e33add7e682afc63f6e9e31639827 resource05844.gif +5c2e8c8fb6f114f8c9e777d8e378a5dc resource05845.gif +2e5df3e73f0c6d6994fe23458a6f6416 resource05846.gif +74c185f899a0db2ab7793c7a1b211cea resource05847.gif +f9e5633c3aec5c9d1ade8a846b009eb5 resource05848.gif +6f00a7f33490576b114b090418314124 resource05849.gif +031cb3f0f99afcc6a652f702bc9d5c09 resource05850.gif +efcfae3947371dd8c75eb2b1f743661b resource05851.gif +91cc5ac1c3d246576d7d422ed566c051 resource05852.gif +5dfd312764baa25a74bc3d3fc5787b77 resource05853.gif +37d85a0fc1d2b8edb294ecace86d8ff0 resource05854.gif +409bcef1c28b19f8160d315a50123521 resource05855.gif +4e001fbf388f1871ac880cdf98f25bf7 resource05856.gif +e27d3910c2cbca058df0a01ad232c37d resource05857.gif +a3d6160713c690b0d10d04d98469dd7a resource05858.gif +49f4ea30ad582e9860c0ea36cda58c5f resource05859.gif +16a6da3fea4e1a06858f691163216077 resource05860.gif +3309c9bdad0d02afa23cfb74a91c95b5 resource05861.gif +02541aacb8024a1096381f7e15416bed resource05862.gif +6e8553f9b3e733c594f56712f842d1b1 resource05863.gif +1daf06c9d8b9c617a1fffb5bb7d1a137 resource05864.gif +d707ff332c016d7a6fb2d9ed9758f3b9 resource05865.gif +048a90d137dc2300926eb7ced4770158 resource05866.gif +17d6f6e2c4e2b9c236de31a4aa19eeba resource05867.gif +069dec3ab2c7abb4e96c49672c4ed23d resource05868.gif +7b0714ca51a3bc237b52f68f6684a845 resource05869.gif +1f565021513d7cc7639b562ed7bf86a2 resource05870.gif +0aaaa5cc343fb4d524584da656dafc22 resource05871.gif +981a022e7efce2f3200cf923e9576c02 resource05872.gif +9edcc99553fae62a40e4ca09dadb3e42 resource05873.gif +b0ec99a86223bab8ffe4ab54408ed987 resource05874.gif +3fb8e0b5cdb9ae9ccf774da9f3cf9263 resource05875.gif +8970c549e4ea2e2a37732ce7413b5e5e resource05876.gif +1145e86096849c612b522426021e280c resource05877.gif +5f1cc51bc8532b1dba0de2e7bbaa90aa resource05878.gif +a5a972e12eb5c1433433c3ee7d3dc9fc resource05879.gif +dbdb3f1cacd4655a77bbed7a5d9aee68 resource05880.gif +35268982a78f2e873e8e088045f54a79 resource05881.gif +f597bd5c2b2255643e7e8a6c410130a7 resource05882.gif +b6a272f27012886ac783341411475691 resource05883.gif +57c9cbd9158a2de89a613a8bbfae10b9 resource05884.gif +451dea98250413329010dec2eb877b6f resource05885.gif +62d80919580e99f33b5e45906d5a4272 resource05886.gif +4a8d8843099de677a9e0955de705b202 resource05887.gif +49cf16815ee996ff478e149520a8070c resource05888.gif +e50870304d94eb141cb05aeb9d1807ac resource05889.gif +fe5016f58c20b458fad5ab7483e9836b resource05890.gif +e6e6e1705327d5149699049f14743f49 resource05891.gif +408473d7320a659410521caeab7b874a resource05892.gif +8515a8475ae165e66e18d560a02d1258 resource05893.gif +d8b61ada8cd5b63d87c7b7646ccb31a8 resource05894.gif +71fae271e463e82156f582aa2b44ec48 resource05895.gif +dba552efbb0c0939878a18049a0a7896 resource05896.gif +e86fb007728349c7b5180bee94a3fb69 resource05897.gif +38d36643fcf4785de8a0923f39a866bb resource05898.gif +db40656a77c9815cb8afa956d46b69ca resource05899.gif +9a538e062d7506460b457a50d37ca56f resource05900.gif +6ef9a614aff3528634671d34175b5334 resource05901.gif +81f4c27b0e4316f79f9bd9bff28b0bfb resource05902.gif +2590a85f72cfadfa28ee8864296098aa resource05903.gif +e54cbebcd4b404503cf0a80e583f175a resource05904.gif +56e2e5767b7c6bed5a0548aeaa074198 resource05905.gif +cfa744aea5e3fcb5e157b975664dec1b resource05906.gif +051cf6fe79b7d4232d52ec477651981e resource05907.gif +c4ddc68337ff72934914de676d121fb6 resource05908.gif +b107ae58b1854e51b30013e8250063b2 resource05909.gif +9a1575ba631332d5695b1a3cf427777c resource05910.gif +f08d7c1087b3e2ce63d784c0bb13eaf9 resource05911.gif +a3bb69b281d39a6125631faddcf01d68 resource05912.gif +8021e593785fd6c98008d703c96b3336 resource05913.gif +ba93f8c4a593e61e5d4a15d06036d2a1 resource05914.gif +d074fef21dd982cd491facb024689f52 resource05915.gif +27f623cc5f37073840ce92e603b20909 resource05916.gif +3915d202440468a89c202e74cd2b4723 resource05917.gif +4d83c60749fb99f19afee1c03c5245a3 resource05918.gif +eb101c8931deb5454f07993d67b62618 resource05919.gif +69718e25a23a4a212cdb9e1ffa5c0d0b resource05920.gif +cb77b25a172fef657aa4a0da25a587ce resource05921.gif +c23c5e49725c36edff819b5dad7fa720 resource05922.gif +7f4e68d868eb4e2f3127f86cac28bcdd resource05923.gif +4c475adfecc745ecc7425ed49e0d9490 resource05924.gif +33582dfed3d597377d4e45901eb31c33 resource05925.gif +2576e4edeca13f6406da4b188681b178 resource05926.gif +21b0050fe9df55bb1fbafe2393473e6b resource05927.gif +f399f7050343a9c4d063062b3a448c2e resource05928.gif +8c4080d9691aec752940931fce40447e resource05929.gif +0d10d7ccda082dfd5584061e7f1da28f resource05930.gif +e996b5f1e30f524649de509baa07b4ea resource05931.gif +e540a0484d4d1d8d0b91c02ecfec6e9e resource05932.gif +c43083c98fb846e7832f15b619670230 resource05933.gif +6d9d5bc1d86d2e7569e30fa74db8ab5a resource05934.gif +ad1398abf6724ee4854f5a9e3a5a125f resource05935.gif +f456ccc9cd2db0df1a8f545f6e9b0824 resource05936.gif +99486de5cd6b8cb1355f3a0bec360278 resource05937.gif +4c72a4832e39e2c80a2e046e1cef20d0 resource05938.gif +b4d757f071d9da56f70facbcdefd07d1 resource05939.gif +8a73e1669fe1d62983e9e78e9898d239 resource05940.gif +6eaf7e585d596e14fe800c193db74b7f resource05941.gif +d18dc1c3ade47cb0af7d8ef8e1536a49 resource05942.gif +66848ddd2d0c3b07bbbddf9142b82cc4 resource05943.gif +5ca63f8f533975ea74ce6e71c8834e73 resource05944.gif +2c2621028a7db7548e91c27a9135bb3b resource05945.gif +34f64e4d31662a7177e94f9732c80144 resource05946.gif +7d715e077ac5cb0c9e4bfe4d58989509 resource05947.gif +3526ca0951d1ca6ef20126fe96cc1ef9 resource05948.gif +fa02b2b849691f24d29567dd5db66897 resource05949.gif +b9102188da02b60e0446c7fcfd619ef6 resource05950.gif +aab62e8b6c0f0b2269a64d8670f55fc3 resource05951.gif +15c58227037e4856d08c9cd4dce8586e resource05952.gif +5528ee1ec93c42ea3318af3ef9b94129 resource05953.gif +cfa7ed92fc64d8a32d65e6e50d9622c3 resource05954.gif +39fdacb4609a5d7eb507741d61451029 resource05955.gif +488e9c9bb83f0e2b1c4ef533ec243763 resource05956.gif +e71db1f8bcbb7fa4e1d66d0489209b06 resource05957.gif +4d9702c368569471d9ff4a24334b2e72 resource05958.gif +39f6b9615382fde7887b6248282e2e0e resource05959.gif +d21f7b150b29c8a6576d7ff9cf31f46e resource05960.gif +369560613bd4511b159fa3ec0f77e6a8 resource05961.gif +0cd3a8949e640971fab431e370ed4d2d resource05962.gif +4f33f728c58caa306bcc64a76915992d resource05963.gif +5c5f189be3542ae907697f3a03a898bf resource05964.gif +af29626d0ba6fb03f6d8556d96ba8165 resource05965.gif +7776ecaef28e81e98dbe4cc018228014 resource05966.gif +61f0c0158ee9e7d1178eb495253eba49 resource05967.gif +a9dbd3f67ea5341978d5730bdb2130c5 resource05968.gif +f816cf81e9d33193d0b3d45b0529132a resource05969.gif +0068a117d5a97385bf7c0a2aef4720a8 resource05970.gif +e07c66924d47d49623312973e9be8d44 resource05971.gif +79b8c1970545ebdb4fcf9bb8cd34cc8f resource05972.gif +68346e354accc97e291d2ccc04101f51 resource05973.gif +d9cb3abdd2aeb279b75718fa47959580 resource05974.gif +d91bc48aee826d2fd4040fd926a93af0 resource05975.gif +06b3599dab925a070075839d513302d5 resource05976.gif +61ed6ebb92cd27e35da26e07fc8fee24 resource05977.gif +dd90e001db2bc6ff292c0501dbe9292f resource05978.gif +2b4a244754dfd4a1c0d4f88560cfbc5b resource05979.gif +a16f44bf08d06cf408936036f5f27774 resource05980.gif +f555344f909c557f90682f96b8339a65 resource05981.gif +e6ec461c0d469673647898f7f5d5ff4a resource05982.gif +4d8a06792626375cc3fd1dda5daee0b8 resource05983.gif +fa4d2cb5aecb077010ad84f8d9ce7f59 resource05984.gif +c5d2d1538ef3dc9c0bb7e39db7396186 resource05985.gif +f1070ae5a856a7cd22392ee0f38e0dd1 resource05986.gif +2b5893e8d46f10024ed1aa8cb452482b resource05987.gif +ee39b925fd5b8e5297693e3cf3626f41 resource05988.gif +b429f7fef810f67462a718fe585cc0fe resource05989.gif +49d021dc5773de9f23854f9844a041f2 resource05990.gif +6467e5eb14f69eb421289dbae3f4145d resource05991.gif +2e8268d14627d95a58b232de6c1075e0 resource05992.gif +2dcc832ee94efbe027fed57e4b805e7a resource05993.gif +ef269324271c26f67b323978642706cb resource05994.gif +7b20d5a08d636eff600217338763b964 resource05995.gif +000b5205a4010d2adb67724c9a4cda5e resource05996.gif +57887c9cb54a3b3ef6246f1c852b6323 resource05997.gif +207ba39028af1b0b3efd2a55a4d603f0 resource05998.gif +2da250910736f89b5ba5290bfbdb0596 resource05999.gif +70bdaabef07360245d35fa25ee202c00 resource06000.gif +898c62f1d3f9aeab0deb4b1eba7e5392 resource06001.gif +46b2776da58285c18621771d08dd341f resource06002.gif +7689a1eed65da2be95aaff0d73f748c1 resource06003.gif +72f0bc87db5d115aac110ea54dfadd91 resource06004.gif +ce198222210d3cf026737e58b2278469 resource06005.gif +52de41fab2b0c9e304c10fedd2274ada resource06006.gif +06b2519d92889cae63eac329051b9df4 resource06007.gif +1b4a2e4667196e0f5cf4a32aa8bdb101 resource06008.gif +ba9f55d2d8f1d05c2dc6b7f9ed1d6525 resource06009.gif +624ec38d47f2c6f3f806a178fa6c7a7f resource06010.gif +803da5fb949397d9c6eeac5581a8cbba resource06011.gif +b1db9b16d51a26a8b7f202d74657eecd resource06012.gif +328643a5c07b5c8a94f63e2fc4c387df resource06013.gif +7dafc4558c6ae9de9e9faaa8d18509de resource06014.gif +d796040abfd481004855252f9fc318bc resource06015.gif +8120eacfbd97568d33bbe1ea585089b8 resource06016.gif +9101b2729df7d7288ea73026b204059f resource06017.gif +39df3eb169f994bcd0478f7dc8ec7972 resource06018.gif +7855160d31781048ecfaa29da79714c9 resource06019.gif +0c04763f8a7e14355a11403d23a43ee9 resource06020.gif +8d40829b72cde1f965a6ba7ffee5cc65 resource06021.gif +29d0bc87a75f1fa10eaee704c371e54e resource06022.gif +e596d70ffdb93734b2701fe2313191de resource06023.gif +9767f4461d368662c399104e4cb0b7fa resource06024.gif +2ef70f8ef4f794a553014000a2becfba resource06025.gif +e98c5e481e53a9e6163da0a22e23cb93 resource06026.gif +7dbfe813cfba09220a6a6dfdda559975 resource06027.gif +66922fc60683ac88dd0d75cf550ca3b4 resource06028.gif +b34249171c6f931ceb2e6b93e6dcdbe4 resource06029.gif +604be53a96eebd9ae554d19d245dd9c2 resource06030.gif +6844f4564000c4bf9748083d9bf8dcf0 resource06031.gif +184c065b74b9cb3e3623357a1f05753e resource06032.gif +0560eac3a2ebbcfcb7c354a25b82cf3f resource06033.gif +811368186ca22afbbe6d3025e24dfce3 resource06034.gif +dc920555ce6aa20856282cb9cc33a9a2 resource06035.gif +e9d69b249c4b88f7640cc51576f6bb7b resource06036.gif +a34ced3b6420abd8aa64ffa516edd79c resource06037.gif +f7ffa9443e0353ff2963f2adf5134ca8 resource06038.gif +46f22e6891bfa5695273e254ae9805b4 resource06039.gif +2b4a6402299898d3d2a2e92627c318e6 resource06040.gif +11aa0570e1fe26fb197a044ee61ca5b0 resource06041.gif +89f09318a385b0801d0d126d5d295882 resource06042.gif +44c1ffbb260be2231f9a2f83ca49bc41 resource06043.gif +4065878edea15e3c876bfde37ff3ebc4 resource06044.gif +235e92a34fda96e12ff4fd0439dba0da resource06045.gif +f9af566cfc026b8dd4f725e6c398e6d2 resource06046.gif +a405e47506820011b4aed1b58c6f2f9d resource06047.gif +2a41395b2ea8c6cc2116bb23d604bcde resource06048.gif +800ce84659a06f2da3d136247c690d7f resource06049.gif +05f2910d4394c420cd554cede24bae75 resource06050.gif +262ecaa336d5610c443d4fe30f7102ec resource06051.gif +fbc6de4388d42ffdad783eac053ae3bf resource06052.gif +2364133a988d370b8f14ae0c5c5b4a68 resource06053.gif +f611847c3c76f0eaaf20c1916e1d1e9b resource06054.gif +252d8205eb59c0139201d496eb424cf7 resource06055.gif +ea6baeb2ba01035842c914b1d8b014d0 resource06056.gif +90263b284ce656afecb6bd70601e2c5c resource06057.gif +f465a968866001f7bdd8ff7442eb2daf resource06058.gif +645d556d5db50ae818b8f805431016d4 resource06059.gif +eeb27d828ef264fd6d27ac0689e17c27 resource06060.gif +0bbea02c2c2fce1dc33aa9c5be2de998 resource06061.gif +d31ac0abd3a5affae1a84dc16d9313c2 resource06062.gif +590bb7d1895c451234a599e3c7b497e1 resource06063.gif +03fa9052eae905ed08425aa28f36613f resource06064.gif +badecd1d51fdd0557ca733cabe2592e8 resource06065.gif +09e323a7c75d9f4a36eef5e4a236d651 resource06066.gif +a04f856fc5ca45b3f739b1d0d9948876 resource06067.gif +c259d9e85d21b4047bc4b0c45dbb1903 resource06068.gif +84ca3fac76d74b670ddc8e728c9c6149 resource06069.gif +7ab6a3e31f675539c2dd1edf8e8dc444 resource06070.gif +9d8026c27288935c2eb694c07f611288 resource06071.gif +1ee5ca7b67e870fb6833447f3dbd1ad7 resource06072.gif +c2563e5281609d733eaa61eb2d58a7a1 resource06073.gif +02772074d891d50ff55f93055720c254 resource06074.gif +b12ba260d3d2eb316cff2d80f28acaf7 resource06075.gif +82bd1294c75d2ff59778e35119c02032 resource06076.gif +6998f2ac908b74f2390640a869021c3a resource06077.gif +b1320124d0fb127af4377cfb7d70e811 resource06078.gif +e9577de00937f082a54e566416017966 resource06079.gif +c6ce5063774d8ace94bd88b068db6a9c resource06080.gif +5dc5c4bb9abec632915b349ff8d8544f resource06081.gif +8fb333b6ece6f0df9da577d3342e43dd resource06082.gif +49864a8a74acedac366d0e57df66f9fb resource06083.gif +63ef48c6414af5d5016820429f0e4dbe resource06084.gif +2e5745d160af964b76b849dc2f100dc0 resource06085.gif +2674e5577b029fdf07747ecfd7d28703 resource06086.gif +3a5c08782dba7eac1308bbcbfcbf0663 resource06087.gif +801ac011d6d80231b5f5476681f95619 resource06088.gif +e4fa1fc10fae8c8fde3280363415a5a9 resource06089.gif +c69c295aa84f796aa665feeac8dad272 resource06090.gif +acf775156c0b6305d4cc716017b66753 resource06091.gif +1043a2991d2a658ee4aff9903e5769a5 resource06092.gif +b48083973acfaa320670b6628898f4a6 resource06093.gif +827e370ab022ffb87ea7b96db52b1c97 resource06094.gif +47dae654b872610a8b55467707709c04 resource06095.gif +be9396be0c46d7f1363331646fe20a9d resource06096.gif +7296bb0cd267b08013f07c6c3bb5bc8c resource06097.gif +f0016b62d63bff75be77b70d8c9f7922 resource06098.gif +649ca2e2ded331312e2821c8ffe195b2 resource06099.gif +1e665d0cf8073edb63f0cb89f9afc33c resource06100.gif +e5bdf9ae71ab1db048e0d9650ca572b0 resource06101.gif +8a2e4e433ec64888cf4452790fca1945 resource06102.gif +c1fbaf864d108e9e90e9425093617fd3 resource06103.gif +158cfe6ec9f37b8512e68e8fd36a644d resource06104.gif +646d3bd5065843d291df49b212480b01 resource06105.gif +6b588f8efb47762cb2d2318005ec3205 resource06106.gif +81da4bad53fcd6d3e8463611dd569aff resource06107.gif +36b4262d25bcd58b8da868b3bb7027fe resource06108.gif +8951c013382e2a55cb4d055da34f127c resource06109.gif +46aba4ae56a87dc5950ac396dbcdb552 resource06110.gif +2c561d11d3466b2cbba2c856251efc98 resource06111.gif +4d3040d462f38957f2bfd4f0e2a67ef8 resource06112.gif +4cacd3283ad602b5218fbd4e4ced1dee resource06113.gif +0409a6539ea747f747516e7c8a62a24a resource06114.gif +af791e2de5d5af4055027232563d4736 resource06115.gif +af5e4693ccf162a74fb65dfff50386ae resource06116.gif +2c40878790b98a42bd43bae3c297c868 resource06117.gif +144c6b30f913d6a1a6fe06fbe600565a resource06118.gif +20f78c05ae6839d1a16d1da6bd5c5804 resource06119.gif +13b4b5916c2f7cf89cbdede8d03e08f7 resource06120.gif +1015db0ee43b09cd9c33f1fddf483573 resource06121.gif +ba3268e84ac7d6e2ef2b6a927f2898e4 resource06122.gif +8fd630f8e15c18e514b13770cfb0e561 resource06123.gif +4cee40ebe720899d9f8c03e9bdddb04c resource06124.gif +fa9e7b541fbe05ce5255c330b8d9cf19 resource06125.gif +1ba7c912e17deaa7a0231e6e7b69a1c9 resource06126.gif +6b7ced8b1af87f4f03a222fca2bafa22 resource06127.gif +4cfeba1e3b52539e7544ccda3a61f4fc resource06128.gif +8f352c9e4a2d86665448fb23594816c9 resource06129.gif +df5eca04e09d30423c4fab950b75846a resource06130.gif +7f169bd247e96e4650d1e6c174928056 resource06131.gif +b3d46adaabdf4ad2cca3d03a8afe14f9 resource06132.gif +89af4f32ec95d427e7feab72fe5a6ec2 resource06133.gif +3f03bebb34a716ed0201c02f1d7747fb resource06134.gif +a91c2bd3705fcbd5ed4ec2eb121ce316 resource06135.gif +a8b5348ae8d0984cc82705f0025039d2 resource06136.gif +f48149bcc73a71774185bd1906ec1126 resource06137.gif +1cd6c91c99d31176a1b865cfaa192741 resource06138.gif +8e1a52ea974e972605ff8a7d902fb721 resource06139.gif +89dffe292cd64e8bc8d889094414c091 resource06140.gif +b40bfcab9a59e547af7b3273e729c470 resource06141.gif +5ed07fc21fb3e3f8c117d626b4eb32d6 resource06142.gif +695a177898f4f94857de9984a3b771fc resource06143.gif +f8f896814ef9b91321269bad686691d6 resource06144.gif +a69cf53e77203a6b21bcf249cb798aea resource06145.gif +5a6bad465af83e5a08477bc000a0586d resource06146.gif +0c55ba92afa628e8c5afe1917a98921d resource06147.gif +85c69eda820549833aeba7f657459905 resource06148.gif +a6ab7d025de0e1e73e4889fd44efcf19 resource06149.gif +1fc511919f0efe21773ebdad6217dff7 resource06150.gif +4249f659b29bd4c93faf743e3a963ae3 resource06151.gif +a51092e0180729e3e9896770932fbcbf resource06152.gif +2729fb58f9d4afcdc2aa9dfe6f63f23f resource06153.gif +b6288cdce81d033a404194df783e9e35 resource06154.gif +30fa7007cd5abf8c159194ee7b24e57a resource06155.gif +544ed2d2274775ae071469240e676919 resource06156.gif +09418a46ab5885418a3236d609ca6d17 resource06157.gif +86b4d96d4f133d3fbc746813bca52c8f resource06158.gif +083316a7ae4580703104b5501d1cabf0 resource06159.gif +47cb8a3213d31334ce1039f08277a755 resource06160.gif +ac35456b8b76fb0bd93c8b73a4c6b859 resource06161.gif +279468dc271f1ed2a2f6e22daf367594 resource06162.gif +db837e2d4b9cfc30684bc509c387cd2a resource06163.gif +d16de849fd2e6c75610ec3d670fa941c resource06164.gif +3a340b54d4452e142ee2591cae0af003 resource06165.gif +ff4cde47453a68a1166ea259a2c62bd6 resource06166.gif +f83874a625005a86e731f1d37358f3e5 resource06167.gif +4c3e86766745592e754e63fe47abe729 resource06168.gif +564f0b0f38694f7d8199bbe94432397a resource06169.gif +86441ff242d058d68d586df84ef3a991 resource06170.gif +450975b4e13a64e5954e8e16b7d43c48 resource06171.gif +1bfaa4b61a6544acbb3ec11b5146bd6b resource06172.gif +89bfab20cf42699d1c649292125acbc3 resource06173.gif +45066f0e96da6335615a457201f985fe resource06174.gif +31bc84bdc96308e6abb45e82e30bc839 resource06175.gif +650abf312effad3eef28f81012d7c3fe resource06176.gif +96fe75a98a5fae2745fcd46dbcccc949 resource06177.gif +02908c616efb64e3ef86cc96d854eb92 resource06178.gif +34c6a6385122c04c827a2400f75bfc9b resource06179.gif +2d2d919c84bb3e36c19e86104ca21f18 resource06180.gif +ef193bc0274715850b2dd968a2792b5a resource06181.gif +30bb43fedf2d71b67f91205506c2551d resource06182.gif +312d5d46178f490aa11651fe26c02f60 resource06183.gif +b10775f212fec6b70e3940eafefa8a69 resource06184.gif +70964ce162f2e64f41310d0e31eef63c resource06185.gif +3e4d244af5ec599b4e22ca77357a00dc resource06186.gif +3dc4186708a46bfe499afc5f5a659914 resource06187.gif +d47390efb4fa8624498b13f9ffd6228e resource06188.gif +0f3309d75e422a4d9f433657f67264d1 resource06189.gif +2bfff44633ed8dc5c1d9b5920c41d43c resource06190.gif +cc8baa5a43170acb37610b69f8bffa21 resource06191.gif +f17ceaadb073c2a36ac86b3a4cf74d69 resource06192.gif +fad7a9c37785860758ba847c2f8f8530 resource06193.gif +094f407ea5638229b67ebb7999bce481 resource06194.gif +3ec20ae0dda201b690c4521026eae803 resource06195.gif +2b4a1fe0100afa9bba9a66f90423b7df resource06196.gif +9e636a321eaf7b8005f17c8ac0953cbc resource06197.gif +fc926e89d5530900fd472e4f813ce173 resource06198.gif +bcae885747917ab39d7f02c6ac7f875c resource06199.gif +564ac67b1cd3aa380a3f713981329419 resource06200.gif +ec35056e202ec942f07b668ddec56bf5 resource06201.gif +cf5504928d3269f2fdfd857e779792d7 resource06202.gif +92725c3c5297691916dd5c2480534300 resource06203.gif +2c4a89909612b83ce14f5ba4b2821676 resource06204.gif +dd4132bf7d1ea7cf954ff5d4666a6219 resource06205.gif +29a6ae6d8157e3c91caa24ea9acc98cc resource06206.gif +aebb176ada6c51ac4ff4f29720e86873 resource06207.gif +1863ae5cf42c3fd380baa4cf05010596 resource06208.gif +c653c27dd40945fa641b3f08a9a33d4c resource06209.gif +67a1dd4697f3b944e88d599662bd9a63 resource06210.gif +e9ee66ed564f8b89330a63ad2b1b486d resource06211.gif +309ba4f96d942cab17e012c9abd332e8 resource06212.gif +aa79e2786e1eff0e2781d4d8f5787343 resource06213.gif +681415e01f44a3778f50b41eee6cbe01 resource06214.gif +8363def1c69a6870b2bbfc1983f89d8f resource06215.gif +63db5653e68b078900c45a1fd8fa2b9d resource06216.gif +e06822981f5ed7fcaebd38660839af99 resource06217.gif +33b8c21f8cdc7dd4591b3fbd961c35d8 resource06218.gif +9a6a881fa4ffdc0911ffd0b1681ebacf resource06219.gif +7af428ee33101f36a750a856a0ac0911 resource06220.gif +9b670f65746c1838f5cb8ef80f6ffc0c resource06221.gif +7596f15662bd0765f437eaad7410be19 resource06222.gif +f341e76cd2e1623f6862aa7a3fda6057 resource06223.gif +c2828a7193c80fea26a4db8b62f7170f resource06224.gif +ee0e8a76fd70d36c981713388045f224 resource06225.gif +b5f198a4ee25dd6f86d9b1521d9521a2 resource06226.gif +c4e532577b4de7557dbdf9e50551170a resource06227.gif +fb064d3c93d1fe99f4614dad6acb03ae resource06228.gif +24a9df075526e0eb56320e25e040717a resource06229.gif +0d8fa47127ad7dd1f216350431d4e93d resource06230.gif +bed97519471e0a59116478ffeef7be32 resource06231.gif +da1909b193e8705003699bcd4069c200 resource06232.gif +47ed9cec6a22126404936bf4cc8d9a50 resource06233.gif +b1f7cba870f770859f62550540262388 resource06234.gif +cb32f7dbecbb2d083f5639d110ac0edd resource06235.gif +0f5e52291e1aea01cce037acfc5d210d resource06236.gif +9b76d977dd2be6d26ce14b974153e8c2 resource06237.gif +ad9676e0ea40c521d72e7fa9895ac73d resource06238.gif +26c5d4b31167c1ddafd93c7573e90186 resource06239.gif +b4e7653bd8797a9fc002bbf6424c4058 resource06240.gif +3843ee3e2982c914a2a172e2c6b5f875 resource06241.gif +99865169eb9a64f84fa34a3a862413b8 resource06242.gif +51fccb7e71dec270a3aa3f6fa836f3c8 resource06243.gif +9e5564d45cbcfeaa5ce50c51829a4cf1 resource06244.gif +e7dca4cdc11d46a57dc643f2799cbbb0 resource06245.gif +c964d73d4dbb9d9703e34c3f841efcb8 resource06246.gif +481407aaf925e6094ee7d939fa54ae0e resource06247.gif +deb07b3c614c5c8881f2b2f110287992 resource06248.gif +76a9ac827d6c4c72cadeb4935a0e45ea resource06249.gif +875b49b7bf46f45fa9562a086c392542 resource06250.gif +8fb812d59f47ebedc779ac874a234ce6 resource06251.gif +f9ef7578c0bd1bb4d32a0651956238b5 resource06252.gif +5ef6a6ff58eb5c5000925557c01aa38b resource06253.gif +2f51224b44cdd4a2c2b41ce481972c67 resource06254.gif +9ac54e19a1d94a5ce62b348abe89ef61 resource06255.gif +fab9792c85b0da6bc82e81594f70ce63 resource06256.gif +402c9e827fc44bb9eeb76636de041b3c resource06257.gif +75271a730337a4b8ca2c61d230b0d077 resource06258.gif +e2897a332176d5abcd79ab5afbb0d5d2 resource06259.gif +eadd23a446b258509ea695a4d3fc63e1 resource06260.gif +100e7cb496503442f988c6cadc140fe8 resource06261.gif +6763cfd785d37b7d14f2e0911bf7a66b resource06262.gif +856e194b1d9a9edf865c387a1aa1dfbb resource06263.gif +a41d64fceba21b7be4e1ac75f044ee38 resource06264.gif +67f80f0f09695c1d78549c28ba0f2a8a resource06265.gif +1c28ff106396a9c273b7488b265c8e83 resource06266.gif +d75fab222f9a2b7e0e8877cf573a4e23 resource06267.gif +77c20aa062cd25498d24b9445a403bef resource06268.gif +38c9791e9c36b8e75195d7afb023edd9 resource06269.gif +f890959088a375f3dbca265f122b44f7 resource06270.gif +6388f71f197e90b87855e16ce59ab421 resource06271.gif +317e20bd9acea48b077ede08f9b4cced resource06272.gif +ada69ea6a86eccd7a975aa575176e877 resource06273.gif +15777a549bc492f026df16f38234a616 resource06274.gif +3129e658e6f6e755b69eb44e97e8cee1 resource06275.gif +0e684c7f2f3052c0dee05686d22ce71c resource06276.gif +a874d38e43fea4857baece3d21125b04 resource06277.gif +7ad5cd76322388cfaad04d81b4bfd453 resource06278.gif +c6f92a33514e91af9c298d0ba25aedf5 resource06279.gif +7298cf22d1450f9c6e54b7aa19c1e10e resource06280.gif +aa103b369aec5693b8a22e97f2f5b96f resource06281.gif +567889a24a3190e7d7c743b58f82d9a7 resource06282.gif +5d4fc03f165e5297080afc99ea487697 resource06283.gif +3bf4180b027b6705e171df3cfe505694 resource06284.gif +0073f42d9655e9809532fab56bf7dbc7 resource06285.gif +e780ebbad2665e23356a60014fb10320 resource06286.gif +adfa1c088054ca79b2ca6b77d491e901 resource06287.gif +ca2f83fd9dc7b13fe2489c660a52af77 resource06288.gif +93b6082bc5b900e1bb607f9cdbc0edb2 resource06289.gif +48a42abe49dc8997981c96881e12d76d resource06290.gif +2f54de4f1e96caf9893e11939fd38cf2 resource06291.gif +25e158c523b342b5b05d1b554ff0ec8e resource06292.gif +175d6ef1c8670d7441db9c37681e7942 resource06293.gif +45e1129e4cd570aafa6bdba4c378b561 resource06294.gif +f170943ff5a37a2b2b6b611ad8f875a3 resource06295.gif +3a80da55732b21603e369a9d91806f17 resource06296.gif +e217a1ac63569993e9f94780dca9b3a0 resource06297.gif +fd3f6860b6ea331ce1e46b4c012d4b34 resource06298.gif +fc94e377e3bde433aefab00319268476 resource06299.gif +666ef0f26082b2acb5e51a86bc20a466 resource06300.gif +a0c16a6bde7c88a90830f30a1569cdc2 resource06301.gif +659b1dccfdbb31a66e4ac6dbd494d1ce resource06302.gif +4f746e12a5ad3e942404afc6a95a933f resource06303.gif +8e88a0e5aeb3e00c6203e86959918259 resource06304.gif +f91a75269de7deae312fa6efd5aa6f76 resource06305.gif +ab37e98e0d488ee9017ca6ca48ca605e resource06306.gif +d7c6ac5cdb61963da1b7d358c7f5d8a7 resource06307.gif +329ec9000854e279de17159ffac464fd resource06308.gif +7db2b05bf625342a58bc054c7ee0dcb6 resource06309.gif +35754c15a172e6b12b8781c1c8dc166a resource06310.gif +aa6008bdd5d5109067a5db75c50b4ecd resource06311.gif +d4fab9f8558ae7f4f779abad9d60eaea resource06312.gif +ca99115110769f6801fe9c9952621611 resource06313.gif +0d4a88b2a1cf212c51a19a6c988de0f0 resource06314.gif +e920b49c5cf93dbf0b0cd9146ca2bb74 resource06315.gif +64e67d88b68298cc7909f5f7e0f66646 resource06316.gif +df649fde1e5c2d16680f6688c5142094 resource06317.gif +8844af1ee34f8ae85485125560af9ec0 resource06318.gif +e201f67ba74e76e2699085cdff810d1f resource06319.gif +ddde528d08a7140574e9b520288c4b63 resource06320.gif +8186d18b803267f52dab79fc9b1014ec resource06321.gif +4c4f8e9f0c251b2a5e0893997e1b3bfc resource06322.gif +937d4672538879fce196aa2bf8146224 resource06323.gif +5a80bcd82d0e7f2722ab0c706fbb86b3 resource06324.gif +2bb763280cb82cab07ef4f1aed770e81 resource06325.gif +a80d817cd7f7fa4e8aa0a4c7dd39918a resource06326.gif +cbb790c2361e268d46372341d34adc47 resource06327.gif +892ab66317e58561fe3932afa5fa44e4 resource06328.gif +1f552d16d8151590ee9368694012955c resource06329.gif +ec1f28485a8378611e40b4dd2a0a2701 resource06330.gif +5784f8675fbe5c9c96ec7352378429ce resource06331.gif +75fabe6266f2d7ca95fb6fdc6a935ee7 resource06332.gif +de1de1b75f47c6bc5158275742e038f7 resource06333.gif +f3f24dc464b1bdac0cbb2e13ab6db679 resource06334.gif +06c9664bc03bbdea875f5f70f73d07e4 resource06335.gif +ef70bb331dd2d52044df15670ee92935 resource06336.gif +9371ed6d402a6e1c01a22eb89b4971db resource06337.gif +7a6eb40ddf21475cd4d0ada302b2223b resource06338.gif +236810545526149661815abd03c9dd0a resource06339.gif +88f4807c5b35fcef9858d4bb32ec55bc resource06340.gif +7726fdaea015547b968372dbf5def8dd resource06341.gif +7a909036413198029b15d94b3301c58c resource06342.gif +43ce1e7f46f14b087313e2ec4ff6ee1a resource06343.gif +de1d06ba7ed3947022d0e737228effa6 resource06344.gif +966b957e9e9eab322d56aabec1eed175 resource06345.gif +052d100065be19441a1a7ded778160d9 resource06346.gif +687e169bcee0e1c072bd4368d01a89b9 resource06347.gif +2ea2ddae382929c26bcc60435c54fe30 resource06348.gif +7624f38a133453e9f7db462b11e8d100 resource06349.gif +3bb91cd1b29b2d128e0e7caeaa2edad1 resource06350.gif +e61f20d8f45a39b3a5cda8cceeb12eb1 resource06351.gif +eef31e6cbb17bc8552511c08d7be4e59 resource06352.gif +1508932f295975f0f14242c81ce780ac resource06353.gif +08c35cf0dee40b896c21ab38087c0256 resource06354.gif +84362e97c558c67d0f04a0851a4c5447 resource06355.gif +ef8953ae1242c0a6f25b3a1575e3755a resource06356.gif +df9fc5ed7d5817fe3a6306031f0de215 resource06357.gif +46f88ebffab773536d314a7cd304baa4 resource06358.gif +f91fb4d010ff11ae739a5d10d9d11d9e resource06359.gif +ccfb42725a2c14d3c87391fff6dfac4d resource06360.gif +d9d4f068126096b550efb1d1b44b679f resource06361.gif +e129840a8d6907364a42cae5dc54a85a resource06362.gif +98ff60c29581adb16ca6206bfb604922 resource06363.gif +391b9f7964d99ccd7c17a091c88752f7 resource06364.gif +8630f180c71e5db8649d464548d04f5f resource06365.gif +4f6158e331608ecabee850821ceb28c1 resource06366.gif +e5ffd6e5ad3980dbab2fe3b1436e7025 resource06367.gif +1f8e7c5cbca937a55b1b607c4d464696 resource06368.gif +fd71dc29e7a4ab529a78c64e911a908b resource06369.gif +341fdaa465f9a8d63aee45b18e6bfd36 resource06370.gif +e566129da5b5dd830167a7d13095bfda resource06371.gif +a3d76270fd3a0d9267374ddb52d3b653 resource06372.gif +2975c6a09786fb93e93d32d727a34732 resource06373.gif +6e7870bb3d5b1ad5a4d073cb54d95b20 resource06374.gif +131dc45b884fd847db5fc40ed66c771b resource06375.gif +199bb2a4be16f4cecd5310644bf7012a resource06376.gif +0ec0ca9ec3633dd198e1bf92923a70f2 resource06377.gif +2bac6261646dbb844a7cae92e50ebd7d resource06378.gif +de62308a97b58be73c36dff8749247a5 resource06379.gif +c853143d675ed87cfb1d51eefe952848 resource06380.gif +33502c2a61be67838d3df5bdac3678ba resource06381.gif +2e3c4f5ce04f4d30d4365b971d57fce3 resource06382.gif +ff1039a649e8785443b3ec8d76056ce2 resource06383.gif +e7700e05151c7646502a190106c77584 resource06384.gif +e698230d070aa9ff535dc29a2f43e22c resource06385.gif +f9aa417274d6b631672894177886108b resource06386.gif +098f72d56cdf65ea42b1d8314b01d2c5 resource06387.gif +c141c96c2e0b01c87dd14125731b0735 resource06388.gif +55f75b46e85b8744cd3392abf8d2c917 resource06389.gif +87566a9dab8317c193fd0327e7cc6601 resource06390.gif +d095f392455a1b3d815edde46adb1cf0 resource06391.gif +6488fcca81cebff77c1bf492a46c1ebb resource06392.gif +03f56c232674907e7cc759ce4255e6ec resource06393.gif +28f676db6f9ed9407a49ac2ba101f633 resource06394.gif +b3c1ac274a661d84a99408ad70085f3e resource06395.gif +0d888c3789962b98a2a259cd259114d8 resource06396.gif +5b6fbdff324764ac5a2844eda73a76fb resource06397.gif +32d9cfe0882101763fff33f868ad8d39 resource06398.gif +cba8c02d5bdbf4d92f64d0f125b76f1e resource06399.gif +4338d18dbf7cc9f76354b4602ca922a6 resource06400.gif +5d7724cb1446d283ec778572c3c60d61 resource06401.gif +3edca20e28e3329062e91f8d3f5bfae5 resource06402.gif +3300f2fea721070711c8dedcd592b97e resource06403.gif +b3e2c4757d332bed50c981e05700fa8f resource06404.gif +0eeef1385390a7a940f4c0b07b3cfa97 resource06405.gif +6fe4ec596a03007ca783a7c8bbd39029 resource06406.gif +7c18930bc3bdeaf326a6ef280fbbb590 resource06407.gif +f3e55b32e562748a3c1881ee556ad568 resource06408.gif +68dc54a7a00e081caac0c58ccfa1128d resource06409.gif +3abc9c0adb0f43e493bc54f3288690ac resource06410.gif +e042980231d26cddcca90bace728c974 resource06411.gif +a5322dd7a0404efdce3254a138aa8a45 resource06412.gif +2f77387d90db6754de344008fbe616c9 resource06413.gif +781b6b23f88b041dba1805108b4f6755 resource06414.gif +765b8241b535ede9efc8e2b3891c2282 resource06415.gif +b55ed8b629275f6937fc67132fbfabb5 resource06416.gif +36994fd843dc82b3cceade3861669b91 resource06417.gif +7820001de716b939ed6a11c67695016c resource06418.gif +b82f610e607594e6ce778006f607e0ea resource06419.gif +3ba07fd8433c6356675254c68275280f resource06420.gif +ef052ebcd17c1ace1e11a584394b2db2 resource06421.gif +013d483e79491e99c76ee2d3339389f1 resource06422.gif +c2fc343abc3b892169ac7aa2a59850fa resource06423.gif +21d3d6a32ff0f2c779714c63faa830c2 resource06424.gif +2d676059626779d3b6c79fd016942f2d resource06425.gif +f8f7c1b11fd79ec3831c40764591e8b8 resource06426.gif +88722db562cb9330a3c81f0bcfc27092 resource06427.gif +4f225f24a889747537cba44aa1b14d09 resource06428.gif +888ae27177f86bf82b161334920917d1 resource06429.gif +891a54439c5f27ca5b9b94fd6c07e903 resource06430.gif +90a9d62e5e8a81fb08b43bce2bc22694 resource06431.gif +d27dc6df21de1b3df57d632f56d5b93c resource06432.gif +49e8b42d5639acb1828f633459609257 resource06433.gif +3ca81c0a25f7e57300972dad3bf3d37f resource06434.gif +26f824edf9fedd986bc19dd2d78352d2 resource06435.gif +010faa8313d29f51bcd585fb8c633657 resource06436.gif +6b0c61b5df0ed0be22f41243ff474cfa resource06437.gif +59743d609773de571b16059f0facb420 resource06438.gif +edef3e14063fe9c5a6eb1d3bb3d83588 resource06439.gif +9319d4fe721f1e2df97a9e2e7eef51df resource06440.gif +304ebb46dbbc650d6b453cb21bc615d5 resource06441.gif +1204098cb3d8a255842fc31e93d0903c resource06442.gif +6e6a560cfadddf64bd97dc407b5dfe28 resource06443.gif +e9c198d75bf689509d0014e660b4f970 resource06444.gif +58ed3c8f91857ff065e30f54714ada67 resource06445.gif +56d5a12f156fd45b7ea9bb6926714d50 resource06446.gif +749ec0a2eb858435c2c65482f70008d9 resource06447.gif +b1ebe796e672b0d70a81acd95abbfc42 resource06448.gif +b35e693b707476af3d678bd212ee36c8 resource06449.gif +9c3a0dab580a37fc5282707a919e6fc6 resource06450.gif +015d8eb8d31dd70c97fe8bc15ab3af79 resource06451.gif +6030749132d7fb8936a8746663b2648b resource06452.gif +0d23b7d8a5f9f2d79c3d6198ed8e1f33 resource06453.gif +3a4304ca9b1c64082907fe49e5e78ada resource06454.gif +f8c06cbb51bdb816f4d8ec25448bc187 resource06455.gif +df3bc696a0844058be885034e96cdb36 resource06456.gif +4acd5b2b69cd3fbc397360cdb3d11905 resource06457.gif +ff6e34028e183385a293ee31acf717eb resource06458.gif +ddc6a1b77a08bd6d74196dec4015ef8e resource06459.gif +11022e571b7b58a4534702c6a8772d97 resource06460.gif +fa5e7e97e9e13cda9364faf839b1625f resource06461.gif +ad9d586c40ff45555a2e87c7b5f7aa12 resource06462.gif +560fbae82b87b527efa77cc0c15cbaee resource06463.gif +5b0214eee122656b164df42654facbc6 resource06464.gif +06469dabdd21f27ae56479ba73f7dfd5 resource06465.gif +f51e18294410fbf16f120a57b9b0fddb resource06466.gif +7f916c90cf49f19e0688e5f0e86ae90f resource06467.gif +3e837425e87b5925bbbe5a538dd9484f resource06468.gif +81f1b99283837797e76b98e51e211f69 resource06469.gif +00d71f979c9221e715df4b65fc16da46 resource06470.gif +9ba664e2257228d31a881279df29928d resource06471.gif +5f05b83c67fe71f50994f9e766764072 resource06472.gif +ab1495315b021334390356e481d0f9c5 resource06473.gif +697ca4b5c33c450d222f45c3a58c38ac resource06474.gif +c755a73b9a5dcc3fecf1f8b2f6654442 resource06475.gif +6cc358a86fbc19cfb88017bfea6aa3d4 resource06476.gif +f56f4c59103f5bda65412e4da2cbd4b6 resource06477.gif +a5b10ef744282e094829fde95d9e9e63 resource06478.gif +8179e3e4919a353206f53fde6055057f resource06479.gif +b04c7413721f585f6189bbbe31d65492 resource06480.gif +e51fb985cc792e5b4f865fb1321cfc3f resource06481.gif +2f2f7b1f9ee74f0374aec62db42862b3 resource06482.gif +03b16e7f4a1b86942aef8ef5336d3f57 resource06483.gif +c53f5e357a8eb74ef32159ec7bfe2886 resource06484.gif +fea5fa06927b7328d2e2d9c26c4a381c resource06485.gif +adc7c31d03f82684a4b1e4caddad2edf resource06486.gif +f5be3b7d7094a08116a9441b616b7ef2 resource06487.gif +28c7bbde21d8e54abf58b580d7392388 resource06488.gif +4d0fa865d531859a22e140727a5f94a4 resource06489.gif +9d617465b8d8468e9a6aefde132882ef resource06490.gif +5ae5b6685ea8963ccfb8be33ea5df4c0 resource06491.gif +8bedd8056e03804eaf568ae6bda317af resource06492.gif +beefc79b5e8a14f4a0eeedfa3aca482e resource06493.gif +74e827517430072285defb475f87a0b4 resource06494.gif +135bd79efff982db9b587bc8611b0d53 resource06495.gif +23770bb76043c586eda4e10369c5b388 resource06496.gif +3261fdbd43f41a7cbd2559c56840ae10 resource06497.gif +567c465e0df2cd56265aa8b60815ed03 resource06498.gif +32b91c1943ef24bba7e40eae6e161b4a resource06499.gif +f469ae6b564923c687995cfb0f263d59 resource06500.gif +0faec4244e2b6e3fac4b5ae60714e888 resource06501.gif +eb7126a1ecb94d02c895b7c698130a17 resource06502.gif +ac0850d8a10546a6c7981c4d8473f6a3 resource06503.gif +587d3f7e462da0f8ef97252035e47029 resource06504.gif +f0e588e7c7a40101714af3b7e64eb02c resource06505.gif +24704c6f2da83ead3b9ed1c4e93b730d resource06506.gif +ad5a2e935d2367e12c8509bf09e065d8 resource06507.gif +d1d753539a2925e8da9885c8223d296b resource06508.gif +5ec7c676d4833e345bb88c53b20d890e resource06509.gif +76e30adca5e5f86d22923f464d929aaf resource06510.gif +bcb0bc3c33a08f79b60d2d088757958a resource06511.gif +30c9debf1501757848cc011e218d8b14 resource06512.gif +b85a7b120ebdd6f094951e4bcf4b1ec0 resource06513.gif +e93a618a4fac3e594c1d98c17db1ce42 resource06514.gif +bad2f88ef0bb27e49775145060e3385f resource06515.gif +b13ba0439da013d78fb7c340e54f5a5a resource06516.gif +cf9a0fb8d57ec4454da4c8f9623aa29a resource06517.gif +def1d102c2a97ececbb18232d7446c46 resource06518.gif +c323aa4cd8c5b376dda5ebd7b116c684 resource06519.gif +3d0ce4a4aba6374f1f19c81a7905f2e2 resource06520.gif +588d300c4ec0a726036235c816526826 resource06521.gif +75509a7bc5bc8d2174e3a15df27b63cf resource06522.gif +1a259928a3812f644fcf8d0a65e48713 resource06523.gif +b87b785a02b94c1d76c0c6fbb15bf29d resource06524.gif +f87d96eeddefa7df2b05ebc6e239f09c resource06525.gif +e5574e70ec6ffe10c0608df9bdef7a21 resource06526.gif +b1fe693b30bc6f1dffd7d1542c798668 resource06527.gif +626b4591851605382f4060cbc2c7dd12 resource06528.gif +887b02a4f3dfddce17d3a1687935fc1e resource06529.gif +316cc5f1930bafd142d4f0be64025852 resource06530.gif +2b4faeb4459bddab6f938126e9d95c3d resource06531.gif +db4975482df6ef5e0d8894cba8641a57 resource06532.gif +689f9c229d64b48cf232fbe9575c919f resource06533.gif +7912c45e9f43887bf9896e2c8432d072 resource06534.gif +164977558475d89791b7996a1f2b712f resource06535.gif +d7c449120692fe88b20e65fe6c54f0b5 resource06536.gif +de1ff745fc863410581ddf990ceecc87 resource06537.gif +a1a40056f7709ba606c4a3cd8fcb2029 resource06538.gif +5af99f61ea55eabf490386ff60ee3480 resource06539.gif +0167688853e6205a6269c73da1d0cd67 resource06540.gif +7f3181b6221224c131024bd7c9b1b229 resource06541.gif +63985d0d65091f2c343804ff3a5de472 resource06542.gif +51d92357b2f5859bb7a73e1ad43f8c08 resource06543.gif +5ddfa01fc6f5f165f1c98042d4c84674 resource06544.gif +bbd8c3073c05bcd7f23fe3ba1b5f6bb3 resource06545.gif +ea2141e926bd7fd8c6ad0b718403c30a resource06546.gif +2fc622b3087d6343524f9400d0c68e8c resource06547.gif +1257a64fcf16c259e6d6b9b29db538a2 resource06548.gif +32b44fb11467799c23c5a7597e8fc563 resource06549.gif +d4152ef654e33171ed1000cbcdfd0bab resource06550.gif +2f27e7ef45e19aee05bc6e8c55793dab resource06551.gif +358d1621fa6742e17bc366f6edfefe7c resource06552.gif +37044ba00f5e84c9711c2f72208caed8 resource06553.gif +b3b27b35d010cc4aa9e771b3b510d98d resource06554.gif +c1fbe4a57ad1017fa9561ec38f0e48ee resource06555.gif +d6df01345d4956c3e2aeb7253a7679c2 resource06556.gif +caaa3648c226878ba46aba9a78bfee69 resource06557.gif +ddd78c1c6452623279f9b05ea5fd975a resource06558.gif +dc65db10e238faf97ad97ee888a76c0e resource06559.gif +588a479dd0c883ef3056edf833945f82 resource06560.gif +5f1daae7501ca7e311d22bd9806c6f52 resource06561.gif +9d91e1ab93fb26fcedc352270cd75c88 resource06562.gif +28c8340d3c3fb924d5b38c473813be34 resource06563.gif +9ff85bc10fe37eeecf5e7b8444c8f384 resource06564.gif +815badc0a3e93cb883973deafa82c6f5 resource06565.gif +f7c0c95bac9c1fd2352509a0f1b35b4f resource06566.gif +6e62f0dbe4701ea288cf8e9efecfc7f3 resource06567.gif +8e6f7642f38b9a33865746499b83692c resource06568.gif +7bd43a78ae295795b17352f5df0f2cea resource06569.gif +cb6ff2d2ba5f8f303a111075b9efe402 resource06570.gif +3afb42631ef7a949669b7bee4acb473b resource06571.gif +04d5cceecea6fcbca1ab6882555692c3 resource06572.gif +6fa7cbf55af1df16b8b0d466791f09a4 resource06573.gif +9d8d8b129034f2753aebd540fb370376 resource06574.gif +335767ff24c1f35a6acc908acba53023 resource06575.gif +380f8d734ba591da71a94025abee3054 resource06576.gif +0c9b23d0480ea2306b94b381238867c9 resource06577.gif +8990df2f87448d69db44d0aa11f8fb46 resource06578.gif +8b206eaf8d6ab0e150ff149797a997e2 resource06579.gif +73ec3c38306d6f8020bac7ebfa196e68 resource06580.gif +3756870e788dc2aa61926e02c972c7c4 resource06581.gif +22abe755d87edd806e42541f390f357e resource06582.gif +47310780033343b3fb8eb56bf823c885 resource06583.gif +a7fbd6ff8f2d6306e9529f353b57ebd2 resource06584.gif +7f20d0f68ce508b25cbb275f32bf1cb4 resource06585.gif +035683445b7902b1adb47c74d53b81c2 resource06586.gif +9e2b18a4d23acab9f2e7f5cb12e8eecd resource06587.gif +c917856ef49bfdc4fcf08b3e0c8bb1ed resource06588.gif +153a66226bbabe0dffe4084749df7e63 resource06589.gif +8b9f21fede2478200c14e4922317f003 resource06590.gif +0885a92e9d7c1b5cf4786f8130a7225f resource06591.gif +c6794be5495c0779521f4ac77f13a591 resource06592.gif +dd335f547ace2cbeda571d284bb386f5 resource06593.gif +35727377060aa13296854f73931b54a8 resource06594.gif +6214ae649010cda7ad33f982e9b6ff17 resource06595.gif +44b0c6ffbd71adffea70873bf412ad33 resource06596.gif +837780cc0f7dfab777d14e65469b1a3f resource06597.gif +342623ec93a76752fe5308000a04234b resource06598.gif +d318279a6ac8ff13bf670f30ce427e02 resource06599.gif +cb9c3e7347d770f1e064d9b2e20a9eeb resource06600.gif +edf0463822664d3b2945f8085891af11 resource06601.gif +1e3a3a41920dfff0cea57abb95655db9 resource06602.gif +bb3d6919db27422a1916423b2bea8ff7 resource06603.gif +e115c0852bb2c34d69472d9bad0414c7 resource06604.gif +d3a3ea6d203edb0f8df2d6ae896a27c8 resource06605.gif +da4b118431c30401868d83fa0922db0e resource06606.gif +469b286ea92ebd94c140a57d836fd77e resource06607.gif +1566c364898d146a4924bffbf8f238e6 resource06608.gif +438f8a2751b44373ded6a867722d3c67 resource06609.gif +bfc1f553da5445e47ef96fc55e76f6fa resource06610.gif +a004957a322a159e884173a7d52838f9 resource06611.gif +399c804cddf6239d19f41e6c72b8426e resource06612.gif +3623b3d505dd64190b765d4bb061974c resource06613.gif +e951482ebd6eea401291c894f04febee resource06614.gif +715d9649238c299f2accb578404b4013 resource06615.gif +302bf27fd2bfbbf092c2d02da7ead1ec resource06616.gif +a8238a26ad6d48a623a4734525221246 resource06617.gif +463704545e138678b6cdf7bdd155be2b resource06618.gif +c30e5b09e05d7d4fc5a51d1532fdcd4f resource06619.gif +6f88847aeeadb1b36a4d086f84788c31 resource06620.gif +c3be551f87f8af4e0f37753e659abddd resource06621.gif +ce756f4a8a8d89c28a4878fdc3b55b53 resource06622.gif +bbb294fdbff434dee804b8e912fb7a3f resource06623.gif +a2f82e9bb4e23d398e2f9ef1762cd74a resource06624.gif +1cb5f240258cafe8077adeb721228b55 resource06625.gif +7fff9c1f1a66a524f3729fcd0a54035d resource06626.gif +a7efecb48dbf9ffc927b2f0aee3376c7 resource06627.gif +09e425aea151b3c5cc9a114673495e15 resource06628.gif +b1a9aed52a7ac5e39632a48e84672809 resource06629.gif +159c2d8307133992c943901534132f87 resource06630.gif +2ae0f4942f96bd29f5d2cf898171d213 resource06631.gif +ed73f7b0d319f81af6240b02163251aa resource06632.gif +f3d162f428e994ee4773ec1fee2e1ae2 resource06633.gif +7d984d5f0213174fc17bd1e650ebf569 resource06634.gif +695d117d5bef266276da7bb0f7928bee resource06635.gif +24a064b8059a3f24ace980be539ad2b9 resource06636.gif +cc76cfbf4bcdb2e48e78540bd9af9906 resource06637.gif +5c48e3f966c9be233d45ae187d003973 resource06638.gif +18c0bbe03227d3ca862c0b7f6ca51a68 resource06639.gif +e29bbd435285cc32bd66057b79e010a6 resource06640.gif +8ca1b3f8c7e35883d17d6674b75018ff resource06641.gif +e710c167cf1e530cde7a59a40dd365af resource06642.gif +5bcbf0c701dfcedf17b7de8d6bf4073f resource06643.gif +38ebef79801425a43ee3a83cca76dc46 resource06644.gif +a27a6b5f2a37c34c60f2614e62cc4df4 resource06645.gif +40b87141e302b2550eeee5522053c072 resource06646.gif +b6bb016a55336adac3041f36003b22b6 resource06647.gif +bf744049af4abfb27c68fda989059b85 resource06648.gif +183a39c640c7ee3c129437192ebc0f53 resource06649.gif +561e0244bbe82fd922f9ccac5b218584 resource06650.gif +b32880a7bae1aeaf3dd1ae3e980d123d resource06651.gif +116c35af43378dccbdc3423f42dfc24c resource06652.gif +cec371dc25ac526f2ea83b25c2dfb829 resource06653.gif +ae38ff63c1f9b5aeebacfb1d606a4f0a resource06654.gif +1977ef509464f8534e7591dcee6ea36e resource06655.gif +98738b07ab75d57e92a3b1fd0e4ace44 resource06656.gif +9c093131fff16e50b28b51a2b220a5d0 resource06657.gif +eda6908cce160fd7b2c9c99d5c6d72ee resource06658.gif +2bebf63693eb68fbd0b24933ea4df3dd resource06659.gif +70da0e43107272c4a512595f41722e6a resource06660.gif +f2c8a46bab38121d2d9dc36485a57e15 resource06661.gif +a0488782b044ce1813701a2d8b6657e7 resource06662.gif +a31b3fb650b556445023195adf27878c resource06663.gif +db4a4466da0e4ed913ba810b9e8edc52 resource06664.gif +d0ed342ea7402486855080bf18579e62 resource06665.gif +7ecf33801a7d1578817592c4b14edda2 resource06666.gif +8d90782df0e56aa992182d057d8a07e4 resource06667.gif +a9bc5f622d00cd3a0f2ef6293d5a47f6 resource06668.gif +55c7c93058ccdff359b8f8c9760aa34d resource06669.gif +cfb9cfc6449c18cf7c520a5d42012548 resource06670.gif +be6db3ddf869d5dae7c76a243ff58953 resource06671.gif +b94327d9799438e099374fa09805ebb8 resource06672.gif +2b4995a10b9a1ad651abfce9621848eb resource06673.gif +e59752358dc81c6558e950e312a4239b resource06674.gif +ca61f7cd361201df31f65a0d312b5d82 resource06675.gif +5479fad1d87e9f8fd42812ecff1b5520 resource06676.gif +cd5a1cf3fa37f1c49b1e161d900f6c54 resource06677.gif +34dcdfd7c1dc56a5ac108192fc09cba5 resource06678.gif +d48719dd14bbf2685e35c315fb9346a6 resource06679.gif +71af0e6c76005e5990bd5269a8cd0ce8 resource06680.gif +f2aab764f22b508289fdd4b475f3b8ed resource06681.gif +0a998cfbe11333a51e5b977f23210a61 resource06682.gif +f8e2d18eabd9a99670612d70d2c552cf resource06683.gif +0e5bb403635818c45f084bec176bc4ac resource06684.gif +740228e62dc578b1dd7a7e7c81f815fa resource06685.gif +a31fcc1db6939caa41106ad476affaef resource06686.gif +a4dcc5cc607379a7c3f2c553191ff549 resource06687.gif +8423c96689611c78c04f517bc16a464f resource06688.gif +ac7ed0c1d5316183950f7409accb4fad resource06689.gif +56e9189d13048278c2e986d13979ec11 resource06690.gif +8bb0b79609ec4a2b511e73249169d348 resource06691.gif +ab22f07ae4875d50561f73ca4c7fd464 resource06692.gif +29275a98bb8d25023d50db73db9e2b68 resource06693.gif +fa227a89f49571ab2c1ae4059ed88e31 resource06694.gif +f22f9472e7c96bd7ba07f6845e9fd0f0 resource06695.gif +bb42a0fad9fee6359b7fc8c012ea30e4 resource06696.gif +b0947b4e7e448257cab4c71a2f9999be resource06697.gif +52b36818521e109985f5e225a4a1b66f resource06698.gif +e5d9d5aee4f5bc88e8cf4fc8b285ac49 resource06699.gif +de498c83e8f14310553a1c9e616a3f44 resource06700.gif +87d8d8583c2885277b59c24651857b68 resource06701.gif +9a0df715d65d0c4c407a231f26afd7b0 resource06702.gif +3598ad00d6eb8164a0aad243071ee608 resource06703.gif +f25004f58114db755b19205d740edaef resource06704.gif +cce9e43d5686097ee62eb6fb66198a74 resource06705.gif +161753b393c626e5d257e6f62c4e0127 resource06706.gif +20b1ff495d47360fa98ceb108ea9c592 resource06707.gif +6012c7345f95383e63ecca22a20e02b3 resource06708.gif +d6411167f19c48ab971e7036226c0875 resource06709.gif +153a20e8aaf4c5444730f5027244d5f5 resource06710.gif +d18a29a4419fd8034e0c870db20ed384 resource06711.gif +c2365dbb4f51b474bf1fa19d420a40ea resource06712.gif +bacc117754e6e6bb280d9debe44bab1f resource06713.gif +398aafc13eb4b3e79b6d64c0c402c114 resource06714.gif +05665810e5c24dca6888ad081717c444 resource06715.gif +2f34126b5fb92b2c57d85a00fb409d3b resource06716.gif +be79b3b944b63f6c45222087ccbf9e01 resource06717.gif +a62e08dc0613c0e1f66119744d047aa8 resource06718.gif +32c2efa2aef05dd3863f6160c114a31c resource06719.gif +056d5f5b93501c66404b0755ba5a678c resource06720.gif +2ce42610d08facd2804e999bfb2925cd resource06721.gif +5e467d525271e241e8552956c6110e06 resource06722.gif +76efd295215d1eb54e4be22960c9bff1 resource06723.gif +65f29be470423f639642762a58af77d8 resource06724.gif +75ccbc69621a7f2f6d50eda0c784880f resource06725.gif +352814ae643777aec24d930d8a30d20c resource06726.gif +0feddb2d70a3b80e732d16ba0ba7f077 resource06727.gif +9db4dba840f9d5dfeafc202eb5e508a3 resource06728.gif +86d664a31993f34448b9ee8444c4dcad resource06729.gif +cf5626a80e6467ebfe90fda1c9a41fa5 resource06730.gif +7c855b8889167c41e1951c5dab086fa6 resource06731.gif +1ca1a4cc898768e1f4de69be5406eee5 resource06732.gif +df001bb4775f3c9135f670e63ab8a104 resource06733.gif +e9b2a87967905078f7f1ffd70103ed97 resource06734.gif +91841fa5eb1ed21df8ec7a2c04ca6e2b resource06735.gif +7328f21ccecdbc4f4e397d7a2fe034d5 resource06736.gif +15941af7d994b7af8093bdfdddb98b59 resource06737.gif +214ec162d432dc730b420a514bef7521 resource06738.gif +d2cfb62be48aaef6c5c801c9f2b3dd53 resource06739.gif +85948d90ad46a47394a440fb369299d0 resource06740.gif +d410d3516f9ea818704755157af5c431 resource06741.gif +3d8ef2e719d28cf33ffce19a86ae5beb resource06742.gif +b04346c9fa12aedaf147fe707037077f resource06743.gif +2430aa2ea163a0fc6ec48dddb8472882 resource06744.gif +20da1afc85c8d113b4bd3ab295c6efc3 resource06745.gif +fa91155ae144df86ed7407ca7ab33902 resource06746.gif +18ca27e87c6c5540cad9f5e053661b49 resource06747.gif +cea936a805efb6aae87bb47996c8f60d resource06748.gif +b8930fae42a86191f60916ae605fdfc9 resource06749.gif +45a481d5145cb5805a1ccd9905af2e19 resource06750.gif +6a6b80274ef1004dcab3b0624e2dbc3c resource06751.gif +e4941eeca475f506f5822e10fdad7433 resource06752.gif +d129e091f126c21dec95a2a0e607eec6 resource06753.gif +2a1422b78b7cd9261631e46a7d9bdd0e resource06754.gif +5f9f0078f1ce1bdfed395647d52f5cb2 resource06755.gif +2232c137427364248917e357a00b37b4 resource06756.gif +0333b0bed11c043abe8508dfdec4c7f2 resource06757.gif +167da34c456b6dd1e486fb5f6835e428 resource06758.gif +f11ae7b57476f49ca16f0f05198bd96f resource06759.gif +94d9399a79169678b835e0cfb939b4ec resource06760.gif +71e9dab1fd8137e0b82a86454010069a resource06761.gif +2997d1536a148bb590702ad6a03f83ef resource06762.gif +0766b232029f2c5d44e3390ea842d4c0 resource06763.gif +ce464cdb5345ff23758dac5d2f64fa86 resource06764.gif +c8c9b274bb2f8fc0ed2dd51709a4750f resource06765.gif +48d69ff0286444598cf9ac8d322271d3 resource06766.gif +b1bf847a87eb4fb231874ea4639821b1 resource06767.gif +4c55ec3ea5e92eb624a0502c7bdbce71 resource06768.gif +7e1009b21ef5fd9e2f2b1d5a3f971c00 resource06769.gif +faeb6a95063048b4bbfefd91cbc78587 resource06770.gif +a1beaf0aefe2496f268358eeaad137e5 resource06771.gif +e63fa462ff5cc8a3bafd44b7d9d1fe55 resource06772.gif +20ef1fd096531a6f343c8f182c60bf05 resource06773.gif +7e3859379346110c3af1f4955d83c583 resource06774.gif +9796255f5b726ff94d3bf7d2b81eccd2 resource06775.gif +7f00aadb8171c67ab5c4615850d5611b resource06776.gif +56d9b312fd8b1ea29ffe3dced71b82ba resource06777.gif +96e4d8abc011d83fcfcf051753b90410 resource06778.gif +018a7a6547d9dcb578373a3a285c41dc resource06779.gif +442c5c1363499ae1ba0663e70c4fa954 resource06780.gif +ee02d5ad002670f00ff2e7494fe35509 resource06781.gif +1e44ba31e2341c78b1f8b3dd62d45553 resource06782.gif +e3c729d7cb0907b6e5ed60a78b1c7c4c resource06783.gif +359c4dfdf364b8439e7d1419ecf576d5 resource06784.gif +6d950fc7ba5d4f0ad2a65d47c10a66f0 resource06785.gif +84944bc3d1b344e2c4be7b7428a89caa resource06786.gif +711ae18ed7a6585a620e3489aff33526 resource06787.gif +826a5f8f378f3806d1957a4698fd9da9 resource06788.gif +61eed917cdf46721ccfea7d3dc3c9e68 resource06789.gif +0fcbb4cf96f5de512de70e1a2d952f7f resource06790.gif +305c66ac2d20bedef383a684cdcf7ff9 resource06791.gif +aec321be2ebe8ee3811e52a72cb422b4 resource06792.gif +2d8e4ff057cab84b728be34e80bba735 resource06793.gif +2563aa2467a8311a7ff3caa2f9db52e1 resource06794.gif +c5ff5517fcc4229f72d8f68cc5cae714 resource06795.gif +518d902470e4d8dde7d4b6e233368611 resource06796.gif +52567d9e8b8cf6c46ba9e8c2835d28b9 resource06797.gif +767da9e8fc5d306cf6b08e874813e9bf resource06798.gif +bcc751a31a243374ae2b43526778e02f resource06799.gif +5dcca756c886b7eb89f710b43afbede0 resource06800.gif +def54572e2b5bece92b097b35710668d resource06801.gif +da0379c6f036d70acfe3cdc2a8d12ec9 resource06802.gif +4391b2471e0066108c2d875c9b9f2efc resource06803.gif +76c47677e6a0d134f12f929b0d191929 resource06804.gif +050743461190303ca96746371211c862 resource06805.gif +49ad24975e2ca0d54df2180cffcb4639 resource06806.gif +82cec9c0fac1cc5a0b0d49497f762b65 resource06807.gif +483bd1180e6e87afb5b158a6424b6cee resource06808.gif +7540ebba7b10874b599a9c8d9c0fbba4 resource06809.gif +242115213d5e5c09911172e7975deb79 resource06810.gif +6b0d6083f2a107239e15536c8b826159 resource06811.gif +6109df0d30dab197a5195ee415895598 resource06812.gif +b8a40c034a937e0e27f473ab4d145b36 resource06813.gif +595a1cb3dd5336bcb3fb69cf962f7eff resource06814.gif +efa2b56f0587f020325e48c297c7eade resource06815.gif +798e926638ed4ba6580e23dd3a469514 resource06816.gif +c5c279779d646430b960321aa221330e resource06817.gif +f5a9106238b806bf75687395a8b1354a resource06818.gif +5db45c4d77088e4c051965c43c6c840d resource06819.gif +4f8d6782228221e12cd873ff9127bbd8 resource06820.gif +168bf19b5255da1c201f5b8b28d87b33 resource06821.gif +19555027c99cf712581c8b1d5b3993b4 resource06822.gif +079cc8f8bf7502cb0f794ecc7193b793 resource06823.gif +74d557eafa54346d28d5413da60fa187 resource06824.gif +7fa00fdf9d106c9a419931874a794f40 resource06825.gif +b8ae369197bfb694ed43efeaceadc758 resource06826.gif +3fa8f5bbf83ee43d7105472701481440 resource06827.gif +5e2e56ff831c3aea88f416fd03d4e77d resource06828.gif +3fa220b291a800385e760eaa1a4a1300 resource06829.gif +ea6afd932894f90ed3b0e375b4f755fb resource06830.gif +0e5f15e181a3a14703ae94346ab23796 resource06831.gif +87844bb10ebd523263480de86be73e71 resource06832.gif +22d98030fde9e6d55bf968c33191cf48 resource06833.gif +10c1ebde3560959813f5d3795fc010c4 resource06834.gif +86466cdad1fef152a50aa59f9f808b91 resource06835.gif +fb5180e4fcac2d59a95c5ccc49475d41 resource06836.gif +9e972067ad6eca25e640d13adbe8fcb4 resource06837.gif +4d0437f1e3fd16fb2942cc8451db4004 resource06838.gif +b727ed7dbb5425d871a53decdfdc6f68 resource06839.gif +2854811b6def0ff152e39721fd29a773 resource06840.gif +4e3763d7ca2b94971a34791a1eeb22f7 resource06841.gif +46631f1c054f905d9c5fa066df090a40 resource06842.gif +e64bbf1cf7e76c24d2f98040ea49428e resource06843.gif +b5b8d562cb37e37e7b14559c51be3399 resource06844.gif +48efc69011bdab7777cbc5e3454fb960 resource06845.gif +76a4abd8cfe9a9339ae4c305ee628ed1 resource06846.gif +ea7329259b84b880d88ead07576716ff resource06847.gif +b06ee3849b421794b2616f951c401397 resource06848.gif +e36706f33cd13f0fdc72fa4c7ae9be10 resource06849.gif +99dffc7b875f823115e0acf44f72bb83 resource06850.gif +813efc5d30c349f258a2365c4c302e1f resource06851.gif +a679640ba8363ea76019754719e35934 resource06852.gif +f19162c4349c83f7ec80eb25edcf14ba resource06853.gif +05aeb2312265d2adbf22dddd42e4e577 resource06854.gif +3a553fd1cd297eaf2149521954be0518 resource06855.gif +aca796d592c74b787d5ee5ad257d6dd5 resource06856.gif +ad790678c9125be14e1e59aa95102140 resource06857.gif +15c254d31b67bee07f50562e2dbd765d resource06858.gif +97feeda6515049be76beaf3f589b6f5d resource06859.gif +dcb6f2e6cbc08f5575151e9f00e71bc1 resource06860.gif +5ece7469c8729fdcdfd400bab2a75515 resource06861.gif +9b51f1269b98088418d462f878827a1a resource06862.gif +299ad4807aa1e794d4efa577d314c4b4 resource06863.gif +7afc20bdcdf8a722e206eadd2765adb4 resource06864.gif +e068d325957c4826b16a1cd58799886b resource06865.gif +4c64c3067f079ad9e7fadde9ec45c6f5 resource06866.gif +a306d42e056d3c793a3d38d40a11477a resource06867.gif +198891e10eb64cab09cc29a6040ded0c resource06868.gif +595e553ede6deec915244192322d0aff resource06869.gif +cc5418ed868c5e21c5b87c6f11d5d11f resource06870.gif +9b3a7ec3c9d686162c726858fb6506e2 resource06871.gif +1d0df62f562ce6a87b543a192fa9791c resource06872.gif +942a2724f02c0c2b548767e1071b3e9a resource06873.gif +b1d2ed99274ef44568e62a47029e6111 resource06874.gif +83278806b7777cafdac29551a67567f7 resource06875.gif +acea0f21afd56e79752c9086ab6f89db resource06876.gif +91fae50d5ff1e520f843fad5d9b3b965 resource06877.gif +641f6f6ca72204e7e561bb5d90b6671a resource06878.gif +657b258f90ca13f9201419ea07189ff6 resource06879.gif +1f7f652db56fb253fb78c129de0d300d resource06880.gif +b4ffc173992d0b5ecfa1104d1a22a12b resource06881.gif +6e50aef9889bf9bb6ca9e97aa44b1e1c resource06882.gif +d02b664d1d5dd6a3214a97fde691ccc1 resource06883.gif +9e3a2445a865e4b1166f044d8fb26038 resource06884.gif +be675d7f103798faf03703c3798b36d8 resource06885.gif +cbd31b271e4aa5cfc71bc30d00c5e497 resource06886.gif +a97d3cc091503635b2fb347d9038fdac resource06887.gif +6cc62b47a37eefc746e251ef6054f988 resource06888.gif +ac70d4c75172db94401eb72414f844ca resource06889.gif +eda468f3e1eaf5e5b60502271a91dee0 resource06890.gif +e27c1dea840fe2a8d60da617a77dcd4d resource06891.gif +1cee2508ce392d9484f9b67cf486429d resource06892.gif +e43d7829bd6050b8affe6f976af0ef9d resource06893.gif +09b2619636e7efbbe593fe798c286edf resource06894.gif +45a2b6a2dd5ee02324106f0fb3b11322 resource06895.gif +a86e367ae6f9d9f02a2b69a341f8c5e7 resource06896.gif +2fdaeac9568f5572d753d540c4299285 resource06897.gif +49f6dae6f6b4fbc570b5d8d775a0a962 resource06898.gif +bebbf9b301dfc1949cce6d142aa25ee9 resource06899.gif +3230df941ac431c9037542386b7095b5 resource06900.gif +4a1df1da041de35137a59d93648fa3ae resource06901.gif +10166967181f3df9f1d2c0dca9aa75b6 resource06902.gif +f28521c95a27e5f6c968d21394f4e7b0 resource06903.gif +85c41ddb2322da12a2c952daa75caa86 resource06904.gif +b8ad10dad46ce171531fb2e98a45ed6e resource06905.gif +f564f6215c8c7907b9384c4316998a99 resource06906.gif +a905edb20948cd41db0c11bfcc8c6cb8 resource06907.gif +c7a63324805b5364a425d2232a0b8f60 resource06908.gif +41160754772c5fabb992f7f4327f2c75 resource06909.gif +a154be5d2bcb21c0e091d380909d1aef resource06910.gif +4a0cdb7157b57f35484e958577ca9d20 resource06911.gif +ade3efd6053a80620449aa85e9ea2cba resource06912.gif +3c9bd5fe7714c6a84d47b0f5f9b581cf resource06913.gif +aa84adc0fc89be503094171d364e14f6 resource06914.gif +483144ed49180a8876b243e990dc182e resource06915.gif +7e2630a8190a6af0dd19da5e3b4350c7 resource06916.gif +f53d68bb40ed5115b415ae8aae667219 resource06917.gif +7f17a19c1bebd0de2674070b0ed644b7 resource06918.gif +99d8def4493c8a950bf55996b31bdcef resource06919.gif +de795dd81aacfc26d5ad62a8cabb587f resource06920.gif +b257e996f6d120f3087eddbc829db5c6 resource06921.gif +003c26bbd35f7d6006f0c80417fe8faa resource06922.gif +f3292922e36779344e0a710e2fd0dfc3 resource06923.gif +ffc1ad74f702b5fe7a08f2ce4ff92058 resource06924.gif +08f8b02ec2fbc2d580eb6a785003aaba resource06925.gif +5e7c7d5eefd4c2dd4ce522f7d3c8ce5c resource06926.gif +ed5a445ded22413adaa83896e1050d15 resource06927.gif +a0805046b2e3b915e9507f09e71b5cf6 resource06928.gif +ba5dbf6039ed9fd1144d94be3e0505f1 resource06929.gif +f7557cddf73af5759ce793d30c3cf698 resource06930.gif +2a5e74ee9187985187e7a2603597541d resource06931.gif +6b90e759b897322a6a442df119d55c0b resource06932.gif +81ad8c311405c4eb10ba9dbb77b47730 resource06933.gif +e09621540365a8a6c9cc7419b8205b8c resource06934.gif +4ec432a91ef4397575e0741b137d082d resource06935.gif +a0ac1b84e3e14b92d880e06b5bfd5c30 resource06936.gif +18e8fb60d549f5950107b0f4e7d0f358 resource06937.gif +8d495be9dd327f2f6b45b10a82e7b8e3 resource06938.gif +d1aabd0e56c41a2b071145c0e9d90a96 resource06939.gif +e945d1bba567109a502861ad54e4d111 resource06940.gif +4d63feb00e1033ab566ac8b514d62da0 resource06941.gif +ebc784d953161079814ec9ddaad89e5f resource06942.gif +71f4205fc7c51d3afffc3ae42b491275 resource06943.gif +de22f2bd99ac2c5c389bd327a63e562b resource06944.gif +83c2892e49d1dd9dee0772e25a269894 resource06945.gif +597fdba248a2ec724890f965aa317077 resource06946.gif +1e50df2d1cc6c136565f3aadcb0113dd resource06947.gif +b537f12a84f5ead96cb1c4812bc1708c resource06948.gif +e59a684702a1006e7cf131f7b53c7072 resource06949.gif +5a8e96f3afb0eafb6d87b3135e272eca resource06950.gif +e81717743b247cb2557d5be01b2d3c0f resource06951.gif +ccebfaed3ccfce31ce1e0f110663146d resource06952.gif +485098a904338eea26f164784ad59d64 resource06953.gif +96dba81982c44d08f6d57f82f89988da resource06954.gif +013c85d0ad9a1c91f81d93c3abd62424 resource06955.gif +29cc149474ed80a92009f22ec447b540 resource06956.gif +1bcda7cdcba7163c00e8a2aec903cdc3 resource06957.gif +204d2ffbd5b47cf9f79f5e7e0cf86532 resource06958.gif +6307add7e5fab0e9b4205356e7be3dd8 resource06959.gif +42968db2cd127e7183d25f952fd86f1c resource06960.gif +c35b152b799b35bf0665a14ac9e74114 resource06961.gif +36b1d5c3b3bc5e218c8d587ece932cb3 resource06962.gif +6af22daf502d0c83e64bbdcdc5123ddd resource06963.gif +a0b905f04876c612da82d0e74e9b9203 resource06964.gif +d4cf13629a096c644bcd4b04937997f4 resource06965.gif +96ae36763eed2505516a645ba1c9c06d resource06966.gif +2bb50c48227989fa3867f46539080953 resource06967.gif +c213eea1a36881cdd71d93ad6cc3f7a0 resource06968.gif +7b212cfacc7eff1dc9b89d9261ab4537 resource06969.gif +f3b34a7f52e7787e182d13bffc0db34f resource06970.gif +a6a0c85ed824bdef0ffc101756033ad1 resource06971.gif +bcc7c8024fbde01cf7eb6917d7bf7df4 resource06972.gif +436342848287477ae9b66fe78fbb6d7b resource06973.gif +4920b2506848d924f3ec5175784815a7 resource06974.gif +afdf0e0de76538a3ecb1c5fb6f260c37 resource06975.gif +730e109078ed3322eab52f3da0e16b96 resource06976.gif +7b7561511dfa5dc6e934dc8d1678aa71 resource06977.gif +9e6c766cc45492e51d6cb82402e9ad6b resource06978.gif +c8dface443cb9d65350dfe5d80a0ba9a resource06979.gif +6d3d54b48703a8d65c6665dfa4ec33ae resource06980.gif +fc397f9415882077695a14aa4894c46d resource06981.gif +e3398ff0b5d2f6a160f2a440e20a2584 resource06982.gif +18ad8372d239c78974bbe69688dd72c1 resource06983.gif +c5fe7c13253ca0a15ca0f0a53dc188aa resource06984.gif +03ccff573f5e8719fe0ded4fde17c75e resource06985.gif +f620f7ba6b9fe0b9d7d77ef6aa7a41d9 resource06986.gif +bd2f95744563f1c1983a3412a5ca680f resource06987.gif +2d660f050e516beeb7f75c1254217197 resource06988.gif +4982931fa2e6bdd84df488f658c86e9e resource06989.gif +64fcd200f7faa8059029849390f037b7 resource06990.gif +e7c09ffa7053ea0d252448ea8b7a440f resource06991.gif +15a2de712e87a4f46de9809b48cdd8e4 resource06992.gif +0e5daee1b9c2eb20878d9548078ef7be resource06993.gif +1b8d343795806dd44ce4313195aa7df8 resource06994.gif +5847daec4605b2a3a29ae6248b2f299a resource06995.gif +de3b8093991304c64a2a0fbca1cd1b93 resource06996.gif +74466d1efbe35b085d5e9d555257bb12 resource06997.gif +62a7f001920a3ec7907d696a9c147e29 resource06998.gif +636fcfb64763ed8b13a1f01673884efa resource06999.gif +0732121f818d302684a9fdcac36a963f resource07000.gif +b269f9c61ce18d29924fc7a1da222a9a resource07001.gif +bce9b512904860bb9671df3eb9891ef2 resource07002.gif +0a3013e2aa38da61d752c855161e1a63 resource07003.gif +17f791ed9f25d9b084a72ce1f565b2db resource07004.gif +3179f04dc547bbe5c703fdb4f390ccbe resource07005.gif +1f58a41e25a90d7399c8435e0153d70d resource07006.gif +390ad12accebd1c7d0adcba48cec66cd resource07007.gif +d135afaaa1f6f32b471c06ebd243e2ad resource07008.gif +cf9e9cde6ac5a8ddca304087b95c52e2 resource07009.gif +46efa98839f0632241a3f48ed18c3a65 resource07010.gif +97078320225181bfedf13db46f498821 resource07011.gif +7d3400660bff9188b33e6fd653709df4 resource07012.gif +1a02b4f9edf673799e1c515b29d81fd8 resource07013.gif +0e7b58451f625006fa03c44a291051de resource07014.gif +a6c00546b64e62b09a6731754c269020 resource07015.gif +f6c6289297e9d73d63c409410f24f440 resource07016.gif +16ab5a21ecd9b80be231ce8c90486b1d resource07017.gif +e405e56e1b1c7de09c38c84a13afc297 resource07018.gif +73db8ebfdac7c474405ccf708fbd2303 resource07019.gif +0154eb57a7b507f30b27940fa507f6e3 resource07020.gif +7bc3c58e9ac517cea4df19e94c758862 resource07021.gif +747e91413b3d74cdead22777d82ed396 resource07022.gif +5c8419dd0d4a10a5368241ef22355e60 resource07023.gif +52a6f44d7b66f289b24f54fb000437f8 resource07024.gif +8f1c3b04912d31280e159f6699c6e144 resource07025.gif +b509e17b7263f69e5d1d658ac8e4dec7 resource07026.gif +47b5680e312afc9ae03e59b859521dd6 resource07027.gif +7fb9a55558e25c21c54fb2963ef776ae resource07028.gif +8c4d769bc16c8305072d55b13a2a8883 resource07029.gif +ced59b68b44863c349141f8ce307b7b6 resource07030.gif +613a1834e0c91002818dbe035c60f0b9 resource07031.gif +ae870a9a33361a6161bfd3cbcc5c0809 resource07032.gif +b33c4b8ff95b8f0f7ac3e88b88206ee2 resource07033.gif +9bf12cb9429db134151edeb8a1cf7586 resource07034.gif +75bae011024e63a66a6793c86632ad30 resource07035.gif +981f0b8509cdf5a26606ed2c5b16ebf6 resource07036.gif +b21614b60736c853bde2ae868c65040e resource07037.gif +96207a7f3c6a22a0e0d52bdfdfafb4d0 resource07038.gif +cfb2eb203ce6c38c68c7683900bec3f5 resource07039.gif +fe2bf97a1b6581c4df7b2ea98c9fc068 resource07040.gif +c749525a222d4ae39368264668276270 resource07041.gif +eb56d1830a3d8fc65d7e37a6709e2586 resource07042.gif +e0bc2742e9b92b50c0a93a3b6913b78d resource07043.gif +370995c7ce97bed37c6744454486b603 resource07044.gif +9aad19831164c95cb61a9a7fc15ccc2d resource07045.gif +c89121b9190ccccd296659cf85fab53f resource07046.gif +da9d69fe431dbdc2cae509a351c4c7c6 resource07047.gif +088111836d5fec5ef0531b0848f858cf resource07048.gif +ee599ce2063917aed2588d1cbbe3861d resource07049.gif +9d5cc1f4a456b02417e544d81ee4c358 resource07050.gif +648f7e0a6fd93f3e0f7902adf85391a9 resource07051.gif +ebe1e26a1452410f7d7ad206d78f9380 resource07052.gif +ba05331c86a4ee0c1a50fec4b12c6210 resource07053.gif +93be6ec4e9fc598c794922139b57c59a resource07054.gif +9d9319c0b29a9d7803eec9340a581f45 resource07055.gif +1e96467347aa4ca9b002654eec762c6b resource07056.gif +346926280bee0055018dc8bf09568b9b resource07057.gif +e81fb8d177ad2fc60d0ee43834cae7ed resource07058.gif +0257bb34aac2b822b3d081849c2a0670 resource07059.gif +fc5d962b9f63e093bdfff7dc4c6a9259 resource07060.gif +9c88095900669aba739111dc6c964231 resource07061.gif +36ace74fb8823d1fe7a458c3ad615ac7 resource07062.gif +6dfb7f54879b3c125537ab344a502b4b resource07063.gif +ebbd1b32d46e10368538cd5c4546a923 resource07064.gif +93d3b47f3daaef91b95eb9abd0a99ecb resource07065.gif +2431a1ba2ddc84c9ffc0d0531d8091d9 resource07066.gif +7b3e426ba62b0dec2c92387198e10ab2 resource07067.gif +6a20fd8d8c9a5fbc6740816465162209 resource07068.gif +830bee5e2506d6fb983dd8e7f162ae3c resource07069.gif +1677f3d4093567b7174e4c6e38d15621 resource07070.gif +91c9f484b35b08eea415bec5a9b3dbb5 resource07071.gif +44c7ab62a261044f96d8838c947d9939 resource07072.gif +1a0a13b391e745ad13f839c79ba5ce3b resource07073.gif +a60b8c79945766d31edd2eb04f23b869 resource07074.gif +8a7a5a2fe8a8ee64b5e3eba14c4661b6 resource07075.gif +7504141753a6e92dd3056ebf395b0119 resource07076.gif +2cfb7fe639a86b672a6d2f4498d7128d resource07077.gif +dc29eca97173161cf7f4f29e911c7835 resource07078.gif +fcf599ee9da743d5fe6ccaf92ce16b79 resource07079.gif +1a515d68465e3afa6ac9e1bd593d0c61 resource07080.gif +cfdaa760572a8790c0b08afe6fe42d43 resource07081.gif +925e8cc5795642346d00136e1c16d5bb resource07082.gif +214a34ab73a51d19caef63271cb8ac99 resource07083.gif +d2b6390daa092c12aa2e37c6f48eb38f resource07084.gif +3b380c8b4ffde638d5c7df4ae3c72891 resource07085.gif +6770cce8948e98c97d64e3b52ad18b50 resource07086.gif +a4e628af71267512c9b25b8dc38a1426 resource07087.gif +ae20a9cd7e5de113273a8b03d65fc643 resource07088.gif +37836604781b679b755fcab563e5f783 resource07089.gif +88e518bc1408db92ff06eecca865fb3d resource07090.gif +3b0ece9d0f87dbd6605a25415961121e resource07091.gif +e0e779aabafd71109886ceed8b332765 resource07092.gif +b2d3fdd87ebc32d7141f88090a13bcef resource07093.gif +1a2af049e25d07d7044937b10072816e resource07094.gif +0536418259d19e6f04202bd31c2a32ed resource07095.gif +92ed530d8fbc8376d96c7a2735235d5d resource07096.gif +888b9b1b65b9addce6cc7e9045330c38 resource07097.gif +3f47db69d1d9cd5193a82989367fa80c resource07098.gif +e3caf81d5b827ad8e0be76c588cfcc76 resource07099.gif +ae6b0b412d1d479f1898cd3ee97e0a56 resource07100.gif +1f162066de711d3c3413359ca57c10d6 resource07101.gif +5b04f60d3bf37971d5a9e12cb5f437c8 resource07102.gif +0b316dea58213d480571a475f588ae43 resource07103.gif +375327807cddf8f117c91dd1ab577d9e resource07104.gif +473a909582023b3b06f221a76831d297 resource07105.gif +2b55ed81bb21d37402650aafb910fc20 resource07106.gif +7e327a0bb52d105a405baaaaaf8ad400 resource07107.gif +e973e6209cb870351600aa466f8bdc68 resource07108.gif +8973573b09496ee0907998d157d4f8cf resource07109.gif +17ea81157d36a0e5833afff588ba61c6 resource07110.gif +b5c1d1135147ab543b6cee90d7b85dab resource07111.gif +4ce6e2775cae72a48a89250b3637fc99 resource07112.gif +5cc002220b1c01e056c81737486d9242 resource07113.gif +8d44824250928cb0d97ed0bafe8e577c resource07114.gif +489162f66a608f5915bd56538f36e745 resource07115.gif +bb7270452a851557d968a622e9ca51e3 resource07116.gif +50becdb825411d161cf5abb85391b29c resource07117.gif +a737db47db98c574803a3465cf614d58 resource07118.gif +69eeb764da53b6c7a32cfce8e87a31d6 resource07119.gif +228393b0d81b5de23b593c56c8263cf5 resource07120.gif +8e39b0115848f04bc0cf32620109d97b resource07121.gif +a9ef0509763e2ec49e56204f6c8ade75 resource07122.gif +c1d5fa326ec9a20a846bb50a2ca9fd4d resource07123.gif +2089aa34155e74b510570514d9963746 resource07124.gif +ccf3d0e5bfb116894e1f4056ad602778 resource07125.gif +1b89fb352c648cf56699f5fd38da4f66 resource07126.gif +24f30de3c8acf76a91635e2c4ee36fe5 resource07127.gif +ddf2c10e2388542b0c0370fb3d67fd1b resource07128.gif +50229dc4b40b4a5e0f905848bf34c48b resource07129.gif +190f062ccee92d9973a8a50df940202e resource07130.gif +600141dbc6372ab818e054354273a629 resource07131.gif +5f1d1fa92bc24338947c997934f69a34 resource07132.gif +0cdf4b2cf9ec622d694bd4b57c4e464c resource07133.gif +af28d0b3d38365b57b02eb80ef8dd959 resource07134.gif +8f35a8fe231e520a065cdb5966c39d7e resource07135.gif +ac0974a7dcbfc1fba00600b72c02ed3f resource07136.gif +b220e1d53fc9ae1a4157f74e2dcb4f52 resource07137.gif +d014e4f80531a37b3bb35f6a36fe758d resource07138.gif +7e3e798ec956010f254b6a49d69893cc resource07139.gif +2f9fa60b343b58fe2572021139329e49 resource07140.gif +41eeb0a4a6010a1124db826c7f0fd7e1 resource07141.gif +ff22e3d4059f3347574f48c1235394dd resource07142.gif +d837c85b46e691a1530f8534c00dfe0c resource07143.gif +f197b8e612bb65fa113b62fbe297a88f resource07144.gif +cba17ce97e8e2d9451e36102e95ccdc7 resource07145.gif +e0507e3ab3828504ab4a47ccb36eff0d resource07146.gif +22c4ee723b12ace7fcc2718f8b5a7efb resource07147.gif +715a673b245675e0847cb2cd7c0054f0 resource07148.gif +42051ac0fb6a13fe5cb4a36b084fee6d resource07149.gif +d3b6f4fd5b9ac0fa694fa0b16d538d27 resource07150.gif +fe9f9aef8b263cbe6f409fd9d3bd4ba8 resource07151.gif +151e56ae36b33c6c77efe81f0d2e57a7 resource07152.gif +62d4a580cd7ea3a33910b0765d906160 resource07153.gif +44d56e24c0ea4b189d289cb0951a60b7 resource07154.gif +aedc3eac590b83db296d58c47fcdc1cc resource07155.gif +5a866d736b8c3e255d643042b6828379 resource07156.gif +af766fea19476340b395fa2f7771db12 resource07157.gif +ccd2c69aa270a69ff81c13b27a5c7fba resource07158.gif +3fa0f99452dda8576313732db903c223 resource07159.gif +73082f58ad1356d91cad8a71f55c6689 resource07160.gif +68a36b69214277b8d9d1bd0479e75bc2 resource07161.gif +9d4b18700513e34fe1e2080e34c561f5 resource07162.gif +6a1c925d08ab239ce769b69c7498a54e resource07163.gif +a327b20b0b09d9795ae9947a512f9b04 resource07164.gif +4ab1a7cbaecc73ae86f568b641df1602 resource07165.gif +db74cf054efaf4f8eb313fe9ffeb994e resource07166.gif +2977be27a44488ec9302d9af5a7a5503 resource07167.gif +486b80bc8b55b60e42176388bb26cdad resource07168.gif +5ecf20c1ab7ed0501ceebfa76f3efa6d resource07169.gif +d2c5005973dc7facccd90a82561d5f24 resource07170.gif +814bf3e0ec47b46748c1e024caa474e4 resource07171.gif +a3e8de1575f8b40b73383d72bcc05e84 resource07172.gif +a4a1f53b766cb4cbc8a5a26c765afa53 resource07173.gif +423a3e0f9390ed9bd42b47457c791a07 resource07174.gif +6735769d28785f3003c25c9928d0b623 resource07175.gif +89f090c8b11a0abd10a4e539d19cd167 resource07176.gif +d7dcc537593836eb7a0c208099223ec0 resource07177.gif +9917f4f4d7c34ea69093f95d6e100f93 resource07178.gif +33caef766e93446f429494dac2e38085 resource07179.gif +3ba7b353d172e8f969f2ddf203a9921e resource07180.gif +72cf35374bf36045f11a88c05147b909 resource07181.gif +4a94c8e3dce361f44fb50a49fc8a32c9 resource07182.gif +fa419ef319451273b2e3cfee7ee00c03 resource07183.gif +766f03f18a1acf8248074282844a8e40 resource07184.gif +fc0dd618c0a7e7b648bacc512d0fb675 resource07185.gif +317685a52b08b7b19860df68aef6b2f7 resource07186.gif +38d69d07c90ae80e59e1da146b24e271 resource07187.gif +ac0015ce9cdaaaea9bcb9d048e94bbbc resource07188.gif +c47dfc91f11ea783e2daf5e0ad4def91 resource07189.gif +4bbcb92cfbede1a0153d5b9ec5763680 resource07190.gif +7a3f9dff14b5a64818165e6613b4b0a6 resource07191.gif +c043191e9b6c6d6b0522fceaf616016f resource07192.gif +4c3f1229550a258204ed4975b846e401 resource07193.gif +e9a53515eb271da743a1f3ebd61edccb resource07194.gif +bc94fe4ad348184ee6324f0510cb4f19 resource07195.gif +18226ac6b1e824172c46094b57195a99 resource07196.gif +501dea83499e878944e9f05b9de1e88b resource07197.gif +a6bfce2754899d374cda1c11e035dd5f resource07198.gif +26664527dc83bb9fb0dcdf2161d714d2 resource07199.gif +9e413521d5bc4308d48f355f7d8f23a8 resource07200.gif +617a64279bd3ad324a1336ebb1ee2f02 resource07201.gif +9c9ab6c817c267ec8318a8a85af33d31 resource07202.gif +a30e2eb4dbe7e0b71e24e2742ee0ea42 resource07203.gif +d92c881110ee410361f9fac544c56656 resource07204.gif +b711ba6306b8b2b3e0cf9127e60b3db1 resource07205.gif +6b7ad7877eced0a6e6d4b7a8772ef0e2 resource07206.gif +07225bb3a3c505b5598b07b277da06af resource07207.gif +05809c2d8530b654f1770f3f7754da45 resource07208.gif +8c48fc6558a8eb5b349c9e90c2ad4fc5 resource07209.gif +9414a8b8e2d15fa16efd124288f082e3 resource07210.gif +b5313c26d6345badae4ef3438b6930df resource07211.gif +22eacfcc35900dbdc925d5a9a13d9fc9 resource07212.gif +142fd2166cac7863e37a659f4549f47f resource07213.gif +aca0e61a07a7904e6b40644bee1a446d resource07214.gif +db0e8fd9f6e2115f821da7907ac2d29a resource07215.gif +df97a476dc55f02a3d96a53637072e4f resource07216.gif +b36122b5be3ed4fe4b95eb8cdea0522e resource07217.gif +e83b167494ffae43f202ea28abca4762 resource07218.gif +6300bda50efbda12e04ae78e2b0e22ad resource07219.gif +ca93e910f7df19fd12465bd1ef2d9dd0 resource07220.gif +2083140777ed8d77d7b192f846da5bfb resource07221.gif +775ba26e2ef72df0e5fa1b00fb9951b5 resource07222.gif +2f4e7664ecedb7a4a53ffb36dd397ee4 resource07223.gif +e1ff59ecbc35f33a88531488e279fe2d resource07224.gif +46dc7d6a1e007185cabc24332416e8e6 resource07225.gif +613b914a3c6e1b16259e6667994ed4f8 resource07226.gif +92c05900071f30c6604bedcfeb7c5282 resource07227.gif +474e8841b1019a7065aab0e70e0141b8 resource07228.gif +4b2b759a46fa77b6be9759209f8fc61a resource07229.gif +dbad38e5e3441571796334ecf85e7106 resource07230.gif +a7c1bccd0aad0f4623fcf914bca232be resource07231.gif +bcb258d75e221805aa75906debfb9439 resource07232.gif +25a6eaa2f5359870e619230567fab7d5 resource07233.gif +e8bf0a9fbe6a346fa2dddd87e962b384 resource07234.gif +d9764c53bc392ab281cbdf1d734d0ec1 resource07235.gif +d2b08788862ab225d237670fa66f2664 resource07236.gif +735afef3810cfaa0ff4f248b7fac5d93 resource07237.gif +1d99f47d1dcd58a9beee744cc29adac6 resource07238.gif +877a579867ad8da2fdcbef490443ae06 resource07239.gif +01b74779e94bacc1d0baf15733c36811 resource07240.gif +fb48e235a2cdc3d6341b909c381fd228 resource07241.gif +972fe22a410af235b9882451cde202fd resource07242.gif +ed86b5f97c43d82cdb559519065fd309 resource07243.gif +7b72fbc35b25cc4a475dfe7f18ccdb66 resource07244.gif +e147eb33f52e731eb46d778a3b25c343 resource07245.gif +183d6c06da4c1be7fbdb7e6e8a94a455 resource07246.gif +635bbd34867ac4a4af73b7c174e1ab43 resource07247.gif +a7a107e2102b674de1e37be5874ff8da resource07248.gif +6742d70aa746d2dfad0b1bed381e7280 resource07249.gif +cae86b1dd0b8bf07fe40cc16fe25b30e resource07250.gif +10790d5613bba665a89e4164462290ce resource07251.gif +d9f48a4588b7e331ea8f8565dac4b94b resource07252.gif +206039b39b804d426121403d2c4271f5 resource07253.gif +f5008b6225b5fe4c13ac5b4a8849b230 resource07254.gif +f0e8ade3802f2b49ec80139d434b62e7 resource07255.gif +8f704bc490138d47112b32a5e66f3d47 resource07256.gif +38c87542b0f1cf5881b5e7ed9ebfc511 resource07257.gif +3a576472f876025c140136f017fe124e resource07258.gif +e10b0f82fde9329e947c4a69cc6cef48 resource07259.gif +5561cb026a4dabfad4b3128a1e20f59b resource07260.gif +a827007ea765ad7937e3eca4a309e962 resource07261.gif +3e22a5299c955798f17b5a1088f62bee resource07262.gif +1a84130f14532e51b0b90300123140c5 resource07263.gif +ae6ae6b58cf45e6461c25895787ed6c6 resource07264.gif +bc85222dd73443f3b04aba651bdee8e3 resource07265.gif +83c1cb92f2e194a9f66379c86efcd3d5 resource07266.gif +1d8452a6077f51ba51026524cf8f769e resource07267.gif +724b971e1f43247c284079c3bbf81ff3 resource07268.gif +8674183d917175df4267e11468d59ad9 resource07269.gif +4ea5a54796da3381d10c819c1ed3673c resource07270.gif +f0e211c7763b62f8fad738e528857a07 resource07271.gif +f3b2e93b6940891a8130f8c2a938a27a resource07272.gif +8403a84b95649931026b7d50813e8c7d resource07273.gif +ebe795f694fe3f9bf0cd50a0ca327d21 resource07274.gif +62d7391f4c110aec60ff67660acc05a5 resource07275.gif +a87e3386195a2d76a2edee3c9a04fbde resource07276.gif +8d2d0b24171c8da7f0066df291cb0df0 resource07277.gif +2b8eebaf9390ac3e386d1a223e17296d resource07278.gif +fb8cbeda776bc69a52e42a83c9432104 resource07279.gif +328500a4b51e9d48ebc9e26df7eda69c resource07280.gif +35d7f4a9cc645c64166338d927ba7c92 resource07281.gif +00e4a2ee679172546003e8a72f1fb433 resource07282.gif +a236fc7b49b4b2e136170338c100d8ad resource07283.gif +cd0bef5a4f5892211e4fbc0133467ea3 resource07284.gif +7d430eb9036e878043f7da7f225cbbd6 resource07285.gif +0626d2c99c45e0efc6aee296344bb9b9 resource07286.gif +bf156d7ece1417ad2ac5de9da043a21c resource07287.gif +7f4323ce8c4d1f7643b226c86f4a0704 resource07288.gif +349c06f79543b3c972e857f40369c130 resource07289.gif +fb6833375f154e8b954de6ea85d04ba4 resource07290.gif +22fb6987e2aa9e80593371bbc35618cf resource07291.gif +d4b9c1629ccf5d04d1048491837c3890 resource07292.gif +2621b5725ab0c011e0cf304759f219c6 resource07293.gif +0cb7282314814274d2b6dc0935181aa8 resource07294.gif +004c5c80c4c9649431a9cde0f36f64a4 resource07295.gif +975b463304e1fe14b4d004ee71a45908 resource07296.gif +a8abe932947bbf802abbe8acac3e39d8 resource07297.gif +f9dd1248540735485f562219789510cc resource07298.gif +69b80871d623d215539c5d3a835248f7 resource07299.gif +11331a029249eeb6a22c94a225e322d0 resource07300.gif +303456adbd857f39bab6e90c489dda22 resource07301.gif +003a27bef5c6e88b62f3208a9ccc8f00 resource07302.gif +c847ebef3ea7e8df38d6587fdc4a7510 resource07303.gif +6ab2e11138224ce4006ce25e822ae835 resource07304.gif +87a019616b33d429fe206907a21e5b0d resource07305.gif +8a04f3f1ed5b84a3602117308f4be8f3 resource07306.gif +ef3566b909d093016ce74b23d69bfa71 resource07307.gif +3414e38893f396e89242a9466daeb21b resource07308.gif +db56840e607fe06a45a91cdd45a09fb9 resource07309.gif +4b77d964db8b385fa8897f770f2892cf resource07310.gif +bea7bc84f362e5951066f6447359b115 resource07311.gif +40a3cf27fbfb005a53e6d1f75cdec4c1 resource07312.gif +f79ccac439e8029bbb534777a3924412 resource07313.gif +345b592b0447a770577c5ac27eaafaa8 resource07314.gif +7cb4fde7b8d5245a73964af901998768 resource07315.gif +50c04bf2120ef2a2b3faee99085dd552 resource07316.gif +71f3345c52e4792eb3a4c79b30cd1ecb resource07317.gif +43ac2354d492ac40dd02b91c61be117b resource07318.gif +e9e232163ebddfe7eafd9c8ddfd701e4 resource07319.gif +a21cd3b05fd0c95e8439f710d641db63 resource07320.gif +6b19ed9c278b258f6485eb12a046179c resource07321.gif +c91fe72281fe89cf6116b348d5b0cc2b resource07322.gif +2008e6c69a11b16be29025e4780d8a88 resource07323.gif +1287e1831b090cbe45f225614c282ef4 resource07324.gif +791d97f08a954561e4abb0d62d207c51 resource07325.gif +fb65364cf7cca1ee48b1284a5edef275 resource07326.gif +ecc2e5ac14255ce6610d060fd4a25957 resource07327.gif +c53b18b7a3a36b80961ee6de6d1f0643 resource07328.gif +7faab7932df5effcfbe73d0e6adb60c5 resource07329.gif +526394a57d700aaa2c619aaa73f7753f resource07330.gif +45e1efd0360bc68f2cb947a5b41b908a resource07331.gif +bd24e32eeca32523d8ccc93c9f61d03a resource07332.gif +ad99a8b94c843e36165f283aa8fb25ae resource07333.gif +25bb02795e934b9c96016521daaaae09 resource07334.gif +97fa5fabffb803c94a5d7ebdb30a8463 resource07335.gif +b4cb2f27387b021c24865040579df7ed resource07336.gif +e6970ef9e3d32080a495c5482067e9b6 resource07337.gif +b0e1592117a4a7f693de971da653e3cb resource07338.gif +64cab009b33de883c141cb8a684bf5ff resource07339.gif +585e2ebfda1ed215ca67ec33453145be resource07340.gif +cd6d8837778b43a21b80abb892cec268 resource07341.gif +9eaf51afff92e5b778e1add9729599cf resource07342.gif +e80c73e8b6bfca8b3499727c7414dfc1 resource07343.gif +3470ae071beebf515a1d6cd33fd3a10f resource07344.gif +ac9631929afbc7ed2b04337cad358687 resource07345.gif +d7bf9bb84b3bf2cb16279be488ef47d5 resource07346.gif +5e4a06966ee1ad9d1faf96061929b6df resource07347.gif +592240dea9a5af8c0493de9df6d189e6 resource07348.gif +c1578168aa51874bea36ee84400cdd21 resource07349.gif +768cdabbe0d243b235c7f25c2ff5c602 resource07350.gif +9e812f728f8fcb2e42fdcec21946e3a7 resource07351.gif +a7f48dac1ba3973c5a8f62846d89940d resource07352.gif +4acbf03dc239ac1a25ab94af1a88e4a5 resource07353.gif +e2480685bae3858d7fe98b7ed8453964 resource07354.gif +643857502e5d7de05b165ad3ae00f9da resource07355.gif +4846f31f45f33e3c44bdfc04849d5d1b resource07356.gif +2573f56c55c74aab2803902022f01886 resource07357.gif +06e4cc1e50dd4667c07bda020b47af44 resource07358.gif +b2a212572ef4bc59bdfdcfe77bb051b1 resource07359.gif +4adb27ecaecfd0495fd5a9d798e06853 resource07360.gif +b75df966153686447603e414a0daa2cc resource07361.gif +b3a41cc73d79b7a8b72246cf8c16c663 resource07362.gif +16f04f4d4abf79930aa8d83b6a0285a6 resource07363.gif +9f2a1628eb93f24e6a5d8687ce8f943c resource07364.gif +92904ac708d69113c6d4467d8bf3d8f0 resource07365.gif +a9b866da36459ef8678a49317b78152e resource07366.gif +58db1e5c39867486f6aacc095108703a resource07367.gif +793fb2d7785b49d048d425bdcf0beed3 resource07368.gif +ad722f359e7f9368dac5121ef5656bac resource07369.gif +af44d381bb8638297b834a7b8a2f8154 resource07370.gif +4e41339c8b5e6bc6d02158ef2fa6c32b resource07371.gif +6b1530b5d8d9df4f8d2fef3040a61e16 resource07372.gif +8ccb3f92bd5f26836779b0f396ef6b4f resource07373.gif +3457aad74e00c58a3756ff6e4842366a resource07374.gif +51083c7344aa7f4e8ecdd8f674c5b9a2 resource07375.gif +0c95963d4f19141fcba569e512cdca41 resource07376.gif +bab60de2166abd44aedccdebb6fd142d resource07377.gif +d3110999b424461288e823d9925aef3d resource07378.gif +52d5dd269f67ee42d8bff24c89d5a20c resource07379.gif +1e621cf3554be8ba87451780666f5b74 resource07380.gif +7b8281fb22a0edd259ba7277d4af07df resource07381.gif +f5992846cea1bfd1f957c82ba613b16a resource07382.gif +98be69c61d9a2a6019a7b6df6f672f4d resource07383.gif +7fd493e9284de895fa45f374e7f156ff resource07384.gif +732d996dede097aec98a5b5580fb6e2f resource07385.gif +62c4fe4fa276401551e08b3d52dc84d7 resource07386.gif +e3c78657d367f20b16622307fed93fe2 resource07387.gif +e0482cf908bfeada20ebf771d56715e1 resource07388.gif +b9ae3232f483e6cc99931d49e38a6b8c resource07389.gif +f2fe603c648455093d90923025e98bc8 resource07390.gif +89c69a3139c46c8fce9bdc22a5bd36fb resource07391.gif +a46fcfca5cc807a9da1c873f0087d6ca resource07392.gif +6e66660e491d7145e22d9bf0b4d51080 resource07393.gif +0cc76c4b9dee72b8e1514b571ae4416c resource07394.gif +4f39acb5a5b67eed9064e73789c60dc0 resource07395.gif +1cdc187f3ea057a51566ca50c19e64dd resource07396.gif +4ef631d7a7d03cf3629a024cf5266561 resource07397.gif +e673f775e5cd954cc9b73985357527c1 resource07398.gif +47ada42126521c6dacd7c467cac6ef0e resource07399.gif +52f453472e99a24378cc42f0795f6cdb resource07400.gif +5c255e70f1a9f492b02bd73ff7ab17f0 resource07401.gif +c62ed4cad981a757d6099c871edd9337 resource07402.gif +4a8b9c2410f36877c956c2f1227f17d0 resource07403.gif +82e6cff47b3d52d82c2862c5609211a3 resource07404.gif +0d21be6d0199c07cb6b0794f4c277740 resource07405.gif +e0db2d5d8046491d31f1d8fa15641ccb resource07406.gif +ac48c64be378e205e7ec76498914cb25 resource07407.gif +5b1f3116ce2666d883cd9781cc291277 resource07408.gif +453b8f1c22ac653ac5c63b0e715d1fcd resource07409.gif +382e1b3a9269e1c91a6f66d3264d290e resource07410.gif +717c9a904aefcd5c1b36696957f9638a resource07411.gif +cff649a5779f3f1d6c1e7e9b168d5b27 resource07412.gif +985f2d91bc041f5bc9dc37a8d18bbed1 resource07413.gif +41f699bb2d98027a8a297bb964b89765 resource07414.gif +5a24bc7b42a5a5099e7dca504b2bfede resource07415.gif +37587d883a3baaa5dfdb80ddabdc039f resource07416.gif +4b7ca8d8b94aceb6ae03fb8901c09674 resource07417.gif +837023b10eac014c021a0305b54c8170 resource07418.gif +a14f55bfa204a6468c811d415a03a984 resource07419.gif +4e9e56925dfb64abd509b45822d02375 resource07420.gif +e68d8cdf3236acd1e4a47bfba6441f0c resource07421.gif +1896873ee5de4a48a02ca117980350a8 resource07422.gif +4ac672b441046a32d0cdd787a9fb7a9b resource07423.gif +6923c3066e67ca6ffcbf8e3da506ded2 resource07424.gif +d8855dc2c6487208a0b8e7546fbde089 resource07425.gif +9abd79845295e995d775bb1d032385c9 resource07426.gif +9e3d6de997adb3bba53ed772c648a16c resource07427.gif +4f3770b914ffd6fd24937989eb905191 resource07428.gif +b628c9b4a67c77cb0356313c13854ed8 resource07429.gif +587b091eeb2ef1fae9bd8ffd704b97f3 resource07430.gif +15a4c2dc53a32dbe6468a60a24e73a24 resource07431.gif +26d91741ceb361448533726281e0f4de resource07432.gif +9713fec51057ae43dada76f3a00a45c5 resource07433.gif +eb43563ab7960c84de2f128f6d43c318 resource07434.gif +34edc9b33383f33b7b2959c3463c46e2 resource07435.gif +0899fb07088d8024e6b2591ac88d640c resource07436.gif +eaee2a3861def77634b524ae44f88e04 resource07437.gif +0c50c3a46efdbe835ed02a564ce85df4 resource07438.gif +332f29fdbb88853b8f4894aeb43e6d95 resource07439.gif +4e993ef4290bd77d35099a7827b029ea resource07440.gif +716669f50ee71185e5c13c48681bef6e resource07441.gif +7d6236ac859aa239b05413a7de27afed resource07442.gif +f78b847447defd3421b5d7230a9bf38a resource07443.gif +a8a32b80616e2a9db66fc331bd23fe2d resource07444.gif +9021169c936e67403b812dcfa43b799a resource07445.gif +79493beaae3a7c2f1b7efc635bf60b58 resource07446.gif +0af592d76d0121a535a5fdacf38a3ae2 resource07447.gif +1271c3bb6f2a46c2d5b2bfd2caee329b resource07448.gif +799a7b9b9adb25e423577394c9503c70 resource07449.gif +229e708c0780aafeacb5e803909714ad resource07450.gif +0e12d701178153dd75dd309a137bdf87 resource07451.gif +63595a6a9e376a04d3614693b4ea77d3 resource07452.gif +6bf522d4500ad1e74f9fd1f82e265e65 resource07453.gif +b8ed914cd20bdb051572e86d405d329b resource07454.gif +6fb0fe9d28624706bdc78bd4324d80c4 resource07455.gif +8423622f1e883e1bc2f6e7ef26268b5f resource07456.gif +a596471dac8319a1f0b566e3dff03eb2 resource07457.gif +85dc70b5c70e9b2eafcfe126025a02d4 resource07458.gif +a877d506e89e369d774b5edb6332537e resource07459.gif +d2fcc1ea595037854acfc6cb4f11426b resource07460.gif +62dd19ec979ec84500cbf38c3793ced8 resource07461.gif +23122d3593badedca7fdcc044b2bde3d resource07462.gif +256f0164aee66fb8e61f02bb7036fa1b resource07463.gif +19f96a276871761ed6408dfec45c2ead resource07464.gif +5a6794f1a2be12b66c1cc0e3ed7d135f resource07465.gif +ae92c4df6ecc2ce3aaad1aeeba66cafe resource07466.gif +6505d159d365a3cbb748f7c774c8c692 resource07467.gif +2eb644a39a6610a3c22a022b8a626659 resource07468.gif +960559badb0a017e6b806b9f7256e192 resource07469.gif +6a88339f0835d07cc6169945ef4c687c resource07470.gif +1ba1f3025d692d91154b983ecebb26f6 resource07471.gif +a1963a51d3cfc352b121baa1a06db8fc resource07472.gif +53a9c8d1617edd21dd78dc657c811de5 resource07473.gif +e2032092d4d79235c9ce497769b404f9 resource07474.gif +d6e711beb6089dbc2cb6b0167a8978db resource07475.gif +7b9921abf9c49c2d2d2d3abb384ce85a resource07476.gif +e3949f633fb87f3c8ce2039d61b3e473 resource07477.gif +6d53faf5072764468507bbd584f2a931 resource07478.gif +218ad7db40b5e6a3256264656f8b9fd4 resource07479.gif +e2404e0f154f302197c2084dc7942567 resource07480.gif +9c9b22915a1b068b990310f8265ddd16 resource07481.gif +c05d98c25e8021ff2fb015fa46b19eb6 resource07482.gif +71aeef9fd29a9e06d13b634c42c84590 resource07483.gif +70209771ed439a66fa70772edbf8bf13 resource07484.gif +f25764ce5a86bcfab4e2a2eea2a7f2ef resource07485.gif +56e608a69a335663c42184fae1c74e48 resource07486.gif +ca1fe2764297e1c7a6bcec1e66747c2f resource07487.gif +77856fb8cb655185a62a267deece322e resource07488.gif +a117fd2fcd446b4075f197d8b9854008 resource07489.gif +5a035f7157b6827db1b3c193a010274f resource07490.gif +fb6109385a54a819fb6cb302a724d3c8 resource07491.gif +1e32644181898ba5b6cc18bbf8dcf0ca resource07492.gif +829ae07aa132d98e355b19bcd40be320 resource07493.gif +843de8c5707d756e839e7b2044a5c86d resource07494.gif +d8e287e7fddc02c8ebf21b4e75598f0b resource07495.gif +3d3d22e7abe345e9f4e9bb0d64866d6d resource07496.gif +4253c060c26406abe49508ffd5d395d9 resource07497.gif +42abb20ab138b0f14886d68eb80a30e9 resource07498.gif +03dc8bf0bcc2a5bba77e5ae0ce498e0d resource07499.gif +ca5feb04bc814f086a9072b750a19b2b resource07500.gif +851dbd4a6dedaed3860b3d31d37fcbc3 resource07501.gif +8433ea794bacdaacd0dba6056becb303 resource07502.gif +4ee0c799a8d68fc92c1317199203405f resource07503.gif +639650b1f7985e70f3205e48ea5a9e7a resource07504.gif +22272d8bfb5597f4a6213415ddcd4396 resource07505.gif +b682deddf47f3bfd72ee4060fc6cce9f resource07506.gif +3e1c22132c280bb0bc49b80684d29a52 resource07507.gif +4b7feb2d49ec2183e2ae28c9a8dd24eb resource07508.gif +8336f5f3b06dc87ac549b428c8f897b6 resource07509.gif +fe403b50a6658f3f7a7b1d9a31add878 resource07510.gif +92c05900071f30c6604bedcfeb7c5282 resource07511.gif +474e8841b1019a7065aab0e70e0141b8 resource07512.gif +a95a1c42e33cf31670d4aa0594b66ed6 resource07513.gif +386f09bc3792d6ce8c58e3fc7cb9fb55 resource07514.gif +de9eaee415b55c03fc3b954fbcd41a3b resource07515.gif +9c3666408e83977cf7e8313dd321a42d resource07516.gif +6e7d681b1f079667b5b223d2f8efb037 resource07517.gif +b5472a495ff45ae0f4cd0564489be23c resource07518.gif +2d9efd53c00ad28379e722fde49fa8cc resource07519.gif +251cfc3561a2d9522698c54c0e170cfe resource07520.gif +b030789292449544dc3c0b66928de289 resource07521.gif +37624d4f05321259f875e5f4cf6d1347 resource07522.gif +a0ca2c7c025e99eb602f447ca7171d43 resource07523.gif +a7df13c3be760fc8b2de99aa371b9200 resource07524.gif +70c9501f5085c549a1037ba7aecfee98 resource07525.gif +77ea3f4fd421394cded1fa32f3fd3cac resource07526.gif +cb605a211b683f9f0c286a0f57c60f19 resource07527.gif +e0bcc4679c3accb40bb422fc553e6af8 resource07528.gif +53f55bdcf645764c32575b55df32077a resource07529.gif +e583b9bbf1c585af7ea522d10b9b4d2f resource07530.gif +c4682ea526bf4669d3536d1ebbc12d14 resource07531.gif +04549738f13a7ba2fa342209facf8d8b resource07532.gif +a83ea200ca17fed4003c32050e09fa4a resource07533.gif +8e179be1980577aa19e17ca7480d9bb9 resource07534.gif +9453b0b83c30636f6296e4f4394e3f60 resource07535.gif +c2cc51ec4e4937d08cd69aacf96d5c70 resource07536.gif +5ba1a140202534d5ec337882d45eb9f1 resource07537.gif +4e4aa04f52b4d961df7cfaa20ecef14e resource07538.gif +66a592751a2783d7f01e291db2ae047b resource07539.gif +8c4387c94039b950c4a8086dcaa7de57 resource07540.gif +e83c8adeb6d6e7af1252cbfc1f6f0fdb resource07541.gif +009427bce6ca1b0cb5602815aa51d38b resource07542.gif +64406301ea538675fcb3590924d1dd9c resource07543.gif +9b521d16b34cccc2aa286f403be4605b resource07544.gif +21b52c6fd30e7232f4523c3b8b655d0c resource07545.gif +d5e59bc78b9b39f562b85e71a94eaa92 resource07546.gif +6cb9cf6b465cec047dccaacc9752709f resource07547.gif +fad65e424041f691f27866c6f7978000 resource07548.gif +7723a7f9db72f63ceb1e3ff008c0d614 resource07549.gif +dd61e1b50311bdf26138c5b160694c21 resource07550.gif +1c7bc4e74de1b29aa5483873c72e023d resource07551.gif +ea5f57db978e92e08d67edef26a110dc resource07552.gif +001f9752eebcebaa7e9eb383fe00c087 resource07553.gif +087517dff467621fdd93535bae44260f resource07554.gif +26bd2949f5a9137dc2592927e4a78a92 resource07555.gif +2b6d23d3fd5e16eb519be24abdd583a4 resource07556.gif +f85e201b463a5d6678a41e729ff95e60 resource07557.gif +9890e004aeb27cb1008ca04db79243fd resource07558.gif +daa42215d13da6ab41f16a0c38da4a3a resource07559.gif +b371632c4a3b97650e8f414e9dd2713f resource07560.gif +ff18e9de749d7866ff6f8e2ff8dd69e0 resource07561.gif +dfddf60898bd4ee2293b7fca784df9da resource07562.gif +e9576d2d2991240495da22551ec12ef1 resource07563.gif +2f096d68507fe73a11a28de4db5f1889 resource07564.gif +686f8a420defdc1a4473ee6478ba2a8e resource07565.gif +cdd13120383571cb67cf5888a0ec798f resource07566.gif +54d51197cdacfb5af397d1eb8b06a359 resource07567.gif +d7398cf415ea8d62674c79834c8aa153 resource07568.gif +0e173119a04c59cdd251e6be238d3458 resource07569.gif +d8b98d7d47206ddb87a8f533c4f05e5e resource07570.gif +7dfeb65e6ae4d4f25a0bdac8c8cb91e9 resource07571.gif +fd257b2b427285ff8c67ebd8e96299be resource07572.gif +c6ecf3e62693c60dcaec616ebb11199e resource07573.gif +b47742160bff3232fe016a8b4b4f0cf6 resource07574.gif +5c13b7ff15d3d21cfd0d255d96e080c6 resource07575.gif +48146ab7e3909616ce603d0aefdaa7d1 resource07576.gif +df45f5ec53339f0484e5616d915330bf resource07577.gif +485bc779dc090aea2443ebe2f592d75a resource07578.gif +36d7c6dd2e26d565f9a493aa71bdf0dd resource07579.gif +bc6bd8657d5088dff36e7469c2453fbf resource07580.gif +a7d639a9b8b43e697d55f6191a47f5d3 resource07581.gif +3f9b0f5e56b8b83daab5a5ccb8e80f49 resource07582.gif +628daa0baf6dbe26af4edb41b956f3a1 resource07583.gif +e5dcc3d6a223392abd6792978308bbe0 resource07584.gif +09bbeb5631a2bb778e5bb9bb0a504f35 resource07585.gif +75d059afd9117a4fc7c5e10611827ee4 resource07586.gif +7a876a16d6a6aec084e66db2aa3548e9 resource07587.gif +844d9b6ef3f64d9523ffbdee1b52bf1e resource07588.gif +076a7ea0940b89462387292a61478ba2 resource07589.gif +e8f37a1d726c9fc93098f2e1ba5e75dd resource07590.gif +a9ae6b39422e7770074741e17f249765 resource07591.gif +2ad43e28b5970f057bc318d3292fce86 resource07592.gif +4ebef159584b3cf8c8059b7bf3b512a4 resource07593.gif +72c1b1802ea1cd9b43ff598d69f39d82 resource07594.gif +7f62d15b7a81535345928903b25b49ae resource07595.gif +77c3a450f516450af01ffaf72be1ab26 resource07596.gif +bcaa9a0d070e186d3fa42c3dce8a983f resource07597.gif +11394e3ffd4ff4f8490f48f44ba0e0b9 resource07598.gif +9c26ad97422aedea4e8641fae41751a6 resource07599.gif +47deaf0581630ef210c78e608cf234b9 resource07600.gif +8d9c4857e460b6151bb6a8add5fc52ba resource07601.gif +d12b8d0801399a9b5331837b7e08699b resource07602.gif +7d44afbfcad8b0a3c57dc7d43a0573cf resource07603.gif +05cf29d5730fbea7cce013a14d28c336 resource07604.gif +229da35582c85d797af40c2a4aecf96a resource07605.gif +777a95367c71f2ed89524df0ec2a2c92 resource07606.gif +569bc8e3644c7864bd6aafb4766e16e7 resource07607.gif +c04ba8a3179bd0b045b8d2ffdb75504c resource07608.gif +0d7616da26cc0fa7616f1f245b149ca1 resource07609.gif +bfe252c66bcf75eac89e38552de23289 resource07610.gif +cf97d5bfc13b4b422468a37815715bc6 resource07611.gif +aba7562494ec85cd835348391b1e94bd resource07612.gif +7690f544c2d761576ca7284379512393 resource07613.gif +b7633a0f6c6af46ea6a46dfef6475c3a resource07614.gif +f509b0de0cb14d7c41477db94325d014 resource07615.gif +1a07c667ce32a3c64b1397e39c1ee8b4 resource07616.gif +9d8ec4bfa5a2fdb3950b4b18a1acab4f resource07617.gif +e73c49679690d186717904d6b1a35e9e resource07618.gif +5d98a06de6ee9c84ff000cdbbd71a4cf resource07619.gif +00e8a935ced8617aaaa41211e9203d4e resource07620.gif +73318b628bbe656cb26b1b46467b5318 resource07621.gif +5a3ec80bd14a037f7ec888744b322989 resource07622.gif +2927b0d6409fe97bb7fb9b80847f4099 resource07623.gif +7e3d63284fd33aed9574075ca61156a2 resource07624.gif +b14ec521fe57b6cfae361a344fb1a4a2 resource07625.gif +52c2aa910ff870cbbfea9c88b975271a resource07626.gif +1d564641f786c88f9e6d79055b0cbed7 resource07627.gif +ba7c6e1f7f5e36e2a3f2925d113053ef resource07628.gif +24f51863dbab1074b3fd7d2e513f4fdc resource07629.gif +060a715e5ca543d0cd9ea9c2a511703c resource07630.gif +461162480cbf754d6f35dec58b8cf2d8 resource07631.gif +3f78700cc2397827c5401c0a7f036572 resource07632.gif +cb0e03213316d734e9d988e6168f7ef9 resource07633.gif +f757e9d573869b73253caa8e19f35326 resource07634.gif +b584a86cae4c54393452355019673f35 resource07635.gif +80874ec1db54e3ddb063c881f08bcd7a resource07636.gif +fadbbe043863d31a03a702f2de3946e7 resource07637.gif +52fee207f9dd47b9fd147aa7edaa8b30 resource07638.gif +9742592d9058d2c8fb75d93685479c5b resource07639.gif +135a5bbf397241957c94af0943a14531 resource07640.gif +919cf968e783a4e8e64c0de7a7a27647 resource07641.gif +7d5fc3e84cc5e4ba927bfa83f28daee6 resource07642.gif +20906537ed42d6857341db33cd172f30 resource07643.gif +8d4964e7ff5a869b7e12d13ef62e1c32 resource07644.gif +f3081588dd8e70fe31b81fa05ec13fad resource07645.gif +8feb45186ffd920b2bd5c55aa8fd6149 resource07646.gif +d9b6ce68a1c3742d75b32d3ffca6db80 resource07647.gif +67376e02069f73f29c7cd09891bdad5e resource07648.gif +05366553c20e7c923aba8eb4fec0f796 resource07649.gif +887c05dce3ad53cf31c2cf64b053a700 resource07650.gif +293cde61ca5528d6e8ca73cb95b7049a resource07651.gif +d3476ccf803303ee84ea7a3eb67e718c resource07652.gif +bc8ae5e6174c8d078f1c4da62f24d39f resource07653.gif +f83b5cc8d6cf8518e65a911c4725a2e2 resource07654.gif +f3b4ddfcfbe1956f5b5267116c12a688 resource07655.gif +df3af2f7ff071d2d6036be80468dd8b9 resource07656.gif +5994ed5e6f300cb2699f1c7d90ad061b resource07657.gif +ef7a0a7e16f03268499e15cb5f229847 resource07658.gif +e8a905e97b1fb64143ac0928707b0e0c resource07659.gif +489882fb5ff340b392ac9ffe0edfe614 resource07660.gif +538afe80269fd116ebdbb86cde220c4f resource07661.gif +827726aa781e1eddb223a8f7a34fc1ca resource07662.gif +9f718096a6c0b762e5ed3797d8885610 resource07663.gif +f39b23b127b5464fda022e8f29379249 resource07664.gif +5f04f0f6d69cba416c2c188c61c4fecf resource07665.gif +95f68d7826192d5972c72980d214c0ef resource07666.gif +59e256f41eaf363c60d60d91d652edee resource07667.gif +4cd76e13f1ff585c0fedd7b839a8f19f resource07668.gif +0130e409e3fb152e2f81304957a03aab resource07669.gif +d45b39d56339b029878e15ff7fc5d3fb resource07670.gif +d5c35cbfbcb65e00ca7cdb84ebe585cc resource07671.gif +184cecf9c3611a3bceabf11100c0cc2d resource07672.gif +e6a1dc2a60d0b97030cd4b1674da3c46 resource07673.gif +4bf5471bc4698fb294f6b8f8b95b80cc resource07674.gif +a65f24150e1f69db1dd95da8e72e84bd resource07675.gif +78d895d702d4fa60ed87a73e1e655cfc resource07676.gif +59c71ff7834adf27ad4756e916720eea resource07677.gif +b802a04ea9ba80d252cc4ba8b02bf001 resource07678.gif +563f2f0120f204953848210b49abbd4b resource07679.gif +56d6e75b97bf3115466f38d34582a075 resource07680.gif +133c2a7cad88fb9a574dd367cfa58d09 resource07681.gif +6542c12d54fc4771924930e7f8c11909 resource07682.gif +e08d29896e691b1b4f0fd425aaf4f71b resource07683.gif +90e80716ca17ebc2e545a30911773fd1 resource07684.gif +43f1d55059fc93412768b1264fb1bd64 resource07685.gif +053020c8d3041653e9ffa231642c0505 resource07686.gif +4a0d43d30a778cec84ff015182301660 resource07687.gif +4772b9beaf0ebcf227f533ebc1e3b0cb resource07688.gif +4714407ca29cd12c395d30fb2f6c8e33 resource07689.gif +a961283fb5a25c1e29cb7241961f4cf7 resource07690.gif +f0af9270cc62bd09f1f6b5b275d23967 resource07691.gif +4bee98be5599ff17dfff92a0d6d55944 resource07692.gif +ecc2cebd1552d6456fe989242bc0ce5c resource07693.gif +a882c44f914f5ee85a3924b7d576ce59 resource07694.gif +00a04a55674dafb106ad382be29423c9 resource07695.gif +6c3bcc44b272c4ca48c104b7f294635f resource07696.gif +4e20000eef6989987bd6de12fa2c3957 resource07697.gif +4f0c6272f8451438ac1e6ff5087f5e61 resource07698.gif +af18cdaf93b3cd67af562bebae57e175 resource07699.gif +fa7b5a6641e858081884c1ecc2194165 resource07700.gif +f81a30b78f60884bd7ce3470b3766000 resource07701.gif +c3065068a910c861afdeb77345f43388 resource07702.gif +4463e927f3b5cca6a126f711ca172f69 resource07703.gif +eca5e3cb23ecb2ff4b5cd4133d40b609 resource07704.gif +c585eb2eb1ceda0cc904d256e2b27fc5 resource07705.gif +ed9d2bb61e3738690cb8aec2b7730d26 resource07706.gif +25407700f036888096d10649f1e152e7 resource07707.gif +fb66edc133fb51a0dab8e35774e0a6cd resource07708.gif +d5aff27fb0396dc061cbced7dc3ac948 resource07709.gif +3eef947e89911a495e87609840261e96 resource07710.gif +42a4524b2307a69c647c92367fc2b28a resource07711.gif +2e22ce0d43b257b4c079641f3c008e83 resource07712.gif +18c964d7c79192bca64dd30c2051ca59 resource07713.gif +858b7f5d146c607739db0ec11013c99a resource07714.gif +af9bcb5914bf32fd6e6284af42ca62a2 resource07715.gif +770986c1efb6b451f0e7ae7993be307e resource07716.gif +d5208cce0d2d6a0238488fb322ce36b1 resource07717.gif +0479dd3a1850d44948e108af8cdf93e0 resource07718.gif +d65468b4835cd5dad5e5e7b568944617 resource07719.gif +6326ca3249730188b74c8a34a177b52c resource07720.gif +a0b703f3819ff58a42b667c13d28efb3 resource07721.gif +0130fe85e3624166ebcde2f68d13ec5b resource07722.gif +df3fdc526cd24a1717816dc9ecd23b76 resource07723.gif +743e75986fcbca8c985fbbae1f4a8863 resource07724.gif +5a22718f3998aac412fe9fb9e5332db5 resource07725.gif +f2fcff9ec7f3aa177275393971e37181 resource07726.gif +80266660213fac171308c0d4b859013f resource07727.gif +04f4a50fb9dcf4251b638ed65a9d24df resource07728.gif +02927d3fe4c0235bee66f1961b70b3f3 resource07729.gif +4ebd658114dad835fcbc1a5eb73ebbd7 resource07730.gif +85536e898247a404d9a17c4b4370f940 resource07731.gif +fffcc7ddccdcb9fa60fa48f3eee25879 resource07732.gif +aa34f984b70db95dfab8f3841a4da567 resource07733.gif +a052b6c4de7f6708d8196699048f44e3 resource07734.gif +1422068028effdec41c8f292f47b1431 resource07735.gif +ad12056fb1489593027a7af365988689 resource07736.gif +fdeaaa5369be783829ae22d611a07aae resource07737.gif +2480eb73c112a621089f8348623925e2 resource07738.gif +3c25ffdb8ecc541c519b13420207f001 resource07739.gif +8022c6ffb0e6078790346fd7e3fb8bb5 resource07740.gif +06b6430ba864b420b3e45033a9f3601e resource07741.gif +3043b8b2d79064ad9fc7a2e6b6a91ce2 resource07742.gif +1542750347a875556bb46b07eb870002 resource07743.gif +6437cced6661e4fe4bc4bc6fa874ac80 resource07744.gif +e3dc210f16bd1362091aae1b68ebb4df resource07745.gif +61fd193e5cb4293de5b81d30389a551b resource07746.gif +3c77d3a9be40a130878835ba270ac0d1 resource07747.gif +4c2b3a8fb258d9aef7a82d56db3a70f0 resource07748.gif +f2a10aa7a575ff6ac6735cdbca0295b8 resource07749.gif +19e6f0c7b466a6f75ebf0bd3ed540e90 resource07750.gif +f89c9a6671dfa7beacac1b8700b3bbfe resource07751.gif +5f6f866d907371f67c4fbce422e60cc8 resource07752.gif +6530ba432f85e3c9bfdde2142d68bb20 resource07753.gif +90a58490f569c1976b0941a7a36c2d09 resource07754.gif +cb8f7d614204d1b5e52f470e74fc8c8a resource07755.gif +67fd1e725c518bf753342bc918a7e34c resource07756.gif +3d9d019c0325591fe08602d76dcfe9c7 resource07757.gif +106d7619dced64076e48aacbd1c14c0a resource07758.gif +8fd1a75a81a98d8aa67added55153dd1 resource07759.gif +b59d15a2f21a9a7923ffead23c63ec5b resource07760.gif +509ea81973ed8676a0c87880aa091940 resource07761.gif +87329ce4fa1dfd21f01f8aea86244d1e resource07762.gif +20e380ff1113418349a2ca603bf3f7df resource07763.gif +668c1496cf414275f81d7451b211f0d4 resource07764.gif +5d0976572a9a53726c8430454109d1af resource07765.gif +7daac66f1cc1869dc53b06f72805c840 resource07766.gif +79a7ea04babca8024506c67c100544f8 resource07767.gif +bc464ea8bf4831464f1279e95244c727 resource07768.gif +45253b7f17880acab176efa319c1bd06 resource07769.gif +92dd1c2b5ab82dcc3318676b9c9e0a95 resource07770.gif +8587efba81284ca8b29b5436da73db36 resource07771.gif +a1534343eeeb80ebeaaf255f672ceb44 resource07772.gif +615c86d4f9efe7df2b6e8c3ec96ad4bf resource07773.gif +e4dc4eba1d10fd767a3c31b6ff2d1124 resource07774.gif +73a8d20e8b3de1964a395f3dad1e33b4 resource07775.gif +45132ba318664933dbb47ac1b08ee02c resource07776.gif +3f1cdc50eea6ab681d7bcb9708808196 resource07777.gif +43c0d49c6f487692e0761be564227a77 resource07778.gif +80b2611da773bfdc332a887ab81c7d8d resource07779.gif +ba0574dda8415eb17c42516163d8cbb4 resource07780.gif +8b0c3382a2abea9436369eaf180f1524 resource07781.gif +12b6f310a9978cba6a2d9890535402bb resource07782.gif +c197799cf289b598619f214aa8cacaa4 resource07783.gif +478cde58db92eae0c8eac7d5d0e8f99b resource07784.gif +1c9d1099cb3fa80761e331beb6ac1d01 resource07785.gif +f321e5adbe8afcec7afa7b15cd6743ce resource07786.gif +5d426f893ae5cf5202f0897d8e49908e resource07787.gif +3aca72caa593956894bbcab7540d403c resource07788.gif +1f91aa914d376b53d69c474932b80d52 resource07789.gif +02f991c8faf116670a0c91967d7e6e59 resource07790.gif +7d5c6a3026236de45cde45e4dc5c2533 resource07791.gif +0caf8714259577a78052c746a73f9e64 resource07792.gif +ad58a6e0ee96b7d030999eb0c9831717 resource07793.gif +7c33c609b6a843fe9ed05cac18a6dd4b resource07794.gif +d9d3a2285f2bce6f05ce80d7a8718630 resource07795.gif +bd8e1328ed37b1ed0ac3ee92d9203036 resource07796.gif +d8ca88166fd7027f8682f3b14173ffc5 resource07797.gif +c4e4636b50e120dcb37832f2462dd853 resource07798.gif +48cde4db45b6ae49e6745052ba6925a6 resource07799.gif +a491f26bd3779c2406628646af18f4b3 resource07800.gif +1e605f06e4024c449aa4b8af4555312b resource07801.gif +db4ccef307dd86587417596e4130ef71 resource07802.gif +36a373d89790d999f22ba1e1fbb3c119 resource07803.gif +5b00d17abfa035b7750c9d3d11ae1fa0 resource07804.gif +5eeb11e35b28788378054ec8f36845a9 resource07805.gif +53fc72cec04650138a5fc9b7832a282b resource07806.gif +84d034feb872bcdf424580649f85cd71 resource07807.gif +5c25c229effc3f1e2035cd87f98eb3e0 resource07808.gif +8c29e44b3a1503d84a2abfe89bf4cf6e resource07809.gif +86eb9d6336042b455dcc0cffdb53ebbf resource07810.gif +5b5bd4104bdc81b8ab18d9c7ba202124 resource07811.gif +ef297e058f910ee04f99909687c2a141 resource07812.gif +c8b7ff1eee133452b523f417b3d966a9 resource07813.gif +6728f770424e040dc78d3e6ab66ffb9b resource07814.gif +5e6ff53962e4fd4b9af23c500e8fdbd8 resource07815.gif +1b2750b23ad79810aabf80b423a75831 resource07816.gif +7749b3e79e702da276068be599f5c5f9 resource07817.gif +8f43969ab4d0c8925544b1260a190d87 resource07818.gif +80d280596543e36f3449157634beabdf resource07819.gif +04355ea321bbcae6766d325cd6c4b5fa resource07820.gif +9a747f42c8fa2eacfb2d2da6bc2c170b resource07821.gif +aea99202a79bde08d8989493966968cb resource07822.gif +f1d51bca5acccef5501407a9f8af9cba resource07823.gif +e57547dfbca6250272d3005710fa5e9e resource07824.gif +7e40f2b1261d799f7a429898697ce4a7 resource07825.gif +ff4ef805d3b85a02233bf780e4692a14 resource07826.gif +c978fdb73135c73c2cf7e8dc4db05bbe resource07827.gif +279123a8d060aae1f7c57994d8871f1e resource07828.gif +8db399ac6f0dd7f71f99e79224fe5508 resource07829.gif +c7dc050dd6b80d873fe74a230d4dc2db resource07830.gif +981a4fe78f7524078f3f3dcd52334ec3 resource07831.gif +1d1c2939f509ff1714de3a9b3018f5a4 resource07832.gif +9924aeac4e6a4d303174a878840e27b9 resource07833.gif +0c2a8ddc62ac05f3458a30c41aa065e6 resource07834.gif +a315958d9f68e0fc6ea490476fe0c9e3 resource07835.gif +dc8fc89e56ee3ba78795cba77b3b6707 resource07836.gif +c32a4efd35cec89015f16fb30c43f585 resource07837.gif +82ddaf86c4f1fbcf4b463373557329a7 resource07838.gif +0f908558d42dfba8d1f4cf5c63a2b0a0 resource07839.gif +424f85d8f2a1b234a11065bb73510036 resource07840.gif +98a6bff9ef8f897dce43db154caa51af resource07841.gif +137c0a4d7e3f4db36108b2a66ea45fe1 resource07842.gif +8495e8fd94b3cee10ccabdbd0161552c resource07843.gif +66a376bcb596de8f15434219f4316292 resource07844.gif +848f9f5313664979faabb9a45e4176bc resource07845.gif +d91e3f57261bf4aea735cc2febd25c6d resource07846.gif +86628bc51fd26878ae487a33c11bf018 resource07847.gif +54f10305e2e1b468318349297b908544 resource07848.gif +b8071b94b0204cafc172ae72e6b10028 resource07849.gif +c98b6fc1ae27ce5f85d329fc7b017d44 resource07850.gif +e85b27c2e943a975327d781a0110868e resource07851.gif +cd7d309b548579901f316ed621a6074c resource07852.gif +929099cf620cbc32cf42d21508b86261 resource07853.gif +16e899c3ce9da0a48706f94c5653c09e resource07854.gif +18be0bc358ef810bdc7d950bae7c70e2 resource07855.gif +21d5b40ee3da8f28535f861be51c6783 resource07856.gif +7d66fbc1a4d6954b8029c7b3fac6d6b9 resource07857.gif +d6b973691040597f6a038244f345f76e resource07858.gif +9628d8c3fec66acce08da9a431566667 resource07859.gif +e1dc342f3034aa86750cc645f094aa18 resource07860.gif +e21876300c00d478cdb538df198d397f resource07861.gif +273e6d25e56b42489051d330abdd29f8 resource07862.gif +c0c0b6862fe64733974ab89397f2397f resource07863.gif +1e5e7ff31d4b77f70a925a80fb5aa0cd resource07864.gif +60770b69f4b2e28eb1534e9dae403895 resource07865.gif +8d137663318ae3b18f1a10f285cc69eb resource07866.gif +053c5eed1b9d6ac7d6ce1969f30e92b6 resource07867.gif +eafa10228bffa1512d38156ea6c1dae2 resource07868.gif +22138b04652a81089a6e001d3237e011 resource07869.gif +50b8f955da45769bfb140bc488f1c06f resource07870.gif +d32670eeb37c83d94a7433c18051447a resource07871.gif +78a96d3cfceddd22febd5bbf8030f405 resource07872.gif +04d211160644d0b61bed9f2381b35a49 resource07873.gif +cb845ec2ebcc2f253babd4edbb202e89 resource07874.gif +5a02944613cc32d4b21183f8368b2183 resource07875.gif +e25f6de0d1f4599918fac3380be2f3d5 resource07876.gif +f9a49790c0100a8195d5d358d380d277 resource07877.gif +908ea5e5ce5b83ce921dab13f03c76e5 resource07878.gif +ea19d6ab262e4b90ff21eb1de314a0f1 resource07879.gif +0fa8656039344fa4970832be63b8443e resource07880.gif +84618ad6a757e69f737bb18e73b5cead resource07881.gif +ab85818b40e9f9e27ab1711304c9351c resource07882.gif +61d49539b258dda2a5aeb739256741bd resource07883.gif +f57339562c0d16e4b6c0256be1ef35ee resource07884.gif +e80bfe6441ba9f094ac3601e2569cf5e resource07885.gif +0c85ab231ba1775b8e24ae84caabc2bf resource07886.gif +0f9a2ef93197b212d09defdb34260f4e resource07887.gif +ea4353084bdd5c08960ed7f85f428f6a resource07888.gif +491d4f13674bce82800d3c1c6c8c8215 resource07889.gif +35c9a3f567d2ca8f46c1ec658481a8fe resource07890.gif +dbb02d1f7fc36e83aa07266a4e4a384e resource07891.gif +38d4a68d8f84cc71979269281847ad6f resource07892.gif +16983680878809b58e226ce1d39fdb45 resource07893.gif +e66b7b98d39b6aa8189aa8b4078acc67 resource07894.gif +150c9e5bbec77b604b579d59f63b34cd resource07895.gif +8b572a3792af003434d54e65f7bc1dd7 resource07896.gif +69702bc4ac0fb4f34f85d50536558c7a resource07897.gif +92016d4d35a4c9d106d711d04102d0aa resource07898.gif +95cafb754a32f92557c524a5b826dedf resource07899.gif +da0c0874a399e2278c2f2d50fab02e5e resource07900.gif +b4c953b7b7130fff1d56d10b96d69ffa resource07901.gif +edef340d46df65e1fb5537cb8b11ec93 resource07902.gif +1b37d393dff490c6b34b6499fa7f803e resource07903.gif +5fbcc07f23d159b0d18a9d39965488e7 resource07904.gif +0f4cfbebc248783e50a35699e4ab6165 resource07905.gif +dd29e1a1831bb81cb66c12d4e7106ae4 resource07906.gif +8e44817804b70e495e69765c0882bbf3 resource07907.gif +f2e990a50806eeaec82d167b4271de57 resource07908.gif +a38afceac36f759bf8101abbab1c9e2a resource07909.gif +024169e2410a5b4e00dc20d3785b29e2 resource07910.gif +ce9bc30b330e4803091d24cf5497e8b8 resource07911.gif +01947feb7dedcfbb754f46b649da0590 resource07912.gif +7641dd39a75a318e91e1671b096cc7c6 resource07913.gif +c8408cb3d803fe864c096b078ec8fd36 resource07914.gif +7e157814c6911f8a141e74a76a8a359d resource07915.gif +b35f006d730bcb231da29eb52a01d863 resource07916.gif +238af55d7dcd505be6a6e0e75b6daec0 resource07917.gif +0567848a1ff837f170e68c3b830eb4eb resource07918.gif +8ea0eb61a9b2b9aac75910b008a1ad13 resource07919.gif +bad2beb078276373e8e1cb74f491e4db resource07920.gif +3263022e0c45412cb14b7aaab54bc4f2 resource07921.gif +a3efac1f92d2b231358fcf8f6d965894 resource07922.gif +fcb8373dca564b26be2f920e3bcb23a1 resource07923.gif +0396a7d104024fb6c9b545b785f2c49b resource07924.gif +2aa8fd674a603d4cac2fe226b4d08baa resource07925.gif +10d7d3a6ec0b44d0e5cfd973e22aaacd resource07926.gif +899ee8a43612f95bd99c273de1b3d9ce resource07927.gif +3aeb2074ee0977412e0b99b6ea8ed629 resource07928.gif +97570b1723c158b0062fb7a9cffb2d4f resource07929.gif +455470b8d16e84a9e32b526aa5760d19 resource07930.gif +809de1f933352d893b397229afab335c resource07931.gif +df176edb059c8ef101328411988ef214 resource07932.gif +0a970d918cbc0e57ffe9b8fea2efc964 resource07933.gif +aae808d6f2e46fa95afe98233760391c resource07934.gif +6733356f3f597512eb3fd4f8abab98cb resource07935.gif +177596ca4ceec55240bd8b5467eebd40 resource07936.gif +e96f2c90605102b31bdcd9ad4cb2cb88 resource07937.gif +523320e6c334e662e0053ac6497d1439 resource07938.gif +719dbc3067cf2b7f2c5d43b5049bb1d1 resource07939.gif +a9bcaf3910c798bee94ce1473df1c0e9 resource07940.gif +b0f8bd1b45189e9e0e413300ceaf1359 resource07941.gif +275b8d037f9444dd7ae29fed3f83288e resource07942.gif +b25fa6d279fbfb57f17c550c022cc2ee resource07943.gif +f511fa2253b32b987ad191675a3cca45 resource07944.gif +7e6e39efb63e65e7b82bc6c5ba46ba03 resource07945.gif +c7e8819ca6a6270cb76ee259cb9c3eec resource07946.gif +a78a1cf61953de0e9f78460406dd6c4b resource07947.gif +26814ae365b80cfbef1198a810e37e06 resource07948.gif +4fd506904f7026572b6b9c89edc0c32e resource07949.gif +114bb986d80828163bcd4be8566eb8c0 resource07950.gif +cdf047e341c42f0f785d82ed2881152b resource07951.gif +302721e65e672eb81a76140178ee630a resource07952.gif +36c63f246060169bb99995a8e8b14ce5 resource07953.gif +2a0bb3c1629cb76f42569d36c57e9c45 resource07954.gif +ece922b958c01ff95482648cce66b629 resource07955.gif +e4ad675bd7d4bbd746dafef9ac2ac078 resource07956.gif +65ed4e19d69eb6ca61ef2035c13c8a35 resource07957.gif +aa68bbb6473f3e77db5444dd80e6e69d resource07958.gif +21154793197f6ca6e7e608260682a79a resource07959.gif +cb3544b7438ba69cc6b8820968b35393 resource07960.gif +257f897186de4b7d7dbad96e1f7b9e1a resource07961.gif +9bed43b7b85a983163b03c46b550e541 resource07962.gif +b869c657f0ba2b8bf9ffec26bb0543dd resource07963.gif +882d187116e3e3f9716c134c17069a2a resource07964.gif +74fe50dfaf6ed65ca7f94342f923ec81 resource07965.gif +81914021b59f784dbbaf7ac0fcc41159 resource07966.gif +093fd373daabb794f929b737912e3242 resource07967.gif +6fb8cbc635ee5f9e6caaa4c56c422b99 resource07968.gif +5f644d1e299fa8f2078b03b3f0b0803e resource07969.gif +865ffd5eb5362cd18ae456aabb09e476 resource07970.gif +6a7aa182776095bf925c0ae82cf4b63e resource07971.gif +102be63bfad51f03056e0e5c8a4fbc5b resource07972.gif +8204243bd21de0ef09d26ec095ee95d3 resource07973.gif +14fed321f5ae7930eddbf8f21d0909f2 resource07974.gif +bf7c3a5955dbb75c7631c4a463e0a348 resource07975.gif +d3b5e7e337e3cae1602b8d27e5eecfd8 resource07976.gif +e34480d5da07b2c89fe2e6cb50b92333 resource07977.gif +114c4ed1c0d3e53f313af5e311ea623f resource07978.gif +182714a9be8c21ba221d48259f84ee55 resource07979.gif +b0f2f36f8482814497c2dd9a22fe9b50 resource07980.gif +72006806283dd73d590b277c1a9ed4e4 resource07981.gif +d74f4bcea434827df53facb498ffde5b resource07982.gif +e1039c79edb49f8274c48ce58053eec0 resource07983.gif +505ca90faa85781d4b052f9e276f42c7 resource07984.gif +2d92d8c4f47492e364c32a7ae5e3cd10 resource07985.gif +f8b26540fb8ec66ff187d9084dce6897 resource07986.gif +d96c74b8ef4b2cb716fc117723e67893 resource07987.gif +d4a2b5dee4f5c2c394e457cea6facd1e resource07988.gif +b7f592bd471a92f8eb1ca22671dc7ab5 resource07989.gif +470a0d4b46c04e30b693c59bbe077cc1 resource07990.gif +1336d988971fe9d9b05faa031690e7ae resource07991.gif +3f895d7baa5e4b7704946cba566fb8e6 resource07992.gif +25e32307b7ff30a5d65ebe159defc60d resource07993.gif +db891abf93aad94ef72c105eb5d940a3 resource07994.gif +1373d577cd8f21f8fb9efcbc10ff22c5 resource07995.gif +5bef85a5f1faff00b9122f3ae686e03a resource07996.gif +86504fee4c428d288e93fd991f95d49b resource07997.gif +85005c6e82c082602cb392d55f2b79f2 resource07998.gif +60ff4c788a77f63a1ed5bb3c598a12e6 resource07999.gif +4e3877b6070da30f6ec28fdb2a2adb67 resource08000.gif +9f22953a98d878e1150d1b77581ae85b resource08001.gif +c2d57ff56fc53cce70a2bab9ae2bf75d resource08002.gif +85d317ff024ac66a4be2a2d357f130c5 resource08003.gif +23c4d252e913432b74ab3d4143d8edfa resource08004.gif +5b431799b1b3522d7ab9ca614b598118 resource08005.gif +da1a4043f7cd7fae97c1e815b2c62fd4 resource08006.gif +79592d09cc70027977f93ad856efe02e resource08007.gif +b11c2374ca9533e2af1a05192ccdd3fc resource08008.gif +bee6f105af58528673186b133fa3c021 resource08009.gif +fb7dd9a27016b935232e58d7aeccd740 resource08010.gif +8cb22af2310688c56ca19385a09cc29f resource08011.gif +d1af553d5fbb448dc02f26e430259abf resource08012.gif +43161cc48b60a4fd21ab563d17d67577 resource08013.gif +6dac75bf7f2c0930451c40dc37b0feda resource08014.gif +d268880bdf052bc3512b1a603c0ba691 resource08015.gif +98348cd117dfb13b99d2d1857418146d resource08016.gif +469dd3a1c23a756426a7381d7112a5cc resource08017.gif +d934553cf701c9e3d652a5aed992e7d4 resource08018.gif +ac324b6881abbfeac58cccdbc7fd6557 resource08019.gif +1923f0beb6a24ad2d27fe37dff86ce0c resource08020.gif +df1cf5ef8211f248d343251b933e75e4 resource08021.gif +a71b9a7686d1084fa24cf3c8b000eb36 resource08022.gif +21170b5fc45fec26c4abc2e77bce50dd resource08023.gif +6ca9f1179d83ec82c6f89d049d354dcd resource08024.gif +4d05e630ba909795307242ae15ebe996 resource08025.gif +06338171fbc269208734adc33b2db1b4 resource08026.gif +4f2ae0e303f9e5a9120cd5cb0082b0fd resource08027.gif +f741473f800efc086a5ce6c150b5a4b0 resource08028.gif +98e5af516b368df42f961de921b1e8ec resource08029.gif +9f92aef91d436cad85224d5a49b73adb resource08030.gif +cce507e46198a5976a98026b205aac02 resource08031.gif +05d3eaa54834e7b199fb02e6cdc45fec resource08032.gif +c4daf24bbab3ef81c820cda219ece3ab resource08033.gif +b24582c8b94a2e630aad3661a2c6ee24 resource08034.gif +77a651ad18eb2ec07d867dcc6ce50064 resource08035.gif +dc1f94219a14e5dce4a5c9c510d5b49e resource08036.gif +fd21501a51e1522baf6f3b0b856ae523 resource08037.gif +80f8a71a24fbc149c3d54003af112607 resource08038.gif +e1846d08c1278ec1d6b07ea3368282b2 resource08039.gif +4bc65b152c5893b149556d50f98237e4 resource08040.gif +524d17c083c3f8ffe2ccc36644bc4e00 resource08041.gif +2f3889954d87ea74f331b07e6179181b resource08042.gif +2c618eb6124c1a086799f5916888fff7 resource08043.gif +064f51ab10c545184b234dd237964ffa resource08044.gif +0b0d841cca17e1b1529853a463ec59b2 resource08045.gif +7e5472404e3b9b00795e34ded808cd55 resource08046.gif +8461ac0725303c04bbb7eb66ec6cc97e resource08047.gif +5e5ee06f6bf969a2b4ee4389e4124ae4 resource08048.gif +17cf8c28da19b660d7ce350046a3c657 resource08049.gif +f38f0c30340037a67a7e95e64d7192f3 resource08050.gif +2a2c365c089b36edbc59895a11319013 resource08051.gif +e9f437af969eb068628c8159309053d4 resource08052.gif +8f0c6982f9bf48c321b2a3d0a596e7a1 resource08053.gif +683de2b66d22a1cc6a45a41f88d96262 resource08054.gif +708f53536fb6f93b80902d68a3bd980b resource08055.gif +9f5f7710c5af34d1788b448dad25d517 resource08056.gif +fdfb658d54f8682c4a83c8eb90ca1c0d resource08057.gif +fe4b06cde9c0368938db9efe835b01f6 resource08058.gif +3a8105ee81c73cfd82205f3e031886b6 resource08059.gif +c514bec2b32cbe25e24add2c55c29fa1 resource08060.gif +7055c963128d27ea1ef83c3efaa2658e resource08061.gif +3c97c870ced4bb7355525cdde3d4604a resource08062.gif +1d172d977f24764d5eb32b739ead1c8b resource08063.gif +2b5e0ac59c870c2b35bb2a2cfe1ecd6d resource08064.gif +fddc9d517b1050821a48e499733f471f resource08065.gif +3b7d38e75a557714a0c2dbf329888878 resource08066.gif +896e782e6662d63356c6b05f0d74bc57 resource08067.gif +a56243d1691f3bc96744abbbd5d4a1fb resource08068.gif +ec852499829f5096ea04a3c84e3ca7cd resource08069.gif +b32c92eeabac6ceec6887d4a3f1a6edd resource08070.gif +14bba08a14d337fcd9f01d4f63bd58da resource08071.gif +f245a73ec50bf13466ba85573842d902 resource08072.gif +da5eb68675abbbc8b876c63e1ead3e22 resource08073.gif +d204b8cc463f6316c443bc381a8bbbe6 resource08074.gif +4a81211fc416d8bc8150af147985a7ba resource08075.gif +6ec7ae82022f050bc45ec50eb4979091 resource08076.gif +7edae819f0101ad331ee83c8dae76d5f resource08077.gif +21d935f2604f0239ab9c83ee415ff841 resource08078.gif +ab6e19c01bd71101394db8f3939a0e64 resource08079.gif +947f90e01755daa2bd0343c1e8ae1e26 resource08080.gif +281d7516a3bebaec7ec28e8338bbdedb resource08081.gif +34f76fc10176671265587b44ee872896 resource08082.gif +0d9d4f22933905446cabd52c1c930b50 resource08083.gif +2aa7ac2bb00fff928878b0ebaf3eddcd resource08084.gif +67295550aa4d27d5a5d3dd9b3421e286 resource08085.gif +71ec0122aad415d40e493ad76c14023a resource08086.gif +12f88843d47c8d57f08870e3f188e025 resource08087.gif +5ad930f597d97c0bfed323f009cc64fb resource08088.gif +225a03d9284b058df2c67ab84a08e58b resource08089.gif +a40fdfd96dccd6a7be9af96214114486 resource08090.gif +267e8df2aa26b08cfb29aff2ee9bbfd7 resource08091.gif +617add5e608d48752ad17c4c2b44b796 resource08092.gif +f1e1755720407465cf3aac74f2b0e763 resource08093.gif +25fe4056f64d76e05a8581c98d715ea1 resource08094.gif +35be483acf62baed788cc52bb8d09207 resource08095.gif +b28b1f8e12041ef7b76a0ed6c0d39f9c resource08096.gif +f64a9b4f60dd53a67d4470a746c73be8 resource08097.gif +bca79bf974423c05864ec3130583a6c4 resource08098.gif +dd20bfbaa8af618c63ca1625e4a10766 resource08099.gif +85afdafa2869d648a862e013e02f0250 resource08100.gif +d0c52b5f5c145655be1c30d54f3feffe resource08101.gif +6a9b3ee3f9ef59aeca6d582f34385eb4 resource08102.gif +c73ade4ae5d8e07ebf484dc5d7ce3309 resource08103.gif +d0c81290f94c0375b48aeda19f1aa354 resource08104.gif +d345856acd86e18bcb710a5c4236cde0 resource08105.gif +65c648753cad36e6139cd7d20f3a2cfe resource08106.gif +684a8f86d6a27e7e6f44808653758279 resource08107.gif +b9c850400ee925ddfcfc91df52addf92 resource08108.gif +5c156889f5e694c527242793c684edea resource08109.gif +df20f4c4b6513ff81ace11df80b666ff resource08110.gif +2da9ff828a34d807099987ba74ba46c1 resource08111.gif +992d97dfab623ba9caaf9eacc51b8b2c resource08112.gif +5e48a6cc387dace4465f27e30d110b50 resource08113.gif +4d3a9215746a34610b910f770b367689 resource08114.gif +1eef2f89637d20b8ce51ff762997ef78 resource08115.gif +d256fb8733b4846e7983bb888b386253 resource08116.gif +5f864b0b1dcb3ede48e1e7e9a8232a9e resource08117.gif +243d92d8a2f3177b773fc733d0bf872b resource08118.gif +6d0df600a1c5de59d7bb2e5733f0dfb1 resource08119.gif +a899d9d656864caf20546c54e53624dd resource08120.gif +0d4a1912c12d5015b787cb82af2c0041 resource08121.gif +22fbfd3b2ce10a2e5800f466cfd2d863 resource08122.gif +9a7b243979e241eca17bff661dbf1b47 resource08123.gif +5be55ef53d4c8fadd10ded387d392659 resource08124.gif +976da3a32f0c8167c460119bfd89e462 resource08125.gif +b98d107d096053a1f2ad96c1bedfa93e resource08126.gif +7760bfcffd5a329817824da4d4c2ff8f resource08127.gif +47a089f7fd9c4729a35b1d117a2865d3 resource08128.gif +f9b3df475a457f314c117660d949baf5 resource08129.gif +771368bd7b0d4909f8318a1d41dcbcf0 resource08130.gif +beae3424aea7cb5c6a74da3956668e8c resource08131.gif +8a6a19888779fcdaa3d43dddea938399 resource08132.gif +45274bc6603c6be6f703019067cd03c0 resource08133.gif +1004aedb33674c37bb6dd3d8cec72604 resource08134.gif +1eada013bc9652e011ee613dba2064f5 resource08135.gif +b3b718a595660b7c4564d9426346bd8b resource08136.gif +9d38c549d80853798e0c33fb9e447ef9 resource08137.gif +aeeedbfa3fa25db8f1330c3abb215875 resource08138.gif +6518c5d0ab695faf299589f39bbd70b9 resource08139.gif +758566df810d2b4923b84702b0b56e1b resource08140.gif +21152cb68641a61a2f5c30095d403b93 resource08141.gif +529da5ad3358ca76134f4707e71d0597 resource08142.gif +74ae81f9b6d0e304afe83be10163baf8 resource08143.gif +b89d0e7c9bfd85c8c540154042f83e35 resource08144.gif +a653f04149de496bca021b4c9feac856 resource08145.gif +54d703e00eb1c34e4731c494bb01e155 resource08146.gif +f5d3c0084753675287ffdead02f7d7c4 resource08147.gif +25c9437b32187aa5ef3b61361b799291 resource08148.gif +94dafe6d7633bb9bfe32333697eb86c9 resource08149.gif +e561a8967ffa93d4edae61fa613002f8 resource08150.gif +95cbb909e7a526c024c4fc09ea28a71d resource08151.gif +96162ecdc4f0746a6abb49c718bf55a1 resource08152.gif +5601aef33cbb3770c98475fb4e608ff4 resource08153.gif +8f7410c01f6be1db65cf242a0244155e resource08154.gif +cbfd698cb5267c95196f663003b1ce8f resource08155.gif +cdde26b215d842fd9756a06cfcfbdc5a resource08156.gif +7e11501544287132793c48d482a94582 resource08157.gif +030d087ef7907fcd1023737bc9945d78 resource08158.gif +187a9dca41f836e9bf41efd02d659c98 resource08159.gif +a17be876e9e5d7f0d026995b93af0f98 resource08160.gif +b574427038d5ce432ecaad9b47ce0850 resource08161.gif +9cd94b2cade256d0bed73f307f875f29 resource08162.gif +094eb1da58120fd4c4a6f57f47c39a1a resource08163.gif +6a67fdeb6efab2f28148f65ac40fbbcc resource08164.gif +f67ee18f2c9e013fde886637c2bbf84b resource08165.gif +1f1a5af2caa7c610099f0fe10bf6073c resource08166.gif +db3dd71bfce49ed638eca336d46e4407 resource08167.gif +c0392dcb2bc41eda25a9ec529d834b28 resource08168.gif +182039ff09d13d5604aac615cb49188b resource08169.gif +ef8488288826d2c97ec4c3e60bd667e6 resource08170.gif +b160412223d0a983454181bf6fbb5d4f resource08171.gif +a5d7d9e33951916b8bd2fdc4f36bbf4e resource08172.gif +142961823b63a4002e4d6f5f911a95f6 resource08173.gif +0da800fcad167d860d70deb9bef95d40 resource08174.gif +9b9037e32cb9824b932a0f98e5e0cdee resource08175.gif +718c57b5e2808336e4679356d47a4935 resource08176.gif +f22bd99eeef94429225d24accbad14ad resource08177.gif +305ef3eeeb4d4a0a1c6a8624ec81b884 resource08178.gif +93899766ced6ea6be2d44dfebd214789 resource08179.gif +af03267f02b6a4ad3e5a86d81a1a1af8 resource08180.gif +bf7426db62d4200b634027fea6afc1d3 resource08181.gif +9696b326e6f2d53a87f12f8ef8b20006 resource08182.gif +47b817bf11af27592e256c25dda98bb2 resource08183.gif +2a7e1f1650440d57a782b8f7b03d1e5e resource08184.gif +ee720be0da9c8ac868edd8c6b47ed868 resource08185.gif +2d16e1e636ad8758b7d228444b7d7ce8 resource08186.gif +3cf975755ec7bcb125fc94f18d0e20a7 resource08187.gif +5f512a662fa4ecda419a6b204da24ef1 resource08188.gif +f24cbea5de5727821573730f31368b07 resource08189.gif +42f4f60470649e58ed16900ece15fd27 resource08190.gif +3ca7a66e2d7fc4a723b18efea3fabd66 resource08191.gif +013ca336109c078c1431be2dd773bf69 resource08192.gif +b6842731eaf5179397df6ca172ab9061 resource08193.gif +34257d48116c54917b38377e918f9682 resource08194.gif +11e1c80fad7e0eb20e20c14e8f8acd64 resource08195.gif +da052806a05159de351c071c4f5ef4b5 resource08196.gif +10b54470b9cf155fc601256c816bd8c7 resource08197.gif +7607554c68b6ef5832959fa6144e8cd6 resource08198.gif +91a53be63bd593e0642b44720bedf3fa resource08199.gif +7e41302b00b5ab120d134f14960535be resource08200.gif +31e6c5f32e06d90c6aa0dfc01fa74d6b resource08201.gif +b227b40e777cb6a6da3bd4d2d8e07b11 resource08202.gif +448e967cf57cf8bd3a8edc34c6ff9092 resource08203.gif +8bebf6dd00af6e5425e3ea9fb4848091 resource08204.gif +c4ffaed1be7ed119cdeaa9c72bb9bf77 resource08205.gif +53064109913b146b8b6e532eb621097d resource08206.gif +db66a4df624d5a7b4355aac0ab801622 resource08207.gif +36ab161a7c08590f02dd80390b7e488c resource08208.gif +f81041e571fd23ff32420144eddd2920 resource08209.gif +334f0d87bbdcf983df71eb4196e6e3b3 resource08210.gif +856b1e3f0f1f898589d0459464b98cc4 resource08211.gif +8cd15daea477fdbaba2f91c56f5dae73 resource08212.gif +fc611e3e9bfb19dbebc32afcae3a050f resource08213.gif +9e4a363f19d0f208f79ed6f19ed24fad resource08214.gif +bce8115bd1787291da5b2027754b76f7 resource08215.gif +c35d026b960f17d06ad21819ffc5cba6 resource08216.gif +507b37f7becb8d2202e9b67c45c76359 resource08217.gif +c60e7bd1ad78361eb433fed82ea683a3 resource08218.gif +ca979dfb98dbb479efb509abf4d949a4 resource08219.gif +4895e1eea076f4939b3abffac76b133b resource08220.gif +29e82fad6f37b1f7e348cc8b35f74b1c resource08221.gif +7332d1c8dc3076e7db62d661f915b52d resource08222.gif +ec9d5013e8bc3768593fa27d24e4642e resource08223.gif +71747c7e417d350196d645ffa469b103 resource08224.gif +4a1c9a48efde54ebe1f39f9078007f2e resource08225.gif +28bd139043e7025fbe5c8df0429aaeec resource08226.gif +f5e346dcbf4b654ae7282d0906e138b7 resource08227.gif +4c9c2a52e4d6b44eef404efedb259376 resource08228.gif +852536124843acd6a09d8d3897a1d4be resource08229.gif +78ac3dbaafc2b7202642b3166aea6ebd resource08230.gif +992be50f06b6f5547f12cf2fa6fea249 resource08231.gif +8dae4823a99fe4289ec01b8bb4da8548 resource08232.gif +60d693bbf6063b0ce475da60e0bc4517 resource08233.gif +ab57e69f840bc83a1570e14ae2bbed76 resource08234.gif +65d8b1dbeccbbe58ea58678122345dcd resource08235.gif +c8c6b6aa7ac642fa9bbb9bcbb4a82be9 resource08236.gif +048d41af7b3ee00a0ec1691dcd3cfe1e resource08237.gif +36787744c619aff27c88a163a6aa4699 resource08238.gif +0de4f58db390553d0c7da1a1038bc264 resource08239.gif +53c8d27574d9e8730b64919a0497dbd4 resource08240.gif +b5a917538679b80cd31240a4e9ad3c25 resource08241.gif +f74c7349f3f1f21250f9a259f53303d9 resource08242.gif +1e1ee7a7f320c0b7a961e9414bb11b43 resource08243.gif +679b3e17ec5c57c91c21d480b8f78ce0 resource08244.gif +05dd550ff116e999fbd45dfbaf31a97c resource08245.gif +20a792363123f873f6beba778183725c resource08246.gif +742a15970d6cf7d638ac531d20939b1d resource08247.gif +59ce41bd7638ad25cf5e52c51fec08c9 resource08248.gif +207553293611b186f81735b509b1384e resource08249.gif +21fc9027f3b0ce5fa7905d9a1d7e9b1c resource08250.gif +e6a400002692ed629fb72bb3e7d081a1 resource08251.gif +ac70b78f84789f398fde510ee6766f1e resource08252.gif +4d87eaa317f1efd5672492cc6ad526c2 resource08253.gif +0d03942076ebf468f368a507ef845fcd resource08254.gif +72efb40b05af8a995495ebb102cfd0bb resource08255.gif +9696f8919df836123f757c57e638ea51 resource08256.gif +4fca7c9e877f5fa06aa461ed50e3dbe2 resource08257.gif +fc21b1a6e7d1254e4b2ae5245e923ea3 resource08258.gif +37ad05fc24f4f8fe3f42c0560bc76bdb resource08259.gif +9dae56a21490db726be5924057d54073 resource08260.gif +692a6a9533808870eff1ec02d4d77231 resource08261.gif +1a35be2802f1c9973988f0f70aa3c831 resource08262.gif +fa30fcbb7d538974d47e2f1300173d03 resource08263.gif +fe582a6a58894bb564d84f2f9ab437ee resource08264.gif +ec58d9120e908b446fe3780bb54c4b61 resource08265.gif +1427310a780d8d3b8ee72f788aa61b20 resource08266.gif +8d0cc95fcfe6de1a5972c71878b39cac resource08267.gif +24fe752bacb2b0ab065a3e0c8a18be28 resource08268.gif +f2bfef66a68e6cd9bef0262e97e67361 resource08269.gif +b7b4fd716f54eb5094fee71a6264d9bf resource08270.gif +1737c698e073bad9d1cbe01a4c95b775 resource08271.gif +932de21cb8742fabf7417b2268c7e5f9 resource08272.gif +b9c202d0aae7eae5934a225bc89de72a resource08273.gif +388046011a729897b46e82d20319f97c resource08274.gif +c8169c392da9f0ab402d6db88989255d resource08275.gif +ad0f84e1e9ec414ba28a469c74847084 resource08276.gif +3cdb9953cb95dae0457a1c96840083b1 resource08277.gif +b0d2af8f9aba6be2b10e19f2299e3414 resource08278.gif +d9f810af8fc506f0a8cf29eccc2e5f64 resource08279.gif +135c2b83fe7f9f2909ff419a30f3893b resource08280.gif +e58480d18801c99f39b046b81bab645b resource08281.gif +1b611b42bc271d91c5647af92b9c91eb resource08282.gif +46cb3a3e26bc21da274271647d4391e8 resource08283.gif +b4051f2e80d9459995dc71b54bce58c7 resource08284.gif +2f521f1b28b69e6ab75232c40ec2567b resource08285.gif +ece6597f7c0221551ff7caae7aebd668 resource08286.gif +89cff5444c0bc660064949d6ced245cd resource08287.gif +5bb6d450cdd3af1b8d8c4da7f4e00641 resource08288.gif +a224acf2e87af7b3834e6f81eb2712c6 resource08289.gif +b4a2d0d9c065b730dcb625db3592ef73 resource08290.gif +cda22e5349b3392e33b7435baf6051ec resource08291.gif +cb5988587fad48ca8c9a337e882faca8 resource08292.gif +798b5b636eba00cde85094b00840dc48 resource08293.gif +c2c3cfcc1de6c184e0dc60209d6ab257 resource08294.gif +3bf736ea3b98354a4ed589c34e4927a4 resource08295.gif +f4e66864b56c90886ce99831bb33fb27 resource08296.gif +d365cc4668dcf71780bab951577eb931 resource08297.gif +61a407734df5fd564a7ae295dffe9755 resource08298.gif +b9cdfa285101314905ddf4b4c425279e resource08299.gif +d028c7e8c3abad5c4d904720a8a92e30 resource08300.gif +4bdafdbf5fb00031e7f262506bd95b45 resource08301.gif +0994e0cd489206492e8ba990c5d0f79c resource08302.gif +4a5abb3791254f0cb0679f043760b98f resource08303.gif +f4a00b3659117d7ca9be82e18fd6ce0f resource08304.gif +e4b854420f3490570393ffc7c87d8c29 resource08305.gif +02ad47c3e4da8228576aeae47c0f64d4 resource08306.gif +627ce4eba7d2f2006a4084c23ed5ddc6 resource08307.gif +fa90c3ecdd12e04a222591ba74afdbbe resource08308.gif +d419bee57d44c95e9deb2bea2832133f resource08309.gif +de19b2dd91ef25300e6f96d8ecf5993d resource08310.gif +3a625bc218d25763d226969ed22fc89e resource08311.gif +e4ee8927f1e9bda67f47c9047b4d319b resource08312.gif +42a6cabaa39248b151c92fcabd300d9a resource08313.gif +9991ee62edd0b812e3cf5cfbd5b28f7d resource08314.gif +58c1a1eb18ee4fce4795b04db7dc9f82 resource08315.gif +e6b11c5568ac875a83e1b7f7c992d59f resource08316.gif +ba1df1853d58ec1ba71b2b983872259f resource08317.gif +10e5eece6442a336077a6a6d97e2744b resource08318.gif +8f4a1d3f85ebadf535097782f2b29c7d resource08319.gif +ecd2583dd69c62812c51cf51dd69838a resource08320.gif +626f77390150d57fbfc317e44fcbee4c resource08321.gif +df162736c0089508b9300d63463eab39 resource08322.gif +b3422b8ebb8cfd04f8e06b6891c15be2 resource08323.gif +e9c894a49193f598684e353d9f8b740f resource08324.gif +63c82d157b6af7de6b14e9812fb88918 resource08325.gif +08012b8236109dd247815446e43a15fa resource08326.gif +747793d02b35ee146c6c060081e62b50 resource08327.gif +4f4fb46d77ea01a2f11085938ad0a7bd resource08328.gif +cee7a90e4dc48637e6ee24551b0bc216 resource08329.gif +046f752f557206da97b8ec0422a66cf5 resource08330.gif +90e3540a42b2030eac14b3adc5c30cdd resource08331.gif +421b6832878e646d35be17760d652c9f resource08332.gif +b5b8131d80687edb57c8def7cc52126f resource08333.gif +1f8eccdee7e0bbd55e408d7a0cadcee8 resource08334.gif +a8225e11bb8738dc1854aa285e28178a resource08335.gif +0ccb7e60766650243ee78a94e1172a2f resource08336.gif +66e24f10cb8fad66c9894e7607b4f207 resource08337.gif +cddf86cd12a78808269cedc669fb682e resource08338.gif +4eb4235fa383a69430d813c154a0f39d resource08339.gif +789d9453f9ad3b19d14f2b7903356717 resource08340.gif +753d0df0037a9c996e08192c3c10653a resource08341.gif +fdfe325cf41b96777101ee6dc04b58b2 resource08342.gif +135099b82239241a9b9bd20e36146d52 resource08343.gif +ba9af7db98d486c27f366cedc94564a1 resource08344.gif +1a145e314c863392230e15b31e0e0484 resource08345.gif +4ea80ec0703f4d609e31c6e686cd1a06 resource08346.gif +6cd491f91b38807a1d894bc3caf47852 resource08347.gif +8254631a8b352e3d3706e9bf609b7d57 resource08348.gif +a1ad1ef6434998dfe70bc500e30783a3 resource08349.gif +3da206c93456fc50bbd6d578032befb4 resource08350.gif +a7db82936eadb546bc0ea61a0f5ee023 resource08351.gif +3d7ce18381c7ca7c2a2fa1bf664879d1 resource08352.gif +0d8f7d78f48085d76b8c22e263258e4d resource08353.gif +9b995c27c140c770856771877868ff9a resource08354.gif +b4fdf524e4c1a093041d2bb7b16fe157 resource08355.gif +f735577f1ce4e9b69cb266020034516e resource08356.gif +9640ae02a9ce3afe0f6e89270f040cc0 resource08357.gif +94d28e2bf03f6834d17fd11c8e54af09 resource08358.gif +cf10fabce9e64e039eb1258950bab0fe resource08359.gif +06ba652ca8451b563d2df0f19761b8ae resource08360.gif +47e25ec23a8a5271c9a1309914ab8c36 resource08361.gif +e18ce2953e64ca2c5b8e9deb38a76434 resource08362.gif +05858875132ba40a0a1fdfe73a5f0d33 resource08363.gif +36d1b7049f2d9956a352d2d2dc79af66 resource08364.gif +e86681e2c596c6d27ca9268c446c4c77 resource08365.gif +2903ec109447110294e8415ebc7400d0 resource08366.gif +18bcdf2d75857002f13aa69ae642f655 resource08367.gif +6b7b39a4869afcdc7447d2c448576b60 resource08368.gif +be179e515f42391a77fd667df9754730 resource08369.gif +3609a69de722642d194e6966207eb42b resource08370.gif +669365f0e7704e2e33b74284c5d26475 resource08371.gif +382a5bd3281ca28195ffd4ab595fb7d0 resource08372.gif +feabe56b85a8d6cd239490950742f75a resource08373.gif +8c16467cf2b162d62a769e6f1a253fd9 resource08374.gif +c5c16a9f8e4c7babe92e568df0f8fedd resource08375.gif +236c0332d06b8572edfb11652c9464a3 resource08376.gif +9208be35c4e20ceb2656ee807e5cea88 resource08377.gif +41d2eab3bd2d6705cfca2a5d83c484e7 resource08378.gif +123d18a51e18e9afa446495e7021fe44 resource08379.gif +9050f65b130330a99d3b5980c1d0f3f8 resource08380.gif +ef524e37e4cff437bd409c247908e84e resource08381.gif +7183d544a27d03eae62674be8dfbfc4a resource08382.gif +2572f80feb3904454bc72d96d3fb97c5 resource08383.gif +79c787f4c62f37c2f2d140d6a970370a resource08384.gif +570efe61066bf0711b51884da3416325 resource08385.gif +3eec8928f5d8c003810bbf68d58aa256 resource08386.gif +428af6b92d46741f7d27e64670472a64 resource08387.gif +af83b6b77462456d3e7c92166c7c302c resource08388.gif +3db014f4da8d3bdcd164c9eecf323d7b resource08389.gif +89c7e4ab6f6903d152a8626b492614bf resource08390.gif +7da8515b03674347197fd7c76d2f4330 resource08391.gif +580db6ff41919403df79a569a4dda8a6 resource08392.gif +f3169566366c8028be0f30a300435618 resource08393.gif +60b1dd9e8d41f416fc468b264834d949 resource08394.gif +032dbe2b16b70605cc3cd8e04944d9d0 resource08395.gif +986325b49cff3150a75f7bc0e0ee041a resource08396.gif +002dfdf0e49eee68aa246d73c43997b4 resource08397.gif +51cc2774b29cb684a3f63b5806c0cfa6 resource08398.gif +fa84622639d15113641424c6de7896a1 resource08399.gif +8acd4d9e1e5559eea65e1c20b89957cb resource08400.gif +a77228b2e6890276ff04223701181f78 resource08401.gif +8b86a3b1b52d1a5594aa8142e2041038 resource08402.gif +acba364f62efa8df9b077591a29662d1 resource08403.gif +f2d08dda36a5c2e9b7849183db95fed3 resource08404.gif +bd7b278bdc54f26ca54a271d6b597572 resource08405.gif +363ac3c97c86d68dd24073df2936e38f resource08406.gif +555e561516fa6273f60f4e9940588df5 resource08407.gif +e64c9ac54f41d9be58ce3a608c7115ba resource08408.gif +891d3c27529d5ae9597f8745e1286fba resource08409.gif +3c35cb1e2b85c61ce6083caf418e7b2b resource08410.gif +bd6455288c51ca5088656cf673a1d90e resource08411.gif +14a5eddb5b516b380c6173cb5a95dba1 resource08412.gif +e5d10f5005648331a8ec1f62438542af resource08413.gif +b6b8334a73fe4fa23cc9406e06d8e009 resource08414.gif +ea979cb06470ec51daa4f66cb84b5354 resource08415.gif +02ddf1ce943573270d7f66a2748dc8c9 resource08416.gif +7508b25d9d7ccc823182480a33ddf7bb resource08417.gif +21df66a181f379426a7e581396325f2a resource08418.gif +39dfc5a09e625be39c364b1258b550b7 resource08419.gif +1b1a90a2861c2243fc101229aaf0b7c6 resource08420.gif +6058fd43002683c2438d3f3fa651c86b resource08421.gif +9530e65004e7cdb7002fc51e06bd3816 resource08422.gif +adadafdaa81bebf64c5c7c3f3832bb18 resource08423.gif +0e9514df4e60482c16edde7aadd0617e resource08424.gif +5503555480abe50306484b2527203d1c resource08425.gif +13967078aee807466163dec4c880bda2 resource08426.gif +43a1fb1e4f4ed87c84a593bdc98e099b resource08427.gif +bb6085c26a0c252ccf59708a7781fb23 resource08428.gif +b72b446753a606344e0dca03a6c67823 resource08429.gif +2765c88815997793d79e0addbab7ebaf resource08430.gif +d63d318869469108d664f9fff30bfef4 resource08431.gif +e09ac8d0a7d723656fe2adeaa19c531e resource08432.gif +b281bd2fbc7b9dd2f207c457fc83efa3 resource08433.gif +55108aa28811cc2729fe31ce578bcc58 resource08434.gif +bd62766704925fbcc036a8246cded313 resource08435.gif +6470b522d67b334045fb87bcebf49476 resource08436.gif +d0e5c2b1b1cf8546493977068f0e8cda resource08437.gif +fb255eb1bb7345000cc248bdaa7df4ba resource08438.gif +d1574ab19e81d03e2fcdd9a7813d5b08 resource08439.gif +a2c82e4f053c3623e1dadc916a05a91a resource08440.gif +4e333a5a704e708c745cd8892eec2b8d resource08441.gif +33383fd10303d4b20d4ee5427655480f resource08442.gif +cf5f3d1617bfff9d54e5849d715b87d6 resource08443.gif +c48cd0624e93a52b37680eb858db9744 resource08444.gif +8065d25b23ac57778287eb74c3a4af97 resource08445.gif +d9ad1e975d4c2d7397147a66f7c5229f resource08446.gif +115171fbefbf4c3859791bce1f01bf83 resource08447.gif +3586e4a63f202a0d536275ba52d4c38d resource08448.gif +81a2284ad10af72c2ea447f2fdf2bb70 resource08449.gif +fc595132584348b859c19965ae7d941b resource08450.gif +199a30404c44855f9d3df25578997943 resource08451.gif +68aab3bc8dff8588ca85ad44f29e06ce resource08452.gif +c1561f2e0b88f5bd8b1649abf3e90649 resource08453.gif +abb88a2db8231b621a0a8ea7f7d22d74 resource08454.gif +8008c5ce814bd23317f3861f23921afe resource08455.gif +34a2903959bea25fca64cc92049d7c98 resource08456.gif +5c17a37db701abd461d6900e0b1e4c0a resource08457.gif +f0e5b97662c8c6832e0c3552c2f3558e resource08458.gif +6ebd1978082639fe818c1b37d45732e2 resource08459.gif +2f23dbd80d246956b0b0a1c2df61c85e resource08460.gif +de52aa518b72b7dc8e15606ee2b9402e resource08461.gif +ffac44bb59f95c3aee951e447351a5a9 resource08462.gif +846e9647c200c9c774fe068fb310d84e resource08463.gif +6e02aadfe430b5352c5e398b54e38123 resource08464.gif +fe97c561b22756ff059a7c8bbcad2aa1 resource08465.gif +9dd09f722e36d8c5553c002835cd4211 resource08466.gif +f4a51be2a1689a98b43aa0686073f562 resource08467.gif +b0b3f0ad1680a7ae11cad08aca36a5c1 resource08468.gif +95ca17e5167a6a10ba138139d7633159 resource08469.gif +c4ad9bad0969ed874229b12f4f5291be resource08470.gif +347d3741bd26e5ad03ff68675158e96e resource08471.gif +5f0384063418e3665ac9ffa19e7befc3 resource08472.gif +e0da92268afc340cc338431d3295dee7 resource08473.gif +49799a0fc03492d70fb08b74cb28a0db resource08474.gif +f17089deed451b94e909fbd18ef7e14c resource08475.gif +859bf1dfd986137aee80e2f9267106d8 resource08476.gif +d19f5278898378fcaa99ac0c08ef7a2b resource08477.gif +3e05cfb84a7cc557368103b5f077f9f9 resource08478.gif +71e70cf1721ff21a035ee7c94977d7a3 resource08479.gif +87c2441c6e16e005b7f81bd353b73857 resource08480.gif +b0587325bb54668edac385ef08693c28 resource08481.gif +fdf15cd47867b0cead3ddfe348e582e3 resource08482.gif +9c0aa790b88de640b83af5749cc84798 resource08483.gif +18347dc69c3f84672209c733d3df381d resource08484.gif +c9afdfd7138f93fb4e2baa20aa6e89b8 resource08485.gif +908a14c729d51d7da3e49a16576b535f resource08486.gif +5873627eb80c41b98597eac35dce5209 resource08487.gif +1a805509f25de7ac4ab335b4efe706f9 resource08488.gif +0eecd49acc7038ea76dc54f8ee04b817 resource08489.gif +936a82cb2858f579fd6d9a4f4f5bf00b resource08490.gif +f7fa2dd9db849c920f8c37b85d5fa3d4 resource08491.gif +f835d446228b17c71f2b6ec4677284c8 resource08492.gif +b32f39f571ddf2e7cd78f327e33b259c resource08493.gif +8864651e295c91235144e5ce025620ed resource08494.gif +c496a2b4fbc9346a0fdfdddb6b933706 resource08495.gif +fe45c85d7b1405f62d2ae0cde7c13774 resource08496.gif +6fcb94a28a3c327245331ab70171a37c resource08497.gif +23dbd021387af164092c9fef2ba2296a resource08498.gif +cedbc090496254b33d506ccdf85d14c8 resource08499.gif +d868a73542b595e4b0487f1598298f35 resource08500.gif +33b7969f4b19bbc5a94bab9c8b19b945 resource08501.gif +c78b16470433a317fdf86d8348518df1 resource08502.gif +8cd5fef5e0be2262b96e564c6925687f resource08503.gif +57c97b37e8fb6d0244acfeaef76a5086 resource08504.gif +3dbd110174aca9bf183b2fa53db50d92 resource08505.gif +dcf245b7cb02a3868f99bcdaa0de0eec resource08506.gif +3c8eb773f58ce933cfefd9fc03e6da54 resource08507.gif +b337f635de3e7591a1b05a209ee47127 resource08508.gif +7b983d103ebefb8d5f16608069f798c4 resource08509.gif +42a4ef342e9568708b64ebf767e1af55 resource08510.gif +a0178a9fda46af3cb9da96a2f8c697b7 resource08511.gif +acb096db49ef7ab9dd696b87a67307da resource08512.gif +b5716cabf0365ce40852b21395a8dcb4 resource08513.gif +a5cac2568d8202f59b6d5252f0987a0f resource08514.gif +795238096fa8b01804c67fc3dab74ac2 resource08515.gif +fa958f08d5dc8d3d88935a9bf6b4b349 resource08516.gif +91364cc3982be1971ec39f954e874041 resource08517.gif +ad9fdfc1874b19d19d07115f93bc2d37 resource08518.gif +6a21c92f40df8126d612c36b73511f8d resource08519.gif +70fec56bfa84d4ddb3e2fdbacba36a3f resource08520.gif +2f100971dec91605c960a8769c7b46c9 resource08521.gif +95a3f70d64ef68546441c7f93d6c7981 resource08522.gif +5baf169973e6b10f6df9933e6d07f046 resource08523.gif +2869a7bd0b4ff0927d4b261f653bb135 resource08524.gif +6b6fc81111f97e3f1410feed3f116be3 resource08525.gif +5ab83e77adcb5eb5a087dadb204265cc resource08526.gif +7f6991767dce680655169b178df86c87 resource08527.gif +3c5b9e849198e11f6395c8d9913ba2fb resource08528.gif +514b9ee533176e40d4fa53f0945dd714 resource08529.gif +f3d2f35beffd5c09cce9b5064d7960cf resource08530.gif +5b330d4618a8f8c39e243e93f349bcdc resource08531.gif +3a78be1b93805eb1aec9e8adffdd6fe9 resource08532.gif +88133b2098f0e585db9faf448415118a resource08533.gif +31ef6e08287e8ee0ab2ee0c1eeada569 resource08534.gif +1d3c697c59a96f8bc1cf5eaee0c6cc9f resource08535.gif +183943e0a69b0581c549c7ee6ca6df2e resource08536.gif +e54459ecef9e9d8160f50e3de1c472e5 resource08537.gif +4903d6ffd4f762113731db7e50ea59b5 resource08538.gif +aa14bd6624a7303579ec9e6e16105072 resource08539.gif +f495c5aeaf837a6d4d85e1cfd5ca70d9 resource08540.gif +92aebba61438f73429c9ac84067bffd2 resource08541.gif +357f0f0eacb5353445734e29e8b605bc resource08542.gif +4b8afbd59605ae0e76ffed46d903db43 resource08543.gif +cc63ded04593ffea71ec2229bc349adb resource08544.gif +dcc1e4ce5bdb1dbcae1f6c7078afbe84 resource08545.gif +9918c69ef8ddcf0a0c586ea75feabc1b resource08546.gif +f676da4dad0279cea17e7c03267ce1e9 resource08547.gif +02f0935130d9ab819739f332189bc50d resource08548.gif +5c222a1b444c7d24291ef24df7aabcbc resource08549.gif +1b30f222c422fc6bd4a920c4dda339e1 resource08550.gif +0413bef80d477fb6727f652ac294dde9 resource08551.gif +b6ecb4e39d92885e3983150bc4722192 resource08552.gif +0b287a9c09f1a2c498d851d8d03a31d3 resource08553.gif +289b6580feb2c705286e0ceb0dc6d549 resource08554.gif +3e5859d7b6ca258e72245fe3c662a226 resource08555.gif +d5a1ec6e6a5f4ab2be3408464c56db57 resource08556.gif +17de03878da85549ebd1a682e44150b4 resource08557.gif +8502743bec098969fece9852272f3ba6 resource08558.gif +b6ecc9a102e93182c2fb45065ceb3fea resource08559.gif +266b6938bd51342dff10c788c9c5e7c6 resource08560.gif +8c5ec88aedfb835a0ea0d621c9e95151 resource08561.gif +7ee8b4ac31954e8404e176af0fc1168b resource08562.gif +2f39d48f1bc6715d6989c68f4a62382c resource08563.gif +5098873e4c4a2ee55e23debb0bb9a2cc resource08564.gif +4a2212e67de5af8739ada69ad058c108 resource08565.gif +5d2083b673d475b681f6561fad0d06aa resource08566.gif +b4cc25de2ed80fe30910739b92bdbf8e resource08567.gif +8a6d27a6c207be2153c8e35ec188ccbf resource08568.gif +8813ac8c02de6548068b065a5efac19f resource08569.gif +0cbb63e7a79381664106d551f9fe01f7 resource08570.gif +64f8341669c2964584ffd0259aa1604b resource08571.gif +5a6ef16490a0c23178dee80383165298 resource08572.gif +2b1ba6ecc3b409a4f2b9a2c6198fd0d9 resource08573.gif +f972a07abf2e21612ee66d883ec991f8 resource08574.gif +6dfbe1537dd77d9c201d0da53fdecd62 resource08575.gif +e7cc55b92a47c6de6c12cbe9da65027c resource08576.gif +35b5c9b8957f1f4417fdb9739ac12511 resource08577.gif +7f6dd45eb640382ca33f394cd6d0f205 resource08578.gif +4377e2cda090ac2c22b2cea3d6a46fa5 resource08579.gif +34d577aacb69be7331f2fe6b4e8d68b7 resource08580.gif +d5cd0a52cfc8c876db1f106d280a259b resource08581.gif +ad67ff3fc3891c1717a6ac4ac3ab4899 resource08582.gif +486b476d1a6a4447e908882d3f1fdee9 resource08583.gif +e1c3f2855603fd7dd85aec5fde759d52 resource08584.gif +f49b47e6bbc9c77662d9367f84b59323 resource08585.gif +fced36a3c4947bec56bbb314f30fb31a resource08586.gif +a68c7179c584b9e1af7ad70d167cec6e resource08587.gif +acbb3888d94af6f271bebaee076aa033 resource08588.gif +1c58d063f1758946f2c007c24f2ad8d8 resource08589.gif +51020ad20c7193f8f862f505a5dad1f4 resource08590.gif +8c2c616be1e8be8e4aeb2f242fc937d9 resource08591.gif +f15e218a46d35d261a2e586bd14f3e45 resource08592.gif +f78c0ad066415f828e218b968d2e3662 resource08593.gif +319260d3bbcf1266d8e7fce76556de99 resource08594.gif +618f4d3cace36d203f057f86bda74cbc resource08595.gif +9c8f32ad5629c11d0511af5a91dcbf5b resource08596.gif +88b9e8a705a5d8b5920667e4c8135a2b resource08597.gif +340ff261e68bb705c30d070c1abd4ed0 resource08598.gif +a9d79829b4b107c9c3a97374333adb3e resource08599.gif +93155492d5c6ae77bc18b8aa233d32c9 resource08600.gif +3094bcf2dfc9794900f3d99916c2eb32 resource08601.gif +c7bfe0910caf81725616a29f57e2c8d6 resource08602.gif +6367dcffb747fea9ab26646e8b27e0d2 resource08603.gif +c1134236ca6af7ddeaedb174b578ea56 resource08604.gif +6a0201b69909fde47c359cdc4bf8ef3d resource08605.gif +339be9af236d01ab6031e7fe9a3245d2 resource08606.gif +376384eac567af983e6e09d3d8c97010 resource08607.gif +2f80fb9fe61d72e737201df11f09a3d5 resource08608.gif +e0f9e93769e96fb2ab2f1a0b270bb7b4 resource08609.gif +c81d558267da7c7744761c3182bed50e resource08610.gif +ba298869566ba727ef7c7cc073146542 resource08611.gif +381bfdf82f8841e6cdf96bb07c86e280 resource08612.gif +77c3246c2069cd6efc9b020b59364e2d resource08613.gif +b06e5c4feb8b895aa0c6791391175cb5 resource08614.gif +3b334c3c32bde1205595a0f467435431 resource08615.gif +e505282fac15bf249917b9878c86494c resource08616.gif +2569ea35242d8b99fd70bfb16daed02f resource08617.gif +bf2ccd7d2ab8cadf4d75c1c4742de30b resource08618.gif +c22c19ea8684088951cca4a484182cfd resource08619.gif +c3c97731211d814dcec715ab1a9e6e7e resource08620.gif +4bd479a77e06b0a086ea255180cf14c5 resource08621.gif +6ae74ed0ae242806a0c8feb9e8fbf352 resource08622.gif +a2d8cdbe8bbf09ee44574b2737ec8639 resource08623.gif +ea0c390af3a2cab2e07017ed241c6393 resource08624.gif +2faa62b9842f2fac9ba19ea76f3901b4 resource08625.gif +bada4a0bc25647cbe47e43d2582037d9 resource08626.gif +30c8137f20e38618031ef896f706fd99 resource08627.gif +b69a2bb9abfdbae9846922222f9ab716 resource08628.gif +f26fd6fd4f77163d6a5001681818d8ed resource08629.gif +d5bdcfd0df76bb5c3f97b053edda0370 resource08630.gif +87587776328f8e1416c9bbd3287f34d3 resource08631.gif +68cedd8bb66499655c0cf9a02633b33a resource08632.gif +ab7d1b540ed1fdc1c8e8ec4d3de4b7a7 resource08633.gif +90efe495c3a259c09f937d93e33f5f72 resource08634.gif +d742fe78398ad38719f931012833c3bb resource08635.gif +ebec687440a0b7d5d4234c273e2cf7af resource08636.gif +4590bf6513383ab7e3c0b8fe2f39dc14 resource08637.gif +4a61348589d835c239799ef511978382 resource08638.gif +dafda64d307eb6b48174442bec9cea3d resource08639.gif +28fa4a1a6f30f0e0ee37b63033a16bd3 resource08640.gif +32e21aa10a4a50e416f82290af7e9b5f resource08641.gif +c840b12c2d682ec12d55758d6d9dca4f resource08642.gif +3133caa39953609dd0bda17c7df4de11 resource08643.gif +1f8c5fbff09bb07295a9960ef914428b resource08644.gif +8c6313ff7d0d2deb35f6d3d3183a40c0 resource08645.gif +dd4c03d1f74e63c644d14790c19261a4 resource08646.gif +76fb5122b6b0ecf9681f7e6316dc5dd7 resource08647.gif +5cd95fcedee62612c73197c88f560694 resource08648.gif +b2552baa99a77928c2a893ba0a484170 resource08649.gif +9024b154b6be107e1e9aeeb7fc0c2376 resource08650.gif +fde312c52e9921330a0ddbb7c28a6642 resource08651.gif +a171a7fb88be313c7e7f90c46cd2571c resource08652.gif +31b629b0ed11621b9fd72dafdc4ddc34 resource08653.gif +28b47fb86cf9a67ffb067ab6844c224d resource08654.gif +3f90c9225a3f2e17a6c47e92e5534d88 resource08655.gif +ef83dcccb3347fb95a6060a2918fb149 resource08656.gif +f86c20534a7ccc4fb62958fc7d8e4c34 resource08657.gif +9d1410b20ba3f7d1dfa7454d97cda349 resource08658.gif +634421a9e108eb6418b904ee0046d6bf resource08659.gif +e0484b06771829fc51ea9e47dc008767 resource08660.gif +b85c295b8b0a983343c6870f9d4ffc7c resource08661.gif +ea4f724e33b5ae58a1856427f8f3b598 resource08662.gif +2111d265b5ef337a823ec310c30ea7b8 resource08663.gif +013dd101c4421dd68796d5fb204db575 resource08664.gif +7e0b47f9a4e5da77a2a682283992d89e resource08665.gif +2c8b5233e0e0ed35101017c0a5464db8 resource08666.gif +6e5f175dbe4cd7af83e629c9a24cf5a0 resource08667.gif +3bec11f0388ef0ff9f924480eeba731c resource08668.gif +9899d1c3676bcba0af6d5e8a97616f4e resource08669.gif +dcc7dfe9d6f16dec8430cb2171c2ab1e resource08670.gif +4d80712437dcbc5bb9ab0ca9dfaba019 resource08671.gif +d01e4daeae0462660a902ac1e5087fe8 resource08672.gif +2fc17c24526b766c7c0286c940a4df02 resource08673.gif +72122e30a76b10755cac56f801524dc1 resource08674.gif +e0e25ebb1e85ab0df124870e3552e8a2 resource08675.gif +623b456de274d36143f344b1bfebe64c resource08676.gif +d526163da12fc2cb9a01b0cd15b13422 resource08677.gif +9b7d0b51004a1ea11dea031a268f6799 resource08678.gif +b6cf35674f47c4598dbf035357b0077e resource08679.gif +618c2a204a5577ab915610a7ef6299e9 resource08680.gif +2eb0ccda822d7ea2274691a55a9ad4be resource08681.gif +ed53997a2b9e80b908a7ce449524073e resource08682.gif +2fca0c3e2adb9deeb3403b93c466a994 resource08683.gif +2c18c10a5b724357a5c9dd3a5e18e271 resource08684.gif +6e6ea34aab85f6cbbf04aa6c8326aeb5 resource08685.gif +db7d84a370c5c07c96790412482acb27 resource08686.gif +0d9286343489b2fc14ab72ff0ac3f877 resource08687.gif +698fdcd06be6884f7316b87c92e53494 resource08688.gif +7b94f2c36202ff4b419bce72762d330e resource08689.gif +b439409a4d7f8e2ecfc233ebb1b04400 resource08690.gif +00179170cbe7fecc01268004ec91d8dd resource08691.gif +d16af83d1605f1b80261d6abfd30f549 resource08692.gif +011477166a2ffca7e9ddd875253a6821 resource08693.gif +d24d1f2328731dcf9619aececca724ff resource08694.gif +a4440ed53309ed629f456d141788a4f7 resource08695.gif +cf8a508c0523856bbf9cf42deda998d4 resource08696.gif +1a9e8ee7767ba280fbfd5bf3ee100a42 resource08697.gif +1cb8104226c115dcc283c9b2ed72186a resource08698.gif +5527242bd7b673fb01565b8cde892813 resource08699.gif +3cacd2ccdf17f42093065fab8282ad05 resource08700.gif +b30398587a4dbe9a5aed9e42fc0accf0 resource08701.gif +6c129d91bfe0e60a8acb95185590da9d resource08702.gif +548877a8b89a81fcdca2cdec64e0444f resource08703.gif +b32c244737edfaac43f2fe94d59af2c8 resource08704.gif +9fb60422ae968f825babc9adc59b7931 resource08705.gif +05301e96cdb3be13bd5c066caae92c59 resource08706.gif +4828b365f99b67ff4c441e57baaf60d1 resource08707.gif +054338f2f0cfe1e414ea15686e5da01c resource08708.gif +4a5ce3d1f55369ed4f0349c2b7a3896e resource08709.gif +ddc5b2872df655b1cbf9042cf017cfc8 resource08710.gif +c33faf0163565c972576b6dfe4a0b054 resource08711.gif +807a41f1b3c8f4d414ced5936367b704 resource08712.gif +548404164ecfb3b3a27f008858c0ee0e resource08713.gif +ef011e5e47e7b81f7e892b2dab91a4b2 resource08714.gif +ca4bfe97eb3228abe723feb76ddc107d resource08715.gif +35ecf0cb5f958fc127780cac6ae9a278 resource08716.gif +a7bf241878f8fa63d64b6bdfd0e66cd2 resource08717.gif +f82c00e8bb81c4b7c2a5292d34fc91a8 resource08718.gif +0743ebe9473d834447684d111739f285 resource08719.gif +3c79ef141a9e376831019c6d2440019f resource08720.gif +b6c693ab72abacaf960ae2642f187cb8 resource08721.gif +35c73cc820ae6393fe8a3a25e9ef4940 resource08722.gif +8527b8933abc47b6b27286780ab8a0c1 resource08723.gif +cba9c2cd574a7746719f9b73a55d1e41 resource08724.gif +b0805c7f85885a268a67dfd52b7e2d15 resource08725.gif +c18962db8d65ebe063854cf0c570027c resource08726.gif +70113bb4d95d1aa089c9a128311d19b6 resource08727.gif +c8c94b90f8a89003c97470a646300c27 resource08728.gif +5d7c3da7062dc475618f80337b258c5a resource08729.gif +d650e967c082d8e0379781096e4a02c7 resource08730.gif +626f05b620ce777becfaa764fc507a69 resource08731.gif +38bfcd5541fd96952ab56a9c1f1c2414 resource08732.gif +af453b764e5ed6194f22019871a57ee6 resource08733.gif +1e6a1f36007412f035ae9718bd80cd7a resource08734.gif +aede80baeb9279e0c8a93e4b1bd2c16b resource08735.gif +d361e1f6ad3d36656a3d529c576db0b3 resource08736.gif +f3bf70b2e35aad28b19b51a172bc38cc resource08737.gif +86ec58042eef011fcd359ebb3aa50652 resource08738.gif +9cff45e0221939229b76e7f72d69005c resource08739.gif +17974e5a5fc0027ea4babbbe3f9cc9c1 resource08740.gif +2c8809735c8db0393ea20f6889c101c5 resource08741.gif +5683c1a1c2fa3e1f64ba1b0d72170180 resource08742.gif +436acf357748be60376378d55b0604f5 resource08743.gif +5fdad80002dba9cfcbe1f63df5b714f0 resource08744.gif +0b7b7a27d2d6fcfe5ec4e1cb9e9981b8 resource08745.gif +f4079d2165357ebe36eaeed1b41d1fb6 resource08746.gif +b36ba5152bdb042ef764d885c49db679 resource08747.gif +bbc9a4ca966abe5b49a6c1450a5519c5 resource08748.gif +d18a5983122e79a8eacc2988638728ab resource08749.gif +a0eba94646db67e4f371dbac3c8c402f resource08750.gif +cb95eb9495571ea9f1cf45d7b8967ac1 resource08751.gif +1f54306459ac1c2b4fd9a00475e885ee resource08752.gif +660e5c2919ab790a4facf36a931aa5f3 resource08753.gif +2fb33934dbe840f01715b02b854783c1 resource08754.gif +6439006e20bc689e01becd4e96a794c9 resource08755.gif +48c3d31c59024cf80b55391685e9397d resource08756.gif +b396e8bf5372757e099146ec31e1b857 resource08757.gif +595cb58eab44c9a488b7e35e255b943a resource08758.gif +4a063a6664070b3b0e2143906bb6780f resource08759.gif +15d61f4c9c92b2ac7be2a93431b631d8 resource08760.gif +03a3593efa3e924a05604c2f9a6e746f resource08761.gif +65ea882f45af45a244937f7f48d76056 resource08762.gif +4133cf07e46ace6094ada9aa1fd07271 resource08763.gif +d39eabbbde73f1e1fdc179250578be78 resource08764.gif +c09b557fa5d13cde707b6591e62636ec resource08765.gif +7b60eb7763d4370402a0b4d9383d5f50 resource08766.gif +f6938cb0a888aadcdab90c61d61496d5 resource08767.gif +36ee6ad140ef00485031b73477049003 resource08768.gif +b17717cf1a3271ded9da6119cfad7604 resource08769.gif +54e537d2479c44cfa6d5ed70b29d6b0f resource08770.gif +1065a1c146c62786043c87e51736088b resource08771.gif +0885e2d7b9e2e2a170af9fa1f64657dc resource08772.gif +6cd2bc0f7052b13faaab2bfffa2344f7 resource08773.gif +9a7781e04799d5b6a0db7762cd924132 resource08774.gif +9c214a2534496b2e01d7bdddbf31e1d0 resource08775.gif +f10e9f702635c81a2e3e60e9bf02212c resource08776.gif +4f2d825f087712854af347a4897dd0b9 resource08777.gif +ff385a3cd3af0cc1413411c343c18b5c resource08778.gif +49b1a4bc990b461c18896210e4d2a456 resource08779.gif +5a37e502d2d7cc23d07ae2ca45a79b7c resource08780.gif +b42bcff883a501500738625c9475685f resource08781.gif +08c58a49c1b6e46b884bdffc8d3e5499 resource08782.gif +80b34f13a87ca15820222194cf6d7ad0 resource08783.gif +d392c4932282aef2d79ce8b507ead964 resource08784.gif +25b0a446fac0760af39d8fa8fa1d644f resource08785.gif +82f580b8dcb6c3c6f75b5c76336364db resource08786.gif +12b57e06d5b359b0cd2f89661b604d4e resource08787.gif +e3f1b2961674741bc9b73f24007dbe9e resource08788.gif +8960f1d8ffa04c1975a0bc943cb7cff3 resource08789.gif +d25fc4877ae1ab1864981e0bf1218462 resource08790.gif +26a38cf6a1638474436c4d1b74ec69ef resource08791.gif +5068002076f9b66e4fc46646a61fafcd resource08792.gif +037787f1c08dd6e9d0e6f75a5f1e41fd resource08793.gif +9030bf4091203faa528056ad2831a323 resource08794.gif +948fa2345cc6dad07938c5c573be13d3 resource08795.gif +8634ac354ebe75fb3a9aa7eb2b226bf2 resource08796.gif +d57f93f6824f64401e23299e4812f0f2 resource08797.gif +d4ec7a13a578c692adba83162292aecc resource08798.gif +811f060e13b037c0995181efc68c3273 resource08799.gif +82499fc062cd2d3fd209c45a1cab5c15 resource08800.gif +12ec3a99aa310696d2b49d75ced733f1 resource08801.gif +d7b3eae01742eb17edb882e6f797cd33 resource08802.gif +44c850881c74ed5312b516492357e58a resource08803.gif +42900f02caf668da3b4e50ac5b59b3b8 resource08804.gif +9e430ec649559b1aedf51bcc0baaf23b resource08805.gif +a52af351a68fac4b502b4fc77a3ab06a resource08806.gif +a243a1c08a00f57fca1fcfe9e1f73b75 resource08807.gif +b926b285a3199bc25dbe5769f40658ac resource08808.gif +223a36a8cbc9be2653bb60fd98ea0233 resource08809.gif +8334aa4995ad22d5490578fc41bb936d resource08810.gif +4cdaaf5cc25c4e85159b55814a21e2ce resource08811.gif +e1a1b392ef2b1456ed1b1f3d09807431 resource08812.gif +67fa97546d22173dcd0f86f01ea72af6 resource08813.gif +af4c2883dc5d7323cab28df3f097c6b5 resource08814.gif +9866f94553a6d487a06045a3e84da54a resource08815.gif +a5976b772a210ab6be77d3a45261c8d5 resource08816.gif +b468f727b602db36ba239a3418957a37 resource08817.gif +04648d72c20e2df1efb84e73eed52f46 resource08818.gif +eea586a94957a4c812216aa676374db1 resource08819.gif +7b4dd7bf733800b5a9f908fbb78a1cbb resource08820.gif +a80016120d7ae0badd5cb76e34f70c5e resource08821.gif +df963069f890408c10fb4ef6cf41673d resource08822.gif +62010b812361b2a8ecfe7151b3d8fd80 resource08823.gif +783473b5a656a058d3f47f4d728a44c5 resource08824.gif +2e8558b0e8dda6392f4edacd62c97928 resource08825.gif +cb35f7fdbbd8476d33ad796bbf4ea17b resource08826.gif +711f0cdbad65ae7475851196262ed975 resource08827.gif +e4f121898594c1890e36046358f2a7c3 resource08828.gif +b7797e186478a4fe381fee035230f782 resource08829.gif +e7fd401851f256a743aad2a9da54060b resource08830.gif +ce452518b327b33aecd1a33ce1140f66 resource08831.gif +4fd65c3fe9cf0e045d82fd22d5337f9d resource08832.gif +fade6a0a68566e6225b8c636df410b7c resource08833.gif +73d96bae700715c48d043e00d22993dd resource08834.gif +7bd30463da3d0e89cde37e628e3c75d7 resource08835.gif +9e845bc2cd5284492f82d8691adcac70 resource08836.gif +15dd1b00b752f2b3ad5e951deb668995 resource08837.gif +e9a5a2ad82b81d3e64c19afb1118a0cc resource08838.gif +3cfaa1bbdcb017a821bf9d8c000aa55c resource08839.gif +6f8e714c81af8b535cda0a119f399d6a resource08840.gif +c4ef815095e7dadf7d38ab47caee9f12 resource08841.gif +abda012a44d5a0e55700279dac761bd4 resource08842.gif +87b07fd20d7eff6e173d5dbf65a37ace resource08843.gif +291dafe51b5dc549dfe5f2fd7dc8b1b7 resource08844.gif +372766afce7d24054135f8b34ff5576f resource08845.gif +afa0a39a09e1d951281ddb66ac984865 resource08846.gif +9233d6eb8123aa965722bd5e122c5a41 resource08847.gif +adabb7eaa61f7d4a00b0036ef035cf34 resource08848.gif +9717159cc9364f1224993fe9d1e11157 resource08849.gif +7ab2c7828799d2690a8f02ed0d142c15 resource08850.gif +f2ab8247bdef7db60e4d9865d000a3c3 resource08851.gif +e76cfc849c2e2118c92a221c0eb09e91 resource08852.gif +94ebf73a7c1168e6f14f8117dd7f5508 resource08853.gif +8deef3fc4e4c502c22cdf2943f8600d3 resource08854.gif +c0e365cc79952493e4468a6d4bae16f5 resource08855.gif +0ed01c30dee2e4883d775fcfc2e9a216 resource08856.gif +de1bd230943ff2fce3517a6e49bb9865 resource08857.gif +817ea4ec18afb00e649d3a20c8b9f0c3 resource08858.gif +5e548b8a73b93b781c9b9f61b978d728 resource08859.gif +fb954b854aa9c4080d77fef268f0b8a7 resource08860.gif +319862bfa7fda5cc50350b6be9e66316 resource08861.gif +91d1b8cce363054e57cdd0a252880450 resource08862.gif +012911dba58a607617b075fd1b5dabe6 resource08863.gif +aa3ca241d508b41221a683d9c3fdb498 resource08864.gif +f09dadb64f5c50093dd806bb4b6b4faa resource08865.gif +63a3d1c8150b7256f110a3edb8fcbf78 resource08866.gif +891b993cfc251bb2284715d7b3a450bc resource08867.gif +df4e7260762d098a683726231163dbaa resource08868.gif +27541ded32251ba7882e40d6fa0197ee resource08869.gif +c75954dd18da4008c5feb60b66d79133 resource08870.gif +54d46441f864f841a49dae6957c14851 resource08871.gif +361be96f6be793c869bf780e578f8aa5 resource08872.gif +ce2b0cf5d49cd37f0edd10ddf59c691e resource08873.gif +0b3fd754d3a7b8aecdf0bc04223520d7 resource08874.gif +6e5d000b8d54ed331c6a0c2f7a67bbe2 resource08875.gif +c92012b89853161f676402efc4a1140c resource08876.gif +279d87985bc67a5626b2a1cf8492dd86 resource08877.gif +1c1e62f2096b31f41de2d00594a135cb resource08878.gif +1e0462d141a251caa71a4b849f2f28ed resource08879.gif +0a191f5348635a8acb49ca506a055ead resource08880.gif +fa15bd63a3e463b71237fdee3a35fbe9 resource08881.gif +c7755e60433ce2efa0a2a55e5d0ba9b8 resource08882.gif +e3299736dd7487fe3617ba24d77f4819 resource08883.gif +59bb39e42add3b24f62e1aa361e1257b resource08884.gif +2f34fc2d462179ecaf76cdfa16ca57f8 resource08885.gif +084c64b0c0174af19e6bfdda54ff7527 resource08886.gif +7b34aa314d5d634227aef57917e9cc62 resource08887.gif +d87e6784cafe5f79dd347ca0abaf5b03 resource08888.gif +d5f1cce9e2c767d6088a2a9ef919f4a7 resource08889.gif +f869e937d4c0d57a2813322e1b4d8376 resource08890.gif +f1befced64215448b063d1b1fbf0fc06 resource08891.gif +73c52691d3128b2b97122aece8445036 resource08892.gif +5dc8f3e80c98f43ccac41f8bcccb9693 resource08893.gif +480cf4a8ffb523a2777ed95acf1804e9 resource08894.gif +e22e9b7a76466e3c946d353b4f573d7a resource08895.gif +da20c326793c2dbbe395e99dcd0a7004 resource08896.gif +4257b734f477f9f9d01d0c5550545e60 resource08897.gif +81be3aa4173c6348a47054adaa83792a resource08898.gif +291180f4e6a76c390b82df490497653e resource08899.gif +6c0dd2b0018f9cd8f967c335f1582383 resource08900.gif +50bdaaf82a249700ca0af29bc2606681 resource08901.gif +1bd5525896a8ef13d8127997f54b94d5 resource08902.gif +fd11cb19a24afc396e49f2afbe6d15b8 resource08903.gif +5042faa2dd4487e1524c5c112e1e76f7 resource08904.gif +326b708c6b62e5425a0d2a8da940c932 resource08905.gif +306e2acd0f2324240e377ab6a75c988b resource08906.gif +f92ba91319b468e96f70d3d62480ae7f resource08907.gif +9281d65b7e5853bda42e9c7e58db73c0 resource08908.gif +c2fc04dce7a701315e516fafe2fd27f0 resource08909.gif +dc62284c892e5a52b6b449a6bf7b7776 resource08910.gif +02eb92bd1474a31c3090166eec3e444d resource08911.gif +1670aeaf28047d78ac1b9229520c3e10 resource08912.gif +d233b0816769a6050085cfc77b891961 resource08913.gif +be3ec7e92d4c13de7d2ff271da74bea7 resource08914.gif +30a892f1d248c8030c2c4ee4b12df21f resource08915.gif +7479e80fa64313938adbbefc78d81e72 resource08916.gif +91ea83799bd52afaf7224676f123b767 resource08917.gif +4a7e6ee3a335ca90a8de5af3eb10fffd resource08918.gif +c76bfba6ff2d22ab82c20c19c47ad819 resource08919.gif +3bb8e13ac84dddb4df7fd6d79cee2b55 resource08920.gif +66f6d1bf5c492baef39951c636d38464 resource08921.gif +743af241dbb342c544ed6a8f9aeb3dcf resource08922.gif +33df1d7dcefd9dacdbb913b94f78fec4 resource08923.gif +e53dbacb9547eb3cb5f181e1f82834c8 resource08924.gif +74a2a080817f5647eade9d105dc956d9 resource08925.gif +7db8845558bd59de1bdafd8f754437c3 resource08926.gif +a8b2ddd5c8228d11489010ca321a9210 resource08927.gif +e0aba79c368bf45db91c5148d890f383 resource08928.gif +5a26557a8753c66e59476e294de1c0e2 resource08929.gif +33b941a736ef3806ecf1fe59f39b631e resource08930.gif +b8498003dc1fb72208a2e4de67c02d0d resource08931.gif +920d98fe63ead25ed4b21b09746eb084 resource08932.gif +70ebcb466c1300f196384adf9e0a924b resource08933.gif +50df2ebc1ba10ce641d352f0b1fd717c resource08934.gif +57b8a74ec914289444902533b0a385c1 resource08935.gif +8b7b3cd09386411cc8b67d232948e895 resource08936.gif +d496d26d673a2af41ec54ad4d0e171e5 resource08937.gif +2e5297e35816e871307932561d2ee17c resource08938.gif +2816ad28acec6f34902cfb2935d04953 resource08939.gif +4400921633d2ffda06f5f21164083386 resource08940.gif +d52f91b6f65d268583a2f8c1a4a26b06 resource08941.gif +b586aac58c611ff67c73f8394d325cb3 resource08942.gif +d5952280b330fb7f6955ea13b2c3c020 resource08943.gif +ea11c9f2700d5d35511f493bdc876c80 resource08944.gif +43a7cd807860d7d7d574e6d2ef64b09c resource08945.gif +bfb9e9804ba8198544dc9c7a3fb949c3 resource08946.gif +2801c96eec5187abcf72ea1f8d111e61 resource08947.gif +dedb5e1aa8f092d5a00ae9db2427dc90 resource08948.gif +f1b938f5db6e63b5aa43c2f0c49785c4 resource08949.gif +1748b3675afaa6cf7465cf2c844f790e resource08950.gif +deeba679593a8bdd69e54f82843095b9 resource08951.gif +969f22ea3205a7ad11b3ba87fb4debe4 resource08952.gif +d13f714421bb00d8f789e1a013ff39da resource08953.gif +f9e4ed87bec001bdfe3e4fcf7bf37886 resource08954.gif +c00fc038b2acccbfb28627ed5d771c0f resource08955.gif +24a6a843e8e922cf5d8b74c7d039492d resource08956.gif +38a0ce578437fd88668c8f99df5275c7 resource08957.gif +4624b67989b2795fa47f5843781c8d40 resource08958.gif +1480b39133ebccebf97a5db736f47b4b resource08959.gif +4f93aa507fc50faff05449ae473acab7 resource08960.gif +12fc78169c548903acd20adc03909961 resource08961.gif +191d3df4a7d9a1f8a23de7cd2b34871d resource08962.gif +db8ab58d87a3f9cc2174765e08e4e754 resource08963.gif +e3751d17878b40ba81e5d45d0e87b4f6 resource08964.gif +fc30354443e3721b8761de0a1bac85f4 resource08965.gif +91c02f55ebd6bfc3dd29c5f0f81bc3e3 resource08966.gif +74f58cd004a743772ea881e5f4ac2072 resource08967.gif +f17164c94b76832c93e169b63991243d resource08968.gif +d6d14c9a85de122c073cc44a7757cfda resource08969.gif +3301d694ffe0c21dca389cf40bf838f2 resource08970.gif +a9cbd2be5cb3953daf886ed8f76b84bb resource08971.gif +5fb32f2c9564bc794a4166cffa229a03 resource08972.gif +91cc6382fa277e8508f02289c953164b resource08973.gif +48db13ba75c4019957f2b164e45c8993 resource08974.gif +0e5a0bc980e54c6daa64c77fa184119d resource08975.gif +c4ec2a5f4e1b31bcd18ca86aa003428d resource08976.gif +0e666908c2d25dfa9747e40e8f0b25ea resource08977.gif +a250d4afa97d8b5d178493b28d8416f5 resource08978.gif +3dc2574c82fb16d7e58209bf42692f4a resource08979.gif +6024eacc1db35bf84171e53fc1bd3fb1 resource08980.gif +b4caf927bd2f61ac9579217463ca06ee resource08981.gif +efe98b0ccd42d84b1482e06f5f13b58a resource08982.gif +23213bfd8c04c8c2b2f890fe5a3d967e resource08983.gif +d837c0a90c19ae37356cde0628778a56 resource08984.gif +1bdb599c4e8be8aebfd24f747928a3f3 resource08985.gif +4691022b6e0522925b670a85d00f44d2 resource08986.gif +74e45af501ea4273b6b9742b571ef8a9 resource08987.gif +5cef832c712bc17e796bd7fc90c6e5ac resource08988.gif +92d253787ed3169bf8d21d92de58c676 resource08989.gif +5f4fc32a56a20f0c324a9165d5a7360e resource08990.gif +3720ede2f44e3d3be0cf25ef3a51564c resource08991.gif +fc9b0366fc4288e5eea47d97e0b7c14f resource08992.gif +f27e66244f51f79f2848008157b00044 resource08993.gif +aa4be272d9b0c5d4bfe097e203f0b23a resource08994.gif +f30417fdfbe00c806ed152660a1277a5 resource08995.gif +5e617e80b9ca920a75c5a10b98b923ec resource08996.gif +3a394f3ebbf8d4970f3aabe19faef201 resource08997.gif +602d52c0942762258c9a08665c284b38 resource08998.gif +fa4b6f8618db95457a6f8ccf19b9a052 resource08999.gif +79858b214ecbc1cf0c27040dd0487ab5 resource09000.gif +c3084ecf289d1e42d152a681f00d5ed6 resource09001.gif +c8954f1749e0d8d4809c029bd8d85958 resource09002.gif +daa29a47a0ec55906ab2bee3fe6209b1 resource09003.gif +3f0024be0e20c56e77af9c0f84d0d780 resource09004.gif +f0dff5b31e699e46bcb7e697a02c55a5 resource09005.gif +c535500a9969a7ab7142bc030b7fa947 resource09006.gif +fc21aa2be96ef6f936f731862f5e0801 resource09007.gif +b7db6a1281a93eeb6fac4c0a50a4fb70 resource09008.gif +73e6c45928ef7f616e01c9807544f296 resource09009.gif +8905100b2128eeac498a4bcee3f18ce7 resource09010.gif +f5d974c401f6b410df3c30f4df83121c resource09011.gif +9c71fe28daf95155b391e1e452a04f16 resource09012.gif +39f9f25a5ff981a0b51fbf77be0deb57 resource09013.gif +7eae8033974ea2aa1088a628c0d93b12 resource09014.gif +ba1e0013d815b983cdef324e5160008b resource09015.gif +172544c4cf4741b3ea09d66f84f0a7fb resource09016.gif +740d8f392084ff4e188b9fea92e89574 resource09017.gif +46aed1fe963a1534fab1b331c3194c21 resource09018.gif +0cf86812f55eacaa29cb156518fe4cf6 resource09019.gif +177b7d6ba7c7939ec5abc2c6a2790ed8 resource09020.gif +63974420f76ac15cab4aa4469708b065 resource09021.gif +70233aaf7a3d28ea9b2e6224223eb57f resource09022.gif +21b302548843d6ca2696b8edbe6a8fb4 resource09023.gif +15da0f4d22ffc5e98ee2d554d5703c42 resource09024.gif +a66b652e4db4579daf77d2f25cc2d446 resource09025.gif +b66bbf6a09c30bcac7d6b355a33f74fd resource09026.gif +1fbd002db6e58d7b52d27748421e54d5 resource09027.gif +14efdae44806656fbe5ea4945d938ca4 resource09028.gif +5b591df4833817afdcc52fd6e0bb66cb resource09029.gif +7337590a750658f7b6bbb82c9d682ee4 resource09030.gif +67998c05b8e3c4421246426e817bf65e resource09031.gif +456ca5ec713f5508c1b56f348af294bf resource09032.gif +3661e29b1227de64d6490aac23907cba resource09033.gif +cc4b41e956c0e97000bb0dc364ff0d22 resource09034.gif +187f9d4fb87c49d1a1e4fe840e3418ca resource09035.gif +d68ed5c0820eb20e12f1977e25fce9d1 resource09036.gif +a2b5552b88846d6cc6bd8571631c7a94 resource09037.gif +f47c2a134b306b19e54e1af5a69cc9f6 resource09038.gif +2313ed73954879036a061e27b0484327 resource09039.gif +4629f0c0db4eb88a438866b4a607b202 resource09040.gif +c7e410f247fbdc16e7e3ec3aed6a4ea3 resource09041.gif +1e78c3edb22bd4127da1aa5fc3167e94 resource09042.gif +9cb91d4d52bc146cc013637c5090af97 resource09043.gif +d35e96a481553c2e23761d6ad123c7cb resource09044.gif +227a971447604cc0328488d22fca8c77 resource09045.gif +fa394b0a73e9bfb256c4a44b32a7a7bb resource09046.gif +921b0d29a16c44e35baa9c9a183036ed resource09047.gif +004d9014451b5ec021424437a6df079c resource09048.gif +f4624ee96f9747912af6588adb97f11d resource09049.gif +ee845491ca265deb5eedc50219f0b8d8 resource09050.gif +5f3a3b0d187844ce328f7a00beea6657 resource09051.gif +5024ad1d3a4f61da8ee27007d181bc71 resource09052.gif +5ce2790ecf1b1cdfa3223d4b7077627d resource09053.gif +10f4da4bb5235fb9367f7d8a8aa708d8 resource09054.gif +4af57aee731aa2228254e0c776b86c9c resource09055.gif +682cc1d228d756baf5fd0128328f0807 resource09056.gif +5e5c3c1e5bd6820998b0c392e8df18f0 resource09057.gif +f33c054e69f936d504c59164f7e2f798 resource09058.gif +51416485ebdfd2b2075f5c742a27d28b resource09059.gif +10dc81b7ca08ed2903006fb5c2c6102d resource09060.gif +61190f264bf97d4cf69dc8e14f51aeb8 resource09061.gif +1b9ec064367001c7b7f3f498b1ec5d3c resource09062.gif +712885e363757a4f08e8308df2a74265 resource09063.gif +305933cc3fcd7fc38d92f589a9f730c4 resource09064.gif +3f7cc8157918aca8b2a62e50f6abeef6 resource09065.gif +9fd5715844739257f975311fa7a65a80 resource09066.gif +2d510750aba8e4bebce58db7585bd5d2 resource09067.gif +95236ce68af5ae2237fbff6ca8e21e7f resource09068.gif +3a5556fc831d3ab0af16d318bf141bda resource09069.gif +bfbc7cc62c251e1c5a59ac1f59ea8cfa resource09070.gif +109f64a03ed1e60127ad511d67522cc7 resource09071.gif +ee88e588486ebdc475516c7ff8b0e189 resource09072.gif +0847abb0cbceaf6fd03dc53e3dd68462 resource09073.gif +76cce9e76224f133d4f87bbfd22a36dc resource09074.gif +5dcc375bdfbe6a3aafae7b3b0af347de resource09075.gif +ddf0f9de7abccd6c2287d9ea34671d0c resource09076.gif +0553fcb51d5c33fe5c578b993075a1a2 resource09077.gif +3120001659dc095b9e25b07063ede2a3 resource09078.gif +4fd504b32bad7601542850d180b76d36 resource09079.gif +51c6b31e7c23a9c6fd470589b1ddf647 resource09080.gif +857f5acb5dd8fa57d66bd2e186f2879b resource09081.gif +f8129275c471443e8f4e2064bfda1c77 resource09082.gif +c4e7e707c2f3aaf2b46b390cd7515c41 resource09083.gif +0ffa943bf5d38a548ad06d5906919f16 resource09084.gif +a16472edf6a9cc8881dd9930cf022e60 resource09085.gif +efd75ae79c9b9863953bcb4939a309ec resource09086.gif +ba7b50fca1077bc013a54fe57fa1f9b4 resource09087.gif +5cc35731820335fbaf52face1ed240c3 resource09088.gif +0c74d764190008f7eeea63aef4736eeb resource09089.gif +e68d46f0584c8a31b4ce26406b5e22e4 resource09090.gif +41b562b189e58780a16190d1f7ce8a08 resource09091.gif +b448e894defd6fcc28fb8ed43d3e2195 resource09092.gif +ab294913b742492d506c330376335474 resource09093.gif +6021d3fd3c6f5fc77a078b0c65d0ecd7 resource09094.gif +2fd1e437e092d291e4e944b80038ab8d resource09095.gif +4d85060ba5b1e99c8528daa947ca9697 resource09096.gif +9f32e7a58739cb83d474b0584ca9cb76 resource09097.gif +a0aae589b1373e89f025b36a28d96164 resource09098.gif +01e5dae43347f7366bee6bb09350f2c5 resource09099.gif +a63c5404e9ae199c2d7815c42db5ca7c resource09100.gif +ba4ac90f011b02386b60d67c34204cbc resource09101.gif +56b164dac30260b522318f049314f09d resource09102.gif +df3e82c66eb1dcd6908c81a066d79701 resource09103.gif +1831c8687c74bc789a88143164788895 resource09104.gif +642a740b0ba65c9cfcbb85bdc645e521 resource09105.gif +b73b7987235bdc5f9b1a11ce52d2acfd resource09106.gif +da7b69a0f463bbe482ecffccdd3d3727 resource09107.gif +6f5e1324b60537b8929aa103925b07de resource09108.gif +b84015500a7cded751c83eac2bd60fbd resource09109.gif +83b9d506899a82a051618b17c52f50dd resource09110.gif +6012c5ef08990b2777c768612b44aa4f resource09111.gif +bbe4c13fe966acd238b8b3a5d3d6d320 resource09112.gif +261c1f5c21d7642f9d2e1f6b2be4c2cf resource09113.gif +f13e326e7c1599a04eaffe906a8dec52 resource09114.gif +ba471872e6cb6ace3129d0d73a5d4b1e resource09115.gif +6e1b615bf65b56f861f561eecfe5674f resource09116.gif +57b3d8b6ba6acec99dbeeb7813f1c3d1 resource09117.gif +acaf8831916a8fff1f3167934cbb5716 resource09118.gif +0f7bc055e8bda5c8f44128acdf1cf5e8 resource09119.gif +ed08a6196e804c745890f900f96a483a resource09120.gif +76629ad5cc03ec4ad6a9acfd6630a992 resource09121.gif +f87db5b7cc440b2721be903af33efd04 resource09122.gif +43a2f5d76da0942dba246c39d5e869f5 resource09123.gif +5b8431acebe21a613b2c9b9457de822c resource09124.gif +604e7ecd7f54919673ccceb9c84af20a resource09125.gif +d1c9966eb0c607939aab635fdc476ed3 resource09126.gif +68657c4c2a91e170c4aeac8707eab79a resource09127.gif +a1104da3a223b9f52260e9cc6e87ac9c resource09128.gif +f5f781f21d1998724b094bd7b86b7861 resource09129.gif +133b68409ffd17412aa4540f02b948a2 resource09130.gif +33773f2742691dc1bd755ef67be7fdd7 resource09131.gif +b16aaa179a80a463ddae82126d2b5afb resource09132.gif +6e4b47ef2c9ede1149468a9f9713853a resource09133.gif +14b41a23d63b3cdb587e4e1c24e2ece1 resource09134.gif +29e8a5f32060c31b95697e94c7915a9d resource09135.gif +c9b463aadad15a66c714cef553a6764c resource09136.gif +66860fcc45e6f68bc059b1d862e70f10 resource09137.gif +5cd34f2b5813c469b1be3a8a2274be9e resource09138.gif +04ea9b018891b275b9259d8363ef0543 resource09139.gif +7fcb9c1025f707ea86713ce9734165d5 resource09140.gif +f53b2177b402650ff9cec2a1ef2fb35f resource09141.gif +19acd8367b90e2e9d4b097f814814eb5 resource09142.gif +e9e3a90326594a5e82d358b3d6695b08 resource09143.gif +9699342b868b2a0bfed8388b01d0ba86 resource09144.gif +ae4bbd0a24bf35dcfdc621fe9acb6e1c resource09145.gif +5b962bf91059c3b83a93ca42520b182c resource09146.gif +5831adc4904d2ed436d08dc4e193dd02 resource09147.gif +81d50eecb961a39b003dab021fac2150 resource09148.gif +712b5a65ca8beb95102986bca1bcada2 resource09149.gif +1cd655cc9eeafcbf497148761af97b35 resource09150.gif +f3a895c7c0e3f963eeb57912b49ffc17 resource09151.gif +496c33e546ec80b8e42c0ae112dbb1ff resource09152.gif +9bcfc921240c64f836825599c010b9f1 resource09153.gif +968e64c1ba2d960a0e15fd9dc9a4f7d1 resource09154.gif +3e00f81c3a859b31989e0a0a5494a504 resource09155.gif +1614ccf3b6810628bfd829ed12cb8d49 resource09156.gif +6d8e25068810423c9f0d9e409aaf7163 resource09157.gif +eb8d5ad9ad1ab53cc76900d332a2a01f resource09158.gif +46979c2015ab1166c757d80296f803b7 resource09159.gif +7e841a375b8f4822aff56f8c4ebd1e48 resource09160.gif +7dc24a1f626d5cd8b161d4322b86b4d4 resource09161.gif +bc8a2fa0040a4da710213524d34242ce resource09162.gif +88fe4dec939be27ee35eedd60a5fa777 resource09163.gif +6744f13a1304f438d131ddf88085824f resource09164.gif +41bf1fc68fda60176d13d89c18217387 resource09165.gif +b2ed2077df36757d694c503eab755af3 resource09166.gif +7e142d65772ebdbea5bdfd6a5d9ddec5 resource09167.gif +c27c2ced04d9b39db2af33a6f02dc517 resource09168.gif +9b7fece50761ef46bd8ce1856595076c resource09169.gif +90f6bce482daa2d6e30dcdfebb5a4483 resource09170.gif +12965c2ec98d02e219604d90ed0c5a02 resource09171.gif +43ddf547595deb043cb63da9f8d74916 resource09172.gif +e7c725573dc9af6acd88713b632ab2bd resource09173.gif +18202b46a5335a86114406e999e36579 resource09174.gif +3d8fa8697c9e086964bb47bf94a01b8f resource09175.gif +8b6ac9838063ba88ae40af634951e6ef resource09176.gif +d701b4fedb4f43e9202b7fd72dde5d00 resource09177.gif +8767d9b8f7f04b78e26dded287c27f5e resource09178.gif +ff921918bc0efbbba7b84d90bcecf536 resource09179.gif +d3d75ccb3f4c9bbc59fb12969a49a856 resource09180.gif +b921861f9f0ce34a7f2b2e1b56d43c73 resource09181.gif +6fbbd2b79c63a89da457011d065b3ec2 resource09182.gif +e39768fd9e9140d0951ffb97c5d4c593 resource09183.gif +1401064cc94b1b516c5dc400ecba0a4e resource09184.gif +b2f0febe1a1e3f3f444a13f1266241f4 resource09185.gif +adc2161818833475f9fbbb9dd54884d1 resource09186.gif +f351599aa3dd6ba4ebb6fbaf643fc815 resource09187.gif +e71a945411348bf08c5e48b4f58a7e53 resource09188.gif +09f320f2e055dea822ebf617f9f60e3d resource09189.gif +59e43303ac8ff1c7c6bac614c856ec7d resource09190.gif +cfd4790409f6b8dd0cd6f7abdee116c8 resource09191.gif +f5cb5b58135ad6fc6d199f058e8acb62 resource09192.gif +2b611c8bcbd8aa4bc04800b835a0318f resource09193.gif +105b8a9e1e07c6905fa2148e03c071c2 resource09194.gif +b30a360e9aaf7614123ed1c20e6303e8 resource09195.gif +c17a2b55ce87e1afcca89c3bff3245ab resource09196.gif +c77aaa8187830a65b5bff5a6127c8d61 resource09197.gif +f13ef5fd8be187a78807b0ada0bc69a9 resource09198.gif +d426966e46e3110b11378867adbc245d resource09199.gif +4c61235f482dedbafb56822c71f91a24 resource09200.gif +b4b266a710787d4c5fd674e30be53522 resource09201.gif +b69aaa013e9b769b67e81a3e81b059d4 resource09202.gif +d5263c6770ab966395040b1175df848c resource09203.gif +a06a69ea1dc94cc48625e4df5bbbaeb4 resource09204.gif +590e728860fa1871e5d5aa94397b2290 resource09205.gif +b14a308c60f1b83b7b16c78ee45fcde4 resource09206.gif +ec486f8627f5d385707fd443dd2fe1b2 resource09207.gif +108f5fe98c3c68e5495559201b720e1a resource09208.gif +a313f1e3c0a851ca0e61f2a887913eeb resource09209.gif +de2dcf87887521aab7a84d603065783a resource09210.gif +0361e88ae9d3d4ed6bb2b26bac20bcfd resource09211.gif +14153015cd760f7f93cf1ca393d43689 resource09212.gif +24afc7ea5e99ca14c4159a0a382a8152 resource09213.gif +5acde43516a988656077cc9cb64394a7 resource09214.gif +f08639a521560ad2f7c8512ccd205342 resource09215.gif +e9d195d384563fdb7d881d94f6e6ed30 resource09216.gif +83d69d34331bf721fcb1d4629ebd7814 resource09217.gif +15590b2b6a8c2ec7c1b676ce7c716c74 resource09218.gif +656d36c0e13dffd6950adc535842eef0 resource09219.gif +87267a33564fe3631ba2e43ee105aeb7 resource09220.gif +ade6dd940c4e7dd38bab9f4fc4a27657 resource09221.gif +c4dd2fc7a57ed31f633cabb990952d82 resource09222.gif +41e57b88d7ae118fa4c4c88bf2c21484 resource09223.gif +6a941745524698ff690f9cfd99a8b1a3 resource09224.gif +3ed2c01e20659d8bb7f2eabc13da126d resource09225.gif +e35864d9a605e2cd969a4bfc2e2c1aba resource09226.gif +0561b68a41d2b2b850e12e51bd394896 resource09227.gif +bbc91ed7d5a0c2bd221cb074dd53fa2c resource09228.gif +700b71dc741c2a879c62a4ac8943df24 resource09229.gif +d8f8f1fe4bf5868ec6fb35ff96a64270 resource09230.gif +1e209c6cdc9f0a95d6e4d47c9114f773 resource09231.gif +6d7553f7d9fe5fdf262c99a19acc1bf7 resource09232.gif +e31ab69d6ffc7154e2e856b37e2b5478 resource09233.gif +59c231100b240706cb1963776125fc54 resource09234.gif +123d093407ae63cbb0c4e4066d7ded40 resource09235.gif +d0c0add239d4831ae5d73e7cdeda5f7f resource09236.gif +6f56c73a8b0bfe31d33df9ccf3dc82d2 resource09237.gif +824e69edb362e90651895aaaf87fd88c resource09238.gif +10bd0c2a9702d163150dd43a4e00ccc8 resource09239.gif +a570dad9fdd7d57922440d8237eb27f7 resource09240.gif +3fc62f374db4956a3842fb47f516a393 resource09241.gif +2558f1a3fa19e48969d0e740dbcf68df resource09242.gif +210c8ba8527571ba5590318bccfafeb7 resource09243.gif +9b22cbb61863cab8e59c786280a19999 resource09244.gif +818dcdd4a169a21c79bfc36d77bd4cf3 resource09245.gif +96f25dbde7e75af70904d13f6136a6c0 resource09246.gif +e4671ec22420f8f34c48f154e515dedb resource09247.gif +13a586edc005622a6149c7a10363e5a4 resource09248.gif +014929e2a7c4cb418e4fc6d03fb510c1 resource09249.gif +b7198d1aab5d6e1fdbcdc5c0885321ed resource09250.gif +55c54b59b2e15498bf509c606f2f52be resource09251.gif +74d6abde9e050c7bda984e99c82c8328 resource09252.gif +343580c102c5dc04f295e085881d39d3 resource09253.gif +81d7084469fcccc8d06a9e0b64032c88 resource09254.gif +de1ea6a46bb797a6d628a878bdeab31a resource09255.gif +8b92d570266c06bc5572190770aa1acc resource09256.gif +a7ce67d238b509076de334d6635ed435 resource09257.gif +457c967d7c8ac984f62b373149aaaa30 resource09258.gif +177de6d15e42817469a27e50b09dd4ed resource09259.gif +f0522c2153ae389c22a6e9457b07e0c0 resource09260.gif +e583a759fd156c724a35be097327ae1d resource09261.gif +308ac2126fd52a060d13948631923241 resource09262.gif +dd79512f54c50cdd28b71cf5c63e06a5 resource09263.gif +ec96ca6ae7a60d903031cb79ced8a0cf resource09264.gif +f2bec040af988a41a650c6aa79f3c0dc resource09265.gif +41850f69e95ac66d9daa86c6ed503da9 resource09266.gif +bd14be75509378726ff2fb023526e0fd resource09267.gif +6f3228fd0b371b79fd7a7ee2b12d79dd resource09268.gif +2babddde22eb40dd1eb61b76221c5f24 resource09269.gif +485b1e9658fae52338474ab5cdad3516 resource09270.gif +ec5b0d4788428440a106adf5581d2978 resource09271.gif +f86222b50255287a95be62f42bffcc1c resource09272.gif +66fbdb427748be183df6539907062c4a resource09273.gif +eafdf9dca72dc584ffa1cc2d78b49c09 resource09274.gif +f6a514766fc346444c4b6a841b732079 resource09275.gif +5df4d102dcfe3167475963f3a05c391a resource09276.gif +8192a8d7231534f5c11ed7ce5e4f9005 resource09277.gif +4dd56be8cdff4958f6db2549cf43f4b7 resource09278.gif +a720a3736b4de7bc491adf12d863a2a3 resource09279.gif +87f669f7f8bae7af5deeaea5a2465ca5 resource09280.gif +d69ce7a294e578826946bba23b59932c resource09281.gif +110c628b7fac201991fda3b002fbbb6d resource09282.gif +0f2185ae229a680742a3c53a0ed40c7b resource09283.gif +048bfd5c5560f331587715d3ea1200c1 resource09284.gif +827d304acc32a2ae21f91081a25a5d06 resource09285.gif +b4075824ea8808bf435c98ef1ed04214 resource09286.gif +2d24ca50af4d5cb531ea444b2dfbb889 resource09287.gif +56b2631a9e211f3a0f6aa69b39e15102 resource09288.gif +0fbc113f2b484e0278edf3f4ebe76339 resource09289.gif +3c5f74451d47c3593fda0c8352c42da4 resource09290.gif +b8d299c8ca0255007f71704870034686 resource09291.gif +13bb5f5d8114538aed206237358b8fec resource09292.gif +213fcecd421f07e6a5567bf98cbdf57d resource09293.gif +4dbe6c69054041d6e803b2b702b66d5a resource09294.gif +cc2c23e7c33c4a081f67825468b44008 resource09295.gif +c788624a3d1395808b3cdf816dcdc3b0 resource09296.gif +5a4fb4794bdeb0d44deffd62c8afdc46 resource09297.gif +a71a7498476f2830235cdc1150c36d26 resource09298.gif +6be864d1ffcced6321b1acf086b908eb resource09299.gif +b93ae173c36bffcda29b6cc69f891c35 resource09300.gif +254dc9a4c953ab2cf7ceafe9bc495617 resource09301.gif +5c0293ea037ef06a4ed63be3943fe158 resource09302.gif +ab45d6b65737922c089f91435515c0c3 resource09303.gif +e6a19204f0dc9d51bc39dc53f7e31f3f resource09304.gif +9506b47a985c4617b32d6425c7973f02 resource09305.gif +72c23ffd0208ff090b78867164cae84d resource09306.gif +9e58a3f8b0b6a857261afdccb1deec99 resource09307.gif +20a4eee95696385a19285d966e47212b resource09308.gif +0cfbb1fdd560de54fd16feae2f7d62d4 resource09309.gif +67a4144d5cd0fbdac04c7d8df34b817a resource09310.gif +9d5d735ba0935c46892ecd5430aaa0f0 resource09311.gif +6218785ac93a221a6aa14c7dd1bf9cd0 resource09312.gif +3e2979793ad7cb26952bb1bec7de63d6 resource09313.gif +bf24915625ee24c383eac385528aad82 resource09314.gif +fcdd784b0d7731fe3a74419a3982bc69 resource09315.gif +79770b0e2151cc9bf94e7204bd9f9e12 resource09316.gif +5aacaca6ec4881af557fad41266034f0 resource09317.gif +1e13c3ecd50a9b3f20e926005584ff61 resource09318.gif +2e5b8325cf8fbdf7bed68c489c9fdbff resource09319.gif +43cf7fbb84c33d86b87ba8e4b9016230 resource09320.gif +9450b9aa9983d17addcdde0475f4cad7 resource09321.gif +03008a081dfd9500604c72b74e099598 resource09322.gif +28893230ce0eb843bb5ccc92f37b9f6a resource09323.gif +a023a552d3f9cddc6b3cb8b9925aafcc resource09324.gif +84d49e509d2594c68bcbeae52fd3c723 resource09325.gif +0e24e61474b4a17cb8bfac94edd12f61 resource09326.gif +8e47d90f327b9bdc95442c65331305c0 resource09327.gif +f629e6d6c31d9d42e164dd992c235ea1 resource09328.gif +2b5b70dd7f68effeb9441d327f675c23 resource09329.gif +35cec1d36cfafd705a4b5baf570fd182 resource09330.gif +57b64c7d7f8edacf172bbee085fe2bdf resource09331.gif +372ec5e2c3d77efd5ec0bf754503b70d resource09332.gif +103bb53de55ee0606dcf0442099d1ba4 resource09333.gif +4b4614b65d560efb77f3985a5bd3c060 resource09334.gif +1c0b3f081ade895d4da79b5019c83010 resource09335.gif +a0b1b6fd08b838a13cd913206fc3d42c resource09336.gif +271b27fb90e4e922b93bc3563b7347e6 resource09337.gif +1c35672dc9f23d2fe80113d43d6f8d17 resource09338.gif +967164c294b780e32d309491b9bfe912 resource09339.gif +2b3430117c0935279bdc40b0a678c6e0 resource09340.gif +013ecea65ffc1b28a7ddeb2fe7a8dbe6 resource09341.gif +b654f46a39ab638f2c6794a7be0faafc resource09342.gif +2044f6b76f2e69cff6dc882d7a92556a resource09343.gif +27a4f7d5aa39682edc043a64b7120b47 resource09344.gif +8c0e4f7fdafa36edf055c585b940e30c resource09345.gif +3a1989213224d8b6ad4702d6b4d1d850 resource09346.gif +9ac79aa49ce63c55211f2c09c713f680 resource09347.gif +691b89edadb6cfa5c872ae9743d1ba94 resource09348.gif +35a471270c92697b8b9c099c638a9c70 resource09349.gif +272fa9047df8a95233ef8514af470869 resource09350.gif +222afc922e08e723997c116f472afd08 resource09351.gif +6155df5bc08dd7c60d961514fe33bc8d resource09352.gif +66dd158337f51fbaf86ad2aff079a5bc resource09353.gif +4ee3e515e5e64d516c6c8c702d73d0b7 resource09354.gif +3324556ae0ee7910488f5d7bccb15237 resource09355.gif +c30a22c75dcfbbe01292d2b7019598c4 resource09356.gif +c13c35c33ff33cb25fe86dbe3c0ca946 resource09357.gif +72a247a5c7ddb5a9f1a5b0fd8a10074c resource09358.gif +4b7f517d0a06017de8920f685c311318 resource09359.gif +534070241d438ab4bc9400e5d74666b8 resource09360.gif +fa700c8e17f5dc3e192c8ffa6f4088a0 resource09361.gif +60c444c917d976252c4247b2172a0db5 resource09362.gif +cdcfa53a045f1bcc27710fc9d5e324b8 resource09363.gif +8ea0c8dd985af8a5675ede9894ce1dac resource09364.gif +bb3d3c0e59a06f0ae048e76f5475aacc resource09365.gif +aa1009f3348550deff4987b4de4fb830 resource09366.gif +eafaa6a81bd82c5779f35b81dd13b7a7 resource09367.gif +47a0622c82f66e6fbc852cf4f1de0caa resource09368.gif +faca9c06adea62d8f0ae8902f6819c1d resource09369.gif +9df548aca901a468bd5b5d41397b2ce2 resource09370.gif +66e9c4221ea8e959ef2aaa67ef7cef01 resource09371.gif +286483f691829c28b64f647ed55bf67d resource09372.gif +7bc8af7f3dcced104d414d0626c499ea resource09373.gif +0f9c7cb55e95cd39e7c8dd8be36e6e61 resource09374.gif +d24208ac405bf11f7b22c543146d1513 resource09375.gif +12c32807f0265f371d370d1b516ba8dc resource09376.gif +ecf05aa959ade2e449475e38c73e7fbc resource09377.jpg +3a27f86bce8357fda101d93fdff51ca3 resource09378.jpg +abeca19203c84a6b16c42612b6deb186 resource09379.ncx +070b4725eb31928c1a8b57d2f6f92ead resource09380.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/53eac2194ef1addee323d2a7d149ddff_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/53eac2194ef1addee323d2a7d149ddff_rawml.md5 new file mode 100644 index 0000000..b2aa183 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/53eac2194ef1addee323d2a7d149ddff_rawml.md5 @@ -0,0 +1 @@ +a2756abde16983fda113fcabb09db648 diff --git a/app/src/main/cpp/libmobi/tests/md5/5601259794edfe7e62283c6672c7fda0_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/5601259794edfe7e62283c6672c7fda0_markup.md5 new file mode 100644 index 0000000..ee35a4b --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/5601259794edfe7e62283c6672c7fda0_markup.md5 @@ -0,0 +1,6 @@ +3b25aa92cdb90e71f860506d7733b903 flow00001.css +91203ddb7a64f4e72040512f73428aa4 flow00002.css +aa9d0636b917baed54e6c68308adba07 part00000.html +01ede3cdbd26439b7f30fdc2f7b525cb resource00000.otf +0de6fa741a35160233f0ac1078afb02f resource00001.ncx +eb550aed365cfb13b59bfb6589775c35 resource00002.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/5601259794edfe7e62283c6672c7fda0_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/5601259794edfe7e62283c6672c7fda0_rawml.md5 new file mode 100644 index 0000000..d859f6e --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/5601259794edfe7e62283c6672c7fda0_rawml.md5 @@ -0,0 +1 @@ +20c60c1766bdc00ae49cfd0631bff2c4 diff --git a/app/src/main/cpp/libmobi/tests/md5/565e31312a70c5129f6674d540c46561_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/565e31312a70c5129f6674d540c46561_markup.md5 new file mode 100644 index 0000000..4046dd7 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/565e31312a70c5129f6674d540c46561_markup.md5 @@ -0,0 +1,7 @@ +5d00d50e7d9d4ba11e87557d9f4edd1c part00000.html +7dee30a6b9bc07b5ec92cda6f424b7db part00001.html +ae0198f50c282044c65082a256852fa5 resource00000.jpg +7ab80fa12ddee2f2bfc16498da537028 resource00001.jpg +688aeffb0a078da56295bbc37ab2d28d resource00003.jpg +815dea478c839572d5772819d2292f0c resource00004.ncx +2c8e8b057b5511ace63e4343c7a43b6e resource00005.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/565e31312a70c5129f6674d540c46561_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/565e31312a70c5129f6674d540c46561_rawml.md5 new file mode 100644 index 0000000..cbf676d --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/565e31312a70c5129f6674d540c46561_rawml.md5 @@ -0,0 +1 @@ +02cf5a2f37faee76dfcafaefe4fd27cf diff --git a/app/src/main/cpp/libmobi/tests/md5/6798753f94feba073622f02c8c88e713_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/6798753f94feba073622f02c8c88e713_markup.md5 new file mode 100644 index 0000000..ba1409e --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/6798753f94feba073622f02c8c88e713_markup.md5 @@ -0,0 +1,3 @@ +abf7fd0126f52f722b14129c7958e397 part00000.html +e37c79f0fe27d40f85c66e59dbc725f3 resource00000.ncx +99c3f883921a92fd97511f983a21691d resource00001.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/6798753f94feba073622f02c8c88e713_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/6798753f94feba073622f02c8c88e713_rawml.md5 new file mode 100644 index 0000000..7f75bc4 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/6798753f94feba073622f02c8c88e713_rawml.md5 @@ -0,0 +1 @@ +b355c36f0d55450cedab86f0eefc2c82 diff --git a/app/src/main/cpp/libmobi/tests/md5/7c1d5645d7f19fb25ca84e533671d3ac_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/7c1d5645d7f19fb25ca84e533671d3ac_markup.md5 new file mode 100644 index 0000000..925e603 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/7c1d5645d7f19fb25ca84e533671d3ac_markup.md5 @@ -0,0 +1,9 @@ +6d1e99d90451bcda489bb7cbe014ba7e part00000.html +c2691922730c85a07b30c558987cc478 resource00000.jpg +06bc4024a3a146f8d0141336d3f6944a resource00001.gif +c5e8e3dd8333e7227accfbdfcd120726 resource00002.gif +0e6356f75416cf28601ba3efd2b4abf6 resource00003.gif +c2691922730c85a07b30c558987cc478 resource00004.jpg +8a3b469a251fcf8128982c6c1d30a12f resource00005.jpg +3a7d9108f54fbee998fe9e0e22cc90b3 resource00006.ncx +192f37b64ab8bb41dedb8c337de1f2d3 resource00007.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/7c1d5645d7f19fb25ca84e533671d3ac_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/7c1d5645d7f19fb25ca84e533671d3ac_rawml.md5 new file mode 100644 index 0000000..a7d150b --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/7c1d5645d7f19fb25ca84e533671d3ac_rawml.md5 @@ -0,0 +1 @@ +4917156e4ca233fff89ab981e2efd055 diff --git a/app/src/main/cpp/libmobi/tests/md5/83bdd0740a44ffb24a4b946889b6e7fb_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/83bdd0740a44ffb24a4b946889b6e7fb_markup.md5 new file mode 100644 index 0000000..9c3356b --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/83bdd0740a44ffb24a4b946889b6e7fb_markup.md5 @@ -0,0 +1,5 @@ +b70fe0a8219e18d24e999dfff61e4453 part00000.pdf +2cef05b936c837a10c0d54f17e706169 resource00000.jpg +7c6036efcb8c2ad515cf66fa266fd04b resource00001.jpg +e85af0383e60aa2dfd8fdf1aeb775dfc resource00002.ncx +b66e20cc9d0d8eb63b855b5f260c6b08 resource00003.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/83bdd0740a44ffb24a4b946889b6e7fb_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/83bdd0740a44ffb24a4b946889b6e7fb_rawml.md5 new file mode 100644 index 0000000..ec099a7 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/83bdd0740a44ffb24a4b946889b6e7fb_rawml.md5 @@ -0,0 +1 @@ +e5b12b435fc5e273057aa25b89d1c0e1 diff --git a/app/src/main/cpp/libmobi/tests/md5/8c19552d979685f3ada9b751d0f8ec56_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/8c19552d979685f3ada9b751d0f8ec56_markup.md5 new file mode 100644 index 0000000..e82da8a --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/8c19552d979685f3ada9b751d0f8ec56_markup.md5 @@ -0,0 +1,4 @@ +ceb9b0f0c8e7c26084855a4d446dabe0 part00000.html +3eb21f0515c65686a1339136bd70fc67 resource00025.bmp +df1392d0768b9aa2a359af03f91224ed resource00026.ncx +7c12f209822e2566e66173d1bfb74edf resource00027.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/8c19552d979685f3ada9b751d0f8ec56_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/8c19552d979685f3ada9b751d0f8ec56_rawml.md5 new file mode 100644 index 0000000..d8f43fb --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/8c19552d979685f3ada9b751d0f8ec56_rawml.md5 @@ -0,0 +1 @@ +1986e790ec56faf9b56f84fb01789cdc diff --git a/app/src/main/cpp/libmobi/tests/md5/c19b31e6351f3e2ef7b48795ee980ee7_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/c19b31e6351f3e2ef7b48795ee980ee7_markup.md5 new file mode 100644 index 0000000..d50904e --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/c19b31e6351f3e2ef7b48795ee980ee7_markup.md5 @@ -0,0 +1,7 @@ +4dc443c6782ba0edca2a967c00fdc14e part00000.html +7dee30a6b9bc07b5ec92cda6f424b7db part00001.html +ae0198f50c282044c65082a256852fa5 resource00000.jpg +7ab80fa12ddee2f2bfc16498da537028 resource00001.jpg +688aeffb0a078da56295bbc37ab2d28d resource00003.jpg +a6e51d4765a655e9e2171a5036335aed resource00004.ncx +24225add64b8f31efef3979e714573c2 resource00005.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/c19b31e6351f3e2ef7b48795ee980ee7_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/c19b31e6351f3e2ef7b48795ee980ee7_rawml.md5 new file mode 100644 index 0000000..0057f3e --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/c19b31e6351f3e2ef7b48795ee980ee7_rawml.md5 @@ -0,0 +1 @@ +7e18714ea6470149d2a56b71517286f4 diff --git a/app/src/main/cpp/libmobi/tests/md5/f31eb84c62beac0ac14afd408b13e466_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/f31eb84c62beac0ac14afd408b13e466_markup.md5 new file mode 100644 index 0000000..f7d531a --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/f31eb84c62beac0ac14afd408b13e466_markup.md5 @@ -0,0 +1,3 @@ +a930d33cf6e4e37c96471e87c0c41a1c part00000.html +465c4ddf4fd259c9ede01bd63dfbd337 resource00000.ncx +5de9bbc64b8ddbba11612ca008361edb resource00001.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/f31eb84c62beac0ac14afd408b13e466_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/f31eb84c62beac0ac14afd408b13e466_rawml.md5 new file mode 100644 index 0000000..de36629 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/f31eb84c62beac0ac14afd408b13e466_rawml.md5 @@ -0,0 +1 @@ +248ac1e6f0f88b53302c102215cee8b0 diff --git a/app/src/main/cpp/libmobi/tests/md5/fbeb1b0c399840f6be14f358eb629ba0_markup.md5 b/app/src/main/cpp/libmobi/tests/md5/fbeb1b0c399840f6be14f358eb629ba0_markup.md5 new file mode 100644 index 0000000..423c82f --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/fbeb1b0c399840f6be14f358eb629ba0_markup.md5 @@ -0,0 +1,9 @@ +ced7b4f1735bd56e1e61a2e633ffe5f5 part00000.html +7dee30a6b9bc07b5ec92cda6f424b7db part00001.html +ae0198f50c282044c65082a256852fa5 resource00000.jpg +a68d962903b87b88131f75b9cda8249a resource00001.mpg +0cf790e01e20741cdac79d6a7385545b resource00002.mp3 +7ab80fa12ddee2f2bfc16498da537028 resource00003.jpg +688aeffb0a078da56295bbc37ab2d28d resource00005.jpg +cbce4b484c3eb3b9d2a6a3f11dba01dc resource00006.ncx +c13611644beefd62840be10a6f98efd4 resource00007.opf diff --git a/app/src/main/cpp/libmobi/tests/md5/fbeb1b0c399840f6be14f358eb629ba0_rawml.md5 b/app/src/main/cpp/libmobi/tests/md5/fbeb1b0c399840f6be14f358eb629ba0_rawml.md5 new file mode 100644 index 0000000..86d0cd3 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/md5/fbeb1b0c399840f6be14f358eb629ba0_rawml.md5 @@ -0,0 +1 @@ +3f5586c0d20cd93544b86b09b3cf7ddd diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-cp1252.mobi b/app/src/main/cpp/libmobi/tests/samples/sample-cp1252.mobi new file mode 100644 index 0000000..621a551 Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-cp1252.mobi differ diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-dict-fileversion4.mobi b/app/src/main/cpp/libmobi/tests/samples/sample-dict-fileversion4.mobi new file mode 100644 index 0000000..a2af478 Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-dict-fileversion4.mobi differ diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-dict-infl2.mobi b/app/src/main/cpp/libmobi/tests/samples/sample-dict-infl2.mobi new file mode 100644 index 0000000..2e0c9c8 Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-dict-infl2.mobi differ diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-drm-v1.mobi b/app/src/main/cpp/libmobi/tests/samples/sample-drm-v1.mobi new file mode 100644 index 0000000..760c669 Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-drm-v1.mobi differ diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-drm_pidLTKULBB^5V-v2.mobi b/app/src/main/cpp/libmobi/tests/samples/sample-drm_pidLTKULBB^5V-v2.mobi new file mode 100644 index 0000000..07ea132 Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-drm_pidLTKULBB^5V-v2.mobi differ diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-invalid-indx.fail b/app/src/main/cpp/libmobi/tests/samples/sample-invalid-indx.fail new file mode 100644 index 0000000..cd5abd4 Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-invalid-indx.fail differ diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-multimedia.mobi b/app/src/main/cpp/libmobi/tests/samples/sample-multimedia.mobi new file mode 100644 index 0000000..5a34ede Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-multimedia.mobi differ diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-ncx.mobi b/app/src/main/cpp/libmobi/tests/samples/sample-ncx.mobi new file mode 100644 index 0000000..7a0d92e Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-ncx.mobi differ diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-obfuscated-fonts.mobi b/app/src/main/cpp/libmobi/tests/samples/sample-obfuscated-fonts.mobi new file mode 100644 index 0000000..8583f0c Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-obfuscated-fonts.mobi differ diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-textread.mobi b/app/src/main/cpp/libmobi/tests/samples/sample-textread.mobi new file mode 100644 index 0000000..0bdd63b Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-textread.mobi differ diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-unicode-huffdic.mobi b/app/src/main/cpp/libmobi/tests/samples/sample-unicode-huffdic.mobi new file mode 100644 index 0000000..8d71a64 Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-unicode-huffdic.mobi differ diff --git a/app/src/main/cpp/libmobi/tests/samples/sample-unicode-uncompressed.mobi b/app/src/main/cpp/libmobi/tests/samples/sample-unicode-uncompressed.mobi new file mode 100644 index 0000000..cfbf1fd Binary files /dev/null and b/app/src/main/cpp/libmobi/tests/samples/sample-unicode-uncompressed.mobi differ diff --git a/app/src/main/cpp/libmobi/tests/test.sh.in b/app/src/main/cpp/libmobi/tests/test.sh.in new file mode 100644 index 0000000..1c7d667 --- /dev/null +++ b/app/src/main/cpp/libmobi/tests/test.sh.in @@ -0,0 +1,175 @@ +#!@BASH_PATH@ +# test.sh +# Copyright (c) 2015 Bartek Fabiszewski +# http://www.fabiszewski.net +# +# This file is part of libmobi. +# Licensed under LGPL, either version 3, or any later. +# See + +# Usage: test.sh filename + +if [[ $# < 1 ]]; then + die "Wrong number of input parameters: $#" 1 +fi + +if [[ "x@WIN32@" == "xyes" ]]; then + testfile="${1//\//\\}" + separator=\\ +else + testfile="${1}" + separator=\/ +fi +basefile="${testfile##*[/\\]}" +testfile_md5= +md5file_markup= +md5file_rawml= +shift +options="$@" +markup_dir="${basefile%.*}_markup" +tmp_dir="tmp" +rawml_file="${basefile%.*}.rawml" +md5prog="@MD5PROG@" +mobitool="..${separator}tools${separator}mobitool" +mobidrm="..${separator}tools${separator}mobidrm" +pid= +do_md5=1 +is_encrypted=0 +skip=77 + +log() { + echo + echo "[ $1 ]" + echo +} + +die() { + log "${testfile}: $1" + exit $2 +} + +[[ -f "${testfile}" ]] || die "Missing sample file: ${testfile}" $skip +[[ -x "${mobitool}" ]] || die "Missing mobitool" $skip + +if [[ "${basefile}" == 'sample-drm'* ]]; then + [[ "x@ENCRYPTION_OPT@" == "xyes" ]] || die "Encryption is disabled" $skip + + is_encrypted=1 + + if [[ "${basefile}" == 'sample-drm_pid'* ]]; then + pid=${basefile:14:10} + if [[ "${pid}" =~ [^a-zA-Z0-9^] ]]; then + log "Ignoring incorrect pid ${pid}" + else + pid=${pid//^/*} + options="${options} -p ${pid}" + log "Using pid ${pid}" + fi + fi +fi + +if [[ -z "${md5prog}" ]]; then + do_md5=0 + log "Missing md5 tool: ${md5prog}, will skip md5 tests" +else + testfile_md5=$(${md5prog} "${testfile//\\/\/}") + testfile_md5=${testfile_md5%% *} + md5file_markup="@srcdir@${separator}md5${separator}${testfile_md5}_markup.md5" + md5file_rawml="@srcdir@${separator}md5${separator}${testfile_md5}_rawml.md5" +fi + +# create tmp dir +mkdir -p "${tmp_dir}" + +# recreate source files +rm -rf "${tmp_dir}/${markup_dir}" +log "Running ${mobitool} -o \"${tmp_dir}\" -s ${options} \"${testfile}\"" +${mobitool} -o "${tmp_dir}" -s ${options} "${testfile}" || die "Recreating source failed, mobitool error ($?)" $? +[[ -d "${tmp_dir}${separator}${markup_dir}" ]] || die "Recreating source failed" 1 + +# verify checksums +if [[ "${do_md5}" -eq "1" ]]; then + if [[ -f "${md5file_markup}" ]]; then + ( + cd "${tmp_dir}${separator}${markup_dir}" || die "Could not change directory to ${tmp_dir}${separator}${markup_dir}" $? + rm -f "..${separator}${testfile_md5}.md5" + ${md5prog} * > "..${separator}${testfile_md5}.md5" + diff -w "..${separator}${testfile_md5}.md5" "..${separator}..${separator}${md5file_markup}" || die "Wrong md5 checksum in ${markup_dir}" $? + rm -f "..${separator}${testfile_md5}.md5" + ) || exit $? + log "Checksum correct" + else + log "No checksums file: ${md5file_markup}, skipping md5 test" + die "Missing markup checksums file" $skip + fi +fi +rm -rf "${tmp_dir}${separator}${markup_dir}" + +# dump rawml +rm -f "${tmp_dir}${separator}${rawml_file}" +log "Running ${mobitool} -o \"${tmp_dir}\" -d ${options} \"${testfile}\"" +${mobitool} -o "${tmp_dir}" -d ${options} "${testfile}" || die "Dumping rawml failed, mobitool error ($?)" $? +[[ -f "${tmp_dir}${separator}${rawml_file}" ]] || die "Dumping rawml failed" 1 + +# verify checksum +if [[ "${do_md5}" -eq "1" ]]; then + if [[ -f "${md5file_rawml}" ]]; then + md5_1=$(cat ${md5file_rawml}) + md5_2=$(${md5prog} "${tmp_dir}/${rawml_file}") + [[ "${md5_1%% *}" == "${md5_2%% *}" ]] || die "Wrong md5 checksum for ${rawml_file} (${md5_1%% *} != ${md5_2%% *})" 1 + log "Checksum correct" + else + log "No checksums file: ${md5file_rawml}, skipping md5 test" + die "Missing rawml checksums file" $skip + fi +fi +rm -f "${tmp_dir}${separator}${rawml_file}" + +# test encryption / decryption +[[ "x@ENCRYPTION_OPT@" == "xyes" ]] || exit 0 + +if [[ "${is_encrypted}" -eq "1" ]]; then + options="-d ${options}" + verify_options="-s" + suffix=decrypted +else + options="-e -s B001XXXXXXXXXXXX ${options}" + verify_options="-s -P B001XXXXXXXXXXXX" + suffix=encrypted +fi + +drm_file="${basefile%.*}-${suffix}" +drm_markup="${drm_file}_markup" + +rm -f "${tmp_dir}${separator}${drm_file}."* + +log "Running ${mobidrm} -o \"${tmp_dir}\" ${options} \"${testfile}\"" +output="$(${mobidrm} -o "${tmp_dir}" ${options} "${testfile}" 2>&1)" +status=$? +echo "${output}" + +if [[ "${status}" -ne "0" ]]; then + if [[ "${output}" == *"Can't remove DRM from rented documents"* ]]; then + log "Exiting with success as rented document should not be processed" + exit 0 + else + die "DRM operation failed, mobidrm error (${status})" ${status} + fi +fi + +drm_files=() + +[[ -f "${tmp_dir}${separator}${drm_file}.mobi" ]] && drm_files+=("${drm_file}.mobi") +[[ -f "${tmp_dir}${separator}${drm_file}.azw3" ]] && drm_files+=("${drm_file}.azw3") + +[[ ${#drm_files[@]} -eq 0 ]] && die "DRM operation failed" 1 + +# verify +for drm_file in ${drm_files[@]}; do + log "Running ${mobitool} -o \"${tmp_dir}\" ${verify_options} \"${tmp_dir}${separator}${drm_file}\"" + ${mobitool} -o "${tmp_dir}" ${verify_options} "${tmp_dir}${separator}${drm_file}" || die "DRM operation produced broken file, mobitool error ($?)" $? + rm -f "${tmp_dir}${separator}${drm_file}" + rm -rf "${tmp_dir}${separator}${drm_markup}" +done + +exit 0 diff --git a/app/src/main/cpp/libmobi/tools/CMakeLists.txt b/app/src/main/cpp/libmobi/tools/CMakeLists.txt new file mode 100644 index 0000000..4509cf3 --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/CMakeLists.txt @@ -0,0 +1,37 @@ +# Copyright (c) 2022 Bartek Fabiszewski +# http://www.fabiszewski.net +# +# This file is part of libmobi. +# Licensed under LGPL, either version 3, or any later. +# See + +include_directories(${LIBMOBI_SOURCE_DIR}/src) + +add_library(common OBJECT common.c) + +add_executable(mobitool mobitool.c) +target_link_libraries(mobitool PUBLIC mobi) +target_link_libraries(mobitool PRIVATE common) +add_executable(mobimeta mobimeta.c) +target_link_libraries(mobimeta PUBLIC mobi) +target_link_libraries(mobimeta PRIVATE common) +add_executable(mobidrm mobidrm.c) +target_link_libraries(mobidrm PUBLIC mobi) +target_link_libraries(mobidrm PRIVATE common) + +if(USE_XMLWRITER) +# miniz.c zip functions are needed for epub creation + set(zip_SOURCES + ${LIBMOBI_SOURCE_DIR}/src/miniz.c + ${LIBMOBI_SOURCE_DIR}/src/miniz.h + ) + add_library(zip OBJECT ${zip_SOURCES}) + target_compile_definitions(zip PRIVATE + MINIZ_NO_ZLIB_COMPATIBLE_NAMES + _POSIX_C_SOURCE=200112L) + target_link_libraries(mobitool PRIVATE zip) + target_link_libraries(mobimeta PRIVATE zip) + if (TOOLS_STATIC AND USE_MINIZ) + target_link_options(mobitool PRIVATE "-Wl,--allow-multiple-definition") + endif (TOOLS_STATIC AND USE_MINIZ) +endif(USE_XMLWRITER) diff --git a/app/src/main/cpp/libmobi/tools/Makefile.am b/app/src/main/cpp/libmobi/tools/Makefile.am new file mode 100644 index 0000000..2d529e1 --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/Makefile.am @@ -0,0 +1,51 @@ +# tools + +# this lists the binaries to produce, the (non-PHONY, binary) targets in +# the previous manual Makefile +AM_CPPFLAGS = -I$(top_srcdir)/src -I$(top_builddir)/src + +bin_PROGRAMS = mobitool mobimeta +man_MANS = mobitool.1 mobimeta.1 + +noinst_LIBRARIES = libcommon.a +libcommon_a_SOURCES = common.c common.h + +if USE_INTERNAL_GETOPT +libcommon_a_SOURCES += win32/getopt.c win32/getopt.h +endif + +mobitool_SOURCES = mobitool.c +mobitool_DEPENDENCIES = $(top_builddir)/src/libmobi.la libcommon.a +mobitool_LDADD = libcommon.a $(top_builddir)/src/libmobi.la +mobitool_CFLAGS = $(ISO99_SOURCE) $(DEBUG_CFLAGS) -D_POSIX_C_SOURCE=200112L +mobitool_LDFLAGS = $(TOOLS_STATIC) + +if USE_XMLWRITER +# miniz.c zip functions are needed for epub creation +noinst_LIBRARIES += libminiz.a +libminiz_a_SOURCES = ../src/miniz.c ../src/miniz.h +libminiz_a_CFLAGS = $(MINIZ_CFLAGS) -DMINIZ_NO_ZLIB_COMPATIBLE_NAMES +mobitool_DEPENDENCIES += libminiz.a +mobitool_LDADD += libminiz.a +if USE_STATIC +if USE_MINIZ +mobitool_LDFLAGS += $(MOBI_ALLOW_MULTIPLE) +endif +endif +endif + +mobimeta_SOURCES = mobimeta.c +mobimeta_DEPENDENCIES = $(top_builddir)/src/libmobi.la libcommon.a +mobimeta_LDADD = libcommon.a $(top_builddir)/src/libmobi.la +mobimeta_CFLAGS = $(ISO99_SOURCE) $(DEBUG_CFLAGS) -D_POSIX_C_SOURCE=200112L +mobimeta_LDFLAGS = $(TOOLS_STATIC) + +if USE_ENCRYPTION +bin_PROGRAMS += mobidrm +man_MANS += mobidrm.1 +mobidrm_SOURCES = mobidrm.c +mobidrm_DEPENDENCIES = $(top_builddir)/src/libmobi.la libcommon.a +mobidrm_LDADD = libcommon.a $(top_builddir)/src/libmobi.la +mobidrm_CFLAGS = $(ISO99_SOURCE) $(DEBUG_CFLAGS) -D_POSIX_C_SOURCE=200112L +mobidrm_LDFLAGS = $(TOOLS_STATIC) +endif diff --git a/app/src/main/cpp/libmobi/tools/README.md b/app/src/main/cpp/libmobi/tools/README.md new file mode 100644 index 0000000..6f89e68 --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/README.md @@ -0,0 +1,51 @@ +## mobitool + usage: /Users/baf/src/libmobi/tools/.libs/mobitool [-cdehimrstuvx7] [-o dir] [-p pid] [-P serial] filename + without arguments prints document metadata and exits + -c dump cover + -d dump rawml text record + -e create EPUB file (with -s will dump EPUB source) + -h show this usage summary and exit + -i print detailed metadata + -m print records metadata + -o dir save output to dir folder + -p pid set pid for decryption + -P serial set device serial for decryption + -r dump raw records + -s dump recreated source files + -t split hybrid file into two parts + -u show rusage + -v show version and exit + -x extract conversion source and log (if present) + -7 parse KF7 part of hybrid file (by default KF8 part is parsed) + +## mobimeta + usage: mobimeta [-a | -s meta=value[,meta=value,...]] [-d meta[,meta,...]] [-p pid] [-P serial] [-hv] filein [fileout] + without arguments prints document metadata and exits + -a ? list valid meta named keys + -a meta=value add metadata + -d meta delete metadata + -s meta=value set metadata + -p pid set pid for decryption + -P serial set device serial for decryption + -h show this usage summary and exit + -v show version and exit + +## mobidrm + usage: mobidrm [-d | -e] [-hv] [-p pid] [-f date] [-t date] [-s serial] [-o dir] filename + without arguments prints document metadata and exits + + Decrypt options: + -d decrypt (required) + -p pid set decryption pid (may be specified multiple times) + -s serial set device serial (may be specified multiple times) + + Encrypt options: + -e encrypt (required) + -s serial set device serial (may be specified multiple times) + -f date set validity period from date (yyyy-mm-dd) when encrypting (inclusive) + -t date set validity period to date (yyyy-mm-dd) when encrypting (inclusive) + + Common options: + -o dir save output to dir folder + -h show this usage summary and exit + -v show version and exit diff --git a/app/src/main/cpp/libmobi/tools/common.c b/app/src/main/cpp/libmobi/tools/common.c new file mode 100644 index 0000000..409a4b4 --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/common.c @@ -0,0 +1,621 @@ +/** @file common.c + * + * @brief common tools functions + * + * @example common.c + * Common functions for tools + * + * Copyright (c) 2016 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#include +#include +#include +#include +#include +#include "common.h" + +#ifdef _WIN32 +# include +# define mkdir(path,flags) _mkdir(path) +const char separator = '\\'; +#else +const char separator = '/'; +#endif +bool outdir_opt = false; +char outdir[FILENAME_MAX]; + +#define UNUSED(x) (void)(x) + +#ifndef min +# define min(a, b) ((a) < (b) ? (a) : (b)) +#endif + +/** + @brief Messages for libmobi return codes + For reference see enum MOBI_RET in mobi.h + */ +const char *libmobi_messages[] = { + "Success", + "Generic error", + "Wrong function parameter", + "Corrupted data", + "File not found", + "Document is encrypted", + "Unsupported document format", + "Memory allocation error", + "Initialization error", + "Buffer error", + "XML error", + "Invalid DRM pid", + "DRM key not found", + "DRM support not included", + "Write failed", + "DRM expired" +}; + +#define LIBMOBI_MSG_COUNT ARRAYSIZE(libmobi_messages) + +/** + @brief Return message for given libmobi return code + @param[in] ret Libmobi return code + @return Message string + */ +const char * libmobi_msg(const MOBI_RET ret) { + size_t index = ret; + if (index < LIBMOBI_MSG_COUNT) { + return libmobi_messages[index]; + } + return "Unknown error"; +} + +/** + @brief Parse file name into file path and base name. + Dirname or basename can be skipped by setting to null. + @param[in] fullpath Full file path + @param[in,out] dirname Will be set to full dirname + @param[in,out] basename Will be set to file basename + @param[in] buf_len Size of each ouput buffer: dirname and basename + */ +void split_fullpath(const char *fullpath, char *dirname, char *basename, const size_t buf_len) { + if (buf_len == 0) { + return; + } + char *p = strrchr(fullpath, separator); + if (p) { + p += 1; + if (dirname) { + size_t dirlen = min(buf_len - 1, (size_t) (p - fullpath)); + strncpy(dirname, fullpath, dirlen); + dirname[dirlen] = '\0'; + } + if (basename) { + strncpy(basename, p, buf_len - 1); + basename[buf_len - 1] = '\0'; + } + } + else { + if (dirname) { + dirname[0] = '\0'; + } + if (basename) { + strncpy(basename, fullpath, buf_len - 1); + basename[buf_len - 1] = '\0'; + } + } + if (basename) { + p = strrchr(basename, '.'); + if (p) { + *p = '\0'; + } + } +} + +/** + @brief Make directory + @param[in] path Path + @return SUCCESS or ERROR + */ +int make_directory(const char *path) { + errno = 0; + if (mkdir(path, S_IRWXU) != 0 && errno != EEXIST) { + int errsv = errno; + printf("Creating directory \"%s\" failed (%s)\n", path, strerror(errsv)); + return ERROR; + } + return SUCCESS; +} + +/** + @brief Create subfolder in directory + @param[in,out] newdir Path to created subfolder + @param[in] buf_len Buffer size fo created subfolder + @param[in] parent_dir Directory path + @param[in] subdir_name Subfolder name + @return SUCCESS or ERROR + */ +int create_subdir(char *newdir, const size_t buf_len, const char *parent_dir, const char *subdir_name) { + int n = snprintf(newdir, buf_len, "%s%c%s", parent_dir, separator, subdir_name); + if (n < 0) { + printf("Creating file name failed\n"); + return ERROR; + } + if ((size_t) n >= buf_len) { + printf("File name too long: %s\n", newdir); + return ERROR; + } + return make_directory(newdir); +} + +/** + @brief Open file descriptor and write buffer to it + @param[in] buffer Buffer + @param[in] len Buffer length + @param[in] path File path + @return SUCCESS or ERROR + */ +int write_file(const unsigned char *buffer, const size_t len, const char *path) { + errno = 0; + FILE *file = fopen(path, "wb"); + if (file == NULL) { + int errsv = errno; + printf("Could not open file for writing: %s (%s)\n", path, strerror(errsv)); + return ERROR; + } + size_t n = fwrite(buffer, 1, len, file); + if (n != len) { + int errsv = errno; + printf("Error writing to file: %s (%s)\n", path, strerror(errsv)); + fclose(file); + return ERROR; + } + fclose(file); + return SUCCESS; +} + +/** + @brief Write content to file in directory + @param[in] dir Directory path + @param[in] name File name + @param[in] buffer Buffer + @param[in] len Buffer length + @return SUCCESS or ERROR + */ +int write_to_dir(const char *dir, const char *name, const unsigned char *buffer, const size_t len) { + char path[FILENAME_MAX]; + int n = snprintf(path, sizeof(path), "%s%c%s", dir, separator, name); + if (n < 0) { + printf("Creating file name failed\n"); + return ERROR; + } + if ((size_t) n >= sizeof(path)) { + printf("File name too long\n"); + return ERROR; + } + return write_file(buffer, len, path); +} + +/** + @brief Check whether given path exists and is a directory + @param[in] path Path to be tested + @return True if directory exists, false otherwise + */ +bool dir_exists(const char *path) { + struct stat sb; + if (stat(path, &sb) != 0) { + int errsv = errno; + printf("Path \"%s\" is not accessible (%s)\n", path, strerror(errsv)); + return false; + } + if (!S_ISDIR(sb.st_mode)) { + printf("Path \"%s\" is not a directory\n", path); + return false; + } + return true; +} + +/** + @brief Make sure we use consistent separators on Windows builds + @param[in,out] path Path to be fixed + */ +void normalize_path(char *path) { +#ifdef _WIN32 + if (path != NULL) { + for (size_t i = 0; i <= strlen(path); i++) { + if (path[i] == '/') { + path[i] = separator; + } + } + } +#else + UNUSED(path); +#endif +} + + +/** + @brief Print summary meta information + @param[in] m MOBIData structure + */ +void print_summary(const MOBIData *m) { + char *title = mobi_meta_get_title(m); + if (title) { + printf("Title: %s\n", title); + free(title); + } + char *author = mobi_meta_get_author(m); + if (author) { + printf("Author: %s\n", author); + free(author); + } + char *contributor = mobi_meta_get_contributor(m); + uint32_t major = 0, minor = 0, build = 0; + bool is_calibre = false; + if (contributor) { + const char *calibre_contributor = "calibre ("; + if (strncmp(contributor, calibre_contributor, strlen(calibre_contributor)) == 0) { + is_calibre = true; + sscanf(contributor, "calibre (%u.%u.%u)", &major, &minor, &build); + } else { + printf("Contributor: %s\n", contributor); + } + free(contributor); + } + char *subject = mobi_meta_get_subject(m); + if (subject) { + printf("Subject: %s\n", subject); + free(subject); + } + char *publisher = mobi_meta_get_publisher(m); + if (publisher) { + printf("Publisher: %s\n", publisher); + free(publisher); + } + char *date = mobi_meta_get_publishdate(m); + if (date) { + printf("Publishing date: %s\n", date); + free(date); + } + char *description = mobi_meta_get_description(m); + if (description) { + printf("Description: %s\n", description); + free(description); + } + char *review = mobi_meta_get_review(m); + if (review) { + printf("Review: %s\n", review); + free(review); + } + char *imprint = mobi_meta_get_imprint(m); + if (imprint) { + printf("Imprint: %s\n", imprint); + free(imprint); + } + char *copyright = mobi_meta_get_copyright(m); + if (copyright) { + printf("Copyright: %s\n", copyright); + free(copyright); + } + char *isbn = mobi_meta_get_isbn(m); + if (isbn) { + printf("ISBN: %s\n", isbn); + free(isbn); + } + char *asin = mobi_meta_get_asin(m); + if (asin) { + printf("ASIN: %s\n", asin); + free(asin); + } + char *language = mobi_meta_get_language(m); + if (language) { + printf("Language: %s", language); + free(language); + if (m->mh && m->mh->text_encoding) { + uint32_t encoding = *m->mh->text_encoding; + if (encoding == MOBI_CP1252) { + printf(" (cp1252)"); + } else if (encoding == MOBI_UTF8) { + printf(" (utf8)"); + } + } + printf("\n"); + } + if (mobi_is_dictionary(m)) { + printf("Dictionary"); + if (m->mh && m->mh->dict_input_lang && m->mh->dict_output_lang && + *m->mh->dict_input_lang && *m->mh->dict_output_lang) { + const char *locale_in = mobi_get_locale_string(*m->mh->dict_input_lang); + const char *locale_out = mobi_get_locale_string(*m->mh->dict_output_lang); + printf(": %s => %s", locale_in ? locale_in : "unknown", locale_out ? locale_out : "unknown"); + } + printf("\n"); + } + printf("__\n"); + if (strcmp(m->ph->type, "TEXt") == 0) { + if (strcmp(m->ph->creator, "TlDc") == 0) { + printf("TealDoc\n"); + } else { + printf("PalmDoc\n"); + } + } else { + printf("Mobi version: %zu", mobi_get_fileversion(m)); + if (mobi_is_hybrid(m)) { + size_t version = mobi_get_fileversion(m->next); + if (version != MOBI_NOTSET) { + printf(" (hybrid with version %zu)", version); + } + } + printf("\n"); + } + if (mobi_is_replica(m)) { + printf("Print Replica\n"); + } + if (mobi_is_encrypted(m)) { + printf("Document is encrypted\n"); + } + if (is_calibre) { + printf("Creator software: calibre %u.%u.%u\n", major, minor, build); + } else { + MOBIExthHeader *exth = mobi_get_exthrecord_by_tag(m, EXTH_CREATORSOFT); + if (exth) { + printf("Creator software: "); + uint32_t creator = mobi_decode_exthvalue(exth->data, exth->size); + exth = mobi_get_exthrecord_by_tag(m, EXTH_CREATORMAJOR); + if (exth) { + major = mobi_decode_exthvalue(exth->data, exth->size); + } + exth = mobi_get_exthrecord_by_tag(m, EXTH_CREATORMINOR); + if (exth) { + minor = mobi_decode_exthvalue(exth->data, exth->size); + } + exth = mobi_get_exthrecord_by_tag(m, EXTH_CREATORBUILD); + if (exth) { + build = mobi_decode_exthvalue(exth->data, exth->size); + } + exth = mobi_get_exthrecord_by_tag(m, EXTH_CREATORBUILDREV); + if (major == 2 && minor == 9 && build == 0 && exth) { + char *rev = mobi_decode_exthstring(m, exth->data, exth->size); + if (rev) { + if (strcmp(rev, "0730-890adc2") == 0) { + is_calibre = true; + } + free(rev); + } + } + switch (creator) { + case 0: + printf("mobipocket reader %u.%u.%u", major, minor, build); + break; + case 1: + case 101: + printf("mobigen %u.%u.%u", major, minor, build); + break; + case 2: + printf("mobipocket creator %u.%u.%u", major, minor, build); + break; + case 200: + printf("kindlegen %u.%u.%u (windows)", major, minor, build); + if (is_calibre) { + printf(" or calibre"); + } + break; + case 201: + printf("kindlegen %u.%u.%u (linux)", major, minor, build); + if ((major == 1 && minor == 2 && build == 33307) || + (major == 2 && minor == 0 && build == 101) || + is_calibre) { + printf(" or calibre"); + } + break; + case 202: + printf("kindlegen %u.%u.%u (mac)", major, minor, build); + if (is_calibre) { + printf(" or calibre"); + } + break; + default: + printf("unknown"); + break; + } + printf("\n"); + } + } +} + +/** + @brief Print all loaded EXTH record tags + @param[in] m MOBIData structure + */ +void print_exth(const MOBIData *m) { + if (m->eh == NULL) { + return; + } + /* Linked list of MOBIExthHeader structures holds EXTH records */ + const MOBIExthHeader *curr = m->eh; + if (curr != NULL) { + printf("\nEXTH records:\n"); + } + uint32_t val32; + while (curr != NULL) { + /* check if it is a known tag and get some more info if it is */ + MOBIExthMeta tag = mobi_get_exthtagmeta_by_tag(curr->tag); + if (tag.tag == 0) { + /* unknown tag */ + /* try to print the record both as string and numeric value */ + char *str = malloc(curr->size + 1); + if (!str) { + printf("Memory allocation failed\n"); + exit(1); + } + unsigned i = 0; + unsigned char *p = curr->data; + while (i < curr->size && isprint(*p)) { + str[i] = (char)*p++; + i++; + } + str[i] = '\0'; + val32 = mobi_decode_exthvalue(curr->data, curr->size); + printf("Unknown (%i): %s (%u)\n", curr->tag, str, val32); + free(str); + } else { + /* known tag */ + size_t size = curr->size; + unsigned char *data = curr->data; + switch (tag.type) { + /* numeric */ + case EXTH_NUMERIC: + val32 = mobi_decode_exthvalue(data, size); + printf("%s (%i): %u\n", tag.name, tag.tag, val32); + break; + /* string */ + case EXTH_STRING: + { + char *exth_string = mobi_decode_exthstring(m, data, size); + if (exth_string) { + printf("%s (%i): %s\n", tag.name, tag.tag, exth_string); + free(exth_string); + } + break; + } + /* binary */ + case EXTH_BINARY: + { + unsigned i = 0; + const size_t str_len = 2 * size + 1; + char *str = malloc(str_len); + if (!str) { + printf("Memory allocation failed\n"); + exit(1); + } + str[0] = '\0'; + while (size) { + uint8_t val8 = *data++; + snprintf(&str[i], str_len - i, "%02x", val8); + i += 2; + size--; + } + printf("%s (%i): 0x%s\n", tag.name, tag.tag, str); + free(str); + break; + } + default: + break; + } + } + curr = curr->next; + } +} + +/** + @brief Set PID for decryption + @param[in,out] m MOBIData structure + @param[in] pid Serial number + @return SUCCESS or error code + */ +int set_decryption_pid(MOBIData *m, const char *pid) { + printf("\nVerifying PID %s...", pid); + MOBI_RET mobi_ret = mobi_drm_setkey(m, pid); + if (mobi_ret != MOBI_SUCCESS) { + printf("failed (%s)\n", libmobi_msg(mobi_ret)); + return (int) mobi_ret; + } + printf("ok\n"); + return SUCCESS; +} + +/** + @brief Set device serial number for decryption + @param[in,out] m MOBIData structure + @param[in] serial Serial number + @return SUCCESS or error code + */ +int set_decryption_serial(MOBIData *m, const char *serial) { + printf("\nVerifying serial %s... ", serial); + MOBI_RET mobi_ret = mobi_drm_setkey_serial(m, serial); + if (mobi_ret != MOBI_SUCCESS) { + printf("failed (%s)\n", libmobi_msg(mobi_ret)); + return (int) mobi_ret; + } + printf("ok\n"); + return SUCCESS; +} + +/** + @brief Set key for decryption. Use user supplied pid or device serial number + @param[in,out] m MOBIData structure + @param[in] serial Serial number + @param[in] pid Pid + @return SUCCESS or error code + */ +int set_decryption_key(MOBIData *m, const char *serial, const char *pid) { + + if (!pid && !serial) { + return SUCCESS; + } + if (!mobi_is_encrypted(m)) { + printf("\nDocument is not encrypted, ignoring PID/serial\n"); + return SUCCESS; + } + if (m->rh && m->rh->encryption_type == MOBI_ENCRYPTION_V1) { + printf("\nEncryption type 1, ignoring PID/serial\n"); + return SUCCESS; + } + int ret = SUCCESS; + if (pid && (ret = set_decryption_pid(m, pid)) == SUCCESS) { + return SUCCESS; + } + if (serial) { + ret = set_decryption_serial(m, serial); + } + return ret; +} + +/** + @brief Save mobi file + + @param[in,out] m MOBIData struicture + @param[in] fullpath Full file path + @param[in] suffix Suffix appended to file name + @return SUCCESS or ERROR + */ +int save_mobi(MOBIData *m, const char *fullpath, const char *suffix) { + char outfile[FILENAME_MAX]; + char basename[FILENAME_MAX]; + char dirname[FILENAME_MAX]; + split_fullpath(fullpath, dirname, basename, FILENAME_MAX); + const char *ext = (mobi_get_fileversion(m) >= 8) ? "azw3" : "mobi"; + int n; + if (outdir_opt) { + n = snprintf(outfile, sizeof(outfile), "%s%s-%s.%s", outdir, basename, suffix, ext); + } else { + n = snprintf(outfile, sizeof(outfile), "%s%s-%s.%s", dirname, basename, suffix, ext); + } + if (n < 0) { + printf("Creating file name failed\n"); + return ERROR; + } + if ((size_t) n >= sizeof(outfile)) { + printf("File name too long\n"); + return ERROR; + } + + /* write */ + printf("Saving %s...\n", outfile); + FILE *file_out = fopen(outfile, "wb"); + if (file_out == NULL) { + int errsv = errno; + printf("Error opening file: %s (%s)\n", outfile, strerror(errsv)); + return ERROR; + } + MOBI_RET mobi_ret = mobi_write_file(file_out, m); + fclose(file_out); + if (mobi_ret != MOBI_SUCCESS) { + printf("Error writing file (%s)\n", libmobi_msg(mobi_ret)); + return ERROR; + } + return SUCCESS; +} diff --git a/app/src/main/cpp/libmobi/tools/common.h b/app/src/main/cpp/libmobi/tools/common.h new file mode 100644 index 0000000..77115c2 --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/common.h @@ -0,0 +1,78 @@ +/** @file common.h + * + * Copyright (c) 2020 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#ifndef common_h +#define common_h + +#include +#include + +#ifdef HAVE_CONFIG_H +# include "../config.h" +#endif + +#ifdef HAVE_GETOPT +# include +#else +# include "win32/getopt.h" +#endif + +/* return codes */ +#define ERROR 1 +#define SUCCESS 0 + +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) + +#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0])) + +#if defined(__clang__) +# define COMPILER "clang " __VERSION__ +#elif defined(__SUNPRO_C) +# define COMPILER "suncc " STR(__SUNPRO_C) +#elif defined(__GNUC__) +# if (defined(__MINGW32__) || defined(__MINGW64__)) +# define COMPILER "gcc (MinGW) " __VERSION__ +# else +# define COMPILER "gcc " __VERSION__ +# endif +#elif defined(_MSC_VER) +# define COMPILER "MSVC++ " STR(_MSC_VER) +#else +# define COMPILER "unknown" +#endif + +#if !defined S_ISDIR && defined S_IFDIR +# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) +#endif +#ifndef S_ISDIR +# error "At least one of S_ISDIR or S_IFDIR macros is required" +#endif + +#define FULLNAME_MAX 1024 + +extern const char separator; +extern bool outdir_opt; +extern char outdir[FILENAME_MAX]; + +const char * libmobi_msg(const MOBI_RET ret); +void split_fullpath(const char *fullpath, char *dirname, char *basename, const size_t buf_len); +int make_directory(const char *path); +int create_subdir(char *newdir, const size_t buf_len, const char *parent_dir, const char *subdir_name); +int write_file(const unsigned char *buffer, const size_t len, const char *path); +int write_to_dir(const char *dir, const char *name, const unsigned char *buffer, const size_t len); +bool dir_exists(const char *path); +void normalize_path(char *path); +void print_summary(const MOBIData *m); +void print_exth(const MOBIData *m); +int set_decryption_key(MOBIData *m, const char *serial, const char *pid); +int set_decryption_pid(MOBIData *m, const char *pid); +int set_decryption_serial(MOBIData *m, const char *serial); +int save_mobi(MOBIData *m, const char *fullpath, const char *suffix); +#endif /* common_h */ diff --git a/app/src/main/cpp/libmobi/tools/mobidrm.1.in b/app/src/main/cpp/libmobi/tools/mobidrm.1.in new file mode 100644 index 0000000..5205780 --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/mobidrm.1.in @@ -0,0 +1,124 @@ +.Dd February 16, 2022 +.Dt mobidrm 1 URM +.Os Unix +.Sh NAME +.Nm mobidrm +.Nd Utility for decryption and encryption of MOBI format ebook files. +.Sh SYNOPSIS +.Nm +.Fl d +.Op Fl o Ar dir +.Op Fl p Ar pid +.Op Fl s Ar serial +.Ar file +.Nm +.Fl e +.Op Fl o Ar dir +.Op Fl s Ar serial +.Op Fl f Ar date +.Op Fl t Ar date +.Ar file +.Nm +.Op Fl hv +.Sh DESCRIPTION +The program encrypts or decrypts MOBI files with DRM schemes used on eInk devices. It is powered by +.Nm libmobi +library. +.Pp +It may encrypt documents targeting particular device by using its serial number or applying generic DRM scheme targeting all supported readers. +.Pp +Optionally encryption may be valid only during chosen period. Kindles require both start and end date to be set. +This tool allows one to specify only one date (start or end). +In such case the other date will be automatically set to respectively lowest (1970-01-01) or largest (10136-02-16) valid value. +.Pp +In case of hybrid files mobidrm separately encrypts both enclosed parts and produces two files: mobi for legacy format and azw3 for KF8 format. +.Pp +The program also decrypts documents. One must supply device serial number or document PID if DRM was applied for specific device. +.Pp +Invoked without arguments prints usage summary and exits. +.Pp +A list of flags and their descriptions. +.Pp +\fBDecryption flags\fR: +.Pp +.Bl -tag -width -indent +.It Fl d +Decrypt. This flag must be set in order to decrypt document. +.It Fl p Ar pid +Set optional decryption +.Ar pid +(may be specified multiple times). +.It Fl s Ar serial +Set optional device +.Ar serial +number (may be specified multiple times). +.El +.Pp +\fBEncryption flags\fR: +.Bl -tag -width -indent +.It Fl e +Encrypt. This flag must be set in order to encrypt document. +.It Fl f Ar date +Set optional validity period \fBfrom\fR +.Ar date +formatted as yyyy-mm-dd. Document will not be valid before this date. +.It Fl s Ar serial +Set optional device +.Ar serial +number. If not set document will be encrypted with generic reader key. This flag may be specified +multiple times to target multiple devices. +.It Fl t Ar date +Set optional validity period \fBto\fR +.Ar date +formatted as yyyy-mm-dd. Document will expire after this date. +.El +.Pp +\fBCommon flags\fR: +.Bl -tag -width -indent +.It Fl o Ar dir +Save output to +.Ar dir +folder. +.It Fl h +Show usage summary and exit. +.It Fl v +Show version and exit. +.El +.Pp +.Sh EXAMPLES +The following command decrypts document using given serial number. Decrypted output will be saved to /tmp folder. +.Pp +.Dl % mobidrm -d -s B001XXXXXXXXXXXX -o /tmp example.mobi +.Pp +The following command decrypts document trying multiple PIDs. +.Pp +.Dl % mobidrm -d -p XXXXXXXXX1 -p XXXXXXXXX2 example.mobi +.Pp +The following command encrypts document targeting two devices using their serial numbers. Document will be readable only on those devices. +.Pp +.Dl % mobidrm -e -s B001XXXXXXXXXX01 -s B001XXXXXXXXXX02 example.mobi +.Pp +The following command encrypts document for device with given serial number. Document will only be valid within given period (inclusive). +.Pp +.Dl % mobidrm -e -s B001XXXXXXXXXX01 -f 2021-01-01 -t 2021-01-31 example.mobi +.Sh RETURN VALUES +The +.Nm +utility returns 0 on success, 1 on error. +.Sh COPYRIGHT +Copyright (C) 2021-2022 Bartek Fabiszewski. +.Pp +Released under LGPL version 3 or any later (same as +.Nm libmobi Ns +). +.Sh WEB SITE +Visit http://www.fabiszewski.net for details. +.Sh DIAGNOSTICS +For diagnostics +.Nm libmobi +must be configured with +.Fl Fl enable-debug +option. +.Sh SEE ALSO +.Xr mobimeta 1 +.Xr mobitool 1 diff --git a/app/src/main/cpp/libmobi/tools/mobidrm.c b/app/src/main/cpp/libmobi/tools/mobidrm.c new file mode 100644 index 0000000..971334a --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/mobidrm.c @@ -0,0 +1,488 @@ +/** @file mobidrm.c + * + * @brief mobidrm + * + * Copyright (c) 2021 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#include +#include +#include +#include +#include +#include + +#include "common.h" + +#define VOUCHERS_COUNT_MAX 20 + +/* command line options */ +bool decrypt_opt = false; +bool encrypt_opt = false; +bool expiry_opt = false; + +/* options values */ +char *pid[VOUCHERS_COUNT_MAX]; +char *serial[VOUCHERS_COUNT_MAX]; +size_t serial_count = 0; +size_t pid_count = 0; +time_t valid_from = -1; +time_t valid_to = -1; + + +/** + @brief Print usage info + @param[in] progname Executed program name + */ +static void print_usage(const char *progname) { + printf("usage: %s [-d | -e] [-hv] [-p pid] [-f date] [-t date] [-s serial] [-o dir] filename\n", progname); + printf(" without arguments prints document metadata and exits\n\n"); + + printf(" Decrypt options:\n"); + printf(" -d decrypt (required)\n"); + printf(" -p pid set decryption pid (may be specified multiple times)\n"); + printf(" -s serial set device serial (may be specified multiple times)\n\n"); + + printf(" Encrypt options:\n"); + printf(" -e encrypt (required)\n"); + printf(" -s serial set device serial (may be specified multiple times)\n"); + printf(" -f date set validity period from date (yyyy-mm-dd) when encrypting (inclusive)\n"); + printf(" -t date set validity period to date (yyyy-mm-dd) when encrypting (inclusive)\n\n"); + + printf(" Common options:\n"); + printf(" -o dir save output to dir folder\n"); + printf(" -h show this usage summary and exit\n"); + printf(" -v show version and exit\n"); +} + +/** + @brief Applies DRM + + @param[in,out] m MOBIData structure + @param[in] use_kf8 In case of hybrid file process KF8 part if true, the other part otherwise + @return SUCCESS or ERROR + */ +static int do_encrypt(MOBIData *m, bool use_kf8) { + + MOBI_RET mobi_ret; + + if (mobi_is_hybrid(m)) { + mobi_ret = mobi_remove_hybrid_part(m, !use_kf8); + if (mobi_ret != MOBI_SUCCESS) { + printf("Error removing hybrid part (%s)\n", libmobi_msg(mobi_ret)); + return ERROR; + } + printf("\nProcessing file version %zu from hybrid file\n", mobi_get_fileversion(m)); + } + + MOBIExthTag *tags = NULL; + MOBIExthTag amazonkeys[] = { EXTH_WATERMARK, EXTH_TTSDISABLE, EXTH_CLIPPINGLIMIT, EXTH_READFORFREE, EXTH_RENTAL, EXTH_UNK407 }; + MOBIExthTag tamperkeys[ARRAYSIZE(amazonkeys)] = { 0 }; + size_t tags_count = 0; + + if (mobi_get_fileversion(m) >= 4 && m->eh) { + // EXTH tamperproof keys are required with encryption scheme 2 in mobi version 8 + // and are supported since version 4. + // Amazon software by default includes tags: 208, 404, 401, 405, 406, 407 in DRM scheme. + // Any change in tags that are included invalidates DRM. + // You can secure any tag you want, we just add dummy watermark (208) if it is not already present in file + // to satisfy requirements. + if (mobi_get_exthrecord_by_tag(m, EXTH_WATERMARK) == NULL) { + char watermark[] = "aHR0cHM6Ly9naXRodWIuY29tL2JmYWJpc3pld3NraS9saWJtb2Jp"; + mobi_add_exthrecord(m, EXTH_WATERMARK, (uint32_t) strlen(watermark), watermark); + } + tamperkeys[0] = amazonkeys[0]; + tags_count++; + // If any of the Amazon default tags is present in file, secure it too. + // You can also add any of them with mobimeta before running mobidrm. + for (size_t i = 1; i < ARRAYSIZE(amazonkeys); i++) { + // if exth record exists in mobi file + if (mobi_get_exthrecord_by_tag(m, amazonkeys[i]) != NULL) { + // add it tamperproof keys + tamperkeys[tags_count++] = amazonkeys[i]; + } + } + + tags = tamperkeys; + } + + for (size_t i = 0; i < serial_count; i++) { + mobi_ret = mobi_drm_addvoucher(m, serial[i], valid_from, valid_to, tags, tags_count); + if (mobi_ret != MOBI_SUCCESS) { + printf("Error adding encryption voucher (%s)\n", libmobi_msg(mobi_ret)); + return ERROR; + } + } + if (serial_count == 0) { + mobi_ret = mobi_drm_addvoucher(m, NULL, valid_from, valid_to, tags, tags_count); + if (mobi_ret != MOBI_SUCCESS) { + printf("Error adding encryption voucher (%s)\n", libmobi_msg(mobi_ret)); + return ERROR; + } + } + + mobi_ret = mobi_drm_encrypt(m); + if (mobi_ret != MOBI_SUCCESS) { + printf("Error encrypting document (%s)\n", libmobi_msg(mobi_ret)); + return ERROR; + } + + printf("Encrypting with encryption type %u\n", m->rh->encryption_type); + if (m->rh->encryption_type == MOBI_ENCRYPTION_V1 && serial_count) { + printf("Warning! Encryption with device serial number is not supported with this encryption scheme. Skipping serial...\n"); + } + if (valid_from != -1) { + printf("Drm validity period from %s", ctime(&valid_from)); + } + if (valid_to != -1) { + printf("Drm validity period to %s", ctime(&valid_to)); + } + return SUCCESS; +} + +/** + @brief Removes DRM + + @param[in,out] m MOBIData structure + @return SUCCESS or ERROR + */ +static int do_decrypt(MOBIData *m) { + MOBIExthHeader *exth = mobi_get_exthrecord_by_tag(m, EXTH_RENTAL); + if (exth) { + uint32_t is_rental = mobi_decode_exthvalue(exth->data, exth->size); + if (is_rental) { + printf("Can't remove DRM from rented documents\n"); + return ERROR; + } + } + uint16_t encryption_type = m->rh->encryption_type; + printf("Removing encryption type %u\n", encryption_type); + bool has_key = false; + if (pid_count) { + for (size_t i = 0; i < pid_count; i++) { + if (set_decryption_pid(m, pid[i]) == SUCCESS) { + has_key = true; + break; + } + } + } + if (!has_key && serial_count) { + for (size_t i = 0; i < serial_count; i++) { + if (set_decryption_serial(m, serial[i]) == SUCCESS) { + break; + } + } + } + MOBI_RET mobi_ret = mobi_drm_decrypt(m); + if (mobi_ret != MOBI_SUCCESS) { + printf("Error encrypting document (%s)\n", libmobi_msg(mobi_ret)); + return ERROR; + } + + if (encryption_type == MOBI_ENCRYPTION_V2) { + // remove EXTH records that impose restrictions or are DRM related + MOBIExthTag drmkeys[] = { EXTH_TAMPERKEYS, EXTH_WATERMARK, EXTH_TTSDISABLE, EXTH_CLIPPINGLIMIT, EXTH_READFORFREE, EXTH_RENTAL, EXTH_UNK407 }; + for (size_t i = 0; i < ARRAYSIZE(drmkeys); i++) { + mobi_ret = mobi_delete_exthrecord_by_tag(m, drmkeys[i]); + if (mobi_ret != MOBI_SUCCESS) { + printf("Error removing EXTH record %u\n", drmkeys[i]); + return ERROR; + } + } + } + return SUCCESS; +} + +/** + @brief Main routine that calls optional subroutines + + @param[in] fullpath Full file path + @return SUCCESS or ERROR + */ +static int loadfilename(const char *fullpath) { + + static int run_count = 0; + run_count++; + + bool use_kf8 = run_count == 1 ? false : true; + + /* Initialize main MOBIData structure */ + MOBIData *m = mobi_init(); + if (m == NULL) { + printf("Memory allocation failed\n"); + return ERROR; + } + + errno = 0; + FILE *file = fopen(fullpath, "rb"); + if (file == NULL) { + int errsv = errno; + printf("Error opening file: %s (%s)\n", fullpath, strerror(errsv)); + mobi_free(m); + return ERROR; + } + + /* MOBIData structure will be filled with loaded document data and metadata */ + MOBI_RET mobi_ret = mobi_load_file(m, file); + fclose(file); + + if (mobi_ret != MOBI_SUCCESS) { + printf("Error while loading document (%s)\n", libmobi_msg(mobi_ret)); + mobi_free(m); + return ERROR; + } + + if (run_count == 1) { + print_summary(m); + } + + // save is hybrid result here, as file may be modified later + bool is_hybrid = mobi_is_hybrid(m); + + int ret = SUCCESS; + const char *suffix; + if (encrypt_opt) { + // encrypt + if (mobi_is_encrypted(m)) { + mobi_free(m); + printf("Document is already encrypted\n"); + return ERROR; + } + ret = do_encrypt(m, use_kf8); + if (ret != SUCCESS) { + mobi_free(m); + return ERROR; + } + suffix = "encrypted"; + } else { + // decrypt + if (!mobi_is_encrypted(m)) { + mobi_free(m); + printf("Document is not encrypted\n"); + return ERROR; + } + ret = do_decrypt(m); + if (ret != SUCCESS) { + mobi_free(m); + return ERROR; + } + suffix = "decrypted"; + } + + ret = save_mobi(m, fullpath, suffix); + if (ret != SUCCESS) { + mobi_free(m); + return ERROR; + } + + /* Free MOBIData structure */ + mobi_free(m); + + /* In case of encrypting hybrid file proceed with KF8 part */ + if (encrypt_opt && is_hybrid && use_kf8 == false) { + loadfilename(fullpath); + } + return SUCCESS; +} + +/** + @brief Parse ISO8601 date into tm structure + + @param[in,out] tm Structure to be filled + @param[in] date_str Input date string + @return SUCCESS or ERROR + */ +static int parse_date(struct tm *tm, const char *date_str) { + memset(tm, '\0', sizeof(*tm)); + int year; + int month; + int day; + if (sscanf(date_str, "%5d-%2d-%2d", &year, &month, &day) != 3) { + return ERROR; + } + if (year < 1000 || month < 1 || month > 12 || day < 1 || day > 31) { + return ERROR; + } + + tm->tm_year = year - 1900; + tm->tm_mon = month - 1; + tm->tm_mday = day; + tm->tm_isdst = -1; + + return SUCCESS; +} + +/** + @brief Main + + @param[in] argc Arguments count + @param[in] argv Arguments array + @return SUCCESS (0) or ERROR (1) + */ +int main(int argc, char *argv[]) { + if (argc < 2) { + print_usage(argv[0]); + return ERROR; + } + opterr = 0; + int c; + while ((c = getopt(argc, argv, "def:ho:p:s:t:vx:")) != -1) { + switch(c) { + case 'd': + if (encrypt_opt) { + printf("Options -d and -e can't be used together.\n"); + return ERROR; + } + decrypt_opt = true; + break; + case 'e': + if (decrypt_opt) { + printf("Options -d and -e can't be used together.\n"); + return ERROR; + } + encrypt_opt = true; + break; + case 'f': + if (strlen(optarg) == 2 && optarg[0] == '-') { + printf("Option -%c requires an argument.\n", c); + return ERROR; + } + struct tm from; + if (parse_date(&from, optarg) != SUCCESS) { + printf("Wrong valid from date format, use ISO 8601 yyyy-mm-dd\n"); + return ERROR; + } + valid_from = mktime(&from); + if (valid_from == -1) { + printf("Unparsable valid from date format, use ISO 8601 yyyy-mm-dd\n"); + return ERROR; + } + expiry_opt = true; + break; + case 'o': + if (strlen(optarg) == 2 && optarg[0] == '-') { + printf("Option -%c requires an argument.\n", c); + return ERROR; + } + size_t outdir_length = strlen(optarg); + if (outdir_length >= FILENAME_MAX - 1) { + printf("Output directory name too long\n"); + return ERROR; + } + strncpy(outdir, optarg, FILENAME_MAX - 1); + normalize_path(outdir); + if (!dir_exists(outdir)) { + printf("Output directory is not valid\n"); + return ERROR; + } + if (optarg[outdir_length - 1] != separator) { + // append separator + if (outdir_length >= FILENAME_MAX - 2) { + printf("Output directory name too long\n"); + return ERROR; + } + outdir[outdir_length++] = separator; + outdir[outdir_length] = '\0'; + } + outdir_opt = true; + break; + case 'p': + if (strlen(optarg) == 2 && optarg[0] == '-') { + printf("Option -%c requires an argument.\n", c); + return ERROR; + } + if (pid_count < VOUCHERS_COUNT_MAX) { + pid[pid_count++] = optarg; + } else { + printf("Maximum PIDs count reached, skipping PID...\n"); + } + break; + case 's': + if (strlen(optarg) == 2 && optarg[0] == '-') { + printf("Option -%c requires an argument.\n", c); + return ERROR; + } + if (serial_count < VOUCHERS_COUNT_MAX) { + serial[serial_count++] = optarg; + } else { + printf("Maximum serial numbers count reached, skipping serial...\n"); + } + break; + case 't': + if (strlen(optarg) == 2 && optarg[0] == '-') { + printf("Option -%c requires an argument.\n", c); + return ERROR; + } + struct tm to; + if (parse_date(&to, optarg) != SUCCESS) { + printf("Wrong valid to date format, use ISO 8601 yyyy-mm-dd\n"); + return ERROR; + } + to.tm_hour = 23; + to.tm_min = 59; + to.tm_sec = 59; + valid_to = mktime(&to); + if (valid_to == -1) { + printf("Unparsable valid to date format, use ISO 8601 yyyy-mm-dd\n"); + return ERROR; + } + expiry_opt = true; + break; + case 'v': + printf("mobidrm build: " __DATE__ " " __TIME__ " (" COMPILER ")\n"); + printf("libmobi: %s\n", mobi_version()); + return SUCCESS; + case '?': + if (isprint(optopt)) { + fprintf(stderr, "Unknown option `-%c'\n", optopt); + } + else { + fprintf(stderr, "Unknown option character `\\x%x'\n", optopt); + } + print_usage(argv[0]); + return ERROR; + case 'h': + default: + print_usage(argv[0]); + return SUCCESS; + } + } + + if (argc <= optind) { + printf("Missing filename\n"); + print_usage(argv[0]); + return ERROR; + } + + if (!decrypt_opt && !encrypt_opt) { + printf("One of -d (decrypt) and -e (encrypt) options is required\n"); + print_usage(argv[0]); + return ERROR; + } + + if (!encrypt_opt && expiry_opt) { + printf("Expiration flags can only be used with -e (encrypt)\n"); + print_usage(argv[0]); + return ERROR; + } + + if (!decrypt_opt && pid_count) { + printf("PID can only be used with -d (decrypt)\n"); + print_usage(argv[0]); + return ERROR; + } + + int ret = 0; + char filename[FILENAME_MAX]; + strncpy(filename, argv[optind], FILENAME_MAX - 1); + filename[FILENAME_MAX - 1] = '\0'; + normalize_path(filename); + + ret = loadfilename(filename); + + return ret; +} diff --git a/app/src/main/cpp/libmobi/tools/mobimeta.1.in b/app/src/main/cpp/libmobi/tools/mobimeta.1.in new file mode 100644 index 0000000..dde1939 --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/mobimeta.1.in @@ -0,0 +1,92 @@ +.Dd February 16, 2022 +.Dt mobimeta 1 URM +.Os Unix +.Sh NAME +.Nm mobimeta +.Nd Utility for modifying metadata of MOBI format ebook files. +.Sh SYNOPSIS +.Nm +.Op Fl a Ar meta Ns = Ns Ar value Ns Oo , Ns Ar meta Ns = Ns Ar value Ns , Ns Ar ... Oc +.Op Fl d Ar meta Ns Oo , Ns Ar meta Ns , Ns Ar ... Oc +.Op Fl s Ar meta Ns = Ns Ar value Ns Oo , Ns Ar meta Ns = Ns Ar value Ns , Ns Ar ... Oc +.if !'@ENCRYPTION_OPT@'yes' .ig +.Op Fl p Ar pid +.Op Fl P Ar serial +.. +.Op Fl hv +.Ar filein +.Op Ar fileout +.Sh DESCRIPTION +The program handles .prc, .mobi, .azw, .azw3, .azw4, some .pdb documents. It is powered by +.Nm libmobi +library. +.Pp +Invoked without arguments prints document metadata and exits. If +.Ar fileout +is specified, modified document will be saved with this name, otherwise original input +.Ar filein +will be modified. +.Pp +A list of flags and their descriptions: +.Bl -tag -width -indent +.It Fl a Ar meta Ns = Ns Ar value Ns Oo , Ns Ar meta Ns = Ns Ar value Ns , Ns Ar ... Oc +add (append) metadata +.It Fl d Ar meta Ns Oo , Ns Ar meta Ns , Ns Ar ... Oc +delete metadata +.It Fl s Ar meta Ns = Ns Ar value Ns Oo , Ns Ar meta Ns = Ns Ar value Ns , Ns Ar ... Oc +set (replace) metadata +.It Ar meta +for a list of valid named meta keys try +.Nm Bro Fl a | Fl d | Fl s Brc Ar \&? . +If meta is an integer it will be treated as a numeric EXTH record key (expert usage). +.It Ar value +new value that will be set for a given meta key +.if !'@ENCRYPTION_OPT@'yes' .ig +.It Fl p Ar pid +set pid for decryption +.It Fl P Ar serial +set device serial number for decryption +.. +.It Fl h +show usage summary and exit +.It Fl v +show version and exit +.El +.Pp +.Sh EXAMPLES +The following command will set new title, new author and will delete all publisher metadata (if any). +.Pp +.Dl % mobimeta -s title="My title",author="My name" -d publisher example.mobi +.Pp +The following command appends EXTH record identified by its numeric key 204 with numeric value 201. +.Pp +.Dl % mobimeta -a 204=201 example.mobi +.Pp +The following command will list valid meta named keys. +.Pp +.Dl % mobimeta -a \&?\& +.Pp +Or in case your shell expands quotation mark: +.Pp +.Dl % mobimeta -a \&"?"\& +.Sh RETURN VALUES +The +.Nm +utility returns 0 on success, 1 on error. +.Sh COPYRIGHT +Copyright (C) 2014-2022 Bartek Fabiszewski. +.Pp +Released under LGPL version 3 or any later (same as +.Nm libmobi Ns +). +.Sh WEB SITE +Visit http://www.fabiszewski.net for details. +.Sh DIAGNOSTICS +For diagnostics +.Nm libmobi +must be configured with +.Fl Fl enable-debug +option. +.Sh SEE ALSO +.Xr mobitool 1 +.Xr mobidrm 1 diff --git a/app/src/main/cpp/libmobi/tools/mobimeta.c b/app/src/main/cpp/libmobi/tools/mobimeta.c new file mode 100644 index 0000000..750bc65 --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/mobimeta.c @@ -0,0 +1,398 @@ +/** @file mobimeta.c + * + * @brief mobimeta + * + * @example mobimeta.c + * Program for testing libmobi library + * + * Copyright (c) 2020 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "common.h" + +/* encryption */ +#ifdef USE_ENCRYPTION +# define PRINT_ENC_USG " [-p pid] [-P serial]" +# define PRINT_ENC_ARG "p:P:" +#else +# define PRINT_ENC_USG "" +# define PRINT_ENC_ARG "" +#endif + +/* command line options */ +#ifdef USE_ENCRYPTION +bool setpid_opt = false; +bool setserial_opt = false; +#endif + +/* options values */ +#ifdef USE_ENCRYPTION +char *pid = NULL; +char *serial = NULL; +#endif + +#define META_SIZE ARRAYSIZE(meta_functions) +#define ACTIONS_SIZE ARRAYSIZE(actions) + +#if HAVE_ATTRIBUTE_NORETURN +static void exit_with_usage(const char *progname) __attribute__((noreturn)); +#else +static void exit_with_usage(const char *progname); +#endif + +/** + @brief Meta handling functions + */ +typedef MOBI_RET (*MetaFunAdd)(MOBIData *m, const char *string); +typedef MOBI_RET (*MetaFunDel)(MOBIData *m); + +/** + @brief Meta functions structure + */ +typedef struct { + const char *name; + MetaFunAdd function_add; + MetaFunAdd function_set; + MetaFunDel function_del; +} CB; + +const CB meta_functions[] = { + { "author", mobi_meta_add_author, mobi_meta_set_author, mobi_meta_delete_author }, + { "title", mobi_meta_add_title, mobi_meta_set_title, mobi_meta_delete_title }, + { "publisher", mobi_meta_add_publisher, mobi_meta_set_publisher, mobi_meta_delete_publisher }, + { "imprint", mobi_meta_add_imprint, mobi_meta_set_imprint, mobi_meta_delete_imprint }, + { "description", mobi_meta_add_description, mobi_meta_set_description, mobi_meta_delete_description }, + { "isbn", mobi_meta_add_isbn, mobi_meta_set_isbn, mobi_meta_delete_isbn }, + { "subject", mobi_meta_add_subject, mobi_meta_set_subject, mobi_meta_delete_subject }, + { "publishdate", mobi_meta_add_publishdate, mobi_meta_set_publishdate, mobi_meta_delete_publishdate }, + { "review", mobi_meta_add_review, mobi_meta_set_review, mobi_meta_delete_review }, + { "contributor", mobi_meta_add_contributor, mobi_meta_set_contributor, mobi_meta_delete_contributor }, + { "copyright", mobi_meta_add_copyright, mobi_meta_set_copyright, mobi_meta_delete_copyright }, + { "asin", mobi_meta_add_asin, mobi_meta_set_asin, mobi_meta_delete_asin }, + { "language", mobi_meta_add_language, mobi_meta_set_language, mobi_meta_delete_language }, +}; + +/** + @brief Print usage info + @param[in] progname Executed program name + */ +static void exit_with_usage(const char *progname) { + char *p = strrchr(progname, separator); + if (p) { progname = ++p; } + printf("usage: %s [-a | -s meta=value[,meta=value,...]] [-d meta[,meta,...]]" PRINT_ENC_USG " [-hv] filein [fileout]\n", progname); + printf(" without arguments prints document metadata and exits\n"); + printf(" -a ? list valid meta named keys\n"); + printf(" -a meta=value add metadata\n"); + printf(" -d meta delete metadata\n"); + printf(" -s meta=value set metadata\n"); +#ifdef USE_ENCRYPTION + printf(" -p pid set pid for decryption\n"); + printf(" -P serial set device serial for decryption\n"); +#endif + printf(" -h show this usage summary and exit\n"); + printf(" -v show version and exit\n"); + exit(ERROR); +} + +/** + @brief Check whether string is integer + @param[in] string String + @return True if string represents integer + */ +static bool isinteger(const char *string) { + if (*string == '\0') { return false; } + while (*string) { + if (!isdigit(*string++)) { return false; } + } + return true; +} + +/** + @brief Parse suboption's list key=value[,key=value,...] + and get first key-value pair. + @param[in,out] subopts List of suboptions + @param[in,out] token Will be filled with first found key name or NULL if missing + @param[in,out] value Will be filled with first found key value or NULL if missing + @return True if there are more pairs to parse + */ +static bool parsesubopt(char **subopts, char **token, char **value) { + if (!**subopts) { return false; } + *token = NULL; + *value = NULL; + char *p = NULL; + while ((p = (*subopts)++) && *p) { + if (*p == ',') { + *p = '\0'; + return true; + } + if (!*token) { *token = p; } + if (*p == '=') { + *p = '\0'; + *value = ++p; + } + } + return false; +} + +/** + @brief Get matching token from meta functions array + @param[in] token Meta token name + @return Index in array,-1 if not found + */ +static int get_meta(const char *token) { + for (int i = 0; i < (int) META_SIZE; i++) { + if (strcmp(token, meta_functions[i].name) == 0) { + return i; + } + } + return -1; +} + +/** + @brief Main + + @param[in] argc Arguments count + @param[in] argv Arguments array + @return SUCCESS (0) or ERROR (1) + */ +int main(int argc, char *argv[]) { + if (argc < 2) { + exit_with_usage(argv[0]); + } + + typedef struct { + int command; + int meta; + char *value; + } Action; + Action actions[100]; + + size_t cmd_count = 0; + + char *token = NULL; + char *value = NULL; + char *subopts; + int opt; + int subopt; + bool parse; + while ((opt = getopt(argc, argv, "a:d:hs:" PRINT_ENC_ARG "v")) != -1) { + switch (opt) { + case 'a': + case 'd': + case 's': + if (strlen(optarg) == 2 && optarg[0] == '-') { + printf("Option -%c requires an argument.\n", opt); + return ERROR; + } + subopts = optarg; + parse = true; + while (parse) { + parse = parsesubopt(&subopts, &token, &value); + if (token && (subopt = get_meta(token)) >= 0) { + if ((value == NULL || strlen(value) == 0) && opt != 'd') { + printf("Missing value for suboption '%s'\n\n", meta_functions[subopt].name); + exit_with_usage(argv[0]); + } + if (cmd_count < (ACTIONS_SIZE)) { + actions[cmd_count++] = (Action) { opt, subopt, value }; + } + } else if (token && isinteger(token)) { + if ((value == NULL || strlen(value) == 0) && opt != 'd') { + printf("Missing value for suboption '%s'\n\n", token); + exit_with_usage(argv[0]); + } + if (cmd_count < (ACTIONS_SIZE)) { + /* mark numeric meta with upper opt */ + actions[cmd_count++] = (Action) { toupper(opt), atoi(token), value }; + } + } else { + if (token == NULL || token[0] != '?') { + printf("Unknown meta: %s\n", token ? token : optarg); + } + printf("Valid named meta keys:\n"); + for (size_t i = 0; i < META_SIZE; i++) { + printf(" %s\n", meta_functions[i].name); + } + printf("\n"); + if (token == NULL || token[0] != '?') { + exit_with_usage(argv[0]); + } + return SUCCESS; + } + } + break; +#ifdef USE_ENCRYPTION + case 'p': + if (strlen(optarg) == 2 && optarg[0] == '-') { + printf("Option -%c requires an argument.\n", opt); + return ERROR; + } + setpid_opt = true; + pid = optarg; + break; + case 'P': + if (strlen(optarg) == 2 && optarg[0] == '-') { + printf("Option -%c requires an argument.\n", opt); + return ERROR; + } + setserial_opt = true; + serial = optarg; + break; +#endif + case 'v': + printf("mobimeta build: " __DATE__ " " __TIME__ " (" COMPILER ")\n"); + printf("libmobi: %s\n", mobi_version()); + return 0; + case '?': + if (isprint(optopt)) { + printf("Unknown option `-%c'\n", optopt); + } + else { + printf("Unknown option character `\\x%x'\n", optopt); + } + exit_with_usage(argv[0]); + case 'h': + default: + exit_with_usage(argv[0]); + } + } + + int file_args = argc - optind; + if (file_args <= 0) { + printf("Missing filename\n"); + exit_with_usage(argv[0]); + } + char infile[FILENAME_MAX]; + strncpy(infile, argv[optind], FILENAME_MAX - 1); + infile[FILENAME_MAX - 1] = '\0'; + normalize_path(infile); + + if (file_args >= 2) { optind++; } + + char outfile[FILENAME_MAX]; + strncpy(outfile, argv[optind], FILENAME_MAX - 1); + outfile[FILENAME_MAX - 1] = '\0'; + normalize_path(outfile); + + /* Initialize MOBIData structure */ + MOBIData *m = mobi_init(); + if (m == NULL) { + printf("Libmobi initialization failed\n"); + return ERROR; + } + + /* read */ + FILE *file_in = fopen(infile, "rb"); + if (file_in == NULL) { + mobi_free(m); + int errsv = errno; + printf("Error opening file: %s (%s)\n", infile, strerror(errsv)); + return ERROR; + } + MOBI_RET mobi_ret = mobi_load_file(m, file_in); + fclose(file_in); + if (mobi_ret != MOBI_SUCCESS) { + mobi_free(m); + printf("Error loading file (%s)\n", libmobi_msg(mobi_ret)); + return ERROR; + } + +#ifdef USE_ENCRYPTION + if (setpid_opt || setserial_opt) { + int ret = set_decryption_key(m, serial, pid); + if (ret != SUCCESS) { + mobi_free(m); + return ret; + } + } +#endif + + if (cmd_count == 0) { + print_summary(m); + print_exth(m); + mobi_free(m); + return SUCCESS; + } + + for (size_t i = 0; i < cmd_count; i++) { + Action action = actions[i]; + MOBIExthMeta tag; + mobi_ret = MOBI_SUCCESS; + switch (action.command) { + /* named meta */ + case 'a': + mobi_ret = meta_functions[action.meta].function_add(m, action.value); + break; + case 'd': + mobi_ret = meta_functions[action.meta].function_del(m); + break; + case 's': + mobi_ret = meta_functions[action.meta].function_set(m, action.value); + break; + /* numeric exth */ + case 'A': + tag = mobi_get_exthtagmeta_by_tag((MOBIExthTag) action.meta); + if (tag.name && tag.type == EXTH_NUMERIC && isinteger(action.value)) { + uint32_t numeric = (uint32_t) atoi(action.value); + mobi_ret = mobi_add_exthrecord(m, (MOBIExthTag) action.meta, sizeof(uint32_t), &numeric); + } else { + mobi_ret = mobi_add_exthrecord(m, (MOBIExthTag) action.meta, (uint32_t) strlen(action.value), action.value); + } + break; + case 'D': + mobi_ret = mobi_delete_exthrecord_by_tag(m, (MOBIExthTag) action.meta); + break; + case 'S': + mobi_ret = mobi_delete_exthrecord_by_tag(m, (MOBIExthTag) action.meta); + if (mobi_ret != MOBI_SUCCESS) { break; } + tag = mobi_get_exthtagmeta_by_tag((MOBIExthTag) action.meta); + if (tag.name && tag.type == EXTH_NUMERIC && isinteger(action.value)) { + uint32_t numeric = (uint32_t) atoi(action.value); + mobi_ret = mobi_add_exthrecord(m, (MOBIExthTag) action.meta, sizeof(uint32_t), &numeric); + } else { + mobi_ret = mobi_add_exthrecord(m, (MOBIExthTag) action.meta, (uint32_t) strlen(action.value), action.value); + } + break; + } + if (mobi_ret != MOBI_SUCCESS) { + printf("Metadata modification failed (%s)\n", libmobi_msg(mobi_ret)); + mobi_free(m); + return ERROR; + } + + } + + /* write */ + printf("Saving %s...\n", outfile); + FILE *file_out = fopen(outfile, "wb"); + if (file_out == NULL) { + mobi_free(m); + int errsv = errno; + printf("Error opening file: %s (%s)\n", outfile, strerror(errsv)); + return ERROR; + } + mobi_ret = mobi_write_file(file_out, m); + fclose(file_out); + if (mobi_ret != MOBI_SUCCESS) { + mobi_free(m); + printf("Error writing file (%s)\n", libmobi_msg(mobi_ret)); + return ERROR; + } + + /* Free MOBIData structure */ + mobi_free(m); + + return SUCCESS; +} diff --git a/app/src/main/cpp/libmobi/tools/mobitool.1.in b/app/src/main/cpp/libmobi/tools/mobitool.1.in new file mode 100644 index 0000000..0df918e --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/mobitool.1.in @@ -0,0 +1,98 @@ +.Dd February 16, 2022 +.Dt mobitool 1 URM +.Os Unix +.Sh NAME +.Nm mobitool +.Nd Utility for handling MOBI format ebook files. +.Sh SYNOPSIS +.Nm +.if '@XMLWRITER_OPT@'yes' .ig +.Op Fl cdhimrstuvx7 +.. +.if !'@XMLWRITER_OPT@'yes' .ig +.Op Fl cdehimrstuvx7 +.. +.Op Fl o Ar dir +.if !'@ENCRYPTION_OPT@'yes' .ig +.Op Fl p Ar pid +.Op Fl P Ar serial +.. +.Ar file +.Sh DESCRIPTION +The program handles .prc, .mobi, .azw, .azw3, .azw4, some .pdb documents. It is powered by +.Nm libmobi +library. +.Pp +Invoked without arguments prints document metadata and exits. +.Pp +A list of flags and their descriptions: +.Bl -tag -width -indent +.It Fl c +dump cover +.It Fl d +dump rawml text record +.if !'@XMLWRITER_OPT@'yes' .ig +.It Fl e +convert mobi to epub +.. +.It Fl h +show usage summary and exit +.It Fl i +print detailed metadata +.It Fl m +print records metadata +.It Fl o Ar dir +save output to dir folder +.if !'@ENCRYPTION_OPT@'yes' .ig +.It Fl p Ar pid +set pid for decryption +.It Fl P Ar serial +set device serial number for decryption +.. +.It Fl r +dump raw records +.It Fl s +dump recreated source files +.It Fl t +split hybrid file into two parts: mobi and azw3 +.It Fl u +show rusage (diagnostics) +.It Fl v +show version and exit +.It Fl x +extract conversion source and log (if present) +.It Fl 7 +parse KF7 part of hybrid file (by default KF8 part is parsed) +.El +.Pp +.Sh EXAMPLES +The following command decompiles given mobi document. The output folder will be created in /tmp. +.Pp +.Dl % mobitool -s -o /tmp example.mobi +.Pp +.if !'@XMLWRITER_OPT@'yes' .ig +The following command converts mobi document to epub format. +.Pp +.Dl % mobitool -e example.mobi +.. +.Sh RETURN VALUES +The +.Nm mobitool +utility returns 0 on success, 1 on error. +.Sh COPYRIGHT +Copyright (C) 2014-2022 Bartek Fabiszewski. +.Pp +Released under LGPL version 3 or any later (same as +.Nm libmobi Ns +). +.Sh WEB SITE +Visit http://www.fabiszewski.net for details. +.Sh DIAGNOSTICS +For diagnostics +.Nm libmobi +must be configured with +.Fl Fl enable-debug +option. +.Sh SEE ALSO +.Xr mobimeta 1 +.Xr mobidrm 1 diff --git a/app/src/main/cpp/libmobi/tools/mobitool.c b/app/src/main/cpp/libmobi/tools/mobitool.c new file mode 100644 index 0000000..f942dea --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/mobitool.c @@ -0,0 +1,1071 @@ +/** @file mobitool.c + * + * @brief mobitool + * + * @example mobitool.c + * Program for testing libmobi library + * + * Copyright (c) 2020 Bartek Fabiszewski + * http://www.fabiszewski.net + * + * Licensed under LGPL, either version 3, or any later. + * See + */ + +#include +#include +#include +#include +#include +#include +/* include libmobi header */ +#include +#include "common.h" + +/* miniz file is needed for EPUB creation */ +#ifdef USE_XMLWRITER +# define MINIZ_HEADER_FILE_ONLY +# define MINIZ_NO_ZLIB_COMPATIBLE_NAMES +# include "../src/miniz.c" +#endif + +#ifdef HAVE_SYS_RESOURCE_H +/* rusage */ +# include +# define PRINT_RUSAGE_ARG "u" +#else +# define PRINT_RUSAGE_ARG "" +#endif +/* encryption */ +#ifdef USE_ENCRYPTION +# define PRINT_ENC_USG " [-p pid] [-P serial]" +# define PRINT_ENC_ARG "p:P:" +#else +# define PRINT_ENC_USG "" +# define PRINT_ENC_ARG "" +#endif +/* xmlwriter */ +#ifdef USE_XMLWRITER +# define PRINT_EPUB_ARG "e" +#else +# define PRINT_EPUB_ARG "" +#endif + +#if HAVE_ATTRIBUTE_NORETURN +static void exit_with_usage(const char *progname) __attribute__((noreturn)); +#else +static void exit_with_usage(const char *progname); +#endif + +#define EPUB_CONTAINER "\n\ +\n\ + \n\ + \n\ + \n\ +" +#define EPUB_MIMETYPE "application/epub+zip" + +/* command line options */ +bool dump_cover_opt = false; +bool dump_rawml_opt = false; +bool create_epub_opt = false; +bool print_extended_meta_opt = false; +bool print_rec_meta_opt = false; +bool dump_rec_opt = false; +bool parse_kf7_opt = false; +bool dump_parts_opt = false; +bool print_rusage_opt = false; +bool extract_source_opt = false; +bool split_opt = false; +#ifdef USE_ENCRYPTION +bool setpid_opt = false; +bool setserial_opt = false; +#endif + +/* options values */ +#ifdef USE_ENCRYPTION +char *pid = NULL; +char *serial = NULL; +#endif + +/** + @brief Print all loaded headers meta information + @param[in] m MOBIData structure + */ +static void print_meta(const MOBIData *m) { + /* Full name stored at offset given in MOBI header */ + if (m->mh && m->mh->full_name) { + char full_name[FULLNAME_MAX + 1]; + if (mobi_get_fullname(m, full_name, FULLNAME_MAX) == MOBI_SUCCESS) { + printf("\nFull name: %s\n", full_name); + } + } + /* Palm database header */ + if (m->ph) { + printf("\nPalm doc header:\n"); + printf("name: %s\n", m->ph->name); + printf("attributes: %hu\n", m->ph->attributes); + printf("version: %hu\n", m->ph->version); + struct tm * timeinfo = mobi_pdbtime_to_time(m->ph->ctime); + printf("ctime: %s", asctime(timeinfo)); + timeinfo = mobi_pdbtime_to_time(m->ph->mtime); + printf("mtime: %s", asctime(timeinfo)); + timeinfo = mobi_pdbtime_to_time(m->ph->btime); + printf("btime: %s", asctime(timeinfo)); + printf("mod_num: %u\n", m->ph->mod_num); + printf("appinfo_offset: %u\n", m->ph->appinfo_offset); + printf("sortinfo_offset: %u\n", m->ph->sortinfo_offset); + printf("type: %s\n", m->ph->type); + printf("creator: %s\n", m->ph->creator); + printf("uid: %u\n", m->ph->uid); + printf("next_rec: %u\n", m->ph->next_rec); + printf("rec_count: %u\n", m->ph->rec_count); + } + /* Record 0 header */ + if (m->rh) { + printf("\nRecord 0 header:\n"); + printf("compression type: %u\n", m->rh->compression_type); + printf("text length: %u\n", m->rh->text_length); + printf("text record count: %u\n", m->rh->text_record_count); + printf("text record size: %u\n", m->rh->text_record_size); + printf("encryption type: %u\n", m->rh->encryption_type); + printf("unknown: %u\n", m->rh->unknown1); + } + /* Mobi header */ + if (m->mh) { + printf("\nMOBI header:\n"); + printf("identifier: %s\n", m->mh->mobi_magic); + if (m->mh->header_length) { printf("header length: %u\n", *m->mh->header_length); } + if (m->mh->mobi_type) { printf("mobi type: %u\n", *m->mh->mobi_type); } + if (m->mh->text_encoding) { printf("text encoding: %u\n", *m->mh->text_encoding); } + if (m->mh->uid) { printf("unique id: %u\n", *m->mh->uid); } + if (m->mh->version) { printf("file version: %u\n", *m->mh->version); } + if (m->mh->orth_index) { printf("orth index: %u\n", *m->mh->orth_index); } + if (m->mh->infl_index) { printf("infl index: %u\n", *m->mh->infl_index); } + if (m->mh->names_index) { printf("names index: %u\n", *m->mh->names_index); } + if (m->mh->keys_index) { printf("keys index: %u\n", *m->mh->keys_index); } + if (m->mh->extra0_index) { printf("extra0 index: %u\n", *m->mh->extra0_index); } + if (m->mh->extra1_index) { printf("extra1 index: %u\n", *m->mh->extra1_index); } + if (m->mh->extra2_index) { printf("extra2 index: %u\n", *m->mh->extra2_index); } + if (m->mh->extra3_index) { printf("extra3 index: %u\n", *m->mh->extra3_index); } + if (m->mh->extra4_index) { printf("extra4 index: %u\n", *m->mh->extra4_index); } + if (m->mh->extra5_index) { printf("extra5 index: %u\n", *m->mh->extra5_index); } + if (m->mh->non_text_index) { printf("non text index: %u\n", *m->mh->non_text_index); } + if (m->mh->full_name_offset) { printf("full name offset: %u\n", *m->mh->full_name_offset); } + if (m->mh->full_name_length) { printf("full name length: %u\n", *m->mh->full_name_length); } + if (m->mh->locale) { + const char *locale_string = mobi_get_locale_string(*m->mh->locale); + if (locale_string) { + printf("locale: %s (%u)\n", locale_string, *m->mh->locale); + } else { + printf("locale: unknown (%u)\n", *m->mh->locale); + } + } + if (m->mh->dict_input_lang) { + const char *locale_string = mobi_get_locale_string(*m->mh->dict_input_lang); + if (locale_string) { + printf("dict input lang: %s (%u)\n", locale_string, *m->mh->dict_input_lang); + } else { + printf("dict input lang: unknown (%u)\n", *m->mh->dict_input_lang); + } + } + if (m->mh->dict_output_lang) { + const char *locale_string = mobi_get_locale_string(*m->mh->dict_output_lang); + if (locale_string) { + printf("dict output lang: %s (%u)\n", locale_string, *m->mh->dict_output_lang); + } else { + printf("dict output lang: unknown (%u)\n", *m->mh->dict_output_lang); + } + } + if (m->mh->min_version) { printf("minimal version: %u\n", *m->mh->min_version); } + if (m->mh->image_index) { printf("first image index: %u\n", *m->mh->image_index); } + if (m->mh->huff_rec_index) { printf("huffman record offset: %u\n", *m->mh->huff_rec_index); } + if (m->mh->huff_rec_count) { printf("huffman records count: %u\n", *m->mh->huff_rec_count); } + if (m->mh->datp_rec_index) { printf("DATP record offset: %u\n", *m->mh->datp_rec_index); } + if (m->mh->datp_rec_count) { printf("DATP records count: %u\n", *m->mh->datp_rec_count); } + if (m->mh->exth_flags) { printf("EXTH flags: %u\n", *m->mh->exth_flags); } + if (m->mh->unknown6) { printf("unknown: %u\n", *m->mh->unknown6); } + if (m->mh->drm_offset) { printf("drm offset: %u\n", *m->mh->drm_offset); } + if (m->mh->drm_count) { printf("drm count: %u\n", *m->mh->drm_count); } + if (m->mh->drm_size) { printf("drm size: %u\n", *m->mh->drm_size); } + if (m->mh->drm_flags) { printf("drm flags: %u\n", *m->mh->drm_flags); } + if (m->mh->first_text_index) { printf("first text index: %u\n", *m->mh->first_text_index); } + if (m->mh->last_text_index) { printf("last text index: %u\n", *m->mh->last_text_index); } + if (m->mh->fdst_index) { printf("FDST offset: %u\n", *m->mh->fdst_index); } + if (m->mh->fdst_section_count) { printf("FDST count: %u\n", *m->mh->fdst_section_count); } + if (m->mh->fcis_index) { printf("FCIS index: %u\n", *m->mh->fcis_index); } + if (m->mh->fcis_count) { printf("FCIS count: %u\n", *m->mh->fcis_count); } + if (m->mh->flis_index) { printf("FLIS index: %u\n", *m->mh->flis_index); } + if (m->mh->flis_count) { printf("FLIS count: %u\n", *m->mh->flis_count); } + if (m->mh->unknown10) { printf("unknown: %u\n", *m->mh->unknown10); } + if (m->mh->unknown11) { printf("unknown: %u\n", *m->mh->unknown11); } + if (m->mh->srcs_index) { printf("SRCS index: %u\n", *m->mh->srcs_index); } + if (m->mh->srcs_count) { printf("SRCS count: %u\n", *m->mh->srcs_count); } + if (m->mh->unknown12) { printf("unknown: %u\n", *m->mh->unknown12); } + if (m->mh->unknown13) { printf("unknown: %u\n", *m->mh->unknown13); } + if (m->mh->extra_flags) { printf("extra record flags: %u\n", *m->mh->extra_flags); } + if (m->mh->ncx_index) { printf("NCX offset: %u\n", *m->mh->ncx_index); } + if (m->mh->unknown14) { printf("unknown: %u\n", *m->mh->unknown14); } + if (m->mh->unknown15) { printf("unknown: %u\n", *m->mh->unknown15); } + if (m->mh->fragment_index) { printf("fragment index: %u\n", *m->mh->fragment_index); } + if (m->mh->skeleton_index) { printf("skeleton index: %u\n", *m->mh->skeleton_index); } + if (m->mh->datp_index) { printf("DATP index: %u\n", *m->mh->datp_index); } + if (m->mh->unknown16) { printf("unknown: %u\n", *m->mh->unknown16); } + if (m->mh->guide_index) { printf("guide index: %u\n", *m->mh->guide_index); } + if (m->mh->unknown17) { printf("unknown: %u\n", *m->mh->unknown17); } + if (m->mh->unknown18) { printf("unknown: %u\n", *m->mh->unknown18); } + if (m->mh->unknown19) { printf("unknown: %u\n", *m->mh->unknown19); } + if (m->mh->unknown20) { printf("unknown: %u\n", *m->mh->unknown20); } + } +} + +/** + @brief Print meta data of each document record + @param[in] m MOBIData structure + */ +static void print_records_meta(const MOBIData *m) { + /* Linked list of MOBIPdbRecord structures holds records data and metadata */ + const MOBIPdbRecord *currec = m->rec; + while (currec != NULL) { + printf("offset: %u\n", currec->offset); + printf("size: %zu\n", currec->size); + printf("attributes: %hhu\n", currec->attributes); + printf("uid: %u\n", currec->uid); + printf("\n"); + currec = currec->next; + } +} + +/** + @brief Create new path. Name is derived from input file path. + [dirname]/[basename][suffix] + @param[out] newpath Created path + @param[in] buf_len Created path buffer size + @param[in] fullpath Input file path + @param[in] suffix Path name suffix + @return SUCCESS or ERROR + */ +static int create_path(char *newpath, const size_t buf_len, const char *fullpath, const char *suffix) { + char dirname[FILENAME_MAX]; + char basename[FILENAME_MAX]; + split_fullpath(fullpath, dirname, basename, FILENAME_MAX); + int n; + if (outdir_opt) { + n = snprintf(newpath, buf_len, "%s%s%s", outdir, basename, suffix); + } else { + n = snprintf(newpath, buf_len, "%s%s%s", dirname, basename, suffix); + } + if (n < 0) { + printf("Creating file name failed\n"); + return ERROR; + } + if ((size_t) n >= buf_len) { + printf("File name too long\n"); + return ERROR; + } + return SUCCESS; +} + +/** + @brief Create directory. Path is derived from input file path. + [dirname]/[basename][suffix] + @param[out] newdir Created directory path + @param[in] buf_len Created directory buffer size + @param[in] fullpath Input file path + @param[in] suffix Directory name suffix + @return SUCCESS or ERROR + */ +static int create_dir(char *newdir, const size_t buf_len, const char *fullpath, const char *suffix) { + if (create_path(newdir, buf_len, fullpath, suffix) == ERROR) { + return ERROR; + } + return make_directory(newdir); +} + +/** + @brief Dump each document record to a file into created folder + @param[in] m MOBIData structure + @param[in] fullpath File path will be parsed to build basenames of dumped records + @return SUCCESS or ERROR + */ +static int dump_records(const MOBIData *m, const char *fullpath) { + char newdir[FILENAME_MAX]; + if (create_dir(newdir, sizeof(newdir), fullpath, "_records") == ERROR) { + return ERROR; + } + printf("Saving records to %s\n", newdir); + /* Linked list of MOBIPdbRecord structures holds records data and metadata */ + const MOBIPdbRecord *currec = m->rec; + int i = 0; + while (currec != NULL) { + char name[FILENAME_MAX]; + snprintf(name, sizeof(name), "record_%i_uid_%i", i++, currec->uid); + if (write_to_dir(newdir, name, currec->data, currec->size) == ERROR) { + return ERROR; + } + + currec = currec->next; + } + return SUCCESS; +} + +/** + @brief Dump all text records, decompressed and concatenated, to a single rawml file + @param[in] m MOBIData structure + @param[in] fullpath File path will be parsed to create a new name for saved file + @return SUCCESS or ERROR + */ +static int dump_rawml(const MOBIData *m, const char *fullpath) { + char newpath[FILENAME_MAX]; + if (create_path(newpath, sizeof(newpath), fullpath, ".rawml") == ERROR) { + return ERROR; + } + printf("Saving rawml to %s\n", newpath); + errno = 0; + FILE *file = fopen(newpath, "wb"); + if (file == NULL) { + int errsv = errno; + printf("Could not open file for writing: %s (%s)\n", newpath, strerror(errsv)); + return ERROR; + } + const MOBI_RET mobi_ret = mobi_dump_rawml(m, file); + fclose(file); + if (mobi_ret != MOBI_SUCCESS) { + printf("Dumping rawml file failed (%s)\n", libmobi_msg(mobi_ret)); + return ERROR; + } + return SUCCESS; +} + +/** + @brief Dump cover record + @param[in] m MOBIData structure + @param[in] fullpath File path will be parsed to create a new name for saved file + @return SUCCESS or ERROR + */ +static int dump_cover(const MOBIData *m, const char *fullpath) { + + MOBIPdbRecord *record = NULL; + MOBIExthHeader *exth = mobi_get_exthrecord_by_tag(m, EXTH_COVEROFFSET); + if (exth) { + uint32_t offset = mobi_decode_exthvalue(exth->data, exth->size); + size_t first_resource = mobi_get_first_resource_record(m); + size_t uid = first_resource + offset; + record = mobi_get_record_by_seqnumber(m, uid); + } + if (record == NULL || record->size < 4) { + printf("Cover not found\n"); + return ERROR; + } + + const unsigned char jpg_magic[] = "\xff\xd8\xff"; + const unsigned char gif_magic[] = "\x47\x49\x46\x38"; + const unsigned char png_magic[] = "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a"; + const unsigned char bmp_magic[] = "\x42\x4d"; + + char ext[4] = "raw"; + if (memcmp(record->data, jpg_magic, 3) == 0) { + snprintf(ext, sizeof(ext), "%s", "jpg"); + } else if (memcmp(record->data, gif_magic, 4) == 0) { + snprintf(ext, sizeof(ext), "%s", "gif"); + } else if (record->size >= 8 && memcmp(record->data, png_magic, 8) == 0) { + snprintf(ext, sizeof(ext), "%s", "png"); + } else if (record->size >= 6 && memcmp(record->data, bmp_magic, 2) == 0) { + const size_t bmp_size = (uint32_t) record->data[2] | ((uint32_t) record->data[3] << 8) | + ((uint32_t) record->data[4] << 16) | ((uint32_t) record->data[5] << 24); + if (record->size == bmp_size) { + snprintf(ext, sizeof(ext), "%s", "bmp"); + } + } + + char suffix[12]; + snprintf(suffix, sizeof(suffix), "_cover.%s", ext); + + char cover_path[FILENAME_MAX]; + if (create_path(cover_path, sizeof(cover_path), fullpath, suffix) == ERROR) { + return ERROR; + } + + printf("Saving cover to %s\n", cover_path); + + return write_file(record->data, record->size, cover_path); +} + +/** + @brief Dump parsed markup files and resources into created folder + @param[in] rawml MOBIRawml structure holding parsed records + @param[in] fullpath File path will be parsed to build basenames of dumped records + @return SUCCESS or ERROR + */ +static int dump_rawml_parts(const MOBIRawml *rawml, const char *fullpath) { + if (rawml == NULL) { + printf("Rawml structure not initialized\n"); + return ERROR; + } + + char newdir[FILENAME_MAX]; + if (create_dir(newdir, sizeof(newdir), fullpath, "_markup") == ERROR) { + return ERROR; + } + printf("Saving markup to %s\n", newdir); + + if (create_epub_opt) { + /* create META_INF directory */ + char opfdir[FILENAME_MAX]; + if (create_subdir(opfdir, sizeof(opfdir), newdir, "META-INF") == ERROR) { + return ERROR; + } + + /* create container.xml */ + if (write_to_dir(opfdir, "container.xml", (const unsigned char *) EPUB_CONTAINER, sizeof(EPUB_CONTAINER) - 1) == ERROR) { + return ERROR; + } + + /* create mimetype file */ + if (write_to_dir(opfdir, "mimetype", (const unsigned char *) EPUB_MIMETYPE, sizeof(EPUB_MIMETYPE) - 1) == ERROR) { + return ERROR; + } + + /* create OEBPS directory */ + if (create_subdir(opfdir, sizeof(opfdir), newdir, "OEBPS") == ERROR) { + return ERROR; + } + + /* output everything else to OEBPS dir */ + strcpy(newdir, opfdir); + } + char partname[FILENAME_MAX]; + if (rawml->markup != NULL) { + /* Linked list of MOBIPart structures in rawml->markup holds main text files */ + MOBIPart *curr = rawml->markup; + while (curr != NULL) { + MOBIFileMeta file_meta = mobi_get_filemeta_by_type(curr->type); + snprintf(partname, sizeof(partname), "part%05zu.%s", curr->uid, file_meta.extension); + if (write_to_dir(newdir, partname, curr->data, curr->size) == ERROR) { + return ERROR; + } + printf("%s\n", partname); + curr = curr->next; + } + } + if (rawml->flow != NULL) { + /* Linked list of MOBIPart structures in rawml->flow holds supplementary text files */ + MOBIPart *curr = rawml->flow; + /* skip raw html file */ + curr = curr->next; + while (curr != NULL) { + MOBIFileMeta file_meta = mobi_get_filemeta_by_type(curr->type); + snprintf(partname, sizeof(partname), "flow%05zu.%s", curr->uid, file_meta.extension); + if (write_to_dir(newdir, partname, curr->data, curr->size) == ERROR) { + return ERROR; + } + printf("%s\n", partname); + curr = curr->next; + } + } + if (rawml->resources != NULL) { + /* Linked list of MOBIPart structures in rawml->resources holds binary files, also opf files */ + MOBIPart *curr = rawml->resources; + /* jpg, gif, png, bmp, font, audio, video also opf, ncx */ + while (curr != NULL) { + MOBIFileMeta file_meta = mobi_get_filemeta_by_type(curr->type); + if (curr->size > 0) { + int n; + if (create_epub_opt && file_meta.type == T_OPF) { + n = snprintf(partname, sizeof(partname), "%s%ccontent.opf", newdir, separator); + } else { + n = snprintf(partname, sizeof(partname), "%s%cresource%05zu.%s", newdir, separator, curr->uid, file_meta.extension); + } + if (n < 0) { + printf("Creating file name failed\n"); + return ERROR; + } + if ((size_t) n >= sizeof(partname)) { + printf("File name too long: %s\n", partname); + return ERROR; + } + + if (create_epub_opt && file_meta.type == T_OPF) { + printf("content.opf\n"); + } else { + printf("resource%05zu.%s\n", curr->uid, file_meta.extension); + } + + if (write_file(curr->data, curr->size, partname) == ERROR) { + return ERROR; + } + + } + curr = curr->next; + } + } + return SUCCESS; +} + +#ifdef USE_XMLWRITER +/** + @brief Bundle recreated source files into EPUB container + + This function is a simple aryan. + In real world implementation one should validate and correct all input + markup to check if it conforms to OPF and HTML specifications and + correct all the issues. + + @param[in] rawml MOBIRawml structure holding parsed records + @param[in] fullpath File path will be parsed to build basenames of dumped records + @return SUCCESS or ERROR + */ +static int create_epub(const MOBIRawml *rawml, const char *fullpath) { + if (rawml == NULL) { + printf("Rawml structure not initialized\n"); + return ERROR; + } + + char zipfile[FILENAME_MAX]; + if (create_path(zipfile, sizeof(zipfile), fullpath, ".epub") == ERROR) { + return ERROR; + } + printf("Saving EPUB to %s\n", zipfile); + + /* create zip (epub) archive */ + mz_zip_archive zip; + memset(&zip, 0, sizeof(mz_zip_archive)); + mz_bool mz_ret = mz_zip_writer_init_file(&zip, zipfile, 0); + if (!mz_ret) { + printf("Could not initialize zip archive\n"); + return ERROR; + } + /* start adding files to archive */ + mz_ret = mz_zip_writer_add_mem(&zip, "mimetype", EPUB_MIMETYPE, sizeof(EPUB_MIMETYPE) - 1, MZ_NO_COMPRESSION); + if (!mz_ret) { + printf("Could not add mimetype\n"); + mz_zip_writer_end(&zip); + return ERROR; + } + mz_ret = mz_zip_writer_add_mem(&zip, "META-INF/container.xml", EPUB_CONTAINER, sizeof(EPUB_CONTAINER) - 1, (mz_uint)MZ_DEFAULT_COMPRESSION); + if (!mz_ret) { + printf("Could not add container.xml\n"); + mz_zip_writer_end(&zip); + return ERROR; + } + char partname[FILENAME_MAX]; + if (rawml->markup != NULL) { + /* Linked list of MOBIPart structures in rawml->markup holds main text files */ + MOBIPart *curr = rawml->markup; + while (curr != NULL) { + MOBIFileMeta file_meta = mobi_get_filemeta_by_type(curr->type); + snprintf(partname, sizeof(partname), "OEBPS/part%05zu.%s", curr->uid, file_meta.extension); + mz_ret = mz_zip_writer_add_mem(&zip, partname, curr->data, curr->size, (mz_uint) MZ_DEFAULT_COMPRESSION); + if (!mz_ret) { + printf("Could not add file to archive: %s\n", partname); + mz_zip_writer_end(&zip); + return ERROR; + } + curr = curr->next; + } + } + if (rawml->flow != NULL) { + /* Linked list of MOBIPart structures in rawml->flow holds supplementary text files */ + MOBIPart *curr = rawml->flow; + /* skip raw html file */ + curr = curr->next; + while (curr != NULL) { + MOBIFileMeta file_meta = mobi_get_filemeta_by_type(curr->type); + snprintf(partname, sizeof(partname), "OEBPS/flow%05zu.%s", curr->uid, file_meta.extension); + mz_ret = mz_zip_writer_add_mem(&zip, partname, curr->data, curr->size, (mz_uint) MZ_DEFAULT_COMPRESSION); + if (!mz_ret) { + printf("Could not add file to archive: %s\n", partname); + mz_zip_writer_end(&zip); + return ERROR; + } + curr = curr->next; + } + } + if (rawml->resources != NULL) { + /* Linked list of MOBIPart structures in rawml->resources holds binary files, also opf files */ + MOBIPart *curr = rawml->resources; + /* jpg, gif, png, bmp, font, audio, video, also opf, ncx */ + while (curr != NULL) { + MOBIFileMeta file_meta = mobi_get_filemeta_by_type(curr->type); + if (curr->size > 0) { + if (file_meta.type == T_OPF) { + snprintf(partname, sizeof(partname), "OEBPS/content.opf"); + } else { + snprintf(partname, sizeof(partname), "OEBPS/resource%05zu.%s", curr->uid, file_meta.extension); + } + mz_ret = mz_zip_writer_add_mem(&zip, partname, curr->data, curr->size, (mz_uint) MZ_DEFAULT_COMPRESSION); + if (!mz_ret) { + printf("Could not add file to archive: %s\n", partname); + mz_zip_writer_end(&zip); + return ERROR; + } + } + curr = curr->next; + } + } + /* Finalize epub archive */ + mz_ret = mz_zip_writer_finalize_archive(&zip); + if (!mz_ret) { + printf("Could not finalize zip archive\n"); + mz_zip_writer_end(&zip); + return ERROR; + } + mz_ret = mz_zip_writer_end(&zip); + if (!mz_ret) { + printf("Could not finalize zip writer\n"); + return ERROR; + } + return SUCCESS; +} +#endif + +/** + @brief Dump SRCS record + @param[in] m MOBIData structure + @param[in] fullpath Full file path + @return SUCCESS or ERROR + */ +static int dump_embedded_source(const MOBIData *m, const char *fullpath) { + /* Try to get embedded source */ + unsigned char *data = NULL; + size_t size = 0; + MOBI_RET mobi_ret = mobi_get_embedded_source(&data, &size, m); + if (mobi_ret != MOBI_SUCCESS) { + printf("Extracting source from mobi failed (%s)\n", libmobi_msg(mobi_ret)); + return ERROR; + } + if (data == NULL || size == 0 ) { + printf("Source archive not found\n"); + return SUCCESS; + } + + char newdir[FILENAME_MAX]; + if (create_dir(newdir, sizeof(newdir), fullpath, "_source") == ERROR) { + return ERROR; + } + + const unsigned char epub_magic[] = "mimetypeapplication/epub+zip"; + const size_t em_offset = 30; + const size_t em_size = sizeof(epub_magic) - 1; + const char *ext; + if (size > em_offset + em_size && memcmp(data + em_offset, epub_magic, em_size) == 0) { + ext = "epub"; + } else { + ext = "zip"; + } + + char srcsname[FILENAME_MAX]; + char basename[FILENAME_MAX]; + split_fullpath(fullpath, NULL, basename, FILENAME_MAX); + int n = snprintf(srcsname, sizeof(srcsname), "%s_source.%s", basename, ext); + if (n < 0) { + printf("Creating file name failed\n"); + return ERROR; + } + if ((size_t) n >= sizeof(srcsname)) { + printf("File name too long\n"); + return ERROR; + } + if (write_to_dir(newdir, srcsname, data, size) == ERROR) { + return ERROR; + } + printf("Saving source archive to %s\n", srcsname); + + /* Try to get embedded conversion log */ + data = NULL; + size = 0; + mobi_ret = mobi_get_embedded_log(&data, &size, m); + if (mobi_ret != MOBI_SUCCESS) { + printf("Extracting conversion log from mobi failed (%s)\n", libmobi_msg(mobi_ret)); + return ERROR; + } + if (data == NULL || size == 0 ) { + printf("Conversion log not found\n"); + return SUCCESS; + } + + n = snprintf(srcsname, sizeof(srcsname), "%s_source.txt", basename); + if (n < 0) { + printf("Creating file name failed\n"); + return ERROR; + } + if ((size_t) n >= sizeof(srcsname)) { + printf("File name too long\n"); + return ERROR; + } + if (write_to_dir(newdir, srcsname, data, size) == ERROR) { + return ERROR; + } + printf("Saving conversion log to %s\n", srcsname); + + return SUCCESS; +} + +/** + @brief Split hybrid file in two parts + @param[in] fullpath Full file path + @return SUCCESS or ERROR + */ +static int split_hybrid(const char *fullpath) { + + static int run_count = 0; + run_count++; + + bool use_kf8 = run_count == 1 ? false : true; + + /* Initialize main MOBIData structure */ + MOBIData *m = mobi_init(); + if (m == NULL) { + printf("Memory allocation failed\n"); + return ERROR; + } + + errno = 0; + FILE *file = fopen(fullpath, "rb"); + if (file == NULL) { + int errsv = errno; + printf("Error opening file: %s (%s)\n", fullpath, strerror(errsv)); + mobi_free(m); + return ERROR; + } + /* MOBIData structure will be filled with loaded document data and metadata */ + MOBI_RET mobi_ret = mobi_load_file(m, file); + fclose(file); + + if (mobi_ret != MOBI_SUCCESS) { + printf("Error while loading document (%s)\n", libmobi_msg(mobi_ret)); + mobi_free(m); + return ERROR; + } + + mobi_ret = mobi_remove_hybrid_part(m, use_kf8); + if (mobi_ret != MOBI_SUCCESS) { + printf("Error removing hybrid part (%s)\n", libmobi_msg(mobi_ret)); + mobi_free(m); + return ERROR; + } + + if (save_mobi(m, fullpath, "split") != SUCCESS) { + printf("Error saving file\n"); + mobi_free(m); + return ERROR; + } + + /* Free MOBIData structure */ + mobi_free(m); + + /* Proceed with KF8 part */ + if (use_kf8 == false) { + split_hybrid(fullpath); + } + + return SUCCESS; +} + +/** + @brief Main routine that calls optional subroutines + @param[in] fullpath Full file path + @return SUCCESS or ERROR + */ +static int loadfilename(const char *fullpath) { + MOBI_RET mobi_ret; + int ret = SUCCESS; + /* Initialize main MOBIData structure */ + MOBIData *m = mobi_init(); + if (m == NULL) { + printf("Memory allocation failed\n"); + return ERROR; + } + /* By default loader will parse KF8 part of hybrid KF7/KF8 file */ + if (parse_kf7_opt) { + /* Force it to parse KF7 part */ + mobi_parse_kf7(m); + } + errno = 0; + FILE *file = fopen(fullpath, "rb"); + if (file == NULL) { + int errsv = errno; + printf("Error opening file: %s (%s)\n", fullpath, strerror(errsv)); + mobi_free(m); + return ERROR; + } + /* MOBIData structure will be filled with loaded document data and metadata */ + mobi_ret = mobi_load_file(m, file); + fclose(file); + + /* Try to print basic metadata, even if further loading failed */ + /* In case of some unsupported formats it may still print some useful info */ + if (print_extended_meta_opt) { print_meta(m); } + + if (mobi_ret != MOBI_SUCCESS) { + printf("Error while loading document (%s)\n", libmobi_msg(mobi_ret)); + mobi_free(m); + return ERROR; + } + + if (create_epub_opt && mobi_is_replica(m)) { + create_epub_opt = false; + printf("\nWarning: Can't create EPUB format from Print Replica book (ignoring -e argument)\n\n"); + } + + if (!print_extended_meta_opt) { + print_summary(m); + } + + if (print_extended_meta_opt) { + /* Try to print EXTH metadata */ + print_exth(m); + } + +#ifdef USE_ENCRYPTION + if (setpid_opt || setserial_opt) { + ret = set_decryption_key(m, serial, pid); + if (ret != SUCCESS) { + mobi_free(m); + return ret; + } + } +#endif + if (print_rec_meta_opt) { + printf("\nPrinting records metadata...\n"); + print_records_meta(m); + } + if (dump_rec_opt) { + printf("\nDumping raw records...\n"); + ret = dump_records(m, fullpath); + } + if (dump_rawml_opt) { + printf("\nDumping rawml...\n"); + ret = dump_rawml(m, fullpath); + } else if (dump_parts_opt || create_epub_opt) { + printf("\nReconstructing source resources...\n"); + /* Initialize MOBIRawml structure */ + /* This structure will be filled with parsed records data */ + MOBIRawml *rawml = mobi_init_rawml(m); + if (rawml == NULL) { + printf("Memory allocation failed\n"); + mobi_free(m); + return ERROR; + } + + /* Parse rawml text and other data held in MOBIData structure into MOBIRawml structure */ + mobi_ret = mobi_parse_rawml(rawml, m); + if (mobi_ret != MOBI_SUCCESS) { + printf("Parsing rawml failed (%s)\n", libmobi_msg(mobi_ret)); + mobi_free(m); + mobi_free_rawml(rawml); + return ERROR; + } + if (create_epub_opt && !dump_parts_opt) { +#ifdef USE_XMLWRITER + printf("\nCreating EPUB...\n"); + /* Create epub file */ + ret = create_epub(rawml, fullpath); + if (ret != SUCCESS) { + printf("Creating EPUB failed\n"); + } +#endif + } else { + printf("\nDumping resources...\n"); + /* Save parts to files */ + ret = dump_rawml_parts(rawml, fullpath); + if (ret != SUCCESS) { + printf("Dumping parts failed\n"); + } + } + /* Free MOBIRawml structure */ + mobi_free_rawml(rawml); + } + if (extract_source_opt) { + ret = dump_embedded_source(m, fullpath); + } + if (dump_cover_opt) { + ret = dump_cover(m, fullpath); + } + if (split_opt && !mobi_is_hybrid(m)) { + printf("File is not a hybrid, skip splitting\n"); + split_opt = false; + } + /* Free MOBIData structure */ + mobi_free(m); + return ret; +} + +/** + @brief Print usage info + @param[in] progname Executed program name + */ +static void exit_with_usage(const char *progname) { + printf("usage: %s [-cd" PRINT_EPUB_ARG "himrst" PRINT_RUSAGE_ARG "vx7] [-o dir]" PRINT_ENC_USG " filename\n", progname); + printf(" without arguments prints document metadata and exits\n"); + printf(" -c dump cover\n"); + printf(" -d dump rawml text record\n"); +#ifdef USE_XMLWRITER + printf(" -e create EPUB file (with -s will dump EPUB source)\n"); +#endif + printf(" -h show this usage summary and exit\n"); + printf(" -i print detailed metadata\n"); + printf(" -m print records metadata\n"); + printf(" -o dir save output to dir folder\n"); +#ifdef USE_ENCRYPTION + printf(" -p pid set pid for decryption\n"); + printf(" -P serial set device serial for decryption\n"); +#endif + printf(" -r dump raw records\n"); + printf(" -s dump recreated source files\n"); + printf(" -t split hybrid file into two parts\n"); +#ifdef HAVE_SYS_RESOURCE_H + printf(" -u show rusage\n"); +#endif + printf(" -v show version and exit\n"); + printf(" -x extract conversion source and log (if present)\n"); + printf(" -7 parse KF7 part of hybrid file (by default KF8 part is parsed)\n"); + exit(SUCCESS); +} + +/** + @brief Main + + @param[in] argc Arguments count + @param[in] argv Arguments array + @return SUCCESS (0) or ERROR (1) + */ +int main(int argc, char *argv[]) { + if (argc < 2) { + exit_with_usage(argv[0]); + } + opterr = 0; + int c; + while ((c = getopt(argc, argv, "cd" PRINT_EPUB_ARG "himo:" PRINT_ENC_ARG "rst" PRINT_RUSAGE_ARG "vx7")) != -1) { + switch (c) { + case 'c': + dump_cover_opt = true; + break; + case 'd': + dump_rawml_opt = true; + break; +#ifdef USE_XMLWRITER + case 'e': + create_epub_opt = true; + break; +#endif + case 'i': + print_extended_meta_opt = true; + break; + case 'm': + print_rec_meta_opt = true; + break; + case 'o': + outdir_opt = true; + size_t outdir_length = strlen(optarg); + if (outdir_length == 2 && optarg[0] == '-') { + printf("Option -%c requires an argument.\n", c); + return ERROR; + } + if (outdir_length >= FILENAME_MAX - 1) { + printf("Output directory name too long\n"); + return ERROR; + } + strncpy(outdir, optarg, FILENAME_MAX - 1); + normalize_path(outdir); + if (!dir_exists(outdir)) { + printf("Output directory is not valid\n"); + return ERROR; + } + if (optarg[outdir_length - 1] != separator) { + // append separator + if (outdir_length >= FILENAME_MAX - 2) { + printf("Output directory name too long\n"); + return ERROR; + } + outdir[outdir_length++] = separator; + outdir[outdir_length] = '\0'; + } + break; +#ifdef USE_ENCRYPTION + case 'p': + if (strlen(optarg) == 2 && optarg[0] == '-') { + printf("Option -%c requires an argument.\n", c); + return ERROR; + } + setpid_opt = true; + pid = optarg; + break; + case 'P': + if (strlen(optarg) == 2 && optarg[0] == '-') { + printf("Option -%c requires an argument.\n", c); + return ERROR; + } + setserial_opt = true; + serial = optarg; + break; +#endif + case 'r': + dump_rec_opt = true; + break; + case 's': + dump_parts_opt = true; + break; + case 't': + split_opt = true; + break; +#ifdef HAVE_SYS_RESOURCE_H + case 'u': + print_rusage_opt = true; + break; +#endif + case 'v': + printf("mobitool build: " __DATE__ " " __TIME__ " (" COMPILER ")\n"); + printf("libmobi: %s\n", mobi_version()); + return SUCCESS; + case 'x': + extract_source_opt = true; + break; + case '7': + parse_kf7_opt = true; + break; + case '?': + if (isprint(optopt)) { + fprintf(stderr, "Unknown option `-%c'\n", optopt); + } + else { + fprintf(stderr, "Unknown option character `\\x%x'\n", optopt); + } + exit_with_usage(argv[0]); + case 'h': + default: + exit_with_usage(argv[0]); + } + } + if (argc <= optind) { + printf("Missing filename\n"); + exit_with_usage(argv[0]); + } + + int ret = SUCCESS; + char filename[FILENAME_MAX]; + strncpy(filename, argv[optind], FILENAME_MAX - 1); + filename[FILENAME_MAX - 1] = '\0'; + normalize_path(filename); + + ret = loadfilename(filename); + if (split_opt) { + printf("\nSplitting hybrid file...\n"); + ret = split_hybrid(filename); + } +#ifdef HAVE_SYS_RESOURCE_H + if (print_rusage_opt) { + /* rusage */ + struct rusage ru; + struct timeval utime; + struct timeval stime; + getrusage(RUSAGE_SELF, &ru); + utime = ru.ru_utime; + stime = ru.ru_stime; + printf("RUSAGE: ru_utime => %lld.%lld sec.; ru_stime => %lld.%lld sec.\n", + (long long) utime.tv_sec, (long long) utime.tv_usec, + (long long) stime.tv_sec, (long long) stime.tv_usec); + } +#endif + return ret; +} diff --git a/app/src/main/cpp/libmobi/tools/win32/getopt.c b/app/src/main/cpp/libmobi/tools/win32/getopt.c new file mode 100644 index 0000000..01bd693 --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/win32/getopt.c @@ -0,0 +1,105 @@ +/* + * Copyright (c) 1987, 1993, 1994 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include "getopt.h" + +int opterr = 1, /* if error message should be printed */ +optind = 1, /* index into parent argv vector */ +optopt, /* character checked for validity */ +optreset; /* reset getopt */ +char *optarg; /* argument associated with option */ + +#define BADCH (int)'?' +#define BADARG (int)':' +#define EMSG "" + +/* + * getopt -- + * Parse argc/argv argument vector. + */ +int getopt(int nargc, char * const nargv[], const char *ostr) +{ + static char *place = EMSG; /* option letter processing */ + const char *oli; /* option letter list index */ + + if (optreset || !*place) { /* update scanning pointer */ + optreset = 0; + if (optind >= nargc || *(place = nargv[optind]) != '-') { + place = EMSG; + return (-1); + } + if (place[1] && *++place == '-') { /* found "--" */ + ++optind; + place = EMSG; + return (-1); + } + } /* option letter okay? */ + if ((optopt = (int)*place++) == (int)':' || + !(oli = strchr(ostr, optopt))) { + /* + * if the user didn't specify '-' as an option, + * assume it means -1. + */ + if (optopt == (int)'-') + return (-1); + if (!*place) + ++optind; + if (opterr && *ostr != ':') + (void)printf("illegal option -- %c\n", optopt); + return (BADCH); + } + if (*++oli != ':') { /* don't need argument */ + optarg = NULL; + if (!*place) + ++optind; + } + else { /* need an argument */ + if (*place) /* no white space */ + optarg = place; + else if (nargc <= ++optind) { /* no arg */ + place = EMSG; + if (*ostr == ':') + return (BADARG); + if (opterr) + (void)printf("option requires an argument -- %c\n", optopt); + return (BADCH); + } + else /* white space */ + optarg = nargv[optind]; + place = EMSG; + ++optind; + } + return (optopt); /* dump back option letter */ +} diff --git a/app/src/main/cpp/libmobi/tools/win32/getopt.h b/app/src/main/cpp/libmobi/tools/win32/getopt.h new file mode 100644 index 0000000..3b15d46 --- /dev/null +++ b/app/src/main/cpp/libmobi/tools/win32/getopt.h @@ -0,0 +1,20 @@ +/** @file getopt.h +* +* Copyright (c) 2016 Bartek Fabiszewski +* http://www.fabiszewski.net +* +* Licensed under LGPL, either version 3, or any later. +* See +*/ + +/** Supply getopt header for Win32 builds */ + +#ifndef libmobi_getopt_h +#define libmobi_getopt_h + +extern int opterr, optind, optopt, optreset; +extern char *optarg; + +int getopt(int nargc, char *const nargv[], const char *ostr); + +#endif diff --git a/app/src/main/cpp/mobi_jni_bridge.c b/app/src/main/cpp/mobi_jni_bridge.c new file mode 100644 index 0000000..ba3cb69 --- /dev/null +++ b/app/src/main/cpp/mobi_jni_bridge.c @@ -0,0 +1,386 @@ +// mobi_jni_bridge.c + +#include +#include +#include +#include +#include "mobi.h" +#include "index.h" // Needed for INDX_TAG_NCX_FILEPOS +#include "util.h" // Needed for mobi_determine_resource_type + +#define TAG "MobiJNI" +#define AZW3_DEBUG_TAG "AZW3_DEBUG" // Common tag for diagnosis +#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__) +#define LOG_AZW3(...) __android_log_print(ANDROID_LOG_DEBUG, AZW3_DEBUG_TAG, __VA_ARGS__) + + +// Helper function to find a class and handle exceptions +jclass find_class(JNIEnv *env, const char *name) { + jclass clazz = (*env)->FindClass(env, name); + if (clazz == NULL) { + (*env)->ExceptionClear(env); + LOGE("Failed to find class: %s", name); + } + return clazz; +} + +// Helper function to create a Java String from a C string (UTF-8) +jstring new_string_utf(JNIEnv *env, const char *str) { + if (str == NULL) { + return NULL; + } + return (*env)->NewStringUTF(env, str); +} + +// Main JNI function +JNIEXPORT jobject JNICALL +Java_com_aryan_reader_epub_MobiParser_parseMobiFile(JNIEnv *env, jobject thiz, jstring file_path) { + const char *native_file_path = (*env)->GetStringUTFChars(env, file_path, 0); + LOGD("Starting to parse file: %s", native_file_path); + + MOBIData *m = mobi_init(); + if (m == NULL) { + LOGE("mobi_init() failed"); + (*env)->ReleaseStringUTFChars(env, file_path, native_file_path); + return NULL; + } + + FILE *file = fopen(native_file_path, "rb"); + if (file == NULL) { + LOGE("Failed to open file: %s", native_file_path); + mobi_free(m); + (*env)->ReleaseStringUTFChars(env, file_path, native_file_path); + return NULL; + } + + MOBI_RET mobi_ret = mobi_load_file(m, file); + fclose(file); + if (mobi_ret != MOBI_SUCCESS) { + LOGE("mobi_load_file() failed with error: %d", mobi_ret); + mobi_free(m); + (*env)->ReleaseStringUTFChars(env, file_path, native_file_path); + return NULL; + } + + if (m->rh && m->rh->encryption_type != MOBI_ENCRYPTION_NONE) { + LOGE("File is protected by DRM (encryption type: %d) and cannot be opened.", m->rh->encryption_type); + mobi_free(m); + (*env)->ReleaseStringUTFChars(env, file_path, native_file_path); + return NULL; + } + + // Add diagnostic logs + if (m->mh) { + LOG_AZW3("MOBI Version: %u", (m->mh->version) ? *m->mh->version : 0); + LOG_AZW3("Is KF8: %s", mobi_is_kf8(m) ? "yes" : "no"); + LOG_AZW3("Is Hybrid: %s", mobi_is_hybrid(m) ? "yes" : "no"); + } + + + MOBIRawml *rawml = mobi_init_rawml(m); + if (rawml == NULL) { + LOGE("mobi_init_rawml() failed"); + mobi_free(m); + (*env)->ReleaseStringUTFChars(env, file_path, native_file_path); + return NULL; + } + + // Use the _opt version to explicitly enable parsing of all TOC types (NCX, Guide, etc.) + mobi_ret = mobi_parse_rawml_opt(rawml, m, true, false, true); + if (mobi_ret != MOBI_SUCCESS) { + LOGE("mobi_parse_rawml_opt() failed with error: %d", mobi_ret); + mobi_free_rawml(rawml); + mobi_free(m); + (*env)->ReleaseStringUTFChars(env, file_path, native_file_path); + return NULL; + } + + LOGD("Successfully parsed MOBI file."); + + // Find Kotlin data classes + jclass parsed_data_class = find_class(env, "com/aryan/reader/epub/MobiParser$ParsedMobiData"); + jclass resource_class = find_class(env, "com/aryan/reader/epub/MobiParser$ParsedMobiResource"); + jclass toc_entry_class = find_class(env, "com/aryan/reader/epub/MobiParser$ParsedMobiTocEntry"); + + + if (!parsed_data_class || !resource_class || !toc_entry_class) { + LOGE("Could not find one or more required Kotlin data classes."); + mobi_free_rawml(rawml); + mobi_free(m); + (*env)->ReleaseStringUTFChars(env, file_path, native_file_path); + return NULL; + } + + // Get constructors for data classes (NOTE THE NEW SIGNATURE for ParsedMobiData) + jmethodID parsed_data_ctor = (*env)->GetMethodID(env, parsed_data_class, "", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Lcom/aryan/reader/epub/MobiParser$ParsedMobiResource;[Lcom/aryan/reader/epub/MobiParser$ParsedMobiTocEntry;I)V"); + jmethodID resource_ctor = (*env)->GetMethodID(env, resource_class, "", "(ILjava/lang/String;[BLjava/lang/String;)V"); + jmethodID toc_entry_ctor = (*env)->GetMethodID(env, toc_entry_class, "", "(Ljava/lang/String;I)V"); + + // --- Manually concatenate flow parts to get the full raw HTML content --- + size_t total_html_size = 0; + size_t num_flow_parts = 0; + MOBIPart *curr_part = rawml->flow; + while (curr_part) { + if (curr_part->data) { + total_html_size += curr_part->size; + } + num_flow_parts++; + curr_part = curr_part->next; + } + + jstring raw_html_string = NULL; + if (total_html_size > 0) { + char *full_html = malloc(total_html_size + 1); + if (full_html) { + size_t current_offset = 0; + curr_part = rawml->flow; + while (curr_part) { + if (curr_part->data) { + memcpy(full_html + current_offset, curr_part->data, curr_part->size); + current_offset += curr_part->size; + } + curr_part = curr_part->next; + } + full_html[total_html_size] = '\0'; // Null-terminate the final string + + raw_html_string = new_string_utf(env, full_html); + free(full_html); + LOGD("Manually concatenated %zu flow parts into single string (%zu bytes).", num_flow_parts, total_html_size); + } else { + LOGE("Failed to allocate memory for full HTML string."); + raw_html_string = NULL; + } + } else { + LOGE("No data found in rawml->flow parts."); + } + + + // --- Create Resource Array --- + + // 1. Find the cover record first. + jint cover_uid = -1; + MOBIPdbRecord *cover_image_rec = NULL; + MOBIExthHeader *cover_exth = mobi_get_exthrecord_by_tag(m, EXTH_COVEROFFSET); + if (cover_exth) { + uint32_t cover_offset = mobi_decode_exthvalue(cover_exth->data, cover_exth->size); + if (m->mh && m->mh->image_index) { + size_t first_image_seq = *m->mh->image_index; + cover_image_rec = mobi_get_record_by_seqnumber(m, first_image_seq + cover_offset); + if (cover_image_rec) { + cover_uid = (jint)cover_image_rec->uid; + } + } + } else { + LOGD("JNI: No cover metadata found (EXTH 201)."); + } + + // 2. Count resources from rawml (binary resources AND flow-based CSS) + size_t num_binary_resources = 0; + bool cover_in_resources = false; + curr_part = rawml->resources; + while (curr_part) { + num_binary_resources++; + if (cover_image_rec && curr_part->uid == cover_image_rec->uid) { + cover_in_resources = true; + } + curr_part = curr_part->next; + } + + // NEW: Count flow parts that are CSS + size_t num_css_flow_parts = 0; + size_t flow_part_index = 0; + curr_part = rawml->flow; + while (curr_part) { + // mobi_determine_flowpart_type is key here + if (mobi_determine_flowpart_type(rawml, flow_part_index) == T_CSS) { + num_css_flow_parts++; + } + flow_part_index++; + curr_part = curr_part->next; + } + LOG_AZW3("Found %zu binary resources and %zu CSS resources in flow.", num_binary_resources, num_css_flow_parts); + + + size_t total_resources = num_binary_resources + num_css_flow_parts; + if (cover_image_rec && !cover_in_resources) { + total_resources++; + } + + // 3. Create the array and populate it. + jobjectArray resource_array = (*env)->NewObjectArray(env, total_resources, resource_class, NULL); + size_t i = 0; // This is now the main index for the resource_array + + // Add binary resources first + curr_part = rawml->resources; + while (curr_part) { + if (curr_part->data) { + MOBIFileMeta meta = mobi_get_filemeta_by_type(curr_part->type); + char filename[64]; + snprintf(filename, sizeof(filename), "res_%05zu.%s", curr_part->uid, meta.extension); + LOG_AZW3("Binary Resource -> UID: %zu, Type: %s, Mime: %s, Filename: %s", curr_part->uid, meta.extension, meta.mime_type, filename); + + jstring path = new_string_utf(env, filename); + jstring mimetype = new_string_utf(env, meta.mime_type); + jbyteArray data_array = (*env)->NewByteArray(env, curr_part->size); + (*env)->SetByteArrayRegion(env, data_array, 0, curr_part->size, (jbyte *)curr_part->data); + + jobject resource_obj = (*env)->NewObject(env, resource_class, resource_ctor, (jint)curr_part->uid, path, data_array, mimetype); + (*env)->SetObjectArrayElement(env, resource_array, i++, resource_obj); + + (*env)->DeleteLocalRef(env, path); + (*env)->DeleteLocalRef(env, mimetype); + (*env)->DeleteLocalRef(env, data_array); + (*env)->DeleteLocalRef(env, resource_obj); + } + curr_part = curr_part->next; + } + + // NEW: Add flow-based CSS resources + flow_part_index = 0; + curr_part = rawml->flow; + while (curr_part) { + if (mobi_determine_flowpart_type(rawml, flow_part_index) == T_CSS) { + MOBIFileMeta meta = mobi_get_filemeta_by_type(T_CSS); + char filename[64]; + // We use the flow part index for a unique filename, since flow parts don't have UIDs + snprintf(filename, sizeof(filename), "flow_%05zu.css", flow_part_index); + LOG_AZW3("Flow Resource (CSS) -> Index: %zu, Mime: %s, Filename: %s", flow_part_index, meta.mime_type, filename); + + jstring path = new_string_utf(env, filename); + jstring mimetype = new_string_utf(env, meta.mime_type); + jbyteArray data_array = (*env)->NewByteArray(env, curr_part->size); + (*env)->SetByteArrayRegion(env, data_array, 0, curr_part->size, (jbyte *)curr_part->data); + + // Use flow_part_index for UID as it's unique in this context. Add a large offset to avoid collisions with real UIDs. + jobject resource_obj = (*env)->NewObject(env, resource_class, resource_ctor, (jint)(100000 + flow_part_index), path, data_array, mimetype); + (*env)->SetObjectArrayElement(env, resource_array, i++, resource_obj); + + (*env)->DeleteLocalRef(env, path); + (*env)->DeleteLocalRef(env, mimetype); + (*env)->DeleteLocalRef(env, data_array); + (*env)->DeleteLocalRef(env, resource_obj); + } + flow_part_index++; + curr_part = curr_part->next; + } + + // 4. If we need to add the cover manually, do it now. + if (cover_image_rec && !cover_in_resources) { + MOBIFiletype cover_type = mobi_determine_resource_type(cover_image_rec); + MOBIFileMeta meta = mobi_get_filemeta_by_type(cover_type); + char filename[64]; + snprintf(filename, sizeof(filename), "res_%05zu.%s", cover_image_rec->uid, meta.extension); + + LOG_AZW3("Manually adding cover resource -> UID: %zu, Type: %s, Mime: %s", cover_image_rec->uid, meta.extension, meta.mime_type); + + jstring path = new_string_utf(env, filename); + jstring mimetype = new_string_utf(env, meta.mime_type); + jbyteArray data_array = (*env)->NewByteArray(env, cover_image_rec->size); + (*env)->SetByteArrayRegion(env, data_array, 0, cover_image_rec->size, (jbyte *)cover_image_rec->data); + + jobject resource_obj = (*env)->NewObject(env, resource_class, resource_ctor, (jint)cover_image_rec->uid, path, data_array, mimetype); + (*env)->SetObjectArrayElement(env, resource_array, i, resource_obj); // Use i, not i++ + + (*env)->DeleteLocalRef(env, path); + (*env)->DeleteLocalRef(env, mimetype); + (*env)->DeleteLocalRef(env, data_array); + (*env)->DeleteLocalRef(env, resource_obj); + } + LOGD("Processed %zu total resources.", total_resources); + + + // --- Create TOC Array (from NCX index or Guide index) --- + jobjectArray toc_array = NULL; + MOBIIndx *toc_indx = NULL; + const char *toc_type_str = "None"; + + if (rawml->ncx && rawml->ncx->entries_count > 0) { + toc_indx = rawml->ncx; + toc_type_str = "NCX"; + } else if (rawml->guide && rawml->guide->entries_count > 0) { + toc_indx = rawml->guide; + toc_type_str = "Guide"; + } + LOG_AZW3("TOC type detected: %s", toc_type_str); + + if (toc_indx) { + size_t valid_entries_count = 0; + // First, count valid entries to allocate the exact array size. + for (size_t i = 0; i < toc_indx->entries_count; ++i) { + MOBIIndexEntry entry = toc_indx->entries[i]; + uint32_t file_pos = 0; + if (mobi_get_indxentry_tagvalue(&file_pos, &entry, INDX_TAG_NCX_FILEPOS) == MOBI_SUCCESS) { + valid_entries_count++; + } + } + + if (valid_entries_count > 0) { + toc_array = (*env)->NewObjectArray(env, valid_entries_count, toc_entry_class, NULL); + size_t current_valid_index = 0; + for (size_t i = 0; i < toc_indx->entries_count; ++i) { + MOBIIndexEntry entry = toc_indx->entries[i]; + uint32_t file_pos = 0; + + // We check again, this time processing the valid entries. + if (mobi_get_indxentry_tagvalue(&file_pos, &entry, INDX_TAG_NCX_FILEPOS) == MOBI_SUCCESS) { + char *chapter_title_str = NULL; + uint32_t cncx_text_offset = 0; + + // Try to get the title from the CNCX text tag first. This is the most reliable. + if (toc_indx->cncx_record && + mobi_get_indxentry_tagvalue(&cncx_text_offset, &entry, INDX_TAG_NCX_TEXT_CNCX) == MOBI_SUCCESS) { + chapter_title_str = mobi_get_cncx_string(toc_indx->cncx_record, cncx_text_offset); + } + + jstring title; + if (chapter_title_str != NULL && strlen(chapter_title_str) > 0) { + // Success! Use the title from CNCX. + title = new_string_utf(env, chapter_title_str); + free(chapter_title_str); // mobi_get_cncx_string allocates memory that we must free. + } else { + // Fallback to using the entry label if CNCX fails or is empty. + title = new_string_utf(env, entry.label); + LOGD("%s: TOC Entry [%zu]: Title from Label: '%s'", TAG, current_valid_index, entry.label); + } + + jobject toc_entry_obj = (*env)->NewObject(env, toc_entry_class, toc_entry_ctor, title, (jint) file_pos); + (*env)->SetObjectArrayElement(env, toc_array, current_valid_index, toc_entry_obj); + current_valid_index++; + + (*env)->DeleteLocalRef(env, title); + (*env)->DeleteLocalRef(env, toc_entry_obj); + } + } + } + } else { + LOGD("%s: No NCX or Guide TOC found in the document.", TAG); + } + + // --- Create Final Data Object --- + jstring title = new_string_utf(env, mobi_meta_get_title(m)); + jstring author = new_string_utf(env, mobi_meta_get_author(m)); + jstring publisher = new_string_utf(env, mobi_meta_get_publisher(m)); + + jobject result = (*env)->NewObject(env, parsed_data_class, parsed_data_ctor, + title, author, publisher, + raw_html_string, // Pass the single HTML string + resource_array, toc_array, cover_uid); + + // --- Cleanup --- + (*env)->DeleteLocalRef(env, title); + (*env)->DeleteLocalRef(env, author); + (*env)->DeleteLocalRef(env, publisher); + if (raw_html_string) { + (*env)->DeleteLocalRef(env, raw_html_string); + } + (*env)->DeleteLocalRef(env, resource_array); + if (toc_array) { + (*env)->DeleteLocalRef(env, toc_array); + } + mobi_free_rawml(rawml); + mobi_free(m); + (*env)->ReleaseStringUTFChars(env, file_path, native_file_path); + + return result; +} \ No newline at end of file diff --git a/app/src/main/cpp/woff2/.gitignore b/app/src/main/cpp/woff2/.gitignore new file mode 100644 index 0000000..6b35b1f --- /dev/null +++ b/app/src/main/cpp/woff2/.gitignore @@ -0,0 +1,5 @@ +*.o +*.a +/woff2_compress +/woff2_decompress +/woff2_info diff --git a/app/src/main/cpp/woff2/.gitmodules b/app/src/main/cpp/woff2/.gitmodules new file mode 100644 index 0000000..fa149aa --- /dev/null +++ b/app/src/main/cpp/woff2/.gitmodules @@ -0,0 +1,3 @@ +[submodule "brotli"] + path = brotli + url = https://github.com/google/brotli.git diff --git a/app/src/main/cpp/woff2/CMakeLists.txt b/app/src/main/cpp/woff2/CMakeLists.txt new file mode 100644 index 0000000..78ac12e --- /dev/null +++ b/app/src/main/cpp/woff2/CMakeLists.txt @@ -0,0 +1,285 @@ +# Copyright 2017 Igalia S.L. All Rights Reserved. +# +# Distributed under MIT license. +# See file LICENSE for detail or copy at https://opensource.org/licenses/MIT + +# Ubuntu 12.04 LTS has CMake 2.8.7, and is an important target since +# several CI services, such as Travis and Drone, use it. Solaris 11 +# has 2.8.6, and it's not difficult to support if you already have to +# support 2.8.7. +cmake_minimum_required(VERSION 2.8.6) + +project(woff2) + +include(GNUInstallDirs) + +# Build options +option(BUILD_SHARED_LIBS "Build shared libraries" ON) +option(CANONICAL_PREFIXES "Canonical prefixes" OFF) +option(NOISY_LOGGING "Noisy logging" ON) + +# Version information +set(WOFF2_VERSION 1.0.2) + +# When building shared libraries it is important to set the correct rpath +# See https://cmake.org/Wiki/CMake_RPATH_handling#Always_full_RPATH +set(CMAKE_SKIP_BUILD_RPATH FALSE) +set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE) +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) +list(FIND CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES "${CMAKE_INSTALL_LIBDIR}" isSystemDir) +if ("${isSystemDir}" STREQUAL "-1") + set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_LIBDIR}") +endif() + +# Find Brotli dependencies +#set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +#find_package(BrotliDec) +#if (NOT BROTLIDEC_FOUND) +# message(FATAL_ERROR "librotlidec is needed to build woff2.") +#endif () +#find_package(BrotliEnc) +#if (NOT BROTLIENC_FOUND) +# message(FATAL_ERROR "librotlienc is needed to build woff2.") +#endif () + +# Set compiler flags +if (NOT CANONICAL_PREFIXES) + add_definitions(-no-canonical-prefixes) + endif () +if (NOISY_LOGGING) + add_definitions(-DFONT_COMPRESSION_BIN) +endif () +add_definitions(-D__STDC_FORMAT_MACROS) +set(COMMON_FLAGS -fno-omit-frame-pointer) + +if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + add_definitions(-DOS_MACOSX) +else () + set(COMMON_FLAGS "${COMMON_FLAG} -fno-omit-frame-pointer") +endif() + +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAG}") + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAG}") +set(CMAKE_CXX_STANDARD 11) + +# Set search path for our private/public headers as well as Brotli headers +include_directories("src" "include" + "${BROTLIDEC_INCLUDE_DIRS}" "${BROTLIENC_INCLUDE_DIRS}") + +# Common part used by decoder and encoder +add_library(woff2common + src/table_tags.cc + src/variable_length.cc + src/woff2_common.cc) + +# WOFF2 Decoder +add_library(woff2dec + src/woff2_dec.cc + src/woff2_out.cc) +target_link_libraries(woff2dec woff2common "${BROTLIDEC_LIBRARIES}") +add_executable(woff2_decompress src/woff2_decompress.cc) +target_link_libraries(woff2_decompress woff2dec) + +# WOFF2 Encoder +add_library(woff2enc + src/font.cc + src/glyph.cc + src/normalize.cc + src/transform.cc + src/woff2_enc.cc) +target_link_libraries(woff2enc woff2common "${BROTLIENC_LIBRARIES}") +add_executable(woff2_compress src/woff2_compress.cc) +target_link_libraries(woff2_compress woff2enc) + +# WOFF2 info +add_executable(woff2_info src/woff2_info.cc) +target_link_libraries(woff2_info woff2common) + +foreach(lib woff2common woff2dec woff2enc) + set_target_properties(${lib} PROPERTIES + SOVERSION ${WOFF2_VERSION} + VERSION ${WOFF2_VERSION} + POSITION_INDEPENDENT_CODE TRUE) +endforeach() + +# Fuzzer libraries +add_library(convert_woff2ttf_fuzzer STATIC src/convert_woff2ttf_fuzzer.cc) +target_link_libraries(convert_woff2ttf_fuzzer woff2dec) +add_library(convert_woff2ttf_fuzzer_new_entry STATIC src/convert_woff2ttf_fuzzer_new_entry.cc) +target_link_libraries(convert_woff2ttf_fuzzer_new_entry woff2dec) + +# PC files +include(CMakeParseArguments) + +function(generate_pkg_config_path outvar path) + string(LENGTH "${path}" path_length) + + set(path_args ${ARGV}) + list(REMOVE_AT path_args 0 1) + list(LENGTH path_args path_args_remaining) + + set("${outvar}" "${path}") + + while(path_args_remaining GREATER 1) + list(GET path_args 0 name) + list(GET path_args 1 value) + + get_filename_component(value_full "${value}" ABSOLUTE) + string(LENGTH "${value}" value_length) + + if(path_length EQUAL value_length AND path STREQUAL value) + set("${outvar}" "\${${name}}") + break() + elseif(path_length GREATER value_length) + # We might be in a subdirectory of the value, but we have to be + # careful about a prefix matching but not being a subdirectory + # (for example, /usr/lib64 is not a subdirectory of /usr/lib). + # We'll do this by making sure the next character is a directory + # separator. + string(SUBSTRING "${path}" ${value_length} 1 sep) + if(sep STREQUAL "/") + string(SUBSTRING "${path}" 0 ${value_length} s) + if(s STREQUAL value) + string(SUBSTRING "${path}" "${value_length}" -1 suffix) + set("${outvar}" "\${${name}}${suffix}") + break() + endif() + endif() + endif() + + list(REMOVE_AT path_args 0 1) + list(LENGTH path_args path_args_remaining) + endwhile() + + set("${outvar}" "${${outvar}}" PARENT_SCOPE) +endfunction(generate_pkg_config_path) + +function(generate_pkg_config output_file) + set (options) + set (oneValueArgs NAME DESCRIPTION URL VERSION PREFIX LIBDIR INCLUDEDIR) + set (multiValueArgs DEPENDS DEPENDS_PRIVATE CFLAGS LIBRARIES) + cmake_parse_arguments(GEN_PKG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) + unset (options) + unset (oneValueArgs) + unset (multiValueArgs) + + if(NOT GEN_PKG_PREFIX) + set(GEN_PKG_PREFIX "${CMAKE_INSTALL_PREFIX}") + endif() + + if(NOT GEN_PKG_LIBDIR) + set(GEN_PKG_LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}") + endif() + generate_pkg_config_path(GEN_PKG_LIBDIR "${GEN_PKG_LIBDIR}" + prefix "${GEN_PKG_PREFIX}") + + if(NOT GEN_PKG_INCLUDEDIR) + set(GEN_PKG_INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}") + endif() + generate_pkg_config_path(GEN_PKG_INCLUDEDIR "${GEN_PKG_INCLUDEDIR}" + prefix "${GEN_PKG_PREFIX}") + + file(WRITE "${output_file}" "prefix=${GEN_PKG_PREFIX}\n") + file(APPEND "${output_file}" "libdir=${GEN_PKG_LIBDIR}\n") + file(APPEND "${output_file}" "includedir=${GEN_PKG_INCLUDEDIR}\n") + file(APPEND "${output_file}" "\n") + + if(GEN_PKG_NAME) + file(APPEND "${output_file}" "Name: ${GEN_PKG_NAME}\n") + else() + file(APPEND "${output_file}" "Name: ${CMAKE_PROJECT_NAME}\n") + endif() + + if(GEN_PKG_DESCRIPTION) + file(APPEND "${output_file}" "Description: ${GEN_PKG_DESCRIPTION}\n") + endif() + + if(GEN_PKG_URL) + file(APPEND "${output_file}" "URL: ${GEN_PKG_URL}\n") + endif() + + if(GEN_PKG_VERSION) + file(APPEND "${output_file}" "Version: ${GEN_PKG_VERSION}\n") + endif() + + if(GEN_PKG_DEPENDS) + file(APPEND "${output_file}" "Requires: ${GEN_PKG_DEPENDS}\n") + endif() + + if(GEN_PKG_DEPENDS_PRIVATE) + file(APPEND "${output_file}" "Requires.private:") + foreach(lib ${GEN_PKG_DEPENDS_PRIVATE}) + file(APPEND "${output_file}" " ${lib}") + endforeach() + file(APPEND "${output_file}" "\n") + endif() + + if(GEN_PKG_LIBRARIES) + set(libs) + + file(APPEND "${output_file}" "Libs: -L\${libdir}") + foreach(lib ${GEN_PKG_LIBRARIES}) + file(APPEND "${output_file}" " -l${lib}") + endforeach() + file(APPEND "${output_file}" "\n") + endif() + + file(APPEND "${output_file}" "Cflags: -I\${includedir}") + if(GEN_PKG_CFLAGS) + foreach(cflag ${GEN_PKG_CFLAGS}) + file(APPEND "${output_file}" " ${cflag}") + endforeach() + endif() + file(APPEND "${output_file}" "\n") +endfunction(generate_pkg_config) + +generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libwoff2common.pc" + NAME libwoff2common + DESCRIPTION "Shared data used by libwoff2 and libwoff2dec libraries" + URL "https://github.com/google/woff2" + VERSION "${WOFF2_VERSION}" + LIBRARIES woff2common) + +generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libwoff2dec.pc" + NAME libwoff2dec + DESCRIPTION "WOFF2 decoder library" + URL "https://github.com/google/woff2" + VERSION "${WOFF2_VERSION}" + DEPENDS libbrotlidec + DEPENDS_PRIVATE libwoff2common + LIBRARIES woff2dec) + +generate_pkg_config ("${CMAKE_CURRENT_BINARY_DIR}/libwoff2enc.pc" + NAME libwoff2enc + DESCRIPTION "WOFF2 encoder library" + URL "https://github.com/google/woff2" + VERSION "${WOFF2_VERSION}" + DEPENDS libbrotlienc + DEPENDS_PRIVATE libwoff2common + LIBRARIES woff2enc) + +# Installation +if (NOT BUILD_SHARED_LIBS) + install( + TARGETS woff2_decompress woff2_compress woff2_info + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ) +endif() + +install( + TARGETS woff2common woff2dec woff2enc + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" +) +install( + DIRECTORY include/woff2 + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" +) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libwoff2common.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libwoff2dec.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libwoff2enc.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") diff --git a/app/src/main/cpp/woff2/CONTRIBUTING.md b/app/src/main/cpp/woff2/CONTRIBUTING.md new file mode 100644 index 0000000..a00e37d --- /dev/null +++ b/app/src/main/cpp/woff2/CONTRIBUTING.md @@ -0,0 +1,27 @@ +Want to contribute? Great! First, read this page (including the small print at +the end). + +### Before you contribute +Before we can use your code, you must sign the +[Google Individual Contributor License Agreement] +(https://cla.developers.google.com/about/google-individual) +(CLA), which you can do online. The CLA is necessary mainly because you own the +copyright to your changes, even after your contribution becomes part of our +codebase, so we need your permission to use and distribute your code. We also +need to be sure of various other things—for instance that you'll tell us if you +know that your code infringes on other people's patents. You don't have to sign +the CLA until after you've submitted your code for review and a member has +approved it, but you must do it before we can put your code into our codebase. +Before you start working on a larger contribution, you should get in touch with +us first through the issue tracker with your idea so that we can help out and +possibly guide you. Coordinating up front makes it much easier to avoid +frustration later on. + +### Code reviews +All submissions, including submissions by project members, require review. We +use Github pull requests for this purpose. + +### The small print +Contributions made by corporations are covered by a different agreement than +the one above, the [Software Grant and Corporate Contributor License Agreement] +(https://cla.developers.google.com/about/google-corporate). diff --git a/app/src/main/cpp/woff2/LICENSE b/app/src/main/cpp/woff2/LICENSE new file mode 100644 index 0000000..4f9441b --- /dev/null +++ b/app/src/main/cpp/woff2/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2013-2017 by the WOFF2 Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/app/src/main/cpp/woff2/Makefile b/app/src/main/cpp/woff2/Makefile new file mode 100644 index 0000000..fbb945c --- /dev/null +++ b/app/src/main/cpp/woff2/Makefile @@ -0,0 +1,63 @@ +OS := $(shell uname) + +CPPFLAGS = -I./brotli/c/include/ -I./src -I./include + +AR ?= ar +CC ?= gcc +CXX ?= g++ + +# It's helpful to be able to turn these off for fuzzing +CANONICAL_PREFIXES ?= -no-canonical-prefixes +NOISY_LOGGING ?= -DFONT_COMPRESSION_BIN +COMMON_FLAGS = -fno-omit-frame-pointer $(CANONICAL_PREFIXES) $(NOISY_LOGGING) -D __STDC_FORMAT_MACROS + +ARFLAGS = crf + +ifeq ($(OS), Darwin) + CPPFLAGS += -DOS_MACOSX + ARFLAGS = cr +else + COMMON_FLAGS += -fno-tree-vrp +endif + + +CFLAGS += $(COMMON_FLAGS) +CXXFLAGS += $(COMMON_FLAGS) -std=c++11 + +SRCDIR = src + +OUROBJ = font.o glyph.o normalize.o table_tags.o transform.o \ + woff2_dec.o woff2_enc.o woff2_common.o woff2_out.o \ + variable_length.o + +BROTLI = brotli +BROTLIOBJ = $(BROTLI)/bin/obj/c +ENCOBJ = $(BROTLIOBJ)/enc/*.o +DECOBJ = $(BROTLIOBJ)/dec/*.o +COMMONOBJ = $(BROTLIOBJ)/common/*.o + +OBJS = $(patsubst %, $(SRCDIR)/%, $(OUROBJ)) +EXECUTABLES=woff2_compress woff2_decompress woff2_info +EXE_OBJS=$(patsubst %, $(SRCDIR)/%.o, $(EXECUTABLES)) +ARCHIVES=convert_woff2ttf_fuzzer convert_woff2ttf_fuzzer_new_entry +ARCHIVE_OBJS=$(patsubst %, $(SRCDIR)/%.o, $(ARCHIVES)) + +ifeq (,$(wildcard $(BROTLI)/*)) + $(error Brotli dependency not found : you must initialize the Git submodule) +endif + +all : $(OBJS) $(EXECUTABLES) $(ARCHIVES) + +$(ARCHIVES) : $(ARCHIVE_OBJS) $(OBJS) deps + $(AR) $(ARFLAGS) $(SRCDIR)/$@.a $(OBJS) \ + $(COMMONOBJ) $(ENCOBJ) $(DECOBJ) $(SRCDIR)/$@.o + +$(EXECUTABLES) : $(EXE_OBJS) deps + $(CXX) $(LFLAGS) $(OBJS) $(COMMONOBJ) $(ENCOBJ) $(DECOBJ) $(SRCDIR)/$@.o -o $@ + +deps : + $(MAKE) -C $(BROTLI) lib + +clean : + rm -f $(OBJS) $(EXE_OBJS) $(EXECUTABLES) + $(MAKE) -C $(BROTLI) clean diff --git a/app/src/main/cpp/woff2/README.md b/app/src/main/cpp/woff2/README.md new file mode 100644 index 0000000..6576772 --- /dev/null +++ b/app/src/main/cpp/woff2/README.md @@ -0,0 +1,71 @@ +This is a README for the font compression reference code. There are several +compression related modules in this repository. + +brotli/ contains reference code for the Brotli byte-level compression +algorithm. Note that it is licensed under the MIT license. + +src/ contains the C++ code for compressing and decompressing fonts. + +# Build & Run + +This document documents how to run the compression reference code. At this +writing, the code, while it is intended to produce a bytestream that can be +reconstructed into a working font, the reference decompression code is not +done, and the exact format of that bytestream is subject to change. + +The build process depends on the g++ compiler. + +## Build + +On a standard Unix-style environment: + +``` +git clone --recursive https://github.com/google/woff2.git +cd woff2 +make clean all +``` + +Alternatively, if Brotli is already installed on your system you can use CMake +to build executables and libraries: + +``` +git clone https://github.com/google/woff2.git +cd woff2 +mkdir out +cd out +cmake .. +make +make install +``` + +By default, shared libraries are built. To use static linkage, do: + +``` +cd woff2 +mkdir out-static +cmake -DBUILD_SHARED_LIBS=OFF .. +make +make install +``` + +## Run + +Ensure the binaries from the build process are in your $PATH, then: + +``` +woff2_compress myfont.ttf +woff2_decompress myfont.woff2 +``` + +# References + +http://www.w3.org/TR/WOFF2/ +http://www.w3.org/Submission/MTX/ + +Also please refer to documents (currently Google Docs): + +WOFF Ultra Condensed file format: proposals and discussion of wire format +issues (PDF is in docs/ directory) + +WIFF Ultra Condensed: more discussion of results and compression techniques. +This tool was used to prepare the data in that document. diff --git a/app/src/main/cpp/woff2/brotli/.editorconfig b/app/src/main/cpp/woff2/brotli/.editorconfig new file mode 100644 index 0000000..17ed3c1 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/.editorconfig @@ -0,0 +1,40 @@ +# http://editorconfig.org +# Consistent coding style across different editors. + +# Top-most file +root = true + +# Global styles: +# - indent 2 spaces +# - add final new line +# - trim trailing whitespace +[*] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +# BUILD: +# - indent 4 spaces +[BUILD] +indent_size = 4 + +# Makefile: +# - indent 1 tab +[Makefile] +indent_size = tab +indent_style = tab + +# Markdown: +# - indent 4 spaces +# - trailing whitespace is significant +[*.md] +indent_size = 4 +trim_trailing_whitespace = false + +# Python +# - indent 4 spaces +[*.py] +indent_size = 4 diff --git a/app/src/main/cpp/woff2/brotli/.gitignore b/app/src/main/cpp/woff2/brotli/.gitignore new file mode 100644 index 0000000..a6d1d90 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/.gitignore @@ -0,0 +1,17 @@ +# C +*.o +bin/ +buildfiles/ +**/obj/ +dist/ + +# Python +__pycache__/ +*.py[cod] +*.so +*.egg-info/ + +# Tests +*.txt.uncompressed +*.br +*.unbr diff --git a/app/src/main/cpp/woff2/brotli/.gitmodules b/app/src/main/cpp/woff2/brotli/.gitmodules new file mode 100644 index 0000000..3ec8760 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/.gitmodules @@ -0,0 +1,6 @@ +[submodule "research/esaxx"] + path = research/esaxx + url = https://github.com/hillbig/esaxx +[submodule "research/libdivsufsort"] + path = research/libdivsufsort + url = https://github.com/y-256/libdivsufsort.git diff --git a/app/src/main/cpp/woff2/brotli/.travis.yml b/app/src/main/cpp/woff2/brotli/.travis.yml new file mode 100644 index 0000000..78495d0 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/.travis.yml @@ -0,0 +1,208 @@ +language: c +sudo: false +branches: + only: + - master +matrix: + include: + ### + ## Linux builds using various versions of GCC. + ### + - os: linux + env: BUILD_SYSTEM=cmake C_COMPILER=gcc-7 CXX_COMPILER=g++-7 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-7 + - g++-7 + - os: linux + env: BUILD_SYSTEM=cmake C_COMPILER=gcc-4.4 CXX_COMPILER=g++-4.4 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-4.4 + - g++-4.4 + + ### + ## Test that Autotools build works. + ### + - os: linux + env: BUILD_SYSTEM=autotools C_COMPILER=gcc-5 CXX_COMPILER=g++-5 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-5 + - g++-5 + + ### + ## Test that fuzzer is compiling / working. + ### + - os: linux + env: BUILD_SYSTEM=fuzz C_COMPILER=clang-5.0 CXX_COMPILER=clang++-5.0 ASAN_OPTIONS=detect_leaks=0 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-5.0 + packages: + - clang-5.0 + + ### + ## clang on Linux + ### + - os: linux + env: BUILD_SYSTEM=cmake C_COMPILER=clang-5.0 CXX_COMPILER=clang++-5.0 + addons: + apt: + sources: + - llvm-toolchain-trusty-5.0 + - ubuntu-toolchain-r-test + packages: + - clang-5.0 + - os: linux + env: BUILD_SYSTEM=cmake C_COMPILER=clang-3.5 CXX_COMPILER=clang++-3.5 + addons: + apt: + sources: + - llvm-toolchain-trusty-3.5 + - ubuntu-toolchain-r-test + packages: + - clang-3.5 + + ### + ## PGI Community Edition on Linux + ### + - os: linux + env: BUILD_SYSTEM=cmake C_COMPILER=pgcc CXX_COMPILER=pgc++ + + ### + ## Python 2.7 and 3.6 builds on Linux + ### + - os: linux + language: python + python: 2.7 + env: BUILD_SYSTEM=python C_COMPILER=gcc-5 CXX_COMPILER=g++-5 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-5 + - g++-5 + - os: linux + language: python + python: 3.6 + env: BUILD_SYSTEM=python C_COMPILER=gcc-5 CXX_COMPILER=g++-5 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-5 + - g++-5 + + ### + ## CMake on OS X + ## + ## These all work, but it seems unnecessary to actually build them + ## all since we already test all these versions of GCC on Linux. + ## We'll just test 4.4 and the most recent version. + ### + - os: osx + env: BUILD_SYSTEM=cmake C_COMPILER=gcc-6 CXX_COMPILER=g++-6 + - os: osx + osx_image: beta-xcode6.2 + env: BUILD_SYSTEM=cmake C_COMPILER=gcc-4.4 CXX_COMPILER=g++-4.4 + + ### + ## Python 2.7 OS X build (using the system /usr/bin/python) + ### + - os: osx + env: BUILD_SYSTEM=python C_COMPILER=gcc CXX_COMPILER=g++ + + ### + ## Sanitizers + ### + - os: linux + env: BUILD_SYSTEM=cmake C_COMPILER=clang-5.0 CXX_COMPILER=clang++-5.0 SANITIZER=address ASAN_OPTIONS=detect_leaks=0 + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-5.0 + packages: + - clang-5.0 + - os: linux + env: BUILD_SYSTEM=cmake C_COMPILER=clang-5.0 CXX_COMPILER=clang++-5.0 SANITIZER=thread + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-5.0 + packages: + - clang-5.0 + - os: linux + env: BUILD_SYSTEM=cmake C_COMPILER=clang-5.0 CXX_COMPILER=clang++-5.0 SANITIZER=undefined CFLAGS="-fno-sanitize-recover=undefined,integer" + addons: + apt: + sources: + - ubuntu-toolchain-r-test + - llvm-toolchain-trusty-5.0 + packages: + - clang-5.0 + + - os: linux + env: BUILD_SYSTEM=maven + language: java + + - os: linux + sudo: required + language: java + env: BUILD_SYSTEM=bazel + addons: + apt: + sources: + - sourceline: "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" + key_url: "https://storage.googleapis.com/bazel-apt/doc/apt-key.pub.gpg" + - ubuntu-toolchain-r-test + packages: + - oracle-java8-installer + - bazel + + - os: osx + env: BUILD_SYSTEM=bazel + +before_install: +### +## If we use the matrix to set CC/CXX Travis, overwrites the values, +## so instead we use C/CXX_COMPILER, then copy the values to CC/CXX +## here (after Travis has set CC/CXX). +### +- if [ -n "${C_COMPILER}" ]; then export CC="${C_COMPILER}"; fi +- if [ -n "${CXX_COMPILER}" ]; then export CXX="${CXX_COMPILER}"; fi +- scripts/.travis.sh before_install +install: +- scripts/.travis.sh install +script: +- scripts/.travis.sh script +after_success: +- scripts/.travis.sh after_success + +before_deploy: +- scripts/.travis.sh before_deploy + +deploy: +- provider: bintray + file: "scripts/.bintray.json" + user: "eustas" + key: + secure: "Kbam/lTAdz72fZivbs6riJT+Y4PbuKP7r6t5PAWxJxAAykjwnYTRe3zF472g9HCE14KYMsdB+KSYSgg6TGJnqGC9gL9xhhGU9U/WmA+vbMWS/MSnMWpK9IRpp77pM2i2NKZD4v33JuEwKFCBJP3Vj6QQ5Qd1NKdobuXJyznhgnw=" + on: + condition: "${BUILD_SYSTEM} = bazel" + skip_cleanup: true diff --git a/app/src/main/cpp/woff2/brotli/BUILD b/app/src/main/cpp/woff2/brotli/BUILD new file mode 100644 index 0000000..6265b71 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/BUILD @@ -0,0 +1,224 @@ +# Description: +# Brotli is a generic-purpose lossless compression algorithm. + +package( + default_visibility = ["//visibility:public"], +) + +licenses(["notice"]) # MIT + +exports_files(["LICENSE"]) + +# >>> JNI headers + +config_setting( + name = "darwin", + values = {"cpu": "darwin"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "darwin_x86_64", + values = {"cpu": "darwin_x86_64"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "windows", + values = {"cpu": "x64_windows"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "windows_msvc", + values = {"cpu": "x64_windows_msvc"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "windows_msys", + values = {"cpu": "x64_windows_msys"}, + visibility = ["//visibility:public"], +) + +genrule( + name = "copy_link_jni_header", + srcs = ["@openjdk_linux//:jni_h"], + outs = ["jni/jni.h"], + cmd = "cp -f $< $@", +) + +genrule( + name = "copy_link_jni_md_header", + srcs = select({ + ":darwin": ["@openjdk_macos//:jni_md_h"], + ":darwin_x86_64": ["@openjdk_macos//:jni_md_h"], + ":windows_msys": ["@openjdk_win//:jni_md_h"], + ":windows_msvc": ["@openjdk_win//:jni_md_h"], + ":windows": ["@openjdk_win//:jni_md_h"], + "//conditions:default": ["@openjdk_linux//:jni_md_h"], + }), + outs = ["jni/jni_md.h"], + cmd = "cp -f $< $@", +) + +cc_library( + name = "jni_inc", + hdrs = [ + ":jni/jni.h", + ":jni/jni_md.h", + ], + includes = ["jni"], +) + +# <<< JNI headers + +STRICT_C_OPTIONS = [ + "--pedantic-errors", + "-Wall", + "-Wconversion", + "-Werror", + "-Wextra", + "-Wlong-long", + "-Wmissing-declarations", + "-Wmissing-prototypes", + "-Wno-strict-aliasing", + "-Wshadow", + "-Wsign-compare", +] + +filegroup( + name = "public_headers", + srcs = glob(["c/include/brotli/*.h"]), +) + +filegroup( + name = "common_headers", + srcs = glob(["c/common/*.h"]), +) + +filegroup( + name = "common_sources", + srcs = glob(["c/common/*.c"]), +) + +filegroup( + name = "dec_headers", + srcs = glob(["c/dec/*.h"]), +) + +filegroup( + name = "dec_sources", + srcs = glob(["c/dec/*.c"]), +) + +filegroup( + name = "enc_headers", + srcs = glob(["c/enc/*.h"]), +) + +filegroup( + name = "enc_sources", + srcs = glob(["c/enc/*.c"]), +) + +cc_library( + name = "brotli_inc", + hdrs = [":public_headers"], + copts = STRICT_C_OPTIONS, + includes = ["c/include"], +) + +cc_library( + name = "brotlicommon", + srcs = [":common_sources"], + hdrs = [":common_headers"], + copts = STRICT_C_OPTIONS, + deps = [":brotli_inc"], +) + +cc_library( + name = "brotlidec", + srcs = [":dec_sources"], + hdrs = [":dec_headers"], + copts = STRICT_C_OPTIONS, + deps = [":brotlicommon"], +) + +cc_library( + name = "brotlienc", + srcs = [":enc_sources"], + hdrs = [":enc_headers"], + copts = STRICT_C_OPTIONS, + linkopts = ["-lm"], + deps = [":brotlicommon"], +) + +cc_binary( + name = "brotli", + srcs = ["c/tools/brotli.c"], + copts = STRICT_C_OPTIONS, + linkstatic = 1, + deps = [ + ":brotlidec", + ":brotlienc", + ], +) + +######################################################## +# WARNING: do not (transitively) depend on this target! +######################################################## +cc_binary( + name = "brotli_jni.dll", + srcs = [ + ":common_headers", + ":common_sources", + ":dec_headers", + ":dec_sources", + ":enc_headers", + ":enc_sources", + "//java/org/brotli/wrapper/common:jni_src", + "//java/org/brotli/wrapper/dec:jni_src", + "//java/org/brotli/wrapper/enc:jni_src", + ], + deps = [ + ":brotli_inc", + ":jni_inc", + ], + linkshared = 1, +) + +######################################################## +# WARNING: do not (transitively) depend on this target! +######################################################## +cc_binary( + name = "brotli_jni_no_dictionary_data.dll", + srcs = [ + ":common_headers", + ":common_sources", + ":dec_headers", + ":dec_sources", + ":enc_headers", + ":enc_sources", + "//java/org/brotli/wrapper/common:jni_src", + "//java/org/brotli/wrapper/dec:jni_src", + "//java/org/brotli/wrapper/enc:jni_src", + ], + defines = [ + "BROTLI_EXTERNAL_DICTIONARY_DATA=", + ], + deps = [ + ":brotli_inc", + ":jni_inc", + ], + linkshared = 1, +) + +filegroup( + name = "dictionary", + srcs = ["c/common/dictionary.bin"], +) + +load("@io_bazel_rules_go//go:def.bzl", "go_prefix") + +go_prefix("github.com/google/brotli") diff --git a/app/src/main/cpp/woff2/brotli/CMakeLists.txt b/app/src/main/cpp/woff2/brotli/CMakeLists.txt new file mode 100644 index 0000000..2dc7232 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/CMakeLists.txt @@ -0,0 +1,356 @@ +# Ubuntu 12.04 LTS has CMake 2.8.7, and is an important target since +# several CI services, such as Travis and Drone, use it. Solaris 11 +# has 2.8.6, and it's not difficult to support if you already have to +# support 2.8.7. +cmake_minimum_required(VERSION 2.8.6) + +project(brotli) + +# If Brotli is being bundled in another project, we don't want to +# install anything. However, we want to let people override this, so +# we'll use the BROTLI_BUNDLED_MODE variable to let them do that; just +# set it to OFF in your project before you add_subdirectory(brotli). +get_directory_property(BROTLI_PARENT_DIRECTORY PARENT_DIRECTORY) +if(BROTLI_BUNDLED_MODE STREQUAL "") + # Bundled mode hasn't been set one way or the other, set the default + # depending on whether or not we are the top-level project. + if(BROTLI_PARENT_DIRECTORY) + set(BROTLI_BUNDLED_MODE OFF) + else() + set(BROTLI_BUNDLED_MODE ON) + endif() +endif() +mark_as_advanced(BROTLI_BUNDLED_MODE) + +include(GNUInstallDirs) + +# Parse version information from common/version.h. Normally we would +# define these values here and write them out to configuration file(s) +# (i.e., config.h), but in this case we parse them from +# common/version.h to be less intrusive. +function(hex_to_dec HEXADECIMAL DECIMAL) + string(TOUPPER "${HEXADECIMAL}" _tail) + set(_decimal 0) + string(LENGTH "${_tail}" _tail_length) + while (_tail_length GREATER 0) + math(EXPR _decimal "${_decimal} * 16") + string(SUBSTRING "${_tail}" 0 1 _digit) + string(SUBSTRING "${_tail}" 1 -1 _tail) + if (_digit STREQUAL "A") + math(EXPR _decimal "${_decimal} + 10") + elseif (_digit STREQUAL "B") + math(EXPR _decimal "${_decimal} + 11") + elseif (_digit STREQUAL "C") + math(EXPR _decimal "${_decimal} + 12") + elseif (_digit STREQUAL "D") + math(EXPR _decimal "${_decimal} + 13") + elseif (_digit STREQUAL "E") + math(EXPR _decimal "${_decimal} + 14") + elseif (_digit STREQUAL "F") + math(EXPR _decimal "${_decimal} + 15") + else() + math(EXPR _decimal "${_decimal} + ${_digit}") + endif() + string(LENGTH "${_tail}" _tail_length) + endwhile() + set(${DECIMAL} ${_decimal} PARENT_SCOPE) +endfunction(hex_to_dec) + +# Version information +file(STRINGS "c/common/version.h" _brotli_version_line REGEX "^#define BROTLI_VERSION (0x[0-9a-fA-F]+)$") +string(REGEX REPLACE "^#define BROTLI_VERSION 0x([0-9a-fA-F]+)$" "\\1" _brotli_version_hex "${_brotli_version_line}") +hex_to_dec("${_brotli_version_hex}" _brotli_version) +math(EXPR BROTLI_VERSION_MAJOR "${_brotli_version} >> 24") +math(EXPR BROTLI_VERSION_MINOR "(${_brotli_version} >> 12) & 4095") +math(EXPR BROTLI_VERSION_PATCH "${_brotli_version} & 4095") +set(BROTLI_VERSION "${BROTLI_VERSION_MAJOR}.${BROTLI_VERSION_MINOR}.${BROTLI_VERSION_PATCH}") +mark_as_advanced(BROTLI_VERSION BROTLI_VERSION_MAJOR BROTLI_VERSION_MINOR BROTLI_VERSION_PATCH) + +# ABI Version information +file(STRINGS "c/common/version.h" _brotli_abi_info_line REGEX "^#define BROTLI_ABI_VERSION (0x[0-9a-fA-F]+)$") +string(REGEX REPLACE "^#define BROTLI_ABI_VERSION 0x([0-9a-fA-F]+)$" "\\1" _brotli_abi_info_hex "${_brotli_abi_info_line}") +hex_to_dec("${_brotli_abi_info_hex}" _brotli_abi_info) +math(EXPR BROTLI_ABI_CURRENT "${_brotli_abi_info} >> 24") +math(EXPR BROTLI_ABI_REVISION "(${_brotli_abi_info} >> 12) & 4095") +math(EXPR BROTLI_ABI_AGE "${_brotli_abi_info} & 4095") +math(EXPR BROTLI_ABI_COMPATIBILITY "${BROTLI_ABI_CURRENT} - ${BROTLI_ABI_AGE}") +mark_as_advanced(BROTLI_ABI_CURRENT BROTLI_ABI_REVISION BROTLI_ABI_AGE BROTLI_ABI_COMPATIBILITY) + +if (ENABLE_SANITIZER) + set(CMAKE_C_FLAGS " ${CMAKE_C_FLAGS} -fsanitize=${ENABLE_SANITIZER}") + set(CMAKE_CXX_FLAGS " ${CMAKE_CXX_FLAGS} -fsanitize=${ENABLE_SANITIZER}") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${ENABLE_SANITIZER}") + + # By default, brotli depends on undefined behavior, but setting + # BROTLI_BUILD_PORTABLE should result in a build which does not. + if(ENABLE_SANITIZER STREQUAL "undefined") + add_definitions(-DBROTLI_BUILD_PORTABLE) + endif() +endif () + +include(CheckFunctionExists) +set(LIBM_LIBRARY) +CHECK_FUNCTION_EXISTS(log2 LOG2_RES) +if(NOT LOG2_RES) + set(orig_req_libs "${CMAKE_REQUIRED_LIBRARIES}") + set(CMAKE_REQUIRED_LIBRARIES "${CMAKE_REQUIRED_LIBRARIES};m") + CHECK_FUNCTION_EXISTS(log2 LOG2_LIBM_RES) + if(LOG2_LIBM_RES) + set(LIBM_LIBRARY "m") + else() + message(FATAL_ERROR "log2() not found") + endif() + + set(CMAKE_REQUIRED_LIBRARIES "${orig_req_libs}") + unset(LOG2_LIBM_RES) + unset(orig_req_libs) +endif() +unset(LOG2_RES) + +set(BROTLI_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/c/include") +mark_as_advanced(BROTLI_INCLUDE_DIRS) + +set(BROTLI_LIBRARIES_CORE brotlienc brotlidec brotlicommon) +set(BROTLI_LIBRARIES ${BROTLI_LIBRARIES_CORE} ${LIBM_LIBRARY}) +mark_as_advanced(BROTLI_LIBRARIES) + +set(BROTLI_LIBRARIES_CORE_STATIC brotlienc-static brotlidec-static brotlicommon-static) +set(BROTLI_LIBRARIES_STATIC ${BROTLI_LIBRARIES_CORE_STATIC} ${LIBM_LIBRARY}) +mark_as_advanced(BROTLI_LIBRARIES_STATIC) + +if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") + add_definitions(-DOS_LINUX) +elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") + add_definitions(-DOS_FREEBSD) +elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + add_definitions(-DOS_MACOSX) +endif() + +function(transform_sources_list INPUT_FILE OUTPUT_FILE) + file(READ ${INPUT_FILE} TEXT) + string(REGEX REPLACE "\\\\\n" "~continuation~" TEXT ${TEXT}) + string(REGEX REPLACE "([a-zA-Z_][a-zA-Z0-9_]*)[\t ]*=[\t ]*([^\n]*)" "SET(\\1 \\2)" TEXT ${TEXT}) + string(REPLACE "~continuation~" "\n" TEXT ${TEXT}) + file(WRITE ${OUTPUT_FILE} ${TEXT}) +endfunction() + +transform_sources_list("scripts/sources.lst" "${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake") +include("${CMAKE_CURRENT_BINARY_DIR}/sources.lst.cmake") + +add_library(brotlicommon SHARED ${BROTLI_COMMON_C}) +add_library(brotlidec SHARED ${BROTLI_DEC_C}) +add_library(brotlienc SHARED ${BROTLI_ENC_C}) + +add_library(brotlicommon-static STATIC ${BROTLI_COMMON_C}) +add_library(brotlidec-static STATIC ${BROTLI_DEC_C}) +add_library(brotlienc-static STATIC ${BROTLI_ENC_C}) + +# Older CMake versions does not understand INCLUDE_DIRECTORIES property. +include_directories(${BROTLI_INCLUDE_DIRS}) + +foreach(lib brotlicommon brotlidec brotlienc) + target_compile_definitions(${lib} PUBLIC "BROTLI_SHARED_COMPILATION" ) + string(TOUPPER "${lib}" LIB) + set_target_properties (${lib} PROPERTIES DEFINE_SYMBOL "${LIB}_SHARED_COMPILATION" ) +endforeach() + +foreach(lib brotlicommon brotlidec brotlienc brotlicommon-static brotlidec-static brotlienc-static) + target_link_libraries(${lib} ${LIBM_LIBRARY}) + set_property(TARGET ${lib} APPEND PROPERTY INCLUDE_DIRECTORIES ${BROTLI_INCLUDE_DIRS}) + set_target_properties(${lib} PROPERTIES + VERSION "${BROTLI_ABI_COMPATIBILITY}.${BROTLI_ABI_AGE}.${BROTLI_ABI_REVISION}" + SOVERSION "${BROTLI_ABI_COMPATIBILITY}" + POSITION_INDEPENDENT_CODE TRUE) + set_property(TARGET ${lib} APPEND PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${BROTLI_INCLUDE_DIRS}") +endforeach() + +target_link_libraries(brotlidec brotlicommon) +target_link_libraries(brotlienc brotlicommon) + +target_link_libraries(brotlidec-static brotlicommon-static) +target_link_libraries(brotlienc-static brotlicommon-static) + +# For projects stuck on older versions of CMake, this will set the +# BROTLI_INCLUDE_DIRS and BROTLI_LIBRARIES variables so they still +# have a relatively easy way to use Brotli: +# +# include_directories(${BROTLI_INCLUDE_DIRS}) +# target_link_libraries(foo ${BROTLI_LIBRARIES}) +if(BROTLI_PARENT_DIRECTORY) + set(BROTLI_INCLUDE_DIRS "${BROTLI_INCLUDE_DIRS}" PARENT_SCOPE) + set(BROTLI_LIBRARIES "${BROTLI_LIBRARIES}" PARENT_SCOPE) +endif() + +# Build the brotli executable +add_executable(brotli ${BROTLI_CLI_C}) +target_link_libraries(brotli ${BROTLI_LIBRARIES_STATIC}) + +# Installation +if(NOT BROTLI_BUNDLED_MODE) + install( + TARGETS brotli + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ) + + install( + TARGETS ${BROTLI_LIBRARIES_CORE} + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ) + + install( + TARGETS ${BROTLI_LIBRARIES_CORE_STATIC} + ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" + LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" + RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" + ) + + install( + DIRECTORY ${BROTLI_INCLUDE_DIRS}/brotli + DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" + ) +endif() + +# Tests + +# If we're targeting Windows but not running on Windows, we need Wine +# to run the tests... +if(NOT BROTLI_DISABLE_TESTS) + if(WIN32 AND NOT CMAKE_HOST_WIN32) + find_program(BROTLI_WINE NAMES wine) + + if(NOT BROTLI_WINE) + message(STATUS "wine not found, disabling tests") + set(BROTLI_DISABLE_TESTS TRUE) + endif() + endif() +endif() + +if(NOT BROTLI_DISABLE_TESTS) + include(CTest) + enable_testing() + + set(ROUNDTRIP_INPUTS + tests/testdata/alice29.txt + tests/testdata/asyoulik.txt + tests/testdata/lcet10.txt + tests/testdata/plrabn12.txt + c/enc/encode.c + c/common/dictionary.h + c/dec/decode.c) + + foreach(INPUT ${ROUNDTRIP_INPUTS}) + get_filename_component(OUTPUT_NAME "${INPUT}" NAME) + + set(OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_NAME}") + set(INPUT_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${INPUT}") + + foreach(quality 1 6 9 11) + add_test(NAME "${BROTLI_TEST_PREFIX}roundtrip/${INPUT}/${quality}" + COMMAND "${CMAKE_COMMAND}" + -DBROTLI_WRAPPER=${BROTLI_WINE} + -DBROTLI_CLI=$ + -DQUALITY=${quality} + -DINPUT=${INPUT_FILE} + -DOUTPUT=${OUTPUT_FILE}.${quality} + -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/run-roundtrip-test.cmake) + endforeach() + endforeach() + + file(GLOB_RECURSE + COMPATIBILITY_INPUTS + RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} + tests/testdata/*.compressed*) + + foreach(INPUT ${COMPATIBILITY_INPUTS}) + add_test(NAME "${BROTLI_TEST_PREFIX}compatibility/${INPUT}" + COMMAND "${CMAKE_COMMAND}" + -DBROTLI_WRAPPER=${BROTLI_WINE} + -DBROTLI_CLI=$ + -DINPUT=${CMAKE_CURRENT_SOURCE_DIR}/${INPUT} + -P ${CMAKE_CURRENT_SOURCE_DIR}/tests/run-compatibility-test.cmake) + endforeach() +endif() + +# Generate a pkg-config files + +function(generate_pkg_config_path outvar path) + string(LENGTH "${path}" path_length) + + set(path_args ${ARGV}) + list(REMOVE_AT path_args 0 1) + list(LENGTH path_args path_args_remaining) + + set("${outvar}" "${path}") + + while(path_args_remaining GREATER 1) + list(GET path_args 0 name) + list(GET path_args 1 value) + + get_filename_component(value_full "${value}" ABSOLUTE) + string(LENGTH "${value}" value_length) + + if(path_length EQUAL value_length AND path STREQUAL value) + set("${outvar}" "\${${name}}") + break() + elseif(path_length GREATER value_length) + # We might be in a subdirectory of the value, but we have to be + # careful about a prefix matching but not being a subdirectory + # (for example, /usr/lib64 is not a subdirectory of /usr/lib). + # We'll do this by making sure the next character is a directory + # separator. + string(SUBSTRING "${path}" ${value_length} 1 sep) + if(sep STREQUAL "/") + string(SUBSTRING "${path}" 0 ${value_length} s) + if(s STREQUAL value) + string(SUBSTRING "${path}" "${value_length}" -1 suffix) + set("${outvar}" "\${${name}}${suffix}") + break() + endif() + endif() + endif() + + list(REMOVE_AT path_args 0 1) + list(LENGTH path_args path_args_remaining) + endwhile() + + set("${outvar}" "${${outvar}}" PARENT_SCOPE) +endfunction(generate_pkg_config_path) + +function(transform_pc_file INPUT_FILE OUTPUT_FILE VERSION) + file(READ ${INPUT_FILE} TEXT) + + set(PREFIX "${CMAKE_INSTALL_PREFIX}") + string(REGEX REPLACE "@prefix@" "${PREFIX}" TEXT ${TEXT}) + string(REGEX REPLACE "@exec_prefix@" "${PREFIX}" TEXT ${TEXT}) + + generate_pkg_config_path(LIBDIR "${CMAKE_INSTALL_FULL_LIBDIR}" prefix "${PREFIX}") + string(REGEX REPLACE "@libdir@" "${LIBDIR}" TEXT ${TEXT}) + + generate_pkg_config_path(INCLUDEDIR "${CMAKE_INSTALL_FULL_INCLUDEDIR}" prefix "${PREFIX}") + string(REGEX REPLACE "@includedir@" "${INCLUDEDIR}" TEXT ${TEXT}) + + string(REGEX REPLACE "@PACKAGE_VERSION@" "${VERSION}" TEXT ${TEXT}) + + file(WRITE ${OUTPUT_FILE} ${TEXT}) +endfunction() + +transform_pc_file("scripts/libbrotlicommon.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc" "${BROTLI_VERSION}") + +transform_pc_file("scripts/libbrotlidec.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc" "${BROTLI_VERSION}") + +transform_pc_file("scripts/libbrotlienc.pc.in" "${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc" "${BROTLI_VERSION}") + +if(NOT BROTLI_BUNDLED_MODE) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlicommon.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlidec.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/libbrotlienc.pc" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig") +endif() + +if (ENABLE_COVERAGE STREQUAL "yes") + SETUP_TARGET_FOR_COVERAGE(coverage test coverage) +endif () diff --git a/app/src/main/cpp/woff2/brotli/CONTRIBUTING.md b/app/src/main/cpp/woff2/brotli/CONTRIBUTING.md new file mode 100644 index 0000000..a00e37d --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/CONTRIBUTING.md @@ -0,0 +1,27 @@ +Want to contribute? Great! First, read this page (including the small print at +the end). + +### Before you contribute +Before we can use your code, you must sign the +[Google Individual Contributor License Agreement] +(https://cla.developers.google.com/about/google-individual) +(CLA), which you can do online. The CLA is necessary mainly because you own the +copyright to your changes, even after your contribution becomes part of our +codebase, so we need your permission to use and distribute your code. We also +need to be sure of various other things—for instance that you'll tell us if you +know that your code infringes on other people's patents. You don't have to sign +the CLA until after you've submitted your code for review and a member has +approved it, but you must do it before we can put your code into our codebase. +Before you start working on a larger contribution, you should get in touch with +us first through the issue tracker with your idea so that we can help out and +possibly guide you. Coordinating up front makes it much easier to avoid +frustration later on. + +### Code reviews +All submissions, including submissions by project members, require review. We +use Github pull requests for this purpose. + +### The small print +Contributions made by corporations are covered by a different agreement than +the one above, the [Software Grant and Corporate Contributor License Agreement] +(https://cla.developers.google.com/about/google-corporate). diff --git a/app/src/main/cpp/woff2/brotli/LICENSE b/app/src/main/cpp/woff2/brotli/LICENSE new file mode 100644 index 0000000..33b7cdd --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2009, 2010, 2013-2016 by the Brotli Authors. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/app/src/main/cpp/woff2/brotli/MANIFEST.in b/app/src/main/cpp/woff2/brotli/MANIFEST.in new file mode 100644 index 0000000..b7b8e72 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/MANIFEST.in @@ -0,0 +1,17 @@ +include CONTRIBUTING.md +include c/common/*.c +include c/common/*.h +include c/dec/*.c +include c/dec/*.h +include c/enc/*.c +include c/enc/*.h +include c/include/brotli/*.h +include LICENSE +include MANIFEST.in +include python/_brotli.cc +include python/bro.py +include python/brotli.py +include python/README.md +include README.md +include setup.py +include c/tools/brotli.c diff --git a/app/src/main/cpp/woff2/brotli/Makefile b/app/src/main/cpp/woff2/brotli/Makefile new file mode 100644 index 0000000..c48d798 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/Makefile @@ -0,0 +1,43 @@ +OS := $(shell uname) +LIBSOURCES = $(wildcard c/common/*.c) $(wildcard c/dec/*.c) \ + $(wildcard c/enc/*.c) +SOURCES = $(LIBSOURCES) c/tools/brotli.c +BINDIR = bin +OBJDIR = $(BINDIR)/obj +LIBOBJECTS = $(addprefix $(OBJDIR)/, $(LIBSOURCES:.c=.o)) +OBJECTS = $(addprefix $(OBJDIR)/, $(SOURCES:.c=.o)) +LIB_A = libbrotli.a +EXECUTABLE = brotli +DIRS = $(OBJDIR)/c/common $(OBJDIR)/c/dec $(OBJDIR)/c/enc \ + $(OBJDIR)/c/tools $(BINDIR)/tmp +CFLAGS += -O2 +ifeq ($(os), Darwin) + CPPFLAGS += -DOS_MACOSX +endif + +all: test + @: + +.PHONY: all clean test + +$(DIRS): + mkdir -p $@ + +$(EXECUTABLE): $(OBJECTS) + $(CC) $(LDFLAGS) $(OBJECTS) -lm -o $(BINDIR)/$(EXECUTABLE) + +lib: $(LIBOBJECTS) + rm -f $(LIB_A) + ar -crs $(LIB_A) $(LIBOBJECTS) + +test: $(EXECUTABLE) + tests/compatibility_test.sh + tests/roundtrip_test.sh + +clean: + rm -rf $(BINDIR) $(LIB_A) + +.SECONDEXPANSION: +$(OBJECTS): $$(patsubst %.o,%.c,$$(patsubst $$(OBJDIR)/%,%,$$@)) | $(DIRS) + $(CC) $(CFLAGS) $(CPPFLAGS) -Ic/include \ + -c $(patsubst %.o,%.c,$(patsubst $(OBJDIR)/%,%,$@)) -o $@ diff --git a/app/src/main/cpp/woff2/brotli/Makefile.am b/app/src/main/cpp/woff2/brotli/Makefile.am new file mode 100644 index 0000000..ace7a85 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/Makefile.am @@ -0,0 +1,38 @@ +AUTOMAKE_OPTIONS = foreign nostdinc subdir-objects + +ACLOCAL_AMFLAGS = -I m4 + +# Actual ABI version is substituted by bootstrap +LIBBROTLI_VERSION_INFO = -version-info 0:0:0 + +bin_PROGRAMS = brotli +lib_LTLIBRARIES = libbrotlicommon.la libbrotlidec.la libbrotlienc.la + +include scripts/sources.lst + +brotliincludedir = $(includedir)/brotli +brotliinclude_HEADERS = $(BROTLI_INCLUDE) + +AM_CFLAGS = -I$(top_srcdir)/c/include + +brotli_SOURCES = $(BROTLI_CLI_C) +brotli_LDADD = libbrotlidec.la libbrotlienc.la libbrotlicommon.la -lm +#brotli_LDFLAGS = -static + +libbrotlicommon_la_SOURCES = $(BROTLI_COMMON_C) $(BROTLI_COMMON_H) +libbrotlicommon_la_LDFLAGS = $(AM_LDFLAGS) $(LIBBROTLI_VERSION_INFO) $(LDFLAGS) +libbrotlidec_la_SOURCES = $(BROTLI_DEC_C) $(BROTLI_DEC_H) +libbrotlidec_la_LDFLAGS = $(AM_LDFLAGS) $(LIBBROTLI_VERSION_INFO) $(LDFLAGS) +libbrotlidec_la_LIBADD = libbrotlicommon.la -lm +libbrotlienc_la_SOURCES = $(BROTLI_ENC_C) $(BROTLI_ENC_H) +libbrotlienc_la_LDFLAGS = $(AM_LDFLAGS) $(LIBBROTLI_VERSION_INFO) $(LDFLAGS) +libbrotlienc_la_LIBADD = libbrotlicommon.la -lm + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = \ + scripts/libbrotlicommon.pc \ + scripts/libbrotlidec.pc \ + scripts/libbrotlienc.pc +pkgincludedir= $(brotliincludedir) + +dist_doc_DATA = README diff --git a/app/src/main/cpp/woff2/brotli/README b/app/src/main/cpp/woff2/brotli/README new file mode 100644 index 0000000..3fb3f22 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/README @@ -0,0 +1,15 @@ +BROTLI DATA COMPRESSIOM LIBRARY + +Brotli is a generic-purpose lossless compression algorithm that compresses data +using a combination of a modern variant of the LZ77 algorithm, Huffman coding +and 2nd order context modeling, with a compression ratio comparable to the best +currently available general-purpose compression methods. It is similar in speed +with deflate but offers more dense compression. + +The specification of the Brotli Compressed Data Format is defined in RFC 7932 +https://tools.ietf.org/html/rfc7932 + +Brotli is open-sourced under the MIT License, see the LICENSE file. + +Brotli mailing list: +https://groups.google.com/forum/#!forum/brotli diff --git a/app/src/main/cpp/woff2/brotli/README.md b/app/src/main/cpp/woff2/brotli/README.md new file mode 100644 index 0000000..6b9b0cf --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/README.md @@ -0,0 +1,83 @@ +

Brotli

+ +### Introduction + +Brotli is a generic-purpose lossless compression algorithm that compresses data +using a combination of a modern variant of the LZ77 algorithm, Huffman coding +and 2nd order context modeling, with a compression ratio comparable to the best +currently available general-purpose compression methods. It is similar in speed +with deflate but offers more dense compression. + +The specification of the Brotli Compressed Data Format is defined in [RFC 7932](https://tools.ietf.org/html/rfc7932). + +Brotli is open-sourced under the MIT License, see the LICENSE file. + +Brotli mailing list: +https://groups.google.com/forum/#!forum/brotli + +[![TravisCI Build Status](https://travis-ci.org/google/brotli.svg?branch=master)](https://travis-ci.org/google/brotli) +[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/github/google/brotli?branch=master&svg=true)](https://ci.appveyor.com/project/szabadka/brotli) + +### Build instructions + +#### Autotools-style CMake + +[configure-cmake](https://github.com/nemequ/configure-cmake) is an +autotools-style configure script for CMake-based projects (not supported on Windows). + +The basic commands to build, test and install brotli are: + + $ mkdir out && cd out + $ ../configure-cmake + $ make + $ make test + $ make install + +By default, debug binaries are built. To generate "release" `Makefile` specify `--disable-debug` option to `configure-cmake`. + +#### Bazel + +See [Bazel](http://www.bazel.build/) + +#### CMake + +The basic commands to build and install brotli are: + + $ mkdir out && cd out + $ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=./installed .. + $ cmake --build . --config Release --target install + +You can use other [CMake](https://cmake.org/) configuration. + +#### Premake5 + +See [Premake5](https://premake.github.io/) + +#### Python + +To install the latest release of the Python module, run the following: + + $ pip install brotli + +To install the tip-of-the-tree version, run: + + $ pip install --upgrade git+https://github.com/google/brotli + +See the [Python readme](python/README.md) for more details on installing +from source, development, and testing. + +### Benchmarks +* [Squash Compression Benchmark](https://quixdb.github.io/squash-benchmark/) / [Unstable Squash Compression Benchmark](https://quixdb.github.io/squash-benchmark/unstable/) +* [Large Text Compression Benchmark](http://mattmahoney.net/dc/text.html) +* [Lzturbo Benchmark](https://sites.google.com/site/powturbo/home/benchmark) + +### Related projects +> **Disclaimer:** Brotli authors take no responsibility for the third party projects mentioned in this section. + +Independent [decoder](https://github.com/madler/brotli) implementation by Mark Adler, based entirely on format specification. + +JavaScript port of brotli [decoder](https://github.com/devongovett/brotli.js). Could be used directly via `npm install brotli` + +Hand ported [decoder / encoder](https://github.com/dominikhlbg/BrotliHaxe) in haxe by Dominik Homberger. Output source code: JavaScript, PHP, Python, Java and C# + +7Zip [plugin](https://github.com/mcmilk/7-Zip-Zstd) diff --git a/app/src/main/cpp/woff2/brotli/WORKSPACE b/app/src/main/cpp/woff2/brotli/WORKSPACE new file mode 100644 index 0000000..59c1c4f --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/WORKSPACE @@ -0,0 +1,96 @@ +# Description: +# Bazel workspace file for Brotli. + +workspace(name = "org_brotli") + +maven_jar( + name = "junit_junit", + artifact = "junit:junit:4.12", +) + +git_repository( + name = "io_bazel_rules_go", + remote = "https://github.com/bazelbuild/rules_go.git", + tag = "0.9.0", +) + +http_archive( + name = "io_bazel_rules_closure", + sha256 = "6691c58a2cd30a86776dd9bb34898b041e37136f2dc7e24cadaeaf599c95c657", + strip_prefix = "rules_closure-08039ba8ca59f64248bb3b6ae016460fe9c9914f", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/rules_closure/archive/08039ba8ca59f64248bb3b6ae016460fe9c9914f.tar.gz", + "https://github.com/bazelbuild/rules_closure/archive/08039ba8ca59f64248bb3b6ae016460fe9c9914f.tar.gz", # 2018-01-16 + ], +) + +new_http_archive( + name = "openjdk_linux", + urls = [ + "https://mirror.bazel.build/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-linux_x64.tar.gz", + "https://bazel-mirror.storage.googleapis.com/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-linux_x64.tar.gz", + "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-linux_x64.tar.gz", + ], + sha256 = "7e6284739c0e5b7142bc7a9adc61ced70dc5bb26b130b582b18e809013bcb251", + build_file_content = """ +package( + default_visibility = ["//visibility:public"], +) +filegroup( + name = "jni_h", + srcs = ["zulu8.23.0.3-jdk8.0.144-linux_x64/include/jni.h"], +) +filegroup( + name = "jni_md_h", + srcs = ["zulu8.23.0.3-jdk8.0.144-linux_x64/include/linux/jni_md.h"], +)""", +) + +new_http_archive( + name = "openjdk_macos", + urls = [ + "https://mirror.bazel.build/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-macosx_x64.zip", + "https://bazel-mirror.storage.googleapis.com/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-macosx_x64.zip", + "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-macosx_x64.zip", + ], + sha256 = "ff533364c9cbd3b271ab5328efe28e2dd6d7bae5b630098a5683f742ecf0709d", + build_file_content = """ +package( + default_visibility = ["//visibility:public"], +) +filegroup( + name = "jni_md_h", + srcs = ["zulu8.23.0.3-jdk8.0.144-macosx_x64/include/darwin/jni_md.h"], +)""", +) + +new_http_archive( + name = "openjdk_win", + urls = [ + "https://mirror.bazel.build/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-win_x64.zip", + "https://bazel-mirror.storage.googleapis.com/openjdk/azul-zulu-8.23.0.3-jdk8.0.144/zulu8.23.0.3-jdk8.0.144-win_x64.zip", + "https://cdn.azul.com/zulu/bin/zulu8.23.0.3-jdk8.0.144-win_x64.zip", + ], + sha256 = "f1d9d3341ef7c8c9baff3597953e99a6a7c64f8608ee62c03fdd7574b7655c02", + build_file_content = """ +package( + default_visibility = ["//visibility:public"], +) +filegroup( + name = "jni_md_h", + srcs = ["zulu8.23.0.3-jdk8.0.144-win_x64/include/win32/jni_md.h"], +)""", +) + +new_local_repository( + name = "divsufsort", + build_file = "//research:BUILD.libdivsufsort", + path = "research/libdivsufsort", +) + +load("@io_bazel_rules_closure//closure:defs.bzl", "closure_repositories") +closure_repositories() + +load("@io_bazel_rules_go//go:def.bzl", "go_rules_dependencies", "go_register_toolchains") +go_rules_dependencies() +go_register_toolchains() diff --git a/app/src/main/cpp/woff2/brotli/bootstrap b/app/src/main/cpp/woff2/brotli/bootstrap new file mode 100644 index 0000000..64aca2c --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/bootstrap @@ -0,0 +1,31 @@ +# !/bin/sh -e + +REQUIRED='is required, but not installed.' +bc -v >/dev/null 2>&1 || { echo >&2 "'bc' $REQUIRED"; exit 1; } +if [ `uname -s` != "FreeBSD" ]; then +sed --version >/dev/null 2>&1 || { echo >&2 "'sed' $REQUIRED"; exit 1; } +fi +autoreconf --version >/dev/null 2>&1 || { echo >&2 "'autoconf' $REQUIRED"; exit 1; } + +# If libtool is not installed -> "error: Libtool library used but 'LIBTOOL' is undefined" + +mkdir m4 2>/dev/null + +BROTLI_ABI_HEX=`sed -n 's/#define BROTLI_ABI_VERSION 0x//p' c/common/version.h` +BROTLI_ABI_INT=`echo "ibase=16;$BROTLI_ABI_HEX" | bc` +BROTLI_ABI_CURRENT=`expr $BROTLI_ABI_INT / 16777216` +BROTLI_ABI_REVISION=`expr $BROTLI_ABI_INT / 4096 % 4096` +BROTLI_ABI_AGE=`expr $BROTLI_ABI_INT % 4096` +BROTLI_ABI_INFO="$BROTLI_ABI_CURRENT:$BROTLI_ABI_REVISION:$BROTLI_ABI_AGE" + +BROTLI_VERSION_HEX=`sed -n 's/#define BROTLI_VERSION 0x//p' c/common/version.h` +BROTLI_VERSION_INT=`echo "ibase=16;$BROTLI_VERSION_HEX" | bc` +BROTLI_VERSION_MAJOR=`expr $BROTLI_VERSION_INT / 16777216` +BROTLI_VERSION_MINOR=`expr $BROTLI_VERSION_INT / 4096 % 4096` +BROTLI_VERSION_PATCH=`expr $BROTLI_VERSION_INT % 4096` +BROTLI_VERSION="$BROTLI_VERSION_MAJOR.$BROTLI_VERSION_MINOR.$BROTLI_VERSION_PATCH" + +sed -i.bak -r "s/[0-9]+:[0-9]+:[0-9]+/$BROTLI_ABI_INFO/" Makefile.am +sed -i.bak -r "s/\[[0-9]+\.[0-9]+\.[0-9]+\]/[$BROTLI_VERSION]/" configure.ac + +autoreconf --install --force --symlink || exit $ diff --git a/app/src/main/cpp/woff2/brotli/c/common/constants.h b/app/src/main/cpp/woff2/brotli/c/common/constants.h new file mode 100644 index 0000000..26edcd5 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/c/common/constants.h @@ -0,0 +1,64 @@ +/* Copyright 2016 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +#ifndef BROTLI_COMMON_CONSTANTS_H_ +#define BROTLI_COMMON_CONSTANTS_H_ + +/* Specification: 7.3. Encoding of the context map */ +#define BROTLI_CONTEXT_MAP_MAX_RLE 16 + +/* Specification: 2. Compressed representation overview */ +#define BROTLI_MAX_NUMBER_OF_BLOCK_TYPES 256 + +/* Specification: 3.3. Alphabet sizes: insert-and-copy length */ +#define BROTLI_NUM_LITERAL_SYMBOLS 256 +#define BROTLI_NUM_COMMAND_SYMBOLS 704 +#define BROTLI_NUM_BLOCK_LEN_SYMBOLS 26 +#define BROTLI_MAX_CONTEXT_MAP_SYMBOLS (BROTLI_MAX_NUMBER_OF_BLOCK_TYPES + \ + BROTLI_CONTEXT_MAP_MAX_RLE) +#define BROTLI_MAX_BLOCK_TYPE_SYMBOLS (BROTLI_MAX_NUMBER_OF_BLOCK_TYPES + 2) + +/* Specification: 3.5. Complex prefix codes */ +#define BROTLI_REPEAT_PREVIOUS_CODE_LENGTH 16 +#define BROTLI_REPEAT_ZERO_CODE_LENGTH 17 +#define BROTLI_CODE_LENGTH_CODES (BROTLI_REPEAT_ZERO_CODE_LENGTH + 1) +/* "code length of 8 is repeated" */ +#define BROTLI_INITIAL_REPEATED_CODE_LENGTH 8 + +/* "Large Window Brotli" */ +#define BROTLI_LARGE_MAX_DISTANCE_BITS 62U +#define BROTLI_LARGE_MIN_WBITS 10 +#define BROTLI_LARGE_MAX_WBITS 30 + +/* Specification: 4. Encoding of distances */ +#define BROTLI_NUM_DISTANCE_SHORT_CODES 16 +#define BROTLI_MAX_NPOSTFIX 3 +#define BROTLI_MAX_NDIRECT 120 +#define BROTLI_MAX_DISTANCE_BITS 24U +#define BROTLI_DISTANCE_ALPHABET_SIZE(NDIRECT, NPOSTFIX, MAXNBITS) ( \ + BROTLI_NUM_DISTANCE_SHORT_CODES + (NDIRECT) + \ + ((MAXNBITS) << ((NPOSTFIX) + 1))) +/* BROTLI_NUM_DISTANCE_SYMBOLS == 1128 */ +#define BROTLI_NUM_DISTANCE_SYMBOLS \ + BROTLI_DISTANCE_ALPHABET_SIZE( \ + BROTLI_MAX_NDIRECT, BROTLI_MAX_NPOSTFIX, BROTLI_LARGE_MAX_DISTANCE_BITS) +#define BROTLI_MAX_DISTANCE 0x3FFFFFC +#define BROTLI_MAX_ALLOWED_DISTANCE 0x7FFFFFFC + +/* 7.1. Context modes and context ID lookup for literals */ +/* "context IDs for literals are in the range of 0..63" */ +#define BROTLI_LITERAL_CONTEXT_BITS 6 + +/* 7.2. Context ID for distances */ +#define BROTLI_DISTANCE_CONTEXT_BITS 2 + +/* 9.1. Format of the Stream Header */ +/* Number of slack bytes for window size. Don't confuse + with BROTLI_NUM_DISTANCE_SHORT_CODES. */ +#define BROTLI_WINDOW_GAP 16 +#define BROTLI_MAX_BACKWARD_LIMIT(W) (((size_t)1 << (W)) - BROTLI_WINDOW_GAP) + +#endif /* BROTLI_COMMON_CONSTANTS_H_ */ diff --git a/app/src/main/cpp/woff2/brotli/c/common/context.h b/app/src/main/cpp/woff2/brotli/c/common/context.h new file mode 100644 index 0000000..24b3eb4 --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/c/common/context.h @@ -0,0 +1,261 @@ +/* Copyright 2013 Google Inc. All Rights Reserved. + + Distributed under MIT license. + See file LICENSE for detail or copy at https://opensource.org/licenses/MIT +*/ + +/* Lookup table to map the previous two bytes to a context id. + + There are four different context modeling modes defined here: + CONTEXT_LSB6: context id is the least significant 6 bits of the last byte, + CONTEXT_MSB6: context id is the most significant 6 bits of the last byte, + CONTEXT_UTF8: second-order context model tuned for UTF8-encoded text, + CONTEXT_SIGNED: second-order context model tuned for signed integers. + + If |p1| and |p2| are the previous two bytes, and |mode| is current context + mode, we calculate the context as: + + context = ContextLut(mode)[p1] | ContextLut(mode)[p2 + 256]. + + For CONTEXT_UTF8 mode, if the previous two bytes are ASCII characters + (i.e. < 128), this will be equivalent to + + context = 4 * context1(p1) + context2(p2), + + where context1 is based on the previous byte in the following way: + + 0 : non-ASCII control + 1 : \t, \n, \r + 2 : space + 3 : other punctuation + 4 : " ' + 5 : % + 6 : ( < [ { + 7 : ) > ] } + 8 : , ; : + 9 : . + 10 : = + 11 : number + 12 : upper-case vowel + 13 : upper-case consonant + 14 : lower-case vowel + 15 : lower-case consonant + + and context2 is based on the second last byte: + + 0 : control, space + 1 : punctuation + 2 : upper-case letter, number + 3 : lower-case letter + + If the last byte is ASCII, and the second last byte is not (in a valid UTF8 + stream it will be a continuation byte, value between 128 and 191), the + context is the same as if the second last byte was an ASCII control or space. + + If the last byte is a UTF8 lead byte (value >= 192), then the next byte will + be a continuation byte and the context id is 2 or 3 depending on the LSB of + the last byte and to a lesser extent on the second last byte if it is ASCII. + + If the last byte is a UTF8 continuation byte, the second last byte can be: + - continuation byte: the next byte is probably ASCII or lead byte (assuming + 4-byte UTF8 characters are rare) and the context id is 0 or 1. + - lead byte (192 - 207): next byte is ASCII or lead byte, context is 0 or 1 + - lead byte (208 - 255): next byte is continuation byte, context is 2 or 3 + + The possible value combinations of the previous two bytes, the range of + context ids and the type of the next byte is summarized in the table below: + + |--------\-----------------------------------------------------------------| + | \ Last byte | + | Second \---------------------------------------------------------------| + | last byte \ ASCII | cont. byte | lead byte | + | \ (0-127) | (128-191) | (192-) | + |=============|===================|=====================|==================| + | ASCII | next: ASCII/lead | not valid | next: cont. | + | (0-127) | context: 4 - 63 | | context: 2 - 3 | + |-------------|-------------------|---------------------|------------------| + | cont. byte | next: ASCII/lead | next: ASCII/lead | next: cont. | + | (128-191) | context: 4 - 63 | context: 0 - 1 | context: 2 - 3 | + |-------------|-------------------|---------------------|------------------| + | lead byte | not valid | next: ASCII/lead | not valid | + | (192-207) | | context: 0 - 1 | | + |-------------|-------------------|---------------------|------------------| + | lead byte | not valid | next: cont. | not valid | + | (208-) | | context: 2 - 3 | | + |-------------|-------------------|---------------------|------------------| +*/ + +#ifndef BROTLI_COMMON_CONTEXT_H_ +#define BROTLI_COMMON_CONTEXT_H_ + +#include + +typedef enum ContextType { + CONTEXT_LSB6 = 0, + CONTEXT_MSB6 = 1, + CONTEXT_UTF8 = 2, + CONTEXT_SIGNED = 3 +} ContextType; + +/* Common context lookup table for all context modes. */ +static const uint8_t kContextLookup[2048] = { + /* CONTEXT_LSB6, last byte. */ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + + /* CONTEXT_LSB6, second last byte, */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + /* CONTEXT_MSB6, last byte. */ + 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, + 8, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, + 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, + 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, + 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 23, 23, 23, 23, + 24, 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26, 27, 27, 27, 27, + 28, 28, 28, 28, 29, 29, 29, 29, 30, 30, 30, 30, 31, 31, 31, 31, + 32, 32, 32, 32, 33, 33, 33, 33, 34, 34, 34, 34, 35, 35, 35, 35, + 36, 36, 36, 36, 37, 37, 37, 37, 38, 38, 38, 38, 39, 39, 39, 39, + 40, 40, 40, 40, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, + 44, 44, 44, 44, 45, 45, 45, 45, 46, 46, 46, 46, 47, 47, 47, 47, + 48, 48, 48, 48, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 51, 51, + 52, 52, 52, 52, 53, 53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, + 56, 56, 56, 56, 57, 57, 57, 57, 58, 58, 58, 58, 59, 59, 59, 59, + 60, 60, 60, 60, 61, 61, 61, 61, 62, 62, 62, 62, 63, 63, 63, 63, + + /* CONTEXT_MSB6, second last byte, */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + + /* CONTEXT_UTF8, last byte. */ + /* ASCII range. */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 12, 16, 12, 12, 20, 12, 16, 24, 28, 12, 12, 32, 12, 36, 12, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 32, 32, 24, 40, 28, 12, + 12, 48, 52, 52, 52, 48, 52, 52, 52, 48, 52, 52, 52, 52, 52, 48, + 52, 52, 52, 52, 52, 48, 52, 52, 52, 52, 52, 24, 12, 28, 12, 12, + 12, 56, 60, 60, 60, 56, 60, 60, 60, 56, 60, 60, 60, 60, 60, 56, + 60, 60, 60, 60, 60, 56, 60, 60, 60, 60, 60, 24, 12, 28, 12, 0, + /* UTF8 continuation byte range. */ + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, + /* UTF8 lead byte range. */ + 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, + + /* CONTEXT_UTF8 second last byte. */ + /* ASCII range. */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, + 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, + 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 0, + /* UTF8 continuation byte range. */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + /* UTF8 lead byte range. */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + + /* CONTEXT_SIGNED, last byte, same as the above values shifted by 3 bits. */ + 0, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, + + /* CONTEXT_SIGNED, second last byte. */ + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, +}; + +typedef const uint8_t* ContextLut; + +/* typeof(MODE) == ContextType; returns ContextLut */ +#define BROTLI_CONTEXT_LUT(MODE) (&kContextLookup[(MODE) << 9]) + +/* typeof(LUT) == ContextLut */ +#define BROTLI_CONTEXT(P1, P2, LUT) ((LUT)[P1] | ((LUT) + 256)[P2]) + +#endif /* BROTLI_COMMON_CONTEXT_H_ */ diff --git a/app/src/main/cpp/woff2/brotli/c/common/dictionary.bin b/app/src/main/cpp/woff2/brotli/c/common/dictionary.bin new file mode 100644 index 0000000..a585c0e --- /dev/null +++ b/app/src/main/cpp/woff2/brotli/c/common/dictionary.bin @@ -0,0 +1,432 @@ +timedownlifeleftbackcodedatashowonlysitecityopenjustlikefreeworktextyearoverbodyloveformbookplaylivelinehelphomesidemorewordlongthemviewfindpagedaysfullheadtermeachareafromtruemarkableuponhighdatelandnewsevennextcasebothpostusedmadehandherewhatnameLinkblogsizebaseheldmakemainuser') +holdendswithNewsreadweresigntakehavegameseencallpathwellplusmenufilmpartjointhislistgoodneedwayswestjobsmindalsologorichuseslastteamarmyfoodkingwilleastwardbestfirePageknowaway.pngmovethanloadgiveselfnotemuchfeedmanyrockicononcelookhidediedHomerulehostajaxinfoclublawslesshalfsomesuchzone100%onescareTimeracebluefourweekfacehopegavehardlostwhenparkkeptpassshiproomHTMLplanTypedonesavekeepflaglinksoldfivetookratetownjumpthusdarkcardfilefearstaykillthatfallautoever.comtalkshopvotedeepmoderestturnbornbandfellroseurl(skinrolecomeactsagesmeetgold.jpgitemvaryfeltthensenddropViewcopy1.0"stopelseliestourpack.gifpastcss?graymean>rideshotlatesaidroadvar feeljohnrickportfast'UA-dead
poorbilltypeU.S.woodmust2px;Inforankwidewantwalllead[0];paulwavesure$('#waitmassarmsgoesgainlangpaid!-- lockunitrootwalkfirmwifexml"songtest20pxkindrowstoolfontmailsafestarmapscorerainflowbabyspansays4px;6px;artsfootrealwikiheatsteptriporg/lakeweaktoldFormcastfansbankveryrunsjulytask1px;goalgrewslowedgeid="sets5px;.js?40pxif (soonseatnonetubezerosentreedfactintogiftharm18pxcamehillboldzoomvoideasyringfillpeakinitcost3px;jacktagsbitsrolleditknewnearironfreddiskwentsoilputs/js/holyT22:ISBNT20:adamsees

json', 'contT21: RSSloopasiamoon

soulLINEfortcartT14:

80px!--<9px;T04:mike:46ZniceinchYorkricezh:ä'));puremageparatonebond:37Z_of_']);000,zh:çtankyardbowlbush:56ZJava30px +|} +%C3%:34ZjeffEXPIcashvisagolfsnowzh:équer.csssickmeatmin.binddellhirepicsrent:36ZHTTP-201fotowolfEND xbox:54ZBODYdick; +} +exit:35Zvarsbeat'});diet999;anne}}sonyguysfuckpipe|- +!002)ndow[1];[]; +Log salt + bangtrimbath){ +00px +});ko:ìfeesad> s:// [];tollplug(){ +{ + .js'200pdualboat.JPG); +}quot); + +'); + +} 201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037201320122011201020092008200720062005200420032002200120001999199819971996199519941993199219911990198919881987198619851984198319821981198019791978197719761975197419731972197119701969196819671966196519641963196219611960195919581957195619551954195319521951195010001024139400009999comomásesteestaperotodohacecadaañobiendíaasívidacasootroforosolootracualdijosidograntipotemadebealgoquéestonadatrespococasabajotodasinoaguapuesunosantediceluisellamayozonaamorpisoobraclicellodioshoracasiзанаомрарутанепоотизнодотожеонихÐаеебымыВыÑовывоÐообПолиниРФÐеМытыОнимдаЗаДаÐуОбтеИзейнуммТыужÙيأنمامعكلأوردياÙىهولملكاولهبسالإنهيأيقدهلثمبهلوليبلايبكشيامأمنتبيلنحبهممشوشfirstvideolightworldmediawhitecloseblackrightsmallbooksplacemusicfieldorderpointvalueleveltableboardhousegroupworksyearsstatetodaywaterstartstyledeathpowerphonenighterrorinputabouttermstitletoolseventlocaltimeslargewordsgamesshortspacefocusclearmodelblockguideradiosharewomenagainmoneyimagenamesyounglineslatercolorgreenfront&watchforcepricerulesbeginaftervisitissueareasbelowindextotalhourslabelprintpressbuiltlinksspeedstudytradefoundsenseundershownformsrangeaddedstillmovedtakenaboveflashfixedoftenotherviewschecklegalriveritemsquickshapehumanexistgoingmoviethirdbasicpeacestagewidthloginideaswrotepagesusersdrivestorebreaksouthvoicesitesmonthwherebuildwhichearthforumthreesportpartyClicklowerlivesclasslayerentrystoryusagesoundcourtyour birthpopuptypesapplyImagebeinguppernoteseveryshowsmeansextramatchtrackknownearlybegansuperpapernorthlearngivennamedendedTermspartsGroupbrandusingwomanfalsereadyaudiotakeswhile.com/livedcasesdailychildgreatjudgethoseunitsneverbroadcoastcoverapplefilescyclesceneplansclickwritequeenpieceemailframeolderphotolimitcachecivilscaleenterthemetheretouchboundroyalaskedwholesincestock namefaithheartemptyofferscopeownedmightalbumthinkbloodarraymajortrustcanonunioncountvalidstoneStyleLoginhappyoccurleft:freshquitefilmsgradeneedsurbanfightbasishoverauto;route.htmlmixedfinalYour slidetopicbrownalonedrawnsplitreachRightdatesmarchquotegoodsLinksdoubtasyncthumballowchiefyouthnovel10px;serveuntilhandsCheckSpacequeryjamesequaltwice0,000Startpanelsongsroundeightshiftworthpostsleadsweeksavoidthesemilesplanesmartalphaplantmarksratesplaysclaimsalestextsstarswrong

thing.org/multiheardPowerstandtokensolid(thisbringshipsstafftriedcallsfullyfactsagentThis //-->adminegyptEvent15px;Emailtrue"crossspentblogsbox">notedleavechinasizesguestrobotheavytrue,sevengrandcrimesignsawaredancephase> + + +name=diegopage swiss--> + +#fff;">Log.com"treatsheet) && 14px;sleepntentfiledja:ãƒid="cName"worseshots-box-delta +<bears:48Z spendbakershops= "";php">ction13px;brianhellosize=o=%2F joinmaybe, fjsimg" ")[0]MTopBType"newlyDanskczechtrailknowsfaq">zh-cn10); +-1");type=bluestrulydavis.js';> + +form jesus100% menu. + +walesrisksumentddingb-likteachgif" vegasdanskeestishqipsuomisobredesdeentretodospuedeañosestátienehastaotrospartedondenuevohacerformamismomejormundoaquídíassóloayudafechatodastantomenosdatosotrassitiomuchoahoralugarmayorestoshorastenerantesfotosestaspaísnuevasaludforosmedioquienmesespoderchileserávecesdecirjoséestarventagrupohechoellostengoamigocosasnivelgentemismaairesjuliotemashaciafavorjuniolibrepuntobuenoautorabrilbuenatextomarzosaberlistaluegocómoenerojuegoperúhaberestoynuncamujervalorfueralibrogustaigualvotoscasosguíapuedosomosavisousteddebennochebuscafaltaeurosseriedichocursoclavecasasleónplazolargoobrasvistaapoyojuntotratavistocrearcampohemoscincocargopisosordenhacenáreadiscopedrocercapuedapapelmenorútilclarojorgecalleponertardenadiemarcasigueellassiglocochemotosmadreclaserestoniñoquedapasarbancohijosviajepabloéstevienereinodejarfondocanalnorteletracausatomarmanoslunesautosvillavendopesartipostengamarcollevapadreunidovamoszonasambosbandamariaabusomuchasubirriojavivirgradochicaallíjovendichaestantalessalirsuelopesosfinesllamabuscoéstalleganegroplazahumorpagarjuntadobleislasbolsabañohablaluchaÃreadicenjugarnotasvalleallácargadolorabajoestégustomentemariofirmacostofichaplatahogarartesleyesaquelmuseobasespocosmitadcielochicomiedoganarsantoetapadebesplayaredessietecortecoreadudasdeseoviejodeseaaguas"domaincommonstatuseventsmastersystemactionbannerremovescrollupdateglobalmediumfilternumberchangeresultpublicscreenchoosenormaltravelissuessourcetargetspringmodulemobileswitchphotosborderregionitselfsocialactivecolumnrecordfollowtitle>eitherlengthfamilyfriendlayoutauthorcreatereviewsummerserverplayedplayerexpandpolicyformatdoublepointsseriespersonlivingdesignmonthsforcesuniqueweightpeopleenergynaturesearchfigurehavingcustomoffsetletterwindowsubmitrendergroupsuploadhealthmethodvideosschoolfutureshadowdebatevaluesObjectothersrightsleaguechromesimplenoticesharedendingseasonreportonlinesquarebuttonimagesenablemovinglatestwinterFranceperiodstrongrepeatLondondetailformeddemandsecurepassedtoggleplacesdevicestaticcitiesstreamyellowattackstreetflighthiddeninfo">openedusefulvalleycausesleadersecretseconddamagesportsexceptratingsignedthingseffectfieldsstatesofficevisualeditorvolumeReportmuseummoviesparentaccessmostlymother" id="marketgroundchancesurveybeforesymbolmomentspeechmotioninsidematterCenterobjectexistsmiddleEuropegrowthlegacymannerenoughcareeransweroriginportalclientselectrandomclosedtopicscomingfatheroptionsimplyraisedescapechosenchurchdefinereasoncorneroutputmemoryiframepolicemodelsNumberduringoffersstyleskilledlistedcalledsilvermargindeletebetterbrowselimitsGlobalsinglewidgetcenterbudgetnowrapcreditclaimsenginesafetychoicespirit-stylespreadmakingneededrussiapleaseextentScriptbrokenallowschargedividefactormember-basedtheoryconfigaroundworkedhelpedChurchimpactshouldalwayslogo" bottomlist">){var prefixorangeHeader.push(couplegardenbridgelaunchReviewtakingvisionlittledatingButtonbeautythemesforgotSearchanchoralmostloadedChangereturnstringreloadMobileincomesupplySourceordersviewed courseAbout islandPhilipawardshandleimportOfficeregardskillsnationSportsdegreeweekly (e.g.behinddoctorloggedunitedbeyond-scaleacceptservedmarineFootercamera +_form"leavesstress" /> +.gif" onloadloaderOxfordsistersurvivlistenfemaleDesignsize="appealtext">levelsthankshigherforcedanimalanyoneAfricaagreedrecentPeople
wonderpricesturned|| {};main">inlinesundaywrap">failedcensusminutebeaconquotes150px|estateremoteemail"linkedright;signalformal1.htmlsignupprincefloat:.png" forum.AccesspaperssoundsextendHeightsliderUTF-8"& Before. WithstudioownersmanageprofitjQueryannualparamsboughtfamousgooglelongeri++) {israelsayingdecidehome">headerensurebranchpiecesblock;statedtop">boston.test(avatartested_countforumsschemaindex,filledsharesreaderalert(appearSubmitline">body"> +* TheThoughseeingjerseyNews +System DavidcancertablesprovedApril reallydriveritem">more">boardscolorscampusfirst || [];media.guitarfinishwidth:showedOther .php" assumelayerswilsonstoresreliefswedenCustomeasily your String + +Whiltaylorclear:resortfrenchthough") + "buyingbrandsMembername">oppingsector5px;">vspacepostermajor coffeemartinmaturehappenkansaslink">Images=falsewhile hspace0& + +In powerPolski-colorjordanBottomStart -count2.htmlnews">01.jpgOnline-rightmillerseniorISBN 00,000 guidesvalue)ectionrepair.xml" rights.html-blockregExp:hoverwithinvirginphones using + var >'); + + +bahasabrasilgalegomagyarpolskisrpskiردو中文简体ç¹é«”ä¿¡æ¯ä¸­å›½æˆ‘们一个公å¸ç®¡ç†è®ºå›å¯ä»¥æœåŠ¡æ—¶é—´ä¸ªäººäº§å“自己ä¼ä¸šæŸ¥çœ‹å·¥ä½œè”系没有网站所有评论中心文章用户首页作者技术问题相关下载æœç´¢ä½¿ç”¨è½¯ä»¶åœ¨çº¿ä¸»é¢˜èµ„æ–™è§†é¢‘å›žå¤æ³¨å†Œç½‘络收è—内容推è市场消æ¯ç©ºé—´å‘布什么好å‹ç”Ÿæ´»å›¾ç‰‡å‘展如果手机新闻最新方å¼åŒ—京æä¾›å…³äºŽæ›´å¤šè¿™ä¸ªç³»ç»ŸçŸ¥é“游æˆå¹¿å‘Šå…¶ä»–å‘表安全第一会员进行点击版æƒç”µå­ä¸–界设计å…费教育加入活动他们商å“åšå®¢çŽ°åœ¨ä¸Šæµ·å¦‚ä½•å·²ç»ç•™è¨€è¯¦ç»†ç¤¾åŒºç™»å½•本站需è¦ä»·æ ¼æ”¯æŒå›½é™…链接国家建设朋å‹é˜…读法律ä½ç½®ç»æµŽé€‰æ‹©è¿™æ ·å½“å‰åˆ†ç±»æŽ’行因为交易最åŽéŸ³ä¹ä¸èƒ½é€šè¿‡è¡Œä¸šç§‘技å¯èƒ½è®¾å¤‡åˆä½œå¤§å®¶ç¤¾ä¼šç ”究专业全部项目这里还是开始情况电脑文件å“牌帮助文化资æºå¤§å­¦å­¦ä¹ åœ°å€æµè§ˆæŠ•èµ„å·¥ç¨‹è¦æ±‚怎么时候功能主è¦ç›®å‰èµ„讯城市方法电影招è˜å£°æ˜Žä»»ä½•å¥åº·æ•°æ®ç¾Žå›½æ±½è½¦ä»‹ç»ä½†æ˜¯äº¤æµç”Ÿäº§æ‰€ä»¥ç”µè¯æ˜¾ç¤ºä¸€äº›å•ä½äººå‘˜åˆ†æžåœ°å›¾æ—…游工具学生系列网å‹å¸–å­å¯†ç é¢‘é“æŽ§åˆ¶åœ°åŒºåŸºæœ¬å…¨å›½ç½‘ä¸Šé‡è¦ç¬¬äºŒå–œæ¬¢è¿›å…¥å‹æƒ…这些考试å‘现培训以上政府æˆä¸ºçŽ¯å¢ƒé¦™æ¸¯åŒæ—¶å¨±ä¹å‘é€ä¸€å®šå¼€å‘ä½œå“æ ‡å‡†æ¬¢è¿Žè§£å†³åœ°æ–¹ä¸€ä¸‹ä»¥åŠè´£ä»»æˆ–者客户代表积分女人数ç é”€å”®å‡ºçŽ°ç¦»çº¿åº”ç”¨åˆ—è¡¨ä¸åŒç¼–辑统计查询ä¸è¦æœ‰å…³æœºæž„å¾ˆå¤šæ’­æ”¾ç»„ç»‡æ”¿ç­–ç›´æŽ¥èƒ½åŠ›æ¥æºæ™‚間看到热门关键专区éžå¸¸è‹±è¯­ç™¾åº¦å¸Œæœ›ç¾Žå¥³æ¯”较知识规定建议部门æ„è§ç²¾å½©æ—¥æœ¬æé«˜å‘言方é¢åŸºé‡‘å¤„ç†æƒé™å½±ç‰‡é“¶è¡Œè¿˜æœ‰åˆ†äº«ç‰©å“ç»è¥æ·»åŠ ä¸“å®¶è¿™ç§è¯é¢˜èµ·æ¥ä¸šåŠ¡å…¬å‘Šè®°å½•ç®€ä»‹è´¨é‡ç”·äººå½±å“引用报告部分快速咨询时尚注æ„申请学校应该历å²åªæ˜¯è¿”回购买å称为了æˆåŠŸè¯´æ˜Žä¾›åº”å­©å­ä¸“题程åºä¸€èˆ¬æœƒå“¡åªæœ‰å…¶å®ƒä¿æŠ¤è€Œä¸”今天窗å£åЍæ€çжæ€ç‰¹åˆ«è®¤ä¸ºå¿…须更新å°è¯´æˆ‘å€‘ä½œä¸ºåª’ä½“åŒ…æ‹¬é‚£ä¹ˆä¸€æ ·å›½å†…æ˜¯å¦æ ¹æ®ç”µè§†å­¦é™¢å…·æœ‰è¿‡ç¨‹ç”±äºŽäººæ‰å‡ºæ¥ä¸è¿‡æ­£åœ¨æ˜Žæ˜Ÿæ•…事关系标题商务输入一直基础教学了解建筑结果全çƒé€šçŸ¥è®¡åˆ’对于艺术相册å‘生真的建立等级类型ç»éªŒå®žçŽ°åˆ¶ä½œæ¥è‡ªæ ‡ç­¾ä»¥ä¸‹åŽŸåˆ›æ— æ³•å…¶ä¸­å€‹äººä¸€åˆ‡æŒ‡å—关闭集团第三关注因此照片深圳商业广州日期高级最近综åˆè¡¨ç¤ºä¸“辑行为交通评价觉得精åŽå®¶åº­å®Œæˆæ„Ÿè§‰å®‰è£…得到邮件制度食å“虽然转载报价记者方案行政人民用å“东西æå‡ºé…’店然åŽä»˜æ¬¾çƒ­ç‚¹ä»¥å‰å®Œå…¨å‘帖设置领导工业医院看看ç»å…¸åŽŸå› å¹³å°å„ç§å¢žåŠ ææ–™æ–°å¢žä¹‹åŽèŒä¸šæ•ˆæžœä»Šå¹´è®ºæ–‡æˆ‘国告诉版主修改å‚与打å°å¿«ä¹æœºæ¢°è§‚点存在精神获得利用继续你们这么模å¼è¯­è¨€èƒ½å¤Ÿé›…虎æ“作风格一起科学体育短信æ¡ä»¶æ²»ç–—è¿åŠ¨äº§ä¸šä¼šè®®å¯¼èˆªå…ˆç”Ÿè”ç›Ÿå¯æ˜¯å•題结构作用调查資料自动负责农业访问实施接å—讨论那个å馈加强女性范围æœå‹™ä¼‘闲今日客æœè§€çœ‹å‚加的è¯ä¸€ç‚¹ä¿è¯å›¾ä¹¦æœ‰æ•ˆæµ‹è¯•移动æ‰èƒ½å†³å®šè‚¡ç¥¨ä¸æ–­éœ€æ±‚ä¸å¾—办法之间采用è¥é”€æŠ•诉目标爱情摄影有些複製文学机会数字装修购物农æ‘å…¨é¢ç²¾å“其实事情水平æç¤ºä¸Šå¸‚谢谢普通教师上传类别歌曲拥有创新é…ä»¶åªè¦æ—¶ä»£è³‡è¨Šè¾¾åˆ°äººç”Ÿè®¢é˜…è€å¸ˆå±•示心ç†è´´å­ç¶²ç«™ä¸»é¡Œè‡ªç„¶çº§åˆ«ç®€å•改é©é‚£äº›æ¥è¯´æ‰“开代ç åˆ é™¤è¯åˆ¸èŠ‚ç›®é‡ç‚¹æ¬¡æ•¸å¤šå°‘规划资金找到以åŽå¤§å…¨ä¸»é¡µæœ€ä½³å›žç­”天下ä¿éšœçŽ°ä»£æ£€æŸ¥æŠ•ç¥¨å°æ—¶æ²’有正常甚至代ç†ç›®å½•公开å¤åˆ¶é‡‘èžå¹¸ç¦ç‰ˆæœ¬å½¢æˆå‡†å¤‡è¡Œæƒ…å›žåˆ°æ€æƒ³æ€Žæ ·åè®®è®¤è¯æœ€å¥½äº§ç”ŸæŒ‰ç…§æœè£…å¹¿ä¸œåŠ¨æ¼«é‡‡è´­æ–°æ‰‹ç»„å›¾é¢æ¿å‚考政治容易天地努力人们å‡çº§é€Ÿåº¦äººç‰©è°ƒæ•´æµè¡Œé€ æˆæ–‡å­—éŸ©å›½è´¸æ˜“å¼€å±•ç›¸é—œè¡¨çŽ°å½±è§†å¦‚æ­¤ç¾Žå®¹å¤§å°æŠ¥é“æ¡æ¬¾å¿ƒæƒ…许多法规家居书店连接立å³ä¸¾æŠ¥æŠ€å·§å¥¥è¿ç™»å…¥ä»¥æ¥ç†è®ºäº‹ä»¶è‡ªç”±ä¸­åŽåŠžå…¬å¦ˆå¦ˆçœŸæ­£ä¸é”™å…¨æ–‡åˆåŒä»·å€¼åˆ«äººç›‘ç£å…·ä½“ä¸–çºªå›¢é˜Ÿåˆ›ä¸šæ‰¿æ‹…å¢žé•¿æœ‰äººä¿æŒå•†å®¶ç»´ä¿®å°æ¹¾å·¦å³è‚¡ä»½ç­”案实际电信ç»ç†ç”Ÿå‘½å®£ä¼ ä»»åŠ¡æ­£å¼ç‰¹è‰²ä¸‹æ¥å会åªèƒ½å½“ç„¶é‡æ–°å…§å®¹æŒ‡å¯¼è¿è¡Œæ—¥å¿—賣家超过土地浙江支付推出站长æ­å·žæ‰§è¡Œåˆ¶é€ ä¹‹ä¸€æŽ¨å¹¿çŽ°åœºæè¿°å˜åŒ–传统歌手ä¿é™©è¯¾ç¨‹åŒ»ç–—ç»è¿‡è¿‡å޻之剿”¶å…¥å¹´åº¦æ‚志美丽最高登陆未æ¥åŠ å·¥å…责教程版å—身体é‡åº†å‡ºå”®æˆæœ¬å½¢å¼åœŸè±†å‡ºåƒ¹ä¸œæ–¹é‚®ç®±å—京求èŒå–å¾—èŒä½ç›¸ä¿¡é¡µé¢åˆ†é’Ÿç½‘页确定图例网å€ç§¯æžé”™è¯¯ç›®çš„å®è´æœºå…³é£Žé™©æŽˆæƒç—…æ¯’å® ç‰©é™¤äº†è©•è«–ç–¾ç—…åŠæ—¶æ±‚购站点儿童æ¯å¤©ä¸­å¤®è®¤è¯†æ¯ä¸ªå¤©æ´¥å­—体å°ç£ç»´æŠ¤æœ¬é¡µä¸ªæ€§å®˜æ–¹å¸¸è§ç›¸æœºæˆ˜ç•¥åº”当律师方便校园股市房屋æ ç›®å‘˜å·¥å¯¼è‡´çªç„¶é“å…·æœ¬ç½‘ç»“åˆæ¡£æ¡ˆåŠ³åŠ¨å¦å¤–美元引起改å˜ç¬¬å››ä¼šè®¡èªªæ˜Žéšç§å®å®è§„范消费共åŒå¿˜è®°ä½“系带æ¥å字發表开放加盟å—åˆ°äºŒæ‰‹å¤§é‡æˆäººæ•°é‡å…±äº«åŒºåŸŸå¥³å­©åŽŸåˆ™æ‰€åœ¨ç»“æŸé€šä¿¡è¶…级é…ç½®å½“æ—¶ä¼˜ç§€æ€§æ„Ÿæˆ¿äº§éŠæˆ²å‡ºå£æäº¤å°±ä¸šä¿å¥ç¨‹åº¦å‚数事业整个山东情感特殊分類æœå°‹å±žäºŽé—¨æˆ·è´¢åŠ¡å£°éŸ³åŠå…¶è´¢ç»åšæŒå¹²éƒ¨æˆç«‹åˆ©ç›Šè€ƒè™‘æˆéƒ½åŒ…装用戶比赛文明招商完整真是眼ç›ä¼™ä¼´å¨æœ›é¢†åŸŸå«ç”Ÿä¼˜æƒ è«–壇公共良好充分符åˆé™„件特点ä¸å¯è‹±æ–‡èµ„äº§æ ¹æœ¬æ˜Žæ˜¾å¯†ç¢¼å…¬ä¼—æ°‘æ—æ›´åŠ äº«å—åŒå­¦å¯åЍ适åˆåŽŸæ¥é—®ç­”本文美食绿色稳定终于生物供求æœç‹åŠ›é‡ä¸¥é‡æ°¸è¿œå†™çœŸæœ‰é™ç«žäº‰å¯¹è±¡è´¹ç”¨ä¸å¥½ç»å¯¹å分促进点评影音优势ä¸å°‘欣èµå¹¶ä¸”有点方å‘全新信用设施形象资格çªç ´éšç€é‡å¤§äºŽæ˜¯æ¯•ä¸šæ™ºèƒ½åŒ–å·¥å®Œç¾Žå•†åŸŽç»Ÿä¸€å‡ºç‰ˆæ‰“é€ ç”¢å“æ¦‚况用于ä¿ç•™å› ç´ ä¸­åœ‹å­˜å‚¨è´´å›¾æœ€æ„›é•¿æœŸå£ä»·ç†è´¢åŸºåœ°å®‰æŽ’武汉里é¢åˆ›å»ºå¤©ç©ºé¦–先完善驱动下é¢ä¸å†è¯šä¿¡æ„义阳光英国漂亮军事玩家群众农民å³å¯å稱家具动画想到注明å°å­¦æ€§èƒ½è€ƒç ”硬件观看清楚æžç¬‘首é é»„金适用江è‹çœŸå®žä¸»ç®¡é˜¶æ®µè¨»å†Šç¿»è¯‘æƒåˆ©åšå¥½ä¼¼ä¹Žé€šè®¯æ–½å·¥ç‹€æ…‹ä¹Ÿè®¸çޝä¿åŸ¹å…»æ¦‚念大型机票ç†è§£åŒ¿åcuandoenviarmadridbuscariniciotiempoporquecuentaestadopuedenjuegoscontraestánnombretienenperfilmaneraamigosciudadcentroaunquepuedesdentroprimerpreciosegúnbuenosvolverpuntossemanahabíaagostonuevosunidoscarlosequiponiñosmuchosalgunacorreoimagenpartirarribamaríahombreempleoverdadcambiomuchasfueronpasadolíneaparecenuevascursosestabaquierolibroscuantoaccesomiguelvarioscuatrotienesgruposseráneuropamediosfrenteacercademásofertacochesmodeloitalialetrasalgúncompracualesexistecuerposiendoprensallegarviajesdineromurciapodrápuestodiariopuebloquieremanuelpropiocrisisciertoseguromuertefuentecerrargrandeefectopartesmedidapropiaofrecetierrae-mailvariasformasfuturoobjetoseguirriesgonormasmismosúnicocaminositiosrazóndebidopruebatoledoteníajesúsesperococinaorigentiendacientocádizhablarseríalatinafuerzaestiloguerraentraréxitolópezagendavídeoevitarpaginametrosjavierpadresfácilcabezaáreassalidaenvíojapónabusosbienestextosllevarpuedanfuertecomúnclaseshumanotenidobilbaounidadestáseditarcreadoдлÑчтокакилиÑтовÑеегопритакещеужеКакбезбылониВÑеподЭтотомчемнетлетразонагдемнеДлÑПринаÑнихтемктогодвоттамСШÐмаÑЧтоваÑвамемуТакдванамÑтиÑтуВамтехпротутнадднÑВоттринейВаÑнимÑамтотрубОнимирнееОООлицÑтаОнанемдоммойдвеоноÑудकेहैकीसेकाकोऔरपरनेà¤à¤•किभीइसकरतोहोआपहीयहयातकथाjagranआजजोअबदोगईजागà¤à¤¹à¤®à¤‡à¤¨à¤µà¤¹à¤¯à¥‡à¤¥à¥‡à¤¥à¥€à¤˜à¤°à¤œà¤¬à¤¦à¥€à¤•ईजीवेनईनà¤à¤¹à¤°à¤‰à¤¸à¤®à¥‡à¤•मवोलेसबमईदेओरआमबसभरबनचलमनआगसीलीعلىإلىهذاآخرعددالىهذهصورغيركانولابينعرضذلكهنايومقالعليانالكنحتىقبلوحةاخرÙقطعبدركنإذاكمااحدإلاÙÙŠÙ‡Ø¨Ø¹Ø¶ÙƒÙŠÙØ¨Ø­Ø«ÙˆÙ…نوهوأناجدالهاسلمعندليسعبرصلىمنذبهاأنهمثلكنتالاحيثمصرشرححولوÙÙŠØ§Ø°Ø§Ù„ÙƒÙ„Ù…Ø±Ø©Ø§Ù†ØªØ§Ù„ÙØ£Ø¨ÙˆØ®Ø§ØµØ£Ù†ØªØ§Ù†Ù‡Ø§Ù„ÙŠØ¹Ø¶ÙˆÙˆÙ‚Ø¯Ø§Ø¨Ù†Ø®ÙŠØ±Ø¨Ù†ØªÙ„ÙƒÙ…Ø´Ø§Ø¡ÙˆÙ‡ÙŠØ§Ø¨ÙˆÙ‚ØµØµÙˆÙ…Ø§Ø±Ù‚Ù…Ø£Ø­Ø¯Ù†Ø­Ù†Ø¹Ø¯Ù…Ø±Ø£ÙŠØ§Ø­Ø©ÙƒØªØ¨Ø¯ÙˆÙ†ÙŠØ¬Ø¨Ù…Ù†Ù‡ØªØ­ØªØ¬Ù‡Ø©Ø³Ù†Ø©ÙŠØªÙ…ÙƒØ±Ø©ØºØ²Ø©Ù†ÙØ³Ø¨ÙŠØªÙ„لهلناتلكقلبلماعنهأولشيءنورأماÙيكبكلذاترتببأنهمسانكبيعÙقدحسنلهمشعرأهلشهرقطرطلبprofileservicedefaulthimselfdetailscontentsupportstartedmessagesuccessfashioncountryaccountcreatedstoriesresultsrunningprocesswritingobjectsvisiblewelcomearticleunknownnetworkcompanydynamicbrowserprivacyproblemServicerespectdisplayrequestreservewebsitehistoryfriendsoptionsworkingversionmillionchannelwindow.addressvisitedweathercorrectproductedirectforwardyou canremovedsubjectcontrolarchivecurrentreadinglibrarylimitedmanagerfurthersummarymachineminutesprivatecontextprogramsocietynumberswrittenenabledtriggersourcesloadingelementpartnerfinallyperfectmeaningsystemskeepingculture",journalprojectsurfaces"expiresreviewsbalanceEnglishContentthroughPlease opinioncontactaverageprimaryvillageSpanishgallerydeclinemeetingmissionpopularqualitymeasuregeneralspeciessessionsectionwriterscounterinitialreportsfiguresmembersholdingdisputeearlierexpressdigitalpictureAnothermarriedtrafficleadingchangedcentralvictoryimages/reasonsstudiesfeaturelistingmust beschoolsVersionusuallyepisodeplayinggrowingobviousoverlaypresentactions</ul> +wrapperalreadycertainrealitystorageanotherdesktopofferedpatternunusualDigitalcapitalWebsitefailureconnectreducedAndroiddecadesregular & animalsreleaseAutomatgettingmethodsnothingPopularcaptionletterscapturesciencelicensechangesEngland=1&History = new CentralupdatedSpecialNetworkrequirecommentwarningCollegetoolbarremainsbecauseelectedDeutschfinanceworkersquicklybetweenexactlysettingdiseaseSocietyweaponsexhibit<!--Controlclassescoveredoutlineattacksdevices(windowpurposetitle="Mobile killingshowingItaliandroppedheavilyeffects-1']); +confirmCurrentadvancesharingopeningdrawingbillionorderedGermanyrelated</form>includewhetherdefinedSciencecatalogArticlebuttonslargestuniformjourneysidebarChicagoholidayGeneralpassage,"animatefeelingarrivedpassingnaturalroughly. + +The but notdensityBritainChineselack oftributeIreland" data-factorsreceivethat isLibraryhusbandin factaffairsCharlesradicalbroughtfindinglanding:lang="return leadersplannedpremiumpackageAmericaEdition]"Messageneed tovalue="complexlookingstationbelievesmaller-mobilerecordswant tokind ofFirefoxyou aresimilarstudiedmaximumheadingrapidlyclimatekingdomemergedamountsfoundedpioneerformuladynastyhow to SupportrevenueeconomyResultsbrothersoldierlargelycalling."AccountEdward segmentRobert effortsPacificlearnedup withheight:we haveAngelesnations_searchappliedacquiremassivegranted: falsetreatedbiggestbenefitdrivingStudiesminimumperhapsmorningsellingis usedreversevariant role="missingachievepromotestudentsomeoneextremerestorebottom:evolvedall thesitemapenglishway to AugustsymbolsCompanymattersmusicalagainstserving})(); +paymenttroubleconceptcompareparentsplayersregionsmonitor ''The winningexploreadaptedGalleryproduceabilityenhancecareers). The collectSearch ancientexistedfooter handlerprintedconsoleEasternexportswindowsChannelillegalneutralsuggest_headersigning.html">settledwesterncausing-webkitclaimedJusticechaptervictimsThomas mozillapromisepartieseditionoutside:false,hundredOlympic_buttonauthorsreachedchronicdemandssecondsprotectadoptedprepareneithergreatlygreateroverallimprovecommandspecialsearch.worshipfundingthoughthighestinsteadutilityquarterCulturetestingclearlyexposedBrowserliberal} catchProjectexamplehide();FloridaanswersallowedEmperordefenseseriousfreedomSeveral-buttonFurtherout of != nulltrainedDenmarkvoid(0)/all.jspreventRequestStephen + +When observe</h2> +Modern provide" alt="borders. + +For + +Many artistspoweredperformfictiontype ofmedicalticketsopposedCouncilwitnessjusticeGeorge Belgium...</a>twitternotablywaitingwarfare Other rankingphrasesmentionsurvivescholar</p> + Countryignoredloss ofjust asGeorgiastrange<head><stopped1']); +islandsnotableborder:list ofcarried100,000</h3> + severalbecomesselect wedding00.htmlmonarchoff theteacherhighly biologylife ofor evenrise of»plusonehunting(thoughDouglasjoiningcirclesFor theAncientVietnamvehiclesuch ascrystalvalue =Windowsenjoyeda smallassumed<a id="foreign All rihow theDisplayretiredhoweverhidden;battlesseekingcabinetwas notlook atconductget theJanuaryhappensturninga:hoverOnline French lackingtypicalextractenemieseven ifgeneratdecidedare not/searchbeliefs-image:locatedstatic.login">convertviolententeredfirst">circuitFinlandchemistshe was10px;">as suchdivided</span>will beline ofa greatmystery/index.fallingdue to railwaycollegemonsterdescentit withnuclearJewish protestBritishflowerspredictreformsbutton who waslectureinstantsuicidegenericperiodsmarketsSocial fishingcombinegraphicwinners<br /><by the NaturalPrivacycookiesoutcomeresolveSwedishbrieflyPersianso muchCenturydepictscolumnshousingscriptsnext tobearingmappingrevisedjQuery(-width:title">tooltipSectiondesignsTurkishyounger.match(})(); + +burningoperatedegreessource=Richardcloselyplasticentries</tr> +color:#ul id="possessrollingphysicsfailingexecutecontestlink toDefault<br /> +: true,chartertourismclassicproceedexplain</h1> +online.?xml vehelpingdiamonduse theairlineend -->).attr(readershosting#ffffffrealizeVincentsignals src="/ProductdespitediversetellingPublic held inJoseph theatreaffects<style>a largedoesn'tlater, ElementfaviconcreatorHungaryAirportsee theso thatMichaelSystemsPrograms, and width=e"tradingleft"> +personsGolden Affairsgrammarformingdestroyidea ofcase ofoldest this is.src = cartoonregistrCommonsMuslimsWhat isin manymarkingrevealsIndeed,equally/show_aoutdoorescape(Austriageneticsystem,In the sittingHe alsoIslandsAcademy + <!--Daniel bindingblock">imposedutilizeAbraham(except{width:putting).html(|| []; +DATA[ *kitchenmountedactual dialectmainly _blank'installexpertsif(typeIt also© ">Termsborn inOptionseasterntalkingconcerngained ongoingjustifycriticsfactoryits ownassaultinvitedlastinghis ownhref="/" rel="developconcertdiagramdollarsclusterphp?id=alcohol);})();using a><span>vesselsrevivalAddressamateurandroidallegedillnesswalkingcentersqualifymatchesunifiedextinctDefensedied in + <!-- customslinkingLittle Book ofeveningmin.js?are thekontakttoday's.html" target=wearingAll Rig; +})();raising Also, crucialabout">declare--> +<scfirefoxas muchappliesindex, s, but type = + +<!--towardsRecordsPrivateForeignPremierchoicesVirtualreturnsCommentPoweredinline;povertychamberLiving volumesAnthonylogin" RelatedEconomyreachescuttinggravitylife inChapter-shadowNotable</td> + returnstadiumwidgetsvaryingtravelsheld bywho arework infacultyangularwho hadairporttown of + +Some 'click'chargeskeywordit willcity of(this);Andrew unique checkedor more300px; return;rsion="pluginswithin herselfStationFederalventurepublishsent totensionactresscome tofingersDuke ofpeople,exploitwhat isharmonya major":"httpin his menu"> +monthlyofficercouncilgainingeven inSummarydate ofloyaltyfitnessand wasemperorsupremeSecond hearingRussianlongestAlbertalateralset of small">.appenddo withfederalbank ofbeneathDespiteCapitalgrounds), and percentit fromclosingcontainInsteadfifteenas well.yahoo.respondfighterobscurereflectorganic= Math.editingonline paddinga wholeonerroryear ofend of barrierwhen itheader home ofresumedrenamedstrong>heatingretainscloudfrway of March 1knowingin partBetweenlessonsclosestvirtuallinks">crossedEND -->famous awardedLicenseHealth fairly wealthyminimalAfricancompetelabel">singingfarmersBrasil)discussreplaceGregoryfont copursuedappearsmake uproundedboth ofblockedsaw theofficescoloursif(docuwhen heenforcepush(fuAugust UTF-8">Fantasyin mostinjuredUsuallyfarmingclosureobject defenceuse of Medical<body> +evidentbe usedkeyCodesixteenIslamic#000000entire widely active (typeofone cancolor =speakerextendsPhysicsterrain<tbody>funeralviewingmiddle cricketprophetshifteddoctorsRussell targetcompactalgebrasocial-bulk ofman and</td> + he left).val()false);logicalbankinghome tonaming Arizonacredits); +}); +founderin turnCollinsbefore But thechargedTitle">CaptainspelledgoddessTag -->Adding:but wasRecent patientback in=false&Lincolnwe knowCounterJudaismscript altered']); + has theunclearEvent',both innot all + +<!-- placinghard to centersort ofclientsstreetsBernardassertstend tofantasydown inharbourFreedomjewelry/about..searchlegendsis mademodern only ononly toimage" linear painterand notrarely acronymdelivershorter00&as manywidth="/* <![Ctitle =of the lowest picked escapeduses ofpeoples PublicMatthewtacticsdamagedway forlaws ofeasy to windowstrong simple}catch(seventhinfoboxwent topaintedcitizenI don'tretreat. Some ww."); +bombingmailto:made in. Many carries||{};wiwork ofsynonymdefeatsfavoredopticalpageTraunless sendingleft"><comScorAll thejQuery.touristClassicfalse" Wilhelmsuburbsgenuinebishops.split(global followsbody ofnominalContactsecularleft tochiefly-hidden-banner</li> + +. When in bothdismissExplorealways via thespañolwelfareruling arrangecaptainhis sonrule ofhe tookitself,=0&(calledsamplesto makecom/pagMartin Kennedyacceptsfull ofhandledBesides//--></able totargetsessencehim to its by common.mineralto takeways tos.org/ladvisedpenaltysimple:if theyLettersa shortHerbertstrikes groups.lengthflightsoverlapslowly lesser social </p> + it intoranked rate oful> + attemptpair ofmake itKontaktAntoniohaving ratings activestreamstrapped").css(hostilelead tolittle groups,Picture--> + + rows=" objectinverse<footerCustomV><\/scrsolvingChamberslaverywoundedwhereas!= 'undfor allpartly -right:Arabianbacked centuryunit ofmobile-Europe,is homerisk ofdesiredClintoncost ofage of become none ofp"Middle ead')[0Criticsstudios>©group">assemblmaking pressedwidget.ps:" ? rebuiltby someFormer editorsdelayedCanonichad thepushingclass="but arepartialBabylonbottom carrierCommandits useAs withcoursesa thirddenotesalso inHouston20px;">accuseddouble goal ofFamous ).bind(priests Onlinein Julyst + "gconsultdecimalhelpfulrevivedis veryr'+'iptlosing femalesis alsostringsdays ofarrivalfuture <objectforcingString(" /> + here isencoded. The balloondone by/commonbgcolorlaw of Indianaavoidedbut the2px 3pxjquery.after apolicy.men andfooter-= true;for usescreen.Indian image =family,http://  driverseternalsame asnoticedviewers})(); + is moreseasonsformer the newis justconsent Searchwas thewhy theshippedbr><br>width: height=made ofcuisineis thata very Admiral fixed;normal MissionPress, ontariocharsettry to invaded="true"spacingis mosta more totallyfall of}); + immensetime inset outsatisfyto finddown tolot of Playersin Junequantumnot thetime todistantFinnishsrc = (single help ofGerman law andlabeledforestscookingspace">header-well asStanleybridges/globalCroatia About [0]; + it, andgroupedbeing a){throwhe madelighterethicalFFFFFF"bottom"like a employslive inas seenprintermost ofub-linkrejectsand useimage">succeedfeedingNuclearinformato helpWomen'sNeitherMexicanprotein<table by manyhealthylawsuitdevised.push({sellerssimply Through.cookie Image(older">us.js"> Since universlarger open to!-- endlies in']); + marketwho is ("DOMComanagedone fortypeof Kingdomprofitsproposeto showcenter;made itdressedwere inmixtureprecisearisingsrc = 'make a securedBaptistvoting + var March 2grew upClimate.removeskilledway the</head>face ofacting right">to workreduceshas haderectedshow();action=book ofan area== "htt<header +<html>conformfacing cookie.rely onhosted .customhe wentbut forspread Family a meansout theforums.footage">MobilClements" id="as highintense--><!--female is seenimpliedset thea stateand hisfastestbesidesbutton_bounded"><img Infoboxevents,a youngand areNative cheaperTimeoutand hasengineswon the(mostlyright: find a -bottomPrince area ofmore ofsearch_nature,legallyperiod,land ofor withinducedprovingmissilelocallyAgainstthe wayk"px;"> +pushed abandonnumeralCertainIn thismore inor somename isand, incrownedISBN 0-createsOctobermay notcenter late inDefenceenactedwish tobroadlycoolingonload=it. TherecoverMembersheight assumes<html> +people.in one =windowfooter_a good reklamaothers,to this_cookiepanel">London,definescrushedbaptismcoastalstatus title" move tolost inbetter impliesrivalryservers SystemPerhapses and contendflowinglasted rise inGenesisview ofrising seem tobut in backinghe willgiven agiving cities.flow of Later all butHighwayonly bysign ofhe doesdiffersbattery&lasinglesthreatsintegertake onrefusedcalled =US&See thenativesby thissystem.head of:hover,lesbiansurnameand allcommon/header__paramsHarvard/pixel.removalso longrole ofjointlyskyscraUnicodebr /> +AtlantanucleusCounty,purely count">easily build aonclicka givenpointerh"events else { +ditionsnow the, with man whoorg/Webone andcavalryHe diedseattle00,000 {windowhave toif(windand itssolely m"renewedDetroitamongsteither them inSenatorUs</a><King ofFrancis-produche usedart andhim andused byscoringat hometo haverelatesibilityfactionBuffalolink"><what hefree toCity ofcome insectorscountedone daynervoussquare };if(goin whatimg" alis onlysearch/tuesdaylooselySolomonsexual - <a hrmedium"DO NOT France,with a war andsecond take a > + + +market.highwaydone inctivity"last">obligedrise to"undefimade to Early praisedin its for hisathleteJupiterYahoo! termed so manyreally s. The a woman?value=direct right" bicycleacing="day andstatingRather,higher Office are nowtimes, when a pay foron this-link">;borderaround annual the Newput the.com" takin toa brief(in thegroups.; widthenzymessimple in late{returntherapya pointbanninginks"> +();" rea place\u003Caabout atr> + ccount gives a<SCRIPTRailwaythemes/toolboxById("xhumans,watchesin some if (wicoming formats Under but hashanded made bythan infear ofdenoted/iframeleft involtagein eacha"base ofIn manyundergoregimesaction </p> +<ustomVa;></importsor thatmostly &re size="</a></ha classpassiveHost = WhetherfertileVarious=[];(fucameras/></td>acts asIn some> + +<!organis <br />Beijingcatalàdeutscheuropeueuskaragaeilgesvenskaespañamensajeusuariotrabajoméxicopáginasiempresistemaoctubreduranteañadirempresamomentonuestroprimeratravésgraciasnuestraprocesoestadoscalidadpersonanúmeroacuerdomúsicamiembroofertasalgunospaísesejemploderechoademásprivadoagregarenlacesposiblehotelessevillaprimeroúltimoeventosarchivoculturamujeresentradaanuncioembargomercadograndesestudiomejoresfebrerodiseñoturismocódigoportadaespaciofamiliaantoniopermiteguardaralgunaspreciosalguiensentidovisitastítuloconocersegundoconsejofranciaminutossegundatenemosefectosmálagasesiónrevistagranadacompraringresogarcíaacciónecuadorquienesinclusodeberámateriahombresmuestrapodríamañanaúltimaestamosoficialtambienningúnsaludospodemosmejorarpositionbusinesshomepagesecuritylanguagestandardcampaignfeaturescategoryexternalchildrenreservedresearchexchangefavoritetemplatemilitaryindustryservicesmaterialproductsz-index:commentssoftwarecompletecalendarplatformarticlesrequiredmovementquestionbuildingpoliticspossiblereligionphysicalfeedbackregisterpicturesdisabledprotocolaudiencesettingsactivityelementslearninganythingabstractprogressoverviewmagazineeconomictrainingpressurevarious <strong>propertyshoppingtogetheradvancedbehaviordownloadfeaturedfootballselectedLanguagedistanceremembertrackingpasswordmodifiedstudentsdirectlyfightingnortherndatabasefestivalbreakinglocationinternetdropdownpracticeevidencefunctionmarriageresponseproblemsnegativeprogramsanalysisreleasedbanner">purchasepoliciesregionalcreativeargumentbookmarkreferrerchemicaldivisioncallbackseparateprojectsconflicthardwareinterestdeliverymountainobtained= false;for(var acceptedcapacitycomputeridentityaircraftemployedproposeddomesticincludesprovidedhospitalverticalcollapseapproachpartnerslogo"><adaughterauthor" culturalfamilies/images/assemblypowerfulteachingfinisheddistrictcriticalcgi-bin/purposesrequireselectionbecomingprovidesacademicexerciseactuallymedicineconstantaccidentMagazinedocumentstartingbottom">observed: "extendedpreviousSoftwarecustomerdecisionstrengthdetailedslightlyplanningtextareacurrencyeveryonestraighttransferpositiveproducedheritageshippingabsolutereceivedrelevantbutton" violenceanywherebenefitslaunchedrecentlyalliancefollowedmultiplebulletinincludedoccurredinternal$(this).republic><tr><tdcongressrecordedultimatesolution<ul id="discoverHome</a>websitesnetworksalthoughentirelymemorialmessagescontinueactive">somewhatvictoriaWestern title="LocationcontractvisitorsDownloadwithout right"> +measureswidth = variableinvolvedvirginianormallyhappenedaccountsstandingnationalRegisterpreparedcontrolsaccuratebirthdaystrategyofficialgraphicscriminalpossiblyconsumerPersonalspeakingvalidateachieved.jpg" />machines</h2> + keywordsfriendlybrotherscombinedoriginalcomposedexpectedadequatepakistanfollow" valuable</label>relativebringingincreasegovernorplugins/List of Header">" name=" ("graduate</head> +commercemalaysiadirectormaintain;height:schedulechangingback to catholicpatternscolor: #greatestsuppliesreliable</ul> + <select citizensclothingwatching<li id="specificcarryingsentence<center>contrastthinkingcatch(e)southernMichael merchantcarouselpadding:interior.split("lizationOctober ){returnimproved--> + +coveragechairman.png" />subjectsRichard whateverprobablyrecoverybaseballjudgmentconnect..css" /> websitereporteddefault"/></a> +electricscotlandcreationquantity. ISBN 0did not instance-search-" lang="speakersComputercontainsarchivesministerreactiondiscountItalianocriteriastrongly: 'http:'script'coveringofferingappearedBritish identifyFacebooknumerousvehiclesconcernsAmericanhandlingdiv id="William provider_contentaccuracysection andersonflexibleCategorylawrence<script>layout="approved maximumheader"></table>Serviceshamiltoncurrent canadianchannels/themes//articleoptionalportugalvalue=""intervalwirelessentitledagenciesSearch" measuredthousandspending…new Date" size="pageNamemiddle" " /></a>hidden">sequencepersonaloverflowopinionsillinoislinks"> + <title>versionssaturdayterminalitempropengineersectionsdesignerproposal="false"Españolreleasessubmit" er"additionsymptomsorientedresourceright"><pleasurestationshistory.leaving border=contentscenter">. + +Some directedsuitablebulgaria.show();designedGeneral conceptsExampleswilliamsOriginal"><span>search">operatorrequestsa "allowingDocumentrevision. + +The yourselfContact michiganEnglish columbiapriorityprintingdrinkingfacilityreturnedContent officersRussian generate-8859-1"indicatefamiliar qualitymargin:0 contentviewportcontacts-title">portable.length eligibleinvolvesatlanticonload="default.suppliedpaymentsglossary + +After guidance</td><tdencodingmiddle">came to displaysscottishjonathanmajoritywidgets.clinicalthailandteachers<head> + affectedsupportspointer;toString</small>oklahomawill be investor0" alt="holidaysResourcelicensed (which . After considervisitingexplorerprimary search" android"quickly meetingsestimate;return ;color:# height=approval, " checked.min.js"magnetic></a></hforecast. While thursdaydvertiseéhasClassevaluateorderingexistingpatients Online coloradoOptions"campbell<!-- end</span><<br /> +_popups|sciences," quality Windows assignedheight: <b classle" value=" Companyexamples<iframe believespresentsmarshallpart of properly). + +The taxonomymuch of </span> +" data-srtuguêsscrollTo project<head> +attorneyemphasissponsorsfancyboxworld's wildlifechecked=sessionsprogrammpx;font- Projectjournalsbelievedvacationthompsonlightingand the special border=0checking</tbody><button Completeclearfix +<head> +article <sectionfindingsrole in popular Octoberwebsite exposureused to changesoperatedclickingenteringcommandsinformed numbers </div>creatingonSubmitmarylandcollegesanalyticlistingscontact.loggedInadvisorysiblingscontent"s")s. This packagescheckboxsuggestspregnanttomorrowspacing=icon.pngjapanesecodebasebutton">gamblingsuch as , while </span> missourisportingtop:1px .</span>tensionswidth="2lazyloadnovemberused in height="cript"> + </<tr><td height:2/productcountry include footer" <!-- title"></jquery.</form> +(简体)(ç¹é«”)hrvatskiitalianoromânătürkçeاردوtambiénnoticiasmensajespersonasderechosnacionalserviciocontactousuariosprogramagobiernoempresasanunciosvalenciacolombiadespuésdeportesproyectoproductopúbliconosotroshistoriapresentemillonesmediantepreguntaanteriorrecursosproblemasantiagonuestrosopiniónimprimirmientrasaméricavendedorsociedadrespectorealizarregistropalabrasinterésentoncesespecialmiembrosrealidadcórdobazaragozapáginassocialesbloqueargestiónalquilersistemascienciascompletoversióncompletaestudiospúblicaobjetivoalicantebuscadorcantidadentradasaccionesarchivossuperiormayoríaalemaniafunciónúltimoshaciendoaquellosediciónfernandoambientefacebooknuestrasclientesprocesosbastantepresentareportarcongresopublicarcomerciocontratojóvenesdistritotécnicaconjuntoenergíatrabajarasturiasrecienteutilizarboletínsalvadorcorrectatrabajosprimerosnegocioslibertaddetallespantallapróximoalmeríaanimalesquiénescorazónsecciónbuscandoopcionesexteriorconceptotodavíagaleríaescribirmedicinalicenciaconsultaaspectoscríticadólaresjusticiadeberánperíodonecesitamantenerpequeñorecibidatribunaltenerifecancióncanariasdescargadiversosmallorcarequieretécnicodeberíaviviendafinanzasadelantefuncionaconsejosdifícilciudadesantiguasavanzadatérminounidadessánchezcampañasoftonicrevistascontienesectoresmomentosfacultadcréditodiversassupuestofactoressegundospequeñaгодаеÑлиеÑтьбылобытьÑтомЕÑлитогоменÑвÑехÑтойдажебылигодуденьÑтотбылаÑебÑодинÑебенадоÑайтфотонегоÑвоиÑвойигрытожевÑемÑвоюлишьÑтихпокаднейдомамиралиботемухотÑдвухÑетилюдиделомиретебÑÑвоевидечегоÑтимÑчеттемыценыÑталведьтемеводытебевышенамитипатомуправлицаоднагодызнаюмогудругвÑейидеткиноодноделаделеÑрокиюнÑвеÑьЕÑÑ‚ÑŒÑ€Ð°Ð·Ð°Ð½Ð°ÑˆÐ¸Ø§Ù„Ù„Ù‡Ø§Ù„ØªÙŠØ¬Ù…ÙŠØ¹Ø®Ø§ØµØ©Ø§Ù„Ø°ÙŠØ¹Ù„ÙŠÙ‡Ø¬Ø¯ÙŠØ¯Ø§Ù„Ø¢Ù†Ø§Ù„Ø±Ø¯ØªØ­ÙƒÙ…ØµÙØ­Ø©ÙƒØ§Ù†ØªØ§Ù„لييكونشبكةÙيهابناتحواءأكثرخلالالحبدليلدروساضغطتكونهناكساحةناديالطبعليكشكرايمكنمنهاشركةرئيسنشيطماذاالÙÙ†Ø´Ø¨Ø§Ø¨ØªØ¹Ø¨Ø±Ø±Ø­Ù…Ø©ÙƒØ§ÙØ©ÙŠÙ‚ÙˆÙ„Ù…Ø±ÙƒØ²ÙƒÙ„Ù…Ø©Ø£Ø­Ù…Ø¯Ù‚Ù„Ø¨ÙŠÙŠØ¹Ù†ÙŠØµÙˆØ±Ø©Ø·Ø±ÙŠÙ‚Ø´Ø§Ø±ÙƒØ¬ÙˆØ§Ù„Ø£Ø®Ø±Ù‰Ù…Ø¹Ù†Ø§Ø§Ø¨Ø­Ø«Ø¹Ø±ÙˆØ¶Ø¨Ø´ÙƒÙ„Ù…Ø³Ø¬Ù„Ø¨Ù†Ø§Ù†Ø®Ø§Ù„Ø¯ÙƒØªØ§Ø¨ÙƒÙ„ÙŠØ©Ø¨Ø¯ÙˆÙ†Ø£ÙŠØ¶Ø§ÙŠÙˆØ¬Ø¯ÙØ±ÙŠÙ‚ÙƒØªØ¨ØªØ£ÙØ¶Ù„Ù…Ø·Ø¨Ø®Ø§ÙƒØ«Ø±Ø¨Ø§Ø±ÙƒØ§ÙØ¶Ù„Ø§Ø­Ù„Ù‰Ù†ÙØ³Ù‡Ø£ÙŠØ§Ù…ردودأنهاديناالانمعرضتعلمداخلممكن���������������������� +  + ÿÿÿÿ��������ÿÿÿÿ������������������ÿÿ������ÿÿ����������������resourcescountriesquestionsequipmentcommunityavailablehighlightDTD/xhtmlmarketingknowledgesomethingcontainerdirectionsubscribeadvertisecharacter" value="</select>Australia" class="situationauthorityfollowingprimarilyoperationchallengedevelopedanonymousfunction functionscompaniesstructureagreement" title="potentialeducationargumentssecondarycopyrightlanguagesexclusivecondition</form> +statementattentionBiography} else { +solutionswhen the Analyticstemplatesdangeroussatellitedocumentspublisherimportantprototypeinfluence»</effectivegenerallytransformbeautifultransportorganizedpublishedprominentuntil thethumbnailNational .focus();over the migrationannouncedfooter"> +exceptionless thanexpensiveformationframeworkterritoryndicationcurrentlyclassNamecriticismtraditionelsewhereAlexanderappointedmaterialsbroadcastmentionedaffiliate</option>treatmentdifferent/default.Presidentonclick="biographyotherwisepermanentFrançaisHollywoodexpansionstandards</style> +reductionDecember preferredCambridgeopponentsBusiness confusion> +<title>presentedexplaineddoes not worldwideinterfacepositionsnewspaper</table> +mountainslike the essentialfinancialselectionaction="/abandonedEducationparseInt(stabilityunable to +relationsNote thatefficientperformedtwo yearsSince thethereforewrapper">alternateincreasedBattle ofperceivedtrying tonecessaryportrayedelectionsElizabethdiscoveryinsurances.length;legendaryGeographycandidatecorporatesometimesservices.inheritedCommunityreligiouslocationsCommitteebuildingsthe worldno longerbeginningreferencecannot befrequencytypicallyinto the relative;recordingpresidentinitiallytechniquethe otherit can beexistenceunderlinethis timetelephoneitemscopepracticesadvantage);return For otherprovidingdemocracyboth the extensivesufferingsupportedcomputers functionpracticalsaid thatit may beEnglish +suspectedmargin: 0spiritual + +microsoftgraduallydiscussedhe becameexecutivejquery.jshouseholdconfirmedpurchasedliterallydestroyedup to thevariationremainingit is notcenturiesJapanese among thecompletedalgorithminterestsrebellionundefinedencourageresizableinvolvingsensitiveuniversalprovision(althoughfeaturingconducted), which continued-header">February numerous overflow:componentfragmentsexcellentcolspan="technicalnear the Advanced source ofexpressedHong Kong Facebookmultiple mechanismelevationoffensive + sponsoreddocument.or "there arethose whomovementsprocessesdifficultsubmittedrecommendconvincedpromoting" width=".replace(classicalcoalitionhis firstdecisionsassistantindicatedevolution-wrapper"enough toalong thedelivered--> + + +
Archbishop class="nobeing usedapproachesprivilegesnoscript> +results inmay be theEaster eggmechanismsreasonablePopulationCollectionselected">noscript> /index.phparrival of-jssdk'));managed toincompletecasualtiescompletionChristiansSeptember arithmeticproceduresmight haveProductionit appearsPhilosophyfriendshipleading togiving thetoward theguaranteeddocumentedcolor:#000video gamecommissionreflectingchange theassociatedsans-serifonkeypress; padding:He was theunderlyingtypically , and the srcElementsuccessivesince the should be networkingaccountinguse of thelower thanshows that + complaintscontinuousquantitiesastronomerhe did notdue to itsapplied toan averageefforts tothe futureattempt toTherefore,capabilityRepublicanwas formedElectronickilometerschallengespublishingthe formerindigenousdirectionssubsidiaryconspiracydetails ofand in theaffordablesubstancesreason forconventionitemtype="absolutelysupposedlyremained aattractivetravellingseparatelyfocuses onelementaryapplicablefound thatstylesheetmanuscriptstands for no-repeat(sometimesCommercialin Americaundertakenquarter ofan examplepersonallyindex.php? +percentagebest-knowncreating a" dir="ltrLieutenant +
is said tostructuralreferendummost oftena separate-> +
implementedcan be seenthere was ademonstratecontainer">connectionsthe Britishwas written!important;px; margin-followed byability to complicatedduring the immigrationalso called

as follows:merged withthrough thecommercial pointed outopportunityview of therequirementdivision ofprogramminghe receivedsetInterval">maintainingChristopherMuch of thewritings of" height="2size of theversion of mixture of between theExamples ofeducationalcompetitive onsubmit="director ofdistinctive/DTD XHTML relating totendency toprovince ofwhich woulddespite thescientific legislature.innerHTML allegationsAgriculturewas used inapproach tointelligentyears later,sans-serifdeterminingPerformanceappearances, which is foundationsabbreviatedhigher thans from the individual composed ofsupposed toclaims thatattributionfont-size:1elements ofHistorical his brotherat the timeanniversarygoverned byrelated to ultimately innovationsit is stillcan only bedefinitionstoGMTStringA number ofimg class="Eventually,was changedoccurred inneighboringdistinguishwhen he wasintroducingterrestrialMany of theargues thatan Americanconquest ofwidespread were killedscreen and In order toexpected todescendantsare locatedlegislativegenerations backgroundmost peopleyears afterthere is nothe highestfrequently they do notargued thatshowed thatpredominanttheologicalby the timeconsideringshort-livedcan be usedvery littleone of the had alreadyinterpretedcommunicatefeatures ofgovernment,entered the" height="3Independentpopulationslarge-scale. Although used in thedestructionpossibilitystarting intwo or moreexpressionssubordinatelarger thanhistory and +Continentaleliminatingwill not bepractice ofin front ofsite of theensure thatto create amississippipotentiallyoutstandingbetter thanwhat is nowsituated inmeta name="TraditionalsuggestionsTranslationthe form ofatmosphericideologicalenterprisescalculatingeast of theremnants ofpluginspage/index.php?remained intransformedHe was alsowas alreadystatisticalin favor ofMinistry ofmovement offormulationis required +question ofwas electedto become abecause of some peopleinspired bysuccessful a time whenmore commonamongst thean officialwidth:100%;technology,was adoptedto keep thesettlementslive birthsindex.html"Connecticutassigned to&times;account foralign=rightthe companyalways beenreturned toinvolvementBecause thethis period" name="q" confined toa result ofvalue="" />is actuallyEnvironment + +Conversely,> +
this is notthe presentif they areand finallya matter of +
+ +faster thanmajority ofafter whichcomparativeto maintainimprove theawarded theer" class="frameborderrestorationin the sameanalysis oftheir firstDuring the continentalsequence offunction(){font-size: work on the +adopted theproperty ofdirected byeffectivelywas broughtchildren ofProgramminglonger thanmanuscriptswar againstby means ofand most ofsimilar to proprietaryoriginatingprestigiousgrammaticalexperience.to make theIt was alsois found incompetitorsin the U.S.replace thebrought thecalculationfall of thethe generalpracticallyin honor ofreleased inresidentialand some ofking of thereaction to1st Earl ofculture andprincipally + they can beback to thesome of hisexposure toare similarform of theaddFavoritecitizenshippart in thepeople within practiceto continue&minus;approved by the first allowed theand for thefunctioningplaying thesolution toheight="0" in his bookmore than afollows thecreated thepresence in nationalistthe idea ofa characterwere forced class="btndays of thefeatured inshowing theinterest inin place ofturn of thethe head ofLord of thepoliticallyhas its ownEducationalapproval ofsome of theeach other,behavior ofand becauseand anotherappeared onrecorded inblack"may includethe world'scan lead torefers to aborder="0" government winning theresulted in while the Washington,the subjectcity in the>

+ reflect theto completebecame moreradioactiverejected bywithout anyhis father,which couldcopy of theto indicatea politicalaccounts ofconstitutesworked witherof his lifeaccompaniedclientWidthprevent theLegislativedifferentlytogether inhas severalfor anothertext of thefounded thee with the is used forchanged theusually theplace wherewhereas the> The currentthe site ofsubstantialexperience,in the Westthey shouldslovenÄinacomentariosuniversidadcondicionesactividadesexperienciatecnologíaproducciónpuntuaciónaplicacióncontraseñacategoríasregistrarseprofesionaltratamientoregístratesecretaríaprincipalesprotecciónimportantesimportanciaposibilidadinteresantecrecimientonecesidadessuscribirseasociacióndisponiblesevaluaciónestudiantesresponsableresoluciónguadalajararegistradosoportunidadcomercialesfotografíaautoridadesingenieríatelevisióncompetenciaoperacionesestablecidosimplementeactualmentenavegaciónconformidadline-height:font-family:" : "http://applicationslink" href="specifically// +/index.html"window.open( !important;application/independence//www.googleorganizationautocompleterequirementsconservative
most notably/>
notification'undefined')Furthermore,believe thatinnerHTML = prior to thedramaticallyreferring tonegotiationsheadquartersSouth AfricaunsuccessfulPennsylvaniaAs a result, +
English (US)appendChild(transmissions. However, intelligence" tabindex="float:right;Commonwealthranging fromin which theat least onereproductionencyclopedia;font-size:1jurisdictionat that time">compensationchampionshipmedia="all" violation ofreference toreturn true;Strict//EN" transactionsinterventionverificationInformation difficultiesChampionshipcapabilities} + +Christianityfor example,Professionalrestrictionssuggest thatwas released(such as theremoveClass(unemploymentthe Americanstructure of/index.html published inspan class=""> + +f (document.border: 1px {font-size:1treatment of0" height="1modificationIndependencedivided intogreater thanachievementsestablishingJavaScript" neverthelesssignificanceBroadcasting> container"> +such as the influence ofa particularsrc='http://navigation" half of the substantial  advantage ofdiscovery offundamental metropolitanthe opposite" xml:lang="deliberatelyalign=centerevolution ofpreservationimprovementsbeginning inJesus ChristPublicationsdisagreementtext-align:r, function()similaritiesbody>is currentlyalphabeticalis sometimestype="image/many of the flow:hidden;available indescribe theexistence ofall over thethe Internet