Compare commits

..
13 Commits
Author SHA1 Message Date
Zach Nelson 8959836e46 Restore lost block-quote on WARNING
Compile Release / build-release (push) Canceled after 0s
2026-05-15 14:30:38 -05:00
Chun Ming Lee fd79074d43 fix: handle fallbacks for advance table and prewarm (#1929)
## Summary
- Fixes #1928 by having the prewarm and advance table functions resolve
fallback styles
---

### AI Usage
Did you use AI tools to help write this code?  YES - Codex

---------

Co-authored-by: Uri Tauber <uritaube@gmail.com>
# Conflicts:
#	lib/EpdFont/SdCardFont.cpp
2026-05-15 11:44:20 -05:00
Zach Nelson b971f7bda4 correct broken internal anchor 2026-05-15 11:29:46 -05:00
Justin Mitchell c26e410c58 fix: Add documentation for USB-locked Xteink devices (#1990)
Document the Xteink Unlocker tool requirement for third-party purchased
xteink units that ship with USB flashing locked. Include warnings about
bricking risks when flashing unsupported firmwares (e.g. Papyrix) on
locked devices, as they may permanently lock the device with no recovery
path.
# Conflicts:
#	README.md
2026-05-15 11:00:41 -05:00
Zach Nelson 16e5e5f00b Update flasher links for X3 support 2026-05-15 10:31:52 -05:00
Zach Nelson 74e75746df Update to @Uri-Tauber's README.md 2026-05-15 10:17:54 -05:00
Zach Nelson a7586f20a1 fix: Prepare SD card font caches from txt reader (#1973)
## Summary

SD card font fixes:
- `TxtReaderActivity` needs to call `renderer.ensureSdCardFontReady` to
build the advance lookup table to support rendering with SD card fonts.
This revealed that `TxtReaderActivity` was inconsistently performing
layout with `getTextWidth`, when the renderer actually uses
`getTextAdvanceX`, which can lead to minor inconsistencies in alignment.
- Avoid allocating one big `allText` string in
`ParsedText::layoutAndExtractLines`. Instead, pass the vector of word
strings directly to `SdCardFont::buildAdvanceTable`, where the algorithm
just needs to iterate codepoints anyway.

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? _**PARTIALLY**_

---------

Co-authored-by: Justin Mitchell <justin@jmitch.com>
# Conflicts:
#	lib/EpdFont/SdCardFont.cpp
2026-05-15 09:56:21 -05:00
Zach Nelson b145e4437c Merge remote-tracking branch 'upstream/master' into release/1.3.0 2026-05-12 12:37:43 -05:00
Zach Nelson fcb8793640 Merge branch 'master' into release/1.3.0 2026-05-10 11:07:12 -05:00
Zach Nelson 6c97061629 Merge branch 'master' into release/1.3.0 2026-05-09 21:19:15 -05:00
Zach Nelson 9b2d8388ef Merge branch 'master' into release/1.3.0 2026-05-08 22:08:28 -05:00
Zach Nelson bb3a44f584 Merge branch 'master' into release/1.3.0 2026-05-08 21:57:15 -05:00
Zach Nelson bd546093cb chore: Bump version to 1.3.0 2026-05-04 21:20:17 -05:00
177 changed files with 1402 additions and 16459 deletions
+2 -1
View File
@@ -1 +1,2 @@
custom: ["https://app.royalty.dev/crosspoint-reader/crosspoint-reader"] github: [daveallie]
ko_fi: daveallie
+23 -65
View File
@@ -58,7 +58,6 @@ find src -name "*.cpp" -o -name "*.h" | xargs clang-format -i
6. `constexpr` First: Compile-time constants and lookup tables must be `constexpr`, not just `static const`. This moves computation to compile time, enables dead-branch elimination, and guarantees flash placement. Use `static constexpr` for class-level constants. 6. `constexpr` First: Compile-time constants and lookup tables must be `constexpr`, not just `static const`. This moves computation to compile time, enables dead-branch elimination, and guarantees flash placement. Use `static constexpr` for class-level constants.
7. `std::vector` Pre-allocation: Always call `.reserve(N)` before any `push_back()` loop. Each growth event allocates a new block (2×), copies all elements, then frees the old one — three heap operations that fragment DRAM. When the final size is unknown, estimate conservatively. 7. `std::vector` Pre-allocation: Always call `.reserve(N)` before any `push_back()` loop. Each growth event allocates a new block (2×), copies all elements, then frees the old one — three heap operations that fragment DRAM. When the final size is unknown, estimate conservatively.
8. SPIFFS Write Throttling: Never write a settings file on every user interaction. Guard all writes with a value-change check (`if (newVal == _current) return;`). Progress saves during reading must be debounced — write on activity exit or every N page turns, not on every turn. SPIFFS sectors have a finite erase cycle limit. 8. SPIFFS Write Throttling: Never write a settings file on every user interaction. Guard all writes with a value-change check (`if (newVal == _current) return;`). Progress saves during reading must be debounced — write on activity exit or every N page turns, not on every turn. SPIFFS sectors have a finite erase cycle limit.
9. `new` is not nothrow on ESP32: With `-fno-exceptions`, bare `new` that fails calls `abort()` — it does NOT return `nullptr`. Always use `new (std::nothrow)` and null-check the result, or use `makeUniqueNoThrow<T>()` from `lib/Memory/Memory.h`. Never write bare `new` for any fallible allocation.
--- ---
@@ -161,12 +160,6 @@ if (Storage.openFileForRead("MODULE", "/path/to/file.bin", file)) {
**Usage**: See example above. Uses `FsFile` (SdFat), NOT Arduino `File`. Do NOT add `file.close()` for local variables (see DESTRUCTOR_CLOSES_FILE above). **Usage**: See example above. Uses `FsFile` (SdFat), NOT Arduino `File`. Do NOT add `file.close()` for local variables (see DESTRUCTOR_CLOSES_FILE above).
**SdFat is not thread-safe; all SD access MUST go through HalStorage**:
- SdFat's `SdSpiCard` tracks SPI bus state with an unsynchronized `m_spiActive` bool. Two tasks calling SdFat concurrently can confuse that state machine and end with one task calling `SPIClass::endTransaction()` against a paramLock the *other* task is holding. That trips FreeRTOS's `xTaskPriorityDisinherit` assert (`tasks.c:5156, pxTCB == pxCurrentTCBs[0]`) and panics the system. See SdFat issue #518.
- `HalStorage` serializes everything via `storageMutex`. Downstream code includes `<HalStorage.h>`, which transparently `using FsFile = HalFile;`; every method call (read, write, seek, close) takes the mutex. `HalFile`'s destructor also takes the mutex before letting the underlying SdFat `FsFile` close.
- **Never** call into `SdFat` / `SdSpiCard` / `FsBaseFile` / `SDCardManager` directly. **Never** define `HAL_STORAGE_IMPL` outside `HalStorage.cpp`; that disables the `FsFile -> HalFile` typedef and you'll get a raw SdFat handle that bypasses the mutex.
- If you're storing a raw `FsFile` in a place that won't transitively include `<HalStorage.h>` (rare), include the header explicitly so the typedef applies.
--- ---
## Coding Standards ## Coding Standards
@@ -273,78 +266,43 @@ When a template is necessary, limit instantiations: use explicit template instan
**Rules**: NO exceptions, NO abort(), ALWAYS log before error return **Rules**: NO exceptions, NO abort(), ALWAYS log before error return
### Heap Buffer Allocation ### Acceptable malloc/free Patterns
**Prefer `makeUniqueNoThrow` over `malloc`.** Both are nothrow (return `nullptr` on OOM rather than calling `abort()`), but `malloc` requires a manual `free` on every return path — a common source of leaks. `makeUniqueNoThrow<uint8_t[]>(size)` from `lib/Memory/Memory.h` frees automatically when it goes out of scope. **Source**: [src/activities/home/HomeActivity.cpp:166](../src/activities/home/HomeActivity.cpp), [lib/GfxRenderer/GfxRenderer.cpp:439-440](../lib/GfxRenderer/GfxRenderer.cpp)
**Preferred pattern**: Despite "prefer stack allocation," malloc is acceptable for:
1. **Large temporary buffers** (> 256 bytes, won't fit on stack)
2. **One-time allocations** during activity initialization
3. **Bitmap rendering buffers** (variable size, used briefly)
**Pattern**:
```cpp ```cpp
#include <Memory.h> // Allocate
auto* buffer = static_cast<uint8_t*>(malloc(bufferSize));
auto buffer = makeUniqueNoThrow<uint8_t[]>(bufferSize);
if (!buffer) { if (!buffer) {
LOG_ERR("MODULE", "OOM: %d bytes", bufferSize); LOG_ERR("MODULE", "malloc failed: %d bytes", bufferSize);
return false; return false; // Handle allocation failure
} }
processData(buffer.get(), bufferSize); // Use buffer
// freed automatically — no manual free needed, no leak on early return processData(buffer, bufferSize);
```
**`malloc` or `new (std::nothrow)` are still acceptable** when the buffer must be passed to a C API that takes ownership and frees it itself (e.g., certain SDK callbacks). In that case follow the manual pattern: // Free immediately after use
```cpp free(buffer);
auto* buffer = static_cast<uint8_t*>(malloc(bufferSize)); // or new (std::nothrow) uint8_t[bufferSize] buffer = nullptr;
if (!buffer) {
LOG_ERR("MODULE", "OOM: %d bytes", bufferSize);
return false;
}
sdkApiThatTakesOwnership(buffer, bufferSize); // SDK calls free() / delete[]
``` ```
**Rules**: **Rules**:
- **Prefer `makeUniqueNoThrow`** — automatic cleanup eliminates leak risk on error paths - **ALWAYS check for nullptr** after malloc
- **ALWAYS check for nullptr** after any allocation and `LOG_ERR` before returning false - **Free immediately** after use (don't hold across multiple operations)
- **Raw allocation only** when a C API takes ownership; document why in a comment - **Set to nullptr** after free (avoid use-after-free)
- **Document size**: Comment why stack allocation was rejected
**Examples in codebase**: **Examples in codebase**:
- Memory utilities: [Memory.h](../lib/Memory/Memory.h) (`makeUniqueNoThrow`)
- Cover image buffers: [HomeActivity.cpp:166](../src/activities/home/HomeActivity.cpp) - Cover image buffers: [HomeActivity.cpp:166](../src/activities/home/HomeActivity.cpp)
- Text chunk buffers: [TxtReaderActivity.cpp:259](../src/activities/reader/TxtReaderActivity.cpp)
- Bitmap rendering: [GfxRenderer.cpp:439-440](../lib/GfxRenderer/GfxRenderer.cpp) - Bitmap rendering: [GfxRenderer.cpp:439-440](../lib/GfxRenderer/GfxRenderer.cpp)
- OTA update buffer: [OtaUpdater.cpp:40](../src/network/OtaUpdater.cpp)
### Heap Allocation with `new`: Always Use `makeUniqueNoThrow`
**CRITICAL**: With `-fno-exceptions`, bare `new` on OOM calls `abort()` — it does NOT return `nullptr`. Always use `makeUniqueNoThrow` from `lib/Memory/Memory.h`, which wraps `new (std::nothrow)` and returns a `std::unique_ptr` that is null on OOM and automatically frees on scope exit.
**Preferred pattern**:
```cpp
#include <Memory.h>
auto obj = makeUniqueNoThrow<MyClass>(args);
if (!obj) { LOG_ERR("MOD", "OOM: MyClass"); return false; }
auto buf = makeUniqueNoThrow<uint8_t[]>(size);
if (!buf) { LOG_ERR("MOD", "OOM: %d bytes", size); return false; }
// Pass to C APIs via .get(); unique_ptr frees automatically on return
someApi(buf.get(), size);
```
**`new (std::nothrow)` directly is acceptable** when the object must be passed to a C API that takes ownership and calls `delete` itself:
```cpp
auto* obj = new (std::nothrow) MyClass(args);
if (!obj) { LOG_ERR("MOD", "OOM: MyClass"); return false; }
sdkApiThatTakesOwnership(obj); // SDK calls delete
```
**Rules**:
- **Prefer `makeUniqueNoThrow`** — automatic cleanup eliminates leak risk on error paths
- **NEVER use bare `new`** — always `makeUniqueNoThrow` or `new (std::nothrow)`
- **ALWAYS `LOG_ERR` before returning false** on OOM
- **Use `.get()`** to pass the raw pointer to C-style APIs; ownership stays with the `unique_ptr`
- **`new (std::nothrow)` directly only** when a C API takes ownership; document why in a comment
**Examples in codebase**:
- Memory utilities: [Memory.h](../lib/Memory/Memory.h) (`makeUniqueNoThrow`)
--- ---
-16
View File
@@ -1,7 +1,5 @@
# CrossPoint Reader # CrossPoint Reader
[![Fund contributors](https://img.shields.io/badge/%F0%9F%91%91_Fund_contributors-royalty.dev-BB953A?style=for-the-badge&labelColor=1a1a1a)](https://app.royalty.dev/crosspoint-reader/crosspoint-reader)
CrossPoint is open-source e-reader firmware - community-built, fully hackable, free forever. It's maintained by a growing community of developers and readers who believe your device should do what you want - not what a manufacturer decided for you. CrossPoint is open-source e-reader firmware - community-built, fully hackable, free forever. It's maintained by a growing community of developers and readers who believe your device should do what you want - not what a manufacturer decided for you.
**Now running on:** ESP32C3-based Xteink [X4](https://www.xteink.com/products/xteink-x4) and [X3](https://www.xteink.com/products/xteink-x3). **Now running on:** ESP32C3-based Xteink [X4](https://www.xteink.com/products/xteink-x4) and [X3](https://www.xteink.com/products/xteink-x3).
@@ -123,20 +121,6 @@ See [Development quick start](#development-quick-start) below.
--- ---
## Custom SD-card fonts
Convert your own TTF/OTF files into `.cpfont` files that load from the SD card. No firmware reflash is needed.
1. Go to https://crosspointreader.com/fonts and open the "SD-card font builder" form.
2. Upload up to four styles (regular, bold, italic, bold-italic), set the family name, point sizes, and Unicode range.
3. Download the generated `.cpfont` files.
4. Copy them to your SD card under `/fonts/YourFont/` (or `/.fonts/YourFont/` to hide the folder).
5. Select the font on the device from the font settings.
Conversion runs the firmware repo's `lib/EpdFont/scripts/fontconvert_sdcard.py` script unmodified, so output matches a local host build.
---
## Documentation ## Documentation
- [User Guide](./USER_GUIDE.md) - [User Guide](./USER_GUIDE.md)
+4 -25
View File
@@ -104,7 +104,7 @@ if (parsedSize != fileSize) {
## `section.bin` ## `section.bin`
### Version 24 ### Version 8
ImHex Pattern: ImHex Pattern:
@@ -114,7 +114,7 @@ import std.string;
import std.core; import std.core;
// === Configuration === // === Configuration ===
#define EXPECTED_VERSION 24 #define EXPECTED_VERSION 8
#define MAX_STRING_LENGTH 65535 #define MAX_STRING_LENGTH 65535
// === String Structure === // === String Structure ===
@@ -133,10 +133,8 @@ fn format_string(String s) {
// === Page Structure === // === Page Structure ===
enum PageElementTag : u8 { enum StorageType : u8 {
PageLine = 1, PageLine = 1
PageImage = 2,
PageHorizontalRule = 3
}; };
enum WordStyle : u8 { enum WordStyle : u8 {
@@ -163,29 +161,10 @@ struct PageLine {
BlockStyle blockStyle; BlockStyle blockStyle;
}; };
struct PageImage {
s16 xPos;
s16 yPos;
String imagePath;
s16 width;
s16 height;
};
struct PageHorizontalRule {
s16 xPos;
s16 yPos;
u16 width;
u8 thickness;
};
struct PageElement { struct PageElement {
u8 pageElementType; u8 pageElementType;
if (pageElementType == 1) { if (pageElementType == 1) {
PageLine pageLine [[inline]]; PageLine pageLine [[inline]];
} else if (pageElementType == 2) {
PageImage pageImage [[inline]];
} else if (pageElementType == 3) {
PageHorizontalRule horizontalRule [[inline]];
} else { } else {
std::error(std::format("Unknown page element type: {}", pageElementType)); std::error(std::format("Unknown page element type: {}", pageElementType));
} }
-1
View File
@@ -97,7 +97,6 @@ To convert your own TrueType/OpenType fonts:
| `cyrillic` | Cyrillic + Supplement | | `cyrillic` | Cyrillic + Supplement |
| `cjk` | CJK Unified Ideographs + Hiragana + Katakana + Fullwidth | | `cjk` | CJK Unified Ideographs + Hiragana + Katakana + Fullwidth |
| `hangul` | Korean Hangul syllables | | `hangul` | Korean Hangul syllables |
| `reading` | Literary fiction coverage: Latin, Greek, Cyrillic, math/symbol blocks, supplemental punctuation, and CJK quote marks |
| `builtin` | Matches built-in Bookerly coverage exactly | | `builtin` | Matches built-in Bookerly coverage exactly |
Combine presets with commas: `--intervals latin-ext,greek,cyrillic` Combine presets with commas: `--intervals latin-ext,greek,cyrillic`
+16 -17
View File
@@ -204,41 +204,40 @@ Folder created: NewFolder
### POST `/delete` - Delete File or Folder ### POST `/delete` - Delete File or Folder
Deletes one or more files or empty folders from the SD card. Deletes a file or folder from the SD card.
**Request:** **Request:**
```bash ```bash
# Delete a file # Delete a file
curl -X POST -d "path=/Books/mybook.epub" http://crosspoint.local/delete curl -X POST -d "path=/Books/mybook.epub&type=file" http://crosspoint.local/delete
# Delete an empty folder # Delete an empty folder
curl -X POST -d "path=/OldFolder" http://crosspoint.local/delete curl -X POST -d "path=/OldFolder&type=folder" http://crosspoint.local/delete
# Delete multiple items
curl -X POST -d 'paths=["/Books/old.epub","/OldFolder"]' http://crosspoint.local/delete
``` ```
**Form Parameters:** **Form Parameters:**
| Parameter | Required | Default | Description | | Parameter | Required | Default | Description |
| --------- | -------- | ------- | ----------- | | --------- | -------- | ------- | -------------------------------- |
| `path` | Yes, unless `paths` is provided | - | Path to one item to delete | | `path` | Yes | - | Path to the item to delete |
| `paths` | Yes, unless `path` is provided | - | JSON array of paths to delete | | `type` | No | `file` | Type of item: `file` or `folder` |
**Response (200 OK):** **Response (200 OK):**
```text ```
All items deleted successfully Deleted successfully
``` ```
**Error Responses:** **Error Responses:**
| Status | Body | Cause | | Status | Body | Cause |
| ------ | ------------------------------------------- | ---------------------------------- | | ------ | --------------------------------------------- | ----------------------------- |
| 400 | `Missing "path" or "paths" argument` | Neither parameter was provided | | 400 | `Missing path` | `path` parameter not provided |
| 400 | `Provide either 'path' or 'paths', not both` | Both delete parameters were sent | | 400 | `Cannot delete root directory` | Attempted to delete `/` |
| 400 | `Invalid paths format` | `paths` was not valid JSON | | 400 | `Folder is not empty. Delete contents first.` | Non-empty folder |
| 400 | `No paths provided` | `paths` was an empty JSON array | | 403 | `Cannot delete system files` | Hidden file (starts with `.`) |
| 500 | `Failed to delete some items: ...` | One or more paths could not be deleted | | 403 | `Cannot delete protected items` | Protected system folder |
| 404 | `Item not found` | Path does not exist |
| 500 | `Failed to delete item` | SD card error |
**Protected Items:** **Protected Items:**
- Files/folders starting with `.` - Files/folders starting with `.`
-4
View File
@@ -1079,18 +1079,14 @@ int SdCardFont::fetchAdvancesForCodepoints(uint32_t* codepoints, uint32_t cpCoun
uint32_t needCount = 0; uint32_t needCount = 0;
uint32_t missedThisStyle = 0; uint32_t missedThisStyle = 0;
const int32_t replacementIdx = findGlobalGlyphIndex(s, REPLACEMENT_GLYPH);
for (uint32_t i = 0; i < cpCount; i++) { for (uint32_t i = 0; i < cpCount; i++) {
const uint32_t cp = codepoints[i]; const uint32_t cp = codepoints[i];
if (advanceTableLookup(si, cp, nullptr)) continue; // already cached if (advanceTableLookup(si, cp, nullptr)) continue; // already cached
int32_t idx = findGlobalGlyphIndex(s, cp); int32_t idx = findGlobalGlyphIndex(s, cp);
if (idx < 0) { if (idx < 0) {
if (replacementIdx < 0) {
missedThisStyle++; missedThisStyle++;
continue; continue;
} }
idx = replacementIdx;
}
mappings[needCount].codepoint = cp; mappings[needCount].codepoint = cp;
mappings[needCount].glyphIndex = idx; mappings[needCount].glyphIndex = idx;
needCount++; needCount++;
+1 -3
View File
@@ -59,14 +59,12 @@ INTERVAL_PRESETS = {
(0x2190, 0x21FF), (0x2200, 0x22FF), (0x2500, 0x257F), (0x2190, 0x21FF), (0x2200, 0x22FF), (0x2500, 0x257F),
(0x25A0, 0x25FF), (0x2600, 0x26FF), (0x2700, 0x27BF)], (0x25A0, 0x25FF), (0x2600, 0x26FF), (0x2700, 0x27BF)],
# Composite preset for English-language literary fiction including scifi/popsci. # Composite preset for English-language literary fiction including scifi/popsci.
# Greek for physics terms, math operators, geometric shapes, uncommon # Greek for physics terms, math operators, miscellaneous symbols (♪♫♬), dingbats.
# dialogue punctuation, CJK quote marks, miscellaneous symbols (♪♫♬), dingbats.
"reading": [(0x0020, 0x024F), (0x0300, 0x036F), (0x0370, 0x03FF), "reading": [(0x0020, 0x024F), (0x0300, 0x036F), (0x0370, 0x03FF),
(0x0400, 0x04FF), (0x1E00, 0x1EFF), (0x2000, 0x206F), (0x0400, 0x04FF), (0x1E00, 0x1EFF), (0x2000, 0x206F),
(0x2070, 0x209F), (0x20A0, 0x20CF), (0x2150, 0x218F), (0x2070, 0x209F), (0x20A0, 0x20CF), (0x2150, 0x218F),
(0x2190, 0x21FF), (0x2200, 0x22FF), (0x2500, 0x257F), (0x2190, 0x21FF), (0x2200, 0x22FF), (0x2500, 0x257F),
(0x25A0, 0x25FF), (0x2600, 0x26FF), (0x2700, 0x27BF), (0x25A0, 0x25FF), (0x2600, 0x26FF), (0x2700, 0x27BF),
(0x2900, 0x29FF), (0x2E00, 0x2E7F), (0x3000, 0x303F),
(0xFB00, 0xFB06)], (0xFB00, 0xFB06)],
# Matches the built-in font intervals from fontconvert.py exactly # Matches the built-in font intervals from fontconvert.py exactly
"builtin": [(0x0000, 0x007F), (0x0080, 0x00FF), (0x0100, 0x017F), "builtin": [(0x0000, 0x007F), (0x0080, 0x00FF), (0x0100, 0x017F),
-11
View File
@@ -113,17 +113,6 @@ families:
italic: {url: "https://raw.githubusercontent.com/google/fonts/main/ofl/bitter/Bitter-Italic%5Bwght%5D.ttf", variable: {wght: 500}} italic: {url: "https://raw.githubusercontent.com/google/fonts/main/ofl/bitter/Bitter-Italic%5Bwght%5D.ttf", variable: {wght: 500}}
bolditalic: {url: "https://raw.githubusercontent.com/google/fonts/main/ofl/bitter/Bitter-Italic%5Bwght%5D.ttf", variable: {wght: 700}} bolditalic: {url: "https://raw.githubusercontent.com/google/fonts/main/ofl/bitter/Bitter-Italic%5Bwght%5D.ttf", variable: {wght: 700}}
- name: Domitian
description: "A humanist serif for literary reading (Latin, Greek, Cyrillic)"
intervals: latin-ext,greek,cyrillic
sizes: [12, 14, 16, 18]
styles:
regular: {url: "https://mirrors.ctan.org/fonts/domitian/opentype/Domitian-Roman.otf"}
bold: {url: "https://mirrors.ctan.org/fonts/domitian/opentype/Domitian-Bold.otf"}
italic: {url: "https://mirrors.ctan.org/fonts/domitian/opentype/Domitian-Italic.otf"}
bolditalic: {url: "https://mirrors.ctan.org/fonts/domitian/opentype/Domitian-BoldItalic.otf"}
# ── Sans-serif ───────────────────────────────────────────────────────── # ── Sans-serif ─────────────────────────────────────────────────────────
- name: NotoSansExtended - name: NotoSansExtended
-50
View File
@@ -1,11 +1,8 @@
#include "Page.h" #include "Page.h"
#include <GfxRenderer.h>
#include <Logging.h> #include <Logging.h>
#include <Serialization.h> #include <Serialization.h>
#include <new>
void PageLine::render(GfxRenderer& renderer, const int fontId, const int xOffset, const int yOffset) { void PageLine::render(GfxRenderer& renderer, const int fontId, const int xOffset, const int yOffset) {
block->render(renderer, fontId, xPos + xOffset, yPos + yOffset); block->render(renderer, fontId, xPos + xOffset, yPos + yOffset);
} }
@@ -51,47 +48,6 @@ std::unique_ptr<PageImage> PageImage::deserialize(FsFile& file) {
return std::unique_ptr<PageImage>(new PageImage(std::move(ib), xPos, yPos)); return std::unique_ptr<PageImage>(new PageImage(std::move(ib), xPos, yPos));
} }
void PageHorizontalRule::render(GfxRenderer& renderer, const int fontId, const int xOffset, const int yOffset) {
(void)fontId;
if (width == 0 || thickness == 0) {
return;
}
renderer.drawLine(xPos + xOffset, yPos + yOffset, xPos + xOffset + width - 1, yPos + yOffset, thickness, true);
}
bool PageHorizontalRule::serialize(FsFile& file) {
serialization::writePod(file, xPos);
serialization::writePod(file, yPos);
serialization::writePod(file, width);
serialization::writePod(file, thickness);
return true;
}
std::unique_ptr<PageHorizontalRule> PageHorizontalRule::deserialize(FsFile& file) {
int16_t xPos = 0;
int16_t yPos = 0;
uint16_t width = 0;
uint8_t thickness = 0;
serialization::readPod(file, xPos);
serialization::readPod(file, yPos);
serialization::readPod(file, width);
serialization::readPod(file, thickness);
if (width == 0 || thickness == 0) {
LOG_ERR("PGE", "Deserialization failed: invalid horizontal rule metadata (width=%u thickness=%u)", width,
thickness);
return nullptr;
}
auto* rule = new (std::nothrow) PageHorizontalRule(width, thickness, xPos, yPos);
if (!rule) {
LOG_ERR("PGE", "Deserialization failed: could not allocate PageHorizontalRule");
return nullptr;
}
return std::unique_ptr<PageHorizontalRule>(rule);
}
void Page::render(GfxRenderer& renderer, const int fontId, const int xOffset, const int yOffset) const { void Page::render(GfxRenderer& renderer, const int fontId, const int xOffset, const int yOffset) const {
for (auto& element : elements) { for (auto& element : elements) {
element->render(renderer, fontId, xOffset, yOffset); element->render(renderer, fontId, xOffset, yOffset);
@@ -142,12 +98,6 @@ std::unique_ptr<Page> Page::deserialize(FsFile& file) {
} else if (tag == TAG_PageImage) { } else if (tag == TAG_PageImage) {
auto pi = PageImage::deserialize(file); auto pi = PageImage::deserialize(file);
page->elements.push_back(std::move(pi)); page->elements.push_back(std::move(pi));
} else if (tag == TAG_PageHorizontalRule) {
auto rule = PageHorizontalRule::deserialize(file);
if (!rule) {
return nullptr;
}
page->elements.push_back(std::move(rule));
} else { } else {
LOG_ERR("PGE", "Deserialization failed: Unknown tag %u", tag); LOG_ERR("PGE", "Deserialization failed: Unknown tag %u", tag);
return nullptr; return nullptr;
+1 -16
View File
@@ -12,8 +12,7 @@
enum PageElementTag : uint8_t { enum PageElementTag : uint8_t {
TAG_PageLine = 1, TAG_PageLine = 1,
TAG_PageImage = 2, TAG_PageImage = 2, // New tag
TAG_PageHorizontalRule = 3,
}; };
// represents something that has been added to a page // represents something that has been added to a page
@@ -56,20 +55,6 @@ class PageImage final : public PageElement {
const ImageBlock& getImageBlock() const { return *imageBlock; } const ImageBlock& getImageBlock() const { return *imageBlock; }
}; };
class PageHorizontalRule final : public PageElement {
uint16_t width;
uint8_t thickness;
public:
PageHorizontalRule(uint16_t width, uint8_t thickness, const int16_t xPos, const int16_t yPos)
: PageElement(xPos, yPos), width(width), thickness(thickness) {}
void render(GfxRenderer& renderer, int fontId, int xOffset, int yOffset) override;
bool serialize(FsFile& file) override;
PageElementTag getTag() const override { return TAG_PageHorizontalRule; }
static std::unique_ptr<PageHorizontalRule> deserialize(FsFile& file);
};
class Page { class Page {
public: public:
// the list of block index and line numbers on this page // the list of block index and line numbers on this page
+1 -1
View File
@@ -10,7 +10,7 @@
#include "parsers/ChapterHtmlSlimParser.h" #include "parsers/ChapterHtmlSlimParser.h"
namespace { namespace {
constexpr uint8_t SECTION_FILE_VERSION = 24; constexpr uint8_t SECTION_FILE_VERSION = 23;
constexpr uint32_t HEADER_SIZE = sizeof(uint8_t) + sizeof(int) + sizeof(float) + sizeof(bool) + sizeof(uint8_t) + constexpr uint32_t HEADER_SIZE = sizeof(uint8_t) + sizeof(int) + sizeof(float) + sizeof(bool) + sizeof(uint8_t) +
sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(bool) + sizeof(bool) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(uint16_t) + sizeof(bool) + sizeof(bool) +
sizeof(uint8_t) + sizeof(bool) + sizeof(uint32_t) + sizeof(uint32_t) + sizeof(uint8_t) + sizeof(bool) + sizeof(uint32_t) + sizeof(uint32_t) +
+2 -2
View File
@@ -4,8 +4,8 @@
#include <Logging.h> #include <Logging.h>
#include <Serialization.h> #include <Serialization.h>
#include "Epub/converters/DirectPixelWriter.h" #include "../converters/DirectPixelWriter.h"
#include "Epub/converters/ImageDecoderFactory.h" #include "../converters/ImageDecoderFactory.h"
// Cache file format: // Cache file format:
// - uint16_t width // - uint16_t width
@@ -5,10 +5,8 @@
#include <HalStorage.h> #include <HalStorage.h>
#include <JPEGDEC.h> #include <JPEGDEC.h>
#include <Logging.h> #include <Logging.h>
#include <Memory.h>
#include <cstdlib> #include <cstdlib>
#include <memory>
#include <new> #include <new>
#include "DirectPixelWriter.h" #include "DirectPixelWriter.h"
@@ -349,16 +347,16 @@ bool JpegToFramebufferConverter::getDimensionsStatic(const std::string& imagePat
return false; return false;
} }
std::unique_ptr<JPEGDEC> jpeg(new (std::nothrow) JPEGDEC()); JPEGDEC* jpeg = new (std::nothrow) JPEGDEC();
if (!jpeg) { if (!jpeg) {
LOG_ERR("JPG", "Failed to allocate JPEG decoder for dimensions"); LOG_ERR("JPG", "Failed to allocate JPEG decoder for dimensions");
return false; return false;
} }
int rc = jpeg->open(imagePath.c_str(), jpegOpen, jpegClose, jpegRead, jpegSeek, nullptr); int rc = jpeg->open(imagePath.c_str(), jpegOpen, jpegClose, jpegRead, jpegSeek, nullptr);
const ScopedCleanup cleanup{[&jpeg]() { jpeg->close(); }};
if (rc != 1) { if (rc != 1) {
LOG_ERR("JPG", "Failed to open JPEG for dimensions (err=%d): %s", jpeg->getLastError(), imagePath.c_str()); LOG_ERR("JPG", "Failed to open JPEG for dimensions (err=%d): %s", jpeg->getLastError(), imagePath.c_str());
delete jpeg;
return false; return false;
} }
@@ -366,6 +364,8 @@ bool JpegToFramebufferConverter::getDimensionsStatic(const std::string& imagePat
out.height = jpeg->getHeight(); out.height = jpeg->getHeight();
LOG_DBG("JPG", "Image dimensions: %dx%d", out.width, out.height); LOG_DBG("JPG", "Image dimensions: %dx%d", out.width, out.height);
jpeg->close();
delete jpeg;
return true; return true;
} }
@@ -379,7 +379,7 @@ bool JpegToFramebufferConverter::decodeToFramebuffer(const std::string& imagePat
return false; return false;
} }
std::unique_ptr<JPEGDEC> jpeg(new (std::nothrow) JPEGDEC()); JPEGDEC* jpeg = new (std::nothrow) JPEGDEC();
if (!jpeg) { if (!jpeg) {
LOG_ERR("JPG", "Failed to allocate JPEG decoder"); LOG_ERR("JPG", "Failed to allocate JPEG decoder");
return false; return false;
@@ -392,9 +392,9 @@ bool JpegToFramebufferConverter::decodeToFramebuffer(const std::string& imagePat
ctx.screenHeight = renderer.getScreenHeight(); ctx.screenHeight = renderer.getScreenHeight();
int rc = jpeg->open(imagePath.c_str(), jpegOpen, jpegClose, jpegRead, jpegSeek, jpegDrawCallback); int rc = jpeg->open(imagePath.c_str(), jpegOpen, jpegClose, jpegRead, jpegSeek, jpegDrawCallback);
const ScopedCleanup cleanup{[&jpeg]() { jpeg->close(); }};
if (rc != 1) { if (rc != 1) {
LOG_ERR("JPG", "Failed to open JPEG (err=%d): %s", jpeg->getLastError(), imagePath.c_str()); LOG_ERR("JPG", "Failed to open JPEG (err=%d): %s", jpeg->getLastError(), imagePath.c_str());
delete jpeg;
return false; return false;
} }
@@ -403,10 +403,14 @@ bool JpegToFramebufferConverter::decodeToFramebuffer(const std::string& imagePat
if (srcWidth <= 0 || srcHeight <= 0) { if (srcWidth <= 0 || srcHeight <= 0) {
LOG_ERR("JPG", "Invalid JPEG dimensions: %dx%d", srcWidth, srcHeight); LOG_ERR("JPG", "Invalid JPEG dimensions: %dx%d", srcWidth, srcHeight);
jpeg->close();
delete jpeg;
return false; return false;
} }
if (!validateImageDimensions(srcWidth, srcHeight, "JPEG")) { if (!validateImageDimensions(srcWidth, srcHeight, "JPEG")) {
jpeg->close();
delete jpeg;
return false; return false;
} }
@@ -449,6 +453,8 @@ bool JpegToFramebufferConverter::decodeToFramebuffer(const std::string& imagePat
if (destWidth <= 0 || destHeight <= 0) { if (destWidth <= 0 || destHeight <= 0) {
LOG_ERR("JPG", "Degenerate output dimensions %dx%d for %s, skipping render", destWidth, destHeight, LOG_ERR("JPG", "Degenerate output dimensions %dx%d for %s, skipping render", destWidth, destHeight,
imagePath.c_str()); imagePath.c_str());
jpeg->close();
delete jpeg;
return false; return false;
} }
@@ -484,9 +490,13 @@ bool JpegToFramebufferConverter::decodeToFramebuffer(const std::string& imagePat
if (rc != 1) { if (rc != 1) {
LOG_ERR("JPG", "Decode failed (rc=%d, lastError=%d)", rc, jpeg->getLastError()); LOG_ERR("JPG", "Decode failed (rc=%d, lastError=%d)", rc, jpeg->getLastError());
jpeg->close();
delete jpeg;
return false; return false;
} }
jpeg->close();
delete jpeg;
LOG_DBG("JPG", "JPEG decoding complete - render time: %lu ms", decodeTime); LOG_DBG("JPG", "JPEG decoding complete - render time: %lu ms", decodeTime);
// Write cache file if caching was enabled // Write cache file if caching was enabled
@@ -4,11 +4,9 @@
#include <GfxRenderer.h> #include <GfxRenderer.h>
#include <HalStorage.h> #include <HalStorage.h>
#include <Logging.h> #include <Logging.h>
#include <Memory.h>
#include <PNGdec.h> #include <PNGdec.h>
#include <cstdlib> #include <cstdlib>
#include <memory>
#include <new> #include <new>
#include "DirectPixelWriter.h" #include "DirectPixelWriter.h"
@@ -246,7 +244,7 @@ bool PngToFramebufferConverter::getDimensionsStatic(const std::string& imagePath
return false; return false;
} }
std::unique_ptr<PNG> png(new (std::nothrow) PNG()); PNG* png = new (std::nothrow) PNG();
if (!png) { if (!png) {
LOG_ERR("PNG", "Failed to allocate PNG decoder for dimensions"); LOG_ERR("PNG", "Failed to allocate PNG decoder for dimensions");
return false; return false;
@@ -254,16 +252,18 @@ bool PngToFramebufferConverter::getDimensionsStatic(const std::string& imagePath
int rc = png->open(imagePath.c_str(), pngOpenWithHandle, pngCloseWithHandle, pngReadWithHandle, pngSeekWithHandle, int rc = png->open(imagePath.c_str(), pngOpenWithHandle, pngCloseWithHandle, pngReadWithHandle, pngSeekWithHandle,
nullptr); nullptr);
const ScopedCleanup cleanup{[&png]() { png->close(); }};
if (rc != 0) { if (rc != 0) {
LOG_ERR("PNG", "Failed to open PNG for dimensions: %d", rc); LOG_ERR("PNG", "Failed to open PNG for dimensions: %d", rc);
delete png;
return false; return false;
} }
out.width = png->getWidth(); out.width = png->getWidth();
out.height = png->getHeight(); out.height = png->getHeight();
png->close();
delete png;
return true; return true;
} }
@@ -278,7 +278,7 @@ bool PngToFramebufferConverter::decodeToFramebuffer(const std::string& imagePath
} }
// Heap-allocate PNG decoder (~42 KB) - freed at end of function // Heap-allocate PNG decoder (~42 KB) - freed at end of function
std::unique_ptr<PNG> png(new (std::nothrow) PNG()); PNG* png = new (std::nothrow) PNG();
if (!png) { if (!png) {
LOG_ERR("PNG", "Failed to allocate PNG decoder"); LOG_ERR("PNG", "Failed to allocate PNG decoder");
return false; return false;
@@ -292,13 +292,15 @@ bool PngToFramebufferConverter::decodeToFramebuffer(const std::string& imagePath
int rc = png->open(imagePath.c_str(), pngOpenWithHandle, pngCloseWithHandle, pngReadWithHandle, pngSeekWithHandle, int rc = png->open(imagePath.c_str(), pngOpenWithHandle, pngCloseWithHandle, pngReadWithHandle, pngSeekWithHandle,
pngDrawCallback); pngDrawCallback);
const ScopedCleanup cleanup{[&png]() { png->close(); }};
if (rc != PNG_SUCCESS) { if (rc != PNG_SUCCESS) {
LOG_ERR("PNG", "Failed to open PNG: %d", rc); LOG_ERR("PNG", "Failed to open PNG: %d", rc);
delete png;
return false; return false;
} }
if (!validateImageDimensions(png->getWidth(), png->getHeight(), "PNG")) { if (!validateImageDimensions(png->getWidth(), png->getHeight(), "PNG")) {
png->close();
delete png;
return false; return false;
} }
@@ -333,6 +335,8 @@ bool PngToFramebufferConverter::decodeToFramebuffer(const std::string& imagePath
"PNG row buffer too small: need %d bytes for width=%d type=%d, configured PNG_MAX_BUFFERED_PIXELS=%d", "PNG row buffer too small: need %d bytes for width=%d type=%d, configured PNG_MAX_BUFFERED_PIXELS=%d",
requiredInternal, ctx.srcWidth, pixelType, PNG_MAX_BUFFERED_PIXELS); requiredInternal, ctx.srcWidth, pixelType, PNG_MAX_BUFFERED_PIXELS);
LOG_ERR("PNG", "Aborting decode to avoid PNGdec internal buffer overflow"); LOG_ERR("PNG", "Aborting decode to avoid PNGdec internal buffer overflow");
png->close();
delete png;
return false; return false;
} }
@@ -345,6 +349,8 @@ bool PngToFramebufferConverter::decodeToFramebuffer(const std::string& imagePath
ctx.grayLineBuffer = static_cast<uint8_t*>(malloc(grayBufSize)); ctx.grayLineBuffer = static_cast<uint8_t*>(malloc(grayBufSize));
if (!ctx.grayLineBuffer) { if (!ctx.grayLineBuffer) {
LOG_ERR("PNG", "Failed to allocate gray line buffer"); LOG_ERR("PNG", "Failed to allocate gray line buffer");
png->close();
delete png;
return false; return false;
} }
@@ -374,9 +380,13 @@ bool PngToFramebufferConverter::decodeToFramebuffer(const std::string& imagePath
if (rc != PNG_SUCCESS) { if (rc != PNG_SUCCESS) {
LOG_ERR("PNG", "Decode failed: %d", rc); LOG_ERR("PNG", "Decode failed: %d", rc);
png->close();
delete png;
return false; return false;
} }
png->close();
delete png;
LOG_DBG("PNG", "PNG decoding complete - render time: %lu ms", decodeTime); LOG_DBG("PNG", "PNG decoding complete - render time: %lu ms", decodeTime);
// Write cache file if caching was enabled and buffer was allocated // Write cache file if caching was enabled and buffer was allocated
@@ -13,19 +13,9 @@ uint32_t toLowerLatinImpl(const uint32_t cp) {
return cp + 0x20; return cp + 0x20;
} }
// Latin Extended-A (U+0100..U+017E): uppercase letters are paired with
// lowercase at cp+1. Two sub-ranges have different alignment:
// U+0100..U+0137: uppercase on EVEN codepoints
// U+0139..U+0148: uppercase on ODD codepoints
// U+014A..U+0177: uppercase on EVEN codepoints
// U+0179..U+017E: uppercase on ODD codepoints
// Covers Polish (Ą/ą, Ć/ć, Ę/ę, Ł/ł, Ń/ń, Ś/ś, Ź/ź, Ż/ż), Czech, Hungarian, Turkish, etc.
if ((cp >= 0x0100 && cp <= 0x0137 && (cp % 2 == 0)) || (cp >= 0x0139 && cp <= 0x0148 && (cp % 2 == 1)) ||
(cp >= 0x014A && cp <= 0x0177 && (cp % 2 == 0)) || (cp >= 0x0179 && cp <= 0x017E && (cp % 2 == 1))) {
return cp + 1;
}
switch (cp) { switch (cp) {
case 0x0152: // Œ
return 0x0153; // œ
case 0x0178: // Ÿ case 0x0178: // Ÿ
return 0x00FF; // ÿ return 0x00FF; // ÿ
case 0x1E9E: // ẞ case 0x1E9E: // ẞ
@@ -64,11 +54,6 @@ bool isLatinLetter(const uint32_t cp) {
return true; return true;
} }
// Latin Extended-A (U+0100..U+017F): Polish, Czech, Hungarian, Turkish, etc.
if (cp >= 0x0100 && cp <= 0x017F) {
return true;
}
switch (cp) { switch (cp) {
case 0x0152: // Œ case 0x0152: // Œ
case 0x0153: // œ case 0x0153: // œ
@@ -288,30 +273,6 @@ std::vector<CodepointInfo> collectCodepoints(const std::string& word) {
case 0x0079: case 0x0079:
composed = 0x00FD; composed = 0x00FD;
break; // y -> ý break; // y -> ý
case 0x0043:
composed = 0x0106;
break; // C -> Ć
case 0x0063:
composed = 0x0107;
break; // c -> ć
case 0x004E:
composed = 0x0143;
break; // N -> Ń
case 0x006E:
composed = 0x0144;
break; // n -> ń
case 0x0053:
composed = 0x015A;
break; // S -> Ś
case 0x0073:
composed = 0x015B;
break; // s -> ś
case 0x005A:
composed = 0x0179;
break; // Z -> Ź
case 0x007A:
composed = 0x017A;
break; // z -> ź
default: default:
break; break;
} }
@@ -412,18 +373,6 @@ std::vector<CodepointInfo> collectCodepoints(const std::string& word) {
break; break;
} }
break; break;
case 0x0307: // dot above (Polish Ż)
switch (prev) {
case 0x005A:
composed = 0x017B;
break; // Z -> Ż
case 0x007A:
composed = 0x017C;
break; // z -> ż
default:
break;
}
break;
case 0x0327: // cedilla case 0x0327: // cedilla
switch (prev) { switch (prev) {
case 0x0043: case 0x0043:
@@ -436,24 +385,6 @@ std::vector<CodepointInfo> collectCodepoints(const std::string& word) {
break; break;
} }
break; break;
case 0x0328: // ogonek (Polish Ą, Ę)
switch (prev) {
case 0x0041:
composed = 0x0104;
break; // A -> Ą
case 0x0061:
composed = 0x0105;
break; // a -> ą
case 0x0045:
composed = 0x0118;
break; // E -> Ę
case 0x0065:
composed = 0x0119;
break; // e -> ę
default:
break;
}
break;
default: default:
break; break;
} }
+4 -3
View File
@@ -22,9 +22,10 @@ struct Iso639Mapping {
const char* iso639_2; const char* iso639_2;
const char* iso639_1; const char* iso639_1;
}; };
static constexpr Iso639Mapping kIso639Mappings[] = {{"eng", "en"}, {"fra", "fr"}, {"fre", "fr"}, {"deu", "de"}, static constexpr Iso639Mapping kIso639Mappings[] = {
{"ger", "de"}, {"rus", "ru"}, {"spa", "es"}, {"ita", "it"}, {"eng", "en"}, {"fra", "fr"}, {"fre", "fr"}, {"deu", "de"}, {"ger", "de"},
{"ukr", "uk"}, {"swe", "sv"}}; {"rus", "ru"}, {"spa", "es"}, {"ita", "it"}, {"ukr", "uk"},
};
// Maps a BCP-47 or ISO 639-2 language tag to a language-specific hyphenator. // Maps a BCP-47 or ISO 639-2 language tag to a language-specific hyphenator.
const LanguageHyphenator* hyphenatorForLanguage(const std::string& langTag) { const LanguageHyphenator* hyphenatorForLanguage(const std::string& langTag) {
@@ -9,9 +9,7 @@
#include "generated/hyph-es.trie.h" #include "generated/hyph-es.trie.h"
#include "generated/hyph-fr.trie.h" #include "generated/hyph-fr.trie.h"
#include "generated/hyph-it.trie.h" #include "generated/hyph-it.trie.h"
#include "generated/hyph-pl.trie.h"
#include "generated/hyph-ru.trie.h" #include "generated/hyph-ru.trie.h"
#include "generated/hyph-sv.trie.h"
#include "generated/hyph-uk.trie.h" #include "generated/hyph-uk.trie.h"
namespace { namespace {
@@ -23,11 +21,9 @@ LanguageHyphenator germanHyphenator(de_patterns, isLatinLetter, toLowerLatin);
LanguageHyphenator russianHyphenator(ru_patterns, isCyrillicLetter, toLowerCyrillic); LanguageHyphenator russianHyphenator(ru_patterns, isCyrillicLetter, toLowerCyrillic);
LanguageHyphenator spanishHyphenator(es_patterns, isLatinLetter, toLowerLatin); LanguageHyphenator spanishHyphenator(es_patterns, isLatinLetter, toLowerLatin);
LanguageHyphenator italianHyphenator(it_patterns, isLatinLetter, toLowerLatin); LanguageHyphenator italianHyphenator(it_patterns, isLatinLetter, toLowerLatin);
LanguageHyphenator swedishHyphenator(sv_patterns, isLatinLetter, toLowerLatin);
LanguageHyphenator ukrainianHyphenator(uk_patterns, isCyrillicLetter, toLowerCyrillic); LanguageHyphenator ukrainianHyphenator(uk_patterns, isCyrillicLetter, toLowerCyrillic);
LanguageHyphenator polishHyphenator(pl_patterns, isLatinLetter, toLowerLatin);
using EntryArray = std::array<LanguageEntry, 9>; using EntryArray = std::array<LanguageEntry, 7>;
const EntryArray& entries() { const EntryArray& entries() {
static const EntryArray kEntries = {{{"english", "en", &englishHyphenator}, static const EntryArray kEntries = {{{"english", "en", &englishHyphenator},
@@ -36,8 +32,6 @@ const EntryArray& entries() {
{"russian", "ru", &russianHyphenator}, {"russian", "ru", &russianHyphenator},
{"spanish", "es", &spanishHyphenator}, {"spanish", "es", &spanishHyphenator},
{"italian", "it", &italianHyphenator}, {"italian", "it", &italianHyphenator},
{"polish", "pl", &polishHyphenator},
{"swedish", "sv", &swedishHyphenator},
{"ukrainian", "uk", &ukrainianHyphenator}}}; {"ukrainian", "uk", &ukrainianHyphenator}}};
return kEntries; return kEntries;
} }
@@ -3,7 +3,7 @@
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include "Epub/hyphenation/SerializedHyphenationTrie.h" #include "../SerializedHyphenationTrie.h"
// Auto-generated by generate_hyphenation_trie.py. Do not edit manually. // Auto-generated by generate_hyphenation_trie.py. Do not edit manually.
alignas(4) constexpr uint8_t de_trie_data[] = { alignas(4) constexpr uint8_t de_trie_data[] = {
@@ -3,7 +3,7 @@
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include "Epub/hyphenation/SerializedHyphenationTrie.h" #include "../SerializedHyphenationTrie.h"
// Auto-generated by generate_hyphenation_trie.py. Do not edit manually. // Auto-generated by generate_hyphenation_trie.py. Do not edit manually.
alignas(4) constexpr uint8_t en_trie_data[] = { alignas(4) constexpr uint8_t en_trie_data[] = {
@@ -3,7 +3,7 @@
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include "Epub/hyphenation/SerializedHyphenationTrie.h" #include "../SerializedHyphenationTrie.h"
// Auto-generated by generate_hyphenation_trie.py. Do not edit manually. // Auto-generated by generate_hyphenation_trie.py. Do not edit manually.
alignas(4) constexpr uint8_t es_trie_data[] = { alignas(4) constexpr uint8_t es_trie_data[] = {
@@ -3,7 +3,7 @@
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include "Epub/hyphenation/SerializedHyphenationTrie.h" #include "../SerializedHyphenationTrie.h"
// Auto-generated by generate_hyphenation_trie.py. Do not edit manually. // Auto-generated by generate_hyphenation_trie.py. Do not edit manually.
alignas(4) constexpr uint8_t fr_trie_data[] = { alignas(4) constexpr uint8_t fr_trie_data[] = {
@@ -3,7 +3,7 @@
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include "Epub/hyphenation/SerializedHyphenationTrie.h" #include "../SerializedHyphenationTrie.h"
// Auto-generated by generate_hyphenation_trie.py. Do not edit manually. // Auto-generated by generate_hyphenation_trie.py. Do not edit manually.
alignas(4) constexpr uint8_t it_trie_data[] = { alignas(4) constexpr uint8_t it_trie_data[] = {
@@ -1,987 +0,0 @@
#pragma once
#include <cstddef>
#include <cstdint>
#include "Epub/hyphenation/SerializedHyphenationTrie.h"
// Auto-generated by generate_hyphenation_trie.py. Do not edit manually.
alignas(4) constexpr uint8_t pl_trie_data[] = {
0x3A, 0x26, 0x30, 0x48, 0x17, 0x3E, 0x0F, 0x52, 0x67, 0x0C, 0x44, 0x16, 0x0C, 0x0D, 0x16, 0x0D,
0x22, 0x23, 0x21, 0x35, 0x16, 0x35, 0x0C, 0x21, 0x0C, 0x5C, 0x0D, 0x1C, 0x20, 0x0D, 0x21, 0x0E,
0x34, 0x34, 0x0B, 0x3F, 0x16, 0x3F, 0x0C, 0x49, 0x0C, 0x53, 0x16, 0x70, 0x0D, 0x49, 0x16, 0x3E,
0x0D, 0x3F, 0x0E, 0x21, 0x0E, 0x0D, 0x21, 0x16, 0x22, 0x17, 0x22, 0x0D, 0x23, 0x0E, 0x0C, 0x34,
0x0D, 0x35, 0x0E, 0x7B, 0x16, 0x84, 0x0D, 0x5C, 0x17, 0x16, 0x0D, 0x0C, 0x0F, 0x16, 0x16, 0x0B,
0x0C, 0x0B, 0x2C, 0x17, 0x0E, 0x18, 0x0F, 0x0C, 0x2B, 0x0C, 0x52, 0x0D, 0x66, 0x2A, 0x0C, 0x0D,
0x2B, 0x18, 0x2B, 0x18, 0x0D, 0x2C, 0x19, 0x0C, 0x53, 0x0C, 0x2A, 0x17, 0x20, 0x0C, 0x21, 0x20,
0x21, 0x0E, 0x0C, 0x22, 0x0D, 0x0C, 0x0C, 0x22, 0x0F, 0x5F, 0x2B, 0x16, 0x2D, 0x16, 0x2D, 0x0C,
0x36, 0x0D, 0x2B, 0x0C, 0x16, 0x2B, 0x0C, 0x0C, 0x2B, 0x16, 0x0D, 0x41, 0x16, 0x34, 0x0C, 0x2C,
0x0D, 0x2C, 0x21, 0x3E, 0x0C, 0x3F, 0x20, 0x40, 0x0D, 0x0C, 0x4B, 0x52, 0x0C, 0x53, 0x20, 0x53,
0x0E, 0x53, 0x0E, 0x16, 0x53, 0x0C, 0x0C, 0x0D, 0x54, 0x0F, 0x54, 0x0F, 0x16, 0x54, 0x0F, 0x0C,
0x5D, 0x16, 0x5D, 0x0C, 0x7A, 0x17, 0x0E, 0x16, 0x17, 0x10, 0x17, 0x0C, 0x18, 0x11, 0x21, 0x0C,
0x0C, 0x2B, 0x0D, 0x23, 0x16, 0x23, 0x0C, 0x2A, 0x0D, 0x20, 0x16, 0x22, 0x0F, 0x0C, 0x2A, 0x16,
0x34, 0x0B, 0x20, 0x34, 0x17, 0x21, 0x0C, 0x0C, 0x0D, 0x22, 0x0D, 0x0E, 0x0C, 0x0D, 0x22, 0x0F,
0x16, 0x22, 0x17, 0x0C, 0x2B, 0x34, 0x0F, 0x35, 0x20, 0x2C, 0x0B, 0x2C, 0x0C, 0x35, 0x0E, 0x0D,
0x35, 0x0E, 0x16, 0x35, 0x0C, 0x0C, 0x0D, 0x36, 0x0F, 0x36, 0x0F, 0x16, 0x36, 0x0F, 0x0E, 0x48,
0x0D, 0x49, 0x0E, 0x3F, 0x2B, 0x0C, 0x21, 0x0E, 0x0D, 0x16, 0x21, 0x0E, 0x0D, 0x0C, 0x22, 0x0F,
0x0E, 0x0D, 0x36, 0x0F, 0x0C, 0x41, 0x0C, 0x48, 0x0B, 0x66, 0x0D, 0x2A, 0x16, 0x17, 0x20, 0x11,
0x4A, 0x0F, 0x18, 0x0D, 0x0C, 0x18, 0x17, 0x22, 0x0D, 0x20, 0x48, 0x21, 0x3E, 0x17, 0x21, 0x0C,
0x0D, 0x68, 0x34, 0x2B, 0x2B, 0x0E, 0x22, 0x0D, 0x0C, 0x0B, 0x0C, 0x52, 0x17, 0x36, 0x21, 0x15,
0x01, 0x16, 0x02, 0x15, 0x02, 0x0B, 0x02, 0x1F, 0x03, 0x0C, 0x03, 0x0C, 0x16, 0x03, 0x0C, 0x0C,
0x04, 0x17, 0x04, 0x0D, 0x08, 0x16, 0x0D, 0x16, 0x16, 0x0D, 0x16, 0x0D, 0x3E, 0x0B, 0x20, 0x0B,
0x20, 0x0C, 0x0D, 0x20, 0x17, 0x29, 0x16, 0x11, 0x16, 0x0F, 0x20, 0x0B, 0x0C, 0x2A, 0x0B, 0x16,
0x15, 0x18, 0x0E, 0x0D, 0x20, 0x0F, 0x16, 0x11, 0x3F, 0x18, 0x16, 0x0D, 0x16, 0x16, 0x0D, 0x17,
0x0C, 0x20, 0x15, 0x17, 0x0C, 0x0D, 0x16, 0x0C, 0x0B, 0xA0, 0x00, 0x41, 0x21, 0x87, 0xFD, 0x25,
0x82, 0x84, 0x9B, 0xBA, 0xBC, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xA0, 0x00, 0x61, 0xA0, 0x00, 0x72,
0x21, 0x87, 0xFD, 0x21, 0xC4, 0xFD, 0x21, 0x72, 0xFD, 0x21, 0x65, 0xFD, 0xA1, 0x00, 0x61, 0x69,
0xFD, 0xB5, 0x00, 0x51, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D,
0x6E, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0xDB, 0xDE, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9,
0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xE9, 0xFB, 0xE9, 0xE9, 0x21, 0x87,
0xD3, 0xD5, 0x00, 0x51, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D,
0x6E, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0xFF, 0xAB, 0xFF, 0xAE, 0xFF, 0xB9, 0xFF,
0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF,
0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF, 0xB9, 0xFF,
0xB9, 0xFF, 0xB9, 0xA0, 0x00, 0xB1, 0xA1, 0x00, 0x92, 0x72, 0xFD, 0x21, 0x64, 0xFB, 0x21, 0xB3,
0xFD, 0xA1, 0x00, 0x61, 0xC3, 0xFD, 0xA0, 0x00, 0xC2, 0x21, 0x77, 0xFD, 0x21, 0x6F, 0xFD, 0x21,
0x82, 0xFD, 0x21, 0xC5, 0xFD, 0x21, 0x74, 0xFD, 0x21, 0x61, 0xFD, 0xA1, 0x00, 0x61, 0x69, 0xFD,
0xD5, 0x00, 0x51, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,
0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0xFF, 0x3C, 0xFF, 0x3F, 0xFF, 0x4A, 0xFF, 0x4A,
0xFF, 0x4A, 0xFF, 0x4A, 0xFF, 0x4A, 0xFF, 0x4A, 0xFF, 0x4A, 0xFF, 0x4A, 0xFF, 0x4A, 0xFF, 0x4A,
0xFF, 0x4A, 0xFF, 0x4A, 0xFF, 0xE1, 0xFF, 0x4A, 0xFF, 0x4A, 0xFF, 0x4A, 0xFF, 0xFB, 0xFF, 0x4A,
0xFF, 0x4A, 0xA0, 0x00, 0xE1, 0x21, 0xBA, 0xFD, 0xA1, 0x00, 0x61, 0xC5, 0xFD, 0xD5, 0x00, 0x51,
0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73,
0x74, 0x76, 0x77, 0x78, 0x7A, 0xFE, 0xEF, 0xFE, 0xF2, 0xFE, 0xFD, 0xFE, 0xFD, 0xFF, 0xFB, 0xFE,
0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0xFE,
0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0xFE, 0xFD, 0x45,
0x82, 0x84, 0x9B, 0xBA, 0xBC, 0xFF, 0x02, 0xFF, 0x02, 0xFF, 0x71, 0xFF, 0xBE, 0xFF, 0x02, 0xA0,
0x00, 0xF3, 0x21, 0x74, 0xFD, 0x21, 0x73, 0xFD, 0xA0, 0x01, 0x51, 0x21, 0x74, 0xFD, 0xA1, 0x01,
0x41, 0x70, 0xFD, 0xA0, 0x01, 0x41, 0xA1, 0x01, 0x41, 0x75, 0xF2, 0xA2, 0x01, 0x41, 0x70, 0x72,
0xED, 0xED, 0xA6, 0x01, 0x22, 0x61, 0x65, 0x69, 0x6F, 0x75, 0x79, 0xEC, 0xF1, 0xF4, 0xF9, 0xF1,
0xF1, 0xA0, 0x00, 0x91, 0xA5, 0x01, 0x61, 0x61, 0x65, 0x69, 0x6F, 0x75, 0xFD, 0xFD, 0xFD, 0xFD,
0xFD, 0x21, 0x6F, 0xF3, 0x21, 0x72, 0xFD, 0x25, 0x61, 0x65, 0x69, 0x6F, 0x75, 0xEA, 0xEA, 0xEA,
0xEA, 0xEA, 0x21, 0x79, 0xF5, 0x21, 0x74, 0xFD, 0xA0, 0x01, 0x72, 0x21, 0x82, 0xFD, 0xA1, 0x01,
0x92, 0x7A, 0xFA, 0xA0, 0x01, 0x92, 0x29, 0xC5, 0x62, 0x6B, 0x6D, 0x61, 0x65, 0x69, 0x6F, 0x75,
0xF5, 0xF8, 0xFD, 0xFD, 0xCB, 0xCB, 0xCB, 0xCB, 0xCB, 0x21, 0x79, 0xED, 0x21, 0x63, 0xFD, 0xA0,
0x01, 0xB2, 0x21, 0x68, 0xD6, 0xA0, 0x01, 0xD2, 0x21, 0x73, 0xFD, 0x21, 0x6E, 0xFD, 0x21, 0x61,
0xFD, 0x21, 0x72, 0xFD, 0x47, 0x63, 0x61, 0x65, 0x69, 0x6F, 0x74, 0x75, 0xFF, 0xEE, 0xFF, 0x9D,
0xFF, 0x9D, 0xFF, 0x9D, 0xFF, 0x9D, 0xFF, 0xFD, 0xFF, 0x9D, 0xA1, 0x01, 0xB2, 0x6F, 0xEA, 0x23,
0x67, 0x6B, 0x74, 0xD0, 0xD0, 0xFB, 0x46, 0x62, 0x64, 0x65, 0x6E, 0x72, 0x75, 0xFF, 0x4F, 0xFF,
0x6C, 0xFF, 0x8E, 0xFF, 0x9F, 0xFF, 0xC6, 0xFF, 0xF9, 0x41, 0x87, 0xFD, 0xE1, 0x45, 0x82, 0x84,
0x9B, 0xBA, 0xBC, 0xFD, 0xDD, 0xFD, 0xDD, 0xFD, 0xDD, 0xFD, 0xDD, 0xFD, 0xDD, 0xA0, 0x00, 0x51,
0xA0, 0x02, 0x22, 0x21, 0x6E, 0xFD, 0x21, 0x63, 0xFA, 0x21, 0x6B, 0xF7, 0x41, 0x68, 0xFF, 0x45,
0xA0, 0x02, 0x41, 0xA0, 0x02, 0x52, 0x21, 0x6A, 0xFD, 0xA1, 0x02, 0x41, 0x62, 0xFD, 0x41, 0x77,
0xFF, 0x33, 0xA8, 0x02, 0x02, 0x61, 0x65, 0x69, 0x63, 0x6D, 0x6F, 0x77, 0x7A, 0xE1, 0xE4, 0xE7,
0xEA, 0xEE, 0xF7, 0xEE, 0xFC, 0x21, 0x7A, 0xED, 0xC1, 0x00, 0x51, 0x7A, 0xFD, 0x92, 0xB6, 0x01,
0xF1, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70,
0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0xAB, 0xAF, 0xBF, 0xBF, 0xBF, 0xF7, 0xBF, 0xBF, 0xBF,
0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xFA, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xBF, 0xA0, 0x02, 0x72,
0x21, 0x9B, 0xFD, 0xA0, 0x02, 0x92, 0x22, 0xC5, 0x6B, 0xFA, 0xFD, 0x21, 0x6F, 0xFB, 0x21, 0x82,
0xFD, 0x21, 0xC5, 0xFD, 0x41, 0x7A, 0xFD, 0x35, 0xA1, 0x00, 0x51, 0x72, 0xFC, 0xA0, 0x02, 0xB2,
0x21, 0x77, 0xFD, 0x21, 0x6F, 0xFD, 0x21, 0x6B, 0xFD, 0xA0, 0x02, 0xD2, 0x21, 0x72, 0xFD, 0x21,
0x6B, 0xFD, 0x21, 0x6F, 0xFD, 0x21, 0x82, 0xFD, 0x21, 0xC5, 0xFD, 0x22, 0x6E, 0x70, 0xEB, 0xFD,
0x21, 0x65, 0xFB, 0x21, 0x6B, 0xDA, 0x21, 0x6F, 0xFD, 0x21, 0x6E, 0xFD, 0x21, 0x72, 0xFD, 0xA0,
0x02, 0xF2, 0x21, 0x74, 0xFD, 0x21, 0x65, 0xFD, 0xA1, 0x00, 0x72, 0x73, 0xFD, 0x21, 0x68, 0xFB,
0x21, 0x63, 0xFD, 0xA0, 0x03, 0x12, 0x21, 0x9B, 0xFD, 0x21, 0xC5, 0xFD, 0x22, 0x65, 0x6F, 0xF4,
0xFD, 0x21, 0x72, 0xFB, 0x21, 0x65, 0xFD, 0xA0, 0x03, 0x52, 0x22, 0x85, 0x99, 0xFD, 0xFD, 0xA4,
0x03, 0x32, 0xC4, 0x61, 0x65, 0x6F, 0xFB, 0xF8, 0xF8, 0xF8, 0x21, 0x72, 0xF5, 0x21, 0xB3, 0xFD,
0x21, 0xC3, 0xFD, 0xC4, 0x00, 0x51, 0x61, 0x6B, 0x74, 0x77, 0xFF, 0xB9, 0xFC, 0xC7, 0xFF, 0xE1,
0xFF, 0xFD, 0xD7, 0x01, 0xF1, 0xC4, 0xC5, 0x61, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x69, 0x6A,
0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0xFE, 0xD7, 0xFE, 0xDB,
0xFF, 0x6F, 0xFE, 0xEB, 0xFE, 0xEB, 0xFE, 0xEB, 0xFE, 0xEB, 0xFE, 0xEB, 0xFF, 0x76, 0xFF, 0x9E,
0xFE, 0xEB, 0xFE, 0xEB, 0xFE, 0xEB, 0xFE, 0xEB, 0xFE, 0xEB, 0xFE, 0xEB, 0xFE, 0xEB, 0xFE, 0xEB,
0xFE, 0xEB, 0xFE, 0xEB, 0xFE, 0xEB, 0xFE, 0xEB, 0xFF, 0xF1, 0x41, 0x72, 0xFF, 0x79, 0x42, 0x74,
0x77, 0xFF, 0xFC, 0xFF, 0x2F, 0x21, 0x6F, 0xF9, 0x21, 0x67, 0xFD, 0xA1, 0x00, 0x61, 0x75, 0xFD,
0x45, 0x82, 0x84, 0x9B, 0xBA, 0xBC, 0xFF, 0xFB, 0xFC, 0x5A, 0xFC, 0x5A, 0xFC, 0x5A, 0xFC, 0x5A,
0x41, 0x65, 0xFF, 0x16, 0x21, 0x6C, 0xFC, 0xA0, 0x03, 0x73, 0x21, 0x6C, 0xFD, 0x21, 0x69, 0xFD,
0x21, 0x75, 0xF7, 0xA2, 0x02, 0x41, 0x62, 0x77, 0xFA, 0xFD, 0x42, 0x6C, 0x72, 0xFE, 0x66, 0xFE,
0x66, 0xC4, 0x02, 0x02, 0x61, 0x65, 0x79, 0x6F, 0xFF, 0xF2, 0xFF, 0xF9, 0xFE, 0x5F, 0xFE, 0x6F,
0x21, 0x7A, 0xF1, 0xA0, 0x03, 0xA2, 0x21, 0x87, 0xFD, 0xA0, 0x03, 0xC2, 0xA1, 0x03, 0xA2, 0x6B,
0xFD, 0x24, 0x82, 0x9B, 0xBA, 0xBC, 0xFB, 0xF2, 0xF2, 0xF2, 0xC1, 0x02, 0x41, 0x7A, 0xFD, 0x87,
0xA1, 0x01, 0xB2, 0x72, 0xFA, 0xC2, 0x01, 0xB2, 0x68, 0x7A, 0xFE, 0x3B, 0xFE, 0x3B, 0x42, 0xBA,
0xBC, 0xFD, 0x73, 0xFD, 0x73, 0xC2, 0x01, 0xB2, 0xC5, 0x7A, 0xFF, 0xF9, 0xFE, 0x2B, 0x41, 0x7A,
0xFD, 0x63, 0xA1, 0x01, 0xB2, 0x72, 0xFC, 0xA0, 0x03, 0xE2, 0xA1, 0x01, 0xB2, 0x74, 0xFD, 0xA1,
0x01, 0xB2, 0x6E, 0xF8, 0xA0, 0x04, 0x03, 0xA1, 0x03, 0xE2, 0x6E, 0xFD, 0xA1, 0x01, 0xB2, 0x6B,
0xFB, 0xC2, 0x01, 0xB2, 0x63, 0x72, 0xFD, 0xFB, 0xFF, 0xDD, 0x41, 0xBC, 0xFD, 0x37, 0xC3, 0x01,
0xB2, 0x73, 0xC5, 0x7A, 0xFF, 0xD9, 0xFF, 0xFC, 0xFD, 0xF2, 0xC3, 0x01, 0xB2, 0x63, 0x6D, 0x7A,
0xFD, 0xE2, 0xFD, 0xE6, 0xFD, 0xE6, 0xC2, 0x01, 0xB2, 0x6B, 0x72, 0xFD, 0xDA, 0xFD, 0xDA, 0xA1,
0x01, 0xB2, 0x63, 0xB8, 0x51, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D,
0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xFF, 0x72, 0xFF, 0x7D, 0xFF, 0x8C, 0xFF, 0x91, 0xFF, 0xA1,
0xFD, 0x5B, 0xFF, 0xAE, 0xFD, 0x5B, 0xFF, 0xB6, 0xFF, 0xBB, 0xFF, 0xC8, 0xFF, 0xCD, 0xFF, 0xDA,
0xFF, 0xE6, 0xFF, 0xF2, 0xFF, 0xFB, 0xFD, 0x5B, 0x41, 0x77, 0xFD, 0xFB, 0x21, 0x6F, 0xFC, 0x21,
0x67, 0xFD, 0xC2, 0x00, 0x51, 0x6F, 0x7A, 0xFF, 0xFD, 0xFB, 0x48, 0xA0, 0x04, 0x52, 0x22, 0x85,
0x99, 0xFD, 0xFD, 0xA4, 0x04, 0x32, 0xC4, 0x61, 0x65, 0x6F, 0xFB, 0xF8, 0xF8, 0xF8, 0x21, 0x6A,
0xF5, 0x21, 0xB3, 0xFD, 0xA1, 0x00, 0x51, 0xC3, 0xFD, 0x41, 0x61, 0xFD, 0x57, 0xA0, 0x01, 0x61,
0xC5, 0x02, 0x02, 0x65, 0x6F, 0x74, 0x79, 0x7A, 0xFD, 0x50, 0xFD, 0x50, 0xFF, 0xF9, 0xFD, 0x50,
0xFF, 0xFD, 0xC2, 0x02, 0x02, 0x65, 0x75, 0xFD, 0x3E, 0xFD, 0x4E, 0x22, 0x73, 0x7A, 0xE5, 0xF7,
0xA0, 0x04, 0x72, 0x21, 0x9B, 0xFD, 0x21, 0xC5, 0xFD, 0x21, 0x6F, 0xFD, 0x21, 0x69, 0xFD, 0x21,
0x63, 0xFD, 0x21, 0x99, 0xFD, 0x21, 0xC4, 0xFD, 0x21, 0x69, 0xFD, 0xA0, 0x04, 0x92, 0x21, 0x74,
0xFD, 0x21, 0x65, 0xFD, 0xA1, 0x04, 0xB2, 0x73, 0xFD, 0x21, 0x87, 0xFB, 0x22, 0xC4, 0x63, 0xFD,
0xE0, 0x21, 0x99, 0xFB, 0x21, 0xC4, 0xFD, 0x21, 0x69, 0xFD, 0x22, 0x73, 0x77, 0xDE, 0xFD, 0x21,
0x65, 0xFB, 0xA1, 0x00, 0x51, 0x69, 0xFD, 0xD9, 0x01, 0xF1, 0xC4, 0xC5, 0x61, 0x62, 0x63, 0x64,
0x65, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77,
0x78, 0x79, 0x7A, 0xFC, 0xD2, 0xFE, 0x59, 0xFE, 0x6D, 0xFC, 0xE6, 0xFC, 0xE6, 0xFC, 0xE6, 0xFE,
0x99, 0xFC, 0xE6, 0xFC, 0xE6, 0xFC, 0xE6, 0xFC, 0xE6, 0xFC, 0xE6, 0xFC, 0xE6, 0xFC, 0xE6, 0xFC,
0xE6, 0xFF, 0x2D, 0xFC, 0xE6, 0xFF, 0x6B, 0xFC, 0xE6, 0xFC, 0xE6, 0xFC, 0xE6, 0xFF, 0x8D, 0xFC,
0xE6, 0xFF, 0xB4, 0xFF, 0xFB, 0xA0, 0x05, 0x61, 0xA1, 0x00, 0xF3, 0x79, 0xFD, 0x21, 0x73, 0xFB,
0xA0, 0x04, 0xD5, 0x21, 0x74, 0xFD, 0x21, 0x65, 0xFD, 0x21, 0x7A, 0xFD, 0x21, 0x73, 0xFD, 0x21,
0x65, 0xFD, 0xA0, 0x05, 0x24, 0x21, 0x61, 0xFD, 0x21, 0x6D, 0xFD, 0x21, 0x73, 0xFD, 0xA0, 0x05,
0x22, 0x21, 0x61, 0xFD, 0x23, 0x65, 0x68, 0x74, 0xF7, 0xFD, 0xFA, 0x45, 0x61, 0x65, 0x69, 0x6F,
0x75, 0xFC, 0x75, 0xFC, 0x75, 0xFC, 0x75, 0xFC, 0x75, 0xFC, 0x75, 0x21, 0x6F, 0xF0, 0xA0, 0x01,
0xD1, 0x25, 0x61, 0x65, 0x69, 0x6F, 0x75, 0xFD, 0xFD, 0xFD, 0xFD, 0xFD, 0x21, 0x6F, 0xF5, 0x21,
0x72, 0xFD, 0x21, 0x74, 0xFD, 0x21, 0x6B, 0xFD, 0x21, 0x65, 0xFD, 0x45, 0x6B, 0x6D, 0x73, 0x67,
0x6C, 0xFF, 0xA2, 0xFF, 0xB4, 0xFF, 0xC9, 0xFF, 0xE0, 0xFF, 0xFD, 0xD5, 0x01, 0xF1, 0xC4, 0xC5,
0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x76,
0x77, 0x78, 0x7A, 0xFC, 0x0E, 0xFC, 0x12, 0xFC, 0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC,
0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC,
0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC, 0x22, 0xFC, 0x22, 0xA0, 0x02, 0x02,
0x21, 0x6F, 0xFD, 0x21, 0x75, 0xFA, 0x41, 0x62, 0xFE, 0x56, 0xC2, 0x00, 0x51, 0x75, 0x7A, 0xFF,
0xFC, 0xF9, 0xA0, 0xD7, 0x01, 0xF1, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x6A,
0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0xFB, 0xB6, 0xFB,
0xBA, 0xFB, 0xCA, 0xFB, 0xCA, 0xFB, 0xCA, 0xFF, 0xED, 0xFB, 0xCA, 0xFB, 0xCA, 0xFB, 0xCA, 0xFB,
0xCA, 0xFB, 0xCA, 0xFB, 0xCA, 0xFB, 0xCA, 0xFB, 0xCA, 0xFF, 0xF0, 0xFB, 0xCA, 0xFF, 0xF7, 0xFB,
0xCA, 0xFB, 0xCA, 0xFB, 0xCA, 0xFB, 0xCA, 0xFB, 0xCA, 0xFB, 0xCA, 0xA0, 0x00, 0x71, 0xC3, 0x04,
0x32, 0x6F, 0x61, 0x65, 0xFE, 0x0D, 0xFF, 0xFD, 0xFF, 0xFD, 0x21, 0x72, 0xF4, 0x21, 0x65, 0xFD,
0x21, 0x70, 0xFD, 0xD6, 0x01, 0xF1, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x69, 0x6A,
0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0xFB, 0x56, 0xFB, 0x5A,
0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A, 0xFF, 0xFD, 0xFB, 0x6A,
0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A,
0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A, 0xFB, 0x6A, 0xA0, 0x05, 0x72, 0x21, 0x63, 0xFD, 0xA0, 0x05,
0x93, 0xA0, 0x05, 0xC2, 0xA2, 0x05, 0x72, 0x6B, 0x77, 0xFA, 0xFD, 0x41, 0x6E, 0xFD, 0x0C, 0x21,
0x61, 0xFC, 0x21, 0x6C, 0xFD, 0xA4, 0x01, 0x22, 0x69, 0x6F, 0x75, 0x66, 0xE6, 0xEF, 0xE3, 0xFD,
0xA0, 0x01, 0x22, 0x21, 0x6C, 0xFD, 0x43, 0x6E, 0x73, 0x7A, 0xFF, 0xEF, 0xFF, 0xFD, 0xFE, 0xA5,
0x41, 0x82, 0xFB, 0x83, 0x21, 0xC5, 0xFC, 0x21, 0x64, 0xFD, 0xD6, 0x01, 0xF1, 0xC4, 0xC5, 0x61,
0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x76,
0x77, 0x78, 0x7A, 0xFA, 0xCF, 0xFA, 0xD3, 0xFF, 0xFD, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA,
0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA,
0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xFA, 0xE3, 0xA0,
0x06, 0x01, 0xA1, 0x05, 0xE2, 0x6F, 0xFD, 0x21, 0x74, 0xFB, 0x21, 0x65, 0xFD, 0x21, 0x73, 0xFD,
0x21, 0x75, 0xFD, 0x21, 0x6B, 0xFD, 0x21, 0x6C, 0xFD, 0x41, 0x82, 0xFD, 0x03, 0xA0, 0x06, 0x93,
0x21, 0x69, 0xFD, 0x22, 0x65, 0x79, 0xFA, 0xFA, 0x21, 0x61, 0xF5, 0xA0, 0x06, 0x92, 0x21, 0x6D,
0xFD, 0x21, 0x63, 0xFA, 0x21, 0x74, 0xF7, 0x21, 0x67, 0xF4, 0xA7, 0x06, 0x42, 0x67, 0x73, 0x74,
0x64, 0x6B, 0x6C, 0x72, 0xE6, 0xE9, 0xEE, 0xF4, 0xF7, 0xFA, 0xFD, 0xA0, 0x06, 0x42, 0xA0, 0x06,
0x63, 0xA2, 0x00, 0x71, 0x6C, 0x77, 0xFD, 0xFD, 0xC5, 0x06, 0x13, 0x61, 0x65, 0x6F, 0x79, 0x75,
0xFF, 0xE2, 0xFF, 0xF3, 0xFF, 0xF9, 0xFF, 0xF3, 0xFE, 0xC3, 0x21, 0x72, 0xEE, 0x21, 0x74, 0xFD,
0x42, 0xC5, 0x6E, 0xFF, 0xA9, 0xFF, 0xFD, 0xA0, 0x06, 0xC2, 0x42, 0x74, 0x77, 0xFA, 0xC2, 0xFF,
0xFD, 0x21, 0x6F, 0xF9, 0x21, 0x6B, 0xFD, 0x21, 0x74, 0xFD, 0x21, 0xB3, 0xFD, 0xA0, 0x06, 0xE2,
0x21, 0x87, 0xFD, 0x21, 0xC4, 0xFD, 0xC3, 0x00, 0x51, 0xC3, 0x6F, 0x7A, 0xFF, 0xF4, 0xFF, 0xFD,
0xF7, 0xD4, 0xD7, 0x01, 0xF1, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B,
0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0xF9, 0xE7, 0xF9, 0xEB,
0xF9, 0xFB, 0xF9, 0xFB, 0xF9, 0xFB, 0xF9, 0xFB, 0xF9, 0xFB, 0xF9, 0xFB, 0xFF, 0x74, 0xF9, 0xFB,
0xF9, 0xFB, 0xF9, 0xFB, 0xF9, 0xFB, 0xF9, 0xFB, 0xFF, 0xCE, 0xF9, 0xFB, 0xFF, 0xF4, 0xF9, 0xFB,
0xF9, 0xFB, 0xF9, 0xFB, 0xF9, 0xFB, 0xF9, 0xFB, 0xF9, 0xFB, 0x41, 0x77, 0xF9, 0x39, 0x21, 0x6F,
0xFC, 0x21, 0x64, 0xFD, 0xD6, 0x01, 0xF1, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A,
0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x7A, 0xF9, 0x95, 0xF9,
0x99, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9,
0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xFF,
0xFD, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xF9, 0xA9, 0xA0, 0x01, 0x71, 0x21, 0x70, 0xFD, 0x21,
0x6D, 0xFD, 0x21, 0x61, 0xFD, 0x21, 0x69, 0xFD, 0x21, 0x6C, 0xFD, 0x41, 0x6E, 0xF9, 0xE8, 0x21,
0xBC, 0xFC, 0x21, 0xC5, 0xFD, 0xD7, 0x01, 0xF1, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68,
0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0xF9,
0x34, 0xF9, 0x38, 0xF9, 0x48, 0xF9, 0x48, 0xF9, 0x48, 0xF9, 0x48, 0xF9, 0x48, 0xF9, 0x48, 0xFF,
0xF3, 0xF9, 0x48, 0xF9, 0x48, 0xF9, 0x48, 0xF9, 0x48, 0xF9, 0x48, 0xFF, 0xFD, 0xF9, 0x48, 0xF9,
0x48, 0xF9, 0x48, 0xF9, 0x48, 0xF9, 0x48, 0xF9, 0x48, 0xF9, 0x48, 0xF9, 0x48, 0xA0, 0x07, 0xE2,
0x43, 0x85, 0x99, 0x87, 0xFB, 0xAD, 0xFB, 0xAD, 0xFF, 0xFD, 0xA0, 0x07, 0x22, 0x41, 0x62, 0xF8,
0xF3, 0xA1, 0x07, 0xE2, 0x75, 0xFC, 0xA0, 0x07, 0xD1, 0x21, 0x6D, 0xFD, 0x21, 0x65, 0xFD, 0x21,
0x69, 0xFD, 0x21, 0x7A, 0xFD, 0x21, 0x64, 0xFD, 0x21, 0x6F, 0xFD, 0xA1, 0x07, 0xE2, 0x72, 0xFD,
0xA0, 0x08, 0x02, 0x24, 0xBA, 0x82, 0x9B, 0xBC, 0xD7, 0xDE, 0xF8, 0xFD, 0xC1, 0x05, 0xC2, 0x72,
0xF8, 0xC4, 0x41, 0x68, 0xF8, 0xBE, 0x21, 0x63, 0xFC, 0xA1, 0x05, 0xC2, 0x75, 0xFD, 0x41, 0x7A,
0xF8, 0xB2, 0x21, 0x63, 0xFC, 0x21, 0x99, 0xFD, 0xA0, 0x07, 0x43, 0x42, 0x63, 0x74, 0xFF, 0xF3,
0xF8, 0xA5, 0x21, 0x70, 0xF9, 0xA0, 0x07, 0xB2, 0x22, 0x85, 0x99, 0xFD, 0xFD, 0x21, 0x7A, 0xF8,
0x21, 0x63, 0xFD, 0xA3, 0x02, 0x22, 0xC4, 0x65, 0x79, 0xF5, 0xFD, 0xF2, 0xC5, 0x05, 0xC2, 0xC4,
0x77, 0x65, 0x75, 0x7A, 0xFF, 0xD9, 0xFF, 0xDC, 0xFF, 0xE6, 0xF8, 0x8D, 0xFF, 0xF7, 0x41, 0x72,
0xF8, 0x75, 0xA1, 0x05, 0xC2, 0x6F, 0xFC, 0x41, 0x6A, 0xFB, 0x16, 0x41, 0x74, 0xFD, 0x46, 0xA1,
0x01, 0x92, 0x61, 0xFC, 0x41, 0x87, 0xF7, 0xD4, 0x44, 0x82, 0x9B, 0xBA, 0xBC, 0xF7, 0xD0, 0xF7,
0xD0, 0xF7, 0xD0, 0xF7, 0xD0, 0xC2, 0x01, 0x92, 0x68, 0x7A, 0xFC, 0xC6, 0xFC, 0xC6, 0x42, 0xBA,
0xBC, 0xF6, 0x95, 0xF6, 0x95, 0xC2, 0x01, 0x92, 0xC5, 0x7A, 0xFF, 0xF9, 0xFC, 0xB6, 0xA0, 0x08,
0x42, 0xA3, 0x01, 0x92, 0x63, 0x6E, 0x74, 0xFD, 0xFD, 0xFD, 0x41, 0xBC, 0xF6, 0x79, 0xC2, 0x01,
0x92, 0xC5, 0x7A, 0xFF, 0xFC, 0xFC, 0x9D, 0xC1, 0x01, 0x92, 0x7A, 0xFC, 0x94, 0xD1, 0x01, 0x61,
0x74, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x77,
0x7A, 0xFF, 0xB2, 0xFF, 0xB7, 0xFF, 0xBB, 0xF7, 0x96, 0xFF, 0xC8, 0xFF, 0xD8, 0xF7, 0x96, 0xF7,
0x96, 0xF7, 0x96, 0xF7, 0x96, 0xF7, 0x96, 0xF7, 0x96, 0xFF, 0xE4, 0xFF, 0xF1, 0xFF, 0xFA, 0xF7,
0x96, 0xF7, 0x96, 0xA0, 0x07, 0x74, 0x21, 0x82, 0xFD, 0xA0, 0x07, 0x73, 0x21, 0x7A, 0xFD, 0x21,
0x63, 0xFD, 0x21, 0x69, 0xF7, 0x22, 0x6A, 0x77, 0xFA, 0xFD, 0x21, 0x74, 0xEF, 0x21, 0x6F, 0xFD,
0x23, 0xC5, 0x6F, 0x72, 0xE6, 0xF5, 0xFD, 0x21, 0x72, 0xE5, 0x21, 0x6E, 0xDF, 0x21, 0x65, 0xFD,
0x21, 0x69, 0xFD, 0x41, 0x7A, 0xF9, 0xA4, 0x21, 0x72, 0xFC, 0x21, 0x62, 0xFD, 0xA4, 0x01, 0x61,
0x62, 0x64, 0x6B, 0x6C, 0xE3, 0xEA, 0xF3, 0xFD, 0x41, 0x6D, 0xFE, 0xFD, 0xA1, 0x01, 0x61, 0x65,
0xFC, 0xA0, 0x08, 0x01, 0x21, 0xB3, 0xFD, 0xA0, 0x08, 0x22, 0x21, 0x73, 0xFD, 0x21, 0x79, 0xFD,
0x21, 0x7A, 0xF1, 0x21, 0x63, 0xFD, 0x21, 0x79, 0xFD, 0xA5, 0x02, 0x41, 0x69, 0xC3, 0x6D, 0x6F,
0x77, 0xE3, 0xEB, 0xF4, 0xE8, 0xFD, 0xC2, 0x05, 0xC2, 0x68, 0x7A, 0xF6, 0xBB, 0xF6, 0xBB, 0x41,
0xBA, 0xFB, 0xDC, 0xA1, 0x05, 0xC2, 0xC5, 0xFC, 0xC1, 0x05, 0xC2, 0x7A, 0xF6, 0xA9, 0xC1, 0x05,
0xC2, 0x72, 0xF6, 0xA3, 0xD9, 0x07, 0x02, 0xC4, 0xC5, 0x69, 0x6D, 0x72, 0x77, 0x61, 0x65, 0x6F,
0x79, 0x7A, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6E, 0x70, 0x73, 0x74, 0x75,
0xFE, 0x4C, 0xFE, 0x7F, 0xFE, 0x88, 0xFE, 0x95, 0xFE, 0xC8, 0xFE, 0xDE, 0xFE, 0xE3, 0xFF, 0x39,
0xFF, 0xA9, 0xF9, 0xF9, 0xFF, 0xD5, 0xFC, 0x2D, 0xFF, 0xE2, 0xFF, 0xEF, 0xFC, 0x2D, 0xFC, 0x2D,
0xFC, 0x2D, 0xFC, 0x2D, 0xFC, 0x2D, 0xFC, 0x2D, 0xFC, 0x2D, 0xFC, 0x2D, 0xFF, 0xF4, 0xFF, 0xFA,
0xFC, 0x2D, 0x41, 0x64, 0xF9, 0xAB, 0xA0, 0x05, 0xC1, 0x21, 0x74, 0xFD, 0x23, 0x7A, 0x6B, 0x75,
0xF6, 0xFD, 0xFA, 0x42, 0x73, 0x6F, 0xFF, 0x10, 0xFF, 0x16, 0x41, 0x66, 0xF8, 0xDD, 0xC9, 0x01,
0x61, 0x66, 0x67, 0x6B, 0x6E, 0x72, 0x73, 0x77, 0x6D, 0x75, 0xFF, 0x0B, 0xFF, 0x0B, 0xFF, 0xF5,
0xFF, 0x0B, 0xFF, 0x0B, 0xFF, 0x0B, 0xFF, 0x0B, 0xFF, 0xFC, 0xF8, 0xD9, 0x44, 0x82, 0x9B, 0xBA,
0xBC, 0xFD, 0xC1, 0xFD, 0xC1, 0xFD, 0xC1, 0xFD, 0xC1, 0xC1, 0x03, 0x32, 0x77, 0xF5, 0x0A, 0x21,
0x7A, 0xFA, 0xA1, 0x05, 0xC2, 0x65, 0xFD, 0x42, 0xBA, 0xBC, 0xFB, 0x24, 0xFB, 0x24, 0x41, 0x87,
0xF7, 0x0F, 0x44, 0x82, 0x9B, 0xBA, 0xBC, 0xF7, 0x0B, 0xF7, 0x0B, 0xF7, 0x0B, 0xF7, 0x0B, 0xC2,
0x02, 0x92, 0x68, 0x7A, 0xF4, 0xE4, 0xF4, 0xE4, 0x42, 0xBA, 0xBC, 0xFA, 0x36, 0xFA, 0x36, 0xC2,
0x02, 0x92, 0xC5, 0x7A, 0xFF, 0xF9, 0xF4, 0xD4, 0xC1, 0x02, 0x92, 0x7A, 0xF4, 0xCB, 0xC1, 0x02,
0x92, 0x6B, 0xF4, 0xC5, 0x51, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D,
0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xFF, 0xCA, 0xFF, 0xCE, 0xF6, 0xDF, 0xFF, 0xDB, 0xFF, 0xEB,
0xF6, 0xDF, 0xF6, 0xDF, 0xF6, 0xDF, 0xF6, 0xDF, 0xF6, 0xDF, 0xF6, 0xDF, 0xF6, 0xDF, 0xFF, 0xF4,
0xFF, 0xF4, 0xFF, 0xFA, 0xF6, 0xDF, 0xF6, 0xDF, 0xC3, 0x05, 0xC2, 0xC5, 0x6F, 0x7A, 0xFF, 0x8F,
0xFF, 0xCC, 0xF5, 0x89, 0xA0, 0x08, 0x63, 0x21, 0x87, 0xFD, 0x24, 0x82, 0x9B, 0xBA, 0xBC, 0xFA,
0xFA, 0xFA, 0xFA, 0x41, 0x7A, 0xF4, 0x70, 0xD1, 0x08, 0x93, 0xC4, 0xC5, 0x63, 0x64, 0x66, 0x67,
0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x73, 0x74, 0x77, 0x72, 0xFF, 0x77, 0xFF, 0x7B, 0xFF,
0x88, 0xFF, 0x98, 0xF6, 0x8C, 0xF6, 0x8C, 0xF6, 0x8C, 0xF6, 0x8C, 0xF6, 0x8C, 0xF6, 0x8C, 0xF6,
0x8C, 0xF6, 0x8C, 0xF6, 0x8C, 0xFF, 0xA1, 0xF6, 0x8C, 0xF6, 0x8C, 0xFF, 0xFC, 0xC2, 0x08, 0x93,
0x68, 0x7A, 0xFA, 0x5E, 0xFA, 0x5E, 0xA0, 0x08, 0xF2, 0x43, 0xBA, 0x9B, 0xBC, 0xF4, 0x2A, 0xF6,
0x44, 0xFF, 0xFD, 0xD1, 0x08, 0x93, 0xC5, 0xC4, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C,
0x6D, 0x6E, 0x70, 0x73, 0x74, 0x77, 0x7A, 0xFF, 0xF6, 0xFF, 0x2B, 0xFF, 0x3C, 0xFF, 0x4C, 0xF6,
0x40, 0xF6, 0x40, 0xF6, 0x40, 0xF6, 0x40, 0xF6, 0x40, 0xF6, 0x40, 0xF6, 0x40, 0xF6, 0x40, 0xF6,
0x40, 0xFF, 0x55, 0xF6, 0x40, 0xF6, 0x40, 0xFA, 0x48, 0xA0, 0x08, 0x93, 0xC1, 0x08, 0x93, 0x7A,
0xFA, 0x0F, 0xD1, 0x05, 0xC2, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D,
0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xFF, 0x65, 0xFF, 0x68, 0xFF, 0x75, 0xFF, 0xAB, 0xFF, 0xC1,
0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xFA,
0xFF, 0xFA, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xC1, 0x08, 0xC3, 0x75, 0xF6, 0x3F, 0x21, 0x7A,
0xFA, 0xC2, 0x05, 0xC2, 0x6F, 0x7A, 0xFF, 0xFD, 0xF4, 0xA0, 0xC2, 0x05, 0xC2, 0x6D, 0x7A, 0xF4,
0x97, 0xF4, 0x97, 0xC2, 0x05, 0xC2, 0x6B, 0x72, 0xF4, 0x8E, 0xF4, 0x8E, 0x41, 0x7A, 0xF9, 0xAF,
0xA1, 0x05, 0xC2, 0x63, 0xFC, 0xC1, 0x05, 0xC2, 0x77, 0xF4, 0x7C, 0xD6, 0x02, 0x01, 0xC4, 0x61,
0x65, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6F, 0x70, 0x72, 0x73,
0x74, 0x75, 0x77, 0x7A, 0xFC, 0x25, 0xFE, 0x31, 0xFE, 0x43, 0xFE, 0x61, 0xFE, 0x77, 0xFD, 0xBB,
0xFE, 0xED, 0xFA, 0x06, 0xFA, 0x06, 0xFA, 0x06, 0xFA, 0x06, 0xFD, 0xD3, 0xFA, 0x06, 0xFA, 0x06,
0xFF, 0x97, 0xFA, 0x06, 0xFF, 0xD6, 0xFF, 0xDF, 0xFF, 0xE8, 0xFF, 0xF5, 0xFA, 0x06, 0xFF, 0xFA,
0x44, 0x82, 0x9B, 0xBA, 0xBC, 0xF6, 0x93, 0xF6, 0x93, 0xF6, 0x93, 0xF6, 0x93, 0xC2, 0x01, 0xB2,
0x63, 0x74, 0xF6, 0xCA, 0xF6, 0xCA, 0xC1, 0x01, 0xB2, 0x72, 0xF4, 0xDA, 0xA0, 0x02, 0x71, 0xC2,
0x09, 0x12, 0xC5, 0x64, 0xFC, 0x7F, 0xFF, 0xFD, 0xC2, 0x01, 0x92, 0x70, 0x6B, 0xFC, 0x86, 0xF9,
0x33, 0x51, 0x64, 0xC4, 0xC5, 0x62, 0x63, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73,
0x74, 0x77, 0x7A, 0xFF, 0xEE, 0xFC, 0x53, 0xFC, 0x57, 0xF4, 0x32, 0xFC, 0x64, 0xF4, 0x32, 0xF4,
0x32, 0xF4, 0x32, 0xF4, 0x32, 0xF4, 0x32, 0xFF, 0xF7, 0xF4, 0x32, 0xFC, 0x96, 0xFC, 0x96, 0xF4,
0x32, 0xF4, 0x32, 0xF4, 0x32, 0xC2, 0x01, 0xB2, 0x6F, 0x72, 0xFF, 0xCC, 0xF6, 0x69, 0xA0, 0x04,
0x32, 0x21, 0x7A, 0xFD, 0xC8, 0x01, 0xB2, 0x63, 0x64, 0x6B, 0x72, 0x74, 0xC5, 0x6F, 0x7A, 0xF6,
0x63, 0xF6, 0x63, 0xF6, 0x63, 0xF6, 0x63, 0xF6, 0x63, 0xF6, 0x86, 0xFF, 0xFD, 0xF4, 0x7C, 0xC2,
0x01, 0xB2, 0x6D, 0x7A, 0xF4, 0x61, 0xF4, 0x61, 0xC2, 0x01, 0xB2, 0x63, 0x6B, 0xF4, 0x54, 0xF4,
0x58, 0xC2, 0x01, 0xB2, 0x6D, 0x77, 0xF9, 0x20, 0xF4, 0x4F, 0x53, 0x64, 0x6A, 0xC4, 0xC5, 0x62,
0x63, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x75, 0x77, 0x7A, 0xFC, 0xEA,
0xFF, 0x11, 0xF5, 0xEC, 0xFF, 0x56, 0xF6, 0x28, 0xF6, 0x0B, 0xFF, 0x63, 0xF6, 0x28, 0xF3, 0xD5,
0xFF, 0x6C, 0xF3, 0xD5, 0xF3, 0xD5, 0xFF, 0xBB, 0xFF, 0xCA, 0xFF, 0xE5, 0xFF, 0xEE, 0xF3, 0xD5,
0xF3, 0xD5, 0xFF, 0xF7, 0x41, 0x87, 0xFA, 0xF9, 0xA0, 0x09, 0x32, 0xC4, 0x05, 0xC2, 0x63, 0x6B,
0x68, 0x7A, 0xFF, 0xFD, 0xFF, 0xFD, 0xF3, 0x46, 0xF3, 0x46, 0xA0, 0x09, 0x52, 0x42, 0xBA, 0xBC,
0xFF, 0xFD, 0xF8, 0x5E, 0x41, 0x7A, 0xF7, 0x8A, 0xA1, 0x02, 0x92, 0x72, 0xFC, 0xC1, 0x02, 0x92,
0x72, 0xF2, 0x26, 0x41, 0x68, 0xF7, 0x7B, 0xA1, 0x02, 0x92, 0x63, 0xFC, 0x51, 0xC4, 0xC5, 0x62,
0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xFD, 0x22,
0xFD, 0x26, 0xFF, 0xEC, 0xFD, 0x33, 0xFD, 0x43, 0xF4, 0x37, 0xF4, 0x37, 0xF4, 0x37, 0xFF, 0xF1,
0xF4, 0x37, 0xFD, 0x52, 0xFF, 0xFB, 0xFD, 0x4C, 0xFD, 0x4C, 0xFD, 0x52, 0xF4, 0x37, 0xF4, 0x37,
0xC3, 0x05, 0xC2, 0xC5, 0x6F, 0x7A, 0xFF, 0xAD, 0xFF, 0xCC, 0xF2, 0xE1, 0xC2, 0x05, 0xC2, 0x63,
0x6B, 0xFF, 0x8C, 0xFF, 0x8C, 0xA0, 0x09, 0x92, 0xC1, 0x03, 0x12, 0x75, 0xF4, 0x5F, 0xA0, 0x09,
0xE1, 0x44, 0xBA, 0x82, 0x9B, 0xBC, 0xFF, 0xF4, 0xFF, 0xF7, 0xF4, 0x42, 0xFF, 0xFD, 0x41, 0x68,
0xF4, 0x49, 0x21, 0x63, 0xFC, 0xA1, 0x02, 0xB2, 0x75, 0xFD, 0x41, 0x7A, 0xF4, 0x3D, 0x21, 0x63,
0xFC, 0x21, 0x99, 0xFD, 0x41, 0xBC, 0xF4, 0x33, 0x42, 0xC5, 0x70, 0xFF, 0xFC, 0xF4, 0x2F, 0x42,
0x63, 0x74, 0xFF, 0xEB, 0xF4, 0x28, 0x21, 0x70, 0xF9, 0xA3, 0x02, 0xB2, 0xC4, 0x61, 0x65, 0xE8,
0xEF, 0xFD, 0x41, 0x6A, 0xF4, 0x15, 0xA2, 0x02, 0xB2, 0x61, 0x6F, 0xFC, 0xFC, 0xA0, 0x09, 0xB3,
0x21, 0x63, 0xFD, 0x21, 0x6F, 0xFD, 0x21, 0x68, 0xFD, 0x21, 0x7A, 0xF4, 0x21, 0x72, 0xFD, 0x21,
0x74, 0xFD, 0xA2, 0x02, 0x71, 0x63, 0x73, 0xF4, 0xFD, 0x41, 0x87, 0xF3, 0xDA, 0xC2, 0x02, 0xB2,
0x68, 0x7A, 0xF6, 0xB1, 0xF6, 0xB1, 0x42, 0xBA, 0xBC, 0xF8, 0x59, 0xF8, 0x59, 0xA1, 0x02, 0xB2,
0xC5, 0xF9, 0xC2, 0x02, 0xB2, 0x6D, 0x7A, 0xF6, 0x9C, 0xF6, 0x9C, 0xD5, 0x09, 0x72, 0xC5, 0x6D,
0x72, 0x77, 0x6F, 0x75, 0x7A, 0xC4, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6E,
0x70, 0x73, 0x74, 0xFF, 0x76, 0xFF, 0x8A, 0xFF, 0xAE, 0xFF, 0xBB, 0xFF, 0xD7, 0xFE, 0x21, 0xF3,
0x52, 0xFF, 0xDE, 0xF3, 0x72, 0xFF, 0xE2, 0xFF, 0xF2, 0xF3, 0x72, 0xF3, 0x72, 0xF3, 0x72, 0xF3,
0x72, 0xF3, 0x72, 0xF3, 0x72, 0xF3, 0x72, 0xF3, 0x72, 0xFF, 0xF7, 0xF3, 0x72, 0xC2, 0x02, 0x92,
0x6D, 0x7A, 0xF0, 0xF6, 0xF0, 0xF6, 0x51, 0x64, 0xC4, 0xC5, 0x62, 0x63, 0x66, 0x67, 0x68, 0x6B,
0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xFF, 0xB5, 0xFB, 0xF8, 0xFB, 0xFC, 0xF3, 0x0D,
0xFC, 0x09, 0xF3, 0x0D, 0xF3, 0x0D, 0xF3, 0x0D, 0xF3, 0x0D, 0xF3, 0x0D, 0xF3, 0x0D, 0xF3, 0x0D,
0xFC, 0x22, 0xFF, 0xF7, 0xF3, 0x0D, 0xF3, 0x0D, 0xF3, 0x0D, 0xA0, 0x02, 0xF1, 0xA1, 0x02, 0xD2,
0x6B, 0xFD, 0x44, 0x82, 0x9B, 0xBA, 0xBC, 0xFF, 0xFB, 0xF2, 0xF7, 0xF2, 0xF7, 0xF2, 0xF7, 0xA0,
0x0A, 0x12, 0xA0, 0x0A, 0xC2, 0x21, 0x63, 0xFD, 0xA1, 0x0A, 0x32, 0x79, 0xFD, 0x21, 0xBC, 0xFB,
0x21, 0xC5, 0xFD, 0xA1, 0x0B, 0x42, 0x75, 0xFD, 0xA0, 0x0A, 0xE3, 0xA0, 0x0B, 0x42, 0x24, 0xBA,
0x82, 0xBC, 0x9B, 0xE1, 0xF5, 0xFA, 0xFD, 0xA0, 0x0A, 0x32, 0x21, 0x68, 0xFD, 0x21, 0x63, 0xFD,
0xA1, 0x0B, 0x62, 0x75, 0xFD, 0x21, 0x74, 0xF2, 0x21, 0x61, 0xFD, 0x21, 0x6D, 0xFD, 0x21, 0x6B,
0xE9, 0x21, 0x6C, 0xE6, 0xA0, 0x0A, 0x53, 0xA4, 0x0B, 0x62, 0x61, 0x75, 0x79, 0x7A, 0xF4, 0xF7,
0xFA, 0xFD, 0xA1, 0x0B, 0x62, 0x6D, 0xD5, 0xA0, 0x02, 0xD1, 0xA0, 0x0B, 0x13, 0x41, 0x6D, 0xFF,
0xA5, 0x41, 0x6A, 0xFF, 0xA1, 0x22, 0x72, 0x6F, 0xB3, 0xFC, 0xC6, 0x02, 0xD2, 0x61, 0x67, 0x69,
0x6A, 0x6C, 0x77, 0xFF, 0xF0, 0xFF, 0xAE, 0xFF, 0xF3, 0xFF, 0x98, 0xFF, 0x98, 0xFF, 0xFB, 0x41,
0x87, 0xFF, 0x9C, 0xC2, 0x0B, 0x62, 0x68, 0x7A, 0xFF, 0x67, 0xFF, 0x67, 0xA0, 0x0B, 0x81, 0x22,
0xBA, 0xBC, 0xFD, 0xFD, 0xC2, 0x0B, 0x62, 0xC5, 0x7A, 0xFF, 0xFB, 0xFF, 0x56, 0xA0, 0x0B, 0x62,
0xC1, 0x0B, 0x62, 0x7A, 0xFF, 0x7B, 0xD5, 0x09, 0xF2, 0xC5, 0x6D, 0x72, 0x75, 0x79, 0x7A, 0xC4,
0x63, 0x64, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6E, 0x70, 0x73, 0x74, 0x77, 0xFF, 0x78,
0xFF, 0x8A, 0xFF, 0xA1, 0xFF, 0xAC, 0xFF, 0xB1, 0xFF, 0xC4, 0xFF, 0xD9, 0xFF, 0xDD, 0xFF, 0xEE,
0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF7,
0xFF, 0xF7, 0xFF, 0xFA, 0xFF, 0xF7, 0xFF, 0xF7, 0x41, 0x87, 0xF2, 0x01, 0x41, 0x7A, 0xFF, 0x13,
0xA1, 0x06, 0xC2, 0x72, 0xFC, 0xC2, 0x06, 0xC2, 0x68, 0x7A, 0xF6, 0xBA, 0xF6, 0xBA, 0xA0, 0x0A,
0x84, 0x21, 0x73, 0xFD, 0x21, 0x6B, 0xFD, 0x41, 0x7A, 0xFE, 0xE3, 0xA1, 0x06, 0xC2, 0x72, 0xFC,
0xC2, 0x06, 0xC2, 0x6C, 0x72, 0xF6, 0x9F, 0xF6, 0x9F, 0x41, 0x68, 0xFE, 0xD1, 0xA1, 0x06, 0xC2,
0x63, 0xFC, 0x41, 0xBC, 0xFE, 0xC8, 0xC2, 0x06, 0xC2, 0xC5, 0x7A, 0xFF, 0xFC, 0xF6, 0x89, 0xC3,
0x06, 0xC2, 0x63, 0x6D, 0x7A, 0xFF, 0xEA, 0xF6, 0x80, 0xF6, 0x80, 0xC2, 0x06, 0xC2, 0x6B, 0x72,
0xF6, 0x74, 0xF6, 0x74, 0x53, 0xC5, 0x64, 0xC4, 0x62, 0x63, 0x65, 0x66, 0x67, 0x68, 0x6B, 0x6C,
0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xFE, 0xAE, 0xFF, 0x62, 0xFF, 0xA4, 0xFF, 0xAC,
0xFF, 0xB1, 0xFF, 0xC0, 0xF6, 0xE3, 0xFF, 0xC7, 0xF6, 0xE3, 0xFF, 0xCC, 0xF6, 0xE3, 0xF6, 0xE3,
0xF6, 0xE3, 0xFF, 0xD9, 0xFF, 0xE2, 0xFF, 0xEB, 0xFF, 0xF7, 0xF6, 0xE3, 0xF6, 0xE3, 0x21, 0x65,
0xC6, 0x21, 0x7A, 0xFD, 0xC2, 0x05, 0xC2, 0x6F, 0x72, 0xFE, 0x32, 0xFF, 0xFD, 0xC1, 0x03, 0x52,
0x72, 0xF6, 0x9A, 0x41, 0x9B, 0xF4, 0x6B, 0x41, 0x7A, 0xF6, 0x18, 0x21, 0x72, 0xFC, 0x41, 0x72,
0xF4, 0x60, 0xC6, 0x03, 0x32, 0x65, 0x75, 0xC5, 0x62, 0x6D, 0x74, 0xFF, 0xEB, 0xF1, 0x95, 0xFF,
0xF1, 0xFF, 0xF9, 0xEF, 0x01, 0xFF, 0xFC, 0x21, 0x7A, 0xEB, 0xC2, 0x05, 0xC2, 0x6F, 0x7A, 0xFF,
0xFD, 0xEF, 0xE7, 0x41, 0x65, 0xF1, 0x74, 0xA1, 0x03, 0x32, 0x69, 0xFC, 0x21, 0x62, 0xFB, 0xC2,
0x05, 0xC2, 0x75, 0x7A, 0xFF, 0xFD, 0xEF, 0xD2, 0xC2, 0x05, 0xC2, 0x63, 0x77, 0xFB, 0x44, 0xEF,
0xC9, 0xC2, 0x02, 0x92, 0x6B, 0x72, 0xEE, 0xC2, 0xEE, 0xC2, 0x51, 0xC4, 0xC5, 0x62, 0x63, 0x64,
0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xF9, 0xC4, 0xF9, 0xC8,
0xFC, 0x8E, 0xF9, 0xD5, 0xF9, 0xE5, 0xF0, 0xD9, 0xF0, 0xD9, 0xF0, 0xD9, 0xF0, 0xD9, 0xF0, 0xD9,
0xF0, 0xD9, 0xF0, 0xD9, 0xF9, 0xEE, 0xF9, 0xEE, 0xFF, 0xF7, 0xF0, 0xD9, 0xF0, 0xD9, 0xA1, 0x05,
0xC2, 0x79, 0xCC, 0x41, 0x87, 0xF4, 0xA8, 0x44, 0x82, 0x9B, 0xBA, 0xBC, 0xF4, 0xA4, 0xF4, 0xA4,
0xF4, 0xA4, 0xF4, 0xA4, 0x43, 0x9B, 0xBA, 0xBC, 0xF0, 0x89, 0xF0, 0x89, 0xF0, 0x89, 0xCD, 0x00,
0x91, 0xC4, 0xC5, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6D, 0x70, 0x73, 0x77, 0xF9, 0x70,
0xFF, 0xF6, 0xF9, 0x81, 0xF9, 0x91, 0xF0, 0x85, 0xF0, 0x85, 0xF0, 0x85, 0xF0, 0x85, 0xF0, 0x85,
0xF0, 0x85, 0xF0, 0x85, 0xF9, 0x9A, 0xF0, 0x85, 0xC2, 0x00, 0x91, 0x68, 0x7A, 0xF4, 0x63, 0xF4,
0x63, 0x44, 0xBA, 0x82, 0x9B, 0xBC, 0xEE, 0x32, 0xF0, 0x4C, 0xF0, 0x4C, 0xFA, 0x05, 0xC1, 0x00,
0x71, 0x72, 0xFB, 0x0E, 0xD0, 0x00, 0x91, 0xC5, 0xC4, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B,
0x6C, 0x6E, 0x70, 0x73, 0x74, 0x77, 0x7A, 0xFF, 0xED, 0xF9, 0x2A, 0xF9, 0x3B, 0xF9, 0x4B, 0xF0,
0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF9,
0x54, 0xF0, 0x3F, 0xFF, 0xFA, 0xF4, 0x47, 0xC1, 0x00, 0x91, 0x7A, 0xF4, 0x14, 0xD1, 0x02, 0x41,
0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x77,
0x7A, 0xFF, 0x66, 0xFF, 0x6A, 0xFF, 0x81, 0xFF, 0xAB, 0xFF, 0xC7, 0xEE, 0xE4, 0xEE, 0xE4, 0xEE,
0xE4, 0xEE, 0xE4, 0xEE, 0xE4, 0xEE, 0xE4, 0xEE, 0xE4, 0xFF, 0xFA, 0xFF, 0xFA, 0xEE, 0xE4, 0xEE,
0xE4, 0xEE, 0xE4, 0x53, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70,
0x72, 0x73, 0x74, 0x75, 0x77, 0x7A, 0x6F, 0xFB, 0x61, 0xF8, 0x99, 0xF4, 0x3E, 0xFB, 0x68, 0xFB,
0xCD, 0xF4, 0x3E, 0xF4, 0x3E, 0xF4, 0x3E, 0xF4, 0x3E, 0xF4, 0x3E, 0xFB, 0xD9, 0xFE, 0x91, 0xFE,
0xC7, 0xFE, 0xDC, 0xFA, 0x20, 0xFE, 0xE5, 0xFF, 0x2B, 0xFA, 0x32, 0xFF, 0xCA, 0x21, 0x65, 0xC6,
0xD8, 0x01, 0xF1, 0xC4, 0xC5, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B,
0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0xEF, 0x09, 0xEF, 0x0D, 0xFA,
0xEA, 0xEF, 0x1D, 0xEF, 0x1D, 0xEF, 0x1D, 0xF3, 0x40, 0xEF, 0x1D, 0xEF, 0x1D, 0xEF, 0x1D, 0xFF,
0xFD, 0xEF, 0x1D, 0xEF, 0x1D, 0xEF, 0x1D, 0xEF, 0x1D, 0xEF, 0x1D, 0xEF, 0x1D, 0xEF, 0x1D, 0xEF,
0x1D, 0xEF, 0x1D, 0xEF, 0x1D, 0xEF, 0x1D, 0xEF, 0x1D, 0xEF, 0x1D, 0xA0, 0x06, 0x11, 0x21, 0x87,
0xFD, 0x41, 0x6F, 0xEF, 0xA8, 0x21, 0x69, 0xFC, 0xA1, 0x06, 0x11, 0x6D, 0xFD, 0x23, 0x9B, 0xBA,
0xBC, 0xFB, 0xEE, 0xEE, 0x42, 0x85, 0x99, 0xF3, 0x94, 0xF3, 0x94, 0xA0, 0x05, 0x92, 0xA1, 0x05,
0x72, 0x7A, 0xFD, 0x21, 0x63, 0xFB, 0xA2, 0x03, 0xA2, 0xC4, 0x6F, 0xEE, 0xFD, 0x44, 0x82, 0x9B,
0xBA, 0xBC, 0xFF, 0xF9, 0xF0, 0x56, 0xF0, 0x56, 0xF0, 0x56, 0x41, 0x67, 0xF3, 0x6E, 0x21, 0x7A,
0xFC, 0xA1, 0x01, 0xB2, 0x75, 0xFD, 0x41, 0x87, 0xF3, 0x62, 0x41, 0x6F, 0xF3, 0x5E, 0x22, 0xC4,
0x73, 0xF8, 0xFC, 0x41, 0x84, 0xF3, 0x55, 0x42, 0xC5, 0x6E, 0xFF, 0xFC, 0xF3, 0x51, 0x41, 0xBA,
0xF3, 0x4A, 0x42, 0xC5, 0x7A, 0xFF, 0xFC, 0xF3, 0x46, 0x21, 0x64, 0xB2, 0x22, 0x85, 0x99, 0xAF,
0xFD, 0x21, 0x7A, 0xAA, 0x22, 0x63, 0x74, 0xA7, 0xA7, 0x41, 0x6E, 0xFF, 0xA2, 0xA4, 0x0B, 0x93,
0xC4, 0x65, 0x75, 0x79, 0xEF, 0xF4, 0xF7, 0xFC, 0xA4, 0x01, 0x61, 0x61, 0x6F, 0x79, 0x7A, 0xC6,
0xCF, 0xDA, 0xF5, 0xC3, 0x05, 0xC2, 0x6E, 0x68, 0x7A, 0xFA, 0x45, 0xED, 0x8E, 0xED, 0x8E, 0xC2,
0x05, 0xC2, 0xC5, 0x7A, 0xF7, 0x88, 0xED, 0x82, 0xA0, 0x0C, 0x52, 0x41, 0xBC, 0xF2, 0xA0, 0xC4,
0x05, 0xC2, 0x74, 0xC5, 0x6D, 0x7A, 0xFF, 0xF9, 0xFF, 0xFC, 0xF4, 0xBA, 0xED, 0x72, 0x41, 0x68,
0xF2, 0x8D, 0xC2, 0x05, 0xC2, 0x63, 0x7A, 0xFF, 0xFC, 0xED, 0x5F, 0xC1, 0x05, 0xC2, 0x6B, 0xED,
0x56, 0xC1, 0x05, 0xC2, 0x77, 0xFA, 0x07, 0xD1, 0x00, 0x81, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66,
0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xF9, 0xFD, 0xF7, 0x35, 0xF2,
0xDA, 0xFF, 0xBC, 0xFF, 0xC8, 0xF2, 0xDA, 0xF2, 0xDA, 0xF2, 0xDA, 0xF2, 0xDA, 0xF2, 0xDA, 0xF2,
0xDA, 0xF2, 0xDA, 0xFF, 0xD8, 0xFF, 0xEB, 0xFF, 0xF4, 0xF2, 0xDA, 0xFF, 0xFA, 0xC1, 0x00, 0x81,
0x62, 0xF2, 0xA4, 0x41, 0x7A, 0xED, 0x5C, 0x21, 0x72, 0xFC, 0x21, 0x74, 0xFD, 0x21, 0x73, 0xFD,
0xC1, 0x01, 0xB2, 0x7A, 0xED, 0xC0, 0xA0, 0x0C, 0x23, 0x21, 0x6D, 0xFD, 0xD5, 0x00, 0xF2, 0xC5,
0x6C, 0x72, 0x65, 0x69, 0xC4, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6D, 0x6E, 0x6F, 0x70,
0x73, 0x74, 0x75, 0x77, 0xFF, 0x01, 0xFF, 0x15, 0xFF, 0x5C, 0xFF, 0xAB, 0xFF, 0xE1, 0xEF, 0x5A,
0xEF, 0x79, 0xEF, 0x89, 0xED, 0x43, 0xED, 0x43, 0xED, 0x43, 0xED, 0x43, 0xED, 0x43, 0xED, 0x43,
0xED, 0x43, 0xFF, 0xF1, 0xED, 0x43, 0xFF, 0xF4, 0xED, 0x43, 0xFF, 0xFD, 0xED, 0x43, 0x41, 0x6F,
0xED, 0x01, 0xC2, 0x01, 0xB2, 0x75, 0x7A, 0xF2, 0x36, 0xFF, 0xFC, 0x41, 0x74, 0xF2, 0x2D, 0x21,
0x99, 0xFC, 0x41, 0x70, 0xF2, 0x26, 0x41, 0x6E, 0xF2, 0x22, 0x21, 0x69, 0xFC, 0x21, 0x62, 0xFD,
0x41, 0x69, 0xF2, 0x18, 0x41, 0xC4, 0xFE, 0xB2, 0xC2, 0x02, 0x41, 0x65, 0x77, 0xFF, 0xFC, 0xF2,
0x10, 0xA6, 0x01, 0xB2, 0xC4, 0x61, 0x6F, 0x75, 0x77, 0x7A, 0xDE, 0xE1, 0xEC, 0xDA, 0xEF, 0xF7,
0xA0, 0x0C, 0x02, 0xA1, 0x0B, 0xC2, 0x72, 0xFD, 0xA1, 0x0B, 0xC2, 0x6D, 0xF8, 0x22, 0x61, 0x65,
0xF6, 0xFB, 0xA1, 0x0C, 0x92, 0x69, 0xFB, 0xC1, 0x05, 0xC2, 0x6B, 0xF4, 0x06, 0xC1, 0x05, 0xC2,
0x63, 0xFE, 0xF1, 0xC2, 0x05, 0xC2, 0xC5, 0x7A, 0xFE, 0xD8, 0xEC, 0x4E, 0xC2, 0x05, 0xC2, 0x63,
0x6B, 0xFE, 0xE2, 0xEC, 0x45, 0xD1, 0x00, 0x81, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68,
0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xF8, 0xEF, 0xF6, 0x27, 0xF1, 0xCC, 0xF5,
0x81, 0xFE, 0xBA, 0xF1, 0xCC, 0xF1, 0xCC, 0xF1, 0xCC, 0xF1, 0xCC, 0xF1, 0xCC, 0xFF, 0xE2, 0xFF,
0xE8, 0xFF, 0xEE, 0xF5, 0x93, 0xFF, 0xF7, 0xF1, 0xCC, 0xF1, 0xCC, 0xA0, 0x0C, 0x72, 0x43, 0xBA,
0x9B, 0xBC, 0xEC, 0xC2, 0xEE, 0x65, 0xFF, 0xFD, 0x41, 0x75, 0xEF, 0x55, 0xC1, 0x01, 0xB2, 0x65,
0xF8, 0x35, 0x41, 0x73, 0xEC, 0x3D, 0x42, 0x63, 0x6D, 0xFE, 0xDD, 0xFE, 0xF0, 0xD8, 0x00, 0xF2,
0x69, 0x72, 0x7A, 0x65, 0xC5, 0xC4, 0x61, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C,
0x6D, 0x6E, 0x6F, 0x70, 0x73, 0x74, 0x75, 0x77, 0xFF, 0x35, 0xFF, 0x64, 0xFF, 0x85, 0xFF, 0xA8,
0xFF, 0xE1, 0xEE, 0x49, 0xFF, 0xEB, 0xFF, 0xEF, 0xEE, 0x68, 0xEE, 0x78, 0xEC, 0x32, 0xEC, 0x32,
0xEC, 0x32, 0xEC, 0x32, 0xEE, 0x85, 0xEC, 0x32, 0xEC, 0x32, 0xEC, 0x32, 0xFF, 0xF5, 0xEC, 0x32,
0xFE, 0xE3, 0xEC, 0x32, 0xFF, 0xF9, 0xEC, 0x32, 0x41, 0x82, 0xF1, 0x48, 0x21, 0xC5, 0xFC, 0x21,
0x68, 0xFD, 0xA1, 0x02, 0x01, 0x63, 0xFD, 0xA0, 0x0B, 0xE2, 0x21, 0x6E, 0xFD, 0x21, 0x9B, 0xFD,
0xA0, 0x0C, 0xB2, 0x21, 0x6F, 0xFD, 0x22, 0xC5, 0x65, 0xF7, 0xFD, 0x41, 0x7A, 0xEE, 0xD2, 0xC1,
0x06, 0x11, 0x72, 0xEE, 0x0F, 0xC2, 0x02, 0x01, 0x68, 0x7A, 0xFF, 0xFA, 0xFD, 0x46, 0xA0, 0x02,
0x01, 0x41, 0x6B, 0xF1, 0xE6, 0x21, 0x6F, 0xFC, 0x21, 0x6E, 0xFD, 0x21, 0x6C, 0xFD, 0x21, 0xB3,
0xFD, 0x41, 0x72, 0xEC, 0x6C, 0x21, 0x74, 0xFC, 0x21, 0x6F, 0xFD, 0x21, 0x69, 0xFD, 0xA2, 0x02,
0x01, 0xC3, 0x6E, 0xF0, 0xFD, 0x41, 0x6D, 0xF0, 0xCC, 0xC2, 0x02, 0x01, 0x61, 0x72, 0xFF, 0xFC,
0xFD, 0x12, 0x41, 0x68, 0xEB, 0xEE, 0xA1, 0x02, 0x01, 0x63, 0xFC, 0xA0, 0x0C, 0xD2, 0x21, 0xBC,
0xFD, 0x21, 0x99, 0xBD, 0x21, 0xC4, 0xFD, 0xA0, 0x07, 0x02, 0x23, 0xC5, 0x74, 0x7A, 0xF4, 0xFA,
0xFD, 0xA0, 0x05, 0xE2, 0x21, 0x74, 0xFD, 0x21, 0x65, 0xFD, 0xA1, 0x04, 0x32, 0x73, 0xFD, 0x21,
0x6D, 0xFB, 0x21, 0x65, 0xFD, 0xC2, 0x02, 0x01, 0x69, 0x7A, 0xFF, 0xFD, 0xFC, 0xD6, 0x52, 0xC4,
0xC5, 0x62, 0x64, 0x74, 0x6C, 0x61, 0x63, 0x66, 0x67, 0x68, 0x6B, 0x6D, 0x70, 0x72, 0x73, 0x77,
0x7A, 0xFC, 0xD0, 0xFC, 0xDF, 0xFD, 0xFE, 0xFF, 0x0F, 0xFF, 0x64, 0xFF, 0x78, 0xFF, 0x7D, 0xFF,
0x87, 0xFF, 0x90, 0xFF, 0xB0, 0xFF, 0x90, 0xFF, 0xBB, 0xFF, 0x90, 0xFF, 0xC8, 0xFF, 0xDC, 0xFF,
0xF7, 0xFF, 0x90, 0xFF, 0x90, 0x41, 0x77, 0xF1, 0x42, 0x21, 0x6F, 0xFC, 0x21, 0x6B, 0xFD, 0x21,
0x73, 0xFD, 0xA1, 0x00, 0x61, 0x61, 0xFD, 0x45, 0x82, 0x84, 0x9B, 0xBA, 0xBC, 0xFF, 0xFB, 0xE9,
0x23, 0xE9, 0x23, 0xE9, 0x23, 0xE9, 0x23, 0xC1, 0x00, 0x71, 0x72, 0xE9, 0x9C, 0x41, 0x72, 0xF9,
0x4A, 0x41, 0x64, 0xE9, 0x92, 0xA2, 0x00, 0x71, 0x62, 0x6D, 0xF8, 0xFC, 0x41, 0x6B, 0xE9, 0x9A,
0x21, 0x6D, 0xFC, 0x21, 0x79, 0xFD, 0x21, 0x7A, 0xFD, 0x21, 0x72, 0xFD, 0x42, 0x85, 0x99, 0xF0,
0xCF, 0xF0, 0xCF, 0x41, 0x7A, 0xF0, 0xC8, 0x21, 0x63, 0xFC, 0xC7, 0x06, 0xE2, 0x6B, 0x6D, 0x6F,
0x70, 0xC4, 0x65, 0x79, 0xFF, 0xCD, 0xEF, 0x91, 0xFF, 0xDB, 0xFF, 0xEF, 0xFF, 0xF2, 0xFF, 0xFD,
0xF0, 0xC1, 0x21, 0x82, 0xE8, 0x21, 0xC5, 0xFD, 0x21, 0xB3, 0xFD, 0xC1, 0x00, 0x51, 0x68, 0xE8,
0xBF, 0x41, 0x6B, 0xEC, 0x49, 0x21, 0x6F, 0xFC, 0x21, 0x6E, 0xFD, 0x21, 0x82, 0xFD, 0xA0, 0x0C,
0xF3, 0xA1, 0x02, 0x22, 0x6E, 0xFD, 0xC5, 0x02, 0x02, 0x65, 0x69, 0x6F, 0x75, 0x79, 0xEA, 0xDA,
0xFF, 0xFB, 0xEA, 0xDA, 0xEA, 0xDA, 0xEA, 0xDA, 0x41, 0x6B, 0xEA, 0x67, 0xA0, 0x0D, 0x22, 0x21,
0x6C, 0xFD, 0x21, 0x65, 0xFD, 0x21, 0x73, 0xFD, 0x42, 0x72, 0x73, 0xEA, 0x09, 0xEA, 0x09, 0x21,
0x65, 0xF9, 0x21, 0x65, 0xFD, 0xA0, 0x0D, 0x43, 0x21, 0x72, 0xFD, 0x21, 0x65, 0xFD, 0x21, 0x65,
0xFD, 0x21, 0x70, 0xFD, 0x21, 0x74, 0xFD, 0x21, 0x65, 0xFD, 0x26, 0xC5, 0x72, 0x63, 0x65, 0x70,
0x7A, 0xB1, 0xBC, 0xCE, 0xDB, 0xE8, 0xFD, 0x41, 0x74, 0xEA, 0x2E, 0x21, 0x65, 0xFC, 0xA1, 0x0D,
0x72, 0x73, 0xFD, 0x21, 0x87, 0xFB, 0x41, 0x9B, 0xEB, 0x13, 0x21, 0xC5, 0xFC, 0x21, 0x6F, 0xFD,
0x21, 0x69, 0xFD, 0x22, 0xC4, 0x63, 0xF0, 0xFD, 0x21, 0x99, 0xFB, 0x41, 0x77, 0xEA, 0xF8, 0x21,
0x72, 0xFC, 0x41, 0x6E, 0xEC, 0xDA, 0x23, 0xC4, 0x65, 0x6F, 0xF2, 0xF9, 0xFC, 0xC1, 0x03, 0xA2,
0x6B, 0xE9, 0xA4, 0x41, 0x63, 0xEC, 0x06, 0x45, 0x82, 0x9B, 0xBA, 0xBC, 0x84, 0xFF, 0xF6, 0xEB,
0xFC, 0xEB, 0xFC, 0xEB, 0xFC, 0xFF, 0xFC, 0xC1, 0x07, 0xE2, 0x75, 0xEA, 0x39, 0xA0, 0x0E, 0x83,
0x21, 0x64, 0xFD, 0x21, 0xB3, 0xFD, 0x21, 0xC3, 0xFD, 0xA1, 0x07, 0xE2, 0x72, 0xFD, 0x44, 0xBA,
0x82, 0x9B, 0xBC, 0xF1, 0x2C, 0xFF, 0xE9, 0xFF, 0xFB, 0xF1, 0x52, 0x41, 0x77, 0xEA, 0x15, 0xA1,
0x05, 0xC2, 0x61, 0xFC, 0xC1, 0x02, 0x22, 0x6E, 0xF1, 0x71, 0x21, 0x7A, 0xFA, 0x22, 0x63, 0x74,
0xFD, 0xEE, 0x21, 0x99, 0xFB, 0x41, 0xBC, 0xE9, 0xFB, 0x21, 0xC5, 0xFC, 0x21, 0xB3, 0xFD, 0x41,
0x69, 0xF1, 0x49, 0x42, 0xC5, 0x70, 0xFF, 0xF2, 0xE9, 0xED, 0x41, 0xB3, 0xE9, 0xE6, 0x44, 0xC3,
0x61, 0x6F, 0x79, 0xFF, 0xFC, 0xE9, 0xE2, 0xE9, 0xE2, 0xE9, 0xE2, 0xA0, 0x03, 0x32, 0x44, 0xC5,
0x62, 0x63, 0x7A, 0xFF, 0xD7, 0xFF, 0xF0, 0xF1, 0x20, 0xFF, 0xFD, 0x41, 0x67, 0xE9, 0xC5, 0x21,
0x7A, 0xFC, 0x41, 0x65, 0xE9, 0xBE, 0xC9, 0x05, 0xC2, 0xC4, 0xC3, 0x77, 0x61, 0x65, 0x6F, 0x75,
0x79, 0x7A, 0xFF, 0xBC, 0xFF, 0xC6, 0xFF, 0xC9, 0xFF, 0xCD, 0xF1, 0x1C, 0xFF, 0xE8, 0xFF, 0xF9,
0xFF, 0xF5, 0xFF, 0xFC, 0x42, 0x6A, 0x72, 0xE9, 0x9F, 0xE9, 0x9C, 0x21, 0xB3, 0xF9, 0x41, 0x6A,
0xE9, 0x92, 0x43, 0x69, 0x6A, 0x72, 0xE9, 0x8E, 0xE9, 0x8E, 0xF0, 0xDC, 0xA3, 0x05, 0xC2, 0xC3,
0x61, 0x6F, 0xEF, 0xF2, 0xF6, 0x41, 0x70, 0xF2, 0x81, 0xA1, 0x01, 0x61, 0x6C, 0xFC, 0xA0, 0x0D,
0xD5, 0xA1, 0x01, 0x92, 0x73, 0xFD, 0x41, 0x68, 0xE7, 0xBD, 0xA1, 0x01, 0x92, 0x63, 0xFC, 0xC2,
0x01, 0x92, 0x63, 0x7A, 0xFF, 0xF7, 0xED, 0xDC, 0xC1, 0x01, 0x92, 0x6B, 0xE8, 0xD0, 0xD2, 0x01,
0x61, 0x6A, 0x6B, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6C, 0x6D, 0x70, 0x72, 0x73,
0x74, 0x77, 0x7A, 0xEB, 0xFF, 0xFF, 0xE3, 0xF0, 0xF6, 0xF0, 0xFA, 0xE8, 0xD5, 0xF1, 0x07, 0xF1,
0x17, 0xE8, 0xD5, 0xE8, 0xD5, 0xE8, 0xD5, 0xE8, 0xD5, 0xE8, 0xD5, 0xFF, 0xEC, 0xF1, 0x30, 0xFF,
0xF1, 0xFF, 0xFA, 0xE8, 0xD5, 0xE8, 0xD5, 0x42, 0x75, 0x6E, 0xEB, 0xC6, 0xED, 0xFA, 0x41, 0xB3,
0xF1, 0x3E, 0x41, 0x64, 0xF1, 0x37, 0x21, 0x61, 0xFC, 0x41, 0x6A, 0xF1, 0x36, 0x41, 0x61, 0xF1,
0x2F, 0x45, 0xC3, 0x69, 0x6F, 0x72, 0x73, 0xFF, 0xED, 0xFF, 0xF5, 0xFF, 0xF8, 0xFF, 0xFC, 0xF1,
0x52, 0x41, 0x63, 0xF1, 0x18, 0x21, 0x6F, 0xFC, 0x21, 0x68, 0xFD, 0x42, 0x6D, 0x64, 0xF1, 0x0E,
0xEA, 0xDC, 0x41, 0x67, 0xF1, 0x07, 0x21, 0x99, 0xFC, 0x41, 0x73, 0xF1, 0x00, 0x22, 0xC4, 0x65,
0xF9, 0xFC, 0x43, 0x69, 0x6E, 0x72, 0xF1, 0x1B, 0xF0, 0xF7, 0xFF, 0xFB, 0x41, 0x65, 0xF0, 0xF3,
0x21, 0x69, 0xFC, 0x41, 0x77, 0xF0, 0xE6, 0x21, 0x79, 0xFC, 0x41, 0x6B, 0xF0, 0xDF, 0x21, 0x61,
0xFC, 0x21, 0x69, 0xFD, 0x21, 0x6E, 0xFD, 0x42, 0x69, 0x74, 0xFF, 0xFD, 0xF0, 0xF0, 0xCA, 0x01,
0x61, 0x62, 0x63, 0x64, 0x66, 0x67, 0x6B, 0x70, 0x72, 0x73, 0x6C, 0xFF, 0xA3, 0xFF, 0xBA, 0xFF,
0xBD, 0xF0, 0xCB, 0xF0, 0xCB, 0xFF, 0xD4, 0xFF, 0xE2, 0xFF, 0xE9, 0xFF, 0xF9, 0xF0, 0xFC, 0x41,
0x61, 0xF0, 0xAA, 0x41, 0x6C, 0xF0, 0xA6, 0x21, 0x61, 0xFC, 0xA0, 0x04, 0x02, 0x21, 0x6E, 0xFD,
0xA1, 0x07, 0x73, 0x79, 0xFD, 0x21, 0x7A, 0xFB, 0x21, 0x63, 0xFD, 0x22, 0x74, 0x7A, 0xE4, 0xFD,
0xC5, 0x01, 0x61, 0x63, 0x64, 0x70, 0x72, 0x73, 0xF0, 0x8C, 0xF0, 0x8C, 0xFF, 0xDF, 0xFF, 0xE7,
0xFF, 0xFB, 0x41, 0x72, 0xEF, 0xB3, 0x41, 0x74, 0xEF, 0xAF, 0x43, 0x6B, 0x6D, 0x73, 0xFF, 0xF8,
0xEF, 0xAB, 0xFF, 0xFC, 0x41, 0x69, 0xEF, 0xA1, 0x43, 0x85, 0x87, 0x99, 0xEF, 0x9D, 0xEF, 0x9D,
0xEF, 0x9D, 0x41, 0x82, 0xEF, 0x93, 0x41, 0x6E, 0xEF, 0x8F, 0x48, 0xC4, 0xC5, 0x63, 0x65, 0x6C,
0x6D, 0x6F, 0x73, 0xFF, 0xEE, 0xFF, 0xF8, 0xEF, 0x8B, 0xFF, 0xFC, 0xEF, 0x8B, 0xEF, 0x8B, 0xEF,
0x8B, 0xEF, 0x8B, 0x21, 0x69, 0xE7, 0x21, 0x6E, 0xFD, 0x21, 0x65, 0xFD, 0x42, 0x6C, 0x6D, 0xFF,
0xFD, 0xEF, 0x69, 0x42, 0x65, 0x6F, 0xFF, 0xF9, 0xF0, 0x65, 0xA0, 0x0E, 0x23, 0x21, 0x72, 0xFD,
0xC5, 0x03, 0xA2, 0x61, 0x62, 0x65, 0x69, 0x77, 0xFF, 0xAA, 0xFF, 0xB4, 0xEF, 0x55, 0xFF, 0xF3,
0xFF, 0xFD, 0x41, 0x77, 0xE9, 0xD5, 0x21, 0xB3, 0xFC, 0xC1, 0x05, 0xC2, 0xC5, 0xF1, 0x2E, 0xDA,
0x07, 0x02, 0xC4, 0xC5, 0x6D, 0x6E, 0x72, 0x77, 0x61, 0x65, 0x69, 0x6F, 0x75, 0x79, 0x7A, 0xC3,
0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x70, 0x73, 0x74, 0xEE, 0xD1, 0xFD, 0xAF,
0xEF, 0x1A, 0xFD, 0xC0, 0xFE, 0x17, 0xFE, 0x4D, 0xFE, 0x5A, 0xFE, 0x7F, 0xFE, 0xB8, 0xFF, 0x2F,
0xFF, 0x71, 0xEA, 0x7E, 0xFF, 0xE1, 0xFF, 0xF7, 0xEC, 0xB2, 0xF0, 0x67, 0xFF, 0xFA, 0xEC, 0xB2,
0xEC, 0xB2, 0xEC, 0xB2, 0xEC, 0xB2, 0xEC, 0xB2, 0xEC, 0xB2, 0xEC, 0xB2, 0xF2, 0x8B, 0xEC, 0xB2,
0xC2, 0x02, 0x41, 0x64, 0x74, 0xE9, 0x39, 0xE9, 0x39, 0xC1, 0x02, 0x41, 0x72, 0xF2, 0x43, 0xA2,
0x01, 0xB2, 0x7A, 0x68, 0xF1, 0xFA, 0xA0, 0x0D, 0x94, 0x21, 0x73, 0xFD, 0x21, 0x6B, 0xFD, 0xC2,
0x01, 0xB2, 0x6C, 0x72, 0xE7, 0x71, 0xE7, 0x71, 0xC1, 0x01, 0xB2, 0x73, 0xE9, 0x4F, 0xC1, 0x03,
0xE2, 0x6B, 0xEA, 0xB7, 0xC2, 0x01, 0xB2, 0x70, 0x6B, 0xFF, 0xFA, 0xE7, 0x5C, 0xC3, 0x01, 0xB2,
0x63, 0x6F, 0x72, 0xE7, 0x4F, 0xED, 0x8D, 0xE9, 0x31, 0x41, 0xBC, 0xE9, 0xE4, 0x41, 0x99, 0xFE,
0xBD, 0xA0, 0x0E, 0xD2, 0xC4, 0x03, 0xE2, 0xC4, 0x77, 0x66, 0x6D, 0xFF, 0xF9, 0xFF, 0xFD, 0xEA,
0x91, 0xEA, 0x91, 0xC1, 0x04, 0x32, 0x75, 0xE9, 0xA8, 0x21, 0x7A, 0xFA, 0xC7, 0x01, 0xB2, 0xC5,
0x63, 0x66, 0x6E, 0x74, 0x6F, 0x7A, 0xFF, 0xDD, 0xE9, 0x0B, 0xE9, 0x0B, 0xE9, 0x0B, 0xFF, 0xE8,
0xFF, 0xFD, 0xE7, 0x24, 0xA0, 0x0E, 0x53, 0x41, 0x6D, 0xE8, 0xB2, 0x21, 0x6F, 0xFC, 0x4B, 0x64,
0x66, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0xE8, 0xAB, 0xE8, 0xAB, 0xE8, 0xAB,
0xE8, 0xAB, 0xFF, 0xF6, 0xE8, 0xAB, 0xE8, 0xAB, 0xE8, 0xAB, 0xE8, 0xAB, 0xFF, 0xFD, 0xE8, 0xAB,
0xC4, 0x01, 0xB2, 0x74, 0x63, 0x6D, 0x7A, 0xFF, 0xDE, 0xE6, 0xDC, 0xE6, 0xE0, 0xE6, 0xE0, 0xA0,
0x0E, 0xF2, 0x41, 0x75, 0xE6, 0x41, 0xC3, 0x01, 0xB2, 0x6D, 0x61, 0x77, 0xFF, 0xF9, 0xFF, 0xFC,
0xE6, 0xCA, 0xA0, 0x0E, 0xB2, 0x42, 0xBA, 0x9B, 0xFF, 0xFD, 0xE7, 0x18, 0xC2, 0x02, 0x92, 0x68,
0x7A, 0xE7, 0x11, 0xE7, 0x11, 0x41, 0xBA, 0xF3, 0x20, 0x21, 0xC5, 0xFC, 0xCF, 0x09, 0x12, 0xC5,
0x6F, 0xC4, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x70, 0x73, 0x74, 0x7A, 0xFF, 0xE9,
0xED, 0x2D, 0xEF, 0xF2, 0xFF, 0xF0, 0xFF, 0xFD, 0xE7, 0x07, 0xE7, 0x07, 0xE7, 0x07, 0xE7, 0x07,
0xE7, 0x07, 0xE7, 0x07, 0xE7, 0x07, 0xE7, 0x07, 0xE7, 0x07, 0xEB, 0x0F, 0xC1, 0x01, 0x92, 0x72,
0xF0, 0x47, 0xC2, 0x01, 0x92, 0x7A, 0x68, 0xE5, 0xD6, 0xEA, 0xD9, 0xC1, 0x01, 0x92, 0x74, 0xEE,
0x23, 0xC2, 0x01, 0x92, 0x6D, 0x7A, 0xEA, 0xCA, 0xEA, 0xCA, 0xC2, 0x01, 0x92, 0x6D, 0x77, 0xE6,
0xB9, 0xEA, 0xC1, 0x51, 0x64, 0xC4, 0xC5, 0x62, 0x63, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70,
0x72, 0x73, 0x74, 0x77, 0x7A, 0xFF, 0xA9, 0xED, 0xE1, 0xED, 0xE5, 0xFF, 0xD9, 0xFF, 0xDF, 0xFF,
0xE8, 0xE5, 0xC0, 0xE5, 0xC0, 0xE5, 0xC0, 0xE5, 0xC0, 0xE5, 0xC0, 0xE5, 0xC0, 0xEE, 0x24, 0xFF,
0xEE, 0xE5, 0xC0, 0xE5, 0xC0, 0xFF, 0xF7, 0x42, 0x6B, 0x77, 0xE6, 0x7C, 0xE6, 0x7C, 0x21, 0x65,
0xF9, 0x22, 0x61, 0x69, 0xC2, 0xFD, 0x53, 0xC5, 0x64, 0xC4, 0x62, 0x63, 0x65, 0x66, 0x67, 0x68,
0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0x6E, 0xFB, 0xB1, 0xFE, 0x29, 0xE7, 0xB0,
0xE7, 0xCA, 0xFE, 0x89, 0xFE, 0x96, 0xE5, 0x99, 0xE7, 0xEC, 0xE5, 0x99, 0xFE, 0x99, 0xFE, 0xA2,
0xFE, 0xAE, 0xFE, 0xB7, 0xFE, 0xE6, 0xFF, 0x2A, 0xE8, 0x30, 0xE5, 0x99, 0xFF, 0x40, 0xFF, 0xFB,
0x41, 0x75, 0xEA, 0xA1, 0x42, 0x6E, 0x7A, 0xFF, 0xFC, 0xEA, 0x9D, 0x41, 0x75, 0xE6, 0x42, 0x21,
0x6E, 0xFC, 0x21, 0x77, 0xFD, 0x21, 0x61, 0xFD, 0x21, 0x72, 0xFD, 0x43, 0x73, 0x77, 0x70, 0xEA,
0x86, 0xFF, 0xE9, 0xFF, 0xFD, 0x41, 0x6F, 0xFB, 0xC6, 0x21, 0x70, 0xFC, 0x21, 0x73, 0xFD, 0x21,
0x79, 0xFD, 0x21, 0x64, 0xFD, 0xC1, 0x01, 0x72, 0x6B, 0xE3, 0xDE, 0x44, 0x82, 0x9B, 0xBA, 0xBC,
0xFF, 0xFA, 0xE4, 0xFD, 0xE4, 0xFD, 0xE4, 0xFD, 0x43, 0x85, 0x99, 0x87, 0xEC, 0x11, 0xEC, 0x11,
0xE5, 0xE5, 0xA0, 0x0F, 0xB2, 0x21, 0x63, 0xFD, 0xA1, 0x04, 0x52, 0x79, 0xFD, 0x21, 0xBC, 0xFB,
0x21, 0xC5, 0xFD, 0xA1, 0x02, 0x72, 0x75, 0xFD, 0xA0, 0x0F, 0xD3, 0x44, 0xBA, 0x82, 0xBC, 0x9B,
0xFE, 0xA7, 0xFF, 0xF8, 0xFF, 0xFD, 0xE5, 0xC2, 0x41, 0x68, 0xE7, 0xD3, 0x21, 0x63, 0xFC, 0xA1,
0x02, 0x92, 0x75, 0xFD, 0xA0, 0x0F, 0x13, 0x21, 0x72, 0xFD, 0xA0, 0x10, 0x03, 0x21, 0x74, 0xFD,
0xA1, 0x0F, 0x13, 0x61, 0xFD, 0x21, 0x74, 0xFB, 0x21, 0x6F, 0xEC, 0xA3, 0x02, 0x92, 0x62, 0x73,
0x7A, 0xEC, 0xFA, 0xFD, 0x41, 0x74, 0xE7, 0xA7, 0x21, 0x61, 0xFC, 0x21, 0x6D, 0xFD, 0x41, 0x6B,
0xE7, 0x9D, 0x41, 0x6C, 0xE7, 0x99, 0xA0, 0x0F, 0x43, 0xA4, 0x02, 0x92, 0x61, 0x75, 0x79, 0x7A,
0xF2, 0xF5, 0xF9, 0xFD, 0xC1, 0x02, 0x92, 0x6D, 0xE7, 0x87, 0xA0, 0x10, 0x32, 0x21, 0x75, 0xFD,
0x21, 0x6B, 0xFD, 0xA1, 0x01, 0x71, 0x73, 0xFD, 0x41, 0x6D, 0xFF, 0x7A, 0x41, 0x6A, 0xFF, 0x76,
0x42, 0x72, 0x6F, 0xFF, 0x88, 0xFF, 0xFC, 0xC6, 0x01, 0x72, 0x61, 0x67, 0x69, 0x6A, 0x6C, 0x77,
0xFF, 0x6B, 0xFF, 0x81, 0xFF, 0xF1, 0xFF, 0x6B, 0xFF, 0x6B, 0xFF, 0xF9, 0x41, 0x6E, 0xE5, 0x37,
0x21, 0x6F, 0xFC, 0x41, 0x63, 0xE5, 0x30, 0x41, 0x70, 0xEF, 0xF5, 0x23, 0x67, 0x6B, 0x6C, 0xF5,
0xF8, 0xFC, 0x41, 0x7A, 0xE5, 0x21, 0x41, 0x72, 0xE5, 0x1D, 0x21, 0x65, 0xFC, 0x22, 0x67, 0x6D,
0xF5, 0xFD, 0xA0, 0x10, 0x73, 0x21, 0x77, 0xFD, 0x21, 0x99, 0xFD, 0x21, 0xC4, 0xFD, 0xC2, 0x02,
0x92, 0x69, 0x7A, 0xFF, 0xFD, 0xE4, 0xFF, 0xD9, 0x09, 0x12, 0xC4, 0xC5, 0x6D, 0x6F, 0x72, 0x75,
0x79, 0x7A, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6E, 0x70,
0x73, 0x74, 0x77, 0xFF, 0x11, 0xFF, 0x34, 0xFF, 0x48, 0xFF, 0x64, 0xFF, 0x82, 0xFF, 0x8D, 0xFF,
0x9C, 0xFF, 0xB0, 0xFF, 0xD4, 0xE4, 0xFC, 0xED, 0xF8, 0xEE, 0x08, 0xFF, 0xE6, 0xE4, 0xFC, 0xF0,
0xB1, 0xE4, 0xFC, 0xE4, 0xFC, 0xE4, 0xFC, 0xE4, 0xFC, 0xE4, 0xFC, 0xE4, 0xFC, 0xE4, 0xFC, 0xFF,
0xF7, 0xE4, 0xFC, 0xE4, 0xFC, 0xC1, 0x00, 0x71, 0x7A, 0xE2, 0x8E, 0xA1, 0x01, 0x92, 0x72, 0xFA,
0xC1, 0x00, 0x71, 0x72, 0xF0, 0x54, 0xA0, 0x10, 0x52, 0x21, 0x65, 0xFD, 0xC3, 0x10, 0x32, 0x69,
0x61, 0x77, 0xFF, 0xFD, 0xE7, 0xD2, 0xE7, 0xD2, 0x21, 0x77, 0xF4, 0xC3, 0x01, 0x92, 0x68, 0x69,
0x7A, 0xFF, 0xE5, 0xFF, 0xFD, 0xE8, 0x90, 0xA0, 0x0F, 0x74, 0x21, 0x73, 0xFD, 0x21, 0x6B, 0xFD,
0xC2, 0x01, 0x92, 0x6C, 0x72, 0xE8, 0x7B, 0xE8, 0x7B, 0xC1, 0x01, 0x92, 0x6B, 0xE8, 0x72, 0xC3,
0x01, 0x92, 0x63, 0x6D, 0x7A, 0xFA, 0x87, 0xE8, 0x6C, 0xE8, 0x6C, 0xC1, 0x00, 0x71, 0x61, 0xE3,
0x90, 0xC2, 0x01, 0x92, 0x6B, 0x72, 0xE8, 0x5A, 0xFF, 0xFA, 0x54, 0xC5, 0x64, 0xC4, 0x62, 0x63,
0x65, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x75, 0x77, 0x7A, 0xFE,
0x51, 0xFF, 0x4D, 0xEB, 0x7A, 0xFF, 0xA1, 0xFF, 0xC1, 0xFF, 0xD3, 0xE3, 0x59, 0xFD, 0x72, 0xE3,
0x59, 0xFF, 0xD6, 0xE3, 0x59, 0xFF, 0xDF, 0xE3, 0x59, 0xFA, 0x70, 0xEB, 0xB4, 0xFF, 0xE5, 0xFF,
0xF7, 0xE3, 0x59, 0xE3, 0x59, 0xE3, 0x59, 0xC1, 0x01, 0x92, 0x72, 0xE8, 0x14, 0x52, 0xC4, 0xC5,
0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0x6F,
0xEB, 0x37, 0xEB, 0x3B, 0xFF, 0xFA, 0xEB, 0x48, 0xEB, 0x58, 0xE3, 0x16, 0xFD, 0x2F, 0xE3, 0x16,
0xE3, 0x16, 0xE3, 0x16, 0xFF, 0x9C, 0xFA, 0x2D, 0xEB, 0x71, 0xFA, 0x32, 0xFF, 0x9C, 0xE3, 0x16,
0xE3, 0x16, 0xEE, 0x5F, 0xC2, 0x00, 0x61, 0x65, 0x79, 0xFF, 0x86, 0xFF, 0xC9, 0xC3, 0x00, 0x51,
0x61, 0x65, 0x7A, 0xFD, 0xAE, 0xFD, 0xC5, 0xFF, 0xF7, 0xD9, 0x01, 0xF1, 0xC4, 0xC5, 0xC3, 0x62,
0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x72, 0x73,
0x74, 0x76, 0x77, 0x78, 0x7A, 0xE3, 0x30, 0xF7, 0xEE, 0xF8, 0x4F, 0xE3, 0x44, 0xF8, 0x52, 0xE3,
0x44, 0xF8, 0xB1, 0xE3, 0x44, 0xE3, 0x44, 0xE3, 0x44, 0xF8, 0xED, 0xE3, 0x44, 0xE3, 0x44, 0xE3,
0x44, 0xE3, 0x44, 0xE3, 0x44, 0xFD, 0x4D, 0xE3, 0x44, 0xFF, 0xF4, 0xE3, 0x44, 0xE3, 0x44, 0xE3,
0x44, 0xE3, 0x44, 0xE3, 0x44, 0xE3, 0x44, 0x41, 0x73, 0xFE, 0x03, 0x21, 0x6E, 0xFC, 0x21, 0x61,
0xFD, 0x21, 0x72, 0xFD, 0x21, 0x74, 0xFD, 0x41, 0x69, 0xF8, 0x07, 0x41, 0x65, 0xF8, 0x03, 0x21,
0x69, 0xFC, 0xA2, 0x02, 0x22, 0x67, 0x6E, 0xF5, 0xFD, 0xA0, 0x10, 0xA4, 0x21, 0x87, 0xFD, 0x24,
0x82, 0x9B, 0xBA, 0xBC, 0xFA, 0xFA, 0xFA, 0xFA, 0xA0, 0x10, 0xE4, 0xC2, 0x10, 0xE4, 0x68, 0x7A,
0xE7, 0x40, 0xE7, 0x40, 0xC2, 0x10, 0xE4, 0xC5, 0x7A, 0xEA, 0x7A, 0xE7, 0x37, 0xA0, 0x11, 0x24,
0xA1, 0x10, 0xE4, 0x7A, 0xFD, 0xC1, 0x10, 0xE4, 0x6F, 0xF7, 0xC9, 0xC1, 0x10, 0xE4, 0x63, 0xF9,
0x3B, 0xC2, 0x10, 0xE4, 0xC5, 0x7A, 0xEA, 0x79, 0xE7, 0x1A, 0xC2, 0x10, 0xE4, 0x63, 0x7A, 0xF9,
0x2C, 0xE7, 0x11, 0x21, 0x74, 0xDA, 0xD3, 0x02, 0x22, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67,
0x68, 0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0x6A, 0x6E, 0xFF, 0xB6, 0xFF, 0xB9,
0xFF, 0xC2, 0xFF, 0xC5, 0xFF, 0xCE, 0xFF, 0xC2, 0xFF, 0xDA, 0xFF, 0xC2, 0xFF, 0xC2, 0xFF, 0xC2,
0xFF, 0xDF, 0xFF, 0xE5, 0xFF, 0xEB, 0xFF, 0xF4, 0xFF, 0xC2, 0xFF, 0xC2, 0xFF, 0xC2, 0xE2, 0x8A,
0xFF, 0xFD, 0x41, 0x9B, 0xE1, 0x9F, 0x41, 0x72, 0xED, 0x16, 0xC1, 0x02, 0x41, 0x72, 0xE1, 0x97,
0xCC, 0x02, 0x02, 0x61, 0x65, 0x75, 0xC5, 0x62, 0x64, 0x69, 0x6D, 0x6F, 0x70, 0x74, 0x77, 0xFF,
0x62, 0xFF, 0xB6, 0xE2, 0x40, 0xFF, 0xF2, 0xFF, 0xF6, 0xE2, 0x50, 0xE2, 0x50, 0xE2, 0x50, 0xE2,
0x50, 0xE4, 0xBC, 0xFF, 0xFA, 0xE2, 0x50, 0x21, 0x7A, 0xD9, 0xD7, 0x01, 0xF1, 0xC4, 0xC5, 0x62,
0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x72, 0x73, 0x74,
0x76, 0x77, 0x78, 0x7A, 0xE1, 0xFF, 0xE2, 0x03, 0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13, 0xFF, 0x2A,
0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13,
0xFF, 0xFD, 0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13, 0xE2, 0x13,
0xE2, 0x13, 0x41, 0x7A, 0xFC, 0xD8, 0x21, 0x6F, 0xFC, 0x45, 0x63, 0x6B, 0x70, 0x77, 0x72, 0xE1,
0x69, 0xE1, 0x4A, 0xE1, 0x4A, 0xE1, 0x4A, 0xFF, 0xFD, 0x21, 0x6F, 0xF0, 0x21, 0x6D, 0xFD, 0xC1,
0x03, 0x32, 0x73, 0xF7, 0x2C, 0x21, 0x6D, 0xFA, 0x42, 0x65, 0x6D, 0xFF, 0xFD, 0xF7, 0x38, 0x21,
0x64, 0xF9, 0x21, 0x65, 0xFD, 0xA0, 0x0E, 0x92, 0x21, 0x65, 0xFD, 0x21, 0xBC, 0xFD, 0x21, 0xC5,
0xFD, 0x21, 0x64, 0xFD, 0x21, 0x85, 0xFD, 0xC3, 0x00, 0x51, 0xC4, 0x6C, 0x72, 0xFF, 0xFD, 0xDF,
0x53, 0xDF, 0x53, 0x41, 0x62, 0xE7, 0xCB, 0xA0, 0x0D, 0x72, 0x21, 0x82, 0xFD, 0x21, 0xC5, 0xFD,
0x21, 0xB3, 0xFD, 0xC3, 0x06, 0x12, 0x7A, 0xC5, 0x64, 0xE8, 0x6A, 0xEA, 0xC4, 0xE8, 0x06, 0xC3,
0x05, 0xC2, 0x6E, 0x74, 0x7A, 0xED, 0x69, 0xED, 0x69, 0xE0, 0xB2, 0x51, 0x64, 0xC4, 0xC5, 0x62,
0x63, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xFF, 0xE8, 0xED,
0x59, 0xEA, 0x91, 0xE6, 0x36, 0xE9, 0xEB, 0xE6, 0x36, 0xE6, 0x36, 0xE6, 0x36, 0xE6, 0x36, 0xE6,
0x36, 0xE6, 0x36, 0xE6, 0x36, 0xFF, 0xF4, 0xE9, 0xFD, 0xE6, 0x36, 0xE6, 0x36, 0xE6, 0x36, 0xA2,
0x00, 0x51, 0xC3, 0x6F, 0xB1, 0xCC, 0xC5, 0x03, 0x32, 0x61, 0x65, 0x69, 0x6F, 0x75, 0xDF, 0x6D,
0xDF, 0x6D, 0xDF, 0x6D, 0xDF, 0x6D, 0xDF, 0x6D, 0x21, 0x6F, 0xEE, 0x21, 0x65, 0xFD, 0x21, 0x72,
0xFD, 0xA1, 0x00, 0x51, 0x65, 0xFD, 0x41, 0x74, 0xE0, 0xFD, 0xC2, 0x02, 0x02, 0x69, 0x6F, 0xF7,
0x38, 0xFF, 0xFC, 0xA0, 0x11, 0x63, 0xA1, 0x04, 0x52, 0x72, 0xFD, 0x21, 0x74, 0xFB, 0x41, 0x6F,
0xE3, 0x6D, 0xA0, 0x11, 0x92, 0x21, 0x62, 0xFD, 0xA0, 0x11, 0xB2, 0x21, 0x74, 0xFD, 0x21, 0x75,
0xFD, 0x21, 0x7A, 0xFD, 0x21, 0x72, 0xFD, 0x21, 0x64, 0xFD, 0xC5, 0x04, 0x32, 0x61, 0x69, 0x7A,
0x65, 0x6F, 0xFF, 0xE1, 0xFF, 0xE4, 0xFF, 0xEB, 0xE5, 0x41, 0xFF, 0xFD, 0x21, 0x72, 0xEE, 0x21,
0x65, 0xFD, 0x22, 0x62, 0x70, 0xB8, 0xFD, 0xA0, 0x11, 0xD2, 0x21, 0x74, 0xFD, 0x21, 0x65, 0xFD,
0xA1, 0x11, 0xF3, 0x73, 0xFD, 0x21, 0x87, 0xFB, 0x41, 0x9B, 0xEE, 0x63, 0x21, 0xC5, 0xFC, 0x21,
0x6F, 0xFD, 0x21, 0x69, 0xFD, 0x22, 0xC4, 0x63, 0xF0, 0xFD, 0x21, 0x9B, 0xFB, 0x42, 0xC5, 0x73,
0xFF, 0xFD, 0xF4, 0x53, 0xA1, 0x00, 0x51, 0x65, 0xF9, 0xD9, 0x01, 0xF1, 0xC4, 0xC5, 0x61, 0x62,
0x63, 0x64, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x72, 0x73, 0x74,
0x75, 0x76, 0x77, 0x78, 0x7A, 0xE0, 0x60, 0xE0, 0x64, 0xFE, 0xC3, 0xE0, 0x74, 0xF5, 0x82, 0xE0,
0x74, 0xE0, 0x74, 0xE0, 0x74, 0xE0, 0x74, 0xFE, 0xD9, 0xE0, 0x74, 0xFE, 0xEE, 0xE0, 0x74, 0xE0,
0x74, 0xE0, 0x74, 0xFE, 0xFA, 0xFF, 0x56, 0xE0, 0x74, 0xE0, 0x74, 0xFF, 0x78, 0xFF, 0xC9, 0xE0,
0x74, 0xE0, 0x74, 0xE0, 0x74, 0xFF, 0xFB, 0xA0, 0x12, 0x22, 0x21, 0x6E, 0xFD, 0x21, 0x61, 0xFD,
0x21, 0x7A, 0xFD, 0x42, 0x6F, 0x72, 0xE4, 0x3A, 0xFF, 0xFD, 0x41, 0x61, 0xE9, 0x1C, 0x41, 0x7A,
0xE2, 0x9D, 0x21, 0x63, 0xFC, 0xC2, 0x04, 0x32, 0xC4, 0x65, 0xE2, 0x99, 0xFF, 0xFD, 0x21, 0x6A,
0xF7, 0x21, 0xB3, 0xFD, 0xC1, 0x04, 0x52, 0x75, 0xFA, 0x8E, 0x41, 0x65, 0xE2, 0x81, 0xC6, 0x04,
0x32, 0x65, 0x69, 0x79, 0x7A, 0x61, 0x6F, 0xFF, 0xF6, 0xFF, 0xFC, 0xE2, 0x7D, 0xE6, 0x8B, 0xE4,
0x6D, 0xE4, 0x6D, 0x21, 0x73, 0xEB, 0x21, 0x6E, 0xFD, 0x41, 0x68, 0xF5, 0x55, 0x21, 0x63, 0xFC,
0xA1, 0x00, 0x61, 0x65, 0xFD, 0xA3, 0x00, 0x51, 0xC3, 0x61, 0x7A, 0xCC, 0xF1, 0xFB, 0xA0, 0x12,
0x42, 0x21, 0x82, 0xFD, 0xA1, 0x02, 0xB1, 0xC5, 0xFD, 0xC3, 0x10, 0x32, 0x61, 0x65, 0x7A, 0xFB,
0x8D, 0xFB, 0x8D, 0xFF, 0xFB, 0x21, 0x63, 0xF4, 0x21, 0x85, 0xFD, 0x21, 0xC4, 0xFD, 0x21, 0x69,
0xFD, 0x21, 0x73, 0xFD, 0xD9, 0x01, 0xF1, 0xC4, 0xC5, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x79, 0x7A,
0xDF, 0x85, 0xDF, 0x89, 0xFF, 0x7F, 0xDF, 0x99, 0xF4, 0xA7, 0xDF, 0x99, 0xE3, 0xBC, 0xDF, 0x99,
0xDF, 0x99, 0xDF, 0x99, 0xDF, 0x99, 0xDF, 0x99, 0xDF, 0x99, 0xDF, 0x99, 0xDF, 0x99, 0xFF, 0x86,
0xDF, 0x99, 0xFF, 0xD1, 0xDF, 0x99, 0xDF, 0x99, 0xDF, 0x99, 0xDF, 0x99, 0xDF, 0x99, 0xFF, 0xFD,
0xDF, 0x99, 0xA0, 0x04, 0xC2, 0x44, 0x9B, 0x82, 0xBA, 0xBC, 0xF0, 0x76, 0xFF, 0xFD, 0xFF, 0xFD,
0xFF, 0xFD, 0xC1, 0x0C, 0xB2, 0x77, 0xDE, 0x8F, 0x21, 0x7A, 0xFA, 0xC2, 0x0B, 0xE2, 0x65, 0x72,
0xFF, 0xFD, 0xF0, 0x60, 0xC2, 0x0B, 0xE2, 0x68, 0x7A, 0xF0, 0x57, 0xF0, 0x57, 0xA0, 0x06, 0x72,
0x42, 0xBA, 0xBC, 0xDF, 0x30, 0xDF, 0x30, 0xC3, 0x0B, 0xE2, 0x6B, 0xC5, 0x7A, 0xFF, 0xF6, 0xFF,
0xF9, 0xF0, 0x44, 0xA1, 0x0B, 0xE2, 0x6E, 0xEA, 0x21, 0x6A, 0xE5, 0x21, 0x65, 0xFD, 0xC2, 0x0B,
0xE2, 0x6C, 0x72, 0xFF, 0xFD, 0xF0, 0x2D, 0xA2, 0x0B, 0xE2, 0x73, 0x74, 0xD6, 0xD6, 0x21, 0x72,
0xCF, 0xC2, 0x0B, 0xE2, 0x62, 0x6B, 0xFF, 0xFD, 0xF0, 0x1A, 0xA2, 0x0B, 0xE2, 0x63, 0x64, 0xC3,
0xC3, 0xA0, 0x12, 0x63, 0x21, 0x73, 0xFD, 0xC3, 0x06, 0x12, 0x61, 0xC5, 0x64, 0xE7, 0xDF, 0xE8,
0x30, 0xE5, 0x72, 0x51, 0x64, 0xC4, 0xC5, 0x62, 0x63, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x70,
0x72, 0x73, 0x74, 0x77, 0x7A, 0xFF, 0xF4, 0xEA, 0xD1, 0xE8, 0x09, 0xE3, 0xAE, 0xE7, 0x63, 0xE3,
0xAE, 0xE3, 0xAE, 0xE3, 0xAE, 0xE3, 0xAE, 0xE3, 0xAE, 0xE3, 0xAE, 0xE3, 0xAE, 0xE7, 0x75, 0xE7,
0x75, 0xE3, 0xAE, 0xE3, 0xAE, 0xE3, 0xAE, 0xC3, 0x0B, 0xE2, 0x70, 0x63, 0x6F, 0xFF, 0xBD, 0xF2,
0xBB, 0xFF, 0xCC, 0x41, 0xBC, 0xDE, 0x9D, 0x41, 0x7A, 0xF2, 0x59, 0xC4, 0x0B, 0xE2, 0x73, 0xC5,
0x6F, 0x7A, 0xFF, 0x62, 0xFF, 0xF8, 0xFF, 0xFC, 0xEF, 0xB0, 0xA0, 0x12, 0x92, 0xA0, 0x05, 0x91,
0x23, 0x6E, 0x63, 0x6B, 0xFA, 0xFD, 0xFD, 0xC3, 0x0B, 0xE2, 0x74, 0x63, 0x7A, 0xFF, 0xF9, 0xF2,
0x8B, 0xEF, 0x94, 0xC2, 0x0B, 0xE2, 0x6B, 0x72, 0xEF, 0x88, 0xEF, 0x88, 0x41, 0x65, 0xFF, 0x31,
0x41, 0x77, 0xE3, 0x31, 0xA2, 0x0B, 0xE2, 0x62, 0x65, 0xF8, 0xFC, 0x52, 0xC4, 0xC5, 0x62, 0x63,
0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xEF, 0x73,
0xFE, 0xFA, 0xFF, 0x10, 0xFF, 0x19, 0xFF, 0x2C, 0xFF, 0x38, 0xF2, 0x0C, 0xF2, 0x0C, 0xFF, 0x43,
0xFF, 0x4C, 0xFF, 0x56, 0xFF, 0x5F, 0xFF, 0xAC, 0xFF, 0xC0, 0xFF, 0xDC, 0xFF, 0xE8, 0xF2, 0x0C,
0xFF, 0xF9, 0xC1, 0x03, 0xA2, 0x6E, 0xDF, 0xC7, 0x43, 0x82, 0x9B, 0xBC, 0xFF, 0xFA, 0xDF, 0xBB,
0xDF, 0xBB, 0xC1, 0x01, 0xB2, 0x77, 0xDF, 0xF5, 0xC1, 0x01, 0xB2, 0x6B, 0xDE, 0x08, 0xC2, 0x01,
0xB2, 0x64, 0x74, 0xDF, 0xE9, 0xDF, 0xE9, 0xC1, 0x01, 0xB2, 0x63, 0xDD, 0xF5, 0xC6, 0x01, 0xB2,
0x62, 0x64, 0x6E, 0x73, 0x74, 0x7A, 0xDF, 0xDA, 0xDF, 0xDA, 0xDF, 0xDA, 0xDF, 0xDA, 0xDF, 0xDA,
0xDD, 0xF3, 0xA0, 0x12, 0xB3, 0x21, 0x68, 0xFD, 0x21, 0x63, 0xFD, 0xC3, 0x01, 0xB2, 0x70, 0x74,
0x7A, 0xE6, 0x1C, 0xFF, 0xFD, 0xDD, 0xD5, 0xA0, 0x12, 0xE2, 0x21, 0x7A, 0xFD, 0x21, 0x72, 0xFD,
0x21, 0x74, 0xFD, 0x21, 0x85, 0xFD, 0x21, 0xC4, 0xFD, 0xA1, 0x01, 0xB2, 0x6E, 0xFD, 0x41, 0x72,
0xDF, 0x99, 0x41, 0x82, 0xDF, 0x95, 0x21, 0xC5, 0xFC, 0xA2, 0x01, 0xB2, 0x62, 0x67, 0xF5, 0xFD,
0x52, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73,
0x74, 0x77, 0x7A, 0xDF, 0x46, 0xFF, 0x88, 0xDD, 0x2F, 0xDF, 0x65, 0xDF, 0x75, 0xDD, 0x2F, 0xDD,
0x2F, 0xDD, 0x2F, 0xDF, 0x8A, 0xFF, 0x92, 0xFF, 0x98, 0xFF, 0x9E, 0xFF, 0xA7, 0xFF, 0xAD, 0xFF,
0xCB, 0xFF, 0x98, 0xFF, 0xE9, 0xFF, 0xF9, 0x43, 0xC5, 0x64, 0x6B, 0xDD, 0xC9, 0xDD, 0xCC, 0xDD,
0xCC, 0x41, 0x73, 0xF1, 0x96, 0x22, 0x6F, 0x75, 0xF2, 0xFC, 0x21, 0x6C, 0xFB, 0x41, 0x6D, 0xDD,
0xD0, 0x21, 0x6F, 0xFC, 0x21, 0x7A, 0xFD, 0x21, 0x63, 0xFD, 0x22, 0x65, 0x6C, 0xF0, 0xFD, 0x41,
0x62, 0xDD, 0xC4, 0x21, 0x65, 0xFC, 0xA1, 0x00, 0x51, 0x69, 0xFD, 0x41, 0x77, 0xDC, 0xCA, 0x21,
0x62, 0xFC, 0xC4, 0x13, 0x02, 0x69, 0x6F, 0x75, 0x77, 0xE0, 0xCC, 0xFF, 0xFD, 0xE0, 0xCC, 0xE0,
0xCC, 0x21, 0x82, 0xF1, 0x21, 0xC5, 0xFD, 0x21, 0xB3, 0xFD, 0x21, 0xC3, 0xFD, 0xC2, 0x0D, 0x72,
0x6F, 0x77, 0xDB, 0x56, 0xDB, 0x56, 0x21, 0x68, 0xF7, 0x21, 0x63, 0xFD, 0x21, 0x65, 0xFD, 0xA2,
0x00, 0x51, 0x70, 0x7A, 0xEB, 0xFD, 0x41, 0x7A, 0xDE, 0xA3, 0xA1, 0x03, 0xA2, 0x73, 0xFC, 0x44,
0x82, 0x9B, 0xBA, 0xBC, 0xDE, 0x94, 0xDE, 0x94, 0xDE, 0x94, 0xFF, 0xFB, 0x41, 0x61, 0xDE, 0x8D,
0xA1, 0x02, 0x41, 0x68, 0xFC, 0xC2, 0x01, 0xB2, 0x7A, 0x68, 0xFF, 0xFB, 0xDC, 0xDB, 0xC3, 0x01,
0xB2, 0xC5, 0x72, 0x7A, 0xDE, 0xA0, 0xDC, 0xD2, 0xDC, 0xD2, 0xC2, 0x01, 0xB2, 0x6C, 0x72, 0xDC,
0xC6, 0xDE, 0x80, 0xA0, 0x13, 0x23, 0x21, 0x72, 0xFD, 0x21, 0x64, 0xFD, 0xC2, 0x01, 0xB2, 0xC5,
0x7A, 0xDE, 0xBE, 0xDC, 0xB4, 0xC3, 0x01, 0xB2, 0x63, 0x6B, 0x72, 0xDC, 0xA7, 0xDC, 0xAB, 0xDC,
0xAB, 0xA0, 0x06, 0x13, 0x21, 0x73, 0xFD, 0x21, 0x6B, 0xFD, 0x41, 0x6F, 0xED, 0xB1, 0x21, 0x7A,
0xFC, 0x54, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x6F, 0x70, 0x72,
0x73, 0x74, 0x77, 0x7A, 0x65, 0x69, 0xDE, 0x35, 0xFF, 0x9E, 0xDE, 0x4F, 0xFF, 0xB4, 0xFF, 0xBD,
0xDC, 0x1E, 0xDE, 0x71, 0xDC, 0x1E, 0xFF, 0xC9, 0xDC, 0x1E, 0xFE, 0x87, 0xFF, 0xD8, 0xDE, 0x90,
0xFF, 0xDB, 0xDE, 0xA9, 0xFF, 0xE4, 0xDC, 0x1E, 0xDC, 0x1E, 0xFF, 0xF6, 0xFF, 0xFD, 0xD9, 0x01,
0xF1, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E,
0x6F, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x79, 0x7A, 0xDC, 0x2B, 0xDC, 0x2F, 0xDC, 0x3F,
0xDC, 0x3F, 0xDC, 0x3F, 0xFE, 0xB2, 0xDC, 0x3F, 0xDC, 0x3F, 0xDC, 0x3F, 0xFF, 0x0C, 0xDC, 0x3F,
0xDC, 0x3F, 0xDC, 0x3F, 0xDC, 0x3F, 0xFF, 0x18, 0xE2, 0x93, 0xDC, 0x3F, 0xDC, 0x3F, 0xFF, 0x51,
0xDC, 0x3F, 0xDC, 0x3F, 0xDC, 0x3F, 0xDC, 0x3F, 0xFF, 0xC3, 0xDC, 0x3F, 0xC1, 0x00, 0x61, 0x6F,
0xE2, 0x3E, 0x45, 0x82, 0x84, 0x9B, 0xBA, 0xBC, 0xFF, 0xFA, 0xD9, 0xB8, 0xD9, 0xB8, 0xD9, 0xB8,
0xD9, 0xB8, 0xA0, 0x13, 0x51, 0xA1, 0x13, 0x62, 0x75, 0xFD, 0x21, 0x87, 0xFB, 0x21, 0xC4, 0xFD,
0x21, 0x9B, 0xFD, 0x21, 0xC5, 0xFD, 0x41, 0x6F, 0xE7, 0x58, 0x21, 0x70, 0xFC, 0x21, 0x73, 0xFD,
0xC5, 0x01, 0xB2, 0xC5, 0x6F, 0x72, 0x79, 0x7A, 0xDD, 0x9E, 0xFF, 0xF3, 0xDB, 0xD0, 0xFF, 0xFD,
0xDB, 0xD0, 0xC3, 0x01, 0xB2, 0x74, 0x6C, 0x72, 0xDD, 0xA5, 0xDB, 0xBE, 0xDD, 0x78, 0xC3, 0x01,
0xB2, 0x67, 0x6B, 0x74, 0xDD, 0x99, 0xDD, 0x99, 0xDD, 0x99, 0x42, 0x72, 0x73, 0xFE, 0xE9, 0xFE,
0xE9, 0x21, 0x62, 0xF9, 0x41, 0x68, 0xDD, 0x83, 0xC3, 0x01, 0xB2, 0x63, 0xC5, 0x7A, 0xFF, 0xFC,
0xDD, 0xA2, 0xDB, 0x98, 0x41, 0x6F, 0xDA, 0xAF, 0xA1, 0x01, 0xB2, 0x74, 0xFC, 0xA0, 0x08, 0x41,
0x21, 0x63, 0xFD, 0xA1, 0x0C, 0xB2, 0x69, 0xFD, 0x42, 0x6E, 0x7A, 0xFF, 0xFB, 0xFE, 0xE2, 0x41,
0x64, 0xDB, 0xD4, 0x21, 0x65, 0xFC, 0x21, 0x69, 0xFD, 0x55, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66,
0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x6F, 0x70, 0x72, 0x73, 0x74, 0x75, 0x77, 0x7A, 0x69, 0x6E, 0xDD,
0x0D, 0xE6, 0x77, 0xDD, 0x27, 0xDD, 0x2C, 0xFF, 0x97, 0xDA, 0xF6, 0xDD, 0x49, 0xDA, 0xF6, 0xFF,
0xA9, 0xFF, 0xB5, 0xDD, 0x63, 0xFF, 0xC8, 0xDA, 0xF6, 0xFF, 0xCF, 0xDD, 0x81, 0xDD, 0x8D, 0xFF,
0xDF, 0xDA, 0xF6, 0xDA, 0xF6, 0xFF, 0xEF, 0xFF, 0xFD, 0xA0, 0x13, 0x82, 0x21, 0x75, 0xFD, 0x21,
0x77, 0xFD, 0x22, 0x6C, 0x72, 0xF7, 0xF7, 0xA3, 0x0C, 0xB2, 0x61, 0x65, 0x79, 0xF8, 0xFB, 0xF2,
0x21, 0x7A, 0xF7, 0x41, 0x74, 0xEE, 0xCD, 0x21, 0x6E, 0xFC, 0x41, 0x64, 0xEE, 0xC6, 0x21, 0x65,
0xFC, 0x41, 0x6C, 0xEE, 0xBF, 0x21, 0x61, 0xFC, 0x23, 0x6F, 0x72, 0x77, 0xEF, 0xF6, 0xFD, 0x21,
0x6B, 0xF9, 0x21, 0x73, 0xFD, 0xA2, 0x00, 0x51, 0x65, 0x79, 0xDB, 0xFD, 0xC1, 0x01, 0xB2, 0x6C,
0xDA, 0xE4, 0xC3, 0x01, 0xB2, 0x6B, 0xC5, 0x7A, 0xDC, 0xC5, 0xDC, 0xE8, 0xDA, 0xDE, 0xC3, 0x01,
0xB2, 0x63, 0x6D, 0x7A, 0xDA, 0xCE, 0xFF, 0x4F, 0xDA, 0xD2, 0xA0, 0x13, 0xA5, 0x21, 0x73, 0xFD,
0x42, 0x65, 0x70, 0xFF, 0xFD, 0xDC, 0xA7, 0x21, 0x6C, 0xF3, 0x21, 0x65, 0xFD, 0x22, 0x6D, 0x73,
0xF3, 0xFD, 0x41, 0x70, 0xDC, 0x95, 0x21, 0x61, 0xFC, 0xC3, 0x01, 0xB2, 0x6B, 0x65, 0x68, 0xDC,
0x4A, 0xFF, 0xF4, 0xFF, 0xFD, 0x51, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C,
0x6D, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xDC, 0x41, 0xE5, 0xAB, 0xDA, 0x2A, 0xDC, 0x60, 0xDC,
0x70, 0xDA, 0x2A, 0xDA, 0x2A, 0xDA, 0x2A, 0xFF, 0xB7, 0xDA, 0x2A, 0xDA, 0x2A, 0xFC, 0xA2, 0xFF,
0xBD, 0xFF, 0xC9, 0xFF, 0xF4, 0xDA, 0x2A, 0xDA, 0x2A, 0x41, 0x6B, 0xEE, 0x58, 0x21, 0x6F, 0xFC,
0x21, 0x6E, 0xFD, 0x21, 0x6D, 0xFD, 0xC1, 0x13, 0xF2, 0x77, 0xE7, 0xE4, 0x21, 0x68, 0xFA, 0x21,
0x63, 0xFD, 0x21, 0x79, 0xFD, 0x21, 0x77, 0xFD, 0x21, 0x74, 0xFD, 0x21, 0x72, 0xFD, 0xA1, 0x00,
0x51, 0x61, 0xFD, 0x45, 0x82, 0x84, 0x9B, 0xBA, 0xBC, 0xD9, 0xA5, 0xD9, 0xA5, 0xD9, 0xA5, 0xD9,
0xA5, 0xD9, 0xA5, 0xA0, 0x14, 0x12, 0x42, 0xBA, 0xBC, 0xFF, 0xFD, 0xD8, 0x6D, 0xC2, 0x01, 0x92,
0xC5, 0x7A, 0xFF, 0xF9, 0xDE, 0x8E, 0xC1, 0x01, 0x92, 0x63, 0xE1, 0xD8, 0x52, 0xC4, 0xC5, 0x62,
0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0xE1,
0xA8, 0xFF, 0xD7, 0xD9, 0x87, 0xE1, 0xB9, 0xFF, 0xF1, 0xD9, 0x87, 0xD9, 0x87, 0xD9, 0x87, 0xD9,
0x87, 0xD9, 0x87, 0xFF, 0xFA, 0xD9, 0x87, 0xD9, 0x87, 0xE1, 0xEB, 0xE1, 0xEB, 0xD9, 0x87, 0xD9,
0x87, 0xD9, 0x87, 0x21, 0x65, 0xC9, 0xA1, 0x00, 0x51, 0x69, 0xFD, 0xC1, 0x0C, 0xB2, 0x75, 0xFE,
0xAE, 0x21, 0x7A, 0xFA, 0xA1, 0x00, 0x51, 0x6F, 0xFD, 0xD9, 0x01, 0xF1, 0xC4, 0xC5, 0x61, 0x62,
0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x72, 0x73,
0x74, 0x76, 0x77, 0x78, 0x7A, 0xD9, 0xA0, 0xFD, 0xC9, 0xFE, 0x60, 0xD9, 0xB4, 0xD9, 0xB4, 0xFE,
0xDC, 0xFF, 0x2C, 0xD9, 0xB4, 0xD9, 0xB4, 0xD9, 0xB4, 0xFF, 0x6A, 0xD9, 0xB4, 0xD9, 0xB4, 0xD9,
0xB4, 0xFF, 0x85, 0xFF, 0xED, 0xDD, 0xD7, 0xD9, 0xB4, 0xFF, 0xFB, 0xD9, 0xB4, 0xD9, 0xB4, 0xD9,
0xB4, 0xD9, 0xB4, 0xD9, 0xB4, 0xD9, 0xB4, 0x5A, 0xC4, 0xC5, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66,
0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x7A, 0xD7, 0x77, 0xD8, 0x78, 0xD9, 0x3F, 0xD9, 0xA7, 0xDA, 0x7B, 0xDC, 0x80, 0xDD, 0x34,
0xDD, 0x44, 0xDD, 0x9C, 0xDD, 0xFC, 0xDE, 0x6F, 0xDE, 0x83, 0xDF, 0x6B, 0xDF, 0xBD, 0xE0, 0x1E,
0xEA, 0x49, 0xED, 0xC7, 0xF6, 0x22, 0xF7, 0x53, 0xF8, 0xF2, 0xF9, 0xCD, 0xFB, 0x24, 0xDD, 0x44,
0xFD, 0x27, 0xDD, 0x44, 0xFF, 0xB2, 0xA0, 0x14, 0x31, 0xA0, 0x15, 0x81, 0xA1, 0x14, 0x62, 0x2E,
0xFD, 0x21, 0x2E, 0xF8, 0x25, 0x84, 0x9B, 0xBA, 0xBC, 0x82, 0xF8, 0xF8, 0xF8, 0xF8, 0xFD, 0xA1,
0x15, 0x42, 0x2E, 0xEA, 0x21, 0x87, 0xFB, 0x36, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x6B, 0x6D,
0x6E, 0x70, 0x73, 0x74, 0x7A, 0xC4, 0x2E, 0x68, 0x6A, 0x6C, 0x72, 0x76, 0x77, 0x78, 0xED, 0xE5,
0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xE5, 0xFD, 0xE2, 0xEA, 0xEA, 0xEA,
0xEA, 0xEA, 0xEA, 0xEA, 0x43, 0x85, 0x99, 0x87, 0xFF, 0xB2, 0xFF, 0xB2, 0xFF, 0xD3, 0x41, 0x7A,
0xF9, 0x9F, 0x21, 0x63, 0xFC, 0xA1, 0x14, 0x31, 0x77, 0xFD, 0x21, 0xB3, 0xFB, 0xA0, 0x14, 0x42,
0xC2, 0x14, 0x31, 0x69, 0x2E, 0xFF, 0xFD, 0xFF, 0x99, 0xA0, 0x14, 0x61, 0x42, 0x63, 0x2E, 0xFF,
0xFD, 0xFF, 0x8D, 0x21, 0x87, 0xF9, 0x45, 0x9B, 0xBA, 0xBC, 0x82, 0x84, 0xFF, 0x86, 0xFF, 0x86,
0xFF, 0x86, 0xFF, 0x8B, 0xFF, 0x8B, 0x43, 0x6D, 0x6E, 0x2E, 0xFF, 0xE3, 0xFF, 0xE3, 0xFF, 0x73,
0x56, 0x63, 0xC4, 0xC5, 0x62, 0x64, 0x66, 0x67, 0x6B, 0x70, 0x73, 0x74, 0x7A, 0x6C, 0x2E, 0x68,
0x6A, 0x6D, 0x6E, 0x72, 0x76, 0x77, 0x78, 0xFF, 0xD0, 0xFF, 0xE3, 0xFF, 0xE6, 0xFF, 0x6C, 0xFF,
0x6C, 0xFF, 0x6C, 0xFF, 0x6C, 0xFF, 0x6C, 0xFF, 0x6C, 0xFF, 0x6C, 0xFF, 0x6C, 0xFF, 0x6C, 0xFF,
0xF6, 0xFF, 0x69, 0xFF, 0x71, 0xFF, 0x71, 0xFF, 0x71, 0xFF, 0x71, 0xFF, 0x71, 0xFF, 0x71, 0xFF,
0x71, 0xFF, 0x71, 0xA0, 0x00, 0xF1, 0x21, 0xBA, 0xFD, 0xC2, 0x14, 0x62, 0xC5, 0x2E, 0xFF, 0xFD,
0xFF, 0x20, 0x41, 0x87, 0xFF, 0x1A, 0x45, 0x9B, 0xBC, 0xBA, 0x82, 0x84, 0xFF, 0x16, 0xFF, 0x16,
0xFF, 0x29, 0xFF, 0x1B, 0xFF, 0x1B, 0x56, 0x64, 0xC4, 0xC5, 0x62, 0x63, 0x66, 0x67, 0x6B, 0x6C,
0x6D, 0x6E, 0x70, 0x73, 0x74, 0x77, 0x7A, 0x2E, 0x68, 0x6A, 0x72, 0x76, 0x78, 0xFF, 0xE3, 0xFF,
0xEC, 0xFF, 0xF0, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF,
0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x06, 0xFF, 0x03, 0xFF,
0x0B, 0xFF, 0x0B, 0xFF, 0x0B, 0xFF, 0x0B, 0xFF, 0x0B, 0x45, 0x84, 0x9B, 0xBA, 0xBC, 0x82, 0xFE,
0xC3, 0xFE, 0xC3, 0xFE, 0xC3, 0xFE, 0xC3, 0xFE, 0xD6, 0x56, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66,
0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0x2E, 0x76, 0x78,
0xFF, 0x99, 0xFF, 0xF0, 0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB3,
0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB3,
0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB3, 0xFE, 0xB0, 0xFE, 0xB8, 0xFE, 0xB8, 0x45, 0x82, 0x84, 0x9B,
0xBA, 0xBC, 0xFE, 0x70, 0xFE, 0x70, 0xFE, 0x70, 0xFE, 0x70, 0xFE, 0x70, 0x56, 0xC4, 0xC5, 0x62,
0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A,
0x2E, 0x76, 0x78, 0xFF, 0x46, 0xFF, 0xF0, 0xFE, 0x60, 0xFE, 0x60, 0xFE, 0x60, 0xFE, 0x60, 0xFE,
0x60, 0xFE, 0x60, 0xFE, 0x60, 0xFE, 0x60, 0xFE, 0x60, 0xFE, 0x60, 0xFE, 0x60, 0xFE, 0x60, 0xFE,
0x60, 0xFE, 0x60, 0xFE, 0x60, 0xFE, 0x60, 0xFE, 0x60, 0xFE, 0x5D, 0xFE, 0x65, 0xFE, 0x65, 0x45,
0x82, 0x84, 0x9B, 0xBA, 0xBC, 0xFE, 0x1D, 0xFE, 0x1D, 0xFE, 0x1D, 0xFE, 0x1D, 0xFE, 0x30, 0x56,
0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74,
0x77, 0x7A, 0x2E, 0x68, 0x76, 0x78, 0xFE, 0xF3, 0xFF, 0xF0, 0xFE, 0x0D, 0xFE, 0x0D, 0xFE, 0x0D,
0xFE, 0x0D, 0xFE, 0x0D, 0xFE, 0x0D, 0xFE, 0x0D, 0xFE, 0x0D, 0xFE, 0x0D, 0xFE, 0x0D, 0xFE, 0x0D,
0xFE, 0x0D, 0xFE, 0x0D, 0xFE, 0x0D, 0xFE, 0x0D, 0xFE, 0x0D, 0xFE, 0x0A, 0xFE, 0x12, 0xFE, 0x12,
0xFE, 0x12, 0x45, 0x9B, 0xBA, 0x82, 0x84, 0xBC, 0xFE, 0x5E, 0xFE, 0xC4, 0xFF, 0x17, 0xFF, 0x6A,
0xFF, 0xBD, 0x42, 0x6B, 0x2E, 0xFE, 0x27, 0xFD, 0xB7, 0xC1, 0x14, 0x82, 0x2E, 0xFD, 0xB0, 0x25,
0x82, 0x84, 0x9B, 0xBA, 0xBC, 0xF3, 0xFA, 0xFA, 0xFA, 0xFA, 0x21, 0x87, 0xEF, 0xA0, 0x16, 0x43,
0x21, 0x79, 0xFD, 0x21, 0x61, 0xFD, 0x21, 0x77, 0xFD, 0x21, 0x64, 0xFD, 0x21, 0x61, 0xFD, 0x45,
0x6E, 0x2E, 0x7A, 0x64, 0x6F, 0xFD, 0xFA, 0xFD, 0x8A, 0xFD, 0x92, 0xFE, 0x64, 0xFF, 0xFD, 0xC1,
0x15, 0x62, 0x2E, 0xFD, 0x7A, 0xA0, 0x16, 0x22, 0x21, 0x7A, 0xFD, 0x21, 0x75, 0xFD, 0x21, 0x61,
0xFD, 0x21, 0x68, 0xFD, 0x21, 0x6B, 0xFD, 0x42, 0x2E, 0x6F, 0xFD, 0x62, 0xFF, 0xFD, 0x41, 0x68,
0xFE, 0x35, 0x21, 0x74, 0xFC, 0xA0, 0x15, 0x93, 0x21, 0x7A, 0xFD, 0x21, 0x73, 0xFD, 0x41, 0x64,
0xD9, 0xF0, 0x21, 0x6E, 0xFC, 0x21, 0x65, 0xFD, 0x21, 0x68, 0xFD, 0x23, 0x65, 0x66, 0x6B, 0xE7,
0xF0, 0xFD, 0xA0, 0x04, 0xD3, 0x21, 0x75, 0xFD, 0x21, 0x6B, 0xFD, 0x21, 0x6F, 0xFD, 0xA0, 0x0B,
0xB2, 0x21, 0x70, 0xFD, 0x21, 0x6F, 0xFD, 0x21, 0x6B, 0xFD, 0x21, 0x7A, 0xFD, 0xA0, 0x15, 0xC4,
0xA1, 0x01, 0x22, 0x6D, 0xFD, 0x21, 0x73, 0xFB, 0x21, 0x65, 0xFD, 0x21, 0x6E, 0xFD, 0xA0, 0x16,
0x02, 0x21, 0x6D, 0xFD, 0x21, 0x61, 0xFD, 0x21, 0x68, 0xFD, 0x21, 0x67, 0xFD, 0x21, 0x6E, 0xFD,
0x21, 0x69, 0xFD, 0x21, 0x6D, 0xFD, 0x24, 0x6E, 0x73, 0x7A, 0x72, 0xC5, 0xD4, 0xE5, 0xFD, 0x41,
0x61, 0xDB, 0x01, 0x21, 0x6D, 0xFC, 0x21, 0x73, 0xFD, 0x21, 0x65, 0xB5, 0x21, 0x6D, 0xFD, 0xA0,
0x13, 0x02, 0xA1, 0x00, 0x71, 0x6D, 0xFD, 0x21, 0x73, 0xFB, 0x21, 0x73, 0xFD, 0x21, 0x65, 0xFD,
0x21, 0x6E, 0xFD, 0x22, 0x7A, 0x69, 0xE9, 0xFD, 0xA0, 0x16, 0x72, 0x21, 0x6E, 0xFD, 0x21, 0x61,
0xFD, 0x21, 0x70, 0xFD, 0x21, 0x7A, 0xFD, 0x21, 0x73, 0xFD, 0x22, 0x73, 0x6B, 0xE9, 0xFD, 0x5A,
0xC5, 0xC4, 0x63, 0x64, 0x66, 0x67, 0x6B, 0x6D, 0x6E, 0x70, 0x73, 0x74, 0x7A, 0x72, 0x62, 0x2E,
0x68, 0x6A, 0x6C, 0x76, 0x77, 0x78, 0x65, 0x69, 0x6F, 0x75, 0xFF, 0x00, 0xFF, 0x0B, 0xFE, 0xFA,
0xFE, 0xFA, 0xFE, 0xFA, 0xFE, 0xFA, 0xFE, 0xFA, 0xFE, 0xFA, 0xFE, 0xFA, 0xFE, 0xFA, 0xFE, 0xFA,
0xFE, 0xFA, 0xFE, 0xFA, 0xFF, 0x20, 0xFF, 0x30, 0xFC, 0xAA, 0xFC, 0xB2, 0xFC, 0xB2, 0xFF, 0x48,
0xFC, 0xB2, 0xFC, 0xB2, 0xFC, 0xB2, 0xFF, 0x6C, 0xFF, 0xB7, 0xFF, 0xC7, 0xFF, 0xFB, 0x45, 0x84,
0x9B, 0xBA, 0xBC, 0x82, 0xFE, 0xAB, 0xFE, 0xAB, 0xFE, 0xAB, 0xFE, 0xAB, 0xFC, 0x63, 0xA0, 0x14,
0x62, 0x21, 0x87, 0xFD, 0xC1, 0x00, 0xF1, 0x2E, 0xFC, 0x45, 0x25, 0x84, 0x9B, 0xBA, 0xBC, 0x82,
0xF4, 0xF4, 0xF4, 0xF4, 0xFA, 0xC1, 0x00, 0xF1, 0x7A, 0xFC, 0x3C, 0xA0, 0x16, 0x91, 0x21, 0x74,
0xFD, 0x21, 0x73, 0xFD, 0xD4, 0x02, 0x31, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x6B, 0x6D,
0x6E, 0x70, 0x73, 0x74, 0x7A, 0x2E, 0x72, 0x77, 0x6A, 0x6C, 0x75, 0xFF, 0xDD, 0xFF, 0xE6, 0xFF,
0xDA, 0xFF, 0xDA, 0xFF, 0xDA, 0xFF, 0xDA, 0xFF, 0xDA, 0xFF, 0xDA, 0xFF, 0xDA, 0xFF, 0xDA, 0xFF,
0xDA, 0xFF, 0xDA, 0xFF, 0xDA, 0xFF, 0xDA, 0xFC, 0x25, 0xFF, 0xF1, 0xFF, 0xE0, 0xFC, 0xFF, 0xFC,
0xFF, 0xFF, 0xFD, 0x44, 0x84, 0x9B, 0xBA, 0xBC, 0xFF, 0x9B, 0xFF, 0x9B, 0xFF, 0x9B, 0xFF, 0x9B,
0xD0, 0x02, 0x31, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x73,
0x74, 0x7A, 0x2E, 0xFF, 0x91, 0xFF, 0xF3, 0xFF, 0x8E, 0xFF, 0x8E, 0xFF, 0x8E, 0xFF, 0x8E, 0xFF,
0x8E, 0xFF, 0x8E, 0xFF, 0x8E, 0xFF, 0x8E, 0xFF, 0x8E, 0xFF, 0x8E, 0xFF, 0x8E, 0xFB, 0xDC, 0xFF,
0x8E, 0xFB, 0xD9, 0x41, 0x6C, 0xFE, 0x32, 0x21, 0x6C, 0xFC, 0x21, 0x65, 0xFD, 0x21, 0x77, 0xFD,
0x21, 0x64, 0xFD, 0x21, 0x6C, 0xFD, 0xA0, 0x16, 0xA2, 0x21, 0x6E, 0xFD, 0x21, 0x6F, 0xFD, 0x21,
0x7A, 0xFD, 0x21, 0x72, 0xFD, 0x58, 0xC4, 0xC5, 0x62, 0x64, 0x66, 0x67, 0x6B, 0x6C, 0x6D, 0x6E,
0x70, 0x73, 0x74, 0x68, 0x7A, 0x63, 0x2E, 0x6A, 0x72, 0x76, 0x77, 0x78, 0x61, 0x75, 0xFD, 0xE5,
0xFF, 0x29, 0xFD, 0xD4, 0xFD, 0xD4, 0xFD, 0xD4, 0xFD, 0xD4, 0xFD, 0xD4, 0xFD, 0xD4, 0xFD, 0xD4,
0xFD, 0xD4, 0xFD, 0xD4, 0xFD, 0xD4, 0xFD, 0xD4, 0xFF, 0x5F, 0xFF, 0xAB, 0xFE, 0x0A, 0xFB, 0x84,
0xFB, 0x8C, 0xFB, 0x8C, 0xFB, 0x8C, 0xFB, 0x8C, 0xFB, 0x8C, 0xFF, 0xEE, 0xFF, 0xFD, 0x41, 0x7A,
0xFB, 0xAB, 0x43, 0x62, 0x73, 0x2E, 0xFB, 0xA7, 0xFF, 0xFC, 0xFB, 0x37, 0xA0, 0x14, 0xA2, 0x21,
0x87, 0xFD, 0x24, 0x84, 0x9B, 0xBA, 0xBC, 0xFA, 0xFA, 0xFA, 0xFA, 0xCF, 0x02, 0x31, 0xC4, 0xC5,
0x62, 0x63, 0x64, 0x66, 0x67, 0x6B, 0x6D, 0x6E, 0x70, 0x73, 0x74, 0x7A, 0x2E, 0xFF, 0xF4, 0xFF,
0xF7, 0xFF, 0xF1, 0xFF, 0xF1, 0xFF, 0xF1, 0xFF, 0xF1, 0xFF, 0xF1, 0xFF, 0xF1, 0xFF, 0xF1, 0xFF,
0xF1, 0xFF, 0xF1, 0xFF, 0xF1, 0xFF, 0xF1, 0xFF, 0xF1, 0xFB, 0x1E, 0x45, 0x84, 0x9B, 0xBA, 0xBC,
0x82, 0xFF, 0xC1, 0xFF, 0xC1, 0xFF, 0xC1, 0xFF, 0xC1, 0xE7, 0xF3, 0x42, 0x62, 0x6D, 0xDF, 0xFD,
0xDF, 0xFD, 0x21, 0x7A, 0xF9, 0xD4, 0x02, 0x31, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x6B,
0x6D, 0x6E, 0x70, 0x73, 0x74, 0x7A, 0x2E, 0x6A, 0x6C, 0x72, 0x77, 0x65, 0xFF, 0xAA, 0xFF, 0xE6,
0xFF, 0xA7, 0xFF, 0xA7, 0xFF, 0xA7, 0xFF, 0xA7, 0xFF, 0xA7, 0xFF, 0xA7, 0xFF, 0xA7, 0xFF, 0xA7,
0xFF, 0xA7, 0xFF, 0xA7, 0xFF, 0xA7, 0xFF, 0xA7, 0xFA, 0xD4, 0xE7, 0xD9, 0xE7, 0xD9, 0xE7, 0xD9,
0xE7, 0xD9, 0xFF, 0xFD, 0x45, 0x82, 0xBA, 0xBC, 0x84, 0x9B, 0xFF, 0x5E, 0xFF, 0x77, 0xFF, 0xC1,
0xFC, 0xE5, 0xFC, 0xE5, 0xA0, 0x14, 0xC2, 0x21, 0x77, 0xFD, 0x21, 0x6F, 0xFD, 0xC2, 0x14, 0x82,
0x69, 0x2E, 0xFF, 0xFD, 0xFA, 0x7C, 0x42, 0x2E, 0x77, 0xFA, 0x73, 0xE7, 0x78, 0x43, 0x6E, 0x2E,
0x7A, 0xFA, 0xDC, 0xFA, 0x6C, 0xFF, 0xF9, 0xD0, 0x02, 0x31, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66,
0x67, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x73, 0x74, 0x7A, 0x2E, 0xFE, 0x1A, 0xFE, 0x7C, 0xFE, 0x17,
0xFE, 0x17, 0xFE, 0x17, 0xFE, 0x17, 0xFE, 0x17, 0xFE, 0x17, 0xFE, 0x17, 0xFE, 0x17, 0xFE, 0x17,
0xFE, 0x17, 0xFE, 0x17, 0xFE, 0x17, 0xFE, 0x17, 0xFA, 0x62, 0x41, 0x64, 0xDF, 0x60, 0x21, 0x6E,
0xFC, 0x21, 0x61, 0xFD, 0x21, 0x6C, 0xFD, 0x21, 0x68, 0xFD, 0x21, 0x63, 0xFD, 0x21, 0x73, 0xFD,
0x21, 0x74, 0xFD, 0x21, 0x75, 0xFD, 0x41, 0x74, 0xFC, 0xE8, 0x21, 0x73, 0xFC, 0x21, 0x61, 0xFD,
0x21, 0x70, 0xFD, 0x21, 0x7A, 0xFD, 0x21, 0x73, 0xFD, 0x58, 0xC5, 0xC4, 0x62, 0x63, 0x66, 0x67,
0x6B, 0x6D, 0x6E, 0x70, 0x73, 0x74, 0x72, 0x7A, 0x64, 0x2E, 0x68, 0x6A, 0x6C, 0x76, 0x77, 0x78,
0x65, 0x75, 0xFF, 0x6B, 0xFC, 0x61, 0xFC, 0x50, 0xFC, 0x50, 0xFC, 0x50, 0xFC, 0x50, 0xFC, 0x50,
0xFC, 0x50, 0xFF, 0x84, 0xFC, 0x50, 0xFC, 0x50, 0xFC, 0x50, 0xFF, 0x94, 0xFF, 0x9E, 0xFC, 0x86,
0xFA, 0x00, 0xFA, 0x08, 0xFA, 0x08, 0xFA, 0x08, 0xFA, 0x08, 0xFA, 0x08, 0xFA, 0x08, 0xFF, 0xEA,
0xFF, 0xFD, 0x41, 0x87, 0xF9, 0xBF, 0x45, 0x82, 0x84, 0x9B, 0xBA, 0xBC, 0xF9, 0xBB, 0xF9, 0xBB,
0xF9, 0xBB, 0xF9, 0xBB, 0xF9, 0xBB, 0x41, 0x6D, 0xD7, 0xBA, 0x21, 0x72, 0xFC, 0x21, 0x61, 0xFD,
0x41, 0x6E, 0xFC, 0x6E, 0x21, 0x69, 0xFC, 0x21, 0x62, 0xFD, 0x22, 0x68, 0x7A, 0xF3, 0xFD, 0x21,
0x73, 0xFB, 0xA0, 0x16, 0xC2, 0x21, 0x63, 0xFD, 0x21, 0x61, 0xFD, 0x21, 0x7A, 0xFD, 0x41, 0x72,
0xFC, 0x07, 0x21, 0x6F, 0xFC, 0x21, 0x6C, 0xFD, 0x21, 0x6B, 0xFD, 0xA0, 0x16, 0xE3, 0x21, 0x74,
0xFD, 0x21, 0x6F, 0xFD, 0x21, 0x7A, 0xFD, 0x21, 0x61, 0xFD, 0x21, 0x66, 0xFD, 0x44, 0x6B, 0x72,
0x6C, 0x73, 0xD1, 0x98, 0xFF, 0xDE, 0xFF, 0xEB, 0xFF, 0xFD, 0x58, 0x63, 0x6B, 0x6D, 0x6E, 0x66,
0x2E, 0xC4, 0xC5, 0x62, 0x64, 0x67, 0x68, 0x6A, 0x6C, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78,
0x7A, 0x69, 0x6F, 0xFB, 0x9F, 0xFB, 0x9F, 0xFB, 0x9F, 0xFB, 0x9F, 0xFB, 0xD5, 0xF9, 0x4F, 0xFF,
0x98, 0xFF, 0x9C, 0xF9, 0x57, 0xF9, 0x57, 0xF9, 0x57, 0xF9, 0x57, 0xF9, 0x57, 0xF9, 0x57, 0xF9,
0x57, 0xF9, 0x57, 0xF9, 0x57, 0xF9, 0x57, 0xF9, 0x57, 0xF9, 0x57, 0xF9, 0x57, 0xF9, 0x57, 0xFF,
0xC5, 0xFF, 0xF3, 0x42, 0x62, 0x2E, 0xF9, 0x76, 0xF9, 0x06, 0x45, 0x82, 0x84, 0x9B, 0xBA, 0xBC,
0xFF, 0xF9, 0xFB, 0x4F, 0xFB, 0x4F, 0xFB, 0x4F, 0xFB, 0x4F, 0xA0, 0x17, 0x12, 0x21, 0x6F, 0xFD,
0x21, 0x6C, 0xFD, 0x21, 0x69, 0xFD, 0x21, 0x64, 0xFD, 0x21, 0x6E, 0xFD, 0x41, 0x74, 0xF4, 0x52,
0x43, 0x2E, 0x61, 0x6F, 0xF8, 0xD9, 0xFF, 0xF9, 0xFF, 0xFC, 0x41, 0x74, 0xE5, 0xAD, 0x21, 0x65,
0xFC, 0x41, 0x61, 0xD6, 0xC0, 0x21, 0x74, 0xFC, 0x21, 0x70, 0xFD, 0x22, 0x67, 0x6F, 0xF3, 0xFD,
0x21, 0x64, 0xFB, 0xC1, 0x02, 0x02, 0x7A, 0xD1, 0x1E, 0x21, 0x73, 0xFA, 0x21, 0x66, 0xFD, 0x21,
0x6C, 0xFD, 0x58, 0xC5, 0xC4, 0x62, 0x63, 0x64, 0x66, 0x6B, 0x6D, 0x70, 0x73, 0x74, 0x7A, 0x67,
0x2E, 0x68, 0x6A, 0x6C, 0x6E, 0x72, 0x76, 0x77, 0x78, 0x61, 0x6F, 0xFF, 0xA8, 0xFB, 0x08, 0xFA,
0xF7, 0xFA, 0xF7, 0xFA, 0xF7, 0xFA, 0xF7, 0xFA, 0xF7, 0xFA, 0xF7, 0xFA, 0xF7, 0xFA, 0xF7, 0xFA,
0xF7, 0xFA, 0xF7, 0xFB, 0x2D, 0xF8, 0xA7, 0xF8, 0xAF, 0xF8, 0xAF, 0xF8, 0xAF, 0xF8, 0xAF, 0xFF,
0xCE, 0xF8, 0xAF, 0xF8, 0xAF, 0xF8, 0xAF, 0xFF, 0xEE, 0xFF, 0xFD, 0x45, 0x82, 0x84, 0x9B, 0xBA,
0xBC, 0xFA, 0xAE, 0xFA, 0xAE, 0xFA, 0xAE, 0xFA, 0xAE, 0xFA, 0xAE, 0x41, 0x7A, 0xFB, 0x26, 0x21,
0x73, 0xFC, 0xA0, 0x17, 0x32, 0x21, 0x77, 0xFD, 0x21, 0x7A, 0xFD, 0x41, 0x79, 0xD6, 0x55, 0x21,
0x65, 0xFC, 0x21, 0x6C, 0xFD, 0x22, 0x63, 0x78, 0xF3, 0xFD, 0x58, 0xC4, 0xC5, 0x62, 0x63, 0x64,
0x66, 0x67, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0x68, 0x2E, 0x76,
0x78, 0x69, 0x75, 0xFA, 0x90, 0xFF, 0xD1, 0xFA, 0x7F, 0xFA, 0x7F, 0xFA, 0x7F, 0xFA, 0x7F, 0xFA,
0x7F, 0xFA, 0x7F, 0xFA, 0x7F, 0xFA, 0x7F, 0xFA, 0x7F, 0xFA, 0x7F, 0xFA, 0x7F, 0xFA, 0x7F, 0xFA,
0x7F, 0xFA, 0x7F, 0xFA, 0x7F, 0xFA, 0x7F, 0xFA, 0xB5, 0xF8, 0x2F, 0xF8, 0x37, 0xF8, 0x37, 0xFF,
0xE5, 0xFF, 0xFB, 0xA0, 0x05, 0x42, 0x21, 0x82, 0xFD, 0xC3, 0x14, 0x82, 0x2E, 0xC5, 0x72, 0xF7,
0xE0, 0xFF, 0xFD, 0xFF, 0xFA, 0xA0, 0x17, 0x53, 0x22, 0x62, 0x6D, 0xFD, 0xFD, 0x21, 0x7A, 0xFB,
0x21, 0x7A, 0xFD, 0x57, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6B, 0x6C, 0x6D, 0x6E,
0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0x6A, 0x2E, 0x76, 0x78, 0x61, 0xFA, 0x27, 0xFF, 0x68, 0xFA,
0x16, 0xFA, 0x16, 0xFA, 0x16, 0xFA, 0x16, 0xFA, 0x16, 0xFA, 0x16, 0xFA, 0x16, 0xFA, 0x16, 0xFA,
0x16, 0xFA, 0x16, 0xFA, 0x16, 0xFA, 0x16, 0xFA, 0x16, 0xFF, 0xE6, 0xFA, 0x16, 0xFA, 0x16, 0xFA,
0x4C, 0xF7, 0xC6, 0xF7, 0xCE, 0xF7, 0xCE, 0xFF, 0xFD, 0xA0, 0x14, 0xE3, 0xA1, 0x14, 0x82, 0x74,
0xFD, 0xC3, 0x14, 0x82, 0x7A, 0x2E, 0x74, 0xFF, 0xFB, 0xF7, 0x78, 0xF7, 0x80, 0x41, 0x6E, 0xFE,
0x7D, 0x21, 0x6F, 0xFC, 0x21, 0x72, 0xFD, 0x41, 0x65, 0xFE, 0x73, 0x21, 0x68, 0xFC, 0x21, 0x75,
0xFD, 0x22, 0x6B, 0x72, 0xF3, 0xFD, 0x21, 0x73, 0xFB, 0x21, 0x6C, 0xFD, 0x21, 0x72, 0xFD, 0x41,
0x66, 0xE4, 0x4F, 0x21, 0x66, 0xFC, 0x21, 0x6F, 0xFD, 0x21, 0x68, 0xFD, 0x21, 0x68, 0xFD, 0x21,
0x63, 0xFD, 0x21, 0x72, 0xFD, 0x41, 0x6D, 0xE6, 0x76, 0x21, 0x73, 0xFC, 0x21, 0x65, 0xFD, 0x21,
0x72, 0xFD, 0x21, 0x67, 0xFD, 0x21, 0x6E, 0xFD, 0x59, 0xC5, 0xC4, 0x62, 0x63, 0x64, 0x66, 0x67,
0x6D, 0x6E, 0x70, 0x73, 0x74, 0x7A, 0x6B, 0x2E, 0x68, 0x6A, 0x6C, 0x72, 0x76, 0x77, 0x78, 0x61,
0x69, 0x6F, 0xFE, 0x22, 0xF9, 0x82, 0xF9, 0x71, 0xF9, 0x71, 0xF9, 0x71, 0xF9, 0x71, 0xF9, 0x71,
0xF9, 0x71, 0xF9, 0x71, 0xF9, 0x71, 0xFF, 0xA9, 0xF9, 0x71, 0xF9, 0x71, 0xF9, 0xA7, 0xF7, 0x21,
0xF7, 0x29, 0xF7, 0x29, 0xF7, 0x29, 0xF7, 0x29, 0xF7, 0x29, 0xF7, 0x29, 0xF7, 0x29, 0xFF, 0xD4,
0xFF, 0xEA, 0xFF, 0xFD, 0xA0, 0x14, 0xB1, 0x21, 0x77, 0xFD, 0x21, 0x64, 0xFD, 0x41, 0x66, 0xF9,
0xEC, 0x21, 0x66, 0xFC, 0x21, 0x61, 0xFD, 0x21, 0x77, 0xFD, 0x21, 0x74, 0xFD, 0x41, 0x72, 0xFE,
0x75, 0x21, 0x65, 0xFC, 0x21, 0x66, 0xFD, 0x21, 0x73, 0xFD, 0x22, 0x66, 0x6B, 0xF0, 0xFD, 0x41,
0x6F, 0xF7, 0x84, 0x59, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6D, 0x6E,
0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0x6C, 0x2E, 0x76, 0x78, 0x65, 0x75, 0x79, 0xF9, 0x07, 0xFE,
0x48, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8,
0xF6, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8, 0xF6, 0xF8,
0xF6, 0xF9, 0x2C, 0xF6, 0xA6, 0xF6, 0xAE, 0xF6, 0xAE, 0xFF, 0xD7, 0xFF, 0xF7, 0xFF, 0xFC, 0xA0,
0x15, 0x13, 0xC2, 0x14, 0x82, 0x6E, 0x2E, 0xFF, 0xFD, 0xF6, 0x57, 0x41, 0x74, 0xFB, 0xC9, 0x41,
0x6A, 0xFB, 0xC5, 0x22, 0x73, 0x7A, 0xF8, 0xFC, 0xC2, 0x14, 0x82, 0x65, 0x2E, 0xFF, 0xFB, 0xF6,
0x41, 0x41, 0x6E, 0xFE, 0xB8, 0xC3, 0x14, 0x82, 0x6B, 0x2E, 0x74, 0xFF, 0xFC, 0xF6, 0x34, 0xF6,
0x3C, 0x41, 0x82, 0xFC, 0xA1, 0x43, 0xC5, 0x6C, 0x6E, 0xFF, 0xFC, 0xFC, 0x9D, 0xFC, 0x9D, 0x21,
0x7A, 0xF6, 0x21, 0x72, 0xFD, 0x41, 0x7A, 0xFD, 0xCD, 0x21, 0x73, 0xFC, 0x21, 0x61, 0xFD, 0x21,
0x6D, 0xFD, 0x21, 0x7A, 0xFD, 0xA0, 0x17, 0x82, 0x21, 0x82, 0xFD, 0x22, 0xC5, 0x69, 0xFD, 0xFA,
0x21, 0x7A, 0xFB, 0x21, 0x72, 0xFD, 0x22, 0x73, 0x65, 0xEC, 0xFD, 0x41, 0x6C, 0xD3, 0x22, 0x21,
0x61, 0xFC, 0x21, 0x65, 0xFD, 0x21, 0x72, 0xFD, 0x21, 0x74, 0xFD, 0x41, 0x6B, 0xE2, 0xC5, 0x21,
0x69, 0xFC, 0x21, 0x61, 0xFD, 0x22, 0x6E, 0x7A, 0xF3, 0xFD, 0xA0, 0x17, 0xA3, 0x21, 0x6C, 0xFD,
0x21, 0x68, 0xFD, 0x21, 0x63, 0xFD, 0x21, 0x69, 0xFD, 0x21, 0x73, 0xFD, 0x21, 0x61, 0xFD, 0x21,
0x7A, 0xFD, 0x21, 0x72, 0xFD, 0x5A, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B,
0x6C, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0x6D, 0x2E, 0x76, 0x78, 0x61, 0x69, 0x6F, 0x75,
0xF8, 0x15, 0xFD, 0x56, 0xF8, 0x04, 0xF8, 0x04, 0xF8, 0x04, 0xF8, 0x04, 0xF8, 0x04, 0xF8, 0x04,
0xF8, 0x04, 0xFF, 0x5D, 0xF8, 0x04, 0xFF, 0x73, 0xF8, 0x04, 0xF8, 0x04, 0xFF, 0x80, 0xF8, 0x04,
0xF8, 0x04, 0xF8, 0x04, 0xF8, 0x3A, 0xF5, 0xB4, 0xF5, 0xBC, 0xF5, 0xBC, 0xFF, 0x9D, 0xFF, 0xC1,
0xFF, 0xE0, 0xFF, 0xFD, 0xC2, 0x14, 0x82, 0x6E, 0x2E, 0xF5, 0xD5, 0xF5, 0x65, 0x41, 0x73, 0xEF,
0xFD, 0x21, 0x77, 0xFC, 0x21, 0x6F, 0xFD, 0x21, 0x6B, 0xFD, 0x21, 0x82, 0xFD, 0x41, 0x76, 0xEF,
0x40, 0x22, 0xC5, 0x72, 0xF9, 0xFC, 0x57, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A,
0x6B, 0x6C, 0x6D, 0x70, 0x72, 0x73, 0x74, 0x77, 0x7A, 0x6E, 0x2E, 0x76, 0x78, 0x61, 0xF7, 0xA4,
0xFC, 0xE5, 0xF7, 0x93, 0xF7, 0x93, 0xF7, 0x93, 0xF7, 0x93, 0xF7, 0x93, 0xF7, 0x93, 0xF7, 0x93,
0xF7, 0x93, 0xF7, 0x93, 0xF7, 0x93, 0xF7, 0x93, 0xF7, 0x93, 0xF7, 0x93, 0xFF, 0xDE, 0xF7, 0x93,
0xF7, 0x93, 0xF7, 0xC9, 0xF5, 0x43, 0xF5, 0x4B, 0xF5, 0x4B, 0xFF, 0xFB, 0x41, 0x75, 0xFA, 0x78,
0xC2, 0x14, 0x82, 0x65, 0x2E, 0xFF, 0xFC, 0xF4, 0xF9, 0xA0, 0x14, 0x82, 0xC2, 0x14, 0x82, 0x7A,
0x2E, 0xFF, 0xFD, 0xF4, 0xED, 0x42, 0x6E, 0x2E, 0xF5, 0x54, 0xF4, 0xE4, 0x41, 0x6C, 0xF5, 0xB7,
0x21, 0x61, 0xFC, 0x21, 0x68, 0xFD, 0x41, 0x61, 0xF8, 0x12, 0x21, 0x70, 0xFC, 0x21, 0x7A, 0xFD,
0x21, 0x73, 0xFD, 0x44, 0x2E, 0x7A, 0x63, 0x65, 0xF4, 0xC6, 0xF4, 0xCE, 0xFF, 0xF0, 0xFF, 0xFD,
0x41, 0x72, 0xF7, 0x82, 0x21, 0x65, 0xFC, 0x21, 0x6D, 0xFD, 0x21, 0x61, 0xFD, 0x42, 0x61, 0x68,
0xD2, 0xC6, 0xD2, 0xC3, 0x21, 0x63, 0xF9, 0x22, 0x6E, 0x73, 0xF3, 0xFD, 0x41, 0x69, 0xCD, 0x37,
0x21, 0x6E, 0xFC, 0x21, 0x64, 0xFD, 0x21, 0x75, 0xFD, 0x21, 0x82, 0xFD, 0x41, 0x7A, 0xD2, 0x7C,
0x21, 0x72, 0xFC, 0x21, 0x70, 0xFD, 0x21, 0x65, 0xFD, 0x21, 0x69, 0xFD, 0x21, 0x6E, 0xFD, 0x42,
0x85, 0x99, 0xE1, 0x58, 0xE1, 0x58, 0x42, 0xC4, 0x69, 0xFF, 0xF9, 0xE1, 0x51, 0x21, 0x6E, 0xF9,
0xA0, 0x17, 0xD4, 0x21, 0x68, 0xFD, 0x21, 0x74, 0xFD, 0x21, 0x75, 0xFD, 0x21, 0x6F, 0xFD, 0x21,
0x6D, 0xFD, 0x41, 0x64, 0xEE, 0xF8, 0x21, 0x6E, 0xFC, 0x21, 0x61, 0xFD, 0x22, 0x73, 0x6C, 0xF3,
0xFD, 0x21, 0x74, 0xFB, 0x41, 0x65, 0xD2, 0x3D, 0x21, 0x72, 0xFC, 0x42, 0x65, 0x75, 0xD4, 0xF0,
0xFF, 0xFD, 0x21, 0x69, 0xF9, 0x41, 0x69, 0xCD, 0xBE, 0x21, 0x6E, 0xFC, 0x21, 0x64, 0xFD, 0x21,
0x65, 0xFD, 0x21, 0x7A, 0xFD, 0x21, 0x73, 0xFD, 0x46, 0xC5, 0x64, 0x6D, 0x72, 0x6C, 0x77, 0xFF,
0x91, 0xFF, 0xA4, 0xFF, 0xB5, 0xFF, 0xD9, 0xFF, 0xEA, 0xFF, 0xFD, 0x58, 0xC4, 0xC5, 0x62, 0x63,
0x64, 0x66, 0x67, 0x6B, 0x6D, 0x6E, 0x73, 0x74, 0x7A, 0x6C, 0x70, 0x2E, 0x68, 0x6A, 0x72, 0x76,
0x77, 0x78, 0x61, 0x6F, 0xF6, 0x6F, 0xF7, 0xB3, 0xF6, 0x5E, 0xF6, 0x5E, 0xF6, 0x5E, 0xF6, 0x5E,
0xF6, 0x5E, 0xF6, 0x5E, 0xF6, 0x5E, 0xFF, 0x15, 0xFF, 0x21, 0xF6, 0x5E, 0xF6, 0x5E, 0xFF, 0x2A,
0xF6, 0x94, 0xF4, 0x0E, 0xF4, 0x16, 0xF4, 0x16, 0xFF, 0x48, 0xF4, 0x16, 0xF4, 0x16, 0xF4, 0x16,
0xFF, 0x6C, 0xFF, 0xED, 0xC2, 0x14, 0x82, 0x2E, 0x7A, 0xF3, 0xC5, 0xF3, 0xCD, 0x45, 0x82, 0x84,
0x9B, 0xBA, 0xBC, 0xF3, 0xBF, 0xF7, 0x71, 0xF7, 0x71, 0xF7, 0x71, 0xF7, 0x71, 0xD3, 0x02, 0x31,
0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73,
0x74, 0x77, 0x2E, 0xF7, 0x64, 0xFF, 0xF0, 0xF7, 0x61, 0xF7, 0x61, 0xF7, 0x61, 0xF7, 0x61, 0xF7,
0x61, 0xF7, 0x61, 0xF7, 0x61, 0xF7, 0x61, 0xF7, 0x61, 0xF7, 0x61, 0xF7, 0x61, 0xF7, 0x61, 0xF7,
0x61, 0xF7, 0x61, 0xF7, 0x61, 0xF7, 0x61, 0xF3, 0xAC, 0x41, 0x6E, 0xF6, 0x1C, 0x21, 0x65, 0xFC,
0x21, 0x67, 0xFD, 0x21, 0x74, 0xFD, 0x21, 0x6E, 0xFD, 0x41, 0x7A, 0xD1, 0x77, 0x21, 0x63, 0xFC,
0x21, 0x6F, 0xFD, 0x21, 0x72, 0xFD, 0xA0, 0x18, 0x14, 0x21, 0x6B, 0xFD, 0x21, 0x63, 0xFD, 0x21,
0x6F, 0xFD, 0x21, 0x74, 0xFD, 0x23, 0x65, 0x6B, 0x73, 0xE1, 0xEE, 0xFD, 0x57, 0xC4, 0xC5, 0x62,
0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x73, 0x74, 0x77, 0x7A, 0x72,
0x2E, 0x76, 0x78, 0x6F, 0xF5, 0x9E, 0xFA, 0xDF, 0xF5, 0x8D, 0xF5, 0x8D, 0xF5, 0x8D, 0xF5, 0x8D,
0xF5, 0x8D, 0xF5, 0x8D, 0xF5, 0x8D, 0xF5, 0x8D, 0xF5, 0x8D, 0xF5, 0x8D, 0xF5, 0x8D, 0xF5, 0x8D,
0xFF, 0x78, 0xF5, 0x8D, 0xF5, 0x8D, 0xFF, 0x91, 0xF5, 0xC3, 0xF3, 0x3D, 0xF3, 0x45, 0xF3, 0x45,
0xFF, 0xF9, 0x45, 0x82, 0xBA, 0xBC, 0x84, 0x9B, 0xF9, 0xF1, 0xF5, 0x47, 0xF5, 0x47, 0xF2, 0xFF,
0xF2, 0xFF, 0x42, 0x2E, 0x7A, 0xF2, 0xE7, 0xF2, 0xEF, 0x46, 0x6B, 0x6E, 0x73, 0x2E, 0x72, 0x77,
0xF3, 0x50, 0xF3, 0x50, 0xF7, 0xA5, 0xF2, 0xE0, 0xFF, 0xF9, 0xF2, 0xE8, 0x41, 0x9B, 0xF6, 0x82,
0x42, 0x2E, 0x62, 0xF2, 0xC9, 0xF2, 0xD1, 0xA1, 0x14, 0x62, 0x7A, 0xF9, 0xC1, 0x14, 0x62, 0x6E,
0xF3, 0x2D, 0x41, 0x6D, 0xF9, 0xC8, 0x21, 0x6C, 0xFC, 0x21, 0x6F, 0xFD, 0x21, 0x68, 0xFD, 0x21,
0x6B, 0xFD, 0xC3, 0x14, 0x62, 0x2E, 0x72, 0x6F, 0xF2, 0xA7, 0xF2, 0xAF, 0xFF, 0xFD, 0xA0, 0x18,
0x52, 0x21, 0x79, 0xFD, 0x21, 0x82, 0xFD, 0x21, 0xC5, 0xFD, 0x21, 0x7A, 0xFD, 0x21, 0x73, 0xFD,
0x41, 0x67, 0xF5, 0x15, 0x21, 0x6E, 0xFC, 0x21, 0x6F, 0xFD, 0x21, 0x6C, 0xFD, 0x41, 0x87, 0xCA,
0xC6, 0x21, 0xC4, 0xFC, 0x21, 0x9B, 0xFD, 0x22, 0x7A, 0xC5, 0xF3, 0xFD, 0x41, 0x73, 0xF9, 0x7E,
0x21, 0x61, 0xFC, 0x21, 0x77, 0xFD, 0x21, 0x6B, 0xFD, 0x21, 0x6E, 0xFD, 0xD1, 0x02, 0x31, 0xC4,
0xC5, 0x63, 0x66, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x73, 0x74, 0x77, 0x7A, 0x2E, 0x61, 0x65, 0x79,
0xF6, 0x15, 0xFF, 0x90, 0xFF, 0x9B, 0xF6, 0x12, 0xF2, 0x60, 0xFF, 0xA0, 0xF6, 0x12, 0xF2, 0x60,
0xF6, 0x12, 0xF6, 0x12, 0xFF, 0xB6, 0xF6, 0x12, 0xF6, 0x12, 0xF2, 0x5D, 0xFF, 0xD1, 0xFF, 0xEB,
0xFF, 0xFD, 0x42, 0x2E, 0x68, 0xF2, 0x27, 0xF2, 0x2F, 0x41, 0x7A, 0xF2, 0x28, 0x41, 0x72, 0xFC,
0x18, 0x21, 0x65, 0xFC, 0x21, 0x6E, 0xFD, 0x21, 0x6F, 0xFD, 0x21, 0x7A, 0xFD, 0x21, 0x72, 0xFD,
0x43, 0x2E, 0x72, 0x6F, 0xF2, 0x09, 0xFF, 0xE9, 0xFF, 0xFD, 0x42, 0x2E, 0x72, 0xF1, 0xFF, 0xF2,
0xD9, 0x41, 0x65, 0xD0, 0x0F, 0x21, 0x6C, 0xFC, 0x21, 0x74, 0xFD, 0x41, 0x7A, 0xCF, 0xE6, 0x21,
0x69, 0xFC, 0x21, 0x77, 0xFD, 0x41, 0x74, 0xCF, 0xFB, 0x21, 0x70, 0xFC, 0x21, 0x6F, 0xFD, 0x41,
0x6D, 0xCE, 0x7F, 0x21, 0x65, 0xFC, 0x21, 0x74, 0xFD, 0x22, 0x6E, 0x73, 0xF3, 0xFD, 0x59, 0xC5,
0x62, 0x64, 0x66, 0x67, 0x73, 0x6E, 0x74, 0x7A, 0x2E, 0xC4, 0x63, 0x68, 0x6A, 0x6B, 0x6C, 0x6D,
0x70, 0x72, 0x76, 0x77, 0x78, 0x65, 0x6F, 0x79, 0xFE, 0xD4, 0xF4, 0x1B, 0xF4, 0x1B, 0xF4, 0x1B,
0xF4, 0x1B, 0xF4, 0x1B, 0xF4, 0x14, 0xFE, 0xEB, 0xFF, 0x6E, 0xF1, 0xCB, 0xF8, 0x14, 0xFF, 0xA4,
0xF1, 0xD3, 0xF1, 0xD3, 0xFF, 0xC2, 0xF1, 0xD3, 0xFF, 0xCC, 0xF1, 0xD3, 0xF1, 0xD3, 0xF1, 0xD3,
0xF1, 0xD3, 0xF1, 0xD3, 0xFF, 0xDA, 0xFF, 0xE4, 0xFF, 0xFB, 0x43, 0x6B, 0x7A, 0x2E, 0xF1, 0xEF,
0xFC, 0x9B, 0xF1, 0x7F, 0xA0, 0x18, 0x73, 0x21, 0x74, 0xFD, 0x21, 0x6F, 0xFD, 0x21, 0x79, 0xFD,
0x41, 0x74, 0xE0, 0xAB, 0x21, 0x75, 0xFC, 0x21, 0x7A, 0xFD, 0x21, 0x72, 0xFD, 0x21, 0x64, 0xFD,
0x21, 0x6F, 0xFD, 0x21, 0x6F, 0xFD, 0x21, 0x62, 0xFD, 0x21, 0x72, 0xFD, 0x41, 0x69, 0xCF, 0x45,
0x21, 0x6E, 0xFC, 0x21, 0x64, 0xFD, 0x21, 0x6F, 0xFD, 0x21, 0x67, 0xFD, 0x59, 0xC4, 0xC5, 0x62,
0x63, 0x64, 0x66, 0x67, 0x6B, 0x6D, 0x6E, 0x70, 0x73, 0x7A, 0x6C, 0x72, 0x74, 0x2E, 0x68, 0x6A,
0x76, 0x77, 0x78, 0x6F, 0x75, 0x79, 0xF3, 0x9E, 0xF4, 0xE2, 0xF3, 0x8D, 0xF3, 0x8D, 0xF3, 0x8D,
0xF3, 0x8D, 0xF3, 0x8D, 0xF3, 0x8D, 0xF3, 0x8D, 0xF3, 0x8D, 0xF3, 0x8D, 0xF3, 0x8D, 0xF3, 0x8D,
0xFC, 0x59, 0xFF, 0xBE, 0xF3, 0xC3, 0xF1, 0x3D, 0xF1, 0x45, 0xF1, 0x45, 0xF1, 0x45, 0xF1, 0x45,
0xF1, 0x45, 0xFF, 0xD1, 0xFF, 0xED, 0xFF, 0xFD, 0x41, 0x64, 0xF6, 0x6C, 0x41, 0x73, 0xF6, 0x68,
0xC3, 0x14, 0x82, 0x61, 0x6F, 0x2E, 0xFF, 0xF8, 0xFF, 0xFC, 0xF0, 0xE9, 0x45, 0x82, 0x84, 0x9B,
0xBA, 0xBC, 0xFF, 0xF4, 0xF3, 0x2D, 0xF3, 0x2D, 0xF3, 0x2D, 0xF3, 0x2D, 0x21, 0x61, 0xE0, 0xC2,
0x14, 0x82, 0x7A, 0x2E, 0xFF, 0xFD, 0xF0, 0xCA, 0xA0, 0x18, 0xA3, 0x21, 0x64, 0xFD, 0x21, 0x6E,
0xFD, 0x21, 0x65, 0xFD, 0x21, 0x6B, 0xFD, 0x42, 0x66, 0x6D, 0xEB, 0x53, 0xEB, 0x53, 0x21, 0x74,
0xF9, 0x22, 0x65, 0x73, 0xF3, 0xFD, 0x57, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x6A, 0x6B,
0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x7A, 0x77, 0x2E, 0x68, 0x76, 0x78, 0x65, 0xF3, 0x04,
0xFF, 0xC6, 0xF2, 0xF3, 0xFF, 0xD9, 0xF2, 0xF3, 0xF2, 0xF3, 0xF2, 0xF3, 0xF2, 0xF3, 0xF2, 0xF3,
0xF2, 0xF3, 0xF2, 0xF3, 0xF2, 0xF3, 0xF2, 0xF3, 0xF2, 0xF3, 0xF2, 0xF3, 0xF2, 0xF3, 0xF2, 0xF3,
0xF3, 0x29, 0xF0, 0xA3, 0xF0, 0xAB, 0xF0, 0xAB, 0xF0, 0xAB, 0xFF, 0xFB, 0x45, 0x9B, 0x82, 0x84,
0xBA, 0xBC, 0xF2, 0xAD, 0xF0, 0x65, 0xF0, 0x65, 0xF0, 0x65, 0xF0, 0x65, 0xC4, 0x14, 0x82, 0x6B,
0x6E, 0x2E, 0x72, 0xF0, 0xBD, 0xF0, 0xBD, 0xF0, 0x4D, 0xFD, 0x66, 0x41, 0x70, 0xEA, 0x32, 0x21,
0x70, 0xFC, 0x57, 0xC4, 0xC5, 0x63, 0x64, 0x66, 0x6B, 0x70, 0x73, 0x74, 0x7A, 0x2E, 0x62, 0x67,
0x68, 0x6A, 0x6C, 0x6D, 0x6E, 0x72, 0x76, 0x77, 0x78, 0x65, 0xF2, 0x98, 0xFF, 0xDA, 0xF2, 0x87,
0xFF, 0xEA, 0xF2, 0x87, 0xF2, 0x87, 0xF2, 0x87, 0xF2, 0x87, 0xF2, 0x87, 0xF2, 0xBD, 0xF0, 0x37,
0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F,
0xF0, 0x3F, 0xF0, 0x3F, 0xF0, 0x3F, 0xFF, 0xFD, 0xA0, 0x15, 0xB3, 0x21, 0x73, 0xFD, 0x21, 0x6B,
0xFD, 0x21, 0x6C, 0xFD, 0x57, 0x2E, 0xC4, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B,
0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78, 0x7A, 0x6F, 0xEF, 0xE5, 0xF6, 0x2E,
0xF6, 0x32, 0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED,
0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED,
0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED, 0xEF, 0xED, 0xFF, 0xFD, 0x56, 0x2E, 0xC4, 0xC5, 0x62, 0x63,
0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72, 0x73, 0x74, 0x76, 0x77, 0x78,
0x7A, 0xEF, 0x9F, 0xF5, 0xE8, 0xF5, 0xEC, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF,
0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF,
0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xEF, 0xA7, 0xA0, 0x00, 0xD1,
0xC6, 0x02, 0x61, 0x75, 0x79, 0x61, 0x65, 0x69, 0x6F, 0xFF, 0xFD, 0xFF, 0xFD, 0xF0, 0x33, 0xF0,
0x33, 0xF0, 0x33, 0xF0, 0x33, 0xA0, 0x04, 0xF2, 0x21, 0x63, 0xFD, 0x21, 0x61, 0xFD, 0x21, 0x7A,
0xFD, 0xA0, 0x04, 0xE2, 0x21, 0x7A, 0xFD, 0xA1, 0x00, 0xD1, 0x73, 0xFD, 0xC7, 0x02, 0x61, 0x72,
0x75, 0x79, 0x61, 0x65, 0x69, 0x6F, 0xFF, 0xF2, 0xFF, 0xFB, 0xFF, 0xD1, 0xF0, 0x07, 0xF0, 0x07,
0xF0, 0x07, 0xF0, 0x07, 0x22, 0x85, 0x99, 0xB9, 0xB9, 0x21, 0xB3, 0xB4, 0x41, 0x6B, 0xE9, 0xB1,
0x21, 0x63, 0xFC, 0x21, 0x75, 0xFD, 0x21, 0x72, 0xFD, 0x21, 0x62, 0xFD, 0x21, 0x73, 0xFD, 0x41,
0x63, 0xE9, 0x9E, 0x21, 0x75, 0xFC, 0x21, 0x72, 0xFD, 0x21, 0x62, 0xFD, 0x22, 0x6E, 0x73, 0xF0,
0xFD, 0xC9, 0x02, 0x61, 0xC4, 0xC3, 0x61, 0x65, 0x69, 0x6F, 0x75, 0x79, 0x6E, 0xFF, 0xD3, 0xFF,
0xD8, 0xFF, 0x8C, 0xFF, 0x8C, 0xFF, 0x8C, 0xFF, 0x8C, 0xFF, 0x8C, 0xFF, 0x8C, 0xFF, 0xFB, 0x41,
0x72, 0xDB, 0xBC, 0x21, 0x74, 0xFC, 0x21, 0x73, 0xFD, 0x21, 0x69, 0xFD, 0x21, 0x6D, 0xFD, 0x21,
0x68, 0xFD, 0x41, 0x65, 0xFC, 0xD3, 0x21, 0x73, 0xFC, 0x21, 0x66, 0xFD, 0xC8, 0x02, 0x61, 0x79,
0x61, 0x63, 0x65, 0x66, 0x69, 0x6F, 0x75, 0xFF, 0x51, 0xEF, 0x87, 0xFF, 0xF3, 0xEF, 0x87, 0xFF,
0xFD, 0xEF, 0x87, 0xEF, 0x87, 0xEF, 0x87, 0xC6, 0x02, 0x61, 0x79, 0x61, 0x65, 0x69, 0x6F, 0x75,
0xFF, 0x36, 0xEF, 0x6C, 0xEF, 0x6C, 0xEF, 0x6C, 0xEF, 0x6C, 0xEF, 0x6C, 0xC5, 0x02, 0x61, 0x61,
0x65, 0x69, 0x6F, 0x75, 0xEF, 0x57, 0xEF, 0x57, 0xEF, 0x57, 0xEF, 0x57, 0xEF, 0x57, 0x5D, 0x2E,
0xC4, 0xC3, 0xC5, 0x62, 0x63, 0x64, 0x66, 0x67, 0x68, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x72,
0x73, 0x74, 0x77, 0x7A, 0x76, 0x78, 0x61, 0x65, 0x69, 0x6F, 0x75, 0x79, 0xEE, 0x19, 0xEE, 0xB6,
0xEE, 0xCC, 0xF0, 0xA4, 0xF1, 0xC1, 0xF2, 0xE7, 0xF4, 0x6B, 0xF5, 0x1C, 0xF5, 0xC4, 0xF6, 0x3C,
0xF6, 0xA5, 0xF7, 0x4A, 0xF7, 0xC5, 0xF8, 0xB7, 0xF9, 0x28, 0xFA, 0x5D, 0xFB, 0x2E, 0xFC, 0xA0,
0xFD, 0x2E, 0xFD, 0xC8, 0xFE, 0x34, 0xFE, 0x86, 0xFE, 0xCC, 0xFF, 0x12, 0xFF, 0x3E, 0xFF, 0x83,
0xFF, 0xBE, 0xFF, 0xD9, 0xFF, 0xEE,
};
constexpr SerializedHyphenationPatterns pl_patterns = {
0x3C4Eu,
pl_trie_data,
sizeof(pl_trie_data),
};
@@ -3,7 +3,7 @@
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include "Epub/hyphenation/SerializedHyphenationTrie.h" #include "../SerializedHyphenationTrie.h"
// Auto-generated by generate_hyphenation_trie.py. Do not edit manually. // Auto-generated by generate_hyphenation_trie.py. Do not edit manually.
alignas(4) constexpr uint8_t ru_trie_data[] = { alignas(4) constexpr uint8_t ru_trie_data[] = {
File diff suppressed because it is too large Load Diff
@@ -3,7 +3,7 @@
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include "Epub/hyphenation/SerializedHyphenationTrie.h" #include "../SerializedHyphenationTrie.h"
// Auto-generated by generate_hyphenation_trie.py. Do not edit manually. // Auto-generated by generate_hyphenation_trie.py. Do not edit manually.
alignas(4) constexpr uint8_t uk_trie_data[] = { alignas(4) constexpr uint8_t uk_trie_data[] = {
@@ -8,15 +8,13 @@
#include <XmlParserUtils.h> #include <XmlParserUtils.h>
#include <expat.h> #include <expat.h>
#include <algorithm>
#include <iterator> #include <iterator>
#include <new>
#include "Epub.h" #include "../../Epub.h"
#include "Epub/Page.h" #include "../Page.h"
#include "Epub/converters/ImageDecoderFactory.h" #include "../converters/ImageDecoderFactory.h"
#include "Epub/converters/ImageToFramebufferDecoder.h" #include "../converters/ImageToFramebufferDecoder.h"
#include "Epub/htmlEntities.h" #include "../htmlEntities.h"
// Minimum file size (in bytes) to show indexing popup - smaller chapters don't benefit from it // Minimum file size (in bytes) to show indexing popup - smaller chapters don't benefit from it
constexpr size_t MIN_SIZE_FOR_POPUP = 10 * 1024; // 10KB constexpr size_t MIN_SIZE_FOR_POPUP = 10 * 1024; // 10KB
@@ -147,68 +145,6 @@ void ChapterHtmlSlimParser::startNewTextBlock(const BlockStyle& blockStyle) {
wordsExtractedInBlock = 0; wordsExtractedInBlock = 0;
} }
void ChapterHtmlSlimParser::emitHorizontalRule(const BlockStyle& blockStyle) {
if (partWordBufferIndex > 0) {
flushPartWordBuffer();
}
if (currentTextBlock) {
const BlockStyle parentBlockStyle = currentTextBlock->getBlockStyle();
startNewTextBlock(parentBlockStyle);
}
if (!currentPage) {
currentPage.reset(new (std::nothrow) Page());
if (!currentPage) {
LOG_ERR("EHP", "Failed to create page for horizontal rule");
return;
}
currentPageNextY = 0;
}
const int16_t lineHeight = static_cast<int16_t>(renderer.getLineHeight(fontId) * lineCompression + 0.5f);
const int16_t defaultVerticalSpacing = static_cast<int16_t>(lineHeight / 2);
const int16_t topSpacing =
static_cast<int16_t>((blockStyle.marginTop > 0 ? blockStyle.marginTop : defaultVerticalSpacing) +
(blockStyle.paddingTop > 0 ? blockStyle.paddingTop : 0));
const int16_t bottomSpacing =
static_cast<int16_t>((blockStyle.marginBottom > 0 ? blockStyle.marginBottom : defaultVerticalSpacing) +
(blockStyle.paddingBottom > 0 ? blockStyle.paddingBottom : 0));
constexpr uint8_t ruleThickness = 2;
const int16_t availableWidth =
std::max<int16_t>(1, static_cast<int16_t>(viewportWidth - blockStyle.totalHorizontalInset()));
const int16_t width = std::max<int16_t>(1, static_cast<int16_t>(availableWidth / 4));
const int16_t xPos = static_cast<int16_t>(blockStyle.leftInset() + ((availableWidth - width) / 2));
const int16_t totalHeight = static_cast<int16_t>(topSpacing + ruleThickness + bottomSpacing);
if (!currentPage->elements.empty() && currentPageNextY + totalHeight > viewportHeight) {
completePageFn(std::move(currentPage), xpathParagraphIndex, xpathListItemIndex);
completedPageCount++;
currentPage.reset(new (std::nothrow) Page());
if (!currentPage) {
LOG_ERR("EHP", "Failed to create page after horizontal-rule page break");
return;
}
currentPageNextY = 0;
}
currentPageNextY += topSpacing;
auto pageRule = std::shared_ptr<PageHorizontalRule>(
new (std::nothrow) PageHorizontalRule(width, ruleThickness, xPos, currentPageNextY));
if (!pageRule) {
LOG_ERR("EHP", "Failed to create PageHorizontalRule");
return;
}
currentPage->elements.push_back(pageRule);
currentPageNextY = static_cast<int16_t>(currentPageNextY + ruleThickness + bottomSpacing);
if (!pendingAnchorId.empty()) {
anchorData.push_back({std::move(pendingAnchorId), static_cast<uint16_t>(completedPageCount)});
pendingAnchorId.clear();
}
}
void XMLCALL ChapterHtmlSlimParser::startElement(void* userData, const XML_Char* name, const XML_Char** atts) { void XMLCALL ChapterHtmlSlimParser::startElement(void* userData, const XML_Char* name, const XML_Char** atts) {
auto* self = static_cast<ChapterHtmlSlimParser*>(userData); auto* self = static_cast<ChapterHtmlSlimParser*>(userData);
@@ -326,11 +262,6 @@ void XMLCALL ChapterHtmlSlimParser::startElement(void* userData, const XML_Char*
return; return;
} }
if (self->tableDepth == 1 && strcmp(name, "hr") == 0) {
self->depth += 1;
return;
}
if (matches(name, IMAGE_TAGS, std::size(IMAGE_TAGS))) { if (matches(name, IMAGE_TAGS, std::size(IMAGE_TAGS))) {
std::string src; std::string src;
std::string alt; std::string alt;
@@ -669,25 +600,6 @@ void XMLCALL ChapterHtmlSlimParser::startElement(void* userData, const XML_Char*
const auto userAlignmentBlockStyle = BlockStyle::fromCssStyle( const auto userAlignmentBlockStyle = BlockStyle::fromCssStyle(
cssStyle, emSize, static_cast<CssTextAlign>(self->paragraphAlignment), self->viewportWidth); cssStyle, emSize, static_cast<CssTextAlign>(self->paragraphAlignment), self->viewportWidth);
if (strcmp(name, "hr") == 0) {
auto hrBlockStyle = BlockStyle::fromCssStyle(cssStyle, emSize, CssTextAlign::Left, self->viewportWidth);
if (!self->embeddedStyle) {
hrBlockStyle.marginLeft = 0;
hrBlockStyle.marginRight = 0;
hrBlockStyle.marginTop = 0;
hrBlockStyle.marginBottom = 0;
hrBlockStyle.paddingLeft = 0;
hrBlockStyle.paddingRight = 0;
hrBlockStyle.paddingTop = 0;
hrBlockStyle.paddingBottom = 0;
hrBlockStyle.textIndentDefined = false;
hrBlockStyle.textIndent = 0;
}
self->emitHorizontalRule(hrBlockStyle);
self->depth += 1;
return;
}
if (matches(name, HEADER_TAGS, std::size(HEADER_TAGS))) { if (matches(name, HEADER_TAGS, std::size(HEADER_TAGS))) {
self->currentCssStyle = cssStyle; self->currentCssStyle = cssStyle;
auto headerBlockStyle = BlockStyle::fromCssStyle(cssStyle, emSize, CssTextAlign::Center, self->viewportWidth); auto headerBlockStyle = BlockStyle::fromCssStyle(cssStyle, emSize, CssTextAlign::Center, self->viewportWidth);
@@ -8,12 +8,12 @@
#include <string> #include <string>
#include <vector> #include <vector>
#include "Epub/FootnoteEntry.h" #include "../FootnoteEntry.h"
#include "Epub/ParsedText.h" #include "../ParsedText.h"
#include "Epub/blocks/ImageBlock.h" #include "../blocks/ImageBlock.h"
#include "Epub/blocks/TextBlock.h" #include "../blocks/TextBlock.h"
#include "Epub/css/CssParser.h" #include "../css/CssParser.h"
#include "Epub/css/CssStyle.h" #include "../css/CssStyle.h"
class Page; class Page;
class GfxRenderer; class GfxRenderer;
@@ -91,7 +91,6 @@ class ChapterHtmlSlimParser {
void startNewTextBlock(const BlockStyle& blockStyle); void startNewTextBlock(const BlockStyle& blockStyle);
void flushPartWordBuffer(); void flushPartWordBuffer();
void makePages(); void makePages();
void emitHorizontalRule(const BlockStyle& blockStyle);
// XML callbacks // XML callbacks
static void XMLCALL startElement(void* userData, const XML_Char* name, const XML_Char** atts); static void XMLCALL startElement(void* userData, const XML_Char* name, const XML_Char** atts);
static void XMLCALL characterData(void* userData, const XML_Char* s, int len); static void XMLCALL characterData(void* userData, const XML_Char* s, int len);
+1 -1
View File
@@ -5,7 +5,7 @@
#include <Serialization.h> #include <Serialization.h>
#include <XmlParserUtils.h> #include <XmlParserUtils.h>
#include "Epub/BookMetadataCache.h" #include "../BookMetadataCache.h"
namespace { namespace {
constexpr char MEDIA_TYPE_NCX[] = "application/x-dtbncx+xml"; constexpr char MEDIA_TYPE_NCX[] = "application/x-dtbncx+xml";
+1 -1
View File
@@ -4,7 +4,7 @@
#include <Logging.h> #include <Logging.h>
#include <XmlParserUtils.h> #include <XmlParserUtils.h>
#include "Epub/BookMetadataCache.h" #include "../BookMetadataCache.h"
bool TocNavParser::setup() { bool TocNavParser::setup() {
parser = XML_ParserCreate(nullptr); parser = XML_ParserCreate(nullptr);
+1 -1
View File
@@ -4,7 +4,7 @@
#include <Logging.h> #include <Logging.h>
#include <XmlParserUtils.h> #include <XmlParserUtils.h>
#include "Epub/BookMetadataCache.h" #include "../BookMetadataCache.h"
bool TocNcxParser::setup() { bool TocNcxParser::setup() {
parser = XML_ParserCreate(nullptr); parser = XML_ParserCreate(nullptr);
-83
View File
@@ -1094,89 +1094,6 @@ int GfxRenderer::getScreenHeight() const {
return panelWidth; return panelWidth;
} }
// Translate a logical rect through rotateCoordinates and take the bounding
// box of its four corners on the physical panel. Output coords are inclusive
// and clamped. Returns false if the rect ends up fully off-panel.
static bool logicalRectToPhysicalBounds(GfxRenderer::Orientation orientation, int lx, int ly, int lw, int lh,
uint16_t panelWidth, uint16_t panelHeight, int* outX0, int* outY0, int* outX1,
int* outY1) {
if (lw <= 0 || lh <= 0) return false;
int minX = INT32_MAX;
int minY = INT32_MAX;
int maxX = INT32_MIN;
int maxY = INT32_MIN;
const int corners[4][2] = {{lx, ly}, {lx + lw - 1, ly}, {lx, ly + lh - 1}, {lx + lw - 1, ly + lh - 1}};
for (auto& c : corners) {
int phyX;
int phyY;
rotateCoordinates(orientation, c[0], c[1], &phyX, &phyY, panelWidth, panelHeight);
if (phyX < minX) minX = phyX;
if (phyY < minY) minY = phyY;
if (phyX > maxX) maxX = phyX;
if (phyY > maxY) maxY = phyY;
}
if (minX < 0) minX = 0;
if (minY < 0) minY = 0;
if (maxX >= panelWidth) maxX = panelWidth - 1;
if (maxY >= panelHeight) maxY = panelHeight - 1;
if (minX > maxX || minY > maxY) return false;
*outX0 = minX;
*outY0 = minY;
*outX1 = maxX;
*outY1 = maxY;
return true;
}
size_t GfxRenderer::getRegionByteSize(int lx, int ly, int lw, int lh) const {
int x0, y0, x1, y1;
if (!logicalRectToPhysicalBounds(orientation, lx, ly, lw, lh, panelWidth, panelHeight, &x0, &y0, &x1, &y1)) {
return 0;
}
// x bounds are in pixels; widen to byte boundaries on either side so per-row
// memcpy stays byte-aligned even when the logical rect doesn't.
const int byteX0 = x0 / 8;
const int byteX1 = x1 / 8;
const int bytesPerRow = byteX1 - byteX0 + 1;
const int rowCount = y1 - y0 + 1;
return static_cast<size_t>(bytesPerRow) * static_cast<size_t>(rowCount);
}
bool GfxRenderer::copyRegionToBuffer(int lx, int ly, int lw, int lh, uint8_t* buf, size_t bufSize) const {
int x0, y0, x1, y1;
if (!logicalRectToPhysicalBounds(orientation, lx, ly, lw, lh, panelWidth, panelHeight, &x0, &y0, &x1, &y1)) {
return false;
}
const int byteX0 = x0 / 8;
const int byteX1 = x1 / 8;
const int bytesPerRow = byteX1 - byteX0 + 1;
const int rowCount = y1 - y0 + 1;
const size_t needed = static_cast<size_t>(bytesPerRow) * static_cast<size_t>(rowCount);
if (bufSize < needed || !frameBuffer || !buf) return false;
for (int row = 0; row < rowCount; row++) {
const uint8_t* src = frameBuffer + (y0 + row) * panelWidthBytes + byteX0;
memcpy(buf + row * bytesPerRow, src, bytesPerRow);
}
return true;
}
bool GfxRenderer::copyBufferToRegion(int lx, int ly, int lw, int lh, const uint8_t* buf, size_t bufSize) const {
int x0, y0, x1, y1;
if (!logicalRectToPhysicalBounds(orientation, lx, ly, lw, lh, panelWidth, panelHeight, &x0, &y0, &x1, &y1)) {
return false;
}
const int byteX0 = x0 / 8;
const int byteX1 = x1 / 8;
const int bytesPerRow = byteX1 - byteX0 + 1;
const int rowCount = y1 - y0 + 1;
const size_t needed = static_cast<size_t>(bytesPerRow) * static_cast<size_t>(rowCount);
if (bufSize < needed || !frameBuffer || !buf) return false;
for (int row = 0; row < rowCount; row++) {
uint8_t* dst = frameBuffer + (y0 + row) * panelWidthBytes + byteX0;
memcpy(dst, buf + row * bytesPerRow, bytesPerRow);
}
return true;
}
int GfxRenderer::getSpaceWidth(const int fontId, const EpdFontFamily::Style style) const { int GfxRenderer::getSpaceWidth(const int fontId, const EpdFontFamily::Style style) const {
// Advance table fast-path for SD card fonts during layout // Advance table fast-path for SD card fonts during layout
auto sdIt = sdCardFonts_.find(fontId); auto sdIt = sdCardFonts_.find(fontId);
-12
View File
@@ -185,16 +185,4 @@ class GfxRenderer {
uint16_t getDisplayWidth() const { return panelWidth; } uint16_t getDisplayWidth() const { return panelWidth; }
uint16_t getDisplayHeight() const { return panelHeight; } uint16_t getDisplayHeight() const { return panelHeight; }
uint16_t getDisplayWidthBytes() const { return panelWidthBytes; } uint16_t getDisplayWidthBytes() const { return panelWidthBytes; }
// Region cache: take a logical (orientation-aware) rect, hit the framebuffer
// bytes that the rect can have touched, and pump them in or out of a caller-
// supplied buffer. Used by HomeActivity to snapshot just the cover tile
// (~16 KB in Portrait) instead of cloning the entire 48 KB framebuffer.
//
// getRegionByteSize: required buffer length for the rect at current orientation.
// copyRegionToBuffer / copyBufferToRegion: false if `bufSize` is smaller than that.
size_t getRegionByteSize(int logicalX, int logicalY, int logicalW, int logicalH) const;
bool copyRegionToBuffer(int logicalX, int logicalY, int logicalW, int logicalH, uint8_t* buf, size_t bufSize) const;
bool copyBufferToRegion(int logicalX, int logicalY, int logicalW, int logicalH, const uint8_t* buf,
size_t bufSize) const;
}; };
-8
View File
@@ -69,7 +69,6 @@ STR_TEXT_AA: "Згладжванне тэксту"
STR_SHORT_PWR_BTN: "Кароткае націсканне PWR" STR_SHORT_PWR_BTN: "Кароткае націсканне PWR"
STR_ORIENTATION: "Арыентацыя чытання" STR_ORIENTATION: "Арыентацыя чытання"
STR_SIDE_BTN_LAYOUT: "Бакавыя кнопкі" STR_SIDE_BTN_LAYOUT: "Бакавыя кнопкі"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Арыентаваць пярэднія кнопкі"
STR_LONG_PRESS_SKIP: "Доўгае націсканне - змена раздзела" STR_LONG_PRESS_SKIP: "Доўгае націсканне - змена раздзела"
STR_FONT_FAMILY: "Шрыфт чытання" STR_FONT_FAMILY: "Шрыфт чытання"
STR_FONT_SIZE: "Памер шрыфту інтэрфейсу" STR_FONT_SIZE: "Памер шрыфту інтэрфейсу"
@@ -144,7 +143,6 @@ STR_ALIGN_LEFT: "Па левым краі"
STR_CENTER: "Па цэнтры" STR_CENTER: "Па цэнтры"
STR_ALIGN_RIGHT: "Па правым краі" STR_ALIGN_RIGHT: "Па правым краі"
STR_MIN_1: "1 хв" STR_MIN_1: "1 хв"
STR_MIN_3: "3 хв"
STR_MIN_5: "5 хв" STR_MIN_5: "5 хв"
STR_MIN_10: "10 хв" STR_MIN_10: "10 хв"
STR_MIN_15: "15 хв" STR_MIN_15: "15 хв"
@@ -206,14 +204,10 @@ STR_THEME_CLASSIC: "Класічная"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Кампенсацыя выцвітання" STR_SUNLIGHT_FADING_FIX: "Кампенсацыя выцвітання"
STR_QUICK_RESUME_TIMEOUT: "Хуткае узнаўленне пасля таймаўту"
STR_AFTER_TIMEOUT: "Пасля таймаўту"
STR_REMAP_FRONT_BUTTONS: "Пераназначыць пярэднія кнопкі" STR_REMAP_FRONT_BUTTONS: "Пераназначыць пярэднія кнопкі"
STR_OPDS_BROWSER: "OPDS браўзер" STR_OPDS_BROWSER: "OPDS браўзер"
STR_COVER_CUSTOM: "Вокладка + Свой" STR_COVER_CUSTOM: "Вокладка + Свой"
STR_QUICK_RESUME: "Хуткае узнаўленне"
STR_MENU_RECENT_BOOKS: "Нядаўнія кнігі" STR_MENU_RECENT_BOOKS: "Нядаўнія кнігі"
STR_REMOVE_FROM_RECENTS: "Выдаліць з нядаўніх кніг?"
STR_NO_RECENT_BOOKS: "Няма нядаўніх кніг" STR_NO_RECENT_BOOKS: "Няма нядаўніх кніг"
STR_CALIBRE_DESC: "Выкарыстоўваць бесправадную перадачу Calibre" STR_CALIBRE_DESC: "Выкарыстоўваць бесправадную перадачу Calibre"
STR_FORGET_AND_REMOVE: "Забыць сетку і выдаліць захаваны пароль?" STR_FORGET_AND_REMOVE: "Забыць сетку і выдаліць захаваны пароль?"
@@ -273,8 +267,6 @@ STR_IMAGES_DISPLAY: "Паказваць"
STR_IMAGES_PLACEHOLDER: "Запаўняльнік" STR_IMAGES_PLACEHOLDER: "Запаўняльнік"
STR_IMAGES_SUPPRESS: "Хаваць" STR_IMAGES_SUPPRESS: "Хаваць"
STR_SHOW_HIDDEN_FILES: "Паказваць схаваныя файлы" STR_SHOW_HIDDEN_FILES: "Паказваць схаваныя файлы"
STR_REMOVE_READ_FROM_RECENTS: "Ачышчаць прачытаныя кнігі са спісу нядаўніх"
STR_MOVE_FINISHED_TO_READ: "Перамяшчаць прачытаныя кнігі ў тэчку Read"
STR_SELECTED: "Выбрана" STR_SELECTED: "Выбрана"
STR_SHOW: "Паказаць" STR_SHOW: "Паказаць"
STR_HIDE: "Схаваць" STR_HIDE: "Схаваць"
-8
View File
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Suprimir"
STR_SHORT_PWR_BTN: "Clic curt del botó d'engegada" STR_SHORT_PWR_BTN: "Clic curt del botó d'engegada"
STR_ORIENTATION: "Orientació de lectura" STR_ORIENTATION: "Orientació de lectura"
STR_SIDE_BTN_LAYOUT: "Disposició botons laterals" STR_SIDE_BTN_LAYOUT: "Disposició botons laterals"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientar botons frontals"
STR_LONG_PRESS_BEHAVIOR: "Comportament de prémer llargament el botó" STR_LONG_PRESS_BEHAVIOR: "Comportament de prémer llargament el botó"
STR_LONG_PRESS_BEHAVIOR_OFF: "Desactivat" STR_LONG_PRESS_BEHAVIOR_OFF: "Desactivat"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítols" STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítols"
@@ -86,8 +85,6 @@ STR_PARA_ALIGNMENT: "Alineació de paràgrafs del lector"
STR_HYPHENATION: "Partició de mots" STR_HYPHENATION: "Partició de mots"
STR_TIME_TO_SLEEP: "Temps per entrar en repòs" STR_TIME_TO_SLEEP: "Temps per entrar en repòs"
STR_SHOW_HIDDEN_FILES: "Mostra fitxers ocults" STR_SHOW_HIDDEN_FILES: "Mostra fitxers ocults"
STR_REMOVE_READ_FROM_RECENTS: "Esborra els llibres llegits de la llista de recents"
STR_MOVE_FINISHED_TO_READ: "Mou els llibres acabats a la carpeta Read"
STR_REFRESH_FREQ: "Freqüència de refresc" STR_REFRESH_FREQ: "Freqüència de refresc"
STR_KOREADER_SYNC: "Sincronització del KOReader" STR_KOREADER_SYNC: "Sincronització del KOReader"
STR_CHECK_UPDATES: "Comprova si hi ha actualitzacions" STR_CHECK_UPDATES: "Comprova si hi ha actualitzacions"
@@ -154,7 +151,6 @@ STR_ALIGN_LEFT: "Esquerra"
STR_CENTER: "Centre" STR_CENTER: "Centre"
STR_ALIGN_RIGHT: "Dreta" STR_ALIGN_RIGHT: "Dreta"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -234,14 +230,10 @@ STR_THEME_CLASSIC: "Clàssic"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra Ampliat" STR_THEME_LYRA_EXTENDED: "Lyra Ampliat"
STR_SUNLIGHT_FADING_FIX: "Correcció de l'esvaïment pel sol" STR_SUNLIGHT_FADING_FIX: "Correcció de l'esvaïment pel sol"
STR_QUICK_RESUME_TIMEOUT: "Represa ràpida després del temps"
STR_AFTER_TIMEOUT: "Després del temps"
STR_REMAP_FRONT_BUTTONS: "Reassigna els botons frontals" STR_REMAP_FRONT_BUTTONS: "Reassigna els botons frontals"
STR_OPDS_BROWSER: "Navegador OPDS" STR_OPDS_BROWSER: "Navegador OPDS"
STR_COVER_CUSTOM: "Portada + Personalitzat" STR_COVER_CUSTOM: "Portada + Personalitzat"
STR_QUICK_RESUME: "Represa ràpida"
STR_MENU_RECENT_BOOKS: "Llibres recents" STR_MENU_RECENT_BOOKS: "Llibres recents"
STR_REMOVE_FROM_RECENTS: "Voleu suprimir-lo de Llibres recents?"
STR_NO_RECENT_BOOKS: "No hi ha llibres recents" STR_NO_RECENT_BOOKS: "No hi ha llibres recents"
STR_CALIBRE_DESC: "Usa les transferències sense fils de Calibre" STR_CALIBRE_DESC: "Usa les transferències sense fils de Calibre"
STR_FORGET_AND_REMOVE: "Voleu suprimir la contrasenya desada?" STR_FORGET_AND_REMOVE: "Voleu suprimir la contrasenya desada?"
+8 -16
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Prázdný soubor"
STR_OUT_OF_BOUNDS: "Mimo hranice" STR_OUT_OF_BOUNDS: "Mimo hranice"
STR_LOADING: "Načítání..." STR_LOADING: "Načítání..."
STR_LOADING_POPUP: "Načítání" STR_LOADING_POPUP: "Načítání"
STR_WIFI_NETWORKS: "Wi-Fi sítě" STR_WIFI_NETWORKS: "WiFi sítě"
STR_NO_NETWORKS: "Žádné sítě nenalezeny" STR_NO_NETWORKS: "Žádné sítě nenalezeny"
STR_NETWORKS_FOUND: "Nalezeno %zu sítí" STR_NETWORKS_FOUND: "Nalezeno %zu sítí"
STR_SCANNING: "Skenování..." STR_SCANNING: "Skenování..."
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Uložit heslo pro příště?"
STR_PRESS_OK_SCAN: "Stiskněte OK pro přeskenování" STR_PRESS_OK_SCAN: "Stiskněte OK pro přeskenování"
STR_JOIN_NETWORK: "Připojit se k síti" STR_JOIN_NETWORK: "Připojit se k síti"
STR_CREATE_HOTSPOT: "Vytvořit hotspot" STR_CREATE_HOTSPOT: "Vytvořit hotspot"
STR_JOIN_DESC: "Připojit se k existující síti Wi-Fi" STR_JOIN_DESC: "Připojit se k existující síti WiFi"
STR_HOTSPOT_DESC: "Vytvořit síť Wi-Fi, ke které se mohou připojit ostatní" STR_HOTSPOT_DESC: "Vytvořit síť WiFi, ke které se mohou připojit ostatní"
STR_STARTING_HOTSPOT: "Spouštění hotspotu..." STR_STARTING_HOTSPOT: "Spouštění hotspotu..."
STR_HOTSPOT_MODE: "Režim hotspotu" STR_HOTSPOT_MODE: "Režim hotspotu"
STR_CONNECT_WIFI_HINT: "Připojte své zařízení k této síti Wi-Fi" STR_CONNECT_WIFI_HINT: "Připojte své zařízení k této síti WiFi"
STR_OPEN_URL_HINT: "Otevřete tuto URL ve svém prohlížeči" STR_OPEN_URL_HINT: "Otevřete tuto URL ve svém prohlížeči"
STR_OR_HTTP_PREFIX: "nebo http://" STR_OR_HTTP_PREFIX: "nebo http://"
STR_SCAN_QR_HINT: "nebo naskenujte QR kód telefonem:" STR_SCAN_QR_HINT: "nebo naskenujte QR kód telefonem:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Calibre Wireless"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Šifrováno | + = Uloženo" STR_NETWORK_LEGEND: "* = Šifrováno | + = Uloženo"
STR_MAC_ADDRESS: "MAC adresa:" STR_MAC_ADDRESS: "MAC adresa:"
STR_CHECKING_WIFI: "Kontrola Wi-Fi..." STR_CHECKING_WIFI: "Kontrola WiFi..."
STR_ENTER_WIFI_PASSWORD: "Zadejte heslo Wi-Fi" STR_ENTER_WIFI_PASSWORD: "Zadejte heslo WiFi"
STR_TO_PREFIX: "pro" STR_TO_PREFIX: "pro"
STR_CALIBRE_RECEIVING: "Příjem:" STR_CALIBRE_RECEIVING: "Příjem:"
STR_CALIBRE_RECEIVED: "Přijato:" STR_CALIBRE_RECEIVED: "Přijato:"
STR_CALIBRE_INSTRUCTION_1: "1) Nainstalujte plugin CrossPoint Reader" STR_CALIBRE_INSTRUCTION_1: "1) Nainstalujte plugin CrossPoint Reader"
STR_CALIBRE_INSTRUCTION_2: "2) Buďte ve stejné síti Wi-Fi" STR_CALIBRE_INSTRUCTION_2: "2) Buďte ve stejné síti WiFi"
STR_CALIBRE_INSTRUCTION_3: "3) V Calibre: „Odeslat do zařízení“" STR_CALIBRE_INSTRUCTION_3: "3) V Calibre: „Odeslat do zařízení“"
STR_CALIBRE_INSTRUCTION_4: "„Při odesílání ponechat tuto obrazovku otevřenou“" STR_CALIBRE_INSTRUCTION_4: "„Při odesílání ponechat tuto obrazovku otevřenou“"
STR_CAT_DISPLAY: "Displej" STR_CAT_DISPLAY: "Displej"
@@ -69,7 +69,6 @@ STR_TEXT_AA: "Vyhlazování textu"
STR_SHORT_PWR_BTN: "Krátké stisknutí tlačítka napájení" STR_SHORT_PWR_BTN: "Krátké stisknutí tlačítka napájení"
STR_ORIENTATION: "Orientace čtení" STR_ORIENTATION: "Orientace čtení"
STR_SIDE_BTN_LAYOUT: "Rozvržení bočních tlačítek (čtečka)" STR_SIDE_BTN_LAYOUT: "Rozvržení bočních tlačítek (čtečka)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientovat přední tlačítka"
STR_LONG_PRESS_BEHAVIOR: "Chování při dlouhém stisknutí tlačítka" STR_LONG_PRESS_BEHAVIOR: "Chování při dlouhém stisknutí tlačítka"
STR_LONG_PRESS_BEHAVIOR_OFF: "VYP" STR_LONG_PRESS_BEHAVIOR_OFF: "VYP"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Přeskočení kapitoly" STR_LONG_PRESS_BEHAVIOR_SKIP: "Přeskočení kapitoly"
@@ -81,8 +80,6 @@ STR_SCREEN_MARGIN: "Okraj obrazovky čtečky"
STR_PARA_ALIGNMENT: "Zarovnání odstavců čtečky" STR_PARA_ALIGNMENT: "Zarovnání odstavců čtečky"
STR_HYPHENATION: "Dělení slov" STR_HYPHENATION: "Dělení slov"
STR_TIME_TO_SLEEP: "Čas do uspání" STR_TIME_TO_SLEEP: "Čas do uspání"
STR_REMOVE_READ_FROM_RECENTS: "Vymazat přečtené knihy ze seznamu nedávných"
STR_MOVE_FINISHED_TO_READ: "Přesunout přečtené knihy do složky Read"
STR_REFRESH_FREQ: "Frekvence obnovení" STR_REFRESH_FREQ: "Frekvence obnovení"
STR_KOREADER_SYNC: "KOReaderu Sync" STR_KOREADER_SYNC: "KOReaderu Sync"
STR_CHECK_UPDATES: "Zkontrolovat aktualizace" STR_CHECK_UPDATES: "Zkontrolovat aktualizace"
@@ -98,7 +95,7 @@ STR_KOREADER_PASSWORD: "Heslo KOReaderu"
STR_FILENAME: "Název souboru" STR_FILENAME: "Název souboru"
STR_BINARY: "Binární" STR_BINARY: "Binární"
STR_SET_CREDENTIALS_FIRST: "Nastavte přihlašovací údaje" STR_SET_CREDENTIALS_FIRST: "Nastavte přihlašovací údaje"
STR_WIFI_CONN_FAILED: "Připojení k Wi-Fi selhalo" STR_WIFI_CONN_FAILED: "Připojení k WiFi selhalo"
STR_AUTHENTICATING: "Ověřování..." STR_AUTHENTICATING: "Ověřování..."
STR_AUTH_SUCCESS: "Úspěšné ověření!" STR_AUTH_SUCCESS: "Úspěšné ověření!"
STR_KOREADER_AUTH: "Ověření KOReaderu" STR_KOREADER_AUTH: "Ověření KOReaderu"
@@ -149,7 +146,6 @@ STR_ALIGN_LEFT: "Vlevo"
STR_CENTER: "Na střed" STR_CENTER: "Na střed"
STR_ALIGN_RIGHT: "Vpravo" STR_ALIGN_RIGHT: "Vpravo"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -212,14 +208,10 @@ STR_THEME_LYRA: "Lyra"
STR_THEME_ROUNDEDRAFF: "RoundedRaff" STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Oprava blednutí na slunci" STR_SUNLIGHT_FADING_FIX: "Oprava blednutí na slunci"
STR_QUICK_RESUME_TIMEOUT: "Rychlé navázání po vypršení"
STR_AFTER_TIMEOUT: "Po vypršení"
STR_REMAP_FRONT_BUTTONS: "Přemapovat přední tlačítka" STR_REMAP_FRONT_BUTTONS: "Přemapovat přední tlačítka"
STR_OPDS_BROWSER: "Prohlížeč OPDS" STR_OPDS_BROWSER: "Prohlížeč OPDS"
STR_COVER_CUSTOM: "Obálka + Vlastní" STR_COVER_CUSTOM: "Obálka + Vlastní"
STR_QUICK_RESUME: "Rychlé navázání"
STR_MENU_RECENT_BOOKS: "Nedávné knihy" STR_MENU_RECENT_BOOKS: "Nedávné knihy"
STR_REMOVE_FROM_RECENTS: "Odebrat z nedávných knih?"
STR_NO_RECENT_BOOKS: "Žádné nedávné knihy" STR_NO_RECENT_BOOKS: "Žádné nedávné knihy"
STR_CALIBRE_DESC: "Používat přenosy bezdrátových zařízení Calibre" STR_CALIBRE_DESC: "Používat přenosy bezdrátových zařízení Calibre"
STR_FORGET_AND_REMOVE: "Zapomenout síť a odstranit uložené heslo?" STR_FORGET_AND_REMOVE: "Zapomenout síť a odstranit uložené heslo?"
+7 -15
View File
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Gem adgangskode til næste gang?"
STR_PRESS_OK_SCAN: "Tryk OK for at scanne igen" STR_PRESS_OK_SCAN: "Tryk OK for at scanne igen"
STR_JOIN_NETWORK: "Tilslut netværk" STR_JOIN_NETWORK: "Tilslut netværk"
STR_CREATE_HOTSPOT: "Opret Hotspot" STR_CREATE_HOTSPOT: "Opret Hotspot"
STR_JOIN_DESC: "Opret forbindelse til et eksisterende Wi-Fi-netværk" STR_JOIN_DESC: "Opret forbindelse til et eksisterende WiFi-netværk"
STR_HOTSPOT_DESC: "Opret et Wi-Fi-netværk andre kan tilslutte sig" STR_HOTSPOT_DESC: "Opret et WiFi-netværk andre kan tilslutte sig"
STR_STARTING_HOTSPOT: "Starter Hotspot..." STR_STARTING_HOTSPOT: "Starter Hotspot..."
STR_HOTSPOT_MODE: "Hotspot-tilstand" STR_HOTSPOT_MODE: "Hotspot-tilstand"
STR_CONNECT_WIFI_HINT: "Opret forbindelse fra din enhed til dette Wi-Fi-netværk" STR_CONNECT_WIFI_HINT: "Opret forbindelse fra din enhed til dette WiFi-netværk"
STR_OPEN_URL_HINT: "Åbn denne URL i din browser" STR_OPEN_URL_HINT: "Åbn denne URL i din browser"
STR_OR_HTTP_PREFIX: "eller http://" STR_OR_HTTP_PREFIX: "eller http://"
STR_SCAN_QR_HINT: "eller scan QR-kode med din telefon:" STR_SCAN_QR_HINT: "eller scan QR-kode med din telefon:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Calibre Wireless"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Krypteret | + = Gemt" STR_NETWORK_LEGEND: "* = Krypteret | + = Gemt"
STR_MAC_ADDRESS: "MAC-adresse:" STR_MAC_ADDRESS: "MAC-adresse:"
STR_CHECKING_WIFI: "Tjekker Wi-Fi..." STR_CHECKING_WIFI: "Tjekker WiFi..."
STR_ENTER_WIFI_PASSWORD: "Indtast Wi-Fi-adgangskode" STR_ENTER_WIFI_PASSWORD: "Indtast WiFi-adgangskode"
STR_TO_PREFIX: "til " STR_TO_PREFIX: "til "
STR_CALIBRE_RECEIVING: "Modtager: " STR_CALIBRE_RECEIVING: "Modtager: "
STR_CALIBRE_RECEIVED: "Modtaget: " STR_CALIBRE_RECEIVED: "Modtaget: "
STR_CALIBRE_INSTRUCTION_1: "1) Installer CrossPoint Reader-plugin" STR_CALIBRE_INSTRUCTION_1: "1) Installer CrossPoint Reader-plugin"
STR_CALIBRE_INSTRUCTION_2: "2) Vær på det samme Wi-Fi-netværk" STR_CALIBRE_INSTRUCTION_2: "2) Vær på det samme WiFi-netværk"
STR_CALIBRE_INSTRUCTION_3: "3) I Calibre: \"Send til enhed\"" STR_CALIBRE_INSTRUCTION_3: "3) I Calibre: \"Send til enhed\""
STR_CALIBRE_INSTRUCTION_4: "\"Hold denne skærm åben under afsendelse\"" STR_CALIBRE_INSTRUCTION_4: "\"Hold denne skærm åben under afsendelse\""
STR_CAT_DISPLAY: "Skærm" STR_CAT_DISPLAY: "Skærm"
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Skjul"
STR_SHORT_PWR_BTN: "Kort tryk på tænd/sluk-knap" STR_SHORT_PWR_BTN: "Kort tryk på tænd/sluk-knap"
STR_ORIENTATION: "Læseretning" STR_ORIENTATION: "Læseretning"
STR_SIDE_BTN_LAYOUT: "Knaplayout på siden (læser)" STR_SIDE_BTN_LAYOUT: "Knaplayout på siden (læser)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientér forreste knapper"
STR_LONG_PRESS_BEHAVIOR: "Comportamiento al mantener pulsado el botón" STR_LONG_PRESS_BEHAVIOR: "Comportamiento al mantener pulsado el botón"
STR_LONG_PRESS_BEHAVIOR_OFF: "Desactivado" STR_LONG_PRESS_BEHAVIOR_OFF: "Desactivado"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítulo" STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítulo"
@@ -86,8 +85,6 @@ STR_PARA_ALIGNMENT: "Afsnitsjustering"
STR_HYPHENATION: "Orddeling" STR_HYPHENATION: "Orddeling"
STR_TIME_TO_SLEEP: "Tid til hvile" STR_TIME_TO_SLEEP: "Tid til hvile"
STR_SHOW_HIDDEN_FILES: "Vis skjulte filer" STR_SHOW_HIDDEN_FILES: "Vis skjulte filer"
STR_REMOVE_READ_FROM_RECENTS: "Ryd læste bøger fra listen Seneste"
STR_MOVE_FINISHED_TO_READ: "Flyt læste bøger til Read-mappen"
STR_REFRESH_FREQ: "Opdateringsfrekvens" STR_REFRESH_FREQ: "Opdateringsfrekvens"
STR_KOREADER_SYNC: "KOReader Sync" STR_KOREADER_SYNC: "KOReader Sync"
STR_CHECK_UPDATES: "Søg efter opdateringer" STR_CHECK_UPDATES: "Søg efter opdateringer"
@@ -103,7 +100,7 @@ STR_KOREADER_PASSWORD: "KOReader adgangskode"
STR_FILENAME: "Filnavn" STR_FILENAME: "Filnavn"
STR_BINARY: "Binær" STR_BINARY: "Binær"
STR_SET_CREDENTIALS_FIRST: "Angiv legitimationsoplysninger først" STR_SET_CREDENTIALS_FIRST: "Angiv legitimationsoplysninger først"
STR_WIFI_CONN_FAILED: "Wi-Fi-forbindelsen mislykkedes" STR_WIFI_CONN_FAILED: "WiFi-forbindelsen mislykkedes"
STR_AUTHENTICATING: "Godkender..." STR_AUTHENTICATING: "Godkender..."
STR_AUTH_SUCCESS: "Godkendt!" STR_AUTH_SUCCESS: "Godkendt!"
STR_KOREADER_AUTH: "KOReader-godkendelse" STR_KOREADER_AUTH: "KOReader-godkendelse"
@@ -154,7 +151,6 @@ STR_ALIGN_LEFT: "Venstre"
STR_CENTER: "Centreret" STR_CENTER: "Centreret"
STR_ALIGN_RIGHT: "Højre" STR_ALIGN_RIGHT: "Højre"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -234,14 +230,10 @@ STR_THEME_CLASSIC: "Klassisk"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Sollysfading-rettelse" STR_SUNLIGHT_FADING_FIX: "Sollysfading-rettelse"
STR_QUICK_RESUME_TIMEOUT: "Hurtig genoptagelse ved timeout"
STR_AFTER_TIMEOUT: "Efter timeout"
STR_REMAP_FRONT_BUTTONS: "Omtildel frontknapper" STR_REMAP_FRONT_BUTTONS: "Omtildel frontknapper"
STR_OPDS_BROWSER: "OPDS Browser" STR_OPDS_BROWSER: "OPDS Browser"
STR_COVER_CUSTOM: "Omslag + Brugerdefineret" STR_COVER_CUSTOM: "Omslag + Brugerdefineret"
STR_QUICK_RESUME: "Hurtig genoptagelse"
STR_MENU_RECENT_BOOKS: "Seneste bøger" STR_MENU_RECENT_BOOKS: "Seneste bøger"
STR_REMOVE_FROM_RECENTS: "Fjern fra Seneste bøger?"
STR_NO_RECENT_BOOKS: "Ingen seneste bøger" STR_NO_RECENT_BOOKS: "Ingen seneste bøger"
STR_CALIBRE_DESC: "Brug Calibre trådløs enhedsoverførelse" STR_CALIBRE_DESC: "Brug Calibre trådløs enhedsoverførelse"
STR_FORGET_AND_REMOVE: "Glem netværk og fjern gemt adgangskode?" STR_FORGET_AND_REMOVE: "Glem netværk og fjern gemt adgangskode?"
+8 -16
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Leeg bestand"
STR_OUT_OF_BOUNDS: "Buiten bereik" STR_OUT_OF_BOUNDS: "Buiten bereik"
STR_LOADING: "Laden..." STR_LOADING: "Laden..."
STR_LOADING_POPUP: "Laden" STR_LOADING_POPUP: "Laden"
STR_WIFI_NETWORKS: "Wi-Fi-netwerken" STR_WIFI_NETWORKS: "Wifi-netwerken"
STR_NO_NETWORKS: "Geen netwerken gevonden" STR_NO_NETWORKS: "Geen netwerken gevonden"
STR_NETWORKS_FOUND: "%zu netwerken gevonden" STR_NETWORKS_FOUND: "%zu netwerken gevonden"
STR_SCANNING: "Scannen..." STR_SCANNING: "Scannen..."
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Wachtwoord opslaan voor volgende keer?"
STR_PRESS_OK_SCAN: "Druk op OK om opnieuw te scannen" STR_PRESS_OK_SCAN: "Druk op OK om opnieuw te scannen"
STR_JOIN_NETWORK: "Verbind met netwerk" STR_JOIN_NETWORK: "Verbind met netwerk"
STR_CREATE_HOTSPOT: "Hotspot maken" STR_CREATE_HOTSPOT: "Hotspot maken"
STR_JOIN_DESC: "Verbind met een bestaand Wi-Fi-netwerk" STR_JOIN_DESC: "Verbind met een bestaand wifi-netwerk"
STR_HOTSPOT_DESC: "Maak een Wi-Fi-netwerk waar anderen mee kunnen verbinden" STR_HOTSPOT_DESC: "Maak een wifi-netwerk waar anderen mee kunnen verbinden"
STR_STARTING_HOTSPOT: "Hotspot starten..." STR_STARTING_HOTSPOT: "Hotspot starten..."
STR_HOTSPOT_MODE: "Hotspot-modus" STR_HOTSPOT_MODE: "Hotspot-modus"
STR_CONNECT_WIFI_HINT: "Verbind je apparaat met dit Wi-Fi-netwerk" STR_CONNECT_WIFI_HINT: "Verbind je apparaat met dit wifi-netwerk"
STR_OPEN_URL_HINT: "Open deze URL in je browser" STR_OPEN_URL_HINT: "Open deze URL in je browser"
STR_OR_HTTP_PREFIX: "of http://" STR_OR_HTTP_PREFIX: "of http://"
STR_SCAN_QR_HINT: "of scan de QR-code met je telefoon:" STR_SCAN_QR_HINT: "of scan de QR-code met je telefoon:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Calibre Wireless"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Beveiligd | + = Opgeslagen" STR_NETWORK_LEGEND: "* = Beveiligd | + = Opgeslagen"
STR_MAC_ADDRESS: "MAC-adres:" STR_MAC_ADDRESS: "MAC-adres:"
STR_CHECKING_WIFI: "Wi-Fi controleren..." STR_CHECKING_WIFI: "Wifi controleren..."
STR_ENTER_WIFI_PASSWORD: "Voer Wi-Fi-wachtwoord in" STR_ENTER_WIFI_PASSWORD: "Voer wifi-wachtwoord in"
STR_TO_PREFIX: "met " STR_TO_PREFIX: "met "
STR_CALIBRE_RECEIVING: "Bezig met ontvangen: " STR_CALIBRE_RECEIVING: "Bezig met ontvangen: "
STR_CALIBRE_RECEIVED: "Ontvangen: " STR_CALIBRE_RECEIVED: "Ontvangen: "
STR_CALIBRE_INSTRUCTION_1: "1) Installeer CrossPoint Reader plugin" STR_CALIBRE_INSTRUCTION_1: "1) Installeer CrossPoint Reader plugin"
STR_CALIBRE_INSTRUCTION_2: "2) Gebruik hetzelfde Wi-Fi-netwerk" STR_CALIBRE_INSTRUCTION_2: "2) Gebruik hetzelfde wifi-netwerk"
STR_CALIBRE_INSTRUCTION_3: "3) In Calibre: \"Send to device\"" STR_CALIBRE_INSTRUCTION_3: "3) In Calibre: \"Send to device\""
STR_CALIBRE_INSTRUCTION_4: "\"Houd dit scherm open tijdens verzenden\"" STR_CALIBRE_INSTRUCTION_4: "\"Houd dit scherm open tijdens verzenden\""
STR_CAT_DISPLAY: "Scherm" STR_CAT_DISPLAY: "Scherm"
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Verbergen"
STR_SHORT_PWR_BTN: "Korte klik aan/uit-knop" STR_SHORT_PWR_BTN: "Korte klik aan/uit-knop"
STR_ORIENTATION: "Leesstand" STR_ORIENTATION: "Leesstand"
STR_SIDE_BTN_LAYOUT: "Indeling zijknoppen (lezer)" STR_SIDE_BTN_LAYOUT: "Indeling zijknoppen (lezer)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Richt voorste knoppen"
STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior" STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior"
STR_LONG_PRESS_BEHAVIOR_OFF: "OFF" STR_LONG_PRESS_BEHAVIOR_OFF: "OFF"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip" STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip"
@@ -86,8 +85,6 @@ STR_PARA_ALIGNMENT: "Uitlijning alinea lezer"
STR_HYPHENATION: "Woordafbreking" STR_HYPHENATION: "Woordafbreking"
STR_TIME_TO_SLEEP: "Tijd tot slaapstand" STR_TIME_TO_SLEEP: "Tijd tot slaapstand"
STR_SHOW_HIDDEN_FILES: "Toon verborgen bestanden" STR_SHOW_HIDDEN_FILES: "Toon verborgen bestanden"
STR_REMOVE_READ_FROM_RECENTS: "Gelezen boeken wissen uit de lijst Recent"
STR_MOVE_FINISHED_TO_READ: "Voltooide boeken naar de Read-map verplaatsen"
STR_REFRESH_FREQ: "Verversingsfrequentie" STR_REFRESH_FREQ: "Verversingsfrequentie"
STR_KOREADER_SYNC: "KOReader Sync" STR_KOREADER_SYNC: "KOReader Sync"
STR_CHECK_UPDATES: "Controleren op updates" STR_CHECK_UPDATES: "Controleren op updates"
@@ -103,7 +100,7 @@ STR_KOREADER_PASSWORD: "KOReader wachtwoord"
STR_FILENAME: "Bestandsnaam" STR_FILENAME: "Bestandsnaam"
STR_BINARY: "Binair" STR_BINARY: "Binair"
STR_SET_CREDENTIALS_FIRST: "Stel eerst inloggegevens in" STR_SET_CREDENTIALS_FIRST: "Stel eerst inloggegevens in"
STR_WIFI_CONN_FAILED: "Wi-Fi-verbinding mislukt" STR_WIFI_CONN_FAILED: "Wifi-verbinding mislukt"
STR_AUTHENTICATING: "Authenticeren..." STR_AUTHENTICATING: "Authenticeren..."
STR_AUTH_SUCCESS: "Authenticatie geslaagd!" STR_AUTH_SUCCESS: "Authenticatie geslaagd!"
STR_KOREADER_AUTH: "KOReader-authenticatie" STR_KOREADER_AUTH: "KOReader-authenticatie"
@@ -154,7 +151,6 @@ STR_ALIGN_LEFT: "Links"
STR_CENTER: "Centreren" STR_CENTER: "Centreren"
STR_ALIGN_RIGHT: "Rechts" STR_ALIGN_RIGHT: "Rechts"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -234,14 +230,10 @@ STR_THEME_CLASSIC: "Klassiek"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra Uitgebreid" STR_THEME_LYRA_EXTENDED: "Lyra Uitgebreid"
STR_SUNLIGHT_FADING_FIX: "Zonlicht vervaging fix" STR_SUNLIGHT_FADING_FIX: "Zonlicht vervaging fix"
STR_QUICK_RESUME_TIMEOUT: "Snel hervatten bij timeout"
STR_AFTER_TIMEOUT: "Na timeout"
STR_REMAP_FRONT_BUTTONS: "Knoppen voorzijde wijzigen" STR_REMAP_FRONT_BUTTONS: "Knoppen voorzijde wijzigen"
STR_OPDS_BROWSER: "OPDS-browser" STR_OPDS_BROWSER: "OPDS-browser"
STR_COVER_CUSTOM: "Omslag + Aangepast" STR_COVER_CUSTOM: "Omslag + Aangepast"
STR_QUICK_RESUME: "Snel hervatten"
STR_MENU_RECENT_BOOKS: "Recente boeken" STR_MENU_RECENT_BOOKS: "Recente boeken"
STR_REMOVE_FROM_RECENTS: "Verwijderen uit Recente boeken?"
STR_NO_RECENT_BOOKS: "Geen recente boeken" STR_NO_RECENT_BOOKS: "Geen recente boeken"
STR_CALIBRE_DESC: "Gebruik Calibre draadloze overdracht" STR_CALIBRE_DESC: "Gebruik Calibre draadloze overdracht"
STR_FORGET_AND_REMOVE: "Netwerk vergeten en wachtwoord verwijderen?" STR_FORGET_AND_REMOVE: "Netwerk vergeten en wachtwoord verwijderen?"
+8 -31
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Empty file"
STR_OUT_OF_BOUNDS: "Out of bounds" STR_OUT_OF_BOUNDS: "Out of bounds"
STR_LOADING: "Loading..." STR_LOADING: "Loading..."
STR_LOADING_POPUP: "Loading" STR_LOADING_POPUP: "Loading"
STR_WIFI_NETWORKS: "Wi-Fi Networks" STR_WIFI_NETWORKS: "WiFi Networks"
STR_NO_NETWORKS: "No networks found" STR_NO_NETWORKS: "No networks found"
STR_NETWORKS_FOUND: "%zu networks found" STR_NETWORKS_FOUND: "%zu networks found"
STR_SCANNING: "Scanning..." STR_SCANNING: "Scanning..."
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Save password for next time?"
STR_PRESS_OK_SCAN: "Press OK to scan again" STR_PRESS_OK_SCAN: "Press OK to scan again"
STR_JOIN_NETWORK: "Join a Network" STR_JOIN_NETWORK: "Join a Network"
STR_CREATE_HOTSPOT: "Create Hotspot" STR_CREATE_HOTSPOT: "Create Hotspot"
STR_JOIN_DESC: "Connect to an existing Wi-Fi network" STR_JOIN_DESC: "Connect to an existing WiFi network"
STR_HOTSPOT_DESC: "Create a Wi-Fi network others can join" STR_HOTSPOT_DESC: "Create a WiFi network others can join"
STR_STARTING_HOTSPOT: "Starting Hotspot..." STR_STARTING_HOTSPOT: "Starting Hotspot..."
STR_HOTSPOT_MODE: "Hotspot Mode" STR_HOTSPOT_MODE: "Hotspot Mode"
STR_CONNECT_WIFI_HINT: "Connect your device to this Wi-Fi network" STR_CONNECT_WIFI_HINT: "Connect your device to this WiFi network"
STR_OPEN_URL_HINT: "Open this URL in your browser" STR_OPEN_URL_HINT: "Open this URL in your browser"
STR_OR_HTTP_PREFIX: "or http://" STR_OR_HTTP_PREFIX: "or http://"
STR_SCAN_QR_HINT: "or scan QR code with your phone:" STR_SCAN_QR_HINT: "or scan QR code with your phone:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Calibre Wireless"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Encrypted | + = Saved" STR_NETWORK_LEGEND: "* = Encrypted | + = Saved"
STR_MAC_ADDRESS: "MAC address:" STR_MAC_ADDRESS: "MAC address:"
STR_CHECKING_WIFI: "Checking Wi-Fi..." STR_CHECKING_WIFI: "Checking WiFi..."
STR_ENTER_WIFI_PASSWORD: "Enter Wi-Fi password" STR_ENTER_WIFI_PASSWORD: "Enter WiFi Password"
STR_TO_PREFIX: "to " STR_TO_PREFIX: "to "
STR_CALIBRE_RECEIVING: "Receiving: " STR_CALIBRE_RECEIVING: "Receiving: "
STR_CALIBRE_RECEIVED: "Received: " STR_CALIBRE_RECEIVED: "Received: "
STR_CALIBRE_INSTRUCTION_1: "1) Install CrossPoint Reader plugin" STR_CALIBRE_INSTRUCTION_1: "1) Install CrossPoint Reader plugin"
STR_CALIBRE_INSTRUCTION_2: "2) Be on the same Wi-Fi network" STR_CALIBRE_INSTRUCTION_2: "2) Be on the same WiFi network"
STR_CALIBRE_INSTRUCTION_3: "3) In Calibre: \"Send to device\"" STR_CALIBRE_INSTRUCTION_3: "3) In Calibre: \"Send to device\""
STR_CALIBRE_INSTRUCTION_4: "\"Keep this screen open while sending\"" STR_CALIBRE_INSTRUCTION_4: "\"Keep this screen open while sending\""
STR_CAT_DISPLAY: "Display" STR_CAT_DISPLAY: "Display"
@@ -62,8 +62,6 @@ STR_CAT_READER: "Reader"
STR_CAT_CONTROLS: "Controls" STR_CAT_CONTROLS: "Controls"
STR_CAT_SYSTEM: "System" STR_CAT_SYSTEM: "System"
STR_SLEEP_SCREEN: "Sleep Screen" STR_SLEEP_SCREEN: "Sleep Screen"
STR_QUICK_RESUME_TIMEOUT: "Quick Resume on Timeout"
STR_AFTER_TIMEOUT: "After Timeout"
STR_SLEEP_COVER_MODE: "Sleep Screen Cover Mode" STR_SLEEP_COVER_MODE: "Sleep Screen Cover Mode"
STR_HIDE_BATTERY: "Hide Battery %" STR_HIDE_BATTERY: "Hide Battery %"
STR_EXTRA_SPACING: "Extra Paragraph Spacing" STR_EXTRA_SPACING: "Extra Paragraph Spacing"
@@ -75,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Suppress"
STR_SHORT_PWR_BTN: "Short Power Button Click" STR_SHORT_PWR_BTN: "Short Power Button Click"
STR_ORIENTATION: "Reading Orientation" STR_ORIENTATION: "Reading Orientation"
STR_SIDE_BTN_LAYOUT: "Side Button Layout (reader)" STR_SIDE_BTN_LAYOUT: "Side Button Layout (reader)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orient front buttons"
STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior" STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior"
STR_LONG_PRESS_BEHAVIOR_OFF: "OFF" STR_LONG_PRESS_BEHAVIOR_OFF: "OFF"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip" STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip"
@@ -88,8 +85,6 @@ STR_PARA_ALIGNMENT: "Reader Paragraph Alignment"
STR_HYPHENATION: "Hyphenation" STR_HYPHENATION: "Hyphenation"
STR_TIME_TO_SLEEP: "Time to Sleep" STR_TIME_TO_SLEEP: "Time to Sleep"
STR_SHOW_HIDDEN_FILES: "Show Hidden Files" STR_SHOW_HIDDEN_FILES: "Show Hidden Files"
STR_REMOVE_READ_FROM_RECENTS: "Clear Read Books from Recent List"
STR_MOVE_FINISHED_TO_READ: "Move Finished Books to Read Folder"
STR_REFRESH_FREQ: "Refresh Frequency" STR_REFRESH_FREQ: "Refresh Frequency"
STR_KOREADER_SYNC: "KOReader Sync" STR_KOREADER_SYNC: "KOReader Sync"
STR_CHECK_UPDATES: "Check for updates" STR_CHECK_UPDATES: "Check for updates"
@@ -105,7 +100,7 @@ STR_KOREADER_PASSWORD: "KOReader Password"
STR_FILENAME: "Filename" STR_FILENAME: "Filename"
STR_BINARY: "Binary" STR_BINARY: "Binary"
STR_SET_CREDENTIALS_FIRST: "Set credentials first" STR_SET_CREDENTIALS_FIRST: "Set credentials first"
STR_WIFI_CONN_FAILED: "Wi-Fi connection failed" STR_WIFI_CONN_FAILED: "WiFi connection failed"
STR_AUTHENTICATING: "Authenticating..." STR_AUTHENTICATING: "Authenticating..."
STR_AUTH_SUCCESS: "Successfully authenticated!" STR_AUTH_SUCCESS: "Successfully authenticated!"
STR_KOREADER_AUTH: "KOReader Auth" STR_KOREADER_AUTH: "KOReader Auth"
@@ -157,7 +152,6 @@ STR_ALIGN_LEFT: "Left"
STR_CENTER: "Center" STR_CENTER: "Center"
STR_ALIGN_RIGHT: "Right" STR_ALIGN_RIGHT: "Right"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -238,21 +232,6 @@ STR_BATTERY: "Battery"
STR_XTC_STATUS_BAR: "XTC Status Bar" STR_XTC_STATUS_BAR: "XTC Status Bar"
STR_BOTTOM: "Bottom" STR_BOTTOM: "Bottom"
STR_TOP: "Top" STR_TOP: "Top"
STR_CLOCK: "Clock"
STR_CLOCK_UTC_OFFSET: "Clock UTC Offset"
STR_CLOCK_FORMAT: "Clock Format"
STR_CLOCK_FORMAT_24H: "24-hour"
STR_CLOCK_FORMAT_12H: "12-hour"
STR_CURRENT_TIME: "Current time:"
STR_NEXT_FIELD: "Next"
STR_CLOCK_SYNC: "Sync Clock"
STR_CLOCK_SYNC_NOW: "Sync clock now"
STR_CLOCK_SYNCING: "Syncing from NTP..."
STR_CLOCK_SYNC_OK: "Clock synced"
STR_CLOCK_SYNC_FAIL: "Sync failed"
STR_CLOCK_SYNC_NO_WIFI: "Wi-Fi not connected"
STR_CLOCK_SYNC_NO_WIFI_HINT: "Connect to Wi-Fi first, then try again."
STR_CLOCK_SYNCED: "Clock Synced"
STR_UI_THEME: "UI Theme" STR_UI_THEME: "UI Theme"
STR_THEME_CLASSIC: "Classic" STR_THEME_CLASSIC: "Classic"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
@@ -263,9 +242,7 @@ STR_REMAP_FRONT_BUTTONS: "Remap Front Buttons"
STR_OPDS_BROWSER: "OPDS Browser" STR_OPDS_BROWSER: "OPDS Browser"
STR_SEARCH: "Search" STR_SEARCH: "Search"
STR_COVER_CUSTOM: "Cover + Custom" STR_COVER_CUSTOM: "Cover + Custom"
STR_QUICK_RESUME: "Quick Resume"
STR_MENU_RECENT_BOOKS: "Recent Books" STR_MENU_RECENT_BOOKS: "Recent Books"
STR_REMOVE_FROM_RECENTS: "Remove from Recent Books?"
STR_NO_RECENT_BOOKS: "No recent books" STR_NO_RECENT_BOOKS: "No recent books"
STR_CALIBRE_DESC: "Use Calibre wireless device transfers" STR_CALIBRE_DESC: "Use Calibre wireless device transfers"
STR_FORGET_AND_REMOVE: "Forget network and remove saved password?" STR_FORGET_AND_REMOVE: "Forget network and remove saved password?"
+8 -16
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Tyhjä tiedosto"
STR_OUT_OF_BOUNDS: "Alueen ulkopuolella" STR_OUT_OF_BOUNDS: "Alueen ulkopuolella"
STR_LOADING: "Ladataan..." STR_LOADING: "Ladataan..."
STR_LOADING_POPUP: "Ladataan" STR_LOADING_POPUP: "Ladataan"
STR_WIFI_NETWORKS: "Wi-Fi-verkot" STR_WIFI_NETWORKS: "WiFi-verkot"
STR_NO_NETWORKS: "Verkkoja ei löytynyt" STR_NO_NETWORKS: "Verkkoja ei löytynyt"
STR_NETWORKS_FOUND: "%zu verkkoa löydetty" STR_NETWORKS_FOUND: "%zu verkkoa löydetty"
STR_SCANNING: "Etsitään..." STR_SCANNING: "Etsitään..."
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Tallenna salasana seuraavaa kertaa varten?"
STR_PRESS_OK_SCAN: "Paina OK etsiäksesi uudelleen" STR_PRESS_OK_SCAN: "Paina OK etsiäksesi uudelleen"
STR_JOIN_NETWORK: "Liity verkkoon" STR_JOIN_NETWORK: "Liity verkkoon"
STR_CREATE_HOTSPOT: "Luo yhteyspiste" STR_CREATE_HOTSPOT: "Luo yhteyspiste"
STR_JOIN_DESC: "Yhdistä olemassa olevaan Wi-Fi-verkkoon" STR_JOIN_DESC: "Yhdistä olemassa olevaan WiFi-verkkoon"
STR_HOTSPOT_DESC: "Luo Wi-Fi-verkko, johon muut voivat liittyä" STR_HOTSPOT_DESC: "Luo WiFi-verkko, johon muut voivat liittyä"
STR_STARTING_HOTSPOT: "Käynnistetään yhteyspiste..." STR_STARTING_HOTSPOT: "Käynnistetään yhteyspiste..."
STR_HOTSPOT_MODE: "Yhteyspistetila" STR_HOTSPOT_MODE: "Yhteyspistetila"
STR_CONNECT_WIFI_HINT: "Yhdistä laitteesi tähän Wi-Fi-verkkoon" STR_CONNECT_WIFI_HINT: "Yhdistä laitteesi tähän WiFi-verkkoon"
STR_OPEN_URL_HINT: "Avaa tämä osoite selaimessasi" STR_OPEN_URL_HINT: "Avaa tämä osoite selaimessasi"
STR_OR_HTTP_PREFIX: "tai http://" STR_OR_HTTP_PREFIX: "tai http://"
STR_SCAN_QR_HINT: "tai skannaa QR-koodi puhelimellasi:" STR_SCAN_QR_HINT: "tai skannaa QR-koodi puhelimellasi:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Calibre langaton"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Salattu | + = Tallennettu" STR_NETWORK_LEGEND: "* = Salattu | + = Tallennettu"
STR_MAC_ADDRESS: "MAC-osoite:" STR_MAC_ADDRESS: "MAC-osoite:"
STR_CHECKING_WIFI: "Tarkistetaan Wi-Fi..." STR_CHECKING_WIFI: "Tarkistetaan WiFi..."
STR_ENTER_WIFI_PASSWORD: "Syötä Wi-Fi-salasana" STR_ENTER_WIFI_PASSWORD: "Syötä WiFi-salasana"
STR_TO_PREFIX: "verkkoon " STR_TO_PREFIX: "verkkoon "
STR_CALIBRE_RECEIVING: "Vastaanotetaan: " STR_CALIBRE_RECEIVING: "Vastaanotetaan: "
STR_CALIBRE_RECEIVED: "Vastaanotettu: " STR_CALIBRE_RECEIVED: "Vastaanotettu: "
STR_CALIBRE_INSTRUCTION_1: "1) Asenna CrossPoint Reader -lisäosa" STR_CALIBRE_INSTRUCTION_1: "1) Asenna CrossPoint Reader -lisäosa"
STR_CALIBRE_INSTRUCTION_2: "2) Ole samassa Wi-Fi-verkossa" STR_CALIBRE_INSTRUCTION_2: "2) Ole samassa WiFi-verkossa"
STR_CALIBRE_INSTRUCTION_3: "3) Calibressa: \"Lähetä laitteelle\"" STR_CALIBRE_INSTRUCTION_3: "3) Calibressa: \"Lähetä laitteelle\""
STR_CALIBRE_INSTRUCTION_4: "\"Pidä tämä näyttö auki lähetyksen aikana\"" STR_CALIBRE_INSTRUCTION_4: "\"Pidä tämä näyttö auki lähetyksen aikana\""
STR_CAT_DISPLAY: "Näyttö" STR_CAT_DISPLAY: "Näyttö"
@@ -69,7 +69,6 @@ STR_TEXT_AA: "Tekstin reunanpehmennys"
STR_SHORT_PWR_BTN: "Lyhyt virtapainikkeen painallus" STR_SHORT_PWR_BTN: "Lyhyt virtapainikkeen painallus"
STR_ORIENTATION: "Lukusuunta" STR_ORIENTATION: "Lukusuunta"
STR_SIDE_BTN_LAYOUT: "Sivupainikkeiden asettelu (lukija)" STR_SIDE_BTN_LAYOUT: "Sivupainikkeiden asettelu (lukija)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Suuntaa etupainikkeet"
STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior" STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior"
STR_LONG_PRESS_BEHAVIOR_OFF: "OFF" STR_LONG_PRESS_BEHAVIOR_OFF: "OFF"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip" STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip"
@@ -81,8 +80,6 @@ STR_SCREEN_MARGIN: "Lukijan näyttömarginaali"
STR_PARA_ALIGNMENT: "Lukijan kappaletasaus" STR_PARA_ALIGNMENT: "Lukijan kappaletasaus"
STR_HYPHENATION: "Tavutus" STR_HYPHENATION: "Tavutus"
STR_TIME_TO_SLEEP: "Aika lepotilaan" STR_TIME_TO_SLEEP: "Aika lepotilaan"
STR_REMOVE_READ_FROM_RECENTS: "Tyhjennä luetut kirjat viimeisimpien listalta"
STR_MOVE_FINISHED_TO_READ: "Siirrä luetut kirjat Read-kansioon"
STR_REFRESH_FREQ: "Päivitystaajuus" STR_REFRESH_FREQ: "Päivitystaajuus"
STR_KOREADER_SYNC: "KOReader-synkronointi" STR_KOREADER_SYNC: "KOReader-synkronointi"
STR_CHECK_UPDATES: "Tarkista päivitykset" STR_CHECK_UPDATES: "Tarkista päivitykset"
@@ -98,7 +95,7 @@ STR_KOREADER_PASSWORD: "KOReader-salasana"
STR_FILENAME: "Tiedostonimi" STR_FILENAME: "Tiedostonimi"
STR_BINARY: "Binääri" STR_BINARY: "Binääri"
STR_SET_CREDENTIALS_FIRST: "Aseta tunnukset ensin" STR_SET_CREDENTIALS_FIRST: "Aseta tunnukset ensin"
STR_WIFI_CONN_FAILED: "Wi-Fi-yhteys epäonnistui" STR_WIFI_CONN_FAILED: "WiFi-yhteys epäonnistui"
STR_AUTHENTICATING: "Tunnistaudutaan..." STR_AUTHENTICATING: "Tunnistaudutaan..."
STR_AUTH_SUCCESS: "Tunnistautuminen onnistui!" STR_AUTH_SUCCESS: "Tunnistautuminen onnistui!"
STR_KOREADER_AUTH: "KOReader-tunnistautuminen" STR_KOREADER_AUTH: "KOReader-tunnistautuminen"
@@ -149,7 +146,6 @@ STR_ALIGN_LEFT: "Vasen"
STR_CENTER: "Keskitetty" STR_CENTER: "Keskitetty"
STR_ALIGN_RIGHT: "Oikea" STR_ALIGN_RIGHT: "Oikea"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -211,14 +207,10 @@ STR_THEME_CLASSIC: "Klassinen"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Auringonvalon haalistumiskorjaus" STR_SUNLIGHT_FADING_FIX: "Auringonvalon haalistumiskorjaus"
STR_QUICK_RESUME_TIMEOUT: "Pikajatko aikakatkaisulla"
STR_AFTER_TIMEOUT: "Aikakatkon jälkeen"
STR_REMAP_FRONT_BUTTONS: "Uudelleenmääritä etupainikkeet" STR_REMAP_FRONT_BUTTONS: "Uudelleenmääritä etupainikkeet"
STR_OPDS_BROWSER: "OPDS-selain" STR_OPDS_BROWSER: "OPDS-selain"
STR_COVER_CUSTOM: "Kansi + mukautettu" STR_COVER_CUSTOM: "Kansi + mukautettu"
STR_QUICK_RESUME: "Pikajatko"
STR_MENU_RECENT_BOOKS: "Viimeisimmät kirjat" STR_MENU_RECENT_BOOKS: "Viimeisimmät kirjat"
STR_REMOVE_FROM_RECENTS: "Poista viimeisimmistä kirjoista?"
STR_NO_RECENT_BOOKS: "Ei viimeisimpiä kirjoja" STR_NO_RECENT_BOOKS: "Ei viimeisimpiä kirjoja"
STR_CALIBRE_DESC: "Käytä Calibren langatonta laiteyhteyttä" STR_CALIBRE_DESC: "Käytä Calibren langatonta laiteyhteyttä"
STR_FORGET_AND_REMOVE: "Unohda verkko ja poista tallennettu salasana?" STR_FORGET_AND_REMOVE: "Unohda verkko ja poista tallennettu salasana?"
+8 -16
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Fichier vide"
STR_OUT_OF_BOUNDS: "Dépassement de mémoire" STR_OUT_OF_BOUNDS: "Dépassement de mémoire"
STR_LOADING: "Chargement…" STR_LOADING: "Chargement…"
STR_LOADING_POPUP: "Chargement" STR_LOADING_POPUP: "Chargement"
STR_WIFI_NETWORKS: "Réseaux Wi-Fi" STR_WIFI_NETWORKS: "Réseaux WiFi"
STR_NO_NETWORKS: "Aucun réseau" STR_NO_NETWORKS: "Aucun réseau"
STR_NETWORKS_FOUND: "%zu réseaux" STR_NETWORKS_FOUND: "%zu réseaux"
STR_SCANNING: "Recherche en cours…" STR_SCANNING: "Recherche en cours…"
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Enregistrer le mot de passe ?"
STR_PRESS_OK_SCAN: "Appuyez sur OK pour scanner" STR_PRESS_OK_SCAN: "Appuyez sur OK pour scanner"
STR_JOIN_NETWORK: "Rejoindre un réseau" STR_JOIN_NETWORK: "Rejoindre un réseau"
STR_CREATE_HOTSPOT: "Créer un point daccès" STR_CREATE_HOTSPOT: "Créer un point daccès"
STR_JOIN_DESC: "Se connecter à un Wi-Fi existant" STR_JOIN_DESC: "Se connecter à un WiFi existant"
STR_HOTSPOT_DESC: "Créer un Wi-Fi pour d'autres appareils" STR_HOTSPOT_DESC: "Créer un WiFi pour d'autres appareils"
STR_STARTING_HOTSPOT: "Création du point daccès…" STR_STARTING_HOTSPOT: "Création du point daccès…"
STR_HOTSPOT_MODE: "Mode point daccès" STR_HOTSPOT_MODE: "Mode point daccès"
STR_CONNECT_WIFI_HINT: "Connectez un appareil à ce Wi-Fi" STR_CONNECT_WIFI_HINT: "Connectez un appareil à ce WiFi"
STR_OPEN_URL_HINT: "Ouvrez cette URL dans un navigateur" STR_OPEN_URL_HINT: "Ouvrez cette URL dans un navigateur"
STR_OR_HTTP_PREFIX: "ou http://" STR_OR_HTTP_PREFIX: "ou http://"
STR_SCAN_QR_HINT: "ou scannez le QR code :" STR_SCAN_QR_HINT: "ou scannez le QR code :"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Connexion Calibre sans fil"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Sécurisé | + = Sauvegardé" STR_NETWORK_LEGEND: "* = Sécurisé | + = Sauvegardé"
STR_MAC_ADDRESS: "Adresse MAC :" STR_MAC_ADDRESS: "Adresse MAC :"
STR_CHECKING_WIFI: "Vérification du Wi-Fi…" STR_CHECKING_WIFI: "Vérification du WiFi…"
STR_ENTER_WIFI_PASSWORD: "Entrez le mot de passe Wi-Fi" STR_ENTER_WIFI_PASSWORD: "Entrez le mot de passe WiFi"
STR_TO_PREFIX: "vers " STR_TO_PREFIX: "vers "
STR_CALIBRE_RECEIVING: "Réception : " STR_CALIBRE_RECEIVING: "Réception : "
STR_CALIBRE_RECEIVED: "Reçu : " STR_CALIBRE_RECEIVED: "Reçu : "
STR_CALIBRE_INSTRUCTION_1: "1) Installer plugin CrossPoint Reader" STR_CALIBRE_INSTRUCTION_1: "1) Installer plugin CrossPoint Reader"
STR_CALIBRE_INSTRUCTION_2: "2) Être sur le même réseau Wi-Fi" STR_CALIBRE_INSTRUCTION_2: "2) Être sur le même réseau WiFi"
STR_CALIBRE_INSTRUCTION_3: "3) Calibre : Envoyer vers lappareil" STR_CALIBRE_INSTRUCTION_3: "3) Calibre : Envoyer vers lappareil"
STR_CALIBRE_INSTRUCTION_4: "4) Gardez cet écran ouvert" STR_CALIBRE_INSTRUCTION_4: "4) Gardez cet écran ouvert"
STR_CAT_DISPLAY: "Affichage" STR_CAT_DISPLAY: "Affichage"
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Masquer"
STR_SHORT_PWR_BTN: "Appui court alim." STR_SHORT_PWR_BTN: "Appui court alim."
STR_ORIENTATION: "Orientation de lecture" STR_ORIENTATION: "Orientation de lecture"
STR_SIDE_BTN_LAYOUT: "Boutons latéraux" STR_SIDE_BTN_LAYOUT: "Boutons latéraux"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orienter boutons avant"
STR_LONG_PRESS_BEHAVIOR: "Comportement lors d'un appui long" STR_LONG_PRESS_BEHAVIOR: "Comportement lors d'un appui long"
STR_LONG_PRESS_BEHAVIOR_OFF: "Désactivé" STR_LONG_PRESS_BEHAVIOR_OFF: "Désactivé"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Saut de chapitre" STR_LONG_PRESS_BEHAVIOR_SKIP: "Saut de chapitre"
@@ -86,8 +85,6 @@ STR_PARA_ALIGNMENT: "Alignement du texte"
STR_HYPHENATION: "Césure" STR_HYPHENATION: "Césure"
STR_TIME_TO_SLEEP: "Mise en veille auto" STR_TIME_TO_SLEEP: "Mise en veille auto"
STR_SHOW_HIDDEN_FILES: "Afficher les fichiers cachés" STR_SHOW_HIDDEN_FILES: "Afficher les fichiers cachés"
STR_REMOVE_READ_FROM_RECENTS: "Effacer les livres lus de la liste des récents"
STR_MOVE_FINISHED_TO_READ: "Déplacer les livres terminés vers le dossier Read"
STR_REFRESH_FREQ: "Fréquence rafraîchissement" STR_REFRESH_FREQ: "Fréquence rafraîchissement"
STR_KOREADER_SYNC: "Synchro KOReader" STR_KOREADER_SYNC: "Synchro KOReader"
STR_CHECK_UPDATES: "Mise à jour" STR_CHECK_UPDATES: "Mise à jour"
@@ -103,7 +100,7 @@ STR_KOREADER_PASSWORD: "Mot de passe"
STR_FILENAME: "Nom de fichier" STR_FILENAME: "Nom de fichier"
STR_BINARY: "Binaire" STR_BINARY: "Binaire"
STR_SET_CREDENTIALS_FIRST: "Identifiants manquants" STR_SET_CREDENTIALS_FIRST: "Identifiants manquants"
STR_WIFI_CONN_FAILED: "Échec connexion Wi-Fi" STR_WIFI_CONN_FAILED: "Échec connexion WiFi"
STR_AUTHENTICATING: "Authentification…" STR_AUTHENTICATING: "Authentification…"
STR_AUTH_SUCCESS: "Authentifié !" STR_AUTH_SUCCESS: "Authentifié !"
STR_KOREADER_AUTH: "Auth KOReader" STR_KOREADER_AUTH: "Auth KOReader"
@@ -154,7 +151,6 @@ STR_ALIGN_LEFT: "Gauche"
STR_CENTER: "Centré" STR_CENTER: "Centré"
STR_ALIGN_RIGHT: "Droite" STR_ALIGN_RIGHT: "Droite"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -235,14 +231,10 @@ STR_THEME_LYRA: "Lyra"
STR_THEME_ROUNDEDRAFF: "RoundedRaff" STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Correction lisibilité au soleil" STR_SUNLIGHT_FADING_FIX: "Correction lisibilité au soleil"
STR_QUICK_RESUME_TIMEOUT: "Reprise rapide après délai"
STR_AFTER_TIMEOUT: "Après délai"
STR_REMAP_FRONT_BUTTONS: "Configurer boutons façade" STR_REMAP_FRONT_BUTTONS: "Configurer boutons façade"
STR_OPDS_BROWSER: "Navigateur OPDS" STR_OPDS_BROWSER: "Navigateur OPDS"
STR_COVER_CUSTOM: "Couverture + Perso" STR_COVER_CUSTOM: "Couverture + Perso"
STR_QUICK_RESUME: "Reprise rapide"
STR_MENU_RECENT_BOOKS: "Livres récents" STR_MENU_RECENT_BOOKS: "Livres récents"
STR_REMOVE_FROM_RECENTS: "Retirer des Livres récents ?"
STR_NO_RECENT_BOOKS: "Aucun livre récent" STR_NO_RECENT_BOOKS: "Aucun livre récent"
STR_CALIBRE_DESC: "Utiliser transfert sans fil Calibre" STR_CALIBRE_DESC: "Utiliser transfert sans fil Calibre"
STR_FORGET_AND_REMOVE: "Oublier le réseau et le mot de passe ?" STR_FORGET_AND_REMOVE: "Oublier le réseau et le mot de passe ?"
-8
View File
@@ -69,7 +69,6 @@ STR_TEXT_AA: "Schriftglättung"
STR_SHORT_PWR_BTN: "An-Taste kurz drücken" STR_SHORT_PWR_BTN: "An-Taste kurz drücken"
STR_ORIENTATION: "Leseausrichtung" STR_ORIENTATION: "Leseausrichtung"
STR_SIDE_BTN_LAYOUT: "Seitliche Tasten (Lesen)" STR_SIDE_BTN_LAYOUT: "Seitliche Tasten (Lesen)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Vordere Tasten ausrichten"
STR_LONG_PRESS_BEHAVIOR: "Verhalten bei langem Tastendruck" STR_LONG_PRESS_BEHAVIOR: "Verhalten bei langem Tastendruck"
STR_LONG_PRESS_BEHAVIOR_OFF: "AUS" STR_LONG_PRESS_BEHAVIOR_OFF: "AUS"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Kapitel überspringen" STR_LONG_PRESS_BEHAVIOR_SKIP: "Kapitel überspringen"
@@ -152,7 +151,6 @@ STR_ALIGN_LEFT: "Links"
STR_CENTER: "Zentriert" STR_CENTER: "Zentriert"
STR_ALIGN_RIGHT: "Rechts" STR_ALIGN_RIGHT: "Rechts"
STR_MIN_1: "1 Min" STR_MIN_1: "1 Min"
STR_MIN_3: "3 Min"
STR_MIN_5: "5 Min" STR_MIN_5: "5 Min"
STR_MIN_10: "10 Min" STR_MIN_10: "10 Min"
STR_MIN_15: "15 Min" STR_MIN_15: "15 Min"
@@ -233,14 +231,10 @@ STR_THEME_LYRA: "Lyra"
STR_THEME_ROUNDEDRAFF: "RoundedRaff" STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Anti-Verblassen" STR_SUNLIGHT_FADING_FIX: "Anti-Verblassen"
STR_QUICK_RESUME_TIMEOUT: "Schnelles Fortsetzen nach Timeout"
STR_AFTER_TIMEOUT: "Nach Timeout"
STR_REMAP_FRONT_BUTTONS: "Vordere Tasten belegen" STR_REMAP_FRONT_BUTTONS: "Vordere Tasten belegen"
STR_OPDS_BROWSER: "OPDS-Browser" STR_OPDS_BROWSER: "OPDS-Browser"
STR_COVER_CUSTOM: "Umschlag + Eigenes" STR_COVER_CUSTOM: "Umschlag + Eigenes"
STR_QUICK_RESUME: "Schnelles Fortsetzen"
STR_MENU_RECENT_BOOKS: "Zuletzt gelesen" STR_MENU_RECENT_BOOKS: "Zuletzt gelesen"
STR_REMOVE_FROM_RECENTS: "Aus Zuletzt gelesen entfernen?"
STR_NO_RECENT_BOOKS: "Keine Bücher" STR_NO_RECENT_BOOKS: "Keine Bücher"
STR_CALIBRE_DESC: "Calibre-Übertragung (WLAN)" STR_CALIBRE_DESC: "Calibre-Übertragung (WLAN)"
STR_FORGET_AND_REMOVE: "WLAN entfernen & Passwort löschen?" STR_FORGET_AND_REMOVE: "WLAN entfernen & Passwort löschen?"
@@ -308,8 +302,6 @@ STR_IMAGES_DISPLAY: "Darstellung"
STR_IMAGES_PLACEHOLDER: "Platzhalter" STR_IMAGES_PLACEHOLDER: "Platzhalter"
STR_IMAGES_SUPPRESS: "Unterdrücken" STR_IMAGES_SUPPRESS: "Unterdrücken"
STR_SHOW_HIDDEN_FILES: "Versteckte Dateien anzeigen" STR_SHOW_HIDDEN_FILES: "Versteckte Dateien anzeigen"
STR_REMOVE_READ_FROM_RECENTS: "Gelesene Bücher aus der Zuletzt-Liste löschen"
STR_MOVE_FINISHED_TO_READ: "Gelesene Bücher in den Read-Ordner verschieben"
STR_PAGE_OVERLAY: "Seiten-Overlay" STR_PAGE_OVERLAY: "Seiten-Overlay"
STR_RECENTS: "Zuletzt" STR_RECENTS: "Zuletzt"
STR_MAPPING_REMOTE: "Externe Position zuordnen..." STR_MAPPING_REMOTE: "Externe Position zuordnen..."
+8 -16
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Üres fájl"
STR_OUT_OF_BOUNDS: "Határon kívül" STR_OUT_OF_BOUNDS: "Határon kívül"
STR_LOADING: "Betöltés..." STR_LOADING: "Betöltés..."
STR_LOADING_POPUP: "Betöltés" STR_LOADING_POPUP: "Betöltés"
STR_WIFI_NETWORKS: "Wi-Fi hálózatok" STR_WIFI_NETWORKS: "WiFi hálózatok"
STR_NO_NETWORKS: "Nem található hálózat" STR_NO_NETWORKS: "Nem található hálózat"
STR_NETWORKS_FOUND: "%zu hálózat található" STR_NETWORKS_FOUND: "%zu hálózat található"
STR_SCANNING: "Keresés..." STR_SCANNING: "Keresés..."
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Jelszó mentése legközelebb?"
STR_PRESS_OK_SCAN: "Nyomj OK-t az újraellenőrzéshez" STR_PRESS_OK_SCAN: "Nyomj OK-t az újraellenőrzéshez"
STR_JOIN_NETWORK: "Csatlakozás hálózathoz" STR_JOIN_NETWORK: "Csatlakozás hálózathoz"
STR_CREATE_HOTSPOT: "Hotspot létrehozása" STR_CREATE_HOTSPOT: "Hotspot létrehozása"
STR_JOIN_DESC: "Csatlakozás meglévő Wi-Fi hálózathoz" STR_JOIN_DESC: "Csatlakozás meglévő WiFi hálózathoz"
STR_HOTSPOT_DESC: "Wi-Fi hálózat létrehozása másoknak" STR_HOTSPOT_DESC: "WiFi hálózat létrehozása másoknak"
STR_STARTING_HOTSPOT: "Hotspot indítása..." STR_STARTING_HOTSPOT: "Hotspot indítása..."
STR_HOTSPOT_MODE: "Hotspot mód" STR_HOTSPOT_MODE: "Hotspot mód"
STR_CONNECT_WIFI_HINT: "Csatlakoztasd az eszközöd ehhez a Wi-Fi hálózathoz" STR_CONNECT_WIFI_HINT: "Csatlakoztasd az eszközöd ehhez a WiFi hálózathoz"
STR_OPEN_URL_HINT: "Nyisd meg ezt az URL-t a böngésződben" STR_OPEN_URL_HINT: "Nyisd meg ezt az URL-t a böngésződben"
STR_OR_HTTP_PREFIX: "vagy http://" STR_OR_HTTP_PREFIX: "vagy http://"
STR_SCAN_QR_HINT: "vagy olvasd be a QR-kódot a telefonoddal:" STR_SCAN_QR_HINT: "vagy olvasd be a QR-kódot a telefonoddal:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Calibre Wireless"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Titkosított | + = Mentett" STR_NETWORK_LEGEND: "* = Titkosított | + = Mentett"
STR_MAC_ADDRESS: "MAC-cím:" STR_MAC_ADDRESS: "MAC-cím:"
STR_CHECKING_WIFI: "Wi-Fi ellenőrzése..." STR_CHECKING_WIFI: "WiFi ellenőrzése..."
STR_ENTER_WIFI_PASSWORD: "Add meg a Wi-Fi jelszót" STR_ENTER_WIFI_PASSWORD: "Add meg a WiFi jelszót"
STR_TO_PREFIX: "- " STR_TO_PREFIX: "- "
STR_CALIBRE_RECEIVING: "Fogadás: " STR_CALIBRE_RECEIVING: "Fogadás: "
STR_CALIBRE_RECEIVED: "Fogadva: " STR_CALIBRE_RECEIVED: "Fogadva: "
STR_CALIBRE_INSTRUCTION_1: "1) Telepítsd a CrossPoint Reader plugint" STR_CALIBRE_INSTRUCTION_1: "1) Telepítsd a CrossPoint Reader plugint"
STR_CALIBRE_INSTRUCTION_2: "2) Ugyanazon a Wi-Fi hálózaton légy" STR_CALIBRE_INSTRUCTION_2: "2) Ugyanazon a WiFi hálózaton légy"
STR_CALIBRE_INSTRUCTION_3: "3) Calibre-ben: \"Küldés az eszközre\"" STR_CALIBRE_INSTRUCTION_3: "3) Calibre-ben: \"Küldés az eszközre\""
STR_CALIBRE_INSTRUCTION_4: "\"Tartsd nyitva a képernyőt küldés közben\"" STR_CALIBRE_INSTRUCTION_4: "\"Tartsd nyitva a képernyőt küldés közben\""
STR_CAT_DISPLAY: "Megjelenítés" STR_CAT_DISPLAY: "Megjelenítés"
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Elnyomás"
STR_SHORT_PWR_BTN: "Rövid bekapcsológomb nyomás" STR_SHORT_PWR_BTN: "Rövid bekapcsológomb nyomás"
STR_ORIENTATION: "Olvasási irány" STR_ORIENTATION: "Olvasási irány"
STR_SIDE_BTN_LAYOUT: "Oldalsó gomb elrendezés (olvasó)" STR_SIDE_BTN_LAYOUT: "Oldalsó gomb elrendezés (olvasó)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Elülső gombok tájolása"
STR_LONG_PRESS_SKIP: "Hosszú nyomás - fejezet ugrás" STR_LONG_PRESS_SKIP: "Hosszú nyomás - fejezet ugrás"
STR_FONT_FAMILY: "Olvasó betűkészlet" STR_FONT_FAMILY: "Olvasó betűkészlet"
STR_FONT_SIZE: "Olvasó betűméret" STR_FONT_SIZE: "Olvasó betűméret"
@@ -83,8 +82,6 @@ STR_PARA_ALIGNMENT: "Olvasó szövegigazítás"
STR_HYPHENATION: "Elválasztás" STR_HYPHENATION: "Elválasztás"
STR_TIME_TO_SLEEP: "Alvó mód aktiválása" STR_TIME_TO_SLEEP: "Alvó mód aktiválása"
STR_SHOW_HIDDEN_FILES: "Rejtett fájlok megjelenítése" STR_SHOW_HIDDEN_FILES: "Rejtett fájlok megjelenítése"
STR_REMOVE_READ_FROM_RECENTS: "Olvasott könyvek törlése a legutóbbiak listájáról"
STR_MOVE_FINISHED_TO_READ: "Befejezett könyvek áthelyezése a Read mappába"
STR_REFRESH_FREQ: "Frissítési frekvencia" STR_REFRESH_FREQ: "Frissítési frekvencia"
STR_KOREADER_SYNC: "KOReader szinkronizálás" STR_KOREADER_SYNC: "KOReader szinkronizálás"
STR_CHECK_UPDATES: "Frissítések keresése" STR_CHECK_UPDATES: "Frissítések keresése"
@@ -100,7 +97,7 @@ STR_KOREADER_PASSWORD: "KOReader jelszó"
STR_FILENAME: "Fájlnév" STR_FILENAME: "Fájlnév"
STR_BINARY: "Bináris" STR_BINARY: "Bináris"
STR_SET_CREDENTIALS_FIRST: "Először add meg az adatokat" STR_SET_CREDENTIALS_FIRST: "Először add meg az adatokat"
STR_WIFI_CONN_FAILED: "Wi-Fi kapcsolat sikertelen" STR_WIFI_CONN_FAILED: "WiFi kapcsolat sikertelen"
STR_AUTHENTICATING: "Hitelesítés..." STR_AUTHENTICATING: "Hitelesítés..."
STR_AUTH_SUCCESS: "Sikeres hitelesítés!" STR_AUTH_SUCCESS: "Sikeres hitelesítés!"
STR_KOREADER_AUTH: "KOReader hitelesítés" STR_KOREADER_AUTH: "KOReader hitelesítés"
@@ -151,7 +148,6 @@ STR_ALIGN_LEFT: "Bal"
STR_CENTER: "Közép" STR_CENTER: "Közép"
STR_ALIGN_RIGHT: "Jobb" STR_ALIGN_RIGHT: "Jobb"
STR_MIN_1: "1 perc" STR_MIN_1: "1 perc"
STR_MIN_3: "3 perc"
STR_MIN_5: "5 perc" STR_MIN_5: "5 perc"
STR_MIN_10: "10 perc" STR_MIN_10: "10 perc"
STR_MIN_15: "15 perc" STR_MIN_15: "15 perc"
@@ -231,14 +227,10 @@ STR_THEME_CLASSIC: "Klasszikus"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Napfény halványulás javítás" STR_SUNLIGHT_FADING_FIX: "Napfény halványulás javítás"
STR_QUICK_RESUME_TIMEOUT: "Gyors folytatás időtúllépéskor"
STR_AFTER_TIMEOUT: "Időtúllépés után"
STR_REMAP_FRONT_BUTTONS: "Elülső gombok átállítása" STR_REMAP_FRONT_BUTTONS: "Elülső gombok átállítása"
STR_OPDS_BROWSER: "OPDS böngésző" STR_OPDS_BROWSER: "OPDS böngésző"
STR_COVER_CUSTOM: "Borító + Egyéni" STR_COVER_CUSTOM: "Borító + Egyéni"
STR_QUICK_RESUME: "Gyors folytatás"
STR_MENU_RECENT_BOOKS: "Legutóbbi könyvek" STR_MENU_RECENT_BOOKS: "Legutóbbi könyvek"
STR_REMOVE_FROM_RECENTS: "Eltávolítás a legutóbbi könyvek közül?"
STR_NO_RECENT_BOOKS: "Nincsenek legutóbbi könyvek" STR_NO_RECENT_BOOKS: "Nincsenek legutóbbi könyvek"
STR_CALIBRE_DESC: "Calibre wireless eszköz átvitel használata" STR_CALIBRE_DESC: "Calibre wireless eszköz átvitel használata"
STR_FORGET_AND_REMOVE: "Hálózat elfelejtése és mentett jelszó törlése?" STR_FORGET_AND_REMOVE: "Hálózat elfelejtése és mentett jelszó törlése?"
+30 -101
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "File vuoto"
STR_OUT_OF_BOUNDS: "Fuori dai limiti" STR_OUT_OF_BOUNDS: "Fuori dai limiti"
STR_LOADING: "Caricamento..." STR_LOADING: "Caricamento..."
STR_LOADING_POPUP: "Caricamento" STR_LOADING_POPUP: "Caricamento"
STR_WIFI_NETWORKS: "Reti Wi-Fi" STR_WIFI_NETWORKS: "Reti WiFi"
STR_NO_NETWORKS: "Nessuna rete trovata" STR_NO_NETWORKS: "Nessuna rete trovata"
STR_NETWORKS_FOUND: "%zu reti trovate" STR_NETWORKS_FOUND: "%zu reti trovate"
STR_SCANNING: "Scansione..." STR_SCANNING: "Scansione..."
@@ -36,25 +36,25 @@ STR_SAVE_PASSWORD: "Salvare la password?"
STR_PRESS_OK_SCAN: "Premere OK per ripetere scansione" STR_PRESS_OK_SCAN: "Premere OK per ripetere scansione"
STR_JOIN_NETWORK: "Connetti a una rete" STR_JOIN_NETWORK: "Connetti a una rete"
STR_CREATE_HOTSPOT: "Crea Hotspot" STR_CREATE_HOTSPOT: "Crea Hotspot"
STR_JOIN_DESC: "Connessione ad una rete Wi-Fi" STR_JOIN_DESC: "Connessione ad una rete WiFi"
STR_HOTSPOT_DESC: "Creazione di una rete Wi-Fi" STR_HOTSPOT_DESC: "Creazione di una rete WiFi"
STR_STARTING_HOTSPOT: "Avvio Hotspot..." STR_STARTING_HOTSPOT: "Avvio Hotspot..."
STR_HOTSPOT_MODE: "Modalità Hotspot" STR_HOTSPOT_MODE: "Modalità Hotspot"
STR_CONNECT_WIFI_HINT: "Connettere il dispositivo a questa rete Wi-Fi" STR_CONNECT_WIFI_HINT: "Connettere il dispositivo a questa rete WiFi"
STR_OPEN_URL_HINT: "Aprire questo URL nel browser" STR_OPEN_URL_HINT: "Aprire questo URL nel browser"
STR_OR_HTTP_PREFIX: "o http://" STR_OR_HTTP_PREFIX: "o http://"
STR_SCAN_QR_HINT: "oppure scansionare il codice QR col telefono:" STR_SCAN_QR_HINT: "oppure scansionare il codice QR col telefono:"
STR_CALIBRE_WIRELESS: "Calibre wireless" STR_CALIBRE_WIRELESS: "Calibre wireless"
STR_CALIBRE_WEB_URL: "URL OPDS (Calibre)" STR_CALIBRE_WEB_URL: "URL Web Calibre"
STR_NETWORK_LEGEND: "* = Protetta | + = Salvata" STR_NETWORK_LEGEND: "* = Protetta | + = Salvata"
STR_MAC_ADDRESS: "Indirizzo MAC:" STR_MAC_ADDRESS: "Indirizzo MAC:"
STR_CHECKING_WIFI: "Verifica Wi-Fi..." STR_CHECKING_WIFI: "Verifica WiFi..."
STR_ENTER_WIFI_PASSWORD: "Inserire password Wi-Fi" STR_ENTER_WIFI_PASSWORD: "Inserire password WiFi"
STR_TO_PREFIX: "a " STR_TO_PREFIX: "a "
STR_CALIBRE_RECEIVING: "Ricezione: " STR_CALIBRE_RECEIVING: "Ricezione: "
STR_CALIBRE_RECEIVED: "Ricevuto: " STR_CALIBRE_RECEIVED: "Ricevuto: "
STR_CALIBRE_INSTRUCTION_1: "1) Installare il plugin CrossPoint Reader" STR_CALIBRE_INSTRUCTION_1: "1) Installare il plugin CrossPoint Reader"
STR_CALIBRE_INSTRUCTION_2: "2) Collegarsi sulla stessa rete Wi-Fi" STR_CALIBRE_INSTRUCTION_2: "2) Collegarsi sulla stessa rete WiFi"
STR_CALIBRE_INSTRUCTION_3: "3) In Calibre: \"Invia al dispositivo\"" STR_CALIBRE_INSTRUCTION_3: "3) In Calibre: \"Invia al dispositivo\""
STR_CALIBRE_INSTRUCTION_4: "\"Tenere questa schermata aperta durante l'invio\"" STR_CALIBRE_INSTRUCTION_4: "\"Tenere questa schermata aperta durante l'invio\""
STR_CAT_DISPLAY: "Schermo" STR_CAT_DISPLAY: "Schermo"
@@ -70,14 +70,14 @@ STR_IMAGES: "Immagini"
STR_IMAGES_DISPLAY: "Visualizza" STR_IMAGES_DISPLAY: "Visualizza"
STR_IMAGES_PLACEHOLDER: "Segnaposto" STR_IMAGES_PLACEHOLDER: "Segnaposto"
STR_IMAGES_SUPPRESS: "Nascondi" STR_IMAGES_SUPPRESS: "Nascondi"
STR_SHORT_PWR_BTN: "Pressione breve accensione" STR_SHORT_PWR_BTN: "Pressione breve tasto accensione"
STR_ORIENTATION: "Orientamento lettura" STR_ORIENTATION: "Orientamento lettura"
STR_SIDE_BTN_LAYOUT: "Pulsanti laterali (lettore)" STR_SIDE_BTN_LAYOUT: "Pulsanti laterali (lettore)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orienta pulsanti frontali" STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior"
STR_LONG_PRESS_BEHAVIOR: "Pressione lunga"
STR_LONG_PRESS_BEHAVIOR_OFF: "OFF" STR_LONG_PRESS_BEHAVIOR_OFF: "OFF"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Salta capitolo" STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip"
STR_LONG_PRESS_BEHAVIOR_ORIENTATION: "Orientamento" STR_LONG_PRESS_BEHAVIOR_ORIENTATION: "Orientation change"
STR_LONG_PRESS_SKIP: "Pressione lunga: salta capitolo"
STR_FONT_FAMILY: "Font lettore" STR_FONT_FAMILY: "Font lettore"
STR_FONT_SIZE: "Dimensione font lettore" STR_FONT_SIZE: "Dimensione font lettore"
STR_LINE_SPACING: "Interlinea lettore" STR_LINE_SPACING: "Interlinea lettore"
@@ -86,8 +86,6 @@ STR_PARA_ALIGNMENT: "Allineamento paragrafo"
STR_HYPHENATION: "Sillabazione" STR_HYPHENATION: "Sillabazione"
STR_TIME_TO_SLEEP: "Timeout sospensione" STR_TIME_TO_SLEEP: "Timeout sospensione"
STR_SHOW_HIDDEN_FILES: "Mostra file nascosti" STR_SHOW_HIDDEN_FILES: "Mostra file nascosti"
STR_REMOVE_READ_FROM_RECENTS: "Cancella i libri letti dall'elenco dei recenti"
STR_MOVE_FINISHED_TO_READ: "Sposta i libri finiti nella cartella Read"
STR_REFRESH_FREQ: "Frequenza di aggiornamento" STR_REFRESH_FREQ: "Frequenza di aggiornamento"
STR_KOREADER_SYNC: "Sincronizzazione KOReader" STR_KOREADER_SYNC: "Sincronizzazione KOReader"
STR_CHECK_UPDATES: "Cerca aggiornamenti" STR_CHECK_UPDATES: "Cerca aggiornamenti"
@@ -102,8 +100,8 @@ STR_KOREADER_USERNAME: "Nome utente KOReader"
STR_KOREADER_PASSWORD: "Password KOReader" STR_KOREADER_PASSWORD: "Password KOReader"
STR_FILENAME: "Nome file" STR_FILENAME: "Nome file"
STR_BINARY: "Binario" STR_BINARY: "Binario"
STR_SET_CREDENTIALS_FIRST: "Prima le credenziali" STR_SET_CREDENTIALS_FIRST: "Impostare prima le credenziali"
STR_WIFI_CONN_FAILED: "Connessione Wi-Fi non riuscita" STR_WIFI_CONN_FAILED: "Connessione WiFi non riuscita"
STR_AUTHENTICATING: "Autenticazione..." STR_AUTHENTICATING: "Autenticazione..."
STR_AUTH_SUCCESS: "Autenticazione riuscita!" STR_AUTH_SUCCESS: "Autenticazione riuscita!"
STR_KOREADER_AUTH: "Autenticazione KOReader" STR_KOREADER_AUTH: "Autenticazione KOReader"
@@ -122,7 +120,7 @@ STR_CLEAR_CACHE_FAILED: "Impossibile svuotare la cache"
STR_CHECK_SERIAL_OUTPUT: "Controllare l'output seriale per dettagli" STR_CHECK_SERIAL_OUTPUT: "Controllare l'output seriale per dettagli"
STR_DARK: "Scuro" STR_DARK: "Scuro"
STR_LIGHT: "Chiaro" STR_LIGHT: "Chiaro"
STR_CUSTOM: "Sfondo" STR_CUSTOM: "Wallpaper"
STR_COVER: "Copertina" STR_COVER: "Copertina"
STR_NONE_OPT: "Nessuno" STR_NONE_OPT: "Nessuno"
STR_FIT: "Adatta" STR_FIT: "Adatta"
@@ -133,11 +131,10 @@ STR_ALWAYS: "Sempre"
STR_IGNORE: "Ignora" STR_IGNORE: "Ignora"
STR_SLEEP: "Sospendi" STR_SLEEP: "Sospendi"
STR_PAGE_TURN: "Cambio pagina" STR_PAGE_TURN: "Cambio pagina"
STR_FORCE_REFRESH: "Refresh"
STR_PORTRAIT: "Verticale" STR_PORTRAIT: "Verticale"
STR_LANDSCAPE_CW: "Orizzontale Dx" STR_LANDSCAPE_CW: "Orizzontale "
STR_INVERTED: "Capovolto" STR_INVERTED: "Invertito"
STR_LANDSCAPE_CCW: "Orizzontale Sx" STR_LANDSCAPE_CCW: "Orizzontale "
STR_PREV_NEXT: "Prec/Succ" STR_PREV_NEXT: "Prec/Succ"
STR_NEXT_PREV: "Succ/Prec" STR_NEXT_PREV: "Succ/Prec"
STR_NOTO_SERIF: "Noto Serif" STR_NOTO_SERIF: "Noto Serif"
@@ -147,7 +144,7 @@ STR_SMALL: "Piccolo"
STR_MEDIUM: "Medio" STR_MEDIUM: "Medio"
STR_LARGE: "Grande" STR_LARGE: "Grande"
STR_X_LARGE: "Molto grande" STR_X_LARGE: "Molto grande"
STR_TIGHT: "Compatto" STR_TIGHT: "Stretto"
STR_NORMAL: "Normale" STR_NORMAL: "Normale"
STR_WIDE: "Largo" STR_WIDE: "Largo"
STR_JUSTIFY: "Giustificato" STR_JUSTIFY: "Giustificato"
@@ -155,7 +152,6 @@ STR_ALIGN_LEFT: "Sinistra"
STR_CENTER: "Centrato" STR_CENTER: "Centrato"
STR_ALIGN_RIGHT: "Destra" STR_ALIGN_RIGHT: "Destra"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -175,17 +171,14 @@ STR_NO_UPDATE: "Nessun aggiornamento disponibile"
STR_UPDATE_FAILED: "Aggiornamento non riuscito" STR_UPDATE_FAILED: "Aggiornamento non riuscito"
STR_UPDATE_COMPLETE: "Aggiornamento completato" STR_UPDATE_COMPLETE: "Aggiornamento completato"
STR_POWER_ON_HINT: "Tenere premuto il tasto di accensione per riavviare" STR_POWER_ON_HINT: "Tenere premuto il tasto di accensione per riavviare"
STR_RESTARTING_HINT: "Riavvio... se il dispositivo non si accende, tenere premuto il tasto per qualche secondo."
STR_NO_ENTRIES: "Nessuna voce trovata" STR_NO_ENTRIES: "Nessuna voce trovata"
STR_DOWNLOADING: "Download..." STR_DOWNLOADING: "Download..."
STR_DOWNLOAD_FAILED: "Download non riuscito" STR_DOWNLOAD_FAILED: "Download non riuscito"
STR_ERROR_MSG: "Errore:" STR_ERROR_MSG: "Errore:"
STR_UNNAMED: "Senza nome" STR_UNNAMED: "Senza nome"
STR_NO_SERVER_URL: "Nessun server configurato" STR_NO_SERVER_URL: "Nessun Server configurato"
STR_FETCH_FEED_FAILED: "Impossibile recuperare il feed" STR_FETCH_FEED_FAILED: "Impossibile recuperare il feed"
STR_PARSE_FEED_FAILED: "Impossibile analizzare il feed" STR_PARSE_FEED_FAILED: "Impossibile analizzare il feed"
STR_NEXT_PAGE: "Pag. successiva »"
STR_PREV_PAGE: "« Pag. precedente"
STR_NETWORK_PREFIX: "Rete: " STR_NETWORK_PREFIX: "Rete: "
STR_IP_ADDRESS_PREFIX: "Indirizzo IP: " STR_IP_ADDRESS_PREFIX: "Indirizzo IP: "
STR_ERROR_GENERAL_FAILURE: "Errore: operazione non riuscita" STR_ERROR_GENERAL_FAILURE: "Errore: operazione non riuscita"
@@ -233,24 +226,15 @@ STR_EXAMPLE_BOOK: "Titolo del libro"
STR_PREVIEW: "Anteprima" STR_PREVIEW: "Anteprima"
STR_TITLE: "Titolo" STR_TITLE: "Titolo"
STR_BATTERY: "Batteria" STR_BATTERY: "Batteria"
STR_XTC_STATUS_BAR: "Barra di stato XTC"
STR_BOTTOM: "Basso"
STR_TOP: "Alto"
STR_UI_THEME: "Tema interfaccia" STR_UI_THEME: "Tema interfaccia"
STR_THEME_CLASSIC: "Classico" STR_THEME_CLASSIC: "Classico"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_THEME_LYRA_EXTENDED: "Lyra esteso" STR_THEME_LYRA_EXTENDED: "Lyra esteso"
STR_SUNLIGHT_FADING_FIX: "Correzione luce solare" STR_SUNLIGHT_FADING_FIX: "Correzione luce solare"
STR_QUICK_RESUME_TIMEOUT: "Ripresa rapida dopo timeout"
STR_AFTER_TIMEOUT: "Dopo timeout"
STR_REMAP_FRONT_BUTTONS: "Rimappa pulsanti frontali" STR_REMAP_FRONT_BUTTONS: "Rimappa pulsanti frontali"
STR_OPDS_BROWSER: "Browser OPDS" STR_OPDS_BROWSER: "Browser OPDS"
STR_SEARCH: "Cerca"
STR_COVER_CUSTOM: "Copertina + Wallpaper" STR_COVER_CUSTOM: "Copertina + Wallpaper"
STR_QUICK_RESUME: "Ripresa rapida"
STR_MENU_RECENT_BOOKS: "Libri recenti" STR_MENU_RECENT_BOOKS: "Libri recenti"
STR_REMOVE_FROM_RECENTS: "Rimuovere da Libri recenti?"
STR_NO_RECENT_BOOKS: "Nessun libro recente" STR_NO_RECENT_BOOKS: "Nessun libro recente"
STR_CALIBRE_DESC: "Trasferimento wireless con Calibre" STR_CALIBRE_DESC: "Trasferimento wireless con Calibre"
STR_FORGET_AND_REMOVE: "Eliminare la rete e la password salvata?" STR_FORGET_AND_REMOVE: "Eliminare la rete e la password salvata?"
@@ -260,15 +244,15 @@ STR_CALIBRE_SETUP: "Configurazione"
STR_CALIBRE_STATUS: "Stato" STR_CALIBRE_STATUS: "Stato"
STR_CLEAR_BUTTON: "Elimina" STR_CLEAR_BUTTON: "Elimina"
STR_DEFAULT_VALUE: "Predefinito" STR_DEFAULT_VALUE: "Predefinito"
STR_REMAP_PROMPT: "Assegna premendo un pulsante frontale" STR_REMAP_PROMPT: "Premere un pulsante frontale per ogni funzione"
STR_UNASSIGNED: "Non assegnato" STR_UNASSIGNED: "Non assegnato"
STR_ALREADY_ASSIGNED: "Già assegnato" STR_ALREADY_ASSIGNED: "Già assegnato"
STR_REMAP_RESET_HINT: "Laterale Su: ripristina predefiniti" STR_REMAP_RESET_HINT: "Laterale Su: ripristina layout predefinito"
STR_REMAP_CANCEL_HINT: "Laterale Giù: annulla rimappatura" STR_REMAP_CANCEL_HINT: "Laterale Giù: annulla rimappatura"
STR_HW_BACK_LABEL: "Indietro (1° pul.)" STR_HW_BACK_LABEL: "Indietro (1° pulsante)"
STR_HW_CONFIRM_LABEL: "Conferma (2° pul.)" STR_HW_CONFIRM_LABEL: "Conferma (2° pulsante)"
STR_HW_LEFT_LABEL: "Sinistra (3° pul.)" STR_HW_LEFT_LABEL: "Sinistra (3° pulsante)"
STR_HW_RIGHT_LABEL: "Destra (4° pul.)" STR_HW_RIGHT_LABEL: "Destra (4° pulsante)"
STR_GO_TO_PERCENT: "Vai al %" STR_GO_TO_PERCENT: "Vai al %"
STR_GO_HOME_BUTTON: "Vai alla home" STR_GO_HOME_BUTTON: "Vai alla home"
STR_SYNC_PROGRESS: "Sincronizza avanzamento" STR_SYNC_PROGRESS: "Sincronizza avanzamento"
@@ -299,72 +283,17 @@ STR_NO_REMOTE_MSG: "Nessun avanzamento remoto trovato"
STR_UPLOAD_PROMPT: "Inviare la posizione attuale?" STR_UPLOAD_PROMPT: "Inviare la posizione attuale?"
STR_UPLOAD_SUCCESS: "Avanzamenti inviati!" STR_UPLOAD_SUCCESS: "Avanzamenti inviati!"
STR_SYNC_FAILED_MSG: "Sincronizzazione non riuscita" STR_SYNC_FAILED_MSG: "Sincronizzazione non riuscita"
STR_SAVE_PROGRESS_FAILED: "Impossibile salvare avanzamenti" STR_SAVE_PROGRESS_FAILED: "Impossibile salvare il progresso"
STR_SECTION_PREFIX: "Sezione " STR_SECTION_PREFIX: "Sezione "
STR_UPLOAD: "Carica" STR_UPLOAD: "Carica"
STR_BOOK_S_STYLE: "Stile libro" STR_BOOK_S_STYLE: "Stile libro"
STR_EMBEDDED_STYLE: "Stile integrato dell'epub" STR_EMBEDDED_STYLE: "Stile integrato dell'epub"
STR_FOCUS_READING: "Lettura guidata" STR_FOCUS_READING: "Lettura focalizzata"
STR_OPDS_SERVER_URL: "Server OPDS" STR_OPDS_SERVER_URL: "Server OPDS"
STR_SET_SLEEP_COVER: "Imposta copertina"
STR_FOOTNOTES: "Note a piè pagina" STR_FOOTNOTES: "Note a piè pagina"
STR_NO_FOOTNOTES: "Nessuna nota in questa pagina" STR_NO_FOOTNOTES: "Nessuna nota in questa pagina"
STR_LINK: "[link]" STR_LINK: "[link]"
STR_SCREENSHOT_BUTTON: "Screenshot" STR_SCREENSHOT_BUTTON: "Screenshot"
STR_ADD_SERVER: "Aggiungi server"
STR_SERVER_NAME: "Nome server"
STR_NO_SERVERS: "Nessun server OPDS configurato"
STR_DELETE_SERVER: "Elimina server"
STR_DELETE_CONFIRM: "Eliminare questo server?"
STR_OPDS_SERVERS: "Server OPDS"
STR_AUTO_TURN_ENABLED: "Cambio pagina automatico: " STR_AUTO_TURN_ENABLED: "Cambio pagina automatico: "
STR_AUTO_TURN_PAGES_PER_MIN: "Cambio pagina automatico (pag/min)" STR_AUTO_TURN_PAGES_PER_MIN: "Cambio pagina automatico (pag/min)"
STR_MANAGE_FONTS: "Gestisci font" STR_TILT_PAGE_TURN: "Gira pagina con inclinazione"
STR_FONT_BROWSER: "Sfoglia font"
STR_LOADING_FONT_LIST: "Elenco font..."
STR_NO_FONTS_AVAILABLE: "Nessun font disponibile"
STR_FONT_INSTALLED: "Font installato!"
STR_FONT_INSTALL_FAILED: "Installazione font non riuscita"
STR_INSTALLED: "Installato"
STR_CONFIRM_DOWNLOAD_PROMPT: "Scaricare?"
STR_SD_CARD_FULL: "Spazio insufficiente su SD"
STR_FILES_LABEL: "File: "
STR_SIZE_LABEL: "Dimensione: "
STR_REDOWNLOAD: "Scarica di nuovo"
STR_DOWNLOAD_ALL: "Scarica tutto"
STR_UPDATE_ALL: "Aggiorna tutto"
STR_ALL_FONTS_INSTALLED: "Tutti i font installati!"
STR_UPDATE_AVAILABLE: "Aggiorna"
STR_CRASH_TITLE: "Errore di sistema"
STR_CRASH_DESCRIPTION: "Un rapporto dettagliato è stato salvato in crash_report.txt. Includere il file per la segnalazione del problema."
STR_CRASH_REASON: "Causa dell'errore:"
STR_CRASH_NO_REASON: "(Nessuna causa registrata)"
STR_TILT_PAGE_TURN: "Inclina per cambio pagina"
STR_KB_HINT_MOVE_CURSOR: "SINISTRA o DESTRA per spostare il cursore"
STR_KB_HINT_RETURN_CURSOR: "SINISTRA per tornare alla posizione del cursore"
STR_KB_HINT_HIDE_PASSWORD: "Prima DESTRA e poi [***] per nascondere la password"
STR_KB_HINT_SHOW_PASSWORD: "Prima DESTRA e poi [abc] per mostrare la password"
STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Premere [***] per nascondere la password"
STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Premere [abc] per mostrare la password"
STR_KB_HINT_EDIT_ENTRY: "Tieni premuto SU per modificare la voce"
STR_KB_TIPS: "Suggerimenti:"
STR_KB_HINT_RETURN_KEYBOARD: "GIÙ per tornare alla tastiera"
STR_KB_HINT_EXIT_URL_MODE: "ABC per uscire dalla modalità URL"
STR_KB_HINT_CLEAR_TEXT: "Tieni premuto CANC per cancellare tutto"
STR_KB_HINT_SECONDARY_CHAR: "Tieni premuto SELEZ. per carattere secondario"
STR_KB_HINT_UPPER_SECONDARY: "Tieni premuto SELEZ. per MAIUS. o car. secondario"
STR_KB_HINT_LOWER_SECONDARY: "Tieni premuto SELEZ. per minus. o car. secondario"
STR_KB_HINT_URL_SNIPPETS: "Premi l'URL per le anteprime"
STR_SD_FIRMWARE_UPDATE: "Aggiornamento firmware da SD"
STR_SELECT_FIRMWARE_FILE: "Seleziona il firmware (.bin)"
STR_NO_BIN_FILES: "Nessun file .bin trovato"
STR_VALIDATING_FIRMWARE: "Convalida firmware..."
STR_INVALID_FIRMWARE: "File firmware non valido"
STR_FIRMWARE_TOO_LARGE: "Firmware troppo grande"
STR_FIRMWARE_TOO_SMALL: "Firmware troppo piccolo"
STR_FIRMWARE_UPDATE_PROMPT: "Aggiornare il firmware?"
STR_FIRMWARE_FILE_OPEN_FAILED: "Impossibile aprire il file"
STR_FIRMWARE_WRITE_FAILED: "Aggiornamento firmware non riuscito"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Non spegnere il dispositivo!"
STR_RECOVERY_MODE: "Modalità ripristino"
STR_RECOVERY_MODE_HINT: "Metti il firmware.bin nella SD e selezionalo"
+8 -16
View File
@@ -23,7 +23,7 @@ STR_EMPTY_FILE: "Бос файл"
STR_OUT_OF_BOUNDS: "Шектен тыс" STR_OUT_OF_BOUNDS: "Шектен тыс"
STR_LOADING: "Жүктелуде..." STR_LOADING: "Жүктелуде..."
STR_LOADING_POPUP: "Жүктелуде" STR_LOADING_POPUP: "Жүктелуде"
STR_WIFI_NETWORKS: "Wi-Fi желілері" STR_WIFI_NETWORKS: "WiFi желілері"
STR_NO_NETWORKS: "Желілер табылмады" STR_NO_NETWORKS: "Желілер табылмады"
STR_NETWORKS_FOUND: "%zu желі табылды" STR_NETWORKS_FOUND: "%zu желі табылды"
STR_SCANNING: "Іздеуде..." STR_SCANNING: "Іздеуде..."
@@ -35,11 +35,11 @@ STR_SAVE_PASSWORD: "Келесі жолға құпия сөзді сақтау
STR_PRESS_OK_SCAN: "Қайта іздеу үшін OK басыңыз" STR_PRESS_OK_SCAN: "Қайта іздеу үшін OK басыңыз"
STR_JOIN_NETWORK: "Желіге қосылу" STR_JOIN_NETWORK: "Желіге қосылу"
STR_CREATE_HOTSPOT: "Хотспот жасау" STR_CREATE_HOTSPOT: "Хотспот жасау"
STR_JOIN_DESC: "Бар Wi-Fi желісіне қосылу" STR_JOIN_DESC: "Бар WiFi желісіне қосылу"
STR_HOTSPOT_DESC: "Басқалар қоса алатын Wi-Fi желісін жасау" STR_HOTSPOT_DESC: "Басқалар қоса алатын WiFi желісін жасау"
STR_STARTING_HOTSPOT: "Хотспот іске қосылуда..." STR_STARTING_HOTSPOT: "Хотспот іске қосылуда..."
STR_HOTSPOT_MODE: "Хотспот режимі" STR_HOTSPOT_MODE: "Хотспот режимі"
STR_CONNECT_WIFI_HINT: "Құрылғыңызды осы Wi-Fi желісіне қосыңыз" STR_CONNECT_WIFI_HINT: "Құрылғыңызды осы WiFi желісіне қосыңыз"
STR_OPEN_URL_HINT: "Браузерде осы URL мекенжайын ашыңыз" STR_OPEN_URL_HINT: "Браузерде осы URL мекенжайын ашыңыз"
STR_OR_HTTP_PREFIX: "немесе http://" STR_OR_HTTP_PREFIX: "немесе http://"
STR_SCAN_QR_HINT: "немесе телефонмен QR кодын сканерлеңіз:" STR_SCAN_QR_HINT: "немесе телефонмен QR кодын сканерлеңіз:"
@@ -47,13 +47,13 @@ STR_CALIBRE_WIRELESS: "Calibre сымсыз"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Шифрланған | + = Сақталған" STR_NETWORK_LEGEND: "* = Шифрланған | + = Сақталған"
STR_MAC_ADDRESS: "MAC мекенжайы:" STR_MAC_ADDRESS: "MAC мекенжайы:"
STR_CHECKING_WIFI: "Wi-Fi тексерілуде..." STR_CHECKING_WIFI: "WiFi тексерілуде..."
STR_ENTER_WIFI_PASSWORD: "Wi-Fi құпия сөзін енгізіңіз" STR_ENTER_WIFI_PASSWORD: "WiFi құпия сөзін енгізіңіз"
STR_TO_PREFIX: "" STR_TO_PREFIX: ""
STR_CALIBRE_RECEIVING: "Қабылдануда: " STR_CALIBRE_RECEIVING: "Қабылдануда: "
STR_CALIBRE_RECEIVED: "Қабылданды: " STR_CALIBRE_RECEIVED: "Қабылданды: "
STR_CALIBRE_INSTRUCTION_1: "1) CrossPoint Reader плагинін орнатыңыз" STR_CALIBRE_INSTRUCTION_1: "1) CrossPoint Reader плагинін орнатыңыз"
STR_CALIBRE_INSTRUCTION_2: "2) Бір Wi-Fi желісінде болыңыз" STR_CALIBRE_INSTRUCTION_2: "2) Бір WiFi желісінде болыңыз"
STR_CALIBRE_INSTRUCTION_3: "3) Calibre-де: \"Құрылғыға жіберу\"" STR_CALIBRE_INSTRUCTION_3: "3) Calibre-де: \"Құрылғыға жіберу\""
STR_CALIBRE_INSTRUCTION_4: "\"Жіберу кезінде осы экранды ашық ұстаңыз\"" STR_CALIBRE_INSTRUCTION_4: "\"Жіберу кезінде осы экранды ашық ұстаңыз\""
STR_CAT_DISPLAY: "Дисплей" STR_CAT_DISPLAY: "Дисплей"
@@ -68,7 +68,6 @@ STR_TEXT_AA: "Мәтін сырғытпасы"
STR_SHORT_PWR_BTN: "Қуат түймесін қысқа басу" STR_SHORT_PWR_BTN: "Қуат түймесін қысқа басу"
STR_ORIENTATION: "Оқу бағдары" STR_ORIENTATION: "Оқу бағдары"
STR_SIDE_BTN_LAYOUT: "Бүйірлік түймелер орналасуы (оқырман)" STR_SIDE_BTN_LAYOUT: "Бүйірлік түймелер орналасуы (оқырман)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Алдыңғы түймелерді бағдарлау"
STR_LONG_PRESS_SKIP: "Ұзақ басу арқылы тарау өткізу" STR_LONG_PRESS_SKIP: "Ұзақ басу арқылы тарау өткізу"
STR_FONT_FAMILY: "Оқырман қаріп тобы" STR_FONT_FAMILY: "Оқырман қаріп тобы"
STR_FONT_SIZE: "Интерфейс қаріп өлшемі" STR_FONT_SIZE: "Интерфейс қаріп өлшемі"
@@ -77,8 +76,6 @@ STR_SCREEN_MARGIN: "Оқырман экран жиегі"
STR_PARA_ALIGNMENT: "Оқырман абзац туралануы" STR_PARA_ALIGNMENT: "Оқырман абзац туралануы"
STR_HYPHENATION: "Буын бөлу" STR_HYPHENATION: "Буын бөлу"
STR_TIME_TO_SLEEP: "Ұйқы уақыты" STR_TIME_TO_SLEEP: "Ұйқы уақыты"
STR_REMOVE_READ_FROM_RECENTS: "Оқылған кітаптарды соңғылар тізімінен тазалау"
STR_MOVE_FINISHED_TO_READ: "Оқылған кітаптарды Read қалтасына жылжыту"
STR_REFRESH_FREQ: "Жаңарту жиілігі" STR_REFRESH_FREQ: "Жаңарту жиілігі"
STR_KOREADER_SYNC: "KOReader синхронизациясы" STR_KOREADER_SYNC: "KOReader синхронизациясы"
STR_CHECK_UPDATES: "Жаңартуларды тексеру" STR_CHECK_UPDATES: "Жаңартуларды тексеру"
@@ -94,7 +91,7 @@ STR_KOREADER_PASSWORD: "KOReader құпия сөзі"
STR_FILENAME: "Файл аты" STR_FILENAME: "Файл аты"
STR_BINARY: "Бинарлық" STR_BINARY: "Бинарлық"
STR_SET_CREDENTIALS_FIRST: "Алдымен тіркелгі деректерін орнатыңыз" STR_SET_CREDENTIALS_FIRST: "Алдымен тіркелгі деректерін орнатыңыз"
STR_WIFI_CONN_FAILED: "Wi-Fi қосылуы сәтсіз" STR_WIFI_CONN_FAILED: "WiFi қосылуы сәтсіз"
STR_AUTHENTICATING: "Аутентификацияланып жатыр..." STR_AUTHENTICATING: "Аутентификацияланып жатыр..."
STR_AUTH_SUCCESS: "Аутентификация сәтті!" STR_AUTH_SUCCESS: "Аутентификация сәтті!"
STR_KOREADER_AUTH: "KOReader аутентификациясы" STR_KOREADER_AUTH: "KOReader аутентификациясы"
@@ -145,7 +142,6 @@ STR_ALIGN_LEFT: "Солға"
STR_CENTER: "Ортаға" STR_CENTER: "Ортаға"
STR_ALIGN_RIGHT: "Оңға" STR_ALIGN_RIGHT: "Оңға"
STR_MIN_1: "1 мин" STR_MIN_1: "1 мин"
STR_MIN_3: "3 мин"
STR_MIN_5: "5 мин" STR_MIN_5: "5 мин"
STR_MIN_10: "10 мин" STR_MIN_10: "10 мин"
STR_MIN_15: "15 мин" STR_MIN_15: "15 мин"
@@ -207,14 +203,10 @@ STR_THEME_CLASSIC: "Классикалық"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra кеңейтілген" STR_THEME_LYRA_EXTENDED: "Lyra кеңейтілген"
STR_SUNLIGHT_FADING_FIX: "Күн сәулесінен солу түзету" STR_SUNLIGHT_FADING_FIX: "Күн сәулесінен солу түзету"
STR_QUICK_RESUME_TIMEOUT: "Таймауттан кейін жылдам жалғастыру"
STR_AFTER_TIMEOUT: "Таймауттан кейін"
STR_REMAP_FRONT_BUTTONS: "Алдыңғы түймелерді қайта баптау" STR_REMAP_FRONT_BUTTONS: "Алдыңғы түймелерді қайта баптау"
STR_OPDS_BROWSER: "OPDS шолғышы" STR_OPDS_BROWSER: "OPDS шолғышы"
STR_COVER_CUSTOM: "Мұқаба + Өзгертілген" STR_COVER_CUSTOM: "Мұқаба + Өзгертілген"
STR_QUICK_RESUME: "Жылдам жалғастыру"
STR_MENU_RECENT_BOOKS: "Жуырда оқылған кітаптар" STR_MENU_RECENT_BOOKS: "Жуырда оқылған кітаптар"
STR_REMOVE_FROM_RECENTS: "Жуырда оқылған кітаптардан жою?"
STR_NO_RECENT_BOOKS: "Жуырда оқылған кітаптар жоқ" STR_NO_RECENT_BOOKS: "Жуырда оқылған кітаптар жоқ"
STR_CALIBRE_DESC: "Calibre сымсыз тасымалдауын пайдалану" STR_CALIBRE_DESC: "Calibre сымсыз тасымалдауын пайдалану"
STR_FORGET_AND_REMOVE: "Желіні ұмыту және сақталған құпия сөзді жою керек пе?" STR_FORGET_AND_REMOVE: "Желіні ұмыту және сақталған құпия сөзді жою керек пе?"
+8 -16
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Tuščias failas"
STR_OUT_OF_BOUNDS: "Už ribų" STR_OUT_OF_BOUNDS: "Už ribų"
STR_LOADING: "Kraunama..." STR_LOADING: "Kraunama..."
STR_LOADING_POPUP: "Kraunama" STR_LOADING_POPUP: "Kraunama"
STR_WIFI_NETWORKS: "Wi-Fi tinklai" STR_WIFI_NETWORKS: "WiFi tinklai"
STR_NO_NETWORKS: "Tinklų nerasta" STR_NO_NETWORKS: "Tinklų nerasta"
STR_NETWORKS_FOUND: "Rasta: %zu" STR_NETWORKS_FOUND: "Rasta: %zu"
STR_SCANNING: "Ieškoma..." STR_SCANNING: "Ieškoma..."
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Išsaugoti slaptažodį?"
STR_PRESS_OK_SCAN: "Ieškoti iš naujo (OK)" STR_PRESS_OK_SCAN: "Ieškoti iš naujo (OK)"
STR_JOIN_NETWORK: "Prisijungti" STR_JOIN_NETWORK: "Prisijungti"
STR_CREATE_HOTSPOT: "Sukurti prieigą" STR_CREATE_HOTSPOT: "Sukurti prieigą"
STR_JOIN_DESC: "Jungtis prie esamo Wi-Fi" STR_JOIN_DESC: "Jungtis prie esamo WiFi"
STR_HOTSPOT_DESC: "Sukurti Wi-Fi kitiems" STR_HOTSPOT_DESC: "Sukurti WiFi kitiems"
STR_STARTING_HOTSPOT: "Kuriamas ryšys..." STR_STARTING_HOTSPOT: "Kuriamas ryšys..."
STR_HOTSPOT_MODE: "Prieigos režimas" STR_HOTSPOT_MODE: "Prieigos režimas"
STR_CONNECT_WIFI_HINT: "Prijunkite įrenginį prie šio Wi-Fi" STR_CONNECT_WIFI_HINT: "Prijunkite įrenginį prie šio WiFi"
STR_OPEN_URL_HINT: "Atidarykite šį adresą naršyklėje" STR_OPEN_URL_HINT: "Atidarykite šį adresą naršyklėje"
STR_OR_HTTP_PREFIX: "arba http://" STR_OR_HTTP_PREFIX: "arba http://"
STR_SCAN_QR_HINT: "arba nuskaitykite QR kodą:" STR_SCAN_QR_HINT: "arba nuskaitykite QR kodą:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Calibre belaidis"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Užšifruota | + = Išsaugota" STR_NETWORK_LEGEND: "* = Užšifruota | + = Išsaugota"
STR_MAC_ADDRESS: "MAC adresas:" STR_MAC_ADDRESS: "MAC adresas:"
STR_CHECKING_WIFI: "Tikrinamas Wi-Fi..." STR_CHECKING_WIFI: "Tikrinamas WiFi..."
STR_ENTER_WIFI_PASSWORD: "Wi-Fi slaptažodis" STR_ENTER_WIFI_PASSWORD: "WiFi slaptažodis"
STR_TO_PREFIX: "į " STR_TO_PREFIX: "į "
STR_CALIBRE_RECEIVING: "Gaunama: " STR_CALIBRE_RECEIVING: "Gaunama: "
STR_CALIBRE_RECEIVED: "Gauta: " STR_CALIBRE_RECEIVED: "Gauta: "
STR_CALIBRE_INSTRUCTION_1: "1) Įdiekite CrossPoint įskiepį" STR_CALIBRE_INSTRUCTION_1: "1) Įdiekite CrossPoint įskiepį"
STR_CALIBRE_INSTRUCTION_2: "2) Naudokite tą patį Wi-Fi" STR_CALIBRE_INSTRUCTION_2: "2) Naudokite tą patį WiFi"
STR_CALIBRE_INSTRUCTION_3: "3) Calibre: „Send to device“" STR_CALIBRE_INSTRUCTION_3: "3) Calibre: „Send to device“"
STR_CALIBRE_INSTRUCTION_4: "Neišjunkite šio ekrano" STR_CALIBRE_INSTRUCTION_4: "Neišjunkite šio ekrano"
STR_CAT_DISPLAY: "Ekranas" STR_CAT_DISPLAY: "Ekranas"
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Slėpti"
STR_SHORT_PWR_BTN: "Trumpas įjungimo pasp." STR_SHORT_PWR_BTN: "Trumpas įjungimo pasp."
STR_ORIENTATION: "Orientacija" STR_ORIENTATION: "Orientacija"
STR_SIDE_BTN_LAYOUT: "Šoniniai mygtukai" STR_SIDE_BTN_LAYOUT: "Šoniniai mygtukai"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientuoti priekinius mygtukus"
STR_LONG_PRESS_SKIP: "Praleisti skyrių (ilgai)" STR_LONG_PRESS_SKIP: "Praleisti skyrių (ilgai)"
STR_FONT_FAMILY: "Šriftas" STR_FONT_FAMILY: "Šriftas"
STR_FONT_SIZE: "Šrifto dydis" STR_FONT_SIZE: "Šrifto dydis"
@@ -83,8 +82,6 @@ STR_PARA_ALIGNMENT: "Lygiavimas"
STR_HYPHENATION: "Skiemenuoti" STR_HYPHENATION: "Skiemenuoti"
STR_TIME_TO_SLEEP: "Užmigti po" STR_TIME_TO_SLEEP: "Užmigti po"
STR_SHOW_HIDDEN_FILES: "Rod. paslėptus failus" STR_SHOW_HIDDEN_FILES: "Rod. paslėptus failus"
STR_REMOVE_READ_FROM_RECENTS: "Išvalyti perskaitytas knygas iš paskutinių sąrašo"
STR_MOVE_FINISHED_TO_READ: "Perkelti perskaitytas knygas į aplanką Read"
STR_REFRESH_FREQ: "Atnaujinimo dažnis" STR_REFRESH_FREQ: "Atnaujinimo dažnis"
STR_KOREADER_SYNC: "KOReader sinchr." STR_KOREADER_SYNC: "KOReader sinchr."
STR_CHECK_UPDATES: "Atnaujinimai" STR_CHECK_UPDATES: "Atnaujinimai"
@@ -100,7 +97,7 @@ STR_KOREADER_PASSWORD: "KOReader slaptažodis"
STR_FILENAME: "Failas" STR_FILENAME: "Failas"
STR_BINARY: "Dvejetainis" STR_BINARY: "Dvejetainis"
STR_SET_CREDENTIALS_FIRST: "Nustatykite duomenis" STR_SET_CREDENTIALS_FIRST: "Nustatykite duomenis"
STR_WIFI_CONN_FAILED: "Wi-Fi ryšys nutrūko" STR_WIFI_CONN_FAILED: "WiFi ryšys nutrūko"
STR_AUTHENTICATING: "Jungiamasi..." STR_AUTHENTICATING: "Jungiamasi..."
STR_AUTH_SUCCESS: "Prisijungta!" STR_AUTH_SUCCESS: "Prisijungta!"
STR_KOREADER_AUTH: "KOReader Login" STR_KOREADER_AUTH: "KOReader Login"
@@ -151,7 +148,6 @@ STR_ALIGN_LEFT: "Kairė"
STR_CENTER: "Centras" STR_CENTER: "Centras"
STR_ALIGN_RIGHT: "Dešinė" STR_ALIGN_RIGHT: "Dešinė"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -231,14 +227,10 @@ STR_THEME_CLASSIC: "Klasikinė"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra Ext." STR_THEME_LYRA_EXTENDED: "Lyra Ext."
STR_SUNLIGHT_FADING_FIX: "Blyškumo pataisa" STR_SUNLIGHT_FADING_FIX: "Blyškumo pataisa"
STR_QUICK_RESUME_TIMEOUT: "Greitas tęsimas po skirtojo laiko"
STR_AFTER_TIMEOUT: "Po skirtojo laiko"
STR_REMAP_FRONT_BUTTONS: "Keisti mygtukus" STR_REMAP_FRONT_BUTTONS: "Keisti mygtukus"
STR_OPDS_BROWSER: "OPDS naršyklė" STR_OPDS_BROWSER: "OPDS naršyklė"
STR_COVER_CUSTOM: "Viršelis + Kita" STR_COVER_CUSTOM: "Viršelis + Kita"
STR_QUICK_RESUME: "Greitas tęsimas"
STR_MENU_RECENT_BOOKS: "Paskutinės" STR_MENU_RECENT_BOOKS: "Paskutinės"
STR_REMOVE_FROM_RECENTS: "Pašalinti iš paskutinių?"
STR_NO_RECENT_BOOKS: "Paskutinių nėra" STR_NO_RECENT_BOOKS: "Paskutinių nėra"
STR_CALIBRE_DESC: "Calibre belaidis ryšys" STR_CALIBRE_DESC: "Calibre belaidis ryšys"
STR_FORGET_AND_REMOVE: "Pamiršti tinklą?" STR_FORGET_AND_REMOVE: "Pamiršti tinklą?"
+8 -16
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Pusty plik"
STR_OUT_OF_BOUNDS: "Poza granicami" STR_OUT_OF_BOUNDS: "Poza granicami"
STR_LOADING: "Ładowanie..." STR_LOADING: "Ładowanie..."
STR_LOADING_POPUP: "Ładowanie" STR_LOADING_POPUP: "Ładowanie"
STR_WIFI_NETWORKS: "Sieci Wi-Fi" STR_WIFI_NETWORKS: "Sieci WiFi"
STR_NO_NETWORKS: "Nie znaleziono sieci" STR_NO_NETWORKS: "Nie znaleziono sieci"
STR_NETWORKS_FOUND: "Znaleziono %zu sieci" STR_NETWORKS_FOUND: "Znaleziono %zu sieci"
STR_SCANNING: "Skanowanie..." STR_SCANNING: "Skanowanie..."
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Zapisać hasło na przyszłość?"
STR_PRESS_OK_SCAN: "Naciśnij OK aby skanować ponownie" STR_PRESS_OK_SCAN: "Naciśnij OK aby skanować ponownie"
STR_JOIN_NETWORK: "Dołącz do sieci" STR_JOIN_NETWORK: "Dołącz do sieci"
STR_CREATE_HOTSPOT: "Stwórz Hotspot" STR_CREATE_HOTSPOT: "Stwórz Hotspot"
STR_JOIN_DESC: "Podłącz do istniejącej sieci Wi-Fi" STR_JOIN_DESC: "Podłącz do istniejącej sieci WiFi"
STR_HOTSPOT_DESC: "Stwórz sieć Wi-Fi do której podłączyć mogą się inni" STR_HOTSPOT_DESC: "Stwórz sieć WiFi do której podłączyć mogą się inni"
STR_STARTING_HOTSPOT: "Startowanie Hotspota..." STR_STARTING_HOTSPOT: "Startowanie Hotspota..."
STR_HOTSPOT_MODE: "Tryb Hotspot" STR_HOTSPOT_MODE: "Tryb Hotspot"
STR_CONNECT_WIFI_HINT: "Podłącz swoje urządzenie do tej sieci Wi-Fi" STR_CONNECT_WIFI_HINT: "Podłącz swoje urządzenie do tej sieci WiFi"
STR_OPEN_URL_HINT: "Otwórz ten URL w przeglądarce" STR_OPEN_URL_HINT: "Otwórz ten URL w przeglądarce"
STR_OR_HTTP_PREFIX: "albo http://" STR_OR_HTTP_PREFIX: "albo http://"
STR_SCAN_QR_HINT: "albo zeskanuj kod QR telefonem:" STR_SCAN_QR_HINT: "albo zeskanuj kod QR telefonem:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Bezprzewodowe połączenie z Calibre"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Zaszyfrowane | + = Zapisane" STR_NETWORK_LEGEND: "* = Zaszyfrowane | + = Zapisane"
STR_MAC_ADDRESS: "Adres MAC:" STR_MAC_ADDRESS: "Adres MAC:"
STR_CHECKING_WIFI: "Sprawdzanie Wi-Fi..." STR_CHECKING_WIFI: "Sprawdzanie WiFi..."
STR_ENTER_WIFI_PASSWORD: "Wprowadź hasło Wi-Fi" STR_ENTER_WIFI_PASSWORD: "Wprowadź hasło WiFi"
STR_TO_PREFIX: "Z " STR_TO_PREFIX: "Z "
STR_CALIBRE_RECEIVING: "Odbieranie: " STR_CALIBRE_RECEIVING: "Odbieranie: "
STR_CALIBRE_RECEIVED: "Odebrano: " STR_CALIBRE_RECEIVED: "Odebrano: "
STR_CALIBRE_INSTRUCTION_1: "1) Zainstaluj plugin CrossPoint Reader" STR_CALIBRE_INSTRUCTION_1: "1) Zainstaluj plugin CrossPoint Reader"
STR_CALIBRE_INSTRUCTION_2: "2) Bądź w tej samej sieci Wi-Fi" STR_CALIBRE_INSTRUCTION_2: "2) Bądź w tej samej sieci WiFi"
STR_CALIBRE_INSTRUCTION_3: "3) W Calibre: \"Wyślij do urządzenia\"" STR_CALIBRE_INSTRUCTION_3: "3) W Calibre: \"Wyślij do urządzenia\""
STR_CALIBRE_INSTRUCTION_4: "\"Zostaw ten ekran podczas wysyłania\"" STR_CALIBRE_INSTRUCTION_4: "\"Zostaw ten ekran podczas wysyłania\""
STR_CAT_DISPLAY: "Wyświetlacz" STR_CAT_DISPLAY: "Wyświetlacz"
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Pomijaj"
STR_SHORT_PWR_BTN: "Krótkie naciśnięcie zasilania" STR_SHORT_PWR_BTN: "Krótkie naciśnięcie zasilania"
STR_ORIENTATION: "Układ czytania" STR_ORIENTATION: "Układ czytania"
STR_SIDE_BTN_LAYOUT: "Układ przycisków bocznych" STR_SIDE_BTN_LAYOUT: "Układ przycisków bocznych"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientuj przednie przyciski"
STR_LONG_PRESS_BEHAVIOR: "Funkcja długiego przyciśnięcia" STR_LONG_PRESS_BEHAVIOR: "Funkcja długiego przyciśnięcia"
STR_LONG_PRESS_BEHAVIOR_OFF: "Wył." STR_LONG_PRESS_BEHAVIOR_OFF: "Wył."
STR_LONG_PRESS_BEHAVIOR_SKIP: "Przeskocz rozdział" STR_LONG_PRESS_BEHAVIOR_SKIP: "Przeskocz rozdział"
@@ -86,8 +85,6 @@ STR_PARA_ALIGNMENT: "Wyjustowanie paragrafów"
STR_HYPHENATION: "Dzielenie wyrazów" STR_HYPHENATION: "Dzielenie wyrazów"
STR_TIME_TO_SLEEP: "Czas do uśpienia" STR_TIME_TO_SLEEP: "Czas do uśpienia"
STR_SHOW_HIDDEN_FILES: "Pokaż ukryte pliki" STR_SHOW_HIDDEN_FILES: "Pokaż ukryte pliki"
STR_REMOVE_READ_FROM_RECENTS: "Wyczyść przeczytane książki z listy ostatnich"
STR_MOVE_FINISHED_TO_READ: "Przenoś przeczytane książki do folderu Read"
STR_REFRESH_FREQ: "Częstotliwość odświeżania" STR_REFRESH_FREQ: "Częstotliwość odświeżania"
STR_KOREADER_SYNC: "KOReader Sync" STR_KOREADER_SYNC: "KOReader Sync"
STR_CHECK_UPDATES: "Sprawdź uaktualnia" STR_CHECK_UPDATES: "Sprawdź uaktualnia"
@@ -103,7 +100,7 @@ STR_KOREADER_PASSWORD: "Hasło KOReader"
STR_FILENAME: "Nazwa pliku" STR_FILENAME: "Nazwa pliku"
STR_BINARY: "Binary" STR_BINARY: "Binary"
STR_SET_CREDENTIALS_FIRST: "Najpierw ustaw uwierzytelnianie" STR_SET_CREDENTIALS_FIRST: "Najpierw ustaw uwierzytelnianie"
STR_WIFI_CONN_FAILED: "Połączenie z Wi-Fi nieudane" STR_WIFI_CONN_FAILED: "Połączenie z WiFi nieudane"
STR_AUTHENTICATING: "Uwierzytelnianie..." STR_AUTHENTICATING: "Uwierzytelnianie..."
STR_AUTH_SUCCESS: "Pomyślnie uwierzytelniono!" STR_AUTH_SUCCESS: "Pomyślnie uwierzytelniono!"
STR_KOREADER_AUTH: "KOReader Auth" STR_KOREADER_AUTH: "KOReader Auth"
@@ -155,7 +152,6 @@ STR_ALIGN_LEFT: "Lewo"
STR_CENTER: "Środek" STR_CENTER: "Środek"
STR_ALIGN_RIGHT: "Prawo" STR_ALIGN_RIGHT: "Prawo"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -242,15 +238,11 @@ STR_THEME_LYRA: "Lyra"
STR_THEME_ROUNDEDRAFF: "RoundedRaff" STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Przeciwdziałanie blaknięciu od słońca" STR_SUNLIGHT_FADING_FIX: "Przeciwdziałanie blaknięciu od słońca"
STR_QUICK_RESUME_TIMEOUT: "Szybkie wznawianie po czasie"
STR_AFTER_TIMEOUT: "Po upływie czasu"
STR_REMAP_FRONT_BUTTONS: "Skonfiguruj przednie przyciski" STR_REMAP_FRONT_BUTTONS: "Skonfiguruj przednie przyciski"
STR_OPDS_BROWSER: "OPDS Browser" STR_OPDS_BROWSER: "OPDS Browser"
STR_SEARCH: "Szukaj" STR_SEARCH: "Szukaj"
STR_COVER_CUSTOM: "Okładka + Własne" STR_COVER_CUSTOM: "Okładka + Własne"
STR_QUICK_RESUME: "Szybkie wznawianie"
STR_MENU_RECENT_BOOKS: "Ostatnio czytane" STR_MENU_RECENT_BOOKS: "Ostatnio czytane"
STR_REMOVE_FROM_RECENTS: "Usunąć z ostatnio czytanych?"
STR_NO_RECENT_BOOKS: "Brak ostatnio czytanych" STR_NO_RECENT_BOOKS: "Brak ostatnio czytanych"
STR_CALIBRE_DESC: "Przesyłaj bezprzewodowo do Calibre" STR_CALIBRE_DESC: "Przesyłaj bezprzewodowo do Calibre"
STR_FORGET_AND_REMOVE: "Zapomnieć zapisane sieci oraz hasła?" STR_FORGET_AND_REMOVE: "Zapomnieć zapisane sieci oraz hasła?"
+8 -16
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Arquivo vazio"
STR_OUT_OF_BOUNDS: "Fora dos limites" STR_OUT_OF_BOUNDS: "Fora dos limites"
STR_LOADING: "Carregando..." STR_LOADING: "Carregando..."
STR_LOADING_POPUP: "Carregando" STR_LOADING_POPUP: "Carregando"
STR_WIFI_NETWORKS: "Redes Wi-Fi" STR_WIFI_NETWORKS: "Redes WiFi"
STR_NO_NETWORKS: "Sem redes" STR_NO_NETWORKS: "Sem redes"
STR_NETWORKS_FOUND: "%zu redes encontradas" STR_NETWORKS_FOUND: "%zu redes encontradas"
STR_SCANNING: "Procurando..." STR_SCANNING: "Procurando..."
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Salvar senha a próxima vez?"
STR_PRESS_OK_SCAN: "Pressione OK procurar novamente" STR_PRESS_OK_SCAN: "Pressione OK procurar novamente"
STR_JOIN_NETWORK: "Entrar em uma rede" STR_JOIN_NETWORK: "Entrar em uma rede"
STR_CREATE_HOTSPOT: "Criar hotspot" STR_CREATE_HOTSPOT: "Criar hotspot"
STR_JOIN_DESC: "Conecte-se a uma rede Wi-Fi existente" STR_JOIN_DESC: "Conecte-se a uma rede WiFi existente"
STR_HOTSPOT_DESC: "Crie uma rede Wi-Fi para outras pessoas entrarem" STR_HOTSPOT_DESC: "Crie uma rede WiFi outras pessoas entrarem"
STR_STARTING_HOTSPOT: "Iniciando hotspot..." STR_STARTING_HOTSPOT: "Iniciando hotspot..."
STR_HOTSPOT_MODE: "Modo hotspot" STR_HOTSPOT_MODE: "Modo hotspot"
STR_CONNECT_WIFI_HINT: "Conecte seu dispositivo a esta rede Wi-Fi" STR_CONNECT_WIFI_HINT: "Conecte seu dispositivo a esta rede WiFi"
STR_OPEN_URL_HINT: "Abra este URL seu navegador" STR_OPEN_URL_HINT: "Abra este URL seu navegador"
STR_OR_HTTP_PREFIX: "ou http://" STR_OR_HTTP_PREFIX: "ou http://"
STR_SCAN_QR_HINT: "ou escaneie o QR code com seu celular:" STR_SCAN_QR_HINT: "ou escaneie o QR code com seu celular:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Calibre sem fio"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Criptografada | + = Salva" STR_NETWORK_LEGEND: "* = Criptografada | + = Salva"
STR_MAC_ADDRESS: "Endereço MAC:" STR_MAC_ADDRESS: "Endereço MAC:"
STR_CHECKING_WIFI: "Verificando Wi-Fi..." STR_CHECKING_WIFI: "Verificando WiFi..."
STR_ENTER_WIFI_PASSWORD: "Digite a senha Wi-Fi" STR_ENTER_WIFI_PASSWORD: "Digite a senha WiFi"
STR_TO_PREFIX: "para" STR_TO_PREFIX: "para"
STR_CALIBRE_RECEIVING: "Recebendo:" STR_CALIBRE_RECEIVING: "Recebendo:"
STR_CALIBRE_RECEIVED: "Recebido:" STR_CALIBRE_RECEIVED: "Recebido:"
STR_CALIBRE_INSTRUCTION_1: "1) Instale o plugin CrossPoint Reader" STR_CALIBRE_INSTRUCTION_1: "1) Instale o plugin CrossPoint Reader"
STR_CALIBRE_INSTRUCTION_2: "2) Esteja na mesma rede Wi-Fi" STR_CALIBRE_INSTRUCTION_2: "2) Esteja mesma rede WiFi"
STR_CALIBRE_INSTRUCTION_3: "3) No Calibre: \"Enviar o dispositivo\"" STR_CALIBRE_INSTRUCTION_3: "3) No Calibre: \"Enviar o dispositivo\""
STR_CALIBRE_INSTRUCTION_4: "\"Mantenha esta tela aberta durante o envio\"" STR_CALIBRE_INSTRUCTION_4: "\"Mantenha esta tela aberta durante o envio\""
STR_CAT_DISPLAY: "Tela" STR_CAT_DISPLAY: "Tela"
@@ -69,7 +69,6 @@ STR_TEXT_AA: "Suavização de texto"
STR_SHORT_PWR_BTN: "Clique curto botão ligar" STR_SHORT_PWR_BTN: "Clique curto botão ligar"
STR_ORIENTATION: "Orientação de leitura" STR_ORIENTATION: "Orientação de leitura"
STR_SIDE_BTN_LAYOUT: "Disposição botões laterais" STR_SIDE_BTN_LAYOUT: "Disposição botões laterais"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientar botões frontais"
STR_LONG_PRESS_BEHAVIOR: "Comportamento do botão de premir e segurar" STR_LONG_PRESS_BEHAVIOR: "Comportamento do botão de premir e segurar"
STR_LONG_PRESS_BEHAVIOR_OFF: "Desligado" STR_LONG_PRESS_BEHAVIOR_OFF: "Desligado"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítulo" STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítulo"
@@ -81,8 +80,6 @@ STR_SCREEN_MARGIN: "Margens da tela"
STR_PARA_ALIGNMENT: "Alinhamento parágrafo" STR_PARA_ALIGNMENT: "Alinhamento parágrafo"
STR_HYPHENATION: "Hifenização" STR_HYPHENATION: "Hifenização"
STR_TIME_TO_SLEEP: "Tempo para repousar" STR_TIME_TO_SLEEP: "Tempo para repousar"
STR_REMOVE_READ_FROM_RECENTS: "Limpar livros lidos da lista de recentes"
STR_MOVE_FINISHED_TO_READ: "Mover livros lidos para a pasta Read"
STR_REFRESH_FREQ: "Frequência atualização" STR_REFRESH_FREQ: "Frequência atualização"
STR_KOREADER_SYNC: "Sincronização KOReader" STR_KOREADER_SYNC: "Sincronização KOReader"
STR_CHECK_UPDATES: "Verificar atualizações" STR_CHECK_UPDATES: "Verificar atualizações"
@@ -98,7 +95,7 @@ STR_KOREADER_PASSWORD: "Senha do KOReader"
STR_FILENAME: "Nome do arquivo" STR_FILENAME: "Nome do arquivo"
STR_BINARY: "Binário" STR_BINARY: "Binário"
STR_SET_CREDENTIALS_FIRST: "Defina as credenciais primeiro" STR_SET_CREDENTIALS_FIRST: "Defina as credenciais primeiro"
STR_WIFI_CONN_FAILED: "Falha na conexão Wi-Fi" STR_WIFI_CONN_FAILED: "Falha na conexão WiFi"
STR_AUTHENTICATING: "Autenticando..." STR_AUTHENTICATING: "Autenticando..."
STR_AUTH_SUCCESS: "Autenticado com sucesso!" STR_AUTH_SUCCESS: "Autenticado com sucesso!"
STR_KOREADER_AUTH: "Autenticação KOReader" STR_KOREADER_AUTH: "Autenticação KOReader"
@@ -149,7 +146,6 @@ STR_ALIGN_LEFT: "Esquerda"
STR_CENTER: "Centralizar" STR_CENTER: "Centralizar"
STR_ALIGN_RIGHT: "Direita" STR_ALIGN_RIGHT: "Direita"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -212,14 +208,10 @@ STR_THEME_LYRA: "Lyra"
STR_THEME_ROUNDEDRAFF: "RoundedRaff" STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Ajuste desbotamento ao sol" STR_SUNLIGHT_FADING_FIX: "Ajuste desbotamento ao sol"
STR_QUICK_RESUME_TIMEOUT: "Retomada rápida após tempo limite"
STR_AFTER_TIMEOUT: "Após tempo limite"
STR_REMAP_FRONT_BUTTONS: "Remapear botões frontais" STR_REMAP_FRONT_BUTTONS: "Remapear botões frontais"
STR_OPDS_BROWSER: "Navegador OPDS" STR_OPDS_BROWSER: "Navegador OPDS"
STR_COVER_CUSTOM: "Capa + personalizado" STR_COVER_CUSTOM: "Capa + personalizado"
STR_QUICK_RESUME: "Retomada rápida"
STR_MENU_RECENT_BOOKS: "Livros recentes" STR_MENU_RECENT_BOOKS: "Livros recentes"
STR_REMOVE_FROM_RECENTS: "Remover dos Livros recentes?"
STR_NO_RECENT_BOOKS: "Sem livros recentes" STR_NO_RECENT_BOOKS: "Sem livros recentes"
STR_CALIBRE_DESC: "Usar transferências sem fio Calibre" STR_CALIBRE_DESC: "Usar transferências sem fio Calibre"
STR_FORGET_AND_REMOVE: "Esquecer a rede e remover a senha salva?" STR_FORGET_AND_REMOVE: "Esquecer a rede e remover a senha salva?"
+8 -16
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Fişier gol"
STR_OUT_OF_BOUNDS: "Eroare: În afara limitelor" STR_OUT_OF_BOUNDS: "Eroare: În afara limitelor"
STR_LOADING: "Se încarcă..." STR_LOADING: "Se încarcă..."
STR_LOADING_POPUP: "Se încarcă..." STR_LOADING_POPUP: "Se încarcă..."
STR_WIFI_NETWORKS: "Reţele Wi-Fi" STR_WIFI_NETWORKS: "Reţele WiFi"
STR_NO_NETWORKS: "Nu s-au găsit reţele" STR_NO_NETWORKS: "Nu s-au găsit reţele"
STR_NETWORKS_FOUND: "%zu reţele găsite" STR_NETWORKS_FOUND: "%zu reţele găsite"
STR_SCANNING: "Scanează..." STR_SCANNING: "Scanează..."
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Salvaţi parola?"
STR_PRESS_OK_SCAN: "Apăsaţi OK pentru a scana din nou" STR_PRESS_OK_SCAN: "Apăsaţi OK pentru a scana din nou"
STR_JOIN_NETWORK: "Conectaţi-vă la o reţea" STR_JOIN_NETWORK: "Conectaţi-vă la o reţea"
STR_CREATE_HOTSPOT: "Creaţi un hotspot" STR_CREATE_HOTSPOT: "Creaţi un hotspot"
STR_JOIN_DESC: "Conectaţi-vă la o reţea Wi-Fi existentă" STR_JOIN_DESC: "Conectaţi-vă la o reţea WiFi existentă"
STR_HOTSPOT_DESC: "Creaţi un hotspot Wi-Fi" STR_HOTSPOT_DESC: "Creaţi un hotspot WiFi"
STR_STARTING_HOTSPOT: "Hotspot porneşte..." STR_STARTING_HOTSPOT: "Hotspot porneşte..."
STR_HOTSPOT_MODE: "Mod Hotspot" STR_HOTSPOT_MODE: "Mod Hotspot"
STR_CONNECT_WIFI_HINT: "Conectaţi-vă dispozitivul la această reţea Wi-Fi" STR_CONNECT_WIFI_HINT: "Conectaţi-vă dispozitivul la această reţea WiFi"
STR_OPEN_URL_HINT: "Deschideţi acest URL în browserul dvs." STR_OPEN_URL_HINT: "Deschideţi acest URL în browserul dvs."
STR_OR_HTTP_PREFIX: "sau http://" STR_OR_HTTP_PREFIX: "sau http://"
STR_SCAN_QR_HINT: "sau scanaţi codul QR cu telefonul dvs.:" STR_SCAN_QR_HINT: "sau scanaţi codul QR cu telefonul dvs.:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Calibre Wireless"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Criptat | + = Salvat" STR_NETWORK_LEGEND: "* = Criptat | + = Salvat"
STR_MAC_ADDRESS: "Adresă MAC:" STR_MAC_ADDRESS: "Adresă MAC:"
STR_CHECKING_WIFI: "Verificare Wi-Fi..." STR_CHECKING_WIFI: "Verificare WiFi..."
STR_ENTER_WIFI_PASSWORD: "Introduceţi parola Wi-Fi" STR_ENTER_WIFI_PASSWORD: "Introduceţi parola WiFi"
STR_TO_PREFIX: "la " STR_TO_PREFIX: "la "
STR_CALIBRE_RECEIVING: "Se primeşte: " STR_CALIBRE_RECEIVING: "Se primeşte: "
STR_CALIBRE_RECEIVED: "Primite: " STR_CALIBRE_RECEIVED: "Primite: "
STR_CALIBRE_INSTRUCTION_1: "1) Instalaţi plugin-ul CrossPoint Reader" STR_CALIBRE_INSTRUCTION_1: "1) Instalaţi plugin-ul CrossPoint Reader"
STR_CALIBRE_INSTRUCTION_2: "2) Fiţi în aceeaşi reţea Wi-Fi" STR_CALIBRE_INSTRUCTION_2: "2) Fiţi în aceeaşi reţea WiFi"
STR_CALIBRE_INSTRUCTION_3: "3) În Calibre: \"Trimiteţi la dispozitiv\"" STR_CALIBRE_INSTRUCTION_3: "3) În Calibre: \"Trimiteţi la dispozitiv\""
STR_CALIBRE_INSTRUCTION_4: "\"Păstraţi acest ecran deschis în timpul trimiterii\"" STR_CALIBRE_INSTRUCTION_4: "\"Păstraţi acest ecran deschis în timpul trimiterii\""
STR_CAT_DISPLAY: "Ecran" STR_CAT_DISPLAY: "Ecran"
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Suprimare"
STR_SHORT_PWR_BTN: "Apăsare scurtă întrerupător" STR_SHORT_PWR_BTN: "Apăsare scurtă întrerupător"
STR_ORIENTATION: "Orientare lectură" STR_ORIENTATION: "Orientare lectură"
STR_SIDE_BTN_LAYOUT: "Aspect butoane laterale (lectură)" STR_SIDE_BTN_LAYOUT: "Aspect butoane laterale (lectură)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientare butoane frontale"
STR_LONG_PRESS_BEHAVIOR: "Comportament buton apăsat lung" STR_LONG_PRESS_BEHAVIOR: "Comportament buton apăsat lung"
STR_LONG_PRESS_BEHAVIOR_OFF: "Dezactivat" STR_LONG_PRESS_BEHAVIOR_OFF: "Dezactivat"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Sărire capitol" STR_LONG_PRESS_BEHAVIOR_SKIP: "Sărire capitol"
@@ -86,8 +85,6 @@ STR_PARA_ALIGNMENT: "Aliniere paragrafe reader"
STR_HYPHENATION: "Silabisire" STR_HYPHENATION: "Silabisire"
STR_TIME_TO_SLEEP: "Timp până la repaus" STR_TIME_TO_SLEEP: "Timp până la repaus"
STR_SHOW_HIDDEN_FILES: "Afişează fişierele ascunse" STR_SHOW_HIDDEN_FILES: "Afişează fişierele ascunse"
STR_REMOVE_READ_FROM_RECENTS: "Șterge cărțile citite din lista de recente"
STR_MOVE_FINISHED_TO_READ: "Mută cărţile terminate în folderul Read"
STR_REFRESH_FREQ: "Frecvenţă reîmprospătare" STR_REFRESH_FREQ: "Frecvenţă reîmprospătare"
STR_KOREADER_SYNC: "Sincronizare KOReader" STR_KOREADER_SYNC: "Sincronizare KOReader"
STR_CHECK_UPDATES: "Căutaţi actualizări" STR_CHECK_UPDATES: "Căutaţi actualizări"
@@ -103,7 +100,7 @@ STR_KOREADER_PASSWORD: "Parolă KOReader"
STR_FILENAME: "Nume fişier" STR_FILENAME: "Nume fişier"
STR_BINARY: "Fişier binar" STR_BINARY: "Fişier binar"
STR_SET_CREDENTIALS_FIRST: "Vă rugăm să setaţi mai întâi acreditările" STR_SET_CREDENTIALS_FIRST: "Vă rugăm să setaţi mai întâi acreditările"
STR_WIFI_CONN_FAILED: "Conexiune Wi-Fi eşuată" STR_WIFI_CONN_FAILED: "Conexiune WiFi eşuată"
STR_AUTHENTICATING: "Se autentifică..." STR_AUTHENTICATING: "Se autentifică..."
STR_AUTH_SUCCESS: "Autentificare reuşită!" STR_AUTH_SUCCESS: "Autentificare reuşită!"
STR_KOREADER_AUTH: "Autentificare KOReader" STR_KOREADER_AUTH: "Autentificare KOReader"
@@ -154,7 +151,6 @@ STR_ALIGN_LEFT: "Stânga"
STR_CENTER: "Centru" STR_CENTER: "Centru"
STR_ALIGN_RIGHT: "Dreapta" STR_ALIGN_RIGHT: "Dreapta"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -234,14 +230,10 @@ STR_THEME_CLASSIC: "Clasic"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Corecţie estompare lumină" STR_SUNLIGHT_FADING_FIX: "Corecţie estompare lumină"
STR_QUICK_RESUME_TIMEOUT: "Reluare rapidă la timeout"
STR_AFTER_TIMEOUT: "După timeout"
STR_REMAP_FRONT_BUTTONS: "Remapare butoane frontale" STR_REMAP_FRONT_BUTTONS: "Remapare butoane frontale"
STR_OPDS_BROWSER: "Browser OPDS" STR_OPDS_BROWSER: "Browser OPDS"
STR_COVER_CUSTOM: "Copertă + Personalizat" STR_COVER_CUSTOM: "Copertă + Personalizat"
STR_QUICK_RESUME: "Reluare rapidă"
STR_MENU_RECENT_BOOKS: "Cărţi recente" STR_MENU_RECENT_BOOKS: "Cărţi recente"
STR_REMOVE_FROM_RECENTS: "Eliminați din Cărţi recente?"
STR_NO_RECENT_BOOKS: "Nicio carte recentă" STR_NO_RECENT_BOOKS: "Nicio carte recentă"
STR_CALIBRE_DESC: "Utilizaţi transferurile wireless ale dispozitivului Calibre" STR_CALIBRE_DESC: "Utilizaţi transferurile wireless ale dispozitivului Calibre"
STR_FORGET_AND_REMOVE: "Uitaţi reţeaua şi eliminaţi parola salvată?" STR_FORGET_AND_REMOVE: "Uitaţi reţeaua şi eliminaţi parola salvată?"
+7 -72
View File
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Скрыть"
STR_SHORT_PWR_BTN: "Короткое нажатие PWR" STR_SHORT_PWR_BTN: "Короткое нажатие PWR"
STR_ORIENTATION: "Ориентация чтения" STR_ORIENTATION: "Ориентация чтения"
STR_SIDE_BTN_LAYOUT: "Боковые кнопки" STR_SIDE_BTN_LAYOUT: "Боковые кнопки"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Ориентировать передние кнопки"
STR_LONG_PRESS_BEHAVIOR: "Долгое нажатие" STR_LONG_PRESS_BEHAVIOR: "Долгое нажатие"
STR_LONG_PRESS_BEHAVIOR_OFF: "Ничего" STR_LONG_PRESS_BEHAVIOR_OFF: "Ничего"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Пропуск главы" STR_LONG_PRESS_BEHAVIOR_SKIP: "Пропуск главы"
@@ -86,8 +85,6 @@ STR_PARA_ALIGNMENT: "Выравнивание абзаца"
STR_HYPHENATION: "Перенос слов" STR_HYPHENATION: "Перенос слов"
STR_TIME_TO_SLEEP: "Сон через" STR_TIME_TO_SLEEP: "Сон через"
STR_SHOW_HIDDEN_FILES: "Показать скрытые файлы" STR_SHOW_HIDDEN_FILES: "Показать скрытые файлы"
STR_REMOVE_READ_FROM_RECENTS: "Очищать прочитанные книги из списка недавних"
STR_MOVE_FINISHED_TO_READ: "Перемещать прочитанные книги в папку Read"
STR_REFRESH_FREQ: "Частота обновления" STR_REFRESH_FREQ: "Частота обновления"
STR_KOREADER_SYNC: "Синхронизация KOReader" STR_KOREADER_SYNC: "Синхронизация KOReader"
STR_CHECK_UPDATES: "Проверить обновления" STR_CHECK_UPDATES: "Проверить обновления"
@@ -133,7 +130,6 @@ STR_ALWAYS: "Всегда"
STR_IGNORE: "Игнорировать" STR_IGNORE: "Игнорировать"
STR_SLEEP: "Сон" STR_SLEEP: "Сон"
STR_PAGE_TURN: "Перелистывание" STR_PAGE_TURN: "Перелистывание"
STR_FORCE_REFRESH: "Обновление экрана"
STR_PORTRAIT: "Портрет" STR_PORTRAIT: "Портрет"
STR_LANDSCAPE_CW: "Ландшафт (CW)" STR_LANDSCAPE_CW: "Ландшафт (CW)"
STR_INVERTED: "Инверсия" STR_INVERTED: "Инверсия"
@@ -155,7 +151,6 @@ STR_ALIGN_LEFT: "По левому краю"
STR_CENTER: "По центру" STR_CENTER: "По центру"
STR_ALIGN_RIGHT: "По правому краю" STR_ALIGN_RIGHT: "По правому краю"
STR_MIN_1: "1 мин" STR_MIN_1: "1 мин"
STR_MIN_3: "3 мин"
STR_MIN_5: "5 мин" STR_MIN_5: "5 мин"
STR_MIN_10: "10 мин" STR_MIN_10: "10 мин"
STR_MIN_15: "15 мин" STR_MIN_15: "15 мин"
@@ -175,7 +170,6 @@ STR_NO_UPDATE: "Обновлений нет"
STR_UPDATE_FAILED: "Ошибка обновления" STR_UPDATE_FAILED: "Ошибка обновления"
STR_UPDATE_COMPLETE: "Обновление завершено" STR_UPDATE_COMPLETE: "Обновление завершено"
STR_POWER_ON_HINT: "Удерживайте кнопку питания для включения" STR_POWER_ON_HINT: "Удерживайте кнопку питания для включения"
STR_RESTARTING_HINT: "Перезапуск... Если устройство не перезагружается, удерживайте кнопку питания несколько секунд"
STR_NO_ENTRIES: "Записи не найдены" STR_NO_ENTRIES: "Записи не найдены"
STR_DOWNLOADING: "Загрузка..." STR_DOWNLOADING: "Загрузка..."
STR_DOWNLOAD_FAILED: "Ошибка загрузки" STR_DOWNLOAD_FAILED: "Ошибка загрузки"
@@ -184,8 +178,6 @@ STR_UNNAMED: "Без имени"
STR_NO_SERVER_URL: "URL сервера не настроен" STR_NO_SERVER_URL: "URL сервера не настроен"
STR_FETCH_FEED_FAILED: "Не удалось получить ленту" STR_FETCH_FEED_FAILED: "Не удалось получить ленту"
STR_PARSE_FEED_FAILED: "Не удалось обработать ленту" STR_PARSE_FEED_FAILED: "Не удалось обработать ленту"
STR_NEXT_PAGE: "Следующая страница »"
STR_PREV_PAGE: "« Предыдущая страница"
STR_NETWORK_PREFIX: "Сеть: " STR_NETWORK_PREFIX: "Сеть: "
STR_IP_ADDRESS_PREFIX: "IP-адрес: " STR_IP_ADDRESS_PREFIX: "IP-адрес: "
STR_ERROR_GENERAL_FAILURE: "Ошибка: Общая ошибка" STR_ERROR_GENERAL_FAILURE: "Ошибка: Общая ошибка"
@@ -233,24 +225,19 @@ STR_EXAMPLE_BOOK: "Название книги"
STR_PREVIEW: "Предпросмотр" STR_PREVIEW: "Предпросмотр"
STR_TITLE: "Заглавие" STR_TITLE: "Заглавие"
STR_BATTERY: "Батарея" STR_BATTERY: "Батарея"
STR_XTC_STATUS_BAR: "Строка состояния XTC"
STR_BOTTOM: "Низ"
STR_TOP: "Верх"
STR_UI_THEME: "Тема интерфейса" STR_UI_THEME: "Тема интерфейса"
STR_THEME_CLASSIC: "Классическая" STR_THEME_CLASSIC: "Классическая"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_ROUNDEDRAFF: "RoundedRaff" STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Компенсация выцветания" STR_SUNLIGHT_FADING_FIX: "Компенсация выцветания"
STR_QUICK_RESUME_TIMEOUT: "Быстрое возобновление по таймауту"
STR_AFTER_TIMEOUT: "По таймауту"
STR_REMAP_FRONT_BUTTONS: "Переназначить передние кнопки" STR_REMAP_FRONT_BUTTONS: "Переназначить передние кнопки"
STR_OPDS_BROWSER: "OPDS браузер" STR_OPDS_BROWSER: "OPDS браузер"
STR_SEARCH: оиск" STR_FOOTNOTES: римечания"
STR_NO_FOOTNOTES: "На данной странице нет примечаний"
STR_LINK: "[ссылка]"
STR_COVER_CUSTOM: "Обложка + Свой" STR_COVER_CUSTOM: "Обложка + Свой"
STR_QUICK_RESUME: "Быстрое возобновление"
STR_MENU_RECENT_BOOKS: "Недавние книги" STR_MENU_RECENT_BOOKS: "Недавние книги"
STR_REMOVE_FROM_RECENTS: "Удалить из недавних книг?"
STR_NO_RECENT_BOOKS: "Нет недавних книг" STR_NO_RECENT_BOOKS: "Нет недавних книг"
STR_CALIBRE_DESC: "Использовать беспроводную передачу Calibre" STR_CALIBRE_DESC: "Использовать беспроводную передачу Calibre"
STR_FORGET_AND_REMOVE: "Забыть сеть и удалить сохранённый пароль?" STR_FORGET_AND_REMOVE: "Забыть сеть и удалить сохранённый пароль?"
@@ -274,8 +261,8 @@ STR_GO_HOME_BUTTON: "На главную"
STR_SYNC_PROGRESS: "Синхронизировать прогресс" STR_SYNC_PROGRESS: "Синхронизировать прогресс"
STR_DELETE_CACHE: "Удалить кэш книги" STR_DELETE_CACHE: "Удалить кэш книги"
STR_DELETE: "Удалить" STR_DELETE: "Удалить"
STR_DISPLAY_QR: "Показать страницу в виде QR-кода"
STR_CHAPTER_PREFIX: "Глава: " STR_CHAPTER_PREFIX: "Глава: "
STR_DISPLAY_QR: "Показать страницу в виде QR-кода"
STR_PAGES_SEPARATOR: " стр. | " STR_PAGES_SEPARATOR: " стр. | "
STR_BOOK_PREFIX: "Книга: " STR_BOOK_PREFIX: "Книга: "
STR_CALIBRE_URL_HINT: "Для Calibre добавьте /opds к URL" STR_CALIBRE_URL_HINT: "Для Calibre добавьте /opds к URL"
@@ -306,65 +293,13 @@ STR_BOOK_S_STYLE: "Стиль книги"
STR_EMBEDDED_STYLE: "Встроенный стиль" STR_EMBEDDED_STYLE: "Встроенный стиль"
STR_FOCUS_READING: "Фокусное чтение" STR_FOCUS_READING: "Фокусное чтение"
STR_OPDS_SERVER_URL: "URL OPDS сервера" STR_OPDS_SERVER_URL: "URL OPDS сервера"
STR_SET_SLEEP_COVER: "Обложкой"
STR_FOOTNOTES: "Примечания"
STR_NO_FOOTNOTES: "На данной странице нет примечаний"
STR_LINK: "[ссылка]"
STR_SCREENSHOT_BUTTON: "Сделать снимок экрана" STR_SCREENSHOT_BUTTON: "Сделать снимок экрана"
STR_AUTO_TURN_ENABLED: "Автоперелистывание: "
STR_AUTO_TURN_PAGES_PER_MIN: "Автоперелистывание (стр./мин)"
STR_TILT_PAGE_TURN: "Перелистывание наклоном"
STR_ADD_SERVER: "Добавить сервер" STR_ADD_SERVER: "Добавить сервер"
STR_SERVER_NAME: "Имя сервера" STR_SERVER_NAME: "Имя сервера"
STR_NO_SERVERS: "Нет настроенных серверов OPDS" STR_NO_SERVERS: "Нет настроенных серверов OPDS"
STR_DELETE_SERVER: "Удалить сервер" STR_DELETE_SERVER: "Удалить сервер"
STR_DELETE_CONFIRM: "Удалить этот сервер?" STR_DELETE_CONFIRM: "Удалить этот сервер?"
STR_OPDS_SERVERS: "Серверы OPDS" STR_OPDS_SERVERS: "Серверы OPDS"
STR_AUTO_TURN_ENABLED: "Автоперелистывание: "
STR_AUTO_TURN_PAGES_PER_MIN: "Автоперелистывание (стр./мин)"
STR_MANAGE_FONTS: "Управление шрифтами"
STR_FONT_BROWSER: "Обзор шрифтов"
STR_LOADING_FONT_LIST: "Загрузка списка шрифтов..."
STR_NO_FONTS_AVAILABLE: "Шрифты недоступны"
STR_FONT_INSTALLED: "Шрифт установлен!"
STR_FONT_INSTALL_FAILED: "Не удалоь установить шрифт"
STR_INSTALLED: "Установлен"
STR_CONFIRM_DOWNLOAD_PROMPT: "Загрузить?"
STR_SD_CARD_FULL: "Недостаточно места на SD-карте"
STR_FILES_LABEL: "Файлы: "
STR_SIZE_LABEL: "Размер: "
STR_REDOWNLOAD: "Скачать снова"
STR_DOWNLOAD_ALL: "Загрузить все"
STR_UPDATE_ALL: "Обновить всё"
STR_ALL_FONTS_INSTALLED: "Все шрифты установлены!"
STR_UPDATE_AVAILABLE: "Обновить"
STR_CRASH_TITLE: "Сбой системы"
STR_CRASH_DESCRIPTION: "Подробный отчёт сохранён в crash_report.txt. Пожалуйста, приложите этот файл к вашему отчёту об ошибке."
STR_CRASH_REASON: "Причина сбоя:"
STR_CRASH_NO_REASON: "(Причина не указана)"
STR_TILT_PAGE_TURN: "Перелистывание наклоном"
STR_KB_HINT_MOVE_CURSOR: "Нажмите ВЛЕВО или ВПРАВО для перемещения курсора"
STR_KB_HINT_RETURN_CURSOR: "Нажмите ВЛЕВО, чтобы вернуться к позиции курсора"
STR_KB_HINT_HIDE_PASSWORD: "Удерживайте ВПРАВО, затем нажмите [***], чтобы скрыть пароль"
STR_KB_HINT_SHOW_PASSWORD: "Удерживайте ВПРАВО, затем нажмите [abc], чтобы показать пароль"
STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Нажмите [***], чтобы скрыть пароль"
STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Нажмите [abc], чтобы показать пароль"
STR_KB_HINT_EDIT_ENTRY: "Удерживайте ВВЕРХ для редактирования записи"
STR_KB_TIPS: "Подсказки:"
STR_KB_HINT_RETURN_KEYBOARD: "Нажмите ВНИЗ, чтобы вернуться к клавиатуре"
STR_KB_HINT_EXIT_URL_MODE: "Нажмите ABC для выхода из режима URL"
STR_KB_HINT_CLEAR_TEXT: "Удерживайте <— чтобы очитисть весь текст"
STR_KB_HINT_SECONDARY_CHAR: "Удерживайте ВЫБРАТЬ для дополнительного символа"
STR_KB_HINT_UPPER_SECONDARY: "Удерживайте ВЫБРАТЬ для ВЕРХНЕГО РЕГИСТРА или дополнительного символа"
STR_KB_HINT_LOWER_SECONDARY: "Удерживайте ВЫБРАТЬ для нижнего регистра или дополнительного символа"
STR_KB_HINT_URL_SNIPPETS: "Нажмите URL для выбора шаблонов"
STR_SD_FIRMWARE_UPDATE: "Обновление системы с SD-карты"
STR_SELECT_FIRMWARE_FILE: "Выберите файл прошивки (.bin)"
STR_NO_BIN_FILES: ".bin файлы не найдены"
STR_VALIDATING_FIRMWARE: "Проверка файла прошивки..."
STR_INVALID_FIRMWARE: "Не подходящий файл прошивки"
STR_FIRMWARE_TOO_LARGE: "Прошивка слишком велика для раздела"
STR_FIRMWARE_TOO_SMALL: "Файл прошивки слишком мал"
STR_FIRMWARE_UPDATE_PROMPT: "Обновить прошивку?"
STR_FIRMWARE_FILE_OPEN_FAILED: "Не могу открыть файл"
STR_FIRMWARE_WRITE_FAILED: "Ошибка записи прошивки"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "Не выключайте питание!"
STR_RECOVERY_MODE: "Режим восстановления"
STR_RECOVERY_MODE_HINT: "Поместите firmware.bin в корень SD-карты и выберите его"
+8 -16
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Prazna datoteka"
STR_OUT_OF_BOUNDS: "Izven meja" STR_OUT_OF_BOUNDS: "Izven meja"
STR_LOADING: "Nalaganje..." STR_LOADING: "Nalaganje..."
STR_LOADING_POPUP: "Nalaganje" STR_LOADING_POPUP: "Nalaganje"
STR_WIFI_NETWORKS: "Wi-Fi omrežja" STR_WIFI_NETWORKS: "WiFi omrežja"
STR_NO_NETWORKS: "Ni najdenih omrežij" STR_NO_NETWORKS: "Ni najdenih omrežij"
STR_NETWORKS_FOUND: "Najdenih omrežij: %zu" STR_NETWORKS_FOUND: "Najdenih omrežij: %zu"
STR_SCANNING: "Iskanje..." STR_SCANNING: "Iskanje..."
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Shranim geslo za naslednjič?"
STR_PRESS_OK_SCAN: "Pritisni OK za ponovno iskanje" STR_PRESS_OK_SCAN: "Pritisni OK za ponovno iskanje"
STR_JOIN_NETWORK: "Poveži se v omrežje" STR_JOIN_NETWORK: "Poveži se v omrežje"
STR_CREATE_HOTSPOT: "Ustvari dostopno točko" STR_CREATE_HOTSPOT: "Ustvari dostopno točko"
STR_JOIN_DESC: "Poveži se v obstoječe Wi-Fi omrežje" STR_JOIN_DESC: "Poveži se v obstoječe WiFi omrežje"
STR_HOTSPOT_DESC: "Ustvari Wi-Fi omrežje, v katerega se lahko povežejo drugi" STR_HOTSPOT_DESC: "Ustvari WiFi omrežje, v katerega se lahko povežejo drugi"
STR_STARTING_HOTSPOT: "Zaganjanje dostopne točke..." STR_STARTING_HOTSPOT: "Zaganjanje dostopne točke..."
STR_HOTSPOT_MODE: "Način dostopne točke" STR_HOTSPOT_MODE: "Način dostopne točke"
STR_CONNECT_WIFI_HINT: "Poveži svojo napravo v to Wi-Fi omrežje" STR_CONNECT_WIFI_HINT: "Poveži svojo napravo v to WiFi omrežje"
STR_OPEN_URL_HINT: "Odpri ta URL v svojem brskalniku" STR_OPEN_URL_HINT: "Odpri ta URL v svojem brskalniku"
STR_OR_HTTP_PREFIX: "ali http://" STR_OR_HTTP_PREFIX: "ali http://"
STR_SCAN_QR_HINT: "ali skeniraj QR kodo s telefonom:" STR_SCAN_QR_HINT: "ali skeniraj QR kodo s telefonom:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Brezžični Calibre"
STR_CALIBRE_WEB_URL: "Calibre Web URL" STR_CALIBRE_WEB_URL: "Calibre Web URL"
STR_NETWORK_LEGEND: "* = Šifrirano | + = Shranjeno" STR_NETWORK_LEGEND: "* = Šifrirano | + = Shranjeno"
STR_MAC_ADDRESS: "MAC naslov:" STR_MAC_ADDRESS: "MAC naslov:"
STR_CHECKING_WIFI: "Preverjanje Wi-Fi-ja..." STR_CHECKING_WIFI: "Preverjanje WiFi-ja..."
STR_ENTER_WIFI_PASSWORD: "Vnesi Wi-Fi geslo" STR_ENTER_WIFI_PASSWORD: "Vnesi WiFi geslo"
STR_TO_PREFIX: "v " STR_TO_PREFIX: "v "
STR_CALIBRE_RECEIVING: "Prejemanje: " STR_CALIBRE_RECEIVING: "Prejemanje: "
STR_CALIBRE_RECEIVED: "Prejeto: " STR_CALIBRE_RECEIVED: "Prejeto: "
STR_CALIBRE_INSTRUCTION_1: "1) Namesti vtičnik CrossPoint Reader" STR_CALIBRE_INSTRUCTION_1: "1) Namesti vtičnik CrossPoint Reader"
STR_CALIBRE_INSTRUCTION_2: "2) Bodi v istem Wi-Fi omrežju" STR_CALIBRE_INSTRUCTION_2: "2) Bodi v istem WiFi omrežju"
STR_CALIBRE_INSTRUCTION_3: "3) V Calibre: \"Pošlji v napravo\"" STR_CALIBRE_INSTRUCTION_3: "3) V Calibre: \"Pošlji v napravo\""
STR_CALIBRE_INSTRUCTION_4: "\"Med pošiljanjem pusti ta zaslon odprt\"" STR_CALIBRE_INSTRUCTION_4: "\"Med pošiljanjem pusti ta zaslon odprt\""
STR_CAT_DISPLAY: "Zaslon" STR_CAT_DISPLAY: "Zaslon"
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Zatdi"
STR_SHORT_PWR_BTN: "Kratek pritisk na gumb za vklop" STR_SHORT_PWR_BTN: "Kratek pritisk na gumb za vklop"
STR_ORIENTATION: "Orientacija branja" STR_ORIENTATION: "Orientacija branja"
STR_SIDE_BTN_LAYOUT: "Razpored stranskih gumbov" STR_SIDE_BTN_LAYOUT: "Razpored stranskih gumbov"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Usmeri sprednje gumbe"
STR_LONG_PRESS_SKIP: "Dolgi pritisk za preskok poglavja" STR_LONG_PRESS_SKIP: "Dolgi pritisk za preskok poglavja"
STR_FONT_FAMILY: "Pisava bralnika" STR_FONT_FAMILY: "Pisava bralnika"
STR_FONT_SIZE: "Velikost pisave" STR_FONT_SIZE: "Velikost pisave"
@@ -83,8 +82,6 @@ STR_PARA_ALIGNMENT: "Poravnava odstavkov"
STR_HYPHENATION: "Deljenje besed" STR_HYPHENATION: "Deljenje besed"
STR_TIME_TO_SLEEP: "Čas do spanja" STR_TIME_TO_SLEEP: "Čas do spanja"
STR_SHOW_HIDDEN_FILES: "Prikaži skrite datoteke" STR_SHOW_HIDDEN_FILES: "Prikaži skrite datoteke"
STR_REMOVE_READ_FROM_RECENTS: "Počisti prebrane knjige s seznama nedavnih"
STR_MOVE_FINISHED_TO_READ: "Premakni prebrane knjige v mapo Read"
STR_REFRESH_FREQ: "Pogostost osveževanja" STR_REFRESH_FREQ: "Pogostost osveževanja"
STR_KOREADER_SYNC: "KOReader sinhronizacija" STR_KOREADER_SYNC: "KOReader sinhronizacija"
STR_CHECK_UPDATES: "Preveri posodobitve" STR_CHECK_UPDATES: "Preveri posodobitve"
@@ -100,7 +97,7 @@ STR_KOREADER_PASSWORD: "KOReader geslo"
STR_FILENAME: "Ime datoteke" STR_FILENAME: "Ime datoteke"
STR_BINARY: "Binarno" STR_BINARY: "Binarno"
STR_SET_CREDENTIALS_FIRST: "Najprej nastavi podatke za prijavo" STR_SET_CREDENTIALS_FIRST: "Najprej nastavi podatke za prijavo"
STR_WIFI_CONN_FAILED: "Wi-Fi povezava ni uspela" STR_WIFI_CONN_FAILED: "WiFi povezava ni uspela"
STR_AUTHENTICATING: "Preverjanje..." STR_AUTHENTICATING: "Preverjanje..."
STR_AUTH_SUCCESS: "Uspešna prijava!" STR_AUTH_SUCCESS: "Uspešna prijava!"
STR_KOREADER_AUTH: "KOReader avtentikacija" STR_KOREADER_AUTH: "KOReader avtentikacija"
@@ -151,7 +148,6 @@ STR_ALIGN_LEFT: "Levo"
STR_CENTER: "Sredinsko" STR_CENTER: "Sredinsko"
STR_ALIGN_RIGHT: "Desno" STR_ALIGN_RIGHT: "Desno"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -231,14 +227,10 @@ STR_THEME_CLASSIC: "Klasična"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra razširjena" STR_THEME_LYRA_EXTENDED: "Lyra razširjena"
STR_SUNLIGHT_FADING_FIX: "Popravek bledenja na soncu" STR_SUNLIGHT_FADING_FIX: "Popravek bledenja na soncu"
STR_QUICK_RESUME_TIMEOUT: "Hitro nadaljevanje po izteku"
STR_AFTER_TIMEOUT: "Po izteku"
STR_REMAP_FRONT_BUTTONS: "Prenastavi sprednje gumbe" STR_REMAP_FRONT_BUTTONS: "Prenastavi sprednje gumbe"
STR_OPDS_BROWSER: "OPDS brskalnik" STR_OPDS_BROWSER: "OPDS brskalnik"
STR_COVER_CUSTOM: "Naslovnica + po meri" STR_COVER_CUSTOM: "Naslovnica + po meri"
STR_QUICK_RESUME: "Hitro nadaljevanje"
STR_MENU_RECENT_BOOKS: "Zadnje knjige" STR_MENU_RECENT_BOOKS: "Zadnje knjige"
STR_REMOVE_FROM_RECENTS: "Odstrani iz zadnjih knjig?"
STR_NO_RECENT_BOOKS: "Ni zadnjih knjig" STR_NO_RECENT_BOOKS: "Ni zadnjih knjig"
STR_CALIBRE_DESC: "Uporabi brezžični prenos Calibre" STR_CALIBRE_DESC: "Uporabi brezžični prenos Calibre"
STR_FORGET_AND_REMOVE: "Pozabi omrežje in odstrani shranjeno geslo?" STR_FORGET_AND_REMOVE: "Pozabi omrežje in odstrani shranjeno geslo?"
+13 -84
View File
@@ -26,7 +26,7 @@ STR_LOADING: "Cargando..."
STR_LOADING_POPUP: "Cargando" STR_LOADING_POPUP: "Cargando"
STR_WIFI_NETWORKS: "Redes Wi-Fi" STR_WIFI_NETWORKS: "Redes Wi-Fi"
STR_NO_NETWORKS: "No hay redes disponibles" STR_NO_NETWORKS: "No hay redes disponibles"
STR_NETWORKS_FOUND: "%zu red(es) encontrada(s)" STR_NETWORKS_FOUND: "%zu redes encontradas"
STR_SCANNING: "Buscando..." STR_SCANNING: "Buscando..."
STR_CONNECTING: "Conectando..." STR_CONNECTING: "Conectando..."
STR_CONNECTED: "¡Conectado!" STR_CONNECTED: "¡Conectado!"
@@ -45,9 +45,9 @@ STR_OPEN_URL_HINT: "Abra esta dirección en su navegador"
STR_OR_HTTP_PREFIX: "o http://" STR_OR_HTTP_PREFIX: "o http://"
STR_SCAN_QR_HINT: "o escanee el código QR con su móvil:" STR_SCAN_QR_HINT: "o escanee el código QR con su móvil:"
STR_CALIBRE_WIRELESS: "Calibre inalámbrico" STR_CALIBRE_WIRELESS: "Calibre inalámbrico"
STR_CALIBRE_WEB_URL: "URL OPDS" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* (Con contraseña) | + (Guardada)" STR_NETWORK_LEGEND: "* (Cifrado) | + (Guardado)"
STR_MAC_ADDRESS: "Dirección MAC:" STR_MAC_ADDRESS: "MAC Address:"
STR_CHECKING_WIFI: "Verificando Wi-Fi..." STR_CHECKING_WIFI: "Verificando Wi-Fi..."
STR_ENTER_WIFI_PASSWORD: "Introduzca la contraseña del Wi-Fi" STR_ENTER_WIFI_PASSWORD: "Introduzca la contraseña del Wi-Fi"
STR_TO_PREFIX: "a " STR_TO_PREFIX: "a "
@@ -61,7 +61,7 @@ STR_CAT_DISPLAY: "Pantalla"
STR_CAT_READER: "Lector" STR_CAT_READER: "Lector"
STR_CAT_CONTROLS: "Controles" STR_CAT_CONTROLS: "Controles"
STR_CAT_SYSTEM: "Sistema" STR_CAT_SYSTEM: "Sistema"
STR_SLEEP_SCREEN: "Fondo de pantalla de suspensión" STR_SLEEP_SCREEN: "Pantalla de suspensión"
STR_SLEEP_COVER_MODE: "Modo de pantalla de suspensión" STR_SLEEP_COVER_MODE: "Modo de pantalla de suspensión"
STR_HIDE_BATTERY: "Ocultar % de batería" STR_HIDE_BATTERY: "Ocultar % de batería"
STR_EXTRA_SPACING: "Espaciado entre párrafos" STR_EXTRA_SPACING: "Espaciado entre párrafos"
@@ -70,14 +70,13 @@ STR_IMAGES: "Imágenes"
STR_IMAGES_DISPLAY: "Mostrar" STR_IMAGES_DISPLAY: "Mostrar"
STR_IMAGES_PLACEHOLDER: "Reemplazar" STR_IMAGES_PLACEHOLDER: "Reemplazar"
STR_IMAGES_SUPPRESS: "Ocultar" STR_IMAGES_SUPPRESS: "Ocultar"
STR_SHORT_PWR_BTN: "Toque corto del encendido" STR_SHORT_PWR_BTN: "Toque corto botón encendido"
STR_ORIENTATION: "Orientación" STR_ORIENTATION: "Orientación"
STR_SIDE_BTN_LAYOUT: "Función botones laterales (lector)" STR_SIDE_BTN_LAYOUT: "Función botones laterales (lector)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Orientar botones frontales" STR_LONG_PRESS_BEHAVIOR: "Comportamiento al mantener pulsado el botón"
STR_LONG_PRESS_BEHAVIOR: "Al mantener pulsado un botón" STR_LONG_PRESS_BEHAVIOR_OFF: "Desactivado"
STR_LONG_PRESS_BEHAVIOR_OFF: "No hacer nada"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítulo" STR_LONG_PRESS_BEHAVIOR_SKIP: "Saltar capítulo"
STR_LONG_PRESS_BEHAVIOR_ORIENTATION: "Cambiar orient." STR_LONG_PRESS_BEHAVIOR_ORIENTATION: "Cambio de orientación"
STR_FONT_FAMILY: "Tipografía" STR_FONT_FAMILY: "Tipografía"
STR_FONT_SIZE: "Tamaño" STR_FONT_SIZE: "Tamaño"
STR_LINE_SPACING: "Interlineado" STR_LINE_SPACING: "Interlineado"
@@ -86,8 +85,6 @@ STR_PARA_ALIGNMENT: "Ajuste de párrafo"
STR_HYPHENATION: "División de palabras" STR_HYPHENATION: "División de palabras"
STR_TIME_TO_SLEEP: "Auto suspensión" STR_TIME_TO_SLEEP: "Auto suspensión"
STR_SHOW_HIDDEN_FILES: "Mostrar archivos ocultos" STR_SHOW_HIDDEN_FILES: "Mostrar archivos ocultos"
STR_REMOVE_READ_FROM_RECENTS: "Borrar libros leídos de la lista de recientes"
STR_MOVE_FINISHED_TO_READ: "Mover libros terminados a la carpeta Read"
STR_REFRESH_FREQ: "Frecuencia de refresco" STR_REFRESH_FREQ: "Frecuencia de refresco"
STR_KOREADER_SYNC: "Sincronización de KOReader" STR_KOREADER_SYNC: "Sincronización de KOReader"
STR_CHECK_UPDATES: "Verificar actualizaciones" STR_CHECK_UPDATES: "Verificar actualizaciones"
@@ -133,7 +130,6 @@ STR_ALWAYS: "Siempre"
STR_IGNORE: "Ignorar" STR_IGNORE: "Ignorar"
STR_SLEEP: "Suspender" STR_SLEEP: "Suspender"
STR_PAGE_TURN: "Pasar página" STR_PAGE_TURN: "Pasar página"
STR_FORCE_REFRESH: "Refrescar pant."
STR_PORTRAIT: "Vertical" STR_PORTRAIT: "Vertical"
STR_LANDSCAPE_CW: "Horizontal (horario)" STR_LANDSCAPE_CW: "Horizontal (horario)"
STR_INVERTED: "Invertido" STR_INVERTED: "Invertido"
@@ -155,7 +151,6 @@ STR_ALIGN_LEFT: "Izquierda"
STR_CENTER: "Centro" STR_CENTER: "Centro"
STR_ALIGN_RIGHT: "Derecha" STR_ALIGN_RIGHT: "Derecha"
STR_MIN_1: "1 min." STR_MIN_1: "1 min."
STR_MIN_3: "3 min."
STR_MIN_5: "5 min." STR_MIN_5: "5 min."
STR_MIN_10: "10 min." STR_MIN_10: "10 min."
STR_MIN_15: "15 min." STR_MIN_15: "15 min."
@@ -174,8 +169,7 @@ STR_UPDATING: "Actualizando..."
STR_NO_UPDATE: "No hay actualizaciones disponibles" STR_NO_UPDATE: "No hay actualizaciones disponibles"
STR_UPDATE_FAILED: "Fallo de actualización" STR_UPDATE_FAILED: "Fallo de actualización"
STR_UPDATE_COMPLETE: "Actualización completada" STR_UPDATE_COMPLETE: "Actualización completada"
STR_POWER_ON_HINT: "Reinicie manteniendo pulsado el encendido" STR_POWER_ON_HINT: "Reinicie manteniendo pulsado botón de encendido"
STR_RESTARTING_HINT: "Reiniciando... Si no se reinicia, mantenga pulsado el encendido unos segundos."
STR_NO_ENTRIES: "No se encontraron elementos" STR_NO_ENTRIES: "No se encontraron elementos"
STR_DOWNLOADING: "Descargando..." STR_DOWNLOADING: "Descargando..."
STR_DOWNLOAD_FAILED: "Fallo de descarga" STR_DOWNLOAD_FAILED: "Fallo de descarga"
@@ -184,14 +178,12 @@ STR_UNNAMED: "Sin nombre"
STR_NO_SERVER_URL: "No se configuró URL de servidor" STR_NO_SERVER_URL: "No se configuró URL de servidor"
STR_FETCH_FEED_FAILED: "Fallo al obtener el feed" STR_FETCH_FEED_FAILED: "Fallo al obtener el feed"
STR_PARSE_FEED_FAILED: "Fallo al procesar el feed" STR_PARSE_FEED_FAILED: "Fallo al procesar el feed"
STR_NEXT_PAGE: "Pág. siguiente »"
STR_PREV_PAGE: "« Pág. anterior"
STR_NETWORK_PREFIX: "Red: " STR_NETWORK_PREFIX: "Red: "
STR_IP_ADDRESS_PREFIX: "IP: " STR_IP_ADDRESS_PREFIX: "IP: "
STR_ERROR_GENERAL_FAILURE: "Error: Fallo general" STR_ERROR_GENERAL_FAILURE: "Error: Fallo general"
STR_ERROR_NETWORK_NOT_FOUND: "Error: Red no encontrada" STR_ERROR_NETWORK_NOT_FOUND: "Error: Red no encontrada"
STR_ERROR_CONNECTION_TIMEOUT: "Error: Tiempo de conexión agotado" STR_ERROR_CONNECTION_TIMEOUT: "Error: Tiempo de conexión agotado"
STR_SD_CARD: "Tarjeta SD" STR_SD_CARD: "Tarjeta microSD"
STR_BACK: "« Atrás" STR_BACK: "« Atrás"
STR_EXIT: "« Salir" STR_EXIT: "« Salir"
STR_HOME: "« Inicio" STR_HOME: "« Inicio"
@@ -233,24 +225,16 @@ STR_EXAMPLE_BOOK: "Título del libro"
STR_PREVIEW: "Previsualización" STR_PREVIEW: "Previsualización"
STR_TITLE: "Título" STR_TITLE: "Título"
STR_BATTERY: "Batería" STR_BATTERY: "Batería"
STR_XTC_STATUS_BAR: "Barra de estado de XTC"
STR_BOTTOM: "Abajo"
STR_TOP: "Arriba"
STR_UI_THEME: "Interfaz" STR_UI_THEME: "Interfaz"
STR_THEME_CLASSIC: "Clásico" STR_THEME_CLASSIC: "Clásico"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_THEME_LYRA_EXTENDED: "Lyra Extendido" STR_THEME_LYRA_EXTENDED: "Lyra Extendido"
STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_SUNLIGHT_FADING_FIX: "Corrección de desvanecimiento" STR_SUNLIGHT_FADING_FIX: "Corrección de desvanecimiento"
STR_QUICK_RESUME_TIMEOUT: "Reanudación rápida tras tiempo"
STR_AFTER_TIMEOUT: "Tras tiempo"
STR_REMAP_FRONT_BUTTONS: "Reconfigurar botones frontales" STR_REMAP_FRONT_BUTTONS: "Reconfigurar botones frontales"
STR_OPDS_BROWSER: "Navegador OPDS" STR_OPDS_BROWSER: "Navegador OPDS"
STR_SEARCH: "Buscar"
STR_COVER_CUSTOM: "Portada + Pers." STR_COVER_CUSTOM: "Portada + Pers."
STR_QUICK_RESUME: "Reanudación rápida"
STR_MENU_RECENT_BOOKS: "Libros recientes" STR_MENU_RECENT_BOOKS: "Libros recientes"
STR_REMOVE_FROM_RECENTS: "¿Eliminar de Libros recientes?"
STR_NO_RECENT_BOOKS: "No hay libros recientes" STR_NO_RECENT_BOOKS: "No hay libros recientes"
STR_CALIBRE_DESC: "Transferir contenido a este dispositivo" STR_CALIBRE_DESC: "Transferir contenido a este dispositivo"
STR_FORGET_AND_REMOVE: "¿Desea olvidar la red y la contraseña guardada?" STR_FORGET_AND_REMOVE: "¿Desea olvidar la red y la contraseña guardada?"
@@ -306,65 +290,10 @@ STR_BOOK_S_STYLE: "Estilo del libro"
STR_EMBEDDED_STYLE: "Estilo integrado" STR_EMBEDDED_STYLE: "Estilo integrado"
STR_FOCUS_READING: "Lectura enfocada" STR_FOCUS_READING: "Lectura enfocada"
STR_OPDS_SERVER_URL: "URL del servidor OPDS" STR_OPDS_SERVER_URL: "URL del servidor OPDS"
STR_SET_SLEEP_COVER: "Pant. sus."
STR_FOOTNOTES: "Pie de página" STR_FOOTNOTES: "Pie de página"
STR_NO_FOOTNOTES: "No hay notas al pie de esta página" STR_NO_FOOTNOTES: "No hay notas al pie de esta página"
STR_LINK: "[enlace]" STR_LINK: "[enlace]"
STR_SCREENSHOT_BUTTON: "Tomar captura de pantalla" STR_SCREENSHOT_BUTTON: "Tomar captura de pantalla"
STR_ADD_SERVER: "Agregar servidor" STR_TILT_PAGE_TURN: "Pasar página inclinando"
STR_SERVER_NAME: "Nombre de servidor"
STR_NO_SERVERS: "No se configuraron servidores OPDS"
STR_DELETE_SERVER: "Borrar servidor"
STR_DELETE_CONFIRM: "¿Borrar este servidor?"
STR_OPDS_SERVERS: "Servidores OPDS"
STR_AUTO_TURN_ENABLED: "Avance activado: " STR_AUTO_TURN_ENABLED: "Avance activado: "
STR_AUTO_TURN_PAGES_PER_MIN: "Avance auto. (pág./min)" STR_AUTO_TURN_PAGES_PER_MIN: "Avance auto. (pág./min)"
STR_MANAGE_FONTS: "Gestionar tipografías"
STR_FONT_BROWSER: "Navegador de tipografías"
STR_LOADING_FONT_LIST: "Cargando lista de tipografías..."
STR_NO_FONTS_AVAILABLE: "No hay tipografías disponibles"
STR_FONT_INSTALLED: "¡Se instaló la tipografía!"
STR_FONT_INSTALL_FAILED: "Falló la instalación de tipografía"
STR_INSTALLED: "Instalada"
STR_CONFIRM_DOWNLOAD_PROMPT: "¿Descargar?"
STR_SD_CARD_FULL: "No hay espacio en la tarjeta SD"
STR_FILES_LABEL: "Archivos: "
STR_SIZE_LABEL: "Tamaño: "
STR_REDOWNLOAD: "Redescargar"
STR_DOWNLOAD_ALL: "Descargar todas"
STR_UPDATE_ALL: "Actualizar todas"
STR_ALL_FONTS_INSTALLED: "¡Se instalaron todas las tipografías!"
STR_UPDATE_AVAILABLE: "Actualizar"
STR_CRASH_TITLE: "Fallo del sistema"
STR_CRASH_DESCRIPTION: "Se guardó un informe detallado en crash_report.txt. Inclúyalo al avisar sobre el error."
STR_CRASH_REASON: "Razón del fallo:"
STR_CRASH_NO_REASON: "(No se registró una razón)."
STR_TILT_PAGE_TURN: "Pasar página inclinando"
STR_KB_HINT_MOVE_CURSOR: "Pulse IZQ. o DCHA. para mover el cursor"
STR_KB_HINT_RETURN_CURSOR: "Pulse IZQ. para volver a la posición del cursor"
STR_KB_HINT_HIDE_PASSWORD: "Pulse DCHA., luego [***] para ocultar la contraseña"
STR_KB_HINT_SHOW_PASSWORD: "Pulse DCHA., luego [abc] para mostrar la contraseña"
STR_KB_HINT_TOGGLE_HIDE_PASSWORD: "Pulse [***] para ocultar la contraseña"
STR_KB_HINT_TOGGLE_SHOW_PASSWORD: "Pulse [abc] para mostrar la contraseña"
STR_KB_HINT_EDIT_ENTRY: "Mantenga SUBIR para editar la entrada"
STR_KB_TIPS: "Consejos: "
STR_KB_HINT_RETURN_KEYBOARD: "Pulse BAJAR para volver al teclado"
STR_KB_HINT_EXIT_URL_MODE: "Pulse ABC para salir del modo URL"
STR_KB_HINT_CLEAR_TEXT: "Mantenga RETROCESO para borrar todo"
STR_KB_HINT_SECONDARY_CHAR: "Mantenga SELECC. para otros caracteres"
STR_KB_HINT_UPPER_SECONDARY: "Mantenga SELECC. para MAYÚS./otros caracteres"
STR_KB_HINT_LOWER_SECONDARY: "Mantenga SELECC. para minús./otros caracteres"
STR_KB_HINT_URL_SNIPPETS: "Pulse URL para ingresar fragmentos"
STR_SD_FIRMWARE_UPDATE: "Actualizar firmware por tarj. SD"
STR_SELECT_FIRMWARE_FILE: "Elija el archivo de firmware (.bin)"
STR_NO_BIN_FILES: "No se encontraron archivos .bin"
STR_VALIDATING_FIRMWARE: "Validando el firmware..."
STR_INVALID_FIRMWARE: "Archivo de firmware no válido"
STR_FIRMWARE_TOO_LARGE: "Firmware demasiado grande p/la partición"
STR_FIRMWARE_TOO_SMALL: "Firmware demasiado pequeño"
STR_FIRMWARE_UPDATE_PROMPT: "¿Actualizar el firmware?"
STR_FIRMWARE_FILE_OPEN_FAILED: "No se puede abrir el archivo"
STR_FIRMWARE_WRITE_FAILED: "Falló la escritura del firmware"
STR_FIRMWARE_UPDATE_DO_NOT_POWER_OFF: "¡No apague el dispositivo!"
STR_RECOVERY_MODE: "Modo de recuperación"
STR_RECOVERY_MODE_HINT: "Ponga firmware.bin en la raíz de la tarj. SD y selecciónelo"
+1 -9
View File
@@ -49,7 +49,7 @@ STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Krypterad | + = Sparad" STR_NETWORK_LEGEND: "* = Krypterad | + = Sparad"
STR_MAC_ADDRESS: "MAC-adress:" STR_MAC_ADDRESS: "MAC-adress:"
STR_CHECKING_WIFI: "Kontrollerar trådlöst nätverk…" STR_CHECKING_WIFI: "Kontrollerar trådlöst nätverk…"
STR_ENTER_WIFI_PASSWORD: "Skriv in Wi-Fi-lösenord" STR_ENTER_WIFI_PASSWORD: "Skriv in WiFi-lösenord"
STR_TO_PREFIX: "till " STR_TO_PREFIX: "till "
STR_CALIBRE_RECEIVING: "Tar emot:" STR_CALIBRE_RECEIVING: "Tar emot:"
STR_CALIBRE_RECEIVED: "Mottaget:" STR_CALIBRE_RECEIVED: "Mottaget:"
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Dölj"
STR_SHORT_PWR_BTN: "Kort strömknappsklick" STR_SHORT_PWR_BTN: "Kort strömknappsklick"
STR_ORIENTATION: "Läsrikting" STR_ORIENTATION: "Läsrikting"
STR_SIDE_BTN_LAYOUT: "Sidoknappslayout (Läsare)" STR_SIDE_BTN_LAYOUT: "Sidoknappslayout (Läsare)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Rikta främre knappar"
STR_LONG_PRESS_BEHAVIOR: "Beteende vid lång knapptryckning" STR_LONG_PRESS_BEHAVIOR: "Beteende vid lång knapptryckning"
STR_LONG_PRESS_BEHAVIOR_OFF: "AV" STR_LONG_PRESS_BEHAVIOR_OFF: "AV"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Hoppa över kapitel" STR_LONG_PRESS_BEHAVIOR_SKIP: "Hoppa över kapitel"
@@ -86,8 +85,6 @@ STR_PARA_ALIGNMENT: "Eboksläsarens paragrafjustering"
STR_HYPHENATION: "Avstavning" STR_HYPHENATION: "Avstavning"
STR_TIME_TO_SLEEP: "Tid för att gå i vila" STR_TIME_TO_SLEEP: "Tid för att gå i vila"
STR_SHOW_HIDDEN_FILES: "Visa dolda filer" STR_SHOW_HIDDEN_FILES: "Visa dolda filer"
STR_REMOVE_READ_FROM_RECENTS: "Rensa lästa böcker från listan Senaste"
STR_MOVE_FINISHED_TO_READ: "Flytta lästa böcker till Read-mappen"
STR_REFRESH_FREQ: "Uppdateringsfrekvens" STR_REFRESH_FREQ: "Uppdateringsfrekvens"
STR_KOREADER_SYNC: "KOReader-synkronisering" STR_KOREADER_SYNC: "KOReader-synkronisering"
STR_CHECK_UPDATES: "Kolla efter uppdateringar" STR_CHECK_UPDATES: "Kolla efter uppdateringar"
@@ -155,7 +152,6 @@ STR_ALIGN_LEFT: "Vänster"
STR_CENTER: "Mitten" STR_CENTER: "Mitten"
STR_ALIGN_RIGHT: "Höger" STR_ALIGN_RIGHT: "Höger"
STR_MIN_1: "1 min" STR_MIN_1: "1 min"
STR_MIN_3: "3 min"
STR_MIN_5: "5 min" STR_MIN_5: "5 min"
STR_MIN_10: "10 min" STR_MIN_10: "10 min"
STR_MIN_15: "15 min" STR_MIN_15: "15 min"
@@ -242,15 +238,11 @@ STR_THEME_LYRA: "Lyra"
STR_THEME_ROUNDEDRAFF: "RoundedRaff" STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_THEME_LYRA_EXTENDED: "Lyra utökad" STR_THEME_LYRA_EXTENDED: "Lyra utökad"
STR_SUNLIGHT_FADING_FIX: "Fix för solskensmattning" STR_SUNLIGHT_FADING_FIX: "Fix för solskensmattning"
STR_QUICK_RESUME_TIMEOUT: "Snabb återupptagning efter timeout"
STR_AFTER_TIMEOUT: "Efter timeout"
STR_REMAP_FRONT_BUTTONS: "Ändra frontknappar" STR_REMAP_FRONT_BUTTONS: "Ändra frontknappar"
STR_OPDS_BROWSER: "OPDS-webbläsare" STR_OPDS_BROWSER: "OPDS-webbläsare"
STR_SEARCH: "Sök" STR_SEARCH: "Sök"
STR_COVER_CUSTOM: "Omslag + Valfri" STR_COVER_CUSTOM: "Omslag + Valfri"
STR_QUICK_RESUME: "Snabb återupptagning"
STR_MENU_RECENT_BOOKS: "Senaste böckerna" STR_MENU_RECENT_BOOKS: "Senaste böckerna"
STR_REMOVE_FROM_RECENTS: "Ta bort från Senaste böckerna?"
STR_NO_RECENT_BOOKS: "Inga senaste böcker" STR_NO_RECENT_BOOKS: "Inga senaste böcker"
STR_CALIBRE_DESC: "Använd Calibres trådlösa enhetsöverföring" STR_CALIBRE_DESC: "Använd Calibres trådlösa enhetsöverföring"
STR_FORGET_AND_REMOVE: "Glöm nätverk och ta bort sparat lösenord?" STR_FORGET_AND_REMOVE: "Glöm nätverk och ta bort sparat lösenord?"
+7 -15
View File
@@ -23,7 +23,7 @@ STR_EMPTY_FILE: "Boş dosya"
STR_OUT_OF_BOUNDS: "Sınırların dışında" STR_OUT_OF_BOUNDS: "Sınırların dışında"
STR_LOADING: "Yükleniyor..." STR_LOADING: "Yükleniyor..."
STR_LOADING_POPUP: "Yükleniyor" STR_LOADING_POPUP: "Yükleniyor"
STR_WIFI_NETWORKS: "Wi-Fi Ağları" STR_WIFI_NETWORKS: "WiFi Ağları"
STR_NO_NETWORKS: "Ağ bulunamadı" STR_NO_NETWORKS: "Ağ bulunamadı"
STR_NETWORKS_FOUND: "%zu ağ bulundu" STR_NETWORKS_FOUND: "%zu ağ bulundu"
STR_SCANNING: "Tarıyor..." STR_SCANNING: "Tarıyor..."
@@ -35,11 +35,11 @@ STR_SAVE_PASSWORD: "Şifre kaydedilsin mi?"
STR_PRESS_OK_SCAN: "Tekrar taramak için OK'e basın" STR_PRESS_OK_SCAN: "Tekrar taramak için OK'e basın"
STR_JOIN_NETWORK: "Bir Ağa Katıl" STR_JOIN_NETWORK: "Bir Ağa Katıl"
STR_CREATE_HOTSPOT: "Erişim Noktası Oluştur" STR_CREATE_HOTSPOT: "Erişim Noktası Oluştur"
STR_JOIN_DESC: "Mevcut bir Wi-Fi ağına bağlan" STR_JOIN_DESC: "Mevcut bir WiFi ağına bağlan"
STR_HOTSPOT_DESC: "Başkalarının katılabileceği ağ oluştur" STR_HOTSPOT_DESC: "Başkalarının katılabileceği ağ oluştur"
STR_STARTING_HOTSPOT: "Erişim Noktası Başlatılıyor..." STR_STARTING_HOTSPOT: "Erişim Noktası Başlatılıyor..."
STR_HOTSPOT_MODE: "Erişim Noktası Modu" STR_HOTSPOT_MODE: "Erişim Noktası Modu"
STR_CONNECT_WIFI_HINT: "Cihazınızı bu Wi-Fi ağına bağlayın" STR_CONNECT_WIFI_HINT: "Cihazınızı bu WiFi ağına bağlayın"
STR_OPEN_URL_HINT: "Tarayıcınızda bu adresi açın" STR_OPEN_URL_HINT: "Tarayıcınızda bu adresi açın"
STR_OR_HTTP_PREFIX: "veya http://" STR_OR_HTTP_PREFIX: "veya http://"
STR_SCAN_QR_HINT: "veya telefonunuzla QR kodu tarayın:" STR_SCAN_QR_HINT: "veya telefonunuzla QR kodu tarayın:"
@@ -47,13 +47,13 @@ STR_CALIBRE_WIRELESS: "Calibre Kablosuz"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Şifreli | + = Kayıtlı" STR_NETWORK_LEGEND: "* = Şifreli | + = Kayıtlı"
STR_MAC_ADDRESS: "MAC adresi:" STR_MAC_ADDRESS: "MAC adresi:"
STR_CHECKING_WIFI: "Wi-Fi kontrol ediliyor..." STR_CHECKING_WIFI: "WiFi kontrol ediliyor..."
STR_ENTER_WIFI_PASSWORD: "Wi-Fi Şifresini Girin" STR_ENTER_WIFI_PASSWORD: "WiFi Şifresini Girin"
STR_TO_PREFIX: "Ağ: " STR_TO_PREFIX: "Ağ: "
STR_CALIBRE_RECEIVING: "Alınıyor: " STR_CALIBRE_RECEIVING: "Alınıyor: "
STR_CALIBRE_RECEIVED: "Alındı: " STR_CALIBRE_RECEIVED: "Alındı: "
STR_CALIBRE_INSTRUCTION_1: "1) CrossPoint Reader eklentisini kurun" STR_CALIBRE_INSTRUCTION_1: "1) CrossPoint Reader eklentisini kurun"
STR_CALIBRE_INSTRUCTION_2: "2) Aynı Wi-Fi ağında olun" STR_CALIBRE_INSTRUCTION_2: "2) Aynı WiFi ağında olun"
STR_CALIBRE_INSTRUCTION_3: "3) Calibre'de: \"Cihaza gönder\"" STR_CALIBRE_INSTRUCTION_3: "3) Calibre'de: \"Cihaza gönder\""
STR_CALIBRE_INSTRUCTION_4: "\"Gönderim sırasında bu ekranı açık tutun\"" STR_CALIBRE_INSTRUCTION_4: "\"Gönderim sırasında bu ekranı açık tutun\""
STR_CAT_DISPLAY: "Ekran" STR_CAT_DISPLAY: "Ekran"
@@ -68,7 +68,6 @@ STR_TEXT_AA: "Metin Yumuşatma (AA)"
STR_SHORT_PWR_BTN: "Kısa Güç Tuşu Tıklaması" STR_SHORT_PWR_BTN: "Kısa Güç Tuşu Tıklaması"
STR_ORIENTATION: "Okuma Yönü" STR_ORIENTATION: "Okuma Yönü"
STR_SIDE_BTN_LAYOUT: "Yan Tuş Dizilimi (okuyucu)" STR_SIDE_BTN_LAYOUT: "Yan Tuş Dizilimi (okuyucu)"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Ön düğmeleri yönlendir"
STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior" STR_LONG_PRESS_BEHAVIOR: "Long-press button behavior"
STR_LONG_PRESS_BEHAVIOR_OFF: "OFF" STR_LONG_PRESS_BEHAVIOR_OFF: "OFF"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip" STR_LONG_PRESS_BEHAVIOR_SKIP: "Chapter skip"
@@ -81,8 +80,6 @@ STR_PARA_ALIGNMENT: "Okuyucu Paragraf Hizalaması"
STR_HYPHENATION: "Hecelerden Ayırma" STR_HYPHENATION: "Hecelerden Ayırma"
STR_TIME_TO_SLEEP: "Uykuya Geçme Süresi" STR_TIME_TO_SLEEP: "Uykuya Geçme Süresi"
STR_SHOW_HIDDEN_FILES: "Gizli Dosyaları Göster" STR_SHOW_HIDDEN_FILES: "Gizli Dosyaları Göster"
STR_REMOVE_READ_FROM_RECENTS: "Okunan kitapları Son listesinden temizle"
STR_MOVE_FINISHED_TO_READ: "Biten kitapları Read klasörüne taşı"
STR_REFRESH_FREQ: "Yenileme Sıklığı" STR_REFRESH_FREQ: "Yenileme Sıklığı"
STR_KOREADER_SYNC: "KOReader Senkronizasyonu" STR_KOREADER_SYNC: "KOReader Senkronizasyonu"
STR_CHECK_UPDATES: "Güncellemeleri denetle" STR_CHECK_UPDATES: "Güncellemeleri denetle"
@@ -98,7 +95,7 @@ STR_KOREADER_PASSWORD: "KOReader Şifresi"
STR_FILENAME: "Dosya Adı" STR_FILENAME: "Dosya Adı"
STR_BINARY: "İkili" STR_BINARY: "İkili"
STR_SET_CREDENTIALS_FIRST: "Önce kimlik bilgilerini ayarlayın" STR_SET_CREDENTIALS_FIRST: "Önce kimlik bilgilerini ayarlayın"
STR_WIFI_CONN_FAILED: "Wi-Fi bağlantısı başarısız" STR_WIFI_CONN_FAILED: "WiFi bağlantısı başarısız"
STR_AUTHENTICATING: "Kimlik doğrulanıyor..." STR_AUTHENTICATING: "Kimlik doğrulanıyor..."
STR_AUTH_SUCCESS: "Kimlik doğrulama başarılı!" STR_AUTH_SUCCESS: "Kimlik doğrulama başarılı!"
STR_KOREADER_AUTH: "KOReader Doğrulaması" STR_KOREADER_AUTH: "KOReader Doğrulaması"
@@ -149,7 +146,6 @@ STR_ALIGN_LEFT: "Sola Yasla"
STR_CENTER: "Ortala" STR_CENTER: "Ortala"
STR_ALIGN_RIGHT: "Sağa Yasla" STR_ALIGN_RIGHT: "Sağa Yasla"
STR_MIN_1: "1 dak" STR_MIN_1: "1 dak"
STR_MIN_3: "3 dak"
STR_MIN_5: "5 dak" STR_MIN_5: "5 dak"
STR_MIN_10: "10 dak" STR_MIN_10: "10 dak"
STR_MIN_15: "15 dak" STR_MIN_15: "15 dak"
@@ -211,14 +207,10 @@ STR_THEME_CLASSIC: "Klasik"
STR_THEME_LYRA: "Lyra" STR_THEME_LYRA: "Lyra"
STR_THEME_LYRA_EXTENDED: "Lyra Genişletilmiş" STR_THEME_LYRA_EXTENDED: "Lyra Genişletilmiş"
STR_SUNLIGHT_FADING_FIX: "Güneş Işığı Solma Düzeltmesi" STR_SUNLIGHT_FADING_FIX: "Güneş Işığı Solma Düzeltmesi"
STR_QUICK_RESUME_TIMEOUT: "Zaman aşımında Hızlı Devam"
STR_AFTER_TIMEOUT: "Zaman aşımında"
STR_REMAP_FRONT_BUTTONS: "Ön Tuşları Yeniden Ata" STR_REMAP_FRONT_BUTTONS: "Ön Tuşları Yeniden Ata"
STR_OPDS_BROWSER: "OPDS Tarayıcı" STR_OPDS_BROWSER: "OPDS Tarayıcı"
STR_COVER_CUSTOM: "Kapak + Özel" STR_COVER_CUSTOM: "Kapak + Özel"
STR_QUICK_RESUME: "Hızlı Devam"
STR_MENU_RECENT_BOOKS: "Son Kitaplar" STR_MENU_RECENT_BOOKS: "Son Kitaplar"
STR_REMOVE_FROM_RECENTS: "Son Kitaplar listesinden kaldırılsın mı?"
STR_NO_RECENT_BOOKS: "Son okunan kitap yok" STR_NO_RECENT_BOOKS: "Son okunan kitap yok"
STR_CALIBRE_DESC: "Calibre kablosuz cihaz transferini kullan" STR_CALIBRE_DESC: "Calibre kablosuz cihaz transferini kullan"
STR_FORGET_AND_REMOVE: "Ağı unut ve kayıtlı şifreyi sil?" STR_FORGET_AND_REMOVE: "Ağı unut ve kayıtlı şifreyi sil?"
+7 -15
View File
@@ -24,7 +24,7 @@ STR_EMPTY_FILE: "Порожній файл"
STR_OUT_OF_BOUNDS: "Поза межами" STR_OUT_OF_BOUNDS: "Поза межами"
STR_LOADING: "Завантаження..." STR_LOADING: "Завантаження..."
STR_LOADING_POPUP: "Завантаження" STR_LOADING_POPUP: "Завантаження"
STR_WIFI_NETWORKS: "Мережі Wi-Fi" STR_WIFI_NETWORKS: "Мережі WiFi"
STR_NO_NETWORKS: "Мереж не знайдено" STR_NO_NETWORKS: "Мереж не знайдено"
STR_NETWORKS_FOUND: "мереж %zu" STR_NETWORKS_FOUND: "мереж %zu"
STR_SCANNING: "Сканування..." STR_SCANNING: "Сканування..."
@@ -36,11 +36,11 @@ STR_SAVE_PASSWORD: "Зберегти пароль на наступний раз
STR_PRESS_OK_SCAN: "Натисніть OK для повторного сканування" STR_PRESS_OK_SCAN: "Натисніть OK для повторного сканування"
STR_JOIN_NETWORK: "Приєднатися до мережі" STR_JOIN_NETWORK: "Приєднатися до мережі"
STR_CREATE_HOTSPOT: "Створити точку доступу" STR_CREATE_HOTSPOT: "Створити точку доступу"
STR_JOIN_DESC: "Підключитися до існуючої мережі Wi-Fi" STR_JOIN_DESC: "Підключитися до існуючої мережі WiFi"
STR_HOTSPOT_DESC: "Дозволити іншим підключення по Wi-Fi" STR_HOTSPOT_DESC: "Дозволити іншим підключення по Wi-Fi"
STR_STARTING_HOTSPOT: "Запуск точки доступу..." STR_STARTING_HOTSPOT: "Запуск точки доступу..."
STR_HOTSPOT_MODE: "Режим точки доступу" STR_HOTSPOT_MODE: "Режим точки доступу"
STR_CONNECT_WIFI_HINT: "Підключіть пристрій до цієї мережі Wi-Fi" STR_CONNECT_WIFI_HINT: "Підключіть пристрій до Цієї мережі WiFi"
STR_OPEN_URL_HINT: "Відкрийте посилання у своєму браузері" STR_OPEN_URL_HINT: "Відкрийте посилання у своєму браузері"
STR_OR_HTTP_PREFIX: "або http://" STR_OR_HTTP_PREFIX: "або http://"
STR_SCAN_QR_HINT: "або відскануйте QR-код телефоном:" STR_SCAN_QR_HINT: "або відскануйте QR-код телефоном:"
@@ -48,13 +48,13 @@ STR_CALIBRE_WIRELESS: "Отримати з Calibre"
STR_CALIBRE_WEB_URL: "OPDS URL" STR_CALIBRE_WEB_URL: "OPDS URL"
STR_NETWORK_LEGEND: "* = Зашифровано | + = Збережено" STR_NETWORK_LEGEND: "* = Зашифровано | + = Збережено"
STR_MAC_ADDRESS: "MAC адреса:" STR_MAC_ADDRESS: "MAC адреса:"
STR_CHECKING_WIFI: "Перевірка Wi-Fi..." STR_CHECKING_WIFI: "Перевірка WiFi..."
STR_ENTER_WIFI_PASSWORD: "Введіть пароль Wi-Fi" STR_ENTER_WIFI_PASSWORD: "Введіть пароль WiFi"
STR_TO_PREFIX: "до " STR_TO_PREFIX: "до "
STR_CALIBRE_RECEIVING: "Отримання: " STR_CALIBRE_RECEIVING: "Отримання: "
STR_CALIBRE_RECEIVED: "Отримано: " STR_CALIBRE_RECEIVED: "Отримано: "
STR_CALIBRE_INSTRUCTION_1: "1) Встановіть плагін CrossPoint Reader" STR_CALIBRE_INSTRUCTION_1: "1) Встановіть плагін CrossPoint Reader"
STR_CALIBRE_INSTRUCTION_2: "2) Перебувайте в тій самій мережі Wi-Fi" STR_CALIBRE_INSTRUCTION_2: "2) Перебувайте в тій самій мережі WiFi"
STR_CALIBRE_INSTRUCTION_3: "3) В Calibre: \"Надіслати на пристрій\"" STR_CALIBRE_INSTRUCTION_3: "3) В Calibre: \"Надіслати на пристрій\""
STR_CALIBRE_INSTRUCTION_4: "\"Тримайте цей екран відкритим під час надсилання\"" STR_CALIBRE_INSTRUCTION_4: "\"Тримайте цей екран відкритим під час надсилання\""
STR_CAT_DISPLAY: "Екран" STR_CAT_DISPLAY: "Екран"
@@ -73,7 +73,6 @@ STR_IMAGES_SUPPRESS: "Приховати"
STR_SHORT_PWR_BTN: "Короткий натиск кн. живл." STR_SHORT_PWR_BTN: "Короткий натиск кн. живл."
STR_ORIENTATION: "Орієнтація читання" STR_ORIENTATION: "Орієнтація читання"
STR_SIDE_BTN_LAYOUT: "Схема бічних кнопок" STR_SIDE_BTN_LAYOUT: "Схема бічних кнопок"
STR_FRONT_BTN_FOLLOW_ORIENTATION: "Орієнтувати передні кнопки"
STR_LONG_PRESS_BEHAVIOR: "Поведінка при довгому настику" STR_LONG_PRESS_BEHAVIOR: "Поведінка при довгому настику"
STR_LONG_PRESS_BEHAVIOR_OFF: "Немає" STR_LONG_PRESS_BEHAVIOR_OFF: "Немає"
STR_LONG_PRESS_BEHAVIOR_SKIP: "Наступ. розділ (утримув.)" STR_LONG_PRESS_BEHAVIOR_SKIP: "Наступ. розділ (утримув.)"
@@ -86,8 +85,6 @@ STR_PARA_ALIGNMENT: "Вирівнювання тексту"
STR_HYPHENATION: "Перенесення слів" STR_HYPHENATION: "Перенесення слів"
STR_TIME_TO_SLEEP: "Перехід в режим сну" STR_TIME_TO_SLEEP: "Перехід в режим сну"
STR_SHOW_HIDDEN_FILES: "Показати приховані файли" STR_SHOW_HIDDEN_FILES: "Показати приховані файли"
STR_REMOVE_READ_FROM_RECENTS: "Очищати прочитані книги зі списку останніх"
STR_MOVE_FINISHED_TO_READ: "Переміщати прочитані книги до теки Read"
STR_REFRESH_FREQ: "Частота оновлення екрану" STR_REFRESH_FREQ: "Частота оновлення екрану"
STR_KOREADER_SYNC: "Синхронізація KOReader" STR_KOREADER_SYNC: "Синхронізація KOReader"
STR_CHECK_UPDATES: "Перевірити оновлення системи" STR_CHECK_UPDATES: "Перевірити оновлення системи"
@@ -103,7 +100,7 @@ STR_KOREADER_PASSWORD: "Пароль KOReader"
STR_FILENAME: "Ім'я файлу" STR_FILENAME: "Ім'я файлу"
STR_BINARY: "Побайтово" STR_BINARY: "Побайтово"
STR_SET_CREDENTIALS_FIRST: "Спочатку вкажіть облікові дані" STR_SET_CREDENTIALS_FIRST: "Спочатку вкажіть облікові дані"
STR_WIFI_CONN_FAILED: "Помилка підключення Wi-Fi" STR_WIFI_CONN_FAILED: "Помилка підключення WiFi"
STR_AUTHENTICATING: "Автентифікація..." STR_AUTHENTICATING: "Автентифікація..."
STR_AUTH_SUCCESS: "Успішно автентифіковано!" STR_AUTH_SUCCESS: "Успішно автентифіковано!"
STR_KOREADER_AUTH: "Автентифікація KOReader" STR_KOREADER_AUTH: "Автентифікація KOReader"
@@ -155,7 +152,6 @@ STR_ALIGN_LEFT: "За лівим краєм"
STR_CENTER: "По центру" STR_CENTER: "По центру"
STR_ALIGN_RIGHT: "За правим краєм" STR_ALIGN_RIGHT: "За правим краєм"
STR_MIN_1: "1 хв" STR_MIN_1: "1 хв"
STR_MIN_3: "3 хв"
STR_MIN_5: "5 хв" STR_MIN_5: "5 хв"
STR_MIN_10: "10 хв" STR_MIN_10: "10 хв"
STR_MIN_15: "15 хв" STR_MIN_15: "15 хв"
@@ -242,15 +238,11 @@ STR_THEME_LYRA: "Lyra"
STR_THEME_ROUNDEDRAFF: "RoundedRaff" STR_THEME_ROUNDEDRAFF: "RoundedRaff"
STR_THEME_LYRA_EXTENDED: "Lyra Extended" STR_THEME_LYRA_EXTENDED: "Lyra Extended"
STR_SUNLIGHT_FADING_FIX: "Виправлення вицвітання на сонці" STR_SUNLIGHT_FADING_FIX: "Виправлення вицвітання на сонці"
STR_QUICK_RESUME_TIMEOUT: "Швидке продовження після таймауту"
STR_AFTER_TIMEOUT: "Після таймауту"
STR_REMAP_FRONT_BUTTONS: "Налаштувати передні кнопки" STR_REMAP_FRONT_BUTTONS: "Налаштувати передні кнопки"
STR_OPDS_BROWSER: "Браузер OPDS" STR_OPDS_BROWSER: "Браузер OPDS"
STR_SEARCH: "Пошук" STR_SEARCH: "Пошук"
STR_COVER_CUSTOM: "Обкл. + власне" STR_COVER_CUSTOM: "Обкл. + власне"
STR_QUICK_RESUME: "Швидке продовження"
STR_MENU_RECENT_BOOKS: "Останні книги" STR_MENU_RECENT_BOOKS: "Останні книги"
STR_REMOVE_FROM_RECENTS: "Видалити з останніх книг?"
STR_NO_RECENT_BOOKS: "Немає останніх книг" STR_NO_RECENT_BOOKS: "Немає останніх книг"
STR_CALIBRE_DESC: "Бездротова передача на пристрій із Calibre" STR_CALIBRE_DESC: "Бездротова передача на пристрій із Calibre"
STR_FORGET_AND_REMOVE: "Забути мережу та видалити збережений пароль?" STR_FORGET_AND_REMOVE: "Забути мережу та видалити збережений пароль?"
+49 -43
View File
@@ -4,10 +4,10 @@
#include <HalStorage.h> #include <HalStorage.h>
#include <JPEGDEC.h> #include <JPEGDEC.h>
#include <Logging.h> #include <Logging.h>
#include <Memory.h>
#include <cstdio> #include <cstdio>
#include <cstring> #include <cstring>
#include <new>
#include "BitmapHelpers.h" #include "BitmapHelpers.h"
@@ -211,26 +211,26 @@ struct BmpConvertCtx {
// Accumulates one MCU row (up to MAX_MCU_HEIGHT source rows × srcWidth pixels) // Accumulates one MCU row (up to MAX_MCU_HEIGHT source rows × srcWidth pixels)
// Filled column-by-column as JPEGDEC callbacks arrive for the same MCU row // Filled column-by-column as JPEGDEC callbacks arrive for the same MCU row
std::unique_ptr<uint8_t[]> mcuBuf; uint8_t* mcuBuf;
// Y-axis area averaging accumulators (needsScaling only) // Y-axis area averaging accumulators (needsScaling only)
int currentOutY; int currentOutY;
uint32_t nextOutY_srcStart; // 16.16 fixed-point boundary for the next output row uint32_t nextOutY_srcStart; // 16.16 fixed-point boundary for the next output row
std::unique_ptr<uint32_t[]> rowAccum; uint32_t* rowAccum;
std::unique_ptr<uint32_t[]> rowCount; uint32_t* rowCount;
std::unique_ptr<uint8_t[]> bmpRow; uint8_t* bmpRow;
std::unique_ptr<AtkinsonDitherer> atkinsonDitherer; AtkinsonDitherer* atkinsonDitherer;
std::unique_ptr<FloydSteinbergDitherer> fsDitherer; FloydSteinbergDitherer* fsDitherer;
std::unique_ptr<Atkinson1BitDitherer> atkinson1BitDitherer; Atkinson1BitDitherer* atkinson1BitDitherer;
bool error; bool error;
}; };
// Write a fully-assembled output row (grayscale bytes, length outWidth) to BMP // Write a fully-assembled output row (grayscale bytes, length outWidth) to BMP
static void writeOutputRow(BmpConvertCtx* ctx, const uint8_t* srcRow, int outY) { static void writeOutputRow(BmpConvertCtx* ctx, const uint8_t* srcRow, int outY) {
memset(ctx->bmpRow.get(), 0, ctx->bytesPerRow); memset(ctx->bmpRow, 0, ctx->bytesPerRow);
if (USE_8BIT_OUTPUT && !ctx->oneBit) { if (USE_8BIT_OUTPUT && !ctx->oneBit) {
for (int x = 0; x < ctx->outWidth; x++) { for (int x = 0; x < ctx->outWidth; x++) {
@@ -262,12 +262,12 @@ static void writeOutputRow(BmpConvertCtx* ctx, const uint8_t* srcRow, int outY)
ctx->fsDitherer->nextRow(); ctx->fsDitherer->nextRow();
} }
ctx->bmpOut->write(ctx->bmpRow.get(), ctx->bytesPerRow); ctx->bmpOut->write(ctx->bmpRow, ctx->bytesPerRow);
} }
// Flush one scaled output row from Y-axis accumulators and advance currentOutY // Flush one scaled output row from Y-axis accumulators and advance currentOutY
static void flushScaledRow(BmpConvertCtx* ctx) { static void flushScaledRow(BmpConvertCtx* ctx) {
memset(ctx->bmpRow.get(), 0, ctx->bytesPerRow); memset(ctx->bmpRow, 0, ctx->bytesPerRow);
if (USE_8BIT_OUTPUT && !ctx->oneBit) { if (USE_8BIT_OUTPUT && !ctx->oneBit) {
for (int x = 0; x < ctx->outWidth; x++) { for (int x = 0; x < ctx->outWidth; x++) {
@@ -301,7 +301,7 @@ static void flushScaledRow(BmpConvertCtx* ctx) {
ctx->fsDitherer->nextRow(); ctx->fsDitherer->nextRow();
} }
ctx->bmpOut->write(ctx->bmpRow.get(), ctx->bytesPerRow); ctx->bmpOut->write(ctx->bmpRow, ctx->bytesPerRow);
ctx->currentOutY++; ctx->currentOutY++;
} }
@@ -324,7 +324,7 @@ int bmpDrawCallback(JPEGDRAW* pDraw) {
for (int r = 0; r < blockH && r < MAX_MCU_HEIGHT; r++) { for (int r = 0; r < blockH && r < MAX_MCU_HEIGHT; r++) {
const int copyW = (blockX + validW <= ctx->srcWidth) ? validW : (ctx->srcWidth - blockX); const int copyW = (blockX + validW <= ctx->srcWidth) ? validW : (ctx->srcWidth - blockX);
if (copyW <= 0) continue; if (copyW <= 0) continue;
memcpy(ctx->mcuBuf.get() + r * ctx->srcWidth + blockX, pixels + r * stride, copyW); memcpy(ctx->mcuBuf + r * ctx->srcWidth + blockX, pixels + r * stride, copyW);
} }
// Wait for the last MCU column before processing any rows // Wait for the last MCU column before processing any rows
@@ -334,7 +334,7 @@ int bmpDrawCallback(JPEGDRAW* pDraw) {
const int endRow = blockY + blockH; const int endRow = blockY + blockH;
for (int y = blockY; y < endRow && y < ctx->srcHeight; y++) { for (int y = blockY; y < endRow && y < ctx->srcHeight; y++) {
const uint8_t* srcRow = ctx->mcuBuf.get() + (y - blockY) * ctx->srcWidth; const uint8_t* srcRow = ctx->mcuBuf + (y - blockY) * ctx->srcWidth;
if (!ctx->needsScaling) { if (!ctx->needsScaling) {
// 1:1 — outWidth == srcWidth, write directly // 1:1 — outWidth == srcWidth, write directly
@@ -364,8 +364,8 @@ int bmpDrawCallback(JPEGDRAW* pDraw) {
flushScaledRow(ctx); flushScaledRow(ctx);
ctx->nextOutY_srcStart = static_cast<uint32_t>(ctx->currentOutY + 1) * ctx->scaleY_fp; ctx->nextOutY_srcStart = static_cast<uint32_t>(ctx->currentOutY + 1) * ctx->scaleY_fp;
if (srcY_fp >= ctx->nextOutY_srcStart) continue; if (srcY_fp >= ctx->nextOutY_srcStart) continue;
memset(ctx->rowAccum.get(), 0, ctx->outWidth * sizeof(uint32_t)); memset(ctx->rowAccum, 0, ctx->outWidth * sizeof(uint32_t));
memset(ctx->rowCount.get(), 0, ctx->outWidth * sizeof(uint32_t)); memset(ctx->rowCount, 0, ctx->outWidth * sizeof(uint32_t));
} }
} }
} }
@@ -387,20 +387,19 @@ bool JpegToBmpConverter::jpegFileToBmpStreamInternal(FsFile& jpegFile, Print& bm
s_jpegFile = &jpegFile; s_jpegFile = &jpegFile;
const auto jpeg = makeUniqueNoThrow<JPEGDEC>(); JPEGDEC* jpeg = new (std::nothrow) JPEGDEC();
if (!jpeg) { if (!jpeg) {
LOG_ERR("JPG", "OOM: JPEG decoder"); LOG_ERR("JPG", "Failed to allocate JPEG decoder");
return false; return false;
} }
int rc = jpeg->open("", bmpJpegOpen, bmpJpegClose, bmpJpegRead, bmpJpegSeek, bmpDrawCallback); int rc = jpeg->open("", bmpJpegOpen, bmpJpegClose, bmpJpegRead, bmpJpegSeek, bmpDrawCallback);
if (rc != 1) { if (rc != 1) {
LOG_ERR("JPG", "JPEG open failed (err=%d)", jpeg->getLastError()); LOG_ERR("JPG", "JPEG open failed (err=%d)", jpeg->getLastError());
delete jpeg;
return false; return false;
} }
const ScopedCleanup cleanup{[&jpeg]() { jpeg->close(); }};
const int srcWidth = jpeg->getWidth(); const int srcWidth = jpeg->getWidth();
const int srcHeight = jpeg->getHeight(); const int srcHeight = jpeg->getHeight();
@@ -412,6 +411,8 @@ bool JpegToBmpConverter::jpegFileToBmpStreamInternal(FsFile& jpegFile, Print& bm
if (srcWidth <= 0 || srcHeight <= 0 || srcWidth > MAX_IMAGE_WIDTH || srcHeight > MAX_IMAGE_HEIGHT) { if (srcWidth <= 0 || srcHeight <= 0 || srcWidth > MAX_IMAGE_WIDTH || srcHeight > MAX_IMAGE_HEIGHT) {
LOG_DBG("JPG", "Image too large or invalid (%dx%d), max supported: %dx%d", srcWidth, srcHeight, MAX_IMAGE_WIDTH, LOG_DBG("JPG", "Image too large or invalid (%dx%d), max supported: %dx%d", srcWidth, srcHeight, MAX_IMAGE_WIDTH,
MAX_IMAGE_HEIGHT); MAX_IMAGE_HEIGHT);
jpeg->close();
delete jpeg;
return false; return false;
} }
@@ -471,49 +472,54 @@ bool JpegToBmpConverter::jpegFileToBmpStreamInternal(FsFile& jpegFile, Print& bm
ctx.scaleY_fp = scaleY_fp; ctx.scaleY_fp = scaleY_fp;
ctx.error = false; ctx.error = false;
// RAII guard: frees all heap resources on any return path
struct Cleanup {
BmpConvertCtx& ctx;
JPEGDEC* jpeg;
~Cleanup() {
delete[] ctx.rowAccum;
delete[] ctx.rowCount;
delete ctx.atkinsonDitherer;
delete ctx.fsDitherer;
delete ctx.atkinson1BitDitherer;
free(ctx.mcuBuf);
free(ctx.bmpRow);
jpeg->close();
delete jpeg;
}
} cleanup{ctx, jpeg};
// MCU row buffer: MAX_MCU_HEIGHT rows × srcWidth columns of grayscale // MCU row buffer: MAX_MCU_HEIGHT rows × srcWidth columns of grayscale
ctx.mcuBuf = makeUniqueNoThrow<uint8_t[]>(MAX_MCU_HEIGHT * srcWidth); ctx.mcuBuf = static_cast<uint8_t*>(malloc(MAX_MCU_HEIGHT * srcWidth));
if (!ctx.mcuBuf) { if (!ctx.mcuBuf) {
LOG_ERR("JPG", "OOM: MCU buffer (%d bytes)", MAX_MCU_HEIGHT * srcWidth); LOG_ERR("JPG", "Failed to allocate MCU buffer (%d bytes)", MAX_MCU_HEIGHT * srcWidth);
return false; return false;
} }
memset(ctx.mcuBuf.get(), 0, MAX_MCU_HEIGHT * srcWidth); memset(ctx.mcuBuf, 0, MAX_MCU_HEIGHT * srcWidth);
ctx.bmpRow = makeUniqueNoThrow<uint8_t[]>(bytesPerRow); ctx.bmpRow = static_cast<uint8_t*>(malloc(bytesPerRow));
if (!ctx.bmpRow) { if (!ctx.bmpRow) {
LOG_ERR("JPG", "OOM: BMP row buffer"); LOG_ERR("JPG", "Failed to allocate BMP row buffer");
return false; return false;
} }
if (needsScaling) { if (needsScaling) {
ctx.rowAccum = makeUniqueNoThrow<uint32_t[]>(outWidth); ctx.rowAccum = new (std::nothrow) uint32_t[outWidth]();
ctx.rowCount = makeUniqueNoThrow<uint32_t[]>(outWidth); ctx.rowCount = new (std::nothrow) uint32_t[outWidth]();
if (!ctx.rowAccum || !ctx.rowCount) { if (!ctx.rowAccum || !ctx.rowCount) {
LOG_ERR("JPG", "OOM: scaling buffers"); LOG_ERR("JPG", "Failed to allocate scaling buffers");
return false; return false;
} }
ctx.nextOutY_srcStart = scaleY_fp; ctx.nextOutY_srcStart = scaleY_fp;
} }
if (oneBit) { if (oneBit) {
ctx.atkinson1BitDitherer = makeUniqueNoThrow<Atkinson1BitDitherer>(outWidth); ctx.atkinson1BitDitherer = new (std::nothrow) Atkinson1BitDitherer(outWidth);
if (!ctx.atkinson1BitDitherer) {
LOG_ERR("JPG", "OOM: Atkinson1BitDitherer");
return false;
}
} else if (!USE_8BIT_OUTPUT) { } else if (!USE_8BIT_OUTPUT) {
if (USE_ATKINSON) { if (USE_ATKINSON) {
ctx.atkinsonDitherer = makeUniqueNoThrow<AtkinsonDitherer>(outWidth); ctx.atkinsonDitherer = new (std::nothrow) AtkinsonDitherer(outWidth);
if (!ctx.atkinsonDitherer) {
LOG_ERR("JPG", "OOM: AtkinsonDitherer");
return false;
}
} else if (USE_FLOYD_STEINBERG) { } else if (USE_FLOYD_STEINBERG) {
ctx.fsDitherer = makeUniqueNoThrow<FloydSteinbergDitherer>(outWidth); ctx.fsDitherer = new (std::nothrow) FloydSteinbergDitherer(outWidth);
if (!ctx.fsDitherer) {
LOG_ERR("JPG", "OOM: FloydSteinbergDitherer");
return false;
}
} }
} }
+3 -3
View File
@@ -6,7 +6,7 @@
#include <ObfuscationUtils.h> #include <ObfuscationUtils.h>
#include <Serialization.h> #include <Serialization.h>
#include "KOReaderJsonIO.h" #include "../../src/JsonSettingsIO.h"
// Initialize the static instance // Initialize the static instance
KOReaderCredentialStore KOReaderCredentialStore::instance; KOReaderCredentialStore KOReaderCredentialStore::instance;
@@ -36,7 +36,7 @@ void legacyDeobfuscate(std::string& data) {
bool KOReaderCredentialStore::saveToFile() const { bool KOReaderCredentialStore::saveToFile() const {
Storage.mkdir("/.crosspoint"); Storage.mkdir("/.crosspoint");
return KOReaderJsonIO::save(*this, KOREADER_FILE_JSON); return JsonSettingsIO::saveKOReader(*this, KOREADER_FILE_JSON);
} }
bool KOReaderCredentialStore::loadFromFile() { bool KOReaderCredentialStore::loadFromFile() {
@@ -45,7 +45,7 @@ bool KOReaderCredentialStore::loadFromFile() {
String json = Storage.readFile(KOREADER_FILE_JSON); String json = Storage.readFile(KOREADER_FILE_JSON);
if (!json.isEmpty()) { if (!json.isEmpty()) {
bool resave = false; bool resave = false;
bool result = KOReaderJsonIO::load(*this, json.c_str(), &resave); bool result = JsonSettingsIO::loadKOReader(*this, json.c_str(), &resave);
if (result && resave) { if (result && resave) {
saveToFile(); saveToFile();
LOG_DBG("KRS", "Resaved KOReader credentials to update format"); LOG_DBG("KRS", "Resaved KOReader credentials to update format");
@@ -8,6 +8,12 @@ enum class DocumentMatchMethod : uint8_t {
BINARY = 1, // Match by partial MD5 of file content (more accurate, but files must be identical) BINARY = 1, // Match by partial MD5 of file content (more accurate, but files must be identical)
}; };
class KOReaderCredentialStore;
namespace JsonSettingsIO {
bool saveKOReader(const KOReaderCredentialStore& store, const char* path);
bool loadKOReader(KOReaderCredentialStore& store, const char* json, bool* needsResave);
} // namespace JsonSettingsIO
/** /**
* Singleton class for storing KOReader sync credentials on the SD card. * Singleton class for storing KOReader sync credentials on the SD card.
* Passwords are XOR-obfuscated with the device's unique hardware MAC address * Passwords are XOR-obfuscated with the device's unique hardware MAC address
@@ -27,6 +33,9 @@ class KOReaderCredentialStore {
bool loadFromBinaryFile(); bool loadFromBinaryFile();
friend bool JsonSettingsIO::saveKOReader(const KOReaderCredentialStore&, const char*);
friend bool JsonSettingsIO::loadKOReader(KOReaderCredentialStore&, const char*, bool*);
public: public:
// Delete copy constructor and assignment // Delete copy constructor and assignment
KOReaderCredentialStore(const KOReaderCredentialStore&) = delete; KOReaderCredentialStore(const KOReaderCredentialStore&) = delete;
-51
View File
@@ -1,51 +0,0 @@
#include "KOReaderJsonIO.h"
#include <ArduinoJson.h>
#include <HalStorage.h>
#include <Logging.h>
#include <ObfuscationUtils.h>
#include "KOReaderCredentialStore.h"
namespace KOReaderJsonIO {
bool save(const KOReaderCredentialStore& store, const char* path) {
JsonDocument doc;
doc["username"] = store.getUsername();
doc["password_obf"] = obfuscation::obfuscateToBase64(store.getPassword());
doc["serverUrl"] = store.getServerUrl();
doc["matchMethod"] = static_cast<uint8_t>(store.getMatchMethod());
String json;
serializeJson(doc, json);
return Storage.writeFile(path, json);
}
bool load(KOReaderCredentialStore& store, const char* json, bool* needsResave) {
if (needsResave) *needsResave = false;
JsonDocument doc;
auto error = deserializeJson(doc, json);
if (error) {
LOG_ERR("KRS", "JSON parse error: %s", error.c_str());
return false;
}
std::string user = doc["username"] | std::string("");
bool ok = false;
std::string pass = obfuscation::deobfuscateFromBase64(doc["password_obf"] | "", &ok);
if (!ok || pass.empty()) {
pass = doc["password"] | std::string("");
if (!pass.empty() && needsResave) *needsResave = true;
}
store.setCredentials(user, pass);
store.setServerUrl(doc["serverUrl"] | std::string(""));
uint8_t method = doc["matchMethod"] | (uint8_t)0;
store.setMatchMethod(static_cast<DocumentMatchMethod>(method));
return true;
}
} // namespace KOReaderJsonIO
-8
View File
@@ -1,8 +0,0 @@
#pragma once
class KOReaderCredentialStore;
namespace KOReaderJsonIO {
bool save(const KOReaderCredentialStore& store, const char* path);
bool load(KOReaderCredentialStore& store, const char* json, bool* needsResave);
} // namespace KOReaderJsonIO
+11 -5
View File
@@ -2,6 +2,7 @@
#include <ArduinoJson.h> #include <ArduinoJson.h>
#include <Logging.h> #include <Logging.h>
#include <base64.h>
#include <esp_crt_bundle.h> #include <esp_crt_bundle.h>
#include <esp_http_client.h> #include <esp_http_client.h>
@@ -74,11 +75,6 @@ esp_http_client_handle_t createClient(const char* url, ResponseBuffer* buf,
config.buffer_size_tx = HTTP_BUF_SIZE; config.buffer_size_tx = HTTP_BUF_SIZE;
config.crt_bundle_attach = esp_crt_bundle_attach; config.crt_bundle_attach = esp_crt_bundle_attach;
// HTTP Basic Auth for Calibre-Web-Automated compatibility
config.username = KOREADER_STORE.getUsername().c_str();
config.password = KOREADER_STORE.getPassword().c_str();
config.auth_type = HTTP_AUTH_TYPE_BASIC;
esp_http_client_handle_t client = esp_http_client_init(&config); esp_http_client_handle_t client = esp_http_client_init(&config);
if (!client) return nullptr; if (!client) return nullptr;
@@ -91,6 +87,16 @@ esp_http_client_handle_t createClient(const char* url, ResponseBuffer* buf,
return nullptr; return nullptr;
} }
// HTTP Basic Auth for Calibre-Web-Automated compatibility
std::string credentials = KOREADER_STORE.getUsername() + ":" + KOREADER_STORE.getPassword();
String encoded = base64::encode(reinterpret_cast<const uint8_t*>(credentials.data()), credentials.size());
std::string authHeader = "Basic " + std::string(encoded.c_str());
if (esp_http_client_set_header(client, "Authorization", authHeader.c_str()) != ESP_OK) {
LOG_ERR("KOSync", "Failed to set Authorization header");
esp_http_client_cleanup(client);
return nullptr;
}
return client; return client;
} }
} // namespace } // namespace
-54
View File
@@ -1,54 +0,0 @@
#pragma once
#include <cstddef>
#include <memory>
#include <new>
#include <type_traits>
#include <utility>
// Nothrow versions of std::make_unique. Return nullptr on allocation failure
// instead of calling abort() (the default when exceptions are disabled on ESP32).
//
// Single object:
// auto obj = makeUniqueNoThrow<PNG>();
// if (!obj) { LOG_ERR("TAG", "OOM"); return false; }
//
// Array:
// auto buf = makeUniqueNoThrow<uint8_t[]>(size);
// if (!buf) { LOG_ERR("TAG", "OOM"); return false; }
// buf[0] = 0xFF;
// someApi(buf.get(), size);
//
template <typename T, typename... Args>
requires(!std::is_array_v<T>)
std::unique_ptr<T> makeUniqueNoThrow(Args&&... args) {
return std::unique_ptr<T>(new (std::nothrow) T(std::forward<Args>(args)...));
}
template <typename T>
requires std::is_unbounded_array_v<T>
std::unique_ptr<T> makeUniqueNoThrow(size_t count) {
using Elem = std::remove_extent_t<T>;
return std::unique_ptr<T>(new (std::nothrow) Elem[count]());
}
// Helper struct to call a cleanup function on exit from any scope.
// Use with a lambda to avoid unnecessary allocations from std::function/std::bind:
// Example:
// auto jpeg = makeUniqueNoThrow<JPEGDEC>();
// ScopedCleanup cleanup{[&jpeg]{ jpeg->close(); }};
//
template <typename F>
struct [[nodiscard]] ScopedCleanup final {
const F fn;
explicit ScopedCleanup(F f) : fn{std::move(f)} {}
ScopedCleanup(const ScopedCleanup&) = delete;
ScopedCleanup& operator=(const ScopedCleanup&) = delete;
ScopedCleanup(ScopedCleanup&&) = delete;
ScopedCleanup& operator=(ScopedCleanup&&) = delete;
~ScopedCleanup() { fn(); }
};
template <typename F>
ScopedCleanup(F) -> ScopedCleanup<F>;
-8
View File
@@ -110,16 +110,8 @@ void XMLCALL OpdsParser::startElement(void* userData, const XML_Char* name, cons
if (self->inEntry) { if (self->inEntry) {
if (rel && type && strstr(rel, "opds-spec.org/acquisition") != nullptr && if (rel && type && strstr(rel, "opds-spec.org/acquisition") != nullptr &&
strcmp(type, "application/epub+zip") == 0) { strcmp(type, "application/epub+zip") == 0) {
// Prefer plain EPUB links over derived formats when multiple
// acquisition links are present for one entry.
const bool isPlainEpub = strstr(href, ".epub") != nullptr || strstr(href, "/epub/") != nullptr;
const bool alreadyHasPlainEpub = self->currentEntry.type == OpdsEntryType::BOOK &&
(self->currentEntry.href.find(".epub") != std::string::npos ||
self->currentEntry.href.find("/epub/") != std::string::npos);
if (self->currentEntry.type != OpdsEntryType::BOOK || (isPlainEpub && !alreadyHasPlainEpub)) {
self->currentEntry.type = OpdsEntryType::BOOK; self->currentEntry.type = OpdsEntryType::BOOK;
self->currentEntry.href = href; self->currentEntry.href = href;
}
} else if (type && strstr(type, "application/atom+xml") != nullptr) { } else if (type && strstr(type, "application/atom+xml") != nullptr) {
if (self->currentEntry.type != OpdsEntryType::BOOK) { if (self->currentEntry.type != OpdsEntryType::BOOK) {
self->currentEntry.type = OpdsEntryType::NAVIGATION; self->currentEntry.type = OpdsEntryType::NAVIGATION;
-15
View File
@@ -155,21 +155,6 @@ bool Txt::generateCoverBmp() const {
return false; return false;
} }
bool Txt::clearCache() const {
if (!Storage.exists(cachePath.c_str())) {
LOG_DBG("TXT", "Cache does not exist, no action needed");
return true;
}
if (!Storage.removeDir(cachePath.c_str())) {
LOG_ERR("TXT", "Failed to clear cache");
return false;
}
LOG_DBG("TXT", "Cache cleared successfully");
return true;
}
bool Txt::readContent(uint8_t* buffer, size_t offset, size_t length) const { bool Txt::readContent(uint8_t* buffer, size_t offset, size_t length) const {
if (!loaded) { if (!loaded) {
return false; return false;
-1
View File
@@ -22,7 +22,6 @@ class Txt {
[[nodiscard]] size_t getFileSize() const { return fileSize; } [[nodiscard]] size_t getFileSize() const { return fileSize; }
void setupCacheDir() const; void setupCacheDir() const;
bool clearCache() const;
// Cover image support - looks for cover.bmp/jpg/jpeg/png in same folder as txt file // Cover image support - looks for cover.bmp/jpg/jpeg/png in same folder as txt file
[[nodiscard]] std::string getCoverBmpPath() const; [[nodiscard]] std::string getCoverBmpPath() const;
-182
View File
@@ -1,182 +0,0 @@
#include "HalClock.h"
#include <Logging.h>
#include <WiFi.h>
#include <esp_sntp.h>
#include <time.h>
#include <cassert>
HalClock halClock; // Singleton instance
// DS3231 register layout (BCD encoded):
// 0x00: Seconds (bits 6-4 = tens, bits 3-0 = ones)
// 0x01: Minutes (bits 6-4 = tens, bits 3-0 = ones)
// 0x02: Hours (bit 6 = 12/24 mode, bits 5-4 = tens, bits 3-0 = ones)
static uint8_t bcdToDec(uint8_t bcd) { return ((bcd >> 4) * 10) + (bcd & 0x0F); }
static uint8_t decToBcd(uint8_t dec) { return ((dec / 10) << 4) | (dec % 10); }
void HalClock::begin() {
if (!gpio.deviceIsX3()) {
_available = false;
return;
}
// I2C is already initialised by HalPowerManager::begin() for X3.
// Probe the DS3231 by reading the seconds register.
Wire.beginTransmission(I2C_ADDR_DS3231);
Wire.write(DS3231_SEC_REG);
if (Wire.endTransmission(false) != 0) {
LOG_INF("CLK", "DS3231 RTC not found");
_available = false;
return;
}
Wire.requestFrom(I2C_ADDR_DS3231, (uint8_t)1);
if (Wire.available() < 1) {
_available = false;
return;
}
Wire.read(); // discard — just testing connectivity
_available = true;
LOG_INF("CLK", "DS3231 RTC found");
// Prime the cache with an initial read
uint8_t h, m;
getTime(h, m);
}
bool HalClock::getTime(uint8_t& hour, uint8_t& minute) const {
if (!_available) return false;
const unsigned long now = millis();
if (_lastPollMs != 0 && (now - _lastPollMs) < CLOCK_POLL_MS) {
hour = _cachedHour;
minute = _cachedMinute;
return true;
}
// Read 3 bytes starting at register 0x00: seconds, minutes, hours
Wire.beginTransmission(I2C_ADDR_DS3231);
Wire.write(DS3231_SEC_REG);
if (Wire.endTransmission(false) != 0) {
if (!_hasCachedTime) return false;
_lastPollMs = now;
hour = _cachedHour;
minute = _cachedMinute;
return true;
}
Wire.requestFrom(I2C_ADDR_DS3231, (uint8_t)3);
if (Wire.available() < 3) {
if (!_hasCachedTime) return false;
_lastPollMs = now;
hour = _cachedHour;
minute = _cachedMinute;
return true;
}
Wire.read(); // seconds — not needed
const uint8_t rawMin = Wire.read();
const uint8_t rawHour = Wire.read();
_cachedMinute = bcdToDec(rawMin & 0x7F);
// Handle 12/24h mode: bit 6 high = 12h mode
if (rawHour & 0x40) {
// 12h mode: bit 5 = PM, bits 4-0 = hours (1-12)
uint8_t h12 = bcdToDec(rawHour & 0x1F);
bool pm = rawHour & 0x20;
if (h12 == 12) h12 = 0;
_cachedHour = pm ? (h12 + 12) : h12;
} else {
// 24h mode: bits 5-0 = hours (0-23)
_cachedHour = bcdToDec(rawHour & 0x3F);
}
_lastPollMs = now;
_hasCachedTime = true;
hour = _cachedHour;
minute = _cachedMinute;
return true;
}
bool HalClock::formatTime(char* buf, size_t bufSize, uint8_t utcOffsetQuarterHoursBiased, bool use12Hour) const {
if (bufSize < (use12Hour ? 9u : 6u)) return false;
uint8_t h, m;
if (!getTime(h, m)) return false;
// Apply UTC offset: convert biased value to signed quarter-hours.
// Clamp against corrupted persisted values so display time can't drift outside [-12:00, +14:00].
if (utcOffsetQuarterHoursBiased > 104) utcOffsetQuarterHoursBiased = 104;
int offsetQuarterHours = static_cast<int>(utcOffsetQuarterHoursBiased) - 48;
int totalMinutes = static_cast<int>(h) * 60 + static_cast<int>(m) + offsetQuarterHours * 15;
// Wrap around 24 hours
totalMinutes = ((totalMinutes % 1440) + 1440) % 1440;
const int hour24 = totalMinutes / 60;
const int min = totalMinutes % 60;
if (use12Hour) {
const bool pm = hour24 >= 12;
int hour12 = hour24 % 12;
if (hour12 == 0) hour12 = 12;
snprintf(buf, bufSize, "%d:%02d %s", hour12, min, pm ? "PM" : "AM");
} else {
snprintf(buf, bufSize, "%02d:%02d", hour24, min);
}
return true;
}
bool HalClock::writeTimeToRTC(uint8_t hour, uint8_t minute, uint8_t second) {
assert(hour < 24);
assert(minute < 60);
assert(second < 60);
Wire.beginTransmission(I2C_ADDR_DS3231);
Wire.write(DS3231_SEC_REG); // Start at register 0x00
Wire.write(decToBcd(second)); // 0x00: Seconds
Wire.write(decToBcd(minute)); // 0x01: Minutes
Wire.write(decToBcd(hour)); // 0x02: Hours (24h mode, bit 6 = 0)
if (Wire.endTransmission() != 0) {
LOG_ERR("CLK", "Failed to write time to DS3231");
return false;
}
// Invalidate cache so next read fetches fresh data
_lastPollMs = 0;
_cachedHour = hour;
_cachedMinute = minute;
_hasCachedTime = true;
return true;
}
bool HalClock::syncFromNTP() {
if (!_available) return false;
if (WiFi.status() != WL_CONNECTED) {
LOG_ERR("CLK", "WiFi not connected, cannot sync NTP");
return false;
}
LOG_INF("CLK", "Starting NTP sync...");
configTzTime("UTC0", "pool.ntp.org", "time.nist.gov");
// Wait for SNTP sync to complete (up to 5 seconds)
constexpr int maxAttempts = 50;
for (int i = 0; i < maxAttempts; i++) {
if (sntp_get_sync_status() == SNTP_SYNC_STATUS_COMPLETED) {
time_t now = time(nullptr);
struct tm timeinfo;
gmtime_r(&now, &timeinfo);
if (writeTimeToRTC(timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec)) {
LOG_INF("CLK", "RTC set to %02d:%02d:%02d UTC", timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
return true;
}
return false;
}
delay(100);
}
LOG_ERR("CLK", "NTP sync timed out");
return false;
}
-48
View File
@@ -1,48 +0,0 @@
#pragma once
#include <Arduino.h>
#include <Wire.h>
#include "HalGPIO.h"
class HalClock;
extern HalClock halClock; // Singleton
class HalClock {
bool _available = false;
mutable uint8_t _cachedHour = 0;
mutable uint8_t _cachedMinute = 0;
mutable bool _hasCachedTime = false;
mutable unsigned long _lastPollMs = 0;
static constexpr unsigned long CLOCK_POLL_MS = 10000; // 10 seconds
public:
// Call after gpio.begin() and powerManager.begin() (I2C already initialised for X3)
void begin();
// True if the DS3231 RTC is present on this device
bool isAvailable() const { return _available; }
// Get current hour (0-23) and minute (0-59).
// Returns false if RTC is not available.
bool getTime(uint8_t& hour, uint8_t& minute) const;
// Format time into a caller-provided buffer.
// 24h mode produces "HH:MM" (needs >=6 bytes); 12h mode produces "H:MM AM"/"HH:MM PM" (needs >=9 bytes).
// utcOffsetQuarterHoursBiased: biased quarter-hour offset (48 = UTC+0, 0 = UTC-12, 104 = UTC+14).
// use12Hour: when true, format as 12-hour clock with AM/PM suffix.
// Returns false if RTC is not available.
bool formatTime(char* buf, size_t bufSize, uint8_t utcOffsetQuarterHoursBiased = 48, bool use12Hour = false) const;
// Sync the DS3231 RTC from an NTP server. Requires WiFi to be connected.
// Blocks for up to ~5s while waiting for SNTP response.
// Returns true if the RTC was successfully updated.
//
// Debouncing (skip if already synced once) is enforced by the caller, not here,
// so the HAL stays free of any app-layer settings dependency.
bool syncFromNTP();
private:
bool writeTimeToRTC(uint8_t hour, uint8_t minute, uint8_t second);
};
+2 -9
View File
@@ -10,7 +10,7 @@ HalDisplay::HalDisplay() : einkDisplay(EPD_SCLK, EPD_MOSI, EPD_CS, EPD_DC, EPD_R
HalDisplay::~HalDisplay() {} HalDisplay::~HalDisplay() {}
void HalDisplay::begin(bool seamless) { void HalDisplay::begin() {
// Set X3-specific panel mode before initializing. // Set X3-specific panel mode before initializing.
if (gpio.deviceIsX3()) { if (gpio.deviceIsX3()) {
einkDisplay.setDisplayX3(); einkDisplay.setDisplayX3();
@@ -18,14 +18,7 @@ void HalDisplay::begin(bool seamless) {
einkDisplay.begin(); einkDisplay.begin();
if (seamless) { // Request resync after specific wakeup events to ensure clean display state
// Defuse the SDK's X3 _x3InitialFullSyncsRemaining counter (no-op on X4)
// so the first paint isn't promoted to FULL (~770ms). Skips the wakeup-
// gated requestResync() below for the same reason.
einkDisplay.skipInitialResync();
return;
}
// Request resync after specific wakeup events to ensure clean display state.
const auto wakeupReason = gpio.getWakeupReason(); const auto wakeupReason = gpio.getWakeupReason();
if (wakeupReason == HalGPIO::WakeupReason::PowerButton || wakeupReason == HalGPIO::WakeupReason::AfterFlash || if (wakeupReason == HalGPIO::WakeupReason::PowerButton || wakeupReason == HalGPIO::WakeupReason::AfterFlash ||
wakeupReason == HalGPIO::WakeupReason::Other) { wakeupReason == HalGPIO::WakeupReason::Other) {
+2 -7
View File
@@ -17,13 +17,8 @@ class HalDisplay {
FAST_REFRESH // Fast refresh using custom LUT FAST_REFRESH // Fast refresh using custom LUT
}; };
// Pass seamless=true on any path where the panel already shows the // Initialize the display hardware and driver
// content it should after begin() returns (silent reboot's popup, void begin();
// sleep-wake with a restored buffer). Skips the wakeup-gated
// requestResync() and defuses the SDK's X3 _x3InitialFullSyncsRemaining
// counter; otherwise the first two paints get promoted to FULL
// (~770ms each on X3).
void begin(bool seamless = false);
// Display dimensions // Display dimensions
static constexpr uint16_t DISPLAY_WIDTH = EInkDisplay::DISPLAY_WIDTH; static constexpr uint16_t DISPLAY_WIDTH = EInkDisplay::DISPLAY_WIDTH;
+2 -4
View File
@@ -223,8 +223,6 @@ bool HalGPIO::wasAnyReleased() const { return inputMgr.wasAnyReleased(); }
unsigned long HalGPIO::getHeldTime() const { return inputMgr.getHeldTime(); } unsigned long HalGPIO::getHeldTime() const { return inputMgr.getHeldTime(); }
unsigned long HalGPIO::getPowerButtonHeldTime() const { return inputMgr.getPowerButtonHeldTime(); }
void HalGPIO::startDeepSleep() { void HalGPIO::startDeepSleep() {
// Ensure that the power button has been released to avoid immediately turning back on if you're holding it // Ensure that the power button has been released to avoid immediately turning back on if you're holding it
while (inputMgr.isPressed(BTN_POWER)) { while (inputMgr.isPressed(BTN_POWER)) {
@@ -260,8 +258,8 @@ void HalGPIO::verifyPowerButtonWakeup(uint16_t requiredDurationMs, bool shortPre
do { do {
delay(10); delay(10);
inputMgr.update(); inputMgr.update();
} while (inputMgr.isPressed(BTN_POWER) && inputMgr.getPowerButtonHeldTime() < calibratedDuration); } while (inputMgr.isPressed(BTN_POWER) && inputMgr.getHeldTime() < calibratedDuration);
if (inputMgr.getPowerButtonHeldTime() < calibratedDuration) { if (inputMgr.getHeldTime() < calibratedDuration) {
startDeepSleep(); startDeepSleep();
} }
} else { } else {
-1
View File
@@ -70,7 +70,6 @@ class HalGPIO {
bool wasReleased(uint8_t buttonIndex) const; bool wasReleased(uint8_t buttonIndex) const;
bool wasAnyReleased() const; bool wasAnyReleased() const;
unsigned long getHeldTime() const; unsigned long getHeldTime() const;
unsigned long getPowerButtonHeldTime() const;
// Setup wake up GPIO and enter deep sleep // Setup wake up GPIO and enter deep sleep
void startDeepSleep(); void startDeepSleep();
-9
View File
@@ -66,15 +66,6 @@ void HalPowerManager::startDeepSleep(HalGPIO& gpio) const {
delay(50); delay(50);
gpio.update(); gpio.update();
} }
#ifdef ENABLE_SERIAL_LOG
// Tear down HWCDC so the host sees a clean disconnect and the peripheral
// doesn't hold power domains that interfere with USB-powered GPIO wake.
// logSerial is the raw HWCDC reference; Serial is the MySerialImpl proxy
// (which doesn't expose end()).
logSerial.end();
#endif
// Pre-sleep routines from the original firmware // Pre-sleep routines from the original firmware
// GPIO13 is connected to battery latch MOSFET, we need to make sure it's low during sleep // GPIO13 is connected to battery latch MOSFET, we need to make sure it's low during sleep
// Note that this means the MCU will be completely powered off during sleep, including RTC // Note that this means the MCU will be completely powered off during sleep, including RTC
+7 -19
View File
@@ -12,13 +12,7 @@
HalStorage HalStorage::instance; HalStorage HalStorage::instance;
HalStorage::HalStorage() { HalStorage::HalStorage() {
// Recursive so the same task can re-enter StorageLock without self-deadlock. storageMutex = xSemaphoreCreateMutex();
// openFileForRead/Write take the lock and then assign to a HalFile&
// out-param; if that out-param already held an Impl, its destructor takes
// the lock again to close the prior FsFile under serialization (see
// HalFile::Impl::~Impl below). Priority inheritance still applies to
// recursive mutexes.
storageMutex = xSemaphoreCreateRecursiveMutex();
assert(storageMutex != nullptr); assert(storageMutex != nullptr);
} }
@@ -32,8 +26,8 @@ bool HalStorage::ready() const { return SDCard.ready(); }
class HalStorage::StorageLock { class HalStorage::StorageLock {
public: public:
StorageLock() { xSemaphoreTakeRecursive(HalStorage::getInstance().storageMutex, portMAX_DELAY); } StorageLock() { xSemaphoreTake(HalStorage::getInstance().storageMutex, portMAX_DELAY); }
~StorageLock() { xSemaphoreGiveRecursive(HalStorage::getInstance().storageMutex); } ~StorageLock() { xSemaphoreGive(HalStorage::getInstance().storageMutex); }
}; };
#define HAL_STORAGE_WRAPPED_CALL(method, ...) \ #define HAL_STORAGE_WRAPPED_CALL(method, ...) \
@@ -63,23 +57,17 @@ bool HalStorage::ensureDirectoryExists(const char* path) { HAL_STORAGE_WRAPPED_C
class HalFile::Impl { class HalFile::Impl {
public: public:
Impl(FsFile&& fsFile) : file(std::move(fsFile)) {} Impl(FsFile&& fsFile) : file(std::move(fsFile)) {}
// SdFat is not thread-safe; FsFile::close() touches SD/SPI and must run
// under StorageLock or it races SdSpiCard::m_spiActive across tasks and
// trips FreeRTOS's xTaskPriorityDisinherit assert. The FsFile member
// destructor (DESTRUCTOR_CLOSES_FILE=1) will close() again after the lock
// releases, but close() on an already-closed FsFile is a no-op. See SdFat
// issue #518 and the HAL note in CLAUDE.md.
~Impl() {
HalStorage::StorageLock lock;
file.close();
}
FsFile file; FsFile file;
}; };
HalFile::HalFile() = default; HalFile::HalFile() = default;
HalFile::HalFile(std::unique_ptr<Impl> impl) : impl(std::move(impl)) {} HalFile::HalFile(std::unique_ptr<Impl> impl) : impl(std::move(impl)) {}
HalFile::~HalFile() = default; HalFile::~HalFile() = default;
HalFile::HalFile(HalFile&&) = default; HalFile::HalFile(HalFile&&) = default;
HalFile& HalFile::operator=(HalFile&&) = default; HalFile& HalFile::operator=(HalFile&&) = default;
HalFile HalStorage::open(const char* path, const oflag_t oflag) { HalFile HalStorage::open(const char* path, const oflag_t oflag) {
+2 -1
View File
@@ -52,6 +52,7 @@ extra_scripts =
pre:scripts/build_html.py pre:scripts/build_html.py
pre:scripts/gen_i18n.py pre:scripts/gen_i18n.py
pre:scripts/git_branch.py pre:scripts/git_branch.py
pre:scripts/patch_jpegdec.py
; Libraries ; Libraries
lib_deps = lib_deps =
@@ -62,7 +63,7 @@ lib_deps =
bblanchon/ArduinoJson @ 7.4.2 bblanchon/ArduinoJson @ 7.4.2
ricmoo/QRCode @ 0.0.1 ricmoo/QRCode @ 0.0.1
bitbank2/PNGdec @ ^1.0.0 bitbank2/PNGdec @ ^1.0.0
https://github.com/crosspoint-reader/JPEGDEC.git#dac4cfec6eec23289e7fd9f08e1e796cb3c5ef60 https://github.com/bitbank2/JPEGDEC.git#86282979224c8a32fd51e091ed5a35b0c699a52b
links2004/WebSockets @ 2.7.3 links2004/WebSockets @ 2.7.3
[env:default] [env:default]
+1 -1
View File
@@ -60,7 +60,7 @@ def write_header(path: pathlib.Path, blob: bytes, symbol: str) -> None:
#include <cstddef> #include <cstddef>
#include <cstdint> #include <cstdint>
#include "Epub/hyphenation/SerializedHyphenationTrie.h" #include "../SerializedHyphenationTrie.h"
// Auto-generated by generate_hyphenation_trie.py. Do not edit manually. // Auto-generated by generate_hyphenation_trie.py. Do not edit manually.
alignas(4) constexpr uint8_t {data_symbol}[] = {{ alignas(4) constexpr uint8_t {data_symbol}[] = {{
+68
View File
@@ -0,0 +1,68 @@
"""
PlatformIO pre-build script: patch JPEGDEC for MCU_SKIP wild pointer crash.
Problem:
JPEGDecodeMCU_P computes pMCU = &sMCUs[iMCU & 0xffffff]. When iMCU is
MCU_SKIP (-8), the bitmask produces index 0xFFFFF8 (16 777 208), creating a
pointer ~33 MB past the 392-entry sMCUs array. If the progressive JPEG's
first scan includes AC coefficients (iScanEnd > 0), the AC decode loop writes
through this wild pointer and crashes with a store-access fault.
Upstream commit 8628297 guarded the DC coefficient write (pMCU[0]) but not the
AC coefficient writes at indices 1-63.
Fix:
Redirect pMCU to sMCUs[0] when MCU_SKIP is active. Writes to sMCUs[1..63]
are harmless: for JPEG_SCALE_EIGHTH only sMCUs[0] is read for output, and
the DC write at sMCUs[0] is already guarded by the existing `if (iMCU >= 0)`
check.
Applied idempotently safe to run on every build.
"""
Import("env")
import os
def patch_jpegdec(env):
libdeps_dir = os.path.join(env["PROJECT_DIR"], ".pio", "libdeps")
if not os.path.isdir(libdeps_dir):
return
for env_dir in os.listdir(libdeps_dir):
jpeg_inl = os.path.join(libdeps_dir, env_dir, "JPEGDEC", "src", "jpeg.inl")
if os.path.isfile(jpeg_inl):
_apply_mcu_skip_pointer_fix(jpeg_inl)
def _apply_mcu_skip_pointer_fix(filepath):
MARKER = "// CrossPoint patch: safe pMCU for MCU_SKIP"
with open(filepath, "r") as f:
content = f.read()
if MARKER in content:
return # already patched
# The wild-pointer line in JPEGDecodeMCU_P:
OLD = " signed short *pMCU = &pJPEG->sMCUs[iMCU & 0xffffff];"
NEW = (
" " + MARKER + "\n"
" signed short *pMCU = (iMCU < 0) ? pJPEG->sMCUs\n"
" : &pJPEG->sMCUs[iMCU & 0xffffff];"
)
if OLD not in content:
print(
"WARNING: JPEGDEC MCU_SKIP pointer patch target not found in %s "
"— library may have been updated" % filepath
)
return
content = content.replace(OLD, NEW, 1)
with open(filepath, "w") as f:
f.write(content)
print("Patched JPEGDEC: safe pMCU for MCU_SKIP in JPEGDecodeMCU_P: %s" % filepath)
# Run immediately at script import time (before compilation).
patch_jpegdec(env)
-2
View File
@@ -23,5 +23,3 @@ process es
process ru process ru
process it process it
process uk process uk
process pl
process sv
-4
View File
@@ -240,8 +240,6 @@ bool CrossPointSettings::loadFromBinaryFile() {
if (++settingsRead >= fileSettingsCount) break; if (++settingsRead >= fileSettingsCount) break;
serialization::readPod(inputFile, embeddedStyle); serialization::readPod(inputFile, embeddedStyle);
if (++settingsRead >= fileSettingsCount) break; if (++settingsRead >= fileSettingsCount) break;
serialization::readPod(inputFile, frontButtonFollowOrientation);
if (++settingsRead >= fileSettingsCount) break;
} while (false); } while (false);
if (frontButtonMappingRead) { if (frontButtonMappingRead) {
@@ -307,8 +305,6 @@ unsigned long CrossPointSettings::getSleepTimeoutMs() const {
switch (sleepTimeout) { switch (sleepTimeout) {
case SLEEP_1_MIN: case SLEEP_1_MIN:
return 1UL * 60 * 1000; return 1UL * 60 * 1000;
case SLEEP_3_MIN:
return 3UL * 60 * 1000;
case SLEEP_5_MIN: case SLEEP_5_MIN:
return 5UL * 60 * 1000; return 5UL * 60 * 1000;
case SLEEP_10_MIN: case SLEEP_10_MIN:
-26
View File
@@ -24,7 +24,6 @@ class CrossPointSettings {
COVER = 3, COVER = 3,
BLANK = 4, BLANK = 4,
COVER_CUSTOM = 5, COVER_CUSTOM = 5,
QUICK_RESUME = 6,
SLEEP_SCREEN_MODE_COUNT SLEEP_SCREEN_MODE_COUNT
}; };
enum SLEEP_SCREEN_COVER_MODE { FIT = 0, CROP = 1, SLEEP_SCREEN_COVER_MODE_COUNT }; enum SLEEP_SCREEN_COVER_MODE { FIT = 0, CROP = 1, SLEEP_SCREEN_COVER_MODE_COUNT };
@@ -120,7 +119,6 @@ class CrossPointSettings {
SLEEP_10_MIN = 2, SLEEP_10_MIN = 2,
SLEEP_15_MIN = 3, SLEEP_15_MIN = 3,
SLEEP_30_MIN = 4, SLEEP_30_MIN = 4,
SLEEP_3_MIN = 5,
SLEEP_TIMEOUT_COUNT SLEEP_TIMEOUT_COUNT
}; };
@@ -156,12 +154,6 @@ class CrossPointSettings {
enum TILT_PAGE_TURN { TILT_OFF = 0, TILT_NORMAL = 1, TILT_NVERTED = 2, TILT_PAGE_TURN_COUNT }; enum TILT_PAGE_TURN { TILT_OFF = 0, TILT_NORMAL = 1, TILT_NVERTED = 2, TILT_PAGE_TURN_COUNT };
enum QUICK_RESUME_SLEEP_SCREEN {
QUICK_RESUME_NEVER = 0,
QUICK_RESUME_AFTER_TIMEOUT = 1,
QUICK_RESUME_SLEEP_SCREEN_COUNT
};
// Sleep screen settings // Sleep screen settings
uint8_t sleepScreen = DARK; uint8_t sleepScreen = DARK;
// Sleep screen cover mode settings // Sleep screen cover mode settings
@@ -177,17 +169,6 @@ class CrossPointSettings {
uint8_t statusBarTitle = CHAPTER_TITLE; uint8_t statusBarTitle = CHAPTER_TITLE;
uint8_t statusBarBattery = 1; uint8_t statusBarBattery = 1;
uint8_t xtcStatusBarMode = XTC_STATUS_BAR_HIDE; uint8_t xtcStatusBarMode = XTC_STATUS_BAR_HIDE;
// Clock display in status bar (X3 only, requires DS3231 RTC)
uint8_t statusBarClock = 0;
// Clock UTC offset in quarter-hour steps, biased by 48 so it fits in uint8_t.
// Value 48 = UTC+0, 0 = UTC-12:00, 104 = UTC+14:00.
// Quarter-hour granularity supports oddball zones like Nepal (+5:45) and Chatham (+12:45).
uint8_t clockUtcOffsetQ = 48;
// Clock display format: 0 = 24-hour, 1 = 12-hour
uint8_t clockFormat = 0;
// Set once an NTP sync succeeds. Used to skip re-syncing on every WiFi connect.
// Resetting to 0 (e.g. via the web UI) forces a re-sync on next WiFi connect.
uint8_t clockHasBeenSynced = 0;
// Text rendering settings // Text rendering settings
uint8_t extraParagraphSpacing = 1; uint8_t extraParagraphSpacing = 1;
uint8_t textAntiAliasing = 1; uint8_t textAntiAliasing = 1;
@@ -199,7 +180,6 @@ class CrossPointSettings {
// Button layouts (front layout retained for migration only) // Button layouts (front layout retained for migration only)
uint8_t frontButtonLayout = BACK_CONFIRM_LEFT_RIGHT; uint8_t frontButtonLayout = BACK_CONFIRM_LEFT_RIGHT;
uint8_t sideButtonLayout = PREV_NEXT; uint8_t sideButtonLayout = PREV_NEXT;
uint8_t frontButtonFollowOrientation = 0;
// Front button remap (logical -> hardware) // Front button remap (logical -> hardware)
// Used by MappedInputManager to translate logical buttons into physical front buttons. // Used by MappedInputManager to translate logical buttons into physical front buttons.
uint8_t frontButtonBack = FRONT_HW_BACK; uint8_t frontButtonBack = FRONT_HW_BACK;
@@ -239,18 +219,12 @@ class CrossPointSettings {
char sdFontFamilyName[32] = ""; char sdFontFamilyName[32] = "";
// Show hidden files/directories (starting with '.') in the file browser (0 = hidden, 1 = show) // Show hidden files/directories (starting with '.') in the file browser (0 = hidden, 1 = show)
uint8_t showHiddenFiles = 0; uint8_t showHiddenFiles = 0;
// Remove a book from the Recent Books list when its End-of-Book screen is reached (0 = off, 1 = on)
uint8_t removeReadBooksFromRecents = 0;
// Move epub to /Read/ folder on SD card when finished (0 = disabled, 1 = enabled)
uint8_t moveFinishedToReadFolder = 0;
// Image rendering mode in EPUB reader // Image rendering mode in EPUB reader
uint8_t imageRendering = IMAGES_DISPLAY; uint8_t imageRendering = IMAGES_DISPLAY;
// Tilt-based page turning (X3 only — requires QMI8658 IMU) // Tilt-based page turning (X3 only — requires QMI8658 IMU)
uint8_t tiltPageTurn = TILT_OFF; uint8_t tiltPageTurn = TILT_OFF;
// Language setting (Language enum index, default 0 = EN) // Language setting (Language enum index, default 0 = EN)
uint8_t language = 0; uint8_t language = 0;
// Quick Resume: keep current content visible with moon icon instead of showing a static sleep screen.
uint8_t quickResumeSleepScreen = QUICK_RESUME_NEVER;
~CrossPointSettings() = default; ~CrossPointSettings() = default;
-1
View File
@@ -15,7 +15,6 @@ class CrossPointState {
uint8_t recentSleepFill = 0; // valid entries (0..SLEEP_RECENT_COUNT) uint8_t recentSleepFill = 0; // valid entries (0..SLEEP_RECENT_COUNT)
uint8_t readerActivityLoadCount = 0; uint8_t readerActivityLoadCount = 0;
bool lastSleepFromReader = false; bool lastSleepFromReader = false;
bool showBootScreen = true;
// Returns true if idx was shown within the last checkCount picks. // Returns true if idx was shown within the last checkCount picks.
// Walks backwards from the most recently written slot. // Walks backwards from the most recently written slot.
+39 -2
View File
@@ -10,6 +10,7 @@
#include "CrossPointSettings.h" #include "CrossPointSettings.h"
#include "CrossPointState.h" #include "CrossPointState.h"
#include "KOReaderCredentialStore.h"
#include "OpdsServerStore.h" #include "OpdsServerStore.h"
#include "RecentBooksStore.h" #include "RecentBooksStore.h"
#include "SettingsList.h" #include "SettingsList.h"
@@ -75,7 +76,6 @@ bool JsonSettingsIO::saveState(const CrossPointState& s, const char* path) {
doc["recentSleepFill"] = s.recentSleepFill; doc["recentSleepFill"] = s.recentSleepFill;
doc["readerActivityLoadCount"] = s.readerActivityLoadCount; doc["readerActivityLoadCount"] = s.readerActivityLoadCount;
doc["lastSleepFromReader"] = s.lastSleepFromReader; doc["lastSleepFromReader"] = s.lastSleepFromReader;
doc["showBootScreen"] = s.showBootScreen;
String json; String json;
serializeJson(doc, json); serializeJson(doc, json);
@@ -110,7 +110,6 @@ bool JsonSettingsIO::loadState(CrossPointState& s, const char* json) {
} }
s.readerActivityLoadCount = doc["readerActivityLoadCount"] | static_cast<uint8_t>(0); s.readerActivityLoadCount = doc["readerActivityLoadCount"] | static_cast<uint8_t>(0);
s.lastSleepFromReader = doc["lastSleepFromReader"] | false; s.lastSleepFromReader = doc["lastSleepFromReader"] | false;
s.showBootScreen = doc["showBootScreen"] | true;
return true; return true;
} }
@@ -252,6 +251,44 @@ bool JsonSettingsIO::loadSettings(CrossPointSettings& s, const char* json, bool*
return true; return true;
} }
// ---- KOReaderCredentialStore ----
bool JsonSettingsIO::saveKOReader(const KOReaderCredentialStore& store, const char* path) {
JsonDocument doc;
doc["username"] = store.getUsername();
doc["password_obf"] = obfuscation::obfuscateToBase64(store.getPassword());
doc["serverUrl"] = store.getServerUrl();
doc["matchMethod"] = static_cast<uint8_t>(store.getMatchMethod());
String json;
serializeJson(doc, json);
return Storage.writeFile(path, json);
}
bool JsonSettingsIO::loadKOReader(KOReaderCredentialStore& store, const char* json, bool* needsResave) {
if (needsResave) *needsResave = false;
JsonDocument doc;
auto error = deserializeJson(doc, json);
if (error) {
LOG_ERR("KRS", "JSON parse error: %s", error.c_str());
return false;
}
store.username = doc["username"] | std::string("");
bool ok = false;
store.password = obfuscation::deobfuscateFromBase64(doc["password_obf"] | "", &ok);
if (!ok || store.password.empty()) {
store.password = doc["password"] | std::string("");
if (!store.password.empty() && needsResave) *needsResave = true;
}
store.serverUrl = doc["serverUrl"] | std::string("");
uint8_t method = doc["matchMethod"] | (uint8_t)0;
store.matchMethod = static_cast<DocumentMatchMethod>(method);
LOG_DBG("KRS", "Loaded KOReader credentials for user: %s", store.username.c_str());
return true;
}
// ---- WifiCredentialStore ---- // ---- WifiCredentialStore ----
bool JsonSettingsIO::saveWifi(const WifiCredentialStore& store, const char* path) { bool JsonSettingsIO::saveWifi(const WifiCredentialStore& store, const char* path) {
+5
View File
@@ -3,6 +3,7 @@
class CrossPointSettings; class CrossPointSettings;
class CrossPointState; class CrossPointState;
class WifiCredentialStore; class WifiCredentialStore;
class KOReaderCredentialStore;
class RecentBooksStore; class RecentBooksStore;
class OpdsServerStore; class OpdsServerStore;
@@ -20,6 +21,10 @@ bool loadState(CrossPointState& s, const char* json);
bool saveWifi(const WifiCredentialStore& store, const char* path); bool saveWifi(const WifiCredentialStore& store, const char* path);
bool loadWifi(WifiCredentialStore& store, const char* json, bool* needsResave = nullptr); bool loadWifi(WifiCredentialStore& store, const char* json, bool* needsResave = nullptr);
// KOReaderCredentialStore
bool saveKOReader(const KOReaderCredentialStore& store, const char* path);
bool loadKOReader(KOReaderCredentialStore& store, const char* json, bool* needsResave = nullptr);
// RecentBooksStore // RecentBooksStore
bool saveRecentBooks(const RecentBooksStore& store, const char* path); bool saveRecentBooks(const RecentBooksStore& store, const char* path);
bool loadRecentBooks(RecentBooksStore& store, const char* json); bool loadRecentBooks(RecentBooksStore& store, const char* json);
+2 -9
View File
@@ -68,13 +68,6 @@ unsigned long MappedInputManager::getHeldTime() const { return gpio.getHeldTime(
MappedInputManager::Labels MappedInputManager::mapLabels(const char* back, const char* confirm, const char* previous, MappedInputManager::Labels MappedInputManager::mapLabels(const char* back, const char* confirm, const char* previous,
const char* next) const { const char* next) const {
// Swap previous/next labels to match the page turn direction swap in INVERTED and LANDSCAPE_CCW.
const bool swapLabels =
SETTINGS.frontButtonFollowOrientation && (SETTINGS.orientation == CrossPointSettings::INVERTED ||
SETTINGS.orientation == CrossPointSettings::LANDSCAPE_CCW);
const char* leftLabel = swapLabels ? next : previous;
const char* rightLabel = swapLabels ? previous : next;
// Build the label order based on the configured hardware mapping. // Build the label order based on the configured hardware mapping.
auto labelForHardware = [&](uint8_t hw) -> const char* { auto labelForHardware = [&](uint8_t hw) -> const char* {
// Compare against configured logical roles and return the matching label. // Compare against configured logical roles and return the matching label.
@@ -85,10 +78,10 @@ MappedInputManager::Labels MappedInputManager::mapLabels(const char* back, const
return confirm; return confirm;
} }
if (hw == SETTINGS.frontButtonLeft) { if (hw == SETTINGS.frontButtonLeft) {
return leftLabel; return previous;
} }
if (hw == SETTINGS.frontButtonRight) { if (hw == SETTINGS.frontButtonRight) {
return rightLabel; return next;
} }
return ""; return "";
}; };
-39
View File
@@ -9,7 +9,6 @@
#include <Xtc.h> #include <Xtc.h>
#include <algorithm> #include <algorithm>
#include <iterator>
namespace { namespace {
constexpr uint8_t RECENT_BOOKS_FILE_VERSION = 3; constexpr uint8_t RECENT_BOOKS_FILE_VERSION = 3;
@@ -23,9 +22,6 @@ RecentBooksStore RecentBooksStore::instance;
void RecentBooksStore::addBook(const std::string& path, const std::string& title, const std::string& author, void RecentBooksStore::addBook(const std::string& path, const std::string& title, const std::string& author,
const std::string& coverBmpPath) { const std::string& coverBmpPath) {
// Drop stale entries first so a new add can't evict a valid book in their stead.
pruneMissing();
// Remove existing entry if present // Remove existing entry if present
auto it = auto it =
std::find_if(recentBooks.begin(), recentBooks.end(), [&](const RecentBook& book) { return book.path == path; }); std::find_if(recentBooks.begin(), recentBooks.end(), [&](const RecentBook& book) { return book.path == path; });
@@ -57,41 +53,6 @@ void RecentBooksStore::updateBook(const std::string& path, const std::string& ti
} }
} }
bool RecentBooksStore::removeByPath(const std::string& path) {
auto it =
std::find_if(recentBooks.begin(), recentBooks.end(), [&](const RecentBook& book) { return book.path == path; });
if (it == recentBooks.end()) {
return false;
}
recentBooks.erase(it);
if (!saveToFile()) {
LOG_ERR("RBS", "Failed to persist removal of recent book: %s", path.c_str());
}
return true;
}
void RecentBooksStore::updatePath(const std::string& oldPath, const std::string& newPath,
const std::string& oldCachePath, const std::string& newCachePath) {
auto it = std::find_if(recentBooks.begin(), recentBooks.end(),
[&](const RecentBook& book) { return book.path == oldPath; });
if (it == recentBooks.end()) {
return;
}
it->path = newPath;
if (!oldCachePath.empty() && !it->coverBmpPath.empty() && it->coverBmpPath.rfind(oldCachePath, 0) == 0) {
it->coverBmpPath = newCachePath + it->coverBmpPath.substr(oldCachePath.size());
}
saveToFile();
}
bool RecentBooksStore::isMissing(const RecentBook& book) { return !Storage.exists(book.path.c_str()); }
bool RecentBooksStore::pruneMissing() {
const size_t before = recentBooks.size();
recentBooks.erase(std::remove_if(recentBooks.begin(), recentBooks.end(), &isMissing), recentBooks.end());
return recentBooks.size() != before;
}
bool RecentBooksStore::saveToFile() const { bool RecentBooksStore::saveToFile() const {
Storage.mkdir("/.crosspoint"); Storage.mkdir("/.crosspoint");
return JsonSettingsIO::saveRecentBooks(*this, RECENT_BOOKS_FILE_JSON); return JsonSettingsIO::saveRecentBooks(*this, RECENT_BOOKS_FILE_JSON);
-18
View File
@@ -37,24 +37,6 @@ class RecentBooksStore {
void updateBook(const std::string& path, const std::string& title, const std::string& author, void updateBook(const std::string& path, const std::string& title, const std::string& author,
const std::string& coverBmpPath); const std::string& coverBmpPath);
// Remove the entry whose path matches (used when a book is removed from recents or finished/read).
// Returns true if an entry was found and removed (no-op + false otherwise).
// Persistence is best-effort: a failed save is logged, not reflected in the return.
bool removeByPath(const std::string& path);
// Repoint an entry's path (and coverBmpPath, if it lived under the old cache dir) after the
// backing file and cache dir were moved on disk. No-op if no entry matches oldPath.
// Persists on success. Keeps the entry's list position (does not reorder).
void updatePath(const std::string& oldPath, const std::string& newPath, const std::string& oldCachePath,
const std::string& newCachePath);
// True if the book's backing file is no longer present on the SD card.
static bool isMissing(const RecentBook& book);
// Remove entries whose backing file is no longer on the SD card.
// Returns true if any entry was removed. Does not persist — caller decides.
bool pruneMissing();
// Get the list of recent books (most recent first) // Get the list of recent books (most recent first)
const std::vector<RecentBook>& getBooks() const { return recentBooks; } const std::vector<RecentBook>& getBooks() const { return recentBooks; }
+12
View File
@@ -0,0 +1,12 @@
#pragma once
#include "SdCardFontSystem.h"
class GfxRenderer;
// Global SD card font system instance (defined in main.cpp).
extern SdCardFontSystem sdFontSystem;
// Ensure the correct SD card font family is loaded for current settings.
// Defined in main.cpp; call before entering the reader or after settings change.
extern void ensureSdFontLoaded();
-3
View File
@@ -50,6 +50,3 @@ class SdCardFontSystem {
SdCardFontManager manager_; SdCardFontManager manager_;
std::atomic<bool> registryDirty_{false}; std::atomic<bool> registryDirty_{false};
}; };
// Global SD card font system instance (defined in main.cpp).
extern SdCardFontSystem sdFontSystem;
+2 -26
View File
@@ -1,6 +1,5 @@
#pragma once #pragma once
#include <HalClock.h>
#include <HalTiltSensor.h> #include <HalTiltSensor.h>
#include <I18n.h> #include <I18n.h>
#include <SdCardFontRegistry.h> #include <SdCardFontRegistry.h>
@@ -106,16 +105,13 @@ inline std::vector<SettingInfo> getSettingsList(const SdCardFontRegistry* regist
// --- Display --- // --- Display ---
SettingInfo::Enum(StrId::STR_SLEEP_SCREEN, &CrossPointSettings::sleepScreen, SettingInfo::Enum(StrId::STR_SLEEP_SCREEN, &CrossPointSettings::sleepScreen,
{StrId::STR_DARK, StrId::STR_LIGHT, StrId::STR_CUSTOM, StrId::STR_COVER, StrId::STR_NONE_OPT, {StrId::STR_DARK, StrId::STR_LIGHT, StrId::STR_CUSTOM, StrId::STR_COVER, StrId::STR_NONE_OPT,
StrId::STR_COVER_CUSTOM, StrId::STR_QUICK_RESUME}, StrId::STR_COVER_CUSTOM},
"sleepScreen", StrId::STR_CAT_DISPLAY), "sleepScreen", StrId::STR_CAT_DISPLAY),
SettingInfo::Enum(StrId::STR_SLEEP_COVER_MODE, &CrossPointSettings::sleepScreenCoverMode, SettingInfo::Enum(StrId::STR_SLEEP_COVER_MODE, &CrossPointSettings::sleepScreenCoverMode,
{StrId::STR_FIT, StrId::STR_CROP}, "sleepScreenCoverMode", StrId::STR_CAT_DISPLAY), {StrId::STR_FIT, StrId::STR_CROP}, "sleepScreenCoverMode", StrId::STR_CAT_DISPLAY),
SettingInfo::Enum(StrId::STR_SLEEP_COVER_FILTER, &CrossPointSettings::sleepScreenCoverFilter, SettingInfo::Enum(StrId::STR_SLEEP_COVER_FILTER, &CrossPointSettings::sleepScreenCoverFilter,
{StrId::STR_NONE_OPT, StrId::STR_FILTER_CONTRAST, StrId::STR_INVERTED}, {StrId::STR_NONE_OPT, StrId::STR_FILTER_CONTRAST, StrId::STR_INVERTED},
"sleepScreenCoverFilter", StrId::STR_CAT_DISPLAY), "sleepScreenCoverFilter", StrId::STR_CAT_DISPLAY),
SettingInfo::Enum(StrId::STR_QUICK_RESUME_TIMEOUT, &CrossPointSettings::quickResumeSleepScreen,
{StrId::STR_STATE_OFF, StrId::STR_STATE_ON}, "quickResumeSleepScreen",
StrId::STR_CAT_DISPLAY),
SettingInfo::Enum(StrId::STR_HIDE_BATTERY, &CrossPointSettings::hideBatteryPercentage, SettingInfo::Enum(StrId::STR_HIDE_BATTERY, &CrossPointSettings::hideBatteryPercentage,
{StrId::STR_NEVER, StrId::STR_IN_READER, StrId::STR_ALWAYS}, "hideBatteryPercentage", {StrId::STR_NEVER, StrId::STR_IN_READER, StrId::STR_ALWAYS}, "hideBatteryPercentage",
StrId::STR_CAT_DISPLAY), StrId::STR_CAT_DISPLAY),
@@ -166,8 +162,6 @@ inline std::vector<SettingInfo> getSettingsList(const SdCardFontRegistry* regist
// --- Controls --- // --- Controls ---
SettingInfo::Enum(StrId::STR_SIDE_BTN_LAYOUT, &CrossPointSettings::sideButtonLayout, SettingInfo::Enum(StrId::STR_SIDE_BTN_LAYOUT, &CrossPointSettings::sideButtonLayout,
{StrId::STR_PREV_NEXT, StrId::STR_NEXT_PREV}, "sideButtonLayout", StrId::STR_CAT_CONTROLS), {StrId::STR_PREV_NEXT, StrId::STR_NEXT_PREV}, "sideButtonLayout", StrId::STR_CAT_CONTROLS),
SettingInfo::Toggle(StrId::STR_FRONT_BTN_FOLLOW_ORIENTATION, &CrossPointSettings::frontButtonFollowOrientation,
"frontButtonFollowOrientation", StrId::STR_CAT_CONTROLS),
SettingInfo::Enum(StrId::STR_LONG_PRESS_BEHAVIOR, &CrossPointSettings::longPressButtonBehavior, SettingInfo::Enum(StrId::STR_LONG_PRESS_BEHAVIOR, &CrossPointSettings::longPressButtonBehavior,
{StrId::STR_LONG_PRESS_BEHAVIOR_OFF, StrId::STR_LONG_PRESS_BEHAVIOR_SKIP, {StrId::STR_LONG_PRESS_BEHAVIOR_OFF, StrId::STR_LONG_PRESS_BEHAVIOR_SKIP,
StrId::STR_LONG_PRESS_BEHAVIOR_ORIENTATION}, StrId::STR_LONG_PRESS_BEHAVIOR_ORIENTATION},
@@ -178,15 +172,10 @@ inline std::vector<SettingInfo> getSettingsList(const SdCardFontRegistry* regist
// --- System --- // --- System ---
SettingInfo::Enum(StrId::STR_TIME_TO_SLEEP, &CrossPointSettings::sleepTimeout, SettingInfo::Enum(StrId::STR_TIME_TO_SLEEP, &CrossPointSettings::sleepTimeout,
{StrId::STR_MIN_1, StrId::STR_MIN_3, StrId::STR_MIN_5, StrId::STR_MIN_10, StrId::STR_MIN_15, {StrId::STR_MIN_1, StrId::STR_MIN_5, StrId::STR_MIN_10, StrId::STR_MIN_15, StrId::STR_MIN_30},
StrId::STR_MIN_30},
"sleepTimeout", StrId::STR_CAT_SYSTEM), "sleepTimeout", StrId::STR_CAT_SYSTEM),
SettingInfo::Toggle(StrId::STR_SHOW_HIDDEN_FILES, &CrossPointSettings::showHiddenFiles, "showHiddenFiles", SettingInfo::Toggle(StrId::STR_SHOW_HIDDEN_FILES, &CrossPointSettings::showHiddenFiles, "showHiddenFiles",
StrId::STR_CAT_SYSTEM), StrId::STR_CAT_SYSTEM),
SettingInfo::Toggle(StrId::STR_REMOVE_READ_FROM_RECENTS, &CrossPointSettings::removeReadBooksFromRecents,
"removeReadBooksFromRecents", StrId::STR_CAT_SYSTEM),
SettingInfo::Toggle(StrId::STR_MOVE_FINISHED_TO_READ, &CrossPointSettings::moveFinishedToReadFolder,
"moveFinishedToReadFolder", StrId::STR_CAT_SYSTEM),
// --- KOReader Sync (web-only, uses KOReaderCredentialStore) --- // --- KOReader Sync (web-only, uses KOReaderCredentialStore) ---
SettingInfo::DynamicString( SettingInfo::DynamicString(
@@ -237,19 +226,6 @@ inline std::vector<SettingInfo> getSettingsList(const SdCardFontRegistry* regist
SettingInfo::Enum(StrId::STR_XTC_STATUS_BAR, &CrossPointSettings::xtcStatusBarMode, SettingInfo::Enum(StrId::STR_XTC_STATUS_BAR, &CrossPointSettings::xtcStatusBarMode,
{StrId::STR_HIDE, StrId::STR_BOTTOM, StrId::STR_TOP}, "xtcStatusBarMode", {StrId::STR_HIDE, StrId::STR_BOTTOM, StrId::STR_TOP}, "xtcStatusBarMode",
StrId::STR_CUSTOMISE_STATUS_BAR), StrId::STR_CUSTOMISE_STATUS_BAR),
// Clock entries (web settings only; device UI uses ClockOffsetActivity for the offset).
// Range 0..104 = quarter-hour steps from UTC-12:00 to UTC+14:00, biased by 48.
SettingInfo::Toggle(StrId::STR_CLOCK, &CrossPointSettings::statusBarClock, "statusBarClock",
StrId::STR_CUSTOMISE_STATUS_BAR),
SettingInfo::Value(StrId::STR_CLOCK_UTC_OFFSET, &CrossPointSettings::clockUtcOffsetQ, {0, 104, 1},
"clockUtcOffsetQ", StrId::STR_CUSTOMISE_STATUS_BAR),
SettingInfo::Enum(StrId::STR_CLOCK_FORMAT, &CrossPointSettings::clockFormat,
{StrId::STR_CLOCK_FORMAT_24H, StrId::STR_CLOCK_FORMAT_12H}, "clockFormat",
StrId::STR_CUSTOMISE_STATUS_BAR),
// Persistence flag for NTP debounce. Resetting from the web UI forces a re-sync
// on next WiFi connect, which is useful when crossing time zones.
SettingInfo::Toggle(StrId::STR_CLOCK_SYNCED, &CrossPointSettings::clockHasBeenSynced, "clockHasBeenSynced",
StrId::STR_CUSTOMISE_STATUS_BAR),
}; };
// Only show tilt page turn setting when the QMI8658 IMU is present (X3) // Only show tilt page turn setting when the QMI8658 IMU is present (X3)
if (halTiltSensor.isAvailable()) { if (halTiltSensor.isAvailable()) {
-8
View File
@@ -1,8 +0,0 @@
#pragma once
// ESP.restart() with an RTC_NOINIT flag that survives the reboot, so setup()
// skips the boot splash and routes straight to a destination. Used to clear
// heap fragmentation accumulated during a wifi session.
void silentRestart(); // home screen
void silentRestartToReader(); // currently-open EPUB (APP_STATE.openEpubPath)
+1 -1
View File
@@ -10,7 +10,7 @@ void Activity::requestUpdate(bool immediate) { activityManager.requestUpdate(imm
void Activity::requestUpdateAndWait() { activityManager.requestUpdateAndWait(); } void Activity::requestUpdateAndWait() { activityManager.requestUpdateAndWait(); }
void Activity::onGoHome(HomeMenuItem item) { activityManager.goHome(item); } void Activity::onGoHome() { activityManager.goHome(); }
void Activity::onSelectBook(const std::string& path) { activityManager.goToReader(path); } void Activity::onSelectBook(const std::string& path) { activityManager.goToReader(path); }
+1 -1
View File
@@ -58,6 +58,6 @@ class Activity {
// Convenience method to facilitate API transition to ActivityManager // Convenience method to facilitate API transition to ActivityManager
// TODO: remove this in near future // TODO: remove this in near future
void onGoHome(HomeMenuItem item = HomeMenuItem::NONE); void onGoHome();
void onSelectBook(const std::string& path); void onSelectBook(const std::string& path);
}; };
+6 -19
View File
@@ -5,6 +5,7 @@
#include <algorithm> #include <algorithm>
#include "OpdsServerStore.h" #include "OpdsServerStore.h"
#include "SdCardFontGlobals.h"
#include "boot_sleep/BootActivity.h" #include "boot_sleep/BootActivity.h"
#include "boot_sleep/SleepActivity.h" #include "boot_sleep/SleepActivity.h"
#include "browser/OpdsBookBrowserActivity.h" #include "browser/OpdsBookBrowserActivity.h"
@@ -193,11 +194,12 @@ void ActivityManager::goToBrowser() {
} }
void ActivityManager::goToReader(std::string path) { void ActivityManager::goToReader(std::string path) {
ensureSdFontLoaded();
replaceActivity(std::make_unique<ReaderActivity>(renderer, mappedInput, std::move(path))); replaceActivity(std::make_unique<ReaderActivity>(renderer, mappedInput, std::move(path)));
} }
void ActivityManager::goToSleep(bool fromTimeout) { void ActivityManager::goToSleep() {
replaceActivity(std::make_unique<SleepActivity>(renderer, mappedInput, fromTimeout)); replaceActivity(std::make_unique<SleepActivity>(renderer, mappedInput));
loop(); // Important: sleep screen must be rendered immediately, the caller will go to sleep right after this returns loop(); // Important: sleep screen must be rendered immediately, the caller will go to sleep right after this returns
} }
@@ -207,25 +209,10 @@ void ActivityManager::goToFullScreenMessage(std::string message, EpdFontFamily::
replaceActivity(std::make_unique<FullScreenMessageActivity>(renderer, mappedInput, std::move(message), style)); replaceActivity(std::make_unique<FullScreenMessageActivity>(renderer, mappedInput, std::move(message), style));
} }
void ActivityManager::goHome(HomeMenuItem initialMenuItem) {
if (initialMenuItem == HomeMenuItem::NONE && currentActivity) {
const auto& activityName = currentActivity->name;
if (activityName == "FileBrowser") {
initialMenuItem = HomeMenuItem::FILE_BROWSER;
} else if (activityName == "RecentBooks") {
initialMenuItem = HomeMenuItem::RECENTS;
} else if (activityName == "OpdsBookBrowser") {
initialMenuItem = HomeMenuItem::OPDS_BROWSER;
} else if (activityName == "CrossPointWebServer") {
initialMenuItem = HomeMenuItem::FILE_TRANSFER;
} else if (activityName == "Settings") {
initialMenuItem = HomeMenuItem::SETTINGS_MENU;
}
}
replaceActivity(std::make_unique<HomeActivity>(renderer, mappedInput, initialMenuItem));
}
void ActivityManager::goToCrashReport() { replaceActivity(std::make_unique<CrashActivity>(renderer, mappedInput)); } void ActivityManager::goToCrashReport() { replaceActivity(std::make_unique<CrashActivity>(renderer, mappedInput)); }
void ActivityManager::goHome() { replaceActivity(std::make_unique<HomeActivity>(renderer, mappedInput)); }
void ActivityManager::pushActivity(std::unique_ptr<Activity>&& activity) { void ActivityManager::pushActivity(std::unique_ptr<Activity>&& activity) {
if (pendingActivity) { if (pendingActivity) {
// Should never happen in practice // Should never happen in practice
+2 -4
View File
@@ -16,8 +16,6 @@
class Activity; // forward declaration class Activity; // forward declaration
class RenderLock; // forward declaration class RenderLock; // forward declaration
enum class HomeMenuItem { NONE, FILE_BROWSER, RECENTS, OPDS_BROWSER, FILE_TRANSFER, SETTINGS_MENU };
/** /**
* ActivityManager * ActivityManager
* *
@@ -86,11 +84,11 @@ class ActivityManager {
void goToRecentBooks(); void goToRecentBooks();
void goToBrowser(); void goToBrowser();
void goToReader(std::string path); void goToReader(std::string path);
void goToSleep(bool fromTimeout = false); void goToSleep();
void goToBoot(); void goToBoot();
void goToFullScreenMessage(std::string message, EpdFontFamily::Style style = EpdFontFamily::REGULAR); void goToFullScreenMessage(std::string message, EpdFontFamily::Style style = EpdFontFamily::REGULAR);
void goToCrashReport(); void goToCrashReport();
void goHome(HomeMenuItem initialMenuItem = HomeMenuItem::NONE); void goHome();
// This will move current activity to stack instead of deleting it // This will move current activity to stack instead of deleting it
void pushActivity(std::unique_ptr<Activity>&& activity); void pushActivity(std::unique_ptr<Activity>&& activity);
+1 -1
View File
@@ -1,5 +1,5 @@
#pragma once #pragma once
#include "activities/Activity.h" #include "../Activity.h"
class BootActivity final : public Activity { class BootActivity final : public Activity {
public: public:
@@ -14,20 +14,10 @@
#include "components/UITheme.h" #include "components/UITheme.h"
#include "fontIds.h" #include "fontIds.h"
#include "images/Logo120.h" #include "images/Logo120.h"
#include "images/MoonIcon.h"
void SleepActivity::onEnter() { void SleepActivity::onEnter() {
Activity::onEnter(); Activity::onEnter();
const bool renderQuickResume =
SETTINGS.sleepScreen == CrossPointSettings::SLEEP_SCREEN_MODE::QUICK_RESUME ||
(fromTimeout &&
SETTINGS.quickResumeSleepScreen == CrossPointSettings::QUICK_RESUME_SLEEP_SCREEN::QUICK_RESUME_AFTER_TIMEOUT);
if (renderQuickResume) {
return renderLastScreenSleepScreen();
}
// Show popup with reader orientation only when going to sleep from reader // Show popup with reader orientation only when going to sleep from reader
if (APP_STATE.lastSleepFromReader) { if (APP_STATE.lastSleepFromReader) {
ReaderUtils::applyOrientation(renderer, SETTINGS.orientation); ReaderUtils::applyOrientation(renderer, SETTINGS.orientation);
@@ -317,12 +307,6 @@ void SleepActivity::renderCoverSleepScreen() const {
return (this->*renderNoCoverSleepScreen)(); return (this->*renderNoCoverSleepScreen)();
} }
void SleepActivity::renderLastScreenSleepScreen() const {
const auto pageHeight = renderer.getScreenHeight();
renderer.drawImage(MoonIcon, 0, pageHeight - MOONICON_HEIGHT, MOONICON_WIDTH, MOONICON_HEIGHT);
renderer.displayBuffer(HalDisplay::HALF_REFRESH);
}
void SleepActivity::renderBlankSleepScreen() const { void SleepActivity::renderBlankSleepScreen() const {
renderer.clearScreen(); renderer.clearScreen();
renderer.displayBuffer(HalDisplay::HALF_REFRESH); renderer.displayBuffer(HalDisplay::HALF_REFRESH);
+3 -6
View File
@@ -1,12 +1,12 @@
#pragma once #pragma once
#include "activities/Activity.h" #include "../Activity.h"
class Bitmap; class Bitmap;
class SleepActivity final : public Activity { class SleepActivity final : public Activity {
public: public:
explicit SleepActivity(GfxRenderer& renderer, MappedInputManager& mappedInput, bool fromTimeout = false) explicit SleepActivity(GfxRenderer& renderer, MappedInputManager& mappedInput)
: Activity("Sleep", renderer, mappedInput), fromTimeout(fromTimeout) {} : Activity("Sleep", renderer, mappedInput) {}
void onEnter() override; void onEnter() override;
private: private:
@@ -14,8 +14,5 @@ class SleepActivity final : public Activity {
void renderCustomSleepScreen() const; void renderCustomSleepScreen() const;
void renderCoverSleepScreen() const; void renderCoverSleepScreen() const;
void renderBitmapSleepScreen(const Bitmap& bitmap) const; void renderBitmapSleepScreen(const Bitmap& bitmap) const;
void renderLastScreenSleepScreen() const;
void renderBlankSleepScreen() const; void renderBlankSleepScreen() const;
bool fromTimeout = false;
}; };
@@ -1,5 +1,6 @@
#include "OpdsBookBrowserActivity.h" #include "OpdsBookBrowserActivity.h"
#include <Epub.h>
#include <GfxRenderer.h> #include <GfxRenderer.h>
#include <I18n.h> #include <I18n.h>
#include <Logging.h> #include <Logging.h>
@@ -7,13 +8,11 @@
#include <WiFi.h> #include <WiFi.h>
#include "MappedInputManager.h" #include "MappedInputManager.h"
#include "SilentRestart.h"
#include "activities/network/WifiSelectionActivity.h" #include "activities/network/WifiSelectionActivity.h"
#include "activities/util/KeyboardEntryActivity.h" #include "activities/util/KeyboardEntryActivity.h"
#include "components/UITheme.h" #include "components/UITheme.h"
#include "fontIds.h" #include "fontIds.h"
#include "network/HttpDownloader.h" #include "network/HttpDownloader.h"
#include "util/BookCacheUtils.h"
#include "util/StringUtils.h" #include "util/StringUtils.h"
#include "util/UrlUtils.h" #include "util/UrlUtils.h"
@@ -41,14 +40,9 @@ void OpdsBookBrowserActivity::onEnter() {
void OpdsBookBrowserActivity::onExit() { void OpdsBookBrowserActivity::onExit() {
Activity::onExit(); Activity::onExit();
WiFi.mode(WIFI_OFF);
entries.clear(); entries.clear();
navigationHistory.clear(); navigationHistory.clear();
if (WiFi.getMode() != WIFI_MODE_NULL) {
WiFi.disconnect(false);
delay(30);
silentRestart();
}
} }
void OpdsBookBrowserActivity::loop() { void OpdsBookBrowserActivity::loop() {
@@ -280,10 +274,10 @@ void OpdsBookBrowserActivity::downloadBook(const OpdsEntry& book) {
downloadTotal = total; downloadTotal = total;
requestUpdate(true); requestUpdate(true);
}, },
nullptr, server.username, server.password); server.username, server.password);
if (result == HttpDownloader::OK) { if (result == HttpDownloader::OK) {
clearBookCache(filename); Epub(filename, "/.crosspoint").clearCache();
state = BrowserState::BROWSING; state = BrowserState::BROWSING;
} else { } else {
state = BrowserState::ERROR; state = BrowserState::ERROR;
@@ -370,7 +364,8 @@ void OpdsBookBrowserActivity::onWifiSelectionComplete(const bool connected) {
requestUpdate(true); requestUpdate(true);
fetchFeed(currentPath); fetchFeed(currentPath);
} else { } else {
// Leave WiFi up; onExit's silent reboot handles teardown without fragmenting. WiFi.disconnect();
WiFi.mode(WIFI_OFF);
state = BrowserState::ERROR; state = BrowserState::ERROR;
errorMessage = tr(STR_WIFI_CONN_FAILED); errorMessage = tr(STR_WIFI_CONN_FAILED);
requestUpdate(); requestUpdate();
@@ -5,8 +5,8 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "../Activity.h"
#include "OpdsServerStore.h" #include "OpdsServerStore.h"
#include "activities/Activity.h"
#include "util/ButtonNavigator.h" #include "util/ButtonNavigator.h"
/** /**

Some files were not shown because too many files have changed in this diff Show More