From 9f7ef7c14db1b41777a98f2c55b2711d4b5445fc Mon Sep 17 00:00:00 2001 From: stjet <49297268+stjet@users.noreply.github.com> Date: Thu, 12 Mar 2026 08:04:57 +0000 Subject: [PATCH] add input methdod framework (add sitelen pona input) Also change audio player randomness source to /dev/urandom which is way better for the prng we are using --- Cargo.toml | 3 +- README.md | 5 +- bmps/linja-lipamanka/󱤀0.bmp | Bin 0 -> 294 bytes bmps/linja-lipamanka/󱤁0.bmp | Bin 0 -> 438 bytes bmps/linja-lipamanka/󱤂0.bmp | Bin 0 -> 486 bytes bmps/linja-lipamanka/󱤃0.bmp | Bin 0 -> 582 bytes bmps/linja-lipamanka/󱤄3.bmp | Bin 0 -> 274 bytes bmps/linja-lipamanka/󱤅2.bmp | Bin 0 -> 342 bytes bmps/linja-lipamanka/󱤆1.bmp | Bin 0 -> 378 bytes bmps/linja-lipamanka/󱤇1.bmp | Bin 0 -> 334 bytes bmps/linja-lipamanka/󱤈2.bmp | Bin 0 -> 406 bytes bmps/linja-lipamanka/󱤉1.bmp | Bin 0 -> 378 bytes bmps/linja-lipamanka/󱤊1.bmp | Bin 0 -> 378 bytes bmps/linja-lipamanka/󱤋1.bmp | Bin 0 -> 378 bytes bmps/linja-lipamanka/󱤌0.bmp | Bin 0 -> 630 bytes bmps/linja-lipamanka/󱤍3.bmp | Bin 0 -> 294 bytes bmps/linja-lipamanka/󱤎0.bmp | Bin 0 -> 450 bytes bmps/linja-lipamanka/󱤏3.bmp | Bin 0 -> 234 bytes bmps/linja-lipamanka/󱤐0.bmp | Bin 0 -> 486 bytes bmps/linja-lipamanka/󱤑0.bmp | Bin 0 -> 534 bytes bmps/linja-lipamanka/󱤒0.bmp | Bin 0 -> 438 bytes bmps/linja-lipamanka/󱤓1.bmp | Bin 0 -> 270 bytes bmps/linja-lipamanka/󱤔3.bmp | Bin 0 -> 294 bytes bmps/linja-lipamanka/󱤕2.bmp | Bin 0 -> 278 bytes bmps/linja-lipamanka/󱤖1.bmp | Bin 0 -> 494 bytes bmps/linja-lipamanka/󱤗1.bmp | Bin 0 -> 454 bytes bmps/linja-lipamanka/󱤘0.bmp | Bin 0 -> 390 bytes bmps/linja-lipamanka/󱤙0.bmp | Bin 0 -> 390 bytes bmps/linja-lipamanka/󱤚0.bmp | Bin 0 -> 538 bytes bmps/linja-lipamanka/󱤛0.bmp | Bin 0 -> 374 bytes bmps/linja-lipamanka/󱤜0.bmp | Bin 0 -> 582 bytes bmps/linja-lipamanka/󱤝0.bmp | Bin 0 -> 406 bytes bmps/linja-lipamanka/󱤞0.bmp | Bin 0 -> 450 bytes bmps/linja-lipamanka/󱤟0.bmp | Bin 0 -> 630 bytes bmps/linja-lipamanka/󱤠0.bmp | Bin 0 -> 274 bytes bmps/linja-lipamanka/󱤡0.bmp | Bin 0 -> 246 bytes bmps/linja-lipamanka/󱤢4.bmp | Bin 0 -> 214 bytes bmps/linja-lipamanka/󱤣1.bmp | Bin 0 -> 342 bytes bmps/linja-lipamanka/󱤤0.bmp | Bin 0 -> 534 bytes bmps/linja-lipamanka/󱤥0.bmp | Bin 0 -> 450 bytes bmps/linja-lipamanka/󱤦0.bmp | Bin 0 -> 494 bytes bmps/linja-lipamanka/󱤧0.bmp | Bin 0 -> 438 bytes bmps/linja-lipamanka/󱤨4.bmp | Bin 0 -> 102 bytes bmps/linja-lipamanka/󱤩4.bmp | Bin 0 -> 162 bytes bmps/linja-lipamanka/󱤪0.bmp | Bin 0 -> 534 bytes bmps/linja-lipamanka/󱤫1.bmp | Bin 0 -> 334 bytes bmps/linja-lipamanka/󱤬4.bmp | Bin 0 -> 182 bytes bmps/linja-lipamanka/󱤭0.bmp | Bin 0 -> 494 bytes bmps/linja-lipamanka/󱤮3.bmp | Bin 0 -> 274 bytes bmps/linja-lipamanka/󱤰1.bmp | Bin 0 -> 454 bytes bmps/linja-lipamanka/󱤱0.bmp | Bin 0 -> 486 bytes bmps/linja-lipamanka/󱤲1.bmp | Bin 0 -> 414 bytes bmps/linja-lipamanka/󱤳1.bmp | Bin 0 -> 534 bytes bmps/linja-lipamanka/󱤴0.bmp | Bin 0 -> 342 bytes bmps/linja-lipamanka/󱤵0.bmp | Bin 0 -> 494 bytes bmps/linja-lipamanka/󱤶0.bmp | Bin 0 -> 438 bytes bmps/linja-lipamanka/󱤷0.bmp | Bin 0 -> 538 bytes bmps/linja-lipamanka/󱤸1.bmp | Bin 0 -> 334 bytes bmps/linja-lipamanka/󱤹0.bmp | Bin 0 -> 450 bytes bmps/linja-lipamanka/󱤺0.bmp | Bin 0 -> 450 bytes bmps/linja-lipamanka/󱤻0.bmp | Bin 0 -> 582 bytes bmps/linja-lipamanka/󱤼2.bmp | Bin 0 -> 310 bytes bmps/linja-lipamanka/󱤽1.bmp | Bin 0 -> 494 bytes bmps/linja-lipamanka/󱤾0.bmp | Bin 0 -> 582 bytes bmps/linja-lipamanka/󱤿0.bmp | Bin 0 -> 274 bytes bmps/linja-lipamanka/󱥀0.bmp | Bin 0 -> 534 bytes bmps/linja-lipamanka/󱥁0.bmp | Bin 0 -> 294 bytes bmps/linja-lipamanka/󱥂3.bmp | Bin 0 -> 318 bytes bmps/linja-lipamanka/󱥃1.bmp | Bin 0 -> 342 bytes bmps/linja-lipamanka/󱥄0.bmp | Bin 0 -> 246 bytes bmps/linja-lipamanka/󱥅0.bmp | Bin 0 -> 342 bytes bmps/linja-lipamanka/󱥆3.bmp | Bin 0 -> 234 bytes bmps/linja-lipamanka/󱥇1.bmp | Bin 0 -> 342 bytes bmps/linja-lipamanka/󱥈2.bmp | Bin 0 -> 310 bytes bmps/linja-lipamanka/󱥉0.bmp | Bin 0 -> 486 bytes bmps/linja-lipamanka/󱥊0.bmp | Bin 0 -> 294 bytes bmps/linja-lipamanka/󱥋0.bmp | Bin 0 -> 234 bytes bmps/linja-lipamanka/󱥌0.bmp | Bin 0 -> 486 bytes bmps/linja-lipamanka/󱥍0.bmp | Bin 0 -> 534 bytes bmps/linja-lipamanka/󱥎0.bmp | Bin 0 -> 630 bytes bmps/linja-lipamanka/󱥏1.bmp | Bin 0 -> 414 bytes bmps/linja-lipamanka/󱥐1.bmp | Bin 0 -> 214 bytes bmps/linja-lipamanka/󱥑1.bmp | Bin 0 -> 214 bytes bmps/linja-lipamanka/󱥒3.bmp | Bin 0 -> 254 bytes bmps/linja-lipamanka/󱥓0.bmp | Bin 0 -> 534 bytes bmps/linja-lipamanka/󱥔3.bmp | Bin 0 -> 294 bytes bmps/linja-lipamanka/󱥕0.bmp | Bin 0 -> 486 bytes bmps/linja-lipamanka/󱥖3.bmp | Bin 0 -> 246 bytes bmps/linja-lipamanka/󱥗0.bmp | Bin 0 -> 582 bytes bmps/linja-lipamanka/󱥘3.bmp | Bin 0 -> 342 bytes bmps/linja-lipamanka/󱥙0.bmp | Bin 0 -> 342 bytes bmps/linja-lipamanka/󱥚1.bmp | Bin 0 -> 414 bytes bmps/linja-lipamanka/󱥛0.bmp | Bin 0 -> 538 bytes bmps/linja-lipamanka/󱥜0.bmp | Bin 0 -> 534 bytes bmps/linja-lipamanka/󱥝3.bmp | Bin 0 -> 246 bytes bmps/linja-lipamanka/󱥞0.bmp | Bin 0 -> 342 bytes bmps/linja-lipamanka/󱥟1.bmp | Bin 0 -> 294 bytes bmps/linja-lipamanka/󱥠0.bmp | Bin 0 -> 438 bytes bmps/linja-lipamanka/󱥡0.bmp | Bin 0 -> 390 bytes bmps/linja-lipamanka/󱥢0.bmp | Bin 0 -> 414 bytes bmps/linja-lipamanka/󱥣0.bmp | Bin 0 -> 534 bytes bmps/linja-lipamanka/󱥤0.bmp | Bin 0 -> 630 bytes bmps/linja-lipamanka/󱥥3.bmp | Bin 0 -> 254 bytes bmps/linja-lipamanka/󱥦3.bmp | Bin 0 -> 294 bytes bmps/linja-lipamanka/󱥧3.bmp | Bin 0 -> 254 bytes bmps/linja-lipamanka/󱥨0.bmp | Bin 0 -> 246 bytes bmps/linja-lipamanka/󱥩1.bmp | Bin 0 -> 494 bytes bmps/linja-lipamanka/󱥪1.bmp | Bin 0 -> 450 bytes bmps/linja-lipamanka/󱥫0.bmp | Bin 0 -> 582 bytes bmps/linja-lipamanka/󱥬0.bmp | Bin 0 -> 438 bytes bmps/linja-lipamanka/󱥭1.bmp | Bin 0 -> 414 bytes bmps/linja-lipamanka/󱥮1.bmp | Bin 0 -> 198 bytes bmps/linja-lipamanka/󱥯0.bmp | Bin 0 -> 486 bytes bmps/linja-lipamanka/󱥰2.bmp | Bin 0 -> 310 bytes bmps/linja-lipamanka/󱥱0.bmp | Bin 0 -> 450 bytes bmps/linja-lipamanka/󱥲1.bmp | Bin 0 -> 378 bytes bmps/linja-lipamanka/󱥳0.bmp | Bin 0 -> 186 bytes bmps/linja-lipamanka/󱥴0.bmp | Bin 0 -> 390 bytes bmps/linja-lipamanka/󱥵1.bmp | Bin 0 -> 534 bytes bmps/linja-lipamanka/󱥶0.bmp | Bin 0 -> 494 bytes bmps/linja-lipamanka/󱥷2.bmp | Bin 0 -> 374 bytes bmps/linja-lipamanka/󱥸0.bmp | Bin 0 -> 534 bytes bmps/linja-lipamanka/󱥹0.bmp | Bin 0 -> 246 bytes bmps/linja-lipamanka/󱥺1.bmp | Bin 0 -> 454 bytes bmps/linja-lipamanka/󱥻1.bmp | Bin 0 -> 378 bytes bmps/linja-lipamanka/󱥼0.bmp | Bin 0 -> 538 bytes bmps/linja-lipamanka/󱥽3.bmp | Bin 0 -> 254 bytes bmps/linja-lipamanka/󱥾0.bmp | Bin 0 -> 538 bytes bmps/linja-lipamanka/󱦀1.bmp | Bin 0 -> 494 bytes bmps/linja-lipamanka/󱦁1.bmp | Bin 0 -> 454 bytes bmps/linja-lipamanka/󱦂1.bmp | Bin 0 -> 270 bytes bmps/linja-lipamanka/󱦆0.bmp | Bin 0 -> 342 bytes bmps/linja-lipamanka/󱦇0.bmp | Bin 0 -> 294 bytes bmps/nimbus-roman/{$2.bmp => $0.bmp} | Bin bmps/shippori-mincho/大0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/安0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/小0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/屋0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/打0.bmp | Bin 0 -> 630 bytes bmps/shippori-mincho/方0.bmp | Bin 0 -> 582 bytes bmps/shippori-mincho/落0.bmp | Bin 0 -> 630 bytes docs/system/input_methods.md | 15 ++ docs/system/shortcuts.md | 1 + install | 3 +- local-install | 3 +- ming-wm-lib/src/messages.rs | 3 + ming-wm-lib/src/serialize.rs | 66 +++++--- ming-wm-lib/src/window_manager_types.rs | 9 ++ src/bin/audio_player.rs | 12 +- src/bin/malvim.rs | 55 +++---- wm/src/essential/lock_screen.rs | 16 +- wm/src/essential/workspace_indicator.rs | 25 ++- wm/src/framebuffer.rs | 6 +- wm/src/input_method/lat.rs | 19 +++ wm/src/input_method/mod.rs | 2 + wm/src/input_method/tok.rs | 193 ++++++++++++++++++++++++ wm/src/lib.rs | 1 + wm/src/window_manager.rs | 74 +++++++-- 158 files changed, 432 insertions(+), 79 deletions(-) create mode 100644 bmps/linja-lipamanka/󱤀0.bmp create mode 100644 bmps/linja-lipamanka/󱤁0.bmp create mode 100644 bmps/linja-lipamanka/󱤂0.bmp create mode 100644 bmps/linja-lipamanka/󱤃0.bmp create mode 100644 bmps/linja-lipamanka/󱤄3.bmp create mode 100644 bmps/linja-lipamanka/󱤅2.bmp create mode 100644 bmps/linja-lipamanka/󱤆1.bmp create mode 100644 bmps/linja-lipamanka/󱤇1.bmp create mode 100644 bmps/linja-lipamanka/󱤈2.bmp create mode 100644 bmps/linja-lipamanka/󱤉1.bmp create mode 100644 bmps/linja-lipamanka/󱤊1.bmp create mode 100644 bmps/linja-lipamanka/󱤋1.bmp create mode 100644 bmps/linja-lipamanka/󱤌0.bmp create mode 100644 bmps/linja-lipamanka/󱤍3.bmp create mode 100644 bmps/linja-lipamanka/󱤎0.bmp create mode 100644 bmps/linja-lipamanka/󱤏3.bmp create mode 100644 bmps/linja-lipamanka/󱤐0.bmp create mode 100644 bmps/linja-lipamanka/󱤑0.bmp create mode 100644 bmps/linja-lipamanka/󱤒0.bmp create mode 100644 bmps/linja-lipamanka/󱤓1.bmp create mode 100644 bmps/linja-lipamanka/󱤔3.bmp create mode 100644 bmps/linja-lipamanka/󱤕2.bmp create mode 100644 bmps/linja-lipamanka/󱤖1.bmp create mode 100644 bmps/linja-lipamanka/󱤗1.bmp create mode 100644 bmps/linja-lipamanka/󱤘0.bmp create mode 100644 bmps/linja-lipamanka/󱤙0.bmp create mode 100644 bmps/linja-lipamanka/󱤚0.bmp create mode 100644 bmps/linja-lipamanka/󱤛0.bmp create mode 100644 bmps/linja-lipamanka/󱤜0.bmp create mode 100644 bmps/linja-lipamanka/󱤝0.bmp create mode 100644 bmps/linja-lipamanka/󱤞0.bmp create mode 100644 bmps/linja-lipamanka/󱤟0.bmp create mode 100644 bmps/linja-lipamanka/󱤠0.bmp create mode 100644 bmps/linja-lipamanka/󱤡0.bmp create mode 100644 bmps/linja-lipamanka/󱤢4.bmp create mode 100644 bmps/linja-lipamanka/󱤣1.bmp create mode 100644 bmps/linja-lipamanka/󱤤0.bmp create mode 100644 bmps/linja-lipamanka/󱤥0.bmp create mode 100644 bmps/linja-lipamanka/󱤦0.bmp create mode 100644 bmps/linja-lipamanka/󱤧0.bmp create mode 100644 bmps/linja-lipamanka/󱤨4.bmp create mode 100644 bmps/linja-lipamanka/󱤩4.bmp create mode 100644 bmps/linja-lipamanka/󱤪0.bmp create mode 100644 bmps/linja-lipamanka/󱤫1.bmp create mode 100644 bmps/linja-lipamanka/󱤬4.bmp create mode 100644 bmps/linja-lipamanka/󱤭0.bmp create mode 100644 bmps/linja-lipamanka/󱤮3.bmp create mode 100644 bmps/linja-lipamanka/󱤰1.bmp create mode 100644 bmps/linja-lipamanka/󱤱0.bmp create mode 100644 bmps/linja-lipamanka/󱤲1.bmp create mode 100644 bmps/linja-lipamanka/󱤳1.bmp create mode 100644 bmps/linja-lipamanka/󱤴0.bmp create mode 100644 bmps/linja-lipamanka/󱤵0.bmp create mode 100644 bmps/linja-lipamanka/󱤶0.bmp create mode 100644 bmps/linja-lipamanka/󱤷0.bmp create mode 100644 bmps/linja-lipamanka/󱤸1.bmp create mode 100644 bmps/linja-lipamanka/󱤹0.bmp create mode 100644 bmps/linja-lipamanka/󱤺0.bmp create mode 100644 bmps/linja-lipamanka/󱤻0.bmp create mode 100644 bmps/linja-lipamanka/󱤼2.bmp create mode 100644 bmps/linja-lipamanka/󱤽1.bmp create mode 100644 bmps/linja-lipamanka/󱤾0.bmp create mode 100644 bmps/linja-lipamanka/󱤿0.bmp create mode 100644 bmps/linja-lipamanka/󱥀0.bmp create mode 100644 bmps/linja-lipamanka/󱥁0.bmp create mode 100644 bmps/linja-lipamanka/󱥂3.bmp create mode 100644 bmps/linja-lipamanka/󱥃1.bmp create mode 100644 bmps/linja-lipamanka/󱥄0.bmp create mode 100644 bmps/linja-lipamanka/󱥅0.bmp create mode 100644 bmps/linja-lipamanka/󱥆3.bmp create mode 100644 bmps/linja-lipamanka/󱥇1.bmp create mode 100644 bmps/linja-lipamanka/󱥈2.bmp create mode 100644 bmps/linja-lipamanka/󱥉0.bmp create mode 100644 bmps/linja-lipamanka/󱥊0.bmp create mode 100644 bmps/linja-lipamanka/󱥋0.bmp create mode 100644 bmps/linja-lipamanka/󱥌0.bmp create mode 100644 bmps/linja-lipamanka/󱥍0.bmp create mode 100644 bmps/linja-lipamanka/󱥎0.bmp create mode 100644 bmps/linja-lipamanka/󱥏1.bmp create mode 100644 bmps/linja-lipamanka/󱥐1.bmp create mode 100644 bmps/linja-lipamanka/󱥑1.bmp create mode 100644 bmps/linja-lipamanka/󱥒3.bmp create mode 100644 bmps/linja-lipamanka/󱥓0.bmp create mode 100644 bmps/linja-lipamanka/󱥔3.bmp create mode 100644 bmps/linja-lipamanka/󱥕0.bmp create mode 100644 bmps/linja-lipamanka/󱥖3.bmp create mode 100644 bmps/linja-lipamanka/󱥗0.bmp create mode 100644 bmps/linja-lipamanka/󱥘3.bmp create mode 100644 bmps/linja-lipamanka/󱥙0.bmp create mode 100644 bmps/linja-lipamanka/󱥚1.bmp create mode 100644 bmps/linja-lipamanka/󱥛0.bmp create mode 100644 bmps/linja-lipamanka/󱥜0.bmp create mode 100644 bmps/linja-lipamanka/󱥝3.bmp create mode 100644 bmps/linja-lipamanka/󱥞0.bmp create mode 100644 bmps/linja-lipamanka/󱥟1.bmp create mode 100644 bmps/linja-lipamanka/󱥠0.bmp create mode 100644 bmps/linja-lipamanka/󱥡0.bmp create mode 100644 bmps/linja-lipamanka/󱥢0.bmp create mode 100644 bmps/linja-lipamanka/󱥣0.bmp create mode 100644 bmps/linja-lipamanka/󱥤0.bmp create mode 100644 bmps/linja-lipamanka/󱥥3.bmp create mode 100644 bmps/linja-lipamanka/󱥦3.bmp create mode 100644 bmps/linja-lipamanka/󱥧3.bmp create mode 100644 bmps/linja-lipamanka/󱥨0.bmp create mode 100644 bmps/linja-lipamanka/󱥩1.bmp create mode 100644 bmps/linja-lipamanka/󱥪1.bmp create mode 100644 bmps/linja-lipamanka/󱥫0.bmp create mode 100644 bmps/linja-lipamanka/󱥬0.bmp create mode 100644 bmps/linja-lipamanka/󱥭1.bmp create mode 100644 bmps/linja-lipamanka/󱥮1.bmp create mode 100644 bmps/linja-lipamanka/󱥯0.bmp create mode 100644 bmps/linja-lipamanka/󱥰2.bmp create mode 100644 bmps/linja-lipamanka/󱥱0.bmp create mode 100644 bmps/linja-lipamanka/󱥲1.bmp create mode 100644 bmps/linja-lipamanka/󱥳0.bmp create mode 100644 bmps/linja-lipamanka/󱥴0.bmp create mode 100644 bmps/linja-lipamanka/󱥵1.bmp create mode 100644 bmps/linja-lipamanka/󱥶0.bmp create mode 100644 bmps/linja-lipamanka/󱥷2.bmp create mode 100644 bmps/linja-lipamanka/󱥸0.bmp create mode 100644 bmps/linja-lipamanka/󱥹0.bmp create mode 100644 bmps/linja-lipamanka/󱥺1.bmp create mode 100644 bmps/linja-lipamanka/󱥻1.bmp create mode 100644 bmps/linja-lipamanka/󱥼0.bmp create mode 100644 bmps/linja-lipamanka/󱥽3.bmp create mode 100644 bmps/linja-lipamanka/󱥾0.bmp create mode 100644 bmps/linja-lipamanka/󱦀1.bmp create mode 100644 bmps/linja-lipamanka/󱦁1.bmp create mode 100644 bmps/linja-lipamanka/󱦂1.bmp create mode 100644 bmps/linja-lipamanka/󱦆0.bmp create mode 100644 bmps/linja-lipamanka/󱦇0.bmp rename bmps/nimbus-roman/{$2.bmp => $0.bmp} (100%) create mode 100644 bmps/shippori-mincho/大0.bmp create mode 100644 bmps/shippori-mincho/安0.bmp create mode 100644 bmps/shippori-mincho/小0.bmp create mode 100644 bmps/shippori-mincho/屋0.bmp create mode 100644 bmps/shippori-mincho/打0.bmp create mode 100644 bmps/shippori-mincho/方0.bmp create mode 100644 bmps/shippori-mincho/落0.bmp create mode 100644 docs/system/input_methods.md create mode 100644 wm/src/input_method/lat.rs create mode 100644 wm/src/input_method/mod.rs create mode 100644 wm/src/input_method/tok.rs diff --git a/Cargo.toml b/Cargo.toml index aeb40c7..1f4c718 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ming-wm" -version = "1.2.3" +version = "1.3.0-rc.0" repository = "https://github.com/stjet/ming-wm" license = "GPL-3.0-or-later" edition = "2021" @@ -45,6 +45,7 @@ audio_player = [ "id3", "mp4ameta", "metaflac", "rodio" ] [profile.release] lto = true +debug = "line-tables-only" [[bin]] name = "ming" diff --git a/README.md b/README.md index 4299d93..f6d7378 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ chmod +x ./install sudo ./install ``` -Alternatively, to move the binaries to `~/.local/bin` (which probably needs to be added to `PATH`, run the following: +Alternatively, to move the binaries to `~/.local/bin` (which probably needs to be added to `PATH`), run the following: ```bash chmod +x local-install @@ -105,5 +105,4 @@ Obviously, don't run the executable with `sudo` or `doas`, or as the root user! ## License -Licensed under the GPLv3. The font data in the `bmps/shippori-mincho` folder are covered by the OFL. The font was created by FONTDASU. The font data in `bmps/nimbus-roman` are licensed under the AGPL. This is a very slightly modified version of the font was created by URW Studio. The font data in `bmps/nimbus-romono` is also licensed under the AGPL. This is a slightly modified version of the Nimbus Roman font by URW Studio. - +Licensed under the GPLv3. The font data in the `bmps/shippori-mincho` folder are covered by the OFL. The font was created by FONTDASU. The font data in `bmps/nimbus-roman` are licensed under the AGPL. This is a very slightly modified version of the font was created by URW Studio. The font data in `bmps/nimbus-romono` is also licensed under the AGPL. This is a slightly modified version of the Nimbus Roman font by URW Studio. The font data in the `bmps/linja-lipamanka` folder are covered by the OFL. The font was created by lipamanka. diff --git a/bmps/linja-lipamanka/󱤀0.bmp b/bmps/linja-lipamanka/󱤀0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f00d548deab5f86842fff72509f8126ed545ed68 GIT binary patch literal 294 zcmZ|Eu?m7v6o>KSAT&6LkdZA;;u8q1caNT?v3KYN9Gb$H5p)t?Kxir@8*d*%AV<9L z`@{W?IVFxvFJn`<@Zd%$4#+jsQ3GFlf-?ff5(o@x&HK)aY=w*2)_08x-?9 b{}5l*cC=BoJ?*1fL>p8)(0bK;TJ>)~@d;%Z literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤁0.bmp b/bmps/linja-lipamanka/󱤁0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f278d0abc38d7a6f4722f1755e66936f7bbb46ac GIT binary patch literal 438 zcmYk&zY9T86u|K-i(>H~PzIw(StXlfFd009GWie0s3^06B7=oQWH*_VQl!iVrHDm& zzDMWPyY;!}$9=DR-b-dy9`j#u_9%P^z+*z}#x(T&U+8Arwh^odPPiiJ^qoj=jt;8W zyZSlmCO&ARjxTB`!ombkbk&WxKnr2yaYRsO*^;L<-;uu|L%KbvH~LJ1{EQ$%IG}J^q4I(@x=Os|Z-N@?^G<*%<%aNZ%$;sXB< D!Bu6l literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤂0.bmp b/bmps/linja-lipamanka/󱤂0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4f2a78c25289f531645989f0adfd5c463ff2cf59 GIT binary patch literal 486 zcmZ9}zY76j7{KxO3`$8RGn2DPkxiM&t_-Y~(R7*o2TTTwLD>uzn}5JUCMAETqdwyMay>GL9_f))U>^@RR!&7;7r8c@BC;#n4Sc#%Yxu|!sLVyc0_6&Ie zZ#1ONlG(MHAx>bAiB-#zUop_{jEN6Oni*ZMQv09}`9{(1o0$3t^6|jb+$X&`zF4?D z$ypsdQNj&9dyYJZ2U>c*PW*zeb2-^9rp|jIwIk#zhB!;?%*Yw-FoWDh+3uT|y8OfP E2MY+X)Bpeg literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤃0.bmp b/bmps/linja-lipamanka/󱤃0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..73ab644dcb12574d10542f079801209a43f72273 GIT binary patch literal 582 zcmaLTu}{K46vy$a2@?zrVIZUl9m~MNfIHD94!R(-PA2d_zzl2}CuS!74|Hin6K5ER z#^6Gjba0fVeqZx0X`03+pS$0?_foEOPQwF}JZ;thMU>zepVb&w`$?fo9LGlRRPl{F z)a-fQPQQU2Zt;Oi-kiR-DKna9`0`JznvP_tbA5QNN_>5w+Z7fH(N5-U)T2_bQM#IEII^ nozwmqXOEi4`k8JjtmZ+ylzwy4`)cBdEO2lw!@eX0Kd!vxj8 literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤄3.bmp b/bmps/linja-lipamanka/󱤄3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..30f527855f5f393ad08ca4280b23a1bb5375937c GIT binary patch literal 274 zcmZY3p^Ab*6b8`wL6cw*1fx;0ETRUZ-KLmDqYtrfuw~nB^a%uQ29r@lF*rB=w1B?)CUgyXZmm72+d4L{V=G$PvBkBgiCW*Pm36$4`AAt%1r)1b&V@vjdK+?ey1x9=Tu#7w{BAEAaV ARsaA1 literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤅2.bmp b/bmps/linja-lipamanka/󱤅2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0a370235f678cbb83efdbfa265e91acc42d4b329 GIT binary patch literal 342 zcmZ?r4P#^g12Z700mPg@%mKuV3<^M!fk6Q(59UCL|Ns9pz%Woq8HgVPu_;Upod(JY z0P!p!mO+*S^80{z6%g+L;@xQY7?8gih(7~y2@t0NaVijpBH=h7`#%tW2VzlVvtewY oI3HBaFCZ-h6Gx_z)cggq1(4-nY$P?efNTz!I5G_sX941+0GJ|m^8f$< literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤆1.bmp b/bmps/linja-lipamanka/󱤆1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d36798ee134b48dad6b3136b88bae9ab17fc6e5e GIT binary patch literal 378 zcmZ?rtzu*V12Z700mPh8%*dbsWHB(fK;^+41ThoHjQ;=sKLaubih)$;0`UbPHU{Er zK)f1=ML_C6G!SnB;xj<33KaucIRS{D0dWx!KL+AnAZ9~08>-d`D1HctJ<;Vz;RE$M z0`YDjwnNtk6k`M8E+Bpi#HBzCa#u4Dvq0UT31puI;vGON0TmMivbO;7Ng!4M;?qE! Nj>T+H_!I!~NdSb4e^&qi literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤇1.bmp b/bmps/linja-lipamanka/󱤇1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bcf6a8a89664a15ed94bfbc624af6ed937c14c19 GIT binary patch literal 334 zcmYj}Jqp4=5Jo4JK?@6mh#+W}!pgz}*vBJy0MDe@c>qgqV5(T<1QvpYt=0N=nGbg1 z&G$3I?wWmJ>1~-c3}6U_EtzIB->2XsgkXZ|0hMyD^e>p_ojm;;rpmd}e_)b#^7LOA wD@*AX@Pm!IsJs$dxIqsi?eQnL`rR3Saeu@=A>E?!kC+c|hn4>D`!!wn2P9&GZvX%Q literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤈2.bmp b/bmps/linja-lipamanka/󱤈2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3b8f31d45373541751ae849b1551cf86087967ec GIT binary patch literal 406 zcmZw8F$%&!5QX6hMlqz)1Bi{FO>BY(u(7fddn?c20mM#A58wfEf>ho>yVRnBowdUH zZ`i>lWZ~PHoi{t39|I}RgnNh>Z3NQi7FoHxeEhE~?H6x!jWMElkMVIX)CeI?SnHmx zoC7v!BGQb0hO_s!|L^GOOe?bnZW!4aXMtSvY9-rY?{;(gWpzj2WCOgA;E9%Ib(K6r Rfo)yx&)7-vK*yik{s-6GqAvgd literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤉1.bmp b/bmps/linja-lipamanka/󱤉1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..750fe76ab368cfdfbd8c47027cd1435445a5d064 GIT binary patch literal 378 zcmZ9HJqtlm0EW*UO(v7iMUlb8APeqlRm#ZXrYsg^l;7Y__!)L3iK0YV{D$K>xA#Q% z)N}9qyyxxK?e>>}iBFSf1yUj~C6Y0r?qm5qw#2rz);Ksjn0Qy$p?kwXULap#me|$k z?l9FZPrkrBv2*4f(0t%*d^Ae``%)ndze=}_Vd?nlG z#+%{bB)gEz?!MoPKcy5?&?B7H#mxQ-UG&=hrd1cS-!$rRZK>q32=po2D$^YT~_jhP@h2_+W${q_!(Hi~`PB z;f5vR*x`sZUYbXU9b6&JX3x51Z(3w8fuz=Dh*>+c$X*T`t+D%_zuUQ)$Kzgnd+%i2ZB;lH5vd3FMCIJ8&Tl7rNYm5_mi%Ofe@Nqk zEyjp_PP0vVC;Xs+0%EkWfXwQeO{mZ4*=yLE*{5dY9=`Bv=b@U+9CE)$v_cu%Bl7|O zY>AzPYO*EBI}o){#`efmHM?Q&+gYe4(}ld>f$rH*&iBZyF~Xzfzy0ifXFkOqd6}_Z hAkV&pd?Wc*&*)%<9m@7PoaZpX0sjB+M?FO3vsXe}16BY4 literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤍3.bmp b/bmps/linja-lipamanka/󱤍3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..de254b8f24ebae9147b269621e21a546a67ba314 GIT binary patch literal 294 zcmZ?rRbylT12Z700mNKD%m&1a3<^M!f#Cy~#2{V+Ma2LA|IdI81LahK_$Ltm17Z(s zYCvK@;0nYb#&;m@#-nZqQ2q-LZ-&wW=xTxDHbDFbh-U&Z4-mfx;;%s555!(ToD0Oq eff(ebGcf%?Hpt5$b3twZx#brSKLz44m>K|y)n)ep literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤎0.bmp b/bmps/linja-lipamanka/󱤎0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5ff6a47e273d667b5cd2ffc1ca06aec18e0e5476 GIT binary patch literal 450 zcmb`CI|@QU3`O%w(OR%mM6nk{EG_Kp1QB!vRyJ-y5I5mgT#da5;%_{6NScRs4xD6e zZe}Jko}LQJYe4Kl1*%Y3lW2BuKMM~jB?~Ck;Q_U%l`~!!5;V$QXuQs!dfMOap*Djp ztY8D0XAMiI?=}794o}x_a-cI}q`6rw*ZE)UC$41TpqX~AHO~U}p!d&k Nb#7$M^@2Em`2di@kp%z% literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤏3.bmp b/bmps/linja-lipamanka/󱤏3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..55bba91fae33512891c4ade34292ce2a51d9da22 GIT binary patch literal 234 zcmZ?reZ>F)WQ%Kx_x&L)9Ds0E6*bQ~&?~ literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤐0.bmp b/bmps/linja-lipamanka/󱤐0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6afd55aacbb6137add138c35f40840c0dd680149 GIT binary patch literal 486 zcmYk&J&FQB5QgDa3>3t`6Bv2|14Hx0L=cQUfEO?_F%t}gMYCNNLj^JQ3}PynX`m>G zia)F4`wi8*Gw}3OSJzZ`Pw8VFbKz59%p-*~VlKz%+{o6$$^XzKydl5}*&qm96uBqb zP}?mQC?o0Xh_CpDoL&+<n0J)!fN466#i?)j{+0 z=8E;hEX{jf4>Q^k4lo4G@BQ)UF3q$5xA5MTdeDRo$TR;vPd$Q* K*QCeLHO~h@M#Sp? literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤒0.bmp b/bmps/linja-lipamanka/󱤒0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ad32e641241711d9e342db5942d49de93dec5b61 GIT binary patch literal 438 zcmYk1u?_)25Qg_uBC2}=8d2y3HEItaq4X9Cg-WaU3W`ha2}D9AMAT{|B0@qq-&|&5 zH~IFT`TyD7Y^xIoE?sr@GGrkSfh({(H_|+9{@b4Nt0bt;g1)cW04*vL^aIr-k#QHn z6GEtgWMj!R&(NP>2Ul2GW{OtJF#(C{;>@#XB)deI+ahl)u6 literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤓1.bmp b/bmps/linja-lipamanka/󱤓1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..292a773d3f9e6d25cc9bc514be0bf8343581438b GIT binary patch literal 270 zcmZY3F$%&!5QX6hh>#Si?6nfhG%DB#X+s)2i;xrK9=U;dCP@_tVi{6fTWHq*g|%|v z8;050*-i5}uqk%r4dw_D*otg+pYmUd>D=&v!+dCcWP?ADHrv=Edeh| literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤔3.bmp b/bmps/linja-lipamanka/󱤔3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4351bf785eb602a43447d474621af1ea6a92f7d1 GIT binary patch literal 294 zcmZY4F$%&!5QX7QVWqj(G|_-(e4;VmD*lC%O2=BOhBnNQ;($G-uBX}# z0WK(zV1Xs>SfPz4UWheYN6p6@dfv_DQT>i`P7fb!kz)ew%%CrJF~$)aT+w&4E%G(a Jc;JLsy&r~lJ(mCg literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤕2.bmp b/bmps/linja-lipamanka/󱤕2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..469cb6831c4c4100add7112f24283a2c09675192 GIT binary patch literal 278 zcmZ9_I|{-;5P;#0O>C1wQdrm}g@_`001GkXLBRV+z$4fT-o{SE3j|U`5HW44%|BsN z#D#BmW_E|!B@;_^XG;uVV+>2ph)NY*90skmG-ABa;EBleSL7e5;UL8qYus>>e?96P tR}?rvW_lrci3+mx-`niWcw1nPB`z3YiW+nL;Ny-nJRHsZ!_+SKrUiq_FJk}z literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤖1.bmp b/bmps/linja-lipamanka/󱤖1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..195ba99b0a774ffefc325918f20b667d706d3004 GIT binary patch literal 494 zcmZ|LuL=S|5XbSoAmSe^g2AFqF&Yl6b|2#Mb**Bu2quG%U{SPOu!>EP3nB=cd!4tl_ pXW!&o^dVn(#?a36%}oAfj~Ncg=pEZLtKyA2S~mZ8vlAiI^AE1u#PI+C literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤗1.bmp b/bmps/linja-lipamanka/󱤗1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..430aba21bb8c9cc54b24a76b79e37d4c5e435afb GIT binary patch literal 454 zcmZwCzYYOG5XbSoMndfY2!%o-8Wqj;O09SU@c=pzJd>j`CUE`u;x=oo(TIB(=`5*cW`KE8PiM^Z z5$a58@-*u3F~nMWa*|bX#TidnY^5(J*%3i>XQdF$Kd`_U71w)FchSHGcf1k(_Y7aO l(ZUHgOi;iNdG}6-`Xb-gCwYh!%9vuW`%;rL~f2IBod{2z!# zVB#Pe2tY=E0Ag%%p+NCN=yE_l6A&K+;v8f-Ae#$_=K}G0AZ7((keRc9cr6gW2jZ1L zEDW_5B-a7N^MUv^5HAB_0VFxFJAq;#w}aH|0b-E7AboH@0NE@+d=rR0fEYy%YE}HXETH%XAifX8=wapy6k7lQeQ0ea literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤙0.bmp b/bmps/linja-lipamanka/󱤙0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..93bff0d7a50522b6aad2497b8c0dd24c76c47189 GIT binary patch literal 390 zcmZ9`F%AJi6vpw{N<$$k&C=llTFDj)$tK$=oIxqHL?|c}5(yWebqDnpN+BwZkZ2Ii z_`l6eOic2ddGCFb$pqoZQ^~5bmytpmo+`2{6`4F~ep`kzMnP+>1gnG%R**r>$pZQ< z7FeU@WKH^|d817|cd{9M$7DYB1r5}3h40*r=+8JIv~znh>tbMg_hjBf|8KTqcEk-Y j+;NaQtOqKXV2Uh0CX;{VF~k@-JWaNzmIvOD_eA^!8WMBV literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤚0.bmp b/bmps/linja-lipamanka/󱤚0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6bb28f7fcbe80627bc7033daf2980a29bb7ed2c7 GIT binary patch literal 538 zcmZwDuZsdf7{>8gJrPvSCMa_FgF~^O9L7t680CV=WV8wj2AkzfCjSGIS(|yW%8BJr z3>w6sTyg!5%nK{*z-OL!-+6Zz=Bt|UsmCg^=Mgq6m7-E=Ydzv=a~wx$tWQjF#1%^n z5SJMfIfC;nz;=19$EMMQqxajjS7Cyl{2s8yo?1lc=wu-9_JyPae-g@ zUdg$>rW01k$qco=&5}IpWPQL!8xvTj-=e;uCiB!I^bo`xGmNptzsU|c#4n=eTQAh# XXdsOP-k|SSi^)ISNk0PH-IMwbeRI3V literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤛0.bmp b/bmps/linja-lipamanka/󱤛0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..348b6c37830cd6600001d53040416cbcda60cf1b GIT binary patch literal 374 zcmZwCF$%&!5QX7Mmx$O1f}L2|3)W(1kxO_6qpgTVnjFB=3j|VGTUyvyh#-21bg4G~ zgk4w`7rq_l%_JeKbQei?7Th!R5F?Tax5(1YyT)F|7;%XDxS~Sha=(%famN`K+%O1s z#$-?A(66cj4~%q|GsOp)|E!(u$-j2zN8N@yu4i_@8z+=54=XeMuOkxZyVE~A8}b)o PopIJ^ppCDlpX*KwXqSJD literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤜0.bmp b/bmps/linja-lipamanka/󱤜0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..91367abe0af9294c5f120c0bafeee173721e41a2 GIT binary patch literal 582 zcmZwCKPW{}901@;7EyS!A{5z~Fc=I<$@(m2B~}Aw7BP@nUN)=2EM+mtBoiSF%-45b z@2Atvsqg&$_TIU(3v=y7^Gv$O=%SmpV$fX_y{&n(XkBGl7C~!=FCJNmel?m6@y-C# zyfR8Zwb+-ZCtR|Z_14uNeDci_ecW+IXY8ivq)+K!hG!b=<~!BgJpIQt>G%KM^UvO} z`3vbg?pdtvL~XXoeyW}HmN%wio=5#dR--3h<|^tu>ThrqJ$ao*)OpmO;30bQEshyy ajcw+sal(1FJEFejiBk@^;fD))((W$^(Abs$ literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤝0.bmp b/bmps/linja-lipamanka/󱤝0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ae398893db537ab81cd9a0a375bbd8730b859465 GIT binary patch literal 406 zcmYk0F$+Oa7>3VL>c(&fVY)>OicyTpV)6rQ@+0sIl-0msH&`sn%B&0)8>MWDVn3d9 z`^tCfIlWKs_nmv&-MKaKX>eB{fHYWB;5Mc&eJua0L)=5?oHHKI3Wne}JPTN=KEe+$ zlKGJQhLoDA;&w4i~(kNV}k{@cuC*U|Cx8_%HL!9rDj^$ jHE==-AqtvlmFz*C;Hdj#C7a@lb~4kMEQdRM-MRV$+yI%} literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤟0.bmp b/bmps/linja-lipamanka/󱤟0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..82a6bd7446c56e323e8846a794a458c105544230 GIT binary patch literal 630 zcmZ9|ze@sP9LMqJDu+ZD!J!~@Y-njnMp8&)Xx{gDWUoUbI<@dVwkKtyi-(hr}HI zaE>hWex0oe^>vOP47Atw>#Ta8=o@O*FOgrPfvv>)i24L|?D&2%(%*&lX-y_M3v=d2 z&^PIPI)lC~AFlH?vpz=HMgeoQ{XC4!hIsaU@;7vS9Y$ss&_B8}zr?d}ov)c~q67Wg KcibZKbHx?)1I&g1 literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤠0.bmp b/bmps/linja-lipamanka/󱤠0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..198f60e2c10c94e58fd0115c5b577a8d81b4b27c GIT binary patch literal 274 zcmZ?r6=Gxn12Z700mQ68%nihh3<^M!f#D9A#2|WrBGv!@|7U<|H>t1;nSJVj$_9vZi1UG19f*$t@jD=%1jNh$*3U+a literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤡0.bmp b/bmps/linja-lipamanka/󱤡0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..538074ea28b54f8e284c67fb8cd1ccd00370afba GIT binary patch literal 246 zcmZ?r{l)+RWs~&j@7i z1>!~|HO4^x2Ot(g659jh=OOVkf&6_)d~+cG1ri_R#4kwv03iPYhz|rHrym63LLim| V;&nj04~RK{_%aZ812GRsEdanBL`?ty literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤢4.bmp b/bmps/linja-lipamanka/󱤢4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..14442890c8189f3a7e00a597dfe75f2a395a241b GIT binary patch literal 214 zcmZ?ry~Y3mWNs;U6umq2_6h&_S03Wz(< ua6gd$2#7&e83OSWAPxrNG&Gz8{N zqm2j!B$KY1D^jLbFcwj_;zMzhGp5ur-WtrtH7RtjTlTL&2AVw(+~eP&-2tdiax&a zixujs7vLPiJBG+1juMt=X>%RUb67!5MV5;%m~x(ySM`}7r~V07<~HOHK~Im=$EeBN zN$=@7GwRI^nLCo-yKhFXEOQI;Hf;Sa>FudIP(R+o8Glg!_J&uCaKTojhzI0RL<28a dV}LBea{sf`E5sza_(0^wTbk1QAx_}vGgq_qvuXeU literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤥0.bmp b/bmps/linja-lipamanka/󱤥0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..405799cc2609ba9b14bdbbc76311417836a12981 GIT binary patch literal 450 zcmZ|LOA5j;5P;znq*w|8@0gE!>d@*frb?4?*^g`Ik^%0+yO4{1G*#{d8T literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤦0.bmp b/bmps/linja-lipamanka/󱤦0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bad7d863dcd5681316479f095b2ab3d8f713f37a GIT binary patch literal 494 zcmZwCyAA|zOM}OJPuYKBj00c zY7%*tn1yQc?E`f^Q`Wg_&*|QP-VH81O#aNs$+K8t2id!b3aXInULXe&Zyi5G+53zW z)<`0_E3pUZzfcPQSD!CR?}#o&kbN@YS!zRUA!ikG*10`Lp1>V#Q|Ddobw%H*HOLnx KH<4Ns8_BVm}}2)@Jk z&muSsGhXQK_<6-mB*vHYHl?_6swK6FFeu|Xwp)1*7$j8@>L zOqbw+vG2xY%oHyy{@e`cbELi-@(!-pxjk8gC)Oz0J^K=G%$&SRw#5y7r)!g4a6rTE N%%9m~1?6^T{{Rwaxmo}K literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤨4.bmp b/bmps/linja-lipamanka/󱤨4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b736ad1dda87ddece9714389352b9d46505d9d1a GIT binary patch literal 102 zcmZ?rO=ExnGa#h_#4JF}48)8K3P6&9!2nER5R5>PWk9?bh(YWcAbt(Sl|cG35ZeQ> HBZv(E9Cioj literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤩4.bmp b/bmps/linja-lipamanka/󱤩4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8ed3c4a61fc0c2b5719a48ee806c0dddfb358da0 GIT binary patch literal 162 zcmZ?rUBmzZWRqD{+MwDken_t-6Zh@ia@5fc56=M#+~26f=vi{G4ubMIz5 z9hmB5)FljI1c6yljX4HY`!6|xtvSAi6JLliK$U~5~ N2X|M>nmsl>F9F?3zl{I@ literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤫1.bmp b/bmps/linja-lipamanka/󱤫1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c4efe2508e01dfcaa61722f27f47e6e29fd69ea7 GIT binary patch literal 334 zcmZwCKMny=5XbS^#Gj3XLLo#VTS}vwNigMAm}G^5WT#uG=pFoTaF_9)u-CHfU6m}7(h TZRojUT(QI(51gTQ)&Gt^;{Hli literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤬4.bmp b/bmps/linja-lipamanka/󱤬4.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6f4d6f265b6fdef72bb142e02673e1eb67c9efd0 GIT binary patch literal 182 zcmZ?r-Npa`W<8nc(?Gc+K-`Qh4glH&Fn0g| literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤭0.bmp b/bmps/linja-lipamanka/󱤭0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..771ae0e2bc411fcb3d6919084936ad46bd442b79 GIT binary patch literal 494 zcmZvYzYYOG5Qp~^A|$R>xkx0U6QR=3DOC3a3J;+mQ7A;~2{c}TNVJGXR7kvmKb2C> zH?kvJ+$P`7e7~97;#!@jXMU&7U4k@Zz%v22F-trDiM^sIlFo+{l*L`hQgE?*3wrsW z>h9QCmiz-+^d+J)rLRdLI!l&w5 z$;L2qyovABwUVtNbUcZ_;QtTl3-AD6_oQ+Lu!lSZu!X+6WA_r|6OcEAA$T(T0-3`4ww)~mR>EF0Q);l1^46>7tHFmh;rvKVfpHX1g_eK3cjuiF_-Rm#Q literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤰1.bmp b/bmps/linja-lipamanka/󱤰1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8b3d4231fdd0bdef17d067657a2260be931d653c GIT binary patch literal 454 zcmYk&y=nqM6o%p1G=iO15KFJX3lL%en0REFGe|1Oq^XSg)_xpxilWE}MhPKqIAabE zjD*YmyS^L?J4>#4U~%lM~adwj4%T64IAM({!cOXi4_{ia>hlljpHfjocd literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤳1.bmp b/bmps/linja-lipamanka/󱤳1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fdc45fdcde114f4860414f926fb07be24b0324f2 GIT binary patch literal 534 zcmaLSzbi#?6aesh#o|YikWCQ=C3@M(^5SK%7;XLn*-!?h-uTL5U{s=Hu}BeSy9@|} zl);bX`JC6grPs@;&$;)W@45G!J5}gzNGdTQ57SCBY0@Vr$$eV6)TUE~mU6kA{6|j* zxBSo^y&`HW>~p{>z16cA|HUU=^l-;EGvwLgi9tH~=9vLDDb?Q?_9A+n)UtyU!#rx literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤴0.bmp b/bmps/linja-lipamanka/󱤴0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e619a677d683577664cb4804e3a59a0f4162cb3d GIT binary patch literal 342 zcmZ?r4P#^g12Z700mN)T%mc)X3<^M!fk6Q(59T0z1Qadja7BM^H5@e?3+17a;8o(9Axp>~u2*&w;kK)eHp FRRK^ua~S{t literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤵0.bmp b/bmps/linja-lipamanka/󱤵0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2b69b0a991c0405fe950fb4bc781aa053395f0ae GIT binary patch literal 494 zcmZ|MI}ZUt6o%p1c108v8ka;ON|jQf((FIbYa|NMXho$_D}+WN(bH*#pCKU%g-ev{ z{Wd#HW0GgioHK`=ooxg+&qSlfTtNapJX2&gW)ts6$!}V+Oow4;{$W3Z9WF>ge_O`@ zBeap#?-@y4@xTiz?lDFmQ{17ts8>gwU;)oP2YCr66l^`t^EP)QdpgrlHHO~!t?2gH zHT5P|POj(VZ0<(t0oJz0TKCqmxf`j^(X%zyWt`E1?oM~8&osjUzU@_HRI$Y~b|iN3 G?fU@J^r=_? literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤶0.bmp b/bmps/linja-lipamanka/󱤶0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..52ae6a3735af09835059dbf3f7563ddee0b54d92 GIT binary patch literal 438 zcmZ9|p$o!56vy#f6SW8?5iuCVqDjH1V4F$&156hG0vQN`ux_###AL8pjf#S4&0sJH z3WC)#zi+$)+2C{g?Y+C(Z7p}_nCPlAmXSajjwv!4GtqwZphFmjl9p&nws=k_UwGEjj3%lAINgPjFNBe;HCXDS^nV{@*XSr E0nB!TD*ylh literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤷0.bmp b/bmps/linja-lipamanka/󱤷0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..590a75572e834f37ce0b1ff199a410d9ae493744 GIT binary patch literal 538 zcmZ9|y(>jw7y$5d84N-)s9SQABn-;+RTg)@VlW%XfZb*$gIyVnn2>*g;t!A%2Kl-+ z1KaU?Zs*kHt>61T=jnORd7e|L7Mqg#ny?SjnkghDQIb3t>c^igP17V;WsdmZiyO8n z<~3Q}n%pOw^wYr<`_!1r>Sn|*^flhkWBK^rJENSj!U!?NA}!1lV=S}I3GwYBcbs!g z)I4&@Aw9hDO*<80$fc~e)$DoF*~Sm|L@)6VE_kJr2adU7h$r^gVV3A~oaQ*Q_YaG= vIG{w0az1=OCvzx!iyr^GvA-dm!--n{M?YcqI! literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤸1.bmp b/bmps/linja-lipamanka/󱤸1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f002719d48ef1444fef92097d0b6ec7e57f7b77a GIT binary patch literal 334 zcmZ?r^~Fj7K5>Y;vlm#V0>g6DBcLfpg;iO_dwhM041u0F#rGn literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤹0.bmp b/bmps/linja-lipamanka/󱤹0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..b145d91b95eecad547f3011d6e764558319a84e6 GIT binary patch literal 450 zcmYk&uWLe46u|NK)SxU57X5(;%7SfZoK`o`=%1j$GPD^?hOO8Hiy|}H48n?i&DlhQ zKboKn(c<%a9_PZl@VV#L4d=bw+swAy^TM4(2oJEWD7R&O>f9~#avVppM|82p1q(C~ z(0P!2jxWTJLKZ(5>YFP0Nb@}T4Ns6Y)<|QFg1(XdyX0DTsB4%aWBT4mzm67qD0^on zr{6{eMNCZJM0$SwLH03w%D4LD4JQuSbB_q*pEPmB0XzKTj6Qy`!7El8!^DKv&%`52 OSYiO%v(Gp62_JW>fN+5T literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤺0.bmp b/bmps/linja-lipamanka/󱤺0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f1d1e639d29c165bbcf150cc7960227b2e8b5371 GIT binary patch literal 450 zcmZwEKMO%o7{~E*ZSo3~qEL($Hbn+018+kn6BaLkk+NCrQe;qyx8YC3Vq%c-`u=oJ z?%>qtoadhBxzD+Oiq)-Sz9Y+=LJ%Q1CdO<`-^+h5ep8Kbjx*jkVT82nx<(i?Jn+N- z1@v%7-B+g*a+pB<639SxNn2-E_L^9EXLN~&HfLA%0yrXqC=NE~U)f(E57oc?ImHY; z+Xd=TG$A*4<^AxK=XScrv9iZm{G4FNkZB2DUm7m;9NXK5uG zAwlwk5CWPmtnXRQfnf%ootbYwW*7D{O-im9O`hk7afHa#csf_s^J1fqJkOnA9Akh5 z{_u>3o!d+%x4d8sc~u2{Y;bBlz4MlAjyT9iWWykPB75{Rz2lnv2PHdW{f>_9Z6+&Y zk25dZv9H_SpUFSbmW*)#S)BMCTa&-yM!SdFt=hRib2dSy-Aub%=5Ek?Ap3=U<2_br sA;sFdtRu)jY2XTLeBlmq|A%$;o!?|#^dLRCZ-zHq1YP+@OH7gc1Iz)@j{pDw literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤼2.bmp b/bmps/linja-lipamanka/󱤼2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..15ff86bb7074e306c7979964e13b80790b95fb75 GIT binary patch literal 310 zcmZ?rHDhD|12Z700mK|o%*dbsWB~zG9>Rf>H-RjX|NsAk1ag769?F&lvM&JfS0Gk{ zinRdQ)1hoFAo~*#zXM`jEb<^Hd;#L;Kx~3VUJWSz4Tv8Au{9QX6`=SJAif2}PFUm> jf#Sb`_%aZCVv&~zivI=Ttw3xCl`jCYo1knyAp0-?PmM~E literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤽1.bmp b/bmps/linja-lipamanka/󱤽1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..322babc426544a0ced64f24388d2972488120b8f GIT binary patch literal 494 zcmZXPu?_)26h&uSenROBe1KLcwop*$bQ%SbNXRNAItd9HiAG`@q0ve-NOVG>)BA;S z-sVj*Vv;j+@0s1%oqX{Vm}KObvyg@q1SZ35%t7~)qLa1O2#gX`Tvyk`b$zEk!cToq zAHu{r@)$O7hnHsQ!ozd&TnKg8!b!7qVGl>mp?7`ze|Ea9LMpqEi^C!A69j=1 zt|YGUh!H-}LcwP&mu2h=msr6J7Eyu5FDy4n{|!4<=jqo_MHI7mLK*vLTkep))+yV> z3-lY?=->`pn8G*GT4!tTsW%bB5TBSs0S`WBS>+b61ieprWsCTi_3IcvK?7ZEU>ZM2 z_>4VU+poP?#VKxW{FweTja2{`2#DmkOTk# literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱤿0.bmp b/bmps/linja-lipamanka/󱤿0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ee5f9cce2935a2e01ab3bd46d04d2b12e01b20f5 GIT binary patch literal 274 zcmZ?r6=Gxn12Z700mQ68%nihh3<^M!f#D9AL?!a^1;lJnF&-fMFA(da*#Q!h YK@U`hJ zTW{C(zV&%uzvuT1r`gTML~!cdCD?Fai6XZU7b|$e*O4IQ`@V?6E`bHU$V7Ey#>wG> z7Yc@6nf)DCR1Cca`#rXB4ZR`zIi{ExdNcMT46uyqk;fswt%f|FNQS#)9h_9o?;ZMT rRxjBGV{LYs&v3M?$9#jWGWl}WSfL6JZ?yEzzn3PL|LuVT+Ir^)akk&D literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥁0.bmp b/bmps/linja-lipamanka/󱥁0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..46fb09c149d013725a6363872c00d3c9ac227fe8 GIT binary patch literal 294 zcmZ?rRbylT12Z700mQ68%mc)X3<^M!f#Cy~L?!@h~ELRI1q1z>gNTr-+N|y gpx8?^F+rf%3p6nypxARXF_2rHp^1Tl-~>zz0MEo>C;$Ke literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥂3.bmp b/bmps/linja-lipamanka/󱥂3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fd70e35710646f0e938d6d59b1ef529fe1e5ea94 GIT binary patch literal 318 zcmZ|Kv1$TA5CG73u6Q7oh^E$+sOth|EkJcm4oENs1jm#|VwlwzY;+#3IH znliV3XJ*b!=bW2O=8h%Eg#Z8m literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥄0.bmp b/bmps/linja-lipamanka/󱥄0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6aaf47d141ac8104b4ab265a8c0e5f582835a481 GIT binary patch literal 246 zcmZ?r{l)+RWQSlUjT8$|NsAi6oV}gD}vZi{#+nG4T(Ps$j?OLPY3dIkoZ%8{Cp(- VL?FKyiQfn0mm%@Xf&3H@9{@~TLu>#5 literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥅0.bmp b/bmps/linja-lipamanka/󱥅0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f0e28646b3b04364cd5ff670e29a7025cfdb8f2b GIT binary patch literal 342 zcmYk%u?qoV7{~GV6ayB{U_6T$3>JTY{T744BBP{^(PFewCNfDpXYsl&+}gQUfpe4Dtv0x5)w$mQVvxqN9JLWqO~@=7lx_#hj(Pnmqd7e(wbM-D%9@Wc!o1n~aGLp`|w literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥆3.bmp b/bmps/linja-lipamanka/󱥆3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..33821be5054b63e18b34cc38209c891c3da36ca5 GIT binary patch literal 234 zcmY+-KMp}b5C`D(FQU{aAEi>|02-Cr30y$w0_oC8}u$R0{{R3 literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥇1.bmp b/bmps/linja-lipamanka/󱥇1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..fc310c07249333598401ba2778dca1a8a5bd83b0 GIT binary patch literal 342 zcmZ?r4P#^g12Z700mK|Y%n8Jd3<^M!fk6Q(59T0H19{Gnrd09O2cYyLr Oc;wrG@`58!!v7R3u!?_cQ5%7p(g5eImurS~)f&TrktwC0|k9>si2j zKo(;5U=R6$9Mad2 Gce@f%vNwVN literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥉0.bmp b/bmps/linja-lipamanka/󱥉0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f29d0a8d18848a5510be6a58f4ae37498cc3ade6 GIT binary patch literal 486 zcmZ9{y$%6E6o%nl9q|(lg+>&DLM2LtO0xwKH4(LvTH|u)5G0zFPzW000tB59g=W1+ zW<++AXL8OrXJ==N*4Z?^Po6aeFZ?i#IICd{)&93pi{m&_MX*IddW~L=8Y6@aWZ2UC z>fJ2a4Rg$JK-D#qA$y_$xzYq}*G!pguQTc{YLymMnI&0WXVg(V&_ND;ToBeX>g*EP K33rT;miz-eQ=U-( literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥊0.bmp b/bmps/linja-lipamanka/󱥊0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3c3c369a1bd6fa6a28cf1091faf66066dca30754 GIT binary patch literal 294 zcmY+;u?qoV9LDkYiWuyqloT0dFj1Gm<{z;$$)c{5$>5)1H{N(khARUb8Dx5Wf7f$^ zw?4m~_j%vz-tn{(xNHrWT@+D4;F?V5p4t2#-g_$+cw?)5n|wnHSA^M;IYxw~x*2(oJ}$8D66Ei)vlrHO F{|B-3K8pYV literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥋0.bmp b/bmps/linja-lipamanka/󱥋0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cfa6466db77690336c6479dfeb17a2bf3b3bb8b1 GIT binary patch literal 234 zcmZ?reZ>F)W;@wcS{y_FKAl3t7c_4NHVvrt?ntMPDa>{WiEe51P@|U4{DnT{3*)FKqd?_+6*ifN-`;BplrT?Rlb0-xvRloFqUVG+bU6bK4ctSzz z9sC4-)1!HrOy2l{J*0o?O|lkvAqoMQfUW1l_ziL(cTF|l;5GFg?x@%CnR*4^srzt` MdJ!M1%in9i0fo+@+W-In literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥍0.bmp b/bmps/linja-lipamanka/󱥍0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..75f64351af146372518381915131a8d92d2c9141 GIT binary patch literal 534 zcmZ?r6=Pxm12Z700mNKD%mc)X3<^M!f#Crom_jEe0|ovQz&C*MJArsF5QpNy7C^ZJ zKs@#T|Njj5Fi_2LAnwDb1|$ar=YhDL2zA$h>KcepcNeIxk_dHAfa;2fQ1=?BE}IB- YpMmO`)YzV0X0O#=wyZ`_I literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥎0.bmp b/bmps/linja-lipamanka/󱥎0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4b01ef4781c6679317ccdcd9661b8a52f1909013 GIT binary patch literal 630 zcmZ|MziYxk6u|L|zfcIaqN}L5xVjX(6&InXi~oU3S0`8h0YSmV!9m2u(Z!)#ML|Kq zq5pv5P;k(pxO7OrPwpTDa`4H$d++6PNy@c$Kt09_*8*(KQduIU-gN!3&=<#XlpE1XCo?fPAMSM~^ literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥏1.bmp b/bmps/linja-lipamanka/󱥏1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2f2b0e10ddd2f1276f7c265b755730d5b7800dca GIT binary patch literal 414 zcmZ9|EeirM7{KwZDB7+Zh#&@o$>4#Q?Iw$U1Hs}q@Fknfa?xVdY*6$Ih{Ym;*!%*5 z^Zy(hjvf5A=Z)R&I^9&O>}j#qQA7b+Rauo9+J2V&mj|H?EDprwK->+)Amg_H@oOM{55#AoW@G@_HBk0;Ap0Q@zXjr>K&%GDEl>8gLehOss{QnPR{?&G*Ipi5c>l0Z360^0Oc8>_%KXAIt`T1fQbPBV_#R0 literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥓0.bmp b/bmps/linja-lipamanka/󱥓0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bf78012189c32a4f941423c046ac3e1ad052aeef GIT binary patch literal 534 zcmajay9&ZU5QX7MO0i0jI*kwz1urNlDu{(m3h^O)zPv+f!6t=`DMUrE5JW+d_1}<6 z;<)h5!kojxP9xuy{PdV1DyYJdfGLtW`Sm>#7Uquwd4?4_KP=h5u*b+4BW1`MxZ{XH zS;y`;ZCr6iU+LNJUJ6~MH>7ideY2(XCgk=HH#C*rjC_X&>Pl};zQq%v(u>Gbyirqn O3-S%t@RZ(|JpKS1(b)+A literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥔3.bmp b/bmps/linja-lipamanka/󱥔3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..672dd8d64224661adfdf8b02a34424426c084283 GIT binary patch literal 294 zcmZ?rRbylT12Z700mNKD%m&1a3<^M!f#Cy~L?!zDQz6``5Wlw;31rTe1 zk|G{Tk&^OK1_q0TvYLDYyRTp}_!1&n7z}2ELdr&pNF;g7 zYmeVwcPXcS=f2N%I@h_bGdXirDSpSOxtDqxs1#LmQEZm`zl*FLaRH{TwmH1v9+yPTr=je3SH4rJdC9 d$rlq0(OpU%IhPu~*T6o4cH!vQdfLEHn1{0HKXK>QAh9|7sRK)er#6@l0k zh+U9yFpwPz#18-e|7V~C1I@67ngucw*$xvRUmA!v12M=gkAWEGzRy55$jv(dfbvAm literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥗0.bmp b/bmps/linja-lipamanka/󱥗0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..59d05b5491a447c8b316757eba07b1bb42a231a0 GIT binary patch literal 582 zcmb7-y$%6E6orRfk)V*!`>F5%3JQrrg+#4UOEk2eM4=XspioJ~Ge|T<;R!@DzS-PK z#_p1s`mARG5iyky`X|0tD<2jrm<<8@3JX1J3Xo1PB ue(@I39x#I)teu>XT-hJvxx*GJzr5lvSdV?#i{x4@{Ql`}<3EHmO#cRPW&DZ& literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥘3.bmp b/bmps/linja-lipamanka/󱥘3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7d68980a5221630210acc563c3c29c4c4e009c09 GIT binary patch literal 342 zcmZwBp$o!56vy$mV$mWliD3xB+JeKbh(R=nAea|d{0ICqWDHFH0aif}1cM-m-DD7( zg2j4%Z)|Mg4nFVR{qAvGZ#=UkSskj23QDlVp^7-^eR9alm9~s2Y^9VGk+o672y6V% zzy-tNtnOJ`1kmpt@kR?LObqiI@&)?1;Rz3W%nkD^@+EvcaK`{Ugs7s9W-4Nj(Zv@B N=#OST^d>Lz^B;3cP{jZM literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥙0.bmp b/bmps/linja-lipamanka/󱥙0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..39cd2a2dcd46d0f3a7924a380ee94b970f00fa42 GIT binary patch literal 342 zcmZw8u?m7v6vpu*f`dp?=<3iQJwQpLW6;pj&~Yry6Ys1;OnlF?1`=J z!=z^D;r-<<*&B=B-2S+?J3o^$&BDSI==1YdzQj|AdyOqSJ{p7w*E@6sZTz(W-o%+a;h5`y}exWWb} zoN>eudsI-w7HPcDKnJo(5F?^>&oFClk&XwB6aqqf$(Nj`M6A_ j^akid&b@`r=zcr;CFF4UGuNgcg`B_mHTS7AGeZ3h32}V> literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥛0.bmp b/bmps/linja-lipamanka/󱥛0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e48b35c104e82a27167825f315a545076a4aefbc GIT binary patch literal 538 zcmZ9}y-LGi6vpv4;!to9Du~3!#L$p-a1xw4i7tZlGI~M12rop(&fVO)s-&$LHEsMq z;XUwT;Fp~9oCEo~eT)xWcieCu;mC_zM&;Zp>Ms9J&je>}+dAPm!Q6VE9h1FcjnZb+ zS9r7D?+(az*rKo*^%#})em5ce#V3X~qb`(L?{`zOZ+s!Q8TBP<>;0}W?bXO^MtyHa@RZAKkKA0!I0A^ipok{~~&*Y07E=^ZNQTbu`ZpI*DYAS>xVu*VD!xWg3M Zo!}aJ)_c6;2`^Z9`aiOQ=AwHq{{ZB~s<;3E literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥜0.bmp b/bmps/linja-lipamanka/󱥜0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3a53f6ba2ddb1c9c98feb666c2e45057d3713476 GIT binary patch literal 534 zcmZwEJt&1y7y#h!DkT{h+_LD7N(ph3>BfL7Wnr-yj3z~FN_N?8Hu96KY+~}0D7T12 zSdeVjb8hDw$f@VNZ|A(H?>*n?8_8BBm612MP)i+|Bxg>N+e{_=n#$#J5*Tf4@EUE3 z?dg838MOAqG_7mA43WKf=6w5dZ)H literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥝3.bmp b/bmps/linja-lipamanka/󱥝3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8b1976fe883aabe1ed2087a55d024e69a1972e76 GIT binary patch literal 246 zcmZ?r{l)+RWT6o4cH!vQdfLEHt3{0HLG|Nnz123a7!3B-?p_&gBH z0kIMgivTeT5VHfZ0}#6au?|QN3T%^=wYQj`Kglwr-LD literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥟1.bmp b/bmps/linja-lipamanka/󱥟1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..10956227c98075c2858c41195d99adcbfc8af5d7 GIT binary patch literal 294 zcmZXPF$%&!5Je{`Qdp(1k%%l7B54I{vCla?LGI*@EG;B;f)bH5>zgG516g=~_^()I zuFWBn^v>iF3RpoVffN~1F5-!aGhK{P6y6&4px;gAZQ?fYvu+bt!PmM?+!jWt;pY5~ h{(%-=&IkG%awwhGod(x+j}u&=cm7V-ll7Q~`9EmHVq5?K literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥠0.bmp b/bmps/linja-lipamanka/󱥠0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6c04511e49df9213358c56f82ac08e248821578c GIT binary patch literal 438 zcmaLTJqp4=5QgE27XDyks}^EqVJD-#p>&2+OF~$J5TQ5*5`T7^PFGz)@^nsjtZUzwTc8>ILfCgHL&-=@GCQp9#%+U3LhJ-wGzx4 z72Ht98Fic_V>*v1HC!OMlAWWHWj-K}IWpKHi9PNx`>f={oqf!HtH^nbUHIPKb=g1B s#s@7t{^Zi^`*6|22n)$^jw51wj&9y({@D?QP;SZm!W&ntF@$F_U-_4DdH?_b literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥣0.bmp b/bmps/linja-lipamanka/󱥣0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8181143b8e88e8910e09b2d3bd7dae3ee2b1f34e GIT binary patch literal 534 zcmZ9}KMO%o7{~E*DM=y&qb$m-7}%st_Z2WJWxKE84koL?bZ3jjD_~O?mEmqIyoKX? zZasROQ=jwv`Q2{*jKW6FWT(&FK?!99rp0Yc8f4|~vep`naE(as{GQys_Jb68KbM(o zjvbB&W$#zAGsc+W;OB1U^zeZDmIXY~_Mc_9#qaae$5`p-n5%fBE_?bWUMQ;Fk~xuC wD!V;qYQ8WJWR}Wqf|Hv$L);|OmA(6C?&u=HLg%_Ci?D(FO)EOnJy{LcFS4WO?RKCy6O; zcw&vL&fQ8byGQI$wN}&%((bODxdQAx`G$Owy^t=t7?PjE3%M zC6oO-WM|;yA^lc+tz`18*4k?&OW}k$O2}h`7Ye%PR`Lww{p4G|aX{JK@txV}W9ggu KGIrYteX|b{JsWrc literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥥3.bmp b/bmps/linja-lipamanka/󱥥3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..96ce3bc76c3a6d38accd0318e2227450c0086c45 GIT binary patch literal 254 zcmZ?r{l@?SW}G6ssx2Vzs07?7O| z#B*VM7!4HL4a6=;{AeJ5DU1)JfnxiC*a5@`0y`jX1meR$>;l9lKx_=eMnHTTh{J$b a6o|J0@g*R>3&jtC^gAei52QhcJpcgM{Ytg~ literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥦3.bmp b/bmps/linja-lipamanka/󱥦3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..41985cb98632a1020b059ddf4bd923fa00ebc86c GIT binary patch literal 294 zcmZ?rRbylT12Z700mNKD%m&1a3<^M!f#Cy~L?!=`gMFd8UU55zGbJ^*LyUSa?M literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥧3.bmp b/bmps/linja-lipamanka/󱥧3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..8c77a5f9f5267b25b991c9128872e61da38039f5 GIT binary patch literal 254 zcmZY0Jq`g;6b8^YGejb>2OYIS)YLYiRB03%ThU1*DpAN(IvSluA+ZG;@SO3J$au-Q z_vOoX`@=_gzpmA$PL(7y%@B^S`8OJp8w+|d#_&s)GG$C;$$?R+*O6U0vmz%gbu!tG d83StUS<@o%U%Zg;~9kG`m$)-A!XVl4`nB+6+D|&ga@8l!A5XpIW swypQ*n%M#ug!rMV=elO*zWszP+|La4+^?C}@W2;=Klgj~43YZz9|=y$#Q*>R literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥪1.bmp b/bmps/linja-lipamanka/󱥪1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..62046c6bd938794a3a3736043e6938e428f3ec82 GIT binary patch literal 450 zcma*jKMO%o7{~E*DJ6e4#by#^GTagitCYc_yaI#4W-!QLvB)d1Nm;xEiBVBXCK(K5 zAoKM-xAWwVPJPb#J@-84-rFfxSC(>z&74LEL0BrutklTtyTxzn5N*eCl%S4aiVsd` z>ODpeTlh^KCm*mx1~oj;LKsKP(Z&^H_&nb!P;bn;666UMXh_e$D`%o8Ath(X?te81w3sZlh>c8IB^y~P>HF}uXy>q|pKVgI=isv%6 z$G$w*27ie8`tmxOXdxhdMg#}^BkIf6SpQ&(xMma7d#rHh%gXuZcCA_Iy)6`?F9qKN&2x+fMEobaQKKm^inBfB{$yuy3c*Pgwyzl71`#;H@ E0Ldo3HUIzs literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥬0.bmp b/bmps/linja-lipamanka/󱥬0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2122a49e2c25ed2961e9d4c055be45d2e8a6f30d GIT binary patch literal 438 zcmZwDzY76z7{~FuK~YNGPFEy5k(6RFi40fDDt~}7D5VVk3ahdxl+j>h^bg!1k`(@d z^M0;J-Edd0Z=dh;JomjH_2%9*{Hw^CLlkkChRtdiQ| z{^Ec$UT^~Q@{RIs9mspdkk@-F9?U@yuYk<|Q2Yx>zeB@Efqam-3=j)q z!J0rZke;tVEb{;Ve+G066c+>H&p`YEh$YbFL3|(pnf(KZLGF>mp+*EK_ZNt_0`W9- zH9#>|Al?SVi-DLQh%W(g8B86J4GMv|K)er#*`f9-0NKxgI0njZ1F}K-1Yr80;wC_` Xw?I4{i0=V0E`Rs}(A9+u literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥮1.bmp b/bmps/linja-lipamanka/󱥮1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6afc8875ce8894e1415c6beebd60d2dc68e4dbc6 GIT binary patch literal 198 zcmZ?rJ;ne5WL4ABcYg uF~}Gg{|AuGgT(&|Wb-5OKLgo zm3b0JykLF5)6Cq*)b^YW9(AXcSra{ZXF)FOPAjt(MyO+sSKVo4HozG({3Fnvt(-Pa z2&Mld|H7C4nQZTv#TG6O$V*LA-%*kGSL6@$r4Psx{2?K;F8Kmi`UkST!xu`h-`IZ) W@r?#*u=nt=#~U*8eUUuI65bVc+L~zq literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥰2.bmp b/bmps/linja-lipamanka/󱥰2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a43d8a5a5817f8ba47dbb8c11bf625c9418801ad GIT binary patch literal 310 zcmZ?rHDhD|12Z700mK|o%*dbsWB~zG9>Rf;|NsAIfMK9WHxMs|@zH6ZoI4PQVi5Q6(CLr;y55a3&dc1fOI?%Ujt%pn7KeUClKET;s78% x3dCVBIT#HTO9SGyK>Qhqb%0n9iiLo*5)gX;G02QpKn!xoHz0n8gdYLfCjs)bRy+Uz literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥱0.bmp b/bmps/linja-lipamanka/󱥱0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..a05ef4a82105ed46ce9320dc23d78ad8bdcf4e32 GIT binary patch literal 450 zcmZ9|KMMh29KiAC6m?OO$atg0CX-1SrDQRgBqezP%9$))g2lw<6)><c?JVW55_=vt;;@v%uGCET{p7!;2)D?2o~HujMO=_TA78AE zevJHtH`+L&hbvk#$8vGN02_1>MFS61@j?Mf%!BXi^Gj+UjLo_k(;Go9^Y1i!60_u2 z$Q={hkTGY-BiLiA=jF~-Xl6+53|r5niRGP5ojb%<bt0)b7Ya-tLNM0DoOdHr*so?wO2k2<-5g~@Z?P;|~o zK%K<}iS}3{%);DyLwd{5Bj@ly#pZg4-d(dgMV{h?we<$%Cw9nSj6KRYqXm73zIlr| bbQat9J@OqJtJ7rvX05HKzx0S|=;`?ZtkPXk literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥳0.bmp b/bmps/linja-lipamanka/󱥳0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..1bc25483222698df9c31d68f5232701dbc409e0b GIT binary patch literal 186 zcmZ?r-NgU_WQOb?+Ikz1pq9xEZqPA literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥴0.bmp b/bmps/linja-lipamanka/󱥴0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..feedf77bf4df465513edc1c9ae33b6ed61cc8bab GIT binary patch literal 390 zcmZ9{F$%&!5QX7MB>@ki2*C>|mZA`_2&A*H5CpLhtn>F_QAId(PSBA?4~l4){n}+GVR8@=JGo z$Gv)LWgR+YiH_(L*Gd#Bk$8YByn~L)c?*?7RP+*2djtO(<@)ww zVsg=#Dw9Uh6xBy*oKRNlg~;{Q(Grl2VA+!=gvnPf9KDqrGT n$f#_DKcS(rJbs3S%cu^#AdovU$*SP~-vm}LmR)kP>%r*_YlqCG literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥷2.bmp b/bmps/linja-lipamanka/󱥷2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..0a2b7bd19547f20d9ef9397d3a3bf089227dccdc GIT binary patch literal 374 zcmZ9`p$fuK6vpwhBBIGAxS-8o6SRm7gMzRZSoaBpVetuk0P!uvBANx8$zU-mVlkVp z|1);*vJ1a^_|C^=8^viL+39h&Q9&7jG`U5hywAe_(rt<(HmGBaJKk70=NK}_8B?rq zh4v9bT#(>~uD;3NZOI2OPsk^HQS$cs-IkYY0<2Bz!O93 VY_jX%g}&}M1I(>4^ADV_b}#?{ literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥸0.bmp b/bmps/linja-lipamanka/󱥸0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..51729ccdeab48dc3627dffbaf45015c607c5e6ae GIT binary patch literal 534 zcmZ9}zpH^!9LMp)RqDDZxiT0m%8yBk=$0}tG58m3M%}vqfWb=q0TzD%i_v0Lw{9}1 zYmk95n3Uo1K04nzJ*Qshe7~RP+v(|fYR#Bey;hMujdy&&qmt}O9XzkYz3m9@IN=u~ zR2;`qHnJQxSfGp_95II1H5(+`qoZ?H2y681IrFSRzLlIhfg7@tnYlNzGcuA>4=|Bl zPO>H1R$rk1mtIb?DY{m#zu*I5$@Iw@qUXx4WN}v(C9A^^A0o)xGv>Z3`2{8X;TtRX hWtLk1I{i;tNSRuHgE?l_oPOsobMGhh#?%4o-V-ybwsZgh literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥹0.bmp b/bmps/linja-lipamanka/󱥹0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cdd8db8046c89ee9ba730d2dae05a6a478565f81 GIT binary patch literal 246 zcmZ?r{l)+RWVvcLme z|1;gGNyF6dp1J3onR{m3*2Yr)Rbee4X;{kPPN|Wp`x~=pt<^8I*qEXErzb&uj4k3( zedJ5nVTCJ-;Xd|tOiZm!?BIPaL7KM*}fALn5S}!3*-7%+tjh q7YvbxoO8o6JfC?_j{E?3^da*!zx#qcwJa7m!w&LMk-GfDIm#dJdX-iH literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥻1.bmp b/bmps/linja-lipamanka/󱥻1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f5473ec89f48d01994cf13cfdc9c4180e9160e05 GIT binary patch literal 378 zcmZ?rtzu*V12Z700mPh8%*dbsWHB(fK;^+41aS$-bpHSUKLaubis=FI9w3$iVpkx3 z3&bvHYBYgj8-Z9HBn|{v)gkMlkvcn|-LHTc-F=G4c7x=B_ze)dLfrx4gB)&(OC3;- S9f*B^m<3r4RKGJ&`~m=!l9HPM literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥼0.bmp b/bmps/linja-lipamanka/󱥼0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..24c0b2d4ba810cb9776a51f54375cb124c711f95 GIT binary patch literal 538 zcmZ9}--PPe3j-O>U%!W~L$K!i6%9?@w!& zocf%#&pPX@z0cm=pd5Ag>x26nk|yG6jGWs>?&10NN8%p`^GjTsPvX=Jh#}HQA%iUH zMpJgs#RaM@U<=>-G0w>6afWIuxI%p&wRzs7gcDR-v=|G+(0SyV_=b8Nq1v3qgs)TN zddC{C(7Ke=yo$-ETCHIL{j2s%HQEQQ_r?0f8SDEV=4jvtzIJD0J?o$SUJMy)?>5l8 f0NO`UUUOEV-qOMfeT*=M&gcs|w-tPEox|h?%v@iI literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥽3.bmp b/bmps/linja-lipamanka/󱥽3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..2a3d9052d0591f161b574e8992b68763bcf65ad9 GIT binary patch literal 254 zcmZ?r{l@?SW`cr`T3lPTx mu`v+;0^&*_-VVed{UC1`05K;J-vDAhsQs&fY(*eu1n~id@i#;O literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱥾0.bmp b/bmps/linja-lipamanka/󱥾0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6a05eebf2e0bcc60467945d38498a25491a741d2 GIT binary patch literal 538 zcmZ|Lu?qoV7{~GVWKaf!fs`^xG8h@vDH+^gFtFII${;uU3zX?5DXYz(Om>OLYL?k@ zzVGF!m)u*Qd!G0AKG$2X?PMY`N?BsJG3RIzalAnvy#`bl#Kp>wCv4F z-hw9?{S>b3rIP7aUZZ1VCH61OQG8KlvvnANl96(7Fi^lk-@@Z;S(r>K?WJ*8_1>@Ov<7xN>UO^1{4!t z;rhQi<#u!HckX+h^K|Rnbnb0a-zUKug9mQdRG3w%nLht+eoKLIj|Z-}6(%CQPAIT zG5a95l>2xs-3nO~cD&HR4Gq*R-4NMce>cc1zp{lf&gQP}NS@bok9mj`;(xkf@}r#L Q1c$X_-s|3m_rjci0QB^Y`~Uy| literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱦁1.bmp b/bmps/linja-lipamanka/󱦁1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..caacb3d95dda3db0ec8e2140c1f0dc145e2f5fe3 GIT binary patch literal 454 zcmZwDJqtlm7{Kv!W0Eo`EJ`LelTs$TZ(%Wsg$%lPGunIxqsd^fu}}_8Kz6GZi9Z7SazB*{rojquj$l*OFpprkEu4bd8w+ zLtWD`y*7?`;f^gD(F}1Bc~RnAVvH(MYVJqw-nrs|C%zKDIo@dST l-gi06{mC`@$l(kh1=X*UudqQ{>RDnR7r1Zw;DiyvnLmfsq8b1I literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱦂1.bmp b/bmps/linja-lipamanka/󱦂1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f6e247559d9deb250b81a9ad2c5dc1e065871e4d GIT binary patch literal 270 zcmZ?r83R>J2I8~GVjwmUoF+s3 n3{>w#px$^Sb711`Kyht!aS$Jdq4t8+!^Du(cOi>G#Ww)}hE#B@ literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱦆0.bmp b/bmps/linja-lipamanka/󱦆0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ac32d766170740dc8e8476b511bc9ea49518f103 GIT binary patch literal 342 zcmZ9`tqKA`5Ww+0FerFfY=Uewnhb)n+6B`!UqJAq`2q*NfK{U=v%Z4GWE8|8h-k3b zWc|-E;^D$?c4lXH?%JIwFv+SBE65^;z*wR&R{Kfu3kA{%`p9_ijbP0&eS`xHH# z(Zmfe6k+jz!x&v0a6(;Yj>xZ&Sr<7+jCJa}C2EII--P6QEYQLdD>PDX^3*fDF+hYn Y%HKOWYo~p=e}wz%S2>e^enRF2AA3qi#sB~S literal 0 HcmV?d00001 diff --git a/bmps/linja-lipamanka/󱦇0.bmp b/bmps/linja-lipamanka/󱦇0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9f8d14d0915e8afe597df080b249110f35662bee GIT binary patch literal 294 zcmZY4F$%&!5QX815>25+ZXgz#KHvfDJ%X)O8Y{ul&dSmg*rgPV9z+B?MKKA2H(37( zBLob5vu__PyBSXgo>bq68No*fp7fX^pKAV%E=`64J2bJx$~ng(TTF36-@2Hb;*OSe zA^D7(?yb`oJ&|Kp^CFj6)V#^p-&s5Vpu3=9`+%%>9uZkLBp;Aq4ZU-NIojAm|4rW; Fd;t-~IfnoM literal 0 HcmV?d00001 diff --git a/bmps/nimbus-roman/$2.bmp b/bmps/nimbus-roman/$0.bmp similarity index 100% rename from bmps/nimbus-roman/$2.bmp rename to bmps/nimbus-roman/$0.bmp diff --git a/bmps/shippori-mincho/大0.bmp b/bmps/shippori-mincho/大0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bfe23efb662d0dc5887c30f5627dcfb319c487ab GIT binary patch literal 582 zcmajbu?vAg7{~E@k%(fEl)<9>0a(>L*er_JnT!S{WjD%X;LYT3uqu<$aw>`L;-Sg`cv%C#K|{fXUydBf_b}S_mb|+ tJ+Srl$wQ1Bcj~p1-KgXL>ApiAp>5~Xbp&=Mck(kjQvW-dJ!0XT`v5J0|0Dna literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/安0.bmp b/bmps/shippori-mincho/安0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bde5c5fec6d0f1a58c16c3cf37551b3b7ce23ec4 GIT binary patch literal 630 zcmZ9JF-t;G6vwYY5Ih&5H3*kP+ytQ^kZ=er1JS|2ARMA-YH+bd!`VS_X(>Y5#l=Mz zH@|{kqEGPpoyR$N?85Jz|Nno_z3;wvFK@aBAsHo}IY=w1aEc0{tn-Q4J<7-z=)*gl z$8j7yWEb$`GtrC;yul1k;0(TD4h7$jKh!mHif8zRDdc>g_C(|xkaP9m8fx(Qzt=o- z4H%o(edJt4pLxyP0`iujtMFl7D&rQK%8;>xP1>D40yoXnC6)zFLl$R1> z68Mt${{Md=?RvXORK4cx6Ud+oEj40SsxN-s$fmVc29|LbP{9{g)(f5ZZCJt-N;pMw zN4(Va=yztu)lALWL+*R@e|a?Xi65D}Q;+R^k^C9Gl6*mZjpgwM@PbV8DfJtA(l_rx rGym-gGkc$8ZfKW4{(xS%S;-91JAr)eXZ@bJ<~_a_>Lvf+Onm=Ij!yXo|CtbOu5S8?Dq%8xgw{ zc76&!&*hzChb${RcfXmPo8zq2@|&&Yy<&^9 voga}ScZZufyTm|yWSL(;_xpGGhK)BLY3<*cEnu&Gas#r%->Y?>vm-Kpxv`%g literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/打0.bmp b/bmps/shippori-mincho/打0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..116c013e7a86e324d007a0ca90604ef071e11883 GIT binary patch literal 630 zcma)&zY4-I5Qk&^LqQ)w#7&`#Lvb#Sf>Ku}aS#_LrGmJ)h={X8pF&-neF!HXrhZov zj6$V>FL%G+U6LccLFA}(b=lic(-c&bOsPQEQ}NlVq$_wrJxLNJu!_)!2ed4|AsS*B zTE34CU)^i@oLy)r_aJ8Q`Pptbr;sRzrT+lb`U72NM^lzl* GLg@{7uH@JN literal 0 HcmV?d00001 diff --git a/bmps/shippori-mincho/方0.bmp b/bmps/shippori-mincho/方0.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c7028bdccbaa11ed67a71edfdf6b8bb4ea10231f GIT binary patch literal 582 zcmZvYF$+Oa6vreWi=?1PxJiF>zv8x^L)uvsMb3h2zzH@9-@zRqE1ofd zC4}&XdSbt<@2&IaR`~fJf5um>C--1&o&UxFzqOv+f}M4KuRO=idU60q>$JzqU8V-P z;|nsnM=S0QdCgK8Ih(b|U!bDdR{R+3KNsX@!pYlT?K$o75ACHgq;mqHPrDGBj^Sl%y>}WkQdWB(VY5*zI z^56JFj~;r@TYtx|d;Y^|_20UBVjR9Kx*GJf`jUDZtp9?2Mj6iG75sVH_){pTCxw2I zUPNEP6Rf}n^kEDa5Q7`2!ZB>CFN6Mp5v*BG`Ad9Dx{0nsO;m_>cWJLasoEp*1vr35 zxC5JW3qB$1^%U`MumE;nOYjFaV;=0xWv@Qcp@QexIDXy9ac~^Y&j( WbYcP=(4>_B literal 0 HcmV?d00001 diff --git a/docs/system/input_methods.md b/docs/system/input_methods.md new file mode 100644 index 0000000..acc9796 --- /dev/null +++ b/docs/system/input_methods.md @@ -0,0 +1,15 @@ +Use the shortcut Alt+ to switch between the input methods. + +## Current Input Methods + +### LAT + +Directly passes all keyboard inputs without any extra processing. + +### TOK: Toki Pona + +Intercepts all latin letters used in Toki Pona, stores it in buffer. Press enter to turn buffer into Sitelen Pona characters. Press delete to clear buffer. + +󱤿󱥁󱤧󱤆󱤉󱥂󱥍󱥬Lasina󱥩󱥠󱥔 +󱤑󱤧󱥠󱤉󱥂󱥍󱥬Lasina󱤡󱤿󱥁󱤧󱥌󱤉󱥂󱥩󱥓 +󱤑󱤧󱥠󱤉󱥂Enter󱤡󱥂󱥍󱤏󱥓󱤧󱤖󱥠󱥔 diff --git a/docs/system/shortcuts.md b/docs/system/shortcuts.md index c63a4d5..4a4d301 100644 --- a/docs/system/shortcuts.md +++ b/docs/system/shortcuts.md @@ -6,6 +6,7 @@ - Alt+c: Centre window - Alt+f: Fullscreen window - Alt+w: Half width window +- Alt+: Switch keyboard input method (switch language) - Alt+C: Clipboard copy - Alt+P: Clipboard paste - Alt+h: Move window left diff --git a/install b/install index 992d624..e7f4d25 100755 --- a/install +++ b/install @@ -6,8 +6,7 @@ rm -f /usr/local/bin/ming_bmps/nimbus-romano/*.bmp rm -f /usr/local/bin/ming_bmps/shippori-mincho/*.bmp rm -f /usr/local/bin/ming_bmps/*1440x842.bmp rm -f /usr/local/bin/ming_bmps/*.svg -rm -rf /usr/local/bin/ming_docs -cp -r ./docs /usr/local/bin/ming_docs +cp -rT ./docs /usr/local/bin/ming_docs rm -rf /usr/local/bin/ming_docs/images cp ./target/release/ming /usr/local/bin/ming cp ./target/release/mingUtils_Terminal /usr/local/bin/mingUtils_Terminal diff --git a/local-install b/local-install index 76bc44a..940ceb3 100755 --- a/local-install +++ b/local-install @@ -6,8 +6,7 @@ rm -f ~/.local/bin/ming_bmps/nimbus-romano/*.bmp rm -f ~/.local/bin/ming_bmps/shippori-mincho/*.bmp rm -f ~/.local/bin/ming_bmps/*1440x842.bmp rm -f ~/.local/bin/ming_bmps/*.svg -rm -rf ~/.local/bin/ming_docs -cp -r ./docs ~/.local/bin/ming_docs +cp -rT ./docs ~/.local/bin/ming_docs rm -rf ~/.local/bin/ming_docs/images cp ./target/release/ming ~/.local/bin/ming cp ./target/release/mingUtils_Terminal ~/.local/bin/mingUtils_Terminal diff --git a/ming-wm-lib/src/messages.rs b/ming-wm-lib/src/messages.rs index 8677f73..2fe9987 100644 --- a/ming-wm-lib/src/messages.rs +++ b/ming-wm-lib/src/messages.rs @@ -105,6 +105,7 @@ pub enum Direction { pub enum ShortcutType { StartMenu, SwitchWorkspace(u8), + NextInputMethod, MoveWindowToWorkspace(u8), FocusPrevWindow, FocusNextWindow, @@ -127,6 +128,8 @@ pub type WindowsVec = Vec<(usize, String)>; pub enum InfoType { /// Let taskbar know what the current windows in the workspace are WindowsInWorkspace(WindowsVec, usize), //Vec<(id, name)>, focused id + /// Let workspace indicator know the current input method + InputMethod(String, String), //abbr, internal buffer // } diff --git a/ming-wm-lib/src/serialize.rs b/ming-wm-lib/src/serialize.rs index d362519..d413698 100644 --- a/ming-wm-lib/src/serialize.rs +++ b/ming-wm-lib/src/serialize.rs @@ -546,6 +546,7 @@ impl Serializable for WindowMessage { WindowMessage::Shortcut(st) => format!("Shortcut/{}", match st { ShortcutType::StartMenu => "StartMenu".to_string(), ShortcutType::SwitchWorkspace(u) => format!("SwitchWorkspace/{}", u), + ShortcutType::NextInputMethod => "NextInputMethod".to_string(), ShortcutType::MoveWindowToWorkspace(u) => format!("MoveWindowToWorkspace/{}", u), ShortcutType::FocusPrevWindow => "FocusPrevWindow".to_string(), ShortcutType::FocusNextWindow => "FocusNextWindow".to_string(), @@ -583,6 +584,7 @@ impl Serializable for WindowMessage { wv_string = wv_string[..wv_string.len() - 1].to_string(); format!("WindowsInWorkspace/{}\x1E{}", wv_string, u) }, + InfoType::InputMethod(abbr, buffer) => format!("InputMethod/{}\x1E{}", abbr, buffer), }), WindowMessage::Focus => "Focus".to_string(), WindowMessage::Unfocus => "Unfocus".to_string(), @@ -627,6 +629,7 @@ impl Serializable for WindowMessage { let arg = arg.unwrap(); let shortcut = match arg { "StartMenu" => Some(ShortcutType::StartMenu), + "NextInputMethod" => Some(ShortcutType::NextInputMethod), "SwitchWorkspace" | "MoveWindowToWorkspace" => { let narg = parts.next(); if narg.is_none() { @@ -686,37 +689,54 @@ impl Serializable for WindowMessage { } }, "Info" => { - //skip WindowsInWorkspace cause that's the only possible InfoType atm - if parts.next().is_none() { + let t = parts.next(); + if t.is_none() { return Err(()); } + let t = t.unwrap(); let arg = parts.next(); if arg.is_none() { return Err(()); } let mut parts2 = arg.unwrap().split("\x1E"); - let arg2 = parts2.next(); - if arg2.is_none() { - return Err(()); - } - let mut w_tuple: (usize, String) = Default::default(); - let mut w_vec = Vec::new(); - for (i, a) in arg2.unwrap().split("\x1F").enumerate() { - if i % 2 == 0 { - if let Ok(n) = a.parse() { - w_tuple.0 = n; - } - } else { - w_tuple.1 = a.to_string(); - w_vec.push(w_tuple.clone()); + if t == "WindowsInWorkspace" { + let arg2 = parts2.next(); + if arg2.is_none() { + return Err(()); } - } - let arg2 = parts2.next(); - if arg2.is_none() { - return Err(()); - } - if let Ok(n) = arg2.unwrap().parse() { - Ok(WindowMessage::Info(InfoType::WindowsInWorkspace(w_vec, n))) + let mut w_tuple: (usize, String) = Default::default(); + let mut w_vec = Vec::new(); + for (i, a) in arg2.unwrap().split("\x1F").enumerate() { + if i % 2 == 0 { + if let Ok(n) = a.parse() { + w_tuple.0 = n; + } + } else { + w_tuple.1 = a.to_string(); + w_vec.push(w_tuple.clone()); + } + } + let arg2 = parts2.next(); + if arg2.is_none() { + return Err(()); + } + if let Ok(n) = arg2.unwrap().parse() { + Ok(WindowMessage::Info(InfoType::WindowsInWorkspace(w_vec, n))) + } else { + Err(()) + } + } else if t == "InputMethod" { + let arg2 = parts2.next(); + if arg2.is_none() { + return Err(()); + } + let im = arg2.unwrap(); + let arg2 = parts2.next(); + if arg2.is_none() { + return Err(()); + } + let buf = arg2.unwrap(); + Ok(WindowMessage::Info(InfoType::InputMethod(im.to_string(), buf.to_string()))) } else { Err(()) } diff --git a/ming-wm-lib/src/window_manager_types.rs b/ming-wm-lib/src/window_manager_types.rs index 2f27422..9af7320 100644 --- a/ming-wm-lib/src/window_manager_types.rs +++ b/ming-wm-lib/src/window_manager_types.rs @@ -28,6 +28,15 @@ pub enum DrawInstructions { Line(Point, Point, usize, RGBColor), } +pub trait InputMethod { + fn abbr(&self) -> [char; 3]; + + fn internal_buffer(&self) -> String; + + //ideally should return Option, but this is simpler for now + fn add_key_press(&mut self, press: KeyPress) -> Option; +} + #[derive(Debug, PartialEq)] pub enum WindowLikeType { LockScreen, diff --git a/src/bin/audio_player.rs b/src/bin/audio_player.rs index 2a67f25..223dd9c 100644 --- a/src/bin/audio_player.rs +++ b/src/bin/audio_player.rs @@ -3,8 +3,9 @@ use std::vec; use std::io::BufReader; use std::path::PathBuf; use std::collections::HashMap; +use std::io::Read; +use std::time::Duration; use std::fs::{ read_to_string, File }; -use std::time::{ Duration, SystemTime, UNIX_EPOCH }; use std::thread; use std::sync::{ Arc, Mutex }; @@ -144,14 +145,14 @@ impl WindowLike for AudioPlayer { } fn draw(&self, theme_info: &ThemeInfo) -> Vec { - let mut instructions = vec![DrawInstructions::Text([2, self.dimensions[1] - LINE_HEIGHT], vec!["nimbus-roman".to_string()], if self.command.len() > 0 { self.command.clone() } else { self.response.clone() }, theme_info.text, theme_info.background, None, None)]; + let fonts = ["nimbus-roman".to_string(), "shippori-mincho".to_string(), "linja-lipamanka".to_string()]; + let mut instructions = vec![DrawInstructions::Text([2, self.dimensions[1] - LINE_HEIGHT], fonts.to_vec(), if self.command.len() > 0 { self.command.clone() } else { self.response.clone() }, theme_info.text, theme_info.background, None, None)]; let internal_locked = self.internal.lock().unwrap(); let sink_len = internal_locked.sink.len(); if sink_len > 0 { let queue = &internal_locked.queue; let current = &queue[queue.len() - sink_len]; let current_name = current.0.file_name().unwrap().to_string_lossy().into_owned(); - let fonts = ["nimbus-roman".to_string(), "shippori-mincho".to_string()]; let cn_width = measure_text(&fonts, ¤t_name, None).width; instructions.push(DrawInstructions::Text([self.dimensions[0] / 2 - cn_width / 2, 2], fonts.to_vec(), current_name.clone(), theme_info.text, theme_info.background, Some(0), None)); if let Some(artist) = ¤t.2 { @@ -258,7 +259,10 @@ impl AudioPlayer { } else { get_all_files(PathBuf::from(new_path)) }; - let mut seed = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().subsec_millis(); + let mut urandom = File::open("/dev/urandom").unwrap(); + let mut seed = [0u8; 4]; + urandom.read_exact(&mut seed).unwrap(); + let mut seed = u32::from_be_bytes(seed.try_into().unwrap()); let mut q_weights: HashMap = HashMap::new(); for q in &queue { seed = random_u32(seed); diff --git a/src/bin/malvim.rs b/src/bin/malvim.rs index e48a447..700f997 100644 --- a/src/bin/malvim.rs +++ b/src/bin/malvim.rs @@ -232,37 +232,39 @@ impl WindowLike for Malvim { } else if self.state == State::Find || self.state == State::BackFind || key_press.key == ';' || key_press.key == ',' { let mut old_pos = current_file.cursor_pos; let find_char = if self.state == State::Find || self.state == State::BackFind { - key_press.key + Some(key_press.key) } else { - current_file.content[current_file.line_pos].chars().nth(old_pos).unwrap() + current_file.content[current_file.line_pos].chars().nth(old_pos) }; - for _ in 0..self.maybe_num.unwrap_or(1) { - let find_pos = if self.state == State::Find || key_press.key == ';' { - if old_pos < current_file.content[current_file.line_pos].chars().count() { - let found_index = current_file.content[current_file.line_pos].chars().skip(old_pos + 1).position(|c| c == find_char); - if let Some(found_index) = found_index { - old_pos + found_index + 1 + if let Some(find_char) = find_char { + for _ in 0..self.maybe_num.unwrap_or(1) { + let find_pos = if self.state == State::Find || key_press.key == ';' { + if old_pos < current_file.content[current_file.line_pos].chars().count() { + let found_index = current_file.content[current_file.line_pos].chars().skip(old_pos + 1).position(|c| c == find_char); + if let Some(found_index) = found_index { + old_pos + found_index + 1 + } else { + old_pos + } } else { old_pos } } else { - old_pos - } - } else { - //how does this work again? no idea - if old_pos != 0 { - let found_index = current_file.content[current_file.line_pos].chars().rev().skip(current_length - old_pos).position(|c| c == find_char); - if let Some(found_index) = found_index { - old_pos - found_index - 1 + //how does this work again? no idea + if old_pos != 0 { + let found_index = current_file.content[current_file.line_pos].chars().rev().skip(current_length - old_pos).position(|c| c == find_char); + if let Some(found_index) = found_index { + old_pos - found_index - 1 + } else { + old_pos + } } else { - old_pos + old_pos //0 } - } else { - old_pos //0 - } - }; - current_file.cursor_pos = find_pos; - old_pos = current_file.cursor_pos; + }; + current_file.cursor_pos = find_pos; + old_pos = current_file.cursor_pos; + } } changed = false; self.state = State::None; @@ -535,6 +537,7 @@ impl WindowLike for Malvim { for file_index in 0..self.files.len() { let file_info = &self.files[file_index]; let future_used_width = used_width + 4 + (file_info.name.len() + if file_info.changed { 2 } else { 0 }) * MONO_WIDTH as usize + 15; + //TODO: handle properly //just cut off when too many file tabs open to fit if future_used_width > self.dimensions[0] { break; @@ -570,7 +573,7 @@ impl WindowLike for Malvim { let x1 = current.line_num_width + PADDING * 2; //write actual line //line.2 - instructions.push(DrawInstructions::Text([x1, y0], vec!["nimbus-romono".to_string()], line.2.clone(), theme_info.alt_text, theme_info.alt_background, Some(0), Some(MONO_WIDTH))); + instructions.push(DrawInstructions::Text([x1, y0], vec!["nimbus-romono".to_string(), "linja-lipamanka".to_string()], line.2.clone(), theme_info.alt_text, theme_info.alt_background, Some(0), Some(MONO_WIDTH))); sub_line_num += 1; let max = sub_line_num * current.max_chars_per_line; let min = max - current.max_chars_per_line; @@ -580,7 +583,7 @@ impl WindowLike for Malvim { instructions.push(DrawInstructions::Rect(top_left, [MONO_WIDTH as usize, LINE_HEIGHT], theme_info.top)); //draw the char over it if line.2.len() > 0 { - instructions.push(DrawInstructions::Text(top_left, vec!["nimbus-romono".to_string()], line.2.chars().nth(current_file.cursor_pos - min).unwrap().to_string(), theme_info.top_text, theme_info.top, Some(0), Some(MONO_WIDTH))); + instructions.push(DrawInstructions::Text(top_left, vec!["nimbus-romono".to_string(), "linja-lipamanka".to_string()], line.2.chars().nth(current_file.cursor_pos - min).unwrap().to_string(), theme_info.top_text, theme_info.top, Some(0), Some(MONO_WIDTH))); } } } @@ -596,7 +599,7 @@ impl WindowLike for Malvim { instructions.push(DrawInstructions::Text([self.dimensions[0] - file_status.len() * (MONO_WIDTH as usize), self.dimensions[1] - BAND_HEIGHT * 2 + 2], vec!["nimbus-romono".to_string()], file_status, theme_info.top_text, theme_info.top, Some(0), Some(MONO_WIDTH))); //write command or bottom message if self.mode == Mode::Command { - instructions.push(DrawInstructions::Text([0, self.dimensions[1] - BAND_HEIGHT + 2], vec!["nimbus-romono".to_string()], ":".to_string() + &self.command.clone().unwrap_or("".to_string()), theme_info.top_text, theme_info.alt_background, Some(0), Some(MONO_WIDTH))); + instructions.push(DrawInstructions::Text([0, self.dimensions[1] - BAND_HEIGHT + 2], vec!["nimbus-romono".to_string(), "linja-lipamanka".to_string()], ":".to_string() + &self.command.clone().unwrap_or("".to_string()), theme_info.top_text, theme_info.alt_background, Some(0), Some(MONO_WIDTH))); } else if self.mode == Mode::Normal && self.bottom_message.is_some() { instructions.push(DrawInstructions::Text([0, self.dimensions[1] - BAND_HEIGHT + 2], vec!["nimbus-romono".to_string()], self.bottom_message.clone().unwrap(), theme_info.top_text, theme_info.alt_background, Some(0), Some(MONO_WIDTH))); } diff --git a/wm/src/essential/lock_screen.rs b/wm/src/essential/lock_screen.rs index 9469e62..8ea570e 100644 --- a/wm/src/essential/lock_screen.rs +++ b/wm/src/essential/lock_screen.rs @@ -51,11 +51,11 @@ impl WindowLike for LockScreen { fn draw(&self, _theme_info: &ThemeInfo) -> Vec { vec![ DrawInstructions::Rect([0, 0], self.dimensions, [0, 0, 0]), - DrawInstructions::Text([4, 4], vec!["nimbus-roman".to_string()], self.lines[0].clone(), [255, 255, 255], [0, 0, 0], None, None), + DrawInstructions::Text([4, 4], vec!["nimbus-roman".to_string(), "shippori-mincho".to_string(), "linja-lipamanka".to_string()], self.lines[0].clone(), [255, 255, 255], [0, 0, 0], None, None), //He is my brother. - DrawInstructions::Text([4, 4 + 16], vec!["nimbus-roman".to_string()], self.lines[1].clone(), [255, 255, 255], [0, 0, 0], None, None), + DrawInstructions::Text([4, 4 + 16], vec!["nimbus-roman".to_string(), "shippori-mincho".to_string(), "linja-lipamanka".to_string()], self.lines[1].clone(), [255, 255, 255], [0, 0, 0], None, None), //But I must kill him and keep strong to do it. - DrawInstructions::Text([4, 4 + 16 * 2], vec!["nimbus-roman".to_string()], self.lines[2].clone(), [255, 255, 255], [0, 0, 0], None, None), + DrawInstructions::Text([4, 4 + 16 * 2], vec!["nimbus-roman".to_string(), "shippori-mincho".to_string(), "linja-lipamanka".to_string()], self.lines[2].clone(), [255, 255, 255], [0, 0, 0], None, None), DrawInstructions::Text([4, 4 + 16 * 3], vec!["nimbus-roman".to_string()], "Password: ".to_string(), [255, 255, 255], [0, 0, 0], None, None), DrawInstructions::Text([80, 4 + 16 * 3], vec!["nimbus-roman".to_string()], "*".repeat(self.input_password.len()), [255, 255, 255], [0, 0, 0], None, None), ] @@ -84,6 +84,16 @@ impl LockScreen { "\"Yellow,\" he thought, and stomped off back to his bedroom to get dressed.".to_string(), "He stared at it.".to_string() ], + [ + "\"󱥉󱥶󱤧󱥔󱥩󱤴\"".to_string(), + "\"󱤟󱥍󱤻󱥛\"".to_string(), + "\"󱥁󱤧󱥊󱥶\"".to_string() + ], + [ + "安心".to_string(), + "アンコール".to_string(), + "ワット".to_string(), + ], ]; let rand_index = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs() as usize % possible_lines.len(); Self { diff --git a/wm/src/essential/workspace_indicator.rs b/wm/src/essential/workspace_indicator.rs index 15dbf86..6d0b64d 100644 --- a/wm/src/essential/workspace_indicator.rs +++ b/wm/src/essential/workspace_indicator.rs @@ -3,7 +3,7 @@ use std::vec::Vec; use std::time::{ SystemTime, UNIX_EPOCH }; use ming_wm_lib::window_manager_types::{ DrawInstructions, WindowLike, WindowLikeType, INDICATOR_HEIGHT }; -use ming_wm_lib::messages::{ WindowMessage, WindowMessageResponse, ShortcutType }; +use ming_wm_lib::messages::{ WindowMessage, WindowMessageResponse, ShortcutType, InfoType }; use ming_wm_lib::framebuffer_types::Dimensions; use ming_wm_lib::themes::ThemeInfo; @@ -15,6 +15,8 @@ const ONE_DAY: u64 = 24 * ONE_HOUR; pub struct WorkspaceIndicator { dimensions: Dimensions, current_workspace: u8, + im_abbr: String, + im_buffer: String, } impl WindowLike for WorkspaceIndicator { @@ -33,6 +35,15 @@ impl WindowLike for WorkspaceIndicator { _ => WindowMessageResponse::DoNothing, } }, + WindowMessage::Info(info) => { + if let InfoType::InputMethod(im_abbr, im_buffer) = info { + self.im_abbr = im_abbr; + self.im_buffer = im_buffer; + WindowMessageResponse::JustRedraw + } else { + WindowMessageResponse::DoNothing + } + }, _ => WindowMessageResponse::DoNothing, } } @@ -53,6 +64,14 @@ impl WindowLike for WorkspaceIndicator { instructions.push(DrawInstructions::Text([w * WIDTH + 5, 4], vec!["nimbus-roman".to_string()], (w + 1).to_string(), theme_info.text, theme_info.background, None, None)); } } + //input method and buffer + let im_buffer = if self.im_buffer.len() > 6 { + self.im_buffer[0..6].to_string() + "..." + } else { + self.im_buffer.clone() + }; + let im_info = format!("{}: {}", self.im_abbr, im_buffer); + instructions.push(DrawInstructions::Text([self.dimensions[0] - 200, 4], vec!["nimbus-roman".to_string()], im_info, theme_info.text, theme_info.background, None, None)); //also add the utc time in the right edge let today_secs = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs() % ONE_DAY; let hours = (today_secs / ONE_HOUR).to_string(); @@ -73,10 +92,12 @@ impl WindowLike for WorkspaceIndicator { } impl WorkspaceIndicator { - pub fn new() -> Self { + pub fn new(im_abbr: String) -> Self { Self { dimensions: [0, 0], current_workspace: 0, + im_abbr, + im_buffer: String::new(), } } } diff --git a/wm/src/framebuffer.rs b/wm/src/framebuffer.rs index 0b4a811..1bf6829 100644 --- a/wm/src/framebuffer.rs +++ b/wm/src/framebuffer.rs @@ -16,6 +16,8 @@ fn color_with_alpha(color: RGBColor, bg_color: RGBColor, alpha: u8) -> RGBColor //255 * 255 < max(u16) if alpha == 255 { color + } else if alpha == 0 { + bg_color } else { let alpha = alpha as u16; [ @@ -128,7 +130,7 @@ impl FramebufferWriter { } } - pub fn draw_char(&mut self, top_left: Point, char_info: &FontCharInfo, color: RGBColor, bg_color: RGBColor) { + fn _draw_char(&mut self, top_left: Point, char_info: &FontCharInfo, color: RGBColor, bg_color: RGBColor) { let mut start_pos; for row in 0..char_info.height { start_pos = ((top_left[1] + row + char_info.top_offset as usize) * self.info.stride + top_left[0]) * self.info.bytes_per_pixel; @@ -238,7 +240,7 @@ impl FramebufferWriter { } else { add_after = char_width + horiz_spacing; } - self.draw_char(top_left, &char_info, color, bg_color); + self._draw_char(top_left, &char_info, color, bg_color); top_left[0] += add_after; } } diff --git a/wm/src/input_method/lat.rs b/wm/src/input_method/lat.rs new file mode 100644 index 0000000..c42b5f5 --- /dev/null +++ b/wm/src/input_method/lat.rs @@ -0,0 +1,19 @@ +use ming_wm_lib::window_manager_types::InputMethod; +use ming_wm_lib::messages::KeyPress; + +pub struct Lat {} + +impl InputMethod for Lat { + fn abbr(&self) -> [char; 3] { + ['L', 'A', 'T'] + } + + fn internal_buffer(&self) -> String { + String::new() + } + + fn add_key_press(&mut self, kp: KeyPress) -> Option { + //everything goes + Some(kp.key) + } +} diff --git a/wm/src/input_method/mod.rs b/wm/src/input_method/mod.rs new file mode 100644 index 0000000..7499025 --- /dev/null +++ b/wm/src/input_method/mod.rs @@ -0,0 +1,2 @@ +pub mod lat; +pub mod tok; diff --git a/wm/src/input_method/tok.rs b/wm/src/input_method/tok.rs new file mode 100644 index 0000000..66f3926 --- /dev/null +++ b/wm/src/input_method/tok.rs @@ -0,0 +1,193 @@ +use std::collections::HashMap; + +use ming_wm_lib::window_manager_types::InputMethod; +use ming_wm_lib::messages::KeyPress; + +const TOK_CHARSET: [char; 14] = ['m', 'n', 'i', 'u', 'p', 't', 'k', 'e', 'o', 's', 'a', 'w', 'l', 'j']; + +pub struct Tok { + mapping: HashMap, + buffer: String, +} + +impl InputMethod for Tok { + fn abbr(&self) -> [char; 3] { + ['T', 'O', 'K'] + } + + fn internal_buffer(&self) -> String { + self.buffer.clone() + } + + fn add_key_press(&mut self, kp: KeyPress) -> Option { + if kp.is_enter() || kp.is_backspace() { + if self.buffer == String::new() { + //^if no buffer, enter or backspace key should be passed through + Some(kp.key) + } else { + if kp.is_enter() { + if let Some(ret_c) = self.mapping.get(&self.buffer.to_lowercase()) { + //^look up in table to see if buffer matches, if so, return + self.buffer = String::new(); + return Some(*ret_c); + } + } + //else, just clear buffer + self.buffer = String::new(); + None + } + } else if TOK_CHARSET.contains(&kp.key) { + self.buffer += &kp.key.to_string(); + None + } else { + //pass through stuff not in tp charset + Some(kp.key) + } + } +} + +impl Tok { + pub fn new() -> Self { + let mapping = HashMap::from([ + ("pali".to_string(), '󱥉'), + ("weka".to_string(), '󱥶'), + ("li".to_string(), '󱤧'), + ("pona".to_string(), '󱥔'), + ("tawa".to_string(), '󱥩'), + ("mi".to_string(), '󱤴'), + ("kulupu".to_string(), '󱤟'), + ("pi".to_string(), '󱥍'), + ("musi".to_string(), '󱤻'), + ("sijelo".to_string(), '󱥛'), + ("ni".to_string(), '󱥁'), + ("palisa".to_string(), '󱥊'), + ("a".to_string(), '󱤀'), + ("akesi".to_string(), '󱤁'), + ("ala".to_string(), '󱤂'), + ("alasa".to_string(), '󱤃'), + ("ali".to_string(), '󱤄'), + ("ale".to_string(), '󱤄'), + ("anpa".to_string(), '󱤅'), + ("ante".to_string(), '󱤆'), + ("anu".to_string(), '󱤇'), + ("awen".to_string(), '󱤈'), + ("e".to_string(), '󱤉'), + ("en".to_string(), '󱤊'), + ("esun".to_string(), '󱤋'), + ("ijo".to_string(), '󱤌'), + ("ike".to_string(), '󱤍'), + ("ilo".to_string(), '󱤎'), + ("insa".to_string(), '󱤏'), + ("jaki".to_string(), '󱤐'), + ("jan".to_string(), '󱤑'), + ("jelo".to_string(), '󱤒'), + ("jo".to_string(), '󱤓'), + ("kala".to_string(), '󱤔'), + ("kalama".to_string(), '󱤕'), + ("kama".to_string(), '󱤖'), + ("kasi".to_string(), '󱤗'), + ("ken".to_string(), '󱤘'), + ("kepeken".to_string(), '󱤙'), + ("kili".to_string(), '󱤚'), + ("kiwen".to_string(), '󱤛'), + ("ko".to_string(), '󱤜'), + ("kon".to_string(), '󱤝'), + ("kule".to_string(), '󱤞'), + ("kute".to_string(), '󱤠'), + ("la".to_string(), '󱤡'), + ("lape".to_string(), '󱤢'), + ("laso".to_string(), '󱤣'), + ("lawa".to_string(), '󱤤'), + ("len".to_string(), '󱤥'), + ("lete".to_string(), '󱤦'), + ("lili".to_string(), '󱤨'), + ("linja".to_string(), '󱤩'), + ("lipu".to_string(), '󱤪'), + ("loje".to_string(), '󱤫'), + ("lon".to_string(), '󱤬'), + ("luka".to_string(), '󱤭'), + ("lukin".to_string(), '󱤮'), + ("lupa".to_string(), '󱤯'), + ("ma".to_string(), '󱤰'), + ("mama".to_string(), '󱤱'), + ("mani".to_string(), '󱤲'), + ("meli".to_string(), '󱤳'), + ("mije".to_string(), '󱤵'), + ("moku".to_string(), '󱤶'), + ("moli".to_string(), '󱤷'), + ("monsi".to_string(), '󱤸'), + ("mu".to_string(), '󱤹'), + ("mun".to_string(), '󱤺'), + ("mute".to_string(), '󱤼'), + ("nanpa".to_string(), '󱤽'), + ("nasa".to_string(), '󱤾'), + ("nasin".to_string(), '󱤿'), + ("nena".to_string(), '󱥀'), + ("ni".to_string(), '󱥁'), + ("nimi".to_string(), '󱥂'), + ("noka".to_string(), '󱥃'), + ("o".to_string(), '󱥄'), + ("olin".to_string(), '󱥅'), + ("ona".to_string(), '󱥆'), + ("open".to_string(), '󱥇'), + ("pakala".to_string(), '󱥈'), + ("pan".to_string(), '󱥋'), + ("pana".to_string(), '󱥌'), + ("pilin".to_string(), '󱥎'), + ("pimeja".to_string(), '󱥏'), + ("pini".to_string(), '󱥐'), + ("pipi".to_string(), '󱥑'), + ("poka".to_string(), '󱥒'), + ("poki".to_string(), '󱥓'), + ("pu".to_string(), '󱥕'), + ("sama".to_string(), '󱥖'), + ("seli".to_string(), '󱥗'), + ("selo".to_string(), '󱥘'), + ("seme".to_string(), '󱥙'), + ("sewi".to_string(), '󱥚'), + ("sike".to_string(), '󱥜'), + ("sin".to_string(), '󱥝'), + ("sina".to_string(), '󱥞'), + ("sinpin".to_string(), '󱥟'), + ("sitelen".to_string(), '󱥠'), + ("sona".to_string(), '󱥡'), + ("soweli".to_string(), '󱥢'), + ("suli".to_string(), '󱥣'), + ("suno".to_string(), '󱥤'), + ("supa".to_string(), '󱥥'), + ("suwi".to_string(), '󱥦'), + ("tan".to_string(), '󱥧'), + ("taso".to_string(), '󱥨'), + ("telo".to_string(), '󱥪'), + ("tenpo".to_string(), '󱥫'), + ("toki".to_string(), '󱥬'), + ("tomo".to_string(), '󱥭'), + ("tu".to_string(), '󱥮'), + ("unpa".to_string(), '󱥯'), + ("uta".to_string(), '󱥰'), + ("utala".to_string(), '󱥱'), + ("walo".to_string(), '󱥲'), + ("wan".to_string(), '󱥳'), + ("waso".to_string(), '󱥴'), + ("wawa".to_string(), '󱥵'), + ("wile".to_string(), '󱥷'), + ("namako".to_string(), '󱥸'), + ("kin".to_string(), '󱥹'), + ("oko".to_string(), '󱥺'), + ("kipisi".to_string(), '󱥻'), + ("leko".to_string(), '󱥼'), + ("monsuta".to_string(), '󱥽'), + ("tonsi".to_string(), '󱥾'), + ("kijetesantakalu".to_string(), '󱦀'), + ("soko".to_string(), '󱦁'), + ("meso".to_string(), '󱦂'), + ("n".to_string(), '󱦆'), + ("misikeke".to_string(), '󱦇'), + // + ]); + Self { + mapping, + buffer: String::new(), + } + } +} diff --git a/wm/src/lib.rs b/wm/src/lib.rs index e927891..4025bc3 100644 --- a/wm/src/lib.rs +++ b/wm/src/lib.rs @@ -5,4 +5,5 @@ pub mod window_manager; pub mod fs; mod proxy_window_like; mod essential; +mod input_method; diff --git a/wm/src/window_manager.rs b/wm/src/window_manager.rs index 7b9703f..ff0acaa 100644 --- a/wm/src/window_manager.rs +++ b/wm/src/window_manager.rs @@ -25,6 +25,8 @@ use crate::essential::start_menu::StartMenu; use crate::essential::about::About; use crate::essential::help::Help; use crate::essential::onscreen_keyboard::OnscreenKeyboard; +use crate::input_method::lat::Lat; +use crate::input_method::tok::Tok; //todo: a lot of the usize should be changed to u16 @@ -52,7 +54,6 @@ impl fmt::Debug for WindowLikeInfo { } } - pub struct WindowManager { writer: RefCell, rotate: bool, @@ -65,6 +66,8 @@ pub struct WindowManager { focused_id: usize, pub locked: bool, current_workspace: u8, + im_list: Vec>, + current_im: usize, framebuffer: Framebuffer, clipboard: Option, version: String, @@ -88,6 +91,8 @@ impl WindowManager { focused_id: 0, locked: false, current_workspace: 0, + im_list: vec![Box::new(Lat {}), Box::new(Tok::new())], + current_im: 0, framebuffer, clipboard: None, version, @@ -151,7 +156,9 @@ impl WindowManager { self.window_infos = Vec::new(); self.add_window_like(Box::new(DesktopBackground::new()), [0, INDICATOR_HEIGHT], None); self.add_window_like(Box::new(Taskbar::new()), [0, self.dimensions[1] - TASKBAR_HEIGHT], None); - self.add_window_like(Box::new(WorkspaceIndicator::new()), [0, 0], None); + let current_im = &self.im_list[self.current_im]; + self.add_window_like(Box::new(WorkspaceIndicator::new(current_im.abbr().iter().collect() + )), [0, 0], None); } fn change_theme(&mut self) { @@ -194,6 +201,24 @@ impl WindowManager { self.window_infos[taskbar_index].window_like.handle_message(message); } + fn im_update(&mut self, old_buffer: Option) -> bool { + let current_im = &self.im_list[self.current_im]; + let indicator_index = self.window_infos.iter().position(|w| w.window_like.subtype() == WindowLikeType::WorkspaceIndicator); + //no window indicator on lockscreen + if let Some(indicator_index) = indicator_index { + let current_buffer = current_im.internal_buffer(); + //if old_buffer is None, force sending message + if old_buffer.is_none() || current_buffer != old_buffer.unwrap_or_default() { + self.window_infos[indicator_index].window_like.handle_message(WindowMessage::Info(InfoType::InputMethod(current_im.abbr().iter().collect(), current_buffer))); + true + } else { + false + } + } else { + false + } + } + fn move_index_to_top(&mut self, index: usize) { let removed = self.window_infos.remove(index); self.window_infos.push(removed); @@ -238,6 +263,8 @@ impl WindowManager { //shrink window size ('N', ShortcutType::ChangeWindowSize(Direction::Left)), ('M', ShortcutType::ChangeWindowSize(Direction::Up)), + // + (' ', ShortcutType::NextInputMethod), //no 10th workspace ('1', ShortcutType::SwitchWorkspace(0)), ('2', ShortcutType::SwitchWorkspace(1)), @@ -383,6 +410,16 @@ impl WindowManager { } } }, + &ShortcutType::NextInputMethod => { + let im_count = self.im_list.len(); + if self.current_im + 1 == im_count { + self.current_im = 0; + } else { + self.current_im += 1; + } + self.im_update(None); + press_response = WindowMessageResponse::JustRedraw; + }, &ShortcutType::SwitchWorkspace(workspace) => { if self.current_workspace != workspace { //close start menu if open @@ -527,17 +564,32 @@ impl WindowManager { let mut press_response = WindowMessageResponse::DoNothing; //send to focused window if let Some(focused_index) = self.get_focused_index() { - press_response = self.window_infos[focused_index].window_like.handle_message(if key_char == KeyChar::Press(c) { - WindowMessage::KeyPress(KeyPress { + if key_char == KeyChar::Ctrl(c) { + press_response = self.window_infos[focused_index].window_like.handle_message(WindowMessage::CtrlKeyPress(KeyPress { key: c, - }) + })); + redraw_ids = Some(vec![self.window_infos[focused_index].id]); } else { - WindowMessage::CtrlKeyPress(KeyPress { - key: c, - }) - }); - //at most, only the focused window needs to be redrawed - redraw_ids = Some(vec![self.window_infos[focused_index].id]); + let old_buffer = self.im_list[self.current_im].internal_buffer().clone(); + //need to send the key to the input method + if let Some(ret_c) = self.im_list[self.current_im].add_key_press(KeyPress { key: c }) { + press_response = self.window_infos[focused_index].window_like.handle_message(WindowMessage::KeyPress(KeyPress { + key: ret_c, + })); + } + redraw_ids = Some(vec![self.window_infos[focused_index].id]); + let wi_updated = self.im_update(Some(old_buffer)); + if wi_updated { + //ideally, make redraw_ids the focused window and the workspace indicator, + //but that doesn't work for some reason + if press_response == WindowMessageResponse::DoNothing { + press_response = WindowMessageResponse::JustRedraw; + redraw_ids = None; + } + } else { + redraw_ids = Some(vec![self.window_infos[focused_index].id]); + } + } //requests can result in window openings and closings, etc if press_response != WindowMessageResponse::JustRedraw { redraw_ids = None;