From 7ac6915202bb8bfb18c859042d70bb2886c778bc Mon Sep 17 00:00:00 2001 From: "Peter D. Gray" Date: Thu, 11 Jan 2024 10:29:07 -0500 Subject: [PATCH] add function keycaps --- misc/q1font/font_iosevka.py | 8 +++++++- misc/q1font/render.py | 17 ++++++++++++----- misc/q1font/sample.png | Bin 6720 -> 6951 bytes 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/misc/q1font/font_iosevka.py b/misc/q1font/font_iosevka.py index 3d71237e..7069769b 100644 --- a/misc/q1font/font_iosevka.py +++ b/misc/q1font/font_iosevka.py @@ -28,7 +28,7 @@ BYTES_PER_CHAR = const(99) #SPECIAL_CHARS = ['→', '←', '↳', '•', '⋯', '█', '▌', '▐', '▼', '▲', '▶', '◀', '⏵', '₿', '✔', '✓', '↦', '␣', '◉', '◯', '◌', '⬚', '░', '™', '©', '⬧', '※', '─', '—', '━', '┃', '┓', '┏', '┛', '┗'] class FontIosevka: - DOUBLE_WIDE = ['⋯', '✔', '✓', '→', '←', '↦', '◉', '◯', '◌', '※', '•', '—', '\x0e', '\x11', '\t'] + DOUBLE_WIDE = ['⋯', '✔', '✓', '→', '←', '↦', '◉', '◯', '◌', '※', '•', '—', '\x0e', '\x11', '\t', '\x0f', '\x12', '\x13', '\x14', '\x16', '\x17'] @classmethod def lookup(cls, cp): @@ -172,4 +172,10 @@ class FontIosevka: '\x0e': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf6\xf1\x8d\x01\xff\xfd\x0b\xfdO\xf6\xf6\x8d\x01\xf73_\\\xcf\xf6\xfb\x8d\x01\xf5\x00~\x01/\xf6\xed\x9d\x01\xff\xf4~\x00\x0f\xf6\xf9\xcd\x01\xf71~\x00\x0f\xf6\xf3\xfd\x01\xf5\x00~\x01/\xf6\xf0\xdd\x01\xf5\x00_\\\xcf\xf6\xf0\x8d\x01\xf5\x00\x0b\xfdO\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\x00', '\x11': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\xaf\xd4\x06\xff\xd4\x00\x0f\xf0\x05\xf5\xbd\x06\xf3\xbc\x00\x0f\xf0\x07\xe0~\x06\xf0~\x00\x0f\xf0\x07\xe0~\x06\xf0\xad\x00\x0f\xf0\x07\xe0~\x06\xff\xf6\x00\x0f\xf0\x07\xe0~\x06\xf9\xe1\x00\x0f\xf0\x07\xe1\x8e\x06\xf1\xe7\x00\x0f\xf0\x02\xed\xe9\x06\xf0\x9d\x00\x0f\xf0\x00-\xc0\x00\x00\x00\x00\x0f\xf0\x00\x07\xfa\x00\x00\x00\x00\x0f\xf0\x00\x00"\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\x00', '\t': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x0e \x00\x00\x83\x00\x00\x0f\xf0\x0e \x00\x00-\x10\x00\x0f\xf0\x0e \x00\x00\x05\xc0\x00\x0f\xf0\x0e\xff\xff\xff\xff\xf6\x00\x0f\xf0\x0eC339\x90\x00\x0f\xf0\x0e \x00\x00f\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\x00', + '\x0f': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x01\xff\xfd\x00N\xc0\x00\x0f\xf0\x01\xf73\x03\xdc\xc0\x00\x0f\xf0\x01\xf5\x00\x00\n\xc0\x00\x0f\xf0\x01\xff\xf4\x00\n\xc0\x00\x0f\xf0\x01\xf71\x00\n\xc0\x00\x0f\xf0\x01\xf5\x00\x00\n\xc0\x00\x0f\xf0\x01\xf5\x00\x00\n\xc0\x00\x0f\xf0\x01\xf5\x00\x00\n\xc0\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\x00', + '\x12': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x01\xff\xfd\x00\xaf\xd4\x00\x0f\xf0\x01\xf73\x05\xf5\xcc\x00\x0f\xf0\x01\xf5\x00\x01 \x8d\x00\x0f\xf0\x01\xff\xf4\x00\x01\xd9\x00\x0f\xf0\x01\xf71\x00-\xb1\x00\x0f\xf0\x01\xf5\x00\x00\xdc\x00\x00\x0f\xf0\x01\xf5\x00\x04\xf63\x00\x0f\xf0\x01\xf5\x00\x06\xff\xfd\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\x00', + '\x13': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x01\xff\xfd\x00\xaf\xd4\x00\x0f\xf0\x01\xf73\x03\xe6\xbc\x00\x0f\xf0\x01\xf5\x00\x00\x00\xbc\x00\x0f\xf0\x01\xff\xf4\x00\x0b\xf4\x00\x0f\xf0\x01\xf71\x00\x02\xcc\x00\x0f\xf0\x01\xf5\x00\x020o\x00\x0f\xf0\x01\xf5\x00\x06\xf5\xad\x00\x0f\xf0\x01\xf5\x00\x00\xaf\xd5\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\x00', + '\x14': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x01\xff\xfd\x00\x06\xe1\x00\x0f\xf0\x01\xf73\x00\r\x90\x00\x0f\xf0\x01\xf5\x00\x00_ \x00\x0f\xf0\x01\xff\xf4\x00\xcb\xf5\x00\x0f\xf0\x01\xf71\x04\xf4\xf5\x00\x0f\xf0\x01\xf5\x00\x07\xff\xfd\x00\x0f\xf0\x01\xf5\x00\x014\xf7\x00\x0f\xf0\x01\xf5\x00\x00\x01\xf5\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\x00', + '\x16': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x01\xff\xfd\x05\xff\xfb\x00\x0f\xf0\x01\xf73\x05\xf42\x00\x0f\xf0\x01\xf5\x00\x05\xff\xd3\x00\x0f\xf0\x01\xff\xf4\x05\xf7\xcc\x00\x0f\xf0\x01\xf71\x01@~\x00\x0f\xf0\x01\xf5\x00\x01@~\x00\x0f\xf0\x01\xf5\x00\x03\xf6\xcc\x00\x0f\xf0\x01\xf5\x00\x00\x9f\xd3\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\x00', + '\x17': b'\x00\x0f\xff\xff\xff\xff\xff\xf0\x00\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x01\xff\xfd\x00\x0c\xc0\x00\x0f\xf0\x01\xf73\x00O@\x00\x0f\xf0\x01\xf5\x00\x00\xcc\x00\x00\x0f\xf0\x01\xff\xf4\x02\xff\xd4\x00\x0f\xf0\x01\xf71\x06\xf5\xbc\x00\x0f\xf0\x01\xf5\x00\x07\xe0~\x00\x0f\xf0\x01\xf5\x00\x04\xf5\xbc\x00\x0f\xf0\x01\xf5\x00\x00\x9f\xd4\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x00\x0f\x0f\x00\x00\x00\x00\x00\x00\x00\xf0\x0f\xf0\x00\x00\x00\x00\x00\x0f\xf0\x00\x0f\xff\xff\xff\xff\xff\xf0\x00', } diff --git a/misc/q1font/render.py b/misc/q1font/render.py index 12a1eb88..e2f7dd63 100755 --- a/misc/q1font/render.py +++ b/misc/q1font/render.py @@ -30,8 +30,15 @@ NUM_GREYS = 16 KEY_NFC = '\x0e' # ctrl-N KEY_QR = '\x11' # ctrl-Q KEY_TAB = '\t' # tab = ctrl-I +KEY_F1 = '\x0f' +KEY_F2 = '\x12' +KEY_F3 = '\x13' +KEY_F4 = '\x14' +KEY_F5 = '\x16' +KEY_F6 = '\x17' +KEYS_FUNCTION = KEY_F1 + KEY_F2 + KEY_F3 + KEY_F4 + KEY_F5 + KEY_F6 -KEYCAP_SYMBOLS = [ KEY_NFC, KEY_QR, KEY_TAB, ] +KEYCAP_SYMBOLS = [ KEY_NFC, KEY_QR, KEY_TAB ] + list(KEYS_FUNCTION) # TODO: # - needed _ but for blank space; never found one, and may not need anyway @@ -45,14 +52,12 @@ CHARSET = [chr(x) for x in range(32,127)] \ '™', '©', '⬧', '※', '─', '—', '━', '┃', '┓', '┏', '┛','┗', # 'heavy' versions - KEY_NFC, KEY_QR, KEY_TAB, - ] + ] + KEYCAP_SYMBOLS # these are be better as double-wide chars DBL_WIDTH = ['⋯', '✔', '✓','→', '←', '↦', '◉', '◯', '◌', '※', '•', '—', - KEY_NFC, KEY_QR, KEY_TAB, - ] + ] + KEYCAP_SYMBOLS NUM_CHARS = len(CHARSET) @@ -63,6 +68,8 @@ REMAPS = { KEY_QR: 'QR', KEY_TAB: '↦', } +for n, fn in enumerate(KEYS_FUNCTION): + REMAPS[fn] = f'F{n+1}' # find hidden zero-width junk assert all(len(ch) == 1 for ch in CHARSET), [ch for ch in CHARSET if len(ch) > 1] diff --git a/misc/q1font/sample.png b/misc/q1font/sample.png index 4ec0ed3cca00a7ff83d514b8187e68058e4e09ee..074d50998ff1a4609660813cbb7e7ad8f912f4b5 100644 GIT binary patch literal 6951 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�&cj8S0;#4Zz zif+g2(fQiJ4&Z&70+r(9?#>Xa5MxJDeA7r)i6G0NStX+Ef{92cuIswa#kMmMi80be z!n~aPy$^9bJzJ(2l+C2H8@u+0b*qTD%X}+M;a!tl#sYEE@I;8mF{~hNL|SM?n(+5t z#Qvp(MY3g45g7*%5SuWo^Uj~yC`C$Ik$8kifT95~F)Yn;RyPlv)p5qO>$BQ_31Ra0 ze#Du-WU{=x;!2@(GsGrIu1d04x0dvBOaxHYDoD|%7Kp1=$yJY%t6oE_>`}?Jr27%m z__&%&YBU16nIJYy5a;0@i-<%uJB*-hDeX9dDdOV6s}lfbCO4M34@In;QwIe{OGMs9 z#D;`8cOk~D5fMoN-s1>tJ^F;q5qk~f0I?oxFEx-c`DBRwTDF+b(>_WklBQ|2*~ZnW znB3wt0`2TQqxy-x=9BM_ClsS1#a!J=3Mdi~myg^ZzXZf%DqrDEQ(=GnD8w&iC*jHd zf<9gr;`^x1huP_epP_#j;-{cL5Ah#uy?va_pR|%2pixKU?Mc1eo14j9(T2v{m>TIB zX0^^*sOkaJxvuWG%MbQ9&@&(|YB2pC+Bdvub+%nErW*yII=|Hkp=F+*PC~4!PNefH z=t#CG>`LLX0i8ARXJ7Y#s-3tLP1MtNddT-6INbBm!IMx}=WG#JUi)>n$g;w^V&r+- z8ATb&DU?!5DZ~IZkPA5S*0n~kHY2lk)>}4Ffw3<8MbGiFjA)w0aB@mK4zUnRMgby^Qq**5l)kJ@f7 z`6;s6r%Cp6xH!`k3aVWdjH2V~Bbd~B!x?SY$p{zOT zKsNl)z>i@vK;Mx9Hj(w5+Wvjd@n{-^G^_7=j-kjvRnwNMFsmyGR&||Le<|Z*{FBe| zTIvwn9kN>aA1cb~T-4aB3X)v27=s*F@nMR%y*ffyUtV;g&! zT5+rHm2VJ=FI&X zNTtGlaoY1t%hWpL=27WtT>dK&JJIOTv+h8zZn^+D>zc9Wvam&AlU`jHbz2l|U5E~g zQ#tK9?j+`;9u@0HXqi8SSY&=;f6+@Vbp~1Z!s`jP-3l<~h<1=t+Qr~fpsdp`2r+pp zA`%=a?nmr5636tRn9^PN^0)ubcKX*K{tI4lA6Xj%QJq4@_Nbz|x7?5EcMFEYlX%ZX zr(V}nc@h_=`|k1Gt=yOU^Y{4atv;rKq8(1u`F=h9dDh#%*v#k92IR%_9z%bHMicp8 zFP--YI)ix=o7sOamiP0tIlN}F((X&+J%awcH*Nn%{NJZDC`45qN<=!^Oa7S!?lH z8U$l@m4%uj_Wfpj`W*TJp-<*@rxRxr-n5f~U9Jd!De9=nPP|8NkK6 z{Yn8jpTxH5{AKzwJ7&LD@8aDa^tbQTLAi3b3`)1~G41ng{d#)Ee{k1UP7rebP`I7fD zBvJ@ba?whcdugFv=V}U}9;MH+=G~I35Wl9($~FGuyYssK{~51dkz94~%Y7Uj*Q@o{ zANi8ER_?d(9zn--uKs%4Jg)7RNq6m?Cf2Ed(PZ}D zi{<@1{RNw)<&2lldj$P?*4sy4vgfBKz9)aA4df4_v-EM+lPP|C>p1zCxu;MTKTH5L z;oN5#KVMYD#1qpqAkO9FHsi-9P_1~xrHF_W@t9um*qy_Yo(1vg_c(px3@f!q+(|DGyipoy3Kv$r{_Z)BiA|+5pmNvvuS`Sl5H$JiESIH z5jfcKpQINahn)09m)~OP-h}h~K}fX@fI^4=Ov0GYgE7Y*U!q#5s{dNZdQ4- z>vh{W6NVr8Yyn6Gi&PM%0x=bYsleO{LRVn8g3uK#T|wvy7OG(73dmFdb}-)$TzC;> z%dwrrn{UpE1L6J>;9xKq3^&5>M)JFb&UgeFF^|dqWKzbcXRq{8h)*ZeDL{25#Z zbS=f@`S45~8fk&Jkp=)G4krdM($IvlRVV;$#cHgSK-r1azHBRPtfs!y1yJbAI!5WO zest#wb^xZ6_~;su41lVWt^(hK5CS6>pc4@ZNVG@};6y~kv7GB3u_VNj5DU5!kxnDE zh}1YyLM9?&eOZrKfKsFci2(##)lygXk?)<80>Oxgh(S=Th-4sCA|g^E6e$!6APKPm zwOBwBVmXSqqgxiRpdh0K_Pi^g54nff)0-jIb3*~J*MQmsP)mIhU~;T)YhVBcZ4;BqVjm$D zHug8$vaDHs=6d|GrM(C7H@-y#fp%QNFu*{^kPUmFMSqF-65@B*RLJ_rUz`sg_*~qN zaM{~!sz)u602JX#qbtwhs_{u*25wd;zI0`X%o!}lIM*0AzQ?K)X*G!F)jnS%(y4g~ zEfQ1lKLk}*m|D#^$h6(HP~kbN7Rfsi(E_OO9s@<>SD8qs5R^#i-~29dGdtyLwX_`N zTx*C?t>@JcRwzL`k%|MvD)nDQz7|v05U)Rl+H*oJB3*HSxDu&Jh%WrcTO$xU4dA z5hY3__aQ)svJW8c!n)G=_6qTR2l8NFn~^-$vuBtJYk#UrWiNQ>P|Z8q(iWx{TSoKs4&yV zTH49;Z#=h{wvj@)h~!7(QZ1tdGLEqgE1clOP=!&9Gs;REX1blc$1cbs%b6tl7~p@ zmhbU>V~lE~Q6Qz*$g5TBy4*^$?GC^Pg4`u2)he` zqLa=)^RUZ!m{(6jet-OMzFedMzgp+_mFSK?kI=zK_3yOMOCa`pCW%|8qxqV!vsz2F zVTby25uYB)8$ZVRefg?5&sI`Z*w(%p#3zMRqkl%bKN0cI32nyk??S)8Q~$A{7t&?^ z!t{G0o@+vj@2ttpYAJnWCmrB*r#7GGb0W^ibxE^YrO-5A5wruXh)CFJIPr^pD>a2U zl@>cFqysuBz)2R$jwquPT6l>;MDp)?PnP=B0s$o=3Zhh)&GNa_T0|@faST;RLL8;| z1_@88L};bPN{uAMQiv#&Na6Px#iBm1|7@j2=%h)S(8nU~q$ciH3JPCK+6g%+R44T; zpOZpcu}rnCsn>K;Q^$Ov*K-|B7ZGRT)BMBw?TdDcdGP;?XE zr1hjewBiizC@8q|U7!!U>v6X}*|!(}epV3yK&C$bTZCq-o}e)psGNUn8MjRH2VLyG zD8tYG7z&@Ss*a^kvz{mQc%=R#A7jD4r2 z9Vt}(`*HWaoL4@S?{^>nt^AL#@hl?a!b9KE#+T%))4e&`>o0*p!#0I5G5A%!9xVyb zEF=2C41EYLUz;;fIgl&higS1F=eND()-nrSs*8LNz?;oxv)Q}>V4q*8O8^SZry({8 zKt@0G--)SGTi`R-XFx%m;VQYZqub%kCicJx+jG;W#l4do4&SNS& zJFh(B8{a~UpWa-n<0EwuA0WFF!h8yWPn%C`g#rznt3}kG7W=0U_PcDJb_VBMG#8u$ zG;jZ6XphwVsZaBFLe;+?`wsxvt9p@^v6XFn#)DZOP^J6)o@4<6rO8Nn! z{aQY zsb*2)1!?DHt^#u)Wlr>;`KW0gZ5-BgtZSjD`L$lr%)DiZ`cxA&t8pi>j#yc-*#dFg zNeHTOu2m7SKUq44*w+$w5+`YW?$NQXh5Sz9m)QNUh91s&pN@4kRCcc$@qIehR~dRR z=TFkHzFg>6=)(^U{a<_g-w*x4&mvV(4?m;fAO5T-l2#ew^2rKbl*O_{Q9Nr8g1wIM zE73$AiZW6aBr+vYrWvK6QM#$60UD_#3-&cx(kbS%6Yhk#33B)h@rtEHHMOJ(aW2Yr z3rtZ1IL2u!UAcnTTOCX_rcwG$achW2$+?miXr=Nt8nsviCnaT&6eoyt-*V6+``+Xp zvFfDr_Gn`dm6c9^H)1QYu-fpFshMjyaZ(Viq?!;n>P|;V*GW$9N82MVgi;(%N`zWk z+OS7~&TDiN;+YjxKy1Wm7i>OKuT>{jeJ5fiQaC9map4rEMr9KXCqM`(TI#Cq%Mc9KGiB?8yv$_uhHOf3*0~ z>7qT?c#~ipW7^R|Ge2d2nPtlJ$*|M+mX{g2uJNHl95ZW79dsOHY8d1G${aq@s|JAT z!=URUPn})7url!H?oY34(_7-jmtC-hq*Mp??O^$Mtlm}H7yrsX>DQ2WPhV9`OgB|{ z(rQw4Og#g*-n=!-+CL?ecx=$^u2CON*?W`?y0$9(o6=`)`-8$Zo`ao8&E=!AuhY~< zV3=9C-td`lt;`-*v+numkCS?>TBUnHopZfZnitEZ$rtVqUgY~oo%7e`!}v2TExM_v z`rZNFZZ?}uKPfw=&JYh26wy4mMi;>4<*3_@bVsR5e_FE-|L7U|fgUK-V1|X#ykc&V z9O!UGet`Dr5fv0LFbtHK^N%ouIIsDol-WLbObx4(4;c{`xq5*=JD=)yBj;MP0?5T; zC1)ySPI=v-lu5V>aXRPfM4Stp>*3X@VZym4sZ+$%F07w{7iI$WXxo}j=*wi$nz*r+ zmR2;Aoy5b4mA8~Q6>;8qDMD~kTCob5XoI7S;p1G*4Dpycuem>{NueoXY?Pr7 z5Ko@bv$UIKDy*oBy_J(B`9CYpF_d;61A`{pGD-(7RR&y0?+@6p*r#YDDUJV%bS8D zG1rofc8{ua6-*_vQY7trpQW$eO(IQ4Idaum#rrOb2eV+D(nLf0j`6Vf*H^U-s zFvoXg3&c0+CjP!(nmIL_tEcwvC1^;>*9j?o)M{#R?o^hkqPNf1rZmbAqzLy(jSKng7qsUv$x1$t z=QiPjc`G%_iSa#9B3Zc47^QAtxLw&~7u*g<5EJ*BX3m=eVxg5r+Q9D%`xe;3HFwDRBFCAcLIi z&DD?t`33!EQ_U*ABPZt$dX&nPqKBqet?C=RRcXc^c(d8O9X!v;*Q}T==Q%+A_vJsT z{AwpjX8_I6++!1%oe$N~L~r3Z^HTzrHmJ;+cm@NOH=70qGHu@EM{CQxr;$CB|CX?a z;fgI+17O((&nrNqdIL27=v{qKPrcLsG?0C!*Y)R_Ir0fI*Ou%4!Axp?g2Ule_z*P1 zwhOmnR;Xpm77N2bM&@;HO;6td?9nPZ8!_9_w)rR-u0L_Eed$0aNts7G_#L$WaLe|e z;#lgSay9IMyFYcW|Gb-}4m%3v4LP$*uJ!=s`+jQ<>M`5?eF@ENv;V8#eV8VlfOzP) z<-?iggQ^aOJkh>*bHkTV22*FV)E%W)>i4|6dFS=trAGT6SW5rWs;}%!sPATJGY(|j z?18q})4a|5Y0?RZZ?3pp>G_<7V8J^86qEsRajjCl3nP5B^=HgJ(RJ=e1&uE@0pj!ZczE9$jjBTGq& zeQT38loJuBeA$pMol6$d(MiE{bpkiLF&0Z?ELW#&X+3*Hu2z%3Q@Y}_I-csuT=nVn z>SD*P1j-$|i$%WjdSJM&0ESOJ{igxy+mvrVgj3EvcigcDb;lMrenV!o z?^mXJpw%6TF*^GFxi{ZxXl}7^XqoYpkUjKdkc(7mxp%6T_A|5H;!534jOyZ9_b-H4 zt@)m4SNF#)M-Z=bu4^vc>e<*&ri>LXRa_j*^kH{V9Ia&iX&NV8el+#|&S`EJYS zhi3JEFEr9`t-T$iR^z%bSx+x9CzHzhrF*3Zj}JZ2gSEKVrM<1J@;>~YK(7n&bI{MT zul^2l3Wx5WR>{vB<8iqF$TEOK=gkKZeAQ2D_g9(Kbq#PC@90M={$+Z-_;$0oP}Mw3 zUUHPWZVb112+a7I(GYo@Hq(^n=hZSDh8T zRq6XYL0q}a=bIz;rrQGOiSg=)xM*JnaVOHnB8J5(*2S_bh*c-vmEWufWk5GYOzrd` zVwz6*(yD6~{qLjz)wQWa-g!whAoj}r@$W;3n+f7dM5KyEx&ncsi>Y0F3a<5j;3j=; zMZCHBeB5&m5z}_+5OIuET|1ADvs!meEYXPsA2x_ki!@M+)X<334v;k0%tpBE?kQN^&R?5LZv!AO8x7$56f!Hw}gT@skk$Dmw{J z_6M}_YaxD!>U@~pe)t}GU5KB9em}&&wf6RDJbzM4UI2|c!f#J%?ZMPc?(;S@rpC}n zFEFch)`F=Aiq3U)$9;CNKY?BVaalvr@1cFm+g4}W^=!IP0IKs_o#0yL<>@5E+H@kF z7ePm|WocJ3R}JW_i9h?g2UP9EC2yjhw$n?#2hQPMjt<_0(mH3$5ap#`XUi-rtt-bk zuREixLOz93N-2dDKn>&qj=XhkAy}J{SvzYjn~1EC=USF&Jyd1e*h)T1 zySe12@aiH53;{81A;tn=jo$_4p|w1GFOS9_{r?QarPKb0c4cVA)?=%+4K0ssMmNje z=nAMbl6320TGdLcS|dbW752C_Kpi%~KLfF?p>(eF;1D639_DHBZ(DB0IFrwNqiXyx zPvYvf?363pT8R42xW}!an(C^4G-Ao4_9++NO4Uu9?WzZ7wNdzCo*_0CXlwC)Y(}r( zm6T=hUOn4iuC*~uog>j8-kak{BjP#DS0}~b_upA?X##p?8X3IFR>c@qRP&y-1FEc7 zoY96R{s#D4Q91+ESAYL~RRhM&3LJFwUTIiO{ys$W)6@awjcNADy~m?!5Ynu^?>&Yx17)T)n=q@51g*MGtG`t7HU7@` zcrA2@?H*pO{0|j*buMabRRzvc{wJJIOTvhF~xZn^+D>zc9Us})w5$Pa>w2RKAKv}1MA;jdZ zh)6J`co?zYNF0-gVn}!4%isP#+vy*J_z!r)Lu74qM0E-kwnvrb!F=DQ-z^vpZ{oca zo%&o)jgz=IJv7Gm*YZ&6_mA=OYki6a%62$W=KJyV`)P0gU^AaX8<3OZUL*Yxz$Eg& zPK|qobO!UTZ)X2J829>Ub2wJQA)aG#uaJJfleYgO{_oQnl%hk&R`01PR3B~!RyT5_=cP3>H%50PUujeU%z`j^asGc55IafIbrbF&3Rd;DE~dIa^L)b zp1l}}l!EC{QUI-Vxj*vIu5&e|PY2ynx730BW^|T5&U!M%Z*LtZ?=$xl%HoF!fF|7gtm5a3${2WNdI7|_oLp!8_ynpI zkGK*MkuqM>E1!GE@*;>&ALI0iGpy7eaVHIpbkItx8nLee@gqn%@jhmYQiaLgX8!9E zb(?$7PcMf!daiXMBI2fgW>W`~C)=2L;@dWo5kIS=6TZ<;?&uOXdB3eCUNBYh{&x7D zhJU(;m(`ySu@MmwGjXFE{mhQkiuVCHW==8pAr5|WlS|yOcs$sjBd)_$Zf#dCt3Qz@ zt5fm`k9TCJlQ5Uw=>_i0r7#O>(NhcaEUv5za2kuHd67KD}b!q_7%@e6T~0h z*R;Wy!8?_m`I!YqPqxX;ZHhUOf=k?cz28<}xo+YQeR|!e(FF12n_$7I?9|UJF!}bE ziat+M%wtGRyx&efaTcijg7+@T{>_d4`smsppb6sfn_$tY?8MLPGt=n(wqo&#GyR2| z7%^1n?3tS$5s%*l8=cA~KeMq1(JFd~Zf;Y|$)sQyz26>w;;dBOd9-R8b;NbXQ`zKaHqa0~*(Nu)DQ1O+m89SjH+jE3{KQ%AzsJe&@w}p1a~Jtk@=~3s^i8m- zlXo{;jZa*iqL)V#l9Hd?yYQ=R;Ryu?v`F^mwslGC)?!acFnhK zpou%%M8PF)^nROdX=&MJYeR9>(_fYAb-x&SKeP8y{2ExI`%Lu)i`PWBmPS{tO<-R@o%w3^h0rBsr+4~