diff --git a/hoc/README.md b/hoc/README.md new file mode 100644 index 0000000..8501f3c --- /dev/null +++ b/hoc/README.md @@ -0,0 +1,153 @@ +# hoc: a Tesseract model for Ho (Warang Citi) documents + +`hoc.traineddata` is a fine-tuned Tesseract LSTM model for OCR of Ho language text in the Warang Citi script. It is fine-tuned from the Latin base model, since Warang Citi is an alphabetic script with uppercase and lowercase letters, similar to Latin. There is no publicly available OCR model for Warang Citi — this is the first, released so that community-led improvement, extension, and further training can follow. + +The current best model is `hoc.traineddata` inside `best/`, and that file will be updated as training improves. If you are improving `hoc.traineddata` through training, we request you to submit it as a PR here so others can use and build on it. + +The model is trained using open-source fonts including **Noto Sans Warang Citi** and **Boyo Gagrai Unicode**, and on open-licensed Ho language text from the [Ho Wikipedia Incubator](https://incubator.wikimedia.org/wiki/Wp/hoc) and [OFDN Ho OER](https://theofdn.org/oer/ho/). + +## About Warang Citi + +Warang Citi (𑣁𑣂𑣃𑣄) is the script created by **Lako Bodra** for the Ho language, spoken by ~1.5 million people primarily in Jharkhand, Odisha, and West Bengal. + +- Unicode block: U+118A0–U+118FF (Supplementary Multilingual Plane) +- 32 capital letters, 32 small letters, 10 digits, 9 number words, Om symbol + +## Current accuracy and known limitations + +The model recognizes individual Warang Citi characters well on clean printed text, but has significant limitations: + +| Test category | Character accuracy (ignoring spaces) | +|---|---| +| Synthetic text (Noto Sans WC) | **97.8%** | +| Synthetic text (GhanshyamBodra) | **86.3%** | +| Flatbed scans (Noto pages) | 42.0% | +| Flatbed scans (BoyoGagrai pages) | 3.1% | + +**Known issues:** + +- **No space detection** — the model outputs characters without word boundaries. Every line is one unbroken string. Post-processing is needed to insert spaces. +- **Poor scan recognition** — accuracy drops significantly on real scanned documents compared to clean rendered text. +- **Page segmentation fails** — Tesseract's built-in page segmenter cannot reliably detect text lines in Warang Citi. Pre-segmented line images work best (PSM 13). +- **Training BCER vs real-world gap** — the reported 5.99% training BCER was measured on training data, where near-perfect synthetic lines pull the average down. Independent benchmark on scans shows much lower accuracy. + +This model is released as a starting point for community improvement, not as a production-ready tool. + +## Usage + +Install `best/hoc.traineddata` into your Tesseract tessdata directory, then: + +```bash +# OCR a pre-segmented line image (best results) +tesseract line.png stdout -l hoc --psm 13 --oem 1 | python3 tools/pua-to-warang.py + +# OCR a full page (results will be poor due to segmentation issues) +tesseract page.png stdout -l hoc --psm 3 --oem 1 | python3 tools/pua-to-warang.py +``` + +**Important:** OCR output must be piped through `tools/pua-to-warang.py` to convert from internal PUA codepoints to real Warang Citi Unicode. See the PUA mapping section below for why. + +## How to help improve this model + +- **Test on your own Ho documents** and report how it performs — any feedback helps +- **Contribute more corpus text** — any Ho text in Warang Citi Unicode can be used for training +- **Scan more printed Ho documents** and create ground-truth transcriptions +- **Train an improved model** and submit a PR with the updated `hoc.traineddata` in `best/` +- **Verify the GhanshyamBodra ASCII→Unicode mapping** — this font is used in most Ho publishing but its character mapping needs verification by a native reader + +## PUA mapping + +Tesseract 5.x cannot handle Warang Citi's SMP codepoints (above U+FFFF) in its internal recoder. This project maps them to the BMP Private Use Area: + +``` +Warang Citi U+118A0-U+118FF → PUA U+E000-U+E05F +``` + +The model learns identical glyph shapes. OCR output is post-processed via `tools/pua-to-warang.py` to produce real Warang Citi Unicode. The mapping is defined in `pua_mapping.json`. + +## Repository layout + +```text +hoc/ +├── best/ +│ └── hoc.traineddata # Current best model +├── corpus/ +│ ├── clean-corpus.py # Clean mixed-script text +│ ├── render-corpus.py # Render corpus into training images +│ ├── hoc_clean.txt # Cleaned corpus (Warang Citi Unicode) +│ └── hoc_clean_pua.txt # Cleaned corpus (PUA-encoded for training) +├── fonts/ +│ ├── NotoSansWarangCiti-Regular.ttf +│ └── WarangCiti-PUA.ttf # PUA-mapped font for training +├── scripts/ +│ ├── 01-prep-base.sh # Prepare base traineddata +│ ├── 02-make-lstmf.sh # Generate LSTMF training files +│ ├── 03-train-finetune.sh # Fine-tune from Latin base +│ ├── 03-train.sh # From-scratch training +│ ├── 04-package.sh # Package checkpoint into traineddata +│ ├── 05-test.sh # Quick OCR test +│ └── 06-scan-to-lstmf.py # Convert scans into training material +├── tools/ +│ ├── pua-to-warang.py # Convert PUA output → Warang Citi Unicode +│ ├── benchmark.py # Accuracy benchmarking +│ ├── augment-synthetic.py # Noise augmentation +│ └── check-plateau.sh # Training plateau detection +├── test-images/benchmark/ # Scan images + ground truth for testing +├── pua_mapping.json # Warang Citi ↔ PUA mapping +└── README.md +``` + +## Training workflow + +1. Prepare the base model and training environment +2. Clean and render the corpus into image and ground-truth pairs +3. Generate `.lstmf` training files +4. Fine-tune from Latin base model +5. Package and test the resulting model + +## Training data (Run3, current) + +| Type | Files | Description | +|------|-------|-------------| +| Flatbed scans (Noto) | 407 lines (15 pages) | Corpus printed in Noto Sans WC, scanned at 300 DPI | +| Flatbed scans (BoyoGagrai) | 300 lines (12 pages) | Corpus printed in BoyoGagrai Unicode, scanned | +| Synthetic — Noto Sans WC | 414 lines | Rendered from corpus | +| Synthetic — GhanshyamBodra | 414 lines | Rendered using phonetic ASCII→PUA mapping | +| Synthetic augmented | 100 lines | Noise, blur, contrast variations | +| **Total** | **1635** | **Scan:Synth = 707:928** | + +## Technical details + +- **Engine**: Tesseract 5.x LSTM, fine-tuned from Latin base model +- **Network**: Conv+LSTM transferred from Latin, output layer rebuilt for Warang Citi (80 classes) +- **Unicharset**: 80 entries (PUA-mapped Warang Citi + punctuation) +- **Learning rate**: 0.001 (fine-tuning), auto-reduced at stage 1 +- **Best training BCER**: 5.99% at iteration 61300 + +## Attribution + +Coordination and model training: Subhashish Panigrahi. + +### Text contributors +- **Ganesh Birua** — Ho language text +- **Mangu Purty** — Ho language text and OER content +- **Subhashish Panigrahi** — Ho language text, OER content, and project coordination + +### Text sources +- [Ho Wikipedia Incubator](https://incubator.wikimedia.org/wiki/Wp/hoc) — CC BY-SA +- [OFDN Ho OER](https://theofdn.org/oer/ho/) — by Koshi Purty, CC BY-SA 4.0 +- [Warang Chiti Blog](https://warangchiti.blogspot.com/) — Ho language content + +### Fonts +- **Noto Sans Warang Citi** — Google Fonts (OFL) +- **Boyo Gagrai Unicode** — Warang Citi Unicode font by Ganesh Birua +- **GhanshyamBodra11** (NewRuleGhanshyamBodra.ttf) — ASCII-encoded Warang Citi font widely used in Ho publishing + +## Related + +- [Santali (Ol Chiki) training](../sat/) — sister project, same approach +- [OpenSpeaks](https://meta.wikimedia.org/wiki/OpenSpeaks) — community network for Indigenous language documentation + +## License + +Apache 2.0 diff --git a/hoc/best/hoc.traineddata b/hoc/best/hoc.traineddata new file mode 100644 index 0000000..0f16875 Binary files /dev/null and b/hoc/best/hoc.traineddata differ diff --git a/hoc/corpus/clean-corpus.py b/hoc/corpus/clean-corpus.py new file mode 100644 index 0000000..2454dd5 --- /dev/null +++ b/hoc/corpus/clean-corpus.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +""" +clean-corpus.py + +Reads text1.txt, strips non-Santali characters, and writes a clean +Ol Chiki corpus suitable for text2image / Pillow rendering. + +Keeps: + - Ol Chiki block U+1C50–U+1C7F (all 48 code points) + - Common punctuation used in Santali text: . , : ? ! - / " ' ( ) * + - ASCII digits 0–9 (page numbers, section markers) + - ASCII space + +Removes: + - Latin letters A–Z / a–z (English words mixed into corpus) + - Devanagari and other script chars + - Control characters + +Lines with fewer than 5 Ol Chiki characters after cleaning are dropped. +Lines longer than MAX_CHARS are split at word boundaries. +""" + +import re +import unicodedata +from pathlib import Path + +INPUT = Path("text1.txt") +OUTPUT = Path("corpus/sat_corpus.txt") +MAX_CHARS = 70 + +OUTPUT.parent.mkdir(exist_ok=True) + +KEEP_ASCII = set(' .,;:?!-/"\')(]*%0123456789') + +def is_warang_citi(c): + return 0x118A0 <= ord(c) <= 0x118FF + +def clean_line(line): + chars = [] + for c in line: + if is_warang_citi(c): + chars.append(c) + elif c in KEEP_ASCII: + chars.append(c) + # everything else (Latin letters, Devanagari, symbols) → drop + cleaned = re.sub(r' +', ' ', ''.join(chars)).strip() + return cleaned + +def warang_citi_count(s): + return sum(1 for c in s if is_warang_citi(c)) + +def split_at_boundary(line, max_len): + """Split a long line at word boundaries so each part ≤ max_len.""" + if len(line) <= max_len: + return [line] + words = line.split(' ') + parts = [] + current = [] + cur_len = 0 + for w in words: + if cur_len + len(w) + 1 > max_len and current: + parts.append(' '.join(current)) + current = [w] + cur_len = len(w) + else: + current.append(w) + cur_len += len(w) + 1 + if current: + parts.append(' '.join(current)) + return parts + +raw = INPUT.read_text(encoding='utf-8').splitlines() +out_lines = [] +dropped = 0 + +for line in raw: + cleaned = clean_line(line) + if warang_citi_count(cleaned) < 5: + if cleaned.strip(): + dropped += 1 + continue + for part in split_at_boundary(cleaned, MAX_CHARS): + if warang_citi_count(part) >= 5: + out_lines.append(part) + +OUTPUT.write_text('\n'.join(out_lines) + '\n', encoding='utf-8') + +print(f"Input lines: {len(raw)}") +print(f"Output lines: {len(out_lines)}") +print(f"Dropped (<5 Ol Chiki chars): {dropped}") +print(f"Written to: {OUTPUT}") diff --git a/hoc/corpus/hoc_clean.txt b/hoc/corpus/hoc_clean.txt new file mode 100644 index 0000000..f1540dc --- /dev/null +++ b/hoc/corpus/hoc_clean.txt @@ -0,0 +1,414 @@ +𑢳𑣈𑣓𑣁 𑣔𑣉 𑢹𑣉𑣉 𑣎𑣋𑣜 𑢹𑢥𑢶 𑣕𑣈 𑣗𑣆𑣅𑣉𑣄 𑣕𑣓 𑢹𑢩𑢩 𑢧𑢦𑢬𑢢𑢸𑢢𑢱𑢢𑢡 𑣕𑣓𑣁. 𑢳𑣈𑣓𑣁 𑢷𑢺𑢨𑢤 +𑢧𑢦𑢬𑢢𑢸𑢢𑢱𑢢𑢡 𑣕𑣓𑣁 𑣁𑣇𑣜𑣂 𑣗𑣆 𑣞𑣈𑣌𑣁𑣓𑣁. 𑢳𑣈𑣓𑣁 𑣞𑣜𑣂 (𑣞𑣃𑣓𑣈) 𑢹𑣉𑣉 𑢧𑣆𑣌𑣂𑣘𑣂𑣑𑣂𑣁 𑣔𑣉 𑣌𑣁 +𑣕𑣓𑣁. 𑢳𑣈𑣕𑣁𑣄 𑣜𑣈 𑣚𑣚𑣂-𑣞𑣀𑣋𑣂 𑢩𑣓𑣉𑣚𑣚 𑣌𑣉 𑣉𑣚𑣈 𑣈𑣓𑣀 𑣞𑣜𑣂 (𑢾𑣃𑣓𑣈) 𑢶𑢼𑢠 𑢹𑢩𑢩 +𑢧𑢦𑢬𑢢𑢸𑢢𑢱𑢢𑢡 𑣔𑣉 𑣗𑣆𑣅𑣉𑣄𑣁. 𑢡𑣗𑣈𑣓𑣉 𑣉𑣉 𑢩𑣓𑣉𑣚𑣚 𑣌𑣉 𑣉𑣚 𑣔𑣈𑣊𑣋𑣁𑣚𑣈 𑣗𑣈𑣓 +𑢳𑣈𑣓𑣁 𑣗𑣚𑣈𑣄 𑢧𑣆𑣌𑣂𑣘𑣂𑣑𑣂𑣁 𑣕𑣓𑣁, 𑣈𑣓𑣁 𑣖𑣈𑣓𑣕𑣈 𑣓𑣈𑣙𑣕𑣄 𑣜𑣈 𑣉𑣚𑣉𑣄 𑣕𑣓 𑢩𑣓𑣉𑣚𑣚 𑣌𑣉 +𑣓𑣈𑣚𑣈𑣌𑣁 𑣓𑣃𑣕𑣃𑣖 𑣕𑣆𑣓 𑣚𑣋𑣁𑣕𑣂𑣊𑣈: 𑢩𑣓𑣉𑣚𑣚 𑣜𑣈𑣅𑣄 𑣓𑣃𑣕𑣃𑣖. 𑢮𑣁𑣁 𑣖𑣈𑣓𑣕𑣈 𑢺𑣌𑣉 𑢷𑣉𑣔𑣜𑣁 +𑣜𑣈𑣅𑣄 𑣖𑣂𑣅𑣈𑣑 𑣁𑣜𑣒𑣂𑣌𑣚 𑣗𑣈𑣓 𑣉𑣚𑣈 𑣕𑣓𑣁, 𑣈𑣓𑣔𑣉 𑣈𑣓𑣁 𑣓𑣈𑣚𑣈𑣌𑣁 𑣓𑣃𑣕𑣃𑣖𑣈𑣗𑣈𑣓: 𑢺𑣌𑣉 +𑢹𑣉𑣉 𑣎𑣋𑣜 𑣁𑣔𑣁𑣓 𑣌𑣉 𑣖𑣜 𑣁𑣜𑣒𑣂𑣌𑣚 (𑢩𑣓𑣉𑣚𑣚) 𑣌𑣉 𑣗𑣃 𑣉𑣚 𑣔𑣈𑣘𑣈𑣊𑣋𑣄 𑣁𑣜 𑣗𑣃 𑣖𑣃𑣚𑣂 +𑢳𑣈𑣓𑣕𑣄 𑣜𑣈 𑣓𑣁𑣄 𑣎𑣉𑣊 𑣜𑣈 𑢩𑣓𑣉𑣚𑣚 𑣌𑣉𑣋𑣈 𑣖𑣈𑣓𑣄'𑣁 +𑢺𑣕𑣜 𑣜𑣈 𑣈𑣖𑣁 𑣌𑣓 𑣑𑣚𑣁 (𑣑𑣗𑣁) 𑣜𑣈 𑣉𑣕𑣁 𑣌𑣈𑣙 𑣕𑣈 𑣓𑣖𑣁 𑣉𑣓𑣉𑣚𑣚 𑣜𑣈𑣅𑣄 𑣓𑣃𑣕𑣃𑣖 𑣉𑣚 𑣌𑣈𑣙 +𑣕𑣈 𑢳𑢶𑢡 𑢩𑣓𑣉𑣚𑣚 𑣗𑣆 𑣗𑣈𑣓 +𑢮𑣋𑣜-𑢮𑣓𑣁𑣋𑣜 𑣔𑣉 𑢹𑣜𑣕𑣙𑣞𑣁 𑣜𑣈 𑣪 𑣑𑣙𑣌𑣁 𑣙𑣉𑣛𑣉𑣌𑣉 𑣎𑣋𑣁𑣜𑣈 𑣕𑣓 𑣉𑣉𑣞𑣒𑣜𑣉-𑣈𑣞𑣂𑣁𑣒𑣂𑣌 +𑣋𑣉𑣉𑣒𑣉 𑣜𑣈𑣓 𑢶𑣃𑣀𑣑𑣁 𑣎𑣋𑣁𑣜 𑣕𑣓𑣁. 𑢳𑣈𑣓𑣁 𑢹𑣉𑣉 𑣎𑣕𑣂 𑣌𑣉 𑣎𑣋𑣁𑣜𑣈 𑣙𑣅𑣖 𑣕𑣓𑣁 𑣉𑣀𑣑𑣉𑣄𑣄 +𑢹𑣗𑣜𑣁𑣊 𑢯𑣂𑣕𑣂 𑣕𑣈 𑣉𑣚𑣉𑣄𑣁. 𑢩𑣌𑣉𑣓𑣉𑣌𑣉𑣓 𑣕𑣄 𑣌𑣉 𑣜𑣈 𑢴𑣈𑣉𑣓𑣁𑣋𑣜𑣂, 𑢩𑣛𑣂𑣅𑣁, 𑣉𑣀𑣑𑣉𑣄𑣄 +𑢺𑣅𑣒𑣂𑣓 𑣚𑣂𑣘𑣂 𑣘𑣆𑣒𑣂 𑣜𑣈 𑣁𑣋𑣃𑣃𑣄 𑣕𑣓𑣁, 𑣖𑣈𑣓𑣔𑣉 𑢹𑣉𑣉 𑣎𑣋𑣁𑣜𑣈 𑣕𑣓 𑣌𑣉 𑣖𑣈𑣓𑣈𑣅𑣁 𑣏𑣂 +𑣈𑣓𑣁𑣌𑣉 𑢹𑣉𑣉 𑣎𑣋𑣁𑣜 𑣚𑣋𑣂𑣑 𑣌𑣁 𑣗𑣃𑣋𑣂𑣓𑣈, 𑢹𑣗𑣜𑣁𑣊 𑢯𑣂𑣕𑣂 𑣋𑣈. 𑢸𑣃𑣜𑣄 𑣞𑣊𑣋𑣂 𑢹𑣉𑣉 𑣎𑣋𑣁𑣜 +𑢮𑣅𑣜𑣁𑣌𑣁𑣀𑣑 𑣜𑣈𑣓 𑢹𑣞𑣃𑣜 𑢾𑣂𑣍𑣙𑣞𑣁, 𑢵𑣃𑣜 𑢾𑣂𑣍𑣙𑣞𑣁 𑣉𑣀𑣑𑣉𑣄 𑢩𑣛𑣂𑣞𑣈 𑣜𑣈𑣓 𑢬𑣂𑣍𑣎𑣜𑣂 +𑢶𑣉𑣜𑣗𑣉𑣉𑣍𑣎𑣉 𑣜𑣈 𑣎𑣋𑣁𑣜𑣉𑣄 𑣕𑣓𑣁. 𑢹𑣉𑣉 𑣔𑣉 𑢶𑣃𑣀𑣑𑣁𑣜𑣂 𑣉𑣀𑣑𑣉𑣄𑣄 𑢾𑣀𑣕𑣁𑣚𑣂 𑣌𑣉 𑣜𑣈𑣅𑣄 +𑢾𑣗𑣈𑣓 𑣈𑣕𑣈 𑣚𑣚𑣂 𑢹𑣉𑣉 𑣎𑣋𑣁𑣜 𑣔𑣉 𑢮𑣅𑣜𑣁𑣌𑣁𑣀𑣑 𑣜𑣈𑣓 𑢹𑣞𑣃𑣜 𑢾𑣂𑣍𑣗𑣃𑣆 +𑢾𑣜𑣆𑣌𑣈𑣚𑣁-𑢬𑣉𑣜𑣞𑣉𑣁𑣀, 𑢵𑣃𑣜 𑢾𑣂𑣍𑣗𑣃𑣆 𑣜𑣈 𑢩𑣛𑣂𑣞𑣁 𑣜𑣈𑣓 𑢶𑣉𑣜𑣗𑣉𑣉𑣍𑣎𑣉, 𑢬𑣈𑣅𑣉𑣍𑣎𑣉𑣜 𑣎𑣂𑣚𑣁 +𑣌𑣉 𑣜𑣈 𑣎𑣋𑣁𑣜𑣉𑣄 𑣕𑣓𑣁. 𑢹𑣉𑣉 𑣎𑣋𑣁𑣜 𑣔𑣉 𑢾𑣀𑣕𑣁𑣚𑣂, 𑢶𑣃𑣀𑣑𑣁𑣜𑣂 𑣉𑣀𑣑𑣉𑣄 𑢷𑣃𑣖𑣂𑣎 𑣎𑣋𑣁𑣜 𑣌𑣉 +𑣚𑣉𑣄 𑣖𑣂𑣑 𑣋𑣉𑣉𑣒𑣉 𑣜𑣈 𑣋𑣈 𑣙𑣒𑣂𑣊 𑣁𑣌𑣁𑣓𑣁. 𑢹𑣉𑣉 𑣎𑣋𑣁𑣜 𑣉𑣀𑣑𑣉𑣄 𑢶𑣃𑣀𑣑𑣁𑣜𑣂 𑣎𑣋𑣁𑣜 𑣔𑣉 +𑣖𑣂𑣑 𑣚𑣈𑣌𑣁𑣓 𑣎𑣋𑣁𑣜 𑣌𑣉 𑣕𑣓𑣁, 𑣚𑣂𑣊𑣋𑣃𑣆𑣞𑣒 𑣌𑣉 𑣖𑣈𑣓𑣈𑣅𑣁 𑣏𑣂 𑢹𑣉𑣉 𑣎𑣋𑣁𑣜 𑣉𑣀𑣑𑣉𑣄 +𑢶𑣃𑣀𑣑𑣁𑣜𑣂 𑣎𑣋𑣁𑣜 𑣔𑣉 𑣖𑣂𑣑 𑣋𑣈𑣅𑣁 +𑢹𑣉𑣉 𑣎𑣋𑣁𑣜 𑣔𑣉 𑢹𑣗𑣁𑣜𑣊 𑢯𑣂𑣕𑣂 𑣚𑣂𑣘𑣂 𑣕𑣈 𑣉𑣚𑣉𑣄 𑣕𑣓𑣁 +𑢷𑣁𑣌𑣐𑣁 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢩𑣌𑣉𑣓 𑣗𑣂𑣑𑣔𑣁 𑣕𑣈 𑣓𑣂𑣜𑣚𑣁 𑣉𑣓𑣉𑣚, 𑣘𑣛𑣁𑣉 𑣁𑣜 𑣎𑣋𑣜 𑣞𑣉𑣅𑣕𑣁 𑣈𑣕𑣉𑣄 𑣁𑣄 𑣈𑣓 𑣗𑣂𑣑𑣔𑣁 𑣋𑣈𑣌𑣉 +𑢹𑣅𑣖 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢽𑣂𑣜𑣂𑣎𑣓 𑣁𑣘𑣁𑣓𑣄 𑣇𑣛𑣃𑣄, 𑣙𑣂𑣅𑣁𑣕𑣂𑣊 𑣉𑣓𑣑𑣉𑣄 𑣞𑣓𑣀 𑣘𑣉𑣌𑣕𑣁 𑣓𑣀 𑣉𑣌𑣉𑣓𑣁 𑢨 𑣜𑣂𑣌𑣁𑣈 𑣜𑣂𑣌𑣁 +𑣆𑣜𑣂 𑣌𑣉𑣁𑣙 𑣈𑣓𑣁 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑢹𑣅𑣖 +𑢦𑣘𑣓 𑣗𑣜𑣊 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢨 𑢨 𑣕𑣈 𑣙𑣉𑣗𑣓 𑣝𑣅𑣑 𑣝𑣛𑣂 𑣝𑣃𑣛𑣃𑣊 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑣆𑣘𑣓 𑣗𑣜𑣊 +𑢯𑣂𑣚𑣂𑣌𑣁:- 𑣿𑣀𑣁𑣂𑣃𑣄𑣅𑣆𑣇𑣈𑣉 +𑢷𑣈𑣊𑣓 𑣗𑣜𑣊 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢦𑣘𑣓 𑣗𑣜𑣊'𑣄 𑣔𑣈𑣊𑣋𑣁 𑣕𑣈 𑣙𑣉𑣗𑣓 𑣝𑣅𑣑 𑣝𑣛𑣂 𑣝𑣃𑣛𑣃𑣊 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑣗𑣈𑣊𑣓 𑣗𑣜𑣊 +𑢯𑣂𑣚𑣂𑣌𑣁:- 𑣊𑣋𑣌𑣍𑣎𑣏𑣐𑣑𑣒𑣓𑣔𑣕𑣖𑣗𑣘𑣙𑣚𑣛𑣜𑣝𑣞 +𑢺𑣂𑣘𑣂 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢩𑣌𑣉𑣓 𑣝𑣅𑣑 𑣝𑣃𑣜𑣜 𑣝𑣛𑣂 𑣋𑣉𑣚𑣈 𑣜𑣃𑣃𑣘 𑣉𑣚𑣚𑣁, 𑣈𑣓𑣁 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑣚𑣂𑣘𑣂 +𑢯𑣂𑣕𑣂 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢺𑣂𑣘𑣂 𑣜𑣄 𑣜𑣃𑣃𑣘 𑣏𑣂 𑣇𑣖𑣗𑣃𑣚 𑣖𑣈𑣓𑣌𑣓 𑣉𑣚 𑣜𑣃𑣃𑣘, 𑣋𑣁𑣜 𑣜𑣃𑣃𑣘 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑢯𑣂𑣕𑣂 +𑢹𑣗𑣁𑣜𑣊 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢽𑣂𑣜𑣂𑣎𑣓'𑣄 𑣖𑣁𑣊 𑣝𑣛𑣂 𑣏𑣂 𑣝𑣅𑣑 𑣝𑣛𑣂 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑢹𑣗𑣁𑣜𑣊 +𑢷𑣁𑣌𑣐𑣁 𑣏𑣂𑣖𑣂𑣓 𑣌𑣈𑣎𑣁 𑣜𑣈 𑣖𑣈𑣓𑣄? +𑢡𑣘𑣈𑣙 𑣌𑣈𑣎𑣁 𑣜𑣈:- (𑣡)𑢷𑣜𑣊 𑣗𑣂𑣏𑣜, (𑣢)𑢽𑣗𑣔 𑣞𑣉𑣍𑣎𑣉𑣌𑣉, (𑣣)𑢷𑣌𑣁𑣀 𑣗𑣃𑣜𑣃 +𑢷𑣜𑣊 𑣗𑣂𑣏𑣜 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢩𑣌𑣉𑣓 𑣌𑣈𑣎𑣁 𑣜𑣈 𑣗𑣜𑣊 𑣏𑣂 𑣏𑣂𑣕𑣂 𑣌𑣉 𑣜𑣄 𑣜𑣃𑣃𑣘, 𑢽 𑣛𑣃𑣊 𑣁𑣔𑣉 𑣝𑣊𑣋𑣕𑣂𑣓 𑣕𑣈 𑣝𑣗𑣔 𑣌𑣉 +𑣕𑣂𑣅𑣁𑣜𑣈𑣓𑣁, 𑣈𑣓𑣁 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑣗𑣜𑣊 𑣗𑣂𑣏𑣜 +𑢯𑣂𑣌𑣁:- 𑢩𑣚𑣚, 𑢨𑣜𑣁, 𑢬𑣜𑣁, 𑢵𑣂𑣙 𑣈𑣖𑣓𑣁 +𑢽𑣗𑣔 𑣞𑣉𑣍𑣎𑣉𑣌𑣉 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢩𑣌𑣉𑣓 𑣌𑣈𑣎𑣁 𑣜𑣈 𑣝𑣗𑣔 𑣌𑣉'𑣄 𑣙𑣁𑣚𑣕, 𑣘𑣓𑣚𑣒𑣁, 𑣘𑣂𑣏𑣄 𑣗𑣆𑣗𑣂𑣜𑣜 𑣜𑣈𑣅𑣄 𑣓𑣂𑣅𑣖 𑣖𑣈𑣓𑣄 𑣈𑣓𑣁 +𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑣝𑣗𑣔 𑣞𑣉𑣍𑣎𑣉𑣌𑣉 +𑢷𑣌𑣁𑣀 𑣗𑣃𑣜𑣃 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢩𑣌𑣉𑣓 𑣌𑣈𑣎𑣁 𑣜𑣈 𑣏𑣂𑣕𑣂 𑣕𑣈 𑣝𑣗𑣔 𑣁𑣔𑣉 𑣝𑣗𑣔 𑣕𑣈 𑣗𑣌𑣁𑣀 𑣗𑣆 𑣓𑣁 𑣈𑣓𑣁 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑢷𑣌𑣁𑣀 +𑢯𑣂𑣚𑣂𑣌𑣁:- 𑢧𑣜𑣂𑣄 𑣁𑣕𑣂𑣊 𑣕𑣓𑣁 +𑢦𑣘𑣓 𑣎𑣈𑣜𑣖𑣈𑣙𑣑 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢹𑣓𑣚: 𑢩𑣌𑣉𑣓 𑣜𑣃𑣃𑣘 𑣗𑣉𑣔𑣉𑣚 𑣏𑣂 𑣉𑣚𑣒𑣓 𑣞𑣃𑣚𑣚 𑣝𑣃𑣛𑣃𑣊 𑣗𑣈𑣓𑣋𑣁 𑣓𑣁, 𑣈𑣓𑣁 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 +𑢯𑣂𑣚𑣂𑣌𑣁:- 𑢹𑣁𑣜𑣁-𑢹𑣁𑣁𑣜𑣁, 𑢼𑣂𑣕𑣁-𑢼𑣂𑣂𑣕𑣁, 𑢺𑣂𑣒𑣁-𑢺𑣂𑣂𑣒𑣁, 𑢼𑣈𑣕𑣁-𑢼𑣈𑣈𑣕𑣁 𑣈𑣖𑣓𑣄 +𑢷𑣈𑣊𑣓 𑣎𑣈𑣜𑣖𑣈𑣙𑣑 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢷𑣈𑣊𑣓 𑣗𑣜𑣊 𑣌𑣉 𑣎𑣈𑣜𑣜𑣈𑣓 𑣜𑣈 𑣉𑣌𑣉𑣓 𑣜𑣃𑣃𑣘 𑣗𑣉𑣔𑣉𑣚𑣈𑣓𑣁 𑣈𑣓𑣁 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑢷𑣈𑣊𑣓 +𑢯𑣂𑣚𑣂𑣌𑣁:- 𑢶𑣘𑣘𑣄, 𑢶𑣂𑣚𑣚,𑢽𑣃𑣜𑣜,𑢾𑣃𑣚𑣚 𑣈𑣖𑣁𑣓𑣄 +𑢽𑣗𑣔 𑣗𑣂𑣏𑣁𑣜 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢽𑣗𑣔 𑣜𑣈𑣅𑣄 𑣁𑣏𑣁𑣜 𑣗𑣂𑣏𑣁𑣜 𑣗𑣁𑣌𑣐𑣁 𑣜𑣈 𑣈𑣓 𑣘𑣛𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄 𑣉𑣌𑣉𑣓 𑣜𑣈 𑣝𑣗𑣔 𑣌𑣉'𑣄 +𑣜𑣉𑣌𑣉𑣖 𑣁𑣔𑣉 𑣌𑣎𑣂 𑣇𑣖𑣂 𑣜𑣃𑣃𑣘 𑣓𑣁 𑣉𑣓𑣑𑣉𑣄 𑣗𑣆 𑣗𑣂𑣏𑣜 𑣙𑣉𑣗𑣁 𑣓𑣁, 𑣈𑣓𑣁 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 +𑢫𑣉𑣙𑣖 𑣁𑣜 𑢫𑣉𑣙𑣜𑣘𑣉 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢽𑣗𑣔 𑣖𑣃𑣓𑣑𑣂 𑣜𑣈 𑣌𑣜𑣈 𑣔𑣉 𑣝𑣗𑣔 𑣕𑣃𑣓𑣑𑣃 𑣜𑣈 𑣖𑣂𑣘𑣘𑣂𑣅𑣑 𑣝𑣗𑣔 𑣊𑣝 𑣌𑣜𑣈 𑣏𑣂𑣕𑣂 𑣏𑣂 𑣝𑣗𑣔 +𑣔𑣉 𑣋𑣉𑣙𑣖 𑣁𑣜 𑣋𑣉𑣙𑣜𑣘𑣉 𑣌𑣉 𑣖𑣈𑣕𑣄 +𑢯𑣂𑣚𑣌𑣁:- 𑢷𑣌𑣁𑣀:𑢬𑣋𑣙𑣛𑣂𑣌𑣁 𑣁𑣋𑣃𑣇𑣄. 𑢽𑣗𑣔:𑢬𑣋𑣙𑣛𑣂𑣌𑣁 𑢫𑣉𑣙𑣜𑣘𑣉:𑢬 𑢫𑣉𑣙𑣖:𑢬𑣁 𑢶𑣃𑣇𑣛 +𑢽𑣃𑣖 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢩𑣌𑣉𑣓𑣁 𑣈𑣒𑣄 𑣝𑣗𑣔 𑣌𑣉'𑣄 𑣔𑣈𑣊𑣋𑣈 𑣕𑣈 𑣌𑣁 𑣗𑣆𑣓𑣁, 𑣈𑣓𑣁 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑢽𑣃𑣖 +𑢯𑣂𑣚𑣂𑣌𑣁:𑢶𑣈𑣑,𑢶𑣃𑣒𑣁,𑢺𑣃𑣕𑣃𑣜𑣜,𑢵𑣂𑣙,𑢹𑣈𑣓𑣔𑣈,𑢸𑣃𑣓𑣑𑣂,𑣞𑣞𑣀 𑣈𑣖𑣁𑣓𑣄 +𑢮𑣓𑣁𑣘𑣄 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢩𑣌𑣉𑣓𑣁 𑣎𑣃𑣛𑣂 𑣚𑣈𑣓𑣅 𑣕𑣈 𑣗𑣆𑣓𑣁 𑣈𑣓𑣌𑣓 𑣝𑣗𑣔 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑢮𑣓𑣁𑣘𑣄 +𑢯𑣂𑣚𑣂𑣌𑣁:- 𑢹𑣁𑣁𑣑 𑣕𑣈𑣅𑣄, 𑢶𑣁𑣀𑣑𑣂 𑣕𑣓𑣂𑣄, 𑢵𑣉𑣟 𑣕𑣇𑣎𑣂𑣄, 𑣁𑣍𑣎𑣙-𑣁𑣍𑣎𑣙, 𑣞𑣞𑣀 𑣀𑣄 𑣈𑣖𑣓 +𑢷𑣌𑣁𑣀 𑣜𑣄 𑣘𑣉𑣜𑣕𑣁𑣛 𑣏𑣈𑣓𑣄 𑣌𑣉 𑣖𑣈𑣕𑣄? +𑢷𑣁𑣌𑣐𑣁 𑣜𑣄 𑣜𑣃𑣃𑣚 𑣉𑣛𑣊 𑣚𑣈𑣌𑣁 𑣕𑣈 𑣝𑣗𑣔 𑣖𑣂𑣑 𑣖𑣃𑣚𑣂 𑣘𑣓𑣕𑣂 𑣏𑣂 𑣋𑣘𑣁𑣕𑣂𑣅𑣁 𑣌𑣓𑣈𑣙 𑣕𑣈 +𑣗𑣆𑣅𑣉𑣄 𑣏𑣂 𑣕𑣂𑣅𑣁𑣜𑣉𑣄 𑣝𑣛𑣁 𑣋𑣈𑣌𑣉 𑣖𑣈𑣕𑣄 𑢷𑣌𑣁𑣀 +𑢯𑣂𑣚𑣂𑣌𑣁:-𑢳𑣂𑣆 𑣖𑣂𑣅𑣑 𑣗𑣂𑣚𑣅. 𑢺𑣃𑣌𑣃𑣖𑣂 𑢭'𑣄 𑣖𑣂𑣞𑣂𑣍 𑣌𑣃𑣆. 𑢺𑣃𑣌𑣃𑣖𑣂 𑢭'𑣄 𑣇𑣓𑣑𑣂𑣍 +𑣌𑣃𑣆. 𑢭 𑣘𑣃𑣕𑣂 𑣘𑣛𑣁𑣉 𑣕𑣓𑣁. 𑣈𑣖𑣁𑣓𑣄 +𑢵 𑢫𑣃𑣜𑣃 𑢬𑣉𑣚 𑢺𑣌𑣉 𑢷𑣉𑣔𑣜𑣁 (𑣡𑣩 𑢬𑣉𑣙𑣜𑣁 𑣡𑣩𑣡𑣩 - 𑣢𑣩 𑢡𑣏𑣛𑣁 𑣡𑣩𑣨𑣨), 𑣓𑣂𑣌𑣂𑣓 𑣔𑣉 +𑢹𑣗𑣁𑣜𑣊 𑢯𑣂𑣕𑣂 𑣘𑣍𑣎𑣁-𑣓𑣖-𑣌𑣈𑣓-𑣌𑣂𑣓. 𑢹𑣉𑣉 𑣙𑣃𑣔𑣁 𑣜𑣈𑣓 𑣓𑣃𑣕𑣃𑣖𑣓 𑣙𑣉𑣉 𑣌𑣂𑣍 +𑢺𑣌𑣉 𑢷𑣉𑣔𑣜𑣁 𑣕𑣂𑣌𑣂𑣓 𑣡𑣩 𑢬𑣉𑣙𑣜𑣁 𑣡𑣩𑣡𑣩 𑣔𑣂𑣚𑣊 𑢸𑣁𑣞𑣈𑣅𑣁 𑣙𑣕𑣃, 𑢬𑣃𑣀𑣒𑣘𑣁𑣓𑣂 , 𑣙𑣞𑣃𑣜 +𑢾𑣂𑣍𑣙𑣞𑣁, 𑢮𑣅𑣜𑣔𑣂𑣞𑣃𑣖 𑣜𑣈 𑣌𑣂𑣓 𑣙𑣉𑣗𑣁 𑣚𑣈𑣓𑣁. 𑢡𑣘𑣃 𑣔𑣉 𑢺𑣈𑣗𑣈𑣅𑣁 𑢷𑣉𑣔𑣜𑣁 𑣉𑣄 𑣈𑣊𑣋𑣁 𑣔𑣉 +𑢮𑣓𑣉 𑢬𑣃𑣆. 𑢡𑣌𑣂𑣓𑣄 𑣈𑣓𑣈𑣒𑣈𑣄 𑣆𑣓𑣂𑣕𑣃𑣜 𑣔𑣉 𑢷𑣑𑣏𑣉𑣖 𑣙𑣕𑣃 𑢨𑣓𑣈𑣒𑣈𑣄 𑢨𑣕𑣉-𑣕𑣁𑣓 𑣜𑣈 𑣙𑣉𑣗𑣁 +𑣎𑣓𑣁. 𑢨𑣓-𑣈𑣕𑣈 𑢸𑣃𑣜𑣃𑣆𑣅𑣈 𑣜𑣈 𑣨 𑣗𑣜𑣁 𑣎𑣉𑣌𑣁 𑣌𑣂𑣓 𑣈𑣕𑣈𑣓 𑣎𑣓𑣁. 𑢸𑣃𑣜𑣃𑣆𑣅𑣈-𑣈𑣕𑣈 𑣈𑣕𑣈𑣓 +𑣚𑣋𑣂𑣑 𑣉𑣄 𑢯𑣌𑣁𑣙 𑣌𑣂𑣓 𑣞𑣈𑣓𑣉𑣄 𑣎𑣓𑣁. 𑢯𑣌𑣁𑣙 𑢫𑣜𑣁𑣖𑣈𑣜 𑢾𑣌𑣃𑣃𑣚 𑣜𑣈 𑣩 𑣗𑣜𑣁 𑣎𑣉𑣌𑣁 𑣌𑣂𑣓 +𑣈𑣕𑣈𑣓 𑣎𑣓𑣁. 𑣩 𑣗𑣜𑣁-𑣈𑣕𑣈 𑣁𑣅𑣁𑣜 𑣘𑣁 𑣈𑣕𑣈𑣓 𑣚𑣋𑣂𑣑 𑢮𑣂𑣚𑣈 𑢹𑣆𑣞𑣌𑣃𑣃𑣚, 𑢯𑣜𑣂𑣗𑣞𑣁 𑣌𑣂𑣓 +𑣞𑣈𑣓𑣉𑣄 𑣎𑣓𑣁. 𑣪 𑣗𑣜𑣁 𑣕𑣅𑣉𑣖 𑢶𑣜𑣊 𑢫𑣉𑣖𑣌𑣈 𑢮𑣅𑣘𑣁𑣚 𑢾𑣂𑣊 𑢶𑣃𑣀𑣑𑣁 𑣁𑣄 𑣔𑣈𑣊𑣋𑣁 𑣕𑣈 +𑢮𑣚𑣀𑣔𑣜, 𑢸𑣍𑣎𑣈𑣗 𑣈𑣕𑣉𑣓 𑣌𑣂𑣓 𑣞𑣈𑣓𑣉𑣄 𑣎𑣓𑣁 +𑢳𑣚𑣁 𑢩𑣓𑣑𑣉𑣄 𑢹𑣗𑣁𑣜𑣊 𑢯𑣂𑣕𑣂 +𑢨𑣕𑣈𑣓 𑣌𑣉 𑣏𑣗𑣁 𑣌𑣈𑣈 𑣕𑣈 𑣉𑣟𑣄 𑣌𑣂𑣓 𑣜𑣃𑣟𑣈𑣈 𑣎𑣓𑣁. 𑢹𑣜𑣕𑣙𑣞𑣁 𑢼𑣈𑣈𑣚 𑣜𑣈𑣅𑣄 𑣓𑣚𑣁 +𑢱𑣊𑣋𑣉𑣟𑣁𑣘𑣃𑣞𑣂 𑣜𑣈 𑣌𑣂𑣓 𑣓𑣖 𑣌𑣈𑣑𑣁. 𑢨𑣓𑣁 𑣜𑣈 𑣓𑣚𑣁 𑣕𑣓 𑣆𑣖𑣂𑣕𑣈 𑣋𑣈 𑢿𑣜𑣊 𑢯𑣂𑣕𑣂 𑣔𑣉 𑣌𑣂𑣓 +𑣘𑣍𑣎𑣁 𑣓𑣖 𑣌𑣈𑣑𑣁. 𑢳𑣈𑣓 𑣏𑣂𑣕𑣂 𑣌𑣎𑣂-𑣓𑣂𑣕𑣂𑣜𑣈 𑣚𑣋𑣂𑣑 𑢶𑣙𑣁𑣕𑣂 𑢷𑣓𑣑𑣜𑣁 𑣁𑣄 𑣔𑣈𑣊𑣋𑣁 𑣕𑣈 +𑢮𑣉𑣛𑣁-𑢸𑣃𑣌𑣃𑣜𑣂𑣅𑣈 𑣜𑣈 𑢴𑣃𑣘𑣘𑣃𑣗 𑢹𑣃𑣔𑣈 𑣌𑣂𑣓 𑣕𑣂𑣊𑣋𑣈𑣜 𑣌𑣈𑣑𑣁 +𑢩𑣛𑣂𑣞𑣈 𑣓𑣈𑣅𑣁 𑣕𑣃𑣜𑣋𑣓 𑢹𑣜𑣕𑣙𑣞𑣁 𑣜𑣈𑣓 𑣖𑣂𑣅𑣑 𑣜𑣎𑣊 𑣕𑣓𑣁. 𑢳𑣈𑣜𑣈𑣅𑣄 𑣁𑣜𑣞𑣆 𑣔𑣉 +𑢷𑣃𑣓𑣈𑣈𑣞𑣉𑣜. 𑢳𑣈𑣓 𑣜𑣎𑣊 𑣌𑣃𑣀𑣔𑣃 𑣜𑣈 𑢮𑣅𑣜𑣁𑣌𑣓 𑣉𑣄 𑢷𑣊𑣋𑣁𑣚, 𑣙𑣞𑣃𑣜 𑣜𑣈 𑢯𑣕𑣂𑣞𑣋𑣛𑣁, 𑣏𑣗𑣜 +𑣜𑣈 𑢠𑣔𑣜-𑣒𑣅𑣑, 𑣉𑣄 𑣕𑣃𑣜 𑣜𑣈 𑢷𑣊𑣋𑣁𑣚 𑣔𑣄 𑣖𑣈𑣓𑣄𑣁 +𑢵𑣂𑣂𑣎𑣈𑣓 𑣔𑣉 𑣜𑣈𑣑𑣂𑣅𑣉 𑣏𑣈𑣓𑣈𑣚 𑣘𑣅𑣁𑣜 𑣌𑣈𑣈 𑣞𑣓𑣂𑣎𑣜 𑣔𑣆 𑣆𑣔𑣂𑣅𑣃𑣜-𑣔𑣅𑣓 𑣎𑣓𑣄 𑣕𑣓𑣁 +𑢴𑣜𑣕𑣈𑣊 𑣕𑣂𑣂𑣎𑣈𑣓 𑣌𑣉 𑣜𑣈 𑣞𑣓𑣂𑣎𑣜 𑣚𑣉𑣄 𑣉𑣓𑣉𑣌𑣈𑣚, , 𑣙𑣂𑣜𑣌𑣃𑣚, 𑣙𑣂𑣜𑣋𑣈𑣓, 𑣎𑣓𑣘𑣄 +𑣕𑣁𑣜-𑣗𑣊 𑣈𑣘𑣈𑣎𑣜, 𑣙𑣂𑣜𑣂𑣓𑣃𑣊 𑣌𑣉 𑣙𑣉 𑣒𑣆𑣓𑣈 +𑢧𑣖𑣗𑣈𑣈-𑣆𑣞𑣂𑣎𑣈𑣓 𑣖𑣈𑣕𑣓 𑣗𑣈𑣚𑣁𑣋𑣈𑣓 𑣜𑣈 𑣔𑣄 𑣌𑣜𑣈 𑣈𑣒𑣄 𑣔𑣄𑣋𑣈𑣓 𑣌𑣈𑣈 𑣎𑣉𑣓𑣉𑣖 𑣆𑣞𑣂𑣓 𑣕𑣈𑣅𑣄 +𑣙𑣉𑣗𑣁𑣞𑣈𑣓 𑣋𑣈 𑣇𑣖𑣗𑣈𑣈 𑣕𑣈 𑣆𑣞𑣂𑣓 𑣖𑣈𑣓𑣉𑣄𑣁. 𑢧𑣖𑣗𑣈𑣈 𑣕𑣈 𑣆𑣞𑣂𑣓𑣈 𑣜𑣈 𑣎𑣉𑣓𑣉𑣖 𑣁𑣍𑣎𑣁 𑣋𑣈 +𑣆𑣞𑣂𑣓𑣉𑣄 𑣕𑣈 𑣎𑣃𑣓𑣃𑣋𑣚 𑣞𑣋𑣈𑣜𑣉𑣄𑣁. 𑢨𑣞𑣈𑣗𑣁𑣌𑣓 𑣗𑣈𑣚𑣁𑣋𑣈𑣓 𑣜𑣈 𑣔𑣄 𑣕𑣂𑣌𑣂𑣅𑣉𑣄 𑣕𑣈 𑣇𑣖𑣗𑣈𑣈 +𑣗𑣆𑣓𑣈, 𑣓𑣈𑣓 𑣇𑣖𑣗𑣈𑣈 𑣕𑣈 𑣗𑣈𑣚𑣁𑣋𑣈𑣓 𑣜𑣈𑣅𑣄 𑣇𑣓𑣃𑣜𑣋𑣖 𑣚𑣚𑣂𑣑𑣉𑣄𑣁. 𑢨𑣓 𑣚𑣚𑣂𑣑𑣁𑣌𑣁𑣓 +𑣇𑣓𑣃𑣜𑣋𑣖 𑣕𑣈 𑣎𑣉𑣓𑣉𑣖 𑣁𑣍𑣎𑣁 𑣋𑣈 𑣆𑣞𑣂𑣓𑣉𑣄𑣁. 𑢸𑣅𑣁𑣜 𑣕𑣅𑣉𑣖 𑣆𑣞𑣂𑣎𑣈𑣓 𑣉𑣏𑣉𑣗𑣈 𑣚𑣋𑣂𑣑 𑣈𑣓 +𑣜𑣈𑣅𑣄 𑣇𑣖𑣗𑣈𑣈 𑣓𑣂𑣋𑣂𑣜𑣈 𑣕𑣈 𑣙𑣉𑣗𑣁𑣓𑣁 +𑢳𑣂𑣙𑣉𑣓 (𑢳𑣂𑣙𑣉𑣊𑣎𑣜: ), 𑣓𑣈𑣓𑣁 𑣕𑣃𑣜 𑢨𑣞𑣂𑣅𑣈 𑢹𑣘𑣁-𑣕𑣓-𑣔𑣄 𑣜𑣈 𑣖𑣈𑣓𑣄 𑣕𑣓 𑣖𑣂𑣅𑣑 +𑣔𑣄-𑣑𑣂𑣘𑣈 𑣔𑣂𑣞𑣃𑣖 𑣕𑣓𑣁. 𑢳𑣈𑣓 𑣔𑣂𑣞𑣃𑣖 𑣙𑣞𑣃𑣜 𑣞𑣄 𑣜𑣈 𑢳𑣂𑣙𑣉𑣓-𑣔𑣄, 𑢵𑣃𑣜 𑢾𑣂𑣅𑣈𑣓-𑣔𑣄 +𑢾𑣂𑣅𑣈𑣓, 𑢬𑣉𑣜𑣂𑣅𑣈, 𑣉𑣄 𑢼𑣞𑣂𑣅𑣈 𑣖𑣈𑣓𑣄𑣁. 𑢳𑣂𑣙𑣉𑣊𑣎𑣜 𑣕𑣈 𑣉𑣚𑣁𑣌𑣓 𑣓𑣈𑣓 𑣔𑣂𑣞𑣃𑣖-𑣓𑣃𑣕𑣃𑣖 +𑣜𑣈𑣅𑣄 𑣖𑣈𑣓𑣈𑣚 𑣔𑣉 "𑣞𑣂𑣊𑣋𑣂 𑣙𑣉𑣓𑣉𑣗", 𑣉𑣄 𑣓𑣈𑣓 𑣔𑣂𑣞𑣃𑣖 "𑢾𑣂𑣊𑣋𑣂 𑢵𑣃𑣜 𑢴𑣂𑣞𑣃𑣖" 𑣖𑣈𑣓𑣕𑣈 +𑢺𑣉𑣚𑣂𑣕 𑣞𑣂𑣊 𑣗𑣁𑣓𑣜𑣁: 𑢡𑣗𑣈𑣓𑣁𑣄 𑣓𑣃𑣕𑣃𑣖 𑣏𑣂𑣓𑣁𑣄𑣁? +𑣁𑣚𑣂𑣍𑣁𑣄 𑣓𑣃𑣕𑣃𑣖 𑣔𑣉 𑢺𑣁𑣔𑣃𑣜𑣁 𑢾𑣂𑣊 𑢹𑣁𑣆𑣗𑣃𑣜𑣃 +𑣙𑣁𑣕𑣃 𑣕𑣁𑣚𑣈 𑣌𑣈𑣞𑣘𑣉𑣑𑣁 +𑣁𑣏𑣁, 𑢺𑣁𑣔𑣃𑣜𑣁 𑢷𑣁𑣗𑣃 +𑣁𑣗𑣈𑣓 𑣓𑣈𑣓 𑣙𑣉𑣖𑣉𑣀 𑣜𑣈𑣁𑣄 𑣌𑣉𑣍𑣎𑣁 𑣗𑣉𑣄 𑣁𑣈𑣕𑣈 𑣌𑣁𑣒𑣁 𑣎𑣉𑣊? +𑣁𑣗𑣃 𑣙𑣉𑣉 𑣕𑣈 𑣏𑣂𑣚𑣂𑣌𑣈 𑣌𑣉 𑣎𑣁𑣋𑣁𑣜𑣈𑣁 +𑣎𑣉𑣌𑣉𑣈 𑣗𑣈𑣓 𑣌𑣁𑣎𑣂 𑣖𑣁𑣜𑣞𑣁𑣚 𑣓𑣉𑣄 𑣚𑣂𑣍𑣈 +𑣈𑣓𑣔𑣉 𑣓𑣁𑣄 𑣔𑣉 𑣁𑣗𑣃 𑣔𑣉 𑣓𑣈𑣄 𑣓𑣈𑣓𑣁 𑣎𑣉𑣇 𑣏𑣈𑣕𑣁𑣓 𑣇𑣕𑣁𑣜 𑣜𑣈𑣁𑣄 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣗𑣉𑣄 𑣗𑣁𑣚𑣈 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁 +𑣈𑣓 𑣜𑣈𑣔𑣉 𑣓𑣈𑣓𑣁 𑣔𑣉, 𑣓𑣈𑣓𑣁 𑣔𑣉 𑣗𑣉𑣄 +𑣈𑣁, 𑣓𑣈𑣓𑣁 𑣔𑣉 𑣗𑣉𑣄 +𑣈𑣓𑣜𑣈𑣔𑣉 𑣈𑣓 𑣞𑣁𑣖𑣓𑣁 𑣘𑣁𑣁 𑣕𑣈𑣚𑣂𑣊 𑣙𑣃𑣎𑣃𑣄𑣁 𑣓𑣁𑣄 𑣔𑣉 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣖𑣃𑣒𑣁 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣖𑣈𑣑 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣓𑣈𑣓 𑣖𑣈𑣑 𑣏𑣈𑣕𑣁𑣓 𑣜𑣁𑣘𑣂𑣊 𑣜𑣁𑣘𑣂𑣊 𑣕𑣁𑣓 𑣕𑣈𑣁𑣄 𑣜𑣁𑣓𑣁𑣘𑣂𑣑 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣜𑣁𑣓𑣁𑣘𑣂𑣑 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣈𑣓𑣕𑣈 𑣓𑣈𑣓𑣁 𑣔𑣉 𑣖𑣈𑣑 𑣌𑣁𑣓𑣑𑣉𑣖 𑣆𑣍𑣈𑣚 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣙𑣁𑣀...𑣓𑣈𑣓𑣁 𑣔𑣉 𑣚𑣃𑣒𑣂 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣞𑣉𑣖𑣘𑣃𑣜𑣓𑣉 𑣔𑣉 𑣁𑣁 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣓𑣈𑣄 𑣓𑣈𑣓𑣁 𑣔𑣉 𑣔𑣁𑣒𑣁 +𑣔𑣁𑣒𑣁 𑣔𑣉 𑣗𑣁𑣜 𑣘𑣜𑣉𑣌𑣁𑣜 𑣖𑣈𑣓𑣁𑣄𑣁 +𑣗𑣂𑣕𑣈𑣜 𑣜𑣈𑣔𑣉 𑣋𑣁𑣓𑣑𑣃𑣔𑣁𑣒𑣁 +𑣗𑣂𑣕𑣈𑣜 𑣜𑣈𑣁𑣄 𑣔𑣉 𑣋𑣁𑣓𑣑𑣃𑣔𑣁𑣒𑣁 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁???? +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣖𑣃𑣚𑣂𑣔𑣁𑣒𑣁 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣈𑣓𑣔𑣉 𑣈𑣓𑣁 𑣘𑣉𑣜𑣈 𑣓𑣈𑣄 𑣓𑣈𑣘𑣁𑣁 𑣜𑣈 𑣕𑣁𑣆𑣓𑣈 𑣚𑣃𑣕𑣃𑣜 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣚𑣃𑣕𑣃𑣜 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣈𑣓 𑣚𑣁𑣕𑣁𑣜 𑣓𑣉𑣄 𑣕𑣁𑣎𑣕𑣈 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣎𑣉𑣁 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁 +𑣓𑣈𑣘𑣁𑣁 𑣌𑣃𑣒𑣂𑣉 𑣎𑣉𑣁 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣕𑣁𑣛𑣃 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣓𑣈𑣓𑣕𑣁𑣄 𑣁𑣈𑣕𑣈 𑣙𑣉𑣒𑣉𑣄, 𑣙𑣉𑣒𑣉𑣄 +𑣓𑣈𑣓𑣁 𑣁𑣈𑣕𑣈 𑣓𑣈𑣓𑣁 𑣔𑣉 𑣞𑣃𑣘𑣃 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣓𑣈𑣄 𑣓𑣈𑣓 𑣕𑣁𑣄 𑣎𑣉𑣊 +𑣓𑣈𑣓 𑣜𑣃𑣓𑣃𑣌𑣃𑣆𑣄 𑣎𑣉𑣊 𑣓𑣈𑣓 𑣕𑣁𑣄 𑣔𑣉 𑣞𑣃𑣘𑣃 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁 +𑣓𑣈𑣓 𑣕𑣁𑣄 𑣁𑣈𑣕𑣈 𑣓𑣈𑣓𑣕𑣁𑣄 𑣎𑣉𑣊 +𑣈𑣁, 𑣞𑣃𑣘𑣃 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁 +𑣞𑣃𑣘𑣃, 𑣞𑣃𑣘𑣃, 𑣞𑣃𑣘𑣃 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁 +𑣁𑣓𑣑𑣉𑣄 𑣓𑣈𑣓 𑣕𑣁𑣄 𑣁𑣈𑣕𑣈 𑣓𑣈𑣘𑣁𑣁 𑣔𑣉 𑣕𑣂𑣂 +𑣁𑣏𑣁 𑣓𑣈𑣓 𑣎𑣁𑣊 𑣕𑣁𑣄 𑣎𑣉𑣊 𑣏𑣂 +𑣙𑣉𑣀, 𑣓𑣈𑣓𑣁 𑣌𑣉 𑣖𑣁 𑣁𑣊𑣋𑣃𑣛𑣂 𑣌𑣉 +𑣓𑣈𑣓𑣁 𑣌𑣉 𑣓𑣈𑣓𑣁 𑣌𑣉 𑣔𑣉 𑣁𑣊𑣋𑣃𑣛𑣂 𑣌𑣉𑣗𑣃 𑣖𑣈𑣕𑣁𑣄𑣁 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣞𑣁𑣜𑣞𑣁𑣜 𑣗𑣃 𑣖𑣈𑣕𑣁𑣄𑣁 +𑣞𑣁𑣜𑣞𑣁𑣜 𑣖𑣈𑣓𑣉𑣄 𑣕𑣁𑣓 𑣕𑣈𑣁𑣄 𑣔𑣉 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣗𑣃 𑣖𑣈𑣓𑣈𑣁 𑣞𑣁𑣜𑣞𑣁𑣜 +𑣁𑣏𑣁, 𑣁𑣗𑣃 𑣓𑣈𑣓 𑣁𑣊𑣋𑣃𑣛𑣂 𑣌𑣉𑣁𑣄 𑣓𑣃𑣕𑣃𑣖 𑣖𑣈𑣓𑣁𑣄𑣁 +𑣎𑣉𑣌𑣁 𑣗𑣈𑣓 𑣎𑣁𑣋𑣁𑣜 𑣓𑣉𑣄 𑣁𑣚𑣂𑣍𑣈? +𑣇𑣀...𑣁𑣊𑣋𑣃𑣛𑣂 𑣔𑣉 𑣙𑣉𑣗𑣁𑣈𑣓𑣁 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣗𑣃𑣛𑣈𑣈 𑣁𑣊𑣋𑣃𑣛𑣂 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣏𑣃𑣓𑣑𑣃𑣚 𑣁𑣊𑣋𑣃𑣛𑣂 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣕𑣁𑣚𑣁 𑣁𑣊𑣋𑣃𑣛𑣂 +𑣓𑣈𑣓𑣁 𑣗𑣂𑣞𑣂𑣁𑣁𑣊𑣋𑣃𑣚𑣂 +𑣓𑣈𑣓𑣁 𑣌𑣁𑣓𑣂 𑣁𑣊𑣋𑣃𑣛𑣂 +𑣁𑣏𑣁 𑣁𑣗𑣃 𑣙𑣉𑣉 𑣕𑣈 𑣓𑣈𑣌𑣁 𑣌𑣉 𑣎𑣁𑣋𑣁𑣜𑣈𑣁 +𑣈𑣓 𑣏𑣁𑣓𑣁𑣗 𑣓𑣁𑣄 𑣔𑣉 𑣓𑣈𑣓𑣁 𑣗𑣈𑣓 𑣏𑣁𑣗𑣁 𑣌𑣈𑣑𑣁 𑣈𑣓𑣔𑣉 +𑣓𑣈𑣓𑣕𑣁𑣄 𑣁𑣈𑣕𑣈 𑣓𑣁𑣄 𑣔𑣉 𑣚𑣁𑣆𑣄 𑣘𑣁𑣁 𑣌𑣃𑣈𑣖 +𑣙𑣉𑣒𑣉𑣄 𑣘𑣁𑣈𑣕𑣈 𑣚𑣁𑣕𑣁𑣜 𑣘𑣁𑣁 𑣗𑣃 𑣁𑣁𑣔𑣃𑣓𑣁 +𑣚𑣁𑣕𑣁𑣜 𑣘𑣁𑣁 𑣗𑣃 𑣁𑣁𑣔𑣃𑣓𑣁 +𑣁𑣏𑣁 𑣓𑣈𑣓𑣕𑣁𑣄 𑣔𑣉 𑣓𑣈𑣘𑣁 𑣏𑣂𑣓𑣁𑣄𑣁 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁 +𑣓𑣈𑣓𑣕𑣁𑣄 𑣁𑣈𑣕𑣈 𑣓𑣈𑣓𑣕𑣁𑣄𑣁 𑣔𑣉 𑣌𑣃𑣈𑣖 +𑣁𑣏𑣁, 𑣓𑣈𑣘𑣁𑣁 𑣙𑣉𑣗𑣁𑣈𑣓𑣁 𑣚𑣈𑣊𑣋𑣁 𑣌𑣃𑣈𑣖 +𑣈𑣁, 𑣓𑣈𑣘𑣁𑣁 𑣙𑣉𑣗𑣈𑣓𑣁 𑣎𑣉𑣉𑣖 𑣌𑣃𑣈𑣖 +𑣁𑣏𑣁 𑣓𑣈𑣓𑣕𑣁𑣄 𑣁𑣈𑣕𑣈 𑣓𑣈𑣘𑣁𑣁 𑣔𑣉 𑣙𑣉𑣗𑣁𑣈𑣓𑣁 +𑣁𑣏𑣁, 𑣚𑣁𑣆𑣄 𑣕𑣁𑣄 𑣁𑣈𑣕𑣈 𑣓𑣈𑣓 𑣎𑣉𑣊 +𑢳𑣈𑣓 𑣓𑣂𑣓𑣁𑣔 𑣏𑣂𑣓𑣁𑣗𑣃 𑣖𑣈𑣕𑣁𑣄𑣁? +𑢳𑣂𑣓𑣁 𑣑𑣃𑣜𑣂 𑣎𑣁𑣊 𑣗𑣃 𑣖𑣈𑣕𑣁𑣄𑣁 +𑢱𑣃𑣜𑣂 𑣎𑣁𑣊 𑣗𑣃 𑣖𑣈𑣕𑣁𑣄𑣁 +𑢨𑣓𑣔 𑣖𑣁𑣅𑣁𑣊 𑣔𑣉 𑣉𑣌𑣉𑣓𑣕𑣁𑣄 𑣗𑣃 𑣖𑣈𑣓𑣈𑣁? +𑢶𑣁𑣅𑣁𑣊 𑣔𑣉 𑣓𑣈𑣓 𑣏𑣁𑣓𑣁𑣗 𑣘𑣁𑣁 +𑢳𑣈 𑣈𑣓𑣕𑣁 𑣁𑣈𑣕𑣈 𑣓𑣈𑣓𑣕𑣁𑣄 𑣖𑣁𑣅𑣁𑣊 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 𑣓𑣈 𑣈𑣓 𑣎𑣉𑣊 +𑢳𑣂𑣖𑣂𑣓 𑣁𑣈𑣕𑣈 𑣓𑣂𑣖𑣂𑣓𑣈 +𑢡𑣏𑣏𑣁 𑣁𑣗𑣈𑣓 𑣖𑣁𑣅𑣁𑣊 𑣚𑣁𑣕𑣁𑣜 𑣔𑣉 𑣏𑣂𑣓𑣁𑣄? +𑢶𑣁𑣅𑣁𑣊 𑣚𑣁𑣕𑣁𑣜 𑣔𑣉 𑣓𑣁𑣄 𑣌𑣁𑣎𑣂𑣌𑣈 𑣚𑣈𑣌𑣁 +𑢫𑣁𑣚𑣕𑣂 𑣓𑣈𑣘𑣁𑣔 𑣌𑣁𑣒𑣁 𑣖𑣃𑣌𑣃𑣆 𑣎𑣉𑣊 +𑣓𑣈𑣓𑣕𑣁 𑣖𑣁𑣅𑣁𑣊 𑣘𑣁 𑣈𑣕𑣈 𑣌𑣁𑣒𑣁 𑣖𑣃𑣌𑣃𑣆 𑣎𑣉𑣊 +𑣈𑣓 𑣘𑣁 𑣔𑣉 𑣌𑣁𑣒𑣁 𑣜𑣈𑣋𑣈 𑣙𑣂𑣞𑣈𑣗𑣉𑣁 +𑣌𑣁𑣒𑣁 𑣜𑣈𑣋𑣈 𑣙𑣂𑣞𑣈𑣗𑣉𑣁. 𑣌𑣁𑣒𑣁 𑣜𑣈𑣋𑣈 𑣙𑣂𑣞𑣈𑣗𑣉𑣁 +𑣁𑣏𑣏𑣁 𑣎𑣉𑣌𑣁 𑣌𑣁𑣒𑣁𑣕𑣃𑣑 𑣌𑣈 𑣕𑣈 𑣗𑣈𑣓 𑣌𑣁𑣎𑣂𑣈? +𑣗𑣃𑣚𑣃 𑣉𑣌𑣉𑣓𑣁 𑣌𑣉 𑣖𑣈𑣕𑣁 𑣖𑣈𑣓𑣕𑣈𑣁𑣙? +𑣁𑣗𑣃 𑣗𑣃𑣚𑣃 𑣔𑣉 𑣓𑣈 𑣈𑣓𑣕𑣁 𑣈𑣕𑣈 +𑣓𑣈𑣓𑣕𑣁 𑣘𑣎𑣂𑣞𑣓 𑣎𑣃𑣀 𑣓𑣈𑣓𑣕𑣁 𑣖𑣃𑣌𑣃𑣆 𑣎𑣁𑣊 𑣓𑣈𑣓𑣕𑣁 𑣔𑣉 𑣗𑣃𑣚𑣃 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁 +𑣎𑣌𑣁 𑣌𑣁𑣒𑣁 𑣕𑣃𑣚 𑣓𑣉𑣈𑣗𑣈𑣓 +𑣁𑣏𑣏𑣁 𑣓𑣈 𑣈𑣓𑣁𑣔 𑣏𑣂𑣓𑣈𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁? +𑣖𑣃𑣌𑣃𑣆 𑣌𑣉 𑣖𑣂𑣕𑣁𑣄𑣁 +𑣁𑣏𑣏𑣁 𑣓𑣈𑣓 𑣕𑣁𑣈𑣕𑣈 𑣓𑣈𑣓𑣕𑣁 𑣎𑣉𑣊 𑣔𑣉 +𑣓𑣂𑣓 𑣕𑣁𑣈𑣕𑣈 𑣓𑣂𑣓𑣕𑣁𑣄 𑣔𑣉 𑣜 𑣌𑣁𑣒𑣁𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣜𑣉 𑣌𑣁𑣒𑣁𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣓𑣈 𑣓𑣈𑣘𑣁 𑣔𑣉 𑣆𑣓𑣑𑣂𑣌𑣈 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣓𑣈 𑣓𑣂𑣓 𑣕𑣁𑣈𑣕𑣈 𑣓𑣂𑣓𑣕𑣁𑣄 𑣎𑣉𑣊 𑣔𑣉 𑣆𑣓𑣑𑣂𑣌𑣈 𑣌𑣉 𑣖𑣂𑣕𑣁𑣄 +𑣌𑣁 𑣓𑣈 𑣓𑣂𑣘𑣁𑣔𑣉 𑣆𑣓𑣑𑣂𑣌𑣈 𑣏𑣁𑣓𑣁𑣘𑣁 +𑣏𑣁𑣓𑣁𑣗 𑣘𑣁𑣁 𑣆𑣓𑣑𑣂𑣌𑣈 𑣔𑣉...𑣈𑣁 +𑣁𑣏𑣏𑣁, 𑣁𑣅𑣁𑣜 𑣘𑣁𑣁𑣔𑣉? +𑣁𑣅𑣁𑣜 𑣘𑣁 𑣌𑣃𑣚𑣞𑣃𑣌𑣁𑣒𑣁 +𑣈𑣓 𑣜𑣈𑣔 𑣓𑣂𑣓 𑣕𑣁𑣈𑣕𑣈 𑣓𑣂𑣓𑣕𑣁 𑣙𑣉𑣗𑣁𑣈𑣓𑣁 𑣌𑣃𑣚𑣞𑣃𑣌𑣁𑣒𑣁 +𑣓𑣂𑣓 𑣕𑣁𑣈𑣕𑣈 𑣓𑣂𑣘𑣁 𑣔𑣉 𑣆𑣓𑣑𑣂𑣌𑣈...𑣈𑣁 +𑣖𑣈𑣓𑣕𑣈𑣌𑣉 𑣖𑣈𑣓𑣈𑣁...𑣈𑣁 +𑣁𑣏𑣏𑣁 𑣕𑣂 𑣏𑣂𑣚𑣂𑣌𑣈 𑣓𑣃𑣕𑣃𑣖𑣈𑣓𑣁? +𑣈𑣓 𑣌𑣁 𑣓𑣈𑣓𑣌𑣁 𑣓𑣈𑣓 𑣚𑣁𑣕𑣁𑣜 𑣘𑣁𑣔𑣉? +𑣌 𑣓𑣂𑣓𑣁𑣔 𑣓𑣂𑣓𑣌𑣁 𑣁𑣊𑣋𑣃𑣛𑣂 𑣌𑣉 𑣔𑣉 𑣖𑣁𑣜𑣁𑣊 𑣁𑣊𑣋𑣃𑣛𑣂 +𑣈𑣓𑣌𑣁 𑣁𑣊𑣋𑣃𑣛𑣂 𑣈𑣌𑣁𑣓 𑣓𑣈𑣓𑣁 𑣙𑣂𑣞𑣁𑣗 𑣋𑣈 𑣏𑣂 𑣚𑣈𑣌𑣁 𑣋𑣈 +𑣕𑣂 𑣙𑣂𑣞𑣁𑣗 𑣋𑣈 𑣖𑣈𑣓𑣁 𑣌𑣁𑣎𑣂𑣜𑣈𑣔𑣉 +𑣁𑣏𑣏𑣁, 𑣓𑣂𑣓 𑣙𑣉𑣗𑣁 𑣈𑣓𑣁, 𑣓𑣂𑣓 𑣁𑣊𑣋𑣃𑣛𑣂 𑣗𑣁𑣔𑣉 +𑣁𑣗𑣈𑣓 𑣎𑣃 𑣌𑣁𑣒𑣁 𑣚𑣁𑣕𑣁𑣜𑣈 '𑣎𑣃𑣒𑣁' +𑣎𑣃 𑣓𑣈𑣓 𑣌𑣁𑣒𑣁 𑣚𑣁𑣕𑣁𑣜 𑣌𑣉 𑣖𑣈𑣓𑣈𑣅𑣁? +𑣓𑣈𑣓𑣕𑣁 𑣈𑣕𑣈 𑣓𑣂𑣘𑣁 𑣔𑣉 𑣏𑣂𑣓𑣁𑣌𑣉 𑣖𑣈𑣕𑣁? +𑣔𑣅𑣁 𑣔𑣁𑣗𑣂...𑣔𑣅𑣁 𑣔𑣁𑣗𑣂 +𑣓𑣂𑣓𑣕𑣁 𑣈𑣕𑣈 𑣓𑣂𑣓𑣁𑣔𑣉 𑣙𑣉𑣗𑣁𑣈𑣓𑣁 𑣔𑣅𑣁 𑣔𑣁𑣗𑣂...𑣔𑣅𑣁 𑣔𑣁𑣗𑣂 +𑣁𑣏𑣏𑣁 𑣓𑣈 𑣓𑣈𑣓𑣁𑣔𑣉 𑣏𑣂𑣓𑣈 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁? +𑣓𑣂𑣘𑣁𑣔 𑣙𑣉𑣗𑣁𑣅𑣁𑣓𑣁 𑣎𑣉𑣖 𑣘𑣁 𑣜𑣃𑣘𑣂 +𑣓𑣂𑣓𑣁 𑣙𑣉𑣗𑣁 𑣅𑣁𑣓𑣁 𑣚𑣂𑣊𑣋𑣁 𑣜𑣃𑣘𑣂...𑣚𑣂𑣊𑣋𑣁 𑣜𑣃𑣘𑣂 +𑣁𑣏𑣏𑣁 𑣖𑣁𑣅𑣁𑣊 𑣚𑣁𑣕𑣁𑣜 𑣕𑣈 𑣗𑣃 𑣞𑣈𑣓𑣉𑣄𑣁 +𑣓𑣈𑣘𑣁𑣈𑣕𑣈 𑣓𑣂𑣓𑣕𑣁 𑣎𑣉𑣊 𑣏𑣂𑣓𑣁 𑣗𑣃 𑣖𑣈𑣓𑣈𑣁 𑣁𑣗𑣃 𑣙𑣉 𑣁𑣕𑣈? +𑣓𑣂𑣓𑣁𑣔 𑣚𑣁𑣓𑣑𑣂𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣓𑣂𑣓𑣁 𑣌𑣁𑣜𑣁𑣗 𑣔𑣉 𑣌𑣁 𑣇𑣛𑣃𑣄𑣈 +𑣎𑣁 𑣏𑣂 𑣌𑣁𑣎𑣂 𑣞𑣖𑣎𑣁𑣉 𑣙𑣂𑣞𑣈𑣗 𑣕𑣈 𑣔𑣉 𑣚𑣁𑣓𑣑𑣂𑣌𑣉 𑣖𑣈𑣓𑣈𑣈 +𑣃𑣀, 𑣁𑣏𑣏𑣁...𑣁𑣏𑣏𑣁 +𑣈𑣓𑣁𑣔 𑣎𑣃𑣖 𑣌𑣈 𑣎𑣂𑣚𑣃𑣌 𑣖𑣈𑣕𑣁 +𑣈𑣓𑣁𑣔𑣉 𑣁𑣀𑣔𑣃 𑣌𑣁𑣒𑣁𑣌𑣉 𑣖𑣈𑣓𑣈𑣁 +𑣆𑣓𑣑𑣂𑣌𑣈 𑣌𑣉 𑣖𑣁𑣓𑣈𑣁 𑣁𑣀𑣔𑣃 𑣌𑣁𑣒𑣁𑣁𑣌𑣉 +𑣖𑣊𑣋𑣚 𑣞𑣂𑣀𑣌𑣃: 𑢡𑣗𑣃 𑣙𑣉𑣉 𑣙𑣃𑣔𑣁 𑣜𑣈 +𑣋𑣉𑣁𑣀 𑣗𑣉𑣊𑣋𑣁 𑣜𑣈𑣁𑣄 𑣏𑣉𑣚𑣉𑣓 𑣌𑣉 𑣖𑣈𑣓𑣁𑣄𑣁 +𑣈𑣓𑣔𑣉 𑣋𑣉𑣁𑣀 𑣔𑣉 𑣁𑣗𑣃 +𑣋𑣉𑣁𑣀 𑣖𑣈𑣓 𑣌𑣈𑣈 𑣜𑣈𑣔𑣉 +𑣇𑣜𑣂𑣄 𑣖𑣈𑣜𑣉𑣖 𑣌𑣉 𑣉𑣌𑣉𑣓 𑣕𑣁𑣄 𑣌𑣉𑣜𑣈 𑣗𑣃 +𑢵𑣉𑣚 𑣌𑣉𑣁 𑣜𑣂𑣌𑣈 𑣌𑣉𑣁 +𑣈𑣓𑣁 𑣙𑣉𑣗𑣁𑣈𑣓𑣁 𑣋𑣉𑣁𑣀 +𑣈𑣓 𑣋𑣉𑣁𑣀 𑣜𑣈 𑣉𑣌𑣉𑣓𑣁 𑣗𑣉𑣊𑣋𑣁𑣉𑣄 𑣕𑣈𑣁𑣄 𑣋𑣈 𑣋𑣉𑣁𑣀 𑣗𑣉𑣊𑣋𑣁 +𑢫𑣉𑣁𑣀 𑣗𑣉𑣊𑣋𑣁 𑣓𑣈𑣚𑣈𑣌𑣁 𑣙𑣉𑣗𑣁𑣉𑣄𑣁 +𑣏𑣂 𑣉𑣁𑣄 𑣜𑣈𑣓 𑣖𑣃𑣜𑣉𑣗𑣂 𑣙𑣉𑣉 +𑣞𑣁𑣕𑣁𑣄 𑣜𑣈 𑣉𑣛𑣁 𑣞𑣁𑣘𑣁 𑣌𑣈𑣓𑣕𑣈 +𑣓𑣁𑣖𑣁 𑣕𑣈𑣁𑣄 𑣗𑣉𑣞𑣕𑣜𑣉...𑣕𑣃𑣞𑣂𑣊 𑣌𑣈𑣈𑣕𑣈 +𑢫𑣉𑣁𑣀 𑣎𑣉𑣄 𑣞𑣁𑣘𑣁 𑣋𑣃𑣜𑣂𑣄 𑣞𑣁𑣘𑣁 𑣌𑣈𑣈𑣕𑣈 +𑢶𑣂𑣑 𑣕𑣁𑣄 𑣜𑣈 𑣉𑣌𑣉𑣓 𑣕𑣁𑣄 𑣜𑣈 𑣗𑣉𑣊𑣋𑣁𑣅𑣁, 𑣈𑣓𑣕𑣁𑣄 𑣋𑣃𑣜𑣂𑣄𑣈 +𑣋𑣃𑣜𑣂𑣄 𑣌𑣈𑣈 𑣏𑣁𑣓𑣁𑣗 +𑣈𑣓𑣕𑣁𑣄 𑣜𑣈 𑣞𑣂𑣓𑣔𑣃𑣜𑣂, 𑣏𑣁𑣇𑣚𑣂 +𑣘𑣃𑣍𑣎𑣂 𑣌𑣈𑣈 𑣕𑣈 𑣗𑣉𑣊𑣋𑣁𑣅𑣁 +𑣁𑣓𑣑𑣉𑣄 𑣈𑣓𑣁 𑣚𑣉𑣄 𑣕𑣈, 𑣞𑣂𑣖 𑣖𑣂𑣓𑣑𑣉 𑣗𑣉𑣊𑣋𑣁𑣉𑣄𑣁 +𑣁𑣓𑣑𑣉𑣄 𑣁𑣎 𑣇𑣜𑣂𑣄 𑣖𑣈𑣜𑣉𑣖 𑣌𑣉𑣔𑣉 +𑣋𑣉𑣁𑣀 𑣜𑣈𑣔𑣉 𑣌𑣉 𑣉𑣄𑣚 𑣁𑣅𑣁𑣜 𑣚𑣈𑣈 𑣌𑣉𑣁 +𑣈𑣓 𑣏𑣁𑣓𑣁𑣗 𑣈𑣓 𑣜𑣈𑣔𑣉𑣎 𑣗𑣉𑣊𑣋𑣁𑣅𑣁 +𑣁𑣓𑣑𑣉𑣄 𑣁𑣎 𑣚𑣉𑣄 𑣕𑣈 +𑣉𑣁𑣄 𑣜𑣈𑣓 𑣗𑣉𑣊𑣋𑣁 𑣗𑣃𑣜𑣃 𑣌𑣉 𑣁𑣎 𑣈𑣓𑣕𑣁𑣄 𑣜𑣈 𑣞𑣈𑣗𑣁 𑣞𑣁𑣛𑣁 𑣌𑣉𑣁 +𑣁𑣓𑣑𑣉𑣄 𑣈𑣓𑣁 𑣖𑣈𑣓𑣕𑣈𑣎 𑣗𑣉𑣊𑣋𑣁𑣅𑣁, 𑣏𑣂 𑣈𑣓𑣕𑣁𑣄 +𑣜𑣈...𑣋𑣉𑣁𑣀...𑣞𑣃𑣔 𑣕𑣁𑣆𑣁 𑣌𑣁𑣓𑣉𑣄 𑣏𑣁 +𑣘𑣁𑣜𑣏𑣂 𑣕𑣁𑣆𑣈 𑣌𑣁𑣓𑣉𑣄 𑣏𑣁 𑣖𑣈𑣓𑣕𑣈 𑣗𑣉𑣊𑣋𑣁𑣅𑣁 +𑣉𑣁𑣄 𑣜𑣈𑣓 𑣖𑣃𑣜𑣉𑣗𑣂 𑣙𑣉𑣉 𑣈𑣓𑣁 𑣖𑣈𑣓𑣕𑣈𑣎 𑣗𑣉𑣊𑣋𑣁𑣅𑣁 +𑣏𑣂 𑣞𑣂𑣜𑣖𑣁 𑣎𑣁𑣌𑣈𑣑 𑣁𑣗𑣃 +𑣇𑣜𑣂𑣄 𑣌𑣉 𑣖𑣈𑣜𑣉𑣖 𑣌𑣉 𑣘𑣁𑣆𑣒𑣂 𑣜𑣈𑣗𑣃 𑣁𑣏𑣃 𑣌𑣉 𑣕𑣁𑣓𑣁 +𑣁𑣗𑣃𑣁𑣄 𑣘𑣁𑣆𑣒𑣂 𑣜𑣈 𑣁𑣌𑣉 𑣚𑣁𑣋𑣁𑣕𑣂𑣍𑣁 𑣌𑣁𑣓𑣉𑣄 𑣕𑣁𑣓𑣁 +𑣈𑣓𑣔𑣉 𑣁𑣌𑣉𑣁𑣄 𑣞𑣃𑣜𑣉𑣌𑣅𑣁 𑣚𑣁𑣋𑣂𑣑 +𑣁𑣎 𑣙𑣁𑣕𑣃 𑣜𑣈𑣓 𑣔𑣈𑣝𑣁𑣇𑣚𑣂 𑢫𑣉𑣁𑣀 𑣗𑣉𑣊𑣋𑣁, 𑢷𑣂𑣜𑣃𑣗𑣉𑣊𑣋𑣁 +𑣕𑣁𑣄 𑣜𑣈 𑣈𑣓𑣁𑣄 𑣙𑣁𑣜𑣂 𑣋𑣉𑣁𑣜𑣂𑣈 +𑣏𑣂 𑣖𑣁𑣜 𑣓𑣈𑣌𑣃 𑣖𑣂𑣂 𑣞𑣂𑣜𑣖𑣁 𑣎𑣁𑣌𑣈𑣑 𑣚𑣈 +𑣁𑣏𑣃 𑣌𑣈𑣑 𑣌𑣉𑣁...𑣘𑣁𑣆𑣒𑣂 𑣆𑣜𑣂 𑣌𑣈𑣑 𑣌𑣉𑣁𑣚𑣈 +𑣁𑣌𑣉 𑣗𑣃𑣜𑣃 𑣌𑣉𑣕𑣈, 𑣋𑣁𑣛𑣁 𑣌𑣉𑣕𑣈, 𑣔𑣉𑣛𑣁 𑣌𑣉𑣕𑣈 +𑣎𑣁𑣁 𑣘𑣁𑣁𑣕𑣈 𑣎𑣈𑣕𑣁 𑣘𑣁𑣁𑣕𑣈 𑣌𑣉 𑣁𑣕𑣂𑣊 𑣕𑣈𑣌𑣉 𑣞𑣈𑣓𑣉𑣄 𑣕𑣁𑣓𑣁 +𑣈𑣓 𑣌𑣉𑣜𑣈 𑣁𑣚𑣉 𑣏𑣁𑣌𑣉 𑣏𑣉𑣋𑣁𑣉𑣄! +𑣗𑣃𑣜𑣃 𑣌𑣉𑣜𑣈 𑣗𑣁𑣋𑣈𑣁 𑣁𑣚𑣉𑣏𑣁 𑣇𑣌𑣃 𑣌𑣉! +𑣁𑣓𑣑𑣉𑣄 𑣌𑣃𑣚𑣈 𑣌𑣉 𑣗𑣁𑣚𑣃 𑣌𑣉 𑣁𑣚𑣉𑣏𑣁𑣌𑣉 𑣎𑣉𑣖 𑣌𑣉! +𑣗𑣉𑣜𑣞𑣉 𑣎𑣁𑣌𑣈 𑣓𑣈𑣚𑣈𑣌𑣁 𑣋𑣈 𑣘𑣃𑣍𑣎𑣂 𑣘𑣉𑣁𑣀𑣓 𑣏𑣁𑣌𑣉 +𑣁𑣓𑣑𑣉𑣄 𑣙𑣁𑣕𑣃 𑣌𑣉𑣜𑣈 𑣗𑣃𑣋𑣂 𑣚𑣈𑣌𑣁, 𑣜𑣉𑣋𑣁𑣎𑣉𑣋𑣂 𑣌𑣉 𑣁𑣚𑣉𑣏𑣁 𑣙𑣉𑣗𑣁𑣉𑣄! +𑣕𑣂𑣌𑣂 𑣌𑣉 𑣁𑣚𑣉𑣏𑣁𑣌𑣉 𑣎𑣃𑣚𑣈𑣊 𑣌𑣉 𑣖𑣁𑣜𑣖𑣁𑣜 𑣌𑣉 𑣁𑣚𑣉𑣏𑣁𑣌𑣉 𑣙𑣃𑣁𑣄 𑣌𑣉! +𑣈𑣓𑣈𑣄 𑣓𑣁 𑣜𑣈𑣁𑣄 𑣚𑣁𑣋𑣂𑣑 𑣕𑣈 𑣗𑣃𑣜𑣃 𑣗𑣉𑣊𑣋𑣁 +𑣋𑣉𑣁𑣀 𑣗𑣉𑣊𑣋𑣁, 𑣖𑣁𑣜𑣁𑣊 𑣗𑣉𑣊𑣋𑣁 𑣕𑣁𑣄 𑣜𑣈 𑣁𑣎 𑣙𑣁𑣜𑣂 𑣋𑣉𑣁𑣜𑣂𑣈 +𑣗𑣉𑣊𑣋𑣁 𑣗𑣃𑣜𑣃 𑣌𑣉 𑣁𑣅𑣃𑣖 𑣌𑣈𑣈 𑣕𑣈 +𑣞𑣂𑣜𑣖𑣁 𑣎𑣁𑣌𑣈𑣑 𑣏𑣁𑣓𑣁𑣗 𑣔𑣉 𑣁𑣌𑣉 +𑣗𑣉𑣊𑣋𑣁𑣗𑣃𑣜𑣃 𑣌𑣉𑣁𑣄 𑣔𑣃𑣁𑣜𑣁 𑣕𑣈 𑣗𑣃𑣋𑣂 𑣚𑣈𑣌𑣁 𑣌𑣉 𑣕𑣁𑣆𑣈 𑣌𑣁𑣓𑣉𑣄𑣏𑣁 𑣖𑣈𑣓𑣕𑣈 𑣁𑣎 +(𑢼𑣁𑣖𑣁𑣆 𑣞𑣂𑣊 𑣁𑣓𑣑𑣉𑣉𑣄 𑣎𑣃𑣛𑣂 𑣌𑣉 𑣚𑣉𑣄 𑣕𑣈 𑣔𑣁𑣖𑣁 𑣔𑣃𑣖𑣁𑣊 𑣌𑣉 𑣞𑣁𑣛𑣂 𑣕𑣁𑣓𑣁) +(𑣌𑣁𑣁 𑣁𑣅𑣃𑣖𑣉𑣄 𑣎𑣁𑣋𑣁𑣜) +𑢺𑣁𑣚𑣂𑣕 𑣞𑣂𑣊 𑢷𑣁𑣓𑣜𑣁: 𑣁𑣏𑣁 𑣁𑣗𑣈𑣓𑣁𑣄 𑣓𑣃𑣕𑣃𑣖 𑣏𑣂𑣓𑣁𑣄? +𑢼𑣁𑣖𑣁𑣆 𑢾𑣂𑣊: 𑢼𑣁𑣖𑣁𑣆 𑢾𑣂𑣊 +𑣁𑣏𑣁, 𑣓𑣈𑣓𑣁 𑣏𑣂𑣓𑣁𑣄 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄 𑣙𑣉𑣉 𑣕𑣈 𑣔𑣉? +𑣙𑣖𑣖...𑣙𑣉𑣉 𑣕𑣈𑣔𑣉 𑣁𑣓𑣑𑣉𑣄 𑣏𑣂𑣓𑣁𑣄 𑣌𑣉 𑣖𑣈𑣓𑣈𑣁, 𑣔𑣁𑣖𑣁 𑣌𑣉 +𑣔𑣃𑣖𑣁𑣊 𑣌𑣉 𑣖𑣈𑣕𑣁𑣄𑣁 +𑢳𑣈𑣓 𑣎𑣉𑣇 𑣕𑣁𑣁𑣛𑣉 𑣗𑣈𑣓 𑣜𑣃𑣃 𑣌𑣈𑣑𑣁 𑣈𑣓𑣁 +𑣉𑣌𑣉𑣓 𑣘𑣉𑣜𑣉𑣗 𑣜𑣈𑣁𑣄? +𑣁𑣚𑣂𑣊 𑣓𑣁𑣄 𑢶𑣋𑣈 𑣘𑣉𑣜𑣉𑣗 +𑢾𑣁𑣖𑣁𑣎 𑣜𑣈𑣁𑣄 𑣚𑣂𑣊 𑣜𑣃𑣃 𑣌𑣈𑣑𑣁 +𑢳𑣈𑣓 𑣔𑣁𑣖𑣁 𑣎𑣉𑣇 𑣕𑣁𑣁𑣛𑣉 𑣗𑣈𑣓 𑣌𑣁𑣎𑣂 𑣌𑣈𑣑𑣁 +𑣙𑣖𑣖...𑢳𑣈𑣓𑣁 𑣏𑣂𑣖𑣂𑣕𑣁 𑣌𑣉 𑣜𑣃𑣆𑣅𑣁? +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣖𑣁𑣋𑣈 𑣘𑣉𑣜𑣉𑣗 𑣜𑣈 𑣙𑣃𑣎𑣃𑣄𑣁𑣌𑣉 +𑣖𑣁𑣋𑣈 𑣗𑣉𑣊𑣋𑣁 𑣌𑣉 𑣆𑣖𑣕𑣁𑣊 𑣁𑣚𑣈 𑣞𑣈𑣓𑣉𑣄𑣁 +𑣏𑣁𑣓𑣁𑣗 𑣕𑣈 𑣈𑣓𑣕𑣈 𑣉𑣛𑣁𑣓 𑣕𑣈𑣚𑣈 𑣆𑣑 𑣌𑣉 𑣋𑣈𑣁 +𑣓𑣁𑣄 𑣗𑣁𑣜𑣞𑣂𑣊 𑣎𑣉𑣌𑣁 𑣌𑣉...'...' +𑣈𑣁...𑣓𑣈𑣓 𑣕𑣁𑣁𑣛𑣉 𑣔𑣉 𑣏𑣂𑣖𑣂𑣕𑣁 𑣗𑣉𑣊𑣋𑣁 𑣁𑣜𑣉𑣖𑣗𑣉𑣁 𑣈𑣓 𑣞𑣉𑣖𑣁𑣈 𑣜𑣈 +𑣈𑣓𑣔𑣉 𑣗𑣃𑣛𑣂 𑣈𑣜𑣁 𑣌𑣉 𑣞𑣃𑣞𑣃𑣓 𑣆𑣑𑣂𑣁 +𑣓𑣈𑣓 𑣕𑣁𑣁𑣛𑣉 𑣔𑣉 𑣖𑣁𑣋𑣈 𑣘𑣉𑣜𑣉𑣗 𑣗𑣁𑣔 +𑣉𑣌𑣉𑣓 𑣜𑣈𑣌𑣉 𑣜𑣃𑣃 𑣔𑣁𑣆𑣁? +𑣖𑣁𑣋𑣈 𑣘𑣉𑣜𑣉𑣗 𑣗𑣁𑣔 𑣜𑣈𑣔𑣉 𑣌𑣁𑣌𑣉 𑣜𑣃𑣃 𑣔𑣁𑣆𑣈 +𑣓𑣈𑣓...𑣓𑣈𑣓 𑣕𑣁𑣁𑣛𑣉 𑣜𑣈𑣉 +𑣖𑣁𑣋𑣈 𑣘𑣉𑣜𑣉𑣗 𑣜𑣈𑣋𑣈 𑣓𑣈𑣓𑣁 𑣔𑣉 𑣌𑣉 𑣜𑣃𑣃𑣅𑣁 +𑢳𑣈𑣓𑣁 𑣏𑣂𑣚𑣂𑣌𑣈 𑣌𑣉 𑣗𑣁𑣆𑣁? +𑣖𑣂𑣞𑣕𑣜𑣂 𑣌𑣉 𑣖𑣈𑣓𑣁𑣄 𑣌𑣉𑣁 +𑣖𑣂𑣞𑣕𑣜𑣂 𑣖𑣈𑣓𑣕𑣈𑣁𑣄 𑣔𑣉? +(𑣌𑣁 𑣁𑣅𑣃𑣖𑣉𑣄 𑣕𑣁𑣓 𑣎𑣁𑣋𑣁𑣜) +𑣁𑣓𑣑𑣉𑣄 𑣓𑣈𑣓𑣁 𑣔𑣉 𑣉𑣌𑣉𑣓𑣁 𑣇𑣔𑣃𑣗𑣉𑣄 𑣕𑣁𑣓𑣁 +𑣓𑣈𑣓𑣁 𑣔𑣉 𑣏𑣂𑣌𑣈𑣓 𑣇𑣀𑣜 𑣕𑣈 𑣗𑣁𑣆𑣁 𑣌𑣁𑣓𑣁 +𑣏𑣂 𑣏𑣂𑣓𑣁𑣄 𑣕𑣈 𑣗𑣁𑣆𑣁 𑣌𑣁𑣓𑣁? +𑣉𑣌𑣉𑣓 𑣌𑣉𑣗𑣃 𑣏𑣁𑣁𑣞𑣉 𑣌𑣉 𑣕𑣁𑣓𑣁 𑣇𑣜𑣂𑣄 𑣇𑣀𑣜 𑣏𑣂 +𑣈𑣓𑣁𑣈𑣕𑣈 𑣗𑣁𑣆𑣉𑣄 𑣕𑣁𑣓𑣁 +𑣖𑣁𑣓𑣈 𑣎𑣉𑣇𑣒𑣁 𑣗𑣈𑣓 𑣌𑣁𑣎𑣂 𑣌𑣈𑣑𑣁 𑣌𑣈𑣛𑣁 𑣇𑣀𑣜 𑣕𑣈 +𑣏𑣂 𑣇𑣜𑣂𑣄 𑣇𑣀𑣜 𑣕𑣈 𑣓𑣈𑣓𑣁 𑣔𑣉 𑣌𑣉 +𑣁𑣏𑣁...𑣁𑣏𑣁...𑣈𑣅𑣁 +𑣈𑣓𑣔𑣉 𑣗𑣁𑣜 𑣘𑣁 𑣎𑣁𑣌𑣈𑣑 𑣓𑣈𑣓𑣁 +𑣓𑣈𑣓𑣁 𑣈𑣓𑣈𑣄 𑣈𑣓𑣁 𑣋𑣈 𑣙𑣖𑣖𑣖 +𑣓𑣈𑣓𑣁 𑣎𑣉𑣇 𑣕𑣉𑣚𑣁 𑣌𑣁𑣓𑣁 +𑣏𑣂𑣓𑣁𑣄 𑣕𑣈 𑣕𑣉𑣚𑣁 𑣌𑣁𑣓𑣁 𑣓𑣈𑣓𑣁 𑣔𑣉? +𑣓𑣈𑣓𑣁𑣉 𑣈𑣓 𑣏𑣁𑣖𑣁𑣐𑣁 𑣕𑣈𑣋𑣈 𑣕𑣉𑣚𑣁 𑣌𑣁𑣓𑣁 +𑣈𑣓 𑣇𑣜𑣂𑣄 𑣇𑣀𑣜 𑣕𑣈𑣋𑣈...𑣕𑣉𑣚𑣁 𑣌𑣁𑣓𑣁 +𑣁𑣗𑣈𑣓...𑣏𑣂𑣖𑣂𑣓 𑣗𑣉𑣜𑣞𑣉 𑣗𑣉𑣅𑣉𑣞𑣈 𑣕𑣈 𑣓𑣈𑣓 𑣔𑣁𑣖𑣁 𑣜𑣃𑣃 𑣗𑣈𑣓 𑣈𑣕𑣉 𑣌𑣈𑣑𑣁? +𑣙𑣃𑣛𑣂𑣊𑣈 𑣕𑣈𑣋𑣈 𑣚𑣂𑣊 𑣈𑣕𑣉 𑣕𑣁𑣑𑣁...'𑣞𑣕𑣜-𑣁𑣒𑣜 𑣗𑣜𑣞' +𑣕𑣉𑣜𑣘𑣁 𑣜𑣈 𑣚𑣂𑣊 𑣈𑣕𑣉 𑣕𑣁𑣑𑣁 +𑣉𑣙𑣉..."𑣌𑣁𑣚𑣂𑣊𑣈." +𑣓𑣈𑣓𑣁 𑣈𑣓 𑣜𑣈𑣔𑣉 𑣗𑣉𑣍𑣎𑣉𑣜 𑣌𑣉 𑣞𑣈𑣓 𑣚𑣈𑣓𑣁 +𑣁𑣓𑣔𑣉 𑣁𑣌𑣉 𑣞𑣈𑣘𑣈𑣑 𑣌𑣉 𑣞𑣃𑣞𑣃𑣓 𑣜𑣈𑣔𑣉 +𑣏𑣂𑣚𑣂𑣌𑣈 𑣚𑣂𑣊 𑣞𑣈𑣓𑣉𑣄𑣁? 𑣌𑣁𑣚𑣂𑣊 𑣞𑣈𑣓 𑣔𑣁𑣆𑣈 +𑣁𑣎𑣉 𑣗𑣉𑣅𑣉𑣞𑣉 𑣖𑣂𑣈𑣑 𑣋𑣈𑣁 +𑣁𑣍𑣉 𑣖𑣂𑣈𑣑 𑣗𑣉𑣅𑣉𑣞 𑣋𑣈𑣁 +𑣁𑣓𑣑𑣉𑣄 𑣓𑣈𑣓𑣁 𑣔𑣉 𑣖𑣃𑣏𑣂 𑣌𑣉𑣅𑣉 𑣌𑣉 𑣗𑣁𑣆𑣁 +𑣗𑣁𑣆𑣁 𑣁𑣌𑣉...𑣗𑣁𑣆𑣁 𑣁𑣌𑣉 +𑣙𑣁𑣕𑣃 𑣜𑣈𑣔𑣉 𑣁𑣘𑣈 𑣌𑣁𑣘𑣈 𑣗𑣁𑣆 𑣔𑣁𑣆𑣈? +𑣁𑣗𑣃𑣁 𑣖𑣂𑣞𑣕𑣜𑣂 𑣌𑣉 𑣌𑣁𑣌𑣉 𑣗𑣁𑣆 𑣔𑣁𑣆𑣈 +𑣁𑣓𑣑𑣉𑣄 𑣖𑣂𑣓𑣑𑣉 𑣖𑣂𑣞𑣕𑣜𑣂 𑣖𑣈𑣓𑣁𑣆𑣄 +𑣁𑣅𑣁𑣄 𑣎𑣁𑣕𑣂 𑣖𑣈𑣓𑣁𑣄 𑣖𑣃𑣏𑣂 +𑣁𑣏𑣁 𑣙𑣉𑣇 𑣒𑣂𑣌 𑣋𑣈𑣁! +𑢺𑣚𑣂𑣕 𑣗𑣁𑣓𑣜𑣁: 𑢡𑣗𑣈𑣓 𑣁𑣄 𑣓𑣃𑣕𑣃𑣖 𑣏𑣂𑣓𑣁𑣄? +𑢡𑣗𑣈𑣓 𑣏𑣂𑣓𑣁𑣄 𑣗𑣈𑣓 𑣏𑣂𑣌𑣈 𑣕𑣁𑣓𑣁? +𑢡𑣏𑣁, 𑣁𑣗𑣈𑣓 𑣏𑣂𑣓𑣁𑣄 𑣏𑣂𑣓𑣁𑣄 𑣗𑣈𑣓 𑣏𑣁𑣁𑣞𑣉𑣈 𑣕𑣁𑣓𑣁? +𑢷𑣁𑣗𑣁 𑣚𑣂𑣊 𑣏𑣁𑣁𑣞𑣉𑣈 𑣕𑣁𑣓𑣁 𑣁𑣓𑣑𑣉𑣄 𑢸𑣉𑣓𑣂𑣘𑣉𑣜𑣂𑣗𑣁 +𑢬𑣃𑣛𑣃𑣕𑣂, 𑢷𑣁𑣗𑣁...𑢬𑣃𑣛𑣃𑣕𑣂 +𑢸𑣉𑣓𑣂𑣘𑣉𑣜𑣂𑣗𑣁 𑣖𑣈𑣓 𑣌𑣈𑣈 𑣜𑣈𑣔𑣉 𑣌𑣃𑣛𑣃𑣕𑣂 𑣌𑣉 +𑢬𑣉𑣗𑣂 𑣗𑣂𑣚𑣁𑣕𑣂 𑣘𑣂𑣚𑣁𑣕𑣂 𑣌𑣉 +𑢨𑣓𑣈𑣄 𑣈𑣓𑣌𑣁 𑣈𑣓𑣁 𑣌𑣉 𑣁𑣈𑣗𑣓 +𑣏𑣁𑣁𑣞𑣉 𑣔𑣉 𑣁𑣗𑣈𑣓 𑣏𑣁𑣁𑣞𑣉 𑣌𑣈𑣑𑣁 +𑣏𑣁𑣁𑣞𑣉 𑣜𑣈 𑣁𑣗𑣈𑣓 𑣏𑣂𑣖𑣂𑣓 𑣚𑣈𑣌𑣁 𑣘𑣉𑣈𑣞𑣁 𑣖𑣂𑣂 𑣞𑣂𑣜𑣖𑣁 𑣜𑣈𑣗𑣈𑣓 𑣉𑣄𑣚𑣈 𑣕𑣁𑣓𑣁? +𑣈𑣓𑣁 𑣔𑣉 𑣙𑣂𑣞𑣁𑣗 𑣌𑣁𑣁 𑣙𑣉𑣗𑣁𑣉 𑣕𑣁𑣓𑣁 +𑣁𑣚𑣂𑣊 𑣙𑣉𑣓 𑣌𑣉 𑣘𑣁𑣛𑣁𑣉 𑣕𑣁𑣓𑣁 𑣖𑣂𑣓𑣑𑣉 +𑣘𑣉𑣈𑣞𑣁 𑣔𑣉 𑣌𑣁𑣜𑣏𑣁𑣉 𑣕𑣁𑣓𑣁 +𑣁𑣏𑣁 𑣁𑣗𑣈𑣓 𑣇𑣛𑣃𑣆 𑣕𑣁𑣓𑣁 𑣗𑣈𑣓 𑣏𑣂𑣖𑣂𑣓 𑣗𑣈𑣓 +𑣏𑣁𑣁𑣞𑣉𑣈 𑣕𑣁𑣓𑣁 𑣈𑣓𑣁 𑣜𑣈𑣁𑣄 𑣒𑣂𑣂𑣌 𑣜𑣈𑣒 𑣗𑣈𑣓 𑣓𑣁𑣖𑣈 𑣕𑣁𑣓𑣁? +𑣈𑣁, 𑣜𑣈𑣒 𑣔𑣉 𑣒𑣂𑣂𑣌 𑣚𑣂𑣊 𑣓𑣁𑣖𑣈 𑣕𑣁𑣓𑣁 +(𑣉𑣛𑣂𑣁𑣙𑣜𑣈) '(𑣉𑣛𑣂𑣁𑣙𑣜𑣈) 𑣅𑣈𑣕𑣈 𑣗𑣎𑣁𑣜𑣜𑣈 𑣏𑣁𑣚𑣂𑣕𑣂𑣗' +𑣓𑣁𑣄 𑣌𑣁𑣎𑣂𑣂 𑣚𑣈𑣌𑣁 𑣗𑣁𑣎𑣁𑣜 𑣜𑣈 𑣏𑣂𑣖𑣂𑣓 𑣜𑣈𑣒 𑣖𑣈𑣓𑣁𑣄 𑣈𑣓𑣌𑣁 𑣈𑣓𑣁? +𑣏𑣂, 𑣌𑣉𑣖𑣉𑣄 𑣕𑣁𑣓𑣁? +𑣞𑣉𑣖𑣉𑣈 𑣞𑣉𑣖𑣉𑣈 𑣌𑣉𑣖𑣉𑣄 𑣕𑣁𑣓𑣁 +𑣖𑣁𑣓𑣈 𑣌𑣉𑣖𑣉𑣄 𑣕𑣁𑣓𑣁 𑣈𑣞𑣃 𑣌𑣈𑣛𑣈𑣄 𑣌𑣉𑣖𑣉𑣄 𑣕𑣁𑣓𑣁? +𑣖𑣁𑣓𑣈 𑣏𑣂𑣖𑣂𑣓 𑣓𑣁𑣄 𑣌𑣁𑣎𑣂𑣂 𑣚𑣈𑣌𑣁 𑣗𑣂𑣚𑣁𑣕𑣂 𑣗𑣈𑣊𑣋𑣁 +𑣓𑣈 𑣞𑣂𑣜𑣖𑣈 𑣏𑣂𑣖𑣂𑣓 𑣕𑣈 𑣁𑣗𑣈𑣓 𑣁𑣌𑣁𑣜𑣂𑣊 𑣌𑣈𑣑𑣁? +𑣁𑣅𑣁𑣜 𑣔𑣉 𑣔𑣉 𑣢𑣠-𑣡𑣥 𑣈𑣓𑣌𑣁 𑣏𑣁𑣚𑣃 𑣚𑣈𑣓𑣁 +𑣓𑣁𑣄 𑣔𑣉 𑣌𑣂𑣚𑣉 𑣜𑣈 𑣖𑣁𑣓𑣈 +𑣈𑣓𑣕𑣈 𑣓𑣁𑣄 𑣎𑣉𑣇𑣒𑣁 𑣗𑣈𑣓 𑣖𑣈𑣓𑣈 𑣕𑣁𑣓𑣁 +𑣎𑣉𑣇 𑣎𑣈𑣕𑣈 𑣗𑣈𑣛𑣈 𑣏𑣂𑣖𑣂𑣓𑣁𑣊 𑣖𑣁𑣓𑣈 𑣏𑣂𑣖𑣂𑣓𑣁𑣊 𑣁𑣗𑣈𑣓 +𑣈𑣁, 𑣁𑣅𑣁𑣜 𑣁𑣅𑣁𑣜 𑣕𑣈 𑣔𑣉 𑣈𑣓𑣌𑣁 𑣋𑣉𑣓𑣉𑣊𑣁 +𑣏𑣁𑣓𑣁𑣗 𑣏𑣁𑣓𑣁𑣗 𑣕𑣈𑣔𑣉 𑣌𑣉𑣖𑣉𑣄𑣁 +𑣁𑣏𑣁 𑣁𑣗𑣈𑣓 𑣎𑣈𑣕𑣈 𑣗𑣈𑣛𑣈 𑣗𑣈𑣓 𑣏𑣁𑣁𑣞𑣉 𑣌𑣈𑣑𑣁 𑣓𑣈𑣓𑣁 𑣌𑣉 +𑣏𑣁𑣁𑣞𑣉 𑣜𑣈 𑣁𑣗𑣈𑣓 𑣏𑣂𑣓𑣁𑣄 𑣗𑣈𑣓 𑣉𑣞𑣃𑣗𑣂𑣔𑣁𑣉 𑣕𑣁𑣓𑣁? +𑣔𑣁𑣄 𑣋𑣈 𑣈𑣓𑣌𑣁 𑣉𑣞𑣃𑣗𑣂𑣔𑣈 𑣔𑣉 +𑣈𑣁, 𑣔𑣁𑣄 𑣋𑣈 𑣉𑣞𑣃𑣗𑣂𑣔𑣁𑣉 𑣕𑣁𑣓𑣁 +𑣈𑣁, 𑣔𑣁𑣄 𑣋𑣈 𑣈𑣓𑣕𑣈 𑣁𑣓𑣑𑣉𑣄 𑣗𑣁𑣌𑣁𑣆 𑣌𑣉 𑣎𑣉𑣌𑣁 𑣌𑣁 𑣗𑣁𑣆 𑣔𑣁𑣆𑣉𑣄 𑣕𑣁𑣓𑣁 +𑣇𑣜𑣂𑣄 𑣌𑣉𑣚𑣈 𑣁𑣁𑣄 𑣕𑣁𑣑 𑣌𑣉𑣁 𑣈𑣓𑣈𑣄 𑣓𑣁 𑣋𑣈 𑣉𑣞𑣃𑣗𑣂𑣔𑣈 +𑣈𑣓𑣈𑣄 𑣓𑣁 𑣉𑣞𑣃𑣗𑣂𑣔𑣁 𑣙𑣉𑣗𑣁𑣉 𑣕𑣁𑣓𑣁 +𑣁𑣏𑣁, 𑣔𑣁𑣄 𑣜𑣈𑣁𑣄 𑣎𑣈𑣕𑣈 𑣗𑣈𑣛𑣈 𑣁𑣗𑣃 𑣞𑣉𑣜𑣌𑣁𑣜 𑣓𑣂𑣖𑣂𑣓 𑣘𑣃𑣜𑣈𑣄 𑣗𑣁𑣆 𑣕𑣁𑣓𑣁 +𑣏𑣂 𑣘𑣜𑣉𑣕𑣈𑣌 𑣓𑣁𑣄 𑣌𑣁𑣎𑣂𑣂 𑣚𑣈𑣌𑣁 𑣒𑣂𑣇𑣗 𑣗𑣉𑣜𑣟𑣈𑣚 𑣘𑣜𑣉𑣋𑣜𑣁𑣖 +𑣁𑣄 𑣗𑣁𑣆𑣁 𑣌𑣁𑣑𑣁 𑣏𑣂 𑣓𑣈𑣓 𑣌𑣃𑣈 𑣘𑣜𑣉𑣋𑣜𑣁𑣖 𑣁𑣄 𑣗𑣁𑣆𑣈 𑣌𑣁𑣑𑣁 +𑣈𑣓𑣁 𑣌𑣉𑣔𑣉 𑣁𑣗𑣈𑣓𑣁𑣄 𑣁𑣗𑣈𑣓 𑣕𑣁𑣄 𑣜𑣈 𑣇𑣜 𑣆𑣏𑣂𑣈 𑣌𑣁𑣓 𑣏𑣂 𑣌𑣁𑣋𑣈? +𑣌𑣂𑣓𑣕𑣃 𑣁𑣚𑣂𑣊 𑣇𑣜 𑣌𑣁𑣚𑣂𑣊 𑣇𑣜 𑣆𑣏𑣂 𑣌𑣈𑣓𑣁, 𑣁𑣚𑣈 𑣔𑣉 𑣋𑣁𑣛𑣁 𑣌𑣃𑣒𑣂 𑣏𑣈 +𑣈𑣁, 𑣋𑣁𑣛𑣁 𑣌𑣃𑣒𑣂 𑣈𑣓 𑣜𑣈𑣉 +𑣈𑣓𑣔𑣉 𑣋𑣁𑣛𑣁 𑣌𑣃𑣒𑣂 𑣙𑣂𑣞𑣁𑣗 𑣕𑣈 +𑣁𑣗𑣈𑣓...𑣁𑣗𑣈𑣓 𑣎𑣈𑣕𑣈 𑣗𑣈𑣛𑣈 𑣓𑣈𑣓𑣁 𑣌𑣉 𑣌𑣁𑣎𑣂𑣈𑣑 𑣗𑣈𑣓𑣁 +𑣏𑣂 𑣌𑣁𑣋𑣈 𑣓𑣈𑣓 𑣘𑣜𑣉𑣋𑣜𑣁𑣖 𑣌𑣉 𑣙𑣃𑣎𑣃𑣄𑣁 𑣌𑣁𑣓𑣁 𑣖𑣈𑣓𑣕𑣈 +𑣈𑣓𑣔𑣉 𑣈𑣓 𑣞𑣉𑣖𑣉𑣈 𑣜𑣈 𑣁𑣗𑣈𑣓𑣁𑣄 𑣕𑣁𑣄 𑣜𑣈 𑣏𑣂𑣓𑣁𑣄 𑣜𑣈𑣁𑣄 𑣌𑣁𑣌𑣉 𑣇𑣜 𑣆𑣏𑣂? +𑣖𑣁𑣓𑣈 𑣈𑣓𑣁 𑣋𑣜𑣁𑣖 𑣘𑣉𑣍𑣏𑣁𑣈𑣕 𑣉𑣞𑣕𑣉𑣜𑣉 𑣜𑣈𑣉 𑣏𑣂 +𑣁𑣗𑣈𑣓...𑣉𑣌𑣉𑣈 𑣌𑣉 𑣏𑣂𑣓𑣁𑣄...𑣏𑣂𑣓𑣁𑣄 𑣌𑣉 𑣏𑣂 𑣁𑣗𑣈𑣓...𑣌𑣜𑣃𑣞𑣂 𑣁𑣔𑣂𑣌𑣁𑣜𑣂 𑣕𑣁𑣆𑣓𑣈 +𑣏𑣂 𑣁𑣗𑣃...𑣋𑣜𑣁𑣖 𑣞𑣉𑣍𑣎𑣃𑣎𑣃𑣌𑣉 +𑣁𑣌𑣉 𑣙𑣃𑣎𑣃𑣄 𑣚𑣈𑣓𑣕𑣈 𑣌𑣉 𑣞𑣉𑣖𑣁𑣎𑣉 𑣌𑣈𑣑 𑣗𑣈𑣓𑣁 +𑣏𑣂 𑣓𑣈𑣓𑣁 𑣞𑣉𑣜𑣌𑣁𑣜 𑣁𑣄 𑣞𑣃𑣗𑣂𑣔𑣈 𑣖𑣈𑣁𑣓𑣄 𑣖𑣈𑣓𑣕𑣈? +𑣞𑣉𑣖𑣎𑣁𑣉 𑣚𑣈𑣑 𑣗𑣈𑣓𑣁 𑣌𑣉? +𑣓𑣈𑣄 𑣓𑣁𑣄 𑣗𑣁𑣜𑣞𑣂𑣊 𑣌𑣉 𑣞𑣉𑣖𑣎𑣁𑣉 𑣗𑣁𑣁𑣚𑣈 𑣕𑣁𑣓𑣁 +𑣁𑣌𑣉 𑣕𑣁𑣄 𑣌𑣉 𑣙𑣃𑣎𑣃𑣄 𑣚𑣈𑣓𑣁 𑣖𑣂𑣒𑣂𑣊 𑣌𑣉 𑣌𑣈𑣁 𑣚𑣈𑣑𑣁 +𑣙𑣉𑣓 𑣌𑣉 𑣌𑣉 𑣓𑣁𑣖 𑣗𑣁𑣁 𑣌𑣉 𑣕𑣁𑣓𑣁 +𑣙𑣉𑣓 𑣌𑣉 𑣜𑣈𑣁𑣄 𑣔𑣉 𑣌𑣁𑣋𑣈 +𑣁𑣗𑣈𑣓 𑣕𑣁𑣄 𑣌𑣉 𑣗𑣈𑣒𑣁 𑣚𑣈𑣓𑣁 𑣏𑣂 𑣌𑣁𑣁𑣋𑣈? +𑣌𑣁𑣋𑣈, 𑣁𑣚𑣂𑣊 𑣕𑣁𑣄 𑣔𑣉 𑣌𑣁𑣌𑣉 𑣗𑣈𑣒𑣁 𑣚𑣈𑣓𑣁 +𑣈𑣓 𑣜𑣈𑣔𑣉 𑣓𑣁𑣄 𑣌𑣁𑣎𑣂𑣂 𑣚𑣈𑣌𑣁 +𑣁𑣗𑣈𑣓 𑣞𑣉𑣜𑣌𑣁𑣜 𑣎𑣈𑣕𑣈 𑣗𑣈𑣛𑣈 𑣁𑣗𑣈𑣓 𑣗𑣈𑣓 𑣏𑣁𑣁𑣞𑣉𑣈 𑣕𑣁𑣓𑣁 +𑣁𑣗𑣈𑣓 𑣘𑣉𑣈𑣞𑣁 𑣘𑣉𑣕𑣜𑣉 𑣌𑣉 𑣏𑣂𑣚𑣂𑣌𑣈 𑣕𑣈? +𑣁𑣗𑣈𑣓𑣁𑣄 𑣘𑣉𑣈𑣞𑣁 𑣕𑣈𑣋𑣈 𑣗𑣈𑣓 𑣌𑣁𑣜𑣏𑣁𑣉 𑣕𑣁𑣓𑣁 +𑣏𑣂 𑣉𑣌𑣉𑣓 𑣘𑣁𑣈𑣕𑣈 𑣚𑣉𑣉𑣓 𑣗𑣈𑣓 𑣁𑣋𑣃𑣆 𑣕𑣁𑣓𑣁? +𑣌𑣁𑣋𑣈 𑣁𑣚𑣂𑣊 𑣓𑣂𑣎𑣉 𑣘𑣉𑣈𑣞𑣁 𑣕𑣈𑣋𑣈 +𑣓𑣂𑣎𑣉 𑣘𑣉𑣈𑣞𑣁 𑣕𑣈 𑣗𑣈𑣓 +𑣁𑣗𑣈𑣓...𑣗𑣈𑣊𑣌 𑣜𑣈 𑣏𑣁𑣞𑣉 𑣚𑣉𑣉𑣓 𑣁𑣄 𑣈𑣖𑣈 𑣕𑣁𑣓𑣁 𑣏𑣂 𑣁𑣗𑣃 +𑣌𑣉 𑣉𑣘𑣈𑣜𑣈𑣒𑣂𑣗 𑣞𑣉𑣞𑣁𑣆𑣒𑣂 𑣏𑣁𑣞𑣉 𑣚𑣉𑣉𑣓 𑣈𑣄 𑣈𑣖𑣈 𑣕𑣁𑣓𑣁 +𑣓𑣈𑣓𑣁 𑣜𑣈𑣁𑣄 𑣔𑣉 𑣁𑣗𑣈𑣓 𑣏𑣂𑣜𑣋𑣁𑣚 𑣌𑣁𑣑𑣁 𑣏𑣂 𑣌𑣁𑣋𑣈? +𑣏𑣂𑣜𑣋𑣈𑣚𑣈 𑣌𑣁𑣑𑣁 𑣚𑣂𑣊 𑣏𑣂𑣜𑣋𑣁𑣚 𑣔𑣉 +𑣈𑣓𑣔𑣉 𑣏𑣂𑣓𑣁𑣄 𑣜𑣈𑣁𑣄 𑣌𑣁𑣗𑣈𑣓 𑣚𑣉𑣉𑣓𑣈 𑣕𑣁𑣓𑣁? +𑣁𑣅𑣁𑣜 𑣁𑣘𑣃𑣍𑣁𑣄 𑣕𑣁𑣆𑣌𑣂𑣓𑣁 +𑣁𑣘𑣃𑣍 𑣚𑣉𑣉𑣓𑣈𑣄 𑣁𑣋𑣃 𑣚𑣈𑣑𑣁 𑣎𑣈𑣕𑣁 𑣙𑣁𑣚𑣈 𑣜𑣈𑣉 𑣌𑣁 𑣙𑣁𑣚𑣉𑣄𑣁 +𑣈𑣓𑣔𑣉 𑣗𑣈𑣊𑣌 𑣗𑣁𑣚𑣁 𑣌𑣉 𑣓𑣈𑣌𑣁 𑣌𑣉 𑣏𑣁𑣁𑣌𑣁𑣑𑣁 𑣖𑣈𑣓𑣕𑣈 𑣁𑣍 𑣓𑣁𑣄 𑣚𑣉𑣉𑣓 𑣔𑣉 +𑣁𑣏𑣁, 𑣖𑣉𑣎𑣂𑣜𑣈 𑣖𑣉𑣎𑣂𑣜𑣈 𑣓𑣁𑣄 𑣌𑣁𑣎𑣂𑣂 𑣚𑣈𑣌𑣁 +𑣌𑣜𑣃𑣞𑣂 𑣏𑣙𑣁𑣑𑣉 𑣈𑣖𑣁𑣑 𑣌𑣉𑣁 𑣌𑣜𑣃𑣞𑣂 𑣜𑣉𑣐𑣉 𑣏𑣙𑣁𑣑𑣉 𑣖𑣈𑣓𑣕𑣈 𑣋𑣈𑣌𑣉 𑣌𑣁𑣎𑣂𑣈 +𑣈𑣓𑣔𑣉 𑣈𑣓 𑣞𑣉𑣖𑣁𑣈 𑣜𑣈 𑣁𑣗𑣈𑣓𑣁𑣄 𑣏𑣂𑣌𑣈 𑣕𑣈 𑣌𑣁 𑣏𑣙𑣁𑣑𑣉 𑣈𑣓𑣁? +𑣈𑣓𑣁 𑣚𑣁𑣋𑣂𑣑 𑣗𑣈𑣓 𑣗𑣈𑣊𑣌 𑣗𑣁𑣚𑣁 𑣌𑣉 𑣏𑣂 𑣗𑣈𑣓 𑣎𑣁𑣋𑣁𑣜 𑣚𑣈𑣑 𑣌𑣉𑣁 𑣏𑣂 𑣌𑣁𑣋𑣈? +𑣁𑣘𑣃𑣍 𑣘𑣂𑣜𑣂𑣉𑣑 𑣜𑣈 𑣓𑣁𑣄 𑣌𑣁𑣎𑣂 𑣈𑣓 𑣕𑣁𑣄 𑣈𑣕𑣈 𑣁𑣍 𑣇𑣛𑣃𑣄𑣁 𑣌𑣁𑣑𑣁𑣍 +𑣚𑣉𑣉𑣓 𑣔𑣉 𑣈𑣞𑣃 𑣖𑣃𑣞𑣌𑣂𑣚𑣈 𑣖𑣈𑣓𑣕𑣈𑣍 𑣇𑣛𑣃𑣄 𑣌𑣈𑣑𑣁 +𑣁𑣘𑣃𑣍 𑣈𑣓𑣌𑣁 𑣙𑣉𑣈𑣜𑣁𑣓 𑣁𑣚𑣈 𑣎𑣁 𑣙𑣁𑣚𑣈 𑣜𑣈𑣉 𑣌𑣁 𑣙𑣁𑣚𑣉𑣄 𑣕𑣁𑣓 𑣙𑣂𑣞𑣁𑣗 𑣕𑣈𑣔𑣉 +𑣈𑣓𑣔𑣉 𑣁𑣍 𑣌𑣁𑣍𑣁𑣄 𑣗𑣈𑣊𑣌 𑣜𑣈 𑣌𑣁𑣍 𑣎𑣉𑣋𑣁𑣎𑣉𑣋𑣈𑣁 𑣖𑣈𑣓𑣕𑣈𑣍 diff --git a/hoc/corpus/hoc_clean_pua.txt b/hoc/corpus/hoc_clean_pua.txt new file mode 100644 index 0000000..f07a8da --- /dev/null +++ b/hoc/corpus/hoc_clean_pua.txt @@ -0,0 +1,414 @@ +          .   +    .   ()     +.   -      ()   +  .        +   ,         +   :   .     +     ,    :  +      ()        +       ' +     ()           +     +-         - +    .         +   .     , ,  +     ,        +     ,   .     +   ,       +   .        +          +-,      ,   +   .    ,      +      .       +    ,        +     +         +   ? +    ,          +   ? +  ,          +      +    ? +           +:-  +    ? + '           +:-  +   ? +      ,     +   ? +       ,      +   ? +'         +    ? +  :- () , () , ()  +    ? +        ,        +,      +:- , , ,   +    ? +    ' , ,       +    +    ? +                +:-    +    ? +:         ,    +:- -, -, -, -  +    ? +            +:- , ,,  +    ? +             ' +          ,    +     ? +               +      +:- : . : : :  +   ? +   '    ,     +:,,,,,,  +   ? +          +:-  ,  ,  , -,    +     ? +              +       +:-  .  '  .  '  +.    .  +     (   -   ),   +  ---.       +        ,  ,  +,     .        + .        -   +. -        . -  +     .         + .  -      ,   + .            +,      +    +        .     +    .           +  .   -       +-       +       .    +.       ,   ,  + -,       +        -   +      , , , ,  +- ,     +-            +     .        +   .        +,       .   +     .       +     + (: ),    --     +-  .      -,  - +, ,   .     - +   " ",    "  "  +  :   ? +      +   +,   +        ? +      +      +           +      +   ,    +,    +        +     +     +          +   +        +...   +       +    +     +   +     ???? +     +        +     +    +     +     +     +    ,  +       +    +         +     +,    +, ,    +       +      +,      +        +     +     +     +,       +    ? +...   +    +    +    +  +   +       +         +       +      +    +       +     +,     +,     +      +,      +   ? +     +    +     ? +     +          +   +     ? +      +     +       +      +  .    +      ? +    ? +      +           +    +    ? +   +      +       +   +      +         +     +   ... +,  ? +   +       +    ... + ... +   ? +     ? +        +         +     +,   ,    +    '' +     ? +     ? + ...  +     ...  +     ? +     +    ...  +      +        ? +   +     +         +, ... +     +    +     + :     +      +    +    +       +    +   +         +    +     +     +  ...  +      +      ,   +   +  ,  +    +   ,    +     +       +     +    +           +   ,   +......    +      +       +    +         +       +    +     ,  +     +       +  ...    +  ,  ,   +         +    ! +     ! +       ! +       +    ,    ! +         ! +       + ,        +      +     +           +(           ) +(  ) +  :    ? + :   +,       ? +...     ,   +   +       +  ? +    +     +       +...   ? +      +      +        +   ...'...' +...         +      +      +   ? +       +...   +       +   ? +    +  ? +(   ) +      +       +    ? +        +   +        +       +...... +     +     +    +     ? +      +   ...  +...         ? +    ...'- ' +     +..."." +       +      +  ?    +    +    +       + ...  +     ? +      +    +    +   ! + :    ? +    ? +,      ? +      +, ... +      +    +     +     +          ? +      +      +    +       +        ? +,       +() '()   ' +         ? +,  ? +    +      ? +       +      ? +   -    +     +      +       +,       +    +         +      ? +     +,     +,            +         +     +,           +        +          +          ? +      ,      +,     +     +...       +        +           ? +       +...  ...   ...   + ...  +       +      ? +   ? +       +         +       +     +      ? +,       +     +        +     ? +      +      ? +     +    +...         +        +       ? +     +     ? +   +         +            +,      +          +         ? +            ? +           +       +            +        diff --git a/hoc/corpus/render-corpus.py b/hoc/corpus/render-corpus.py new file mode 100644 index 0000000..45e54aa --- /dev/null +++ b/hoc/corpus/render-corpus.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +""" +render-corpus.py + +Renders corpus/sat_corpus.txt with 4 font variants into rendered/ as PNG + gt.txt pairs. +Each line × 4 fonts = one training image each. + +Fonts used: + NotoSansWarangCiti Regular — letterpress-style upright + NotoSansWarangCiti Italic — letterpress-style slanted + NotoSansWarangCiti Regular — clean sans-serif + NotoSansWarangCiti Bold — bold weight variation + +Output: rendered/_line.{png,gt.txt} +""" + +from pathlib import Path +from PIL import Image, ImageFont, ImageDraw + +BASE = Path(__file__).parent +CORPUS = BASE / "corpus" / "sat_corpus.txt" +OUTDIR = BASE / "rendered" +OUTDIR.mkdir(exist_ok=True) + +FONTS = [ + ("gurugomke_reg", BASE / "NotoSansWarangCiti-Regular.ttf", 36), + ("gurugomke_ital", BASE / "NotoSansWarangCiti-Italic.ttf", 36), + ("noto_olchiki_reg", BASE / "NotoSansWarangCiti-Regular.ttf", 36), + ("noto_olchiki_bld", BASE / "NotoSansWarangCiti-Bold.ttf", 36), +] + +PAD_X = 20 +PAD_Y = 12 +MIN_H = 60 # upscale short crops so Tesseract doesn't refuse them + +lines = [l.rstrip('\n') for l in CORPUS.read_text(encoding='utf-8').splitlines() if l.strip()] + +total = 0 +for tag, font_path, size in FONTS: + font = ImageFont.truetype(str(font_path), size) + for idx, text in enumerate(lines): + # measure text size + dummy = Image.new("L", (1, 1)) + bbox = ImageDraw.Draw(dummy).textbbox((0, 0), text, font=font) + w = bbox[2] - bbox[0] + PAD_X * 2 + h = max(bbox[3] - bbox[1] + PAD_Y * 2, MIN_H) + + img = Image.new("L", (w, h), 255) + draw = ImageDraw.Draw(img) + draw.text((PAD_X, PAD_Y), text, font=font, fill=0) + + stem = OUTDIR / f"{tag}_line{idx:04d}" + img.save(str(stem) + ".png") + (stem.parent / (stem.name + ".gt.txt")).write_text(text, encoding="utf-8") + total += 1 + + print(f" {tag}: {len(lines)} images") + +print(f"\nTotal rendered: {total} PNG+gt.txt pairs → {OUTDIR}") diff --git a/hoc/fonts/NotoSansWarangCiti-Regular.ttf b/hoc/fonts/NotoSansWarangCiti-Regular.ttf new file mode 100644 index 0000000..03e8af1 Binary files /dev/null and b/hoc/fonts/NotoSansWarangCiti-Regular.ttf differ diff --git a/hoc/fonts/WarangCiti-PUA.ttf b/hoc/fonts/WarangCiti-PUA.ttf new file mode 100644 index 0000000..1b076a7 Binary files /dev/null and b/hoc/fonts/WarangCiti-PUA.ttf differ diff --git a/hoc/pua_mapping.json b/hoc/pua_mapping.json new file mode 100644 index 0000000..a4fbc74 --- /dev/null +++ b/hoc/pua_mapping.json @@ -0,0 +1,199 @@ +{ + "warang_to_pua": { + "U+118A0": "U+E000", + "U+118A1": "U+E001", + "U+118A2": "U+E002", + "U+118A3": "U+E003", + "U+118A4": "U+E004", + "U+118A5": "U+E005", + "U+118A6": "U+E006", + "U+118A7": "U+E007", + "U+118A8": "U+E008", + "U+118A9": "U+E009", + "U+118AA": "U+E00A", + "U+118AB": "U+E00B", + "U+118AC": "U+E00C", + "U+118AD": "U+E00D", + "U+118AE": "U+E00E", + "U+118AF": "U+E00F", + "U+118B0": "U+E010", + "U+118B1": "U+E011", + "U+118B2": "U+E012", + "U+118B3": "U+E013", + "U+118B4": "U+E014", + "U+118B5": "U+E015", + "U+118B6": "U+E016", + "U+118B7": "U+E017", + "U+118B8": "U+E018", + "U+118B9": "U+E019", + "U+118BA": "U+E01A", + "U+118BB": "U+E01B", + "U+118BC": "U+E01C", + "U+118BD": "U+E01D", + "U+118BE": "U+E01E", + "U+118BF": "U+E01F", + "U+118C0": "U+E020", + "U+118C1": "U+E021", + "U+118C2": "U+E022", + "U+118C3": "U+E023", + "U+118C4": "U+E024", + "U+118C5": "U+E025", + "U+118C6": "U+E026", + "U+118C7": "U+E027", + "U+118C8": "U+E028", + "U+118C9": "U+E029", + "U+118CA": "U+E02A", + "U+118CB": "U+E02B", + "U+118CC": "U+E02C", + "U+118CD": "U+E02D", + "U+118CE": "U+E02E", + "U+118CF": "U+E02F", + "U+118D0": "U+E030", + "U+118D1": "U+E031", + "U+118D2": "U+E032", + "U+118D3": "U+E033", + "U+118D4": "U+E034", + "U+118D5": "U+E035", + "U+118D6": "U+E036", + "U+118D7": "U+E037", + "U+118D8": "U+E038", + "U+118D9": "U+E039", + "U+118DA": "U+E03A", + "U+118DB": "U+E03B", + "U+118DC": "U+E03C", + "U+118DD": "U+E03D", + "U+118DE": "U+E03E", + "U+118DF": "U+E03F", + "U+118E0": "U+E040", + "U+118E1": "U+E041", + "U+118E2": "U+E042", + "U+118E3": "U+E043", + "U+118E4": "U+E044", + "U+118E5": "U+E045", + "U+118E6": "U+E046", + "U+118E7": "U+E047", + "U+118E8": "U+E048", + "U+118E9": "U+E049", + "U+118EA": "U+E04A", + "U+118EB": "U+E04B", + "U+118EC": "U+E04C", + "U+118ED": "U+E04D", + "U+118EE": "U+E04E", + "U+118EF": "U+E04F", + "U+118F0": "U+E050", + "U+118F1": "U+E051", + "U+118F2": "U+E052", + "U+118F3": "U+E053", + "U+118F4": "U+E054", + "U+118F5": "U+E055", + "U+118F6": "U+E056", + "U+118F7": "U+E057", + "U+118F8": "U+E058", + "U+118F9": "U+E059", + "U+118FA": "U+E05A", + "U+118FB": "U+E05B", + "U+118FC": "U+E05C", + "U+118FD": "U+E05D", + "U+118FE": "U+E05E", + "U+118FF": "U+E05F" + }, + "pua_to_warang": { + "U+E000": "U+118A0", + "U+E001": "U+118A1", + "U+E002": "U+118A2", + "U+E003": "U+118A3", + "U+E004": "U+118A4", + "U+E005": "U+118A5", + "U+E006": "U+118A6", + "U+E007": "U+118A7", + "U+E008": "U+118A8", + "U+E009": "U+118A9", + "U+E00A": "U+118AA", + "U+E00B": "U+118AB", + "U+E00C": "U+118AC", + "U+E00D": "U+118AD", + "U+E00E": "U+118AE", + "U+E00F": "U+118AF", + "U+E010": "U+118B0", + "U+E011": "U+118B1", + "U+E012": "U+118B2", + "U+E013": "U+118B3", + "U+E014": "U+118B4", + "U+E015": "U+118B5", + "U+E016": "U+118B6", + "U+E017": "U+118B7", + "U+E018": "U+118B8", + "U+E019": "U+118B9", + "U+E01A": "U+118BA", + "U+E01B": "U+118BB", + "U+E01C": "U+118BC", + "U+E01D": "U+118BD", + "U+E01E": "U+118BE", + "U+E01F": "U+118BF", + "U+E020": "U+118C0", + "U+E021": "U+118C1", + "U+E022": "U+118C2", + "U+E023": "U+118C3", + "U+E024": "U+118C4", + "U+E025": "U+118C5", + "U+E026": "U+118C6", + "U+E027": "U+118C7", + "U+E028": "U+118C8", + "U+E029": "U+118C9", + "U+E02A": "U+118CA", + "U+E02B": "U+118CB", + "U+E02C": "U+118CC", + "U+E02D": "U+118CD", + "U+E02E": "U+118CE", + "U+E02F": "U+118CF", + "U+E030": "U+118D0", + "U+E031": "U+118D1", + "U+E032": "U+118D2", + "U+E033": "U+118D3", + "U+E034": "U+118D4", + "U+E035": "U+118D5", + "U+E036": "U+118D6", + "U+E037": "U+118D7", + "U+E038": "U+118D8", + "U+E039": "U+118D9", + "U+E03A": "U+118DA", + "U+E03B": "U+118DB", + "U+E03C": "U+118DC", + "U+E03D": "U+118DD", + "U+E03E": "U+118DE", + "U+E03F": "U+118DF", + "U+E040": "U+118E0", + "U+E041": "U+118E1", + "U+E042": "U+118E2", + "U+E043": "U+118E3", + "U+E044": "U+118E4", + "U+E045": "U+118E5", + "U+E046": "U+118E6", + "U+E047": "U+118E7", + "U+E048": "U+118E8", + "U+E049": "U+118E9", + "U+E04A": "U+118EA", + "U+E04B": "U+118EB", + "U+E04C": "U+118EC", + "U+E04D": "U+118ED", + "U+E04E": "U+118EE", + "U+E04F": "U+118EF", + "U+E050": "U+118F0", + "U+E051": "U+118F1", + "U+E052": "U+118F2", + "U+E053": "U+118F3", + "U+E054": "U+118F4", + "U+E055": "U+118F5", + "U+E056": "U+118F6", + "U+E057": "U+118F7", + "U+E058": "U+118F8", + "U+E059": "U+118F9", + "U+E05A": "U+118FA", + "U+E05B": "U+118FB", + "U+E05C": "U+118FC", + "U+E05D": "U+118FD", + "U+E05E": "U+118FE", + "U+E05F": "U+118FF" + }, + "description": "Maps Warang Citi SMP chars to BMP Private Use Area for Tesseract training" +} \ No newline at end of file diff --git a/hoc/scripts/01-prep-base.sh b/hoc/scripts/01-prep-base.sh new file mode 100755 index 0000000..64efc59 --- /dev/null +++ b/hoc/scripts/01-prep-base.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════ +# 01-prep-base.sh +# +# Creates hoc_base.traineddata from the Warang Citi unicharset. +# This is the target traineddata that defines the character set +# the LSTM model will learn to recognise. +# +# Usage: +# ./01-prep-base.sh +# ═══════════════════════════════════════════════════════════════ +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +TESSDATA_BEST="$SCRIPT_DIR/tessdata_best" +OUTPUT="$SCRIPT_DIR/output" + +[ -f "$OUTPUT/hoc.unicharset" ] || { echo "ERROR: output/hoc.unicharset not found."; exit 1; } + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Step 1 — Prepare base traineddata (Ho / Warang Citi)" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +combine_lang_model \ + --input_unicharset "$OUTPUT/hoc.unicharset" \ + --script_dir "$TESSDATA_BEST" \ + --output_dir "$TESSDATA_BEST" \ + --lang hoc_base + +echo "" +echo " Created: tessdata_best/hoc_base.traineddata" +echo "" + +# Also copy the Warang Citi unicharset alongside +cp "$OUTPUT/hoc.unicharset" "$TESSDATA_BEST/hoc.unicharset" + +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Done. NEXT: render corpus → ./render-corpus.py" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" diff --git a/hoc/scripts/02-make-lstmf.sh b/hoc/scripts/02-make-lstmf.sh new file mode 100755 index 0000000..e2565db --- /dev/null +++ b/hoc/scripts/02-make-lstmf.sh @@ -0,0 +1,172 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════ +# 02-make-lstmf.sh +# +# Converts PNG+gt.txt pairs into .lstmf training files. +# +# Scans two directories: +# rendered/ — synthetic images from render-corpus.py +# scan-input/ — real scan images you supply (PNG + matching .gt.txt) +# +# Box file format: cluster-per-character (NOT WordStr). +# WordStr format stores "WordStr" as the transcription in the lstmf, +# causing "Can't encode transcription: 'WordStr'" errors in lstmtraining. +# Instead, each Warang Citi character gets its own equal-width x-slice box. +# +# Output: +# lstmf/rendered/ — lstmf from synthetic images +# lstmf/scan/ — lstmf from real scan images +# lstmf/list.txt — combined training file list +# +# Prerequisites: +# Run 01-prep-base.sh first (needs tessdata_best/hoc_base.traineddata) +# ═══════════════════════════════════════════════════════════════ +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +TESSDATA_BEST="$SCRIPT_DIR/tessdata_best" +OUTPUT_LSTMF="$SCRIPT_DIR/lstmf" +RENDERED_DIR="$SCRIPT_DIR/rendered" +SCAN_DIR="$SCRIPT_DIR/scan-input" + +[ -f "$TESSDATA_BEST/hoc_base.traineddata" ] || { + echo "ERROR: tessdata_best/hoc_base.traineddata not found." + echo " Run ./01-prep-base.sh first." + exit 1 +} +[ -f "$TESSDATA_BEST/configs/lstm.train" ] || { + echo "ERROR: tessdata_best/configs/lstm.train not found." + exit 1 +} + +mkdir -p "$OUTPUT_LSTMF/rendered" "$OUTPUT_LSTMF/scan" +> "$OUTPUT_LSTMF/list.txt" + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Step 2 — PNG+GT → lstmf" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + +process_dir() { + local src_dir="$1" + local out_dir="$2" + local label="$3" + + if [ ! -d "$src_dir" ]; then + echo " $label: directory not found, skipping" + return + fi + + local count + count=$(find "$src_dir" -maxdepth 1 \( -name "*.png" -o -name "*.jpg" \ + -o -name "*.tif" -o -name "*.ppm" \) 2>/dev/null | wc -l | tr -d ' ') + if [ "$count" -eq 0 ]; then + echo " $label: no images found in $src_dir" + return + fi + + echo "" + echo "→ Processing $label ($count images from $src_dir)..." + + # Run Python to create cluster-format box files and lstmf + python3 - "$src_dir" "$out_dir" "$OUTPUT_LSTMF/list.txt" "$label" << 'PYEOF' +import sys, unicodedata, subprocess, shutil +from pathlib import Path +from PIL import Image + +src_dir, out_dir, list_txt, label = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4] +TESSDATA_BEST = "tessdata_best" + +def warang_citi_clusters(text): + """Split Warang Citi text into character clusters. + Warang Citi signs U+1C78-U+1C7D (category Lm) are modifiers that attach + visually to the preceding letter — group them with it. All other chars + (digits, letters, punct, space) are standalone clusters. + """ + clusters, chars, i = [], list(text), 0 + while i < len(chars): + c = chars[i]; cl = c; i += 1 + while i < len(chars) and unicodedata.category(chars[i]) in ('Lm', 'Mn', 'Mc', 'Cf'): + cl += chars[i]; i += 1 + clusters.append(cl) + return [c for c in clusters if c.strip()] + +def make_lstmf(img_path, out_dir, list_file): + img_path = Path(img_path) + gt_path = img_path.with_suffix('.gt.txt') + if not img_path.exists() or not gt_path.exists(): + return False + + gt_text = gt_path.read_text(encoding='utf-8').strip() + clusters = warang_citi_clusters(gt_text) + if not clusters: + return False + + out_dir = Path(out_dir) + stem = img_path.stem + dst_png = out_dir / (stem + '.png') + box_path = out_dir / (stem + '.box') + lstmf = out_dir / (stem + '.lstmf') + + shutil.copy2(img_path, dst_png) + img = Image.open(dst_png) + W, H = img.size + n = len(clusters) + cw = W / n + # One equal-width x-slice per cluster — cluster format, NOT WordStr + lines = [f"{c} {int(i*cw)} 0 {int((i+1)*cw)} {H} 0" + for i, c in enumerate(clusters)] + lines.append("\t 0 0 1 1 0") + box_path.write_text("\n".join(lines) + "\n", encoding='utf-8') + + # PSM 7 (single line) → PSM 6 (block) → PSM 10 (single char) fallback + for psm in ("7", "6", "10"): + subprocess.run( + ["tesseract", str(dst_png), str(out_dir / stem), + "--tessdata-dir", TESSDATA_BEST, + "--dpi", "300", "--psm", psm, + "-l", "hoc_base", "lstm.train"], + capture_output=True, text=True + ) + if lstmf.exists(): + with open(list_file, 'a', encoding='utf-8') as lf: + lf.write(str(lstmf) + '\n') + return True + + dst_png.unlink(missing_ok=True) + box_path.unlink(missing_ok=True) + return False + +imgs = sorted( + [p for p in Path(src_dir).iterdir() + if p.suffix.lower() in ('.png', '.jpg', '.tif', '.tiff', '.ppm')] +) +pass_n = fail_n = skip_n = 0 +for img in imgs: + gt = img.with_suffix('.gt.txt') + if not gt.exists(): + skip_n += 1 + continue + if make_lstmf(img, out_dir, list_txt): + pass_n += 1 + else: + fail_n += 1 + +print(f" {label}: {pass_n} OK {fail_n} failed {skip_n} skipped (no gt.txt)") +PYEOF +} + +process_dir "$RENDERED_DIR" "$OUTPUT_LSTMF/rendered" "Synthetic rendered" +process_dir "$SCAN_DIR" "$OUTPUT_LSTMF/scan" "Real scan images" + +TOTAL=$(wc -l < "$OUTPUT_LSTMF/list.txt" | tr -d ' ') + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Done. lstmf/list.txt contains $TOTAL files." +echo "" +echo " NEXT: caffeinate -i ./03-train.sh > training.log 2>&1 &" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" diff --git a/hoc/scripts/03-train-finetune.sh b/hoc/scripts/03-train-finetune.sh new file mode 100755 index 0000000..d919485 --- /dev/null +++ b/hoc/scripts/03-train-finetune.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════ +# 03-train-finetune.sh +# +# Fine-tunes the Ho (Warang Citi) LSTM model from Latin base. +# +# The LSTM output layer is completely rebuilt for the Ho/PUA +# unicharset. Conv layers and LSTM recurrent weights transfer +# from Latin — they learned generic text features (edges, +# strokes, spacing) that help even for a different script. +# +# This is the same approach that worked for Santali/Ol Chiki. +# ═══════════════════════════════════════════════════════════════ +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +TESSDATA_BEST="$SCRIPT_DIR/tessdata_best" +OUTPUT="$SCRIPT_DIR/output" +LSTMF_DIR="$SCRIPT_DIR/lstmf" +MODEL_NAME="hoc_v1" + +TRAIN_LIST="$LSTMF_DIR/list.txt" +[ -f "$TRAIN_LIST" ] || { echo "ERROR: $TRAIN_LIST not found."; exit 1; } +LSTMF_COUNT=$(wc -l < "$TRAIN_LIST" | tr -d ' ') +[ "$LSTMF_COUNT" -gt 0 ] || { echo "ERROR: $TRAIN_LIST is empty."; exit 1; } + +MAX_ITERATIONS=400000 +LEARNING_RATE=0.001 + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Step 3 — LSTM Fine-tuning from Latin (Ho / Warang Citi)" +echo " Base: output/latin.lstm" +echo " Training data: $LSTMF_COUNT .lstmf files" +echo " Iterations: $MAX_ITERATIONS max" +echo " Learning rate: $LEARNING_RATE" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +# Checkpoint selection — resume from most recent if available +if [ -z "$CONTINUE_FROM" ]; then + if [ -f "$OUTPUT/${MODEL_NAME}_checkpoint" ]; then + CONTINUE_FROM="$OUTPUT/${MODEL_NAME}_checkpoint" + echo "→ Resuming from rolling checkpoint" + else + CONTINUE_FROM="$OUTPUT/latin.lstm" + echo "→ Starting fresh from latin.lstm (first run)" + fi +else + echo "→ Using explicit checkpoint: $(basename $CONTINUE_FROM)" +fi + +echo "" + +lstmtraining \ + --continue_from "$CONTINUE_FROM" \ + --old_traineddata "$TESSDATA_BEST/Latin.traineddata" \ + --model_output "$OUTPUT/$MODEL_NAME" \ + --traineddata "$TESSDATA_BEST/hoc_base.traineddata" \ + --train_listfile "$TRAIN_LIST" \ + --learning_rate "$LEARNING_RATE" \ + --net_mode 16 \ + --max_iterations "$MAX_ITERATIONS" \ + --target_error_rate -1 + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Training done. NEXT: ./04-package.sh" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" diff --git a/hoc/scripts/03-train.sh b/hoc/scripts/03-train.sh new file mode 100755 index 0000000..8416526 --- /dev/null +++ b/hoc/scripts/03-train.sh @@ -0,0 +1,89 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════ +# 03-train.sh +# +# Trains the Ho (Warang Citi) LSTM model FROM SCRATCH. +# +# There is no existing LSTM model for Ho/Warang Citi, so we +# train from scratch using --net_spec to define the network. +# +# NOTE: From-scratch training needs substantial data (ideally +# 1000+ training lines). With less data, the model will plateau +# early. The Santali project showed that <500 lines plateaued +# at ~42% accuracy from scratch, but fine-tuning from a base +# model worked with that data volume. +# +# Network spec for Warang Citi: +# - Input: 1 channel, 36px height, variable width +# - Ct3,3,16: 3×3 convolution, 16 filters +# - Mp3,3: 3×3 max pooling +# - Lfys48: LSTM 48 units, y-scan, with summary +# - Lfx96: LSTM 96 units, forward x-scan +# - Lrx96: LSTM 96 units, reverse x-scan +# - Lfx192: LSTM 192 units, forward x-scan +# - O1c109: Output layer, 1D, 109 classes (108 chars + CTC blank) +# +# Checkpoints saved every 100 iterations. +# Safe to stop with Ctrl+C — resumes from latest checkpoint. +# +# Usage: +# caffeinate -i ./03-train.sh > logs/training.log 2>&1 & +# tail -f logs/training.log +# ═══════════════════════════════════════════════════════════════ +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +TESSDATA_BEST="$SCRIPT_DIR/tessdata_best" +OUTPUT="$SCRIPT_DIR/output" +LSTMF_DIR="$SCRIPT_DIR/lstmf" +MODEL_NAME="hoc_v1" + +TRAIN_LIST="$LSTMF_DIR/list.txt" +[ -f "$TRAIN_LIST" ] || { echo "ERROR: $TRAIN_LIST not found. Run 02-make-lstmf.sh first."; exit 1; } +LSTMF_COUNT=$(wc -l < "$TRAIN_LIST" | tr -d ' ') +[ "$LSTMF_COUNT" -gt 0 ] || { echo "ERROR: $TRAIN_LIST is empty."; exit 1; } + +MAX_ITERATIONS=400000 +LEARNING_RATE=0.01 +NET_SPEC="[1,36,0,1 Ct3,3,16 Mp3,3 Lfys48 Lfx96 Lrx96 Lfx192 O1c80]" + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Step 3 — LSTM Training FROM SCRATCH (Ho / Warang Citi)" +echo " Network: $NET_SPEC" +echo " Training data: $LSTMF_COUNT .lstmf files" +echo " Iterations: $MAX_ITERATIONS max" +echo " Learning rate: $LEARNING_RATE" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +# Check for existing checkpoint to resume from +if [ -f "$OUTPUT/${MODEL_NAME}_checkpoint" ]; then + echo "→ Resuming from existing checkpoint" + lstmtraining \ + --continue_from "$OUTPUT/${MODEL_NAME}_checkpoint" \ + --model_output "$OUTPUT/$MODEL_NAME" \ + --traineddata "$TESSDATA_BEST/hoc_base.traineddata" \ + --train_listfile "$TRAIN_LIST" \ + --learning_rate "$LEARNING_RATE" \ + --max_iterations "$MAX_ITERATIONS" \ + --target_error_rate -1 +else + echo "→ Starting fresh from scratch (no base model)" + lstmtraining \ + --model_output "$OUTPUT/$MODEL_NAME" \ + --traineddata "$TESSDATA_BEST/hoc_base.traineddata" \ + --net_spec "$NET_SPEC" \ + --train_listfile "$TRAIN_LIST" \ + --learning_rate "$LEARNING_RATE" \ + --max_iterations "$MAX_ITERATIONS" \ + --target_error_rate -1 +fi + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Training done. NEXT: ./04-package.sh" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" diff --git a/hoc/scripts/04-package.sh b/hoc/scripts/04-package.sh new file mode 100755 index 0000000..4099801 --- /dev/null +++ b/hoc/scripts/04-package.sh @@ -0,0 +1,86 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════ +# 04-package.sh +# +# Packages the best training checkpoint into a usable .traineddata. +# +# IMPORTANT — checkpoint selection: +# The script picks the checkpoint with the LOWEST BCER (second field +# of the filename, e.g. hoc_v1_2.341_4500_18200.checkpoint → 2.341%). +# Review the training log to confirm this is the intended best. +# To override, set: export BEST_CHECKPOINT=/path/to/specific.checkpoint +# +# Output: +# output/hoc_v1.traineddata +# +# To install: +# cp output/hoc_v1.traineddata /opt/homebrew/share/tessdata/ +# tesseract myimage.tif result -l hoc_v1 +# ═══════════════════════════════════════════════════════════════ +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +TESSDATA_BEST="$SCRIPT_DIR/tessdata_best" +OUTPUT="$SCRIPT_DIR/output" +MODEL_NAME="hoc_v1" + +[ -f "$OUTPUT/${MODEL_NAME}_checkpoint" ] || { + echo "ERROR: output/${MODEL_NAME}_checkpoint not found." + echo " Run 03-train.sh first." + exit 1 +} + +if [ -z "$BEST_CHECKPOINT" ]; then + BEST_CHECKPOINT=$(ls "$OUTPUT"/${MODEL_NAME}_*.checkpoint 2>/dev/null | \ + grep -v '_checkpoint$' | sort -t_ -k2 -n | head -1) +fi + +[ -n "$BEST_CHECKPOINT" ] || BEST_CHECKPOINT="$OUTPUT/${MODEL_NAME}_checkpoint" + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Step 4 — Packaging model" +echo " Source: $(basename $BEST_CHECKPOINT)" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +lstmtraining \ + --stop_training \ + --continue_from "$BEST_CHECKPOINT" \ + --traineddata "$TESSDATA_BEST/hoc_base.traineddata" \ + --old_traineddata "$TESSDATA_BEST/ori.traineddata" \ + --model_output "$OUTPUT/${MODEL_NAME}.lstm" + +# Strip Tesseract 5.5.x macOS corrupt header (if present) +python3 - "$OUTPUT/${MODEL_NAME}.lstm" << 'PYEOF' +import sys, os +path = sys.argv[1] +data = open(path, 'rb').read() +needle = b'\x00\x06\x00\x00\x00Series' +idx = data.find(needle) +if idx > 0: + print(f" Stripping {idx}-byte corrupt header") + open(path, 'wb').write(data[idx:]) +else: + print(" .lstm header clean — no stripping needed") +PYEOF + +# Bundle into traineddata (start from hoc_base — preserves Ho unicharset) +cp "$TESSDATA_BEST/hoc_base.traineddata" "$OUTPUT/${MODEL_NAME}.traineddata" +combine_tessdata \ + -o "$OUTPUT/${MODEL_NAME}.traineddata" \ + "$OUTPUT/${MODEL_NAME}.lstm" + +ls -lh "$OUTPUT/${MODEL_NAME}.traineddata" + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Model ready: output/${MODEL_NAME}.traineddata" +echo "" +echo " To install:" +echo " cp output/${MODEL_NAME}.traineddata /opt/homebrew/share/tessdata/" +echo " tesseract your-scan.tif result -l ${MODEL_NAME}" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" diff --git a/hoc/scripts/05-test.sh b/hoc/scripts/05-test.sh new file mode 100755 index 0000000..6349acf --- /dev/null +++ b/hoc/scripts/05-test.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════ +# 05-test.sh — Quick OCR test on a single image. +# +# Usage: +# ./05-test.sh [ground-truth.txt] +# +# Example: +# ./05-test.sh test-images/sample.png test-images/sample.gt.txt +# ═══════════════════════════════════════════════════════════════ +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +IMAGE="${1:-}" +GT="${2:-}" + +[ -n "$IMAGE" ] || { echo "Usage: $0 [ground-truth.txt]"; exit 1; } +[ -f "$IMAGE" ] || { echo "ERROR: image not found: $IMAGE"; exit 1; } + +SYSTEM_TESSDATA="/opt/homebrew/share/tessdata" + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " OCR test: $(basename $IMAGE)" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +for model in hoc_v1 sat_indicocr; do + if [ -f "$SYSTEM_TESSDATA/${model}.traineddata" ]; then + oem=1 + [ "$model" = "sat_indicocr" ] && oem=0 + echo "── $model (oem $oem) ──" + tesseract "$IMAGE" stdout \ + --tessdata-dir "$SYSTEM_TESSDATA" \ + -l "$model" --psm 7 --oem "$oem" 2>/dev/null || echo "(no output)" + else + echo "── $model: not installed ──" + fi +done + +if [ -n "$GT" ] && [ -f "$GT" ]; then + echo "" + echo "── Ground truth ──" + cat "$GT" +fi +echo "" diff --git a/hoc/scripts/06-scan-to-lstmf.py b/hoc/scripts/06-scan-to-lstmf.py new file mode 100644 index 0000000..f19fd6e --- /dev/null +++ b/hoc/scripts/06-scan-to-lstmf.py @@ -0,0 +1,229 @@ +#!/usr/bin/env python3 +""" +06-scan-to-lstmf.py + +Splits a scanned page + ground-truth text file into individual line +training pairs and converts them to .lstmf files using the same +cluster-box format as 02-make-lstmf.sh. + +Usage: + cd sat-tesseract-training/ + python3 06-scan-to-lstmf.py [--prefix ganam] +""" + +import argparse +import shutil +import subprocess +import sys +import unicodedata +from pathlib import Path + +import numpy as np +from PIL import Image + +# ── Paths (relative to sat-tesseract-training/) ─────────────────────────────── +TESSDATA_BEST = "tessdata_best" +SCAN_LSTMF = Path("lstmf/scan") +LIST_FILE = Path("lstmf/list.txt") + +# ── Line detection ───────────────────────────────────────────────────────────── +ROW_THR = 0.05 # fraction of row-max to count as text row +MIN_HEIGHT = 6 # min px height to keep a region +SPARSE_FRAC = 0.22 # regions with peak below this × median → skip (stray mark) +UPSCALE = 2 # upscale factor for better pixel density +VPAD = 4 # vertical padding in original pixels around each line + +def detect_lines(gray_arr): + binary = gray_arr < 180 + proj = binary.sum(axis=1) + thr = proj.max() * ROW_THR + lines, in_text, start = [], False, 0 + for i, v in enumerate(proj): + if v > thr and not in_text: + start, in_text = i, True + elif v <= thr and in_text: + if i - start >= MIN_HEIGHT: + lines.append((start, i, int(proj[start:i].max()))) + in_text = False + if in_text and (len(proj) - start) >= MIN_HEIGHT: + lines.append((start, len(proj), int(proj[start:].max()))) + return lines + +def filter_lines(lines): + if not lines: + return [], [] + peaks = sorted(pk for _, _, pk in lines) + med_pk = peaks[len(peaks) // 2] + sparse = med_pk * SPARSE_FRAC + heights = sorted(e - s for s, e, _ in lines) + med_h = heights[len(heights) // 2] + kept, skipped = [], [] + last = len(lines) - 1 + dense = med_pk * 1.5 + for i, (s, e, pk) in enumerate(lines): + h = e - s + gap = s - lines[i-1][1] if i > 0 else 0 + if i == 0 and (h > med_h * 1.3 or pk > dense): + skipped.append(i) + continue + if i == last and h > med_h * 1.25: + skipped.append(i) + continue + if h > med_h * 1.7: + skipped.append(i) + continue + if pk < sparse: + skipped.append(i) + continue + if gap > med_h * 2.5 and h < med_h * 0.8: + skipped.append(i) + continue + kept.append((s, e, pk)) + return kept, skipped + +# ── Warang Citi helpers ────────────────────────────────────────────────────────── +def is_warang_citi(c): + cp = ord(c) + return (0x118A0 <= cp <= 0x118FF) or (0xE000 <= cp <= 0xE05F) + +def warang_citi_clusters(text): + clusters, chars, i = [], list(text), 0 + while i < len(chars): + c = chars[i]; cl = c; i += 1 + while i < len(chars) and unicodedata.category(chars[i]) in ('Lm', 'Mn', 'Mc', 'Cf'): + cl += chars[i]; i += 1 + clusters.append(cl) + return [c for c in clusters if c.strip()] + +# ── lstmf creation ──────────────────────────────────────────────────────────── +def make_lstmf(png_path, gt_text): + """Create cluster-format box file and run tesseract lstm.train.""" + png_path = Path(png_path) + img = Image.open(png_path) + W, H = img.size + + clusters = warang_citi_clusters(gt_text) + if not clusters: + return False + + # Write .gt.txt (needed by 02-make-lstmf if re-run later) + png_path.with_suffix('.gt.txt').write_text(gt_text + '\n', encoding='utf-8') + + # Cluster-format box file: equal-width x-slices, one per cluster + box_path = png_path.with_suffix('.box') + n = len(clusters) + cw = W / n + lines = [f"{c} {int(i*cw)} 0 {int((i+1)*cw)} {H} 0" + for i, c in enumerate(clusters)] + lines.append("\t 0 0 1 1 0") + box_path.write_text("\n".join(lines) + "\n", encoding='utf-8') + + # PSM 7 → 6 → 10 fallback (same order as 02-make-lstmf.sh) + lstmf = png_path.with_suffix('.lstmf') + for psm in ("7", "6", "10"): + subprocess.run( + ["tesseract", str(png_path), str(png_path.with_suffix('')), + "--tessdata-dir", TESSDATA_BEST, + "--dpi", "300", "--psm", psm, + "-l", "hoc_base", "lstm.train"], + capture_output=True, text=True + ) + if lstmf.exists(): + return True + return False + +# ── Main ────────────────────────────────────────────────────────────────────── +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('image') + parser.add_argument('gt') + parser.add_argument('--prefix', default=None) + args = parser.parse_args() + + prefix = args.prefix or Path(args.image).stem + + img = Image.open(args.image).convert('RGB') + gray_arr = np.array(img.convert('L')) + + # Load GT: keep only non-blank lines with Warang Citi chars + raw_gt = Path(args.gt).read_text(encoding='utf-8').splitlines() + gt_lines = [ln.strip() for ln in raw_gt + if ln.strip() and any(is_warang_citi(c) for c in ln)] + + print(f"\n Image: {args.image} ({img.size[0]}×{img.size[1]}px)") + print(f" GT lines: {len(gt_lines)}") + + all_lines = detect_lines(gray_arr) + kept, skipped_idx = filter_lines(all_lines) + + print(f" Detected: {len(all_lines)} regions → kept {len(kept)}, " + f"skipped {len(skipped_idx)} (indices: {skipped_idx})") + + if len(kept) > len(gt_lines): + excess = len(kept) - len(gt_lines) + print(f" Auto-trimming {excess} extra detected line(s) from bottom") + kept = kept[:len(gt_lines)] + + if len(kept) != len(gt_lines): + print(f"\n MISMATCH: {len(kept)} image lines vs {len(gt_lines)} GT lines") + print("\n All detected regions:") + for i, (s, e, pk) in enumerate(all_lines): + tag = 'SKIP' if i in skipped_idx else 'keep' + print(f" L{i+1:02d} y={s}–{e} h={e-s}px peak={pk} [{tag}]") + print("\n GT lines:") + for i, ln in enumerate(gt_lines): + print(f" {i+1:2d}: {ln[:60]}") + sys.exit(1) + + SCAN_LSTMF.mkdir(parents=True, exist_ok=True) + + # Track existing list entries to avoid duplicates + existing = set() + if LIST_FILE.exists(): + existing = set(LIST_FILE.read_text(encoding='utf-8').splitlines()) + + ok = fail = 0 + new_paths = [] + + print() + for idx, ((y0, y1, _), gt_text) in enumerate(zip(kept, gt_lines)): + name = f"{prefix}_line{idx+1:04d}" + png_path = SCAN_LSTMF / f"{name}.png" + lstmf = SCAN_LSTMF / f"{name}.lstmf" + + # Crop line with padding, upscale 2× + H_orig, W_orig = gray_arr.shape + top = max(0, y0 - VPAD) + bottom = min(H_orig, y1 + VPAD) + line_img = img.crop((0, top, W_orig, bottom)) + line_img = line_img.resize( + (line_img.width * UPSCALE, line_img.height * UPSCALE), + Image.LANCZOS + ) + line_img.save(str(png_path)) + + if make_lstmf(png_path, gt_text): + ok += 1 + abs_path = str(lstmf.resolve()) + if abs_path not in existing: + new_paths.append(abs_path) + preview = gt_text[:55] + ('…' if len(gt_text) > 55 else '') + print(f" OK {name} {preview}") + else: + fail += 1 + print(f" FAIL {name}") + + if new_paths: + with LIST_FILE.open('a', encoding='utf-8') as f: + for p in new_paths: + f.write(p + '\n') + + total = sum(1 for ln in LIST_FILE.read_text(encoding='utf-8').splitlines() if ln.strip()) + + print(f"\n Done: {ok} OK, {fail} failed") + print(f" Added {len(new_paths)} new entries to {LIST_FILE}") + print(f" Total training files: {total}") + print() + +if __name__ == '__main__': + main() diff --git a/hoc/test-images/benchmark/boyo_m2_p1.gt.txt b/hoc/test-images/benchmark/boyo_m2_p1.gt.txt new file mode 100644 index 0000000..165969a --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p1.gt.txt @@ -0,0 +1,28 @@ +'''   :''' +            + .            +             +.   ,         +    .  , , , , +,   , , , ,     +        .    +, ,       ,   +       .        +      .     +-  "   "    . +             +-   +            +       .    +        .   +     .     .    +             +         () . +  " "   .   , +, , , , , , , +,           +   +    -       .  +         .   + ,         + ,         .  diff --git a/hoc/test-images/benchmark/boyo_m2_p1.png b/hoc/test-images/benchmark/boyo_m2_p1.png new file mode 100644 index 0000000..ea248c0 Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p1.png differ diff --git a/hoc/test-images/benchmark/boyo_m2_p10.gt.txt b/hoc/test-images/benchmark/boyo_m2_p10.gt.txt new file mode 100644 index 0000000..85ac0b6 --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p10.gt.txt @@ -0,0 +1,27 @@ +       +       +    +        +     +       +     +      +      + -       .   +  +''''        -   +   .      -    +.            +  .          -  + -        .  +         (   )   +.   ,         . +       - +        .    + +  -     .     +        .     +.        ,     +  .      ,    . +     .       +  .           diff --git a/hoc/test-images/benchmark/boyo_m2_p10.png b/hoc/test-images/benchmark/boyo_m2_p10.png new file mode 100644 index 0000000..62d42d2 Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p10.png differ diff --git a/hoc/test-images/benchmark/boyo_m2_p11.gt.txt b/hoc/test-images/benchmark/boyo_m2_p11.gt.txt new file mode 100644 index 0000000..cd56382 --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p11.gt.txt @@ -0,0 +1,26 @@ + +          - . + ,   -,     +   ,         +.   ,     +        .        +    .        +-- +    +   , ,          +  .     , , ,  +    ,        .  +           .  +           +        ,    + ,   .        +       .       +            + +           +             +  + :      + :       + :        +            diff --git a/hoc/test-images/benchmark/boyo_m2_p11.png b/hoc/test-images/benchmark/boyo_m2_p11.png new file mode 100644 index 0000000..dfcfaa4 Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p11.png differ diff --git a/hoc/test-images/benchmark/boyo_m2_p12.gt.txt b/hoc/test-images/benchmark/boyo_m2_p12.gt.txt new file mode 100644 index 0000000..7ea2440 --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p12.gt.txt @@ -0,0 +1,5 @@ +,  , ,      , +   ,       . +, ,   +            +            diff --git a/hoc/test-images/benchmark/boyo_m2_p12.png b/hoc/test-images/benchmark/boyo_m2_p12.png new file mode 100644 index 0000000..1187113 Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p12.png differ diff --git a/hoc/test-images/benchmark/boyo_m2_p2.gt.txt b/hoc/test-images/benchmark/boyo_m2_p2.gt.txt new file mode 100644 index 0000000..bcbb693 --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p2.gt.txt @@ -0,0 +1,26 @@ +-, -, -, ,     +     -    +           +        : +          +         .   " + "     .     +" "  "   "  +'''    ''' +.         ,   + " "       +.   -  ..        +    .        +           + +. - ..   ,.     +. -      +. -       +. -      . (-       + +.   -      +.     -    +''''       .    +  ,   +           ,   +        ()    diff --git a/hoc/test-images/benchmark/boyo_m2_p2.png b/hoc/test-images/benchmark/boyo_m2_p2.png new file mode 100644 index 0000000..39f2047 Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p2.png differ diff --git a/hoc/test-images/benchmark/boyo_m2_p3.gt.txt b/hoc/test-images/benchmark/boyo_m2_p3.gt.txt new file mode 100644 index 0000000..3722b73 --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p3.gt.txt @@ -0,0 +1,28 @@ +-    ! +        ''' ''' .  +''' '''     +  ()     .   -  +    () '''  '''  .   +     + +''      ()        +.'' +'''        ''' +        + ()            +()   +      ()  +  : +  ( )  +   +""  +   ,      , +-  +         , +           .    +      .      .  +      ,        +'' ,    +   '' '' (   -   ),   +    +    diff --git a/hoc/test-images/benchmark/boyo_m2_p3.png b/hoc/test-images/benchmark/boyo_m2_p3.png new file mode 100644 index 0000000..8a54a3d Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p3.png differ diff --git a/hoc/test-images/benchmark/boyo_m2_p4.gt.txt b/hoc/test-images/benchmark/boyo_m2_p4.gt.txt new file mode 100644 index 0000000..8081c73 --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p4.gt.txt @@ -0,0 +1,28 @@ +   +''''        -  . +   +  (    )      +  +         ,  +       .       +      .     +    + , +          +      ,   "" + ,     ,      + .        .  +   .         +      ,          +   .       ,   +        +  + +  + +  +:- :  +:-   + '   + '   +   .  diff --git a/hoc/test-images/benchmark/boyo_m2_p4.png b/hoc/test-images/benchmark/boyo_m2_p4.png new file mode 100644 index 0000000..08fe506 Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p4.png differ diff --git a/hoc/test-images/benchmark/boyo_m2_p5.gt.txt b/hoc/test-images/benchmark/boyo_m2_p5.gt.txt new file mode 100644 index 0000000..8619238 --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p5.gt.txt @@ -0,0 +1,25 @@ +'      -       + -  + (  + (  + (  + (  + (  +        +  ''  '' .       +    .       + ,       .   +: .  +         .    + +       .     +        .    + +: .   +,       ,    .  +           .    + ,            + .     ,   -   +.   -       +   +         .     diff --git a/hoc/test-images/benchmark/boyo_m2_p5.png b/hoc/test-images/benchmark/boyo_m2_p5.png new file mode 100644 index 0000000..0d4e372 Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p5.png differ diff --git a/hoc/test-images/benchmark/boyo_m2_p6.gt.txt b/hoc/test-images/benchmark/boyo_m2_p6.gt.txt new file mode 100644 index 0000000..1f5e29e --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p6.gt.txt @@ -0,0 +1,28 @@ +'''''' (:),    --     +-  .      -,  -, +  +           .    +   .          +.        +           +    +   ''''''      +.   +.   +.   +.  +.   +.   +.   +.   +.  +.  +.  +.  +.   +.  +.   +'''''';-           +   +:---.       +            diff --git a/hoc/test-images/benchmark/boyo_m2_p6.png b/hoc/test-images/benchmark/boyo_m2_p6.png new file mode 100644 index 0000000..946ac64 Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p6.png differ diff --git a/hoc/test-images/benchmark/boyo_m2_p7.gt.txt b/hoc/test-images/benchmark/boyo_m2_p7.gt.txt new file mode 100644 index 0000000..082738a --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p7.gt.txt @@ -0,0 +1,25 @@ +.          .    +          +     .    , +,        .     +         +       .        +   ,       .  +         .    +  .         + +        .    +  + -       .    +  + -       .    + +       .     +       .     +     .    , +  ,        +            . +     .        +     .       +   .     -     +       ' ' .   diff --git a/hoc/test-images/benchmark/boyo_m2_p7.png b/hoc/test-images/benchmark/boyo_m2_p7.png new file mode 100644 index 0000000..e6c74a4 Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p7.png differ diff --git a/hoc/test-images/benchmark/boyo_m2_p8.gt.txt b/hoc/test-images/benchmark/boyo_m2_p8.gt.txt new file mode 100644 index 0000000..adb4932 --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p8.gt.txt @@ -0,0 +1,26 @@ +   .           +   +     .      +.      ,         +.           +'''''' (     )   +    .  ,,      +    .           +    .         +       .        +      -         +   .            + ,       , , +,     +          .   , +, , ,    (   + ), , , , , , +,       .    +    -        +  +       +    +     +       .    + +          .     diff --git a/hoc/test-images/benchmark/boyo_m2_p8.png b/hoc/test-images/benchmark/boyo_m2_p8.png new file mode 100644 index 0000000..94e2174 Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p8.png differ diff --git a/hoc/test-images/benchmark/boyo_m2_p9.gt.txt b/hoc/test-images/benchmark/boyo_m2_p9.gt.txt new file mode 100644 index 0000000..e2cecdd --- /dev/null +++ b/hoc/test-images/benchmark/boyo_m2_p9.gt.txt @@ -0,0 +1,28 @@ +   . -        + -     .      +       +        .    +  +            . +         .      +      .    +            +.             +   +             +        +    +     +      +  ( +  ( +  ( +  ( +     +     +      +    +        +     +       +    diff --git a/hoc/test-images/benchmark/boyo_m2_p9.png b/hoc/test-images/benchmark/boyo_m2_p9.png new file mode 100644 index 0000000..58407ed Binary files /dev/null and b/hoc/test-images/benchmark/boyo_m2_p9.png differ diff --git a/hoc/test-images/benchmark/p1.gt.txt b/hoc/test-images/benchmark/p1.gt.txt new file mode 100644 index 0000000..9e13bc5 --- /dev/null +++ b/hoc/test-images/benchmark/p1.gt.txt @@ -0,0 +1,27 @@ +          .   +    .   ()     +.   -      ()   +  .        +   ,         +   :   .     +     ,    :  +      ()        +       ' +     ()           +     +-         - +    .         +   .     , ,  +     ,        +     ,   .     +   ,       +   .        +          +-,      ,   +   .    ,      +      .       +    ,        +     +         +   ? +    ,          diff --git a/hoc/test-images/benchmark/p1.png b/hoc/test-images/benchmark/p1.png new file mode 100644 index 0000000..a387e55 Binary files /dev/null and b/hoc/test-images/benchmark/p1.png differ diff --git a/hoc/test-images/benchmark/p10.gt.txt b/hoc/test-images/benchmark/p10.gt.txt new file mode 100644 index 0000000..935e06e --- /dev/null +++ b/hoc/test-images/benchmark/p10.gt.txt @@ -0,0 +1,28 @@ +      +       +    +         +       +    +     ,  +     +       +  ...    +  ,  ,   +         +    ! +     ! +       ! +       +    ,    ! +         ! +       + ,        +      +     +           +(           ) +(  ) +  :    ? + :   +,       ? diff --git a/hoc/test-images/benchmark/p10.png b/hoc/test-images/benchmark/p10.png new file mode 100644 index 0000000..ce61a18 Binary files /dev/null and b/hoc/test-images/benchmark/p10.png differ diff --git a/hoc/test-images/benchmark/p11.gt.txt b/hoc/test-images/benchmark/p11.gt.txt new file mode 100644 index 0000000..1fd15e0 --- /dev/null +++ b/hoc/test-images/benchmark/p11.gt.txt @@ -0,0 +1,28 @@ +...     ,   +   +       +  ? +    +     +       +...   ? +      +      +        +   ...'...' +...         +      +      +   ? +       +...   +       +   ? +    +  ? +(   ) +      +       +    ? +        +   diff --git a/hoc/test-images/benchmark/p11.png b/hoc/test-images/benchmark/p11.png new file mode 100644 index 0000000..cc9e9aa Binary files /dev/null and b/hoc/test-images/benchmark/p11.png differ diff --git a/hoc/test-images/benchmark/p12.gt.txt b/hoc/test-images/benchmark/p12.gt.txt new file mode 100644 index 0000000..ce04eba --- /dev/null +++ b/hoc/test-images/benchmark/p12.gt.txt @@ -0,0 +1,28 @@ +        +       +...... +     +     +    +     ? +      +   ...  +...         ? +    ...'- ' +     +..."." +       +      +  ?    +    +    +       + ...  +     ? +      +    +    +   ! + :    ? +    ? +,      ? diff --git a/hoc/test-images/benchmark/p12.png b/hoc/test-images/benchmark/p12.png new file mode 100644 index 0000000..82938ed Binary files /dev/null and b/hoc/test-images/benchmark/p12.png differ diff --git a/hoc/test-images/benchmark/p13.gt.txt b/hoc/test-images/benchmark/p13.gt.txt new file mode 100644 index 0000000..2936fb1 --- /dev/null +++ b/hoc/test-images/benchmark/p13.gt.txt @@ -0,0 +1,28 @@ +      +, ... +      +    +     +     +          ? +      +      +    +       +        ? +,       +() '()   ' +         ? +,  ? +    +      ? +       +      ? +   -    +     +      +       +,       +    +         +      ? diff --git a/hoc/test-images/benchmark/p13.png b/hoc/test-images/benchmark/p13.png new file mode 100644 index 0000000..5e2a334 Binary files /dev/null and b/hoc/test-images/benchmark/p13.png differ diff --git a/hoc/test-images/benchmark/p14.gt.txt b/hoc/test-images/benchmark/p14.gt.txt new file mode 100644 index 0000000..eea4200 --- /dev/null +++ b/hoc/test-images/benchmark/p14.gt.txt @@ -0,0 +1,28 @@ +     +,     +,            +         +     +,           +        +          +          ? +      ,      +,     +     +...       +        +           ? +       +...  ...   ...   + ...  +       +      ? +   ? +       +         +       +     +      ? +,       +     diff --git a/hoc/test-images/benchmark/p14.png b/hoc/test-images/benchmark/p14.png new file mode 100644 index 0000000..6cb322d Binary files /dev/null and b/hoc/test-images/benchmark/p14.png differ diff --git a/hoc/test-images/benchmark/p15.gt.txt b/hoc/test-images/benchmark/p15.gt.txt new file mode 100644 index 0000000..0f4d985 --- /dev/null +++ b/hoc/test-images/benchmark/p15.gt.txt @@ -0,0 +1,22 @@ +        +     ? +      +      ? +     +    +...         +        +       ? +     +     ? +   +         +            +,      +          +         ? +            ? +           +       +            +        diff --git a/hoc/test-images/benchmark/p15.png b/hoc/test-images/benchmark/p15.png new file mode 100644 index 0000000..5145c62 Binary files /dev/null and b/hoc/test-images/benchmark/p15.png differ diff --git a/hoc/test-images/benchmark/p2.gt.txt b/hoc/test-images/benchmark/p2.gt.txt new file mode 100644 index 0000000..5103035 --- /dev/null +++ b/hoc/test-images/benchmark/p2.gt.txt @@ -0,0 +1,28 @@ +  ,          +      +    ? +           +:-  +    ? + '           +:-  +   ? +      ,     +   ? +       ,      +   ? +'         +    ? +  :- () , () , ()  +    ? +        ,        +,      +:- , , ,   +    ? +    ' , ,       +    +    ? +                +:-    +    ? +:         ,    diff --git a/hoc/test-images/benchmark/p2.png b/hoc/test-images/benchmark/p2.png new file mode 100644 index 0000000..c0b93b6 Binary files /dev/null and b/hoc/test-images/benchmark/p2.png differ diff --git a/hoc/test-images/benchmark/p3.gt.txt b/hoc/test-images/benchmark/p3.gt.txt new file mode 100644 index 0000000..a6f8ec4 --- /dev/null +++ b/hoc/test-images/benchmark/p3.gt.txt @@ -0,0 +1,28 @@ +:- -, -, -, -  +    ? +            +:- , ,,  +    ? +             ' +          ,    +     ? +               +      +:- : . : : :  +   ? +   '    ,     +:,,,,,,  +   ? +          +:-  ,  ,  , -,    +     ? +              +       +:-  .  '  .  '  +.    .  +     (   -   ),   +  ---.       +        ,  ,  +,     .        + .        -   +. -        . -  diff --git a/hoc/test-images/benchmark/p3.png b/hoc/test-images/benchmark/p3.png new file mode 100644 index 0000000..ec5c71a Binary files /dev/null and b/hoc/test-images/benchmark/p3.png differ diff --git a/hoc/test-images/benchmark/p4.gt.txt b/hoc/test-images/benchmark/p4.gt.txt new file mode 100644 index 0000000..494eb57 --- /dev/null +++ b/hoc/test-images/benchmark/p4.gt.txt @@ -0,0 +1,26 @@ +     .         + .  -      ,   + .            +,      +    +        .     +    .           +  .   -       +-       +       .    +.       ,   ,  + -,       +        -   +      , , , ,  +- ,     +-            +     .        +   .        +,       .   +     .       +     + (: ),    --     +-  .      -,  - +, ,   .     - +   " ",    "  "  +  :   ? diff --git a/hoc/test-images/benchmark/p4.png b/hoc/test-images/benchmark/p4.png new file mode 100644 index 0000000..ec9d333 Binary files /dev/null and b/hoc/test-images/benchmark/p4.png differ diff --git a/hoc/test-images/benchmark/p5.gt.txt b/hoc/test-images/benchmark/p5.gt.txt new file mode 100644 index 0000000..3b51f66 --- /dev/null +++ b/hoc/test-images/benchmark/p5.gt.txt @@ -0,0 +1,24 @@ +,   +        ? +      +      +           +      +   ,    +,    +        +     +     +          +   +        +...   +       +    +     +   +     ???? +     +        +     +    diff --git a/hoc/test-images/benchmark/p5.png b/hoc/test-images/benchmark/p5.png new file mode 100644 index 0000000..0421d8c Binary files /dev/null and b/hoc/test-images/benchmark/p5.png differ diff --git a/hoc/test-images/benchmark/p6.gt.txt b/hoc/test-images/benchmark/p6.gt.txt new file mode 100644 index 0000000..1183dba --- /dev/null +++ b/hoc/test-images/benchmark/p6.gt.txt @@ -0,0 +1,28 @@ +       +    +         +     +,    +, ,    +       +      +,      +        +     +     +     +,       +    ? +...   +    +    +    +  +   +       +         +       +      +    +       +     diff --git a/hoc/test-images/benchmark/p6.png b/hoc/test-images/benchmark/p6.png new file mode 100644 index 0000000..deeeae3 Binary files /dev/null and b/hoc/test-images/benchmark/p6.png differ diff --git a/hoc/test-images/benchmark/p7.gt.txt b/hoc/test-images/benchmark/p7.gt.txt new file mode 100644 index 0000000..58884b3 --- /dev/null +++ b/hoc/test-images/benchmark/p7.gt.txt @@ -0,0 +1,28 @@ +,     +,     +      +,      +   ? +     +    +     ? +     +          +   +     ? +      +     +       +      +  .    +      ? +    ? +      +           +    +    ? +   +      +       +   +      diff --git a/hoc/test-images/benchmark/p7.png b/hoc/test-images/benchmark/p7.png new file mode 100644 index 0000000..941847c Binary files /dev/null and b/hoc/test-images/benchmark/p7.png differ diff --git a/hoc/test-images/benchmark/p8.gt.txt b/hoc/test-images/benchmark/p8.gt.txt new file mode 100644 index 0000000..a93d435 --- /dev/null +++ b/hoc/test-images/benchmark/p8.gt.txt @@ -0,0 +1,28 @@ +         +     +   ... +,  ? +   +       +    ... + ... +   ? +     ? +        +         +     +,   ,    +    '' +     ? +     ? + ...  +     ...  +     ? +     +    ...  +      +        ? +   +     +         +, ... diff --git a/hoc/test-images/benchmark/p8.png b/hoc/test-images/benchmark/p8.png new file mode 100644 index 0000000..d3f3d75 Binary files /dev/null and b/hoc/test-images/benchmark/p8.png differ diff --git a/hoc/test-images/benchmark/p9.gt.txt b/hoc/test-images/benchmark/p9.gt.txt new file mode 100644 index 0000000..65d1367 --- /dev/null +++ b/hoc/test-images/benchmark/p9.gt.txt @@ -0,0 +1,28 @@ +     +    +     + :     +      +    +    +       +    +   +         +    +     +     +  ...  +      +      ,   +   +  ,  +    +   ,    +     +       +     +    +           +   ,   +......    diff --git a/hoc/test-images/benchmark/p9.png b/hoc/test-images/benchmark/p9.png new file mode 100644 index 0000000..304a388 Binary files /dev/null and b/hoc/test-images/benchmark/p9.png differ diff --git a/hoc/tools/augment-synthetic.py b/hoc/tools/augment-synthetic.py new file mode 100644 index 0000000..4a17a0a --- /dev/null +++ b/hoc/tools/augment-synthetic.py @@ -0,0 +1,114 @@ +#!/usr/bin/env python3 +"""Generate noise-augmented copies of synthetic line images for OCR training. + +Takes clean synthetic rendered lines and applies realistic degradation +(blur, noise, contrast shifts, slight rotation) to simulate scan-like +conditions. This bridges the distribution gap between clean renders +and real scanned documents. + +Output: augmented PNG + copied .box → tesseract lstm.train → .lstmf +""" +import sys, shutil, subprocess, random +from pathlib import Path +from PIL import Image, ImageFilter, ImageEnhance, ImageOps +import numpy as np + +RENDERED_DIR = Path(sys.argv[1]) if len(sys.argv) > 1 else Path("lstmf/rendered") +OUT_DIR = Path(sys.argv[2]) if len(sys.argv) > 2 else Path("lstmf/augmented") +TESSDATA = "tessdata_best" +PER_SOURCE = int(sys.argv[3]) if len(sys.argv) > 3 else 25 + +random.seed(42) +np.random.seed(42) + +OUT_DIR.mkdir(parents=True, exist_ok=True) + +sources = {} +for f in sorted(RENDERED_DIR.glob("*.lstmf")): + prefix = f.stem.rsplit("_line", 1)[0] + sources.setdefault(prefix, []).append(f.stem) + +def degrade(img): + arr = np.array(img.convert("L")) + + # Gaussian-like blur (slight) + img_out = Image.fromarray(arr) + radius = random.uniform(0.3, 1.2) + img_out = img_out.filter(ImageFilter.GaussianBlur(radius=radius)) + + # Salt-and-pepper noise + arr2 = np.array(img_out) + noise_density = random.uniform(0.005, 0.02) + salt = np.random.random(arr2.shape) < noise_density / 2 + pepper = np.random.random(arr2.shape) < noise_density / 2 + arr2[salt] = 255 + arr2[pepper] = 0 + img_out = Image.fromarray(arr2) + + # Contrast variation + factor = random.uniform(0.7, 1.3) + img_out = ImageEnhance.Contrast(img_out).enhance(factor) + + # Brightness variation (simulates uneven scan exposure) + bright = random.uniform(0.85, 1.15) + img_out = ImageEnhance.Brightness(img_out).enhance(bright) + + # Slight rotation (simulates scan skew) + angle = random.uniform(-0.8, 0.8) + img_out = img_out.rotate(angle, fillcolor=255, expand=False) + + return img_out.convert("L") + +total_ok = 0 +total_fail = 0 + +for prefix, stems in sorted(sources.items()): + selected = random.sample(stems, min(PER_SOURCE, len(stems))) + ok = fail = 0 + + for stem in selected: + src_png = RENDERED_DIR / f"{stem}.png" + src_box = RENDERED_DIR / f"{stem}.box" + if not src_png.exists() or not src_box.exists(): + fail += 1 + continue + + aug_stem = f"aug_{stem}" + dst_png = OUT_DIR / f"{aug_stem}.png" + dst_box = OUT_DIR / f"{aug_stem}.box" + dst_lstmf = OUT_DIR / f"{aug_stem}.lstmf" + + if dst_lstmf.exists(): + ok += 1 + continue + + img = Image.open(src_png) + degraded = degrade(img) + degraded.save(dst_png) + shutil.copy2(src_box, dst_box) + + made = False + for psm in ("7", "6", "10"): + subprocess.run( + ["tesseract", str(dst_png), str(OUT_DIR / aug_stem), + "--tessdata-dir", TESSDATA, + "--dpi", "300", "--psm", psm, + "-l", "sat_base", "lstm.train"], + capture_output=True, text=True + ) + if dst_lstmf.exists(): + made = True + break + + if made: + ok += 1 + else: + dst_png.unlink(missing_ok=True) + dst_box.unlink(missing_ok=True) + fail += 1 + + print(f" {prefix}: {ok} OK, {fail} failed (of {len(selected)} selected)") + total_ok += ok + total_fail += fail + +print(f"\nTotal: {total_ok} augmented lstmf files created, {total_fail} failed") diff --git a/hoc/tools/benchmark.py b/hoc/tools/benchmark.py new file mode 100644 index 0000000..5e4ed81 --- /dev/null +++ b/hoc/tools/benchmark.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +""" +benchmark.py — Santali OCR accuracy comparison. + +Compares sat_v1 (our trained LSTM) vs sat_indicocr (indic-ocr legacy model). +Computes CER, WER, and Space Recall on test images. + +Usage: + python3 tools/benchmark.py [--test-dir DIR] [--psm PSM] + +Default test dir: test-images/ +""" + +import sys, re, subprocess, argparse +from pathlib import Path +from itertools import zip_longest + +IMAGE_EXTS = {'.png', '.ppm', '.jpg', '.jpeg', '.tif', '.tiff'} +SYSTEM_TESSDATA = '/opt/homebrew/share/tessdata' + +# (name, tessdata_dir, oem) +# oem 1 = LSTM (Tesseract 4/5 model) +# oem 0 = legacy (Tesseract 3.x model — indic-ocr sat) +MODELS = [ + ('sat', SYSTEM_TESSDATA, '1'), # our trained LSTM — use PSM 13 (raw line, no DAWG) + ('sat_indicocr', SYSTEM_TESSDATA, '0'), # legacy OEM 0 baseline +] + +def levenshtein(a, b): + if not a: return len(b) + if not b: return len(a) + prev = list(range(len(b)+1)) + for ca in a: + curr = [prev[0]+1] + for j, cb in enumerate(b): + curr.append(min(prev[j+1]+1, curr[j]+1, prev[j]+(0 if ca==cb else 1))) + prev = curr + return prev[-1] + +def cer(ref, hyp): + ref, hyp = ref.strip(), hyp.strip() + if not ref: return 0.0 + return levenshtein(ref, hyp) / len(ref) + +def wer(ref, hyp): + ref_w, hyp_w = ref.strip().split(), hyp.strip().split() + if not ref_w: return 0.0 + return levenshtein(ref_w, hyp_w) / len(ref_w) + +def space_recall(ref, hyp): + ref_spaces = ref.count(' ') + if ref_spaces == 0: return None + return min(hyp.count(' ') / ref_spaces, 1.0) + +def ocr(image_path, model, tessdata_dir, psm='7', oem='1'): + result = subprocess.run( + ['tesseract', str(image_path), 'stdout', + '--tessdata-dir', tessdata_dir, '-l', model, + '--psm', str(psm), '--oem', str(oem)], + capture_output=True, text=True, errors='replace') + out = result.stdout.strip() + out = re.sub(r'Estimating resolution.*', '', out, flags=re.DOTALL).strip() + out = re.sub(r'\n+', ' ', out).strip() + return out + +def find_gt(img_path): + d = img_path.parent + exact = d / (img_path.stem + '.gt.txt') + if exact.exists(): return exact + stem = re.sub(r'-\d+$', '', img_path.stem) + fallback = d / (stem + '.gt.txt') + return fallback if fallback.exists() else None + +def collect_pairs(test_dir, force_psm=None): + pairs, seen = [], set() + for ext in IMAGE_EXTS: + for img in sorted(Path(test_dir).glob(f'*{ext}')): + gt = find_gt(img) + if gt is None or str(gt) in seen: continue + seen.add(str(gt)) + psm = str(force_psm) if force_psm else '7' + pairs.append((img, gt, psm)) + return pairs + +def run_benchmark(pairs, models=MODELS, verbose=False): + results = {name: [] for name, _, _ in models} + print(f"\n{'Image':<35} {'Model':<14} {'CER':>6} {'WER':>6} {'SpaceR':>8} {'GT excerpt'}") + print('─'*97) + for img, gt_path, psm in pairs: + gt_text = re.sub(r'\s+', ' ', gt_path.read_text(encoding='utf-8').strip()) + for name, td, oem in models: + hyp = ocr(img, name, td, psm, oem) + c = cer(gt_text, hyp) + w = wer(gt_text, hyp) + sr = space_recall(gt_text, hyp) + results[name].append({'cer': c, 'wer': w, 'space_recall': sr, + 'gt': gt_text, 'hyp': hyp, 'img': img.name}) + sr_str = f"{sr:.2f}" if sr is not None else " n/a" + print(f" {img.name:<33} {name:<14} {c:6.3f} {w:6.3f} {sr_str:>8} {gt_text[:35]!r}") + if verbose: + print(f" GT: {gt_text[:80]!r}") + print(f" OCR: {hyp[:80]!r}") + return results + +def summary_table(results): + n = len(next(iter(results.values()))) + print(f"\n{'='*78}") + print(f" SUMMARY — averages across {n} images") + print(f"{'='*78}") + print(f" {'Model':<16} {'Engine':>6} {'Char Acc':>9} {'Word Acc':>9} {'avg CER':>8} {'avg WER':>8} {'SpaceR':>7}") + print(f" {'─'*74}") + model_oem = {name: oem for name, _, oem in MODELS} + engine_map = {'0': 'legacy', '1': 'LSTM'} + for name, rows in results.items(): + avg_cer = sum(r['cer'] for r in rows) / len(rows) + avg_wer = sum(r['wer'] for r in rows) / len(rows) + sr_rows = [r['space_recall'] for r in rows if r['space_recall'] is not None] + avg_sr = sum(sr_rows)/len(sr_rows) if sr_rows else 0.0 + engine = engine_map.get(model_oem.get(name, '1'), '?') + print(f" {name:<16} {engine:>6} {(1-avg_cer)*100:>7.1f}% {(1-avg_wer)*100:>7.1f}%" + f" {avg_cer:>8.3f} {avg_wer:>8.3f} {avg_sr:>6.3f}") + print(f"{'='*78}\n") + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--test-dir', default='test-images') + parser.add_argument('--psm', default=None) + parser.add_argument('-v', '--verbose', action='store_true') + args = parser.parse_args() + pairs = collect_pairs(args.test_dir, force_psm=args.psm) + print(f"Test images: {len(pairs)} ({args.test_dir})") + results = run_benchmark(pairs, verbose=args.verbose) + summary_table(results) + +if __name__ == '__main__': + main() diff --git a/hoc/tools/check-plateau.sh b/hoc/tools/check-plateau.sh new file mode 100755 index 0000000..b816bc1 --- /dev/null +++ b/hoc/tools/check-plateau.sh @@ -0,0 +1,60 @@ +#!/bin/bash +# Checks if any running lstmtraining has plateaued. +# Plateau = no new best BCER in last 10,000 iterations. +# Outputs JSON for hook consumption or plain text for status line. + +PLATEAU_THRESHOLD=10000 + +# Find any running lstmtraining +PID=$(pgrep lstmtraining 2>/dev/null | head -1) +if [ -z "$PID" ]; then + echo "no training" + exit 0 +fi + +# Find the training log by looking at the lstmtraining command's model_output dir +CMD=$(ps -p "$PID" -o args= 2>/dev/null) +MODEL_OUTPUT=$(echo "$CMD" | grep -o '\-\-model_output [^ ]*' | awk '{print $2}') + +if [ -z "$MODEL_OUTPUT" ]; then + echo "training(no log)" + exit 0 +fi + +# Find the most recent log file in the same directory +LOG_DIR=$(dirname "$MODEL_OUTPUT") +LOG_DIR=$(dirname "$LOG_DIR") # go up from output/ to project root +LOG=$(ls -t "$LOG_DIR"/training*.log 2>/dev/null | head -1) + +if [ -z "$LOG" ] || [ ! -f "$LOG" ]; then + echo "training(no log)" + exit 0 +fi + +# Get current iteration +CURRENT_ITER=$(tail -20 "$LOG" | grep -o 'iteration [0-9]*/[0-9]*/[0-9]*' | tail -1 | cut -d/ -f3) + +# Get last best BCER iteration +LAST_BEST_LINE=$(grep "New best BCER" "$LOG" | tail -1) +BEST_ITER=$(echo "$LAST_BEST_LINE" | grep -o '[0-9]*/[0-9]*/[0-9]*' | cut -d/ -f3) +BEST_BCER=$(echo "$LAST_BEST_LINE" | grep -o 'BCER train=[0-9.]*' | cut -d= -f2) + +if [ -z "$CURRENT_ITER" ] || [ -z "$BEST_ITER" ]; then + echo "training iter:?" + exit 0 +fi + +GAP=$((CURRENT_ITER - BEST_ITER)) + +if [ "$GAP" -gt "$PLATEAU_THRESHOLD" ]; then + # Output for hook (JSON) + if [ "$1" = "--json" ]; then + echo "{\"systemMessage\":\"⚠️ PLATEAU: lstmtraining best BCER ${BEST_BCER}% was ${GAP} iters ago (threshold: ${PLATEAU_THRESHOLD}). Current iter: ${CURRENT_ITER}. Consider stopping.\"}" + else + echo "PLATEAU! best=${BEST_BCER}% ${GAP}i ago @${CURRENT_ITER}" + fi + exit 2 +else + echo "iter:${CURRENT_ITER} best:${BEST_BCER}% gap:${GAP}" + exit 0 +fi diff --git a/hoc/tools/pua-to-warang.py b/hoc/tools/pua-to-warang.py new file mode 100644 index 0000000..237125c --- /dev/null +++ b/hoc/tools/pua-to-warang.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python3 +"""Convert Tesseract PUA output back to Warang Citi Unicode. + +The OCR model outputs PUA codepoints (U+E000-E05F) because Tesseract 5.x +can't handle SMP characters (U+118A0+) in its recoder. This script maps +them back to real Warang Citi. + +Usage: + tesseract scan.png stdout -l hoc_v1 | python3 tools/pua-to-warang.py + python3 tools/pua-to-warang.py < ocr_output.txt +""" +import sys + +PUA_TO_WARANG = {chr(0xE000 + i): chr(0x118A0 + i) for i in range(96)} + +text = sys.stdin.read() +for pua, wc in PUA_TO_WARANG.items(): + text = text.replace(pua, wc) +sys.stdout.write(text) diff --git a/sat/README.md b/sat/README.md new file mode 100644 index 0000000..ae8ff09 --- /dev/null +++ b/sat/README.md @@ -0,0 +1,87 @@ +# sat: a Tesseract model for Santali Ol Chiki documents + +`sat.traineddata` is a fine-tuned Tesseract model for OCR of Santali text in the Ol Chiki script. It is trained on the Latin base model as Ol Chiki is an alphabetic script, similar to Latin. In the past, community members have tried to train Tesseract but have not yet released it. This model is released publicly so that more community-led improvement, extension, and further training will follow. + +This is the first LSTM-based model for Ol Chiki. + +The repository is structured so that the current best-trained data file, corpus preparation utilities, training scripts, and test materials are all helpful for reproducing the output. The current base checkpoint is `sat.traineddata` inside `sat/best/`, and that file will be updated as training improves. If you are improving `sat.traineddata` through training, we request you to submit it as a PR here so others can use and build on that. + +The model is trained using open-source fonts including **Noto Sans Ol Chiki** and [**Guru Gomke**](https://github.com/GuruGomke). These fonts are also used in corpus rendering for training data generation. + +## Repository layout + +```text +sat/ +├── best/ +│ └── ori_hist.traineddata +├── corpus/ +│ ├── clean-corpus.py +│ ├── render-corpus.py +│ ├── sat_corpus.txt +│ └── sat_corpus2_clean.txt +├── scripts/ +│ ├── 01-prep-base.sh +│ ├── 02-make-lstmf.sh +│ ├── 03-train.sh +│ ├── 04-package.sh +│ ├── 05-test.sh +│ └── 06-scan-to-lstmf.py +└── test-images/ +``` +## File and folder map + +| Path | Purpose | +|------|---------| +| `sat/best/ori_hist.traineddata` | Current best model checkpoint used as the base for testing, sharing, and future fine-tuning. This file will be updated as training improves. | +| `sat/corpus/clean-corpus.py` | Cleans mixed-script Santali text before training preparation. | +| `sat/corpus/render-corpus.py` | Renders corpus text into training image assets such as PNG files and matching `gt.txt` ground-truth files using user-supplied fonts. | +| `sat/corpus/sat_corpus.txt` | Source corpus text used in training preparation. | +| `sat/corpus/sat_corpus2_clean.txt` | Cleaned corpus text prepared for rendering and training workflows. | +| `sat/scripts/01-prep-base.sh` | Prepares the base training setup. | +| `sat/scripts/02-make-lstmf.sh` | Generates LSTMF training files. | +| `sat/scripts/03-train.sh` | Runs model fine-tuning or training. | +| `sat/scripts/04-package.sh` | Packages the trained output into distributable model artifacts. | +| `sat/scripts/05-test.sh` | Tests the trained model on evaluation inputs. | +| `sat/scripts/06-scan-to-lstmf.py` | Converts scan inputs into LSTMF-ready training material. | +| `sat/test-images/` | Holds sample images, including Wikisource-derived book materials used for training and testing. | + +## Training workflow + +The training workflow is split into small, reusable stages so contributors can inspect, modify, or rerun individual steps. + +1. Prepare the base model and training environment. +2. Clean and render the corpus into image and ground-truth pairs. +3. Generate `.lstmf` files. +4. Train and package updated model outputs. +5. Test the resulting model on sample images. + +## Corpus preparation + +The `corpus/` folder contains the text sources and utilities used to prepare training material. + +- `clean-corpus.py` helps clean mixed-script text before it is used for OCR training. +- `render-corpus.py` creates PNG images and matching `gt.txt` files using fonts supplied by the user. +- The current workflow uses Noto Sans Ol Chiki and Guru Gomke, both open-source fonts, for rendering training material. + +## Test material + +The `test-images/` folder contains books from Wikisource that were used during training and evaluation. These source materials helped ground the model against real printed examples rather than only synthetic samples. Additionally, Santali text were taken from three sources: Chapter 1 (Consent, Content Rights and Content Licensing) of [OpenSpeaks](https://en.wikiversity.org/wiki/OpenSpeaks/sat), originally authored by Subhashish Panigrahi and translated into Santali by R Ashwani Banjan Murmu, Fagu Baskey, and Joy Sagar Murmu, Santali Wikisource article on [Pandit Raghunath Murmu](https://w.wiki/D$AN) and the the [Community Language Documentation & Archiving Training](https://w.wiki/ReCS) (translated by Bodi Baski)—all in CC BY SA 4.0 License. + +Ramjit Tudu guided the selection and use of books from [Wikisource](https://wikisource.org/wiki/Category:%E1%B1%A5%E1%B1%9F%E1%B1%B1%E1%B1%9B%E1%B1%9F%E1%B1%B2%E1%B1%A4), which are in CC BY-SA 4.0 licenses, for this training effort. Prasanta Hembram tested interim models and also advised during the training process. Both Ramjit and Prasanta have trained Tesseract before. + +## Usage + +Install the `sat.traineddata` file into your Tesseract tessdata directory and run Tesseract with the `sat` model name as appropriate for your local setup. + +As the model improves, replace the current file in `sat/best/` with the latest `sat.traineddata` output and keep the rest of the workflow unchanged. + +## Attribution + +Coordination and model training: Subhashish Panigrahi. + +Additional contributions: +- Ramjit Tudu (Wikisource books guidance) +- Prasanta Hembram (testing interim models and advising during the training process) + +## License +MIT License diff --git a/sat/best/sat.traineddata b/sat/best/sat.traineddata new file mode 100644 index 0000000..acaf99c Binary files /dev/null and b/sat/best/sat.traineddata differ diff --git a/sat/corpus/clean-corpus.py b/sat/corpus/clean-corpus.py new file mode 100644 index 0000000..6a3502d --- /dev/null +++ b/sat/corpus/clean-corpus.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python3 +""" +clean-corpus.py + +Reads text1.txt, strips non-Santali characters, and writes a clean +Ol Chiki corpus suitable for text2image / Pillow rendering. + +Keeps: + - Ol Chiki block U+1C50–U+1C7F (all 48 code points) + - Common punctuation used in Santali text: . , : ? ! - / " ' ( ) * + - ASCII digits 0–9 (page numbers, section markers) + - ASCII space + +Removes: + - Latin letters A–Z / a–z (English words mixed into corpus) + - Devanagari and other script chars + - Control characters + +Lines with fewer than 5 Ol Chiki characters after cleaning are dropped. +Lines longer than MAX_CHARS are split at word boundaries. +""" + +import re +import unicodedata +from pathlib import Path + +INPUT = Path("text1.txt") +OUTPUT = Path("corpus/sat_corpus.txt") +MAX_CHARS = 70 + +OUTPUT.parent.mkdir(exist_ok=True) + +KEEP_ASCII = set(' .,;:?!-/"\')(]*%0123456789') + +def is_ol_chiki(c): + return 0x1C50 <= ord(c) <= 0x1C7F + +def clean_line(line): + chars = [] + for c in line: + if is_ol_chiki(c): + chars.append(c) + elif c in KEEP_ASCII: + chars.append(c) + # everything else (Latin letters, Devanagari, symbols) → drop + cleaned = re.sub(r' +', ' ', ''.join(chars)).strip() + return cleaned + +def ol_chiki_count(s): + return sum(1 for c in s if is_ol_chiki(c)) + +def split_at_boundary(line, max_len): + """Split a long line at word boundaries so each part ≤ max_len.""" + if len(line) <= max_len: + return [line] + words = line.split(' ') + parts = [] + current = [] + cur_len = 0 + for w in words: + if cur_len + len(w) + 1 > max_len and current: + parts.append(' '.join(current)) + current = [w] + cur_len = len(w) + else: + current.append(w) + cur_len += len(w) + 1 + if current: + parts.append(' '.join(current)) + return parts + +raw = INPUT.read_text(encoding='utf-8').splitlines() +out_lines = [] +dropped = 0 + +for line in raw: + cleaned = clean_line(line) + if ol_chiki_count(cleaned) < 5: + if cleaned.strip(): + dropped += 1 + continue + for part in split_at_boundary(cleaned, MAX_CHARS): + if ol_chiki_count(part) >= 5: + out_lines.append(part) + +OUTPUT.write_text('\n'.join(out_lines) + '\n', encoding='utf-8') + +print(f"Input lines: {len(raw)}") +print(f"Output lines: {len(out_lines)}") +print(f"Dropped (<5 Ol Chiki chars): {dropped}") +print(f"Written to: {OUTPUT}") diff --git a/sat/corpus/render-corpus.py b/sat/corpus/render-corpus.py new file mode 100644 index 0000000..d79b83b --- /dev/null +++ b/sat/corpus/render-corpus.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +""" +render-corpus.py + +Renders corpus/sat_corpus.txt with 4 font variants into rendered/ as PNG + gt.txt pairs. +Each line × 4 fonts = one training image each. + +Fonts used: + GuruGomke Regular — letterpress-style upright + GuruGomke Italic — letterpress-style slanted + NotoSansOlChiki Regular — clean sans-serif + NotoSansOlChiki Bold — bold weight variation + +Output: rendered/_line.{png,gt.txt} +""" + +from pathlib import Path +from PIL import Image, ImageFont, ImageDraw + +BASE = Path(__file__).parent +CORPUS = BASE / "corpus" / "sat_corpus.txt" +OUTDIR = BASE / "rendered" +OUTDIR.mkdir(exist_ok=True) + +FONTS = [ + ("gurugomke_reg", BASE / "GuruGomke-Regular.ttf", 36), + ("gurugomke_ital", BASE / "GuruGomke-Italic.ttf", 36), + ("noto_olchiki_reg", BASE / "NotoSansOlChiki-Regular.ttf", 36), + ("noto_olchiki_bld", BASE / "NotoSansOlChiki-Bold.ttf", 36), +] + +PAD_X = 20 +PAD_Y = 12 +MIN_H = 60 # upscale short crops so Tesseract doesn't refuse them + +lines = [l.rstrip('\n') for l in CORPUS.read_text(encoding='utf-8').splitlines() if l.strip()] + +total = 0 +for tag, font_path, size in FONTS: + font = ImageFont.truetype(str(font_path), size) + for idx, text in enumerate(lines): + # measure text size + dummy = Image.new("L", (1, 1)) + bbox = ImageDraw.Draw(dummy).textbbox((0, 0), text, font=font) + w = bbox[2] - bbox[0] + PAD_X * 2 + h = max(bbox[3] - bbox[1] + PAD_Y * 2, MIN_H) + + img = Image.new("L", (w, h), 255) + draw = ImageDraw.Draw(img) + draw.text((PAD_X, PAD_Y), text, font=font, fill=0) + + stem = OUTDIR / f"{tag}_line{idx:04d}" + img.save(str(stem) + ".png") + (stem.parent / (stem.name + ".gt.txt")).write_text(text, encoding="utf-8") + total += 1 + + print(f" {tag}: {len(lines)} images") + +print(f"\nTotal rendered: {total} PNG+gt.txt pairs → {OUTDIR}") diff --git a/sat/corpus/sat_corpus.txt b/sat/corpus/sat_corpus.txt new file mode 100644 index 0000000..c437ba4 --- /dev/null +++ b/sat/corpus/sat_corpus.txt @@ -0,0 +1,408 @@ +ᱚᱯᱮᱱᱥᱯᱤᱠ ᱫᱚ ᱯᱟᱹᱨᱥᱤ ᱡᱚᱛᱚᱱᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱴᱩᱞᱠᱤᱴ ᱠᱟᱱᱟ, ᱱᱚᱶᱟ ᱦᱚᱛᱮᱛᱮ +ᱢᱤᱫ ᱱᱟᱶᱟ ᱯᱟᱹᱨᱥᱤ ᱨᱮᱱᱟᱜ ᱰᱤᱡᱤᱴᱟᱞ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱵᱟᱵᱚᱫᱽ ᱥᱮᱪᱮᱫ ᱮ ᱮᱢᱟᱠᱚᱣᱟ ᱾ +ᱱᱚᱶᱟ ᱯᱩᱱ-ᱢᱚᱰᱩᱞ ᱴᱩᱞᱠᱤᱴ ᱫᱚ ᱱᱟᱶᱟ/ᱱᱟᱥᱮ ᱵᱟᱰᱟᱭ ᱡᱚᱛᱚᱱᱤᱭᱟᱹ ᱠᱚ ᱡᱟᱦᱟᱸᱭ ᱠᱚ ᱡᱟᱦᱟᱸ +ᱯᱟᱹᱨᱥᱤ ᱨᱮᱱᱟᱜ ᱜᱮ ᱰᱤᱡᱤᱴᱟᱞ ᱵᱟᱺᱫᱤ ᱵᱮᱱᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱠᱚ ᱠᱩᱨᱩᱢᱩᱴᱩᱭᱮᱫᱼᱟ, ᱩᱱᱠᱩ +ᱞᱟᱹᱜᱤᱫ ᱵᱮᱱᱟᱣ ᱟᱠᱟᱱᱟ ᱾ ᱱᱚᱶᱟ ᱨᱮᱱᱟᱜ ᱚᱥᱚᱥᱞ ᱡᱚᱥ ᱫᱚ ᱟᱥᱚᱠᱟᱭᱛᱮ ᱟᱫᱚᱜ ᱠᱟᱱ ᱯᱟᱹᱨᱥᱤ, +ᱨᱤᱥᱚᱨᱥ ᱠᱚ ᱠᱚᱢ ᱢᱮᱱᱟᱜ ᱯᱟᱹᱨᱥᱤ, ᱟᱹᱫᱤᱵᱟᱹᱥᱤ ᱠᱚᱣᱟᱜ ᱯᱟᱹᱨᱥᱤ ᱮᱢᱟᱱ ᱠᱚ ᱾ ᱢᱤᱫ ᱱᱚᱶᱟ +ᱪᱮᱫᱚᱜ ᱞᱟᱹᱜᱤᱫ ᱚᱰᱤᱭᱚ-ᱵᱷᱤᱰᱤᱭᱳ ᱮᱱᱟᱜ ᱱᱟᱥᱮ ᱩᱰᱤᱡ ᱜᱮᱭᱟᱱ ᱞᱟᱹᱠᱛᱤ ᱟᱭᱟ ᱾ +ᱩᱯᱨᱩᱢ +ᱢᱟᱱᱶᱟ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱡᱟᱱᱟᱢ ᱯᱟᱹᱨᱥᱤ ᱨᱚᱨᱚᱲᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱨᱚᱲ ᱠᱟᱱ ᱯᱟᱹᱨᱥᱤ ᱨᱮᱠᱚᱰᱤᱝ +ᱫᱚ ᱱᱟᱥᱮ ᱟᱸᱴ ᱠᱟᱛᱷᱟ ᱠᱟᱱ ᱜᱮᱭᱟ ᱾ ᱯᱟᱹᱨᱥᱤ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱫᱚ ᱢᱤᱫ ᱥᱟᱶᱛᱟ, ᱞᱟᱠᱪᱟᱨ +ᱨᱮᱱᱟᱜ ᱱᱟᱜᱟᱢ ᱛᱚᱞ ᱫᱚᱦᱚ ᱥᱟᱶᱛᱟ ᱢᱟᱬᱟᱝ ᱥᱮᱫ ᱱᱚᱶᱟ ᱯᱟᱹᱨᱥᱤ ᱵᱮᱵᱷᱟᱨᱚᱜ ᱟᱨ ᱞᱟᱦᱟᱜ +ᱞᱟᱹᱜᱤᱫ ᱜᱚᱲᱚᱭ ᱮᱢᱟ ᱾ ᱚᱯᱮᱱᱥᱯᱤᱠ ᱫᱚ ᱢᱤᱫ ᱯᱟᱹᱨᱥᱤ ᱨᱮᱱᱟᱜ ᱰᱤᱡᱤᱴᱟᱞ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ +ᱵᱟᱵᱟᱚᱫᱽ ᱪᱮᱫᱚᱜ ᱛᱮᱭᱟᱜ ᱨᱤᱥᱚᱨᱥ ᱢᱮᱱᱟᱜᱼᱟ ᱾ +ᱥᱟᱛᱷᱟᱢ ᱑: ᱟᱝᱜᱚᱪ, ᱟᱝᱜᱚᱪ ᱟᱹᱭᱫᱟᱹᱨᱤᱠᱚ ᱟᱨ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱞᱟᱭᱥᱮᱱᱥ +ᱡᱟᱦᱟᱱ ᱯᱟᱹᱨᱥᱤ ᱞᱟᱹᱜᱤᱫ ᱳᱰᱤᱭᱳ ᱥᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱵᱮᱱᱟᱣ ᱚᱠᱛᱮ ᱨᱮ, ᱟᱢ +ᱫᱚ ᱟᱝᱜᱚᱪ/ᱠᱚᱱᱥᱮᱱᱴ, ᱟᱹᱭᱫᱟᱹᱨᱤ/ᱨᱟᱭᱤᱨᱥ ᱟᱨ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ, ᱟᱨ ᱞᱟᱭᱥᱮᱱᱤᱝ ᱨᱮᱭᱟᱜ +ᱠᱩᱠᱞᱤ ᱠᱚ ᱦᱤᱡᱩᱜ-ᱟ᱾ ᱟᱫᱚᱢᱟᱜ ᱵᱟᱹᱲᱛᱤ ᱦᱤᱡᱩᱜ ᱠᱩᱠᱞᱤ ᱠᱚ ᱫᱚ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟᱺ +ᱪᱮᱠᱟ ᱛᱮ ᱢᱤᱫᱴᱮᱱ ᱤᱱᱴᱟᱨᱵᱷᱤᱣ ᱦᱟᱛᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱯᱟᱨᱢᱤᱥᱚᱱ ᱤᱧ ᱦᱟᱛᱟᱣᱟ? +ᱪᱮᱫ ᱤᱧ ᱫᱚ ᱢᱤᱫᱴᱮᱱ ᱤᱱᱴᱟᱨᱵᱷᱤᱣᱤ ᱴᱷᱮᱱ ᱠᱷᱚᱱ ᱢᱚᱪᱟ ᱟᱨᱵᱟᱝ ᱚᱞᱟᱜ ᱛᱮ ᱯᱟᱨᱢᱮᱥᱚᱱ +ᱦᱟᱛᱟᱣ ᱦᱩᱭᱩᱜ ᱛᱤᱧᱟᱹ ? +ᱛᱤᱱ ᱨᱮ ᱤᱧ ᱡᱟᱦᱟᱱ ᱳᱰᱤᱭᱳ ᱥᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱨᱤᱠᱚᱨᱰᱤᱝᱟ ᱚᱠᱚᱭ ᱴᱷᱮᱱ ᱨᱟᱭᱤᱴ ᱫᱚ ᱛᱟᱦᱮᱸᱱᱟ? +ᱪᱮᱫ ᱞᱮᱠᱟᱱ ᱚᱣᱟᱱᱟᱨᱥᱤᱯ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱠᱚ ᱢᱮᱱᱟᱜ-ᱟ? +ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱫᱚ ᱪᱮᱫ ᱠᱟᱱᱟ ᱟᱨ ᱨᱤᱠᱚᱨᱰᱤᱝ ᱚᱠᱛᱮ ᱚᱠᱚᱭ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴᱮ ᱟᱹᱭᱫᱟᱹᱨᱟ ? +ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱪᱮᱫ ᱨᱤᱡᱤᱥᱴᱟᱨ ᱦᱩᱭᱩᱜ ᱛᱤᱧᱟᱹ ? +ᱪᱮᱫ ᱨᱤᱠᱚᱨᱰᱤᱝ ᱩᱪᱷᱟᱹᱱ ᱞᱟᱹᱜᱤᱫ ᱡᱟᱦᱟᱱ ᱞᱟᱭᱥᱮᱱᱥ ᱢᱮᱱᱟᱜ-ᱟ ? +ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱟᱢ ᱫᱚ ᱢᱤᱢᱤᱫ ᱜᱚᱴᱟᱝ ᱠᱩᱠᱞᱤ ᱨᱮᱭᱟᱜ ᱥᱩᱡᱷᱤ ᱛᱮᱞᱟ ᱵᱟᱢ ᱧᱟᱢ +ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ ᱪᱮᱫᱟᱜ ᱥᱮ ᱱᱤᱭᱟᱹ ᱠᱚ ᱢᱩᱫᱽ ᱨᱮ ᱚᱠᱟᱴᱟᱜ ᱠᱩᱠᱞᱤ ᱨᱮᱭᱟᱜ ᱟᱞᱜᱟ ᱛᱮᱞᱟ ᱦᱚᱸ +ᱵᱟᱹᱱᱩᱜ-ᱟ᱾ ᱟᱫᱚᱢ ᱠᱩᱠᱞᱤ ᱫᱚ ᱟᱹᱰᱤ ᱵᱷᱮᱜᱟᱨ ᱜᱮ ᱛᱟᱦᱮᱸᱱᱟ᱾ ᱟᱫᱚ, ᱱᱤᱭᱟᱹ ᱥᱟᱛᱷᱟᱢ ᱨᱮ, +ᱟᱢ ᱫᱚ ᱵᱩᱴᱟᱹ ᱥᱟᱹᱦᱤᱸᱡ-ᱮᱢ ᱵᱟᱰᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ ᱞᱟᱛᱟᱨ ᱨᱮ ᱟᱭᱢᱟ ᱞᱮᱠᱟᱱ ᱥᱟᱹᱠᱷᱤᱭᱟᱹᱛ +ᱟᱨ ᱵᱮᱠᱜᱽᱨᱟᱣᱩᱱᱰ ᱠᱚ ᱮᱢ ᱟᱠᱟᱱᱟ᱾ ᱟᱸᱥ ᱢᱮᱱᱟᱜ-ᱟ ᱱᱤᱭᱟᱹ ᱦᱚᱛᱮ ᱛᱮ ᱟᱢ ᱫᱚ ᱩᱱ ᱚᱠᱛᱮ ᱨᱮ +ᱥᱟᱯᱲᱟᱣ ᱜᱮᱢ ᱛᱟᱦᱮᱸᱱᱟ ᱟᱨ ᱡᱟᱦᱟᱱᱟᱜ ᱮᱢ ᱱᱤᱴᱷ ᱫᱟᱲᱮᱭ-ᱟ᱾ +ᱱᱚᱱᱰᱮ ᱢᱮᱱᱟᱜ ᱟᱫᱚᱢ ᱟᱹᱲᱟᱹ ᱠᱚ ᱚᱠᱟ ᱫᱚ ᱟᱢ ᱞᱟᱛᱟᱨ ᱨᱮᱢ ᱧᱟᱢ: +ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ: ᱡᱟᱦᱟᱱ ᱵᱟᱰᱟᱭᱟᱜ ᱜᱮ ᱨᱤᱠᱚᱨᱰᱤᱝ ᱠᱟᱛᱮ ᱫᱚᱦᱚ ᱠᱟᱜ ᱚᱠᱟ ᱫᱚ ᱛᱟᱭᱚᱢ ᱛᱮ +ᱵᱮᱵᱷᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ ᱡᱟᱦᱟᱱ ᱚᱱᱚᱲᱦᱮ ᱯᱟᱲᱦᱟᱣ (ᱡᱟᱸᱦᱟᱸ ᱫᱚ ᱛᱟᱭᱚᱢ ᱛᱮ ᱫᱤᱥᱟᱹ +ᱫᱟᱲᱮᱭᱟᱜ), ᱚᱱᱟ ᱠᱟᱜᱚᱡᱽ ᱨᱮ ᱚᱞ ᱫᱚᱦᱚ, ᱳᱰᱤᱭᱳ ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱨᱤᱠᱚᱨᱰᱤᱝ ᱞᱮᱠᱟᱱ ᱟᱭᱢᱟ +ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ +ᱢᱤᱰᱤᱭᱟ: ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ ᱠᱚ ᱦᱟᱯᱟᱴᱤᱧ ᱨᱮᱭᱟᱜ ᱪᱮᱱᱮᱞᱥ ᱟᱨ ᱴᱩᱞᱥ ᱠᱚ᱾ ᱤᱱᱟᱹ +ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ ᱜᱮ ᱯᱚᱛᱚᱵ ᱞᱮᱠᱟ ᱛᱮ ᱥᱚᱫᱚᱨ ᱞᱮᱱᱠᱦᱟᱱ (ᱯᱨᱤᱱᱴ ᱢᱤᱰᱤᱭᱟ), ᱪᱟᱴ +ᱮᱯᱞᱤᱠᱮᱥᱚᱱ ᱡᱮᱞᱮᱠᱟ ᱣᱟᱴᱥᱟᱯ ᱥᱮ ᱥᱤᱜᱽᱱᱟᱞ (ᱰᱤᱡᱤᱴᱟᱞ ᱢᱤᱰᱤᱭᱟ) ᱥᱮ ᱥᱤᱹᱰᱤᱹ ᱨᱮ ᱚᱞ +(ᱢᱟᱨᱮ ᱰᱤᱡᱤᱴᱟᱞ ᱢᱤᱰᱤᱭᱟ) ᱟᱨ ᱥᱮ ᱢᱤᱫᱴᱮᱱ ᱠᱮᱥᱮᱴ ᱴᱮᱯ (ᱟᱹᱰᱤ ᱢᱟᱨᱮ ᱟᱨ ᱟᱱᱟᱞᱚᱜᱽ +ᱢᱤᱰᱤᱭᱟ)᱾ +ᱠᱚᱱᱴᱮᱱᱴ ᱥᱮ ᱢᱤᱰᱤᱭᱟ ᱠᱚᱱᱴᱮᱱᱴ: ᱢᱩᱪᱟᱹᱫ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱤᱱᱯᱷᱚᱨᱢᱮᱥᱚᱱ ᱟᱨ +ᱮᱠᱥᱯᱤᱨᱮᱱᱥ ᱠᱚ᱾ ᱠᱚᱱᱴᱮᱱᱴ ᱥᱮ ᱵᱟᱡᱟᱱ ᱡᱟᱣᱜᱮ ᱟᱭᱢᱟ ᱞᱮᱠᱟᱱ ᱢᱩᱴᱷᱟᱹᱱ/ᱢᱮᱰᱤᱭᱟᱢ ᱨᱮ ᱚᱞ +ᱛᱚᱞ ᱛᱟᱦᱮᱸᱱᱟ (ᱫᱟᱹᱭᱠᱟᱹ "ᱯᱷᱤᱡᱤᱠᱮᱞ ᱢᱮᱰᱤᱭᱟᱢ" ᱡᱮᱞᱮᱠᱟ ᱠᱟᱜᱚᱡᱽ ᱥᱟᱠᱟᱢ ᱥᱮ ᱯᱚᱛᱚᱵ +ᱟᱨ "ᱰᱤᱡᱤᱴᱟᱞ ᱢᱮᱰᱤᱭᱟᱢ" ᱡᱮᱞᱮᱠᱟ ᱮᱥᱹᱰᱤᱹ ᱠᱟᱨᱰ ᱥᱮ ᱯᱷᱚᱱ ᱨᱮᱭᱟᱜ ᱢᱮᱢᱚᱨᱤ ᱠᱟᱨᱰ)᱾ +ᱟᱝᱜᱚᱪ: ᱢᱤᱫ ᱦᱚᱲᱟᱜ ᱱᱮᱦᱚᱨ ᱠᱟᱛᱷᱟ ᱛᱮ ᱟᱨ ᱢᱤᱫ ᱦᱚᱲ ᱥᱟᱶ ᱵᱮᱜᱟᱨᱤ ᱥᱮᱣᱟ ᱪᱩᱠᱛᱤ᱾ +ᱱᱤᱭᱟᱹ ᱫᱚ ᱢᱚᱪᱟ ᱠᱟᱛᱷᱟ ᱛᱮ, ᱦᱚᱲᱢᱚ ᱛᱮᱭᱟᱜ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱛᱮ ᱥᱮ ᱚᱞ ᱨᱩᱯ ᱛᱮ ᱦᱚᱸ +ᱦᱩᱭᱩᱜ ᱜᱮᱭᱟ᱾ ᱟᱥᱚᱠᱟᱭᱛᱮ ᱟᱹᱱ ᱤᱫᱤ ᱠᱟᱛᱮ, ᱨᱟᱜ-ᱨᱟᱱ (ᱫᱟᱹᱭᱠᱟᱹ-ᱯᱟᱹᱴᱤᱦᱟᱛᱟᱣ), +ᱠᱷᱚᱱᱫᱽᱨᱚᱝ ᱟᱨ ᱡᱩᱣᱟᱹᱱ ᱥᱟᱹᱜᱟᱹᱭ ᱮᱢᱟᱱ ᱢᱟᱲᱟᱝ ᱨᱮ ᱠᱚᱱᱥᱮᱱᱴ ᱦᱟᱛᱟᱣ ᱦᱩᱭᱩᱜ-ᱟ᱾ +ᱞᱟᱭᱥᱮᱱᱥ ᱥᱮ ᱞᱟᱭᱥᱮᱱᱥ): ᱢᱤᱫᱴᱮᱱ ᱟᱹᱢᱟᱹᱞᱤ ᱟᱝᱜᱚᱪ ᱥᱮ ᱟᱝᱜᱚᱪ ᱥᱮ ᱥᱟᱹᱵᱤᱛᱟᱜ ᱥᱮ +ᱡᱟᱸᱦᱟᱸᱭ ᱡᱟᱸᱦᱟᱱᱟᱜ ᱵᱮᱵᱷᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱟᱝᱜᱚᱪ ᱥᱮ ᱟᱯᱱᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ-ᱮ᱾ ᱚᱱᱟ ᱫᱚ +"ᱡᱟᱦᱟᱱ" ᱢᱤᱫᱴᱮᱱ ᱚᱞᱟᱜ ᱢᱟᱱᱩᱥᱠᱨᱤᱯᱴ, ᱢᱤᱫᱴᱮᱱ ᱞᱟᱹᱞᱟᱹᱭ ᱨᱤᱠᱚᱨᱰᱤᱝ ᱟᱨ ᱥᱮ ᱢᱤᱫᱴᱮᱱ +ᱰᱟᱠᱴᱚᱨ ᱟᱜ ᱢᱮᱰᱤᱠᱮᱞ ᱞᱟᱭᱥᱮᱱᱥ ᱦᱚᱸ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ ᱢᱤᱫᱴᱮᱱ ᱥᱚᱯᱷᱴᱣᱮᱭᱟᱨ +ᱩᱛᱷᱱᱟᱹᱣᱤᱡ ᱞᱟᱭᱥᱮᱱᱥᱮ ᱮᱢ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱡᱩᱫᱤ ᱩᱱᱤ ᱢᱤᱫᱴᱮᱱ ᱱᱟᱣᱟ ᱥᱚᱯᱷᱴᱣᱮᱭᱟᱨᱮ +ᱵᱮᱱᱟᱣᱟ ᱥᱮ ᱢᱤᱫᱴᱮᱱ ᱢᱮᱰᱤᱠᱮᱞ ᱵᱳᱣᱨᱰ ᱠᱷᱚᱱ ᱢᱤᱫᱥᱴᱮᱱ ᱰᱟᱠᱴᱚᱨ ᱞᱟᱭᱥᱮᱱᱥᱮ ᱠᱚ ᱮᱢ +ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ +ᱠᱚᱯᱤᱨᱟᱭᱤᱴ, ᱢᱚᱨᱟᱞ ᱠᱚᱯᱤᱨᱟᱭᱤᱴ, ᱚᱯᱮᱱ ᱞᱟᱭᱥᱮᱱᱥ ᱞᱮᱠᱟᱱ ᱟᱭᱢᱟ ᱟᱹᱲᱟᱹ ᱠᱚ ᱢᱮᱱᱟᱜ-ᱟ᱾ +ᱞᱟᱛᱟᱨ ᱨᱮᱭᱟᱜ ᱵᱤᱵᱚᱨᱚᱱ ᱠᱷᱚᱱ ᱯᱷᱟᱭᱞᱟᱣ ᱛᱮ ᱪᱮᱫᱡᱚᱝ ᱢᱮ᱾ +ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱞᱟᱹᱜᱤᱫ ᱟᱝᱜᱚᱪ +ᱯᱟᱹᱨᱥᱤ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱵᱮᱲᱟ ᱨᱮ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱫᱚ ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ ᱟᱡᱟᱜ ᱤᱪᱷᱟᱹ ᱛᱮ +ᱠᱩᱜᱞᱤᱭᱤᱡ ᱫᱚᱭ ᱮᱢᱟᱭᱟ ᱾ ᱨᱮᱠᱚᱰᱤᱝ ᱞᱟᱹᱜᱤᱫ ᱱᱚᱣᱟ ᱫᱚ ᱯᱩᱭᱞᱩ ᱨᱮᱵᱮᱱ ᱢᱮᱱᱛᱮ +ᱵᱟᱰᱟᱭᱚᱜ-ᱟ ᱾ ᱠᱩᱜᱞᱤᱭᱤᱡ ᱨᱮᱠᱚᱰ ᱞᱟᱹᱜᱤᱫ ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ ᱮ ᱱᱮᱦᱚᱸᱨ ᱮᱭᱟ ᱾ ᱠᱩᱞᱤ +ᱚᱪᱚᱜᱤᱡ ᱚᱱᱟ ᱫᱚᱭ ᱵᱩᱡᱷᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱢᱟ ᱾ ᱚᱱᱟ ᱛᱟᱭᱚᱢ ᱨᱮᱠᱚᱰ ᱟᱠᱟᱱ ᱢᱤᱰᱤᱭᱟ ᱯᱟᱨᱥᱟᱞ +ᱵᱟᱵᱚᱛ ᱥᱟᱯᱷᱟ ᱨᱮᱵᱮᱱ ᱮ ᱪᱟᱞᱟ ᱾ ᱱᱚᱶᱟ ᱦᱟᱹᱴᱤᱧ ᱨᱮᱫᱚ ᱚᱠᱚᱭ, ᱪᱮᱫ ᱞᱮᱠᱟ, ᱛᱤᱱ ᱨᱮ, +ᱚᱠᱟ ᱨᱮ "ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱥᱟᱠᱟᱢ" ᱧᱟᱢ ᱵᱟᱵᱚᱛ ᱜᱟᱞᱚᱪ ᱟᱠᱟᱱᱟ ᱾ +ᱟᱹᱰᱤ ᱜᱟᱱ ᱠᱩᱯᱩᱞᱤ ᱨᱚᱯᱚᱲ ᱨᱮᱜᱮ ᱠᱮᱢᱨᱟ ᱟᱨ ᱢᱟᱭᱠᱨᱚᱯᱷᱚᱱ ᱥᱟᱡᱟᱣ ᱧᱮᱞ ᱛᱮᱜᱮ ᱟᱵᱚ ᱵᱚ +ᱵᱤᱪᱟᱹᱨᱟ ᱡᱮ ᱯᱚᱨᱚᱠᱷᱭᱚ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱫᱚ ᱧᱟᱢ ᱮᱱᱟ ᱾ ᱟᱵᱚ ᱵᱚ ᱢᱚᱱᱮᱭᱟ ᱡᱮ ᱠᱮᱢᱨᱟ, +ᱢᱟᱭᱤᱠ ᱟᱨ ᱴᱨᱟᱭᱯᱚᱰ ᱠᱚ ᱧᱮᱞ ᱛᱮᱜᱮ ᱩᱱᱤ ᱫᱚ ᱨᱮᱠᱚᱰᱤᱝ ᱞᱟᱹᱜᱤᱫ ᱮ ᱨᱮᱵᱮᱱ ᱟᱠᱟᱱᱟ ᱾ +ᱤᱠᱷᱟᱹᱱ ᱱᱚᱶᱟ ᱫᱚ ᱜᱚᱴᱟ ᱯᱟᱲᱟ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ ᱞᱟᱹᱜᱩᱜ-ᱟ ᱾ ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ ᱫᱚ ᱠᱟᱬᱟ +ᱦᱚᱸᱭ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱵᱟᱠᱷᱟᱱ ᱨᱮᱠᱚᱰᱤᱝ ᱵᱟᱵᱚᱛ ᱜᱮᱭᱟᱱ ᱵᱟᱹᱱᱩᱜ ᱛᱟᱭᱟ ᱾ ᱛᱟᱭᱚᱢ +ᱵᱤᱫᱟᱹᱞ ᱱᱚᱶᱟ ᱵᱟᱵᱚᱛ ᱱᱮᱭᱟᱶ ᱛᱟᱯᱟᱢ ᱦᱩᱭᱩᱜ ᱠᱷᱟᱱ ᱱᱚᱶᱟ "ᱦᱮᱸᱥᱟᱹᱨᱤ ᱥᱟᱠᱟᱢ" ᱟᱹᱰᱤ +ᱠᱟᱹᱢᱤ ᱨᱮ ᱞᱟᱜᱟᱣᱜ-ᱟ ᱾ +ᱚᱞ ᱦᱮᱸᱥᱤᱠᱟᱨ +ᱞᱮᱛᱟᱲ ᱜᱮ ᱚᱞᱟᱜ ᱟᱨᱵᱟᱝ ᱪᱷᱟᱯᱟ ᱟᱜ ᱨᱟᱹᱡᱤ ᱥᱟᱠᱟᱢ ᱵᱮᱣᱦᱟᱨ ᱜᱮ ᱱᱟᱯᱟᱭᱟ ᱾ ᱡᱩᱫᱤ +ᱪᱷᱟᱯᱟ ᱯᱷᱚᱨᱢ ᱯᱮ ᱵᱮᱣᱦᱟᱨ ᱮᱫᱟ ᱛᱚᱵᱮ ᱵᱟᱨᱮᱭᱟ ᱠᱚᱯᱤ ᱵᱮᱱᱟᱣ ᱞᱟᱹᱠᱛᱤ, ᱢᱤᱫ ᱫᱚ ᱠᱩᱠᱞᱤ +ᱤᱡ ᱞᱟᱹᱜᱤᱫ ᱟᱨ ᱢᱤᱫ ᱫᱚ ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ ᱞᱟᱹᱜᱤᱫ ᱾ ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ ᱫᱚ ᱢᱤᱫ ᱚᱞ +ᱯᱟᱲᱦᱟᱣᱤᱡ ᱟᱨ ᱑᱘ ᱩᱢᱮᱨ ᱠᱷᱚᱱᱟᱜ ᱵᱟᱹᱲᱛᱤ ᱤᱡ ᱮ ᱦᱩᱭ ᱠᱚᱜ ᱢᱟ, ᱡᱮᱢᱚᱱ ᱩᱱᱤ ᱯᱷᱚᱨᱢ ᱨᱮ +ᱥᱩᱦᱤ ᱢᱟᱬᱟᱝ ᱨᱮ ᱚᱱᱰᱮᱱᱟᱜ ᱡᱚᱛᱚᱣᱟᱜ ᱮ ᱵᱩᱡᱷᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱢᱟ ᱾ ᱡᱩᱫᱤ ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ +ᱨᱟᱹᱡᱤ ᱥᱟᱠᱟᱢ ᱵᱟᱭ ᱮᱢᱟ ᱮᱱᱠᱷᱟᱱ ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱞᱟᱹᱭ ᱯᱮ ᱡᱮ ᱟᱡ ᱯᱟᱦᱴᱟ ᱠᱷᱚᱱ ᱚᱠᱚᱭ +ᱨᱟᱹᱡᱤ ᱥᱟᱠᱟᱢ ᱮ ᱮᱢᱟ ᱾ ᱦᱩᱰᱤᱧ ᱜᱤᱫᱟᱹᱨ ᱞᱟᱹᱜᱤᱫ ᱫᱚ ᱮᱸᱜᱟᱛ, ᱟᱯᱟᱛ ᱟᱨ ᱵᱟᱠᱷᱟᱱ +ᱜᱟᱨᱡᱚᱱ ᱨᱟᱹᱡᱤ ᱥᱟᱠᱟᱢ ᱠᱚ ᱮᱢᱟ ᱾ ᱚᱠᱚᱰᱟ ᱦᱚᱲ ᱞᱟᱹᱜᱤᱫ ᱫᱚ ᱡᱚᱜᱛᱚᱱᱤᱡ ᱟᱨ ᱵᱮᱝᱠᱷᱟᱱ +ᱜᱷᱟᱨᱚᱸᱧᱡᱽ ᱥᱚᱦᱮᱫ ᱨᱟᱹᱡᱤ ᱥᱟᱠᱟᱢ ᱮ ᱮᱢᱟ ᱾ ᱵᱚᱦᱚᱜ ᱵᱟᱹᱲᱤᱡ ᱟᱠᱟᱱ ᱦᱚᱲ ᱥᱟᱶ ᱫᱚ +ᱠᱩᱯᱩᱞᱤ ᱨᱚᱯᱚᱲ ᱢᱚᱴᱷᱮ ᱜᱮ ᱵᱟᱝ ᱠᱚᱨᱟᱣ ᱞᱟᱹᱠᱛᱤ ᱾ +ᱞᱟᱛᱟᱨ ᱨᱮ ᱮᱢ ᱟᱠᱟᱱ ᱫᱟᱹᱭᱠᱟᱹ ᱯᱷᱚᱨᱢ ᱧᱮᱞ ᱢᱮ ᱾ ᱱᱚᱶᱟ ᱟᱢᱮᱢ ᱠᱚᱯᱤ ᱫᱟᱲᱮᱟᱜ-ᱟ, +ᱞᱟᱹᱠᱛᱤ ᱡᱟᱹᱱᱤᱢ ᱵᱚᱫᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱨ ᱟᱢᱟᱜ ᱟᱭᱳ ᱟᱲᱟᱝ ᱛᱮᱢ ᱛᱚᱨᱡᱚᱢᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ +ᱯᱟᱨᱥᱟᱞ ᱞᱟᱹᱜᱤᱫ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱟᱨ ᱟᱹᱭᱫᱟᱹᱨ +ᱟᱹᱭᱟᱹᱛ ᱠᱚ: +ᱞᱟᱛᱟᱨ ᱨᱮ ᱮᱢ ᱟᱠᱟᱱ ᱞᱟᱥᱮᱸᱥ ᱚᱝᱥᱟᱨ "ᱤᱧᱟᱜ ᱠᱟᱹᱢᱤ" ᱯᱟᱨᱥᱟᱞ ᱞᱟᱹᱜᱤᱫ ᱤᱧ ᱨᱮᱵᱮᱱ +ᱢᱤᱱᱟᱹᱧᱟ ᱾ +ᱞᱟᱭᱥᱮᱸᱥ ᱺ ᱤᱧᱤᱧ ᱥᱤᱠᱟᱹᱨ ᱮᱫᱟ ᱡᱮ ᱱᱚᱝᱠᱹᱟᱧ ᱠᱟᱹᱢᱤ ᱞᱮᱠᱷᱟᱱ, ᱡᱟᱦᱟᱸᱭ ᱜᱮ ᱤᱧᱟᱜ +ᱠᱟᱹᱢᱤ ᱚᱝᱥᱟᱨ ᱠᱚ ᱵᱮᱣᱦᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ ᱩᱱᱠᱩ ᱱᱚᱶᱟ ᱵᱟᱹᱱᱤᱡ ᱵᱮᱯᱟᱨ ᱞᱟᱜᱤᱫ ᱦᱚᱸᱠᱚ +ᱵᱮᱣᱦᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ, ᱟᱠᱚᱣᱟᱜ ᱞᱟᱹᱠᱛᱤ ᱡᱟᱹᱱᱤ ᱵᱚᱫᱚᱞ ᱦᱚᱸᱠᱚ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ ᱟᱨ ᱟᱠᱚ +ᱦᱚᱸ ᱱᱚᱶᱟ ᱱᱤᱭᱚᱢ ᱟᱨ ᱠᱟᱹᱱᱩᱱ ᱠᱚ ᱢᱟᱱᱟᱣᱟ ᱾ +ᱤᱧ ᱥᱚᱱᱛᱚᱨ ᱢᱤᱱᱟᱹᱧᱟ ᱡᱮ ᱱᱚᱶᱟ ᱮᱜᱽᱨᱤᱢᱮᱱᱴ ᱫᱚ "ᱵᱮᱜᱱᱟᱣᱤᱡ" ᱥᱩᱢᱩᱝ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱝ +ᱠᱟᱱᱟ ᱾ +ᱤᱧ ᱥᱚᱱᱛᱚᱨ ᱢᱤᱱᱟᱹᱧᱟ ᱡᱮ ᱠᱚᱯᱤ ᱨᱮᱭᱤᱴ ᱦᱚᱞᱰᱚᱨ ᱫᱚ ᱵᱟᱪᱷᱟᱣ ᱟᱠᱟᱱ ᱞᱟᱭᱥᱮᱸᱥ ᱚᱝᱥᱟᱨ +ᱡᱤᱱᱤᱥ ᱨᱮᱭᱟᱜ ᱢᱟᱞᱤᱠᱟᱱᱟ ᱟᱠᱚ ᱴᱷᱮᱱ ᱠᱚ ᱫᱚᱦᱚᱭᱟ ᱾ +ᱤᱧᱤᱧ ᱥᱤᱠᱟᱹᱨ ᱮᱫᱟ ᱡᱮ ᱱᱚᱶᱟ "ᱮᱜᱽᱨᱤᱢᱮᱱᱴ" ᱫᱚ ᱤᱧ ᱵᱟᱹᱧ ᱤᱫᱤ ᱨᱩᱣᱟᱹᱲ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ +ᱤᱧ ᱥᱚᱱᱛᱚᱨ ᱟᱨ ᱨᱟᱹᱡᱤ ᱢᱤᱱᱟᱹᱧᱟ ᱡᱮ ᱤᱧᱟᱜ ᱱᱚᱣᱟ ᱰᱚᱠᱩᱢᱮᱱᱴ ᱤᱧᱟᱜ ᱟᱨ ᱵᱟᱝᱢᱟ ᱤᱧ ᱨᱮᱱ +ᱟᱹᱭᱫᱟᱹᱨᱤ ᱟᱜ ᱵᱤᱱᱟᱹ ᱨᱮᱵᱮᱱ ᱛᱮ ᱡᱟᱦᱟᱸᱭ ᱜᱮᱠᱚ ᱵᱤᱥᱲᱤ, ᱛᱚᱨᱡᱚᱢᱟ ᱟᱨ ᱦᱟᱹᱴᱤᱧ +ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ +ᱤᱧ ᱜᱷᱚᱥᱬᱟ ᱮᱫᱟᱹᱧ ᱡᱮ (ᱚ) ᱱᱚᱶᱟ ᱯᱟᱨᱥᱟᱞ ᱞᱟᱹᱜᱤᱫ ᱤᱧᱟᱜ ᱥᱚᱢᱯᱩᱨᱩᱱ ᱫᱟᱲᱮ ᱟᱨ +ᱟᱹᱭᱫᱟᱹᱨ ᱢᱮᱱᱟᱜ-ᱟ ᱾ ᱡᱩᱫᱤ ᱡᱟᱦᱟᱸᱭ ᱜᱮ ᱛᱮᱥᱟᱨ ᱦᱚᱲ ᱮ ᱫᱟᱹᱵᱤᱭᱟ ᱡᱮ ᱱᱚᱶᱟ ᱟᱡᱟᱜ +ᱟᱹᱭᱫᱟᱹᱨ ᱮ ᱨᱟᱹᱯᱩᱫᱮᱜ-ᱟ ᱮᱱᱠᱷᱟᱱ ᱱᱚᱝᱠᱟᱱ ᱫᱟᱹᱵᱤ ᱠᱷᱚᱱᱟᱜ ᱵᱟᱧᱪᱟᱣᱜ ᱞᱟᱹᱜᱤᱫ ᱤᱧ +ᱵᱮᱜᱱᱟᱣᱤᱡ ᱥᱚᱢᱯᱩᱨᱩᱱ ᱤᱧ ᱜᱚᱲᱚ ᱟᱭᱟ ᱾ +ᱧᱩᱛᱩᱢ ᱦᱟᱹᱴᱤᱧ ᱢᱮ ᱟᱨ ᱵᱟᱝ "ᱠᱟᱹᱢᱤ" ᱵᱟᱵᱚᱫᱽ ᱵᱤᱥᱲᱤ ᱢᱮ * +(ᱡᱩᱫᱤ ᱱᱚᱶᱟ ᱢᱤᱫ ᱠᱩᱯᱩᱞᱤ ᱨᱚᱯᱚᱲ ᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ ᱟᱢ "ᱤᱧᱟᱜ ᱠᱩᱯᱩᱞᱤ ᱨᱚᱨᱯᱚᱲ +'''ᱨᱚᱯᱚᱲ ᱥᱟᱛᱟᱢ''' ᱵᱟᱵᱚᱛ" ᱚᱞ ᱢᱮ ᱡᱟᱦᱟᱸ ᱨᱮ '''ᱨᱚᱯᱚᱲ ᱥᱟᱛᱟᱢ''' ᱴᱷᱮᱱ ᱫᱚ ᱟᱢ +ᱚᱠᱟ ᱵᱟᱵᱚᱛ ᱮᱢ ᱨᱚᱯᱚᱲ ᱮᱱᱟ ᱚᱱᱟ ᱚᱞ ᱢᱮ ᱾ ᱡᱩᱫᱤ ᱟᱢ ᱵᱷᱤᱰᱤᱭᱚ, ᱚᱰᱤᱭᱚ, ᱯᱷᱚᱴᱚᱢ ᱞᱚᱰ +ᱟᱠᱟᱜ-ᱟ ᱮᱱᱠᱷᱟᱱ ᱚᱱᱟ ᱪᱮᱫ ᱨᱮᱭᱟᱜ ᱵᱷᱤᱰᱤᱭᱚ, ᱚᱰᱤᱭᱚ, ᱯᱷᱚᱴᱚ ᱠᱟᱱᱟ ᱚᱱᱟ ᱚᱞ ᱢᱮ ᱾ +ᱴᱷᱟᱶ ᱡᱟᱦᱟᱸ ᱨᱮ ᱥᱩᱦᱤ ᱠᱮᱫᱟᱭ: +ᱥᱩᱦᱤ ᱨᱮᱭᱟᱜ ᱢᱟᱹᱦᱤᱛᱺ +ᱨᱚᱲ ᱠᱟᱱ ᱯᱟᱹᱨᱥᱤ ᱠᱚ: +ᱢᱤᱰᱤᱭᱟ ᱨᱮᱭᱟᱜ ᱞᱮᱠᱟᱱ (ᱰᱤᱡᱤᱴᱟᱞ ᱚᱰᱤᱭᱳ, ᱵᱷᱤᱰᱤᱭᱳ, ᱯᱷᱚᱴᱚ): +ᱠᱩᱠᱞᱤ ᱚᱪᱚᱜᱤᱡᱟᱜ ᱥᱚᱢᱯᱩᱨᱩᱱ +ᱯᱩᱨᱟᱹ ᱧᱩᱛᱩᱢ: +ᱤ ᱢᱮᱞ ᱟᱨ ᱵᱟᱝ ᱮᱴᱟᱜ ᱥᱟᱹᱜᱟᱹᱭ ᱡᱚᱲᱟᱣ ᱥᱩᱪᱚᱱᱟ: +ᱪᱮᱛᱟᱱ ᱨᱮ ᱞᱟᱹᱭ ᱟᱠᱟᱱ ᱟᱹᱭᱟᱹᱛ ᱠᱚ ᱛᱩᱞᱩᱡ ᱟᱢ ᱨᱮᱵᱮᱱ ᱢᱮᱱᱟᱢᱟ?* +- ᱦᱮᱸ, ᱪᱮᱛᱟᱱ ᱨᱮᱭᱟᱜ ᱡᱚᱛᱚ ᱟᱹᱭᱟᱹᱛ ᱥᱟᱶ ᱤᱧ ᱨᱟᱹᱡᱤ ᱢᱤᱱᱟᱹᱧᱟ +ᱠᱩᱠᱞᱤ ᱚᱪᱚᱪᱜᱤᱡᱟᱜ ᱥᱚᱢᱯᱩᱨᱩᱱ +ᱯᱩᱨᱟᱹ ᱧᱩᱛᱩᱢ: +ᱤ ᱢᱮᱞ ᱟᱨ ᱵᱟᱝ ᱮᱴᱟᱜ ᱥᱟᱹᱜᱟᱹᱭ ᱡᱚᱲᱟᱣ ᱥᱩᱪᱚᱱᱟ: +ᱟᱢ ᱱᱚᱶᱟ ᱨᱮ ᱨᱮᱵᱮᱱ ᱢᱮᱱᱟᱢᱟ ᱠᱤ: +ᱚ. ᱟᱢ ᱟᱢᱟᱜ ᱠᱟᱹᱢᱤ ᱠᱷᱩᱞᱟᱹ ᱵᱮᱣᱦᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱮᱢ ᱟᱲᱟᱜᱟ, ᱠᱷᱟᱥ ᱠᱟᱭᱛᱮ ᱟᱢᱟᱜ +ᱯᱟᱹᱨᱥᱤ ᱨᱮᱱ ᱦᱚᱲ ᱞᱟᱹᱜᱤᱫ? +ᱛ. ᱟᱢ ᱱᱚᱶᱟ ᱠᱚᱱᱴᱮᱱᱴ ᱫᱚ ᱯᱟᱹᱨᱥᱤ ᱨᱮᱭᱟᱜ ᱩᱛᱱᱟᱹᱣ, ᱨᱟᱱᱟᱠᱟᱵ ᱟᱨ ᱨᱟᱠᱷᱟ ᱞᱟᱹᱜᱤᱫ ᱮᱢ +ᱵᱮᱣᱦᱟᱨᱟ? +ᱜ. ᱠᱚᱱᱴᱮᱱᱴ ᱨᱮ ᱦᱟᱹᱴᱤᱧ ᱟᱠᱟᱱ ᱜᱮᱭᱟᱱ ᱪᱮᱛᱟᱱ ᱨᱮ ᱟᱢ ᱟᱢᱟᱜ ᱢᱟᱹᱞᱤᱠᱟᱱᱟ ᱵᱟᱢ +ᱫᱟᱹᱵᱤᱭᱟ ᱤᱠᱷᱟᱹᱱ ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ ᱟᱨ ᱟᱡ ᱨᱮᱱ ᱡᱟᱹᱛ ᱦᱚᱲ ᱮᱢ ᱢᱟᱹᱱ ᱠᱚᱣᱟ? +- ᱦᱮᱸ, ᱤᱧ ᱪᱮᱛᱟᱱ ᱨᱮᱭᱟᱜ ᱡᱚᱛᱚ ᱟᱹᱟᱹᱛ ᱥᱟᱶ ᱨᱮᱵᱮᱱ ᱢᱤᱱᱟᱹᱧᱟ +ᱪᱮᱛᱟᱱ ᱨᱮ ᱮᱢ ᱟᱠᱟᱱ ᱰᱚᱠᱩᱢᱮᱱᱴ ᱠᱚᱫᱚ ᱮᱜᱽᱨᱤᱢᱮᱱᱴ ᱨᱮᱭᱟᱜ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱢᱮᱱᱛᱮ +ᱞᱮᱠᱷᱟᱜ-ᱟ ᱾ ᱱᱚᱶᱟ ᱫᱚ ᱟᱹᱭᱤᱱ ᱨᱮᱭᱟᱜ ᱰᱚᱠᱩᱢᱮᱱᱴ ᱵᱟᱝ ᱦᱩᱭ ᱠᱚᱜ ᱨᱮᱦᱚᱸ ᱾ ᱱᱚᱰᱮ ᱫᱚ +"ᱚᱯᱮᱱ ᱟᱠᱥᱮᱥ" ᱟᱨ "ᱠᱨᱤᱭᱮᱴᱤᱵᱽ ᱠᱚᱢᱚᱱᱥ" ᱞᱮᱠᱟᱱ ᱟᱹᱲᱟᱹ ᱠᱚᱦᱚᱸ ᱢᱮᱱᱟᱜ-ᱟ ᱡᱟᱦᱟᱸ ᱫᱚ +ᱱᱚᱶᱟ ᱪᱟᱯᱴᱟᱨ ᱨᱮᱭᱟᱜ ᱛᱟᱭᱚᱢ ᱥᱮᱫ ᱨᱮ ᱵᱤᱥᱲᱤ ᱟᱠᱟᱱᱟ ᱾ ᱡᱩᱫᱤ ᱡᱟᱦᱟᱸᱱ ᱠᱟᱨᱚᱱ ᱠᱷᱟᱹᱛᱤᱨ +ᱚᱞ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱵᱟᱝ ᱧᱟᱢᱚᱜ-ᱟ ᱮᱱᱠᱷᱟᱱ ᱨᱚᱲ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱨᱮᱠᱚᱰ ᱠᱟᱛᱮ ᱫᱚᱦᱚ ᱞᱟᱹᱠᱛᱤ ᱾ +ᱨᱚᱲ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ +ᱟᱹᱰᱤ ᱚᱠᱛᱚ ᱨᱮ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱧᱟᱢ ᱵᱟᱝ ᱥᱚᱢᱵᱷᱚᱵᱚᱜ-ᱟ ᱾ ᱫᱟᱹᱭᱠᱟᱹ, ᱠᱩᱜᱞᱤᱭᱤᱡ ᱟᱨ +ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ ᱟᱜ ᱨᱚᱲ ᱯᱟᱹᱨᱥᱤ ᱵᱷᱮᱜᱟᱨ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ ᱵᱟᱝ ᱚᱞ +ᱯᱟᱲᱦᱟᱣᱤᱡ ᱮ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱨ ᱵᱟᱝ ᱚᱞᱟᱜ ᱨᱮᱵᱮᱱ ᱥᱟᱠᱟᱢ ᱵᱩᱡᱷᱟᱹᱣ ᱨᱮ ᱟᱱᱟᱴ ᱛᱟᱦᱮᱸ +ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱾ ᱱᱚᱝᱠᱟᱱ ᱵᱮᱲᱟ ᱨᱮᱫᱚ, ᱚᱞᱟᱜ ᱨᱮᱵᱮᱱ ᱥᱟᱠᱟᱢ ᱧᱟᱢ ᱵᱟᱝ ᱦᱩᱭ ᱠᱮᱭᱟ ᱡᱩᱫᱤ +ᱦᱚᱸ ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ ᱥᱩᱦᱤ ᱥᱟᱱᱟᱭᱟ ᱾ ᱫᱮᱞᱟ ᱛᱤᱱᱟᱹᱜ ᱜᱟᱱ ᱨᱩᱯ ᱪᱮᱛᱟᱱ ᱨᱮ ᱢᱮᱫ ᱵᱚ +ᱟᱹᱪᱩᱨᱟ ᱡᱟᱦᱟᱸ ᱫᱚ ᱨᱮᱵᱮᱱ ᱥᱟᱠᱟᱢ ᱧᱟᱢ ᱨᱮ ᱜᱚᱲᱚᱭ ᱮᱢᱟ ᱵᱚᱱᱟ ᱾ +ᱨᱮᱠᱚᱰᱤᱝ ᱨᱮᱭᱟᱜ ᱨᱩᱯᱪᱮᱫ ᱞᱮᱠᱟᱨᱮᱵᱮᱱ ᱨᱮᱭᱟᱜ ᱞᱮᱠᱟᱱ (ᱨᱚᱲᱟᱜ, ᱚᱞᱟᱜ) +ᱥᱮᱬᱟ ᱜᱟᱫᱮᱞ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ (ᱯᱩᱱ-ᱢᱚᱬᱮ ᱦᱚᱲ ᱠᱷᱚᱱᱟᱜ ᱵᱟᱹᱲᱛᱤ) ᱯᱷᱟᱫᱟ ᱨᱮ ᱟᱨ ᱵᱟᱝᱢᱟ +ᱩᱠᱩ ᱨᱮ ᱦᱩᱭ ᱠᱚᱜ ᱾ ᱥᱮᱨᱮᱧ, ᱮᱱᱮᱡ ᱮᱢᱟᱱ ᱠᱟᱹᱢᱤ ᱦᱚᱨᱟ ᱾ᱨᱮᱠᱚᱰ ᱟᱨ ᱯᱟᱨᱥᱟᱞ ᱞᱟᱹᱜᱤᱫ +ᱥᱟᱹᱛ ᱮᱱ ᱠᱷᱟᱱ ᱠᱩᱞᱤ ᱚᱪᱚᱜ ᱠᱚᱠᱚ ᱟᱹᱨᱡᱤ ᱠᱮᱭᱟ ᱚᱱᱟ ᱛᱟᱭᱚᱢ ᱥᱟᱢᱮᱞᱟᱭ "ᱨᱚᱲ +ᱦᱮᱸᱥᱤᱠᱟᱹᱨ" ᱦᱟᱛᱟᱣᱜ-ᱟ ᱾ᱢᱚᱪᱟ ᱛᱮᱭᱟᱜ ᱨᱮᱠᱚᱰ ᱟᱜ (ᱡᱩᱫᱤ ᱜᱟᱫᱮᱞ ᱟᱹᱰᱤ ᱢᱟᱨᱟᱝᱟ ᱟᱨ +ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱯᱚᱵᱽᱞᱤᱠ ᱜᱮᱭᱟ ᱮᱱᱠᱷᱟᱱ ᱵᱟᱝ ᱨᱮᱦᱚᱸ ᱜᱟᱱᱚᱜ ᱜᱮᱭᱟ) +ᱦᱩᱰᱤᱧ ᱜᱟᱫᱮᱞ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ (ᱯᱩᱱ-ᱢᱚᱬᱮ ᱟᱨ ᱵᱟᱝ ᱚᱱᱟ ᱠᱷᱚᱱᱟᱜ ᱠᱚᱢ ᱦᱚᱲ)ᱡᱚᱛᱚ ᱦᱚᱲ +ᱨᱮᱵᱮᱱ ᱥᱟᱠᱟᱢ ᱮᱢ ᱦᱩᱭ ᱟᱠᱚᱣᱟᱢᱚᱪᱟ ᱛᱮᱭᱟᱜ ᱨᱮᱠᱚᱰ ᱟᱜ ᱟᱨ ᱵᱟᱝᱠᱷᱟᱱ ᱥᱩᱦᱤ ᱢᱮᱱᱟᱜ ᱚᱞᱟᱜ +ᱨᱮᱵᱮᱱ ᱥᱟᱠᱟᱢ +ᱢᱤᱫ ᱦᱚᱲ ᱥᱟᱶ ᱠᱩᱯᱩᱞᱤ ᱨᱚᱯᱚᱲᱚ) ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ ᱮ ᱥᱟᱵᱟᱞᱚᱠ ᱠᱟᱱ ᱠᱷᱟᱱ ᱨᱮᱵᱮᱱ ᱥᱟᱠᱟᱢ +ᱛ) ᱟᱭᱳ ᱵᱟᱵᱟ ᱵᱟᱝᱠᱷᱟᱱ ᱜᱟᱨᱡᱚᱱ (ᱟᱭᱳ ᱵᱟᱵᱟ ᱵᱟᱹᱱᱩᱜ ᱚᱠᱛᱮ) ᱡᱩᱫᱤ ᱱᱟᱵᱟᱞᱚᱠ ᱠᱟᱱᱟᱭ +ᱜ) ᱢᱤᱫ ᱜᱟᱨᱡᱚᱱ ᱡᱩᱫᱤ ᱠᱩᱞᱤ ᱚᱪᱚᱜᱤᱡ ᱩᱭᱦᱟᱹᱨ ᱛᱮ ᱟᱨ ᱦᱚᱲᱢᱚ ᱛᱮ ᱚᱠᱚᱰᱟ ᱜᱮᱭᱟ +ᱚᱞᱟᱜ ᱜᱮ ᱞᱟᱹᱠᱛᱤ +ᱵᱷᱤᱰᱤᱭᱚ/ᱯᱷᱚᱴᱚ ᱨᱮ ᱞᱟᱹᱞᱟᱹᱭ ᱤᱡ ᱢᱮᱫᱦᱟᱶ ᱵᱟᱭ ᱫᱮᱠᱷᱟᱣ ᱮᱫᱟ ᱟᱨ ᱵᱟᱝᱠᱷᱟᱱ ᱧᱩᱛᱩᱢ, +ᱵᱩᱴᱟᱹ, ᱡᱟᱭᱜᱟ ᱟᱨ ᱦᱚᱲ ᱵᱟᱵᱚᱛ ᱛᱮ ᱞᱟᱹᱭ ᱥᱚᱫᱚᱨ ᱮᱫ ᱠᱷᱟᱱᱨᱮᱵᱮᱱ ᱥᱟᱠᱟᱢ ᱵᱟᱝ +ᱞᱟᱹᱠᱛᱤᱭᱟᱡᱩᱫᱤ ᱨᱮᱠᱚᱰᱤᱝ ᱫᱷᱚᱨᱚᱢ, ᱞᱟᱠᱪᱟᱨ, ᱯᱩᱱᱟᱹᱭ ᱛᱷᱟᱱ, ᱵᱚᱝᱜᱟ ᱵᱩᱨᱩ ᱵᱟᱵᱚᱛ ᱠᱟᱱ +ᱠᱷᱟᱱ ᱨᱚᱲ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱨᱮᱠᱚᱰ ᱫᱚᱦᱚ ᱱᱟᱯᱟᱭᱟ ᱾ +ᱪᱮᱛᱟᱱ ᱨᱮ ᱚᱞ ᱟᱠᱟᱱ ᱞᱮᱠᱟ ᱟᱨᱦᱚᱸ ᱟᱹᱰᱤ ᱞᱮᱠᱟᱱ ᱯᱚᱨᱤᱥᱛᱷᱤᱛᱤ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ᱐ᱟ ᱾ +ᱟᱨᱦᱚᱸ ᱢᱤᱢᱤᱫ ᱚᱠᱛᱚ ᱫᱚ ᱢᱟᱬᱟᱝ ᱨᱮ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱧᱟᱢ ᱵᱟᱝ ᱥᱚᱢᱵᱷᱚᱵᱚᱜ-ᱟ ᱾ ᱱᱚᱝᱠᱟᱱ +ᱚᱠᱛᱚ ᱨᱮᱫᱚ ᱨᱮᱠᱚᱰᱤᱝ ᱩᱠᱩ ᱨᱮ ᱫᱚᱦᱚ ᱦᱟᱱᱛᱟᱲ ᱞᱟᱹᱠᱛᱤ ᱟᱨ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱞᱚᱜᱚᱱ ᱟᱹᱜᱩᱭ +ᱞᱟᱹᱠᱛᱤ ᱾ ᱟᱨ ᱡᱩᱫᱤ ᱞᱟᱹᱠᱛᱤ ᱠᱷᱟᱱ ᱫᱚ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱧᱟᱢ ᱵᱤᱞᱚᱢ ᱨᱮᱭᱟᱜ ᱠᱟᱨᱚᱱ ᱵᱚᱵᱚᱛ +ᱦᱚᱸ ᱦᱚᱲ ᱠᱚ ᱵᱟᱰᱟᱭ ᱚᱪᱚ ᱠᱚ ᱞᱟᱹᱠᱛᱤ ᱾ ᱡᱩᱫᱤ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱵᱟᱝ ᱧᱟᱢ ᱟᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ +ᱱᱚᱶᱟ ᱨᱮᱠᱚᱰᱤᱝ ᱵᱟᱝ ᱵᱮᱣᱦᱟᱨ ᱦᱟᱱᱛᱟᱲ ᱞᱟᱹᱠᱛᱤ ᱾ ᱚᱱᱟ ᱵᱚᱫᱚᱞ ᱛᱮ ᱨᱮᱠᱚᱰᱤᱝ ᱫᱚ ᱰᱤᱞᱤᱴ +ᱠᱟᱜ ᱞᱟᱹᱠᱛᱤ ᱾ ᱡᱩᱫᱤ ᱨᱮᱠᱚᱰᱤᱝ ᱫᱚ ᱨᱚᱲ ᱛᱮᱭᱟᱜ ᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ ᱡᱟᱦᱟᱸᱭ ᱮ ᱨᱚᱲ ᱟᱠᱟᱫᱟ +ᱩᱱᱤ ᱵᱟᱵᱚᱛ ᱡᱚᱛᱚᱣᱟᱜ ᱨᱮᱠᱚᱰ ᱫᱚᱦᱚᱭ ᱞᱟᱹᱠᱛᱤ ᱾ ᱱᱟᱦᱟᱜ ᱡᱩᱜᱽ ᱨᱮᱭᱟᱜ ᱴᱩᱞ ᱚᱝᱥᱟᱨ ᱦᱚᱲ +ᱵᱟᱵᱚᱛ ᱵᱟᱹᱲᱛᱤ ᱵᱟᱰᱟᱭ ᱫᱚ ᱟᱞᱜᱟ ᱜᱮᱭᱟ ᱾ ᱚᱱᱟᱛᱮ ᱠᱮᱴᱮᱡ ᱥᱟᱹᱦᱤᱡ ᱨᱚᱲᱚᱜ ᱠᱟᱱᱟ ᱡᱮ +ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱵᱮᱜᱚᱨ ᱫᱚ ᱠᱚᱱᱴᱮᱱᱴ ᱵᱟᱝ ᱯᱟᱨᱥᱟᱞ ᱞᱟᱹᱠᱛᱤ ᱾ +ᱱᱚᱰᱮ ᱵᱟᱰᱟᱭ ᱠᱟᱜ ᱞᱟᱹᱠᱛᱤ ᱡᱮ ᱦᱮᱸᱥᱤᱠᱟᱹᱨ ᱫᱚ ᱠᱷᱟᱹᱞᱤ ᱟᱹᱭᱤᱱ ᱨᱮᱭᱟᱜ ᱠᱟᱛᱷᱟ ᱫᱚ ᱵᱟᱝ +ᱠᱟᱱᱟ ᱵᱚᱨᱚᱢ ᱥᱟᱶᱛᱟ ᱨᱮᱭᱟᱜ, ᱱᱤᱛᱤ ᱨᱮᱭᱟᱜ ᱦᱚᱸ ᱠᱟᱱᱟ ᱾ ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱮᱜᱽᱨᱤᱢᱮᱱᱴ ᱫᱚ +ᱟᱹᱰᱤ ᱥᱚᱱᱛᱚᱨ ᱛᱮ ᱜᱟᱞᱢᱟᱨᱟᱣ ᱟᱛᱮ ᱠᱚᱨᱟᱣ ᱞᱟᱹᱠᱛᱤ ᱾ +ᱨᱟᱭᱤᱴᱥ: ᱠᱚᱯᱤᱨᱟᱭᱤᱴ, ᱢᱚᱨᱟᱞ ᱨᱟᱭᱤᱴ ᱟᱨ ᱮᱟᱴᱜ ᱚᱣᱱᱟᱨᱥᱤᱯ ᱨᱟᱭᱤᱴᱥ ᱠᱚ +ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱫᱚ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ ᱢᱤᱫ ᱥᱟᱛᱟᱢ ᱨᱮᱱᱟᱜ ᱟᱹᱭᱤᱱᱟᱱ ᱢᱟᱹᱞᱤᱠᱟᱱᱟ ᱾ ᱱᱚᱣᱟ ᱫᱚ +ᱡᱟᱦᱟᱱ ᱠᱟᱹᱢᱤ ᱨᱮᱱᱟᱜ ᱟᱹᱭᱤᱱ ᱟᱱ ᱫᱟᱲᱮ ᱮᱢᱚᱜᱼᱟᱭ ᱡᱮᱢᱚᱱ ᱚᱱᱟ ᱠᱟᱹᱢᱤ ᱟᱨ ᱢᱤᱫ ᱦᱚᱲ ᱪᱮᱫ +ᱞᱮᱠᱟᱭ ᱵᱮᱵᱷᱟᱨᱼᱟ ᱚᱱᱟ ᱴᱷᱟᱹᱣᱠᱟᱹᱜᱼᱟ ᱾ ᱥᱟᱫᱷᱟ ᱛᱮ ᱢᱮᱱ ᱞᱮᱠᱷᱟᱱ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱫᱚ ᱢᱤᱫ +ᱥᱟᱛᱟᱢ ᱨᱮᱱᱟᱜ ᱵᱮᱼᱟᱹᱭᱤᱱ ᱵᱮᱵᱷᱟᱨ ᱮ ᱫᱩᱜᱼᱟ ᱾ ᱥᱟᱹᱥᱤ ᱢᱮᱱ ᱞᱮᱠᱷᱟᱱ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱫᱚ +ᱟᱹᱰᱤ ᱜᱷᱟᱧᱟᱼᱜᱷᱟᱹᱨᱩᱣᱟᱹ ᱥᱟᱛᱟᱢ ᱠᱟᱱᱟ ᱾ ᱯᱟᱹᱨᱥᱤ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱨᱮ ᱰᱚᱠᱩᱢᱮᱱ ᱟᱠᱟᱱ +ᱥᱟᱛᱟᱢ ᱨᱮᱱᱟᱜ ᱢᱟᱹᱞᱤᱠᱟᱱᱟ ᱤᱫᱤᱭᱟᱛᱮ ᱞᱮᱛᱟᱲ ᱫᱚᱦᱟ ᱵᱚᱦᱟ ᱛᱟᱦᱮᱱᱼᱟ ᱾ ᱚᱱᱰᱮ ᱟᱹᱰᱤ ᱫᱷᱟᱯ +ᱨᱮᱱᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱛᱟᱦᱮᱱᱟ ᱾ ᱱᱚᱭᱛᱤᱠ ᱟᱹᱭᱫᱟᱹᱨ ᱟᱨ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱤᱫᱤᱭᱟᱛᱮ ᱞᱮᱛᱟᱲ ᱜᱮ +ᱜᱟᱞᱚᱪ ᱪᱟᱞᱟᱜᱼᱟ ᱾ ᱱᱚᱭᱛᱤᱠ ᱟᱹᱭᱫᱟᱹᱨ ᱫᱚ ᱡᱟᱦᱟᱸᱭ ᱥᱟᱛᱟᱢ ᱮ ᱥᱟᱯᱲᱟᱣ ᱟᱠᱟᱫᱼᱟ ᱩᱱᱤᱭᱟᱜ +ᱟᱹᱭᱫᱟᱹᱨ ᱠᱟᱱᱟ ᱾ +ᱜᱷᱚᱴᱚᱱ ᱯᱟᱲᱦᱟᱣ: ᱠᱳᱞᱳᱢᱵᱤᱭᱟ ᱨᱮ ᱦᱚᱲ ᱥᱮᱨᱮᱧ ᱨᱮᱠᱚᱰᱽ +ᱢᱤᱫ ᱠᱟᱹᱢᱤ ᱪᱮᱛᱟᱱᱨᱮᱱᱟᱜ ᱟᱹᱭᱫᱟᱹᱨᱤ ᱵᱩᱡᱷᱟᱹᱣ ᱞᱟᱹᱜᱤᱫ ᱠᱳᱞᱳᱢᱵᱤᱭᱟ ᱨᱮᱱᱟᱜ ᱢᱤᱫ +ᱫᱟᱹᱭᱠᱟᱹ ᱵᱚᱱ ᱧᱮᱞᱼᱟ ᱾ ᱢᱤᱫ ᱡᱩᱣᱟᱹᱱ ᱠᱚᱲᱟ ᱟᱡ ᱵᱚᱸᱜᱟ ᱛᱟᱞᱟ ᱟᱠᱟᱱᱟ ᱵᱟᱵᱟ ᱦᱟᱜ +ᱨᱮᱠᱚᱰᱽ ᱟᱠᱟᱱ ᱥᱮᱨᱮᱧ ᱠᱮᱥᱮᱴ ᱮ ᱧᱟᱢ ᱠᱮᱫᱼᱟ ᱾ ᱨᱮᱠᱚᱰᱤᱝ ᱫᱚ ᱢᱤᱫ ᱭᱩᱨᱳᱯ ᱨᱤᱱᱤᱡ +ᱠᱚᱸᱫᱨᱚᱸᱫᱤᱭᱟᱹ ᱨᱮᱠᱚᱰᱤᱝ ᱞᱮᱫᱼᱟ ᱾ ᱥᱮᱨᱮᱧ ᱫᱚ ᱚᱱᱟ ᱥᱩᱯᱩᱨ ᱨᱤᱱ ᱜᱩᱴ ᱦᱚᱲ ᱦᱚᱸᱠᱚ +ᱵᱟᱰᱟᱭ ᱛᱟᱦᱮᱸᱫ ᱾ ᱩᱱᱤ ᱠᱚᱲᱟ ᱚᱱᱟ ᱴᱮᱯ ᱮ ᱧᱟᱢ ᱠᱮᱫ ᱛᱟᱭᱚᱢ ᱚᱱᱟ ᱥᱮᱨᱮᱧ ᱨᱮᱱᱟᱜ +ᱰᱤᱡᱤᱴᱟᱞ ᱨᱩᱯ ᱮ ᱡᱩᱛ ᱠᱮᱫᱼᱟ ᱟᱨ ᱤᱱᱴᱚᱨᱱᱮᱴ ᱨᱮ ᱞᱟᱫᱮ ᱠᱮᱫᱼᱟ ᱾ +ᱚᱱᱟ ᱧᱮᱞ ᱛᱮ ᱟᱠᱚ ᱚᱲᱟᱜ ᱦᱚᱲ ᱠᱚ ᱮᱫᱽᱨᱚ ᱮᱱᱟ ᱾ ᱱᱚᱰᱮ ᱱᱚᱣᱟᱨᱮ ᱯᱩᱱ ᱞᱮᱠᱟᱱᱟᱜ +ᱢᱟᱹᱞᱤᱠᱟᱱᱟ ᱢᱮᱱᱟᱜᱼᱟ +ᱚ) ᱱᱚᱭᱛᱤᱠ ᱟᱹᱭᱫᱟᱹᱨ ᱡᱟᱦᱟᱸ ᱜᱩᱴ ᱨᱤᱱ ᱦᱚᱲ ᱠᱚ ᱥᱮᱨᱮᱧ ᱵᱟᱲᱟᱮᱫᱟ ᱟᱨ ᱵᱚᱸᱜᱟ ᱛᱟᱞᱟ +ᱟᱠᱟᱱᱟ ᱵᱟᱵᱟ ( ᱥᱮᱨᱮᱧᱤᱭᱟ/ᱞᱟᱹᱞᱟᱹᱭᱤᱡ ᱡᱟᱦᱟᱸᱭ ᱯᱚᱨᱢᱟᱬ ᱮᱫᱟ ᱥᱮᱨᱮᱧ ᱢᱮᱱᱟᱜᱼᱟ +ᱢᱮᱱᱛᱮᱫ) +ᱛ) ᱨᱮᱠᱚᱰᱤᱝ ᱥᱩᱢᱩᱝ ᱨᱮᱭᱟᱜ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱫᱚ ᱠᱚᱸᱫᱽᱨᱚᱸᱫᱤᱭᱟᱹ ᱴᱷᱮᱫ ᱛᱟᱦᱮᱱᱟ ᱡᱩᱫᱤ ᱟᱡ +ᱟᱡᱟᱜ ᱠᱟᱹᱣᱰᱤ ᱛᱮ ᱨᱮᱠᱚᱰ ᱟᱠᱟᱫᱟᱭ, ᱟᱨ ᱵᱟᱝ ᱠᱷᱟᱱ ᱵᱚᱸᱜᱟ ᱛᱟᱞᱟᱟᱠᱟᱱ ᱵᱟᱵᱟ ( ᱡᱩᱫᱤ +ᱨᱮᱠᱚᱰᱤᱝ ᱵᱟᱠᱷᱨᱟ ᱠᱟᱹᱣᱰᱤ ᱮᱢ ᱟᱠᱟᱫᱟᱭ ), ᱟᱨ ᱵᱟᱝᱠᱷᱟᱱ ᱚᱱᱟ ᱯᱨᱚᱛᱤᱥᱴᱷᱟᱱ ᱡᱟᱦᱟᱸᱭ +ᱠᱚᱸᱫᱨᱚᱸᱫᱤᱭᱟᱭᱹ ᱵᱟᱦᱟᱞ ᱟᱠᱟᱫᱮᱭᱟ ᱾ +ᱜ) ᱧᱟᱢ ᱟᱠᱟᱱ ᱨᱮᱠᱚᱰᱤᱝ (ᱠᱮᱥᱮᱴ ᱴᱮᱯ) ᱨᱤᱱᱤᱡ ᱢᱟᱹᱞᱤᱠ ᱫᱚ ᱡᱩᱣᱟᱹᱱ ᱠᱚᱲᱟ ᱟᱨ ᱟᱡ +ᱵᱟᱵᱟ ᱨᱤᱱ ᱡᱟᱦᱟᱸᱭ ᱵᱚᱭᱦᱟ ᱵᱚᱸᱥᱚ ᱠᱚ ᱢᱮᱱᱟᱜ ᱠᱚ ᱠᱷᱟᱱ ᱾ +ᱪᱮᱛᱟᱱ ᱨᱮᱱᱟᱜ ᱜᱷᱚᱴᱚᱱ ᱨᱮ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱫᱚ ᱵᱟᱝ ᱵᱟᱰᱟᱭᱚᱜ ᱠᱟᱱᱟ ᱾ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱫᱟᱹᱵᱤ +ᱞᱟᱹᱜᱤᱫ ᱟᱨ ᱚᱱᱟ ᱯᱚᱨᱢᱟᱬ ᱞᱟᱹᱜᱤᱫ ᱟᱨ ᱦᱚᱸ ᱛᱚᱫᱚᱱᱛᱚ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ ᱾ +ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱫᱚ ᱡᱟᱦᱟᱱᱭ ᱡᱟᱦᱟᱱᱟᱜ ᱯᱩᱭᱞᱩᱭ ᱵᱮᱱᱟᱣᱠᱟᱜᱟᱭ ᱩᱱᱤᱭᱟᱜ ᱡᱤᱭᱚᱱᱵᱷᱩᱨ +ᱛᱟᱦᱮᱱᱟ, ᱟᱨ ᱛᱤᱱᱟᱝᱜᱟᱱ ᱨᱮ ᱜᱚᱡ ᱮᱱ ᱛᱟᱭᱚᱢ ᱦᱚᱸ ᱛᱟᱦᱮᱱ ᱜᱮᱭᱟ ᱾ ᱚᱱᱟ ᱛᱟᱭᱚᱢ, +ᱫᱤᱥᱩᱣᱟᱹ ᱪᱷᱟᱢᱰᱟᱨᱮ ᱚᱱᱟ ᱠᱟᱹᱢᱤ ᱪᱟᱞᱟᱜᱼᱟ ᱾ ᱵᱷᱮᱜᱟᱨ ᱵᱷᱮᱜᱟᱨ ᱫᱤᱥᱚᱢ ᱨᱮ ᱵᱷᱮᱜᱟᱨ +ᱵᱷᱮᱜᱟᱨ ᱮᱞ ᱥᱮᱨᱢᱟ ᱫᱷᱟᱹᱵᱤᱡ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱛᱟᱦᱮᱱᱟ ( ᱱᱚᱰᱮ ᱛᱟᱹᱞᱠᱟᱹ ᱧᱮᱞ ᱢᱮ ) ᱾ +ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱞᱟᱹᱜᱤᱫ ᱨᱮᱡᱤᱥᱴᱨᱮᱥᱚᱱ ᱫᱚ ᱵᱟᱝ ᱞᱟᱹᱠᱛᱤ ᱠᱟᱱᱟ ᱾ ᱡᱟᱦᱟᱱ ᱠᱟᱹᱢᱤ ᱡᱟᱦᱟᱸᱭ +ᱵᱮᱱᱟᱣᱼᱮ ᱮᱛᱚᱦᱚᱵ ᱤᱫᱤᱭᱟ ᱟᱡ ᱟᱡ ᱛᱮᱜᱮ ᱚᱱᱟ ᱫᱚ ᱟᱡᱟᱜ ᱠᱳᱯᱤ ᱨᱟᱭᱤᱴ ᱛᱟᱦᱮᱱᱟ ᱾ "" +ᱪᱤᱱᱷᱟᱹ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱟᱠᱟᱱ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ ᱵᱮᱵᱷᱟᱨᱚᱜᱼᱟ ᱾ +ᱢᱤᱫ ᱟᱹᱭᱤᱱᱼᱟᱱ ᱪᱩᱠᱛᱤ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱨᱤᱱᱤᱡ ᱠᱤᱥᱟᱹᱬ ᱫᱚᱭ ᱚᱠᱚᱭ ᱠᱟᱱᱟ ᱢᱮᱱᱛᱮᱫᱼᱮ +ᱴᱷᱟᱹᱣᱠᱟᱭᱟᱭ᱾ ᱥᱟᱫᱷᱟ ᱥᱤᱫᱷᱟᱹ ᱛᱮ ᱺ ᱢᱤᱫ ᱥᱚᱝᱜᱚᱴᱷᱚᱱ ᱨᱮ ᱠᱟᱹᱢᱤᱭᱮᱫ ᱪᱟᱹᱠᱨᱤᱭᱟᱹ ᱟᱡ +ᱮᱛᱚᱦᱚᱵ ᱟᱠᱟᱫ ᱢᱤᱫ ᱢᱩᱲᱩᱛ ᱠᱟᱹᱢᱤ ᱥᱟᱹᱛ ᱠᱮᱫᱟᱭ ᱮᱱᱠᱷᱟᱱ ᱟᱡᱟᱜ ᱠᱟᱹᱢᱤ ᱛᱮ ᱡᱟᱦᱟᱸ ᱩᱰᱩᱠ +ᱮᱱᱟ ᱚᱱᱟ ᱪᱮᱛᱟᱱ ᱨᱮ ᱪᱟᱹᱠᱨᱤᱭᱟᱹ ᱦᱟᱜ ᱱᱚᱭᱛᱤᱠ ᱦᱚᱠ ᱛᱟᱸᱦᱮᱱᱟ ᱤᱠᱷᱟᱹᱱ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱫᱚ +ᱪᱟᱹᱠᱨᱤ ᱮᱢᱚᱜᱤᱡ ᱴᱷᱮᱫ ᱛᱟᱦᱮᱱᱟ ᱾ ᱡᱮᱛᱮ ᱞᱮᱠᱟᱱ ᱥᱚᱸᱜᱚᱴᱷᱚᱱ ᱟᱠᱚᱨᱤᱱ ᱠᱟᱹᱢᱤᱭᱟᱹ ᱠᱚ +ᱥᱟᱶ ᱢᱤᱫ ᱥᱟᱢᱮᱞᱟᱭ ᱪᱩᱠᱛᱤ ᱠᱚ ᱥᱟᱯᱲᱟᱣ ᱠᱟᱜᱼᱟ ᱡᱟᱦᱟᱸᱛᱮ ᱛᱟᱭᱚᱢ ᱫᱟᱨᱟᱢ ᱩᱱᱠᱩ ᱛᱩᱞᱩᱡ +ᱡᱟᱦᱟᱸ ᱜᱮ ᱠᱟᱹᱢᱤᱼᱟ ᱚᱱᱟ ᱨᱮᱱᱟᱜ ᱟᱹᱭᱫᱟᱹᱨ ᱥᱚᱸᱜᱚᱴᱷᱚᱱ ᱴᱲᱷᱮᱫ ᱛᱟᱦᱮᱱᱟ ᱺ ᱚᱱᱟ ᱞᱮᱠᱟ +ᱠᱚᱢᱤᱥᱚᱱ ᱟᱠᱟᱱ ᱠᱟᱹᱢᱤ ᱡᱟᱦᱟᱸᱭ ᱦᱚᱲ/ᱥᱚᱝᱜᱚᱴᱷᱚᱱ ᱚᱱᱟ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ ᱠᱚᱢᱤᱥᱚᱱ ᱮ ᱮᱢ +ᱟᱠᱟᱫᱼᱟ ᱩᱱᱤ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱠᱟᱜᱼᱟᱭ ᱾ +ᱳᱨᱤᱡᱤᱱᱟᱞᱤᱴᱤ ᱟᱨ ᱵᱟᱝ ᱢᱩᱲᱩᱛᱟᱱ ᱫᱚ ᱵᱟᱨ ᱥᱤᱢᱟᱹ ᱛᱟᱞᱟ ᱴᱷᱟᱶ ᱨᱮᱱᱟᱜ ᱠᱟᱛᱷᱟ ᱠᱟᱱᱟ ᱾ +ᱢᱤᱫ ᱡᱟᱭᱜᱟ ᱨᱮᱱᱟᱜ ᱪᱤᱛᱟᱹᱨ ᱛᱩᱞᱟᱹᱣ ᱫᱚ " ᱢᱩᱲᱩᱛ ᱠᱟᱹᱢᱤ " ᱦᱩᱭᱩᱜᱼᱟ ᱚᱱᱟ ᱠᱷᱟᱹᱛᱤᱨ +ᱚᱱᱟ ᱫᱚ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱮᱱᱟ ᱤᱠᱷᱟᱹᱱ ᱢᱤᱫ ᱦᱚᱲ ᱪᱤᱛᱟᱹᱨ ᱵᱮᱱᱟᱣ ᱟᱠᱟᱫᱟ ᱟᱨ ᱚᱱᱟ ᱨᱮᱱᱟᱜ +ᱪᱤᱛᱟᱹᱨ ᱟᱨ ᱢᱤᱫ ᱦᱚᱲ ᱮ ᱛᱩᱞᱟᱹᱣ ᱠᱮᱫᱟ ᱫᱚᱥᱟᱨ ᱦᱚᱲᱼᱟ ᱚᱱᱟ ᱫᱚ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱵᱟᱭ ᱦᱩᱭ +ᱫᱟᱮ ᱭᱟᱜᱼᱟ ᱾ ᱯᱟᱹᱨᱥᱤ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱨᱮ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱪᱮᱫ ᱞᱮᱠᱟ ᱦᱩᱭᱩᱜᱼᱟ ᱚᱱᱟ +ᱨᱮᱱᱟᱜ ᱫᱟᱹᱭᱠᱟᱹ ᱞᱟᱛᱟᱨᱮᱵᱚᱱ ᱧᱮᱞᱼᱟ ᱺ +ᱥᱟᱛᱟᱢᱢᱟᱹᱞᱤᱠ (ᱵᱟᱱᱟᱨ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱟᱨ ᱱᱚᱭᱛᱤᱠ ᱟᱹᱭᱫᱟᱹᱨ) +ᱢᱤᱫ ᱦᱚᱲ ᱦᱚᱲᱼᱥᱮᱨᱮᱧ ᱨᱮᱱᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ/ᱚᱰᱤᱭᱳ ᱨᱮᱠᱚᱰᱤᱝᱥᱟᱸᱜᱮ ᱢᱟᱹᱞᱤᱠ: +) ᱡᱩᱫᱤ ᱥᱮᱨᱮᱧ ᱨᱮᱱᱟᱜ ᱢᱩᱲᱩᱛ ᱚᱱᱚᱞᱤᱭᱟᱹ ᱵᱟᱝ ᱵᱟᱰᱟᱭ ᱟᱠᱟᱱᱟ ᱮᱱᱠᱷᱟᱱ ᱥᱮᱨᱮᱧ ᱨᱮᱱᱟᱜ +ᱠᱳᱯᱤᱨᱟᱭᱩᱴ ᱫᱚ ᱫᱤᱥᱩᱣᱟᱹ ᱰᱳᱢᱮᱱ ᱛᱨᱮᱱᱟᱜ ᱠᱟᱱᱟ ᱢᱮᱱᱛᱮᱫ ᱵᱩᱡᱷᱟᱹᱣᱼᱟ/ +) ᱞᱟᱹᱞᱟᱹᱭᱤᱡ ᱟᱨ ᱵᱟᱝ ᱥᱮᱨᱮᱧᱤᱡᱼᱟ ᱱᱚᱭᱛᱤᱠ ᱟᱹᱭᱫᱟᱹᱨ ᱛᱟᱦᱮᱱᱟ +) (ᱵᱟᱝ ᱠᱳᱢᱤᱥᱚᱱ ᱟᱠᱟᱱ ᱠᱟᱹᱢᱤᱨᱮ) ᱮᱠᱟᱞ ᱨᱮᱠᱚᱫᱤᱝ ᱨᱮᱱᱟᱜ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱫᱚ ᱨᱟᱠᱷᱟ +ᱫᱚᱦᱚᱭᱤᱡ ᱴᱷᱮᱫ ᱛᱟᱦᱮᱱᱟ ᱟᱨ ᱵᱟᱝ ᱩᱱᱤ ᱦᱚᱲ /ᱵᱟᱝ ᱚᱱᱟ ᱥᱚᱸᱜᱚᱴᱷᱚᱱ ᱡᱟᱦᱟᱸᱭ ᱠᱚᱢᱤᱥᱚ ᱮ +ᱮᱢ ᱟᱠᱟᱫᱟ ᱩᱱᱤᱴᱷᱮᱫ ᱛᱟᱦᱮᱱᱟ +ᱞᱟᱠᱪᱟᱨ ᱟᱨ ᱵᱟᱝ ᱥᱟᱶᱛᱟ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱨᱮᱱᱟᱜ ᱵᱷᱤᱰᱤᱭᱳ/ᱚᱰᱤᱭᱳ ᱨᱮᱠᱚᱰᱤᱝ) ᱚᱱᱟ +ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱨᱮ ᱥᱮᱞᱮᱫ ᱟᱠᱟᱱ ᱦᱚᱲ ᱟᱨ/ᱟᱨ ᱵᱟᱝ ᱥᱮᱬᱟ ᱜᱩᱴᱼᱟ ᱱᱚᱭᱛᱤᱠ ᱟᱹᱭᱰᱟᱹᱨ +ᱢᱮᱱᱟᱜᱼᱟ +) ᱱᱚᱼᱱᱚᱞᱤᱭᱟᱹ , ᱠᱟᱹᱣᱰᱤ ᱥᱚᱦᱚᱫ ᱦᱚᱲ/ᱥᱚᱝᱜᱚᱴᱷᱚᱱ ᱡᱟᱦᱟᱸ ᱨᱮᱠᱚᱰᱤᱝ ᱨᱤᱱᱤᱡ ᱢᱟᱹᱞᱤᱠ +ᱥᱩᱢᱩᱝᱼᱟ ᱜᱮ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱛᱟᱦᱮᱱᱟ +ᱵᱟᱰᱚᱦᱤᱠᱟᱹᱢᱤ, ᱪᱤᱛᱟᱹᱨ ᱡᱩᱛ, ᱢᱩᱴᱷᱟᱹᱱᱵᱟᱰᱚᱦᱤᱠᱟᱹᱢᱤ ᱨᱤᱱᱤᱡ ᱢᱩᱲᱩᱛ ᱵᱟᱰᱚᱦᱤ +ᱚᱰᱤᱭᱳ ᱟᱨ ᱵᱟᱝ ᱵᱷᱤᱰᱤᱭᱳ ᱵᱮᱱᱟᱣᱟ ᱡᱚᱦᱚᱜ ( ᱫᱟᱹᱭᱠᱟᱹ ᱞᱮᱠᱟᱛᱮ ᱵᱮᱣᱨᱟ ᱥᱟᱠᱟᱢ ᱨᱮᱱᱟᱜ +ᱜᱮᱫ, ᱥᱴᱚᱠ ᱪᱤᱛᱟᱹᱨᱹ ᱚᱰᱤᱭᱳ ᱟᱨ ᱵᱟᱝ ᱵᱷᱤᱰᱤᱭᱳ ᱯᱷᱩᱴᱮᱡ) ᱜᱚᱲᱚ ᱥᱟᱢᱟᱱ ᱞᱮᱠᱟ ᱛᱮ +ᱵᱮᱵᱷᱟᱨᱚᱜᱼᱟ ᱾ ᱵᱮᱯᱟᱨ ᱱᱟᱯᱤᱛ ᱛᱮ ᱱᱚᱣᱟ ᱠᱚᱢ ᱵᱮᱵᱷᱟᱨ ᱠᱷᱟᱱ ᱚᱱᱟ ᱠᱚᱨᱮᱱᱟ ᱢᱟᱹᱞᱤᱠ +ᱴᱷᱮᱫ ᱠᱷᱚᱱ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱨᱮᱱᱟᱜ ᱟᱹᱭᱫᱟᱹᱨ ᱠᱚᱭ ᱦᱩᱭᱩᱜᱼᱟ ᱾ᱱᱚᱝᱠᱟᱱᱟᱜ ᱟᱹᱰᱤᱜᱟᱱ ᱠᱟᱹᱢᱤ +(ᱭᱩᱱᱟᱭᱴᱮᱰ ᱥᱴᱮᱴᱥ ᱨᱮ ) ᱮᱴᱟᱜ ᱦᱚᱲ ᱛᱩᱞᱩᱡ "ᱱᱟᱯᱟᱭ ᱵᱮᱵᱷᱟᱨ" ᱛᱟᱹᱨᱤ ᱨᱮ ᱟᱨ (ᱮᱴᱟᱜ +ᱫᱤᱥᱚᱢ) ᱠᱚᱨᱮ ᱫᱚ "ᱱᱟᱯᱟᱭ ᱠᱟᱨᱵᱟᱨ" ᱛᱟᱹᱨᱤ ᱨᱮ ᱠᱳᱯᱤ ᱨᱟᱭᱤᱴ ᱟᱹᱭᱫᱟᱹᱨ ᱦᱟᱛᱟᱣ ᱟᱠᱟᱱᱟ +᱾ ᱡᱚᱠᱷᱚᱱ ᱱᱚᱣᱟ ᱵᱟᱱᱟᱨ ᱯᱟᱦᱴᱟ ᱨᱮᱱᱟᱜ ᱥᱤᱢᱟᱹ ᱛᱟᱞᱟ ᱥᱟᱛᱟᱢ ᱠᱟᱱᱟ ᱚᱱᱟᱛᱮ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ +ᱵᱷᱟᱱᱜᱚᱲ ᱨᱮᱱᱟᱜ ᱵᱚᱛᱚᱨ ᱛᱟᱦᱮᱱᱟ᱾ +ᱱᱚᱰᱮ ᱠᱳᱯᱤᱨᱟᱭᱤᱴ ᱨᱮᱱᱟᱜ ᱯᱷᱟᱹᱨᱪᱟᱹ ᱫᱷᱟᱨᱟ ᱱᱚᱢᱩᱱᱟ ᱫᱚᱦᱚᱭᱮᱱᱟ ᱾ ᱢᱤᱫᱴᱟᱝ ᱯᱟᱹᱨᱥᱤ +ᱨᱮ ᱚᱰᱤᱭᱳ/ᱵᱷᱤᱰᱤᱭᱳ ᱨᱮᱠᱚᱰᱤᱝ ᱡᱚᱦᱚᱜ ᱚᱱᱟ ᱠᱟᱹᱢᱤ ᱵᱮᱵᱷᱟᱨ ᱟᱨ ᱵᱟᱝ ᱦᱟᱹᱴᱤᱧ ᱞᱟᱹᱜᱤᱫ +ᱚᱞ ᱟᱛᱮ (ᱟᱨ ᱵᱟᱝ ᱨᱚᱲ ᱟᱛᱮ ᱵᱷᱤᱰᱤᱭᱳ ᱟᱛᱮᱫ ᱠᱷᱟᱱ ᱱᱟᱯᱟᱭᱚᱜᱼᱟ ) ᱟᱹᱭᱫᱟᱹᱨᱤ ᱠᱚᱭ +ᱦᱩᱭᱩᱜᱼᱟ ᱾ᱫᱤᱥ ᱦᱩᱫᱤᱥ ᱞᱮᱠᱟᱛᱮ ᱚᱱᱟ ᱯᱷᱚᱨᱚᱢ ᱨᱮ ᱠᱨᱤᱭᱮᱴᱤᱵ ᱠᱳᱢᱚᱱᱥ +ᱟᱴᱨᱤᱵᱩᱥᱚᱱᱼᱥᱮᱭᱟᱨ ᱞᱟᱭᱤᱠ ᱔ᱹ᱐ ᱤᱱᱴᱚᱨᱱᱮᱥᱚᱱᱟᱞ (-- 4.0) ᱞᱟᱭᱥᱮᱱᱥ ᱥᱮᱞᱮᱫ ᱟᱠᱟᱱᱟ +᱾ᱤᱠᱷᱟᱹᱱ ᱟᱢᱟᱜ ᱴᱷᱟᱹᱣᱠᱟᱹ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ ᱴᱷᱟᱹᱣᱠᱟᱹ ᱞᱟᱭᱥᱮᱱᱥ ᱮᱢ ᱵᱮᱵᱷᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ +ᱼᱟ ᱡᱟᱦᱟᱸ ᱚᱱᱟ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ ᱞᱟᱜᱟᱣᱼᱟ ᱾ ᱫᱟᱨᱟ ᱦᱟᱹᱴᱤᱧ ᱨᱮ "ᱳᱯᱮᱱ" /ᱠᱷᱩᱞᱟᱹ ( +ᱡᱟᱦᱟᱸ ᱨᱮᱱᱟᱜ ᱢᱮᱱᱮᱛ ᱚᱥᱟᱨ ᱟᱨ ᱨᱟᱲᱟ ᱫᱷᱟᱨᱟ ᱵᱮᱣᱨᱟ ᱦᱟᱹᱴᱤᱧ ᱨᱮᱱᱟᱜ ᱫᱟᱣ ᱮ ᱮᱢᱚᱜᱼᱟ ) +ᱞᱟᱭᱥᱮᱱᱥᱠᱚ ᱤᱫᱤᱭᱟᱛᱮ ᱵᱟᱹᱲᱛᱤ ᱜᱟᱞᱚᱪ ᱟᱠᱟᱱᱟ ᱾ +ᱞᱟᱭᱥᱮᱱᱥᱤᱝ: ᱯᱟᱵᱽᱞᱤᱠ ᱞᱟᱭᱥᱮᱱᱥᱮᱥ ᱟᱨ ᱚᱯᱮᱱ ᱞᱟᱭᱥᱮᱱᱥ +ᱞᱟᱦᱟ ᱨᱮᱭᱟᱜ ᱦᱟᱹᱴᱤᱧ ᱨᱮ ᱟᱢᱮᱢ ᱯᱟᱲᱦᱟᱣ ᱠᱮᱫᱟ ᱡᱮ ᱪᱮᱫ ᱞᱮᱠᱟ ᱠᱚᱱᱴᱮᱱᱴ ᱠᱚ +ᱠᱚᱯᱤᱨᱟᱭᱤᱴ ᱥᱮᱡ ᱛᱮ ᱨᱩᱠᱷᱤᱭᱟᱹ ᱢᱮᱱᱟᱜ-ᱟ᱾ ᱟᱥᱚᱠᱟᱭ ᱛᱮ, ᱟᱢ ᱫᱚ ᱱᱚᱣᱟ ᱵᱮᱣᱦᱟᱨ ᱞᱟᱹᱜᱤᱫ +ᱢᱟᱲᱟᱝ ᱠᱩᱞᱤᱡᱚᱝ ᱦᱩᱭᱟᱢᱟ᱾ ᱯᱟᱹᱨᱥᱤ ᱠᱚᱫᱚ ᱟᱥᱚᱠᱟᱭᱛᱮ ᱱᱮ-ᱦᱚᱲ ᱵᱮᱣᱦᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱚᱞ ᱛᱚᱞ +ᱫᱚᱦᱚᱜ ᱠᱟᱱᱟ᱾ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱞᱟᱹᱠᱛᱤᱭᱟᱱ ᱠᱟᱛᱷᱟ ᱫᱚ ᱠᱟᱱᱟ, ᱱᱚᱝᱠᱟᱱ ᱚᱞ ᱛᱚᱞ ᱠᱚᱫᱚ ᱡᱚᱛᱚ +ᱜᱚᱜᱚ ᱯᱟᱹᱨᱥᱤ ᱨᱚᱲ ᱦᱚᱲ ᱞᱟᱹᱜᱤᱫ ᱥᱚᱨᱯᱷᱟ ᱜᱮ ᱫᱚᱦᱚ ᱟᱠᱟᱱᱟ᱾ ᱠᱮᱴᱮᱡ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ +ᱵᱟᱨᱚᱱ ᱛᱟᱦᱮᱸᱞᱮᱱᱠᱷᱟᱱ ᱚᱠᱟ ᱯᱟᱹᱨᱥᱤ ᱛᱮ ᱨᱤᱠᱚᱨᱰ ᱟᱠᱟᱱ ᱡᱤᱱᱤᱥ ᱠᱷᱩᱞᱟᱹ ᱟᱨ ᱢᱚᱥᱛᱮ +(ᱯᱷᱨᱤ) ᱛᱮ ᱵᱮᱣᱦᱟᱨ ᱨᱮᱭᱟᱜ ᱟᱝᱜᱚᱪ (ᱯᱟᱨᱢᱤᱥᱚᱱ) ᱵᱟᱝ ᱧᱟᱢᱚᱜ-ᱟ᱾ ᱡᱚᱛᱚ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ +ᱫᱚ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱡᱤᱱᱤᱥ ᱠᱚ ᱟᱹᱱ-ᱟᱹᱨᱤ ᱦᱚᱨᱟ ᱛᱮ ᱚᱠᱟ ᱞᱮᱠᱟ ᱵᱮᱣᱦᱟᱨ ᱦᱩᱭᱩᱜ-ᱟ ᱚᱱᱟ +ᱠᱟᱛᱷᱟ ᱫᱚ ᱵᱟᱠᱚ ᱵᱟᱰᱟᱭᱟ᱾ ᱱᱚᱝᱠᱟ ᱞᱮᱠᱟ, ᱡᱚᱛᱚ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱠᱚ (ᱜᱟᱭᱱᱟᱦᱟ, +ᱚᱱᱚᱞᱤᱭᱟᱹ, ᱱᱟᱪᱚᱱᱤᱭᱟᱹ ᱮᱢᱟᱱ) ᱦᱚᱸ ᱱᱚᱣᱟ ᱠᱟᱛᱷᱟ ᱵᱟᱠᱚ ᱵᱟᱰᱟᱭᱟ ᱡᱮ ᱩᱢᱠᱚᱣᱟᱜ ᱠᱟᱹᱢᱤ +ᱞᱟᱹᱜᱤᱫ ᱚᱠᱟᱴᱟᱜ ᱞᱟᱭᱥᱮᱱᱥ ᱠᱚ ᱵᱮᱣᱦᱟᱨᱟ ᱱᱚᱣᱟ ᱦᱚᱸ ᱵᱟᱠᱚ ᱵᱟᱰᱟᱭᱟ ᱡᱩᱫᱤ ᱠᱟᱹᱢᱤ +ᱩᱪᱷᱟᱹᱱ ᱚᱠᱛᱮ ᱨᱮ ᱚᱱᱟ ᱠᱷᱟᱥ ᱞᱟᱭᱥᱮᱱᱥ ᱵᱟᱝ ᱥᱚᱫᱚᱨ ᱞᱮᱱᱠᱷᱟᱱ, ᱛᱚᱵᱮ ᱟᱡ ᱛᱮᱜᱮ ᱠᱚᱯᱤ +ᱨᱟᱭᱤᱴᱚᱜ-ᱟ᱾ ᱱᱚᱝᱠᱟᱱ ᱥᱟᱛᱷᱟᱢ ᱨᱮᱫᱚ "ᱚᱞ ᱨᱟᱭᱤᱴ ᱨᱤᱡᱟᱨᱣᱮᱰ" ᱚᱞ ᱛᱟᱦᱮᱸᱱᱟ᱾ ᱮᱱᱨᱮ +ᱦᱚᱸ, ᱟᱫᱚᱢ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱯᱟᱹᱨᱥᱤ ᱚᱞ ᱛᱚᱞ ( ) ᱨᱮ ᱵᱷᱩᱞ ᱛᱮ ᱟᱭᱢᱟ ᱜᱚᱜᱚ ᱯᱟᱹᱨᱥᱤ +ᱨᱚᱨᱚᱲ ᱦᱚᱲ ᱟᱠᱚᱣᱟᱜ ᱠᱟᱹᱢᱤ ᱨᱮ ᱦᱟᱛᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱟᱭᱢᱟ ᱞᱮᱠᱟᱱ ᱮᱴᱠᱮᱴᱚᱬᱮ ᱠᱚ ᱥᱟᱢᱟᱝ +ᱫᱟᱯᱨᱟᱢ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ᱾ ᱱᱚᱝᱠᱟ ᱛᱮ ᱟᱫᱚᱢ ᱱᱟᱥᱮ ᱩᱛᱷᱱᱟᱹᱣ ᱯᱟᱹᱨᱥᱤ ᱦᱟᱨᱟ ᱵᱩᱨᱩᱜ ᱨᱮ +ᱡᱟᱝᱜᱮ ᱫᱟᱨᱟᱢᱚᱜ ᱠᱟᱱᱟ᱾ ᱚᱱᱟ ᱛᱮ, ᱡᱟᱸᱦᱟᱸ ᱛᱤᱱ ᱨᱮᱜᱮ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ, ᱟᱢ ᱫᱚ ᱠᱷᱩᱞᱟᱹ +ᱞᱟᱭᱥᱮᱱᱥ ᱵᱮᱣᱦᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱮᱢ ᱩᱥᱠᱩᱨ ᱚᱪᱚᱜ ᱠᱟᱱᱟ᱾ ᱢᱮᱱᱠᱷᱟᱱ ᱟᱫᱚᱢ ᱵᱟᱝ ᱠᱷᱩᱞᱟᱹ +ᱯᱟᱵᱽᱞᱤᱠ ᱞᱟᱭᱥᱮᱱᱥ ᱦᱚᱸ ᱢᱮᱱᱟᱜ-ᱟ᱾ ᱫᱮᱞᱟ ᱟᱫᱚ ᱯᱟᱹᱦᱤᱞ ᱨᱮ ᱟᱭᱢᱟ ᱞᱮᱠᱟᱱ ᱞᱟᱭᱥᱮᱱᱥ +ᱨᱮᱭᱟᱜ ᱩᱱᱩᱨᱩᱢ ᱵᱚᱱ ᱵᱟᱰᱟᱭ ᱠᱟᱜ ᱞᱮᱜᱮ᱾ +ᱯᱟᱵᱽᱞᱤᱠ ᱞᱟᱭᱥᱮᱱᱥᱮᱥ +ᱯᱟᱵᱽᱞᱤᱠ ᱞᱟᱭᱥᱮᱱᱥ ᱥᱮ ᱯᱟᱵᱽᱞᱤᱠ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱞᱟᱭᱥᱮᱱᱥ ᱫᱚ ᱱᱮ-ᱦᱚᱲ ᱞᱟᱹᱜᱤᱫ +ᱠᱟᱱᱟ᱾ᱱᱚᱝᱠᱟᱱ ᱞᱟᱭᱥᱮᱱᱥ ᱵᱮᱣᱦᱟᱨ ᱠᱟᱛᱮ, ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱫᱚ ᱡᱚᱛᱚ ᱦᱚᱲ ᱵᱮᱣᱦᱟᱨ +ᱞᱟᱹᱜᱤᱫ-ᱮ ᱟᱝᱜᱚᱪᱟᱠᱚ ( ) ᱠᱟᱱᱟ᱾ ᱚᱠᱟ ᱦᱚᱸ ᱟᱝᱜᱚᱪᱚᱜ ᱠᱷᱟᱥ ᱯᱟᱵᱽᱞᱤᱠ ᱞᱟᱭᱥᱮᱱᱥ (ᱟᱫᱚᱢ +ᱦᱚᱲ ᱠᱚ ᱥᱮ ᱟᱫᱚᱢ ᱜᱟᱶᱛᱟ ᱥᱮ ᱟᱫᱚᱢ ᱫᱤᱥᱚᱢ ᱨᱮ ᱱᱟᱜᱟᱨᱤᱭᱟᱹ ᱞᱟᱹᱜᱤᱫ) ᱫᱚ ᱵᱟᱝ +ᱢᱮᱱᱚᱜᱚᱜ-ᱟ᱾ ᱚᱯᱮᱱ ᱱᱚᱞᱮᱡᱽ ᱯᱷᱟᱣᱩᱱᱰᱮᱥᱚᱱ ( ) ᱫᱚ ᱜᱚᱲᱦᱚᱱᱟᱱ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ ᱚᱯᱮᱱ +ᱞᱟᱭᱥᱮᱱᱥ ᱵᱮᱣᱦᱟᱨᱚᱜ-ᱟ ᱠᱷᱩᱞᱟᱹ ᱩᱱᱩᱨᱩᱢ᱾ +ᱯᱷᱨᱤ/ᱚᱯᱮᱱ ᱞᱟᱭᱥᱮᱱᱥᱮᱥ +ᱱᱤᱭᱟᱹ ᱞᱟᱭᱥᱮᱱᱥ ᱠᱚ ᱫᱚ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱚᱯᱮᱱ ᱞᱟᱭᱥᱮᱱᱥ ( ) ᱢᱮᱱᱛᱮ ᱵᱟᱰᱟᱭᱚᱜ ᱠᱟᱱᱟ᱾ +ᱱᱤᱭᱟᱹ ᱫᱚ ᱨᱮᱭᱟᱜ ᱩᱢᱩᱞ ᱯᱟᱧᱡᱟ ᱦᱩᱭ ᱟᱠᱟᱱᱟ᱾ ᱱᱚᱝᱠᱟᱱ ᱞᱟᱭᱥᱮᱱᱥ ᱫᱚ ᱡᱚᱛᱚ ᱦᱚᱲ +ᱵᱮᱣᱦᱟᱨ, ᱟᱹᱨᱩ-ᱯᱷᱮᱨᱟᱣ, ᱦᱟᱯᱟᱴᱤᱧ ᱟᱨ ᱩᱛᱷᱱᱟᱹᱣ ᱞᱟᱹᱜᱤᱫ ᱟᱝᱜᱚᱪᱟᱠᱚ ᱜᱮᱭᱟ᱾ ᱡᱩᱫᱟᱹ +ᱡᱩᱫᱟᱹ ᱚᱯᱮᱱ ᱞᱟᱭᱥᱮᱱᱥ ᱞᱟᱹᱜᱤᱫ ᱯᱚᱱᱭᱟ ᱯᱷᱩᱨᱜᱟᱹᱞ ᱰᱤᱜᱽᱨᱤ ᱠᱚ ᱢᱮᱱᱟᱜ-ᱟ᱾ +ᱠᱨᱤᱭᱮᱴᱤᱵᱽ ᱠᱚᱢᱚᱱᱥ ᱞᱟᱭᱥᱮᱱᱥᱮ +ᱠᱨᱤᱭᱮᱴᱤᱵᱽ ᱠᱚᱢᱚᱱᱥ (ᱦᱩᱰᱤᱧ ᱛᱮ ᱥᱤᱹᱥᱤᱹ/ " ᱠᱚ ᱢᱮᱛᱟᱜ ᱠᱟᱱᱟ) ᱢᱮᱱᱛᱮ ᱵᱟᱰᱟᱭᱚᱜ ᱠᱟᱱ +ᱞᱟᱭᱥᱮᱱᱥ ᱠᱚ ᱨᱮᱱᱟᱜ ᱢᱤᱫᱴᱮᱱ ᱛᱷᱚᱠ ᱫᱚ ᱟᱥᱚᱠᱟᱭ ᱛᱮ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱥᱟᱶ ᱡᱚᱲᱟᱣ ᱠᱟᱹᱢᱤ +ᱠᱚ ᱨᱮ ᱵᱮᱣᱦᱟᱨᱚᱜ-ᱟ᱾ ᱥᱤᱹᱥᱤᱹ ᱞᱟᱭᱥᱮᱱᱥ ᱫᱚ ᱚᱱᱚᱞ, ᱪᱤᱛᱟᱹᱨ ᱥᱟᱶᱛᱮ ᱮᱴᱟᱜ ᱢᱟᱞᱴᱤ +ᱢᱤᱰᱤᱭᱟ ᱵᱟᱡᱟᱱ ᱠᱚ ᱡᱮᱞᱮᱠᱟ ᱳᱰᱤᱭᱚ ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱥᱮ ᱰᱮᱴᱟᱵᱮᱥ ᱦᱚᱸ ᱮᱢᱟᱱ ᱠᱚ ᱨᱮ ᱦᱚᱸ +ᱜᱟᱜ-ᱜᱟᱵᱟᱱᱚᱜ-ᱟ᱾ ᱧᱮᱞ ᱞᱮᱠᱷᱟᱡ ᱵᱚᱱ ᱯᱚᱱᱭᱟ ᱟᱥᱚᱞ ᱠᱨᱤᱭᱮᱴᱤᱵᱽ ᱠᱚᱢᱚᱱᱥ ᱠᱚ ᱢᱮᱱᱟᱜ-ᱟ᱾ +ᱞᱟᱛᱟ ᱨᱮᱭᱟᱜ ᱛᱟᱞᱤᱠᱟ ᱠᱷᱚᱱ ᱱᱤᱭᱟᱹ ᱞᱟᱭᱥᱮᱱᱥ ᱤᱫᱤ ᱠᱟᱛᱮ ᱵᱟᱹᱲᱛᱤ ᱯᱩᱥᱴᱟᱹᱣ ᱛᱮ ᱵᱚᱱ +ᱵᱟᱰᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ +ᱞᱟᱭᱥᱮᱱᱥ ᱞᱳᱜᱳ, ᱧᱩᱛᱩᱢ ᱟᱨ ᱦᱩᱰᱤᱧ ᱧᱩᱛᱩᱢᱪᱮᱫ ᱠᱚ ᱟᱝᱜᱚᱪ ᱜᱮᱭᱟᱪᱮᱫ ᱫᱚ ᱵᱟᱝ +ᱟᱝᱜᱚᱪᱟᱵᱟᱹᱱᱤᱡᱽ ᱵᱮᱣᱦᱟᱨ ᱨᱮ ᱟᱝᱜᱚᱪ +ᱥᱤᱹᱥᱤ-ᱡᱤᱨᱚ ᱥᱮ +ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱫᱚ ᱮᱴᱟᱜ ᱦᱚᱲ ᱠᱚ ᱵᱮᱱᱟᱣ ᱫᱚᱦᱲᱟ ᱟᱨ ᱮᱴᱟᱜ ᱵᱮᱵᱮᱱᱟᱣ ᱠᱟᱹᱢᱤ +ᱞᱟᱹᱜᱤᱫ-ᱮ ᱟᱝᱜᱚᱪ ᱟᱠᱚᱣᱟ᱾ +ᱢᱤᱫᱴᱮᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱟᱨᱦᱚᱸ ᱵᱤᱱᱟᱹ ᱜᱚᱱᱚᱝ ᱛᱮ ᱠᱟᱹᱣᱰᱤᱭᱮ ᱟᱨᱡᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ +ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱟᱥᱚᱞ ᱢᱟᱹᱞᱤᱠ ᱠᱨᱮᱰᱤᱴ ᱮᱢᱟᱭ ᱨᱮᱭᱟᱜ ᱞᱟᱹᱠᱛᱤ ᱵᱟᱹᱱᱩᱜ-ᱟ᱾ +ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱚᱝᱠᱟᱱ ᱢᱟᱱᱟ ᱵᱟᱨᱚᱱ ᱵᱟᱹᱱᱩᱜ-ᱟᱦᱮᱸ +ᱥᱤᱹᱥᱤᱹ ᱮᱴᱨᱤᱵᱤᱭᱩᱥᱚᱱ ᱥᱮ ᱥᱮ - +ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱮᱴᱟᱜ ᱦᱚᱲᱮ ᱱᱤᱭᱟᱹ ᱠᱚ ᱠᱟᱹᱢᱤ ᱨᱮ ᱟᱝᱜᱚᱪ ᱟᱠᱚᱣᱟ: +ᱠᱟᱹᱢᱤ ᱨᱮ ᱵᱮᱣᱦᱟᱨ +ᱦᱟᱯᱟᱴᱤᱧ ᱨᱮ +ᱦᱟᱨᱟ-ᱵᱩᱨᱩ ᱧᱚᱜ ᱥᱮ ᱵᱮᱱᱟᱣ ᱫᱚᱦᱲᱟ ᱥᱮ ᱵᱮᱱᱟᱣ ᱟᱹᱨᱩ ᱠᱟᱛᱮ ᱢᱚᱥᱛᱮ (ᱯᱷᱨᱤ) ᱥᱮ +ᱠᱟᱹᱣᱰᱤ ᱞᱟᱹᱜᱤᱫ-ᱮ ᱦᱟᱯᱟᱴᱤᱧ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ +ᱪᱮᱛᱟᱱ ᱨᱮᱭᱟᱜ ᱠᱟᱹᱢᱤ ᱠᱚ ᱨᱮ ᱟᱥᱚᱞ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱫᱚ ᱠᱨᱮᱰᱤᱴ ᱮᱢᱟᱭ ᱛᱮᱜᱮ +ᱦᱩᱭᱩᱜ-ᱟ᱾ +ᱮᱢ ᱟᱠᱟᱱ ᱞᱟᱭᱥᱮᱱᱥ ᱠᱚ ᱢᱩᱫ ᱨᱮ ᱱᱚᱣᱟ ᱜᱮ ᱵᱟ.ᱲᱛᱤ ᱥᱟᱦᱚᱵ ᱟᱱ ᱠᱟᱱᱟ᱾ ᱱᱤᱭᱟᱹ ᱫᱚ +ᱵᱟᱹᱲᱛᱤ ᱯᱟᱨᱥᱟᱞ ᱯᱟᱥᱱᱟᱣ ᱟᱨ ᱞᱟᱭᱥᱮᱱᱥᱟᱱ ᱵᱟᱡᱟᱱ ᱞᱟᱹᱜᱤᱫ ᱟᱝᱜᱚᱪ ᱜᱮᱭᱟ᱾ +ᱱᱤᱭᱟᱹ ᱨᱮᱭᱟᱜ ᱢᱮᱱᱮᱛ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱚᱠᱟ ᱠᱚ ᱨᱮ ᱠᱟᱹᱢᱤᱭᱟ ᱚᱱᱟ ᱡᱚᱛᱚ ᱴᱷᱟᱶ ᱨᱮᱜᱮ +ᱟᱥᱚᱞ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱠᱨᱮᱰᱤᱴ ᱮᱢᱟᱭ ᱦᱩᱭᱩᱜ ᱛᱟᱭᱟ᱾ ᱱᱤᱭᱟᱹ ᱛᱟᱹᱞᱤᱠᱟ ᱨᱮᱭᱟᱜ +ᱞᱟᱛᱟᱨ ᱮᱢ ᱟᱠᱟᱱ ᱡᱚᱛᱚ ᱞᱟᱭᱥᱮᱱᱥ ᱠᱚᱨᱮ ᱜᱟᱜ-ᱜᱟᱵᱟᱱᱚᱜ-ᱟ᱾ᱦᱮᱸ +ᱥᱤᱹᱥᱤᱹ ᱮᱴᱨᱤᱵᱤᱭᱩᱥᱚᱱ ᱥᱮᱭᱟᱨ-ᱮ-ᱞᱟᱭᱤᱠ ᱥᱮ -- +ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱮᱴᱟᱜ ᱦᱚᱲᱮ ᱱᱤᱭᱟᱹ ᱠᱚ ᱠᱟᱹᱢᱤ ᱨᱮ ᱟᱝᱜᱚᱪ ᱟᱠᱚᱣᱟ: +ᱠᱟᱹᱢᱤ ᱨᱮ ᱵᱮᱣᱦᱟᱨ +ᱦᱟᱯᱟᱴᱤᱧ ᱨᱮ +ᱦᱟᱨᱟ-ᱵᱩᱨᱩ ᱧᱚᱜ ᱥᱮ ᱵᱮᱱᱟᱣ ᱫᱚᱦᱲᱟ ᱥᱮ ᱵᱮᱱᱟᱣ ᱟᱹᱨᱩ ᱠᱟᱛᱮ ᱢᱚᱥᱛᱮ (ᱯᱷᱨᱤ) ᱥᱮ +ᱠᱟᱹᱣᱰᱤ ᱞᱟᱹᱜᱤᱫ-ᱮ ᱦᱟᱯᱟᱴᱤᱧ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ +ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱪᱮᱛᱟᱱ ᱨᱮ ᱮᱢ ᱟᱠᱟᱱᱟᱜ ᱵᱮᱣᱦᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱟᱥᱚᱞ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ +ᱠᱨᱮᱰᱤᱴ ᱮᱢᱟᱭ ᱛᱮᱜᱮ ᱦᱩᱭᱩᱜ-ᱟ ᱟᱨ ᱩᱱᱤ ᱫᱚ ᱟᱥᱚᱞ ᱢᱟᱹᱞᱤᱠᱮ ᱵᱮᱣᱦᱟᱨ ᱟᱠᱟᱫ ᱞᱟᱭᱥᱮᱱᱥ +ᱨᱮᱜᱮ ᱩᱪᱷᱟᱹᱱ ᱦᱩᱭᱩᱜ ᱛᱟᱭᱟ᱾ +ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱟᱥᱚᱞ ᱵᱟᱡᱟᱱ ᱵᱮᱲᱵᱟᱜ ᱥᱮ ᱜᱟᱲᱢᱟᱜ ᱠᱟᱛᱮ ᱮᱴᱟᱜ ᱞᱟᱭᱥᱮᱱᱥ ᱛᱟᱵᱮ ᱨᱮ +ᱵᱟᱭ ᱩᱪᱷᱟᱹᱱ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ (ᱟᱥᱚᱞ ᱠᱟᱹᱢᱤ ᱨᱮ ᱵᱮᱣᱦᱟᱨ ᱟᱠᱟᱱ ᱡᱚᱠᱷᱟ ᱨᱮ)ᱦᱮᱸ +ᱥᱤᱹᱥᱤᱹ ᱮᱴᱨᱤᱵᱤᱭᱩᱥᱚᱱ-ᱵᱤᱱ ᱰᱮᱨᱤᱵᱷᱮᱴᱤᱵᱽᱥ ᱥᱮ ᱥᱮ -- +ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱮᱴᱟᱜ ᱦᱚᱲᱮ ᱱᱤᱭᱟᱹ ᱠᱚ ᱠᱟᱹᱢᱤ ᱨᱮ ᱟᱝᱜᱚᱪ ᱟᱠᱚᱣᱟ: +ᱠᱟᱹᱢᱤ ᱨᱮ ᱵᱮᱣᱦᱟᱨ +ᱦᱟᱯᱟᱴᱤᱧ ᱨᱮ +ᱱᱤᱭᱟᱹ ᱠᱚ ᱠᱟᱹᱢᱤ/ ᱵᱟᱡᱟᱱ ᱫᱚ ᱥᱟᱹᱢᱩᱝ ᱵᱤᱱ-ᱵᱟᱹᱱᱤᱡᱤᱭᱟᱹ ᱢᱚᱱᱮᱡᱚᱝ ᱟᱜ ᱞᱟᱹᱜᱤᱫ ᱮᱢ +ᱦᱟᱨᱟ-ᱵᱩᱨᱩ ᱧᱚᱜ ᱥᱮ ᱵᱮᱱᱟᱣ ᱟᱹᱨᱩ ᱥᱮ ᱫᱚᱦᱲᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ (ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱟᱥᱚᱞ +ᱠᱟᱹᱢᱤ/ ᱵᱟᱡᱟᱱ ᱠᱷᱚᱱ ᱥᱮ ᱟᱥᱚᱞ ᱠᱟᱹᱢᱤ/ ᱵᱟᱡᱟᱱ ᱥᱮᱞᱮᱫ ᱠᱟᱛᱮ ᱠᱟᱹᱣᱰᱤ ᱵᱟᱭ ᱟᱨᱡᱟᱣ +ᱫᱟᱲᱮᱭᱟᱜ-ᱟ) +ᱪᱮᱛᱟᱱ ᱨᱮ ᱵᱮᱣᱦᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱟᱥᱚᱞ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱠᱨᱮᱰᱤᱴ +ᱮᱢᱟᱭ ᱛᱮᱜᱮ ᱦᱩᱭᱩᱜ-ᱟ᱾ +ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱟᱥᱚᱞ ᱠᱟᱹᱢᱤ/ᱵᱟᱡᱟᱱ ᱵᱮᱲᱵᱟᱜ ᱥᱮ ᱜᱟᱲᱢᱟᱜ ᱠᱟᱛᱮ ᱠᱟᱹᱣᱰᱤ ᱵᱟᱭ ᱛᱮᱭᱟᱨ +ᱡᱚᱝ ᱫᱟᱲᱮᱭᱟᱜ-ᱟᱵᱟᱝ +ᱥᱤᱹᱥᱤᱹ ᱮᱴᱨᱤᱵᱤᱭᱩᱥᱚᱱ-ᱵᱤᱱ ᱵᱟᱹᱱᱤᱡᱤᱭᱟᱹ ᱥᱮᱭᱟᱨ-ᱮ-ᱞᱟᱭᱤᱠ - ᱥᱮ -- +ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱮᱴᱟᱜ ᱦᱚᱲᱮ ᱱᱤᱭᱟᱹ ᱠᱚ ᱠᱟᱹᱢᱤ ᱨᱮ ᱟᱝᱜᱚᱪ ᱟᱠᱚᱣᱟ: +ᱠᱟᱹᱢᱤ ᱨᱮ ᱵᱮᱣᱦᱟᱨ +ᱦᱟᱯᱟᱴᱤᱧ ᱨᱮ +ᱱᱤᱭᱟᱹ ᱠᱚ ᱠᱟᱹᱢᱤ/ ᱵᱟᱡᱟᱱ ᱫᱚ ᱥᱟᱹᱢᱩᱝ ᱵᱤᱱ-ᱵᱟᱹᱱᱤᱡᱤᱭᱟᱹ ᱢᱚᱱᱮᱡᱚᱝ ᱟᱜ ᱞᱟᱹᱜᱤᱫ ᱮᱢ +ᱦᱟᱨᱟ-ᱵᱩᱨᱩ ᱧᱚᱜ ᱥᱮ ᱵᱮᱱᱟᱣ ᱟᱹᱨᱩ ᱥᱮ ᱫᱚᱦᱲᱟ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ +ᱪᱮᱛᱟᱱ ᱨᱮ ᱵᱮᱣᱦᱟᱨᱚᱜ ᱞᱟᱹᱜᱤᱫ, ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ +ᱟᱥᱚᱞ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱠᱨᱮᱰᱤᱴ ᱮᱢᱟᱭ ᱛᱮᱜᱮ ᱦᱩᱭᱩᱜ-ᱟ +ᱟᱥᱚᱞ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱚᱠᱟ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱞᱟᱭᱥᱮᱱᱥᱮ ᱵᱮᱣᱦᱟᱨ ᱞᱮᱫᱟ, ᱚᱱᱟ +ᱞᱟᱭᱥᱮᱱᱥ ᱦᱚᱛᱮ ᱛᱮᱜᱮ ᱟᱹᱨᱩ ᱠᱟᱹᱢᱤ ᱫᱚ ᱦᱟᱯᱟᱴᱤᱧ ᱦᱩᱭᱩᱜ-ᱟ᱾ +ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱟᱥᱚᱞ ᱵᱟᱡᱟᱱ ᱵᱮᱲᱵᱟᱜ ᱥᱮ ᱜᱟᱲᱢᱟᱜ ᱠᱟᱛᱮ ᱮᱴᱟᱜ ᱞᱟᱭᱥᱮᱱᱥ ᱛᱟᱵᱮ ᱨᱮ +ᱵᱟᱭ ᱩᱪᱷᱟᱹᱱ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ (ᱟᱥᱚᱞ ᱠᱟᱹᱢᱤ ᱨᱮ ᱵᱮᱣᱦᱟᱨ ᱟᱠᱟᱱ ᱠᱷᱚᱱ) +ᱟᱥᱚᱞ ᱵᱟᱡᱟᱱ/ᱠᱟᱹᱢᱤ ᱠᱷᱚᱱ ᱮᱴᱟᱜ ᱥᱮ ᱵᱮᱲᱵᱟᱜ ᱠᱟᱛᱮ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱠᱟᱹᱣᱰᱤ ᱵᱟᱭ +ᱟᱨᱡᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟᱵᱟᱝ +ᱥᱤᱹᱥᱤᱹ ᱮᱴᱨᱤᱵᱤᱭᱩᱥᱚᱱ-ᱵᱤᱱ ᱰᱮᱨᱤᱵᱷᱮᱴᱤᱵᱽᱥ ᱥᱮ - ᱥᱮ - +ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱮᱴᱟᱜ ᱦᱚᱲᱮ ᱱᱤᱭᱟᱹ ᱠᱚ ᱠᱟᱹᱢᱤ ᱨᱮ ᱟᱝᱜᱚᱪ ᱟᱠᱚᱣᱟ: +ᱠᱟᱹᱢᱤ ᱨᱮ ᱵᱮᱣᱦᱟᱨ +ᱯᱷᱨᱤ ᱥᱮ ᱠᱟᱹᱣᱰᱤ ᱟᱨᱡᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱵᱟᱱᱟᱮ ᱞᱮᱠᱟ ᱛᱮᱜᱮᱭᱮ ᱦᱟᱯᱟᱴᱤᱧ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ +ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱪᱮᱛᱟᱱ ᱨᱮ ᱵᱮᱣᱦᱟᱨᱚᱜ ᱞᱟᱹᱜᱤᱫ ᱟᱥᱚᱞ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱠᱨᱮᱰᱤᱴ +ᱮᱢᱟᱭ ᱛᱮᱜᱮ ᱦᱩᱭᱩᱜ-ᱟ᱾ +ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱟᱥᱚᱞ ᱠᱟᱹᱢᱤ ᱨᱮ ᱵᱟᱭ ᱟᱹᱨᱩ ᱯᱷᱮᱨᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟᱦᱮᱸ +ᱥᱤᱹᱥᱤᱹ ᱮᱴᱨᱤᱵᱤᱭᱩᱥᱚᱱ-ᱵᱤᱱ ᱵᱟᱹᱱᱤᱡᱤᱭᱟᱹ- ᱵᱤᱱ ᱰᱮᱨᱤᱵᱷᱮᱴᱤᱵᱽᱥ ᱥᱮ -- +ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱮᱴᱟᱜ ᱦᱚᱲᱮ ᱱᱤᱭᱟᱹ ᱠᱚ ᱠᱟᱹᱢᱤ ᱨᱮ ᱟᱝᱜᱚᱪ ᱟᱠᱚᱣᱟ: +ᱠᱟᱹᱢᱤ ᱨᱮ ᱵᱮᱣᱦᱟᱨ +ᱦᱟᱯᱟᱴᱤᱧ ᱨᱮ +ᱪᱮᱛᱟᱱ ᱨᱮ ᱵᱮᱣᱦᱟᱨ ᱞᱟᱹᱜᱤᱫ, ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱟᱥᱚᱞ ᱠᱚᱯᱤ ᱨᱟᱭᱤᱴ ᱢᱟᱹᱞᱤᱠ ᱠᱨᱮᱰᱤᱴ +ᱮᱢᱟᱭ ᱛᱮᱜᱮ ᱦᱩᱭᱩᱜ-ᱟ᱾ +ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱚ ᱟᱥᱚᱞ ᱠᱟᱹᱢᱤ/ ᱵᱟᱡᱟᱱ ᱵᱟᱭ ᱵᱮᱱᱟᱣ ᱟᱹᱨᱩ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ +ᱥᱮ ᱚᱝᱠᱟ ᱠᱟᱹᱢᱤ ᱚᱠᱟ ᱨᱮᱫᱚ ᱟᱥᱚᱞᱟᱜ ᱵᱟᱡᱟᱱ ᱵᱮᱣᱦᱟᱨ ᱟᱠᱟᱱᱟᱵᱟᱝ +ᱱᱚᱣᱟ ᱪᱮᱛᱟᱱ ᱨᱮᱭᱟᱜ " " ᱫᱚ ᱣᱤᱠᱤᱯᱤᱰᱤᱭᱟ ᱦᱟᱹᱴ ᱨᱮᱭᱟᱜ ᱩᱢᱩᱞ ᱯᱟᱧᱡᱟ ᱠᱟᱛᱮ ᱮᱢ +ᱟᱠᱟᱱᱟ᱾ +ᱱᱚᱱᱰᱮ ᱟᱫᱚᱢ ᱟᱝᱜᱚᱪ ᱥᱟᱯᱟᱵ ᱠᱚ (ᱴᱩᱞᱥ) ᱟᱨ ᱡᱟᱹᱨᱩᱲᱚᱜ-ᱟᱜ ᱠᱚ ᱮᱢ ᱟᱠᱟᱱᱟ ᱡᱟᱸᱦᱟᱸ +ᱵᱮᱣᱦᱟᱨ ᱟᱠᱟᱛᱮ ᱟᱢᱮᱢ ᱩᱨᱩᱢ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ, ᱟᱢ ᱫᱚ ᱚᱠᱟ ᱠᱨᱮᱤᱭᱮᱴᱤᱵᱽ ᱠᱚᱢᱚᱱᱥ ᱵᱮᱣᱦᱟᱨ +ᱦᱩᱭᱩᱜ ᱛᱟᱢᱟᱺ +( ): ᱢᱤᱫᱴᱮᱱ ᱱᱚᱝᱠᱟᱱ ᱯᱷᱚᱨᱢ ᱚᱠᱟ ᱨᱮ ᱟᱢ ᱫᱚ ᱟᱢᱟᱜ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱞᱮᱠᱟᱢᱟᱱ +ᱞᱟᱭᱥᱮᱱᱥ ᱥᱮᱱᱫᱽᱨᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱚᱯᱥᱚᱱᱮᱢ ᱯᱮᱨᱮᱡ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱟᱢᱫᱚ ᱟᱞᱜᱟ ᱛᱮ ᱚᱱᱟ +ᱞᱟᱭᱥᱮᱱᱥ ᱨᱮᱭᱟᱜ ᱚᱞᱮᱢ ᱱᱚᱠᱚᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ (ᱥᱮ ᱠᱳᱰ ᱡᱩᱰᱤ ᱡᱟᱦᱟᱱ ᱣᱮᱵᱽ ᱥᱟᱭᱤᱴ ᱨᱮ +ᱵᱮᱣᱦᱟᱨᱚᱜ ᱠᱟᱱ ᱠᱷᱟᱱ) ᱟᱨᱮᱢ ᱵᱮᱣᱦᱟᱨ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ +: ᱟᱢᱟᱜ ᱯᱟᱹᱨᱥᱤ ᱛᱮ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱠᱟᱹᱢᱤ ᱨᱟᱹᱠᱷᱤ ᱡᱚᱜᱟᱣ ᱥᱮ ᱟᱯᱞᱳᱰ ᱠᱟᱛᱮ ᱫᱚᱦᱚ +ᱞᱟᱹᱜᱤᱫ ᱮᱢ ᱟᱠᱟᱱ ᱢᱤᱫᱴᱮᱱ ᱠᱷᱩᱞᱟᱹ ᱢᱩᱨᱟᱹᱭ ᱠᱟᱱᱟ᱾ ᱱᱚᱣᱟ ᱫᱚ ᱠᱨᱤᱭᱮᱴᱤᱵᱽ ᱠᱚᱢᱚᱱᱥ +ᱵᱮᱜᱚᱨ ᱦᱚᱸ ᱟᱭᱢᱟ ᱞᱮᱠᱟᱱᱟᱜ ᱥᱮᱬᱟ ᱥᱮᱬᱟ ᱯᱷᱟᱭᱤᱞᱥ (ᱪᱤᱛᱟᱹᱨ, ᱰᱚᱠᱩᱢᱮᱱᱴᱥ, ᱳᱰᱤᱭᱳ ᱟᱨ +ᱵᱷᱤᱰᱤᱭᱳ) ᱠᱚᱭ ᱦᱟᱛᱟᱣᱟ᱾ ᱡᱩᱫᱤ ᱟᱢᱮᱢ ᱠᱷᱚᱡᱽ ᱠᱟᱱᱟ ᱟᱢᱟᱜ ᱯᱷᱟᱭᱤᱞ ᱣᱤᱠᱤᱯᱤᱰᱤᱟᱭ ᱟᱨ +ᱣᱤᱠᱤᱢᱤᱰᱤᱭᱟ ᱯᱨᱚᱡᱮᱠᱴᱥ ᱨᱮ ᱵᱮᱣᱦᱟᱨᱚᱜ ᱢᱟ, ᱛᱚᱵᱮ ᱚᱱᱟ ᱞᱟᱹᱜᱤᱫ ᱟᱢ ᱫᱚ ᱣᱤᱠᱤᱢᱤᱰᱤᱭᱟ +ᱠᱚᱢᱚᱱᱥ ᱨᱮ ᱟᱯᱞᱳᱰ ᱦᱩᱭᱩᱜ ᱛᱟᱢᱟ᱾ ᱥᱟᱹᱢᱩᱝ ᱥᱤᱹᱥᱤᱹ᱐ (0),ᱥᱤᱹᱥᱤᱹ-ᱵᱤᱹᱣᱟᱭᱹ ᱟᱨ +ᱥᱤᱹᱥᱤᱹ-ᱵᱤᱹᱣᱟᱭᱹ-ᱮᱥᱹᱮᱹ ᱜᱮ ᱟᱝᱜᱚᱪ ᱟᱠᱟᱱᱟ᱾ +ᱠᱨᱤᱭᱮᱴᱤᱵᱽ ᱠᱚᱢᱚᱱᱥ ᱞᱟᱭᱥᱮᱱᱥ ( ) ᱫᱚ ᱮᱠᱮᱱ ᱠᱷᱩᱞᱟᱹ/ᱢᱚᱥᱛᱮ ᱞᱟᱭᱥᱮᱱᱥ ᱫᱚ ᱵᱟᱝ +ᱠᱟᱱᱟ᱾ ᱫᱚ ᱟᱹᱰᱤ ᱵᱟᱹᱲᱛᱤ ᱠᱩᱥᱤᱭᱟᱜ ᱢᱤᱫ ᱯᱷᱨᱤ ᱞᱟᱭᱥᱮᱱᱥ ᱠᱟᱱᱟ, ᱱᱤᱭᱟᱹ ᱫᱚ ᱵᱟᱹᱲᱛᱤ +ᱠᱟᱭᱛᱮ ᱚᱞᱚᱜ ᱵᱟᱡᱟᱱ ᱠᱚᱨᱮ ᱵᱮᱣᱦᱟᱨᱚᱜ ᱠᱟᱱᱟ ᱡᱮᱞᱮᱠᱟ ᱯᱚᱛᱚᱵ ᱟᱨ ᱢᱤᱱᱩ ᱠᱚᱨᱮ᱾ ᱱᱤᱭᱟᱹ +ᱫᱚ ᱢᱤᱫᱴᱮᱱ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱟᱥᱚᱞ ᱠᱟᱹᱢᱤ ᱨᱮᱭᱟᱜ-ᱮ ᱵᱮᱣᱦᱟᱨ, ᱱᱚᱠᱚᱞ, ᱥᱩᱫᱷᱨᱟᱹᱣ ᱟᱨ +ᱵᱚᱱᱚᱫᱚᱞ ᱞᱟᱹᱜᱤᱫ-ᱮ ᱟᱝᱜᱚᱪᱟᱭᱟ᱾ ᱢᱮᱱᱠᱷᱟᱱ, ᱱᱟᱣᱟ ᱛᱮ ᱑᱐᱐ (ᱢᱤᱫ ᱥᱟᱭ) ᱠᱷᱚᱱ ᱵᱟᱹᱲᱛᱤ +ᱠᱚᱯᱤ ᱩᱪᱷᱟᱹᱱ ᱞᱮᱠᱷᱟᱱ ᱟᱥᱚᱞ ᱰᱚᱠᱩᱢᱮᱱᱴ ᱥᱮ ᱥᱳᱣᱨᱥ ᱠᱳᱰ ᱥᱮᱞᱮᱫ ᱛᱮᱜᱮ ᱦᱩᱭᱩᱜ-ᱟ᱾ +ᱱᱤᱭᱟᱹ ᱥᱟᱛᱷᱟᱢ ᱫᱚ ᱥᱟᱫᱷᱟᱨᱚᱱ ᱥᱟᱱᱛᱟᱞᱤ ᱚᱱᱚᱞᱤᱭᱟᱹ ᱫᱤᱥᱟᱹ ᱠᱟᱛᱮ ᱚᱞ ᱟᱠᱟᱱ᱾ ᱢᱮᱱᱠᱷᱟᱱ +ᱟᱫᱚᱢ ᱩᱠᱩᱣᱟᱜ ᱮᱢ ᱯᱟᱱᱛᱮ ᱫᱟᱲᱮᱩᱟᱜ-ᱟ᱾ ᱦᱤᱸᱥ ᱦᱟᱛᱟᱣ ᱵᱟᱠᱷᱨᱟ ᱜᱟᱯᱟᱞᱢᱟᱨᱟᱣ ᱞᱟᱹᱜᱤᱫ, +ᱥᱟᱯᱲᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱥᱮ ᱯᱷᱮᱰᱟᱛ ᱥᱟᱯᱲᱟᱣ ᱨᱮ ᱠᱞᱤᱠ ᱞᱟᱹᱜᱤᱫ ᱱᱤᱭᱟᱹ ᱧᱮᱞ ᱢᱮ ᱾ ᱟᱢ ᱫᱚ +ᱟᱨᱦᱚᱸ " " ᱨᱮ ᱠᱞᱤᱠ ᱠᱟᱛᱮ ᱱᱮᱦᱚᱨᱮᱢ ᱠᱩᱞ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ ᱡᱩᱫᱤ ᱡᱟᱦᱟᱱᱟᱜ ᱵᱷᱩᱞ ᱥᱮ +ᱦᱤᱲᱤᱧ ᱠᱚᱜ ᱠᱷᱟᱱ᱾ ᱡᱩᱫᱤ ᱟᱢ ᱮᱱᱮᱢ ᱞᱟᱹᱜᱤᱫ ᱞᱟᱹᱜᱤᱫ ᱜᱚᱨᱚᱡᱽ ᱢᱮᱱᱟᱫ ᱢᱮᱭᱟ, ᱛᱚᱵᱮ +ᱫᱟᱭᱟ ᱠᱟᱛᱮ ᱞᱟᱛᱟᱨ ᱨᱮ ᱟᱢᱟᱜ ᱧᱩᱴᱩᱢ ᱥᱮᱞᱮᱫᱽ ᱢᱮ, ᱮᱱᱰᱮ ᱠᱷᱟᱱ ᱢᱤᱫ ᱛᱮ ᱠᱟᱹᱢᱤ ᱞᱟᱹᱜᱤᱫ +ᱥᱟᱹᱟᱜᱟᱹᱭ ᱵᱚᱱ ᱡᱚᱲᱟᱣ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ +ᱮᱱᱮᱢᱤᱭᱟᱹᱠᱚ +ᱛᱚᱨᱡᱚᱢᱟᱭᱤᱡ ᱟᱨ ᱥᱟᱶ ᱚᱱᱚᱞᱤᱭᱟᱹ: +ᱛᱚᱨᱡᱚᱢᱟᱭᱤᱡ ᱟᱨ ᱥᱟᱶ ᱚᱱᱚᱞᱤᱭᱟᱹ: +ᱛᱚᱨᱡᱚᱢᱟᱭᱤᱡ ᱟᱨ ᱥᱟᱶ ᱚᱱᱚᱞᱤᱭᱟᱹ: +ᱯᱨᱚᱡᱮᱠᱴ ᱠᱚ-ᱚᱨᱰᱤᱱᱮᱴᱚᱨ ᱟᱨ ᱢᱩᱠᱷᱭᱟᱹ ᱚᱱᱚᱞᱤᱟᱹ: +ᱜᱚᱜ-ᱨᱚᱡᱽ ᱮᱱᱮᱢᱤᱭᱟᱹ? ᱟᱢ ᱧᱩᱛᱩᱢ ᱞᱟᱛᱟᱨ ᱨᱮ ᱥᱮᱞᱮᱫᱽ ᱢᱮ: +ᱵᱷᱩᱞᱟᱱᱴᱟᱨᱤ ᱰᱮᱠᱞᱟᱨᱮᱥᱚᱱ +ᱥᱟᱛᱷᱟᱢ "ᱥᱟᱛᱷᱟᱢ ᱺ " 1: ᱟᱝᱜᱚᱪ, ᱵᱟᱡᱟᱱ ᱟᱹᱭᱰᱟᱹᱨᱤ ᱟᱨ ᱵᱟᱡᱟᱱ ᱞᱟᱭᱥᱮᱱᱥᱤᱝ ᱠᱚᱫᱚ +"ᱠᱨᱤᱭᱮᱴᱤᱵᱽ ᱠᱚᱢᱚᱱᱥ" ᱠᱷᱚᱱ ᱠᱟᱹᱣᱰᱤ ᱥᱚᱦᱚᱫ ᱛᱮ ᱥᱟᱯᱲᱟᱜ ᱠᱟᱱᱟ᱾ ᱵᱟᱹᱲᱛᱤ ᱛᱮ ᱱᱤᱭᱟᱹ +ᱥᱟᱦᱴᱟ ᱠᱷᱚᱱ ᱵᱚᱱ ᱵᱟᱰᱟᱭ ᱫᱟᱲᱮᱭᱟᱜ-ᱟ᱾ diff --git a/sat/corpus/sat_corpus2_clean.txt b/sat/corpus/sat_corpus2_clean.txt new file mode 100644 index 0000000..a66eab4 --- /dev/null +++ b/sat/corpus/sat_corpus2_clean.txt @@ -0,0 +1,137 @@ +ᱱᱚᱣᱟ ᱫᱚ ᱠᱚᱢ ᱨᱤᱥᱳᱨᱥ ᱢᱮᱱᱟᱜ ᱟᱹᱫᱤᱵᱟᱹᱥᱤ, ᱡᱚᱱᱚᱡᱟᱹᱛᱤ, ᱡᱟᱱᱟᱢ ᱟᱲᱟᱝ ᱟᱨ +ᱴᱚᱴᱷᱟᱠᱤᱭᱟᱹ ᱯᱟᱹᱨᱥᱤ ᱠᱚ ᱨᱮᱠᱳᱨᱰ ᱟᱨ ᱡᱚᱜᱟᱣ ᱫᱚᱦᱚ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱞᱮᱛᱟᱲ +ᱠᱟᱱᱟ (ᱡᱮᱞᱮᱠᱟ ᱦᱤᱱᱫᱤ, ᱛᱟᱢᱤᱞ, ᱵᱟᱝᱞᱟ, ᱠᱟᱱᱱᱟᱰᱟ, ᱜᱩᱡᱽᱨᱟᱴᱤ ᱟᱨ ᱛᱮᱞᱩᱜᱩ ᱞᱮᱠᱟᱱ +ᱥᱚᱨᱠᱟᱨᱤ ᱯᱟᱹᱨᱥᱤ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱫᱚ ᱡᱟᱹᱥᱛᱤ ᱥᱟᱯᱟᱵ ᱢᱮᱱᱟᱜᱼᱟ)᱾ ᱡᱩᱫᱤ ᱟᱢ ᱱᱚᱝᱠᱟᱱ +ᱯᱟᱹᱨᱥᱤ ᱠᱚ ᱞᱟᱦᱟ ᱠᱷᱚᱱ ᱜᱮ ᱨᱮᱠᱳᱨᱰ ᱟᱨ ᱡᱚᱜᱟᱣ ᱫᱚᱦᱚᱭᱮᱫᱼᱟᱢ, ᱵᱟᱝᱠᱷᱟᱱ ᱮᱦᱚᱵ +ᱥᱟᱱᱟᱭᱮᱫ ᱢᱮᱭᱟ, ᱛᱚᱵᱮ ᱑᱕ ᱡᱩᱱ ᱞᱟᱦᱟ ᱛᱮ ᱟᱨᱫᱟᱥ ᱢᱮ᱾ ᱠᱚᱢ ᱵᱟᱰᱟᱭ ᱛᱟᱦᱮᱸ ᱨᱮᱦᱚᱸ +ᱜᱟᱱᱚᱜᱼᱟ᱾ +ᱱᱚᱣᱟ ᱞᱮᱛᱟᱲ ᱨᱮ ᱢᱮᱱᱟᱜᱼᱟ +ᱮᱭᱟᱭ ᱚᱱᱞᱟᱭᱤᱱ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ (ᱢᱮᱹᱟᱜᱚᱥᱴ ᱒᱐᱒᱖) +ᱠᱮᱨᱟᱞᱟ ᱨᱮᱱᱟᱜ ᱠᱳᱪᱤ ᱨᱮ ᱢᱤᱫ ᱥᱟᱢᱟᱝ ᱫᱟᱯᱨᱟᱢ ᱛᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ (᱗ +ᱥᱮᱯᱴᱮᱢᱵᱚᱨ ᱒᱐᱒᱖) +ᱦᱚᱨᱟ ᱠᱚ +ᱧᱮᱞ ᱢᱮ ᱞᱮᱠᱢᱟᱱ +ᱪᱮᱛᱟᱱ ᱨᱮᱱᱟᱜ ᱞᱤᱝᱠ ᱠᱷᱚᱱ ᱟᱨᱫᱟᱥ ᱢᱮ᱾ +ᱱᱚᱸᱰᱮ ᱒ ᱞᱮᱠᱟᱱᱟᱜ ᱥᱮᱥᱚᱱ ᱛᱟᱦᱮᱸᱱᱟ: ᱢᱮᱹ ᱠᱷᱚᱱ ᱟᱜᱚᱥᱴ ᱦᱟᱹᱵᱤᱡ ᱗ ᱜᱚᱴᱟᱝ ᱚᱱᱞᱟᱭᱤᱱ +ᱥᱮᱥᱚᱱ, ᱟᱨ ᱗ ᱥᱮᱯᱴᱮᱢᱵᱚᱨ ᱒᱐᱒᱖ ᱦᱤᱞᱳᱜ ᱠᱮᱨᱟᱞᱟ ᱨᱮᱱᱟᱜ ᱠᱳᱪᱤ ᱨᱮ ᱢᱤᱫ ᱥᱟᱢᱟᱝ ᱫᱟᱯᱨᱟᱢ +ᱛᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱾ ᱟᱢ ᱡᱟᱦᱟᱸ ᱨᱮᱢ ᱥᱮᱞᱮᱫ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ, ᱚᱱᱟ ᱵᱟᱪᱷᱟᱣ ᱢᱮ ᱾ +ᱢᱤᱫᱼᱢᱤᱫᱴᱟᱝ ᱚᱱᱞᱟᱭᱤᱱ ᱥᱮᱥᱚᱱ ᱑ ᱴᱟᱲᱟᱝ ᱨᱮᱱᱟᱜ ᱦᱩᱭᱩᱜᱼᱟ ᱾ ᱱᱚᱣᱟ ᱠᱚᱫᱚ ᱚᱛᱮ ᱢᱟᱦᱟ +(᱑᱘ ᱢᱮᱹ, ᱑ ᱡᱩᱱ, ᱑᱕ ᱡᱩᱱ, ᱒᱙ ᱡᱩᱱ, ᱑᱓ ᱡᱩᱞᱟᱭ, ᱒᱗ ᱡᱩᱞᱟᱭ ᱟᱨ ᱑᱐ ᱟᱜᱚᱥᱴ) ᱟᱹᱭᱩᱵ +᱖ ᱴᱟᱲᱟᱝ ᱚᱠᱛᱚ ᱨᱮ ᱦᱩᱭᱩᱜᱼᱟ ᱾ +ᱞᱮᱠᱢᱟᱱ +* ᱟᱢ ᱠᱚᱢ ᱥᱟᱯᱟᱵ ᱢᱮᱱᱟᱜ ᱟᱹᱫᱤᱵᱟᱹᱥᱤ/ᱡᱚᱱᱚᱡᱟᱹᱛᱤ/ᱮᱴᱟᱜ ᱡᱟᱱᱟᱢ ᱟᱲᱟᱝ ᱠᱚ ᱨᱮᱠᱳᱨᱰ +ᱮᱫᱼᱟᱢ ᱵᱟᱝᱠᱷᱟᱱ ᱨᱮᱠᱳᱨᱰ ᱞᱟᱹᱜᱤᱫ ᱮᱢ ᱩᱭᱦᱟᱹᱨᱭᱮᱫᱼᱟ (ᱡᱟᱱᱟᱢ ᱟᱲᱟᱝ ᱞᱮᱠᱟᱛᱮ ᱨᱚᱲ ᱦᱚᱲ +ᱠᱚ ᱯᱩᱭᱞᱩ ᱛᱟᱠ ᱮᱢ ᱦᱩᱭᱩᱜᱼᱟ)᱾ +ᱟᱢ ᱫᱚ ᱢᱤᱫ ᱣᱤᱠᱤᱢᱤᱰᱤᱭᱟᱱ ᱠᱟᱱᱟᱢ ᱡᱟᱦᱟᱸᱭ ᱫᱚ ᱱᱚᱝᱠᱟᱱ ᱯᱟᱹᱨᱥᱤ ᱠᱚ ᱨᱮᱱᱟᱜ +ᱟᱲᱟᱝ-ᱵᱷᱤᱰᱤᱭᱳ ᱚᱞ ᱛᱚᱞ ᱨᱮ ᱨᱟᱹᱥᱠᱟᱹ ᱢᱮᱱᱟᱜ ᱛᱟᱢᱟ ᱾ +ᱡᱩᱫᱤ ᱟᱢᱮᱢ ᱵᱟᱪᱷᱟᱣᱚᱜᱼᱟ +ᱡᱩᱫᱤ ᱚᱱᱞᱟᱭᱤᱱ ᱛᱮᱢ ᱥᱮᱞᱮᱫᱚᱜ ᱠᱷᱟᱱ, ᱠᱚᱢ ᱠᱷᱚᱱ ᱠᱚᱢ ᱢᱤᱫᱴᱟᱝ ᱯᱩᱨᱟᱹ ᱥᱮᱥᱚᱱ ᱨᱮ +ᱥᱮᱞᱮᱫ ᱦᱩᱭ ᱟᱢᱟ ᱾ +ᱡᱩᱫᱤ ᱠᱳᱪᱤ ᱨᱮᱢ ᱥᱮᱞᱮᱫᱚᱜ ᱠᱷᱟᱱ, ᱟᱢ ᱠᱚᱢ ᱠᱷᱚᱱ ᱠᱚᱢ ᱓ ᱜᱚᱴᱟᱝ ᱯᱩᱨᱟᱹ ᱚᱱᱞᱟᱭᱤᱱ +ᱥᱮᱥᱚᱱ ᱟᱨ ᱥᱮᱛᱟᱜ ᱙ ᱴᱟᱲᱟᱝ ᱠᱷᱚᱱ ᱟᱹᱭᱩᱵ ᱖ ᱴᱟᱲᱟᱝ ᱦᱟᱹᱵᱤᱡ ᱥᱟᱢᱟᱝ ᱫᱟᱯᱨᱟᱢ ᱛᱮ ᱥᱮᱞᱮᱫ +ᱦᱩᱭ ᱟᱢᱟ ᱾ +ᱚᱱᱞᱟᱭᱤᱱ/ᱥᱟᱢᱟᱝ ᱛᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱥᱮᱥᱟᱱ ᱠᱚᱫᱚ ᱜᱟᱯᱟᱞᱢᱟᱨᱟᱣ ᱞᱮᱠᱟᱱᱟᱜ ᱦᱩᱭᱩᱜᱼᱟ, +ᱵᱷᱟᱥᱚᱱ ᱞᱮᱠᱟ ᱫᱚ ᱵᱟᱝ ᱾ ᱟᱢ ᱯᱟᱲᱦᱟᱣ ᱟᱨ ᱮᱠᱴᱤᱵᱷ ᱞᱮᱠᱟ ᱛᱮ ᱥᱮᱞᱮᱫ ᱦᱩᱭ ᱟᱢᱟ ᱾ +ᱟᱢ ᱣᱤᱠᱤᱢᱤᱰᱤᱭᱟ ᱯᱨᱚᱡᱮᱠᱴ ᱠᱚᱨᱮ ᱮᱱᱮᱢ ᱮᱢ ᱦᱩᱭ ᱟᱢᱟ ᱟᱨ ᱵᱩᱜᱤ ᱟᱨ ᱱᱤᱛᱤ ᱟᱱᱟᱜ ᱰᱟᱦᱟᱨ +ᱛᱮ ᱠᱤᱪᱷᱩ ᱠᱟᱹᱢᱤ ᱠᱚ ᱦᱟᱹᱴᱤᱧ ᱦᱩᱭ ᱟᱢᱟ ᱾ +ᱟᱢ ᱪᱮᱫ ᱮᱢ ᱪᱮᱫᱚᱜᱼᱟ +ᱚᱰᱤᱭᱳ-ᱵᱷᱤᱰᱤᱭᱳ ᱨᱮᱠᱳᱨᱰᱤᱝ ᱟᱨ ᱥᱟᱧᱪᱟᱣ ᱫᱚᱦᱚᱭ ᱨᱮ : +᱑᱘ ᱢᱮ: ᱢᱤᱫ ᱥᱟᱶᱛᱟ ᱯᱟᱹᱨᱥᱤ ᱚᱞ ᱛᱚᱞ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱪᱮᱫ ᱞᱮᱠᱟ ᱛᱮ ᱥᱟᱯᱲᱟᱣ ᱦᱩᱭᱩᱜᱼᱟ᱾ +᱑ ᱡᱩᱱ: ᱨᱮᱵᱮᱱ, ᱢᱟᱹᱱ ᱟᱨ ᱠᱩᱲᱟᱹᱭ ᱠᱚ ᱱᱭᱟᱹᱭ ᱞᱮᱠᱟ ᱛᱮ ᱪᱮᱫ ᱞᱮᱠᱟ ᱛᱮ ᱥᱟᱵᱼᱥᱟᱢᱴᱟᱣ +ᱦᱩᱭᱩᱜᱼᱟ᱾ +᱑᱕ ᱡᱩᱱ: ᱟᱥᱚᱞ ᱠᱟᱹᱢᱤ ᱚᱠᱛᱮ ᱨᱮ ᱥᱟᱯᱷᱟ ᱟᱲᱟᱝ ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱪᱮᱫ ᱞᱮᱠᱟ ᱛᱮ ᱨᱮᱠᱳᱨᱰ +ᱦᱩᱭᱩᱜᱼᱟ᱾ +᱒᱙ ᱡᱩᱱ: ᱯᱷᱟᱭᱤᱞ ᱠᱚ ᱨᱟᱠᱷᱟᱫᱚᱦᱚ ᱟᱛᱮ ᱪᱮᱫ ᱞᱮᱠᱟ ᱛᱮ ᱥᱟᱵᱼᱥᱟᱢᱴᱟᱣ ᱟᱨ ᱵᱮᱠᱟᱯ +ᱦᱩᱭᱩᱜᱼᱟ᱾ +᱑᱓ ᱡᱩᱞᱟᱭ: ᱦᱟᱹᱴᱤᱧ ᱟᱨ ᱡᱤᱞᱤᱧ ᱚᱠᱛᱚ ᱵᱮᱵᱷᱟᱨ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱰᱤᱭᱟ ᱪᱮᱫ ᱞᱮᱠᱟ ᱛᱮ ᱟᱹᱨᱩ +ᱦᱩᱭᱩᱜᱼᱟ᱾ +᱒᱗ ᱡᱩᱞᱟᱭ: ᱣᱤᱠᱤᱢᱤᱰᱤᱭᱟ ᱠᱚᱢᱚᱱᱥ, ᱣᱤᱠᱤᱰᱮᱴᱟ, ᱣᱤᱠᱤᱯᱤᱰᱤᱭᱟ ᱟᱨ ᱮᱴᱟᱜ ᱣᱤᱠᱤᱢᱤᱰᱤᱭᱟ +ᱯᱚᱨᱛᱚᱱ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱰᱤᱭᱟ ᱟᱨ ᱢᱮᱴᱟᱰᱮᱴᱟ ᱪᱮᱫ ᱞᱮᱠᱟ ᱛᱮ ᱥᱟᱯᱲᱟᱣ ᱦᱩᱭᱩᱜᱼᱟ᱾ +᱑᱐ ᱡᱩᱞᱟᱭ: ᱟᱨᱠᱟᱭᱤᱵᱷ, ᱞᱟᱭᱵᱨᱮᱨᱤ ᱟᱨ ᱥᱟᱶᱛᱟ ᱠᱚ ᱥᱟᱞᱟᱜ ᱡᱤᱱᱤᱥ ᱠᱚ ᱪᱮᱫ ᱞᱮᱠᱟ ᱛᱮ +ᱦᱟᱹᱴᱤᱧ ᱦᱩᱭᱩᱜᱼᱟ᱾ +ᱠᱟᱹᱢᱤ ᱚᱠᱛᱚ +ᱚᱱᱞᱟᱭᱤᱱ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱠᱚ +ᱮᱭᱟᱭ ᱜᱚᱴᱟᱝ ᱚᱱᱞᱟᱭᱤᱱ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱛᱟᱦᱮᱱᱟ᱾ +ᱢᱤᱫ-ᱢᱤᱫᱴᱟᱝ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱑ ᱴᱟᱲᱟᱝ ᱨᱮᱱᱟᱜ ᱦᱩᱭᱩᱜᱼᱟ, ᱚᱛᱮ ᱢᱟᱦᱟ ᱦᱤᱞᱳᱜ ᱵᱷᱟᱨᱚᱛ +ᱚᱠᱛᱚ ᱟᱹᱭᱩᱵ ᱖ ᱴᱟᱲᱟᱝ ᱨᱮ ᱾ +ᱢᱟᱹᱦᱤᱛ ᱠᱚ +᱑᱘ ᱢᱮᱹ +᱑᱕ ᱡᱩᱱ +᱒᱙ ᱡᱩᱱ +᱑᱓ ᱡᱩᱞᱟᱭ +᱒᱗ ᱡᱩᱞᱟᱭ +᱑᱐ ᱟᱜᱚᱥᱴ +ᱥᱟᱱᱟᱢ ᱚᱱᱞᱟᱭᱤᱱ ᱥᱮᱥᱚᱱ ᱨᱮ ᱛᱟᱦᱮᱱᱟ : +ᱦᱩᱰᱤᱧ ᱜᱟᱞᱢᱟᱨᱟᱣ ᱟᱨ ᱩᱫᱩᱜ ᱥᱚᱫᱚᱨ +ᱛᱤ-ᱛᱮ ᱠᱟᱹᱢᱤ ᱦᱮᱣᱟ (ᱟᱢᱟᱜ ᱱᱤᱡᱮᱨᱟᱜ ᱯᱨᱚᱡᱮᱠᱴ ᱥᱮ ᱱᱟᱢᱩᱱᱟ ᱯᱷᱟᱭᱤᱞ ᱵᱮᱵᱷᱟᱨ ᱠᱟᱛᱮ) +ᱥᱟᱯᱟᱵ ᱟᱨ ᱫᱤᱥᱼᱦᱩᱫᱤᱥ ᱠᱚ ᱟᱨᱦᱚᱸ ᱱᱟᱯᱟᱭ ᱞᱟᱹᱜᱤᱫ ᱜᱟᱞᱢᱟᱨᱟᱣ ᱟᱨ ᱛᱮᱞᱟ ᱨᱩᱣᱟᱹᱲ +ᱠᱟᱛᱷᱟ ᱾ +ᱥᱟᱢᱟᱝ ᱫᱟᱯᱨᱟᱢ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ (ᱠᱳᱪᱤ) +ᱢᱟᱹᱦᱤᱛ ᱟᱨ ᱚᱠᱛᱚ +᱗ ᱥᱮᱯᱴᱮᱢᱵᱚᱨ, ᱥᱮᱛᱟᱜ ᱙ ᱴᱟᱲᱟᱝ ᱠᱷᱚᱱ ᱟᱹᱭᱩᱵ ᱕ ᱴᱟᱲᱟᱝ ᱵᱷᱟᱨᱚᱛ ᱚᱠᱛᱚ +ᱠᱳᱪᱤ, ᱠᱮᱨᱟᱞᱟ, ᱵᱷᱟᱨᱚᱛ +ᱱᱚᱣᱟ ᱠᱟᱹᱢᱤᱥᱟᱲᱟ ᱨᱮ ᱟᱢ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱦᱟᱞᱚᱛ ᱨᱮ ᱵᱤᱵᱚᱨᱚᱱ ᱛᱮ ᱥᱮᱪᱮᱫ ᱮᱢ ᱧᱟᱢᱟ ᱾ +ᱟᱢ ᱮᱴᱟᱜ ᱠᱚ ᱥᱟᱶ ᱨᱮᱠᱳᱰᱤᱝ, ᱢᱮᱴᱟᱰᱮᱴᱟ, ᱥᱟᱵᱽᱴᱟᱭᱤᱴᱮᱞᱤᱝ ᱟᱨ ᱣᱤᱠᱤᱢᱤᱰᱤᱭᱟ ᱟᱯᱞᱳᱰ +ᱠᱚ ᱨᱮᱢ ᱦᱟᱣᱟᱜᱼᱟ ᱾ +ᱟᱢ ᱳᱯᱮᱱᱥᱯᱤᱠᱥ ᱦᱟᱹᱛᱭᱟᱹᱨ ᱠᱚ, ᱪᱷᱟᱸᱪ ᱠᱚ ᱟᱨ ᱥᱮᱪᱮᱫ ᱥᱟᱢᱟᱱ ᱠᱚᱢ ᱵᱤᱰᱟᱹᱣᱟ ᱾ +ᱥᱟᱱᱟᱢ ᱵᱟᱪᱷᱟᱣᱚᱜ ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ : +ᱥᱮᱪᱮᱫᱚᱜ ᱥᱟᱯᱟᱵᱽ ᱠᱚ +ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱟᱹᱭᱠᱟᱹ ᱟᱨ ᱪᱷᱟᱸᱪ ᱠᱚ +ᱯᱷᱨᱤ ᱟᱨ ᱳᱯᱮᱱ-ᱥᱳᱨᱥ ᱥᱚᱯᱷᱴᱳᱭᱮᱨ ᱟᱨ ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱫᱤᱥ-ᱦᱩᱫᱤᱥ +ᱦᱮᱣᱟᱜ ᱨᱮᱫ ᱠᱚ ᱟᱨ ᱠᱟᱹᱢᱤ ᱦᱮᱣᱟ +ᱡᱩᱫᱤ ᱟᱢ ᱮᱴᱟᱜ ᱠᱚ ᱥᱮᱪᱮᱫ ᱥᱟᱱᱟᱭᱮᱫ ᱢᱮ ᱠᱷᱟᱱ ᱢᱤᱫ ᱯᱩᱨᱟᱹ ᱥᱮᱪᱮᱫ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ +ᱯᱟᱱᱛᱷᱟ ᱾ +ᱠᱳᱪᱤ ᱨᱮ ᱵᱟᱪᱷᱟᱣ ᱟᱠᱟᱱ ᱥᱟᱢᱟᱝ ᱫᱟᱯᱨᱟᱢ ᱛᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱺ +ᱠᱳᱪᱤ ᱦᱟᱹᱵᱤᱡ ᱦᱤᱡᱩᱜ-ᱥᱮᱱᱚᱜ ᱥᱟᱸᱜᱷᱟᱨ (ᱥᱟᱸᱜᱷᱟᱨ ᱨᱮᱱᱟᱜ ᱟᱹᱨᱤ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱟᱨᱫᱟᱥ +ᱥᱟᱠᱟᱢ ᱧᱮᱞ ᱢᱮ) +ᱦᱳᱴᱮᱞ ᱨᱮ ᱢᱤᱫ ᱧᱤᱫᱟᱹ ᱥᱟᱶᱛᱮ ᱛᱟᱦᱮᱸᱱ +ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱦᱤᱞᱳᱜ ᱡᱚᱢᱟᱜ ᱠᱚ +ᱡᱟᱦᱟᱸᱱ ᱥᱮᱪᱮᱫᱤᱭᱟᱹ ᱟᱨ ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱠᱩᱲᱟᱹᱭ ᱨᱮᱱᱟᱜ ᱵᱤᱵᱚᱨᱚᱱ ᱴᱷᱟᱹᱣᱠᱟᱹ ᱞᱮᱱ +ᱠᱷᱟᱱ ᱜᱮ ᱱᱚᱣᱟ ᱥᱟᱦᱴᱟ ᱨᱮ ᱥᱮᱞᱮᱫ ᱦᱩᱭᱩᱜᱼᱟ ᱾ +ᱟᱨᱡᱟᱣ ᱛᱮᱱᱟᱜ +ᱱᱚᱣᱟ ᱥᱤᱨᱤᱡᱽ ᱨᱟᱲᱟ ᱥᱟᱢᱟᱱ ᱠᱚᱭ ᱵᱮᱱᱟᱣᱟ, ᱟᱨ ᱚᱱᱟ ᱠᱚ ᱟᱞᱮ ᱟᱢ ᱥᱟᱶ ᱞᱮ ᱦᱟᱹᱴᱤᱧᱟ ᱺ +ᱥᱟᱶᱛᱟ ᱯᱟᱹᱨᱥᱤ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱟᱨ ᱟᱨᱠᱟᱭᱤᱵᱤᱝ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱥᱮᱪᱮᱫ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ, +ᱡᱟᱦᱟᱸ ᱫᱚ ᱟᱞᱜᱟ ᱤᱝᱞᱤᱥ ᱛᱮ ᱟᱨ ᱛᱚᱨᱡᱚᱢᱟ ᱞᱟᱹᱜᱤᱫ ᱥᱟᱯᱲᱟᱣ ᱢᱮᱱᱟᱜᱼᱟ ᱾ +ᱨᱮᱠᱳᱰ ᱟᱠᱟᱱ ᱜᱟᱞᱢᱟᱨᱟᱣ ᱠᱚ ᱟᱨ ᱥᱟᱯᱟᱵᱽ ᱩᱫᱩᱜ-ᱥᱚᱫᱚᱨ ᱠᱚ (ᱚᱱᱞᱟᱭᱤᱱ ᱟᱨ +ᱥᱟᱢᱟᱝ-ᱫᱟᱯᱨᱟᱢ ᱥᱮᱥᱚᱱ ᱠᱚ) +ᱳᱯᱮᱱᱥᱯᱤᱠᱥ ᱥᱟᱯᱟᱵᱽ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ, ᱡᱟᱦᱟᱸ ᱨᱮ ᱢᱤᱫ ᱥᱟᱵᱽᱴᱟᱭᱤᱴᱮᱞᱤᱝ +ᱥᱟᱯᱟᱵᱽ ᱦᱚᱸ ᱥᱮᱞᱮᱫ ᱢᱮᱱᱟᱜᱼᱟ ᱾ +ᱟᱢᱟᱜ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱟᱨ ᱟᱨᱠᱟᱭᱤᱵᱤᱝ ᱥᱟᱯᱲᱟᱣ ᱨᱮ ᱜᱚᱲᱚ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱠᱟᱹᱢᱤ ᱪᱷᱟᱸᱪ +ᱞᱟᱹᱜᱤᱫ ᱱᱟᱣᱟ ᱛᱮ ᱥᱟᱯᱲᱟᱣ ᱟᱠᱟᱱ ᱫᱤᱥ-ᱦᱩᱫᱤᱥ ᱾ +ᱠᱮᱯᱥᱚᱱᱤᱝ, ᱥᱟᱵᱽᱴᱟᱭᱤᱴᱮᱞᱤᱝ ᱟᱨ ᱴᱨᱟᱱᱥᱠᱨᱟᱭᱤᱵᱤᱝ ᱞᱟᱹᱜᱤᱫ ᱢᱤᱫ ᱵᱤᱰᱟᱹᱣ ᱟᱠᱟᱱ ᱚᱞ +ᱛᱚᱦᱚᱨ ᱫᱤᱥ-ᱦᱩᱫᱤᱥ ᱾ +ᱨᱮᱠᱳᱰᱤᱝ ᱠᱷᱚᱱ ᱣᱤᱠᱤᱢᱤᱰᱤᱭᱟ ᱟᱯᱞᱳᱰ ᱟᱨ ᱵᱟᱦᱨᱮ ᱟᱨᱠᱟᱭᱤᱵᱽ ᱦᱟᱹᱵᱤᱡᱟᱜ ᱫᱟᱹᱭᱠᱟᱹ +ᱠᱟᱹᱢᱤ ᱦᱚᱨᱟ ᱠᱚ ᱾ +ᱟᱢ ᱡᱟᱦᱟᱸ ᱥᱟᱢᱟᱱ ᱠᱚᱢ ᱵᱮᱱᱟᱣᱟ ᱥᱮᱢ ᱱᱟᱯᱟᱭᱟ, ᱚᱱᱟ ᱞᱟᱹᱜᱤᱫ ᱟᱢ ᱥᱟᱯᱲᱟᱣᱤᱡ ᱞᱮᱠᱟᱛᱮ +ᱢᱟᱹᱱ ᱮᱢ ᱧᱟᱢᱟ ᱾ +ᱱᱚᱣᱟ ᱥᱤᱨᱤᱡᱽ ᱢᱩᱪᱟᱹᱫ ᱞᱮᱱ ᱠᱷᱟᱱ, ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱟᱠᱚᱣᱟᱜ ᱥᱟᱶᱛᱟ ᱨᱮᱱᱟᱜ ᱜᱚᱱᱚᱝᱟᱱ +ᱡᱤᱱᱤᱥ ᱠᱚ ᱟᱲᱟᱝ ᱟᱨ ᱵᱷᱤᱰᱤᱭᱳ ᱛᱮ ᱪᱮᱫ ᱞᱮᱠᱟ ᱰᱚᱠᱩᱢᱮᱱᱴ ᱟᱨ ᱟᱨᱠᱟᱭᱤᱵᱽ ᱦᱩᱭᱩᱜᱼᱟ, ᱚᱱᱟ +ᱟᱹᱰᱤ ᱱᱟᱯᱟᱭ ᱛᱮᱠᱚ ᱵᱟᱰᱟᱭ ᱧᱟᱢᱟ ᱾ +ᱩᱱᱠᱩ ᱣᱤᱠᱤᱢᱤᱰᱤᱭᱟ ᱯᱨᱚᱡᱮᱠᱴ ᱠᱚ ᱨᱮ ᱛᱤᱱᱟᱹᱜ ᱜᱟᱱ ᱚᱨᱡᱚ ᱠᱚ ᱪᱮᱫ ᱞᱮᱠᱟ ᱮᱱᱮᱢ ᱮᱢ +ᱦᱩᱭᱩᱜᱼᱟ, ᱚᱱᱟ ᱦᱚᱸ ᱠᱚ ᱵᱟᱰᱟᱭ ᱧᱟᱢᱟ ᱾ +ᱩᱱᱠᱩ ᱴᱷᱮᱱ ᱱᱚᱣᱟ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱦᱟᱹᱛᱭᱟᱹᱨ ᱠᱚ ᱟᱨ ᱥᱮᱪᱮᱫ ᱫᱤᱥ-ᱦᱩᱫᱤᱥ ᱨᱮᱱᱟᱜ +ᱵᱮᱵᱷᱟᱨᱤᱭᱟᱹ ᱵᱟᱰᱟᱭ ᱛᱟᱦᱮᱸᱱᱟ ᱾ +ᱱᱚᱣᱟ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱪᱷᱟᱸᱪ ᱱᱚᱸᱰᱮ ᱥᱟᱯᱷᱟ ᱥᱟᱹᱦᱤᱡ ᱚᱞ ᱛᱟᱦᱮᱸᱱᱟ ᱾ ᱱᱚᱣᱟ ᱰᱷᱟᱸᱪᱟ +ᱵᱮᱵᱷᱟᱨ ᱠᱟᱛᱮ ᱡᱟᱦᱟᱸᱭ ᱜᱮ ᱟᱠᱚᱣᱟᱜ ᱥᱟᱶᱛᱟ ᱞᱟᱹᱜᱤᱫ ᱱᱚᱝᱠᱟᱱ ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱠᱚ ᱥᱟᱯᱲᱟᱣ +ᱫᱟᱲᱮᱭᱟᱜᱼᱟ ᱾ +ᱪᱟᱞᱟᱜ ᱠᱟᱱ ᱠᱟᱹᱢᱤ +ᱟᱞᱮ ᱱᱚᱣᱟ ᱨᱮᱞᱮ ᱠᱟᱹᱢᱤ ᱠᱟᱱᱟ: +ᱡᱚᱛᱚ ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱠᱟᱹᱢᱤ ᱟᱨ ᱢᱳᱵᱟᱭᱤᱞ/ᱤᱱᱴᱟᱨᱱᱮᱹᱴ ᱰᱮᱴᱟ ᱞᱟᱹᱜᱤᱫ ᱱᱟᱯᱟᱭ ᱥᱟᱹᱦᱤᱡ +ᱠᱩᱲᱟᱹᱭ ᱮᱢ ᱾ +ᱥᱮᱪᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱫ ᱵᱷᱤᱰᱤᱭᱳ ᱴᱤᱣᱴᱳᱨᱤᱭᱟᱞ ᱠᱚ ᱵᱮᱱᱟᱣ, ᱪᱮᱫᱟᱜ ᱥᱮ ᱟᱭᱢᱟ ᱦᱚᱲ +ᱞᱟᱹᱜᱤᱫ ᱚᱞ ᱛᱮ ᱯᱟᱲᱦᱟᱣ ᱟᱨ ᱵᱩᱡᱷᱟᱹᱣ ᱫᱚ ᱟᱸᱴ ᱜᱮᱭᱟ ᱾ +ᱠᱟᱹᱢᱤᱦᱚᱨᱟ ᱛᱟᱭᱚᱢ ᱡᱚᱛᱚ ᱟᱸᱥᱟᱱ ᱥᱮᱞᱮᱫᱤᱭᱟᱹ ᱠᱚ ᱥᱟᱶ ᱥᱟᱹᱜᱟᱹᱭ ᱨᱮ ᱛᱟᱦᱮᱸᱱ ᱨᱮᱱᱟᱜ +ᱢᱤᱫ ᱵᱤᱵᱚᱨᱚᱱ ᱥᱟᱯᱲᱟᱣ ᱟᱨ ᱩᱱᱠᱩ ᱞᱟᱹᱜᱤᱫ ᱧᱟᱢᱚᱜ ᱠᱟᱱ ᱜᱚᱲᱚ-ᱥᱚᱯᱚᱦᱚᱫ ᱾ +ᱥᱟᱯᱟᱵᱽ ᱠᱚ +ᱟᱞᱮ ᱥᱟᱶᱛᱟ ᱯᱟᱹᱨᱥᱤ ᱰᱚᱠᱩᱢᱮᱱᱴᱮᱥᱚᱱ ᱟᱨ ᱟᱨᱠᱟᱭᱤᱵᱤᱝ ᱥᱮᱪᱮᱫ, ᱣᱤᱠᱤᱵᱷᱟᱨᱥᱤᱴᱤ ᱨᱮ +ᱳᱯᱮᱱᱥᱯᱤᱠᱥ, ᱨᱚᱲ ᱱᱟᱜᱟᱢ ᱪᱷᱟᱸᱪ, ᱳᱯᱮᱱᱥᱯᱤᱠᱥ ᱥᱟᱯᱟᱵᱽ ᱠᱚ (ᱟᱥᱚᱠᱟᱭ ᱛᱮ +ᱥᱟᱵᱽᱴᱟᱭᱤᱴᱮᱞᱟᱨ), ᱟᱨ ᱳᱯᱮᱱᱥᱯᱤᱠᱥ ᱚᱞ ᱛᱚᱦᱚᱨ ᱫᱤᱥ-ᱦᱩᱫᱤᱥ ᱠᱷᱚᱱ ᱥᱟᱢᱟᱱ ᱠᱚ ᱞᱮ +ᱵᱮᱵᱷᱟᱨᱟ ᱟᱨ ᱞᱮ ᱵᱤᱰᱟᱹᱣᱟ ᱾ +ᱵᱷᱚᱞᱮᱱᱴᱤᱭᱟᱨᱥ +ᱵᱷᱚᱞᱮᱱᱴᱤᱭᱟᱨᱥ ᱞᱮᱠᱟᱛᱮ ᱥᱮᱞᱮᱫᱚᱜ ᱞᱟᱹᱜᱤᱫ ᱞᱟᱛᱟᱨ ᱨᱮ -- (ᱟᱢᱟᱜ ᱯᱟᱹᱨᱥᱤ) ᱥᱮᱞᱮᱫ +ᱢᱮ᱾ ᱵᱷᱚᱞᱮᱱᱴᱤᱭᱟᱨᱥ ᱠᱟᱹᱢᱤ ᱠᱚ ᱢᱩᱫᱽ ᱨᱮ ᱢᱮᱱᱟᱜᱼᱟ: ) ᱚᱱᱞᱟᱭᱤᱱ/ᱚᱯᱷᱞᱟᱭᱤᱱ ᱥᱮᱥᱚᱱ ᱠᱚ +ᱥᱟᱯᱲᱟᱣ, ) ᱡᱤᱱᱤᱥ ᱠᱚ ᱛᱚᱨᱡᱚᱢᱟ, ᱟᱨ ) ᱞᱟᱭᱤᱵᱷ ᱥᱮᱥᱚᱱ ᱠᱚ ᱨᱚᱲ ᱩᱪᱟᱹᱲ (ᱞᱟᱭᱤᱵᱷ +ᱛᱚᱨᱡᱚᱢᱟ)᱾ +ᱜᱚᱯᱚᱲᱚᱭᱤᱡ ᱠᱚ +ᱦᱚᱛᱮᱛᱮ ᱥᱟᱯᱲᱟᱣᱚᱜ ᱠᱟᱱ +ᱜᱚᱯᱚᱲᱚᱭᱤᱡ ᱠᱚ diff --git a/sat/scripts/01-prep-base.sh b/sat/scripts/01-prep-base.sh new file mode 100644 index 0000000..a23f7bf --- /dev/null +++ b/sat/scripts/01-prep-base.sh @@ -0,0 +1,208 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════ +# 01-prep-base.sh +# +# One-time setup for Santali LSTM training. +# +# What this does: +# A. Downloads tessdata_best/ori.traineddata (LSTM base for fine-tuning) +# B. Extracts output/ori.lstm (the raw LSTM weights) +# C. Creates output/sat.unicharset (full Ol Chiki block + punctuation) +# D. Builds tessdata_best/sat_base.traineddata via combine_lang_model +# (this traineddata is used ONLY for encoding GT during lstmf creation +# and as the --traineddata argument for lstmtraining) +# +# Why fine-tune from ori.traineddata? +# No LSTM model exists for Santali/Ol Chiki — not in tessdata_best, +# tessdata, or tessdata_contrib. The indic-ocr sat model is legacy (Pre-4.0.0) +# with no LSTM weights. Fine-tuning from ori gives a well-trained LSTM +# starting point; the output layer is completely rebuilt for Ol Chiki. +# Expect BCER to start ~50% (output layer rebuild) then drop rapidly. +# +# Run once before any training. Safe to re-run. +# ═══════════════════════════════════════════════════════════════ +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +TESSDATA_BEST="$SCRIPT_DIR/tessdata_best" +OUTPUT="$SCRIPT_DIR/output" +SYSTEM_TESSDATA="/opt/homebrew/share/tessdata" + +mkdir -p "$TESSDATA_BEST" "$OUTPUT" + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Step 1 — Santali training setup" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + +# ── A: Download ori LSTM base ────────────────────────────────── +echo "" +echo "→ [A] Base model..." +if [ ! -f "$TESSDATA_BEST/ori.traineddata" ]; then + echo " Downloading tessdata_best/ori.traineddata..." + curl -fL --progress-bar \ + "https://github.com/tesseract-ocr/tessdata_best/raw/main/ori.traineddata" \ + -o "$TESSDATA_BEST/ori.traineddata" + echo " Downloaded: $(du -h $TESSDATA_BEST/ori.traineddata | cut -f1)" +else + echo " Already present: tessdata_best/ori.traineddata" +fi + +# ── B: Extract LSTM weights ──────────────────────────────────── +echo "" +echo "→ [B] Extracting ori.lstm..." +combine_tessdata -e "$TESSDATA_BEST/ori.traineddata" "$OUTPUT/ori.lstm" 2>/dev/null +ls -lh "$OUTPUT/ori.lstm" +echo " (This is the starting point for fine-tuning)" + +# ── C: Create Santali unicharset ─────────────────────────────── +echo "" +echo "→ [C] Building Santali unicharset (Ol Chiki + punctuation)..." + +python3 << 'PYEOF' +from pathlib import Path + +# Full Ol Chiki Unicode block U+1C50–U+1C7F +# U+1C50-1C59: Digits (property 0 — not IsAlpha) +# U+1C5A-1C77: Letters (property 1 — IsAlpha) +# U+1C78-1C7D: Signs/modifiers (property 0) +# U+1C7E-1C7F: Punctuation (property 10) +# Plus common ASCII punct used alongside Ol Chiki text + +entries = [ + # (char, props, direction, script, type_suffix) +] + +# Ol Chiki digits +for cp in range(0x1C50, 0x1C5A): + entries.append((chr(cp), '0', '0', 'Ol_Chiki', 'x')) + +# Ol Chiki letters +for cp in range(0x1C5A, 0x1C78): + entries.append((chr(cp), '1', '0', 'Ol_Chiki', 'x')) + +# Ol Chiki signs / modifiers +for cp in range(0x1C78, 0x1C7E): + entries.append((chr(cp), '0', '0', 'Ol_Chiki', '')) + +# Ol Chiki punctuation +for cp in range(0x1C7E, 0x1C80): + entries.append((chr(cp), '10', '10', 'Ol_Chiki', 'p')) + +# Common ASCII punctuation that appears in Santali texts +ascii_punct = [ + ('.', '10', '10', 'Common', 'p'), + (',', '10', '10', 'Common', 'p'), + (':', '10', '10', 'Common', 'p'), + ('?', '10', '10', 'Common', 'p'), + ('!', '10', '10', 'Common', 'p'), + ('-', '10', '10', 'Common', 'p'), + ('/', '10', '10', 'Common', 'p'), + ('"', '10', '10', 'Common', 'p'), + ("'", '10', '10', 'Common', 'p'), + ('(', '10', '10', 'Common', 'p'), + (')', '10', '10', 'Common', 'p'), + ('*', '10', '10', 'Common', 'p'), + ('%', '10', '10', 'Common', 'p'), +] +entries.extend(ascii_punct) + +# ASCII digits +for ch in '0123456789': + entries.append((ch, '0', '0', 'Common', 'x')) + +uid = 3 # 0=NULL, 1=Joined, 2=Broken +lines = [f'{len(entries) + 3}\n'] # count line (updated below) +lines.append('NULL 0 NULL 0\n') +lines.append('Joined 7 0,69,188,255,486,1218,0,30,486,1188 Latin 1 0 1 Joined\t# Joined [4a 6f 69 6e 65 64 ]a\n') +lines.append('|Broken|0|1 f 0,69,186,255,892,2138,0,80,892,2058 Common 2 10 2 |Broken|0|1\t# Broken\n') + +for char, props, direction, script, type_sfx in entries: + hex_cp = ' '.join(f'{ord(c):x}' for c in char) + comment_type = f' ]{type_sfx}' if type_sfx else ' ]' + line = (f'{char} {props} 0,255,0,255,0,0,0,0,0,0 {script}' + f' {uid} {direction} {uid} {char}\t' + f'# {char} [{hex_cp}{comment_type}\n') + lines.append(line) + uid += 1 + +# Patch the count +lines[0] = f'{uid}\n' + +out = Path('output/sat.unicharset') +out.write_text(''.join(lines), encoding='utf-8') +print(f' {uid} entries in unicharset → output/sat.unicharset') +print(f' Ol Chiki: 10 digits + 30 letters + 6 signs + 2 punct = 48') +print(f' ASCII punct: {len(ascii_punct)} ASCII digits: 10') +PYEOF + +# ── D: Build sat_base.traineddata ───────────────────────────── +echo "" +echo "→ [D] Building tessdata_best/sat_base.traineddata..." + +LANGMODEL_OUT="output/langmodel_tmp" +mkdir -p "$LANGMODEL_OUT" + +# combine_lang_model needs radical-stroke.txt (for CJK) — create a dummy if absent +if [ ! -f "$SYSTEM_TESSDATA/radical-stroke.txt" ]; then + printf "0\n" > "$SYSTEM_TESSDATA/radical-stroke.txt" + echo " Created dummy radical-stroke.txt" +fi + +mkdir -p "$SYSTEM_TESSDATA/sat_base" +touch "$SYSTEM_TESSDATA/sat_base/sat_base.config" + +build_ok=0 + +if combine_lang_model \ + --input_unicharset output/sat.unicharset \ + --script_dir "$SYSTEM_TESSDATA" \ + --output_dir "$LANGMODEL_OUT" \ + --lang sat_base 2>/dev/null; then + echo " Built with compressed recoder." + build_ok=1 +fi + +if [ "$build_ok" -eq 0 ]; then + echo " Trying --pass_through_recoder..." + if combine_lang_model \ + --input_unicharset output/sat.unicharset \ + --script_dir "$SYSTEM_TESSDATA" \ + --output_dir "$LANGMODEL_OUT" \ + --lang sat_base \ + --pass_through_recoder 2>&1 | grep -v "^Warning\|^Failed\|^Config"; then + echo " Built with pass-through recoder." + build_ok=1 + fi +fi + +[ "$build_ok" -eq 1 ] || { echo "ERROR: combine_lang_model failed."; exit 1; } + +BUILT="$LANGMODEL_OUT/sat_base/sat_base.traineddata" +[ -f "$BUILT" ] || { echo "ERROR: expected $BUILT not created."; exit 1; } + +cp "$BUILT" "$TESSDATA_BEST/sat_base.traineddata" +ls -lh "$TESSDATA_BEST/sat_base.traineddata" + +# Verify the unicharset is inside +combine_tessdata -u "$TESSDATA_BEST/sat_base.traineddata" /tmp/sat_base_verify 2>/dev/null +UC_COUNT=$(head -1 /tmp/sat_base_verify.lstm-unicharset | tr -d ' ') +echo " Unicharset entries in sat_base.traineddata: $UC_COUNT" + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Setup complete." +echo "" +echo " Base model: tessdata_best/ori.traineddata" +echo " LSTM weights: output/ori.lstm" +echo " Santali unicharset: output/sat.unicharset ($UC_COUNT entries)" +echo " Training traineddata: tessdata_best/sat_base.traineddata" +echo "" +echo " NEXT STEPS:" +echo " 1. python3 render-corpus.py (renders synthetic images)" +echo " 2. ./02-make-lstmf.sh (creates .lstmf training files)" +echo " 3. caffeinate -i ./03-train.sh (starts training)" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" diff --git a/sat/scripts/02-make-lstmf.sh b/sat/scripts/02-make-lstmf.sh new file mode 100644 index 0000000..556a3ef --- /dev/null +++ b/sat/scripts/02-make-lstmf.sh @@ -0,0 +1,172 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════ +# 02-make-lstmf.sh +# +# Converts PNG+gt.txt pairs into .lstmf training files. +# +# Scans two directories: +# rendered/ — synthetic images from render-corpus.py +# scan-input/ — real scan images you supply (PNG + matching .gt.txt) +# +# Box file format: cluster-per-character (NOT WordStr). +# WordStr format stores "WordStr" as the transcription in the lstmf, +# causing "Can't encode transcription: 'WordStr'" errors in lstmtraining. +# Instead, each Ol Chiki character gets its own equal-width x-slice box. +# +# Output: +# lstmf/rendered/ — lstmf from synthetic images +# lstmf/scan/ — lstmf from real scan images +# lstmf/list.txt — combined training file list +# +# Prerequisites: +# Run 01-prep-base.sh first (needs tessdata_best/sat_base.traineddata) +# ═══════════════════════════════════════════════════════════════ +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +TESSDATA_BEST="$SCRIPT_DIR/tessdata_best" +OUTPUT_LSTMF="$SCRIPT_DIR/lstmf" +RENDERED_DIR="$SCRIPT_DIR/rendered" +SCAN_DIR="$SCRIPT_DIR/scan-input" + +[ -f "$TESSDATA_BEST/sat_base.traineddata" ] || { + echo "ERROR: tessdata_best/sat_base.traineddata not found." + echo " Run ./01-prep-base.sh first." + exit 1 +} +[ -f "$TESSDATA_BEST/configs/lstm.train" ] || { + echo "ERROR: tessdata_best/configs/lstm.train not found." + exit 1 +} + +mkdir -p "$OUTPUT_LSTMF/rendered" "$OUTPUT_LSTMF/scan" +> "$OUTPUT_LSTMF/list.txt" + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Step 2 — PNG+GT → lstmf" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + +process_dir() { + local src_dir="$1" + local out_dir="$2" + local label="$3" + + if [ ! -d "$src_dir" ]; then + echo " $label: directory not found, skipping" + return + fi + + local count + count=$(find "$src_dir" -maxdepth 1 \( -name "*.png" -o -name "*.jpg" \ + -o -name "*.tif" -o -name "*.ppm" \) 2>/dev/null | wc -l | tr -d ' ') + if [ "$count" -eq 0 ]; then + echo " $label: no images found in $src_dir" + return + fi + + echo "" + echo "→ Processing $label ($count images from $src_dir)..." + + # Run Python to create cluster-format box files and lstmf + python3 - "$src_dir" "$out_dir" "$OUTPUT_LSTMF/list.txt" "$label" << 'PYEOF' +import sys, unicodedata, subprocess, shutil +from pathlib import Path +from PIL import Image + +src_dir, out_dir, list_txt, label = sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4] +TESSDATA_BEST = "tessdata_best" + +def ol_chiki_clusters(text): + """Split Ol Chiki text into character clusters. + Ol Chiki signs U+1C78-U+1C7D (category Lm) are modifiers that attach + visually to the preceding letter — group them with it. All other chars + (digits, letters, punct, space) are standalone clusters. + """ + clusters, chars, i = [], list(text), 0 + while i < len(chars): + c = chars[i]; cl = c; i += 1 + while i < len(chars) and unicodedata.category(chars[i]) in ('Lm', 'Mn', 'Mc', 'Cf'): + cl += chars[i]; i += 1 + clusters.append(cl) + return [c for c in clusters if c.strip()] + +def make_lstmf(img_path, out_dir, list_file): + img_path = Path(img_path) + gt_path = img_path.with_suffix('.gt.txt') + if not img_path.exists() or not gt_path.exists(): + return False + + gt_text = gt_path.read_text(encoding='utf-8').strip() + clusters = ol_chiki_clusters(gt_text) + if not clusters: + return False + + out_dir = Path(out_dir) + stem = img_path.stem + dst_png = out_dir / (stem + '.png') + box_path = out_dir / (stem + '.box') + lstmf = out_dir / (stem + '.lstmf') + + shutil.copy2(img_path, dst_png) + img = Image.open(dst_png) + W, H = img.size + n = len(clusters) + cw = W / n + # One equal-width x-slice per cluster — cluster format, NOT WordStr + lines = [f"{c} {int(i*cw)} 0 {int((i+1)*cw)} {H} 0" + for i, c in enumerate(clusters)] + lines.append("\t 0 0 1 1 0") + box_path.write_text("\n".join(lines) + "\n", encoding='utf-8') + + # PSM 7 (single line) → PSM 6 (block) → PSM 10 (single char) fallback + for psm in ("7", "6", "10"): + subprocess.run( + ["tesseract", str(dst_png), str(out_dir / stem), + "--tessdata-dir", TESSDATA_BEST, + "--dpi", "300", "--psm", psm, + "-l", "sat_base", "lstm.train"], + capture_output=True, text=True + ) + if lstmf.exists(): + with open(list_file, 'a', encoding='utf-8') as lf: + lf.write(str(lstmf) + '\n') + return True + + dst_png.unlink(missing_ok=True) + box_path.unlink(missing_ok=True) + return False + +imgs = sorted( + [p for p in Path(src_dir).iterdir() + if p.suffix.lower() in ('.png', '.jpg', '.tif', '.tiff', '.ppm')] +) +pass_n = fail_n = skip_n = 0 +for img in imgs: + gt = img.with_suffix('.gt.txt') + if not gt.exists(): + skip_n += 1 + continue + if make_lstmf(img, out_dir, list_txt): + pass_n += 1 + else: + fail_n += 1 + +print(f" {label}: {pass_n} OK {fail_n} failed {skip_n} skipped (no gt.txt)") +PYEOF +} + +process_dir "$RENDERED_DIR" "$OUTPUT_LSTMF/rendered" "Synthetic rendered" +process_dir "$SCAN_DIR" "$OUTPUT_LSTMF/scan" "Real scan images" + +TOTAL=$(wc -l < "$OUTPUT_LSTMF/list.txt" | tr -d ' ') + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Done. lstmf/list.txt contains $TOTAL files." +echo "" +echo " NEXT: caffeinate -i ./03-train.sh > training.log 2>&1 &" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" diff --git a/sat/scripts/03-train.sh b/sat/scripts/03-train.sh new file mode 100644 index 0000000..1403a4d --- /dev/null +++ b/sat/scripts/03-train.sh @@ -0,0 +1,87 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════ +# 03-train.sh +# +# Fine-tunes the Santali LSTM model from ori (Odia) base weights. +# +# Because there is no existing LSTM model for Santali/Ol Chiki, +# we use ori.traineddata as the starting point. The LSTM output +# layer is completely rebuilt for the Santali unicharset. +# +# What to expect: +# Iters 0–500: BCER ~50% (output layer rebuild — normal) +# Iters 500–2000: BCER drops rapidly as Ol Chiki shapes are learned +# Iters 2000+: Steady improvement toward 1–5% range +# Plateau: Stop when BCER shows no new best for ~5,000 iters +# +# Checkpoints saved every 100 iterations. +# Safe to stop with Ctrl+C — resumes from latest checkpoint. +# +# Usage: +# caffeinate -i ./03-train.sh > training.log 2>&1 & +# tail -f training.log +# ═══════════════════════════════════════════════════════════════ +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +TESSDATA_BEST="$SCRIPT_DIR/tessdata_best" +OUTPUT="$SCRIPT_DIR/output" +LSTMF_DIR="$SCRIPT_DIR/lstmf" +MODEL_NAME="sat_v1" + +[ -f "$LSTMF_DIR/list.txt" ] || { echo "ERROR: lstmf/list.txt not found. Run 02-make-lstmf.sh first."; exit 1; } +LSTMF_COUNT=$(wc -l < "$LSTMF_DIR/list.txt" | tr -d ' ') +[ "$LSTMF_COUNT" -gt 0 ] || { echo "ERROR: lstmf/list.txt is empty."; exit 1; } + +MAX_ITERATIONS=400000 +LEARNING_RATE=0.001 + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Step 3 — LSTM Fine-tuning (Santali / Ol Chiki)" +echo " Base: output/latin.lstm (fine-tuned from Latin)" +echo " Training data: $LSTMF_COUNT .lstmf files" +echo " Iterations: $MAX_ITERATIONS max" +echo " Learning rate: $LEARNING_RATE" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +# Checkpoint selection — resume from most recent checkpoint if available +# Otherwise start from ori.lstm (the initial base) +if [ -z "$CONTINUE_FROM" ]; then + RECENT=$(ls "$OUTPUT"/${MODEL_NAME}_*.checkpoint 2>/dev/null | \ + grep -v '_checkpoint$' | sort -t_ -k4 -n | tail -1) + if [ -n "$RECENT" ]; then + CONTINUE_FROM="$RECENT" + echo "→ Resuming from: $(basename $CONTINUE_FROM)" + elif [ -f "$OUTPUT/${MODEL_NAME}_checkpoint" ]; then + CONTINUE_FROM="$OUTPUT/${MODEL_NAME}_checkpoint" + echo "→ Resuming from rolling checkpoint" + else + CONTINUE_FROM="$OUTPUT/latin.lstm" + echo "→ Starting fresh from latin.lstm (first run)" + fi +else + echo "→ Using explicit checkpoint: $(basename $CONTINUE_FROM)" +fi + +echo "" + +lstmtraining \ + --continue_from "$CONTINUE_FROM" \ + --old_traineddata "$TESSDATA_BEST/Latin.traineddata" \ + --model_output "$OUTPUT/$MODEL_NAME" \ + --traineddata "$TESSDATA_BEST/sat_base.traineddata" \ + --train_listfile "$LSTMF_DIR/list_run7.txt" \ + --learning_rate "$LEARNING_RATE" \ + --net_mode 16 \ + --max_iterations "$MAX_ITERATIONS" \ + --target_error_rate -1 + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Training done. NEXT: ./04-package.sh" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" diff --git a/sat/scripts/04-package.sh b/sat/scripts/04-package.sh new file mode 100644 index 0000000..97b543f --- /dev/null +++ b/sat/scripts/04-package.sh @@ -0,0 +1,86 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════ +# 04-package.sh +# +# Packages the best training checkpoint into a usable .traineddata. +# +# IMPORTANT — checkpoint selection: +# The script picks the checkpoint with the LOWEST BCER (second field +# of the filename, e.g. sat_v1_2.341_4500_18200.checkpoint → 2.341%). +# Review the training log to confirm this is the intended best. +# To override, set: export BEST_CHECKPOINT=/path/to/specific.checkpoint +# +# Output: +# output/sat_v1.traineddata +# +# To install: +# cp output/sat_v1.traineddata /opt/homebrew/share/tessdata/ +# tesseract myimage.tif result -l sat_v1 +# ═══════════════════════════════════════════════════════════════ +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +TESSDATA_BEST="$SCRIPT_DIR/tessdata_best" +OUTPUT="$SCRIPT_DIR/output" +MODEL_NAME="sat_v1" + +[ -f "$OUTPUT/${MODEL_NAME}_checkpoint" ] || { + echo "ERROR: output/${MODEL_NAME}_checkpoint not found." + echo " Run 03-train.sh first." + exit 1 +} + +if [ -z "$BEST_CHECKPOINT" ]; then + BEST_CHECKPOINT=$(ls "$OUTPUT"/${MODEL_NAME}_*.checkpoint 2>/dev/null | \ + grep -v '_checkpoint$' | sort -t_ -k2 -n | head -1) +fi + +[ -n "$BEST_CHECKPOINT" ] || BEST_CHECKPOINT="$OUTPUT/${MODEL_NAME}_checkpoint" + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Step 4 — Packaging model" +echo " Source: $(basename $BEST_CHECKPOINT)" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +lstmtraining \ + --stop_training \ + --continue_from "$BEST_CHECKPOINT" \ + --traineddata "$TESSDATA_BEST/sat_base.traineddata" \ + --old_traineddata "$TESSDATA_BEST/ori.traineddata" \ + --model_output "$OUTPUT/${MODEL_NAME}.lstm" + +# Strip Tesseract 5.5.x macOS corrupt header (if present) +python3 - "$OUTPUT/${MODEL_NAME}.lstm" << 'PYEOF' +import sys, os +path = sys.argv[1] +data = open(path, 'rb').read() +needle = b'\x00\x06\x00\x00\x00Series' +idx = data.find(needle) +if idx > 0: + print(f" Stripping {idx}-byte corrupt header") + open(path, 'wb').write(data[idx:]) +else: + print(" .lstm header clean — no stripping needed") +PYEOF + +# Bundle into traineddata (start from sat_base — preserves Santali unicharset) +cp "$TESSDATA_BEST/sat_base.traineddata" "$OUTPUT/${MODEL_NAME}.traineddata" +combine_tessdata \ + -o "$OUTPUT/${MODEL_NAME}.traineddata" \ + "$OUTPUT/${MODEL_NAME}.lstm" + +ls -lh "$OUTPUT/${MODEL_NAME}.traineddata" + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " Model ready: output/${MODEL_NAME}.traineddata" +echo "" +echo " To install:" +echo " cp output/${MODEL_NAME}.traineddata /opt/homebrew/share/tessdata/" +echo " tesseract your-scan.tif result -l ${MODEL_NAME}" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" diff --git a/sat/scripts/05-test.sh b/sat/scripts/05-test.sh new file mode 100644 index 0000000..e17fc8d --- /dev/null +++ b/sat/scripts/05-test.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# ═══════════════════════════════════════════════════════════════ +# 05-test.sh — Quick OCR test on a single image. +# +# Usage: +# ./05-test.sh [ground-truth.txt] +# +# Example: +# ./05-test.sh test-images/sample.png test-images/sample.gt.txt +# ═══════════════════════════════════════════════════════════════ +set -e + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +IMAGE="${1:-}" +GT="${2:-}" + +[ -n "$IMAGE" ] || { echo "Usage: $0 [ground-truth.txt]"; exit 1; } +[ -f "$IMAGE" ] || { echo "ERROR: image not found: $IMAGE"; exit 1; } + +SYSTEM_TESSDATA="/opt/homebrew/share/tessdata" + +echo "" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo " OCR test: $(basename $IMAGE)" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "" + +for model in sat_v1 sat_indicocr; do + if [ -f "$SYSTEM_TESSDATA/${model}.traineddata" ]; then + oem=1 + [ "$model" = "sat_indicocr" ] && oem=0 + echo "── $model (oem $oem) ──" + tesseract "$IMAGE" stdout \ + --tessdata-dir "$SYSTEM_TESSDATA" \ + -l "$model" --psm 7 --oem "$oem" 2>/dev/null || echo "(no output)" + else + echo "── $model: not installed ──" + fi +done + +if [ -n "$GT" ] && [ -f "$GT" ]; then + echo "" + echo "── Ground truth ──" + cat "$GT" +fi +echo "" diff --git a/sat/scripts/06-scan-to-lstmf.py b/sat/scripts/06-scan-to-lstmf.py new file mode 100644 index 0000000..1323838 --- /dev/null +++ b/sat/scripts/06-scan-to-lstmf.py @@ -0,0 +1,218 @@ +#!/usr/bin/env python3 +""" +06-scan-to-lstmf.py + +Splits a scanned page + ground-truth text file into individual line +training pairs and converts them to .lstmf files using the same +cluster-box format as 02-make-lstmf.sh. + +Usage: + cd sat-tesseract-training/ + python3 06-scan-to-lstmf.py [--prefix ganam] +""" + +import argparse +import shutil +import subprocess +import sys +import unicodedata +from pathlib import Path + +import numpy as np +from PIL import Image + +# ── Paths (relative to sat-tesseract-training/) ─────────────────────────────── +TESSDATA_BEST = "tessdata_best" +SCAN_LSTMF = Path("lstmf/scan") +LIST_FILE = Path("lstmf/list.txt") + +# ── Line detection ───────────────────────────────────────────────────────────── +ROW_THR = 0.05 # fraction of row-max to count as text row +MIN_HEIGHT = 6 # min px height to keep a region +SPARSE_FRAC = 0.22 # regions with peak below this × median → skip (stray mark) +UPSCALE = 2 # upscale factor for better pixel density +VPAD = 4 # vertical padding in original pixels around each line + +def detect_lines(gray_arr): + binary = gray_arr < 180 + proj = binary.sum(axis=1) + thr = proj.max() * ROW_THR + lines, in_text, start = [], False, 0 + for i, v in enumerate(proj): + if v > thr and not in_text: + start, in_text = i, True + elif v <= thr and in_text: + if i - start >= MIN_HEIGHT: + lines.append((start, i, int(proj[start:i].max()))) + in_text = False + if in_text and (len(proj) - start) >= MIN_HEIGHT: + lines.append((start, len(proj), int(proj[start:].max()))) + return lines + +def filter_lines(lines): + if not lines: + return [], [] + peaks = sorted(pk for _, _, pk in lines) + med_pk = peaks[len(peaks) // 2] + sparse = med_pk * SPARSE_FRAC + heights = sorted(e - s for s, e, _ in lines) + med_h = heights[len(heights) // 2] + kept, skipped = [], [] + last = len(lines) - 1 + dense = med_pk * 1.5 + for i, (s, e, pk) in enumerate(lines): + if i == 0 and ((e - s) > med_h * 1.3 or pk > dense): + skipped.append(i) + continue + if i == last and (e - s) > med_h * 1.25: + skipped.append(i) + continue + if (e - s) > med_h * 1.7: # any line much taller than median → non-body element + skipped.append(i) + continue + if pk < sparse: # very sparse → stray mark + skipped.append(i) + continue + kept.append((s, e, pk)) + return kept, skipped + +# ── Ol Chiki helpers ────────────────────────────────────────────────────────── +def is_ol_chiki(c): + return 0x1C50 <= ord(c) <= 0x1C7F + +def ol_chiki_clusters(text): + clusters, chars, i = [], list(text), 0 + while i < len(chars): + c = chars[i]; cl = c; i += 1 + while i < len(chars) and unicodedata.category(chars[i]) in ('Lm', 'Mn', 'Mc', 'Cf'): + cl += chars[i]; i += 1 + clusters.append(cl) + return [c for c in clusters if c.strip()] + +# ── lstmf creation ──────────────────────────────────────────────────────────── +def make_lstmf(png_path, gt_text): + """Create cluster-format box file and run tesseract lstm.train.""" + png_path = Path(png_path) + img = Image.open(png_path) + W, H = img.size + + clusters = ol_chiki_clusters(gt_text) + if not clusters: + return False + + # Write .gt.txt (needed by 02-make-lstmf if re-run later) + png_path.with_suffix('.gt.txt').write_text(gt_text + '\n', encoding='utf-8') + + # Cluster-format box file: equal-width x-slices, one per cluster + box_path = png_path.with_suffix('.box') + n = len(clusters) + cw = W / n + lines = [f"{c} {int(i*cw)} 0 {int((i+1)*cw)} {H} 0" + for i, c in enumerate(clusters)] + lines.append("\t 0 0 1 1 0") + box_path.write_text("\n".join(lines) + "\n", encoding='utf-8') + + # PSM 7 → 6 → 10 fallback (same order as 02-make-lstmf.sh) + lstmf = png_path.with_suffix('.lstmf') + for psm in ("7", "6", "10"): + subprocess.run( + ["tesseract", str(png_path), str(png_path.with_suffix('')), + "--tessdata-dir", TESSDATA_BEST, + "--dpi", "300", "--psm", psm, + "-l", "sat_base", "lstm.train"], + capture_output=True, text=True + ) + if lstmf.exists(): + return True + return False + +# ── Main ────────────────────────────────────────────────────────────────────── +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('image') + parser.add_argument('gt') + parser.add_argument('--prefix', default=None) + args = parser.parse_args() + + prefix = args.prefix or Path(args.image).stem + + img = Image.open(args.image).convert('RGB') + gray_arr = np.array(img.convert('L')) + + # Load GT: keep only non-blank lines with Ol Chiki chars + raw_gt = Path(args.gt).read_text(encoding='utf-8').splitlines() + gt_lines = [ln.strip() for ln in raw_gt + if ln.strip() and any(is_ol_chiki(c) for c in ln)] + + print(f"\n Image: {args.image} ({img.size[0]}×{img.size[1]}px)") + print(f" GT lines: {len(gt_lines)}") + + all_lines = detect_lines(gray_arr) + kept, skipped_idx = filter_lines(all_lines) + + print(f" Detected: {len(all_lines)} regions → kept {len(kept)}, " + f"skipped {len(skipped_idx)} (indices: {skipped_idx})") + + if len(kept) != len(gt_lines): + print(f"\n MISMATCH: {len(kept)} image lines vs {len(gt_lines)} GT lines") + print("\n All detected regions:") + for i, (s, e, pk) in enumerate(all_lines): + tag = 'SKIP' if i in skipped_idx else 'keep' + print(f" L{i+1:02d} y={s}–{e} h={e-s}px peak={pk} [{tag}]") + print("\n GT lines:") + for i, ln in enumerate(gt_lines): + print(f" {i+1:2d}: {ln[:60]}") + sys.exit(1) + + SCAN_LSTMF.mkdir(parents=True, exist_ok=True) + + # Track existing list entries to avoid duplicates + existing = set() + if LIST_FILE.exists(): + existing = set(LIST_FILE.read_text(encoding='utf-8').splitlines()) + + ok = fail = 0 + new_paths = [] + + print() + for idx, ((y0, y1, _), gt_text) in enumerate(zip(kept, gt_lines)): + name = f"{prefix}_line{idx+1:04d}" + png_path = SCAN_LSTMF / f"{name}.png" + lstmf = SCAN_LSTMF / f"{name}.lstmf" + + # Crop line with padding, upscale 2× + H_orig, W_orig = gray_arr.shape + top = max(0, y0 - VPAD) + bottom = min(H_orig, y1 + VPAD) + line_img = img.crop((0, top, W_orig, bottom)) + line_img = line_img.resize( + (line_img.width * UPSCALE, line_img.height * UPSCALE), + Image.LANCZOS + ) + line_img.save(str(png_path)) + + if make_lstmf(png_path, gt_text): + ok += 1 + abs_path = str(lstmf.resolve()) + if abs_path not in existing: + new_paths.append(abs_path) + preview = gt_text[:55] + ('…' if len(gt_text) > 55 else '') + print(f" OK {name} {preview}") + else: + fail += 1 + print(f" FAIL {name}") + + if new_paths: + with LIST_FILE.open('a', encoding='utf-8') as f: + for p in new_paths: + f.write(p + '\n') + + total = sum(1 for ln in LIST_FILE.read_text(encoding='utf-8').splitlines() if ln.strip()) + + print(f"\n Done: {ok} OK, {fail} failed") + print(f" Added {len(new_paths)} new entries to {LIST_FILE}") + print(f" Total training files: {total}") + print() + +if __name__ == '__main__': + main() diff --git a/sat/test-images/AjayGada-2022-53.gt.txt b/sat/test-images/AjayGada-2022-53.gt.txt new file mode 100644 index 0000000..11e3b28 --- /dev/null +++ b/sat/test-images/AjayGada-2022-53.gt.txt @@ -0,0 +1,33 @@ +ᱡᱩᱢᱤᱫ + +ᱥᱮᱫᱟᱭ ᱠᱷᱚᱱ ᱵᱚᱱ ᱞᱟᱹᱭ ᱟᱹᱜᱩᱭᱮᱫ +ᱥᱟᱱᱟᱢ ᱥᱟᱱᱛᱟᱮ ᱵᱚᱱ ᱡᱩᱢᱤᱫᱚᱜ, +ᱮᱰᱮ ᱟᱱᱟᱳᱼ ᱦᱟᱨᱠᱮᱛ ᱥᱟᱥᱮᱛ +ᱢᱤᱫ ᱢᱤᱫ ᱛᱮ ᱢᱩᱪᱟᱹᱫᱚᱜ ᱾ + +ᱩᱱᱟᱹᱜ ᱯᱤᱲᱦᱤ ᱯᱟᱨᱚᱢ ᱮᱱᱟ +ᱡᱩᱢᱤᱽ ᱚᱜ ᱜᱮᱵᱚᱱ ᱢᱮᱢᱮᱱ ᱠᱟᱱᱮ, +ᱱᱚᱝᱠᱟ ᱛᱮᱜᱮ ᱥᱟᱱᱟᱢ ᱟᱹᱭᱫᱟᱹᱨ +ᱟᱵᱚᱫᱚᱵᱚᱱ ᱮᱸᱲᱮᱜ ᱠᱟᱱ ᱾ + +ᱩᱭᱦᱟᱹᱨ ᱛᱟᱵᱚᱱ ᱯᱮᱥᱮ ᱡᱩᱢᱤᱫ ᱚᱠᱟᱠᱚ ᱢᱮᱱᱟ +ᱵᱟᱵᱟ ᱛᱤᱞᱠᱟᱹᱤᱵᱤᱨ ᱥᱤᱫᱩ ᱠᱟᱱᱩᱤᱪᱟᱫᱪ ᱵᱷᱟᱭᱨᱚ +ᱯᱷᱩᱞᱚ ᱡᱷᱟᱱᱚ ᱵᱤᱫᱟᱹᱞ ᱨᱮᱭᱟᱜ ᱠᱟᱛᱷᱟ +ᱡᱩᱢᱤᱫ ᱜᱮᱠᱚ ᱩᱫᱩᱜ ᱞᱮᱫᱟ ᱫᱷᱟᱹᱨᱛᱤ ᱛᱟᱞᱟ ᱾ + +ᱩᱱᱟᱹᱜ ᱢᱟᱭᱟᱢ ᱞᱤᱸᱜᱤᱞᱮᱱᱮ ᱡᱤᱣᱤ ᱪᱟᱞᱟᱣ ᱞᱮᱱ +ᱮᱱᱦᱚᱸ ᱥᱟᱱᱛᱟᱲ ᱦᱚᱯᱚᱱ ᱵᱟᱠᱚ ᱯᱟᱹᱪᱟᱹᱜᱟ, +ᱞᱟᱹᱹᱼᱯᱦᱟᱭ ᱨᱮᱱᱟᱜ ᱛᱟᱹᱯᱤᱥ ᱛᱮ +ᱱᱤᱛ ᱦᱚᱠᱚ ᱞᱟᱹᱲᱦᱟᱹᱭ ᱮᱫᱟ ᱦᱚᱠ ᱟᱹᱭᱫᱟᱹᱨ ᱞᱟᱹᱜᱤᱫ ᱛᱮ ᱾ + +ᱯᱩᱸᱰ ᱦᱟᱨᱛᱟ ᱤᱝᱨᱮᱡᱽ ᱠᱚ ᱯᱟᱦᱩᱮᱮᱱ +ᱩᱱᱠᱩ ᱦᱩᱞ ᱜᱟᱹᱨᱤᱭᱟᱹ ᱠᱚ ᱠᱷᱟᱹᱛᱤᱨ ᱛᱮᱜᱮ +ᱥᱟᱱᱛᱟᱲ ᱯᱟᱨᱜᱟᱱᱟ ᱫᱤᱥᱚᱢ ᱛᱮᱭᱟᱨ ᱞᱮᱱ +ᱚᱛ ᱦᱟᱥᱟ ᱫᱷᱚᱱ ᱫᱩᱨᱤᱵ ᱴᱮᱠᱟᱣ ᱫᱟᱨᱟᱢ ᱞᱮᱱ ᱾ + +ᱟᱹᱱ ᱟᱹᱨᱤ ᱦᱚᱸ ᱵᱮᱱᱟᱣ ᱮᱱ +ᱱᱺᱤᱛ ᱥᱟᱱᱛᱟᱲ ᱦᱚᱯᱚᱱ ᱴᱷᱮᱱ +ᱚᱴᱵᱚ ᱦᱚᱲᱢᱚ ᱥᱤᱨ ᱥᱤᱨ ᱛᱮᱦᱚᱸ +ᱦᱩᱞ ᱜᱟᱹᱨᱤᱭᱟᱹ ᱢᱟᱭᱟᱢ ᱞᱤᱸᱜᱤ ᱮᱱ ᱾ + +ᱚᱡᱚᱭ ᱜᱟᱰᱟ \ No newline at end of file diff --git a/sat/test-images/AjayGada-2022-53.jpg b/sat/test-images/AjayGada-2022-53.jpg new file mode 100644 index 0000000..c9f4564 Binary files /dev/null and b/sat/test-images/AjayGada-2022-53.jpg differ diff --git a/sat/test-images/AjayGada-2022-67.gt.txt b/sat/test-images/AjayGada-2022-67.gt.txt new file mode 100644 index 0000000..120d3e4 --- /dev/null +++ b/sat/test-images/AjayGada-2022-67.gt.txt @@ -0,0 +1,31 @@ +ᱪᱟᱸᱫᱳ + +ᱪᱟᱸᱫᱳ ᱵᱮᱜᱚᱨ ᱫᱷᱟᱹᱨᱛᱤ ᱧᱩᱛᱟᱹᱛ +ᱱᱚᱣᱟ ᱫᱚ ᱮᱠᱟᱞ ᱥᱟᱹᱨᱤ, +ᱥᱤᱧ ᱪᱟᱸᱫᱳ ᱟᱜ ᱛᱟᱨᱟᱥ ᱛᱮᱜᱮ +ᱡᱤᱶᱤ ᱫᱚ ᱢᱮᱱᱟᱜ ᱨᱤᱠᱤᱲ ᱾ +ᱢᱟᱹᱱᱢᱤ ᱢᱚᱱᱮᱨᱮ ᱢᱮᱱᱟᱜ ᱢᱮᱭᱟ +ᱟᱢᱫᱚ ᱥᱟᱲᱟ ᱜᱷᱟᱹᱲᱤᱡ, +ᱥᱤᱨᱡᱟᱹᱶ ᱱᱟᱥᱟᱶ ᱫᱟᱲᱮ +ᱢᱮᱱᱟᱜ ᱛᱟᱢᱟ ᱥᱟᱹᱨᱤ ᱾ +ᱥᱮᱛᱟᱜ ᱛᱚᱨᱟ ᱫᱷᱟᱹᱨᱛᱤᱢ ᱡᱟᱠᱟᱛ +ᱟᱢᱫᱚᱢ ᱢᱟᱨᱥᱟᱞ ᱮᱫ, +ᱧᱤᱫᱟᱹ ᱨᱩᱯ ᱵᱟᱨᱟᱳᱹ ᱜᱮ +ᱥᱟᱡ ᱞᱮᱠᱟ ᱡᱷᱟᱞᱠᱟᱜ ᱾ +ᱟᱢᱟᱜ ᱨᱩᱯᱜᱮᱢ ᱵᱚᱫᱚᱞ ᱟᱠᱟᱛ ᱞᱮᱠᱟ, +ᱟᱢᱫᱚᱢ ᱧᱮᱞᱚᱜ ᱠᱟᱱᱟ +ᱟᱢᱟᱜ ᱨᱩᱯ ᱛᱮ ᱫᱟᱲᱮ ᱱᱟᱹᱲᱤ +ᱱᱟᱯᱟᱭ ᱥᱟᱡᱟᱣ ᱟᱠᱟᱱ ᱞᱮᱠᱟ ᱾ +ᱢᱮᱛ ᱜᱮ ᱵᱟᱜᱼ ᱚᱱᱟ ᱨᱩᱯ ᱠᱷᱚᱱ ᱫᱚ ᱮᱠᱟᱞ +ᱨᱩᱯ ᱛᱟᱢ ᱯᱟᱱᱛᱮ ᱧᱟᱢ ᱞᱟᱹᱜᱤᱫ +ᱢᱤᱱᱟᱜ ᱠᱚᱣᱟ ᱟᱠᱟᱞ ᱥᱟᱠᱟᱞ ᱾ +ᱥᱟᱹᱜᱤᱧ ᱫᱤᱥᱚᱢ ᱫᱩᱞᱟᱹᱲᱤᱭᱟᱹᱼᱟ +ᱧᱟᱯᱟᱢ ᱞᱮᱠᱟ ᱢᱤᱫ ᱜᱷᱟᱹᱲᱤᱡ +ᱢᱤᱫ ᱰᱚᱰᱮᱠ ᱞᱟᱹᱜᱤᱫ ᱜᱮᱢ ᱥᱚᱫᱚᱨ ᱥᱟᱢᱟᱝᱼᱟ +ᱟᱢᱫᱚ ᱥᱮᱨᱢᱟ ᱨᱮ ᱾ +ᱟᱢ ᱵᱮᱜᱚᱨ ᱢᱚᱱᱮᱨᱮ ᱥᱩᱠ ᱵᱮᱜᱚᱨ ᱫᱩᱠᱜᱮ ᱵᱟᱹᱲᱛᱤᱜ +ᱟᱢᱟᱜ ᱛᱷᱩᱢ ᱟᱹᱥᱤᱥ ᱛᱮ ᱥᱟᱱᱟᱢ ᱦᱚᱲ ᱠᱚ ᱠᱩᱥᱤᱜ ᱾ +ᱟᱢᱟᱜ ᱠᱚᱞᱮᱨᱮ ᱜᱩᱜᱩᱫ ᱠᱟᱛᱮ ᱫᱩᱠ ᱠᱷᱚᱱ ᱥᱟᱦᱟ ᱠᱚᱢ +ᱟᱢ ᱛᱟᱨᱟᱥ ᱛᱟᱨᱥᱮ ᱟᱛᱮ ᱥᱩᱠ ᱜᱮ ᱪᱟᱞ ᱟᱠᱚᱢ ᱾ + +ᱚᱡᱚᱭ ᱜᱟᱰᱟᱤ \ No newline at end of file diff --git a/sat/test-images/AjayGada-2022-67.jpg b/sat/test-images/AjayGada-2022-67.jpg new file mode 100644 index 0000000..5d49376 Binary files /dev/null and b/sat/test-images/AjayGada-2022-67.jpg differ diff --git a/sat/test-images/Guru5-2004.gt.txt b/sat/test-images/Guru5-2004.gt.txt new file mode 100644 index 0000000..5f11215 --- /dev/null +++ b/sat/test-images/Guru5-2004.gt.txt @@ -0,0 +1,20 @@ +ᱛᱷᱩᱢ ᱛᱷᱟᱨ + +ᱜᱩᱨᱩ ᱜᱚᱢᱠᱮ ᱛᱤᱠᱤᱱᱟᱜ ᱩᱭᱦᱟᱹᱨ ᱫᱚ ᱟᱹᱰᱤ ᱜᱟᱹᱦᱤᱨᱟᱹ, +ᱧᱮᱞ ᱫᱚ ᱟᱹᱰᱤ ᱧᱟᱞᱟᱜ ᱜᱮᱭᱟ ᱾ ᱤᱧᱟᱜ ᱴᱮᱢᱮᱡ ᱩᱭᱦᱟᱹᱨ ᱛᱮ ᱡᱟᱦᱟᱸ +ᱛᱤᱱᱟᱹᱜ ᱤᱧ ᱦᱟᱛᱣᱟ ᱥᱮᱴᱮᱨ ᱟᱠᱟᱜᱼᱟ ᱟᱨ ᱠᱷᱟᱴᱚ ᱵᱮᱸᱜᱮᱫ ᱛᱮ +ᱡᱟᱦᱟᱸ ᱛᱤᱱᱟᱹᱜ ᱤᱧ ᱧᱮᱞ ᱧᱟᱢ ᱟᱠᱟᱜᱼᱟ ᱚᱱᱟᱜᱮ 'ᱜᱩᱨᱩ +ᱜᱚᱢᱠᱮᱭᱟᱜ ᱧᱮᱱᱮᱞ ᱟᱨ ᱧᱟᱱᱟᱞᱟᱜ' ᱨᱮᱫᱩᱧ ᱦᱟᱹᱨ ᱥᱟᱢᱴᱟᱣ +ᱟᱠᱟᱜᱼᱟ ᱾ ᱱᱤᱛ ᱚᱞ ᱪᱤᱠᱤᱛᱮ ᱮᱛᱚᱦᱚᱵ ᱪᱟᱱᱚᱪ ᱠᱷᱚᱱ ᱮᱦᱚᱵ ᱠᱟᱛᱮ ᱤᱭᱩᱱᱤᱵᱷᱟᱨᱥᱤᱴᱤ ᱨᱮ ᱦᱟᱹᱵᱤᱡ ᱯᱟᱲᱦᱟᱣ ᱦᱩᱭᱩᱜ ᱠᱟᱱ ᱛᱟᱵᱚᱱᱟ ᱟᱨ ᱜᱩᱨᱩ ᱜᱚᱢᱠᱮ ᱛᱤᱠᱤᱱᱟᱜ ᱯᱚᱛᱚᱵ ᱠᱚᱜᱮ ᱡᱚᱛᱚ +ᱪᱟᱱᱚᱪᱨᱮ ᱯᱟᱲᱦᱟᱣᱜ ᱠᱟᱱᱟ ᱾ ᱤᱠᱷᱟᱹᱱ ᱟᱹᱠᱤᱱᱟᱜ ᱯᱚᱛᱚᱵ +ᱠᱚᱨᱮᱱᱟᱜ ᱜᱟᱞᱚᱪ ᱯᱚᱛᱚᱵ ᱠᱚᱫᱚ ᱵᱟᱹᱱᱩᱜᱼᱟ ᱾ ᱱᱤᱛ ᱞᱮᱠᱟᱱ +ᱚᱠᱛᱚᱨᱮ ᱜᱟᱞᱚᱪ ᱯᱚᱛᱚᱵ ᱠᱚ ᱞᱚᱲᱚᱜ ᱠᱟᱱᱟ ᱾ ᱚᱱᱟ ᱞᱚᱲᱚᱠᱚ +ᱯᱩᱨᱟᱹᱣ ᱞᱟᱹᱜᱤᱫ ᱜᱮ ᱱᱚᱶᱟ ᱯᱚᱛᱚᱵ ᱫᱚ ᱢᱤᱫ ᱩᱨᱟᱹᱞ ᱠᱟᱹᱢᱤ +ᱠᱟᱱᱟ ᱾ ᱜᱟᱞᱚᱪᱤᱭᱟᱹ ᱯᱚᱛᱚᱵ ᱞᱮᱠᱟᱛᱮ ᱱᱚᱶᱟᱜᱮ ᱯᱟᱞᱮ ᱮᱛᱚᱦᱚᱵ +ᱯᱚᱛᱚᱵ ᱫᱚ ᱾ ᱚᱱᱟᱛᱮ ᱦᱟᱲᱟᱜ ᱵᱚᱪᱚᱜ ᱠᱚ ᱛᱟᱦᱮᱸᱱ +ᱠᱷᱟᱱ ᱚᱱᱟᱠᱚᱫᱚᱵᱚᱱ ᱞᱟᱹᱭ ᱥᱚᱫᱚᱨ ᱞᱮᱠᱷᱟᱱ ᱫᱚᱥᱟᱨ ᱪᱷᱟᱯᱟᱠᱚᱨᱮ ᱥᱚᱡᱷᱮᱜᱼᱟ ᱾ + +ᱱᱚᱶᱟ ᱯᱚᱛᱚᱵ ᱯᱟᱹᱴᱷᱩᱣᱟᱹᱠᱚ, ᱢᱟᱪᱮᱛ ᱠᱚ ᱟᱨ +ᱪᱮᱫᱮᱛᱤᱭᱟᱹᱠᱚ ᱠᱟᱡ ᱜᱚᱲᱚ ᱥᱚᱦᱚᱫ ᱮ ᱮᱢ ᱫᱲᱮ ᱭᱟᱠᱚ ᱠᱷᱟᱱ +ᱤᱧᱟᱜ ᱠᱷᱟᱴᱟᱣ ᱨᱮᱭᱟᱜ ᱠᱩᱲᱟᱹᱭᱤᱧ ᱧᱟᱢᱟ ᱾ +ᱤᱧᱜᱮ \ No newline at end of file diff --git a/sat/test-images/Guru5-2004.jpg b/sat/test-images/Guru5-2004.jpg new file mode 100644 index 0000000..0a5643e Binary files /dev/null and b/sat/test-images/Guru5-2004.jpg differ diff --git a/sat/test-images/Guru6-2004.gt.txt b/sat/test-images/Guru6-2004.gt.txt new file mode 100644 index 0000000..4960941 --- /dev/null +++ b/sat/test-images/Guru6-2004.gt.txt @@ -0,0 +1,34 @@ +ᱥᱟᱭ ᱥᱮᱨᱢᱟ ᱡᱟᱱᱟᱢ ᱢᱟᱦᱟᱸᱨᱮ +ᱜᱩᱨᱩ ᱜᱚᱢᱠᱮ ᱛᱤᱠᱤᱱᱟᱜ ᱧᱩᱢ ᱦᱟᱞᱟᱝ + +ᱯᱟᱹᱨᱥᱤ ᱥᱤᱧ ᱪᱟᱸᱫᱚ ᱜᱩᱨᱩ ᱜᱚᱢᱠᱮ ᱯᱚᱸᱰᱮᱛ +ᱨᱟᱹᱜᱷᱩᱱᱟᱛᱷᱢᱩᱨᱢᱩ ᱛᱤᱠᱤᱱᱟᱜ ᱥᱟᱭ ᱥᱮᱨᱢᱟ ᱡᱟᱱᱟᱢ ᱢᱟᱦᱟᱸ +ᱨᱮᱭᱟᱜ ᱥᱟᱹᱜᱩᱱ ᱫᱤᱱᱨᱮ ᱟᱹᱠᱤᱱᱟᱜ ᱯᱟᱸᱡᱟ ᱯᱚᱨᱟᱭᱱᱤᱨᱮ ᱤᱧᱟᱜ +ᱞᱟᱥᱟᱬᱦᱮᱫ ᱜᱚᱰ ᱾ ᱡᱚᱛᱚᱜᱮ ᱵᱚᱱ ᱵᱟᱰᱟᱭᱟ ᱟᱵᱚᱫᱚ ᱢᱤᱫ +ᱦᱚᱲᱟᱜ ᱡᱟᱱᱟᱢ ᱢᱟᱦᱟᱸᱵᱚ ᱢᱟᱱᱟᱣᱹᱟ ᱟᱹᱰᱤ ᱫᱩᱞᱟᱹᱲ ᱨᱟᱹᱥᱠᱟ +ᱹᱛᱮ ᱾ ᱱᱚᱸᱠᱟᱱ ᱫᱤᱱᱨᱮ ᱥᱮᱛᱟ ᱦᱚᱲ ᱠᱚᱣᱟᱜ ᱫᱚ ᱡᱚᱛᱚ ᱞᱮᱠᱟᱱ +ᱜᱩᱱ ᱵᱤᱨᱫᱟᱹ ᱟᱨ ᱮᱱᱮᱢ ᱠᱚ ᱛᱟᱠᱚᱵᱚ ᱩᱭᱦᱟᱹᱨᱟ ᱾ ᱚᱱᱟ ᱠᱚ ᱯᱟᱸᱡᱟ +ᱠᱟᱛᱮ ᱟᱯᱱᱟᱨᱟᱜ ᱟᱨ ᱥᱟᱣᱛᱟᱦᱟᱜ ᱥᱩᱥᱟᱹᱨᱚᱱᱵᱚ ᱫᱤᱥᱟᱹᱭᱟ ᱾ ᱚᱱᱟ +ᱞᱮᱠᱟᱛᱮ ᱜᱩᱨᱩ ᱜᱚᱢᱠᱮ ᱛᱤᱠᱤᱱ ᱥᱟᱶᱛᱟ ᱟᱨ ᱥᱟᱶᱦᱮᱫ ᱞᱟᱹᱜᱤᱫ +ᱪᱮᱫ ᱠᱤᱱ ᱮᱢ ᱟᱠᱚᱯᱹᱟ ᱟᱨ ᱚᱠᱟᱦᱚᱨ ᱠᱤᱱ ᱩᱫᱩᱜ ᱟᱠᱟᱜᱟ ᱱᱚᱸᱠᱟᱱ +ᱫᱤᱱᱨᱮ ᱚᱱᱟᱠᱚ ᱜᱟᱞᱚᱪ ᱧᱚᱜᱽ ᱟᱹᱰᱤᱜᱮ ᱡᱟᱹᱨᱩᱲᱟ ᱾ + +ᱨᱟᱹᱜᱷᱩ ᱢᱩᱨᱢᱩ ᱛᱠᱤᱱᱟᱜ ᱡᱤᱭᱚᱱ ᱢᱟ ᱥᱟᱱᱛᱟᱲ ᱥᱟᱶᱛᱟᱨᱮ +ᱚᱯᱮᱞ ᱞᱮᱱᱟ ᱚᱞᱹ ᱨᱚᱲᱹ ᱯᱟᱹᱨᱥᱤᱹ ᱥᱟᱶᱦᱮᱫ ᱟᱨ ᱫᱷᱚᱨᱚᱢ ᱫᱚᱲᱦᱚᱭ +ᱞᱟᱹᱜᱤᱫ ᱾ ᱚᱱᱟ ᱥᱟᱶᱸᱛᱮ ᱟᱵᱚᱣᱟᱜ ᱢᱤᱫᱴᱟᱜ ᱵᱷᱤᱱᱟᱹ ᱩᱨᱩᱢ +ᱫᱤᱥᱚᱢ ᱫᱩᱱᱤᱭᱟᱹᱨᱮ ᱫᱚᱦᱚᱭ ᱞᱟᱹᱜᱤᱫ ᱦᱚᱸᱡᱤᱭᱚᱱ ᱵᱷᱩᱨ ᱠᱤᱱ ᱠᱩᱨᱩᱢᱩᱴᱩ +ᱞᱮᱜ-ᱟ ᱾ ᱟᱹᱠᱤᱱᱟᱜ ᱡᱟᱱᱟᱢ ᱢᱟᱦᱟᱸ ᱥᱟᱭ ᱥᱮᱨᱢᱟᱨᱮ ᱞᱮᱵᱮᱫ +ᱥᱮᱴᱮᱨᱚᱜ ᱨᱮᱭᱟᱜ ᱢᱤᱫ ᱥᱮᱨᱢᱟᱵᱟᱹᱠᱤ ᱛᱟᱦᱮᱸᱠᱟᱱ ᱚᱠᱛᱚᱨᱮ ᱟᱹᱠ ᱤᱱ +ᱚᱰᱚᱠ ᱟᱠᱟᱫ ᱼᱚᱞᱪᱤᱠᱤᱸ ᱥᱚᱢᱵᱷᱤᱫᱷᱟᱱ ᱨᱮᱭᱟᱜ ᱤᱨᱟᱹᱞᱟᱱ +ᱫᱷᱟᱯᱨᱮ ᱴᱨᱟᱶᱸᱭᱮ ᱧᱟᱢ ᱠᱮᱜᱟᱹ ᱱᱚᱣᱟᱫᱚ ᱥᱟᱱᱛᱟᱲ ᱡᱟᱹᱛᱤᱭᱟᱜ +ᱡᱤᱣᱤ ᱥᱟᱨᱮᱲ ᱨᱟᱹᱥᱠᱟᱹ ᱠᱟᱱᱟ ᱾ ᱚᱞᱪᱤᱠᱤ ᱵᱷᱤᱛᱨᱤ ᱛᱮ ᱟᱵᱚ +ᱡᱩᱫᱤᱵᱚ ᱵᱚᱞᱚᱱᱟ ᱮᱱᱠᱷᱟᱱᱵᱚ ᱧᱮᱞᱟ ᱥᱟᱹᱨᱤᱜᱮ ᱨᱟᱹᱜᱷᱩᱢᱩᱨᱢᱩ +ᱛᱤᱠᱤᱱ ᱫᱚ ᱟᱹᱰᱤ ᱥᱮᱬᱟ ᱯᱟᱹᱨᱥᱤ ᱯᱟᱹᱨᱩᱠᱤᱭᱟᱹᱭᱵᱷᱟᱥᱟᱵᱤᱛᱨᱠᱤᱱ +ᱛᱟᱦᱮᱸᱠᱟᱱᱟ ᱾ ᱥᱟᱬᱮᱥᱤᱭᱟᱹ ᱦᱟᱛᱟᱜ ᱦᱚᱸ ᱛᱟᱹᱠᱤᱱ ᱱᱚᱣᱟ ᱞᱟᱹᱜᱤᱫ +ᱛᱮᱫᱚ ᱟᱹᱰᱤ ᱫᱚᱲᱦᱚ ᱜᱮ ᱛᱟᱦᱮᱸᱠᱟᱱᱟ ᱡᱟᱦᱟᱸ ᱠᱷᱟᱹᱛᱤᱨ ᱟᱵᱚᱣᱟᱜ +ᱡᱚᱛᱚ ᱞᱮᱠᱟᱱ ᱟᱹᱲᱟᱹᱯᱟᱸᱡᱟ ᱠᱟᱛᱮ ᱪᱤᱠᱤᱠᱤᱱ ᱜᱟᱵᱟᱱ ᱟᱠᱟᱜᱹᱟ ᱾ + +ᱟᱵᱚᱣᱟᱜ ᱨᱚᱲᱨᱮ ᱦᱚᱲᱚᱸᱛ ᱵᱤᱥᱛᱤᱭᱟ ᱾ ᱚᱱᱟᱛᱮ ᱚᱠᱷᱚᱨ +ᱵᱟᱜᱢᱟ ᱽᱵᱭᱠᱭ ᱵᱟᱜ ᱠᱟᱛᱮ ᱠᱮᱪᱮᱫ ᱟᱲᱟᱜ ᱞᱮᱜᱟᱠᱤᱱ ᱾ ᱨᱟᱦᱟ +ᱟᱲᱟᱜ ᱫᱚ ᱛᱩᱨᱩᱭ ᱜᱚᱴᱟᱜ ᱥᱦᱩᱜᱟᱹ ᱠᱮᱪᱮᱫ ᱟᱲᱟᱜ ᱢᱮᱱᱟᱜᱼᱟ +ᱵᱟᱨᱜᱮᱞ ᱯᱩᱱᱭᱟᱹ ᱜᱚᱴᱟᱡ ᱾ ᱚᱱᱟ ᱵᱷᱮᱜᱮᱫᱽ ᱢᱩᱸᱴᱩᱰᱟᱹᱜᱹᱜᱟᱹᱦᱞᱟᱹ \ No newline at end of file diff --git a/sat/test-images/Guru6-2004.jpg b/sat/test-images/Guru6-2004.jpg new file mode 100644 index 0000000..eee3693 Binary files /dev/null and b/sat/test-images/Guru6-2004.jpg differ diff --git a/sat/test-images/RaghunathMurmu.pdf b/sat/test-images/RaghunathMurmu.pdf new file mode 100644 index 0000000..9eb2afb Binary files /dev/null and b/sat/test-images/RaghunathMurmu.pdf differ diff --git a/sat/test-images/Sahayinon61-2021.gt.txt b/sat/test-images/Sahayinon61-2021.gt.txt new file mode 100644 index 0000000..1c76f58 --- /dev/null +++ b/sat/test-images/Sahayinon61-2021.gt.txt @@ -0,0 +1,17 @@ +ᱱᱩᱠᱩ ᱫᱚᱠᱚ ᱚᱵᱚᱞᱟ ᱠᱟᱱᱟ +ᱚᱵᱩᱡᱷ ᱠᱟᱱᱟ +ᱚᱱᱟᱛᱮ ᱥᱟᱦᱟᱣᱠᱟᱜ ᱠᱟᱱᱟ ᱡᱚᱛᱚᱣᱟᱜ +ᱜᱩᱡᱩᱜ ᱦᱚᱸ ᱦᱮᱸ ᱜᱮ ᱵᱟᱧᱪᱟᱣᱜ ᱦᱚᱸ ᱦᱮᱸᱜᱮ ᱾ + +ᱤᱠᱷᱟᱹᱱ ᱤᱧ ᱫᱩᱧ ᱦᱚᱲ ᱠᱟᱱᱟ +ᱨᱚᱲ ᱦᱩᱧ ᱫᱟᱲᱮᱭᱟᱜ ᱜᱮᱭᱟ +ᱵᱩᱡᱷ ᱦᱩᱸᱧ ᱵᱩᱡᱷ ᱜᱮᱭᱟ ᱡᱚᱛᱚᱣᱟᱜ +ᱮᱱᱦᱚᱸ +ᱤᱧ ᱠᱷᱚᱱ ᱫᱟᱲᱮᱭᱟᱱ ᱦᱚᱲ +ᱤᱧᱟᱜ ᱡᱤᱣᱤ ᱢᱚᱱᱮ ᱟᱨ +ᱠᱟᱹᱢᱤ ᱫᱟᱲᱮᱭᱟᱜ ᱫᱟᱲᱮ +ᱫᱤᱱᱠᱚ ᱦᱮᱞᱮᱡ ᱮᱫᱟ +ᱤᱧ ᱫᱚ ᱫᱤᱱᱜᱮ ᱞᱟᱛᱟᱨᱤᱧ +ᱛᱟᱦᱮᱸᱠᱚᱜ ᱢᱟ ᱢᱮᱱᱛᱮ ᱾ + +ᱢᱟᱹ ᱐᱕ᱹ᱐᱕ᱹ᱑᱓ \ No newline at end of file diff --git a/sat/test-images/Sahayinon61-2021.jpg b/sat/test-images/Sahayinon61-2021.jpg new file mode 100644 index 0000000..fa89d1e Binary files /dev/null and b/sat/test-images/Sahayinon61-2021.jpg differ diff --git a/sat/test-images/ganam.gt.txt b/sat/test-images/ganam.gt.txt new file mode 100644 index 0000000..c938c30 --- /dev/null +++ b/sat/test-images/ganam.gt.txt @@ -0,0 +1,28 @@ +ᱜᱟᱱᱟᱝ ᱺ ᱟᱵᱚ ᱢᱟᱹᱱᱢᱤ ᱡᱚᱱᱚᱢ ᱠᱟᱛᱮ ᱟᱹᱰᱤ ᱞᱮᱠᱟᱱᱟᱜ ᱵᱚ +ᱧᱮᱞᱮᱫᱼᱟ, ᱟᱧᱡᱚᱢ ᱮᱜᱼᱟ ᱟᱨᱵᱚ ᱵᱟᱰᱟᱭᱮᱫᱼᱟ ᱚᱱᱟᱠᱚ ᱥᱩᱜᱩᱲ +ᱥᱟᱺᱦᱤᱸᱡ ᱚᱞ ᱨᱮᱱᱟᱜ ᱛᱚᱦᱚᱨ ᱟᱨᱵᱟᱝ ᱱᱟᱯᱟᱭ +ᱥᱟᱺᱦᱤᱡ ᱚᱞ ᱜᱟᱱ ᱚᱪᱚᱭ ᱛᱮᱭᱟᱜ ᱜᱮ ᱜᱟᱱᱟᱝ ᱫᱚ ᱾ + +ᱜᱟᱱᱟᱝ ᱚᱞ ᱡᱷᱚᱜ ᱛᱤᱱᱟᱹᱜ ᱜᱟᱱ ᱢᱩᱬᱩᱛ ᱛᱚᱦᱚᱨ ᱯᱟᱧᱡᱟ +ᱦᱩᱭᱩᱜᱼᱟ ᱾ ᱚᱱᱟ ᱠᱚᱫᱚ ᱼ ᱵᱟᱰᱟᱭ ᱛᱮᱫ, ᱜᱚᱲᱦᱚᱱ, ᱡᱟᱭ +ᱛᱮᱫ, ᱱᱟᱭᱠᱟ, ᱠᱟᱭᱠᱟ, ᱢᱩᱪᱟᱹᱫ ᱾ + +ᱵᱟᱰᱟᱭ ᱛᱮᱫ ᱺ ᱡᱟᱦᱟᱸᱱᱟᱜ ᱜᱟᱱᱟᱝ ᱚᱞ ᱮᱛᱚᱦᱚᱵ ᱨᱮ ᱚᱱᱟ +ᱨᱮᱱᱟᱜ ᱠᱷᱟᱴᱚ ᱩᱯᱩᱨᱩᱢ ᱚᱞ ᱢᱟᱲᱟᱝ ᱫᱚ ᱟᱹᱰᱤ +ᱡᱟᱹᱨᱩᱲᱟᱱᱟ ᱾ + +ᱜᱚᱲᱦᱚᱱ ᱺ ᱥᱟᱛᱟᱢ ᱚᱞ ᱚᱠᱛᱚ ᱚᱱᱟ ᱨᱮᱱᱟᱜ ᱜᱚᱲᱦᱚᱱ ᱦᱚᱸ +ᱢᱤᱫᱴᱟᱝ ᱞᱟᱹᱠᱛᱤᱭᱟᱱᱟᱜ ᱠᱟᱱᱟ ᱾ + +ᱡᱟᱭ ᱛᱮᱫ ᱺ ᱥᱟᱛᱟᱢ ᱨᱮᱱᱟᱜ ᱢᱩᱬᱩᱛ ᱡᱟᱝ ᱛᱮᱫ ᱪᱮᱫ ᱠᱟᱱᱟ, +ᱚᱠᱟ ᱞᱮᱠᱟᱱᱟ ? ᱚᱱᱟ ᱤᱫᱤ ᱠᱟᱛᱮ ᱚᱞ ᱯᱷᱚᱴᱮᱞ ᱦᱩᱭᱩᱜᱼᱟ ᱾ + +ᱱᱟᱭᱠᱟ ᱺ ᱱᱟᱭᱠᱟ ᱫᱚ ᱚᱱᱟ ᱨᱮᱱᱟᱜ ᱱᱟᱯᱟᱭ ᱜᱩᱱ ᱫᱚ ᱪᱮᱫ ? +ᱪᱮᱫ ᱵᱷᱟᱹᱞᱟᱹᱭ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ ᱚᱱᱟ ᱚᱞ ᱦᱩᱭᱩᱜᱼᱟ ᱾ + +ᱠᱟᱭᱠᱟ ᱺ ᱚᱱᱟ ᱨᱮᱱᱟᱜ ᱵᱟᱹᱲᱤᱡ ᱫᱚ ᱪᱮᱫ ᱠᱟᱱᱟ ? ᱟᱨᱵᱟᱝ +ᱵᱟᱹᱲᱤᱡ ᱜᱷᱚᱴᱚᱱ ᱫᱚ ᱪᱮᱫ ᱠᱟᱱᱟ ᱚᱱᱟ ᱚᱞ ᱦᱩᱭᱩᱜᱼᱟ ᱾ + +ᱢᱩᱪᱟᱹᱫ ᱺ ᱢᱩᱪᱟᱹᱫ ᱨᱮᱫᱚ ᱚᱱᱟ ᱥᱟᱛᱟᱢ ᱤᱫᱤ ᱠᱟᱛᱮ ᱚᱱᱚᱞᱤᱭᱟᱹ +ᱦᱟᱜ ᱩᱭᱦᱟᱹᱨ ᱵᱷᱟᱵᱽᱱᱟ, ᱟᱥᱟ ᱵᱚᱨᱥᱟ ᱟᱨ ᱯᱟᱹᱛᱭᱟᱹᱣ +ᱤᱫᱤ ᱠᱟᱛᱮ ᱚᱞ ᱞᱟᱹᱠᱛᱤᱜ ᱠᱟᱱᱟ ᱾ \ No newline at end of file diff --git a/sat/test-images/ganam.jpg b/sat/test-images/ganam.jpg new file mode 100644 index 0000000..7fe8ef1 Binary files /dev/null and b/sat/test-images/ganam.jpg differ diff --git a/sat/test-images/ganam13.gt.txt b/sat/test-images/ganam13.gt.txt new file mode 100644 index 0000000..857f869 --- /dev/null +++ b/sat/test-images/ganam13.gt.txt @@ -0,0 +1,30 @@ +ᱞᱟᱹᱠᱛᱤ : ᱟᱞᱮ ᱟᱥᱲᱟ ᱨᱮᱱᱟᱜ ᱴᱟᱺᱰᱤ ᱨᱮᱫᱚ ᱟᱞᱮ ᱟᱥᱲᱟ ᱨᱤᱱ +ᱟᱪᱮᱛᱤᱭᱟᱹ ᱜᱮᱠᱚ ᱠᱷᱤᱞᱚᱲᱟ ᱚᱸᱰᱮ ᱫᱚ ᱟᱞᱮᱭᱟᱜ ᱟᱥᱲᱟ ᱰᱤᱜᱟᱹᱜ +ᱢᱟᱲᱟᱝ ᱨᱮ ᱢᱟᱪᱮᱛ ᱠᱷᱤᱞᱚᱲ ᱵᱟᱲᱟ ᱞᱟᱹᱜᱤᱫ ᱚᱠᱛᱚᱭ ᱮᱢᱟᱞᱮᱭᱟ +ᱟᱨᱞᱮ ᱠᱷᱤᱞᱚᱲᱟ ᱟᱨ ᱮᱴᱟᱜ ᱠᱚᱫᱚ ᱦᱟᱱᱟ ᱱᱷᱟᱣᱟ ᱠᱚ +ᱠᱷᱤᱞᱚᱲᱟ ᱾ ᱠᱷᱤᱞᱚᱲ ᱢᱟᱪᱮᱛ ᱪᱤᱸᱰᱩ ᱠᱷᱤᱞᱚᱲ ᱨᱮᱱᱟᱜ ᱛᱟᱹᱨᱤ +ᱠᱚᱭ ᱞᱟᱹᱭ ᱟᱞᱮᱭᱟ ᱾ + +ᱱᱟᱭᱠᱟ : ᱟᱥᱲᱟ ᱨᱮ ᱴᱟᱺᱰᱤ ᱛᱟᱦᱮᱸᱱ ᱠᱷᱟᱱ ᱟᱥᱲᱟ ᱨᱮ ᱚᱞᱚᱜ +ᱠᱟᱱ ᱟᱪᱮᱛᱤᱭᱟᱹ ᱠᱚᱣᱟᱜ ᱢᱚᱱᱮ ᱡᱤᱣᱤ ᱨᱮ ᱱᱟᱥᱮ ᱨᱟᱹᱥᱠᱟᱹ +ᱥᱟᱨᱥᱟᱣ ᱧᱚᱜᱚᱜᱼᱟ ᱾ ᱠᱷᱤᱞᱚᱲ ᱵᱟᱲᱟ ᱞᱮᱠᱷᱟᱱ ᱦᱚᱲᱢᱚ ᱠᱚ +ᱯᱷᱟᱸᱰᱜᱟᱨᱚᱜᱼᱟ ᱾ ᱚᱱᱟᱛᱮ ᱟᱞᱮ ᱟᱥᱲᱟ ᱨᱮ ᱧᱩᱦᱩᱢ ᱢᱟᱦᱟ +ᱦᱤᱞᱚᱜ ᱫᱚ ᱥᱮᱛᱟᱜ ᱨᱮ ᱡᱚᱛᱚ ᱦᱚᱲ ᱠᱷᱤᱞᱚᱲ ᱢᱟᱲᱟᱝ ᱚᱪᱚ +ᱞᱮᱛᱮ ᱚᱞᱚᱜᱼᱮ ᱫᱩᱲᱩᱵ ᱚᱪᱚ ᱞᱮᱭᱟ ᱟᱨ ᱚᱠᱚᱭ ᱚᱠᱟ ᱠᱷᱤᱞᱚᱲ +ᱵᱷᱟᱹᱜᱤ ᱥᱟᱹᱛᱟ ᱩᱱᱤ ᱟᱨ ᱦᱚᱸ ᱢᱟᱲᱟᱝ ᱥᱮᱫ ᱞᱟᱦᱟᱜ ᱞᱟᱹᱜᱤᱱ +ᱛᱮ ᱦᱚᱨᱮ ᱩᱫᱩᱜ ᱟᱞᱮᱭᱟ ᱟᱞᱮᱤᱡ ᱠᱷᱤᱞᱚᱲ ᱢᱟᱪᱮᱛ ᱾ ᱠᱷᱤᱞᱚᱲ +ᱛᱮᱦᱚᱸ ᱟᱜᱟᱢ ᱢᱟᱨᱥᱟᱞᱚᱜᱼᱟ ᱢᱮᱱᱛᱮ ᱞᱟᱹᱭ ᱟᱞᱮᱭᱟ ᱾ +ᱠᱟᱭᱠᱟ : ᱟᱥᱲᱟ ᱨᱮ ᱢᱤᱫ ᱴᱟᱺᱰᱤ ᱵᱟᱭ ᱛᱟᱦᱮᱸᱱ ᱠᱷᱟᱱ ᱚᱱᱟ +ᱫᱚ ᱟᱥᱲᱟ ᱨᱮᱱᱟᱜ ᱜᱩᱸᱴ ᱨᱮᱫᱚ ᱵᱟᱭ ᱞᱮᱠᱷᱟᱜᱼᱟ ᱾ ᱚᱱᱟ ᱴᱟᱺᱰᱤ +ᱟᱹᱰᱤ ᱜᱟᱱ ᱠᱟᱹᱢᱤ ᱨᱮ ᱦᱤᱡᱩᱜᱼᱟ ᱾ ᱚᱱᱟ ᱴᱟᱺᱰᱤ ᱵᱟᱭ ᱛᱟᱦᱮᱸᱱ +ᱠᱷᱟᱱ ᱟᱥᱲᱟ ᱨᱤᱱ ᱟᱪᱮᱛᱤᱭᱟᱹ ᱠᱚ ᱠᱷᱤᱞᱚᱲ ᱠᱚ ᱤᱫᱤ ᱠᱟᱛᱮ +ᱪᱮᱫ ᱦᱚᱸ ᱜᱮᱭᱟᱱ ᱵᱟᱭ ᱦᱮᱡ ᱟᱠᱚᱣᱟ ᱟᱨ ᱠᱷᱤᱞᱚᱲ ᱨᱮᱱᱟᱜ +ᱱᱟᱯᱟᱭ ᱫᱤᱥᱟᱹ ᱦᱚᱸ ᱵᱟᱹᱲᱛᱤ ᱠᱚ ᱟᱨᱡᱟᱣ ᱡᱚᱝᱼᱟ ᱾ ᱚᱱᱟᱛᱮ +ᱴᱟᱺᱰᱤ ᱛᱟᱦᱮᱸᱱ ᱫᱚ ᱟᱹᱰᱤ ᱞᱮᱠ ᱠᱟᱱᱟ ᱾ + +ᱢᱩᱪᱟᱹᱫ : ᱟᱞᱮ ᱟᱥᱲᱟ ᱨᱮᱱᱟᱜ ᱴᱟᱺᱰᱤ ᱟᱹᱰᱤ ᱡᱩᱛᱟ ᱟᱨ +ᱢᱟᱪᱮᱛ ᱦᱚᱸ ᱟᱹᱰᱤ ᱵᱷᱟᱹᱜᱤ ᱠᱷᱤᱞᱚᱲ ᱨᱮᱱᱟᱜ ᱛᱟᱹᱨᱤ ᱠᱚ ᱞᱟᱹᱭ +ᱥᱟᱶᱛᱮ ᱟᱡᱟᱨ ᱵᱮᱢᱟᱨ ᱠᱚ ᱟᱞᱚ ᱵᱚᱞᱚ ᱜᱚᱫᱚᱜ ᱞᱮᱠᱟᱱ ᱠᱷᱤᱞᱚᱲ +ᱟᱨᱵᱟᱝ ᱦᱚᱲᱢᱚ ᱠᱚᱭ ᱯᱷᱟᱸᱰᱜᱟᱨ ᱚᱪᱚᱞᱮᱭᱟ ᱾ ᱚᱱᱟᱛᱮ ᱟᱞᱮᱤᱡ +ᱢᱟᱪᱮᱛ ᱟᱹᱰᱤ ᱞᱮ ᱠᱩᱥᱤᱟᱭᱟ ᱟᱨ ᱚᱱᱟ ᱥᱟᱶᱛᱮ ᱱᱚᱣᱟ ᱴᱟᱺᱰᱤ +ᱦᱚᱸ ᱟᱞᱮ ᱟᱹᱰᱤ ᱞᱮ ᱠᱩᱥᱤᱭᱟᱜᱼᱟ ᱾ \ No newline at end of file diff --git a/sat/test-images/ganam13.jpg b/sat/test-images/ganam13.jpg new file mode 100644 index 0000000..f84f047 Binary files /dev/null and b/sat/test-images/ganam13.jpg differ diff --git a/sat/test-images/ganam17.gt.txt b/sat/test-images/ganam17.gt.txt new file mode 100644 index 0000000..a51df16 --- /dev/null +++ b/sat/test-images/ganam17.gt.txt @@ -0,0 +1,30 @@ +ᱵᱟᱰᱟᱭ ᱛᱮᱫ : ᱢᱤᱫᱴᱟᱝ ᱡᱟᱭᱜᱟ ᱨᱮ ᱟᱹᱰᱤ ᱜᱚᱴᱟᱝ ᱡᱤᱱᱤᱥ +ᱠᱚ ᱠᱤᱨᱤᱧ ᱟᱹᱠᱷᱨᱤᱧ ᱞᱮᱠᱷᱟᱱ ᱟᱨ ᱦᱚᱲ ᱠᱚ ᱚᱱᱰᱮ ᱚᱠᱚᱣᱟᱜ +ᱞᱟᱹᱠᱛᱤ ᱡᱤᱱᱤᱥ ᱠᱚᱠᱚ ᱧᱟᱢ ᱞᱮᱠᱷᱟᱱ ᱚᱱᱟ ᱡᱟᱭᱜᱟ ᱫᱚ ᱦᱟᱴ +ᱠᱚ ᱢᱮᱛᱟᱜᱼᱟ ᱾ +ᱜᱟᱲᱦᱚᱱ : ᱟᱞᱮ ᱟᱹᱛᱩ ᱨᱮ ᱟᱹᱰᱤ ᱢᱟᱨᱟᱝ ᱦᱟᱴ ᱦᱩᱭᱩᱜᱼᱟ ᱾ +ᱚᱱᱟ ᱫᱚ ᱢᱤᱫ ᱮᱢᱦᱟᱨᱮ ᱵᱟᱨ ᱫᱷᱟᱣ ᱦᱩᱭᱩᱜᱼᱟ ᱾ ᱦᱟᱴ ᱫᱚ +ᱟᱞᱮ ᱟᱹᱛᱩ ᱨᱮᱱᱟᱜ ᱢᱩᱪᱟᱹᱫ ᱥᱮᱫᱨᱮ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ ᱾ ᱦᱟᱴ +ᱫᱩᱲᱩᱵ ᱠᱚᱦᱚᱸ ᱟᱹᱰᱤ ᱡᱩᱛ ᱫᱷᱟᱹᱲ ᱠᱮ ᱫᱷᱟᱹᱣ ᱟᱨᱢᱤᱫ ᱥᱮᱡ ᱨᱮ +ᱢᱤᱫ ᱞᱮᱠᱟᱱᱟᱜ ᱡᱤᱱᱤᱥ ᱠᱚ ᱦᱟᱴᱟ ᱾ ᱢᱤᱫ ᱥᱮᱡ ᱛᱮᱫᱚ ᱞᱩᱜᱽᱲᱤ +ᱦᱟᱴ, ᱢᱤᱫ ᱥᱮᱫ ᱛᱮᱫᱚ ᱵᱟᱹᱴᱤ ᱞᱚᱴᱟ, ᱢᱤᱫ ᱥᱮᱫ ᱛᱮᱫᱚ ᱪᱟᱣᱞᱮ +ᱦᱟᱴ, ᱢᱤᱫ ᱥᱮᱫ ᱛᱮᱫᱚ ᱩᱛᱩ ᱡᱤᱱᱤᱥ ᱠᱚᱠᱚ ᱦᱟᱴᱟ ᱟᱨ ᱦᱚᱸ +ᱚᱱᱠᱟ ᱜᱮ ᱟᱹᱰᱤ ᱞᱮᱠᱟᱱ ᱡᱤᱱᱤᱥ ᱠᱚᱠᱚ ᱦᱟᱴᱟ ᱾ ᱦᱚᱲᱠᱚ +ᱡᱤᱱᱤᱥ ᱯᱟᱱᱛᱮ ᱨᱮ ᱪᱮᱫ ᱦᱚᱸ ᱮᱴᱠᱮ ᱴᱚᱬᱮ ᱜᱮ ᱵᱟᱝ ᱦᱩᱭᱩᱜᱼᱟ +ᱟᱨ ᱦᱟᱴ ᱦᱚᱸ ᱠᱤᱨᱤᱧ ᱟᱹᱠᱷᱨᱤᱧ ᱦᱚᱲ ᱛᱮ ᱟᱹᱰᱤ ᱪᱚᱦᱚᱲ ᱠᱚᱜᱼᱟ ᱾ +ᱱᱟᱭᱠᱟ : ᱟᱞᱮ ᱟᱹᱛᱩ ᱨᱮᱱᱟᱜ ᱦᱟᱴ ᱛᱮ ᱟᱹᱰᱤ ᱜᱟᱱ ᱥᱩᱨ +ᱥᱩᱯᱩᱨ ᱟᱹᱛᱩ ᱨᱤᱱ ᱦᱚᱲ ᱠᱚ ᱩᱯᱠᱟᱹᱨᱚᱜ ᱠᱟᱱᱟ ᱾ ᱥᱟᱹᱜᱤᱧ +ᱪᱟᱞᱟᱜ ᱵᱟᱭ ᱦᱩᱭ ᱟᱠᱚ ᱠᱟᱱᱟ ᱾ ᱡᱚᱛᱚ ᱞᱮᱠᱟᱱ ᱡᱤᱱᱤᱥ ᱦᱟᱴ +ᱨᱮᱜᱮ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ, ᱚᱱᱟ ᱛᱮ ᱱᱚᱣᱟ ᱟᱹᱛᱩ ᱦᱟᱴ ᱦᱚᱲ ᱠᱚᱣᱟᱜ +ᱟᱹᱰᱤ ᱱᱟᱭ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ ᱟᱨ ᱟᱹᱛᱩ ᱠᱚᱨᱤᱱ ᱟᱹᱰᱤ ᱜᱟᱱ ᱦᱚᱲ +ᱦᱟᱴᱨᱮ ᱟᱹᱰᱤ ᱞᱮᱠᱟᱱ ᱠᱟᱨᱰᱟᱨ ᱨᱮ ᱦᱟᱴ ᱫᱤᱱ ᱫᱚ ᱫᱷᱩᱨᱟᱹᱣ +ᱠᱚ ᱛᱟᱦᱮᱱᱟ, ᱚᱱᱟᱛᱮ ᱵᱮᱠᱟᱨ ᱦᱚᱲ ᱠᱚᱦᱚᱸ ᱠᱚ ᱠᱚᱢ ᱧᱚᱜ +ᱠᱟᱭᱠᱟ : ᱟᱞᱮ ᱟᱹᱛᱩ ᱦᱟᱴ ᱛᱮ ᱡᱟᱦᱟᱸ ᱛᱤᱱᱟᱹᱜ ᱱᱟᱭ ᱞᱮ ᱧᱟᱢ +ᱮᱜᱼᱟ ᱩᱱᱟᱹᱜ ᱜᱮ ᱮᱴᱠᱮᱴᱚᱬᱮ ᱦᱚᱸ ᱧᱟᱢᱚᱜ ᱠᱟᱱᱟ ᱾ ᱚᱱᱟᱫᱚ - +ᱦᱟᱴ ᱨᱮ ᱦᱟᱺᱰᱤ ᱯᱟᱹᱣᱨᱟᱹ ᱟᱹᱠᱷᱨᱤᱧᱚᱜ ᱠᱟᱱ ᱤᱫᱤᱛᱮ ᱦᱚᱲ +ᱤᱱᱟᱹ ᱦᱤᱞᱚᱜ ᱧᱩᱼᱵᱩᱞ ᱠᱟᱛᱮ ᱜᱚᱴᱟ ᱰᱟᱸᱰᱮ ᱜᱷᱟᱴᱮ ᱠᱚ +ᱫᱩᱲᱥᱟᱹᱝ ᱠᱚᱜ ᱠᱟᱱᱟ ᱟᱨ ᱠᱚ ᱱᱮᱭᱟᱣ ᱠᱷᱟᱹᱯᱟᱹᱨᱤᱭᱟᱹᱣᱜ +ᱠᱟᱱᱟ ᱾ ᱦᱟᱴ ᱦᱤᱞᱚᱜᱟᱜ ᱚᱡᱽᱨᱟ ᱡᱚᱵᱽᱨᱟ ᱠᱚ ᱫᱚᱥᱟᱨ ᱯᱚᱥᱟᱨ +ᱚᱸᱰᱮᱱᱟᱜ ᱦᱚᱭ ᱦᱤᱥᱤᱫ ᱟᱹᱰᱤ ᱠᱷᱟᱨᱟᱯ ᱛᱟᱦᱮᱱ ᱠᱟᱱᱟ +ᱡᱟᱦᱟᱸᱛᱮ ᱥᱤᱠᱬᱤᱡ ᱠᱷᱚᱱ ᱮᱦᱚᱵ ᱠᱟᱛᱮ ᱟᱡᱟᱨ ᱵᱮᱢᱟᱨ ᱠᱚᱦᱚᱸ +ᱦᱮᱡ ᱥᱮᱴᱮᱨᱚᱜ ᱠᱟᱱᱟ ᱾ diff --git a/sat/test-images/ganam17.jpg b/sat/test-images/ganam17.jpg new file mode 100644 index 0000000..7eb8593 Binary files /dev/null and b/sat/test-images/ganam17.jpg differ diff --git a/sat/test-images/ganam23.gt.txt b/sat/test-images/ganam23.gt.txt new file mode 100644 index 0000000..f14d76d --- /dev/null +++ b/sat/test-images/ganam23.gt.txt @@ -0,0 +1,33 @@ +ᱪᱟᱹᱴᱟᱹᱱᱤ ᱦᱚᱸ ᱢᱮᱱᱟᱜᱼᱟ ᱾ ᱚᱸᱰᱮ ᱵᱚᱸᱜᱟ ᱠᱚ ᱜᱮᱞᱵᱟᱨ ᱥᱤᱧ +ᱜᱮᱞᱵᱟᱨ ᱧᱤᱸᱫᱟᱹ ᱠᱚ ᱟᱪᱟᱨ ᱞᱮᱜ ᱵᱤᱪᱟᱹᱨ ᱞᱮᱜᱼᱟ ᱾ + +ᱡᱟᱭᱜᱟ : ᱞᱩᱜᱩ ᱵᱩᱨᱩ ᱜᱷᱟᱸᱴᱟᱵᱟᱹᱲᱤ ᱫᱚ ᱡᱷᱟᱨᱠᱷᱟᱸᱰ +ᱯᱚᱱᱚᱛ ᱨᱮᱱᱟᱜ ᱵᱳᱠᱟᱨᱳ ᱡᱤᱞᱞᱟᱹ ᱞᱟᱞᱯᱟᱹᱱᱤᱭᱟᱹ ᱨᱮ +ᱢᱮᱱᱟᱜᱼᱟ᱾ ᱚᱸᱰᱮ ᱥᱮᱱᱚᱜ ᱦᱚᱨ ᱫᱚ ᱵᱚᱠᱟᱨᱳ ᱠᱷᱚᱱ ᱯᱮᱴᱮᱨ +ᱵᱟᱲᱮ ᱦᱚᱨ ᱛᱮ ᱛᱮᱱᱩ ᱜᱷᱟᱱ ᱥᱮᱫ ᱛᱮ ᱥᱟᱲᱚᱢ ᱾ ᱥᱟᱲᱚᱢ ᱠᱷᱚᱱ +ᱦᱤᱥᱤᱨ ᱨᱮ ᱞᱮᱸᱜᱟ ᱦᱚᱨ ᱛᱮ ᱥᱤᱫᱷᱟᱹ ᱞᱟᱞᱯᱟᱹᱱᱤᱭᱟᱹ ᱾ + +ᱡᱟᱭᱛᱮᱫ : ᱞᱩᱜᱩ ᱵᱩᱨᱩ ᱟᱨ ᱜᱷᱟᱸᱴᱟᱵᱟᱹᱲᱤ ᱫᱚ ᱵᱟᱨᱮᱭᱟ +ᱥᱩᱯᱩᱨ ᱥᱩᱯᱩᱨ ᱵᱩᱨᱩ ᱠᱟᱱᱟ ᱾ ᱞᱩᱜᱩ ᱵᱩᱨᱩ ᱪᱮᱛᱟᱱ ᱨᱮ ᱵᱚᱸᱜᱟ +ᱛᱷᱟᱱ ᱫᱚ ᱢᱮᱱᱟᱜᱼᱟ ᱾ ᱚᱸᱰᱮ ᱥᱮᱱᱚᱜ ᱡᱷᱚᱜ ᱮᱛᱚᱦᱚᱵ ᱫᱚᱨᱵᱟᱨ +ᱪᱟᱹᱴᱟᱹᱱᱤ ᱦᱚᱨ ᱛᱮ ᱵᱩᱨᱩ ᱫᱮᱡ ᱦᱩᱭᱩᱜᱼᱟ ᱾ ᱵᱩᱨᱩ ᱵᱩᱨᱩ ᱛᱮ +ᱨᱟᱠᱟᱵ ᱠᱟᱛᱮ ᱞᱩᱜᱩ ᱵᱩᱨᱩ ᱥᱮᱴᱮᱨᱚᱜᱼᱟ ᱾ ᱚᱸᱰᱮ ᱞᱩᱜᱩ ᱵᱟᱵᱟ +ᱦᱟᱜ ᱛᱷᱟᱱ ᱢᱮᱱᱟᱜᱼᱟᱹ ᱱᱟᱭᱠᱮ ᱵᱟᱵᱟ ᱢᱮᱱᱟᱜ ᱟᱠᱟᱫ ᱫᱮᱭᱟ ᱾ +ᱚᱸᱰᱮ ᱜᱚᱴᱟ ᱫᱤᱥᱚᱢ ᱨᱤᱱ ᱠᱷᱮᱨᱣᱟᱲ ᱥᱮᱨᱢᱟ ᱨᱮ ᱢᱤᱫ ᱫᱷᱟᱣ +ᱥᱚᱦᱨᱟᱭ ᱠᱩᱱᱟᱹᱢᱤ ᱨᱮ ᱵᱚᱸᱜᱼᱜᱟ ᱠᱚ ᱪᱟᱞᱟᱜᱼᱟ ᱠᱟᱱᱟ ᱾ + +ᱞᱩᱜᱩ ᱵᱩᱨᱩ ᱟᱨ ᱜᱷᱟᱸᱴᱟᱵᱟᱹᱲᱤ ᱵᱩᱨᱩ ᱛᱟᱞᱟ ᱛᱮ +ᱥᱤᱛᱟᱹᱱᱟᱞᱟ ᱡᱷᱟᱨᱱᱟ ᱞᱤᱸᱡᱤ ᱟᱬᱜᱚ ᱟᱠᱟᱱᱟ ᱾ ᱚᱱᱟ ᱡᱷᱟᱨᱱᱟ +ᱥᱩᱨ ᱨᱮ ᱢᱤᱫ ᱜᱚᱸᱜᱷᱚᱨ ᱞᱮᱠᱟ ᱢᱮᱱᱟᱜᱼᱟ ᱾ ᱚᱱᱟ ᱫᱚ ᱞᱟᱛᱟᱨ +ᱞᱟᱛᱟᱨ ᱛᱮ ᱞᱩᱜᱩ ᱵᱩᱨᱩ ᱛᱷᱟᱱ ᱨᱮ ᱛᱟᱯᱟᱵ ᱢᱮᱱᱟᱜᱼᱟ ᱾ + +ᱫᱚᱨᱵᱟᱨ ᱪᱟᱹᱴᱟᱹᱱᱤ ᱨᱮᱦᱚᱸ ᱵᱚᱸᱜᱟ ᱛᱷᱟᱱ ᱢᱮᱱᱟᱜᱼᱟ ᱾ +ᱚᱱᱟ ᱫᱚᱨᱵᱟᱨ ᱪᱟᱹᱴᱟᱹᱱᱤ ᱨᱮ ᱵᱚᱸᱜᱟ ᱵᱳᱨᱳ ᱠᱚ ᱜᱮᱞᱵᱟᱨ +ᱥᱤᱧ ᱜᱮᱞᱵᱟᱨ ᱧᱤᱸᱫᱟᱹ ᱵᱤᱪᱟᱹᱨ ᱟᱪᱟᱨ ᱠᱟᱛᱮ ᱟᱵᱚᱣᱟᱜ ᱨᱟᱭ +ᱨᱤᱛ ᱠᱚ ᱴᱷᱟᱹᱣᱠᱟᱹ ᱜᱚᱴᱟ ᱞᱮᱜᱼᱟ ᱾ + +ᱢᱩᱪᱟᱹᱫ: ᱞᱩᱜᱩ ᱵᱩᱨᱩ ᱫᱚ ᱠᱷᱮᱨᱣᱟᱲ ᱥᱟᱶᱛᱟ ᱨᱤᱱ ᱵᱚᱸᱜᱟ +ᱵᱳᱨᱳ ᱠᱚᱣᱟᱜ ᱴᱷᱟᱣ.ᱶ ᱠᱟᱱᱟ ᱟᱨ ᱱᱤᱛᱚᱜ ᱚᱱᱟ ᱧᱮᱞ ᱡᱚᱝ +ᱞᱮᱠᱟᱱ ᱡᱟᱭᱜᱟ ᱠᱚ ᱵᱮᱱᱟᱣ ᱤᱫᱤ ᱠᱮᱜᱼᱟ ᱾ ᱱᱚᱰᱮ ᱫᱚ ᱟᱵᱚ +ᱠᱷᱮᱨᱣᱟᱲ ᱵᱤᱨᱟᱹᱫ ᱨᱤᱱ ᱦᱚᱲ ᱥᱮᱨᱢᱟ ᱨᱮ ᱢᱤᱫ ᱫᱷᱟᱣ ᱪᱟᱞᱟᱜ +ᱫᱚ ᱟᱹᱰᱤ ᱡᱟᱹᱨᱩᱲ ᱠᱟᱱ ᱜᱮᱭᱟ ᱾ \ No newline at end of file diff --git a/sat/test-images/ganam23.jpg b/sat/test-images/ganam23.jpg new file mode 100644 index 0000000..1a156a2 Binary files /dev/null and b/sat/test-images/ganam23.jpg differ diff --git a/sat/test-images/ganam28.gt.txt b/sat/test-images/ganam28.gt.txt new file mode 100644 index 0000000..903f543 --- /dev/null +++ b/sat/test-images/ganam28.gt.txt @@ -0,0 +1,33 @@ +ᱡᱟᱭᱛᱮᱫ ᱺ ᱦᱮᱢᱟᱞ ᱨᱤᱛᱩ ᱫᱚ ᱡᱟᱹᱯᱩᱫ ᱥᱟᱞᱟᱜ ᱞᱟᱹᱰᱷᱟᱹᱭ +ᱟᱠᱟᱭ ᱛᱟᱦᱮᱸᱱᱟ ᱾ ᱥᱮᱨᱢᱟ ᱨᱮᱱᱟᱝ ᱦᱮᱸᱫᱮ ᱨᱤᱢᱤᱞ ᱡᱚᱛᱚᱭ +ᱥᱟᱦᱟ ᱜᱤᱰᱤ ᱠᱟᱜᱼᱟ ᱟᱨ ᱞᱚᱥᱚᱫ ᱦᱚᱨ ᱠᱚᱭ ᱨᱚᱦᱚᱲ ᱜᱤᱰᱤ +ᱠᱟᱜᱼᱟ ᱾ ᱰᱚᱰᱷᱟᱜ ᱠᱚᱨᱮ ᱟᱨᱵᱟᱝ ᱞᱚᱥᱚᱫ ᱢᱮᱥᱟ ᱵᱚᱰᱮ ᱫᱟᱜ +ᱠᱚ ᱥᱟᱯᱷᱟᱜᱼᱟ ᱾ ᱱᱚᱶᱟ ᱨᱤᱛᱩ ᱨᱮ ᱫᱷᱟᱹᱨᱛᱤ ᱫᱚ ᱟᱹᱰᱤ ᱱᱟᱯᱟᱭ +ᱦᱟᱹᱨᱭᱟᱹᱲ ᱜᱮ ᱥᱟᱡᱟᱣ ᱠᱚᱜᱼᱟ ᱾ ᱥᱮᱨᱢᱟ ᱨᱮ ᱯᱩᱸᱰ ᱨᱤᱢᱤᱞ +ᱩᱰᱟᱹᱣ ᱵᱟᱲᱟᱭᱟ ᱾ ᱫᱷᱟᱹᱨᱛᱤ ᱨᱮ ᱟᱹᱰᱤ ᱞᱮᱠᱟᱱ ᱱᱟᱶᱟ ᱱᱟᱶᱟ +ᱫᱟᱨᱮ ᱠᱚ ᱚᱢᱚᱱ ᱠᱚᱜᱼᱛᱮ ᱫᱷᱟᱹᱨᱛᱤ ᱯᱩᱨᱤ ᱟᱹᱰᱤ ᱱᱟᱯᱟᱭ +ᱧᱮᱞᱚᱜᱼᱟ ᱾ ᱢᱤᱼᱢᱤᱫ ᱫᱷᱟᱣ ᱫᱟᱜ ᱠᱚᱭ ᱧᱩᱨ ᱵᱟᱲᱟᱭᱟ, ᱚᱱᱟᱛᱮ +ᱦᱟᱹᱨᱭᱟᱹᱲ ᱫᱷᱟᱹᱨᱛᱤ ᱛᱟᱹᱦᱩᱸ ᱡᱷᱟᱞᱠᱟᱣᱜ ᱞᱮᱠᱟ ᱧᱮᱞᱚᱜᱼᱟ ᱾ + +ᱱᱟᱭᱠᱟ ᱺ ᱡᱟᱹᱯᱩᱫ ᱨᱤᱛᱩ ᱨᱮ ᱫᱷᱟᱹᱨᱛᱤ ᱨᱮ ᱜᱚᱴᱟ ᱯᱟᱲᱟ +ᱫᱟᱜ ᱛᱮᱜᱮ ᱯᱮᱨᱮᱡ ᱠᱟᱜᱼᱟ ᱟᱨ ᱫᱟᱜ ᱠᱚ ᱵᱚᱰᱮ ᱜᱮ ᱧᱮᱞᱚᱜᱼᱟ, +ᱚᱱᱟ ᱠᱚ ᱱᱚᱶᱟ ᱦᱮᱢᱟᱞ ᱨᱤᱛᱩ ᱨᱮᱫᱚ ᱥᱟᱯᱷᱟᱜᱼᱟ ᱟᱨ ᱞᱚᱥᱚᱫ +ᱠᱚᱜ ᱦᱚᱨ ᱟᱲᱮ ᱠᱚᱦᱚᱸ ᱨᱚᱦᱚᱲ ᱧᱚᱜᱚᱜᱼᱟ ᱾ ᱱᱚᱶᱟ ᱨᱤᱛᱩ ᱨᱮ +ᱟᱹᱰᱤ ᱞᱮᱠᱟᱱ ᱡᱚᱼᱵᱟᱦᱟ ᱠᱚ ᱥᱤᱨᱡᱟᱹᱣᱜᱼᱟ ᱾ ᱟᱹᱰᱤ ᱱᱟᱯᱟᱭ +ᱦᱤᱥᱤᱫ ᱦᱤᱥᱤᱫ ᱦᱚᱭ ᱟᱹᱭᱠᱟᱹᱣ ᱛᱮ ᱚᱱᱚᱞᱤᱭᱟᱹ ᱟᱨ ᱚᱱᱚᱲᱦᱤᱭᱟᱹ +ᱠᱚ ᱮᱠᱞᱟ ᱱᱤᱪᱚᱞ ᱨᱮ ᱫᱩᱲᱩᱵ ᱠᱟᱛᱮ ᱟᱠᱚᱣᱟᱜ ᱱᱚᱱᱚᱞ ᱥᱩᱝᱜᱟᱹ +ᱛᱮ ᱠᱚ ᱜᱟᱞᱟᱝ ᱨᱟᱠᱟᱵᱟ ᱫᱷᱟᱹᱨᱛᱤ ᱨᱮᱱᱟᱜ ᱪᱤᱛᱟᱹᱨ ᱾ + +ᱠᱟᱭᱠᱟ ᱺ ᱦᱮᱢᱟᱞ ᱨᱤᱛᱩ ᱫᱚ ᱵᱷᱟᱫᱚᱨ ᱟᱨ ᱫᱟᱥᱟᱸᱭ ᱵᱚᱸᱜᱟ +ᱨᱮ ᱦᱩᱭᱩᱜ ᱤᱫᱤ ᱠᱟᱱᱛᱮ ᱚᱱᱟ ᱚᱠᱛᱚ ᱫᱚ ᱪᱟᱹᱥᱤ ᱟᱠᱚᱣᱟᱜ +ᱪᱟᱥ ᱵᱟᱹᱫᱽ ᱵᱟᱹᱭᱦᱟᱹᱲ ᱨᱮᱜᱮ ᱛᱟᱦᱮᱸ ᱠᱚᱜᱼᱟ ᱟᱨ ᱡᱚᱛᱚ +ᱢᱟᱲᱟᱝ ᱟᱜ ᱠᱚᱦᱚᱸ ᱪᱟᱵᱟ ᱤᱫᱤᱠᱚᱜᱼᱟ ᱾ ᱚᱱᱟ ᱛᱮᱠᱚ ᱢᱮᱱᱟ +ᱪᱟᱹᱛ ᱵᱟᱹᱭᱥᱟᱹᱛ ᱨᱩᱴᱷᱤ ᱥᱤᱛᱩᱝ, ᱵᱷᱟᱫᱚᱨ ᱫᱟᱥᱟᱸᱭ ᱟᱠᱟᱞ +ᱥᱟᱠᱟᱞ ᱾ ᱚᱱᱟᱛᱮ ᱱᱚᱶᱟ ᱚᱠᱛᱚ ᱯᱟᱨᱚᱢ ᱞᱟᱹᱜᱤᱱ ᱪᱟᱹᱥᱤ ᱟᱹᱰᱤ +ᱠᱚ ᱠᱚᱥᱴᱚᱜᱼᱟ ᱾ + +ᱢᱩᱪᱟᱹᱫ ᱺ ᱱᱚᱶᱟ ᱦᱮᱢᱟᱞ ᱨᱤᱛᱩ ᱪᱟᱹᱥᱤ ᱠᱚ ᱞᱟᱹᱜᱤᱱ ᱵᱟᱹᱲᱤᱡ +ᱨᱮᱦᱚᱸ ᱚᱱᱚᱞᱤᱭᱟᱹ, ᱚᱱᱚᱲᱦᱤᱭᱟᱹ ᱠᱚ ᱞᱟᱹᱜᱤᱱ ᱫᱚ ᱱᱟᱯᱟᱭ +ᱜᱮᱭᱟ ᱾ ᱚᱱᱠᱟᱜᱮ ᱫᱷᱟᱹᱨᱛᱤ ᱟᱹᱪᱩᱨᱚᱜ ᱥᱟᱶᱛᱮ ᱨᱤᱛᱩ ᱨᱮᱱᱟᱜ +ᱟᱹᱨᱩ ᱯᱷᱮᱨᱟᱣ ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ ᱟᱨ ᱟᱵᱚᱣᱟᱜ ᱡᱚᱛᱚ ᱞᱮᱠᱟᱱ +ᱱᱟᱭᱠᱟ ᱠᱟᱭᱠᱟ ᱦᱚᱸᱵᱚ ᱧᱟᱢᱮᱫ ᱜᱮᱭᱟ ᱾ \ No newline at end of file diff --git a/sat/test-images/ganam28.jpg b/sat/test-images/ganam28.jpg new file mode 100644 index 0000000..65d1985 Binary files /dev/null and b/sat/test-images/ganam28.jpg differ diff --git a/sat/test-images/ganam33.gt.txt b/sat/test-images/ganam33.gt.txt new file mode 100644 index 0000000..2d4a4d6 --- /dev/null +++ b/sat/test-images/ganam33.gt.txt @@ -0,0 +1,32 @@ +ᱵᱟᱰᱟᱭ ᱛᱮᱫ : ᱡᱤᱵᱚᱱ ᱨᱮ ᱞᱟᱦᱟᱱᱛᱤ ᱡᱟᱹᱜᱤᱱ ᱠᱷᱟᱱ ᱫᱤᱱᱟᱹᱢ +ᱠᱟᱹᱢᱤ ᱦᱚᱨᱟ ᱪᱮᱛᱟᱱ ᱨᱮᱭᱟᱜ ᱠᱟᱛᱷᱟ ᱠᱟᱱᱟ ᱾ ᱫᱤᱱᱟᱹᱢ ᱚᱠᱟ +ᱞᱮᱠᱟ ᱠᱟᱹᱢᱤᱭᱟ, ᱡᱚᱢ ᱧᱩᱻᱭᱟ, ᱚᱞᱚᱜ ᱯᱟᱲᱦᱟᱣᱜᱼᱟ ᱚᱱᱟ ᱦᱤᱥᱟᱹᱵ +ᱦᱟᱯᱮᱱ ᱫᱤᱱ ᱨᱮ ᱚᱨᱡᱚᱢ ᱧᱟᱢᱟ ᱾ ᱞᱟᱛᱟᱨ ᱨᱮ ᱤᱧᱟᱜ ᱠᱟᱹᱢᱤ +ᱦᱚᱨᱟᱧ ᱚᱞ ᱯᱷᱚᱴᱮᱞ ᱠᱮᱜᱼᱟ ᱾ + +ᱥᱮᱛᱟᱜ ᱵᱮᱲᱟ : ᱫᱤᱱᱟᱹᱢ ᱥᱮᱛᱟᱜ ᱟᱬᱜᱟᱛ ᱨᱮ ᱵᱮᱨᱮᱫᱼᱟ ᱩᱱ +ᱵᱮᱲᱟ ᱫᱚ ᱕ ᱴᱟᱲᱟᱝ ᱦᱩᱭ ᱠᱚᱜᱼᱟ ᱾ ᱵᱮᱨᱮᱫ ᱛᱟᱨᱟ ᱟᱵᱼᱦᱩᱛᱩᱢ +ᱠᱟᱛᱮ ᱵᱤᱫᱩ ᱪᱟᱸᱫᱟᱱ ᱛᱤᱠᱤᱱᱤᱧ ᱱᱮᱦᱚᱨ ᱟᱠᱤᱱᱟ ᱾ ᱛᱟᱭᱚᱢ +ᱫᱟᱹᱛᱟᱹᱱᱤ ᱠᱚ ᱥᱟᱵ ᱠᱟᱛᱮ ᱜᱟᱰᱟ ᱥᱮᱫ ᱤᱧ ᱪᱟᱞᱟᱜᱼᱟ ᱾ +ᱚᱱᱛᱮᱨᱮ ᱫᱟᱹᱲ ᱯᱷᱟᱸᱰᱜᱟᱨ ᱵᱟᱲᱟ ᱠᱟᱛᱮ ᱩᱢ ᱯᱷᱩᱨᱪᱟᱹ ᱵᱟᱲᱟ +ᱠᱟᱛᱮᱧ ᱨᱩᱣᱟᱹᱲᱟ ᱾ ᱤᱱᱟᱹᱜ ᱛᱮᱜᱮ ᱗ ᱴᱟᱲᱟᱝ ᱦᱩᱭ ᱠᱚᱜᱼᱟ ᱾ +ᱟᱫᱷᱟ ᱞᱟᱡᱽ ᱵᱷᱟᱛᱟᱣᱜ ᱞᱮᱠᱟ ᱡᱟᱦᱟᱱᱟᱜ ᱜᱮ ᱡᱚᱢ ᱧᱚᱜ +ᱠᱟᱛᱮ ᱟᱫᱚ ᱚᱞᱚᱜ ᱤᱧ ᱫᱩᱲᱩᱵᱼᱟ ᱾ ᱟᱥᱲᱟ ᱨᱮᱠᱚ ᱮᱢ ᱠᱟᱞᱮ ᱚᱞ +ᱠᱩᱧ ᱚᱞᱟ ᱤᱱᱟᱹᱠᱚ ᱪᱟᱵᱟ ᱵᱟᱲᱟ ᱛᱮᱜᱮ ᱙ ᱴᱟᱲᱟᱝ ᱦᱩᱭᱩᱜᱼᱟ ᱾ +ᱛᱟᱭᱚᱢ ᱫᱟᱠᱟᱧ ᱡᱚᱢ ᱛᱮ ᱡᱤᱨᱟᱹᱣ ᱧᱚᱜ ᱠᱟᱛᱮ ᱟᱫᱚ ᱟᱥᱲᱟ +ᱛᱤᱧ ᱪᱟᱞᱟᱜᱼᱟ ᱾ + +ᱟᱥᱲᱟ ᱨᱮ : ᱑᱐ ᱴᱟᱲᱟᱝ ᱠᱷᱟᱱ ᱟᱥᱲᱟ ᱨᱮ ᱜᱷᱟᱺᱴᱤ ᱥᱟᱰᱮᱭᱟ +ᱛᱟᱭᱚᱢ ᱞᱮ ᱱᱮᱦᱚᱨᱟ ᱚᱱᱟ ᱛᱟᱭᱚᱢ ᱟᱯᱟᱱ ᱟᱹᱯᱤᱱ ᱪᱟᱱᱚᱪ +ᱛᱮᱞᱮ ᱥᱮᱱᱚᱜᱼᱛᱮ ᱢᱟᱪᱮᱛ ᱠᱚ ᱢᱟᱪᱮᱛᱟᱹᱱᱤ ᱠᱚᱠᱚ ᱯᱟᱲᱦᱟᱣ +ᱞᱮᱭᱟ ᱛᱟᱞᱟᱨᱮ ᱢᱤᱫ ᱜᱷᱟᱹᱲᱤᱠ ᱡᱤᱨᱟᱹᱣᱜ ᱟᱞᱮ ᱟᱨ ᱫᱚᱲᱦᱟ +ᱫᱩᱲᱩᱵ ᱨᱩᱣᱟᱹᱲ ᱠᱟᱛᱮ ᱫᱚ ᱛᱟᱨᱟᱥᱤᱧ ᱕ ᱴᱟᱲᱟᱝ ᱨᱮᱫᱚ ᱟᱫᱚ +ᱯᱩᱨᱟᱹ ᱰᱤᱜᱟᱹᱜ ᱟᱞᱮ ᱾ ᱛᱟᱭᱚᱢ ᱚᱲᱟᱜ ᱤᱧ ᱪᱟᱞᱟᱜ ᱛᱮ +ᱛᱤᱼᱡᱟᱸᱜᱟ ᱠᱚ ᱟᱹᱨᱩᱵ ᱠᱟᱛᱮ ᱫᱟᱠᱟᱧ ᱡᱚᱢᱟ ᱠᱷᱟᱱ ᱜᱮ ᱢᱚᱬᱮ +ᱴᱟᱲᱟᱝ ᱜᱚᱫᱚᱜᱼᱟ ᱾ ᱛᱟᱭᱚᱢ ᱠᱷᱤᱞᱚᱲ ᱵᱟᱲᱟᱧ ᱪᱟᱞᱟᱜᱼᱟ ᱾ +ᱟᱹᱭᱩᱵ ᱵᱮᱱᱟ : ᱟᱹᱭᱩᱵ ᱵᱮᱲᱟ ᱛᱤᱼᱡᱟᱸᱜᱟ ᱟᱹᱨᱩᱵ ᱯᱷᱩᱨᱪᱟᱹ +ᱵᱟᱲᱟ ᱠᱟᱛᱮ ᱵᱟᱹᱛᱤᱧ ᱞᱟᱜᱟᱣᱛᱮ ᱵᱤᱫᱩ ᱪᱟᱸᱫᱟᱱ ᱛᱤᱠᱤᱱᱤᱧ +ᱱᱮᱸᱦᱚᱨ ᱟᱹᱠᱤᱱ ᱛᱮ ᱯᱟᱲᱦᱟᱣᱜ ᱤᱧ ᱫᱩᱲᱩᱵᱼᱟ᱾ ᱟᱥᱲᱟ ᱨᱮ +ᱡᱟᱦᱟᱸ ᱠᱚᱠᱚ ᱯᱟᱲᱦᱟᱣ ᱠᱟᱞᱮᱭᱟ ᱚᱱᱟ ᱠᱩᱧ ᱯᱟᱲᱦᱟᱣᱟ ᱟᱨᱤᱧ +ᱪᱮᱫᱟ ᱾ ᱧᱤᱸᱫᱟᱹ ᱙ ᱴᱲᱟᱝ ᱫᱷᱟᱹᱵᱤᱡ ᱤᱧ ᱯᱟᱲᱦᱟᱣᱼᱟ ᱟᱨ +ᱛᱟᱭᱚᱢ ᱫᱚ ᱫᱟᱠᱟ ᱠᱚ ᱡᱚᱢ ᱵᱟᱲᱟ ᱠᱟᱛᱤᱧ ᱡᱟᱹᱯᱤᱫ ᱡᱚᱝᱼᱟ ᱾ \ No newline at end of file diff --git a/sat/test-images/ganam33.jpg b/sat/test-images/ganam33.jpg new file mode 100644 index 0000000..b3eb006 Binary files /dev/null and b/sat/test-images/ganam33.jpg differ diff --git a/sat/test-images/p1.gt.txt b/sat/test-images/p1.gt.txt new file mode 100644 index 0000000..f831f52 --- /dev/null +++ b/sat/test-images/p1.gt.txt @@ -0,0 +1,28 @@ +ᱯᱚᱸᱰᱮᱛ ᱨᱟᱹᱜᱷᱩᱱᱟᱛᱷ ᱢᱩᱨᱢᱩ +ᱯᱚᱸᱰᱮᱛ ᱨᱟᱹᱜᱷᱩᱱᱟᱛᱷ ᱢᱩᱨᱢᱩ ᱩᱪᱟᱨᱚᱱᱟᱨ ᱵᱟᱝᱠᱷᱟᱱ ᱜᱩᱨᱩ +ᱜᱚᱢᱠᱮ ᱯᱚᱸᱰᱮᱛ ᱨᱟᱹᱜᱷᱩᱱᱟᱛᱷ ᱢᱩᱨᱢᱩ, ᱡᱟᱦᱟᱸᱭ ᱫᱚ +ᱚᱞ ᱪᱤᱠᱤ ᱵᱮᱱᱟᱣ ᱞᱮᱫ ᱟᱭ ᱾ ᱥᱤᱧᱚᱛ ᱫᱤᱥᱚᱢ +ᱨᱮᱱᱟᱜ ᱳᱰᱤᱥᱟ ᱯᱚᱱᱚᱛ ᱨᱮᱱᱟᱜ ᱢᱚᱭᱩᱨᱵᱷᱚᱸᱡᱽ ᱦᱚᱱᱚᱛ ᱨᱮᱭᱟᱜ +ᱨᱟᱭᱨᱟᱝᱯᱩᱨ ᱩᱯᱳᱡᱤᱞᱟ ᱨᱮᱭᱟᱜ ᱰᱟᱸᱰᱵᱩᱥ ᱟᱛᱩ ᱨᱮ ᱯᱚᱸᱰᱮᱛ +ᱨᱟᱹᱜᱷᱩᱱᱟᱛ ᱢᱩᱨᱢᱩ ᱫᱚ ᱑᱙᱐᱕ ᱥᱟᱞ ᱨᱮᱱᱟᱜ ᱤᱝᱨᱮᱡᱤ +ᱢᱮ ᱪᱟᱸᱫᱚ ᱨᱮᱱᱟᱜ ᱕ ᱢᱟᱹᱦᱤᱛ ᱨᱮᱭ +ᱡᱟᱱᱟᱢ ᱞᱮᱱᱟ᱾ ᱠᱟᱹᱢᱤ ᱠᱟᱡᱽ ᱨᱮᱫᱚ ᱩᱱᱤ ᱫᱚ ᱩᱱᱩᱥᱩᱞ ᱵᱤᱨᱫᱟᱹᱜᱟᱲ ᱨᱤᱱᱤᱡ +ᱢᱟᱪᱮᱛ ᱮ ᱛᱟᱦᱮᱸ ᱠᱟᱱᱟ᱾ ᱟᱡᱟᱜ ᱯᱩᱨᱟᱹ +ᱡᱤᱭᱚᱱ ᱨᱮ ᱟᱡ ᱫᱚ ᱟᱹᱰᱤ ᱜᱟᱱ ᱯᱚᱛᱚᱵ ᱯᱩᱛᱷᱤ, ᱥᱮᱨᱮᱧ ᱟᱨ +ᱜᱟᱭᱟᱱ ᱯᱩᱛᱷᱤ ᱮᱢᱟᱱ ᱠᱚᱭ ᱚᱞ ᱟᱠᱟᱫᱼᱟ᱾ ᱟᱡᱟᱜ ᱡᱚᱛᱚ ᱠᱷᱚᱱ +ᱵᱟᱹᱲᱛᱤ ᱯᱟᱲᱦᱟᱣ ᱟᱠᱟᱱ ᱯᱚᱛᱚᱵ ᱫᱚ ᱦᱩᱭᱩᱜ +ᱠᱟᱱᱟ "ᱦᱤᱛᱟᱹᱞ"᱾ +ᱡᱟᱱᱟᱢ +ᱜᱩᱨᱩ ᱜᱚᱢᱠᱮ ᱯᱚᱸᱰᱤᱛ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱢᱩᱨᱢᱩ ᱫᱚ +ᱰᱟᱦᱟᱨᱰᱤ, ᱰᱟᱸᱰᱵᱩᱥ ᱟᱹᱛᱩ ᱨᱮ ᱵᱟᱹᱭᱥᱟᱹᱠ ᱵᱚᱸᱜᱟ ᱠᱩᱱᱟᱹᱢᱤ +ᱨᱮ ᱢᱤᱫ ᱢᱩᱨᱢᱩ ᱵᱟᱹᱠᱷᱳᱞ ᱨᱮᱭ ᱡᱟᱱᱟᱢ ᱞᱮᱱᱟ +᱾ ᱡᱟᱦᱟᱸ ᱫᱚ ᱢᱟᱦᱟᱸ ᱢᱟᱺᱦᱤᱛ ᱞᱮᱠᱟᱛᱮ ᱫᱚ ᱕/᱕/᱑᱙᱐᱕ ᱥᱟᱞᱮ ᱢᱮᱱᱛᱮ +ᱵᱚᱱ ᱢᱮᱛᱟᱜ ᱠᱟᱱᱟ ᱾ ᱟᱡᱟᱜ ᱡᱟᱱᱟᱢ ᱟᱹᱛᱩ ᱫᱚ ᱳᱰᱤᱥᱟ ᱯᱚᱱᱚᱛ +ᱟᱨ ᱢᱚᱭᱩᱨᱵᱷᱚᱸᱡᱽ ᱦᱚᱱᱚᱛ ᱨᱮ ᱢᱟᱬᱫᱟ ᱯᱤᱲ +ᱨᱮᱱᱟᱜ ᱰᱟᱦᱟᱨᱰᱤ, ᱰᱟᱸᱰᱵᱩᱥ ᱟᱛᱩ ᱾ ᱟᱡᱤᱡ ᱡᱟᱱᱟᱢ ᱵᱟᱵᱟᱦᱟᱜ ᱧᱩᱛᱩᱢ ᱫᱚ +ᱥᱤᱫᱚ ᱢᱩᱨᱢᱩ ᱟᱨᱵᱟᱝ ᱱᱚᱱᱫᱚᱞᱟᱞ ᱢᱮᱱᱛᱮ ᱛᱟᱦᱮᱸ ᱠᱟᱱᱟ +ᱟᱨ ᱡᱟᱱᱟᱢ ᱟᱭᱳᱣᱟᱜ ᱧᱩᱛᱩᱢ ᱫᱚ ᱥᱚᱞᱢᱟ ᱦᱟᱥᱫᱟ ᱥᱮ ᱥᱩᱢᱤ ᱢᱮᱱᱛᱮ +ᱛᱟᱦᱮᱸ ᱠᱟᱱᱟ ᱾ ᱥᱟᱱᱛᱟᱲ ᱡᱮᱜᱮᱛ ᱡᱟᱠᱟᱛ ᱨᱮ ᱑᱙᱐᱕ ᱥᱟᱹᱦᱤᱛ +ᱨᱮᱭᱟᱜ ᱕ ᱢᱮ ᱪᱟᱸᱫᱚ ᱢᱩᱞᱩᱜ ᱞᱮᱱᱟ ᱾ +ᱩᱲᱤᱥᱟ ᱯᱚᱱᱚᱛ ᱨᱮᱭᱟᱜ ᱢᱩᱭᱩᱨᱵᱷᱚᱡᱽ ᱡᱤᱞᱟᱹ ᱨᱮ ᱢᱮᱱᱟᱜ ᱨᱟᱭᱨᱚᱢᱯᱩᱨ ᱥᱩᱨ +ᱰᱟᱦᱟᱨᱰᱤ (ᱰᱟᱸᱰᱵᱚᱥ ᱱᱟᱦᱟᱜ ᱧᱩᱛᱩᱢ) ᱟᱹᱛᱩ ᱨᱮ ᱧᱩ ᱢᱟᱱ ᱱᱚᱱᱫᱚᱞᱟᱞ ᱢᱩᱨᱢᱩ diff --git a/sat/test-images/p1.png b/sat/test-images/p1.png new file mode 100644 index 0000000..c68d64d Binary files /dev/null and b/sat/test-images/p1.png differ diff --git a/sat/test-images/p2.gt.txt b/sat/test-images/p2.gt.txt new file mode 100644 index 0000000..c89b6da --- /dev/null +++ b/sat/test-images/p2.gt.txt @@ -0,0 +1,29 @@ +ᱟᱨ ᱥᱚᱞᱢᱟ ᱛᱟᱠᱤᱱᱟᱜ ᱠᱚᱞᱮ ᱢᱟᱨᱥᱟᱞ ᱞᱮᱫᱟ ᱾ ᱜᱩᱨᱩ +ᱜᱚᱢᱠᱮ ᱫᱚ ᱪᱩᱱᱩ ᱢᱩᱨᱢᱩ ᱧᱩᱛᱩᱢ ᱛᱮᱦᱚᱸ +ᱠᱚ ᱦᱚᱦᱚ ᱟᱭ ᱛᱟᱦᱮᱸᱫ ᱾ ᱑᱙᱒᱐ ᱥᱟᱹᱦᱤᱛ +ᱠᱷᱚᱱ ᱜᱚᱢᱡᱮ ᱫᱚ ᱚᱞᱚᱜ ᱡᱤᱭᱤᱱ ᱮ ᱮᱦᱚᱵ ᱞᱮᱫᱟ ᱾ +ᱜᱟᱹᱢᱵᱷᱟᱹᱨᱤᱭᱟᱹ ᱤᱭᱩ. ᱯᱤ ᱤᱥᱠᱤᱞ ᱠᱷᱚᱱᱟᱜ ᱾ ᱚᱱᱟ ᱛᱟᱭᱚᱢ +ᱵᱚᱦᱚᱲᱫᱟ ᱮᱢ.ᱢᱤ ᱦᱟᱭ ᱤᱥᱠᱤᱞ ᱠᱷᱚᱱ ᱑᱙᱒᱒ ᱥᱟᱹᱦᱤᱛ ᱨᱮ +ᱯᱟᱥ ᱠᱮᱫᱟ ᱾ ᱜᱩᱨᱩ ᱜᱚᱢᱠᱮ ᱟᱜ ᱠᱟᱛᱷᱟ +ᱢᱟ ᱚᱞ ᱛᱮ ᱵᱟᱝ ᱪᱟᱵᱟᱜ ᱞᱮᱠᱟ ᱮᱱᱦᱚᱸ +ᱟᱡᱟᱜ ᱥᱤᱨᱡᱚᱱ ᱚᱞ ᱟᱠᱷᱚᱨ ᱛᱮᱜᱮ ᱱᱚᱜᱼᱚᱭ ᱱᱤᱛᱚᱜ ᱫᱚᱵᱚᱱ +ᱚᱞᱚᱜ ᱠᱟᱱᱟ ᱾ +ᱜᱤᱫᱽᱨᱟᱹ ᱚᱠᱛᱚ +ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱢᱩᱨᱢᱩᱣᱟᱜ ᱧᱩᱛᱩᱢ ᱫᱚ ᱪᱷᱟᱹᱴᱭᱟᱹᱨ ᱧᱩᱛᱩᱢ +ᱞᱮᱠᱟᱛᱮ ᱫᱚ ᱪᱩᱱᱩ ᱢᱮᱱᱛᱮ ᱛᱟᱦᱮᱸ ᱠᱟᱱᱟ ᱾ ᱢᱮᱱᱠᱷᱟᱱ ᱪᱮᱫᱟᱜ +ᱪᱚᱝ ᱵᱟᱞᱮ ᱵᱮᱠᱮᱨ ᱜᱤᱫᱽᱨᱟᱹ ᱟᱹᱰᱤ ᱵᱟᱹᱲᱛᱤ +ᱜᱮᱭ ᱨᱟᱜ ᱠᱮᱫᱼᱟ ᱾ ᱜᱤᱫᱽᱨᱟᱹ ᱨᱟᱜ ᱜᱮ ᱵᱟᱭ +ᱛᱷᱤᱨ ᱞᱮᱱ ᱠᱷᱟᱱ ᱚᱲᱟᱜ ᱦᱚᱲ ᱠᱚ ᱟᱹᱰᱤ ᱜᱮᱠᱚ +ᱠᱟᱹᱦᱤᱞ ᱪᱟᱵᱟ ᱮᱱᱟ ᱾ ᱟᱭᱳ ᱵᱟᱵᱟ ᱦᱚᱸ ᱢᱤᱫᱨᱟᱦᱟ ᱜᱤᱫᱽᱨᱟᱹᱦᱟᱜ ᱨᱟᱜ +ᱟᱹᱡᱚᱢ ᱛᱮ ᱠᱤᱱ ᱠᱟᱹᱨᱤᱜᱷᱟᱢ ᱪᱟᱵᱟ ᱮᱱᱟ ᱾ ᱱᱩᱭ +ᱜᱤᱫᱽᱨᱟᱹᱦᱟᱜ ᱨᱟᱜ ᱟᱹᱡᱚᱢ ᱛᱮ ᱫᱤᱥᱟᱹ ᱜᱮ +ᱛᱟᱹᱠᱤᱱ ᱟᱫ ᱪᱟᱵᱟ ᱮᱱᱟ ᱾ ᱪᱮᱫ ᱠᱤᱱ ᱪᱤᱠᱟᱹᱭᱟ ᱪᱮᱫ +ᱫᱚ ᱵᱟᱝᱼᱟ, ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱹᱠᱤᱱ ᱫᱤᱥᱟᱹ ᱧᱟᱢ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱ ᱛᱟᱦᱮᱸᱫ +᱾ ᱟᱫᱚ ᱚᱡᱷᱟ ᱠᱚ ᱴᱷᱮᱱ ᱠᱷᱟᱹᱲᱤ +ᱢᱟᱹᱲᱤ ᱵᱟᱲᱟ ᱠᱟᱛᱮ ᱱᱚᱶᱟ ᱧᱟᱢ ᱮᱱᱟ ᱡᱮ, ᱱᱩᱭ ᱜᱤᱫᱽᱨᱟᱹᱦᱟᱜ +ᱫᱚ ᱧᱩᱛᱩᱢ ᱜᱮ ᱵᱟᱝ ᱜᱟᱱ ᱟᱠᱟᱱᱟ +᱾ ᱱᱩᱭ ᱜᱤᱫᱽᱨᱟᱹᱦᱟᱜ ᱧᱩᱛᱩᱢ ᱫᱚ ᱟᱹᱨᱩ ᱞᱮ ᱮᱱᱟᱝ ᱜᱮ ᱵᱟᱝᱠᱷᱟᱱ +ᱨᱟᱜ ᱜᱮ ᱵᱟᱭ ᱛᱷᱤᱨᱩᱜᱼᱟ ᱾ ᱚᱱᱟ ᱞᱮᱠᱟᱛᱮ ᱢᱤᱫ +ᱫᱤᱱ ᱫᱚ ᱡᱟᱦᱮᱨ ᱴᱚᱞᱟ ᱨᱤᱱᱤᱡ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱢᱩᱨᱢᱩ ᱟᱹᱱᱤᱡ ᱢᱤᱫ ᱚᱡᱷᱟ +ᱴᱷᱮᱱ ᱵᱚᱸᱜᱟ ᱵᱳᱨᱳ ᱵᱟᱲᱟ ᱦᱚᱪᱚ ᱠᱟᱛᱮ ᱩᱱᱤ ᱚᱡᱷᱟ +ᱴᱷᱮᱱ ᱜᱮ ᱟᱭᱳ ᱵᱟᱵᱟ ᱫᱚ ᱜᱤᱫᱽᱨᱟᱹ ᱠᱤᱱ ᱟᱹᱠᱷᱨᱤᱧ ᱠᱟᱫᱮᱭᱟ ᱾ diff --git a/sat/test-images/p2.png b/sat/test-images/p2.png new file mode 100644 index 0000000..716f3d4 Binary files /dev/null and b/sat/test-images/p2.png differ diff --git a/sat/test-images/p3.gt.txt b/sat/test-images/p3.gt.txt new file mode 100644 index 0000000..375b5c6 --- /dev/null +++ b/sat/test-images/p3.gt.txt @@ -0,0 +1,29 @@ +ᱚᱱᱟ ᱞᱮᱠᱟᱛᱮ ᱩᱱᱤ ᱚᱡᱷᱟ ᱦᱚᱸ ᱟᱡᱟᱜ ᱧᱩᱛᱩᱢ +ᱪᱟᱞ ᱠᱟᱛᱮ ᱜᱮ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱢᱮᱱᱛᱮᱭ ᱧᱩᱛᱩᱢ +ᱟᱹᱨᱩ ᱠᱮᱫᱮᱭᱟ ᱾ ᱚᱡᱷᱟ ᱠᱚᱣᱟᱜ ᱠᱷᱟᱹᱲᱤ +ᱢᱟᱹᱴᱤ ᱞᱮᱠᱟᱛᱮ ᱠᱟᱛᱷᱟ ᱫᱚ ᱟᱹᱰᱤ ᱜᱮ ᱥᱟᱹᱨᱤ +ᱮᱱᱟ ᱾ ᱪᱩᱱᱩ ᱵᱚᱫᱚᱞ ᱛᱮ ᱨᱚᱜᱷᱩ ᱢᱮᱱᱛᱮ ᱧᱩᱛᱩᱢ +ᱛᱟᱭ ᱟᱹᱨᱩ ᱮᱱ ᱠᱷᱟᱱ ᱜᱮ ᱜᱤᱫᱽᱨᱟᱹ +ᱨᱟᱜ ᱦᱚᱸᱭ ᱦᱟᱹᱯᱤ ᱮᱱᱟ ᱾ +ᱚᱞᱚᱜ ᱮᱛᱚᱦᱚᱵ +᱑᱙᱑᱒ ᱥᱟᱞᱮ ᱨᱮ ᱜᱟᱹᱢᱵᱷᱟᱹᱨᱤᱭᱟᱹ ᱭᱩ.ᱯᱤ. ᱟᱥᱲᱟ +ᱨᱮ ᱚᱞᱚᱜ ᱫᱚᱭ ᱮᱛᱚᱦᱚᱵ ᱠᱮᱫᱼᱟ ᱾ ᱚᱲᱟᱜ ᱨᱮᱢᱟ ᱢᱤᱫ +ᱞᱮᱠᱟ ᱵᱚᱱ ᱨᱚᱲ ᱠᱟᱱᱟ ᱤᱠᱷᱟᱹᱱ ᱚᱞᱚᱜ ᱟᱥᱲᱟ ᱨᱮᱫᱚ +ᱪᱮᱫᱟᱜ ᱮᱴᱟᱜ ᱟᱲᱟᱝ ᱨᱚᱲ ᱛᱮᱠᱚ ᱨᱚᱲ ᱠᱟᱱᱟ, ᱱᱚᱶᱟ ᱠᱚ +ᱧᱮᱞ ᱵᱟᱲᱟ ᱠᱟᱛᱮ ᱨᱚᱜᱷᱩ ᱫᱚ ᱚᱞᱚᱜ ᱯᱟᱲᱦᱟᱣ ᱫᱚ +ᱟᱹᱰᱤ ᱜᱮ ᱦᱟᱨᱠᱮᱛ ᱮ ᱵᱩᱡᱷᱟᱹᱣ ᱠᱮᱫᱼᱟ ᱾ +ᱡᱟᱱᱟᱢ ᱚᱲᱟᱜ ᱨᱮᱢᱟ ᱡᱟᱱᱟᱢ ᱟᱲᱟᱝ ᱥᱟᱱᱛᱟᱲᱤ ᱛᱮ ᱨᱚᱲ +ᱦᱩᱭᱩᱜ ᱠᱟᱱᱟ ᱤᱠᱷᱟᱹᱱ ᱚᱞᱚᱜ ᱟᱥᱲᱟ ᱨᱮᱫᱚ ᱫᱤᱠᱩ ᱟᱲᱟᱝ +ᱳᱰᱤᱭᱟᱹ ᱛᱮᱠᱚ ᱨᱚᱲ ᱠᱟᱱᱟ ᱾ ᱨᱚᱲ ᱠᱚᱢᱟ +ᱢᱚᱴᱷᱮ ᱜᱮ ᱵᱟᱝ ᱵᱩᱡᱷᱟᱹᱣ ᱧᱟᱢᱚᱜ ᱠᱟᱱ ᱫᱚ ᱾ +ᱱᱚᱶᱟ ᱠᱚ ᱧᱮᱞ ᱠᱟᱛᱮ ᱨᱚᱜᱷᱩ ᱫᱚ +ᱟᱹᱰᱤ ᱜᱮᱭ ᱠᱟᱺᱦᱤᱥᱚᱜ ᱠᱟᱱ ᱛᱟᱦᱮᱸᱫ ᱾ ᱢᱤᱫ ᱫᱤᱱ ᱫᱚ ᱚᱱᱟᱛᱮ +ᱟᱡ ᱵᱟᱵᱟᱭ ᱢᱮᱛᱟ ᱫᱮᱭᱟ, ᱤᱧ ᱫᱚ ᱵᱟ +ᱚᱞᱚᱜ ᱵᱟᱹᱧ ᱪᱟᱞᱟᱜᱼᱟ ᱾ ᱚᱞ ᱨᱚᱲ ᱜᱮ ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱹᱧ +ᱵᱩᱡᱷᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ ᱾ ᱢᱟᱪᱮᱛ ᱠᱚ ᱮᱠᱟᱞ +ᱜᱮ ᱥᱟᱱᱛᱟᱲᱤ ᱛᱮ ᱵᱟᱠᱚ ᱨᱚᱲ ᱠᱟᱱᱟ ᱾ +ᱪᱮ ᱚᱞ ᱦᱚᱸ ᱵᱟᱝ ᱠᱚ ᱚᱞᱚᱜ ᱠᱟᱱᱟ ᱾ ᱤᱧ +ᱢᱟ ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱹᱧ ᱵᱩᱡᱷᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ ᱾ ᱤᱱᱟᱹᱜ +ᱠᱷᱟᱱ ᱜᱮ ᱟᱡ ᱵᱟᱵᱟᱭ ᱵᱩᱡᱷᱟᱹᱣ ᱟᱫᱮᱭᱟ ᱪᱤ ᱵᱮᱴᱟ +ᱚᱞᱚᱜ ᱟᱥᱲᱟ ᱫᱚ ᱥᱮᱱᱚᱜ ᱢᱮᱜᱮ ᱾ ᱫᱤᱱ ᱦᱤᱞᱚᱜ ᱚᱞᱚᱜ ᱟᱥᱲᱟᱢ +ᱥᱮᱱ ᱞᱮᱱ ᱠᱷᱟᱱ ᱡᱚᱛᱚ ᱠᱟᱛᱷᱟᱢ ᱵᱩᱡᱷᱟᱹᱣ ᱫᱟᱲᱮᱭᱟᱜᱼᱟ diff --git a/sat/test-images/p3.png b/sat/test-images/p3.png new file mode 100644 index 0000000..897ae98 Binary files /dev/null and b/sat/test-images/p3.png differ diff --git a/sat/test-images/p4.gt.txt b/sat/test-images/p4.gt.txt new file mode 100644 index 0000000..38cbfa2 --- /dev/null +++ b/sat/test-images/p4.gt.txt @@ -0,0 +1,30 @@ +᱾ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱢᱩᱨᱢᱩ ᱫᱚ ᱟᱹᱲᱤᱥ ᱟᱹᱲᱤᱥ ᱛᱮ ᱪᱮᱫ +ᱦᱚᱸ ᱵᱟᱭ ᱢᱮᱱ ᱨᱩᱣᱟᱹᱲ ᱫᱟᱲᱮᱭᱟᱫ-ᱟ ᱾ +ᱵᱟᱵᱟ ᱥᱤᱫᱚ ᱦᱚᱸ ᱦᱚᱯᱚᱱᱟᱜ ᱜᱚᱥᱚ ᱢᱮᱫᱦᱟ ᱧᱮᱞ +ᱠᱟᱛᱮ ᱟᱹᱰᱤ ᱫᱩᱠ ᱮ ᱵᱩᱡᱷᱟᱹᱣ ᱠᱮᱫᱼᱟ +᱾ ᱤᱠᱷᱟᱹᱱ ᱵᱟᱵᱟ ᱫᱚ ᱫᱩᱞᱟᱹᱲ ᱟᱲᱟᱝ ᱛᱮ ᱦᱚᱯᱚᱱ +ᱛᱟᱭ ᱮ ᱢᱮᱛᱟ ᱫᱮᱭᱟ, ᱵᱟᱵᱟ ᱛᱤᱧ, ᱫᱷᱚᱱ ᱛᱤᱧ ᱪᱮᱫ +ᱮᱢ ᱠᱷᱚᱡᱚᱜ ᱠᱟᱱᱟ, ᱱᱟᱶᱟ ᱫᱚᱛᱚ ᱥᱮ ᱱᱟᱶᱟ ᱯᱮᱸᱴ +ᱪᱮ ᱥᱤᱵᱤᱞ ᱥᱤᱵᱤᱞ ᱡᱚᱢᱟᱜ ᱠᱚᱢ ᱧᱟᱢ +ᱠᱟᱱᱟ ᱾ ᱩᱱᱨᱮ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱮ ᱢᱮᱱ ᱨᱩᱣᱟᱹᱲ +ᱠᱮᱫᱼᱟ, ᱤᱧ ᱫᱚ ᱪᱮᱫ ᱦᱚᱸ ᱵᱟᱹᱧ ᱧᱟᱢ ᱠᱟᱱᱟ ᱾ ᱤᱧ +ᱫᱩᱧ ᱧᱟᱢ ᱠᱟᱱᱟ ᱟᱵᱚ ᱟᱲᱟᱝ ᱛᱮ ᱚᱞ ᱨᱚᱲ +ᱦᱩᱭᱩᱜ ᱢᱟ ᱾ ᱵᱟᱵᱟ ᱫᱚ ᱫᱩᱞᱟᱹᱲ ᱟᱲᱟᱝ +ᱛᱮ ᱦᱚᱯᱚᱱ ᱮ ᱢᱮᱛᱟᱭ ᱠᱟᱱᱟ, ᱫᱤᱱᱟᱹᱢ ᱦᱤᱞᱚᱜ ᱚᱞᱚᱜ ᱟᱥᱲᱟ +ᱛᱮᱢ ᱥᱮᱱ ᱞᱮᱱ ᱠᱷᱟᱱ ᱟᱵᱚᱣᱟᱜ ᱟᱲᱟᱝ ᱛᱮ ᱚᱞ ᱨᱚᱲ +ᱦᱚᱸᱢ ᱧᱟᱢ ᱫᱟᱲᱮᱭᱟᱜ ᱜᱮᱭᱟ ᱾ ᱱᱚᱣᱟ ᱠᱟᱛᱷᱟ ᱢᱤᱫ ᱫᱷᱟᱣ +ᱵᱟᱵᱟᱭ ᱢᱮᱱ ᱠᱮᱫᱼᱟ ᱤᱠᱷᱟᱹᱱ ᱨᱚᱜᱷᱩᱣᱟᱜ ᱢᱚᱱᱮ ᱨᱮᱫᱚ +ᱟᱹᱰᱤ ᱠᱮᱴᱮᱡ ᱛᱮ ᱵᱟᱹᱭᱥᱟᱹᱣ ᱛᱟᱦᱮᱸ ᱮᱱᱟ ᱾ +᱑᱙᱐᱐ ᱑᱔-᱑᱕ ᱨᱮ ᱥᱟᱶᱱᱟ ᱢᱩᱨᱢᱩ ᱦᱚᱸ ᱚᱱᱟ +ᱜᱟᱺᱵᱷᱟᱹᱨᱤᱭᱟᱹ ᱤᱛᱩᱱ ᱟᱥᱲᱟ ᱨᱮᱜᱮᱭ ᱚᱞᱚᱜ ᱠᱟᱱ ᱛᱟᱦᱮᱸᱫ +᱾ ᱥᱟᱹᱜᱟᱹᱭ ᱛᱟᱹᱠᱤᱱ ᱫᱚ ᱢᱟᱢᱚ ᱵᱷᱟᱹᱜᱽᱱᱟᱹ ᱢᱮᱱᱮᱛ ᱥᱟᱶᱱᱟ ᱢᱩᱨᱢᱩ ᱫᱚ +ᱨᱚᱜᱷᱩ ᱴᱷᱮᱱ ᱮ ᱢᱟᱢᱚ ᱦᱚᱪᱚᱜ ᱠᱟᱱ ᱛᱟᱦᱮᱸᱫ ᱾ ᱨᱚᱜᱷᱩ ᱥᱟᱶ +ᱫᱚ ᱢᱤᱫ ᱪᱟᱱᱚᱪ ᱜᱮ ᱪᱮᱛᱟᱱ ᱞᱟᱛᱟᱨ ᱠᱤᱱ ᱚᱞᱚᱜ +ᱠᱟᱱ ᱛᱟᱦᱮᱸᱫ ᱾ ᱚᱱᱟᱛᱮ ᱵᱟᱵᱟ ᱫᱚ ᱵᱟᱱᱟ ᱦᱚᱲ ᱮ ᱡᱚᱴᱟᱣ +ᱠᱟᱫ ᱠᱤᱱᱟ ᱾ ᱢᱟᱢᱚ ᱥᱟᱶᱱᱟ ᱢᱩᱨᱢᱩ ᱫᱚ ᱫᱤᱱᱟᱹᱢ ᱦᱤᱞᱚᱜ +ᱠᱟᱫᱩᱣᱟᱬᱤ ᱟᱹᱛᱩ ᱠᱷᱚᱱ ᱮ ᱦᱤᱡᱩᱜ ᱥᱮᱱᱚᱜ ᱠᱟᱱ ᱛᱟᱦᱮᱸᱫ ᱾ ᱚᱱᱠᱟ +ᱜᱮ ᱨᱚᱜᱷᱩ ᱦᱚᱸ ᱫᱤᱱ ᱜᱮᱭ ᱦᱤᱡᱩᱜ ᱥᱮᱱᱚᱜ ᱠᱟᱱ ᱛᱟᱦᱮᱸᱫ +᱾ ᱟᱹᱠᱤᱱᱟᱜ ᱢᱚᱱᱮ ᱨᱮᱫᱚ ᱢᱤᱫᱴᱟᱹᱝ ᱜᱮ ᱟᱸᱥ ᱛᱟᱦᱮᱸ +ᱠᱟᱱᱟ ᱚᱠᱟᱨᱮ ᱟᱨ ᱪᱮᱫ ᱞᱮᱠᱟᱨᱮ ᱚᱞ ᱪᱤᱠᱤ +ᱫᱚ ᱠᱤᱱ ᱧᱟᱢᱟ ᱾ ᱚᱱᱟᱛᱮ ᱚᱞᱚᱜ ᱟᱥᱲᱟ +ᱨᱮ ᱩᱞᱯᱷᱟᱹ ᱚᱠᱛᱚ ᱠᱚᱨᱮ ᱜᱤᱫᱽᱨᱟᱹ ᱠᱚ ᱥᱟᱶ ᱵᱟᱝ ᱡᱚᱴᱟᱣ ᱠᱟᱛᱮ diff --git a/sat/test-images/p4.png b/sat/test-images/p4.png new file mode 100644 index 0000000..15fdb4d Binary files /dev/null and b/sat/test-images/p4.png differ diff --git a/sat/test-images/p5.gt.txt b/sat/test-images/p5.gt.txt new file mode 100644 index 0000000..dc97096 --- /dev/null +++ b/sat/test-images/p5.gt.txt @@ -0,0 +1,29 @@ +ᱜᱟᱰᱟ ᱟᱲᱮ ᱨᱮ ᱫᱩᱲᱩᱵ ᱠᱟᱛᱮ ᱠᱟᱰᱮᱡ ᱠᱚᱛᱮ ᱪᱮᱫ ᱠᱚᱪᱚ +ᱱᱟᱱᱟ ᱦᱩᱱᱟᱹᱨ ᱵᱷᱚᱲᱚᱠ ᱜᱮᱭ ᱵᱮᱱᱟᱣ ᱵᱟᱲᱟᱭ +ᱛᱟᱦᱮᱸᱫ ᱾ +ᱱᱚᱝᱠᱟ ᱜᱮ ᱫᱤᱱ ᱛᱟᱭᱚᱢ ᱫᱤᱱ ᱯᱟᱨᱚᱢ +ᱤᱫᱤ ᱮᱱᱟ ᱾ ᱢᱤᱫ ᱫᱤᱢ ᱫᱚ ᱥᱟᱶᱱᱟ +ᱢᱩᱨᱢᱩ ᱫᱚ ᱨᱚᱜᱷᱩ ᱢᱩᱨᱢᱩ ᱴᱷᱮᱱ ᱥᱮᱱ ᱠᱟᱛᱮᱭ +ᱢᱮᱛᱟᱭ ᱠᱟᱱᱟ, ᱵᱷᱚᱬᱡᱟ ᱜᱳ ᱟᱢ ᱫᱚ ᱦᱟᱯᱮᱱ ᱫᱤᱱ ᱨᱮ +ᱟᱹᱰᱤ ᱢᱟᱨᱟᱝ ᱵᱟᱰᱚᱦᱤᱭᱟᱹᱢ ᱵᱮᱱᱟᱣᱜ-ᱟ ᱾ ᱱᱚᱝᱠᱟ ᱛᱮᱜᱮ ᱚᱸᱰᱮ ᱠᱷᱚᱱ ᱚᱞᱚᱜ +ᱫᱚ ᱠᱤᱱ ᱥᱟᱹᱛ ᱠᱮᱫ-ᱟ ᱾ +ᱵᱚᱦᱚᱲᱫᱟ ᱨᱮ ᱚᱞᱚᱜ +ᱜᱟᱺᱵᱷᱟᱹᱨᱤᱭᱟᱹ ᱠᱷᱚᱱ ᱚᱞᱚᱜ ᱥᱟᱹᱛ ᱠᱟᱛᱮ ᱨᱚᱜᱷᱩ ᱟᱨ ᱥᱟᱶᱱᱟ ᱫᱚ +ᱵᱚᱦᱚᱲᱫᱟ ᱚᱞᱚᱜ ᱟᱥᱲᱟ ᱠᱤᱱ ᱥᱮᱱ ᱮᱱᱟ ᱾ ᱑᱙᱒᱐ ᱥᱟᱞᱮᱨᱮ +ᱵᱚᱦᱚᱲᱫᱟ ᱨᱮ ᱚᱞᱚᱜ ᱚᱠᱛᱚ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱟᱨ ᱥᱟᱶᱱᱟ ᱛᱤᱠᱤᱱ ᱫᱚ ᱵᱚᱦᱚᱲᱫᱟ +ᱡᱟᱯᱟᱜ ᱵᱟᱱᱟ ᱰᱩᱸᱜᱽᱨᱤ ᱨᱮ ᱰᱮᱨᱟ ᱵᱟᱥᱟ ᱠᱚ ᱛᱟᱦᱮᱸ ᱠᱟᱱᱟ +᱾ ᱵᱟᱱᱟ ᱰᱩᱸᱜᱽᱨᱤ ᱰᱮᱨᱟ ᱵᱟᱥᱟ ᱫᱚ ᱪᱩᱱᱩ ᱰᱮᱨᱟ ᱢᱮᱱᱛᱮ ᱠᱚ +ᱧᱩᱛᱩᱢ ᱞᱮᱫ ᱛᱟᱦᱮᱸᱫ ᱾ ᱯᱟᱲᱦᱟᱣ ᱚᱠᱛᱚ ᱨᱮᱦᱚᱸ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ +ᱟᱨ ᱥᱟᱶᱱᱟ ᱡᱟᱹᱛᱤ ᱥᱟᱶᱛᱟ ᱟᱨ ᱫᱷᱚᱨᱚᱢ ᱠᱟᱛᱷᱟ ᱠᱚ ᱜᱮ ᱠᱤᱱ +ᱩᱭᱦᱟᱹᱨ ᱵᱟᱲᱟ ᱮᱫ ᱛᱟᱦᱮᱸᱫ ᱾ ᱚᱞᱚᱜ +ᱯᱟᱲᱦᱟᱣ ᱚᱠᱛᱚ ᱨᱮᱦᱚᱸ ᱡᱟᱹᱛᱤ ᱥᱟᱶᱛᱟ ᱜᱮ +ᱟᱹᱨᱥᱤ ᱞᱮᱠᱟ ᱡᱷᱟᱞᱠᱟᱣ ᱟᱹᱠᱤᱱ ᱠᱟᱱ ᱛᱟᱦᱮᱸᱫ ᱾ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱟᱡ ᱵᱟᱵᱟ +ᱫᱚ ᱚᱡᱷᱟ ᱴᱷᱮᱱ ᱠᱷᱚᱱ ᱮ ᱟᱸᱡᱚᱢ ᱞᱮᱫ ᱛᱟᱦᱮᱸᱫ, +ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱫᱚ ᱠᱟᱹᱯᱤ ᱵᱳᱨᱳ ᱵᱚᱸᱜᱟ ᱛᱷᱩᱢ ᱛᱮᱜᱮᱭ ᱚᱯᱮᱞ +ᱟᱠᱟᱱᱟ ᱾ ᱚᱱᱟᱛᱮ ᱚᱞᱚᱜ ᱡᱚᱦᱚᱜ ᱦᱚᱸ +ᱞᱮᱛᱟᱲ ᱜᱮ ᱚᱠᱚᱭ ᱪᱚᱭ ᱞᱟᱹᱭ ᱟᱭ ᱞᱮᱠᱟᱭ ᱵᱩᱡᱷᱟᱹᱣ +ᱮᱫ ᱛᱟᱦᱮᱸᱫ ᱾ ᱵᱟᱱᱟ ᱰᱩᱸᱜᱽᱨᱤ ᱪᱩᱱᱩ ᱰᱮᱨᱟ ᱨᱮ ᱫᱤᱱᱟᱹᱢ +ᱚᱞᱚᱜ ᱵᱮᱲᱟ ᱨᱮ ᱚᱠᱟ ᱞᱮᱠᱟᱱ ᱫᱟᱲᱮ ᱪᱚᱝ +ᱟᱹᱭᱠᱟᱹᱣ ᱠᱟᱛᱮ ᱟᱡᱟᱜ ᱦᱚᱲᱢᱚ ᱠᱚ ᱦᱟᱢᱟᱞ ᱜᱮᱭ ᱵᱩᱡᱷᱟᱹᱣ ᱛᱟᱦᱮᱸᱫ +᱾ ᱚᱱᱟ ᱫᱟᱲᱮ ᱫᱚ ᱵᱤᱫᱩ ᱪᱟᱸᱫᱟᱱ +ᱚᱞ ᱵᱤᱨᱫᱟᱹ ᱜᱩᱱ ᱫᱟᱲᱮ ᱜᱮ ᱛᱟᱦᱮᱸ ᱠᱟᱱᱟ ᱾ diff --git a/sat/test-images/p5.png b/sat/test-images/p5.png new file mode 100644 index 0000000..7d04ae8 Binary files /dev/null and b/sat/test-images/p5.png differ diff --git a/sat/test-images/p6.gt.txt b/sat/test-images/p6.gt.txt new file mode 100644 index 0000000..161b459 --- /dev/null +++ b/sat/test-images/p6.gt.txt @@ -0,0 +1,29 @@ +ᱚᱱᱠᱟ ᱛᱮᱜᱮ ᱮᱢ.ᱤ. ᱚᱞᱚᱜ ᱫᱚ ᱑᱙᱒᱒ ᱥᱟᱞᱮ ᱨᱮᱭ ᱥᱟᱹᱛ ᱠᱮᱫᱼᱟ +᱾ +ᱤᱱᱟᱹ ᱛᱟᱭᱚᱢ ᱛᱤᱱᱟᱹᱝ ᱫᱤᱱ ᱜᱟᱱ ᱫᱚ ᱚᱞ ᱯᱟᱲᱦᱟᱣ ᱠᱟᱹᱢᱤ ᱠᱚ +ᱰᱤᱜᱟᱹ ᱧᱚᱜ ᱠᱟᱛᱮ ᱠᱟᱰᱮᱡ ᱠᱚᱛᱮ ᱦᱟᱱᱟ +ᱱᱷᱟᱣᱟᱭ ᱵᱮᱱᱟᱣ ᱛᱟᱦᱮᱸᱫ, ᱟᱨ ᱚᱱᱟ ᱠᱚ ᱧᱮᱞ ᱠᱟᱛᱮ +ᱜᱮ ᱥᱟᱶᱱᱟ ᱢᱩᱨᱢᱩ ᱫᱚ ᱩᱱ ᱡᱚᱦᱚᱜ ᱨᱮᱜᱮᱭ ᱢᱮᱱ ᱞᱮᱫ ᱛᱟᱦᱮᱸᱫ, +ᱱᱩᱭ ᱫᱚ ᱦᱟᱯᱮᱱ ᱫᱤᱱ ᱨᱮ ᱟᱹᱰᱤ ᱢᱟᱨᱟᱝ ᱠᱟᱹᱨᱤᱠᱚᱞ ᱜᱮᱭ ᱵᱮᱱᱟᱣᱜᱼᱟ +᱾ +ᱵᱟᱹᱨᱯᱟᱫᱟ ᱨᱮ ᱚᱞᱚᱜ ᱚᱠᱛᱚ +᱑᱙᱒᱔ ᱥᱟᱞᱮ ᱨᱮ ᱢᱮᱴᱨᱤᱠ ᱯᱟᱲᱦᱟᱣ ᱞᱟᱹᱜᱤᱫ ᱫᱚ +ᱵᱟᱹᱨᱯᱟᱫᱟ ᱩᱱᱩᱥᱩᱞ ᱟᱥᱲᱟ ᱨᱮ ᱵᱷᱩᱨᱛᱤᱭ ᱦᱟᱛᱟᱣ ᱠᱮᱫᱼᱟ ᱾ +ᱚᱸᱰᱮ ᱚᱞᱚᱜ ᱚᱠᱛᱚ ᱨᱮᱦᱚᱸ ᱟᱡ ᱫᱚ ᱵᱟᱹᱲᱛᱤ +ᱚᱠᱛᱚ ᱫᱚ ᱱᱤᱪᱚᱞ ᱚᱠᱛᱚ ᱨᱮ ᱫᱩᱲᱩᱵ ᱠᱟᱛᱮ ᱪᱮᱫ ᱠᱚᱪᱚᱭ ᱩᱭᱦᱟᱹᱨ +ᱵᱟᱲᱟᱭ ᱛᱟᱦᱮᱸᱫ ᱾ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱵᱟᱹᱨᱯᱟᱫᱟ ᱨᱮᱭ ᱚᱞᱚᱜ ᱠᱟᱱ ᱵᱮᱲᱟ ᱨᱮᱫᱚ +ᱥᱟᱶᱱᱟ ᱢᱩᱨᱢᱩ ᱫᱚ ᱵᱟᱹᱨᱯᱟᱫᱟ ᱨᱮᱜᱮ ᱢᱟᱪᱮᱛ +ᱴᱨᱮᱱᱤᱝ ᱮ ᱮᱢᱮᱫ ᱛᱟᱦᱮᱸ ᱠᱟᱱᱟ ᱾ ᱚᱱᱠᱟ ᱛᱮ ᱢᱤᱫ ᱫᱤᱱ +ᱫᱚ ᱴᱟᱴᱠᱟ ᱜᱮ ᱠᱤᱱ ᱧᱟᱯᱟᱢ ᱮᱱᱟ ᱾ ᱛᱤᱱᱟᱹᱝ +ᱫᱤᱱ ᱛᱟᱭᱚᱢ ᱠᱷᱟᱱ ᱜᱮ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱫᱚ ᱵᱤᱱᱤᱰ ᱮᱢ ᱥᱟᱹᱛ +ᱠᱟᱛᱮ ᱚᱲᱟᱜ ᱮ ᱨᱩᱣᱟᱹᱲ ᱮᱱᱟ ᱾ +ᱢᱮᱴᱨᱤᱠ ᱥᱟᱹᱛ ᱠᱟᱛᱮ ᱨᱮᱦᱚᱸ ᱵᱟᱹᱨᱯᱟᱫᱟ ᱨᱮᱜᱮ +ᱟᱯᱨᱮᱱᱴᱤᱥ ᱴᱨᱮᱱᱤᱝ ᱥᱮᱱᱴᱚᱨ ᱨᱮᱭ ᱵᱷᱩᱨᱛᱤ ᱮᱱᱟ ᱾ ᱛᱤᱱᱟᱹᱝ +ᱫᱤᱱ ᱛᱟᱭᱚᱢ ᱠᱷᱟᱱ ᱜᱮ ᱟᱯᱨᱮᱱᱴᱤᱥ ᱦᱚᱸᱭ ᱯᱩᱨᱟᱹᱣ ᱠᱮᱫᱼᱟ +᱾ ᱚᱱᱟ ᱪᱟᱞᱟᱣ ᱨᱮᱜᱮ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱢᱩᱨᱢᱩ ᱫᱚ +ᱚᱞ ᱪᱤᱠᱤ ᱦᱚᱸᱭ ᱵᱮᱱᱟᱣ ᱥᱟᱹᱛ ᱞᱮᱫ +ᱛᱟᱦᱮᱸᱫ ᱾ ᱚᱱᱟ ᱜᱮ ᱢᱟᱢᱚ ᱥᱟᱶᱱᱟ ᱢᱩᱨᱢᱩᱭ +ᱫᱮᱠᱷᱟᱣ ᱧᱚᱜ ᱟᱫᱮᱛᱮ ᱑᱙᱒᱕ ᱥᱟᱞᱮ ᱨᱮᱫᱚ ᱚᱞ ᱪᱤᱠᱤ ᱫᱤᱥᱚᱢ ᱦᱚᱲ +ᱥᱟᱢᱟᱝ ᱨᱮᱭ ᱩᱫᱩᱜ ᱥᱚᱫᱚᱨ ᱠᱮᱫᱼᱟ ᱾ +ᱩᱱ ᱡᱚᱦᱚᱜ ᱜᱮ ᱨᱚᱜᱷᱩᱱᱟᱛᱷ ᱢᱩᱨᱢᱩ ᱫᱚ +ᱥᱟᱶᱱᱟ ᱢᱩᱨᱢᱩ ᱴᱷᱮᱱ ᱮ ᱞᱟᱹᱭ ᱥᱚᱫᱚᱨ ᱞᱮᱫ ᱛᱟᱦᱮᱸᱫ ᱚᱱᱟ diff --git a/sat/test-images/p6.png b/sat/test-images/p6.png new file mode 100644 index 0000000..3454c7a Binary files /dev/null and b/sat/test-images/p6.png differ diff --git a/sat/test-images/rar-sanes10.gt.txt b/sat/test-images/rar-sanes10.gt.txt new file mode 100644 index 0000000..7ee102c --- /dev/null +++ b/sat/test-images/rar-sanes10.gt.txt @@ -0,0 +1,29 @@ +ᱨᱚᱲ ᱨᱮᱭᱟᱜ ᱩᱱᱩᱨᱩᱢ ᱟᱨ ᱢᱩᱴᱷᱟᱹᱱ + +ᱨᱚᱲ ᱫᱚ ᱢᱚᱪᱟ ᱠᱷᱚᱱ ᱚᱰᱚᱠᱚᱜ ᱢᱤᱫ ᱟᱲᱟᱝ ᱠᱟᱱᱟ ᱾ +ᱦᱚᱲᱟᱜ ᱦᱩᱱᱟᱹᱝ ᱟᱲᱟᱝ ᱵᱟᱝ ᱛᱟᱦᱮᱸᱱ ᱠᱷᱟᱱ ᱡᱚᱛᱚ ᱠᱚᱸᱫᱟ +ᱠᱩᱸᱫᱤ ᱠᱟᱛᱮᱵᱚ ᱛᱟᱦᱮᱸ ᱠᱚᱜ ᱟ ᱟᱨ ᱦᱚᱲ ᱵᱟᱝ ᱠᱟᱛᱮ ᱵᱟᱨ +ᱠᱟᱴᱟᱦᱟᱱ ᱯᱩᱥᱩᱵᱚ ᱦᱩᱭ ᱠᱚᱜ ᱟ ᱾ ᱛᱚᱵᱮ ᱦᱚᱲ ᱫᱚᱭ ᱨᱚᱲ +ᱠᱟᱱᱛᱮ ᱡᱮᱜᱮᱛ ᱨᱤᱱᱤᱡ ᱡᱚᱛᱚ ᱠᱷᱚᱱ ᱵᱩᱫᱷᱤᱭᱟᱱ ᱡᱤᱵᱽ +ᱠᱟᱱᱟᱭ ᱾ ᱚᱱᱟ ᱠᱷᱟᱹᱛᱤᱨ ᱜᱮ ᱪᱟᱸᱫᱚ ᱵᱚᱝᱜᱟ ᱠᱷᱚᱱ ᱞᱟᱛᱟᱨ +ᱨᱮ ᱟᱡᱟᱜ ᱴᱷᱟᱶᱫᱚ ᱾ ᱨᱚᱲ ᱠᱟᱱᱟᱭ ᱢᱮᱱᱛᱮ ᱦᱚᱲ ᱠᱟᱱᱟᱭ +ᱟᱨ ᱦᱚᱲ ᱠᱟᱱᱟᱭ ᱢᱮᱱᱛᱮᱜᱮ ᱨᱚᱲ ᱠᱟᱱᱟᱭ᱾ ᱵᱤᱱ ᱨᱚᱲ +ᱛᱮᱫᱚ ᱦᱚᱲ ᱵᱟᱭ ᱛᱟᱦᱮᱸ ᱠᱮᱭᱟ, ᱚᱱᱟᱛᱮᱠᱚ ᱢᱮᱱᱟ ᱟᱭᱟᱹ +ᱥᱚᱫᱚᱨ ᱞᱟᱹᱜᱤᱫ ᱠᱚᱸᱫᱟᱠᱩᱸᱫᱤ ᱦᱚᱲ ᱦᱚᱸᱠᱚ ᱩᱸᱻᱪᱩᱸᱜ ᱜᱮᱭᱟ ᱾ + +ᱨᱚᱲᱫᱚ ᱢᱟᱹᱱᱢᱤ ᱞᱟᱹᱜᱤᱫ ᱪᱟᱸᱫᱚ ᱵᱚᱝᱜᱟᱦᱟᱜ ᱡᱚᱛᱚ +ᱠᱷᱚᱱ ᱢᱟᱨᱟᱝ ᱮᱱᱮᱢ ᱠᱟᱱᱟ ᱾ ᱨᱚᱲ ᱢᱮᱱᱟᱜ ᱛᱮ ᱥᱟᱶᱛᱟᱨᱮ +ᱟᱨ ᱥᱟᱱᱟᱢ ᱡᱮᱜᱮᱛᱨᱮ ᱦᱚᱲ ᱦᱚᱲ ᱵᱷᱤᱛᱨᱤᱨᱮ ᱥᱟᱹᱜᱟᱹᱭ +ᱡᱚᱱᱚᱲᱟᱣ ᱦᱩᱭ ᱫᱟᱲᱮᱭᱟᱜ ᱠᱟᱱᱟ ᱾ ᱨᱚᱲ ᱦᱚᱛᱮ ᱛᱮᱜᱮ ᱦᱚᱲ +ᱟᱡᱟᱜ ᱵᱟᱠᱷᱮᱬᱮ,ᱵᱤᱱᱛᱤ, ᱨᱟᱭᱨᱤᱛ, ᱞᱟᱭ ᱞᱟᱠᱪᱟᱨ ᱡᱚᱛᱚᱭ +ᱥᱟᱢᱴᱟᱣ ᱫᱚᱦᱚ ᱞᱮᱜ ᱟ ᱟᱨ ᱮ ᱩᱭᱦᱟᱹᱨ ᱫᱚᱦᱚ ᱞᱮᱜ ᱟ +ᱟᱡᱟᱜ ᱢᱚᱱᱮ ᱯᱟᱠᱷᱟᱨᱮ᱾ ᱨᱚᱲ ᱵᱟᱝᱠᱷᱟᱱ ᱦᱚᱲ ᱢᱤᱫ +ᱡᱟᱝᱜᱟ ᱦᱚᱸ ᱵᱟᱭ ᱢᱟᱬᱟᱝ ᱫᱟᱲᱮᱭᱟᱜ ᱟ᱾ +ᱟᱡᱟᱜ ᱞᱟᱦᱟᱱᱛᱤ ᱰᱟᱦᱟᱨᱜᱮ ᱮᱥᱮᱫ ᱩᱛᱟᱹᱨᱚᱜ ᱟ ᱾ + +ᱛᱚᱵᱮ ᱱᱚᱣᱟ ᱨᱚᱲᱫᱚ ᱪᱮᱫ ᱠᱟᱱᱟ ? + +'ᱚᱲ' ᱟᱹᱲᱟᱨᱮ 'ᱨ' ᱟᱜᱟᱛ ᱞᱮᱱᱠᱷᱟᱱ 'ᱨᱚᱲ' ᱟᱹᱲᱟᱹᱫᱚ +ᱵᱮᱱᱟᱣᱜ ᱠᱟᱱᱟ ᱾ 'ᱚᱲ' ᱢᱮᱱ ᱞᱮᱠᱷᱟᱱ 'ᱚᱲᱚᱝ' ᱵᱩᱡᱷᱟᱹᱣᱜ +ᱟ ᱾ ᱚᱱᱮ ᱵᱟᱠᱚ ᱢᱮᱱᱟᱮ, 'ᱪᱮᱫᱦᱚᱸ ᱵᱟᱭ ᱚᱲ ᱟᱭᱟ'᱾ +'ᱪᱮᱫᱦᱚᱸ ᱵᱟᱝ ᱚᱲᱵᱚᱝ ᱟᱭᱟ' ᱾ ᱢᱮᱱᱫᱚ ᱡᱟᱦᱟᱸᱭ ᱵᱟᱭ \ No newline at end of file diff --git a/sat/test-images/rar-sanes10.jpg b/sat/test-images/rar-sanes10.jpg new file mode 100644 index 0000000..2443372 Binary files /dev/null and b/sat/test-images/rar-sanes10.jpg differ diff --git a/sat/test-images/rar-sanes24.gt.txt b/sat/test-images/rar-sanes24.gt.txt new file mode 100644 index 0000000..b97ae84 --- /dev/null +++ b/sat/test-images/rar-sanes24.gt.txt @@ -0,0 +1,28 @@ +ᱞᱮᱠᱟᱛᱮ ᱵᱷᱟᱨᱳᱯᱤᱭᱚᱱ ᱨᱚᱲ ᱵᱚ ᱢᱮᱱ ᱫᱟᱲᱮᱭᱟᱜ +ᱟ ᱾ ᱨᱚᱲ ᱨᱮᱭᱟᱜ ᱜᱷᱟᱨᱚᱸᱡᱽ ᱦᱟᱹᱴᱤᱧ ᱡᱚᱦᱚᱜ ᱱᱚᱝᱠᱟᱱ +ᱨᱚᱲ ᱫᱚ ᱢᱩᱬ ᱨᱚᱲ ᱢᱮᱱᱛᱮ ᱠᱚ ᱧᱩᱢᱟ ᱾ ᱢᱤᱫᱴᱟᱹᱝ ᱢᱟᱨᱮ +ᱜᱟᱹᱫᱤᱨᱮ ᱟᱹᱰᱤᱜᱟᱱ ᱛᱟᱦᱮᱸ ᱠᱟᱛᱮ ᱦᱚᱲᱠᱚ ᱥᱟᱸᱜᱮ ᱭᱮᱱ +ᱠᱷᱟᱱ ᱱᱩᱠᱩ ᱯᱟᱹᱨᱥᱤ ᱨᱤᱱ ᱜᱮ ᱛᱤᱱᱟᱹᱜ ᱫᱚ ᱚᱸᱰᱮ ᱛᱟᱦᱮᱸ +ᱠᱟᱛᱮ ᱮᱴᱟᱜ ᱠᱚᱫᱚ ᱡᱚᱢ ᱟᱨ ᱛᱟᱦᱮᱸᱱ ᱴᱷᱟᱶ ᱯᱟᱱᱛᱮᱨᱮ +ᱵᱤᱫᱤᱞᱚᱜ ᱟ ᱠᱚ ᱾ ᱱᱟᱶᱟ ᱴᱷᱟᱶᱨᱮ ᱱᱟᱶᱟ ᱦᱚᱭ ᱦᱤᱥᱤᱫ +ᱟᱠᱚᱣᱟᱜ ᱟᱹᱥᱩᱞᱚᱜ ᱨᱮ ᱟᱹᱰᱤᱜᱟᱱ ᱟᱹᱨᱩ ᱯᱷᱮᱨᱟᱶ ᱮ ᱟᱹᱜᱩᱭᱟ +ᱟᱨ ᱦᱚᱲᱢᱚ ᱪᱮᱛᱟᱱ ᱨᱮᱦᱚᱸ ᱚᱨᱥᱚᱝ ᱯᱟᱲᱟᱶᱜ ᱟ ᱾ ᱚᱱᱠᱟᱨᱮ +ᱢᱩᱬ ᱨᱚᱲᱨᱮ ᱵᱚᱫᱚᱞ ᱧᱮᱞᱚᱜ ᱟ ᱟᱨ ᱚᱱᱟ ᱵᱚᱫᱚᱞ ᱨᱚᱲ +ᱟᱨᱦᱚᱸ ᱩᱪᱟᱹᱲ ᱱᱟᱪᱟᱲ ᱛᱮ ᱟᱹᱰᱤᱥᱮᱫ ᱪᱟᱸᱜᱟᱜ ᱠᱟᱛᱮ ᱟᱭᱢᱟ +ᱨᱚᱲᱮᱱ ᱜᱮ ᱾ ᱚᱱᱠᱟᱛᱮ ᱭᱩᱨᱳᱯ ᱨᱮᱱᱟᱜ ᱢᱩᱬ ᱨᱚᱲ (ᱜᱨᱤᱠ, +ᱵᱷᱟᱨᱚᱛ-ᱤᱨᱟᱱᱤ ᱞᱟᱴᱤᱱ) ᱨᱮ ᱟᱨ ᱵᱷᱟᱨᱚᱛ ᱤᱨᱟᱱᱤ ᱦᱟᱹᱴᱤᱧ +ᱵᱷᱟᱨᱚᱛᱤᱭᱚ ᱟᱨᱡᱭᱚ ᱵᱷᱟᱥᱟ ᱪᱟᱸᱜᱟᱜ, ᱟᱨ ᱚᱱᱟ ᱨᱮᱱᱟᱜ +ᱰᱟᱹᱨ ᱯᱟᱞᱤ, ᱯᱨᱟᱠᱨᱩᱛᱚ, ᱚᱯᱚᱵᱷᱨᱚᱝᱥᱚ ᱮᱢᱟᱱ ᱦᱩᱭ ᱟᱠᱟᱱᱟ ᱾ + +ᱟᱵᱚᱶᱟᱜ ᱨᱚᱲ ᱜᱷᱟᱨᱚᱸᱡᱽ ᱦᱚᱸ ᱚᱱᱠᱟᱜᱮ ᱢᱤᱫ ᱡᱮᱠᱷᱟ ᱢᱩᱱᱰᱟᱹ +ᱛᱟᱦᱮᱸ ᱠᱟᱱᱟ, ᱪᱟᱢᱯᱟᱨᱮ ᱥᱮᱴᱮᱨᱚᱜ ᱦᱟᱹᱵᱤᱡ ᱚᱱᱟᱫᱚ +ᱠᱷᱮᱨᱶᱟᱲ ᱞᱮᱱᱟ ᱟᱨ ᱚᱸᱰᱮ ᱠᱷᱚᱱ ᱵᱚ ᱡᱩᱫᱟᱹ ᱡᱩᱫᱟᱹᱭᱮᱱᱛᱮ +ᱥᱟᱱᱛᱟᱲ ᱾ + +᱒. ᱦᱟᱹᱴᱤᱧ ᱟᱨᱵᱟᱝ ᱪᱷᱤᱴᱤᱭᱟᱹ ᱨᱚᱲ + +ᱡᱟᱦᱟᱸ ᱨᱚᱲᱜᱩᱴ ᱨᱮᱜᱮ ᱚᱱᱟ ᱨᱮᱭᱟᱜ ᱡᱟᱦᱟᱸ ᱵᱷᱮᱜᱟᱨ +ᱨᱩᱯ ᱧᱮᱞᱚᱜ ᱟ ᱚᱱᱟᱫᱚᱠᱚ ᱢᱮᱛᱟᱜᱟᱜ ᱟ ᱦᱟᱹᱴᱤᱧ ᱨᱚᱲ ᱾ +ᱤᱝᱜᱽᱨᱮᱡᱽ ᱨᱮᱱᱟᱜ ᱫᱤᱥᱣᱟᱹ ᱨᱚᱲ ᱞᱮᱠᱟᱛᱮ ᱰᱚᱠᱴᱚᱨ +ᱥᱩᱠᱩᱢᱟᱨ ᱥᱮᱱ 'ᱩᱯᱚᱵᱷᱟᱥᱟ', ᱰᱚᱠᱴᱚᱨ ᱵᱷᱳᱲᱟᱥᱚᱝᱠᱚᱨ +ᱱᱟᱛᱷ ᱛᱤᱣᱟᱨᱤ 'ᱵᱳᱞᱤ', ᱰᱚᱠᱴᱚᱨ ᱥᱭᱟᱢᱥᱩᱱᱫᱚᱨ ᱫᱟᱥ \ No newline at end of file diff --git a/sat/test-images/rar-sanes24.jpg b/sat/test-images/rar-sanes24.jpg new file mode 100644 index 0000000..f85abbb Binary files /dev/null and b/sat/test-images/rar-sanes24.jpg differ